Merge "Import translations. DO NOT MERGE" into oc-dev
diff --git a/res/values/strings.xml b/res/values/strings.xml
index 35a6f51..f6b36b4 100644
--- a/res/values/strings.xml
+++ b/res/values/strings.xml
@@ -750,8 +750,6 @@
     <string name="encryption_and_credential_settings_summary">Phone encrypted</string>
     <!-- Security Settings screen setting option title for the item to take you to the lock screen preference screen [CHAR LIMIT=60] -->
     <string name="lockscreen_settings_title">Lock screen preferences</string>
-    <!-- Security Settings screen setting option summary for the item to take you to the lock screen preference screen -->
-    <string name="lockscreen_settings_summary">Show all notification content</string>
 
     <!-- Main Settings screen setting option summary text for the item tot ake you to the security and location screen -->
     <string name="security_settings_summary">Set My Location, screen unlock, SIM card lock, credential storage lock</string>
@@ -2289,7 +2287,7 @@
     <!-- Adaptive brightness settings screen, setting option summary to enable adaptive brightness when user prefers very high brightness.
          Meant to make it clear that preferring very high brightness uses more battery. [CHAR LIMIT=100] -->
     <string name="auto_brightness_very_high_summary">Increased battery usage</string>
-    <!-- Adaptive brightness settings screen, disclaimer that explains in more detail about how adaptive brightness works [CHAR LIMIT=100] -->
+    <!-- Adaptive brightness settings screen, disclaimer that explains in more detail about how adaptive brightness works [CHAR LIMIT=150] -->
     <string name="auto_brightness_disclaimer">Optimize brightness level for available light. When this feature is on, you can still adjust brightness temporarily.</string>
 
     <!-- Night display screen, setting option name to enable night display (renamed "Night Light" with title caps). [CHAR LIMIT=30] -->
@@ -4462,7 +4460,7 @@
     <!-- Summary for the background activity when it is disabled [CHAR_LIMIT=120] -->
     <string name="background_activity_summary_disabled">App not allowed to run in background</string>
 
-    <!-- Title for the screen usage in power use UI [CHAR_LIMIT=40] -->
+    <!-- Title for the screen usage in power use UI [CHAR_LIMIT=60] -->
     <string name="device_screen_usage">Screen usage since full charge</string>
     <!-- Title for the screen consumption in power use UI(i.e. Screen consumption: 30% of battery usage) [CHAR_LIMIT=40] -->
     <string name="device_screen_consumption">Screen consumption</string>
diff --git a/res/xml/automatic_storage_management_settings.xml b/res/xml/automatic_storage_management_settings.xml
index 73d708d..1428741 100644
--- a/res/xml/automatic_storage_management_settings.xml
+++ b/res/xml/automatic_storage_management_settings.xml
@@ -18,38 +18,18 @@
         xmlns:settings="http://schemas.android.com/apk/res-auto"
         android:title="@string/automatic_storage_manager_settings" >
 
-    <PreferenceCategory
-        android:key="automatic"
-        android:title="@string/deletion_helper_automatic_title">
-
-        <SwitchPreference
-            android:key="storage_manager_active"
-            android:title="@string/automatic_storage_manager_preference_title"
-            android:summary="@string/automatic_storage_manager_text"/>
-
-        <Preference
-            android:key="freed_bytes"
-            android:persistent="false"
-            android:selectable="false" />
-
         <DropDownPreference
             android:key="days"
             android:summary="%s"
             android:title="@string/automatic_storage_manager_days_title"
             android:entries="@array/automatic_storage_management_days"
             android:entryValues="@array/automatic_storage_management_days_values"
-            settings:allowDividerAbove="true" />
-
-    </PreferenceCategory>
-
-    <PreferenceCategory
-        android:key="manual"
-        android:title="@string/deletion_helper_manual_title">
+            settings:allowDividerBelow="true" />
 
         <Preference
-            android:key="deletion_helper"
-            android:title="@string/deletion_helper_preference_title"/>
-
-    </PreferenceCategory>
+            android:key="freed_bytes"
+            android:persistent="false"
+            android:selectable="false"
+            settings:allowDividerAbove="true" />
 
 </PreferenceScreen>
\ No newline at end of file
diff --git a/res/xml/security_settings_chooser.xml b/res/xml/security_settings_chooser.xml
index dc6e727..067ebab 100644
--- a/res/xml/security_settings_chooser.xml
+++ b/res/xml/security_settings_chooser.xml
@@ -31,7 +31,6 @@
 
         <Preference android:key="lockscreen_preferences"
             android:title="@string/lockscreen_settings_title"
-            android:summary="@string/lockscreen_settings_summary"
             android:fragment="com.android.settings.security.LockscreenDashboardFragment"/>
 
     </PreferenceCategory>
diff --git a/res/xml/security_settings_password.xml b/res/xml/security_settings_password.xml
index e3a5dfd..7de65f7 100644
--- a/res/xml/security_settings_password.xml
+++ b/res/xml/security_settings_password.xml
@@ -30,7 +30,6 @@
 
         <Preference android:key="lockscreen_preferences"
             android:title="@string/lockscreen_settings_title"
-            android:summary="@string/lockscreen_settings_summary"
             android:fragment="com.android.settings.security.LockscreenDashboardFragment"/>
 
     </PreferenceCategory>
diff --git a/res/xml/security_settings_pattern.xml b/res/xml/security_settings_pattern.xml
index 295e896..1585f01 100644
--- a/res/xml/security_settings_pattern.xml
+++ b/res/xml/security_settings_pattern.xml
@@ -30,7 +30,6 @@
 
         <Preference android:key="lockscreen_preferences"
             android:title="@string/lockscreen_settings_title"
-            android:summary="@string/lockscreen_settings_summary"
             android:fragment="com.android.settings.security.LockscreenDashboardFragment"/>
 
     </PreferenceCategory>
diff --git a/res/xml/security_settings_pin.xml b/res/xml/security_settings_pin.xml
index 5613177..f7705b7 100644
--- a/res/xml/security_settings_pin.xml
+++ b/res/xml/security_settings_pin.xml
@@ -30,7 +30,6 @@
 
         <Preference android:key="lockscreen_preferences"
             android:title="@string/lockscreen_settings_title"
-            android:summary="@string/lockscreen_settings_summary"
             android:fragment="com.android.settings.security.LockscreenDashboardFragment"/>
 
     </PreferenceCategory>
diff --git a/src/com/android/settings/SecuritySettings.java b/src/com/android/settings/SecuritySettings.java
index a56889d..1e64b7f 100644
--- a/src/com/android/settings/SecuritySettings.java
+++ b/src/com/android/settings/SecuritySettings.java
@@ -60,6 +60,7 @@
 import com.android.settings.enterprise.ManageDeviceAdminPreferenceController;
 import com.android.settings.fingerprint.FingerprintSettings;
 import com.android.settings.location.LocationPreferenceController;
+import com.android.settings.notification.LockScreenNotificationPreferenceController;
 import com.android.settings.overlay.FeatureFactory;
 import com.android.settings.search.BaseSearchIndexProvider;
 import com.android.settings.search.Indexable;
@@ -103,6 +104,8 @@
     @VisibleForTesting
     static final String KEY_MANAGE_TRUST_AGENTS = "manage_trust_agents";
     private static final String KEY_UNIFICATION = "unification";
