Merge "Import translations. DO NOT MERGE" into pi-dev
diff --git a/res/values/strings.xml b/res/values/strings.xml
index 72dc31f..39f641c 100644
--- a/res/values/strings.xml
+++ b/res/values/strings.xml
@@ -3786,8 +3786,8 @@
     <string name="disable_text">Disable</string>
     <!-- [CHAR LIMIT=25] Manage applications, individual application info screen, button label under Storage heading. Button to re-enable an existing application. -->
     <string name="enable_text">Enable</string>
-    <!-- Manage applications, individual application info screen, button label under Storage heading. Button to clear all data associated with tis app (for exampel, remove all cached emails for an Email app) -->
-    <string name="clear_user_data_text">Clear data</string>
+    <!-- Manage applications, individual application info screen, button label under Storage heading. Button to clear all data associated with tis app (for example, remove all cached emails for an Email app) -->
+    <string name="clear_user_data_text">Clear storage</string>
     <!-- Manage applications, restore updated system application to factory version -->
     <string name="app_factory_reset">Uninstall updates</string>
     <!-- Manage applications, individual application info screen, screen, message text under Launch by default heading. This is present if the app is set as a default for some actions. -->
@@ -3883,12 +3883,8 @@
     <string name="app_not_found_dlg_title"></string>
     <!-- Manage applications, individual application dialog box message. Shown when the user somehow got into a state where it wants to manage some app that isn't found. -->
     <string name="app_not_found_dlg_text"> The app wasn\u2019t found in the list of installed apps.</string>
-    <!-- Manage applications, individual application dialog box message. Shown when there was an error trying to clear the data. -->
-    <string name="clear_data_failed">Couldn\u2019t clear app data.</string>
-    <!-- Manage applications, title for dialog if clear data fails-->
-    <string name="clear_failed_dlg_title">Clear data</string>
     <!-- Manage applications, text for dialog if clear data fails-->
-    <string name="clear_failed_dlg_text">Couldn\u2019t clear data for app.</string>
+    <string name="clear_failed_dlg_text">Couldn\u2019t clear storage for app.</string>
     <!-- Manage applications, individual application info screen, text that appears under the "Permissions" heading. This describes the permissions that the application has. -->
     <string name="security_settings_desc" product="tablet">This app can access the following on your tablet:</string>
     <!-- Manage applications, individual application info screen, text that appears under the "Permissions" heading. This describes the permissions that the application has. -->
diff --git a/res/xml/accessibility_vibration_settings.xml b/res/xml/accessibility_vibration_settings.xml
index d24834a..2228f29 100644
--- a/res/xml/accessibility_vibration_settings.xml
+++ b/res/xml/accessibility_vibration_settings.xml
@@ -14,17 +14,21 @@
      limitations under the License.
 -->
 
-<PreferenceScreen xmlns:android="http://schemas.android.com/apk/res/android"
-        android:key="accessibility_settings_vibration_screen"
-        android:title="@string/accessibility_vibration_settings_title">
+<PreferenceScreen
+    xmlns:android="http://schemas.android.com/apk/res/android"
+    xmlns:app="http://schemas.android.com/apk/res-auto"
+    android:key="accessibility_settings_vibration_screen"
+    android:title="@string/accessibility_vibration_settings_title">
 
     <Preference
         android:fragment="com.android.settings.accessibility.NotificationVibrationPreferenceFragment"
         android:key="notification_vibration_preference_screen"
-        android:title="@string/accessibility_notification_vibration_title" />
+        android:title="@string/accessibility_notification_vibration_title"
+        app:controller="com.android.settings.accessibility.NotificationVibrationIntensityPreferenceController" />
 
     <Preference
         android:fragment="com.android.settings.accessibility.TouchVibrationPreferenceFragment"
         android:key="touch_vibration_preference_screen"
-        android:title="@string/accessibility_touch_vibration_title" />
+        android:title="@string/accessibility_touch_vibration_title"
+        app:controller="com.android.settings.accessibility.HapticFeedbackIntensityPreferenceController" />
 </PreferenceScreen>
diff --git a/res/xml/accounts_dashboard_settings.xml b/res/xml/accounts_dashboard_settings.xml
index 1e29d0a..6b5f825 100644
--- a/res/xml/accounts_dashboard_settings.xml
+++ b/res/xml/accounts_dashboard_settings.xml
@@ -23,6 +23,25 @@
 
     <PreferenceCategory
         android:key="dashboard_tile_placeholder"
-        android:order="200"/>
+        android:order="30"/>
+
+    <SwitchPreference
+        android:key="auto_sync_account_data"
+        android:title="@string/auto_sync_account_title"
+        android:summary="@string/auto_sync_account_summary"
+        android:order="102"
+        settings:allowDividerAbove="true"/>
+
+    <SwitchPreference
+        android:key="auto_sync_work_account_data"
+        android:title="@string/account_settings_menu_auto_sync_work"
+        android:summary="@string/auto_sync_account_summary"
+        android:order="103"/>
+
+    <SwitchPreference
+        android:key="auto_sync_personal_account_data"
+        android:title="@string/account_settings_menu_auto_sync_personal"
+        android:summary="@string/auto_sync_account_summary"
+        android:order="104"/>
 
 </PreferenceScreen>
diff --git a/res/xml/connected_devices.xml b/res/xml/connected_devices.xml
index 227dee2..9b84a43 100644
--- a/res/xml/connected_devices.xml
+++ b/res/xml/connected_devices.xml
@@ -28,13 +28,15 @@
         android:key="saved_device_list"
         android:title="@string/connected_device_saved_title"/>
 
-    <Preference
+    <com.android.settingslib.RestrictedPreference
         android:fragment="com.android.settings.bluetooth.BluetoothPairingDetail"
         android:key="add_bt_devices"
         android:title="@string/connected_device_add_device_title"
         android:icon="@drawable/ic_menu_add"
         android:summary="@string/connected_device_add_device_summary"
-        settings:allowDividerAbove="true"/>
+        settings:allowDividerAbove="true"
+        settings:userRestriction="no_config_bluetooth"
+        settings:useAdminDisabledSummary="true"/>
 
     <Preference
         android:fragment="com.android.settings.connecteddevice.AdvancedConnectedDeviceDashboardFragment"
diff --git a/res/xml/user_settings.xml b/res/xml/user_settings.xml
index 32b46d9..7fa735d 100644
--- a/res/xml/user_settings.xml
+++ b/res/xml/user_settings.xml
@@ -16,7 +16,6 @@
 
 <PreferenceScreen
     xmlns:android="http://schemas.android.com/apk/res/android"
-    xmlns:settings="http://schemas.android.com/apk/res-auto"
     android:key="user_settings_screen"
     android:title="@string/user_settings_title">
 
@@ -32,25 +31,6 @@
         android:icon="@drawable/ic_menu_add"
         android:order="20"/>
 
-    <SwitchPreference
-        android:key="auto_sync_account_data"
-        android:title="@string/auto_sync_account_title"
-        android:summary="@string/auto_sync_account_summary"
-        android:order="102"
-        settings:allowDividerAbove="true"/>
-
-    <SwitchPreference
-        android:key="auto_sync_work_account_data"
-        android:title="@string/account_settings_menu_auto_sync_work"
-        android:summary="@string/auto_sync_account_summary"
-        android:order="103"/>
-
-    <SwitchPreference
-        android:key="auto_sync_personal_account_data"
-        android:title="@string/account_settings_menu_auto_sync_personal"
-        android:summary="@string/auto_sync_account_summary"
-        android:order="104"/>
-
     <com.android.settingslib.RestrictedSwitchPreference
         android:key="user_settings_add_users_when_locked"
         android:title="@string/user_add_on_lockscreen_menu"
