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

Commit 3374377f authored by William Escande's avatar William Escande Committed by Gerrit Code Review
Browse files

Merge changes I4012769d,I83807df8,I0a66239e,Icede80c6,I94be95f6, ... into main

* changes:
  AdapterServiceTest: Fix flaky test
  Use TestLooper in AdapterService*Test
  static import of BluetoothAdapter State
  Remove binder tests from AdapterServiceTest + unification
  Move AdapterService*Test to truth assert
  AdapterService: getSystemService before initNative
  AdapterService: Add a constructor with a TestLooper parameter
parents b38cff2e 8def716c
Loading
Loading
Loading
Loading
+97 −50
Original line number Diff line number Diff line
@@ -34,6 +34,8 @@ import static com.android.bluetooth.Utils.hasBluetoothPrivilegedPermission;
import static com.android.bluetooth.Utils.isDualModeAudioEnabled;
import static com.android.bluetooth.Utils.isPackageNameAccurate;

import static java.util.Objects.requireNonNull;

import android.annotation.NonNull;
import android.annotation.Nullable;
import android.annotation.RequiresPermission;
@@ -165,7 +167,6 @@ import java.util.HashSet;
import java.util.Iterator;
import java.util.List;
import java.util.Map;
import java.util.Objects;
import java.util.Set;
import java.util.UUID;
import java.util.concurrent.ConcurrentHashMap;
@@ -271,6 +272,14 @@ public class AdapterService extends Service {

    private static AdapterService sAdapterService;

    // Keep a constructor for ActivityThread.handleCreateService
    AdapterService() {}

    @VisibleForTesting
    AdapterService(Looper looper) {
        mLooper = looper;
    }

    public static synchronized AdapterService getAdapterService() {
        return sAdapterService;
    }
@@ -419,6 +428,10 @@ public class AdapterService extends Service {
    private static final int MESSAGE_ON_PROFILE_SERVICE_UNBIND = 6;

    class AdapterServiceHandler extends Handler {
        AdapterServiceHandler(Looper looper) {
            super(looper);
        }

        @Override
        public void handleMessage(Message msg) {
            verboseLog("handleMessage() - Message: " + msg.what);
@@ -554,7 +567,8 @@ public class AdapterService extends Service {
        }
    }

    private final AdapterServiceHandler mHandler = new AdapterServiceHandler();
    private Looper mLooper;
    private AdapterServiceHandler mHandler;

    /**
     * Stores information about requests made to the audio framework arising from calls to {@link
@@ -584,6 +598,10 @@ public class AdapterService extends Service {
        }
    }

    final @NonNull <T> T getNonNullSystemService(@NonNull Class<T> clazz) {
        return requireNonNull(getSystemService(clazz), clazz.getSimpleName() + " cannot be null");
    }

    @Override
    @RequiresPermission(
            allOf = {
@@ -598,16 +616,28 @@ public class AdapterService extends Service {
            })
    public void onCreate() {
        super.onCreate();
        if (mLooper == null) {
            mLooper = Looper.getMainLooper();
        }
        mHandler = new AdapterServiceHandler(mLooper);
        initMetricsLogger();
        debugLog("onCreate()");
        mDeviceConfigListener.start();
        mRemoteDevices = new RemoteDevices(this, Looper.getMainLooper());

        mUserManager = getNonNullSystemService(UserManager.class);
        mAppOps = getNonNullSystemService(AppOpsManager.class);
        mAlarmManager = getNonNullSystemService(AlarmManager.class);
        mPowerManager = getNonNullSystemService(PowerManager.class);
        mBatteryStatsManager = getNonNullSystemService(BatteryStatsManager.class);
        mCompanionDeviceManager = getNonNullSystemService(CompanionDeviceManager.class);

        mRemoteDevices = new RemoteDevices(this, mLooper);
        mRemoteDevices.init();
        clearDiscoveringPackages();
        mBinder = new AdapterServiceBinder(this);
        mAdapter = BluetoothAdapter.getDefaultAdapter();
        mAdapterProperties = new AdapterProperties(this);
        mAdapterStateMachine = AdapterState.make(this);
        mAdapterStateMachine = new AdapterState(this, mLooper);
        mJniCallbacks = new JniCallbacks(this, mAdapterProperties);
        mBluetoothKeystoreService = new BluetoothKeystoreService(isCommonCriteriaMode());
        mBluetoothKeystoreService.start();
@@ -621,7 +651,6 @@ public class AdapterService extends Service {
                getApplicationContext()
                        .getPackageManager()
                        .hasSystemFeature(PackageManager.FEATURE_LEANBACK_ONLY);
        mUserManager = getSystemService(UserManager.class);
        initNative(
                mUserManager.isGuestUser(),
                isCommonCriteriaMode(),
@@ -635,20 +664,15 @@ public class AdapterService extends Service {
        mBluetoothQualityReportReadyCallbacks =
                new RemoteCallbackList<IBluetoothQualityReportReadyCallback>();
        mCallbacks = new RemoteCallbackList<IBluetoothCallback>();
        mAppOps = getSystemService(AppOpsManager.class);
        // Load the name and address
        getAdapterPropertyNative(AbstractionLayer.BT_PROPERTY_BDADDR);
        getAdapterPropertyNative(AbstractionLayer.BT_PROPERTY_BDNAME);
        getAdapterPropertyNative(AbstractionLayer.BT_PROPERTY_CLASS_OF_DEVICE);
        mAlarmManager = getSystemService(AlarmManager.class);
        mPowerManager = getSystemService(PowerManager.class);
        mBatteryStatsManager = getSystemService(BatteryStatsManager.class);
        mCompanionDeviceManager = getSystemService(CompanionDeviceManager.class);

        mBluetoothKeystoreService.initJni();

        mBluetoothQualityReportNativeInterface =
                Objects.requireNonNull(
                requireNonNull(
                        BluetoothQualityReportNativeInterface.getInstance(),
                        "BluetoothQualityReportNativeInterface cannot be null when BQR starts");
        mBluetoothQualityReportNativeInterface.init();
@@ -684,8 +708,7 @@ public class AdapterService extends Service {
        mActiveDeviceManager = new ActiveDeviceManager(this, new ServiceFactory());
        mActiveDeviceManager.start();

        mSilenceDeviceManager =
                new SilenceDeviceManager(this, new ServiceFactory(), Looper.getMainLooper());
        mSilenceDeviceManager = new SilenceDeviceManager(this, new ServiceFactory(), mLooper);
        mSilenceDeviceManager.start();

        mBtCompanionManager = new CompanionManager(this, new ServiceFactory());
@@ -2403,9 +2426,8 @@ public class AdapterService extends Service {
            }
        }

        @VisibleForTesting
        @RequiresPermission(android.Manifest.permission.BLUETOOTH_SCAN)
        int getScanMode(AttributionSource attributionSource) {
        private int getScanMode(AttributionSource attributionSource) {
            AdapterService service = getService();
            if (service == null
                    || !callerIsSystemOrActiveOrManagedUser(service, TAG, "getScanMode")
@@ -2414,7 +2436,7 @@ public class AdapterService extends Service {
                return BluetoothAdapter.SCAN_MODE_NONE;
            }

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

        @Override
@@ -4013,13 +4035,12 @@ public class AdapterService extends Service {
            }
        }

        @VisibleForTesting
        @RequiresPermission(
                allOf = {
                    android.Manifest.permission.BLUETOOTH_CONNECT,
                    android.Manifest.permission.BLUETOOTH_PRIVILEGED,
                })
        boolean factoryReset(AttributionSource source) {
        private boolean factoryReset(AttributionSource source) {
            AdapterService service = getService();
            if (service == null
                    || !Utils.checkConnectPermissionForDataDelivery(service, source, TAG)) {
@@ -4027,20 +4048,7 @@ public class AdapterService extends Service {
            }

            enforceBluetoothPrivilegedPermission(service);

            if (service.mDatabaseManager != null) {
                service.mDatabaseManager.factoryReset();
            }

            if (service.mBluetoothKeystoreService != null) {
                service.mBluetoothKeystoreService.factoryReset();
            }

            if (service.mBtCompanionManager != null) {
                service.mBtCompanionManager.factoryReset();
            }

            return service.factoryResetNative();
            return service.factoryReset();
        }

        @Override
@@ -4117,13 +4125,12 @@ public class AdapterService extends Service {
            }
        }

        @VisibleForTesting
        @RequiresPermission(
                allOf = {
                    android.Manifest.permission.BLUETOOTH_CONNECT,
                    android.Manifest.permission.BLUETOOTH_PRIVILEGED,
                })
        void registerCallback(IBluetoothCallback callback, AttributionSource source) {
        private void registerCallback(IBluetoothCallback callback, AttributionSource source) {
            AdapterService service = getService();
            if (service == null
                    || !callerIsSystemOrActiveOrManagedUser(service, TAG, "registerCallback")
@@ -4133,7 +4140,7 @@ public class AdapterService extends Service {

            enforceBluetoothPrivilegedPermission(service);

            service.mCallbacks.register(callback);
            service.registerCallback(callback);
        }

        @Override
@@ -4155,7 +4162,7 @@ public class AdapterService extends Service {
                    android.Manifest.permission.BLUETOOTH_CONNECT,
                    android.Manifest.permission.BLUETOOTH_PRIVILEGED,
                })
        void unregisterCallback(IBluetoothCallback callback, AttributionSource source) {
        private void unregisterCallback(IBluetoothCallback callback, AttributionSource source) {
            AdapterService service = getService();
            if (service == null
                    || service.mCallbacks == null
@@ -4166,7 +4173,7 @@ public class AdapterService extends Service {

            enforceBluetoothPrivilegedPermission(service);

            service.mCallbacks.unregister(callback);
            service.unregisterCallback(callback);
        }

        @Override
@@ -4716,13 +4723,12 @@ public class AdapterService extends Service {
            }
        }

        @VisibleForTesting
        @RequiresPermission(
                allOf = {
                    android.Manifest.permission.BLUETOOTH_CONNECT,
                    android.Manifest.permission.BLUETOOTH_PRIVILEGED,
                })
        void startBrEdr(AttributionSource source) {
        private void startBrEdr(AttributionSource source) {
            AdapterService service = getService();
            if (service == null
                    || !callerIsSystemOrActiveOrManagedUser(service, TAG, "startBrEdr")
@@ -4745,13 +4751,12 @@ public class AdapterService extends Service {
            }
        }

        @VisibleForTesting
        @RequiresPermission(
                allOf = {
                    android.Manifest.permission.BLUETOOTH_CONNECT,
                    android.Manifest.permission.BLUETOOTH_PRIVILEGED,
                })
        void stopBle(AttributionSource source) {
        private void stopBle(AttributionSource source) {
            AdapterService service = getService();
            if (service == null
                    || !callerIsSystemOrActiveOrManagedUser(service, TAG, "stopBle")
@@ -4940,8 +4945,8 @@ public class AdapterService extends Service {
            if (!callerIsSystemOrActiveOrManagedUser(service, TAG, "setPreferredAudioProfiles")) {
                return BluetoothStatusCodes.ERROR_BLUETOOTH_NOT_ALLOWED;
            }
            Objects.requireNonNull(device);
            Objects.requireNonNull(modeToProfileBundle);
            requireNonNull(device);
            requireNonNull(modeToProfileBundle);
            if (!BluetoothAdapter.checkBluetoothAddress(device.getAddress())) {
                throw new IllegalArgumentException("device cannot have an invalid address");
            }
@@ -4976,7 +4981,7 @@ public class AdapterService extends Service {
            if (!callerIsSystemOrActiveOrManagedUser(service, TAG, "getPreferredAudioProfiles")) {
                return Bundle.EMPTY;
            }
            Objects.requireNonNull(device);
            requireNonNull(device);
            if (!BluetoothAdapter.checkBluetoothAddress(device.getAddress())) {
                throw new IllegalArgumentException("device cannot have an invalid address");
            }
@@ -5012,7 +5017,7 @@ public class AdapterService extends Service {
            if (!callerIsSystem(TAG, "setPreferredAudioProfiles")) {
                return BluetoothStatusCodes.ERROR_BLUETOOTH_NOT_ALLOWED;
            }
            Objects.requireNonNull(device);
            requireNonNull(device);
            if (!BluetoothAdapter.checkBluetoothAddress(device.getAddress())) {
                throw new IllegalArgumentException("device cannot have an invalid address");
            }
@@ -5055,7 +5060,7 @@ public class AdapterService extends Service {
                    service, TAG, "registerPreferredAudioProfilesChangedCallback")) {
                return BluetoothStatusCodes.ERROR_BLUETOOTH_NOT_ALLOWED;
            }
            Objects.requireNonNull(callback);
            requireNonNull(callback);
            if (!Utils.checkConnectPermissionForDataDelivery(service, source, TAG)) {
                return BluetoothStatusCodes.ERROR_MISSING_BLUETOOTH_CONNECT_PERMISSION;
            }
@@ -5099,7 +5104,7 @@ public class AdapterService extends Service {
                    service, TAG, "unregisterPreferredAudioProfilesChangedCallback")) {
                return BluetoothStatusCodes.ERROR_BLUETOOTH_NOT_ALLOWED;
            }
            Objects.requireNonNull(callback);
            requireNonNull(callback);
            if (!Utils.checkConnectPermissionForDataDelivery(service, source, TAG)) {
                return BluetoothStatusCodes.ERROR_MISSING_BLUETOOTH_CONNECT_PERMISSION;
            }
@@ -5143,7 +5148,7 @@ public class AdapterService extends Service {
                    service, TAG, "registerBluetoothQualityReportReadyCallback")) {
                return BluetoothStatusCodes.ERROR_BLUETOOTH_NOT_ALLOWED;
            }
            Objects.requireNonNull(callback);
            requireNonNull(callback);
            if (!Utils.checkConnectPermissionForDataDelivery(service, source, TAG)) {
                return BluetoothStatusCodes.ERROR_MISSING_BLUETOOTH_CONNECT_PERMISSION;
            }
@@ -5181,7 +5186,7 @@ public class AdapterService extends Service {
                    service, TAG, "unregisterBluetoothQualityReportReadyCallback")) {
                return BluetoothStatusCodes.ERROR_BLUETOOTH_NOT_ALLOWED;
            }
            Objects.requireNonNull(callback);
            requireNonNull(callback);
            if (!Utils.checkConnectPermissionForDataDelivery(service, source, TAG)) {
                return BluetoothStatusCodes.ERROR_MISSING_BLUETOOTH_CONNECT_PERMISSION;
            }
@@ -6758,6 +6763,48 @@ public class AdapterService extends Service {
        return mAdapterProperties.isA2dpOffloadEnabled();
    }

    @VisibleForTesting
    void registerCallback(IBluetoothCallback callback) {
        mCallbacks.register(callback);
    }

    @VisibleForTesting
    void unregisterCallback(IBluetoothCallback callback) {
        mCallbacks.unregister(callback);
    }

    @VisibleForTesting
    void startBrEdr() {
        mAdapterStateMachine.sendMessage(AdapterState.USER_TURN_ON);
    }

    @VisibleForTesting
    void stopBle() {
        mAdapterStateMachine.sendMessage(AdapterState.BLE_TURN_OFF);
    }

    @VisibleForTesting
    boolean factoryReset() {
        if (mDatabaseManager != null) {
            mDatabaseManager.factoryReset();
        }

        if (mBluetoothKeystoreService != null) {
            mBluetoothKeystoreService.factoryReset();
        }

        if (mBtCompanionManager != null) {
            mBtCompanionManager.factoryReset();
        }

        return factoryResetNative();
    }

    @VisibleForTesting
    int getScanMode() {
        return mAdapterProperties.getScanMode();
    }

    public String[] getAllowlistedMediaPlayers() {
        return mAdapterProperties.getAllowlistedMediaPlayers();
    }
@@ -7185,7 +7232,7 @@ public class AdapterService extends Service {
            };

    private boolean isCommonCriteriaMode() {
        return getSystemService(DevicePolicyManager.class).isCommonCriteriaModeEnabled(null);
        return getNonNullSystemService(DevicePolicyManager.class).isCommonCriteriaModeEnabled(null);
    }

    @SuppressLint("AndroidFrameworkRequiresPermission")
+4 −9
Original line number Diff line number Diff line
@@ -17,6 +17,7 @@
package com.android.bluetooth.btservice;

import android.bluetooth.BluetoothAdapter;
import android.os.Looper;
import android.os.Message;
import android.os.SystemProperties;
import android.util.Log;
@@ -92,8 +93,8 @@ final class AdapterState extends StateMachine {

    private int mPrevState = BluetoothAdapter.STATE_OFF;

    private AdapterState(AdapterService service) {
        super(TAG);
    AdapterState(AdapterService service, Looper looper) {
        super(TAG, looper);
        addState(mOnState);
        addState(mBleOnState);
        addState(mOffState);
@@ -103,6 +104,7 @@ final class AdapterState extends StateMachine {
        addState(mTurningBleOffState);
        mAdapterService = service;
        setInitialState(mOffState);
        start();
    }

    private String messageString(int message) {
@@ -123,13 +125,6 @@ final class AdapterState extends StateMachine {
        }
    }

    public static AdapterState make(AdapterService service) {
        Log.d(TAG, "make() - Creating AdapterState");
        AdapterState as = new AdapterState(service);
        as.start();
        return as;
    }

    public void doQuit() {
        quitNow();
    }
+1 −0
Original line number Diff line number Diff line
@@ -28,6 +28,7 @@ java_defaults {
        "androidx.test.rules",
        "androidx.test.uiautomator_uiautomator",
        "framework-bluetooth-pre-jarjar",
        "frameworks-base-testutils",
        "gson",
        "mockito-target",
        "truth-prebuilt",
+1 −1
Original line number Diff line number Diff line
@@ -110,7 +110,7 @@ public class AdapterServiceBinderTest {
    @Test
    public void getScanMode() {
        mBinder.getScanMode(mAttributionSource, SynchronousResultReceiver.get());
        verify(mService.mAdapterProperties).getScanMode();
        verify(mService).getScanMode();
    }

    @Test
+107 −247

File changed.

Preview size limit exceeded, changes collapsed.

Loading