+    @VisibleForTesting
+    static final String KEY_LOCKSCREEN_PREFERENCES = "lockscreen_preferences";
 
     private static final int SET_OR_CHANGE_LOCK_METHOD_REQUEST = 123;
     private static final int CHANGE_TRUST_AGENT_SETTINGS = 126;
@@ -169,6 +172,7 @@
     private LocationPreferenceController mLocationcontroller;
     private ManageDeviceAdminPreferenceController mManageDeviceAdminPreferenceController;
     private EnterprisePrivacyPreferenceController mEnterprisePrivacyPreferenceController;
+    private LockScreenNotificationPreferenceController mLockScreenNotificationPreferenceController;
 
     @Override
     public int getMetricsCategory() {
@@ -210,6 +214,8 @@
                 = new ManageDeviceAdminPreferenceController(activity);
         mEnterprisePrivacyPreferenceController
                 = new EnterprisePrivacyPreferenceController(activity, null /* lifecycle */);
+        mLockScreenNotificationPreferenceController
+                = new LockScreenNotificationPreferenceController(activity);
     }
 
     private static int getResIdForLockUnlockScreen(Context context,
@@ -317,6 +323,7 @@
         if (securityCategory != null) {
             maybeAddFingerprintPreference(securityCategory, UserHandle.myUserId());
             numberOfTrustAgent = addTrustAgentSettings(securityCategory);
+            setLockscreenPreferencesSummary(securityCategory);
         }
 
         mVisiblePatternProfile =
@@ -423,6 +430,15 @@
         }
     }
 
+    @VisibleForTesting
+    void setLockscreenPreferencesSummary(PreferenceGroup group) {
+        final Preference lockscreenPreferences = group.findPreference(KEY_LOCKSCREEN_PREFERENCES);
+        if (lockscreenPreferences != null) {
+            lockscreenPreferences.setSummary(
+                mLockScreenNotificationPreferenceController.getSummaryResource());
+        }
+    }
+
     /*
      * Sets the preference as disabled by admin if PASSWORD_QUALITY_MANAGED is set.
      * The preference must be a RestrictedPreference.
diff --git a/src/com/android/settings/deletionhelper/AutomaticStorageManagerSettings.java b/src/com/android/settings/deletionhelper/AutomaticStorageManagerSettings.java
index 4d4cfe8..adf2938 100644
--- a/src/com/android/settings/deletionhelper/AutomaticStorageManagerSettings.java
+++ b/src/com/android/settings/deletionhelper/AutomaticStorageManagerSettings.java
@@ -17,44 +17,39 @@
 package com.android.settings.deletionhelper;
 
 import android.app.Activity;
-import android.app.AlertDialog;
-import android.app.FragmentManager;
 import android.content.ContentResolver;
-import android.content.Intent;
 import android.os.Bundle;
-import android.os.SystemProperties;
-import android.os.storage.StorageManager;
 import android.provider.Settings;
-import android.support.v14.preference.SwitchPreference;
 import android.support.v7.preference.DropDownPreference;
 import android.support.v7.preference.Preference;
 import android.support.v7.preference.Preference.OnPreferenceChangeListener;
 import android.text.format.DateUtils;
 import android.text.format.Formatter;
+import android.view.LayoutInflater;
+import android.view.View;
+import android.view.ViewGroup;
 
 import com.android.internal.logging.nano.MetricsProto.MetricsEvent;
 import com.android.settings.R;
+import com.android.settings.SettingsActivity;
 import com.android.settings.SettingsPreferenceFragment;
+import com.android.settings.widget.SwitchBar;
 
 /**
  * AutomaticStorageManagerSettings is the Settings screen for configuration and management of the
  * automatic storage manager.
  */