diff --git a/src/com/android/settings/accessibility/VibrationSettings.java b/src/com/android/settings/accessibility/VibrationSettings.java
index 4b19d93..83a5af6 100644
--- a/src/com/android/settings/accessibility/VibrationSettings.java
+++ b/src/com/android/settings/accessibility/VibrationSettings.java
@@ -23,8 +23,6 @@
 import com.android.settings.R;
 import com.android.settings.dashboard.DashboardFragment;
 import com.android.settings.search.BaseSearchIndexProvider;
-import com.android.settingslib.core.AbstractPreferenceController;
-import com.android.settingslib.core.lifecycle.Lifecycle;
 
 import java.util.ArrayList;
 import java.util.List;
@@ -51,28 +49,6 @@
         return TAG;
     }
 
-    @Override
-    protected List<AbstractPreferenceController> createPreferenceControllers(Context context) {
-        return buildControllers(context, getLifecycle());
-    }
-
-    public static List<AbstractPreferenceController> buildControllers(Context context,
-            Lifecycle lifecycle) {
-
-        final List<AbstractPreferenceController> controllers = new ArrayList<>();
-        final NotificationVibrationIntensityPreferenceController notifVibPrefController =
-                new NotificationVibrationIntensityPreferenceController(context);
-        final HapticFeedbackIntensityPreferenceController hapticPreferenceController =
-                new HapticFeedbackIntensityPreferenceController(context);
-        controllers.add(hapticPreferenceController);
-        controllers.add(notifVibPrefController);
-        if (lifecycle != null) {
-            lifecycle.addObserver(hapticPreferenceController);
-            lifecycle.addObserver(notifVibPrefController);
-        }
-        return controllers;
-    }
-
     public static final SearchIndexProvider SEARCH_INDEX_DATA_PROVIDER =
             new BaseSearchIndexProvider() {
                 @Override
@@ -84,11 +60,5 @@
                     indexables.add(indexable);
                     return indexables;
                 }
-
-                @Override
-                public List<AbstractPreferenceController> createPreferenceControllers(
-                        Context context) {
-                    return buildControllers(context, null /* lifecycle */);
-                }
             };
 }
diff --git a/src/com/android/settings/accounts/AccountDashboardFragment.java b/src/com/android/settings/accounts/AccountDashboardFragment.java
index cab5dab..b976940 100644
--- a/src/com/android/settings/accounts/AccountDashboardFragment.java
+++ b/src/com/android/settings/accounts/AccountDashboardFragment.java
@@ -29,6 +29,9 @@
 import com.android.settings.dashboard.DashboardFragment;
 import com.android.settings.dashboard.SummaryLoader;
 import com.android.settings.search.BaseSearchIndexProvider;
+import com.android.settings.users.AutoSyncDataPreferenceController;
+import com.android.settings.users.AutoSyncPersonalDataPreferenceController;
+import com.android.settings.users.AutoSyncWorkDataPreferenceController;
 import com.android.settingslib.accounts.AuthenticatorHelper;
 import com.android.settingslib.core.AbstractPreferenceController;
 
@@ -69,6 +72,9 @@
                 new AccountPreferenceController(context, this, authorities);
         getLifecycle().addObserver(accountPrefController);
         controllers.add(accountPrefController);
+        controllers.add(new AutoSyncDataPreferenceController(context, this /*parent */));
+        controllers.add(new AutoSyncPersonalDataPreferenceController(context, this /*parent */));
+        controllers.add(new AutoSyncWorkDataPreferenceController(context, this /* parent */));
         return controllers;
     }
 
diff --git a/src/com/android/settings/applications/AppStorageSettings.java b/src/com/android/settings/applications/AppStorageSettings.java
index ff036bb..7382d20 100644
--- a/src/com/android/settings/applications/AppStorageSettings.java
+++ b/src/com/android/settings/applications/AppStorageSettings.java
@@ -28,7 +28,6 @@
 import android.content.DialogInterface;
 import android.content.Intent;
 import android.content.Loader;
-import android.content.UriPermission;
 import android.content.pm.ApplicationInfo;
 import android.content.pm.IPackageDataObserver;
 import android.content.pm.PackageManager;
@@ -487,7 +486,7 @@
                         .create();
             case DLG_CANNOT_CLEAR_DATA:
                 return new AlertDialog.Builder(getActivity())
-                        .setTitle(getActivity().getText(R.string.clear_failed_dlg_title))
+                        .setTitle(getActivity().getText(R.string.clear_user_data_text))
                         .setMessage(getActivity().getText(R.string.clear_failed_dlg_text))
                         .setNeutralButton(R.string.dlg_ok, new DialogInterface.OnClickListener() {
                             public void onClick(DialogInterface dialog, int which) {
diff --git a/src/com/android/settings/core/BasePreferenceController.java b/src/com/android/settings/core/BasePreferenceController.java
index 9145c3c..391dafc 100644
--- a/src/com/android/settings/core/BasePreferenceController.java
+++ b/src/com/android/settings/core/BasePreferenceController.java
@@ -34,8 +34,6 @@
  * Abstract class to consolidate utility between preference controllers and act as an interface
  * for Slices. The abstract classes that inherit from this class will act as the direct interfaces
  * for each type when plugging into Slices.
- *
- * TODO (b/73074893) Add Lifecycle Setting method.
  */
 public abstract class BasePreferenceController extends AbstractPreferenceController {
 
diff --git a/src/com/android/settings/fuelgauge/RestrictAppPreferenceController.java b/src/com/android/settings/fuelgauge/RestrictAppPreferenceController.java
index 1433008..e41a94b 100644
--- a/src/com/android/settings/fuelgauge/RestrictAppPreferenceController.java
+++ b/src/com/android/settings/fuelgauge/RestrictAppPreferenceController.java
@@ -74,6 +74,7 @@
             final AppOpsManager.PackageOps packageOps = packageOpsList.get(i);
             mAppInfos.add(new AppInfo.Builder()
                     .setPackageName(packageOps.getPackageName())
+                    .setUid(packageOps.getUid())
                     .build());
         }
 
diff --git a/src/com/android/settings/fuelgauge/RestrictedAppDetails.java b/src/com/android/settings/fuelgauge/RestrictedAppDetails.java
index 0843c98..8881800 100644
--- a/src/com/android/settings/fuelgauge/RestrictedAppDetails.java
+++ b/src/com/android/settings/fuelgauge/RestrictedAppDetails.java
@@ -130,19 +130,15 @@
                         appInfo.packageName, 0 /* flags */);
                 checkBoxPreference.setChecked(true);
                 checkBoxPreference.setTitle(mPackageManager.getApplicationLabel(applicationInfo));
-                checkBoxPreference.setKey(appInfo.packageName);
                 checkBoxPreference.setIcon(
                         Utils.getBadgedIcon(mIconDrawableFactory, mPackageManager,
                                 appInfo.packageName,
-                                UserHandle.getUserId(
-                                        mBatteryUtils.getPackageUid(appInfo.packageName))));
+                                UserHandle.getUserId(appInfo.uid)));
                 checkBoxPreference.setOnPreferenceChangeListener((pref, value) -> {
                     // change the toggle
                     final int mode = (Boolean) value ? AppOpsManager.MODE_IGNORED
                             : AppOpsManager.MODE_ALLOWED;
-                    final String packageName = pref.getKey();
-                    final int uid = mBatteryUtils.getPackageUid(packageName);
-                    mBatteryUtils.setForceAppStandby(uid, packageName, mode);
+                    mBatteryUtils.setForceAppStandby(appInfo.uid, appInfo.packageName, mode);
                     return true;
                 });
                 mRestrictedAppListGroup.addPreference(checkBoxPreference);
