Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit a364c8ba authored by William Escande's avatar William Escande Committed by Android (Google) Code Review
Browse files

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

parents 7b63700b 723df89a
Loading
Loading
Loading
Loading
+9 −1
Original line number Diff line number Diff line
@@ -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);
+51 −0
Original line number Diff line number Diff line
@@ -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");
    }
}
+7 −11
Original line number Diff line number Diff line
@@ -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
+11 −10
Original line number Diff line number Diff line
@@ -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