-public class AutomaticStorageManagerSettings extends SettingsPreferenceFragment implements
-        OnPreferenceChangeListener, Preference.OnPreferenceClickListener {
-    public static final int DEFAULT_DAYS_TO_RETAIN = 90;
-
+public class AutomaticStorageManagerSettings extends SettingsPreferenceFragment
+        implements OnPreferenceChangeListener {
     private static final String KEY_DAYS = "days";
-    private static final String KEY_DELETION_HELPER = "deletion_helper";
     private static final String KEY_FREED = "freed_bytes";
-    private static final String KEY_STORAGE_MANAGER_SWITCH = "storage_manager_active";
     private static final String STORAGE_MANAGER_ENABLED_BY_DEFAULT_PROPERTY =
             "ro.storage_manager.enabled";
 
+    private AutomaticStorageManagerSwitchBarController mSwitchController;
     private DropDownPreference mDaysToRetain;
     private Preference mFreedBytes;
-    private Preference mDeletionHelper;
-    private SwitchPreference mStorageManagerSwitch;
+    private SwitchBar mSwitchBar;
 
     @Override
     public void onCreate(Bundle savedInstanceState) {
@@ -63,19 +58,21 @@
     }
 
     @Override
-    public void onActivityCreated(Bundle savedInstanceState) {
-        super.onActivityCreated(savedInstanceState);
+    public View onCreateView(
+            LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
+        View view = super.onCreateView(inflater, container, savedInstanceState);
+
+        initializeDaysToRetainPreference();
+        initializeFreedBytesPreference();
+        initializeSwitchBar();
+
+        return view;
+    }
+
+    private void initializeDaysToRetainPreference() {
         mDaysToRetain = (DropDownPreference) findPreference(KEY_DAYS);
         mDaysToRetain.setOnPreferenceChangeListener(this);
 
-        mFreedBytes = findPreference(KEY_FREED);
-
-        mDeletionHelper = findPreference(KEY_DELETION_HELPER);
-        mDeletionHelper.setOnPreferenceClickListener(this);
-
-        mStorageManagerSwitch = (SwitchPreference) findPreference(KEY_STORAGE_MANAGER_SWITCH);
-        mStorageManagerSwitch.setOnPreferenceChangeListener(this);
-
         ContentResolver cr = getContentResolver();
         int photosDaysToRetain = Settings.Secure.getInt(cr,
                 Settings.Secure.AUTOMATIC_STORAGE_MANAGER_DAYS_TO_RETAIN,
@@ -83,7 +80,24 @@
         String[] stringValues =
                 getResources().getStringArray(R.array.automatic_storage_management_days_values);
         mDaysToRetain.setValue(stringValues[daysValueToIndex(photosDaysToRetain, stringValues)]);
+    }
 
+    private void initializeSwitchBar() {
+        final SettingsActivity activity = (SettingsActivity) getActivity();
+        mSwitchBar = activity.getSwitchBar();
+        mSwitchBar.show();
+        mSwitchController =
+                new AutomaticStorageManagerSwitchBarController(
+                        getContext(),
+                        mSwitchBar,
+                        mMetricsFeatureProvider,
+                        mDaysToRetain,
+                        getFragmentManager());
+    }
+
+    private void initializeFreedBytesPreference() {
+        ContentResolver cr = getContentResolver();
+        mFreedBytes = findPreference(KEY_FREED);
         long freedBytes = Settings.Secure.getLong(cr,
                 Settings.Secure.AUTOMATIC_STORAGE_MANAGER_BYTES_CLEARED,
                 0);
@@ -93,11 +107,13 @@
         if (freedBytes == 0 || lastRunMillis == 0) {
             mFreedBytes.setVisible(false);
         } else {
-            Activity activity = getActivity();
-            mFreedBytes.setSummary(activity.getString(
-                    R.string.automatic_storage_manager_freed_bytes,
-                    Formatter.formatFileSize(activity, freedBytes),
-                    DateUtils.formatDateTime(activity, lastRunMillis, DateUtils.FORMAT_SHOW_DATE)));
+            final Activity activity = getActivity();
+            mFreedBytes.setSummary(
+                    activity.getString(
+                            R.string.automatic_storage_manager_freed_bytes,
+                            Formatter.formatFileSize(activity, freedBytes),
+                            DateUtils.formatDateTime(
+                                    activity, lastRunMillis, DateUtils.FORMAT_SHOW_DATE)));
         }
     }
 
@@ -107,31 +123,27 @@
         boolean isStorageManagerChecked =
                 Settings.Secure.getInt(getContentResolver(),
                         Settings.Secure.AUTOMATIC_STORAGE_MANAGER_ENABLED, 0) != 0;
-        mStorageManagerSwitch.setChecked(isStorageManagerChecked);
+        // Using the setCheckedInternal means the checked status won't propagate through the
+        // listeners -- this will prevent us from accidentally causing a metrics event on resume.
+        mSwitchBar.setCheckedInternal(isStorageManagerChecked);
         mDaysToRetain.setEnabled(isStorageManagerChecked);
     }
 
     @Override
+    public void onDestroyView() {
+        super.onDestroyView();
+
+        mSwitchBar.hide();
+        mSwitchController.tearDown();
+    }
+
+    @Override
     public boolean onPreferenceChange(Preference preference, Object newValue) {
-        switch (preference.getKey()) {
-            case KEY_STORAGE_MANAGER_SWITCH:
-                boolean storageManagerChecked = (boolean) newValue;
-                mMetricsFeatureProvider.action(getContext(),
-                        MetricsEvent.ACTION_TOGGLE_STORAGE_MANAGER, storageManagerChecked);
-                mDaysToRetain.setEnabled(storageManagerChecked);
-                Settings.Secure.putInt(getContentResolver(),
-                        Settings.Secure.AUTOMATIC_STORAGE_MANAGER_ENABLED,
-                        storageManagerChecked ? 1 : 0);
-                // Only show a warning if enabling.
-                if (storageManagerChecked) {
-                    maybeShowWarning();
-                }
-                break;
-            case KEY_DAYS:
-                Settings.Secure.putInt(getContentResolver(),
-                        Settings.Secure.AUTOMATIC_STORAGE_MANAGER_DAYS_TO_RETAIN,
-                        Integer.parseInt((String) newValue));
-                break;
+        if (KEY_DAYS.equals(preference.getKey())) {
+            Settings.Secure.putInt(
+                    getContentResolver(),
+                    Settings.Secure.AUTOMATIC_STORAGE_MANAGER_DAYS_TO_RETAIN,
+                    Integer.parseInt((String) newValue));
         }
         return true;
     }
@@ -142,15 +154,6 @@
     }
 
     @Override
-    public boolean onPreferenceClick(Preference preference) {
-        if (KEY_DELETION_HELPER.equals(preference.getKey())) {
-            Intent intent = new Intent(StorageManager.ACTION_MANAGE_STORAGE);
-            getContext().startActivity(intent);
-        }
-        return true;
-    }
-
-    @Override
     protected int getHelpResource() {
         return R.string.help_uri_storage;
     }
@@ -164,15 +167,4 @@
         }
         return indices.length - 1;
     }
-
-    private void maybeShowWarning() {
-        // If the storage manager is on by default, we can use the normal message.
-        boolean warningUnneeded = SystemProperties.getBoolean(
-                STORAGE_MANAGER_ENABLED_BY_DEFAULT_PROPERTY, false);
-        if (warningUnneeded) {
-            return;
-        }
-        ActivationWarningFragment fragment = ActivationWarningFragment.newInstance();
-        fragment.show(getFragmentManager(), ActivationWarningFragment.TAG);
-    }
 }
