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 @@
+
+
+
+
+
+