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

Commit 02969b9e authored by William Escande's avatar William Escande
Browse files

Trunk stable flag for AutoConnect HFP feature

Bug: 305799237
Test: atest PhonePolicyTest
Change-Id: Ic9b190b97172ec3445f8946177dc7d7e02d35934
parent 784078c7
Loading
Loading
Loading
Loading
+1 −0
Original line number Diff line number Diff line
@@ -249,6 +249,7 @@ android_app {
        "bluetooth-protos-lite",
        "bluetooth.change-ids",
        "bluetooth.mapsapi",
        "bluetooth_flags_java_lib",
        "com.android.obex",
        "com.android.vcard",
        "guava",
+3 −1
Original line number Diff line number Diff line
@@ -34,6 +34,7 @@ import static com.android.bluetooth.Utils.getBytesFromAddress;
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;
@@ -122,6 +123,7 @@ import com.android.bluetooth.btservice.bluetoothkeystore.BluetoothKeystoreServic
import com.android.bluetooth.btservice.storage.DatabaseManager;
import com.android.bluetooth.btservice.storage.MetadataDatabase;
import com.android.bluetooth.csip.CsipSetCoordinatorService;
import com.android.bluetooth.flags.FeatureFlagsImpl;
import com.android.bluetooth.gatt.GattService;
import com.android.bluetooth.gatt.ScanManager;
import com.android.bluetooth.hap.HapClientService;
@@ -689,7 +691,7 @@ public class AdapterService extends Service {
         */
        if (!isAutomotiveDevice && getResources().getBoolean(R.bool.enable_phone_policy)) {
            Log.i(TAG, "Phone policy enabled");
            mPhonePolicy = new PhonePolicy(this, new ServiceFactory());
            mPhonePolicy = new PhonePolicy(this, new ServiceFactory(), new FeatureFlagsImpl());
            mPhonePolicy.start();
        } else {
            Log.i(TAG, "Phone policy disabled");
+7 −10
Original line number Diff line number Diff line
@@ -39,6 +39,7 @@ import com.android.bluetooth.bas.BatteryService;
import com.android.bluetooth.bass_client.BassClientService;
import com.android.bluetooth.btservice.storage.DatabaseManager;
import com.android.bluetooth.csip.CsipSetCoordinatorService;
import com.android.bluetooth.flags.FeatureFlags;
import com.android.bluetooth.hap.HapClientService;
import com.android.bluetooth.hearingaid.HearingAidService;
import com.android.bluetooth.hfp.HeadsetService;
@@ -77,12 +78,6 @@ public class PhonePolicy implements AdapterService.BluetoothStateCallback {
    private static boolean sLeAudioEnabledByDefault = DeviceConfig.getBoolean(
            DeviceConfig.NAMESPACE_BLUETOOTH, CONFIG_LE_AUDIO_ENABLED_BY_DEFAULT, false);

    private static final String HFP_AUTO_CONNECT = "HFP_AUTO_CONNECT";

    @VisibleForTesting
    static boolean sIsHfpAutoConnectEnabled =
            DeviceConfig.getBoolean(DeviceConfig.NAMESPACE_BLUETOOTH, HFP_AUTO_CONNECT, false);

    /** flag for multi auto connect */
    public static boolean sIsHfpMultiAutoConnectEnabled =
            DeviceConfig.getBoolean(
@@ -94,6 +89,7 @@ public class PhonePolicy implements AdapterService.BluetoothStateCallback {
    @VisibleForTesting static int sConnectOtherProfilesTimeoutMillis = 6000; // 6s

    private DatabaseManager mDatabaseManager;
    private final FeatureFlags mFeatureFlags;
    private final AdapterService mAdapterService;
    private final ServiceFactory mFactory;
    private final Handler mHandler;
@@ -179,14 +175,15 @@ public class PhonePolicy implements AdapterService.BluetoothStateCallback {
        resetStates();
    }

    PhonePolicy(AdapterService service, ServiceFactory factory) {
    PhonePolicy(AdapterService service, ServiceFactory factory, FeatureFlags featureFlags) {
        mAdapterService = service;
        mDatabaseManager = Objects.requireNonNull(mAdapterService.getDatabase(),
                "DatabaseManager cannot be null when PhonePolicy starts");
        mFeatureFlags = Objects.requireNonNull(featureFlags, "Feature Flags cannot be null");
        mFactory = factory;
        mHandler = new PhonePolicyHandler(service.getMainLooper());
        mAutoConnectProfilesSupported = SystemProperties.getBoolean(
                AUTO_CONNECT_PROFILES_PROPERTY, false);
        mAutoConnectProfilesSupported =
                SystemProperties.getBoolean(AUTO_CONNECT_PROFILES_PROPERTY, false);
    }

    // Policy implementation, all functions MUST be private
@@ -625,7 +622,7 @@ public class PhonePolicy implements AdapterService.BluetoothStateCallback {
            return;
        }

        if (!sIsHfpAutoConnectEnabled) {
        if (!mFeatureFlags.autoConnectOnHfpWhenNoA2dpDevice()) {
            debugLog("HFP auto connect is not enabled");
            return;
        }
+41 −40
Original line number Diff line number Diff line
@@ -18,7 +18,6 @@ package com.android.bluetooth.btservice;

import static com.android.bluetooth.TestUtils.getTestDevice;
import static com.android.bluetooth.TestUtils.waitForLooperToFinishScheduledTask;
import static com.android.bluetooth.btservice.PhonePolicy.sIsHfpAutoConnectEnabled;
import static com.android.bluetooth.btservice.PhonePolicy.sIsHfpMultiAutoConnectEnabled;

import static org.mockito.Mockito.*;
@@ -40,6 +39,8 @@ import com.android.bluetooth.Utils;
import com.android.bluetooth.a2dp.A2dpService;
import com.android.bluetooth.btservice.storage.DatabaseManager;
import com.android.bluetooth.btservice.storage.MetadataDatabase;
import com.android.bluetooth.flags.FakeFeatureFlagsImpl;
import com.android.bluetooth.flags.Flags;
import com.android.bluetooth.hfp.HeadsetService;
import com.android.bluetooth.le_audio.LeAudioService;

@@ -67,6 +68,7 @@ public class PhonePolicyTest {
    private BluetoothAdapter mAdapter;
    private PhonePolicy mPhonePolicy;
    private boolean mOriginalDualModeState;
    private FakeFeatureFlagsImpl mFakeFlagsImpl;

    @Mock private AdapterService mAdapterService;
    @Mock private ServiceFactory mServiceFactory;
@@ -101,7 +103,10 @@ public class PhonePolicyTest {
        // Must be called to initialize services
        mAdapter = BluetoothAdapter.getDefaultAdapter();
        PhonePolicy.sConnectOtherProfilesTimeoutMillis = CONNECT_OTHER_PROFILES_TIMEOUT_MILLIS;
        mPhonePolicy = new PhonePolicy(mAdapterService, mServiceFactory);

        mFakeFlagsImpl = new FakeFeatureFlagsImpl();

        mPhonePolicy = new PhonePolicy(mAdapterService, mServiceFactory, mFakeFlagsImpl);
        mOriginalDualModeState = Utils.isDualModeAudioEnabled();
    }

@@ -622,9 +627,8 @@ public class PhonePolicyTest {
     */
    @Test
    public void testAutoConnectHfpOnly() {
        sIsHfpAutoConnectEnabled = true;
        mFakeFlagsImpl.setFlag(Flags.FLAG_AUTO_CONNECT_ON_HFP_WHEN_NO_A2DP_DEVICE, true);

        try {
        // Return desired values from the mocked object(s)
        doReturn(BluetoothAdapter.STATE_ON).when(mAdapterService).getState();
        doReturn(false).when(mAdapterService).isQuietModeEnabled();
@@ -636,7 +640,7 @@ public class PhonePolicyTest {
                        .build();
        DatabaseManager db = new DatabaseManager(mAdapterService);
        doReturn(db).when(mAdapterService).getDatabase();
            PhonePolicy phonePolicy = new PhonePolicy(mAdapterService, mServiceFactory);
        PhonePolicy phonePolicy = new PhonePolicy(mAdapterService, mServiceFactory, mFakeFlagsImpl);

        db.start(mDatabase);
        TestUtils.waitForLooperToFinishScheduledTask(db.getHandlerLooper());
@@ -656,14 +660,11 @@ public class PhonePolicyTest {

        // Check that we got a request to connect over HFP for each device
        verify(mHeadsetService).connect(eq(bondedDevice));
        } finally {
            sIsHfpAutoConnectEnabled = false;
        }
    }

    @Test
    public void autoConnect_whenMultiHfp_startConnection() {
        sIsHfpAutoConnectEnabled = true;
        mFakeFlagsImpl.setFlag(Flags.FLAG_AUTO_CONNECT_ON_HFP_WHEN_NO_A2DP_DEVICE, true);
        sIsHfpMultiAutoConnectEnabled = true;

        try {
@@ -678,7 +679,8 @@ public class PhonePolicyTest {
                            .build();
            DatabaseManager db = new DatabaseManager(mAdapterService);
            doReturn(db).when(mAdapterService).getDatabase();
            PhonePolicy phonePolicy = new PhonePolicy(mAdapterService, mServiceFactory);
            PhonePolicy phonePolicy =
                    new PhonePolicy(mAdapterService, mServiceFactory, mFakeFlagsImpl);

            db.start(mDatabase);
            TestUtils.waitForLooperToFinishScheduledTask(db.getHandlerLooper());
@@ -706,13 +708,12 @@ public class PhonePolicyTest {
            }
        } finally {
            sIsHfpMultiAutoConnectEnabled = false;
            sIsHfpAutoConnectEnabled = false;
        }
    }

    @Test
    public void autoConnect_whenMultiHfpAndDeconnection_startConnection() {
        sIsHfpAutoConnectEnabled = true;
        mFakeFlagsImpl.setFlag(Flags.FLAG_AUTO_CONNECT_ON_HFP_WHEN_NO_A2DP_DEVICE, true);
        sIsHfpMultiAutoConnectEnabled = true;

        try {
@@ -727,7 +728,8 @@ public class PhonePolicyTest {
                            .build();
            DatabaseManager db = new DatabaseManager(mAdapterService);
            doReturn(db).when(mAdapterService).getDatabase();
            PhonePolicy phonePolicy = new PhonePolicy(mAdapterService, mServiceFactory);
            PhonePolicy phonePolicy =
                    new PhonePolicy(mAdapterService, mServiceFactory, mFakeFlagsImpl);

            db.start(mDatabase);
            TestUtils.waitForLooperToFinishScheduledTask(db.getHandlerLooper());
@@ -766,7 +768,6 @@ public class PhonePolicyTest {
            verify(mHeadsetService, times(0)).connect(eq(deviceToDeconnect));
        } finally {
            sIsHfpMultiAutoConnectEnabled = false;
            sIsHfpAutoConnectEnabled = false;
        }
    }

+2 −0
Original line number Diff line number Diff line
@@ -7,6 +7,7 @@ aconfig_declarations {
    name: "bluetooth_aconfig_flags",
    package: "com.android.bluetooth.flags",
    srcs: [
        "hfp.aconfig",
        "system_service.aconfig",
    ],
}
@@ -15,6 +16,7 @@ java_aconfig_library {
    name: "bluetooth_flags_java_lib",
    aconfig_declarations: "bluetooth_aconfig_flags",
    visibility: [
        "//packages/modules/Bluetooth/android/app",
        "//packages/modules/Bluetooth/service:__subpackages__",
    ],
    apex_available: [
Loading