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

Commit 91182f35 authored by Ugo Yu's avatar Ugo Yu
Browse files

DO NOT MERGE - Do not show Bluetooth icon when headset is not active

Do not show Bluetooth icon when A2DP, HFP and Hearing
aid profiles are connected but not active.
Other Bluetooth profile will retain the same behavior.

Bug: 144061558
Test: atest com.android.systemui.statusbar
Change-Id: Id0fab356f041e90a7654c8e18185c6aa15e2d4df
parent 3ea014ca
Loading
Loading
Loading
Loading
+5 −2
Original line number Diff line number Diff line
@@ -379,8 +379,11 @@ public class PhoneStatusBarPolicy
                mContext.getString(R.string.accessibility_quick_settings_bluetooth_on);
        boolean bluetoothVisible = false;
        if (mBluetooth != null) {
            if (mBluetooth.isBluetoothConnected()) {
                contentDescription = mContext.getString(R.string.accessibility_bluetooth_connected);
            if (mBluetooth.isBluetoothConnected()
                    && (mBluetooth.isBluetoothAudioActive()
                    || !mBluetooth.isBluetoothAudioProfileOnly())) {
                contentDescription = mContext.getString(
                        R.string.accessibility_bluetooth_connected);
                bluetoothVisible = mBluetooth.isBluetoothEnabled();
            }
        }
+2 −0
Original line number Diff line number Diff line
@@ -31,6 +31,8 @@ public interface BluetoothController extends CallbackController<Callback>, Dumpa

    boolean isBluetoothConnected();
    boolean isBluetoothConnecting();
    boolean isBluetoothAudioProfileOnly();
    boolean isBluetoothAudioActive();
    String getConnectedDeviceName();
    void setBluetoothEnabled(boolean enabled);
    Collection<CachedBluetoothDevice> getDevices();
+67 −0
Original line number Diff line number Diff line
@@ -34,6 +34,7 @@ import android.util.Log;
import com.android.settingslib.bluetooth.BluetoothCallback;
import com.android.settingslib.bluetooth.CachedBluetoothDevice;
import com.android.settingslib.bluetooth.LocalBluetoothManager;
import com.android.settingslib.bluetooth.LocalBluetoothProfile;
import com.android.settingslib.bluetooth.LocalBluetoothProfileManager;

import java.io.FileDescriptor;
@@ -66,6 +67,8 @@ public class BluetoothControllerImpl implements BluetoothController, BluetoothCa

    private boolean mEnabled;
    private int mConnectionState = BluetoothAdapter.STATE_DISCONNECTED;
    private boolean mAudioProfileOnly;
    private boolean mIsActive;

    private final H mHandler = new H(Looper.getMainLooper());
    private int mState;
@@ -103,6 +106,8 @@ public class BluetoothControllerImpl implements BluetoothController, BluetoothCa
        }
        pw.print("  mEnabled="); pw.println(mEnabled);
        pw.print("  mConnectionState="); pw.println(stateToString(mConnectionState));
        pw.print("  mAudioProfileOnly="); pw.println(mAudioProfileOnly);
        pw.print("  mIsActive="); pw.println(mIsActive);
        pw.print("  mConnectedDevices="); pw.println(mConnectedDevices);
        pw.print("  mCallbacks.size="); pw.println(mHandler.mCallbacks.size());
        pw.println("  Bluetooth Devices:");
