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

Commit cf1ce05c authored by jackqdyulei's avatar jackqdyulei
Browse files

Decouple BluetoothDevicePreference and DeviceListPreferenceFragment

The BluetoothDevicePreference need to know whether to display with an
invalid name. However pass in the whole fragment is over-killing.

This cl decouple it for several reasons:
1. In P, BluetoothDevicePreference will be used in other fragment.
2. In preference lifecycle from end user side, this flag is constant.

Bug: 69333961
Test: RunSettingsRoboTests
Change-Id: I3dbcd2a4aafa3ead74371534250e5e7c3ee221f7
parent 4559ddeb
Loading
Loading
Loading
Loading
+4 −5
Original line number Diff line number Diff line
@@ -52,19 +52,19 @@ public final class BluetoothDevicePreference extends GearPreference implements

    private final CachedBluetoothDevice mCachedDevice;
    private final UserManager mUserManager;
    private final boolean mShowDevicesWithoutNames;

    private AlertDialog mDisconnectDialog;
    private String contentDescription = null;
    private DeviceListPreferenceFragment mDeviceListPreferenceFragment;
    /* Talk-back descriptions for various BT icons */
    Resources mResources;

    public BluetoothDevicePreference(Context context, CachedBluetoothDevice cachedDevice,
            DeviceListPreferenceFragment deviceListPreferenceFragment) {
            boolean showDeviceWithoutNames) {
        super(context, null);
        mResources = getContext().getResources();
        mUserManager = (UserManager) context.getSystemService(Context.USER_SERVICE);
        mDeviceListPreferenceFragment = deviceListPreferenceFragment;
        mShowDevicesWithoutNames = showDeviceWithoutNames;

        if (sDimAlpha == Integer.MIN_VALUE) {
            TypedValue outValue = new TypedValue();
@@ -134,8 +134,7 @@ public final class BluetoothDevicePreference extends GearPreference implements

        // Device is only visible in the UI if it has a valid name besides MAC address or when user
        // allows showing devices without user-friendly name in developer settings
        setVisible(mDeviceListPreferenceFragment.shouldShowDevicesWithoutNames()
                || mCachedDevice.hasHumanReadableName());
        setVisible(mShowDevicesWithoutNames || mCachedDevice.hasHumanReadableName());

        // This could affect ordering, so notify that
        notifyHierarchyChanged();
+4 −3
Original line number Diff line number Diff line
@@ -98,6 +98,8 @@ public abstract class DeviceListPreferenceFragment extends
            return;
        }
        mLocalAdapter = mLocalManager.getBluetoothAdapter();
        mShowDevicesWithoutNames = SystemProperties.getBoolean(
                BLUETOOTH_SHOW_DEVICES_WITHOUT_NAMES_PROPERTY, false);

        initPreferencesFromPreferenceScreen();

@@ -110,8 +112,6 @@ public abstract class DeviceListPreferenceFragment extends
    @Override
    public void onStart() {
        super.onStart();
        mShowDevicesWithoutNames = SystemProperties.getBoolean(
                BLUETOOTH_SHOW_DEVICES_WITHOUT_NAMES_PROPERTY, false);
        if (mLocalManager == null || isUiRestricted()) return;

        mLocalManager.setForegroundActivity(getActivity());
@@ -190,7 +190,8 @@ public abstract class DeviceListPreferenceFragment extends
        BluetoothDevicePreference preference = (BluetoothDevicePreference) getCachedPreference(key);

        if (preference == null) {
            preference = new BluetoothDevicePreference(getPrefContext(), cachedDevice, this);
            preference = new BluetoothDevicePreference(getPrefContext(), cachedDevice,
                    mShowDevicesWithoutNames);
            preference.setKey(key);
            mDeviceListGroup.addPreference(preference);
        } else {
+11 −34
Original line number Diff line number Diff line
@@ -41,6 +41,7 @@ import org.robolectric.util.ReflectionHelpers;
import static com.google.common.truth.Truth.assertThat;

import static org.mockito.Mockito.doAnswer;
import static org.mockito.Mockito.doReturn;
import static org.mockito.Mockito.mock;
import static org.mockito.Mockito.never;
import static org.mockito.Mockito.spy;
@@ -51,6 +52,7 @@ import static org.mockito.Mockito.when;
@Config(manifest = TestConfig.MANIFEST_PATH, sdk = TestConfig.SDK_VERSION,
        shadows = SettingsShadowResources.class)
public class BluetoothDevicePreferenceTest {
    private static final boolean SHOW_DEVICES_WITHOUT_NAMES = true;

    private Context mContext;
    @Mock
@@ -70,7 +72,7 @@ public class BluetoothDevicePreferenceTest {
        mFakeFeatureFactory = (FakeFeatureFactory) FakeFeatureFactory.getFactory(mContext);
        mMetricsFeatureProvider = mFakeFeatureFactory.getMetricsFeatureProvider();
        mPreference = new BluetoothDevicePreference(mContext, mCachedBluetoothDevice,
                mDeviceListPreferenceFragment);
                SHOW_DEVICES_WITHOUT_NAMES);
    }

    @Test
@@ -177,47 +179,22 @@ public class BluetoothDevicePreferenceTest {
    }

    @Test
    public void testVisible_notVisibleThenVisible() {
        when(mDeviceListPreferenceFragment.shouldShowDevicesWithoutNames()).thenReturn(false);
        final boolean[] humanReadableName = {false};
        doAnswer(invocation -> humanReadableName[0]).when(mCachedBluetoothDevice)
                .hasHumanReadableName();
    public void testVisible_showDeviceWithoutNames_visible() {
        doReturn(false).when(mCachedBluetoothDevice).hasHumanReadableName();
        BluetoothDevicePreference preference =
                new BluetoothDevicePreference(mContext, mCachedBluetoothDevice,
                        mDeviceListPreferenceFragment);
        assertThat(preference.isVisible()).isFalse();
        humanReadableName[0] = true;
        preference.onDeviceAttributesChanged();
        assertThat(preference.isVisible()).isTrue();
    }
                        SHOW_DEVICES_WITHOUT_NAMES);

    @Test
    public void testVisible_visibleThenNotVisible() {
        when(mDeviceListPreferenceFragment.shouldShowDevicesWithoutNames()).thenReturn(false);
        final boolean[] humanReadableName = {true};
        doAnswer(invocation -> humanReadableName[0]).when(mCachedBluetoothDevice)
                .hasHumanReadableName();
        BluetoothDevicePreference preference =
                new BluetoothDevicePreference(mContext, mCachedBluetoothDevice,
                        mDeviceListPreferenceFragment);
        assertThat(preference.isVisible()).isTrue();
        humanReadableName[0] = false;
        preference.onDeviceAttributesChanged();
        assertThat(preference.isVisible()).isFalse();
    }

    @Test
    public void testVisible_alwaysVisibleWhenEnabled() {
        when(mDeviceListPreferenceFragment.shouldShowDevicesWithoutNames()).thenReturn(true);
        final boolean[] humanReadableName = {true};
        doAnswer(invocation -> humanReadableName[0]).when(mCachedBluetoothDevice)
                .hasHumanReadableName();
    public void testVisible_hideDeviceWithoutNames_invisible() {
        doReturn(false).when(mCachedBluetoothDevice).hasHumanReadableName();
        BluetoothDevicePreference preference =
                new BluetoothDevicePreference(mContext, mCachedBluetoothDevice,
                        mDeviceListPreferenceFragment);
        assertThat(preference.isVisible()).isTrue();
        humanReadableName[0] = false;
        preference.onDeviceAttributesChanged();
        assertThat(preference.isVisible()).isTrue();
                        false);

        assertThat(preference.isVisible()).isFalse();
    }
}