diff --git a/core/api/system-current.txt b/core/api/system-current.txt index 2094e981f68e9..6ac668a0c6fb5 100644 --- a/core/api/system-current.txt +++ b/core/api/system-current.txt @@ -2180,6 +2180,7 @@ package android.bluetooth.le { package android.companion { public final class CompanionDeviceManager { + method @RequiresPermission("android.permission.ASSOCIATE_COMPANION_DEVICES") public boolean associate(@NonNull String, @NonNull android.net.MacAddress); method @RequiresPermission("android.permission.MANAGE_COMPANION_DEVICES") public boolean canPairWithoutPrompt(@NonNull String, @NonNull String, int); method @RequiresPermission("android.permission.MANAGE_COMPANION_DEVICES") public boolean isDeviceAssociatedForWifiConnection(@NonNull String, @NonNull android.net.MacAddress, @NonNull android.os.UserHandle); } diff --git a/core/java/android/companion/CompanionDeviceManager.java b/core/java/android/companion/CompanionDeviceManager.java index 86bd8a2b7a4e3..2ce715630c936 100644 --- a/core/java/android/companion/CompanionDeviceManager.java +++ b/core/java/android/companion/CompanionDeviceManager.java @@ -425,6 +425,32 @@ public final class CompanionDeviceManager { mContext.getPackageName(), deviceAddress); } catch (RemoteException e) { ExceptionUtils.propagateIfInstanceOf(e.getCause(), DeviceNotAssociatedException.class); + } + } + + /** + * Associates given device with given app for the given user directly, without UI prompt. + * + * @return whether successful + * + * @hide + */ + @SystemApi + @RequiresPermission(android.Manifest.permission.ASSOCIATE_COMPANION_DEVICES) + public boolean associate( + @NonNull String packageName, + @NonNull MacAddress macAddress) { + if (!checkFeaturePresent()) { + return false; + } + Objects.requireNonNull(packageName, "package name cannot be null"); + Objects.requireNonNull(macAddress, "mac address cannot be null"); + + UserHandle user = android.os.Process.myUserHandle(); + try { + return mService.createAssociation( + packageName, macAddress.toString(), user.getIdentifier()); + } catch (RemoteException e) { throw e.rethrowFromSystemServer(); } } diff --git a/core/java/android/companion/ICompanionDeviceManager.aidl b/core/java/android/companion/ICompanionDeviceManager.aidl index 95d3515abb80c..83db35872f749 100644 --- a/core/java/android/companion/ICompanionDeviceManager.aidl +++ b/core/java/android/companion/ICompanionDeviceManager.aidl @@ -51,4 +51,6 @@ interface ICompanionDeviceManager { void unregisterDevicePresenceListenerService(in String packageName, in String deviceAddress); boolean canPairWithoutPrompt(in String packageName, in String deviceMacAddress, int userId); + + boolean createAssociation(in String packageName, in String macAddress, int userId); } diff --git a/core/res/AndroidManifest.xml b/core/res/AndroidManifest.xml index 1d462bc5dd486..33f59f893b335 100644 --- a/core/res/AndroidManifest.xml +++ b/core/res/AndroidManifest.xml @@ -4227,6 +4227,11 @@ + + + + + +