diff --git a/src/com/android/settings/bluetooth/BluetoothPermissionRequest.java b/src/com/android/settings/bluetooth/BluetoothPermissionRequest.java index 8542fcd2461..a62bbe10e0c 100644 --- a/src/com/android/settings/bluetooth/BluetoothPermissionRequest.java +++ b/src/com/android/settings/bluetooth/BluetoothPermissionRequest.java @@ -24,6 +24,7 @@ import android.bluetooth.BluetoothDevice; 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 @@ public final class BluetoothPermissionRequest extends BroadcastReceiver { // 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 ca8f9d39a8c..24fe4e151ff --- 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 @@ public final class Utils { } 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 bd8169a80fe..f1677f29509 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 @@ public class BluetoothMaxConnectedAudioDevicesPreferenceController extends 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 72477b94585..7ab311fe2ab 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 com.google.common.truth.Truth.assertThat; 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 @@ public class BluetoothMaxConnectedAudioDevicesPreferenceControllerTest { @Spy private Context mSpyContext = RuntimeEnvironment.application; + @Mock + private BluetoothManager mBluetoothManager; + @Mock + private BluetoothAdapter mBluetoothAdapter; + private ListPreference mPreference; private BluetoothMaxConnectedAudioDevicesPreferenceController mController; @@ -63,19 +68,15 @@ public class BluetoothMaxConnectedAudioDevicesPreferenceControllerTest { @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