summaryrefslogtreecommitdiff
path: root/core/java/android
diff options
context:
space:
mode:
authorRahul Sabnis <rahulsabnis@google.com>2021-03-11 12:17:44 -0800
committerRahul Sabnis <rahulsabnis@google.com>2021-03-22 16:07:37 -0700
commitc7635a46e7554fae3fe5f0f0d02dffe69c6f7e10 (patch)
tree6956bc25f7555a4ea44c5f3971e74c1053ca1029 /core/java/android
parent1fe4cb3e5da87d73ebb5e222d76612df117e4e43 (diff)
Makes BluetoothDevice#setAlias a public API
Tag: #feature Bug: 181093329 Test: atest BluetoothDeviceTest Change-Id: Ib94bedab5d6d4c63a19096f61187f58dd8937b55
Diffstat (limited to 'core/java/android')
-rw-r--r--core/java/android/bluetooth/BluetoothDevice.java32
-rw-r--r--core/java/android/companion/CompanionDeviceManager.java28
2 files changed, 49 insertions, 11 deletions
diff --git a/core/java/android/bluetooth/BluetoothDevice.java b/core/java/android/bluetooth/BluetoothDevice.java
index 07dbdce3984f..efdbc762bb73 100644
--- a/core/java/android/bluetooth/BluetoothDevice.java
+++ b/core/java/android/bluetooth/BluetoothDevice.java
@@ -26,6 +26,7 @@ import android.annotation.SdkConstant.SdkConstantType;
import android.annotation.SuppressLint;
import android.annotation.SystemApi;
import android.app.PropertyInvalidatedCache;
+import android.companion.AssociationRequest;
import android.compat.annotation.UnsupportedAppUsage;
import android.content.Context;
import android.os.Build;
@@ -1211,8 +1212,7 @@ public final class BluetoothDevice implements Parcelable {
}
/**
- * Get the Bluetooth alias of the remote device.
- * <p>Alias is the locally modified name of a remote device.
+ * Get the locally modifiable name (alias) of the remote Bluetooth device.
*
* @return the Bluetooth alias, the friendly device name if no alias, or
* null if there was a problem
@@ -1238,25 +1238,35 @@ public final class BluetoothDevice implements Parcelable {
}
/**
- * Set the Bluetooth alias of the remote device.
- * <p>Alias is the locally modified name of a remote device.
- * <p>This methoid overwrites the alias. The changed
- * alias is saved in the local storage so that the change
- * is preserved over power cycle.
+ * Sets the locally modifiable name (alias) of the remote Bluetooth device. This method
+ * overwrites the previously stored alias. The new alias is saved in local
+ * storage so that the change is preserved over power cycles.
*
- * @return true on success, false on error
- * @hide
+ * <p>This method requires the calling app to be associated with Companion Device Manager (see
+ * {@link android.companion.CompanionDeviceManager#associate(AssociationRequest,
+ * android.companion.CompanionDeviceManager.Callback, Handler)}) and have the {@link
+ * android.Manifest.permission#BLUETOOTH} permission. Alternatively, if the caller has the
+ * {@link android.Manifest.permission#BLUETOOTH_PRIVILEGED} permission, they can bypass the
+ * Companion Device Manager association requirement.
+ *
+ * @param alias is the new locally modifiable name for the remote Bluetooth device which must be
+ * non-null and not the empty string.
+ * @return {@code true} if the alias is successfully set, {@code false} on error
+ * @throws IllegalArgumentException if the alias is {@code null} or the empty string
*/
- @UnsupportedAppUsage(maxTargetSdk = Build.VERSION_CODES.R, trackingBug = 170729553)
@RequiresPermission(Manifest.permission.BLUETOOTH)
public boolean setAlias(@NonNull String alias) {
+ if (alias == null || alias.isEmpty()) {
+ throw new IllegalArgumentException("Cannot set the alias to null or the empty string");
+ }
final IBluetooth service = sService;
if (service == null) {
Log.e(TAG, "BT not enabled. Cannot set Remote Device name");
return false;
}
try {
- return service.setRemoteAlias(this, alias);
+ BluetoothAdapter adapter = BluetoothAdapter.getDefaultAdapter();
+ return service.setRemoteAlias(this, alias, adapter.getOpPackageName());
} catch (RemoteException e) {
Log.e(TAG, "", e);
}
diff --git a/core/java/android/companion/CompanionDeviceManager.java b/core/java/android/companion/CompanionDeviceManager.java
index b441b364cec8..86bd8a2b7a4e 100644
--- a/core/java/android/companion/CompanionDeviceManager.java
+++ b/core/java/android/companion/CompanionDeviceManager.java
@@ -25,6 +25,7 @@ import android.annotation.SystemService;
import android.app.Activity;
import android.app.Application;
import android.app.PendingIntent;
+import android.bluetooth.BluetoothDevice;
import android.content.ComponentName;
import android.content.Context;
import android.content.IntentSender;
@@ -331,6 +332,33 @@ public final class CompanionDeviceManager {
}
/**
+ * Checks whether the bluetooth device represented by the mac address was recently associated
+ * with the companion app. This allows these devices to skip the Bluetooth pairing dialog if
+ * their pairing variant is {@link BluetoothDevice#PAIRING_VARIANT_CONSENT}.
+ *
+ * @param packageName the package name of the calling app
+ * @param deviceMacAddress the bluetooth device's mac address
+ * @param userId the calling user's identifier
+ * @return true if it was recently associated and we can bypass the dialog, false otherwise
+ * @hide
+ */
+ @SystemApi
+ @RequiresPermission(android.Manifest.permission.MANAGE_COMPANION_DEVICES)
+ public boolean canPairWithoutPrompt(@NonNull String packageName,
+ @NonNull String deviceMacAddress, int userId) {
+ if (!checkFeaturePresent()) {
+ return false;
+ }
+ Objects.requireNonNull(packageName, "package name cannot be null");
+ Objects.requireNonNull(deviceMacAddress, "device mac address cannot be null");
+ try {
+ return mService.canPairWithoutPrompt(packageName, deviceMacAddress, userId);
+ } catch (RemoteException e) {
+ throw e.rethrowFromSystemServer();
+ }
+ }
+
+ /**
* Register to receive callbacks whenever the associated device comes in and out of range.
*
* The provided device must be {@link #associate associated} with the calling app before