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

Commit 82d3bb2b authored by jasonwshsu's avatar jasonwshsu
Browse files

Update summary in Accessibility -> Hearing aids

Bug: 225117843
Test: make RunSettingsRoboTests ROBOTEST_FILTER=AccessibilityHearingAidPreferenceControllerTest
Change-Id: I19c08474349e9ae98cd3f296ba8423f920d55fcf
parent 82ce1d19
Loading
Loading
Loading
Loading
+57 −31
Original line number Diff line number Diff line
@@ -39,12 +39,13 @@ import com.android.settings.bluetooth.BluetoothDeviceDetailsFragment;
import com.android.settings.core.BasePreferenceController;
import com.android.settings.core.SubSettingLauncher;
import com.android.settingslib.bluetooth.CachedBluetoothDevice;
import com.android.settingslib.bluetooth.CachedBluetoothDeviceManager;
import com.android.settingslib.bluetooth.HearingAidProfile;
import com.android.settingslib.bluetooth.LocalBluetoothManager;
import com.android.settingslib.core.lifecycle.LifecycleObserver;
import com.android.settingslib.core.lifecycle.events.OnStart;
import com.android.settingslib.core.lifecycle.events.OnStop;

import java.util.Iterator;
import java.util.List;
import java.util.concurrent.ExecutionException;
import java.util.concurrent.FutureTask;
@@ -82,15 +83,13 @@ public class AccessibilityHearingAidPreferenceController extends BasePreferenceC

    private final LocalBluetoothManager mLocalBluetoothManager;
    private final BluetoothAdapter mBluetoothAdapter;
    //cache value of supporting hearing aid or not
    private boolean mHearingAidProfileSupported;

    private FragmentManager mFragmentManager;

    public AccessibilityHearingAidPreferenceController(Context context, String preferenceKey) {
        super(context, preferenceKey);
        mLocalBluetoothManager = getLocalBluetoothManager();
        mBluetoothAdapter = BluetoothAdapter.getDefaultAdapter();
        mHearingAidProfileSupported = isHearingAidProfileSupported();
    }

    @Override
