From 120de6c1c4c1597f9da18925a5bac8a312557866 Mon Sep 17 00:00:00 2001 From: Eugene Susla Date: Fri, 19 Feb 2021 12:53:42 -0800 Subject: [PATCH] Provide CDM API to associate without prompt For use via FastPair(within GMSCore) Bug: 165951651 Test: atest CompanionDeviceManagerTest Change-Id: I7b94d52e59ad39e1d93360685cf64a3dc068d05e --- core/api/system-current.txt | 1 + .../companion/CompanionDeviceManager.java | 26 +++++++++++++++++++ .../companion/ICompanionDeviceManager.aidl | 2 ++ core/res/AndroidManifest.xml | 5 ++++ core/res/res/values/config.xml | 7 +++++ core/res/res/values/symbols.xml | 1 + .../CompanionDeviceManagerService.java | 10 +++++++ 7 files changed, 52 insertions(+) diff --git a/core/api/system-current.txt b/core/api/system-current.txt index edc6ab8767a58..2cebc2d9771d6 100644 --- a/core/api/system-current.txt +++ b/core/api/system-current.txt @@ -2178,6 +2178,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 8a471350bb365..bcb8482b1f203 100644 --- a/core/res/AndroidManifest.xml +++ b/core/res/AndroidManifest.xml @@ -4227,6 +4227,11 @@ + + + + + +