diff --git a/src/com/android/settings/fuelgauge/batterytip/AnomalyDetectionJobService.java b/src/com/android/settings/fuelgauge/batterytip/AnomalyDetectionJobService.java
index ff71525..83a79bc 100644
--- a/src/com/android/settings/fuelgauge/batterytip/AnomalyDetectionJobService.java
+++ b/src/com/android/settings/fuelgauge/batterytip/AnomalyDetectionJobService.java
@@ -41,6 +41,7 @@
 import com.android.internal.os.BatteryStatsHelper;
 import com.android.settings.R;
 import com.android.settings.fuelgauge.BatteryUtils;
+import com.android.settingslib.fuelgauge.PowerWhitelistBackend;
 import com.android.settingslib.utils.ThreadUtils;
 
 import java.util.List;
@@ -81,11 +82,12 @@
             final BatteryStatsHelper batteryStatsHelper = new BatteryStatsHelper(this,
                     true /* collectBatteryBroadcast */);
             final UserManager userManager = getSystemService(UserManager.class);
+            final PowerWhitelistBackend powerWhitelistBackend = PowerWhitelistBackend.getInstance();
 
             for (JobWorkItem item = params.dequeueWork(); item != null;
                     item = params.dequeueWork()) {
                 saveAnomalyToDatabase(batteryStatsHelper, userManager, batteryDatabaseManager,
-                        batteryUtils, policy, contentResolver,
+                        batteryUtils, policy, powerWhitelistBackend, contentResolver,
                         item.getIntent().getExtras());
             }
             jobFinished(params, false /* wantsReschedule */);