diff --git a/src/com/android/settings/deletionhelper/AutomaticStorageManagerSwitchBarController.java b/src/com/android/settings/deletionhelper/AutomaticStorageManagerSwitchBarController.java
new file mode 100644
index 0000000..a648102
--- /dev/null
+++ b/src/com/android/settings/deletionhelper/AutomaticStorageManagerSwitchBarController.java
@@ -0,0 +1,85 @@
+/*
+ * Copyright (C) 2017 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.deletionhelper;
+
+import android.app.FragmentManager;
+import android.content.Context;
+import android.os.SystemProperties;
+import android.provider.Settings;
+import android.support.v7.preference.Preference;
+import android.widget.Switch;
+
+import com.android.internal.util.Preconditions;
+import com.android.settings.core.instrumentation.MetricsFeatureProvider;
+import com.android.settings.widget.SwitchBar;
+import com.android.internal.logging.nano.MetricsProto.MetricsEvent;
+
+/** Handles the logic for flipping the storage management toggle on a {@link SwitchBar}. */
+public class AutomaticStorageManagerSwitchBarController
+        implements SwitchBar.OnSwitchChangeListener {
+    private static final String STORAGE_MANAGER_ENABLED_BY_DEFAULT_PROPERTY =
+            "ro.storage_manager.enabled";
+
+    private Context mContext;
+    private SwitchBar mSwitchBar;
+    private MetricsFeatureProvider mMetrics;
+    private Preference mDaysToRetainPreference;
+    private FragmentManager mFragmentManager;
+
+    public AutomaticStorageManagerSwitchBarController(
+            Context context,
+            SwitchBar switchBar,
+            MetricsFeatureProvider metrics,
+            Preference daysToRetainPreference,
+            FragmentManager fragmentManager) {
+        mContext = Preconditions.checkNotNull(context);
+        mSwitchBar = Preconditions.checkNotNull(switchBar);
+        mMetrics = Preconditions.checkNotNull(metrics);
+        mDaysToRetainPreference = Preconditions.checkNotNull(daysToRetainPreference);
+        mFragmentManager = Preconditions.checkNotNull(fragmentManager);
+
+        mSwitchBar.addOnSwitchChangeListener(this);
+    }
+
+    @Override
+    public void onSwitchChanged(Switch switchView, boolean isChecked) {
+        mMetrics.action(mContext, MetricsEvent.ACTION_TOGGLE_STORAGE_MANAGER, isChecked);
+        mDaysToRetainPreference.setEnabled(isChecked);
+        Settings.Secure.putInt(
+                mContext.getContentResolver(),
+                Settings.Secure.AUTOMATIC_STORAGE_MANAGER_ENABLED,
+                isChecked ? 1 : 0);
+        // Only show a warning if enabling.
+        if (isChecked) {
+            maybeShowWarning();
+        }
+    }
+
+    /** Unregisters the controller from listening to further events. */
+    public void tearDown() {
+        mSwitchBar.removeOnSwitchChangeListener(this);
+    }
+
+    private void maybeShowWarning() {
+        // If the storage manager is on by default, we don't need to show the additional dialog.
+        if (SystemProperties.getBoolean(STORAGE_MANAGER_ENABLED_BY_DEFAULT_PROPERTY, false)) {
+            return;
+        }
+        ActivationWarningFragment fragment = ActivationWarningFragment.newInstance();
+        fragment.show(mFragmentManager, ActivationWarningFragment.TAG);
+    }
+}
diff --git a/src/com/android/settings/fingerprint/FingerprintRemoveSidecar.java b/src/com/android/settings/fingerprint/FingerprintRemoveSidecar.java
new file mode 100644
index 0000000..eda4c82
--- /dev/null
+++ b/src/com/android/settings/fingerprint/FingerprintRemoveSidecar.java
@@ -0,0 +1,149 @@
+/*
+ * Copyright (C) 2017 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.fingerprint;
+
+import android.annotation.Nullable;
+import android.content.Context;
+import android.hardware.fingerprint.Fingerprint;
+import android.hardware.fingerprint.FingerprintManager;
+import android.os.Bundle;
+import com.android.settings.core.InstrumentedPreferenceFragment;
+import com.android.internal.logging.nano.MetricsProto.MetricsEvent;
+import android.os.UserHandle;
+import java.util.Queue;
+import java.util.LinkedList;
+import android.util.Log;
+
+/**
+ * Sidecar fragment to handle the state around fingerprint removal.
+ */
+public class FingerprintRemoveSidecar extends InstrumentedPreferenceFragment {
+
+    private static final String TAG = "FingerprintRemoveSidecar";
+    private Listener mListener;
+    private Fingerprint mFingerprintRemoving;
+    private Queue<Object> mFingerprintsRemoved;
+    FingerprintManager mFingerprintManager;
+
+    private class RemovalError {
+        Fingerprint fingerprint;
+        int errMsgId;
+        CharSequence errString;
+        public RemovalError(Fingerprint fingerprint, int errMsgId, CharSequence errString) {
+            this.fingerprint = fingerprint;
+            this.errMsgId = errMsgId;
+            this.errString = errString;
+        }
+    }
+
+    private FingerprintManager.RemovalCallback
+            mRemoveCallback = new FingerprintManager.RemovalCallback() {
+        @Override
+        public void onRemovalSucceeded(Fingerprint fingerprint) {
+            if (mListener != null) {
+                mListener.onRemovalSucceeded(fingerprint);
+            } else {
+                mFingerprintsRemoved.add(fingerprint);
+            };
+            mFingerprintRemoving = null;
+        }
+
+        @Override
+        public void onRemovalError(Fingerprint fp, int errMsgId, CharSequence errString) {
+            if (mListener != null) {
+                mListener.onRemovalError(fp, errMsgId, errString);
+            } else {
+                mFingerprintsRemoved.add(new RemovalError(fp, errMsgId, errString));
+            }
+            mFingerprintRemoving = null;
+        }
+    };
+
+    public void startRemove(Fingerprint fingerprint, int userId) {
+        if (mFingerprintRemoving != null) {
+            Log.e(TAG, "Remove already in progress");
+            return;
+        }
+        if (userId != UserHandle.USER_NULL) {
+            mFingerprintManager.setActiveUser(userId);
+        }
+        mFingerprintRemoving = fingerprint;
+        mFingerprintManager.remove(fingerprint, userId, mRemoveCallback);;
+    }
+
+    public FingerprintRemoveSidecar() {
+        mFingerprintsRemoved = new LinkedList<>();
+    }
+
+    public void setFingerprintManager(FingerprintManager fingerprintManager) {
+        mFingerprintManager = fingerprintManager;
+    }
+
+    @Override
+    public void onCreate(@Nullable Bundle savedInstanceState) {
+        super.onCreate(savedInstanceState);
+        setRetainInstance(true);
+    }
+
+    @Override
+    public void onAttach(Context context) {
+        super.onAttach(context);
+    }
+
+    @Override
+    public void onResume() {
+        super.onResume();
+    }
+
+    @Override
+    public void onCreatePreferences(Bundle savedInstanceState, String rootKey) {
+    }
+
+    public void setListener(Listener listener) {
+        if (mListener == null && listener != null) {
+            while (!mFingerprintsRemoved.isEmpty()) {
+                Object o = mFingerprintsRemoved.poll();
+                if (o instanceof Fingerprint) {
+                    listener.onRemovalSucceeded((Fingerprint)o);
+                } else if (o instanceof RemovalError) {
+                    RemovalError e = (RemovalError) o;
+                    listener.onRemovalError(e.fingerprint, e.errMsgId, e.errString);
+                }
+            }
+        }
+        mListener = listener;
+    }
+
+    public interface Listener {
+        void onRemovalSucceeded(Fingerprint fingerprint);
+        void onRemovalError(Fingerprint fp, int errMsgId, CharSequence errString);
+    }
+
+    final boolean isRemovingFingerprint(int fid) {
+        return inProgress() && mFingerprintRemoving.getFingerId() == fid;
+    }
+
+    final boolean inProgress() {
+        return mFingerprintRemoving != null;
+    }
+
+    @Override
+    public int getMetricsCategory() {
+        return MetricsEvent.FINGERPRINT_REMOVE_SIDECAR;
+    }
+
+}
diff --git a/src/com/android/settings/fingerprint/FingerprintSettings.java b/src/com/android/settings/fingerprint/FingerprintSettings.java
index dc6616a..01670fe 100644
--- a/src/com/android/settings/fingerprint/FingerprintSettings.java
+++ b/src/com/android/settings/fingerprint/FingerprintSettings.java
@@ -31,7 +31,6 @@
 import android.hardware.fingerprint.FingerprintManager;
 import android.hardware.fingerprint.FingerprintManager.AuthenticationCallback;
 import android.hardware.fingerprint.FingerprintManager.AuthenticationResult;
-import android.hardware.fingerprint.FingerprintManager.RemovalCallback;
 import android.os.Bundle;
 import android.os.CancellationSignal;
 import android.os.Handler;
@@ -64,11 +63,11 @@
 import com.android.settings.Utils;
 import com.android.settings.core.instrumentation.InstrumentedDialogFragment;
 import com.android.settings.widget.FooterPreference;
-import com.android.settings.widget.FooterPreferenceMixin;
 import com.android.settingslib.HelpUtils;
 import com.android.settingslib.RestrictedLockUtils;
 
 import java.util.List;
+import java.util.HashMap;
 
 import static com.android.settingslib.RestrictedLockUtils.EnforcedAdmin;
 
@@ -160,6 +159,10 @@
         private Drawable mHighlightDrawable;
         private int mUserId;
 
+        private static final String TAG_REMOVAL_SIDECAR = "removal_sidecar";
+        private FingerprintRemoveSidecar mRemovalSidecar;
+        private HashMap<Integer, String> mFingerprintsRenaming;
+
         private AuthenticationCallback mAuthCallback = new AuthenticationCallback() {
             @Override
             public void onAuthenticationSucceeded(AuthenticationResult result) {
@@ -184,22 +187,30 @@
                         .sendToTarget();
             }
         };
