Merge "Fetch currently loaded bluetooth name" into tm-qpr-dev am: a364c8bacb

Original change: https://googleplex-android-review.googlesource.com/c/platform/packages/apps/Settings/+/20378665

Change-Id: Id9ddd49d48825e90f8414360363ad85a0a5068cf
Signed-off-by: Automerger Merge Worker <android-build-automerger-merge-worker@system.gserviceaccount.com>
diff --git a/src/com/android/settings/bluetooth/BluetoothPermissionRequest.java b/src/com/android/settings/bluetooth/BluetoothPermissionRequest.java
index 8542fcd..a62bbe1 100644
--- a/src/com/android/settings/bluetooth/BluetoothPermissionRequest.java
+++ b/src/com/android/settings/bluetooth/BluetoothPermissionRequest.java
@@ -24,6 +24,7 @@
 import android.content.BroadcastReceiver;
 import android.content.Context;
 import android.content.Intent;
+import android.content.pm.PackageManager.NameNotFoundException;
 import android.os.PowerManager;
 import android.os.UserManager;
 import android.util.Log;
@@ -125,8 +126,15 @@
                 // Create an intent triggered by clicking on the
                 // "Clear All Notifications" button
 
+                String bluetoothName;
+                try {
+                    bluetoothName = Utils.findBluetoothPackageName(context);
+                } catch (NameNotFoundException e) {
+                    e.printStackTrace();
+                    return;
+                }
                 Intent deleteIntent = new Intent(BluetoothDevice.ACTION_CONNECTION_ACCESS_REPLY);
-                deleteIntent.setPackage("com.android.bluetooth");
+                deleteIntent.setPackage(bluetoothName);
                 deleteIntent.putExtra(BluetoothDevice.EXTRA_DEVICE, mDevice);
                 deleteIntent.putExtra(BluetoothDevice.EXTRA_CONNECTION_ACCESS_RESULT,
                         BluetoothDevice.CONNECTION_ACCESS_NO);
diff --git a/src/com/android/settings/bluetooth/Utils.java b/src/com/android/settings/bluetooth/Utils.java
old mode 100755
new mode 100644
index ca8f9d3..24fe4e1
--- a/src/com/android/settings/bluetooth/Utils.java
+++ b/src/com/android/settings/bluetooth/Utils.java
@@ -16,11 +16,18 @@
 
 package com.android.settings.bluetooth;
 
+import static android.os.Process.BLUETOOTH_UID;
+
 import android.app.settings.SettingsEnums;
 import android.bluetooth.BluetoothDevice;
 import android.bluetooth.BluetoothProfile;
 import android.content.Context;
 import android.content.DialogInterface;
+import android.content.pm.ActivityInfo;
+import android.content.pm.PackageInfo;
+import android.content.pm.PackageManager;
+import android.content.pm.PackageManager.NameNotFoundException;
+import android.os.UserHandle;
 import android.provider.DeviceConfig;
 import android.provider.Settings;
 import android.text.TextUtils;
@@ -189,4 +196,48 @@
         }
         return false;
     }
+
+    /**
+     * Returns the Bluetooth Package name
+     */
+    public static String findBluetoothPackageName(Context context)
+            throws NameNotFoundException {
+        // this activity will always be in the package where the rest of Bluetooth lives
+        String sentinelActivity = "com.android.bluetooth.opp.BluetoothOppLauncherActivity";
+        PackageManager packageManager = context.createContextAsUser(UserHandle.SYSTEM, 0)
+                .getPackageManager();
+        String[] allPackages = packageManager.getPackagesForUid(BLUETOOTH_UID);
+        String matchedPackage = null;
+        for (String candidatePackage : allPackages) {
+            PackageInfo packageInfo;
+            try {
+                packageInfo =
+                        packageManager.getPackageInfo(
+                                candidatePackage,
+                                PackageManager.GET_ACTIVITIES
+                                        | PackageManager.MATCH_ANY_USER
+                                        | PackageManager.MATCH_UNINSTALLED_PACKAGES
+                                        | PackageManager.MATCH_DISABLED_COMPONENTS);
+            } catch (NameNotFoundException e) {
+                // rethrow
+                throw e;
+            }
+            if (packageInfo.activities == null) {
+                continue;
+            }
+            for (ActivityInfo activity : packageInfo.activities) {
+                if (sentinelActivity.equals(activity.name)) {
+                    if (matchedPackage == null) {
+                        matchedPackage = candidatePackage;
+                    } else {
+                        throw new NameNotFoundException("multiple main bluetooth packages found");
+                    }
+                }
+            }
+        }
+        if (matchedPackage != null) {
+            return matchedPackage;
+        }
+        throw new NameNotFoundException("Could not find main bluetooth package");
+    }
 }
