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:
@@ -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();
|
||||||
|
@@ -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 {
|
||||||
|
@@ -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();
|
|
||||||
}
|
|
||||||
|
|
||||||
@Test
|
assertThat(preference.isVisible()).isFalse();
|
||||||
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();
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
Reference in New Issue
Block a user