-        private RemovalCallback mRemoveCallback = new RemovalCallback() {
 
-            @Override
+        FingerprintRemoveSidecar.Listener mRemovalListener =
+                new FingerprintRemoveSidecar.Listener() {
             public void onRemovalSucceeded(Fingerprint fingerprint) {
                 mHandler.obtainMessage(MSG_REFRESH_FINGERPRINT_TEMPLATES,
                         fingerprint.getFingerId(), 0).sendToTarget();
+                updateDialog();
             }
-
-            @Override
             public void onRemovalError(Fingerprint fp, int errMsgId, CharSequence errString) {
                 final Activity activity = getActivity();
                 if (activity != null) {
                     Toast.makeText(activity, errString, Toast.LENGTH_SHORT);
                 }
+                updateDialog();
+            }
+            private void updateDialog() {
+                RenameDeleteDialog renameDeleteDialog = (RenameDeleteDialog)getFragmentManager().
+                        findFragmentByTag(RenameDeleteDialog.class.getName());
+                if (renameDeleteDialog != null) {
+                    renameDeleteDialog.enableDelete();
+                }
             }
         };
+
         private final Handler mHandler = new Handler() {
             @Override
             public void handleMessage(android.os.Message msg) {
@@ -263,6 +274,9 @@
         }
 
         private void retryFingerprint() {
+            if (mRemovalSidecar.inProgress()) {
+                return;
+            }
             if (!mInFingerprintLockout) {
                 mFingerprintCancel = new CancellationSignal();
                 mFingerprintManager.authenticate(null, mFingerprintCancel, 0 /* flags */,
@@ -278,7 +292,31 @@
         @Override
         public void onCreate(Bundle savedInstanceState) {
             super.onCreate(savedInstanceState);
+
+            Activity activity = getActivity();
+            mFingerprintManager = Utils.getFingerprintManagerOrNull(activity);
+
+            mRemovalSidecar = (FingerprintRemoveSidecar)
+                    getFragmentManager().findFragmentByTag(TAG_REMOVAL_SIDECAR);
+            if (mRemovalSidecar == null) {
+                mRemovalSidecar = new FingerprintRemoveSidecar();
+                getFragmentManager().beginTransaction()
+                        .add(mRemovalSidecar, TAG_REMOVAL_SIDECAR).commit();
+            }
+            mRemovalSidecar.setFingerprintManager(mFingerprintManager);
+            mRemovalSidecar.setListener(mRemovalListener);
+
+            RenameDeleteDialog renameDeleteDialog = (RenameDeleteDialog)getFragmentManager().
+                    findFragmentByTag(RenameDeleteDialog.class.getName());
+            if (renameDeleteDialog != null) {
+               renameDeleteDialog.setDeleteInProgress(mRemovalSidecar.inProgress());
+            }
+
+            mFingerprintsRenaming = new HashMap<Integer, String>();
+
             if (savedInstanceState != null) {
+                mFingerprintsRenaming = (HashMap<Integer, String>)
+                        savedInstanceState.getSerializable("mFingerprintsRenaming");
                 mToken = savedInstanceState.getByteArray(
                         ChooseLockSettingsHelper.EXTRA_KEY_CHALLENGE_TOKEN);
                 mLaunchedConfirm = savedInstanceState.getBoolean(
@@ -287,9 +325,6 @@
             mUserId = getActivity().getIntent().getIntExtra(
                     Intent.EXTRA_USER_ID, UserHandle.myUserId());
 
-            Activity activity = getActivity();
-            mFingerprintManager = Utils.getFingerprintManagerOrNull(activity);
-
             // Need to authenticate a session token if none
             if (mToken == null && mLaunchedConfirm == false) {
                 mLaunchedConfirm = true;
@@ -347,6 +382,12 @@
                 pref.setFingerprint(item);
                 pref.setPersistent(false);
                 pref.setIcon(R.drawable.ic_fingerprint_24dp);
+                if (mRemovalSidecar.isRemovingFingerprint(item.getFingerId())) {
+                    pref.setEnabled(false);
+                }
+                if (mFingerprintsRenaming.containsKey(item.getFingerId())) {
+                    pref.setTitle(mFingerprintsRenaming.get(item.getFingerId()));
+                }
                 root.addPreference(pref);
                 pref.setOnPreferenceChangeListener(this);
             }
@@ -366,11 +407,14 @@
             final int max = getContext().getResources().getInteger(
                     com.android.internal.R.integer.config_fingerprintMaxTemplatesPerUser);
             boolean tooMany = mFingerprintManager.getEnrolledFingerprints(mUserId).size() >= max;
+            // retryFingerprint() will be called when remove finishes
+            // need to disable enroll or have a way to determine if enroll is in progress
+            final boolean removalInProgress = mRemovalSidecar.inProgress();
             CharSequence maxSummary = tooMany ?
                     getContext().getString(R.string.fingerprint_add_max, max) : "";
             Preference addPreference = findPreference(KEY_FINGERPRINT_ADD);
             addPreference.setSummary(maxSummary);
-            addPreference.setEnabled(!tooMany);
+            addPreference.setEnabled(!tooMany && !removalInProgress);
         }
 
         private static String genKey(int id) {
@@ -383,6 +427,9 @@
             // Make sure we reload the preference hierarchy since fingerprints may be added,
             // deleted or renamed.
             updatePreferences();
+            if (mRemovalSidecar != null) {
+                mRemovalSidecar.setListener(mRemovalListener);
+            }
         }
 
         private void updatePreferences() {
@@ -394,6 +441,9 @@
         public void onPause() {
             super.onPause();
             stopFingerprint();
+            if (mRemovalSidecar != null) {
+                mRemovalSidecar.setListener(null);
+            }
         }
 
         @Override
@@ -401,6 +451,7 @@
             outState.putByteArray(ChooseLockSettingsHelper.EXTRA_KEY_CHALLENGE_TOKEN,
                     mToken);
             outState.putBoolean(KEY_LAUNCHED_CONFIRM, mLaunchedConfirm);
+            outState.putSerializable("mFingerprintsRenaming", mFingerprintsRenaming);
         }
 
         @Override
@@ -415,7 +466,7 @@
                 startActivityForResult(intent, ADD_FINGERPRINT_REQUEST);
             } else if (pref instanceof FingerprintPreference) {
                 FingerprintPreference fpref = (FingerprintPreference) pref;
-                final Fingerprint fp =fpref.getFingerprint();
+                final Fingerprint fp = fpref.getFingerprint();
                 showRenameDeleteDialog(fp);
                 return super.onPreferenceTreeClick(pref);
             }
@@ -425,7 +476,14 @@
         private void showRenameDeleteDialog(final Fingerprint fp) {
             RenameDeleteDialog renameDeleteDialog = new RenameDeleteDialog();
             Bundle args = new Bundle();
-            args.putParcelable("fingerprint", fp);
+            if (mFingerprintsRenaming.containsKey(fp.getFingerId())) {
+                final Fingerprint f = new Fingerprint(mFingerprintsRenaming.get(fp.getFingerId()),
+                        fp.getGroupId(), fp.getFingerId(), fp.getDeviceId());
+                args.putParcelable("fingerprint", f);
+            } else {
+                args.putParcelable("fingerprint", fp);
+            }
+            renameDeleteDialog.setDeleteInProgress(mRemovalSidecar.inProgress());
             renameDeleteDialog.setArguments(args);
             renameDeleteDialog.setTargetFragment(this, 0);
             renameDeleteDialog.show(getFragmentManager(), RenameDeleteDialog.class.getName());
@@ -537,11 +595,16 @@
         }
 
         private void deleteFingerPrint(Fingerprint fingerPrint) {
-            mFingerprintManager.remove(fingerPrint, mUserId, mRemoveCallback);
+            mRemovalSidecar.startRemove(fingerPrint, mUserId);
+            String name = genKey(fingerPrint.getFingerId());
+            Preference prefToRemove = findPreference(name);
+            prefToRemove.setEnabled(false);
+            updateAddPreference();
         }
 
         private void renameFingerPrint(int fingerId, String newName) {
             mFingerprintManager.rename(fingerId, mUserId, newName);
+            mFingerprintsRenaming.put(fingerId, newName);
             updatePreferences();
         }
 
@@ -561,7 +624,12 @@
             private Boolean mTextHadFocus;
             private int mTextSelectionStart;
             private int mTextSelectionEnd;
+            private AlertDialog mAlertDialog;
+            private boolean mDeleteInProgress;
 
+            public void setDeleteInProgress(boolean deleteInProgress) {
+                mDeleteInProgress = deleteInProgress;
+            }
             @Override
             public Dialog onCreateDialog(Bundle savedInstanceState) {
                 mFp = getArguments().getParcelable("fingerprint");
@@ -571,7 +639,7 @@
                     mTextSelectionStart = savedInstanceState.getInt("startSelection");
                     mTextSelectionEnd = savedInstanceState.getInt("endSelection");
                 }
-                final AlertDialog alertDialog = new AlertDialog.Builder(getActivity())
+                mAlertDialog = new AlertDialog.Builder(getActivity())
                         .setView(R.layout.fingerprint_rename_dialog)
                         .setPositiveButton(R.string.security_settings_fingerprint_enroll_dialog_ok,
                                 new DialogInterface.OnClickListener() {
@@ -605,10 +673,10 @@
                                     }
                                 })
                         .create();
-                alertDialog.setOnShowListener(new DialogInterface.OnShowListener() {
+                mAlertDialog.setOnShowListener(new DialogInterface.OnShowListener() {
                     @Override
                     public void onShow(DialogInterface dialog) {
-                        mDialogTextField = (EditText) alertDialog.findViewById(
+                        mDialogTextField = (EditText) mAlertDialog.findViewById(
                                 R.id.fingerprint_rename_field);
                         CharSequence name = mFingerName == null ? mFp.getName() : mFingerName;
                         mDialogTextField.setText(name);
@@ -617,14 +685,24 @@
                         } else {
                             mDialogTextField.setSelection(mTextSelectionStart, mTextSelectionEnd);
                         }
+                        if (mDeleteInProgress) {
+                            mAlertDialog.getButton(AlertDialog.BUTTON_NEGATIVE).setEnabled(false);
+                        }
                     }
                 });
                 if (mTextHadFocus == null || mTextHadFocus) {
                     // Request the IME
-                    alertDialog.getWindow().setSoftInputMode(
+                    mAlertDialog.getWindow().setSoftInputMode(
                             WindowManager.LayoutParams.SOFT_INPUT_STATE_ALWAYS_VISIBLE);
                 }
-                return alertDialog;
+                return mAlertDialog;
+            }
+
+            public void enableDelete() {
+                mDeleteInProgress = false;
+                if (mAlertDialog != null) {
+                    mAlertDialog.getButton(AlertDialog.BUTTON_NEGATIVE).setEnabled(true);
+                }
             }
 
             private void onDeleteClick(DialogInterface dialog) {
diff --git a/src/com/android/settings/fuelgauge/PowerUsageAdvanced.java b/src/com/android/settings/fuelgauge/PowerUsageAdvanced.java
index fe0cf4d..b341760 100644
--- a/src/com/android/settings/fuelgauge/PowerUsageAdvanced.java
+++ b/src/com/android/settings/fuelgauge/PowerUsageAdvanced.java
@@ -66,7 +66,8 @@
             UsageType.USER,
             UsageType.IDLE,
             UsageType.APP,
-            UsageType.UNACCOUNTED};
+            UsageType.UNACCOUNTED,
+            UsageType.OVERCOUNTED};
     private BatteryHistoryPreference mHistPref;
     private PreferenceGroup mUsageListGroup;
     private PowerUsageFeatureProvider mPowerUsageFeatureProvider;
@@ -169,6 +170,9 @@
         mUsageListGroup.removeAll();
         for (int i = 0, size = dataList.size(); i < size; i++) {
             final PowerUsageData batteryData = dataList.get(i);
+            if (shouldHide(batteryData)) {
+                continue;
+            }
             final PowerGaugePreference pref = new PowerGaugePreference(getPrefContext());
 
             pref.setKey(String.valueOf(batteryData.usageType));
@@ -199,6 +203,8 @@
             return UsageType.CELL;
         } else if (drainType == DrainType.UNACCOUNTED) {
             return UsageType.UNACCOUNTED;
+        } else if (drainType == DrainType.OVERCOUNTED) {
+            return UsageType.OVERCOUNTED;
         } else if (mPowerUsageFeatureProvider.isTypeSystem(sipper)) {
             return UsageType.SYSTEM;
         } else if (mPowerUsageFeatureProvider.isTypeService(sipper)) {
@@ -209,6 +215,16 @@
     }
 
     @VisibleForTesting
+    boolean shouldHide(PowerUsageData powerUsageData) {
+        if (powerUsageData.usageType == UsageType.UNACCOUNTED
+                || powerUsageData.usageType == UsageType.OVERCOUNTED) {
+            return true;
+        }
+
+        return false;
+    }
+
+    @VisibleForTesting
     List<PowerUsageData> parsePowerUsageData(BatteryStatsHelper statusHelper) {
         final List<BatterySipper> batterySippers = statusHelper.getUsageList();
         final Map<Integer, PowerUsageData> batteryDataMap = new HashMap<>();
@@ -297,7 +313,8 @@
                 UsageType.BLUETOOTH,
                 UsageType.USER,
                 UsageType.IDLE,
-                UsageType.UNACCOUNTED})
+                UsageType.UNACCOUNTED,
+                UsageType.OVERCOUNTED})
         public @interface UsageType {
             int APP = 0;
             int WIFI = 1;
@@ -308,6 +325,7 @@
             int USER = 6;
             int IDLE = 7;
             int UNACCOUNTED = 8;
+            int OVERCOUNTED = 9;
         }
 
         @StringRes
@@ -353,6 +371,8 @@
                     return R.string.power_idle;
                 case UsageType.UNACCOUNTED:
                     return R.string.power_unaccounted;
+                case UsageType.OVERCOUNTED:
+                    return R.string.power_overcounted;
                 case UsageType.APP:
                 default:
                     return R.string.power_apps;
diff --git a/src/com/android/settings/fuelgauge/PowerUsageSummary.java b/src/com/android/settings/fuelgauge/PowerUsageSummary.java
index 2c1fd78..d9323db 100644
--- a/src/com/android/settings/fuelgauge/PowerUsageSummary.java
+++ b/src/com/android/settings/fuelgauge/PowerUsageSummary.java
@@ -599,6 +599,8 @@
                 || drainType == DrainType.WIFI
                 || drainType == DrainType.SCREEN
                 || drainType == DrainType.BLUETOOTH
+                || drainType == DrainType.UNACCOUNTED
+                || drainType == DrainType.OVERCOUNTED
                 || (sipper.totalPowerMah * SECONDS_IN_HOUR) < MIN_POWER_THRESHOLD_MILLI_AMP
                 || mPowerFeatureProvider.isTypeService(sipper)
                 || mPowerFeatureProvider.isTypeSystem(sipper);
@@ -625,7 +627,11 @@
             final BatterySipper sipper = sippers.get(i);
             if (shouldHideSipper(sipper)) {
                 sippers.remove(i);
-                totalPowerMah += sipper.totalPowerMah;
+                if (sipper.drainType != DrainType.OVERCOUNTED
+                        && sipper.drainType != DrainType.UNACCOUNTED) {
+                    // Don't add it if it is overcounted or unaccounted
+                    totalPowerMah += sipper.totalPowerMah;
+                }
             }
         }
 
diff --git a/src/com/android/settings/notification/LockScreenNotificationPreferenceController.java b/src/com/android/settings/notification/LockScreenNotificationPreferenceController.java
index a7ebbe1..547ff80 100644
--- a/src/com/android/settings/notification/LockScreenNotificationPreferenceController.java
+++ b/src/com/android/settings/notification/LockScreenNotificationPreferenceController.java
@@ -267,16 +267,20 @@
         }
     }
 