diff --git a/src/com/android/settings/development/BluetoothMaxConnectedAudioDevicesPreferenceController.java b/src/com/android/settings/development/BluetoothMaxConnectedAudioDevicesPreferenceController.java
index bd8169a..f1677f2 100644
--- a/src/com/android/settings/development/BluetoothMaxConnectedAudioDevicesPreferenceController.java
+++ b/src/com/android/settings/development/BluetoothMaxConnectedAudioDevicesPreferenceController.java
@@ -16,9 +16,8 @@
 
 package com.android.settings.development;
 
+import android.bluetooth.BluetoothManager;
 import android.content.Context;
-import android.content.pm.PackageManager;
-import android.content.res.Resources;
 import android.os.SystemProperties;
 
 import androidx.annotation.VisibleForTesting;
@@ -42,18 +41,15 @@
 
     private int mDefaultMaxConnectedAudioDevices = 0;
 
+    private final BluetoothManager mBluetoothManager;
+
     public BluetoothMaxConnectedAudioDevicesPreferenceController(Context context) {
         super(context);
 
-        try {
-            Resources res = context.getPackageManager().getResourcesForApplication(
-                    "com.android.bluetooth");
-            mDefaultMaxConnectedAudioDevices = res.getInteger(res.getIdentifier(
-                    "config_bluetooth_max_connected_audio_devices",
-                    "integer", "com.android.bluetooth"));
-        } catch (PackageManager.NameNotFoundException e) {
-            e.printStackTrace();
-        }
+        mBluetoothManager = context.getSystemService(BluetoothManager.class);
+
+        mDefaultMaxConnectedAudioDevices =
+              mBluetoothManager.getAdapter().getMaxConnectedAudioDevices();
     }
 
     @Override
diff --git a/tests/robotests/src/com/android/settings/development/BluetoothMaxConnectedAudioDevicesPreferenceControllerTest.java b/tests/robotests/src/com/android/settings/development/BluetoothMaxConnectedAudioDevicesPreferenceControllerTest.java
index 72477b9..7ab311f 100644
--- a/tests/robotests/src/com/android/settings/development/BluetoothMaxConnectedAudioDevicesPreferenceControllerTest.java
+++ b/tests/robotests/src/com/android/settings/development/BluetoothMaxConnectedAudioDevicesPreferenceControllerTest.java
@@ -24,9 +24,9 @@
 import static org.mockito.Mockito.doReturn;
 import static org.mockito.Mockito.when;
 
+import android.bluetooth.BluetoothAdapter;
+import android.bluetooth.BluetoothManager;
 import android.content.Context;
-import android.content.pm.PackageManager;
-import android.content.res.Resources;
 
 import android.os.SystemProperties;
 
@@ -54,6 +54,11 @@
   @Spy
   private Context mSpyContext = RuntimeEnvironment.application;
 
+  @Mock
+  private BluetoothManager mBluetoothManager;
+  @Mock
+  private BluetoothAdapter mBluetoothAdapter;
+
   private ListPreference mPreference;
   private BluetoothMaxConnectedAudioDevicesPreferenceController mController;
 
@@ -63,19 +68,15 @@
   @Before
   public void setup() {
     MockitoAnnotations.initMocks(this);
+    doReturn(mBluetoothManager).when(mSpyContext).getSystemService(BluetoothManager.class);
+    doReturn(mBluetoothAdapter).when(mBluetoothManager).getAdapter();
     // Get XML values without mock
     // Setup test list preference using XML values
     mPreference = new ListPreference(mSpyContext);
     mPreference.setEntries(R.array.bluetooth_max_connected_audio_devices);
     mPreference.setEntryValues(R.array.bluetooth_max_connected_audio_devices_values);
-    // Retrieve default max connected audio devices to a test controlled value
-    try {
-      Resources res = mSpyContext.getPackageManager().getResourcesForApplication("com.android.bluetooth");
-      TEST_MAX_CONNECTED_AUDIO_DEVICES = res.getInteger(res.getIdentifier("config_bluetooth_max_connected_audio_devices", "integer", "com.android.bluetooth"));
-    } catch (PackageManager.NameNotFoundException e) {
-      e.printStackTrace();
-    }
-
+    doReturn(TEST_MAX_CONNECTED_AUDIO_DEVICES).when(mBluetoothAdapter)
+        .getMaxConnectedAudioDevices();
     // Init the actual controller
     mController = new BluetoothMaxConnectedAudioDevicesPreferenceController(mSpyContext);
     // Construct preference in the controller via a mocked preference screen object