@@ -175,6 +180,16 @@ public class BluetoothControllerImpl implements BluetoothController, BluetoothCa
        return mConnectionState == BluetoothAdapter.STATE_CONNECTING;
    }

    @Override
    public boolean isBluetoothAudioProfileOnly() {
        return mAudioProfileOnly;
    }

    @Override
    public boolean isBluetoothAudioActive() {
        return mIsActive;
    }

    @Override
    public void setBluetoothEnabled(boolean enabled) {
        if (mLocalBluetoothManager != null) {
@@ -239,6 +254,48 @@ public class BluetoothControllerImpl implements BluetoothController, BluetoothCa
            mConnectionState = state;
            mHandler.sendEmptyMessage(H.MSG_STATE_CHANGED);
        }
        updateAudioProfile();
    }

    private void updateActive() {
        boolean isActive = false;

        for (CachedBluetoothDevice device : getDevices()) {
            isActive |= device.isActiveDevice(BluetoothProfile.HEADSET)
                    || device.isActiveDevice(BluetoothProfile.A2DP)
                    || device.isActiveDevice(BluetoothProfile.HEARING_AID);
        }

        if (mIsActive != isActive) {
            mIsActive = isActive;
            mHandler.sendEmptyMessage(H.MSG_STATE_CHANGED);
        }
    }

    private void updateAudioProfile() {
        boolean audioProfileConnected = false;
        boolean otherProfileConnected = false;

        for (CachedBluetoothDevice device : getDevices()) {
            for (LocalBluetoothProfile profile : device.getProfiles()) {
                int profileId = profile.getProfileId();
                boolean isConnected = device.isConnectedProfile(profile);
                if (profileId == BluetoothProfile.HEADSET
                        || profileId == BluetoothProfile.A2DP
                        || profileId == BluetoothProfile.HEARING_AID) {
                    audioProfileConnected |= isConnected;
                } else {
                    otherProfileConnected |= isConnected;
                }
            }
        }

        boolean audioProfileOnly = (audioProfileConnected && !otherProfileConnected);
        if (audioProfileOnly != mAudioProfileOnly) {
            mAudioProfileOnly = audioProfileOnly;
            mHandler.sendEmptyMessage(H.MSG_STATE_CHANGED);
        }

    }

    @Override
@@ -293,6 +350,16 @@ public class BluetoothControllerImpl implements BluetoothController, BluetoothCa
        mHandler.sendEmptyMessage(H.MSG_STATE_CHANGED);
    }

    @Override
    public void onActiveDeviceChanged(CachedBluetoothDevice activeDevice, int bluetoothProfile) {
        if (DEBUG) {
            Log.d(TAG, "ActiveDeviceChanged=" + activeDevice.getAddress()
                    + " profileId=" + bluetoothProfile);
        }
        updateActive();
        mHandler.sendEmptyMessage(H.MSG_STATE_CHANGED);
    }

    @Override
    public void onAclConnectionStateChanged(CachedBluetoothDevice cachedDevice, int state) {
        if (DEBUG) {
+25 −0
Original line number Diff line number Diff line
@@ -39,6 +39,7 @@ import com.android.settingslib.bluetooth.CachedBluetoothDevice;
import com.android.settingslib.bluetooth.CachedBluetoothDeviceManager;
import com.android.settingslib.bluetooth.LocalBluetoothAdapter;
import com.android.settingslib.bluetooth.LocalBluetoothManager;
import com.android.settingslib.bluetooth.LocalBluetoothProfile;
import com.android.settingslib.bluetooth.LocalBluetoothProfileManager;
import com.android.systemui.SysuiTestCase;

@@ -229,4 +230,28 @@ public class BluetoothControllerImplTest extends SysuiTestCase {
        assertTrue(mBluetoothControllerImpl.isBluetoothConnected());
        verify(callback, atLeastOnce()).onBluetoothStateChange(anyBoolean());
    }

    @Test
    public void testOnActiveDeviceChanged_updatesAudioActive() {
        assertFalse(mBluetoothControllerImpl.isBluetoothAudioActive());
        assertFalse(mBluetoothControllerImpl.isBluetoothAudioProfileOnly());

        CachedBluetoothDevice device = mock(CachedBluetoothDevice.class);
        mDevices.add(device);
        when(device.isActiveDevice(BluetoothProfile.HEADSET)).thenReturn(true);

        List<LocalBluetoothProfile> profiles = new ArrayList<>();
        LocalBluetoothProfile profile = mock(LocalBluetoothProfile.class);
        profiles.add(profile);
        when(profile.getProfileId()).thenReturn(BluetoothProfile.HEADSET);
        when(device.getProfiles()).thenReturn(profiles);
        when(device.isConnectedProfile(profile)).thenReturn(true);

        mBluetoothControllerImpl.onAclConnectionStateChanged(device,
                BluetoothProfile.STATE_CONNECTED);
        mBluetoothControllerImpl.onActiveDeviceChanged(device, BluetoothProfile.HEADSET);

        assertTrue(mBluetoothControllerImpl.isBluetoothAudioActive());
        assertTrue(mBluetoothControllerImpl.isBluetoothAudioProfileOnly());
    }
}
+10 −0
Original line number Diff line number Diff line
@@ -56,6 +56,16 @@ public class FakeBluetoothController extends BaseLeakChecker<Callback> implement
        return false;
    }

    @Override
    public boolean isBluetoothAudioProfileOnly() {
        return false;
    }

    @Override
    public boolean isBluetoothAudioActive() {
        return false;
    }

    @Override
    public String getConnectedDeviceName() {
        return null;