+    public int getSummaryResource() {
+        final boolean enabled = getLockscreenNotificationsEnabled(UserHandle.myUserId());
+        final boolean allowPrivate = !mSecure
+            || getLockscreenAllowPrivateNotifications(UserHandle.myUserId());
+        return !enabled ? R.string.lock_screen_notifications_summary_disable :
+            allowPrivate ? R.string.lock_screen_notifications_summary_show :
+                R.string.lock_screen_notifications_summary_hide;
+    }
+
     private void updateLockscreenNotifications() {
         if (mLockscreen == null) {
             return;
         }
-        final boolean enabled = getLockscreenNotificationsEnabled(UserHandle.myUserId());
-        final boolean allowPrivate = !mSecure
-                || getLockscreenAllowPrivateNotifications(UserHandle.myUserId());
-        mLockscreenSelectedValue = !enabled ? R.string.lock_screen_notifications_summary_disable :
-                allowPrivate ? R.string.lock_screen_notifications_summary_show :
-                        R.string.lock_screen_notifications_summary_hide;
+        mLockscreenSelectedValue = getSummaryResource();
         mLockscreen.setValue(Integer.toString(mLockscreenSelectedValue));
     }
 
diff --git a/tests/robotests/src/com/android/settings/SecuritySettingsTest.java b/tests/robotests/src/com/android/settings/SecuritySettingsTest.java
index 91111a8..9bdf502 100644
--- a/tests/robotests/src/com/android/settings/SecuritySettingsTest.java
+++ b/tests/robotests/src/com/android/settings/SecuritySettingsTest.java
@@ -24,10 +24,12 @@
 import android.os.Bundle;
 import android.provider.Settings;
 import android.support.v7.preference.Preference;
