Merge "Add android.permission.MANAGE_SCOPED_ACCESS_DIRECTORY_PERMISSIONS"
diff --git a/AndroidManifest.xml b/AndroidManifest.xml
index 0d556f8..1951afd 100644
--- a/AndroidManifest.xml
+++ b/AndroidManifest.xml
@@ -462,6 +462,7 @@
<activity android:name=".bluetooth.DevicePickerActivity"
android:label="@string/device_picker"
+ android:configChanges="orientation|keyboardHidden|screenSize"
android:clearTaskOnLaunch="true">
<intent-filter>
<action android:name="android.bluetooth.devicepicker.action.LAUNCH" />
diff --git a/res/values/bools.xml b/res/values/bools.xml
index 0cf085f..f20b93c 100644
--- a/res/values/bools.xml
+++ b/res/values/bools.xml
@@ -173,4 +173,7 @@
<!-- Whether wifi_mac_address should be shown or not. -->
<bool name="config_show_wifi_mac_address">true</bool>
+
+ <!-- Whether to disable "Uninstall Updates" menu item for System apps or not.. -->
+ <bool name="config_disable_uninstall_update">false</bool>
</resources>
diff --git a/res/values/strings.xml b/res/values/strings.xml
index d7a4586..d16e438 100644
--- a/res/values/strings.xml
+++ b/res/values/strings.xml
@@ -1154,7 +1154,7 @@
<string name="setup_lock_settings_picker_title" product="default">Protect your phone</string>
<!-- Message shown when setting up screen lock, prompting user to choose the their backup screen lock method [CHAR LIMIT=NONE] -->
- <string name="lock_settings_picker_fingerprint_added_security_message">For added security, set a backup screen lock.</string>
+ <string name="lock_settings_picker_fingerprint_added_security_message">For added security, set a backup screen lock</string>
<!-- Description text for screen in setup wizard asking user to set up screen lock, explaining to the user how setting up a screen lock protect them from losing data. (tablet) [CHAR LIMIT=NONE] -->
<string name="setup_lock_settings_picker_message" product="tablet">Prevent others from using this tablet without your permission by activating device protection features. Choose the screen lock you want to use.</string>
@@ -2142,6 +2142,8 @@
<string name="wifi_hotspot_configure_ap_text_summary">AndroidAP WPA2 PSK hotspot</string>
<!-- Default access point SSID used for tethering -->
<string name="wifi_tether_configure_ssid_default">AndroidHotspot</string>
+ <!-- Summary text when hotspot is disabled because airplane mode is on [CHAR LIMIT=80]-->
+ <string name="wifi_tether_disabled_by_airplane">Unavailable because airplane mode is turned on</string>
<!-- Do not translate. Used for diagnostic screens, precise translation is not necessary
Wi-Fi Testing on the diagnostic screen-->
@@ -3477,19 +3479,19 @@
<!-- Lock Pattern settings -->
<!-- Header on first screen of choose password/PIN flow [CHAR LIMIT=40] -->
- <string name="lockpassword_choose_your_screen_lock_header">Set a screen lock</string>
+ <string name="lockpassword_choose_your_screen_lock_header">Set screen lock</string>
<!-- Message on first screen of choose password flow [CHAR LIMIT=NONE] -->
- <string name="lockpassword_choose_your_password_message">For security, set a password</string>
+ <string name="lockpassword_choose_your_password_message">For security, set password</string>
<!-- Header on first screen of choose password/PIN as backup for fingerprint flow. If this string cannot be translated in under 40 characters, please translate "Set fingerprint backup" [CHAR LIMIT=40] -->
- <string name="lockpassword_choose_your_password_header_for_fingerprint">To use fingerprint, set a password</string>
+ <string name="lockpassword_choose_your_password_header_for_fingerprint">To use fingerprint, set password</string>
<!-- Header on first screen of choose pattern as backup for fingerprint flow. If this string cannot be translated in under 40 characters, please translate "Set fingerprint backup" [CHAR LIMIT=40] -->
- <string name="lockpassword_choose_your_pattern_header_for_fingerprint">To use fingerprint, set a pattern</string>
+ <string name="lockpassword_choose_your_pattern_header_for_fingerprint">To use fingerprint, set pattern</string>
<!-- Message on first screen of choose PIN flow [CHAR LIMIT=NONE] -->
- <string name="lockpassword_choose_your_pin_message">For security, set a PIN</string>
+ <string name="lockpassword_choose_your_pin_message">For security, set PIN</string>
<!-- Header on first screen of choose password/PIN as backup for fingerprint flow. If this string cannot be translated in under 40 characters, please translate "Set fingerprint backup" [CHAR LIMIT=40] -->
- <string name="lockpassword_choose_your_pin_header_for_fingerprint">To use fingerprint, set a PIN</string>
+ <string name="lockpassword_choose_your_pin_header_for_fingerprint">To use fingerprint, set PIN</string>
<!-- Message on first screen of choose pattern flow [CHAR LIMIT=NONE] -->
- <string name="lockpassword_choose_your_pattern_message">For security, set a pattern</string>
+ <string name="lockpassword_choose_your_pattern_message">For security, set pattern</string>
<!-- Header on password confirm screen [CHAR LIMIT=40] -->
<string name="lockpassword_confirm_your_password_header">Re-enter your password</string>
<!-- Header on pattern confirm screen [CHAR LIMIT=30] -->
diff --git a/res/xml/accessibility_vibration_settings.xml b/res/xml/accessibility_vibration_settings.xml
index d61454d..17468ea 100644
--- a/res/xml/accessibility_vibration_settings.xml
+++ b/res/xml/accessibility_vibration_settings.xml
@@ -15,7 +15,7 @@
-->
<PreferenceScreen xmlns:android="http://schemas.android.com/apk/res/android"
- android:key="accessibility_settings_screen"
+ android:key="accessibility_settings_vibration_screen"
android:title="@string/accessibility_vibration_settings_title"
android:persistent="true">
diff --git a/src/com/android/settings/accessibility/AccessibilitySettings.java b/src/com/android/settings/accessibility/AccessibilitySettings.java
index 7335bae..bd63225 100644
--- a/src/com/android/settings/accessibility/AccessibilitySettings.java
+++ b/src/com/android/settings/accessibility/AccessibilitySettings.java
@@ -470,7 +470,7 @@
updateServicePreferences();
}
- private void updateServicePreferences() {
+ protected void updateServicePreferences() {
// Since services category is auto generated we have to do a pass
// to generate it since services can come and go and then based on
// the global accessibility state to decided whether it is enabled.
@@ -611,7 +611,7 @@
}
}
- private void updateSystemPreferences() {
+ protected void updateSystemPreferences() {
// Move color inversion and color correction preferences to Display category if device
// supports HWC hardware-accelerated color transform.
if (isColorTransformAccelerated(getContext())) {
diff --git a/src/com/android/settings/applications/appinfo/AppInfoDashboardFragment.java b/src/com/android/settings/applications/appinfo/AppInfoDashboardFragment.java
index 5790d34..5e12503 100755
--- a/src/com/android/settings/applications/appinfo/AppInfoDashboardFragment.java
+++ b/src/com/android/settings/applications/appinfo/AppInfoDashboardFragment.java
@@ -82,8 +82,8 @@
private static final String TAG = "AppInfoDashboard";
// Menu identifiers
- private static final int UNINSTALL_ALL_USERS_MENU = 1;
- private static final int UNINSTALL_UPDATES = 2;
+ @VisibleForTesting static final int UNINSTALL_ALL_USERS_MENU = 1;
+ @VisibleForTesting static final int UNINSTALL_UPDATES = 2;
static final int FORCE_STOP_MENU = 3;
// Result code identifiers
@@ -330,7 +330,10 @@
menu.findItem(UNINSTALL_ALL_USERS_MENU).setVisible(shouldShowUninstallForAll(mAppEntry));
mUpdatedSysApp = (mAppEntry.info.flags & ApplicationInfo.FLAG_UPDATED_SYSTEM_APP) != 0;
final MenuItem uninstallUpdatesItem = menu.findItem(UNINSTALL_UPDATES);
- uninstallUpdatesItem.setVisible(mUpdatedSysApp && !mAppsControlDisallowedBySystem);
+ final boolean uninstallUpdateDisabled = getContext().getResources().getBoolean(
+ R.bool.config_disable_uninstall_update);
+ uninstallUpdatesItem.setVisible(
+ mUpdatedSysApp && !mAppsControlDisallowedBySystem && !uninstallUpdateDisabled);
if (uninstallUpdatesItem.isVisible()) {
RestrictedLockUtils.setMenuItemAsDisabledByAdmin(getActivity(),
uninstallUpdatesItem, mAppsControlDisallowedAdmin);
diff --git a/src/com/android/settings/applications/defaultapps/DefaultAutofillPicker.java b/src/com/android/settings/applications/defaultapps/DefaultAutofillPicker.java
index d116f91..30835fb 100644
--- a/src/com/android/settings/applications/defaultapps/DefaultAutofillPicker.java
+++ b/src/com/android/settings/applications/defaultapps/DefaultAutofillPicker.java
@@ -195,6 +195,14 @@
candidates.add(new DefaultAppInfo(context, mPm, mUserId, new ComponentName(
info.serviceInfo.packageName, info.serviceInfo.name)));
}
+ if (Manifest.permission.BIND_AUTOFILL.equals(permission)) {
+ // Let it go for now...
+ Log.w(TAG, "AutofillService from '" + info.serviceInfo.packageName
+ + "' uses unsupported permission " + Manifest.permission.BIND_AUTOFILL
+ + ". It works for now, but might not be supported on future releases");
+ candidates.add(new DefaultAppInfo(context, mPm, mUserId, new ComponentName(
+ info.serviceInfo.packageName, info.serviceInfo.name)));
+ }
}
return candidates;
}
diff --git a/src/com/android/settings/connecteddevice/usb/UsbDetailsProfilesController.java b/src/com/android/settings/connecteddevice/usb/UsbDetailsProfilesController.java
index 1375b4c..1f662c0 100644
--- a/src/com/android/settings/connecteddevice/usb/UsbDetailsProfilesController.java
+++ b/src/com/android/settings/connecteddevice/usb/UsbDetailsProfilesController.java
@@ -17,6 +17,8 @@
package com.android.settings.connecteddevice.usb;
import com.android.settings.R;
+import com.android.settings.Utils;
+
import android.content.Context;
import android.hardware.usb.UsbManager;
import android.support.v14.preference.PreferenceFragment;
@@ -136,11 +138,18 @@
} else {
mode &= ~thisMode;
}
- mUsbBackend.setMode(mode);
+ if (!Utils.isMonkeyRunning()) {
+ mUsbBackend.setMode(mode);
+ }
return false;
}
@Override
+ public boolean isAvailable() {
+ return !Utils.isMonkeyRunning();
+ }
+
+ @Override
public String getPreferenceKey() {
return mKey;
}
diff --git a/src/com/android/settings/fuelgauge/PowerUsageSummary.java b/src/com/android/settings/fuelgauge/PowerUsageSummary.java
index 3583b14..659166a 100644
--- a/src/com/android/settings/fuelgauge/PowerUsageSummary.java
+++ b/src/com/android/settings/fuelgauge/PowerUsageSummary.java
@@ -86,9 +86,6 @@
@VisibleForTesting
static final int BATTERY_TIP_LOADER = 2;
private static final int MENU_STATS_TYPE = Menu.FIRST;
- @VisibleForTesting
- static final int MENU_HIGH_POWER_APPS = Menu.FIRST + 3;
- private static final int MENU_HELP = Menu.FIRST + 5;
public static final int DEBUG_INFO_LOADER = 3;
@VisibleForTesting
@@ -257,8 +254,6 @@
.setAlphabeticShortcut('t');
}
- menu.add(Menu.NONE, MENU_HIGH_POWER_APPS, Menu.NONE, R.string.high_power_apps);
-
super.onCreateOptionsMenu(menu, inflater);
}
@@ -283,15 +278,6 @@
}
refreshUi();
return true;
- case MENU_HIGH_POWER_APPS:
- Bundle args = new Bundle();
- args.putString(ManageApplications.EXTRA_CLASSNAME,
- HighPowerApplicationsActivity.class.getName());
- sa.startPreferencePanel(this, ManageApplications.class.getName(), args,
- R.string.high_power_apps, null, null, 0);
- metricsFeatureProvider.action(context,
- MetricsEvent.ACTION_SETTINGS_MENU_BATTERY_OPTIMIZATION);
- return true;
default:
return super.onOptionsItemSelected(item);
}
diff --git a/src/com/android/settings/fuelgauge/batterysaver/AutoBatterySeekBarPreferenceController.java b/src/com/android/settings/fuelgauge/batterysaver/AutoBatterySeekBarPreferenceController.java
index 1c787ab..1cc72a7 100644
--- a/src/com/android/settings/fuelgauge/batterysaver/AutoBatterySeekBarPreferenceController.java
+++ b/src/com/android/settings/fuelgauge/batterysaver/AutoBatterySeekBarPreferenceController.java
@@ -20,6 +20,7 @@
import android.database.ContentObserver;
import android.net.Uri;
import android.os.Handler;
+import android.os.Looper;
import android.provider.Settings;
import android.support.annotation.VisibleForTesting;
import android.support.v7.preference.Preference;
@@ -46,7 +47,7 @@
public AutoBatterySeekBarPreferenceController(Context context, Lifecycle lifecycle) {
super(context, KEY_AUTO_BATTERY_SEEK_BAR);
- mContentObserver = new AutoBatterySaverSettingObserver(new Handler());
+ mContentObserver = new AutoBatterySaverSettingObserver(new Handler(Looper.getMainLooper()));
if (lifecycle != null) {
lifecycle.addObserver(this);
}
diff --git a/src/com/android/settings/fuelgauge/batterytip/AnomalyDatabaseHelper.java b/src/com/android/settings/fuelgauge/batterytip/AnomalyDatabaseHelper.java
index a13df25..645ba16 100644
--- a/src/com/android/settings/fuelgauge/batterytip/AnomalyDatabaseHelper.java
+++ b/src/com/android/settings/fuelgauge/batterytip/AnomalyDatabaseHelper.java
@@ -19,10 +19,14 @@
import android.content.Context;
import android.database.sqlite.SQLiteDatabase;
import android.database.sqlite.SQLiteOpenHelper;
+import android.support.annotation.IntDef;
import android.util.Log;
import com.android.settings.fuelgauge.anomaly.Anomaly;
+import java.lang.annotation.Retention;
+import java.lang.annotation.RetentionPolicy;
+
/**
* Database controls the anomaly logging(e.g. packageName, anomalyType and time)
*/
@@ -30,7 +34,17 @@
private static final String TAG = "BatteryDatabaseHelper";
private static final String DATABASE_NAME = "battery_settings.db";
- private static final int DATABASE_VERSION = 1;
+ private static final int DATABASE_VERSION = 2;
+
+ @Retention(RetentionPolicy.SOURCE)
+ @IntDef({State.NEW,
+ State.HANDLED,
+ State.AUTO_HANDLED})
+ public @interface State {
+ int NEW = 0;
+ int HANDLED = 1;
+ int AUTO_HANDLED = 2;
+ }
public interface Tables {
String TABLE_ANOMALY = "anomaly";
@@ -47,6 +61,11 @@
*/
String ANOMALY_TYPE = "anomaly_type";
/**
+ * The state of the anomaly app
+ * @see State
+ */
+ String ANOMALY_STATE = "anomaly_state";
+ /**
* The time when anomaly happens
*/
String TIME_STAMP_MS = "time_stamp_ms";
@@ -59,6 +78,8 @@
" TEXT, " +
AnomalyColumns.ANOMALY_TYPE +
" INTEGER, " +
+ AnomalyColumns.ANOMALY_STATE +
+ " INTEGER, " +
AnomalyColumns.TIME_STAMP_MS +
" INTEGER)";
diff --git a/src/com/android/settings/fuelgauge/batterytip/BatteryDatabaseManager.java b/src/com/android/settings/fuelgauge/batterytip/BatteryDatabaseManager.java
index f87501f..2019b9d 100644
--- a/src/com/android/settings/fuelgauge/batterytip/BatteryDatabaseManager.java
+++ b/src/com/android/settings/fuelgauge/batterytip/BatteryDatabaseManager.java
@@ -17,6 +17,8 @@
package com.android.settings.fuelgauge.batterytip;
import static com.android.settings.fuelgauge.batterytip.AnomalyDatabaseHelper.AnomalyColumns
+ .ANOMALY_STATE;
+import static com.android.settings.fuelgauge.batterytip.AnomalyDatabaseHelper.AnomalyColumns
.PACKAGE_NAME;
import static com.android.settings.fuelgauge.batterytip.AnomalyDatabaseHelper.AnomalyColumns
.ANOMALY_TYPE;
@@ -28,8 +30,10 @@
import android.content.Context;
import android.database.Cursor;
import android.database.sqlite.SQLiteDatabase;
+import android.text.TextUtils;
import java.util.ArrayList;
+import java.util.Collections;
import java.util.List;
/**
@@ -55,22 +59,24 @@
values.put(PACKAGE_NAME, packageName);
values.put(ANOMALY_TYPE, type);
values.put(TIME_STAMP_MS, timestampMs);
-
+ values.put(ANOMALY_STATE, AnomalyDatabaseHelper.State.NEW);
db.insert(TABLE_ANOMALY, null, values);
}
}
/**
- * Query all the anomalies that happened after {@code timestampMs}.
+ * Query all the anomalies that happened after {@code timestampMsAfter} and with {@code state}.
*/
- public List<AppInfo> queryAllAnomaliesAfter(long timestampMs) {
+ public List<AppInfo> queryAllAnomalies(long timestampMsAfter, int state) {
final List<AppInfo> appInfos = new ArrayList<>();
try (SQLiteDatabase db = mDatabaseHelper.getReadableDatabase()) {
final String[] projection = {PACKAGE_NAME, ANOMALY_TYPE};
final String orderBy = AnomalyDatabaseHelper.AnomalyColumns.TIME_STAMP_MS + " DESC";
- try (Cursor cursor = db.query(TABLE_ANOMALY, projection, TIME_STAMP_MS + " > ?",
- new String[]{String.valueOf(timestampMs)}, null, null, orderBy)) {
+ try (Cursor cursor = db.query(TABLE_ANOMALY, projection,
+ TIME_STAMP_MS + " > ? AND " + ANOMALY_STATE + " = ? ",
+ new String[]{String.valueOf(timestampMsAfter), String.valueOf(state)}, null,
+ null, orderBy)) {
while (cursor.moveToNext()) {
AppInfo appInfo = new AppInfo.Builder()
.setPackageName(cursor.getString(cursor.getColumnIndex(PACKAGE_NAME)))
@@ -90,4 +96,26 @@
new String[]{String.valueOf(timestampMs)});
}
}
+
+ /**
+ * Update the type of anomalies to {@code state}
+ *
+ * @param appInfos represents the anomalies
+ * @param state which state to update to
+ */
+ public void updateAnomalies(List<AppInfo> appInfos, int state) {
+ if (!appInfos.isEmpty()) {
+ final int size = appInfos.size();
+ final String[] whereArgs = new String[size];
+ for (int i = 0; i < size; i++) {
+ whereArgs[i] = appInfos.get(i).packageName;
+ }
+ try (SQLiteDatabase db = mDatabaseHelper.getWritableDatabase()) {
+ final ContentValues values = new ContentValues();
+ values.put(ANOMALY_STATE, state);
+ db.update(TABLE_ANOMALY, values, PACKAGE_NAME + " IN (" + TextUtils.join(",",
+ Collections.nCopies(appInfos.size(), "?")) + ")", whereArgs);
+ }
+ }
+ }
}
diff --git a/src/com/android/settings/fuelgauge/batterytip/BatteryTipLoader.java b/src/com/android/settings/fuelgauge/batterytip/BatteryTipLoader.java
index a615841..ebb4790 100644
--- a/src/com/android/settings/fuelgauge/batterytip/BatteryTipLoader.java
+++ b/src/com/android/settings/fuelgauge/batterytip/BatteryTipLoader.java
@@ -71,7 +71,7 @@
tips.add(new SmartBatteryDetector(policy, context.getContentResolver()).detect());
tips.add(new EarlyWarningDetector(policy, context).detect());
tips.add(new SummaryDetector(policy).detect());
- tips.add(new RestrictAppDetector(policy).detect());
+ tips.add(new RestrictAppDetector(context, policy).detect());
Collections.sort(tips);
return tips;
diff --git a/src/com/android/settings/fuelgauge/batterytip/actions/RestrictAppAction.java b/src/com/android/settings/fuelgauge/batterytip/actions/RestrictAppAction.java
index 9c49822..886a6d5 100644
--- a/src/com/android/settings/fuelgauge/batterytip/actions/RestrictAppAction.java
+++ b/src/com/android/settings/fuelgauge/batterytip/actions/RestrictAppAction.java
@@ -21,7 +21,9 @@
import android.support.annotation.VisibleForTesting;
import com.android.settings.fuelgauge.BatteryUtils;
+import com.android.settings.fuelgauge.batterytip.AnomalyDatabaseHelper;
import com.android.settings.fuelgauge.batterytip.AppInfo;
+import com.android.settings.fuelgauge.batterytip.BatteryDatabaseManager;
import com.android.settings.fuelgauge.batterytip.tips.RestrictAppTip;
import java.util.List;
@@ -32,12 +34,15 @@
public class RestrictAppAction extends BatteryTipAction {
private RestrictAppTip mRestrictAppTip;
@VisibleForTesting
+ BatteryDatabaseManager mBatteryDatabaseManager;
+ @VisibleForTesting
BatteryUtils mBatteryUtils;
public RestrictAppAction(Context context, RestrictAppTip tip) {
super(context);
mRestrictAppTip = tip;
mBatteryUtils = BatteryUtils.getInstance(context);
+ mBatteryDatabaseManager = new BatteryDatabaseManager(context);
}
/**
@@ -53,5 +58,7 @@
mBatteryUtils.setForceAppStandby(mBatteryUtils.getPackageUid(packageName), packageName,
AppOpsManager.MODE_IGNORED);
}
+
+ mBatteryDatabaseManager.updateAnomalies(appInfos, AnomalyDatabaseHelper.State.HANDLED);
}
}
diff --git a/src/com/android/settings/fuelgauge/batterytip/detectors/RestrictAppDetector.java b/src/com/android/settings/fuelgauge/batterytip/detectors/RestrictAppDetector.java
index 46e241a..e3c9b9e 100644
--- a/src/com/android/settings/fuelgauge/batterytip/detectors/RestrictAppDetector.java
+++ b/src/com/android/settings/fuelgauge/batterytip/detectors/RestrictAppDetector.java
@@ -16,7 +16,13 @@
package com.android.settings.fuelgauge.batterytip.detectors;
+import android.content.Context;
+import android.support.annotation.VisibleForTesting;
+import android.text.format.DateUtils;
+
+import com.android.settings.fuelgauge.batterytip.AnomalyDatabaseHelper;
import com.android.settings.fuelgauge.batterytip.AppInfo;
+import com.android.settings.fuelgauge.batterytip.BatteryDatabaseManager;
import com.android.settings.fuelgauge.batterytip.BatteryTipPolicy;
import com.android.settings.fuelgauge.batterytip.tips.BatteryTip;
import com.android.settings.fuelgauge.batterytip.tips.RestrictAppTip;
@@ -29,18 +35,47 @@
* {@link BatteryTipDetector} since it need the most up-to-date {@code visibleTips}
*/
public class RestrictAppDetector implements BatteryTipDetector {
+ @VisibleForTesting
+ static final boolean USE_FAKE_DATA = false;
private BatteryTipPolicy mPolicy;
+ @VisibleForTesting
+ BatteryDatabaseManager mBatteryDatabaseManager;
- public RestrictAppDetector(BatteryTipPolicy policy) {
+ public RestrictAppDetector(Context context, BatteryTipPolicy policy) {
mPolicy = policy;
+ mBatteryDatabaseManager = new BatteryDatabaseManager(context);
}
@Override
public BatteryTip detect() {
- // TODO(b/70570352): Detect restrict apps here, get data from database
+ if (USE_FAKE_DATA) {
+ return getFakeData();
+ }
+ if (mPolicy.appRestrictionEnabled) {
+ // TODO(b/72385333): hook up the query timestamp to server side
+ final long oneDayBeforeMs = System.currentTimeMillis() - DateUtils.DAY_IN_MILLIS;
+ final List<AppInfo> highUsageApps = mBatteryDatabaseManager.queryAllAnomalies(
+ oneDayBeforeMs, AnomalyDatabaseHelper.State.NEW);
+ if (!highUsageApps.isEmpty()) {
+ // If there are new anomalies, show them
+ return new RestrictAppTip(BatteryTip.StateType.NEW, highUsageApps);
+ } else {
+ // Otherwise, show auto-handled one if it exists
+ final List<AppInfo> autoHandledApps = mBatteryDatabaseManager.queryAllAnomalies(
+ oneDayBeforeMs, AnomalyDatabaseHelper.State.AUTO_HANDLED);
+ return new RestrictAppTip(autoHandledApps.isEmpty() ? BatteryTip.StateType.INVISIBLE
+ : BatteryTip.StateType.HANDLED, autoHandledApps);
+ }
+ } else {
+ return new RestrictAppTip(BatteryTip.StateType.INVISIBLE, new ArrayList<>());
+ }
+ }
+
+ private BatteryTip getFakeData() {
final List<AppInfo> highUsageApps = new ArrayList<>();
- return new RestrictAppTip(
- highUsageApps.isEmpty() ? BatteryTip.StateType.INVISIBLE : BatteryTip.StateType.NEW,
- highUsageApps);
+ highUsageApps.add(new AppInfo.Builder()
+ .setPackageName("com.android.settings")
+ .build());
+ return new RestrictAppTip(BatteryTip.StateType.NEW, highUsageApps);
}
}
diff --git a/src/com/android/settings/fuelgauge/batterytip/tips/RestrictAppTip.java b/src/com/android/settings/fuelgauge/batterytip/tips/RestrictAppTip.java
index 1d84d7f..a40f292 100644
--- a/src/com/android/settings/fuelgauge/batterytip/tips/RestrictAppTip.java
+++ b/src/com/android/settings/fuelgauge/batterytip/tips/RestrictAppTip.java
@@ -81,7 +81,14 @@
@Override
public void updateState(BatteryTip tip) {
- mState = tip.mState;
+ if (tip.mState == StateType.NEW) {
+ // Display it if new anomaly comes
+ mState = StateType.NEW;
+ mRestrictAppList = ((RestrictAppTip) tip).mRestrictAppList;
+ } else if (mState == StateType.NEW && tip.mState == StateType.INVISIBLE) {
+ // If anomaly becomes invisible, show it as handled
+ mState = StateType.HANDLED;
+ }
}
public List<AppInfo> getRestrictAppList() {
diff --git a/src/com/android/settings/wifi/tether/WifiTetherPreferenceController.java b/src/com/android/settings/wifi/tether/WifiTetherPreferenceController.java
index 826ed42..058ba5f 100644
--- a/src/com/android/settings/wifi/tether/WifiTetherPreferenceController.java
+++ b/src/com/android/settings/wifi/tether/WifiTetherPreferenceController.java
@@ -202,7 +202,7 @@
boolean isAirplaneMode = Settings.Global.getInt(mContext.getContentResolver(),
Settings.Global.AIRPLANE_MODE_ON, 0) != 0;
if (isAirplaneMode) {
- mPreference.setSummary(R.string.summary_placeholder);
+ mPreference.setSummary(R.string.wifi_tether_disabled_by_airplane);
}
}
//
diff --git a/tests/robotests/res/values-mcc999/config.xml b/tests/robotests/res/values-mcc999/config.xml
index f43e39c..01bfa51 100644
--- a/tests/robotests/res/values-mcc999/config.xml
+++ b/tests/robotests/res/values-mcc999/config.xml
@@ -62,4 +62,5 @@
<bool name="config_show_device_model">false</bool>
<bool name="config_show_wifi_ip_address">false</bool>
<bool name="config_show_wifi_mac_address">false</bool>
+ <bool name="config_disable_uninstall_update">true</bool>
</resources>
diff --git a/tests/robotests/src/com/android/settings/applications/appinfo/AppInfoDashboardFragmentTest.java b/tests/robotests/src/com/android/settings/applications/appinfo/AppInfoDashboardFragmentTest.java
index b7e414c..d721e17 100644
--- a/tests/robotests/src/com/android/settings/applications/appinfo/AppInfoDashboardFragmentTest.java
+++ b/tests/robotests/src/com/android/settings/applications/appinfo/AppInfoDashboardFragmentTest.java
@@ -16,6 +16,10 @@
package com.android.settings.applications.appinfo;
+import static com.android.settings.applications.appinfo.AppInfoDashboardFragment
+ .UNINSTALL_ALL_USERS_MENU;
+import static com.android.settings.applications.appinfo.AppInfoDashboardFragment.UNINSTALL_UPDATES;
+
import static com.google.common.truth.Truth.assertThat;
import static org.mockito.ArgumentMatchers.any;
@@ -25,6 +29,7 @@
import static org.mockito.Mockito.mock;
import static org.mockito.Mockito.never;
import static org.mockito.Mockito.spy;
+import static org.mockito.Mockito.times;
import static org.mockito.Mockito.verify;
import static org.mockito.Mockito.when;
@@ -36,6 +41,8 @@
import android.content.pm.PackageManager;
import android.content.pm.UserInfo;
import android.os.UserManager;
+import android.view.Menu;
+import android.view.MenuItem;
import com.android.settings.SettingsActivity;
import com.android.settings.TestConfig;
@@ -129,6 +136,42 @@
}
@Test
+ public void onPrepareOptionsMenu_setUpdateMenuVisible_byDefaultForSystemApps_shouldBeTrue() {
+ Menu menu = onPrepareOptionsMenuTestsSetup();
+ mFragment.onPrepareOptionsMenu(menu);
+
+ verify(menu.findItem(UNINSTALL_UPDATES), times(1)).setVisible(true);
+ }
+
+ @Test
+ @Config(qualifiers = "mcc999")
+ public void onPrepareOptionsMenu_setUpdateMenuVisible_ifDisabledByDevice_shouldBeFalse() {
+ Menu menu = onPrepareOptionsMenuTestsSetup();
+ mFragment.onPrepareOptionsMenu(menu);
+
+ verify(menu.findItem(UNINSTALL_UPDATES), times(1)).setVisible(false);
+ }
+
+ private Menu onPrepareOptionsMenuTestsSetup() {
+ // Menu mocking
+ Menu menu = mock(Menu.class);
+ final MenuItem uninstallUpdatesMenuItem = mock(MenuItem.class);
+ final MenuItem uninstallForAllMenuItem = mock(MenuItem.class);
+ when(menu.findItem(UNINSTALL_UPDATES)).thenReturn(uninstallUpdatesMenuItem);
+ when(menu.findItem(UNINSTALL_ALL_USERS_MENU)).thenReturn(uninstallForAllMenuItem);
+
+ // Setup work to prevent NPE
+ final ApplicationInfo info = new ApplicationInfo();
+ info.flags = ApplicationInfo.FLAG_UPDATED_SYSTEM_APP;
+ info.enabled = true;
+ final AppEntry appEntry = mock(AppEntry.class);
+ appEntry.info = info;
+ mFragment.setAppEntry(appEntry);
+
+ return menu;
+ }
+
+ @Test
public void launchFragment_hasNoPackageInfo_shouldFinish() {
ReflectionHelpers.setField(mFragment, "mPackageInfo", null);
diff --git a/tests/robotests/src/com/android/settings/connecteddevice/usb/UsbDetailsProfilesControllerTest.java b/tests/robotests/src/com/android/settings/connecteddevice/usb/UsbDetailsProfilesControllerTest.java
index 557d836..c733078 100644
--- a/tests/robotests/src/com/android/settings/connecteddevice/usb/UsbDetailsProfilesControllerTest.java
+++ b/tests/robotests/src/com/android/settings/connecteddevice/usb/UsbDetailsProfilesControllerTest.java
@@ -36,6 +36,7 @@
import com.android.settings.testutils.FakeFeatureFactory;
import com.android.settings.testutils.SettingsRobolectricTestRunner;
import com.android.settings.testutils.shadow.SettingsShadowResources;
+import com.android.settings.testutils.shadow.ShadowUtils;
import com.android.settingslib.core.lifecycle.Lifecycle;
import com.google.android.collect.Lists;
@@ -228,6 +229,13 @@
assertThat(!switches.get(0).isChecked());
}
+ @Test
+ @Config(shadows = ShadowUtils.class)
+ public void testIsAvailable_isMonkey_shouldReturnFalse() {
+ ShadowUtils.setIsUserAMonkey(true);
+ assertThat(mDetailsProfilesController.isAvailable()).isFalse();
+ }
+
private List<SwitchPreference> getProfileSwitches() {
ArrayList<SwitchPreference> result = new ArrayList<>();
for (int i = 0; i < mPreference.getPreferenceCount(); i++) {
diff --git a/tests/robotests/src/com/android/settings/fuelgauge/BatteryDatabaseManagerTest.java b/tests/robotests/src/com/android/settings/fuelgauge/BatteryDatabaseManagerTest.java
index ac8800e..92332f2 100644
--- a/tests/robotests/src/com/android/settings/fuelgauge/BatteryDatabaseManagerTest.java
+++ b/tests/robotests/src/com/android/settings/fuelgauge/BatteryDatabaseManagerTest.java
@@ -24,6 +24,7 @@
import android.text.format.DateUtils;
import com.android.settings.TestConfig;
+import com.android.settings.fuelgauge.batterytip.AnomalyDatabaseHelper;
import com.android.settings.fuelgauge.batterytip.AppInfo;
import com.android.settings.fuelgauge.batterytip.BatteryDatabaseManager;
import com.android.settings.testutils.DatabaseTestUtils;
@@ -37,6 +38,7 @@
import org.robolectric.RuntimeEnvironment;
import org.robolectric.annotation.Config;
+import java.util.ArrayList;
import java.util.List;
@RunWith(RobolectricTestRunner.class)
@@ -71,28 +73,54 @@
mBatteryDatabaseManager.insertAnomaly(PACKAGE_NAME_OLD, TYPE_OLD, TWO_DAYS_BEFORE);
// In database, it contains two record
- List<AppInfo> totalAppInfos = mBatteryDatabaseManager.queryAllAnomaliesAfter(0);
+ List<AppInfo> totalAppInfos = mBatteryDatabaseManager.queryAllAnomalies(0 /* timeMsAfter */,
+ AnomalyDatabaseHelper.State.NEW);
assertThat(totalAppInfos).hasSize(2);
- verifyAppInfo(totalAppInfos.get(0), PACKAGE_NAME_NEW, TYPE_NEW);
- verifyAppInfo(totalAppInfos.get(1), PACKAGE_NAME_OLD, TYPE_OLD);
+ assertAppInfo(totalAppInfos.get(0), PACKAGE_NAME_NEW, TYPE_NEW);
+ assertAppInfo(totalAppInfos.get(1), PACKAGE_NAME_OLD, TYPE_OLD);
// Only one record shows up if we query by timestamp
- List<AppInfo> appInfos = mBatteryDatabaseManager.queryAllAnomaliesAfter(ONE_DAY_BEFORE);
+ List<AppInfo> appInfos = mBatteryDatabaseManager.queryAllAnomalies(ONE_DAY_BEFORE,
+ AnomalyDatabaseHelper.State.NEW);
assertThat(appInfos).hasSize(1);
- verifyAppInfo(appInfos.get(0), PACKAGE_NAME_NEW, TYPE_NEW);
+ assertAppInfo(appInfos.get(0), PACKAGE_NAME_NEW, TYPE_NEW);
mBatteryDatabaseManager.deleteAllAnomaliesBeforeTimeStamp(ONE_DAY_BEFORE);
// The obsolete record is removed from database
- List<AppInfo> appInfos1 = mBatteryDatabaseManager.queryAllAnomaliesAfter(0);
+ List<AppInfo> appInfos1 = mBatteryDatabaseManager.queryAllAnomalies(0 /* timeMsAfter */,
+ AnomalyDatabaseHelper.State.NEW);
assertThat(appInfos1).hasSize(1);
- verifyAppInfo(appInfos1.get(0), PACKAGE_NAME_NEW, TYPE_NEW);
-
+ assertAppInfo(appInfos1.get(0), PACKAGE_NAME_NEW, TYPE_NEW);
}
- private void verifyAppInfo(final AppInfo appInfo, String packageName, int type) {
+ @Test
+ public void testUpdateAnomalies_updateSuccessfully() {
+ mBatteryDatabaseManager.insertAnomaly(PACKAGE_NAME_NEW, TYPE_NEW, NOW);
+ mBatteryDatabaseManager.insertAnomaly(PACKAGE_NAME_OLD, TYPE_OLD, NOW);
+ final AppInfo appInfo = new AppInfo.Builder().setPackageName(PACKAGE_NAME_OLD).build();
+ final List<AppInfo> updateAppInfos = new ArrayList<>();
+ updateAppInfos.add(appInfo);
+
+ // Change state of PACKAGE_NAME_OLD to handled
+ mBatteryDatabaseManager.updateAnomalies(updateAppInfos,
+ AnomalyDatabaseHelper.State.HANDLED);
+
+ // The state of PACKAGE_NAME_NEW is still new
+ List<AppInfo> newAppInfos = mBatteryDatabaseManager.queryAllAnomalies(ONE_DAY_BEFORE,
+ AnomalyDatabaseHelper.State.NEW);
+ assertThat(newAppInfos).hasSize(1);
+ assertAppInfo(newAppInfos.get(0), PACKAGE_NAME_NEW, TYPE_NEW);
+
+ // The state of PACKAGE_NAME_OLD is changed to handled
+ List<AppInfo> handledAppInfos = mBatteryDatabaseManager.queryAllAnomalies(ONE_DAY_BEFORE,
+ AnomalyDatabaseHelper.State.HANDLED);
+ assertThat(handledAppInfos).hasSize(1);
+ assertAppInfo(handledAppInfos.get(0), PACKAGE_NAME_OLD, TYPE_OLD);
+ }
+
+ private void assertAppInfo(final AppInfo appInfo, String packageName, int type) {
assertThat(appInfo.packageName).isEqualTo(packageName);
assertThat(appInfo.anomalyType).isEqualTo(type);
}
-
}
diff --git a/tests/robotests/src/com/android/settings/fuelgauge/PowerUsageSummaryTest.java b/tests/robotests/src/com/android/settings/fuelgauge/PowerUsageSummaryTest.java
index 35af8bb..32e2b0b 100644
--- a/tests/robotests/src/com/android/settings/fuelgauge/PowerUsageSummaryTest.java
+++ b/tests/robotests/src/com/android/settings/fuelgauge/PowerUsageSummaryTest.java
@@ -15,8 +15,6 @@
*/
package com.android.settings.fuelgauge;
-import static com.android.settings.fuelgauge.PowerUsageSummary.MENU_HIGH_POWER_APPS;
-
import static com.google.common.truth.Truth.assertThat;
import static org.mockito.Matchers.any;
@@ -108,14 +106,6 @@
@Mock(answer = Answers.RETURNS_DEEP_STUBS)
private Context mContext;
- @Mock(answer = Answers.RETURNS_DEEP_STUBS)
- private Menu mMenu;
- @Mock
- private MenuItem mToggleAppsMenu;
- @Mock
- private MenuItem mHighPowerMenu;
- @Mock
- private MenuInflater mMenuInflater;
@Mock
private BatterySipper mNormalBatterySipper;
@Mock
@@ -169,7 +159,6 @@
doReturn(mock(LoaderManager.class)).when(mFragment).getLoaderManager();
when(mFragment.getActivity()).thenReturn(mSettingsActivity);
- when(mHighPowerMenu.getItemId()).thenReturn(MENU_HIGH_POWER_APPS);
when(mFeatureFactory.powerUsageFeatureProvider.getAdditionalBatteryInfoIntent())
.thenReturn(sAdditionalBatteryInfoIntent);
when(mBatteryHelper.getTotalPower()).thenReturn(TOTAL_POWER);
@@ -205,14 +194,6 @@
}
@Test
- public void testOptionsMenu_menuHighPower_metricEventInvoked() {
- mFragment.onOptionsItemSelected(mHighPowerMenu);
-
- verify(mFeatureFactory.metricsFeatureProvider).action(mContext,
- MetricsProto.MetricsEvent.ACTION_SETTINGS_MENU_BATTERY_OPTIMIZATION);
- }
-
- @Test
public void testUpdateLastFullChargePreference_showCorrectSummary() {
doReturn(mRealContext).when(mFragment).getContext();
diff --git a/tests/robotests/src/com/android/settings/fuelgauge/batterytip/actions/RestrictAppActionTest.java b/tests/robotests/src/com/android/settings/fuelgauge/batterytip/actions/RestrictAppActionTest.java
index 47785d5..728bbff 100644
--- a/tests/robotests/src/com/android/settings/fuelgauge/batterytip/actions/RestrictAppActionTest.java
+++ b/tests/robotests/src/com/android/settings/fuelgauge/batterytip/actions/RestrictAppActionTest.java
@@ -27,8 +27,10 @@
import com.android.settings.fuelgauge.batterytip.AppInfo;
import com.android.settings.fuelgauge.batterytip.tips.BatteryTip;
import com.android.settings.fuelgauge.batterytip.tips.RestrictAppTip;
+import com.android.settings.testutils.DatabaseTestUtils;
import com.android.settings.testutils.SettingsRobolectricTestRunner;
+import org.junit.After;
import org.junit.Before;
import org.junit.Test;
import org.junit.runner.RunWith;
@@ -69,6 +71,11 @@
mRestrictAppAction.mBatteryUtils = mBatteryUtils;
}
+ @After
+ public void cleanUp() {
+ DatabaseTestUtils.clearDb(mContext);
+ }
+
@Test
public void testHandlePositiveAction() {
mRestrictAppAction.handlePositiveAction();
@@ -79,5 +86,4 @@
eq(AppOpsManager.MODE_IGNORED));
}
-
}
diff --git a/tests/robotests/src/com/android/settings/fuelgauge/batterytip/detectors/RestrictAppDetectorTest.java b/tests/robotests/src/com/android/settings/fuelgauge/batterytip/detectors/RestrictAppDetectorTest.java
new file mode 100644
index 0000000..6a25c6d
--- /dev/null
+++ b/tests/robotests/src/com/android/settings/fuelgauge/batterytip/detectors/RestrictAppDetectorTest.java
@@ -0,0 +1,113 @@
+/*
+ * Copyright (C) 2018 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.android.settings.fuelgauge.batterytip.detectors;
+
+import static com.google.common.truth.Truth.assertThat;
+
+import static org.mockito.Matchers.anyInt;
+import static org.mockito.Matchers.anyLong;
+import static org.mockito.Matchers.eq;
+import static org.mockito.Mockito.doReturn;
+import static org.mockito.Mockito.spy;
+
+import android.content.Context;
+
+import com.android.settings.TestConfig;
+import com.android.settings.fuelgauge.batterytip.AnomalyDatabaseHelper;
+import com.android.settings.fuelgauge.batterytip.AppInfo;
+import com.android.settings.fuelgauge.batterytip.BatteryDatabaseManager;
+import com.android.settings.fuelgauge.batterytip.BatteryTipPolicy;
+import com.android.settings.fuelgauge.batterytip.tips.BatteryTip;
+import com.android.settings.testutils.DatabaseTestUtils;
+import com.android.settings.testutils.SettingsRobolectricTestRunner;
+
+import org.junit.After;
+import org.junit.Before;
+import org.junit.Test;
+import org.junit.runner.RunWith;
+import org.mockito.Mock;
+import org.mockito.MockitoAnnotations;
+import org.robolectric.RuntimeEnvironment;
+import org.robolectric.annotation.Config;
+
+import java.util.ArrayList;
+import java.util.List;
+
+@RunWith(SettingsRobolectricTestRunner.class)
+@Config(manifest = TestConfig.MANIFEST_PATH, sdk = TestConfig.SDK_VERSION)
+public class RestrictAppDetectorTest {
+ private static final String PACKAGE_NAME = "com.android.app";
+ private Context mContext;
+ private BatteryTipPolicy mPolicy;
+ private RestrictAppDetector mRestrictAppDetector;
+ private List<AppInfo> mAppInfoList;
+ @Mock
+ private BatteryDatabaseManager mBatteryDatabaseManager;
+
+ @Before
+ public void setUp() {
+ MockitoAnnotations.initMocks(this);
+
+ mAppInfoList = new ArrayList<>();
+ mAppInfoList.add(new AppInfo.Builder()
+ .setPackageName(PACKAGE_NAME)
+ .build());
+
+ mContext = RuntimeEnvironment.application;
+ mPolicy = spy(new BatteryTipPolicy(mContext));
+ mRestrictAppDetector = new RestrictAppDetector(mContext, mPolicy);
+ mRestrictAppDetector.mBatteryDatabaseManager = mBatteryDatabaseManager;
+ }
+
+ @After
+ public void cleanUp() {
+ DatabaseTestUtils.clearDb(mContext);
+ }
+
+ @Test
+ public void testDetect_hasAnomaly_tipNew() {
+ doReturn(mAppInfoList).when(mBatteryDatabaseManager).queryAllAnomalies(anyLong(),
+ eq(AnomalyDatabaseHelper.State.NEW));
+
+ assertThat(mRestrictAppDetector.detect().getState()).isEqualTo(BatteryTip.StateType.NEW);
+ }
+
+ @Test
+ public void testDetect_hasAutoHandledAnomaly_tipHandled() {
+ doReturn(new ArrayList<AppInfo>()).when(mBatteryDatabaseManager).queryAllAnomalies(
+ anyLong(), eq(AnomalyDatabaseHelper.State.NEW));
+ doReturn(mAppInfoList).when(mBatteryDatabaseManager).queryAllAnomalies(anyLong(),
+ eq(AnomalyDatabaseHelper.State.AUTO_HANDLED));
+
+ assertThat(mRestrictAppDetector.detect().getState()).isEqualTo(
+ BatteryTip.StateType.HANDLED);
+ }
+
+ @Test
+ public void testDetect_noAnomaly_tipInvisible() {
+ doReturn(new ArrayList<AppInfo>()).when(mBatteryDatabaseManager).queryAllAnomalies(
+ anyLong(), anyInt());
+
+ assertThat(mRestrictAppDetector.detect().getState()).isEqualTo(
+ BatteryTip.StateType.INVISIBLE);
+ }
+
+ @Test
+ public void testUseFakeData_alwaysFalse() {
+ assertThat(RestrictAppDetector.USE_FAKE_DATA).isFalse();
+ }
+}
diff --git a/tests/robotests/src/com/android/settings/fuelgauge/batterytip/tips/RestrictAppTipTest.java b/tests/robotests/src/com/android/settings/fuelgauge/batterytip/tips/RestrictAppTipTest.java
index e1dea17..74536a5 100644
--- a/tests/robotests/src/com/android/settings/fuelgauge/batterytip/tips/RestrictAppTipTest.java
+++ b/tests/robotests/src/com/android/settings/fuelgauge/batterytip/tips/RestrictAppTipTest.java
@@ -49,6 +49,7 @@
private Context mContext;
private RestrictAppTip mNewBatteryTip;
private RestrictAppTip mHandledBatteryTip;
+ private RestrictAppTip mInvisibleBatteryTip;
private List<AppInfo> mUsageAppList;
@Mock
private ApplicationInfo mApplicationInfo;
@@ -71,6 +72,7 @@
.build());
mNewBatteryTip = new RestrictAppTip(BatteryTip.StateType.NEW, mUsageAppList);
mHandledBatteryTip = new RestrictAppTip(BatteryTip.StateType.HANDLED, mUsageAppList);
+ mInvisibleBatteryTip = new RestrictAppTip(BatteryTip.StateType.INVISIBLE, mUsageAppList);
}
@Test
@@ -108,4 +110,20 @@
assertThat(mHandledBatteryTip.getSummary(mContext)).isEqualTo(
"App changes are in progress");
}
+
+ @Test
+ public void testUpdate_anomalyBecomeInvisible_stateHandled() {
+ mNewBatteryTip.updateState(mInvisibleBatteryTip);
+
+ assertThat(mNewBatteryTip.getState()).isEqualTo(BatteryTip.StateType.HANDLED);
+ }
+
+ @Test
+ public void testUpdate_newAnomalyComes_stateNew() {
+ mInvisibleBatteryTip.updateState(mNewBatteryTip);
+ assertThat(mInvisibleBatteryTip.getState()).isEqualTo(BatteryTip.StateType.NEW);
+
+ mHandledBatteryTip.updateState(mNewBatteryTip);
+ assertThat(mHandledBatteryTip.getState()).isEqualTo(BatteryTip.StateType.NEW);
+ }
}
diff --git a/tests/robotests/src/com/android/settings/wifi/tether/WifiTetherPreferenceControllerTest.java b/tests/robotests/src/com/android/settings/wifi/tether/WifiTetherPreferenceControllerTest.java
index 4b18fcf..92303e0 100644
--- a/tests/robotests/src/com/android/settings/wifi/tether/WifiTetherPreferenceControllerTest.java
+++ b/tests/robotests/src/com/android/settings/wifi/tether/WifiTetherPreferenceControllerTest.java
@@ -185,7 +185,7 @@
receiver.onReceive(RuntimeEnvironment.application, broadcast);
assertThat(mPreference.getSummary().toString()).isEqualTo(
- RuntimeEnvironment.application.getString(R.string.summary_placeholder));
+ "Unavailable because airplane mode is turned on");
}
@Test
diff --git a/tests/unit/src/com/android/settings/core/UniquePreferenceTest.java b/tests/unit/src/com/android/settings/core/UniquePreferenceTest.java
index aa1b55f..dd27591 100644
--- a/tests/unit/src/com/android/settings/core/UniquePreferenceTest.java
+++ b/tests/unit/src/com/android/settings/core/UniquePreferenceTest.java
@@ -90,7 +90,16 @@
"imei_info",
"wifi_ip_address",
"wifi_mac_address",
- "safety_info"
+ "safety_info",
+ // Dupe keys from data usage v2.
+ "data_usage_screen",
+ "cellular_data_usage",
+ "data_usage_wifi_screen",
+ "status_header",
+ "billing_preference",
+ "data_usage_cellular_screen",
+ "wifi_data_usage",
+ "data_usage_enable"
);
private Context mContext;