@@ -101,25 +100,21 @@ public class AccessibilityHearingAidPreferenceController extends BasePreferenceC

    @Override
    public int getAvailabilityStatus() {
        return mHearingAidProfileSupported ? AVAILABLE : UNSUPPORTED_ON_DEVICE;
        return isHearingAidProfileSupported() ? AVAILABLE : UNSUPPORTED_ON_DEVICE;
    }

    @Override
    public void onStart() {
        if (mHearingAidProfileSupported) {
        IntentFilter filter = new IntentFilter();
        filter.addAction(BluetoothHearingAid.ACTION_CONNECTION_STATE_CHANGED);
        filter.addAction(BluetoothAdapter.ACTION_STATE_CHANGED);
        mContext.registerReceiver(mHearingAidChangedReceiver, filter);
    }
    }

    @Override
    public void onStop() {
        if (mHearingAidProfileSupported) {
        mContext.unregisterReceiver(mHearingAidChangedReceiver);
    }
    }

    @Override
    public boolean handlePreferenceTreeClick(Preference preference) {
@@ -141,7 +136,27 @@ public class AccessibilityHearingAidPreferenceController extends BasePreferenceC
        if (device == null) {
            return mContext.getText(R.string.accessibility_hearingaid_not_connected_summary);
        }
        return device.getName();

        final int connectedNum = getConnectedHearingAidDeviceNum();
        final CharSequence name = device.getName();
        final int side = device.getDeviceSide();
        final CachedBluetoothDevice subDevice = device.getSubDevice();
        if (connectedNum > 1) {
            return mContext.getString(R.string.accessibility_hearingaid_more_device_summary, name);
        }
        if (subDevice != null && subDevice.isConnected()) {
            return mContext.getString(
                    R.string.accessibility_hearingaid_left_and_right_side_device_summary, name);
        }
        if (side == HearingAidProfile.DeviceSide.SIDE_INVALID) {
            return mContext.getString(
                    R.string.accessibility_hearingaid_active_device_summary, name);
        }
        return (side == HearingAidProfile.DeviceSide.SIDE_LEFT)
                ? mContext.getString(
                        R.string.accessibility_hearingaid_left_side_device_summary, name)
                : mContext.getString(
                        R.string.accessibility_hearingaid_right_side_device_summary, name);
    }

    public void setFragmentManager(FragmentManager fragmentManager) {
@@ -150,33 +165,44 @@ public class AccessibilityHearingAidPreferenceController extends BasePreferenceC

    @VisibleForTesting
    CachedBluetoothDevice getConnectedHearingAidDevice() {
        if (!mHearingAidProfileSupported) {
            return null;
        }
        if (mBluetoothAdapter == null || !mBluetoothAdapter.isEnabled()) {
        if (!isHearingAidProfileSupported()) {
            return null;
        }
        final List<BluetoothDevice> deviceList = mLocalBluetoothManager.getProfileManager()
                .getHearingAidProfile().getConnectedDevices();
        final Iterator it = deviceList.iterator();
        while (it.hasNext()) {
            BluetoothDevice obj = (BluetoothDevice)it.next();
            if (!mLocalBluetoothManager.getCachedDeviceManager().isSubDevice(obj)) {
                return mLocalBluetoothManager.getCachedDeviceManager().findDevice(obj);

        final CachedBluetoothDeviceManager deviceManager =
                mLocalBluetoothManager.getCachedDeviceManager();
        final HearingAidProfile hearingAidProfile =
                mLocalBluetoothManager.getProfileManager().getHearingAidProfile();
        final List<BluetoothDevice> deviceList = hearingAidProfile.getConnectedDevices();
        for (BluetoothDevice obj : deviceList) {
            if (!deviceManager.isSubDevice(obj)) {
                return deviceManager.findDevice(obj);
            }
        }
        return null;
    }

    private int getConnectedHearingAidDeviceNum() {
        if (!isHearingAidProfileSupported()) {
            return 0;
        }

        final CachedBluetoothDeviceManager deviceManager =
                mLocalBluetoothManager.getCachedDeviceManager();
        final HearingAidProfile hearingAidProfile =
                mLocalBluetoothManager.getProfileManager().getHearingAidProfile();
        final List<BluetoothDevice> deviceList = hearingAidProfile.getConnectedDevices();
        return (int) deviceList.stream()
                .filter(device -> !deviceManager.isSubDevice(device))
                .count();
    }

    private boolean isHearingAidProfileSupported() {
        if (mBluetoothAdapter == null || !mBluetoothAdapter.isEnabled()) {
            return false;
        }
        final List<Integer> supportedList = mBluetoothAdapter.getSupportedProfiles();
        if (supportedList.contains(BluetoothProfile.HEARING_AID)) {
            return true;
        }
        return false;
        return supportedList.contains(BluetoothProfile.HEARING_AID);
    }

    private LocalBluetoothManager getLocalBluetoothManager() {
+51 −15
Original line number Diff line number Diff line
@@ -18,9 +18,7 @@ package com.android.settings.accessibility;

import static com.google.common.truth.Truth.assertThat;

import static org.mockito.ArgumentMatchers.any;
import static org.mockito.Mockito.doNothing;
import static org.mockito.Mockito.never;
import static org.mockito.Mockito.spy;
import static org.mockito.Mockito.verify;
import static org.mockito.Mockito.when;
@@ -48,7 +46,6 @@ import com.android.settingslib.bluetooth.LocalBluetoothProfileManager;

import org.junit.After;
import org.junit.Before;
import org.junit.Ignore;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.mockito.Mock;
@@ -63,7 +60,6 @@ import java.util.ArrayList;
import java.util.List;

@RunWith(RobolectricTestRunner.class)
@Ignore
@Config(shadows = {ShadowBluetoothAdapter.class, ShadowBluetoothUtils.class})
public class AccessibilityHearingAidPreferenceControllerTest {
    private static final String TEST_DEVICE_ADDRESS = "00:A1:A1:A1:A1:A1";
@@ -82,6 +78,8 @@ public class AccessibilityHearingAidPreferenceControllerTest {
    @Mock
    private CachedBluetoothDevice mCachedBluetoothDevice;
    @Mock
    private CachedBluetoothDevice mCachedSubBluetoothDevice;
    @Mock
    private CachedBluetoothDeviceManager mCachedDeviceManager;
    @Mock
    private LocalBluetoothManager mLocalBluetoothManager;
@@ -111,18 +109,54 @@ public class AccessibilityHearingAidPreferenceControllerTest {
    }

    @Test
    public void onHearingAidStateChanged_connected_updateHearingAidSummary() {
    public void getSummary_connectedHearingAidRightSide_connectedRightSideSummary() {
        when(mCachedBluetoothDevice.getDeviceSide()).thenReturn(
                HearingAidProfile.DeviceSide.SIDE_RIGHT);
        when(mHearingAidProfile.getConnectedDevices()).thenReturn(generateHearingAidDeviceList());
        mPreferenceController.onStart();
        Intent intent = new Intent(BluetoothHearingAid.ACTION_CONNECTION_STATE_CHANGED);
        intent.putExtra(BluetoothHearingAid.EXTRA_STATE, BluetoothHearingAid.STATE_CONNECTED);
        sendIntent(intent);

        assertThat(mHearingAidPreference.getSummary().toString().contentEquals(
                "TEST_HEARING_AID_BT_DEVICE_NAME, right only")).isTrue();
    }

    @Test
    public void getSummary_connectedHearingAidBothSide_connectedBothSideSummary() {
        when(mCachedBluetoothDevice.getDeviceSide()).thenReturn(
                HearingAidProfile.DeviceSide.SIDE_LEFT);
        when(mCachedSubBluetoothDevice.isConnected()).thenReturn(true);
        when(mCachedBluetoothDevice.getSubDevice()).thenReturn(mCachedSubBluetoothDevice);
        when(mHearingAidProfile.getConnectedDevices()).thenReturn(generateHearingAidDeviceList());
        mPreferenceController.onStart();
        Intent intent = new Intent(BluetoothHearingAid.ACTION_CONNECTION_STATE_CHANGED);
        intent.putExtra(BluetoothHearingAid.EXTRA_STATE, BluetoothHearingAid.STATE_CONNECTED);
        sendIntent(intent);

        assertThat(mHearingAidPreference.getSummary()).isEqualTo(TEST_DEVICE_NAME);
        assertThat(mHearingAidPreference.getSummary().toString().contentEquals(
                "TEST_HEARING_AID_BT_DEVICE_NAME, left and right")).isTrue();
    }

    @Test
    public void getSummary_connectedMultipleHearingAids_connectedBothSideSummary() {
        when(mCachedBluetoothDevice.getDeviceSide()).thenReturn(
                HearingAidProfile.DeviceSide.SIDE_LEFT);
        when(mCachedSubBluetoothDevice.isConnected()).thenReturn(true);
        when(mCachedBluetoothDevice.getSubDevice()).thenReturn(mCachedSubBluetoothDevice);
        when(mHearingAidProfile.getConnectedDevices()).thenReturn(
                generateMultipleHearingAidDeviceList());
        mPreferenceController.onStart();
        Intent intent = new Intent(BluetoothHearingAid.ACTION_CONNECTION_STATE_CHANGED);
        intent.putExtra(BluetoothHearingAid.EXTRA_STATE, BluetoothHearingAid.STATE_CONNECTED);
        sendIntent(intent);

        assertThat(mHearingAidPreference.getSummary().toString().contentEquals(
                "TEST_HEARING_AID_BT_DEVICE_NAME +1 more")).isTrue();
    }

    @Test
    public void onHearingAidStateChanged_disconnected_updateHearingAidSummary() {
    public void getSummary_disconnectedHearingAid_disconnectedSummary() {
        mPreferenceController.onStart();
        Intent intent = new Intent(BluetoothHearingAid.ACTION_CONNECTION_STATE_CHANGED);
        intent.putExtra(BluetoothHearingAid.EXTRA_STATE, BluetoothHearingAid.STATE_DISCONNECTED);
@@ -133,7 +167,7 @@ public class AccessibilityHearingAidPreferenceControllerTest {
    }

    @Test
    public void onBluetoothStateChanged_bluetoothOff_updateHearingAidSummary() {
    public void getSummary_bluetoothOff_disconnectedSummary() {
        mPreferenceController.onStart();
        Intent intent = new Intent(BluetoothAdapter.ACTION_STATE_CHANGED);
        intent.putExtra(BluetoothAdapter.EXTRA_STATE, BluetoothAdapter.STATE_OFF);
@@ -168,19 +202,14 @@ public class AccessibilityHearingAidPreferenceControllerTest {
    }

    @Test
    public void onNotSupportHearingAidProfile_doNotDoReceiverOperation() {
    public void onNotSupportHearingAidProfile_isNotAvailable() {
        //clear bluetooth supported profile
        mShadowBluetoothAdapter.clearSupportedProfiles();
        mPreferenceController = new AccessibilityHearingAidPreferenceController(mContext,
                HEARING_AID_PREFERENCE);
        mPreferenceController.setPreference(mHearingAidPreference);
        //not call registerReceiver()
        mPreferenceController.onStart();
        verify(mContext, never()).registerReceiver(any(), any());

        //not call unregisterReceiver()
        mPreferenceController.onStop();
        verify(mContext, never()).unregisterReceiver(any());
        assertThat(mPreferenceController.isAvailable()).isFalse();
    }

    @Test
@@ -224,4 +253,11 @@ public class AccessibilityHearingAidPreferenceControllerTest {
        deviceList.add(mBluetoothDevice);
        return deviceList;
    }

    private List<BluetoothDevice> generateMultipleHearingAidDeviceList() {
        final List<BluetoothDevice> deviceList = new ArrayList<>(2);
        deviceList.add(mBluetoothDevice);
        deviceList.add(mBluetoothDevice);
        return deviceList;
    }
}