+import android.support.v7.preference.PreferenceGroup;
 import android.support.v7.preference.PreferenceScreen;
 
 import com.android.internal.widget.LockPatternUtils;
 import com.android.settings.dashboard.SummaryLoader;
+import com.android.settings.notification.LockScreenNotificationPreferenceController;
 import com.android.settings.testutils.FakeFeatureFactory;
 import com.android.settings.testutils.shadow.ShadowSecureSettings;
 import com.android.settingslib.drawer.DashboardCategory;
@@ -47,6 +49,7 @@
 import org.robolectric.util.ReflectionHelpers;
 
 import java.util.Map;
+import org.robolectric.util.ReflectionHelpers;
 
 import static com.google.common.truth.Truth.assertThat;
 import static org.mockito.Matchers.any;
@@ -186,4 +189,22 @@
         verify(preference).setSummary(context.getResources().getQuantityString(
             R.plurals.manage_trust_agents_summary_on, 2, 2));
     }
+
+    @Test
+    public void testSetLockscreenPreferencesSummary_shouldSetSummaryFromLockScreenNotification() {
+        final Preference preference = mock(Preference.class);
+        final PreferenceGroup group = mock(PreferenceGroup.class);
+        when(group.findPreference(SecuritySettings.KEY_LOCKSCREEN_PREFERENCES))
+            .thenReturn(preference);
+        final LockScreenNotificationPreferenceController controller =
+            mock(LockScreenNotificationPreferenceController.class);
+
+        final SecuritySettings securitySettings = new SecuritySettings();
+        ReflectionHelpers.setField(securitySettings,
+            "mLockScreenNotificationPreferenceController", controller);
+
+        when(controller.getSummaryResource()).thenReturn(1234);
+        securitySettings.setLockscreenPreferencesSummary(group);
+        verify(preference).setSummary(1234);
+    }
 }
