Loading src/com/android/settings/bluetooth/BluetoothPermissionRequest.java +9 −1 Original line number Diff line number Diff line Loading @@ -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; Loading Loading @@ -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); Loading src/com/android/settings/bluetooth/Utils.java 100755 → 100644 +51 −0 Original line number Diff line number Diff line Loading @@ -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; Loading Loading @@ -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"); } } src/com/android/settings/development/BluetoothMaxConnectedAudioDevicesPreferenceController.java +7 −11 Original line number Diff line number Diff line Loading @@ -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; Loading @@ -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 Loading tests/robotests/src/com/android/settings/development/BluetoothMaxConnectedAudioDevicesPreferenceControllerTest.java +11 −10 Original line number Diff line number Diff line Loading @@ -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; Loading Loading @@ -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; Loading @@ -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 Loading Loading
src/com/android/settings/bluetooth/BluetoothPermissionRequest.java +9 −1 Original line number Diff line number Diff line Loading @@ -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; Loading Loading @@ -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); Loading
src/com/android/settings/bluetooth/Utils.java 100755 → 100644 +51 −0 Original line number Diff line number Diff line Loading @@ -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; Loading Loading @@ -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"); } }
src/com/android/settings/development/BluetoothMaxConnectedAudioDevicesPreferenceController.java +7 −11 Original line number Diff line number Diff line Loading @@ -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; Loading @@ -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 Loading
tests/robotests/src/com/android/settings/development/BluetoothMaxConnectedAudioDevicesPreferenceControllerTest.java +11 −10 Original line number Diff line number Diff line Loading @@ -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; Loading Loading @@ -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; Loading @@ -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 Loading