From cf1ce05ce57c1b9c7f28a05b72750312e76bfe5e Mon Sep 17 00:00:00 2001 From: jackqdyulei Date: Thu, 16 Nov 2017 16:06:14 -0800 Subject: [PATCH] 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 --- .../bluetooth/BluetoothDevicePreference.java | 9 ++--- .../bluetooth/DeviceListPreferenceFragment.java | 7 ++-- .../bluetooth/BluetoothDevicePreferenceTest.java | 45 ++++++---------------- 3 files changed, 19 insertions(+), 42 deletions(-) diff --git a/src/com/android/settings/bluetooth/BluetoothDevicePreference.java b/src/com/android/settings/bluetooth/BluetoothDevicePreference.java index 043cb957b0..a0ce73386a 100644 --- a/src/com/android/settings/bluetooth/BluetoothDevicePreference.java +++ b/src/com/android/settings/bluetooth/BluetoothDevicePreference.java @@ -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(); diff --git a/src/com/android/settings/bluetooth/DeviceListPreferenceFragment.java b/src/com/android/settings/bluetooth/DeviceListPreferenceFragment.java index 2e29db8312..0a90edc1db 100644 --- a/src/com/android/settings/bluetooth/DeviceListPreferenceFragment.java +++ b/src/com/android/settings/bluetooth/DeviceListPreferenceFragment.java @@ -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 { diff --git a/tests/robotests/src/com/android/settings/bluetooth/BluetoothDevicePreferenceTest.java b/tests/robotests/src/com/android/settings/bluetooth/BluetoothDevicePreferenceTest.java index ac0720a246..bc1151bbb6 100644 --- a/tests/robotests/src/com/android/settings/bluetooth/BluetoothDevicePreferenceTest.java +++ b/tests/robotests/src/com/android/settings/bluetooth/BluetoothDevicePreferenceTest.java @@ -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(); } } -- 2.11.0