diff --git a/tests/robotests/src/com/android/settings/deletionhelper/AutomaticStorageManagerSwitchBarControllerTest.java b/tests/robotests/src/com/android/settings/deletionhelper/AutomaticStorageManagerSwitchBarControllerTest.java
new file mode 100644
index 0000000..b4f5f3d
--- /dev/null
+++ b/tests/robotests/src/com/android/settings/deletionhelper/AutomaticStorageManagerSwitchBarControllerTest.java
@@ -0,0 +1,124 @@
+/*
+ * Copyright (C) 2017 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.deletionhelper;
+
+import static org.mockito.Matchers.any;
+import static org.mockito.Matchers.eq;
+import static org.mockito.Mockito.RETURNS_DEEP_STUBS;
+import static org.mockito.Mockito.mock;
+import static org.mockito.Mockito.never;
+import static org.mockito.Mockito.spy;
+import static org.mockito.Mockito.verify;
+
+import android.app.Fragment;
+import android.app.FragmentManager;
+import android.content.Context;
+import android.support.v7.preference.Preference;
+
+import com.android.internal.logging.nano.MetricsProto;
+import com.android.settings.SettingsRobolectricTestRunner;
+import com.android.settings.TestConfig;
+import com.android.settings.core.instrumentation.MetricsFeatureProvider;
+import com.android.settings.overlay.FeatureFactory;
+import com.android.settings.testutils.FakeFeatureFactory;
+import com.android.settings.testutils.shadow.SettingsShadowSystemProperties;
+import com.android.settings.widget.SwitchBar;
+
+import org.junit.Before;
+import org.junit.Test;
+import org.junit.runner.RunWith;
+import org.mockito.Answers;
+import org.mockito.Mock;
+import org.mockito.MockitoAnnotations;
+import org.robolectric.RuntimeEnvironment;
+import org.robolectric.annotation.Config;
+
+@RunWith(SettingsRobolectricTestRunner.class)
+@Config(manifest = TestConfig.MANIFEST_PATH, sdk = TestConfig.SDK_VERSION)
+public class AutomaticStorageManagerSwitchBarControllerTest {
+    private Context mContext;
+    private SwitchBar mSwitchBar;
+    private MetricsFeatureProvider mMetricsFeatureProvider;
+    private Preference mPreference;
+
+    @Mock(answer = Answers.RETURNS_DEEP_STUBS)
+    private FragmentManager mFragmentManager;
+
+    private AutomaticStorageManagerSwitchBarController mController;
+
+    @Before
+    public void setUp() {
+        MockitoAnnotations.initMocks(this);
+
+        mContext = spy(RuntimeEnvironment.application);
+        mSwitchBar = new SwitchBar(mContext);
+
+        Context fakeContextForFakeProvider = mock(Context.class, RETURNS_DEEP_STUBS);
+        FeatureFactory featureFactory = FakeFeatureFactory.getFactory(fakeContextForFakeProvider);
+        mMetricsFeatureProvider = featureFactory.getMetricsFeatureProvider();
+        mPreference = new Preference(mContext);
+
+        mController =
+                new AutomaticStorageManagerSwitchBarController(
+                        mContext,
+                        mSwitchBar,
+                        mMetricsFeatureProvider,
+                        mPreference,
+                        mFragmentManager);
+    }
+
+    @Test
+    public void onSwitchChanged_false_recordsAMetric() {
+        mController.onSwitchChanged(null, false);
+
+        verify(mMetricsFeatureProvider)
+                .action(
+                        eq(mContext),
+                        eq(MetricsProto.MetricsEvent.ACTION_TOGGLE_STORAGE_MANAGER),
+                        eq(false));
+    }
+
+    @Test
+    public void onSwitchChanged_true_recordsAMetric() {
+        mController.onSwitchChanged(null, true);
+
+        verify(mMetricsFeatureProvider)
+                .action(
+                        eq(mContext),
+                        eq(MetricsProto.MetricsEvent.ACTION_TOGGLE_STORAGE_MANAGER),
+                        eq(true));
+    }
+
+    @Test
+    public void onSwitchChanged_showWarningFragmentIfNotEnabledByDefault() {
+        mController.onSwitchChanged(null, true);
+
+        verify(mFragmentManager.beginTransaction())
+                .add(any(Fragment.class), eq(ActivationWarningFragment.TAG));
+    }
+
+    @Config(shadows = {SettingsShadowSystemProperties.class})
+    @Test
+    public void onSwitchChange_doNotShowWarningFragmentIfEnabledByDefault() {
+        SettingsShadowSystemProperties.set("ro.storage_manager.enabled", "true");
+
+        mController.onSwitchChanged(null, true);
+
+        verify(mFragmentManager.beginTransaction(), never())
+                .add(any(Fragment.class), eq(ActivationWarningFragment.TAG));
+    }
+}
diff --git a/tests/robotests/src/com/android/settings/fuelgauge/PowerUsageAdvancedTest.java b/tests/robotests/src/com/android/settings/fuelgauge/PowerUsageAdvancedTest.java
index 6ac6500..4216d57 100644
--- a/tests/robotests/src/com/android/settings/fuelgauge/PowerUsageAdvancedTest.java
+++ b/tests/robotests/src/com/android/settings/fuelgauge/PowerUsageAdvancedTest.java
@@ -207,7 +207,7 @@
 
         assertThat(usageTypeSet).asList().containsExactly(UsageType.APP, UsageType.WIFI,
                 UsageType.CELL, UsageType.BLUETOOTH, UsageType.IDLE, UsageType.SERVICE,
-                UsageType.USER, UsageType.SYSTEM, UsageType.UNACCOUNTED);
+                UsageType.USER, UsageType.SYSTEM, UsageType.UNACCOUNTED, UsageType.OVERCOUNTED);
     }
 
     @Test
@@ -223,4 +223,27 @@
             assertThat(dataList.get(i - 1).totalPowerMah).isAtLeast(dataList.get(i).totalPowerMah);
         }
     }
+
+    @Test
+    public void testShouldHide_typeUnAccounted_returnTrue() {
+        mPowerUsageData.usageType = UsageType.UNACCOUNTED;
+
+        assertThat(mPowerUsageAdvanced.shouldHide(mPowerUsageData)).isTrue();
+    }
+
+
+    @Test
+    public void testShouldHide_typeOverCounted_returnTrue() {
+        mPowerUsageData.usageType = UsageType.OVERCOUNTED;
+
+        assertThat(mPowerUsageAdvanced.shouldHide(mPowerUsageData)).isTrue();
+    }
+
+
+    @Test
+    public void testShouldHide_typeNormal_returnFalse() {
+        mPowerUsageData.usageType = UsageType.APP;
+
+        assertThat(mPowerUsageAdvanced.shouldHide(mPowerUsageData)).isFalse();
+    }
 }
diff --git a/tests/robotests/src/com/android/settings/fuelgauge/PowerUsageSummaryTest.java b/tests/robotests/src/com/android/settings/fuelgauge/PowerUsageSummaryTest.java
index 5f2d54f..7f59b18 100644
--- a/tests/robotests/src/com/android/settings/fuelgauge/PowerUsageSummaryTest.java
+++ b/tests/robotests/src/com/android/settings/fuelgauge/PowerUsageSummaryTest.java
@@ -90,6 +90,7 @@
     private static final double TOTAL_POWER = 200;
     private static final double BATTERY_SCREEN_USAGE = 300;
     private static final double BATTERY_SYSTEM_USAGE = 600;
+    private static final double BATTERY_OVERCOUNTED_USAGE = 500;
     private static final double PRECISION = 0.001;
     private static final double POWER_USAGE_PERCENTAGE = 50;
     private static final Intent ADDITIONAL_BATTERY_INFO_INTENT =
@@ -112,6 +113,8 @@
     @Mock
     private BatterySipper mScreenBatterySipper;
     @Mock
+    private BatterySipper mOvercountedBatterySipper;
+    @Mock
     private BatterySipper mSystemBatterySipper;
     @Mock
     private BatterySipper mCellBatterySipper;
@@ -188,6 +191,9 @@
         mSystemBatterySipper.totalPowerMah = BATTERY_SYSTEM_USAGE;
         when(mSystemBatterySipper.getUid()).thenReturn(Process.SYSTEM_UID);
 
+        mOvercountedBatterySipper.drainType = BatterySipper.DrainType.OVERCOUNTED;
+        mOvercountedBatterySipper.totalPowerMah = BATTERY_OVERCOUNTED_USAGE;
+
         mUsageList = new ArrayList<>();
         mUsageList.add(mNormalBatterySipper);
         mUsageList.add(mScreenBatterySipper);
@@ -303,6 +309,7 @@
         sippers.add(mNormalBatterySipper);
         sippers.add(mScreenBatterySipper);
         sippers.add(mSystemBatterySipper);
+        sippers.add(mOvercountedBatterySipper);
         when(mFeatureFactory.powerUsageFeatureProvider.isTypeSystem(mSystemBatterySipper))
                 .thenReturn(true);
 
@@ -318,6 +325,18 @@
     }
 
     @Test
+    public void testShouldHideSipper_TypeUnAccounted_ReturnTrue() {
+        mNormalBatterySipper.drainType = BatterySipper.DrainType.UNACCOUNTED;
+        assertThat(mFragment.shouldHideSipper(mNormalBatterySipper)).isTrue();
+    }
+
+    @Test
+    public void testShouldHideSipper_TypeOverCounted_ReturnTrue() {
+        mNormalBatterySipper.drainType = BatterySipper.DrainType.OVERCOUNTED;
+        assertThat(mFragment.shouldHideSipper(mNormalBatterySipper)).isTrue();
+    }
+
+    @Test
     public void testShouldHideSipper_typeWifi_returnTrue() {
         mNormalBatterySipper.drainType = BatterySipper.DrainType.WIFI;
         assertThat(mFragment.shouldHideSipper(mNormalBatterySipper)).isTrue();