Merge changes from topics "anomaly_test_app_step_6", "anomaly_test_app_step_5" into oc-mr1-dev
* changes:
Add functional test for wakelock anomaly detector
Add functional test for bt anomaly detector
diff --git a/res/layout-sw320dp/settings_entity_header.xml b/res/layout-sw320dp/settings_entity_header.xml
index 5cedd8d..951961c 100644
--- a/res/layout-sw320dp/settings_entity_header.xml
+++ b/res/layout-sw320dp/settings_entity_header.xml
@@ -38,7 +38,7 @@
android:id="@+id/entity_header_icon"
android:layout_width="48dp"
android:layout_height="48dp"
- android:scaleType="fitXY"
+ android:scaleType="fitCenter"
android:layout_gravity="center_horizontal"
android:antialias="true" />
diff --git a/res/xml/development_prefs.xml b/res/xml/development_prefs.xml
index 8992446..1846a8c 100644
--- a/res/xml/development_prefs.xml
+++ b/res/xml/development_prefs.xml
@@ -210,6 +210,11 @@
android:entryValues="@array/usb_configuration_values" />
<SwitchPreference
+ android:key="bluetooth_show_devices_without_names"
+ android:title="@string/bluetooth_show_devices_without_names"
+ android:summary="@string/bluetooth_show_devices_without_names_summary"/>
+
+ <SwitchPreference
android:key="bluetooth_disable_absolute_volume"
android:title="@string/bluetooth_disable_absolute_volume"
android:summary="@string/bluetooth_disable_absolute_volume_summary"/>
diff --git a/src/com/android/settings/bluetooth/BluetoothDetailsHeaderController.java b/src/com/android/settings/bluetooth/BluetoothDetailsHeaderController.java
index 5ec7c85..1470214 100644
--- a/src/com/android/settings/bluetooth/BluetoothDetailsHeaderController.java
+++ b/src/com/android/settings/bluetooth/BluetoothDetailsHeaderController.java
@@ -16,8 +16,8 @@
package com.android.settings.bluetooth;
-
import android.content.Context;
+import android.graphics.drawable.Drawable;
import android.support.v14.preference.PreferenceFragment;
import android.support.v7.preference.PreferenceScreen;
import android.util.Pair;
@@ -51,11 +51,11 @@
}
protected void setHeaderProperties() {
- Pair<Integer, String> pair = Utils.getBtClassDrawableWithDescription
- (mContext.getResources(), mCachedDevice);
+ final Pair<Drawable, String> pair = Utils.getBtClassDrawableWithDescription
+ (mContext, mCachedDevice);
String summaryText = mCachedDevice.getConnectionSummary();
mHeaderController.setLabel(mCachedDevice.getName());
- mHeaderController.setIcon(mContext.getDrawable(pair.first));
+ mHeaderController.setIcon(pair.first);
mHeaderController.setIconContentDescription(pair.second);
mHeaderController.setSummary(summaryText);
}
diff --git a/src/com/android/settings/bluetooth/BluetoothDevicePreference.java b/src/com/android/settings/bluetooth/BluetoothDevicePreference.java
index a216400..084b50e 100644
--- a/src/com/android/settings/bluetooth/BluetoothDevicePreference.java
+++ b/src/com/android/settings/bluetooth/BluetoothDevicePreference.java
@@ -21,6 +21,7 @@
import android.content.Context;
import android.content.DialogInterface;
import android.content.res.Resources;
+import android.graphics.drawable.Drawable;
import android.os.UserManager;
import android.support.v7.preference.Preference;
import android.support.v7.preference.PreferenceViewHolder;
@@ -53,16 +54,17 @@
private final UserManager mUserManager;
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) {
+ public BluetoothDevicePreference(Context context, CachedBluetoothDevice cachedDevice,
+ DeviceListPreferenceFragment deviceListPreferenceFragment) {
super(context, null);
mResources = getContext().getResources();
mUserManager = (UserManager) context.getSystemService(Context.USER_SERVICE);
+ mDeviceListPreferenceFragment = deviceListPreferenceFragment;
if (sDimAlpha == Integer.MIN_VALUE) {
TypedValue outValue = new TypedValue();
@@ -120,9 +122,9 @@
// Null check is done at the framework
setSummary(mCachedDevice.getConnectionSummary());
- Pair<Integer, String> pair = Utils.getBtClassDrawableWithDescription(mResources,
+ final Pair<Drawable, String> pair = Utils.getBtClassDrawableWithDescription(getContext(),
mCachedDevice);
- if (pair.first != 0) {
+ if (pair.first != null) {
setIcon(pair.first);
contentDescription = pair.second;
}
@@ -130,6 +132,11 @@
// Used to gray out the item
setEnabled(!mCachedDevice.isBusy());
+ // 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());
+
// This could affect ordering, so notify that
notifyHierarchyChanged();
}
diff --git a/src/com/android/settings/bluetooth/BluetoothSettings.java b/src/com/android/settings/bluetooth/BluetoothSettings.java
index bd86c4b..361bc2f 100644
--- a/src/com/android/settings/bluetooth/BluetoothSettings.java
+++ b/src/com/android/settings/bluetooth/BluetoothSettings.java
@@ -140,6 +140,8 @@
mBluetoothEnabler.resume(getActivity());
}
super.onStart();
+ // Always show paired devices regardless whether user-friendly name exists
+ mShowDevicesWithoutNames = true;
if (isUiRestricted()) {
getPreferenceScreen().removeAll();
if (!isUiRestrictedByOnlyAdmin()) {
diff --git a/src/com/android/settings/bluetooth/DeviceListPreferenceFragment.java b/src/com/android/settings/bluetooth/DeviceListPreferenceFragment.java
index ca06e3c..0485e69 100644
--- a/src/com/android/settings/bluetooth/DeviceListPreferenceFragment.java
+++ b/src/com/android/settings/bluetooth/DeviceListPreferenceFragment.java
@@ -19,6 +19,7 @@
import android.bluetooth.BluetoothAdapter;
import android.bluetooth.BluetoothDevice;
import android.os.Bundle;
+import android.os.SystemProperties;
import android.support.annotation.VisibleForTesting;
import android.support.v7.preference.Preference;
import android.support.v7.preference.PreferenceCategory;
@@ -52,6 +53,10 @@
private static final String KEY_BT_SCAN = "bt_scan";
+ // Copied from DevelopmentSettings.java
+ private static final String BLUETOOTH_SHOW_DEVICES_WITHOUT_NAMES_PROPERTY =
+ "persist.bluetooth.showdeviceswithoutnames";
+
private BluetoothDeviceFilter.Filter mFilter;
@VisibleForTesting
@@ -68,6 +73,8 @@
final WeakHashMap<CachedBluetoothDevice, BluetoothDevicePreference> mDevicePreferenceMap =
new WeakHashMap<CachedBluetoothDevice, BluetoothDevicePreference>();
+ boolean mShowDevicesWithoutNames;
+
DeviceListPreferenceFragment(String restrictedKey) {
super(restrictedKey);
mFilter = BluetoothDeviceFilter.ALL_FILTER;
@@ -103,6 +110,8 @@
@Override
public void onStart() {
super.onStart();
+ mShowDevicesWithoutNames = SystemProperties.getBoolean(
+ BLUETOOTH_SHOW_DEVICES_WITHOUT_NAMES_PROPERTY, false);
if (mLocalManager == null || isUiRestricted()) return;
mLocalManager.setForegroundActivity(getActivity());
@@ -181,7 +190,7 @@
BluetoothDevicePreference preference = (BluetoothDevicePreference) getCachedPreference(key);
if (preference == null) {
- preference = new BluetoothDevicePreference(getPrefContext(), cachedDevice);
+ preference = new BluetoothDevicePreference(getPrefContext(), cachedDevice, this);
preference.setKey(key);
mDeviceListGroup.addPreference(preference);
} else {
@@ -271,4 +280,8 @@
* Return the key of the {@link PreferenceGroup} that contains the bluetooth devices
*/
public abstract String getDeviceListKey();
+
+ public boolean shouldShowDevicesWithoutNames() {
+ return mShowDevicesWithoutNames;
+ }
}
diff --git a/src/com/android/settings/bluetooth/Utils.java b/src/com/android/settings/bluetooth/Utils.java
index 26edd84..e80237eb 100755
--- a/src/com/android/settings/bluetooth/Utils.java
+++ b/src/com/android/settings/bluetooth/Utils.java
@@ -23,6 +23,9 @@
import android.content.Context;
import android.content.DialogInterface;
import android.content.res.Resources;
+import android.graphics.drawable.Drawable;
+import android.support.annotation.DrawableRes;
+import android.support.annotation.IdRes;
import android.support.annotation.VisibleForTesting;
import android.util.Pair;
import android.widget.Toast;
@@ -36,6 +39,7 @@
import com.android.settingslib.bluetooth.LocalBluetoothManager.BluetoothManagerCallback;
import com.android.settingslib.bluetooth.LocalBluetoothProfile;
import com.android.settingslib.bluetooth.Utils.ErrorListener;
+import com.android.settingslib.graph.BluetoothDeviceLayerDrawable;
import java.util.List;
@@ -150,27 +154,31 @@
}
};
- static Pair<Integer, String> getBtClassDrawableWithDescription(Resources r,
+ static Pair<Drawable, String> getBtClassDrawableWithDescription(Context context,
CachedBluetoothDevice cachedDevice) {
BluetoothClass btClass = cachedDevice.getBtClass();
+ final int level = cachedDevice.getBatteryLevel();
if (btClass != null) {
switch (btClass.getMajorDeviceClass()) {
case BluetoothClass.Device.Major.COMPUTER:
- return new Pair<Integer, String>(R.drawable.ic_bt_laptop,
- r.getString(R.string.bluetooth_talkback_computer));
+ return new Pair<>(getBluetoothDrawable(context, R.drawable.ic_bt_laptop, level),
+ context.getString(R.string.bluetooth_talkback_computer));
case BluetoothClass.Device.Major.PHONE:
- return new Pair<Integer, String>(R.drawable.ic_bt_cellphone,
- r.getString(R.string.bluetooth_talkback_phone));
+ return new Pair<>(
+ getBluetoothDrawable(context, R.drawable.ic_bt_cellphone, level),
+ context.getString(R.string.bluetooth_talkback_phone));
case BluetoothClass.Device.Major.PERIPHERAL:
- return new Pair<Integer, String>(HidProfile.getHidClassDrawable(btClass),
- r.getString(
- R.string.bluetooth_talkback_input_peripheral));
+ return new Pair<>(
+ getBluetoothDrawable(context, HidProfile.getHidClassDrawable(btClass),
+ level),
+ context.getString(R.string.bluetooth_talkback_input_peripheral));
case BluetoothClass.Device.Major.IMAGING:
- return new Pair<Integer, String>(R.drawable.ic_settings_print,
- r.getString(R.string.bluetooth_talkback_imaging));
+ return new Pair<>(
+ getBluetoothDrawable(context, R.drawable.ic_settings_print, level),
+ context.getString(R.string.bluetooth_talkback_imaging));
default:
// unrecognized device class; continue
@@ -181,20 +189,34 @@
for (LocalBluetoothProfile profile : profiles) {
int resId = profile.getDrawableResource(btClass);
if (resId != 0) {
- return new Pair<Integer, String>(resId, null);
+ return new Pair<>(getBluetoothDrawable(context, resId, level), null);
}
}
if (btClass != null) {
if (btClass.doesClassMatch(BluetoothClass.PROFILE_HEADSET)) {
- return new Pair<Integer, String>(R.drawable.ic_bt_headset_hfp,
- r.getString(R.string.bluetooth_talkback_headset));
+ return new Pair<>(
+ getBluetoothDrawable(context, R.drawable.ic_bt_headset_hfp, level),
+ context.getString(R.string.bluetooth_talkback_headset));
}
if (btClass.doesClassMatch(BluetoothClass.PROFILE_A2DP)) {
- return new Pair<Integer, String>(R.drawable.ic_bt_headphones_a2dp,
- r.getString(R.string.bluetooth_talkback_headphone));
+ return new Pair<>(
+ getBluetoothDrawable(context, R.drawable.ic_bt_headphones_a2dp, level),
+ context.getString(R.string.bluetooth_talkback_headphone));
}
}
- return new Pair<Integer, String>(R.drawable.ic_settings_bluetooth,
- r.getString(R.string.bluetooth_talkback_bluetooth));
+ return new Pair<>(getBluetoothDrawable(context, R.drawable.ic_settings_bluetooth, level),
+ context.getString(R.string.bluetooth_talkback_bluetooth));
+ }
+
+ @VisibleForTesting
+ static Drawable getBluetoothDrawable(Context context, @DrawableRes int resId,
+ int batteryLevel) {
+ if (batteryLevel != BluetoothDevice.BATTERY_LEVEL_UNKNOWN) {
+ return BluetoothDeviceLayerDrawable.createLayerDrawable(context, resId, batteryLevel);
+ } else if (resId != 0) {
+ return context.getDrawable(resId);
+ } else {
+ return null;
+ }
}
}
diff --git a/src/com/android/settings/dashboard/DashboardSummary.java b/src/com/android/settings/dashboard/DashboardSummary.java
index fba27fb..be5fbdf 100644
--- a/src/com/android/settings/dashboard/DashboardSummary.java
+++ b/src/com/android/settings/dashboard/DashboardSummary.java
@@ -75,6 +75,7 @@
private DashboardFeatureProvider mDashboardFeatureProvider;
private SuggestionFeatureProvider mSuggestionFeatureProvider;
private boolean isOnCategoriesChangedCalled;
+ private boolean mOnConditionsChangedCalled;
@Override
public int getMetricsCategory() {
@@ -237,10 +238,21 @@
@Override
public void onConditionsChanged() {
Log.d(TAG, "onConditionsChanged");
- final boolean scrollToTop = mLayoutManager.findFirstCompletelyVisibleItemPosition() <= 1;
- mAdapter.setConditions(mConditionManager.getConditions());
- if (scrollToTop) {
- mDashboard.scrollToPosition(0);
+ // Bypass refreshing the conditions on the first call of onConditionsChanged.
+ // onConditionsChanged is called immediately everytime we start listening to the conditions
+ // change when we gain window focus. Since the conditions are passed to the adapter's
+ // constructor when we create the view, the first handling is not necessary.
+ // But, on the subsequent calls we need to handle it because there might be real changes to
+ // conditions.
+ if (mOnConditionsChangedCalled) {
+ final boolean scrollToTop =
+ mLayoutManager.findFirstCompletelyVisibleItemPosition() <= 1;
+ mAdapter.setConditions(mConditionManager.getConditions());
+ if (scrollToTop) {
+ mDashboard.scrollToPosition(0);
+ }
+ } else {
+ mOnConditionsChangedCalled = true;
}
}
diff --git a/src/com/android/settings/development/DevelopmentSettings.java b/src/com/android/settings/development/DevelopmentSettings.java
index b442449..ce8acc2 100644
--- a/src/com/android/settings/development/DevelopmentSettings.java
+++ b/src/com/android/settings/development/DevelopmentSettings.java
@@ -199,6 +199,10 @@
private static final String FORCE_RESIZABLE_KEY = "force_resizable_activities";
private static final String COLOR_TEMPERATURE_KEY = "color_temperature";
+ private static final String BLUETOOTH_SHOW_DEVICES_WITHOUT_NAMES_KEY =
+ "bluetooth_show_devices_without_names";
+ private static final String BLUETOOTH_SHOW_DEVICES_WITHOUT_NAMES_PROPERTY =
+ "persist.bluetooth.showdeviceswithoutnames";
private static final String BLUETOOTH_DISABLE_ABSOLUTE_VOLUME_KEY =
"bluetooth_disable_absolute_volume";
private static final String BLUETOOTH_DISABLE_ABSOLUTE_VOLUME_PROPERTY =
@@ -282,6 +286,7 @@
private SwitchPreference mWifiAggressiveHandover;
private SwitchPreference mMobileDataAlwaysOn;
private SwitchPreference mTetheringHardwareOffload;
+ private SwitchPreference mBluetoothShowDevicesWithoutNames;
private SwitchPreference mBluetoothDisableAbsVolume;
private SwitchPreference mBluetoothEnableInbandRinging;
@@ -498,6 +503,8 @@
mLogpersist = null;
}
mUsbConfiguration = addListPreference(USB_CONFIGURATION_KEY);
+ mBluetoothShowDevicesWithoutNames =
+ findAndInitSwitchPref(BLUETOOTH_SHOW_DEVICES_WITHOUT_NAMES_KEY);
mBluetoothDisableAbsVolume = findAndInitSwitchPref(BLUETOOTH_DISABLE_ABSOLUTE_VOLUME_KEY);
mBluetoothEnableInbandRinging = findAndInitSwitchPref(BLUETOOTH_ENABLE_INBAND_RINGING_KEY);
if (!BluetoothHeadset.isInbandRingingSupported(getContext())) {
@@ -838,6 +845,7 @@
if (mColorTemperaturePreference != null) {
updateColorTemperature();
}
+ updateBluetoothShowDevicesWithoutUserFriendlyNameOptions();
updateBluetoothDisableAbsVolumeOptions();
updateBluetoothEnableInbandRingingOptions();
updateBluetoothA2dpConfigurationValues();
@@ -1468,6 +1476,17 @@
mWifiManager.setAllowScansWithTraffic(mWifiAllowScansWithTraffic.isChecked() ? 1 : 0);
}
+ private void updateBluetoothShowDevicesWithoutUserFriendlyNameOptions() {
+ updateSwitchPreference(mBluetoothShowDevicesWithoutNames,
+ SystemProperties.getBoolean(
+ BLUETOOTH_SHOW_DEVICES_WITHOUT_NAMES_PROPERTY, false));
+ }
+
+ private void writeBluetoothShowDevicesWithoutUserFriendlyNameOptions() {
+ SystemProperties.set(BLUETOOTH_SHOW_DEVICES_WITHOUT_NAMES_PROPERTY,
+ mBluetoothShowDevicesWithoutNames.isChecked() ? "true" : "false");
+ }
+
private void updateBluetoothDisableAbsVolumeOptions() {
updateSwitchPreference(mBluetoothDisableAbsVolume,
SystemProperties.getBoolean(BLUETOOTH_DISABLE_ABSOLUTE_VOLUME_PROPERTY, false));
@@ -2532,6 +2551,8 @@
writeUSBAudioOptions();
} else if (preference == mForceResizable) {
writeForceResizableOptions();
+ } else if (preference == mBluetoothShowDevicesWithoutNames) {
+ writeBluetoothShowDevicesWithoutUserFriendlyNameOptions();
} else if (preference == mBluetoothDisableAbsVolume) {
writeBluetoothDisableAbsVolumeOptions();
} else if (preference == mBluetoothEnableInbandRinging) {
diff --git a/src/com/android/settings/deviceinfo/StorageDashboardFragment.java b/src/com/android/settings/deviceinfo/StorageDashboardFragment.java
index be72539..33d7d36 100644
--- a/src/com/android/settings/deviceinfo/StorageDashboardFragment.java
+++ b/src/com/android/settings/deviceinfo/StorageDashboardFragment.java
@@ -109,8 +109,9 @@
public void onResume() {
super.onResume();
getLoaderManager().restartLoader(STORAGE_JOB_ID, Bundle.EMPTY, this);
+ getLoaderManager()
+ .restartLoader(VOLUME_SIZE_JOB_ID, Bundle.EMPTY, new VolumeSizeCallbacks());
getLoaderManager().initLoader(ICON_JOB_ID, Bundle.EMPTY, new IconLoaderCallbacks());
- getLoaderManager().initLoader(VOLUME_SIZE_JOB_ID, Bundle.EMPTY, new VolumeSizeCallbacks());
}
@Override
diff --git a/src/com/android/settings/wifi/WifiSettings.java b/src/com/android/settings/wifi/WifiSettings.java
index f0457e6..89e5b74 100644
--- a/src/com/android/settings/wifi/WifiSettings.java
+++ b/src/com/android/settings/wifi/WifiSettings.java
@@ -176,6 +176,12 @@
// For Search
private static final String DATA_KEY_REFERENCE = "main_toggle_wifi";
+ /**
+ * Tracks whether the user initiated a connection via clicking in order to autoscroll to the
+ * network once connected.
+ */
+ private boolean mClickedConnect;
+
/* End of "used in Wifi Setup context" */
public WifiSettings() {
@@ -894,6 +900,10 @@
mConnectedAccessPointPreferenceCategory.addPreference(pref);
mConnectedAccessPointPreferenceCategory.setVisible(true);
+ if (mClickedConnect) {
+ mClickedConnect = false;
+ scrollToPreference(mConnectedAccessPointPreferenceCategory);
+ }
}
/** Removes all preferences and hide the {@link #mConnectedAccessPointPreferenceCategory}. */
@@ -1039,7 +1049,7 @@
mMetricsFeatureProvider.action(getActivity(), MetricsEvent.ACTION_WIFI_CONNECT,
isSavedNetwork);
mWifiManager.connect(config, mConnectListener);
- scrollToPreference(mConnectedAccessPointPreferenceCategory);
+ mClickedConnect = true;
}
protected void connect(final int networkId, boolean isSavedNetwork) {
diff --git a/tests/robotests/src/com/android/settings/bluetooth/BluetoothDetailsHeaderControllerTest.java b/tests/robotests/src/com/android/settings/bluetooth/BluetoothDetailsHeaderControllerTest.java
index 27c1a83..98a3580 100644
--- a/tests/robotests/src/com/android/settings/bluetooth/BluetoothDetailsHeaderControllerTest.java
+++ b/tests/robotests/src/com/android/settings/bluetooth/BluetoothDetailsHeaderControllerTest.java
@@ -32,6 +32,7 @@
import com.android.settings.TestConfig;
import com.android.settings.testutils.FakeFeatureFactory;
import com.android.settings.testutils.shadow.SettingsShadowBluetoothDevice;
+import com.android.settings.testutils.shadow.SettingsShadowResources;
import com.android.settings.testutils.shadow.ShadowEntityHeaderController;
import com.android.settings.widget.EntityHeaderController;
@@ -45,7 +46,8 @@
@RunWith(SettingsRobolectricTestRunner.class)
@Config(manifest = TestConfig.MANIFEST_PATH, sdk = TestConfig.SDK_VERSION,
- shadows={SettingsShadowBluetoothDevice.class, ShadowEntityHeaderController.class})
+ shadows={SettingsShadowBluetoothDevice.class, ShadowEntityHeaderController.class,
+ SettingsShadowResources.class})
public class BluetoothDetailsHeaderControllerTest extends BluetoothDetailsControllerTestBase {
private BluetoothDetailsHeaderController mController;
private LayoutPreference mPreference;
diff --git a/tests/robotests/src/com/android/settings/bluetooth/BluetoothDevicePreferenceTest.java b/tests/robotests/src/com/android/settings/bluetooth/BluetoothDevicePreferenceTest.java
index d60571c..a1db5de 100644
--- a/tests/robotests/src/com/android/settings/bluetooth/BluetoothDevicePreferenceTest.java
+++ b/tests/robotests/src/com/android/settings/bluetooth/BluetoothDevicePreferenceTest.java
@@ -26,6 +26,7 @@
import com.android.settings.TestConfig;
import com.android.settings.core.instrumentation.MetricsFeatureProvider;
import com.android.settings.testutils.FakeFeatureFactory;
+import com.android.settings.testutils.shadow.SettingsShadowResources;
import com.android.settingslib.bluetooth.CachedBluetoothDevice;
import org.junit.Before;
@@ -38,18 +39,23 @@
import org.robolectric.util.ReflectionHelpers;
import static com.google.common.truth.Truth.assertThat;
+
+import static org.mockito.Mockito.doAnswer;
import static org.mockito.Mockito.mock;
import static org.mockito.Mockito.spy;
import static org.mockito.Mockito.verify;
import static org.mockito.Mockito.when;
@RunWith(SettingsRobolectricTestRunner.class)
-@Config(manifest = TestConfig.MANIFEST_PATH, sdk = TestConfig.SDK_VERSION)
+@Config(manifest = TestConfig.MANIFEST_PATH, sdk = TestConfig.SDK_VERSION,
+ shadows = SettingsShadowResources.class)
public class BluetoothDevicePreferenceTest {
private Context mContext;
@Mock
private CachedBluetoothDevice mCachedBluetoothDevice;
+ @Mock
+ private DeviceListPreferenceFragment mDeviceListPreferenceFragment;
private FakeFeatureFactory mFakeFeatureFactory;
private MetricsFeatureProvider mMetricsFeatureProvider;
@@ -62,7 +68,8 @@
FakeFeatureFactory.setupForTest(mContext);
mFakeFeatureFactory = (FakeFeatureFactory) FakeFeatureFactory.getFactory(mContext);
mMetricsFeatureProvider = mFakeFeatureFactory.getMetricsFeatureProvider();
- mPreference = new BluetoothDevicePreference(mContext, mCachedBluetoothDevice);
+ mPreference = new BluetoothDevicePreference(mContext, mCachedBluetoothDevice,
+ mDeviceListPreferenceFragment);
}
@Test
@@ -140,10 +147,58 @@
@Test
public void imagingDeviceIcon_isICSettingsPrint() {
+ when(mCachedBluetoothDevice.getBatteryLevel()).thenReturn(
+ BluetoothDevice.BATTERY_LEVEL_UNKNOWN);
when(mCachedBluetoothDevice.getBtClass()).thenReturn(
new BluetoothClass(BluetoothClass.Device.Major.IMAGING));
+
mPreference.onDeviceAttributesChanged();
assertThat(mPreference.getIcon()).isEqualTo(
mContext.getDrawable(R.drawable.ic_settings_print));
}
+
+ @Test
+ public void testVisible_notVisibleThenVisible() {
+ when(mDeviceListPreferenceFragment.shouldShowDevicesWithoutNames()).thenReturn(false);
+ final boolean[] humanReadableName = {false};
+ doAnswer(invocation -> humanReadableName[0]).when(mCachedBluetoothDevice)
+ .hasHumanReadableName();
+ BluetoothDevicePreference preference =
+ new BluetoothDevicePreference(mContext, mCachedBluetoothDevice,
+ mDeviceListPreferenceFragment);
+ assertThat(preference.isVisible()).isFalse();
+ humanReadableName[0] = true;
+ preference.onDeviceAttributesChanged();
+ assertThat(preference.isVisible()).isTrue();
+ }
+
+ @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();
+ BluetoothDevicePreference preference =
+ new BluetoothDevicePreference(mContext, mCachedBluetoothDevice,
+ mDeviceListPreferenceFragment);
+ assertThat(preference.isVisible()).isTrue();
+ humanReadableName[0] = false;
+ preference.onDeviceAttributesChanged();
+ assertThat(preference.isVisible()).isTrue();
+ }
}
diff --git a/tests/robotests/src/com/android/settings/bluetooth/UtilsTest.java b/tests/robotests/src/com/android/settings/bluetooth/UtilsTest.java
index 4667dac..7654921 100644
--- a/tests/robotests/src/com/android/settings/bluetooth/UtilsTest.java
+++ b/tests/robotests/src/com/android/settings/bluetooth/UtilsTest.java
@@ -15,14 +15,21 @@
*/
package com.android.settings.bluetooth;
+import static com.google.common.truth.Truth.assertThat;
+
+import android.bluetooth.BluetoothDevice;
import android.content.Context;
+import android.graphics.drawable.Drawable;
import com.android.internal.logging.nano.MetricsProto.MetricsEvent;
+import com.android.settings.R;
import com.android.settings.testutils.SettingsRobolectricTestRunner;
import com.android.settings.TestConfig;
import com.android.settings.core.instrumentation.MetricsFeatureProvider;
import com.android.settings.testutils.FakeFeatureFactory;
+import com.android.settings.testutils.shadow.SettingsShadowResources;
import com.android.settingslib.bluetooth.LocalBluetoothManager;
+import com.android.settingslib.graph.BluetoothDeviceLayerDrawable;
import org.junit.Before;
import org.junit.Test;
@@ -30,6 +37,7 @@
import org.mockito.Answers;
import org.mockito.Mock;
import org.mockito.MockitoAnnotations;
+import org.robolectric.RuntimeEnvironment;
import org.robolectric.annotation.Config;
import static org.mockito.Matchers.anyInt;
@@ -40,7 +48,8 @@
import static org.mockito.Mockito.when;
@RunWith(SettingsRobolectricTestRunner.class)
-@Config(manifest = TestConfig.MANIFEST_PATH, sdk = TestConfig.SDK_VERSION)
+@Config(manifest = TestConfig.MANIFEST_PATH, sdk = TestConfig.SDK_VERSION,
+ shadows = SettingsShadowResources.class)
public class UtilsTest {
@Mock(answer = Answers.RETURNS_DEEP_STUBS)
@@ -60,11 +69,27 @@
}
@Test
- public void showConnectingError_shouldLogBluetoothConnectError() {
+ public void testShowConnectingError_shouldLogBluetoothConnectError() {
when(mContext.getString(anyInt(), anyString())).thenReturn("testMessage");
Utils.showConnectingError(mContext, "testName", mock(LocalBluetoothManager.class));
verify(mMetricsFeatureProvider).visible(eq(mContext), anyInt(),
- eq(MetricsEvent.ACTION_SETTINGS_BLUETOOTH_CONNECT_ERROR));
+ eq(MetricsEvent.ACTION_SETTINGS_BLUETOOTH_CONNECT_ERROR));
+ }
+
+ @Test
+ public void testGetBluetoothDrawable_noBatteryLevel_returnSimpleDrawable() {
+ final Drawable drawable = Utils.getBluetoothDrawable(RuntimeEnvironment.application,
+ R.drawable.ic_bt_laptop, BluetoothDevice.BATTERY_LEVEL_UNKNOWN);
+
+ assertThat(drawable).isNotInstanceOf(BluetoothDeviceLayerDrawable.class);
+ }
+
+ @Test
+ public void testGetBluetoothDrawable_hasBatteryLevel_returnLayerDrawable() {
+ final Drawable drawable = Utils.getBluetoothDrawable(RuntimeEnvironment.application,
+ R.drawable.ic_bt_laptop, 10 /* batteryLevel */);
+
+ assertThat(drawable).isInstanceOf(BluetoothDeviceLayerDrawable.class);
}
}
diff --git a/tests/robotests/src/com/android/settings/dashboard/DashboardSummaryTest.java b/tests/robotests/src/com/android/settings/dashboard/DashboardSummaryTest.java
index 967ed24..f3ed57c 100644
--- a/tests/robotests/src/com/android/settings/dashboard/DashboardSummaryTest.java
+++ b/tests/robotests/src/com/android/settings/dashboard/DashboardSummaryTest.java
@@ -36,6 +36,7 @@
import org.robolectric.util.ReflectionHelpers;
import static org.mockito.ArgumentMatchers.nullable;
+import static org.mockito.Mockito.any;
import static org.mockito.Mockito.doNothing;
import static org.mockito.Mockito.doReturn;
import static org.mockito.Mockito.mock;
@@ -90,6 +91,7 @@
public void onConditionChanged_PositionAtTop_ScrollToTop() {
when(mLayoutManager.findFirstCompletelyVisibleItemPosition()).thenReturn(1);
mSummary.onConditionsChanged();
+ mSummary.onConditionsChanged();
verify(mDashboard).scrollToPosition(0);
}
@@ -97,10 +99,24 @@
public void onConditionChanged_PositionNotTop_RemainPosition() {
when(mLayoutManager.findFirstCompletelyVisibleItemPosition()).thenReturn(2);
mSummary.onConditionsChanged();
+ mSummary.onConditionsChanged();
verify(mDashboard, never()).scrollToPosition(0);
}
@Test
+ public void onConditionChanged_firstCall_shouldIgnore() {
+ mSummary.onConditionsChanged();
+ verify(mAdapter, never()).setConditions(any());
+ }
+
+ @Test
+ public void onConditionChanged_secondCall_shouldSetConditionsOnAdapter() {
+ mSummary.onConditionsChanged();
+ mSummary.onConditionsChanged();
+ verify(mAdapter).setConditions(any());
+ }
+
+ @Test
public void onCategoryChanged_noRebuildOnFirstCall() {
doReturn(mock(Activity.class)).when(mSummary).getActivity();
doNothing().when(mSummary).rebuildUI();