Merge "Fetch currently loaded bluetooth name" into tm-qpr-dev am: a364c8bacb am: dabdd6faa9
Original change: https://googleplex-android-review.googlesource.com/c/platform/packages/apps/Settings/+/20378665
Change-Id: Ib66d0ba56cf9e4d12745673536208eb7cfef931a
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