@@ -102,7 +104,8 @@
     @VisibleForTesting
     void saveAnomalyToDatabase(BatteryStatsHelper batteryStatsHelper, UserManager userManager,
             BatteryDatabaseManager databaseManager, BatteryUtils batteryUtils,
-            BatteryTipPolicy policy, ContentResolver contentResolver, Bundle bundle) {
+            BatteryTipPolicy policy, PowerWhitelistBackend powerWhitelistBackend,
+            ContentResolver contentResolver, Bundle bundle) {
         // The Example of intentDimsValue is: 35:{1:{1:{1:10013|}|}|}
         final StatsDimensionsValue intentDimsValue =
                 bundle.getParcelable(StatsManager.EXTRA_STATS_DIMENSIONS_VALUE);
@@ -119,24 +122,25 @@
             final boolean smartBatteryOn = Settings.Global.getInt(contentResolver,
                     Settings.Global.APP_STANDBY_ENABLED, ON) == ON;
             final String packageName = batteryUtils.getPackageName(uid);
-
-            if (anomalyType == StatsManagerConfig.AnomalyType.EXCESSIVE_BG) {
-                // TODO(b/72385333): check battery percentage draining in batterystats
-                if (batteryUtils.isLegacyApp(packageName) && batteryUtils.isAppHeavilyUsed(
-                        batteryStatsHelper, userManager, uid,
-                        policy.excessiveBgDrainPercentage)) {
-                    Log.e(TAG, "Excessive detected uid=" + uid);
-                    batteryUtils.setForceAppStandby(uid, packageName,
-                            AppOpsManager.MODE_IGNORED);
+            if (!powerWhitelistBackend.isSysWhitelisted(packageName)) {
+                if (anomalyType == StatsManagerConfig.AnomalyType.EXCESSIVE_BG) {
+                    // TODO(b/72385333): check battery percentage draining in batterystats
+                    if (batteryUtils.isLegacyApp(packageName) && batteryUtils.isAppHeavilyUsed(
+                            batteryStatsHelper, userManager, uid,
+                            policy.excessiveBgDrainPercentage)) {
+                        Log.e(TAG, "Excessive detected uid=" + uid);
+                        batteryUtils.setForceAppStandby(uid, packageName,
+                                AppOpsManager.MODE_IGNORED);
+                        databaseManager.insertAnomaly(uid, packageName, anomalyType,
+                                smartBatteryOn
+                                        ? AnomalyDatabaseHelper.State.AUTO_HANDLED
+                                        : AnomalyDatabaseHelper.State.NEW,
+                                timeMs);
+                    }
+                } else {
                     databaseManager.insertAnomaly(uid, packageName, anomalyType,
-                            smartBatteryOn
-                                    ? AnomalyDatabaseHelper.State.AUTO_HANDLED
-                                    : AnomalyDatabaseHelper.State.NEW,
-                            timeMs);
+                            AnomalyDatabaseHelper.State.NEW, timeMs);
                 }
-            } else {
-                databaseManager.insertAnomaly(uid, packageName, anomalyType,
-                        AnomalyDatabaseHelper.State.NEW, timeMs);
             }
         } catch (NullPointerException | IndexOutOfBoundsException e) {
             Log.e(TAG, "Parse stats dimensions value error.", e);
diff --git a/src/com/android/settings/fuelgauge/batterytip/AppInfo.java b/src/com/android/settings/fuelgauge/batterytip/AppInfo.java
index 9557d9a..dc6ba25 100644
--- a/src/com/android/settings/fuelgauge/batterytip/AppInfo.java
+++ b/src/com/android/settings/fuelgauge/batterytip/AppInfo.java
@@ -19,6 +19,7 @@
 import android.os.Parcel;
 import android.os.Parcelable;
 import android.support.annotation.VisibleForTesting;
+import android.text.TextUtils;
 
 import com.android.settings.fuelgauge.anomaly.Anomaly;
 
@@ -74,6 +75,22 @@
                 + screenOnTimeMs;
     }
 
+    @Override
+    public boolean equals(Object obj) {
+        if (this == obj) {
+            return true;
+        }
+        if (!(obj instanceof AppInfo)) {
+            return false;
+        }
+
+        AppInfo other = (AppInfo) obj;
+        return anomalyType == other.anomalyType
+                && uid == other.uid
+                && screenOnTimeMs == other.screenOnTimeMs
+                && TextUtils.equals(packageName, other.packageName);
+    }
+
     public static final Parcelable.Creator CREATOR = new Parcelable.Creator() {
         public AppInfo createFromParcel(Parcel in) {
             return new AppInfo(in);
diff --git a/src/com/android/settings/fuelgauge/batterytip/BatteryDatabaseManager.java b/src/com/android/settings/fuelgauge/batterytip/BatteryDatabaseManager.java
index d0bddec..798c8c6 100644
--- a/src/com/android/settings/fuelgauge/batterytip/BatteryDatabaseManager.java
+++ b/src/com/android/settings/fuelgauge/batterytip/BatteryDatabaseManager.java
@@ -19,10 +19,10 @@
 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;
 import static com.android.settings.fuelgauge.batterytip.AnomalyDatabaseHelper.AnomalyColumns
+        .PACKAGE_NAME;
+import static com.android.settings.fuelgauge.batterytip.AnomalyDatabaseHelper.AnomalyColumns
         .TIME_STAMP_MS;
 import static com.android.settings.fuelgauge.batterytip.AnomalyDatabaseHelper.AnomalyColumns.UID;
 import static com.android.settings.fuelgauge.batterytip.AnomalyDatabaseHelper.Tables.TABLE_ANOMALY;
@@ -61,10 +61,11 @@
 
     /**
      * Insert an anomaly log to database.
-     * @param packageName   the package name of the app
-     * @param type          the type of the anomaly
-     * @param anomalyState  the state of the anomaly
-     * @param timestampMs   the time when it is happened
+     *
+     * @param packageName  the package name of the app
+     * @param type         the type of the anomaly
+     * @param anomalyState the state of the anomaly
+     * @param timestampMs  the time when it is happened
      */
     public synchronized void insertAnomaly(int uid, String packageName, int type, int anomalyState,
             long timestampMs) {
diff --git a/src/com/android/settings/fuelgauge/batterytip/HighUsageAdapter.java b/src/com/android/settings/fuelgauge/batterytip/HighUsageAdapter.java
index d982280..ec45c80f 100644
--- a/src/com/android/settings/fuelgauge/batterytip/HighUsageAdapter.java
+++ b/src/com/android/settings/fuelgauge/batterytip/HighUsageAdapter.java
@@ -76,7 +76,7 @@
         final AppInfo app = mHighUsageAppList.get(position);
         holder.appIcon.setImageDrawable(
                 Utils.getBadgedIcon(mIconDrawableFactory, mPackageManager, app.packageName,
-                        UserHandle.myUserId()));
+                        UserHandle.getUserId(app.uid)));
         holder.appName.setText(Utils.getApplicationLabel(mContext, app.packageName));
         if (app.screenOnTimeMs != 0) {
             holder.appTime.setText(StringUtil.formatElapsedTime(mContext, app.screenOnTimeMs, false));
diff --git a/src/com/android/settings/fuelgauge/batterytip/detectors/HighUsageDetector.java b/src/com/android/settings/fuelgauge/batterytip/detectors/HighUsageDetector.java
index ed3fa04..fd150e4 100644
--- a/src/com/android/settings/fuelgauge/batterytip/detectors/HighUsageDetector.java
+++ b/src/com/android/settings/fuelgauge/batterytip/detectors/HighUsageDetector.java
@@ -73,6 +73,7 @@
                                 BatteryUtils.StatusType.FOREGROUND, batterySipper.uidObj,
                                 BatteryStats.STATS_SINCE_CHARGED);
                         mHighUsageAppList.add(new AppInfo.Builder()
+                                .setUid(batterySipper.getUid())
                                 .setPackageName(
                                         mBatteryUtils.getPackageName(batterySipper.getUid()))
                                 .setScreenOnTimeMs(foregroundTimeMs)
diff --git a/src/com/android/settings/users/UserSettings.java b/src/com/android/settings/users/UserSettings.java
index 4ca7e63..bc02b30 100644
--- a/src/com/android/settings/users/UserSettings.java
+++ b/src/com/android/settings/users/UserSettings.java
@@ -148,9 +148,6 @@
 
     private EditUserInfoController mEditUserInfoController = new EditUserInfoController();
     private AddUserWhenLockedPreferenceController mAddUserWhenLockedPreferenceController;
-    private AutoSyncDataPreferenceController mAutoSyncDataPreferenceController;
-    private AutoSyncPersonalDataPreferenceController mAutoSyncPersonalDataPreferenceController;
-    private AutoSyncWorkDataPreferenceController mAutoSyncWorkDataPreferenceController;
 
     // A place to cache the generated default avatar
     private Drawable mDefaultIconDrawable;
@@ -159,15 +156,15 @@
         @Override
         public void handleMessage(Message msg) {
             switch (msg.what) {
-            case MESSAGE_UPDATE_LIST:
-                updateUserList();
-                break;
-            case MESSAGE_SETUP_USER:
-                onUserCreated(msg.arg1);
-                break;
-            case MESSAGE_CONFIG_USER:
-                onManageUserClicked(msg.arg1, true);
-                break;
+                case MESSAGE_UPDATE_LIST:
+                    updateUserList();
+                    break;
+                case MESSAGE_SETUP_USER:
+                    onUserCreated(msg.arg1);
+                    break;
+                case MESSAGE_CONFIG_USER:
+                    onManageUserClicked(msg.arg1, true);
+                    break;
             }
         }
     };
@@ -203,17 +200,9 @@
         final Context context = getActivity();
         mAddUserWhenLockedPreferenceController = new AddUserWhenLockedPreferenceController(
                 context, KEY_ADD_USER_WHEN_LOCKED, getLifecycle());
-        mAutoSyncDataPreferenceController = new AutoSyncDataPreferenceController(context, this);
-        mAutoSyncPersonalDataPreferenceController =
-                new AutoSyncPersonalDataPreferenceController(context, this);
-        mAutoSyncWorkDataPreferenceController =
-                new AutoSyncWorkDataPreferenceController(context, this);
-
         final PreferenceScreen screen = getPreferenceScreen();
         mAddUserWhenLockedPreferenceController.displayPreference(screen);
-        mAutoSyncDataPreferenceController.displayPreference(screen);
-        mAutoSyncPersonalDataPreferenceController.displayPreference(screen);
-        mAutoSyncWorkDataPreferenceController.displayPreference(screen);
+
         screen.findPreference(mAddUserWhenLockedPreferenceController.getPreferenceKey())
                 .setOnPreferenceChangeListener(mAddUserWhenLockedPreferenceController);
 
@@ -274,22 +263,10 @@
         }
         final PreferenceScreen screen = getPreferenceScreen();
 
-        if (mAutoSyncDataPreferenceController.isAvailable()) {
-            mAutoSyncDataPreferenceController.updateState(screen.findPreference(
-                    mAutoSyncDataPreferenceController.getPreferenceKey()));
-        }
         if (mAddUserWhenLockedPreferenceController.isAvailable()) {
             mAddUserWhenLockedPreferenceController.updateState(screen.findPreference(
                     mAddUserWhenLockedPreferenceController.getPreferenceKey()));
         }
-        if (mAutoSyncPersonalDataPreferenceController.isAvailable()) {
-            mAutoSyncPersonalDataPreferenceController.updateState(screen.findPreference(
-                    mAutoSyncPersonalDataPreferenceController.getPreferenceKey()));
-        }
-        if (mAutoSyncWorkDataPreferenceController.isAvailable()) {
-            mAutoSyncWorkDataPreferenceController.updateState(screen.findPreference(
-                    mAutoSyncWorkDataPreferenceController.getPreferenceKey()));
-        }
 
         if (mShouldUpdateUserList) {
             mUserCaps.updateAddUserCapabilities(getActivity());
@@ -330,20 +307,6 @@
     }
 
     @Override
-    public boolean onPreferenceTreeClick(Preference preference) {
-        if (mAutoSyncDataPreferenceController.handlePreferenceTreeClick(preference)) {
-            return true;
-        }
-        if (mAutoSyncPersonalDataPreferenceController.handlePreferenceTreeClick(preference)) {
-            return true;
-        }
-        if (mAutoSyncWorkDataPreferenceController.handlePreferenceTreeClick(preference)) {
-            return true;
-        }
-        return super.onPreferenceTreeClick(preference);
-    }
-
-    @Override
     public void onCreateOptionsMenu(Menu menu, MenuInflater inflater) {
         int pos = 0;
         UserManager um = getContext().getSystemService(UserManager.class);
@@ -438,16 +401,16 @@
         synchronized (mUserLock) {
             if (mRemovingUserId == -1 && !mAddingUser) {
                 switch (userType) {
-                case USER_TYPE_USER:
-                    showDialog(DIALOG_ADD_USER);
-                    break;
-                case USER_TYPE_RESTRICTED_PROFILE:
-                    if (hasLockscreenSecurity()) {
-                        addUserNow(USER_TYPE_RESTRICTED_PROFILE);
-                    } else {
-                        showDialog(DIALOG_NEED_LOCKSCREEN);
-                    }
-                    break;
+                    case USER_TYPE_USER:
+                        showDialog(DIALOG_ADD_USER);
+                        break;
+                    case USER_TYPE_RESTRICTED_PROFILE:
+                        if (hasLockscreenSecurity()) {
+                            addUserNow(USER_TYPE_RESTRICTED_PROFILE);
+                        } else {
+                            showDialog(DIALOG_NEED_LOCKSCREEN);
+                        }
+                        break;
                 }
             }
         }
@@ -556,9 +519,9 @@
             }
             case DIALOG_USER_CANNOT_MANAGE:
                 return new AlertDialog.Builder(context)
-                    .setMessage(R.string.user_cannot_manage_message)
-                    .setPositiveButton(android.R.string.ok, null)
-                    .create();
+                        .setMessage(R.string.user_cannot_manage_message)
+                        .setPositiveButton(android.R.string.ok, null)
+                        .create();
             case DIALOG_ADD_USER: {
                 final SharedPreferences preferences = getActivity().getPreferences(
                         Context.MODE_PRIVATE);
@@ -570,55 +533,56 @@
                 final int userType = dialogId == DIALOG_ADD_USER
                         ? USER_TYPE_USER : USER_TYPE_RESTRICTED_PROFILE;
                 Dialog dlg = new AlertDialog.Builder(context)
-                    .setTitle(R.string.user_add_user_title)
-                    .setMessage(messageResId)
-                    .setPositiveButton(android.R.string.ok,
-                        new DialogInterface.OnClickListener() {
-                            public void onClick(DialogInterface dialog, int which) {
-                                addUserNow(userType);
-                                if (!longMessageDisplayed) {
-                                    preferences.edit().putBoolean(
-                                            KEY_ADD_USER_LONG_MESSAGE_DISPLAYED, true).apply();
-                                }
-                            }
-                    })
-                    .setNegativeButton(android.R.string.cancel, null)
-                    .create();
+                        .setTitle(R.string.user_add_user_title)
+                        .setMessage(messageResId)
+                        .setPositiveButton(android.R.string.ok,
+                                new DialogInterface.OnClickListener() {
+                                    public void onClick(DialogInterface dialog, int which) {
+                                        addUserNow(userType);
+                                        if (!longMessageDisplayed) {
+                                            preferences.edit().putBoolean(
+                                                    KEY_ADD_USER_LONG_MESSAGE_DISPLAYED,
+                                                    true).apply();
+                                        }
+                                    }
+                                })
+                        .setNegativeButton(android.R.string.cancel, null)
+                        .create();
                 return dlg;
             }
             case DIALOG_SETUP_USER: {
                 Dialog dlg = new AlertDialog.Builder(context)
-                    .setTitle(R.string.user_setup_dialog_title)
-                    .setMessage(R.string.user_setup_dialog_message)
-                    .setPositiveButton(R.string.user_setup_button_setup_now,
-                        new DialogInterface.OnClickListener() {
-                            public void onClick(DialogInterface dialog, int which) {
-                                switchUserNow(mAddedUserId);
-                            }
-                    })
-                    .setNegativeButton(R.string.user_setup_button_setup_later, null)
-                    .create();
+                        .setTitle(R.string.user_setup_dialog_title)
+                        .setMessage(R.string.user_setup_dialog_message)
+                        .setPositiveButton(R.string.user_setup_button_setup_now,
+                                new DialogInterface.OnClickListener() {
+                                    public void onClick(DialogInterface dialog, int which) {
+                                        switchUserNow(mAddedUserId);
+                                    }
+                                })
+                        .setNegativeButton(R.string.user_setup_button_setup_later, null)
+                        .create();
                 return dlg;
             }
             case DIALOG_SETUP_PROFILE: {
                 Dialog dlg = new AlertDialog.Builder(context)
-                    .setMessage(R.string.user_setup_profile_dialog_message)
-                    .setPositiveButton(android.R.string.ok,
-                        new DialogInterface.OnClickListener() {
-                            public void onClick(DialogInterface dialog, int which) {
-                                switchUserNow(mAddedUserId);
-                            }
-                    })
-                    .setNegativeButton(android.R.string.cancel, null)
-                    .create();
+                        .setMessage(R.string.user_setup_profile_dialog_message)
+                        .setPositiveButton(android.R.string.ok,
+                                new DialogInterface.OnClickListener() {
+                                    public void onClick(DialogInterface dialog, int which) {
+                                        switchUserNow(mAddedUserId);
+                                    }
+                                })
+                        .setNegativeButton(android.R.string.cancel, null)
+                        .create();
                 return dlg;
             }
             case DIALOG_CHOOSE_USER_TYPE: {
-                List<HashMap<String, String>> data = new ArrayList<HashMap<String,String>>();
-                HashMap<String,String> addUserItem = new HashMap<String,String>();
+                List<HashMap<String, String>> data = new ArrayList<HashMap<String, String>>();
+                HashMap<String, String> addUserItem = new HashMap<String, String>();
                 addUserItem.put(KEY_TITLE, getString(R.string.user_add_user_item_title));
                 addUserItem.put(KEY_SUMMARY, getString(R.string.user_add_user_item_summary));
-                HashMap<String,String> addProfileItem = new HashMap<String,String>();
+                HashMap<String, String> addProfileItem = new HashMap<String, String>();
                 addProfileItem.put(KEY_TITLE, getString(R.string.user_add_profile_item_title));
                 addProfileItem.put(KEY_SUMMARY, getString(R.string.user_add_profile_item_summary));
                 data.add(addUserItem);
@@ -891,7 +855,7 @@
             // Add a virtual Guest user for guest defaults
             UserPreference pref = new UserPreference(getPrefContext(), null,
                     UserPreference.USERID_GUEST_DEFAULTS,
-                    mUserCaps.mIsAdmin && voiceCapable? this : null /* settings icon handler */,
+                    mUserCaps.mIsAdmin && voiceCapable ? this : null /* settings icon handler */,
                     null /* delete icon handler */);
             pref.setTitle(R.string.user_guest);
             pref.setIcon(getEncircledDefaultIcon());
@@ -1061,20 +1025,20 @@
         if (v.getTag() instanceof UserPreference) {
             int userId = ((UserPreference) v.getTag()).getUserId();
             switch (v.getId()) {
-            case UserPreference.DELETE_ID:
-                final EnforcedAdmin removeDisallowedAdmin =
-                        RestrictedLockUtils.checkIfRestrictionEnforced(getContext(),
-                                UserManager.DISALLOW_REMOVE_USER, UserHandle.myUserId());
-                if (removeDisallowedAdmin != null) {
-                    RestrictedLockUtils.sendShowAdminSupportDetailsIntent(getContext(),
-                            removeDisallowedAdmin);
-                } else {
-                    onRemoveUserClicked(userId);
-                }
-                break;
-            case UserPreference.SETTINGS_ID:
-                onManageUserClicked(userId, false);
-                break;
+                case UserPreference.DELETE_ID:
+                    final EnforcedAdmin removeDisallowedAdmin =
+                            RestrictedLockUtils.checkIfRestrictionEnforced(getContext(),
+                                    UserManager.DISALLOW_REMOVE_USER, UserHandle.myUserId());
+                    if (removeDisallowedAdmin != null) {
+                        RestrictedLockUtils.sendShowAdminSupportDetailsIntent(getContext(),
+                                removeDisallowedAdmin);
+                    } else {
+                        onRemoveUserClicked(userId);
+                    }
+                    break;
+                case UserPreference.SETTINGS_ID:
+                    onManageUserClicked(userId, false);
+                    break;
             }
         }
     }
@@ -1106,8 +1070,9 @@
      * Returns a default user icon (as a {@link Bitmap}) for the given user.
      *
      * Note that for guest users, you should pass in {@code UserHandle.USER_NULL}.
+     *
      * @param resources resources object to fetch the user icon.
-     * @param userId the user id or {@code UserHandle.USER_NULL} for a non-user specific icon
+     * @param userId    the user id or {@code UserHandle.USER_NULL} for a non-user specific icon
      */
     private static Bitmap getDefaultUserIconAsBitmap(Resources resources, int userId) {
         Bitmap bitmap = null;
@@ -1124,6 +1089,7 @@
 
     /**
      * Assign the default photo to user with {@paramref userId}
+     *
      * @param context used to get the {@link UserManager}
      * @param userId  used to get the icon bitmap
      * @return true if assign photo successfully, false if failed
@@ -1160,7 +1126,8 @@
         um.setUserIcon(userId, icon);
         try {
             avatarDataStream.close();
-        } catch (IOException ioe) { }
+        } catch (IOException ioe) {
+        }
     }
 
     private static class SummaryProvider implements SummaryLoader.SummaryProvider {
@@ -1177,9 +1144,9 @@
         public void setListening(boolean listening) {
             if (listening) {
                 UserInfo info = mContext.getSystemService(UserManager.class).getUserInfo(
-                    UserHandle.myUserId());
+                        UserHandle.myUserId());
                 mSummaryLoader.setSummary(this, mContext.getString(R.string.users_summary,
-                    info.name));
+                        info.name));
             }
         }
     }
diff --git a/tests/robotests/src/com/android/settings/fuelgauge/RestrictedAppDetailsTest.java b/tests/robotests/src/com/android/settings/fuelgauge/RestrictedAppDetailsTest.java
index da4b40a..261acad 100644
--- a/tests/robotests/src/com/android/settings/fuelgauge/RestrictedAppDetailsTest.java
+++ b/tests/robotests/src/com/android/settings/fuelgauge/RestrictedAppDetailsTest.java
@@ -54,6 +54,7 @@
 public class RestrictedAppDetailsTest {
 
     private static final String PACKAGE_NAME = "com.android.app";
+    private static final int UID = 234;
     private static final String APP_NAME = "app";
 
     @Mock
@@ -70,60 +71,62 @@
     private InstrumentedPreferenceFragment mFragment;
     private RestrictedAppDetails mRestrictedAppDetails;
     private Context mContext;
+    private AppInfo mAppInfo;
     private Intent mIntent;
 
     @Before
     public void setUp() {
-      MockitoAnnotations.initMocks(this);
+        MockitoAnnotations.initMocks(this);
 
-      mContext = spy(RuntimeEnvironment.application);
-      mRestrictedAppDetails = spy(new RestrictedAppDetails());
+        mContext = spy(RuntimeEnvironment.application);
+        mRestrictedAppDetails = spy(new RestrictedAppDetails());
+        mAppInfo = new AppInfo.Builder()
+                .setPackageName(PACKAGE_NAME)
+                .setUid(UID)
+                .build();
 
-      when(mRestrictedAppDetails.getPreferenceManager()).thenReturn(mPreferenceManager);
-      when(mPreferenceManager.getContext()).thenReturn(mContext);
-      mRestrictedAppDetails.mPackageManager = mPackageManager;
-      mRestrictedAppDetails.mIconDrawableFactory = mIconDrawableFactory;
-      mRestrictedAppDetails.mAppInfos = new ArrayList<>();
-      mRestrictedAppDetails.mAppInfos.add(new AppInfo.Builder()
-          .setPackageName(PACKAGE_NAME)
-          .build());
-      mRestrictedAppDetails.mRestrictedAppListGroup = spy(new PreferenceCategory(mContext));
-      mRestrictedAppDetails.mBatteryUtils = new BatteryUtils(mContext);
-      when(mRestrictedAppDetails.mRestrictedAppListGroup.getPreferenceManager())
-          .thenReturn(mPreferenceManager);
+        doReturn(mPreferenceManager).when(mRestrictedAppDetails).getPreferenceManager();
+        doReturn(mContext).when(mPreferenceManager).getContext();
+        mRestrictedAppDetails.mPackageManager = mPackageManager;
+        mRestrictedAppDetails.mIconDrawableFactory = mIconDrawableFactory;
+        mRestrictedAppDetails.mAppInfos = new ArrayList<>();
+        mRestrictedAppDetails.mAppInfos.add(mAppInfo);
+        mRestrictedAppDetails.mRestrictedAppListGroup = spy(new PreferenceCategory(mContext));
+        mRestrictedAppDetails.mBatteryUtils = new BatteryUtils(mContext);
+        doReturn(mPreferenceManager).when(
+                mRestrictedAppDetails.mRestrictedAppListGroup).getPreferenceManager();
     }
 
     @Test
     public void testRefreshUi_displayPreference() throws Exception {
-      doReturn(mApplicationInfo).when(mPackageManager).getApplicationInfo(PACKAGE_NAME, 0);
-      doReturn(APP_NAME).when(mPackageManager).getApplicationLabel(mApplicationInfo);
+        doReturn(mApplicationInfo).when(mPackageManager).getApplicationInfo(PACKAGE_NAME, 0);
+        doReturn(APP_NAME).when(mPackageManager).getApplicationLabel(mApplicationInfo);
 
-      mRestrictedAppDetails.refreshUi();
+        mRestrictedAppDetails.refreshUi();
 
-      assertThat(mRestrictedAppDetails.mRestrictedAppListGroup.getPreferenceCount()).isEqualTo(1);
-      final Preference preference = mRestrictedAppDetails.mRestrictedAppListGroup.getPreference(0);
-      assertThat(preference.getKey()).isEqualTo(PACKAGE_NAME);
-      assertThat(preference.getTitle()).isEqualTo(APP_NAME);
+        assertThat(mRestrictedAppDetails.mRestrictedAppListGroup.getPreferenceCount()).isEqualTo(1);
+        final Preference preference = mRestrictedAppDetails.mRestrictedAppListGroup.getPreference(
+                0);
+        assertThat(preference.getTitle()).isEqualTo(APP_NAME);
     }
 
     @Test
     public void testStartRestrictedAppDetails_startWithCorrectData() {
-      final ArgumentCaptor<Intent> captor = ArgumentCaptor.forClass(Intent.class);
-      doAnswer(invocation -> {
-        // Get the intent in which it has the app info bundle
-        mIntent = captor.getValue();
-        return true;
-      }).when(mSettingsActivity).startActivity(captor.capture());
+        final ArgumentCaptor<Intent> captor = ArgumentCaptor.forClass(Intent.class);
+        doAnswer(invocation -> {
+            // Get the intent in which it has the app info bundle
+            mIntent = captor.getValue();
+            return true;
+        }).when(mSettingsActivity).startActivity(captor.capture());
 
-      RestrictedAppDetails.
-          startRestrictedAppDetails(mSettingsActivity, mFragment, mRestrictedAppDetails.mAppInfos);
+        RestrictedAppDetails.startRestrictedAppDetails(mSettingsActivity, mFragment,
+                mRestrictedAppDetails.mAppInfos);
 
-      final Bundle bundle = mIntent.getBundleExtra(SettingsActivity.EXTRA_SHOW_FRAGMENT_ARGUMENTS);
-      // Verify the bundle has the correct info
-      final List<AppInfo> appInfos =
-          bundle.getParcelableArrayList(RestrictedAppDetails.EXTRA_APP_INFO_LIST);
-      assertThat(appInfos).isNotNull();
-      assertThat(appInfos).hasSize(1);
-      assertThat(appInfos.get(0).packageName).isEqualTo(PACKAGE_NAME);
+        final Bundle bundle = mIntent.getBundleExtra(
+                SettingsActivity.EXTRA_SHOW_FRAGMENT_ARGUMENTS);
+        // Verify the bundle has the correct info
+        final List<AppInfo> appInfos = bundle.getParcelableArrayList(
+                RestrictedAppDetails.EXTRA_APP_INFO_LIST);
+        assertThat(appInfos).containsExactly(mAppInfo);
     }
 }
diff --git a/tests/robotests/src/com/android/settings/fuelgauge/batterytip/AnomalyDetectionJobServiceTest.java b/tests/robotests/src/com/android/settings/fuelgauge/batterytip/AnomalyDetectionJobServiceTest.java
index 77e51b1..aa3d5a8 100644
--- a/tests/robotests/src/com/android/settings/fuelgauge/batterytip/AnomalyDetectionJobServiceTest.java
+++ b/tests/robotests/src/com/android/settings/fuelgauge/batterytip/AnomalyDetectionJobServiceTest.java
@@ -17,17 +17,36 @@
 package com.android.settings.fuelgauge.batterytip;
 
 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.anyString;
+import static org.mockito.Mockito.doReturn;
+import static org.mockito.Mockito.never;
+import static org.mockito.Mockito.verify;
 import static org.robolectric.RuntimeEnvironment.application;
 
+import android.app.StatsManager;
 import android.app.job.JobInfo;
 import android.app.job.JobScheduler;
+import android.content.Context;
 import android.content.Intent;
+import android.os.Bundle;
+import android.os.StatsDimensionsValue;
+import android.os.UserManager;
 
+import com.android.internal.os.BatteryStatsHelper;
 import com.android.settings.R;
+import com.android.settings.fuelgauge.BatteryUtils;
 import com.android.settings.testutils.SettingsRobolectricTestRunner;
+import com.android.settingslib.fuelgauge.PowerWhitelistBackend;
 
+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.Shadows;
 import org.robolectric.shadows.ShadowJobScheduler;
 
@@ -36,6 +55,37 @@
 
 @RunWith(SettingsRobolectricTestRunner.class)
 public class AnomalyDetectionJobServiceTest {
+    private static final int UID = 123;
+    private static final String SYSTEM_PACKAGE = "com.android.system";
+    @Mock
+    private BatteryStatsHelper mBatteryStatsHelper;
+    @Mock
+    private UserManager mUserManager;
+    @Mock
+    private BatteryDatabaseManager mBatteryDatabaseManager;
+    @Mock
+    private BatteryUtils mBatteryUtils;
+    @Mock
+    private PowerWhitelistBackend mPowerWhitelistBackend;
+    @Mock
+    private StatsDimensionsValue mStatsDimensionsValue;
+
+    private BatteryTipPolicy mPolicy;
+    private Bundle mBundle;
+    private AnomalyDetectionJobService mAnomalyDetectionJobService;
+    private Context mContext;
+
+    @Before
+    public void setUp() {
+        MockitoAnnotations.initMocks(this);
+
+        mContext = RuntimeEnvironment.application;
+        mPolicy = new BatteryTipPolicy(mContext);
+        mBundle = new Bundle();
+        mBundle.putParcelable(StatsManager.EXTRA_STATS_DIMENSIONS_VALUE, mStatsDimensionsValue);
+
+        mAnomalyDetectionJobService = new AnomalyDetectionJobService();
+    }
 
     @Test
     public void testScheduleCleanUp() {
@@ -50,4 +100,30 @@
         assertThat(pendingJob.getMaxExecutionDelayMillis())
             .isEqualTo(TimeUnit.MINUTES.toMillis(30));
     }
+
+    @Test
+    public void testSaveAnomalyToDatabase_systemWhitelisted_doNotSave() {
+        doReturn(SYSTEM_PACKAGE).when(mBatteryUtils).getPackageName(anyInt());
+        doReturn(true).when(mPowerWhitelistBackend).isSysWhitelisted(SYSTEM_PACKAGE);
+
+        mAnomalyDetectionJobService.saveAnomalyToDatabase(mBatteryStatsHelper, mUserManager,
+                mBatteryDatabaseManager, mBatteryUtils, mPolicy, mPowerWhitelistBackend,
+                mContext.getContentResolver(), mBundle);
+
+        verify(mBatteryDatabaseManager, never()).insertAnomaly(anyInt(), anyString(), anyInt(),
+                anyInt(), anyLong());
+    }
+
+    @Test
+    public void testSaveAnomalyToDatabase_normalApp_save() {
+        doReturn(SYSTEM_PACKAGE).when(mBatteryUtils).getPackageName(anyInt());
+        doReturn(false).when(mPowerWhitelistBackend).isSysWhitelisted(SYSTEM_PACKAGE);
+
+        mAnomalyDetectionJobService.saveAnomalyToDatabase(mBatteryStatsHelper, mUserManager,
+                mBatteryDatabaseManager, mBatteryUtils, mPolicy, mPowerWhitelistBackend,
+                mContext.getContentResolver(), mBundle);
+
+        verify(mBatteryDatabaseManager).insertAnomaly(anyInt(), anyString(), anyInt(), anyInt(),
+                anyLong());
+    }
 }
diff --git a/tests/robotests/src/com/android/settings/fuelgauge/batterytip/detectors/HighUsageDetectorTest.java b/tests/robotests/src/com/android/settings/fuelgauge/batterytip/detectors/HighUsageDetectorTest.java
index 7dbad7a..14627c5 100644
--- a/tests/robotests/src/com/android/settings/fuelgauge/batterytip/detectors/HighUsageDetectorTest.java
+++ b/tests/robotests/src/com/android/settings/fuelgauge/batterytip/detectors/HighUsageDetectorTest.java
@@ -29,8 +29,10 @@
 import com.android.internal.os.BatterySipper;
 import com.android.internal.os.BatteryStatsHelper;
 import com.android.settings.fuelgauge.BatteryUtils;
+import com.android.settings.fuelgauge.batterytip.AppInfo;
 import com.android.settings.fuelgauge.batterytip.BatteryTipPolicy;
 import com.android.settings.fuelgauge.batterytip.HighUsageDataParser;
+import com.android.settings.fuelgauge.batterytip.tips.HighUsageTip;
 import com.android.settings.testutils.SettingsRobolectricTestRunner;
 
 import org.junit.Before;
@@ -46,7 +48,8 @@
 
 @RunWith(SettingsRobolectricTestRunner.class)
 public class HighUsageDetectorTest {
-
+    private static final int UID = 123;
+    private static final long SCREEN_ON_TIME_MS = DateUtils.HOUR_IN_MILLIS;
     private Context mContext;
     @Mock
     private BatteryStatsHelper mBatteryStatsHelper;
@@ -57,6 +60,7 @@
     @Mock
     private HighUsageDataParser mDataParser;
 
+    private AppInfo mAppInfo;
     private BatteryTipPolicy mPolicy;
     private HighUsageDetector mHighUsageDetector;
     private List<BatterySipper> mUsageList;
@@ -71,6 +75,11 @@
         mHighUsageDetector.mBatteryUtils = mBatteryUtils;
         mHighUsageDetector.mDataParser = mDataParser;
         doNothing().when(mHighUsageDetector).parseBatteryData();
+        doReturn(UID).when(mBatterySipper).getUid();
+        mAppInfo = new AppInfo.Builder()
+                .setUid(UID)
+                .setScreenOnTimeMs(SCREEN_ON_TIME_MS)
+                .build();
 
         mUsageList = new ArrayList<>();
         mUsageList.add(mBatterySipper);
@@ -87,10 +96,12 @@
     public void testDetect_containsHighUsageApp_tipVisible() {
         doReturn(true).when(mDataParser).isDeviceHeavilyUsed();
         when(mBatteryStatsHelper.getUsageList()).thenReturn(mUsageList);
-        doReturn(DateUtils.HOUR_IN_MILLIS).when(mBatteryUtils).getProcessTimeMs(
+        doReturn(SCREEN_ON_TIME_MS).when(mBatteryUtils).getProcessTimeMs(
                 BatteryUtils.StatusType.FOREGROUND, mBatterySipper.uidObj,
                 BatteryStats.STATS_SINCE_CHARGED);
 
-        assertThat(mHighUsageDetector.detect().isVisible()).isTrue();
+        final HighUsageTip highUsageTip = (HighUsageTip) mHighUsageDetector.detect();
+        assertThat(highUsageTip.isVisible()).isTrue();
+        assertThat(highUsageTip.getHighUsageAppList()).containsExactly(mAppInfo);
     }
 }
diff --git a/tests/robotests/src/com/android/settings/slices/SliceControllerInXmlTest.java b/tests/robotests/src/com/android/settings/slices/SliceControllerInXmlTest.java
index bf979c6..7de9c2b 100644
--- a/tests/robotests/src/com/android/settings/slices/SliceControllerInXmlTest.java
+++ b/tests/robotests/src/com/android/settings/slices/SliceControllerInXmlTest.java
@@ -16,16 +16,17 @@
 
 package com.android.settings.slices;
 
+import static com.android.settings.core.PreferenceXmlParserUtils.METADATA_CONTROLLER;
+import static com.google.common.truth.Truth.assertThat;
 import static com.google.common.truth.Truth.assertWithMessage;
 import static org.mockito.Mockito.spy;
 
 import android.content.Context;
-import android.content.res.XmlResourceParser;
+import android.os.Bundle;
 import android.provider.SearchIndexableResource;
 import android.text.TextUtils;
-import android.util.AttributeSet;
-import android.util.Xml;
 
+import com.android.settings.core.PreferenceXmlParserUtils;
 import com.android.settings.core.TogglePreferenceController;
 import com.android.settings.core.codeinspection.ClassScanner;
 import com.android.settings.core.codeinspection.CodeInspector;
@@ -34,7 +35,6 @@
 import com.android.settings.search.Indexable;
 import com.android.settings.search.SearchFeatureProvider;
 import com.android.settings.search.SearchFeatureProviderImpl;
-import com.android.settings.core.PreferenceXmlParserUtils;
 import com.android.settings.testutils.FakeFeatureFactory;
 import com.android.settings.testutils.SettingsRobolectricTestRunner;
 
@@ -42,8 +42,9 @@
 import org.junit.Test;
 import org.junit.runner.RunWith;
 import org.robolectric.RuntimeEnvironment;
-import org.xmlpull.v1.XmlPullParser;
+import org.xmlpull.v1.XmlPullParserException;
 
+import java.io.IOException;
 import java.util.ArrayList;
 import java.util.Collection;
 import java.util.Collections;
@@ -53,7 +54,7 @@
 public class SliceControllerInXmlTest {
 
     private static final List<Class> mSliceControllerClasses = Collections.singletonList(
-        TogglePreferenceController.class
+            TogglePreferenceController.class
     );
 
     private final List<String> mXmlDeclaredControllers = new ArrayList<>();
@@ -71,7 +72,7 @@
     private FakeFeatureFactory mFakeFeatureFactory;
 
     @Before
-    public void setUp() {
+    public void setUp() throws IOException, XmlPullParserException {
         mContext = spy(RuntimeEnvironment.application);
 
         mSearchProvider = new SearchFeatureProviderImpl();
@@ -83,44 +84,28 @@
         initDeclaredControllers();
     }
 
-    private void initDeclaredControllers() {
+    private void initDeclaredControllers() throws IOException, XmlPullParserException {
         final List<Integer> xmlResources = getIndexableXml();
-        XmlResourceParser parser;
-
         for (int xmlResId : xmlResources) {
-            try {
-                parser = mContext.getResources().getXml(xmlResId);
-
-                int type;
-                while ((type = parser.next()) != XmlPullParser.END_DOCUMENT
-                        && type != XmlPullParser.START_TAG) {
-                    // Parse next until start tag is found
+            final List<Bundle> metadata = PreferenceXmlParserUtils.extractMetadata(mContext,
+                    xmlResId, PreferenceXmlParserUtils.MetadataFlag.FLAG_NEED_PREF_CONTROLLER);
+            for (Bundle bundle : metadata) {
+                final String controllerClassName = bundle.getString(METADATA_CONTROLLER);
+                if (TextUtils.isEmpty(controllerClassName)) {
+                    continue;
                 }
-
-                final int outerDepth = parser.getDepth();
-                final AttributeSet attrs = Xml.asAttributeSet(parser);
-                String controllerClassName;
-                while ((type = parser.next()) != XmlPullParser.END_DOCUMENT
-                        && (type != XmlPullParser.END_TAG || parser.getDepth() > outerDepth)) {
-                    if (type == XmlPullParser.END_TAG || type == XmlPullParser.TEXT) {
-                        continue;
-                    }
-                    controllerClassName = PreferenceXmlParserUtils.getController(mContext, attrs);
-
-                    if (!TextUtils.isEmpty(controllerClassName)) {
-                        mXmlDeclaredControllers.add(controllerClassName);
-                    }
-                }
-            } catch (Exception e) {
-                // Assume an issue with robolectric resources
+                mXmlDeclaredControllers.add(controllerClassName);
             }
         }
+        // We definitely have some controllers in xml, so assert not-empty here as a proxy to
+        // make sure the parser didn't fail
+        assertThat(mXmlDeclaredControllers).isNotEmpty();
     }
 
     @Test
     public void testAllControllersDeclaredInXml() throws Exception {
         final List<Class<?>> classes =
-            new ClassScanner().getClassesForPackage(mContext.getPackageName());
+                new ClassScanner().getClassesForPackage(mContext.getPackageName());
         final List<String> missingControllersInXml = new ArrayList<>();
 
         for (Class<?> clazz : classes) {
@@ -139,7 +124,7 @@
         missingControllersInXml.removeAll(mGrandfatheredClasses);
 
         final String missingControllerError =
-            buildErrorMessage(ERROR_MISSING_CONTROLLER, missingControllersInXml);
+                buildErrorMessage(ERROR_MISSING_CONTROLLER, missingControllersInXml);
 
         assertWithMessage(missingControllerError).that(missingControllersInXml).isEmpty();
     }