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

Commit 1a9f502c authored by Zach Johnson's avatar Zach Johnson Committed by Gerrit Code Review
Browse files

Merge changes Icb28a169,If1dafa2c,I898305a6,I67e4708b,I73ebecb7, ...

* changes:
  Simplify getName & setName
  Move some more permission checks to the binder stub
  Simplify implementation of getUuids
  Simplify implementation of getAddress
  Simplify implementation of isEnabled
  Remove ProfileObserver
  Simplify internal handling of BT enable
parents cd45cddc 7695bc49
Loading
Loading
Loading
Loading
+34 −58
Original line number Diff line number Diff line
@@ -210,7 +210,6 @@ public class AdapterService extends Service {
    private String mWakeLockName;
    private UserManager mUserManager;

    private ProfileObserver mProfileObserver;
    private PhonePolicy mPhonePolicy;
    private ActiveDeviceManager mActiveDeviceManager;
    private DatabaseManager mDatabaseManager;
@@ -445,8 +444,6 @@ public class AdapterService extends Service {

        mSdpManager = SdpManager.init(this);
        registerReceiver(mAlarmBroadcastReceiver, new IntentFilter(ACTION_ALARM_WAKEUP));
        mProfileObserver = new ProfileObserver(getApplicationContext(), this, new Handler());
        mProfileObserver.start();

        // Phone policy is specific to phone implementations and hence if a device wants to exclude
        // it out then it can be disabled by using the flag below.
@@ -520,7 +517,6 @@ public class AdapterService extends Service {
    @Override
    public void onDestroy() {
        debugLog("onDestroy()");
        mProfileObserver.stop();
        if (!isMock()) {
            // TODO(b/27859763)
            Log.i(TAG, "Force exit to cleanup internal state in Bluetooth stack");
@@ -931,7 +927,7 @@ public class AdapterService extends Service {
     */
    private boolean connectEnabledProfiles(BluetoothDevice device) {
        ParcelUuid[] remoteDeviceUuids = getRemoteUuids(device);
        ParcelUuid[] localDeviceUuids = getUuids();
        ParcelUuid[] localDeviceUuids = mAdapterProperties.getUuids();

        if (mA2dpService != null && isSupported(localDeviceUuids, remoteDeviceUuids,
                BluetoothProfile.A2DP, device)
@@ -1074,7 +1070,7 @@ public class AdapterService extends Service {

            enforceBluetoothPermission(service);

            return service.isEnabled();
            return service.getState() == BluetoothAdapter.STATE_ON;
        }

        @Override
@@ -1103,7 +1099,7 @@ public class AdapterService extends Service {

            enforceBluetoothAdminPermission(service);

            return service.enable();
            return service.enable(false);
        }

        @Override
@@ -1120,7 +1116,7 @@ public class AdapterService extends Service {

            enforceBluetoothAdminPermission(service);

            return service.enableNoAutoConnect();
            return service.enable(true);
        }

        @Override
@@ -1156,7 +1152,7 @@ public class AdapterService extends Service {
            enforceBluetoothPermission(service);
            enforceLocalMacAddressPermission(service);

            return service.getAddress();
            return Utils.getAddressStringFromByte(service.mAdapterProperties.getAddress());
        }

        @Override
@@ -1173,7 +1169,7 @@ public class AdapterService extends Service {

            enforceBluetoothPermission(service);

            return service.getUuids();
            return service.mAdapterProperties.getUuids();
        }

        @Override
@@ -1187,6 +1183,9 @@ public class AdapterService extends Service {
            if (service == null) {
                return null;
            }

            enforceBluetoothPermission(service);

            return service.getName();
        }

@@ -1201,7 +1200,10 @@ public class AdapterService extends Service {
            if (service == null) {
                return false;
            }
            return service.setName(name);

            enforceBluetoothAdminPermission(service);

            return service.mAdapterProperties.setName(name);
        }

        @Override
@@ -1213,6 +1215,9 @@ public class AdapterService extends Service {

            AdapterService service = getService();
            if (service == null) return null;

            enforceBluetoothAdminPermission(service);

            return service.getBluetoothClass();
        }

@@ -1227,6 +1232,9 @@ public class AdapterService extends Service {
            if (service == null) {
                return false;
            }

            enforceBluetoothPrivilegedPermission(service);

            return service.setBluetoothClass(bluetoothClass);
        }

@@ -1239,6 +1247,9 @@ public class AdapterService extends Service {

            AdapterService service = getService();
            if (service == null) return BluetoothAdapter.IO_CAPABILITY_UNKNOWN;

            enforceBluetoothAdminPermission(service);

            return service.getIoCapability();
        }

@@ -1251,6 +1262,9 @@ public class AdapterService extends Service {

            AdapterService service = getService();
            if (service == null) return false;

            enforceBluetoothPrivilegedPermission(service);

            return service.setIoCapability(capability);
        }

@@ -1263,6 +1277,9 @@ public class AdapterService extends Service {

            AdapterService service = getService();
            if (service == null) return BluetoothAdapter.IO_CAPABILITY_UNKNOWN;

            enforceBluetoothAdminPermission(service);

            return service.getLeIoCapability();
        }

@@ -1275,6 +1292,9 @@ public class AdapterService extends Service {

            AdapterService service = getService();
            if (service == null) return false;

            enforceBluetoothPrivilegedPermission(service);

            return service.setLeIoCapability(capability);
        }

@@ -2055,10 +2075,6 @@ public class AdapterService extends Service {

    // ----API Methods--------

    public boolean isEnabled() {
        return mAdapterProperties.getState() == BluetoothAdapter.STATE_ON;
    }

    public int getState() {
        if (mAdapterProperties != null) {
            return mAdapterProperties.getState();
@@ -2066,14 +2082,6 @@ public class AdapterService extends Service {
        return BluetoothAdapter.STATE_OFF;
    }

    public boolean enable() {
        return enable(false);
    }

    public boolean enableNoAutoConnect() {
        return enable(true);
    }

    public synchronized boolean enable(boolean quietMode) {
        // Enforce the user restriction for disallowing Bluetooth if it was set.
        if (mUserManager.hasUserRestriction(UserManager.DISALLOW_BLUETOOTH, UserHandle.SYSTEM)) {
@@ -2093,36 +2101,11 @@ public class AdapterService extends Service {
        return true;
    }

    String getAddress() {
        String addrString = null;
        byte[] address = mAdapterProperties.getAddress();
        return Utils.getAddressStringFromByte(address);
    }

    ParcelUuid[] getUuids() {
        return mAdapterProperties.getUuids();
    }

    public String getName() {
        enforceBluetoothPermission(this);

        try {
        return mAdapterProperties.getName();
        } catch (Throwable t) {
            debugLog("getName() - Unexpected exception (" + t + ")");
        }
        return null;
    }

    boolean setName(String name) {
        enforceBluetoothAdminPermission(this);

        return mAdapterProperties.setName(name);
    }

    BluetoothClass getBluetoothClass() {
        enforceBluetoothAdminPermission(this);

        return mAdapterProperties.getBluetoothClass();
    }

@@ -2132,7 +2115,6 @@ public class AdapterService extends Service {
     * <p>Once set, this value persists across reboots.
     */
    boolean setBluetoothClass(BluetoothClass bluetoothClass) {
        enforceBluetoothPrivilegedPermission(this);
        debugLog("setBluetoothClass() to " + bluetoothClass);
        boolean result = mAdapterProperties.setBluetoothClass(bluetoothClass);
        if (!result) {
@@ -2152,13 +2134,10 @@ public class AdapterService extends Service {
    }

    int getIoCapability() {
        enforceBluetoothAdminPermission(this);

        return mAdapterProperties.getIoCapability();
    }

    boolean setIoCapability(int capability) {
        enforceBluetoothPrivilegedPermission(this);
        if (!validateInputOutputCapability(capability)) {
            return false;
        }
@@ -2167,13 +2146,10 @@ public class AdapterService extends Service {
    }

    int getLeIoCapability() {
        enforceBluetoothAdminPermission(this);

        return mAdapterProperties.getLeIoCapability();
    }

    boolean setLeIoCapability(int capability) {
        enforceBluetoothPrivilegedPermission(this);
        if (!validateInputOutputCapability(capability)) {
            return false;
        }
@@ -2446,7 +2422,7 @@ public class AdapterService extends Service {

        int numProfilesConnected = 0;
        ParcelUuid[] remoteDeviceUuids = getRemoteUuids(device);
        ParcelUuid[] localDeviceUuids = getUuids();
        ParcelUuid[] localDeviceUuids = mAdapterProperties.getUuids();

        // All profile toggles disabled, so connects all supported profiles
        if (mA2dpService != null && isSupported(localDeviceUuids, remoteDeviceUuids,
@@ -2533,7 +2509,7 @@ public class AdapterService extends Service {
        }

        ParcelUuid[] remoteDeviceUuids = getRemoteUuids(device);
        ParcelUuid[] localDeviceUuids = getUuids();
        ParcelUuid[] localDeviceUuids = mAdapterProperties.getUuids();

        if (mA2dpService != null && isSupported(localDeviceUuids, remoteDeviceUuids,
                BluetoothProfile.A2DP, device)) {
+0 −70
Original line number Diff line number Diff line
package com.android.bluetooth.btservice;

import android.bluetooth.BluetoothAdapter;
import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;
import android.content.IntentFilter;
import android.database.ContentObserver;
import android.os.Handler;
import android.provider.Settings;

/**
 * This helper class monitors the state of the enabled profiles and will update and restart
 * the adapter when necessary.
 */
public class ProfileObserver extends ContentObserver {
    private Context mContext;
    private AdapterService mService;
    private AdapterStateObserver mStateObserver;

    public ProfileObserver(Context context, AdapterService service, Handler handler) {
        super(handler);
        mContext = context;
        mService = service;
        mStateObserver = new AdapterStateObserver(this);
    }

    public void start() {
        mContext.getContentResolver()
                .registerContentObserver(
                        Settings.Global.getUriFor(Settings.Global.BLUETOOTH_DISABLED_PROFILES),
                        false, this);
    }

    private void onBluetoothOff() {
        mContext.unregisterReceiver(mStateObserver);
        Config.init(mContext);
        mService.enable();
    }

    public void stop() {
        mContext.getContentResolver().unregisterContentObserver(this);
    }

    @Override
    public void onChange(boolean selfChange) {
        if (mService.isEnabled()) {
            mContext.registerReceiver(mStateObserver,
                    new IntentFilter(BluetoothAdapter.ACTION_STATE_CHANGED));
            mService.disable();
        }
    }

    private static class AdapterStateObserver extends BroadcastReceiver {
        private ProfileObserver mProfileObserver;

        AdapterStateObserver(ProfileObserver observer) {
            mProfileObserver = observer;
        }

        @Override
        public void onReceive(Context context, Intent intent) {
            if (BluetoothAdapter.ACTION_STATE_CHANGED.equals(intent.getAction())
                    && intent.getIntExtra(BluetoothAdapter.EXTRA_STATE, -1)
                    == BluetoothAdapter.STATE_OFF) {
                mProfileObserver.onBluetoothOff();
            }
        }
    }
}
+26 −26
Original line number Diff line number Diff line
@@ -182,11 +182,11 @@ public class AdapterServiceTest {
    }

    private void doEnable(int invocationNumber, boolean onlyGatt) {
        Assert.assertFalse(mAdapterService.isEnabled());
        Assert.assertFalse(mAdapterService.getState() == BluetoothAdapter.STATE_ON);

        final int startServiceCalls = 2 * (onlyGatt ? 1 : 3); // Start and stop GATT + 2

        mAdapterService.enable();
        mAdapterService.enable(false);

        verifyStateChange(BluetoothAdapter.STATE_OFF, BluetoothAdapter.STATE_BLE_TURNING_ON,
                invocationNumber + 1, CONTEXT_SWITCH_MS);
@@ -223,11 +223,11 @@ public class AdapterServiceTest {
        final int scanMode = mAdapterService.getScanMode();
        Assert.assertTrue(scanMode == BluetoothAdapter.SCAN_MODE_CONNECTABLE
                || scanMode == BluetoothAdapter.SCAN_MODE_CONNECTABLE_DISCOVERABLE);
        Assert.assertTrue(mAdapterService.isEnabled());
        Assert.assertTrue(mAdapterService.getState() == BluetoothAdapter.STATE_ON);
    }

    private void doDisable(int invocationNumber, boolean onlyGatt) {
        Assert.assertTrue(mAdapterService.isEnabled());
        Assert.assertTrue(mAdapterService.getState() == BluetoothAdapter.STATE_ON);

        final int startServiceCalls = 2 * (onlyGatt ? 1 : 3); // Start and stop GATT + 2

@@ -260,7 +260,7 @@ public class AdapterServiceTest {
        verifyStateChange(BluetoothAdapter.STATE_BLE_TURNING_OFF, BluetoothAdapter.STATE_OFF,
                invocationNumber + 1, NATIVE_DISABLE_MS);

        Assert.assertFalse(mAdapterService.isEnabled());
        Assert.assertFalse(mAdapterService.getState() == BluetoothAdapter.STATE_ON);
    }

    /**
@@ -314,9 +314,9 @@ public class AdapterServiceTest {
     */
    @Test
    public void testGattStartTimeout() {
        Assert.assertFalse(mAdapterService.isEnabled());
        Assert.assertFalse(mAdapterService.getState() == BluetoothAdapter.STATE_ON);

        mAdapterService.enable();
        mAdapterService.enable(false);

        verifyStateChange(BluetoothAdapter.STATE_OFF, BluetoothAdapter.STATE_BLE_TURNING_ON, 1,
                CONTEXT_SWITCH_MS);
@@ -336,7 +336,7 @@ public class AdapterServiceTest {
        verifyStateChange(BluetoothAdapter.STATE_BLE_TURNING_OFF, BluetoothAdapter.STATE_OFF, 1,
                NATIVE_DISABLE_MS);

        Assert.assertFalse(mAdapterService.isEnabled());
        Assert.assertFalse(mAdapterService.getState() == BluetoothAdapter.STATE_ON);
    }

    /**
@@ -346,7 +346,7 @@ public class AdapterServiceTest {
    @Test
    public void testGattStopTimeout() {
        doEnable(0, false);
        Assert.assertTrue(mAdapterService.isEnabled());
        Assert.assertTrue(mAdapterService.getState() == BluetoothAdapter.STATE_ON);

        mAdapterService.disable();

@@ -372,7 +372,7 @@ public class AdapterServiceTest {
        verifyStateChange(BluetoothAdapter.STATE_BLE_TURNING_OFF, BluetoothAdapter.STATE_OFF, 1,
                AdapterState.BLE_STOP_TIMEOUT_DELAY + NATIVE_DISABLE_MS);

        Assert.assertFalse(mAdapterService.isEnabled());
        Assert.assertFalse(mAdapterService.getState() == BluetoothAdapter.STATE_ON);
    }

    /**
@@ -381,9 +381,9 @@ public class AdapterServiceTest {
     */
    @Test
    public void testProfileStartTimeout() {
        Assert.assertFalse(mAdapterService.isEnabled());
        Assert.assertFalse(mAdapterService.getState() == BluetoothAdapter.STATE_ON);

        mAdapterService.enable();
        mAdapterService.enable(false);

        verifyStateChange(BluetoothAdapter.STATE_OFF, BluetoothAdapter.STATE_BLE_TURNING_ON, 1,
                CONTEXT_SWITCH_MS);
@@ -426,7 +426,7 @@ public class AdapterServiceTest {
    public void testProfileStopTimeout() {
        doEnable(0, false);

        Assert.assertTrue(mAdapterService.isEnabled());
        Assert.assertTrue(mAdapterService.getState() == BluetoothAdapter.STATE_ON);

        mAdapterService.disable();

@@ -448,7 +448,7 @@ public class AdapterServiceTest {
        verifyStateChange(BluetoothAdapter.STATE_BLE_TURNING_OFF, BluetoothAdapter.STATE_OFF, 1,
                AdapterState.BLE_STOP_TIMEOUT_DELAY + NATIVE_DISABLE_MS);

        Assert.assertFalse(mAdapterService.isEnabled());
        Assert.assertFalse(mAdapterService.getState() == BluetoothAdapter.STATE_ON);
    }

    /**
@@ -462,7 +462,7 @@ public class AdapterServiceTest {
        SystemProperties.set(AdapterService.BLUETOOTH_BTSNOOP_LOG_MODE_PROPERTY, "false");
        doEnable(0, false);

        Assert.assertTrue(mAdapterService.isEnabled());
        Assert.assertTrue(mAdapterService.getState() == BluetoothAdapter.STATE_ON);

        Assert.assertFalse(
                SystemProperties.get(AdapterService.BLUETOOTH_BTSNOOP_LOG_MODE_PROPERTY,
@@ -495,7 +495,7 @@ public class AdapterServiceTest {
        verifyStateChange(BluetoothAdapter.STATE_BLE_TURNING_OFF, BluetoothAdapter.STATE_OFF, 1,
                NATIVE_DISABLE_MS);

        Assert.assertFalse(mAdapterService.isEnabled());
        Assert.assertFalse(mAdapterService.getState() == BluetoothAdapter.STATE_ON);

        // Restore earlier setting
        SystemProperties.set(AdapterService.BLUETOOTH_BTSNOOP_LOG_MODE_PROPERTY, snoopSetting);
@@ -518,7 +518,7 @@ public class AdapterServiceTest {
     */
    @Test
    public void testObfuscateBluetoothAddress_BluetoothDisabled() {
        Assert.assertFalse(mAdapterService.isEnabled());
        Assert.assertFalse(mAdapterService.getState() == BluetoothAdapter.STATE_ON);
        byte[] metricsSalt = getMetricsSalt(mAdapterConfig);
        Assert.assertNotNull(metricsSalt);
        BluetoothDevice device = TestUtils.getTestDevice(BluetoothAdapter.getDefaultAdapter(), 0);
@@ -534,9 +534,9 @@ public class AdapterServiceTest {
     */
    @Test
    public void testObfuscateBluetoothAddress_BluetoothEnabled() {
        Assert.assertFalse(mAdapterService.isEnabled());
        Assert.assertFalse(mAdapterService.getState() == BluetoothAdapter.STATE_ON);
        doEnable(0, false);
        Assert.assertTrue(mAdapterService.isEnabled());
        Assert.assertTrue(mAdapterService.getState() == BluetoothAdapter.STATE_ON);
        byte[] metricsSalt = getMetricsSalt(mAdapterConfig);
        Assert.assertNotNull(metricsSalt);
        BluetoothDevice device = TestUtils.getTestDevice(BluetoothAdapter.getDefaultAdapter(), 0);
@@ -551,7 +551,7 @@ public class AdapterServiceTest {
     */
    @Test
    public void testObfuscateBluetoothAddress_PersistentBetweenToggle() {
        Assert.assertFalse(mAdapterService.isEnabled());
        Assert.assertFalse(mAdapterService.getState() == BluetoothAdapter.STATE_ON);
        byte[] metricsSalt = getMetricsSalt(mAdapterConfig);
        Assert.assertNotNull(metricsSalt);
        BluetoothDevice device = TestUtils.getTestDevice(BluetoothAdapter.getDefaultAdapter(), 0);
@@ -562,7 +562,7 @@ public class AdapterServiceTest {
                obfuscatedAddress1);
        // Enable
        doEnable(0, false);
        Assert.assertTrue(mAdapterService.isEnabled());
        Assert.assertTrue(mAdapterService.getState() == BluetoothAdapter.STATE_ON);
        byte[] obfuscatedAddress3 = mAdapterService.obfuscateAddress(device);
        Assert.assertTrue(obfuscatedAddress3.length > 0);
        Assert.assertFalse(isByteArrayAllZero(obfuscatedAddress3));
@@ -570,7 +570,7 @@ public class AdapterServiceTest {
                obfuscatedAddress1);
        // Disable
        doDisable(0, false);
        Assert.assertFalse(mAdapterService.isEnabled());
        Assert.assertFalse(mAdapterService.getState() == BluetoothAdapter.STATE_ON);
        byte[] obfuscatedAddress4 = mAdapterService.obfuscateAddress(device);
        Assert.assertTrue(obfuscatedAddress4.length > 0);
        Assert.assertFalse(isByteArrayAllZero(obfuscatedAddress4));
@@ -587,7 +587,7 @@ public class AdapterServiceTest {
            PackageManager.NameNotFoundException {
        byte[] metricsSalt = getMetricsSalt(mAdapterConfig);
        Assert.assertNotNull(metricsSalt);
        Assert.assertFalse(mAdapterService.isEnabled());
        Assert.assertFalse(mAdapterService.getState() == BluetoothAdapter.STATE_ON);
        BluetoothDevice device = TestUtils.getTestDevice(BluetoothAdapter.getDefaultAdapter(), 0);
        byte[] obfuscatedAddress1 = mAdapterService.obfuscateAddress(device);
        Assert.assertTrue(obfuscatedAddress1.length > 0);
@@ -596,7 +596,7 @@ public class AdapterServiceTest {
                obfuscatedAddress1);
        tearDown();
        setUp();
        Assert.assertFalse(mAdapterService.isEnabled());
        Assert.assertFalse(mAdapterService.getState() == BluetoothAdapter.STATE_ON);
        byte[] obfuscatedAddress2 = mAdapterService.obfuscateAddress(device);
        Assert.assertTrue(obfuscatedAddress2.length > 0);
        Assert.assertFalse(isByteArrayAllZero(obfuscatedAddress2));
@@ -623,7 +623,7 @@ public class AdapterServiceTest {
            + " after factory reset")
    @Test
    public void testObfuscateBluetoothAddress_FactoryReset() {
        Assert.assertFalse(mAdapterService.isEnabled());
        Assert.assertFalse(mAdapterService.getState() == BluetoothAdapter.STATE_ON);
        BluetoothDevice device = TestUtils.getTestDevice(BluetoothAdapter.getDefaultAdapter(), 0);
        byte[] obfuscatedAddress1 = mAdapterService.obfuscateAddress(device);
        Assert.assertTrue(obfuscatedAddress1.length > 0);
@@ -657,7 +657,7 @@ public class AdapterServiceTest {
            PackageManager.NameNotFoundException {
        byte[] metricsSalt1 = getMetricsSalt(mAdapterConfig);
        Assert.assertNotNull(metricsSalt1);
        Assert.assertFalse(mAdapterService.isEnabled());
        Assert.assertFalse(mAdapterService.getState() == BluetoothAdapter.STATE_ON);
        BluetoothDevice device = TestUtils.getTestDevice(BluetoothAdapter.getDefaultAdapter(), 0);
        byte[] obfuscatedAddress1 = mAdapterService.obfuscateAddress(device);
        Assert.assertTrue(obfuscatedAddress1.length > 0);
+0 −1
Original line number Diff line number Diff line
@@ -164,7 +164,6 @@ public class HeadsetServiceAndStateMachineTest {
        mVoiceRecognitionWakeLock =
                powerManager.newWakeLock(PowerManager.PARTIAL_WAKE_LOCK, "VoiceRecognitionTest");
        TestUtils.setAdapterService(mAdapterService);
        doReturn(true).when(mAdapterService).isEnabled();
        doReturn(MAX_HEADSET_CONNECTIONS).when(mAdapterService).getMaxConnectedAudioDevices();
        doReturn(new ParcelUuid[]{BluetoothUuid.Handsfree}).when(mAdapterService)
                .getRemoteUuids(any(BluetoothDevice.class));
+0 −1
Original line number Diff line number Diff line
@@ -100,7 +100,6 @@ public class HeadsetServiceTest {
                HeadsetObjectsFactory.class);
        method.setAccessible(true);
        method.invoke(null, mObjectsFactory);
        doReturn(true).when(mAdapterService).isEnabled();
        doReturn(MAX_HEADSET_CONNECTIONS).when(mAdapterService).getMaxConnectedAudioDevices();
        doReturn(new ParcelUuid[]{BluetoothUuid.Handsfree}).when(mAdapterService)
                .getRemoteUuids(any(BluetoothDevice.class));