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
This commit is contained in:
jackqdyulei
2017-11-16 16:06:14 -08:00
parent 4559ddeb09
commit cf1ce05ce5
3 changed files with 19 additions and 42 deletions

View File

@@ -52,19 +52,19 @@ public final class BluetoothDevicePreference extends GearPreference implements
private final CachedBluetoothDevice mCachedDevice; private final CachedBluetoothDevice mCachedDevice;
private final UserManager mUserManager; private final UserManager mUserManager;
private final boolean mShowDevicesWithoutNames;
private AlertDialog mDisconnectDialog; private AlertDialog mDisconnectDialog;
private String contentDescription = null; private String contentDescription = null;
private DeviceListPreferenceFragment mDeviceListPreferenceFragment;
/* Talk-back descriptions for various BT icons */ /* Talk-back descriptions for various BT icons */
Resources mResources; Resources mResources;
public BluetoothDevicePreference(Context context, CachedBluetoothDevice cachedDevice, public BluetoothDevicePreference(Context context, CachedBluetoothDevice cachedDevice,
DeviceListPreferenceFragment deviceListPreferenceFragment) { boolean showDeviceWithoutNames) {
super(context, null); super(context, null);
mResources = getContext().getResources(); mResources = getContext().getResources();
mUserManager = (UserManager) context.getSystemService(Context.USER_SERVICE); mUserManager = (UserManager) context.getSystemService(Context.USER_SERVICE);
mDeviceListPreferenceFragment = deviceListPreferenceFragment; mShowDevicesWithoutNames = showDeviceWithoutNames;
if (sDimAlpha == Integer.MIN_VALUE) { if (sDimAlpha == Integer.MIN_VALUE) {
TypedValue outValue = new TypedValue(); 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 // 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 // allows showing devices without user-friendly name in developer settings
setVisible(mDeviceListPreferenceFragment.shouldShowDevicesWithoutNames() setVisible(mShowDevicesWithoutNames || mCachedDevice.hasHumanReadableName());
|| mCachedDevice.hasHumanReadableName());
// This could affect ordering, so notify that // This could affect ordering, so notify that
notifyHierarchyChanged(); notifyHierarchyChanged();

View File

@@ -98,6 +98,8 @@ public abstract class DeviceListPreferenceFragment extends
return; return;
} }
mLocalAdapter = mLocalManager.getBluetoothAdapter(); mLocalAdapter = mLocalManager.getBluetoothAdapter();
mShowDevicesWithoutNames = SystemProperties.getBoolean(
BLUETOOTH_SHOW_DEVICES_WITHOUT_NAMES_PROPERTY, false);
initPreferencesFromPreferenceScreen(); initPreferencesFromPreferenceScreen();
@@ -110,8 +112,6 @@ public abstract class DeviceListPreferenceFragment extends
@Override @Override
public void onStart() { public void onStart() {
super.onStart(); super.onStart();
mShowDevicesWithoutNames = SystemProperties.getBoolean(
BLUETOOTH_SHOW_DEVICES_WITHOUT_NAMES_PROPERTY, false);
if (mLocalManager == null || isUiRestricted()) return; if (mLocalManager == null || isUiRestricted()) return;
mLocalManager.setForegroundActivity(getActivity()); mLocalManager.setForegroundActivity(getActivity());
@@ -190,7 +190,8 @@ public abstract class DeviceListPreferenceFragment extends
BluetoothDevicePreference preference = (BluetoothDevicePreference) getCachedPreference(key); BluetoothDevicePreference preference = (BluetoothDevicePreference) getCachedPreference(key);
if (preference == null) { if (preference == null) {
preference = new BluetoothDevicePreference(getPrefContext(), cachedDevice, this); preference = new BluetoothDevicePreference(getPrefContext(), cachedDevice,
mShowDevicesWithoutNames);
preference.setKey(key); preference.setKey(key);
mDeviceListGroup.addPreference(preference); mDeviceListGroup.addPreference(preference);
} else { } else {

View File

@@ -41,6 +41,7 @@ import org.robolectric.util.ReflectionHelpers;
import static com.google.common.truth.Truth.assertThat; import static com.google.common.truth.Truth.assertThat;
import static org.mockito.Mockito.doAnswer; import static org.mockito.Mockito.doAnswer;
import static org.mockito.Mockito.doReturn;
import static org.mockito.Mockito.mock; import static org.mockito.Mockito.mock;
import static org.mockito.Mockito.never; import static org.mockito.Mockito.never;
import static org.mockito.Mockito.spy; 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, @Config(manifest = TestConfig.MANIFEST_PATH, sdk = TestConfig.SDK_VERSION,
shadows = SettingsShadowResources.class) shadows = SettingsShadowResources.class)
public class BluetoothDevicePreferenceTest { public class BluetoothDevicePreferenceTest {
private static final boolean SHOW_DEVICES_WITHOUT_NAMES = true;
private Context mContext; private Context mContext;
@Mock @Mock
@@ -70,7 +72,7 @@ public class BluetoothDevicePreferenceTest {
mFakeFeatureFactory = (FakeFeatureFactory) FakeFeatureFactory.getFactory(mContext); mFakeFeatureFactory = (FakeFeatureFactory) FakeFeatureFactory.getFactory(mContext);
mMetricsFeatureProvider = mFakeFeatureFactory.getMetricsFeatureProvider(); mMetricsFeatureProvider = mFakeFeatureFactory.getMetricsFeatureProvider();
mPreference = new BluetoothDevicePreference(mContext, mCachedBluetoothDevice, mPreference = new BluetoothDevicePreference(mContext, mCachedBluetoothDevice,
mDeviceListPreferenceFragment); SHOW_DEVICES_WITHOUT_NAMES);
} }
@Test @Test
@@ -177,47 +179,22 @@ public class BluetoothDevicePreferenceTest {
} }
@Test @Test
public void testVisible_notVisibleThenVisible() { public void testVisible_showDeviceWithoutNames_visible() {
when(mDeviceListPreferenceFragment.shouldShowDevicesWithoutNames()).thenReturn(false); doReturn(false).when(mCachedBluetoothDevice).hasHumanReadableName();
final boolean[] humanReadableName = {false};
doAnswer(invocation -> humanReadableName[0]).when(mCachedBluetoothDevice)
.hasHumanReadableName();
BluetoothDevicePreference preference = BluetoothDevicePreference preference =
new BluetoothDevicePreference(mContext, mCachedBluetoothDevice, new BluetoothDevicePreference(mContext, mCachedBluetoothDevice,
mDeviceListPreferenceFragment); SHOW_DEVICES_WITHOUT_NAMES);
assertThat(preference.isVisible()).isFalse();
humanReadableName[0] = true;
preference.onDeviceAttributesChanged();
assertThat(preference.isVisible()).isTrue(); assertThat(preference.isVisible()).isTrue();
} }
@Test @Test
public void testVisible_visibleThenNotVisible() { public void testVisible_hideDeviceWithoutNames_invisible() {
when(mDeviceListPreferenceFragment.shouldShowDevicesWithoutNames()).thenReturn(false); doReturn(false).when(mCachedBluetoothDevice).hasHumanReadableName();
final boolean[] humanReadableName = {true};
doAnswer(invocation -> humanReadableName[0]).when(mCachedBluetoothDevice)
.hasHumanReadableName();
BluetoothDevicePreference preference = BluetoothDevicePreference preference =
new BluetoothDevicePreference(mContext, mCachedBluetoothDevice, new BluetoothDevicePreference(mContext, mCachedBluetoothDevice,
mDeviceListPreferenceFragment); false);
assertThat(preference.isVisible()).isTrue();
humanReadableName[0] = false;
preference.onDeviceAttributesChanged();
assertThat(preference.isVisible()).isFalse(); 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();
BluetoothDevicePreference preference =
new BluetoothDevicePreference(mContext, mCachedBluetoothDevice,
mDeviceListPreferenceFragment);
assertThat(preference.isVisible()).isTrue();
humanReadableName[0] = false;
preference.onDeviceAttributesChanged();
assertThat(preference.isVisible()).isTrue();
}
} }