Merge "Import translations. DO NOT MERGE"
diff --git a/AndroidManifest.xml b/AndroidManifest.xml
index 3c13d25..cbf1eae 100644
--- a/AndroidManifest.xml
+++ b/AndroidManifest.xml
@@ -1435,6 +1435,7 @@
         </activity>
 
         <activity android:name=".accessibility.AccessibilitySettingsForSetupWizardActivity"
+                android:icon="@drawable/ic_accessibility_suggestion"
                 android:label="@string/vision_settings_title"
                 android:theme="@style/SetupWizardAccessibilityTheme"
                 android:taskAffinity="com.android.wizard" >
@@ -1442,6 +1443,12 @@
                 <action android:name="android.settings.ACCESSIBILITY_SETTINGS_FOR_SUW" />
                 <category android:name="android.intent.category.DEFAULT" />
             </intent-filter>
+            <intent-filter>
+                <action android:name="android.intent.action.MAIN" />
+                <category android:name="com.android.settings.suggested.category.DISPLAY_SETTINGS" />
+            </intent-filter>
+            <meta-data android:name="com.android.settings.title"
+                android:resource="@string/vision_settings_suggestion_title" />
             <meta-data android:name="com.android.settings.FRAGMENT_CLASS"
                 android:value="com.android.settings.accessibility.AccessibilitySettingsForSetupWizard" />
             <meta-data android:name="com.android.settings.PRIMARY_PROFILE_CONTROLLED"
diff --git a/res/drawable/ic_accessibility_suggestion.xml b/res/drawable/ic_accessibility_suggestion.xml
new file mode 100644
index 0000000..e21bd9f
--- /dev/null
+++ b/res/drawable/ic_accessibility_suggestion.xml
@@ -0,0 +1,26 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+    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.
+-->
+
+<vector xmlns:android="http://schemas.android.com/apk/res/android"
+        android:width="24dp"
+        android:height="24dp"
+        android:viewportWidth="24.0"
+        android:viewportHeight="24.0">
+    <path
+        android:fillColor="#ff767c81"
+        android:pathData="M9,4v3h5v12h3L17,7h5L22,4L9,4zM3,12h3v7h3v-7h3L12,9L3,9v3z"/>
+</vector>
diff --git a/res/drawable/ic_settings_night_display.xml b/res/drawable/ic_settings_night_display.xml
index 7f161e2..178b131 100644
--- a/res/drawable/ic_settings_night_display.xml
+++ b/res/drawable/ic_settings_night_display.xml
@@ -16,12 +16,10 @@
 <vector xmlns:android="http://schemas.android.com/apk/res/android"
     android:width="24dp"
     android:height="24dp"
-    android:viewportWidth="24"
-    android:viewportHeight="24"
+    android:viewportWidth="24.0"
+    android:viewportHeight="24.0"
     android:tint="?android:attr/colorControlNormal">
-
     <path
         android:fillColor="#FFF"
-        android:pathData="M6,12c0,5.5,4.5,10,10,10c1,0,2-0.2,3-0.5c-4.1-1.3-7-5.1-7-9.5s2.9-8.3,7-9.5C18.1,2.2,17.1,2,16,2C10.5,2,6,6.5,6,12z" />
-
-</vector>
+        android:pathData="M13,12c0,-3.57 2.2,-6.62 5.31,-7.87 0.89,-0.36 0.75,-1.69 -0.19,-1.9 -1.1,-0.24 -2.27,-0.3 -3.48,-0.14 -4.51,0.6 -8.12,4.31 -8.59,8.83C5.43,16.93 10.12,22 16,22c0.73,0 1.43,-0.08 2.12,-0.23 0.95,-0.21 1.1,-1.53 0.2,-1.9A8.471,8.471 0,0 1,13 12z" />
+</vector>
\ No newline at end of file
diff --git a/res/layout/confirm_lock_pattern_internal_base.xml b/res/layout/confirm_lock_pattern_internal_base.xml
index cd5739e..758fc0d 100644
--- a/res/layout/confirm_lock_pattern_internal_base.xml
+++ b/res/layout/confirm_lock_pattern_internal_base.xml
@@ -37,6 +37,7 @@
                 style="@style/LockPatternIconStyle"
                 android:layout_width="wrap_content"
                 android:layout_height="wrap_content"
+                android:layout_gravity="?attr/suwGlifHeaderGravity"
                 android:src="@drawable/ic_lock" />
 
             <TextView
diff --git a/res/layout/usb_dialog_container.xml b/res/layout/usb_dialog_container.xml
index e145911..bc6399f 100644
--- a/res/layout/usb_dialog_container.xml
+++ b/res/layout/usb_dialog_container.xml
@@ -25,6 +25,7 @@
         android:id="@+id/container"
         android:layout_width="match_parent"
         android:layout_height="wrap_content"
+        android:paddingTop="20dp"
         android:orientation="vertical" />
 
 </ScrollView>
diff --git a/res/values/strings.xml b/res/values/strings.xml
index 6130aec..ec7183a 100644
--- a/res/values/strings.xml
+++ b/res/values/strings.xml
@@ -1255,11 +1255,11 @@
     <!-- Title of a dialog shown when the user only has one attempt left to provide the lock before the device, one of its users, or a work profile is wiped. [CHAR LIMIT=NONE] -->
     <string name="lock_last_attempt_before_wipe_warning_title">Your data will be deleted</string>
     <!-- Content of the dialog shown when the user only has one attempt left to provide the device lock pattern before the device is wiped. [CHAR LIMIT=NONE] -->
-    <string name="lock_last_pattern_attempt_before_wipe_device">If you enter an incorrect pattern on the next attempt, this device's data will be deleted</string>
+    <string name="lock_last_pattern_attempt_before_wipe_device">If you enter an incorrect pattern on the next attempt, this device\'s data will be deleted</string>
     <!-- Content of the dialog shown when the user only has one attempt left to provide the device lock PIN before the device is wiped. [CHAR LIMIT=NONE] -->
-    <string name="lock_last_pin_attempt_before_wipe_device">If you enter an incorrect PIN on the next attempt, this device's data will be deleted</string>
+    <string name="lock_last_pin_attempt_before_wipe_device">If you enter an incorrect PIN on the next attempt, this device\'s data will be deleted</string>
     <!-- Content of the dialog shown when the user only has one attempt left to provide the device lock password before the device is wiped. [CHAR LIMIT=NONE] -->
-    <string name="lock_last_password_attempt_before_wipe_device">If you enter an incorrect password on the next attempt, this device's data will be deleted</string>
+    <string name="lock_last_password_attempt_before_wipe_device">If you enter an incorrect password on the next attempt, this device\'s data will be deleted</string>
     <!-- Content of the dialog shown when the user only has one attempt left to provide the user lock pattern before the user is removed. [CHAR LIMIT=NONE] -->
     <string name="lock_last_pattern_attempt_before_wipe_user">If you enter an incorrect pattern on the next attempt, this user will be deleted</string>
     <!-- Content of the dialog shown when the user only has one attempt left to provide the user lock PIN before the user is removed. [CHAR LIMIT=NONE] -->
@@ -1274,7 +1274,7 @@
     <string name="lock_last_password_attempt_before_wipe_profile">If you enter an incorrect password on the next attempt, your work profile and its data will be deleted</string>
 
     <!-- Content of the dialog shown when the user has failed to provide the device lock too many times and the device is wiped. [CHAR LIMIT=NONE] -->
-    <string name="lock_failed_attempts_now_wiping_device">Too many incorrect attempts. This device's data will be deleted.</string>
+    <string name="lock_failed_attempts_now_wiping_device">Too many incorrect attempts. This device\'s data will be deleted.</string>
     <!-- Content of the dialog shown when the user has failed to provide the user lock too many times and the user is removed. [CHAR LIMIT=NONE] -->
     <string name="lock_failed_attempts_now_wiping_user">Too many incorrect attempts. This user will be deleted.</string>
     <!-- Content of the dialog shown when the user has failed to provide the work lock too many times and the work profile is removed. [CHAR LIMIT=NONE] -->
@@ -4212,6 +4212,8 @@
     <string name="vision_settings_title">Vision Settings</string>
     <!-- Settings description for a brief version of Vision-Related Accessibility Settings. Tells the user that they can adjust these settings now to help them through the remainder of the Setup Wizard and that they can later be changed in Settings. Displayed in Setup Wizard only. [CHAR LIMIT=none] -->
     <string name="vision_settings_description">You can customize this device to fit your needs. These accessibility features can be changed later in Settings.</string>
+    <!-- Label for suggested action which will allow the user to change the font size and other accessibility settings. [CHAR LIMIT=40] -->
+    <string name="vision_settings_suggestion_title">Increase font size</string>
     <!-- Title for the accessibility preference category of screen reader services and settings. [CHAR LIMIT=50] -->
     <string name="screen_reader_category_title">Screen readers</string>
     <!-- Title for the accessibility preference category of audio services and settings. [CHAR LIMIT=50] -->
diff --git a/res/xml/power_usage_detail.xml b/res/xml/power_usage_detail.xml
index b7865d2..aa1540d 100644
--- a/res/xml/power_usage_detail.xml
+++ b/res/xml/power_usage_detail.xml
@@ -29,6 +29,11 @@
         android:selectable="false"
         android:order="-9999"/>
 
+    <Preference
+        android:key="high_usage"
+        android:icon="@drawable/ic_battery_alert_24dp"
+        android:title="@string/power_high_usage_title"/>
+
     <PreferenceCategory
         android:title="@string/battery_detail_info_title">
 
diff --git a/src/com/android/settings/applications/InstalledAppDetails.java b/src/com/android/settings/applications/InstalledAppDetails.java
index e66463d..b3aacb2 100755
--- a/src/com/android/settings/applications/InstalledAppDetails.java
+++ b/src/com/android/settings/applications/InstalledAppDetails.java
@@ -1052,7 +1052,7 @@
                 BatteryEntry entry = new BatteryEntry(getContext(), null, mUserManager, mSipper);
                 AdvancedPowerUsageDetail.startBatteryDetailPage((SettingsActivity) getActivity(),
                         this, mBatteryHelper, BatteryStats.STATS_SINCE_CHARGED, entry,
-                        mBatteryPercent);
+                        mBatteryPercent, null /* mAnomalies */);
             } else {
                 AdvancedPowerUsageDetail.startBatteryDetailPage((SettingsActivity) getActivity(),
                         this, mPackageName);
diff --git a/src/com/android/settings/fuelgauge/AdvancedPowerUsageDetail.java b/src/com/android/settings/fuelgauge/AdvancedPowerUsageDetail.java
index 016690c..0b1d4a8 100644
--- a/src/com/android/settings/fuelgauge/AdvancedPowerUsageDetail.java
+++ b/src/com/android/settings/fuelgauge/AdvancedPowerUsageDetail.java
@@ -17,9 +17,11 @@
 package com.android.settings.fuelgauge;
 
 import android.app.Activity;
+import android.app.LoaderManager;
 import android.app.admin.DevicePolicyManager;
 import android.content.Context;
 import android.content.Intent;
+import android.content.Loader;
 import android.content.pm.PackageManager;
 import android.os.BatteryStats;
 import android.os.Bundle;
@@ -43,6 +45,10 @@
 import com.android.settings.dashboard.DashboardFragment;
 import com.android.settings.enterprise.DevicePolicyManagerWrapper;
 import com.android.settings.enterprise.DevicePolicyManagerWrapperImpl;
+import com.android.settings.fuelgauge.anomaly.Anomaly;
+import com.android.settings.fuelgauge.anomaly.AnomalyDialogFragment;
+import com.android.settings.fuelgauge.anomaly.AnomalyLoader;
+import com.android.settings.fuelgauge.anomaly.AnomalySummaryPreferenceController;
 import com.android.settings.widget.EntityHeaderController;
 import com.android.settingslib.applications.AppUtils;
 import com.android.settingslib.applications.ApplicationsState;
@@ -55,10 +61,11 @@
  *
  * 1. Detail battery usage information for app(i.e. usage time, usage amount)
  * 2. Battery related controls for app(i.e uninstall, force stop)
- *
  */
 public class AdvancedPowerUsageDetail extends DashboardFragment implements
-        ButtonActionDialogFragment.AppButtonsDialogListener {
+        ButtonActionDialogFragment.AppButtonsDialogListener,
+        AnomalyDialogFragment.AnomalyDialogListener,
+        LoaderManager.LoaderCallbacks<List<Anomaly>> {
 
     public static final String TAG = "AdvancedPowerUsageDetail";
     public static final String EXTRA_UID = "extra_uid";
@@ -69,6 +76,7 @@
     public static final String EXTRA_ICON_ID = "extra_icon_id";
     public static final String EXTRA_POWER_USAGE_PERCENT = "extra_power_usage_percent";
     public static final String EXTRA_POWER_USAGE_AMOUNT = "extra_power_usage_amount";
+    public static final String EXTRA_ANOMALY_LIST = "extra_anomaly_list";
 
     private static final String KEY_PREF_FOREGROUND = "app_usage_foreground";
     private static final String KEY_PREF_BACKGROUND = "app_usage_background";
@@ -78,6 +86,8 @@
     private static final int REQUEST_UNINSTALL = 0;
     private static final int REQUEST_REMOVE_DEVICE_ADMIN = 1;
 
+    private static final int ANOMALY_LOADER = 0;
+
     @VisibleForTesting
     LayoutPreference mHeaderPreference;
     @VisibleForTesting
@@ -93,14 +103,19 @@
     Preference mBackgroundPreference;
     @VisibleForTesting
     Preference mPowerUsagePreference;
+    @VisibleForTesting
+    AnomalySummaryPreferenceController mAnomalySummaryPreferenceController;
     private AppButtonsPreferenceController mAppButtonsPreferenceController;
 
     private DevicePolicyManagerWrapper mDpm;
     private UserManager mUserManager;
     private PackageManager mPackageManager;
+    private List<Anomaly> mAnomalies;
+    private String mPackageName;
 
     public static void startBatteryDetailPage(SettingsActivity caller, PreferenceFragment fragment,
-            BatteryStatsHelper helper, int which, BatteryEntry entry, String usagePercent) {
+            BatteryStatsHelper helper, int which, BatteryEntry entry, String usagePercent,
+            List<Anomaly> anomalies) {
         // Initialize mStats if necessary.
         helper.getStats();
 
@@ -130,6 +145,7 @@
         args.putLong(EXTRA_FOREGROUND_TIME, foregroundTimeMs);
         args.putString(EXTRA_POWER_USAGE_PERCENT, usagePercent);
         args.putInt(EXTRA_POWER_USAGE_AMOUNT, (int) sipper.totalPowerMah);
+        args.putParcelableList(EXTRA_ANOMALY_LIST, anomalies);
 
         caller.startPreferencePanelAsUser(fragment, AdvancedPowerUsageDetail.class.getName(), args,
                 R.string.battery_details_title, null,
@@ -162,14 +178,17 @@
     public void onCreate(Bundle icicle) {
         super.onCreate(icicle);
 
+        mPackageName = getArguments().getString(EXTRA_PACKAGE_NAME);
+        mAnomalySummaryPreferenceController = new AnomalySummaryPreferenceController(
+                (SettingsActivity) getActivity(), this, MetricsEvent.FUELGAUGE_POWER_USAGE_DETAIL);
         mForegroundPreference = findPreference(KEY_PREF_FOREGROUND);
         mBackgroundPreference = findPreference(KEY_PREF_BACKGROUND);
         mPowerUsagePreference = findPreference(KEY_PREF_POWER_USAGE);
         mHeaderPreference = (LayoutPreference) findPreference(KEY_PREF_HEADER);
 
-        final String packageName = getArguments().getString(EXTRA_PACKAGE_NAME);
-        if (packageName != null) {
-            mAppEntry = mState.getEntry(packageName, UserHandle.myUserId());
+        if (mPackageName != null) {
+            mAppEntry = mState.getEntry(mPackageName, UserHandle.myUserId());
+            initAnomalyInfo();
         }
     }
 
@@ -182,6 +201,16 @@
     }
 
     @VisibleForTesting
+    void initAnomalyInfo() {
+        mAnomalies = getArguments().getParcelableArrayList(EXTRA_ANOMALY_LIST);
+        if (mAnomalies == null) {
+            getLoaderManager().initLoader(ANOMALY_LOADER, Bundle.EMPTY, this);
+        } else if (mAnomalies != null){
+            mAnomalySummaryPreferenceController.updateAnomalySummaryPreference(mAnomalies);
+        }
+    }
+
+    @VisibleForTesting
     void initHeader() {
         final View appSnippet = mHeaderPreference.findViewById(R.id.entity_header);
         final Activity context = getActivity();
@@ -235,6 +264,15 @@
     }
 
     @Override
+    public boolean onPreferenceTreeClick(Preference preference) {
+        if (TextUtils.equals(preference.getKey(), AnomalySummaryPreferenceController.ANOMALY_KEY)) {
+            mAnomalySummaryPreferenceController.onPreferenceTreeClick(preference);
+            return true;
+        }
+        return super.onPreferenceTreeClick(preference);
+    }
+
+    @Override
     public int getMetricsCategory() {
         return MetricsEvent.FUELGAUGE_POWER_USAGE_DETAIL;
     }
@@ -281,4 +319,24 @@
             mAppButtonsPreferenceController.handleDialogClick(id);
         }
     }
+
+    @Override
+    public void onAnomalyHandled(Anomaly anomaly) {
+        mAnomalySummaryPreferenceController.hideHighUsagePreference();
+    }
+
+    @Override
+    public Loader<List<Anomaly>> onCreateLoader(int id, Bundle args) {
+        return new AnomalyLoader(getContext(), mPackageName);
+    }
+
+    @Override
+    public void onLoadFinished(Loader<List<Anomaly>> loader, List<Anomaly> data) {
+        mAnomalySummaryPreferenceController.updateAnomalySummaryPreference(data);
+    }
+
+    @Override
+    public void onLoaderReset(Loader<List<Anomaly>> loader) {
+
+    }
 }
diff --git a/src/com/android/settings/fuelgauge/PowerUsageSummary.java b/src/com/android/settings/fuelgauge/PowerUsageSummary.java
index 1e4302a..0149e22 100644
--- a/src/com/android/settings/fuelgauge/PowerUsageSummary.java
+++ b/src/com/android/settings/fuelgauge/PowerUsageSummary.java
@@ -286,7 +286,8 @@
         PowerGaugePreference pgp = (PowerGaugePreference) preference;
         BatteryEntry entry = pgp.getInfo();
         AdvancedPowerUsageDetail.startBatteryDetailPage((SettingsActivity) getActivity(),
-                this, mStatsHelper, mStatsType, entry, pgp.getPercent());
+                this, mStatsHelper, mStatsType, entry, pgp.getPercent(),
+                mAnomalySparseArray.get(entry.sipper.getUid()));
         return super.onPreferenceTreeClick(preference);
     }
 
diff --git a/src/com/android/settings/fuelgauge/anomaly/AnomalySummaryPreferenceController.java b/src/com/android/settings/fuelgauge/anomaly/AnomalySummaryPreferenceController.java
index 23b4e77..47c2d2b 100644
--- a/src/com/android/settings/fuelgauge/anomaly/AnomalySummaryPreferenceController.java
+++ b/src/com/android/settings/fuelgauge/anomaly/AnomalySummaryPreferenceController.java
@@ -32,8 +32,9 @@
  */
 public class AnomalySummaryPreferenceController {
     private static final String TAG = "HighUsagePreferenceController";
-    @VisibleForTesting
-    static final String ANOMALY_KEY = "high_usage";
+
+    public static final String ANOMALY_KEY = "high_usage";
+
     private static final int REQUEST_ANOMALY_ACTION = 0;
     private PreferenceFragment mFragment;
     @VisibleForTesting
diff --git a/src/com/android/settings/fuelgauge/anomaly/checker/WakeLockAnomalyDetector.java b/src/com/android/settings/fuelgauge/anomaly/checker/WakeLockAnomalyDetector.java
index 74c43d0..545bb26 100644
--- a/src/com/android/settings/fuelgauge/anomaly/checker/WakeLockAnomalyDetector.java
+++ b/src/com/android/settings/fuelgauge/anomaly/checker/WakeLockAnomalyDetector.java
@@ -21,7 +21,6 @@
 import android.os.BatteryStats;
 import android.os.SystemClock;
 import android.support.annotation.VisibleForTesting;
-import android.util.ArrayMap;
 
 import com.android.internal.os.BatterySipper;
 import com.android.internal.os.BatteryStatsHelper;
@@ -87,23 +86,10 @@
                 continue;
             }
 
-            final ArrayMap<String, ? extends BatteryStats.Uid.Wakelock> wakelocks =
-                    uid.getWakelockStats();
-            long maxPartialWakeLockMs = 0;
+            final long currentDurationMs = getCurrentDurationMs(uid, rawRealtime);
+            final long backgroundDurationMs = getBackgroundTotalDurationMs(uid, rawRealtime);
 
-            for (int iw = wakelocks.size() - 1; iw >= 0; iw--) {
-                final BatteryStats.Timer timer = wakelocks.valueAt(iw).getWakeTime(
-                        BatteryStats.WAKE_TYPE_PARTIAL);
-                if (timer == null) {
-                    continue;
-                }
-                maxPartialWakeLockMs = Math.max(maxPartialWakeLockMs,
-                        getTotalDurationMs(timer, rawRealtime));
-            }
-
-            // Report application as anomaly if wakelock time is too long
-            // TODO(b/38233034): add more attributes to detect wakelock anomaly
-            if (maxPartialWakeLockMs > mWakeLockThresholdMs) {
+            if (backgroundDurationMs > mWakeLockThresholdMs && currentDurationMs != 0) {
                 final String packageName = mBatteryUtils.getPackageName(uid.getUid());
                 final CharSequence displayName = Utils.getApplicationLabel(mContext,
                         packageName);
@@ -119,16 +105,22 @@
                     anomalies.add(anomaly);
                 }
             }
-
         }
         return anomalies;
     }
 
     @VisibleForTesting
-    long getTotalDurationMs(BatteryStats.Timer timer, long rawRealtime) {
-        if (timer == null) {
-            return 0;
-        }
-        return timer.getTotalDurationMsLocked(rawRealtime);
+    long getCurrentDurationMs(BatteryStats.Uid uid, long elapsedRealtimeMs) {
+        BatteryStats.Timer timer = uid.getAggregatedPartialWakelockTimer();
+
+        return timer != null ? timer.getCurrentDurationMsLocked(elapsedRealtimeMs) : 0;
+    }
+
+    @VisibleForTesting
+    long getBackgroundTotalDurationMs(BatteryStats.Uid uid, long elapsedRealtimeMs) {
+        BatteryStats.Timer timer = uid.getAggregatedPartialWakelockTimer();
+        BatteryStats.Timer subTimer = timer != null ? timer.getSubTimer() : null;
+
+        return subTimer != null ? subTimer.getTotalDurationMsLocked(elapsedRealtimeMs) : 0;
     }
 }
diff --git a/src/com/android/settings/notification/AppNotificationSettings.java b/src/com/android/settings/notification/AppNotificationSettings.java
index db060b6..deb5c4d 100644
--- a/src/com/android/settings/notification/AppNotificationSettings.java
+++ b/src/com/android/settings/notification/AppNotificationSettings.java
@@ -137,7 +137,7 @@
                 .setLabel(mAppRow.label)
                 .setPackageName(mAppRow.pkg)
                 .setUid(mAppRow.uid)
-                .setButtonActions(EntityHeaderController.ActionType.ACTION_APP_INFO,
+                .setButtonActions(EntityHeaderController.ActionType.ACTION_NONE,
                         EntityHeaderController.ActionType.ACTION_NOTIF_PREFERENCE)
                 .done(activity, getPrefContext());
         pref.setKey(KEY_HEADER);
diff --git a/src/com/android/settings/password/ChooseLockSettingsHelper.java b/src/com/android/settings/password/ChooseLockSettingsHelper.java
index 95f5a54..b5a838f 100644
--- a/src/com/android/settings/password/ChooseLockSettingsHelper.java
+++ b/src/com/android/settings/password/ChooseLockSettingsHelper.java
@@ -21,16 +21,15 @@
 import android.app.Fragment;
 import android.app.KeyguardManager;
 import android.app.admin.DevicePolicyManager;
-import android.content.Context;
 import android.content.Intent;
 import android.content.IntentSender;
 import android.os.UserManager;
-import android.provider.Settings;
 
 import com.android.internal.annotations.VisibleForTesting;
 import com.android.internal.widget.LockPatternUtils;
 import com.android.settings.SettingsActivity;
 import com.android.settings.Utils;
+import com.android.setupwizardlib.util.WizardManagerHelper;
 
 public final class ChooseLockSettingsHelper {
 
@@ -278,8 +277,10 @@
             }
         } else {
             if (mFragment != null) {
+                copyInternalExtras(mFragment.getActivity().getIntent(), intent);
                 mFragment.startActivityForResult(intent, request);
             } else {
+                copyInternalExtras(mActivity.getIntent(), intent);
                 mActivity.startActivityForResult(intent, request);
             }
         }
@@ -304,4 +305,11 @@
             outIntent.addFlags(Intent.FLAG_ACTIVITY_NO_HISTORY);
         }
     }
+
+    private void copyInternalExtras(Intent inIntent, Intent outIntent) {
+        String theme = inIntent.getStringExtra(WizardManagerHelper.EXTRA_THEME);
+        if (theme != null) {
+            outIntent.putExtra(WizardManagerHelper.EXTRA_THEME, theme);
+        }
+    }
 }
diff --git a/src/com/android/settings/password/ConfirmDeviceCredentialBaseActivity.java b/src/com/android/settings/password/ConfirmDeviceCredentialBaseActivity.java
index 2de955f..2b2b38f 100644
--- a/src/com/android/settings/password/ConfirmDeviceCredentialBaseActivity.java
+++ b/src/com/android/settings/password/ConfirmDeviceCredentialBaseActivity.java
@@ -26,6 +26,7 @@
 
 import com.android.settings.R;
 import com.android.settings.SettingsActivity;
+import com.android.settings.SetupWizardUtils;
 import com.android.settings.Utils;
 
 public abstract class ConfirmDeviceCredentialBaseActivity extends SettingsActivity {
@@ -56,7 +57,7 @@
             setTheme(R.style.Theme_ConfirmDeviceCredentialsDark);
             mConfirmCredentialTheme = ConfirmCredentialTheme.DARK;
         } else {
-            setTheme(R.style.GlifTheme_Light);
+            setTheme(SetupWizardUtils.getTheme(getIntent()));
             mConfirmCredentialTheme = ConfirmCredentialTheme.INTERNAL;
         }
         super.onCreate(savedState);
diff --git a/src/com/android/settings/wifi/WifiSettings.java b/src/com/android/settings/wifi/WifiSettings.java
index 3cfb17d..c6c5de7 100644
--- a/src/com/android/settings/wifi/WifiSettings.java
+++ b/src/com/android/settings/wifi/WifiSettings.java
@@ -449,20 +449,6 @@
             case MENU_ID_WPS_PBC:
                 showDialog(WPS_PBC_DIALOG_ID);
                 return true;
-                /*
-            case MENU_ID_P2P:
-                if (getActivity() instanceof SettingsActivity) {
-                    ((SettingsActivity) getActivity()).startPreferencePanel(
-                            WifiP2pSettings.class.getCanonicalName(),
-                            null,
-                            R.string.wifi_p2p_settings_title, null,
-                            this, 0);
-                } else {
-                    startFragment(this, WifiP2pSettings.class.getCanonicalName(),
-                            R.string.wifi_p2p_settings_title, -1, null);
-                }
-                return true;
-                */
             case MENU_ID_WPS_PIN:
                 showDialog(WPS_PIN_DIALOG_ID);
                 return true;
diff --git a/tests/app/src/com/android/settings/notification/AppNotificationSettingsTest.java b/tests/app/src/com/android/settings/notification/AppNotificationSettingsTest.java
new file mode 100644
index 0000000..22e98c7
--- /dev/null
+++ b/tests/app/src/com/android/settings/notification/AppNotificationSettingsTest.java
@@ -0,0 +1,63 @@
+/*
+ * 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.notification;
+
+import android.app.Instrumentation;
+import android.content.Context;
+import android.content.Intent;
+import android.provider.Settings;
+import android.support.test.InstrumentationRegistry;
+import android.support.test.espresso.matcher.ViewMatchers;
+import android.support.test.filters.SmallTest;
+import android.support.test.runner.AndroidJUnit4;
+
+import org.junit.Before;
+import org.junit.Test;
+import org.junit.runner.RunWith;
+
+import static android.support.test.espresso.Espresso.onView;
+import static android.support.test.espresso.assertion.ViewAssertions.doesNotExist;
+import static android.support.test.espresso.matcher.ViewMatchers.withEffectiveVisibility;
+import static android.support.test.espresso.matcher.ViewMatchers.withId;
+import static org.hamcrest.Matchers.allOf;
+
+@RunWith(AndroidJUnit4.class)
+@SmallTest
+public class AppNotificationSettingsTest {
+
+    private Context mTargetContext;
+    private Instrumentation mInstrumentation;
+
+    @Before
+    public void setUp() {
+        mInstrumentation = InstrumentationRegistry.getInstrumentation();
+        mTargetContext = mInstrumentation.getTargetContext();
+    }
+
+    @Test
+    public void launchNotificationSetting_shouldNotHaveAppInfoLink() {
+        final Intent intent = new Intent(Settings.ACTION_APP_NOTIFICATION_SETTINGS)
+                .putExtra(Settings.EXTRA_APP_PACKAGE, mTargetContext.getPackageName());
+
+        mInstrumentation.startActivitySync(intent);
+
+        onView(allOf(withId(android.R.id.button1),
+                withEffectiveVisibility(ViewMatchers.Visibility.VISIBLE)))
+                .check(doesNotExist());
+    }
+
+}
diff --git a/tests/robotests/src/com/android/settings/fuelgauge/AdvancedPowerUsageDetailTest.java b/tests/robotests/src/com/android/settings/fuelgauge/AdvancedPowerUsageDetailTest.java
index d837c40..a78c385 100644
--- a/tests/robotests/src/com/android/settings/fuelgauge/AdvancedPowerUsageDetailTest.java
+++ b/tests/robotests/src/com/android/settings/fuelgauge/AdvancedPowerUsageDetailTest.java
@@ -19,6 +19,7 @@
 import static com.google.common.truth.Truth.assertThat;
 
 import static org.mockito.ArgumentMatchers.nullable;
+import static org.mockito.Matchers.any;
 import static org.mockito.Matchers.anyInt;
 import static org.mockito.Matchers.anyLong;
 import static org.mockito.Matchers.eq;
@@ -30,6 +31,7 @@
 
 import android.app.Activity;
 import android.app.Fragment;
+import android.app.LoaderManager;
 import android.content.Context;
 import android.content.pm.ApplicationInfo;
 import android.content.pm.PackageManager;
@@ -43,6 +45,8 @@
 import com.android.internal.os.BatterySipper;
 import com.android.internal.os.BatteryStatsHelper;
 import com.android.settings.SettingsActivity;
+import com.android.settings.fuelgauge.anomaly.Anomaly;
+import com.android.settings.fuelgauge.anomaly.AnomalySummaryPreferenceController;
 import com.android.settings.testutils.SettingsRobolectricTestRunner;
 import com.android.settings.TestConfig;
 import com.android.settings.applications.LayoutPreference;
@@ -68,6 +72,9 @@
 import org.robolectric.annotation.Config;
 import org.robolectric.util.ReflectionHelpers;
 
+import java.util.ArrayList;
+import java.util.List;
+
 @RunWith(SettingsRobolectricTestRunner.class)
 @Config(manifest = TestConfig.MANIFEST_PATH, sdk = TestConfig.SDK_VERSION,
         shadows = ShadowEntityHeaderController.class)
@@ -108,6 +115,10 @@
     private BatteryStats.Uid mUid;
     @Mock
     private PackageManager mPackageManager;
+    @Mock
+    private LoaderManager mLoaderManager;
+    @Mock
+    private AnomalySummaryPreferenceController mAnomalySummaryPreferenceController;
     private Context mContext;
     private Preference mForegroundPreference;
     private Preference mBackgroundPreference;
@@ -115,6 +126,7 @@
     private AdvancedPowerUsageDetail mFragment;
     private FakeFeatureFactory mFeatureFactory;
     private SettingsActivity mTestActivity;
+    private List<Anomaly> mAnomalies;
 
     @Before
     public void setUp() {
@@ -130,6 +142,7 @@
         doReturn(SUMMARY).when(mFragment).getString(anyInt());
         doReturn(APP_LABEL).when(mBundle).getString(nullable(String.class));
         doReturn(mBundle).when(mFragment).getArguments();
+        doReturn(mLoaderManager).when(mFragment).getLoaderManager();
 
         ShadowEntityHeaderController.setUseMock(mEntityHeaderController);
         doReturn(mEntityHeaderController).when(mEntityHeaderController)
@@ -184,6 +197,11 @@
         mFragment.mForegroundPreference = mForegroundPreference;
         mFragment.mBackgroundPreference = mBackgroundPreference;
         mFragment.mPowerUsagePreference = mPowerUsagePreference;
+        mFragment.mAnomalySummaryPreferenceController = mAnomalySummaryPreferenceController;
+
+        mAnomalies = new ArrayList<>();
+        mAnomalies.add(new Anomaly.Builder().setUid(UID).setType(
+                Anomaly.AnomalyType.WAKE_LOCK).build());
     }
 
     @After
@@ -238,7 +256,7 @@
     @Test
     public void testStartBatteryDetailPage_hasBasicData() {
         AdvancedPowerUsageDetail.startBatteryDetailPage(mTestActivity, null, mBatteryStatsHelper, 0,
-                mBatteryEntry, USAGE_PERCENT);
+                mBatteryEntry, USAGE_PERCENT, mAnomalies);
 
         assertThat(mBundle.getInt(AdvancedPowerUsageDetail.EXTRA_UID)).isEqualTo(UID);
         assertThat(mBundle.getLong(AdvancedPowerUsageDetail.EXTRA_BACKGROUND_TIME)).isEqualTo(
@@ -247,6 +265,8 @@
                 FOREGROUND_TIME_MS);
         assertThat(mBundle.getString(AdvancedPowerUsageDetail.EXTRA_POWER_USAGE_PERCENT)).isEqualTo(
                 USAGE_PERCENT);
+        assertThat(mBundle.getParcelableArrayList(
+                AdvancedPowerUsageDetail.EXTRA_ANOMALY_LIST)).isEqualTo(mAnomalies);
     }
 
     @Test
@@ -255,7 +275,7 @@
         mBatterySipper.usageTimeMs = PHONE_FOREGROUND_TIME_MS;
 
         AdvancedPowerUsageDetail.startBatteryDetailPage(mTestActivity, null, mBatteryStatsHelper, 0,
-                mBatteryEntry, USAGE_PERCENT);
+                mBatteryEntry, USAGE_PERCENT, null);
 
         assertThat(mBundle.getInt(AdvancedPowerUsageDetail.EXTRA_UID)).isEqualTo(UID);
         assertThat(mBundle.getLong(AdvancedPowerUsageDetail.EXTRA_FOREGROUND_TIME)).isEqualTo(
@@ -264,6 +284,8 @@
                 PHONE_BACKGROUND_TIME_MS);
         assertThat(mBundle.getString(AdvancedPowerUsageDetail.EXTRA_POWER_USAGE_PERCENT)).isEqualTo(
                 USAGE_PERCENT);
+        assertThat(mBundle.getParcelableArrayList(
+                AdvancedPowerUsageDetail.EXTRA_ANOMALY_LIST)).isNull();
     }
 
     @Test
@@ -271,21 +293,25 @@
         mBatterySipper.mPackages = PACKAGE_NAME;
         mBatteryEntry.defaultPackageName = PACKAGE_NAME[0];
         AdvancedPowerUsageDetail.startBatteryDetailPage(mTestActivity, null, mBatteryStatsHelper, 0,
-                mBatteryEntry, USAGE_PERCENT);
+                mBatteryEntry, USAGE_PERCENT, mAnomalies);
 
         assertThat(mBundle.getString(AdvancedPowerUsageDetail.EXTRA_PACKAGE_NAME)).isEqualTo(
                 PACKAGE_NAME[0]);
+        assertThat(mBundle.getParcelableArrayList(
+                AdvancedPowerUsageDetail.EXTRA_ANOMALY_LIST)).isEqualTo(mAnomalies);
     }
 
     @Test
     public void testStartBatteryDetailPage_SystemApp() {
         mBatterySipper.mPackages = null;
         AdvancedPowerUsageDetail.startBatteryDetailPage(mTestActivity, null, mBatteryStatsHelper, 0,
-                mBatteryEntry, USAGE_PERCENT);
+                mBatteryEntry, USAGE_PERCENT, null);
 
         assertThat(mBundle.getString(AdvancedPowerUsageDetail.EXTRA_LABEL)).isEqualTo(APP_LABEL);
         assertThat(mBundle.getInt(AdvancedPowerUsageDetail.EXTRA_ICON_ID)).isEqualTo(ICON_ID);
-        assertThat(mBundle.getString(AdvancedPowerUsageDetail.EXTRA_PACKAGE_NAME)).isEqualTo(null);
+        assertThat(mBundle.getString(AdvancedPowerUsageDetail.EXTRA_PACKAGE_NAME)).isNull();
+        assertThat(mBundle.getParcelableArrayList(
+                AdvancedPowerUsageDetail.EXTRA_ANOMALY_LIST)).isNull();
     }
 
     @Test
@@ -294,7 +320,7 @@
         mBatterySipper.mPackages = PACKAGE_NAME;
         doReturn(appUid).when(mBatterySipper).getUid();
         AdvancedPowerUsageDetail.startBatteryDetailPage(mTestActivity, null, mBatteryStatsHelper, 0,
-                mBatteryEntry, USAGE_PERCENT);
+                mBatteryEntry, USAGE_PERCENT, null);
 
         verify(mTestActivity).startPreferencePanelAsUser(
                 nullable(Fragment.class), nullable(String.class), nullable(Bundle.class), anyInt(),
@@ -344,4 +370,24 @@
         assertThat(mPowerUsagePreference.getSummary()).isEqualTo("16% of total app usage (150mAh)");
     }
 
+    @Test
+    public void testInitAnomalyInfo_anomalyNull_startAnomalyLoader() {
+        doReturn(null).when(mBundle).getParcelableArrayList(
+                AdvancedPowerUsageDetail.EXTRA_ANOMALY_LIST);
+
+        mFragment.initAnomalyInfo();
+
+        verify(mLoaderManager).initLoader(eq(0), eq(Bundle.EMPTY), any());
+    }
+
+    @Test
+    public void testInitAnomalyInfo_anomalyExisted_updateAnomaly() {
+        doReturn(mAnomalies).when(mBundle).getParcelableArrayList(
+                AdvancedPowerUsageDetail.EXTRA_ANOMALY_LIST);
+
+        mFragment.initAnomalyInfo();
+
+        verify(mAnomalySummaryPreferenceController).updateAnomalySummaryPreference(mAnomalies);
+    }
+
 }
diff --git a/tests/robotests/src/com/android/settings/fuelgauge/anomaly/checker/WakeLockAnomalyDetectorTest.java b/tests/robotests/src/com/android/settings/fuelgauge/anomaly/checker/WakeLockAnomalyDetectorTest.java
index 386e162..19ab7d6 100644
--- a/tests/robotests/src/com/android/settings/fuelgauge/anomaly/checker/WakeLockAnomalyDetectorTest.java
+++ b/tests/robotests/src/com/android/settings/fuelgauge/anomaly/checker/WakeLockAnomalyDetectorTest.java
@@ -31,7 +31,6 @@
 import android.content.pm.PackageManager;
 import android.os.BatteryStats;
 import android.text.format.DateUtils;
-import android.util.ArrayMap;
 
 import com.android.internal.os.BatterySipper;
 import com.android.internal.os.BatteryStatsHelper;
@@ -64,6 +63,7 @@
     private static final int ANOMALY_UID = 111;
     private static final int NORMAL_UID = 222;
     private static final int TARGET_UID = 333;
+    private static final int INACTIVE_UID = 444;
     @Mock
     private BatteryStatsHelper mBatteryStatsHelper;
     @Mock
@@ -71,19 +71,9 @@
     @Mock
     private BatterySipper mTargetSipper;
     @Mock
-    private BatteryStats.Timer mAnomalyTimer;
-    @Mock
-    private BatteryStats.Uid.Wakelock mAnomalyWakelock;
-    @Mock
     private BatterySipper mNormalSipper;
     @Mock
-    private BatteryStats.Timer mNormalTimer;
-    @Mock
-    private BatteryStats.Timer mTargetTimer;
-    @Mock
-    private BatteryStats.Uid.Wakelock mNormalWakelock;
-    @Mock
-    private BatteryStats.Uid.Wakelock mTargetWakelock;
+    private BatterySipper mInactiveSipper;
     @Mock
     private BatteryStats.Uid mAnomalyUid;
     @Mock
@@ -91,6 +81,8 @@
     @Mock
     private BatteryStats.Uid mTargetUid;
     @Mock
+    private BatteryStats.Uid mInactiveUid;
+    @Mock
     private BatteryUtils mBatteryUtils;
     @Mock
     private PackageManager mPackageManager;
@@ -101,9 +93,6 @@
     @Mock
     private AnomalyAction mAnomalyAction;
 
-    private ArrayMap<String, BatteryStats.Uid.Wakelock> mAnomalyWakelocks;
-    private ArrayMap<String, BatteryStats.Uid.Wakelock> mNormalWakelocks;
-    private ArrayMap<String, BatteryStats.Uid.Wakelock> mTargetWakelocks;
     private WakeLockAnomalyDetector mWakelockAnomalyDetector;
     private Context mContext;
     private List<BatterySipper> mUsageList;
@@ -121,42 +110,44 @@
                 .getApplicationInfo(nullable(String.class), anyInt());
         doReturn(true).when(mAnomalyAction).isActionActive(any());
 
+        mWakelockAnomalyDetector = spy(new WakeLockAnomalyDetector(mContext, mPolicy));
+        mWakelockAnomalyDetector.mBatteryUtils = mBatteryUtils;
+        mWakelockAnomalyDetector.mAnomalyAction = mAnomalyAction;
+
         mAnomalySipper.uidObj = mAnomalyUid;
-        mAnomalyWakelocks = new ArrayMap<>();
-        mAnomalyWakelocks.put("", mAnomalyWakelock);
-        doReturn(mAnomalyWakelocks).when(mAnomalyUid).getWakelockStats();
-        doReturn(mAnomalyTimer).when(mAnomalyWakelock).getWakeTime(BatteryStats.WAKE_TYPE_PARTIAL);
+        doReturn(ANOMALY_WAKELOCK_TIME_MS).when(mWakelockAnomalyDetector)
+                .getBackgroundTotalDurationMs(eq(mAnomalyUid), anyLong());
+        doReturn(ANOMALY_WAKELOCK_TIME_MS).when(mWakelockAnomalyDetector).getCurrentDurationMs(
+                eq(mAnomalyUid), anyLong());
         doReturn(ANOMALY_UID).when(mAnomalyUid).getUid();
 
         mNormalSipper.uidObj = mNormalUid;
-        mNormalWakelocks = new ArrayMap<>();
-        mNormalWakelocks.put("", mNormalWakelock);
-        doReturn(mNormalTimer).when(mNormalWakelock).getWakeTime(BatteryStats.WAKE_TYPE_PARTIAL);
-        doReturn(mNormalWakelocks).when(mNormalUid).getWakelockStats();
+        doReturn(NORMAL_WAKELOCK_TIME_MS).when(mWakelockAnomalyDetector)
+                .getBackgroundTotalDurationMs(eq(mNormalUid), anyLong());
+        doReturn(0L).when(mWakelockAnomalyDetector).getCurrentDurationMs(eq(mNormalUid),
+                anyLong());
         doReturn(NORMAL_UID).when(mNormalUid).getUid();
 
         mTargetSipper.uidObj = mTargetUid;
-        mTargetWakelocks = new ArrayMap<>();
-        mTargetWakelocks.put("", mTargetWakelock);
-        doReturn(mTargetTimer).when(mTargetWakelock).getWakeTime(BatteryStats.WAKE_TYPE_PARTIAL);
-        doReturn(mTargetWakelocks).when(mTargetUid).getWakelockStats();
+        doReturn(ANOMALY_WAKELOCK_TIME_MS).when(mWakelockAnomalyDetector)
+                .getBackgroundTotalDurationMs(eq(mTargetUid), anyLong());
+        doReturn(ANOMALY_WAKELOCK_TIME_MS).when(mWakelockAnomalyDetector).getCurrentDurationMs(
+                eq(mTargetUid), anyLong());
         doReturn(TARGET_UID).when(mTargetUid).getUid();
 
+        mInactiveSipper.uidObj = mInactiveUid;
+        doReturn(ANOMALY_WAKELOCK_TIME_MS).when(mWakelockAnomalyDetector)
+                .getBackgroundTotalDurationMs(eq(mInactiveUid), anyLong());
+        doReturn(0L).when(mWakelockAnomalyDetector).getCurrentDurationMs(eq(mInactiveUid),
+                anyLong());
+        doReturn(INACTIVE_UID).when(mInactiveUid).getUid();
+
         mUsageList = new ArrayList<>();
         mUsageList.add(mAnomalySipper);
         mUsageList.add(mNormalSipper);
         mUsageList.add(mTargetSipper);
+        mUsageList.add(mInactiveSipper);
         doReturn(mUsageList).when(mBatteryStatsHelper).getUsageList();
-
-        mWakelockAnomalyDetector = spy(new WakeLockAnomalyDetector(mContext, mPolicy));
-        mWakelockAnomalyDetector.mBatteryUtils = mBatteryUtils;
-        mWakelockAnomalyDetector.mAnomalyAction = mAnomalyAction;
-        doReturn(ANOMALY_WAKELOCK_TIME_MS).when(mWakelockAnomalyDetector).getTotalDurationMs(
-                eq(mAnomalyTimer), anyLong());
-        doReturn(ANOMALY_WAKELOCK_TIME_MS).when(mWakelockAnomalyDetector).getTotalDurationMs(
-                eq(mTargetTimer), anyLong());
-        doReturn(NORMAL_WAKELOCK_TIME_MS).when(mWakelockAnomalyDetector).getTotalDurationMs(
-                eq(mNormalTimer), anyLong());
     }
 
     @Test
diff --git a/tests/robotests/src/com/android/settings/password/ChooseLockSettingsHelperTest.java b/tests/robotests/src/com/android/settings/password/ChooseLockSettingsHelperTest.java
new file mode 100644
index 0000000..20a05e3
--- /dev/null
+++ b/tests/robotests/src/com/android/settings/password/ChooseLockSettingsHelperTest.java
@@ -0,0 +1,157 @@
+package com.android.settings.password;
+
+import static com.google.common.truth.Truth.assertThat;
+
+import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertFalse;
+import static org.junit.Assert.assertTrue;
+import static org.mockito.Matchers.anyInt;
+import static org.mockito.Mockito.mock;
+import static org.mockito.Mockito.when;
+
+import android.app.Activity;
+import android.app.admin.DevicePolicyManager;
+import android.content.ComponentName;
+import android.content.Intent;
+import android.os.UserHandle;
+
+import com.android.internal.widget.LockPatternUtils;
+import com.android.settings.TestConfig;
+import com.android.settings.testutils.SettingsRobolectricTestRunner;
+import com.android.settings.testutils.shadow.ShadowUserManager;
+import com.android.settings.testutils.shadow.ShadowUtils;
+import com.android.setupwizardlib.util.WizardManagerHelper;
+
+import org.junit.Test;
+import org.junit.runner.RunWith;
+import org.robolectric.Robolectric;
+import org.robolectric.Shadows;
+import org.robolectric.annotation.Config;
+import org.robolectric.shadows.ShadowActivity;
+import org.robolectric.shadows.ShadowActivity.IntentForResult;
+
+@RunWith(SettingsRobolectricTestRunner.class)
+@Config(
+        manifest = TestConfig.MANIFEST_PATH,
+        sdk = TestConfig.SDK_VERSION,
+        shadows = {
+                ShadowUserManager.class,
+                ShadowUtils.class
+        })
+public class ChooseLockSettingsHelperTest {
+
+    @Test
+    public void testLaunchConfirmationActivityWithExternalAndChallenge() {
+
+        final int userId = UserHandle.myUserId();
+        final int request = 100;
+        final long challenge = 10000L;
+
+        final Activity activity = Robolectric.setupActivity(Activity.class);
+        ChooseLockSettingsHelper helper = getChooseLockSettingsHelper(activity);
+        helper.launchConfirmationActivityWithExternalAndChallenge(
+                request, // request
+                "title",
+                "header",
+                "description",
+                true, // external
+                challenge,
+                userId
+        );
+
+        ShadowActivity shadowActivity = Shadows.shadowOf(activity);
+        Intent startedIntent = shadowActivity.getNextStartedActivity();
+
+        assertEquals(new ComponentName("com.android.settings",
+                        ConfirmLockPattern.InternalActivity.class.getName()),
+                startedIntent.getComponent());
+        assertFalse(startedIntent.getBooleanExtra(
+                ChooseLockSettingsHelper.EXTRA_KEY_RETURN_CREDENTIALS, false));
+        assertTrue(startedIntent.getBooleanExtra(
+                ChooseLockSettingsHelper.EXTRA_KEY_HAS_CHALLENGE, false));
+        assertEquals(challenge, startedIntent.getLongExtra(
+                ChooseLockSettingsHelper.EXTRA_KEY_CHALLENGE, 0L));
+        assertEquals(
+                true,
+                (startedIntent.getFlags() & Intent.FLAG_ACTIVITY_FORWARD_RESULT) != 0);
+        assertEquals(true, startedIntent.getBooleanExtra(
+                ConfirmDeviceCredentialBaseFragment.ALLOW_FP_AUTHENTICATION, false));
+        assertEquals(true, startedIntent.getBooleanExtra(
+                ConfirmDeviceCredentialBaseFragment.DARK_THEME, false));
+        assertEquals(true, startedIntent.getBooleanExtra(
+                ConfirmDeviceCredentialBaseFragment.SHOW_CANCEL_BUTTON, false));
+        assertEquals(true, startedIntent.getBooleanExtra(
+                ConfirmDeviceCredentialBaseFragment.SHOW_WHEN_LOCKED, false));
+    }
+
+    @Test
+    public void testLaunchConfirmationActivityInternalAndChallenge() {
+
+        final int userId = UserHandle.myUserId();
+        final int request = 100;
+        final long challenge = 10000L;
+
+        final Activity activity = Robolectric.setupActivity(Activity.class);
+        ChooseLockSettingsHelper helper = getChooseLockSettingsHelper(activity);
+        helper.launchConfirmationActivityWithExternalAndChallenge(
+                request,
+                "title",
+                "header",
+                "description",
+                false, // external
+                challenge,
+                userId
+        );
+        ShadowActivity shadowActivity = Shadows.shadowOf(activity);
+        Intent startedIntent = shadowActivity.getNextStartedActivity();
+
+        assertEquals(new ComponentName("com.android.settings",
+                        ConfirmLockPattern.InternalActivity.class.getName()),
+                startedIntent.getComponent());
+        assertFalse(startedIntent.getBooleanExtra(
+                ChooseLockSettingsHelper.EXTRA_KEY_RETURN_CREDENTIALS, false));
+        assertTrue(startedIntent.getBooleanExtra(
+                ChooseLockSettingsHelper.EXTRA_KEY_HAS_CHALLENGE, false));
+        assertEquals(challenge, startedIntent.getLongExtra(
+                ChooseLockSettingsHelper.EXTRA_KEY_CHALLENGE, 0L));
+        assertEquals(
+                false,
+                (startedIntent.getFlags() & Intent.FLAG_ACTIVITY_FORWARD_RESULT) != 0);
+        assertEquals(false, startedIntent.getBooleanExtra(
+                ConfirmDeviceCredentialBaseFragment.ALLOW_FP_AUTHENTICATION, false));
+        assertEquals(false, startedIntent.getBooleanExtra(
+                ConfirmDeviceCredentialBaseFragment.DARK_THEME, false));
+        assertEquals(false, startedIntent.getBooleanExtra(
+                ConfirmDeviceCredentialBaseFragment.SHOW_CANCEL_BUTTON, false));
+        assertEquals(false, startedIntent.getBooleanExtra(
+                ConfirmDeviceCredentialBaseFragment.SHOW_WHEN_LOCKED, false));
+    }
+
+    @Test
+    public void testLaunchConfirmationActivity_internal_shouldPropagateTheme() {
+        Intent intent = new Intent()
+                .putExtra(WizardManagerHelper.EXTRA_THEME, WizardManagerHelper.THEME_GLIF_V2);
+        Activity activity = Robolectric.buildActivity(Activity.class)
+                .withIntent(intent)
+                .get();
+        ChooseLockSettingsHelper helper = getChooseLockSettingsHelper(activity);
+        helper.launchConfirmationActivity(123, "test title", true, 0 /* userId */);
+
+        ShadowActivity shadowActivity = Shadows.shadowOf(activity);
+        IntentForResult startedActivity = shadowActivity.getNextStartedActivityForResult();
+        assertThat(startedActivity.requestCode).isEqualTo(123);
+        assertThat(startedActivity.intent.getStringExtra(WizardManagerHelper.EXTRA_THEME))
+                .isEqualTo(WizardManagerHelper.THEME_GLIF_V2);
+    }
+
+
+    private ChooseLockSettingsHelper getChooseLockSettingsHelper(Activity activity) {
+        LockPatternUtils mockLockPatternUtils = mock(LockPatternUtils.class);
+        when(mockLockPatternUtils.getKeyguardStoredPasswordQuality(anyInt()))
+                .thenReturn(DevicePolicyManager.PASSWORD_QUALITY_SOMETHING);
+
+        ChooseLockSettingsHelper helper = new ChooseLockSettingsHelper(activity);
+        helper.mLockPatternUtils = mockLockPatternUtils;
+        return helper;
+    }
+}
diff --git a/tests/robotests/src/com/android/settings/testutils/shadow/ShadowUserManager.java b/tests/robotests/src/com/android/settings/testutils/shadow/ShadowUserManager.java
index 61346bc..860ee11 100644
--- a/tests/robotests/src/com/android/settings/testutils/shadow/ShadowUserManager.java
+++ b/tests/robotests/src/com/android/settings/testutils/shadow/ShadowUserManager.java
@@ -34,7 +34,7 @@
  * This class provides the API 24 implementation of UserManager.get(Context).
  */
 @Implements(UserManager.class)
-public class ShadowUserManager {
+public class ShadowUserManager extends org.robolectric.shadows.ShadowUserManager {
 
     private SparseArray<UserInfo> mUserInfos = new SparseArray<>();
 
diff --git a/tests/unit/src/com/android/settings/password/ChooseLockSettingsHelperTest.java b/tests/unit/src/com/android/settings/password/ChooseLockSettingsHelperTest.java
deleted file mode 100644
index e534fb6..0000000
--- a/tests/unit/src/com/android/settings/password/ChooseLockSettingsHelperTest.java
+++ /dev/null
@@ -1,157 +0,0 @@
-package com.android.settings.password;
-
-
-import static org.mockito.Matchers.anyInt;
-import static org.mockito.Matchers.eq;
-import static org.mockito.Mockito.mock;
-import static org.mockito.Mockito.times;
-import static org.mockito.Mockito.verify;
-import static org.mockito.Mockito.when;
-
-import android.app.Activity;
-import android.app.admin.DevicePolicyManager;
-import android.content.ComponentName;
-import android.content.Context;
-import android.content.Intent;
-import android.os.UserHandle;
-import android.os.UserManager;
-import android.test.AndroidTestCase;
-
-import com.android.internal.widget.LockPatternUtils;
-
-import org.mockito.ArgumentCaptor;
-
-import java.util.List;
-
-public class ChooseLockSettingsHelperTest extends AndroidTestCase {
-
-    private static final String SYSTEM_PROPERTY_DEXMAKER_DEXCACHE = "dexmaker.dexcache";
-
-    @Override
-    protected void setUp() throws Exception {
-        super.setUp();
-        System.setProperty(SYSTEM_PROPERTY_DEXMAKER_DEXCACHE, getContext().getCacheDir().getPath());
-    }
-
-    @Override
-    protected void tearDown() throws Exception {
-        super.tearDown();
-        System.clearProperty(SYSTEM_PROPERTY_DEXMAKER_DEXCACHE);
-    }
-
-    public void testlaunchConfirmationActivityWithExternalAndChallenge() {
-
-        final int userId = UserHandle.myUserId();
-        final int request = 100;
-        final long challenge = 10000L;
-        {
-            // Test external == true
-            final boolean external = true;
-
-            final Activity mockActivity = getMockActivity();
-            ChooseLockSettingsHelper helper = getChooseLockSettingsHelper(mockActivity);
-            helper.launchConfirmationActivityWithExternalAndChallenge(
-                    request, // request
-                    "title",
-                    "header",
-                    "description",
-                    external,
-                    challenge,
-                    userId
-            );
-            final ArgumentCaptor<Intent> intentCaptor = ArgumentCaptor.forClass(Intent.class);
-            verify(mockActivity, times(1)).startActivity(intentCaptor.capture());
-            Intent capturedIntent = getResultIntent(intentCaptor);
-
-            assertEquals(new ComponentName("com.android.settings",
-                            ConfirmLockPattern.InternalActivity.class.getName()),
-                    capturedIntent.getComponent());
-            assertFalse(capturedIntent.getBooleanExtra(
-                    ChooseLockSettingsHelper.EXTRA_KEY_RETURN_CREDENTIALS, false));
-            assertTrue(capturedIntent.getBooleanExtra(
-                    ChooseLockSettingsHelper.EXTRA_KEY_HAS_CHALLENGE, false));
-            assertEquals(challenge, capturedIntent.getLongExtra(
-                    ChooseLockSettingsHelper.EXTRA_KEY_CHALLENGE, 0L));
-            assertEquals(external,
-                    (capturedIntent.getFlags() & Intent.FLAG_ACTIVITY_FORWARD_RESULT) != 0);
-            assertEquals(external, capturedIntent.getBooleanExtra(
-                    ConfirmDeviceCredentialBaseFragment.ALLOW_FP_AUTHENTICATION, false));
-            assertEquals(external, capturedIntent.getBooleanExtra(
-                    ConfirmDeviceCredentialBaseFragment.DARK_THEME, false));
-            assertEquals(external, capturedIntent.getBooleanExtra(
-                    ConfirmDeviceCredentialBaseFragment.SHOW_CANCEL_BUTTON, false));
-            assertEquals(external, capturedIntent.getBooleanExtra(
-                    ConfirmDeviceCredentialBaseFragment.SHOW_WHEN_LOCKED, false));
-        }
-
-        {
-            // Test external == false
-            final boolean external = false;
-
-            final Activity mockActivity = getMockActivity();
-            ChooseLockSettingsHelper helper = getChooseLockSettingsHelper(mockActivity);
-            helper.launchConfirmationActivityWithExternalAndChallenge(
-                    request, // request
-                    "title",
-                    "header",
-                    "description",
-                    external,
-                    challenge,
-                    userId
-            );
-            final ArgumentCaptor<Intent> intentCaptor = ArgumentCaptor.forClass(Intent.class);
-            verify(mockActivity, times(1)).startActivityForResult(intentCaptor.capture(),
-                    eq(request));
-            Intent capturedIntent = getResultIntent(intentCaptor);
-
-
-            assertEquals(new ComponentName("com.android.settings",
-                            ConfirmLockPattern.InternalActivity.class.getName()),
-                    capturedIntent.getComponent());
-            assertFalse(capturedIntent.getBooleanExtra(
-                    ChooseLockSettingsHelper.EXTRA_KEY_RETURN_CREDENTIALS, false));
-            assertTrue(capturedIntent.getBooleanExtra(
-                    ChooseLockSettingsHelper.EXTRA_KEY_HAS_CHALLENGE, false));
-            assertEquals(challenge, capturedIntent.getLongExtra(
-                    ChooseLockSettingsHelper.EXTRA_KEY_CHALLENGE, 0L));
-            assertEquals(external,
-                    (capturedIntent.getFlags() & Intent.FLAG_ACTIVITY_FORWARD_RESULT) != 0);
-            assertEquals(external, capturedIntent.getBooleanExtra(
-                    ConfirmDeviceCredentialBaseFragment.ALLOW_FP_AUTHENTICATION, false));
-            assertEquals(external, capturedIntent.getBooleanExtra(
-                    ConfirmDeviceCredentialBaseFragment.DARK_THEME, false));
-            assertEquals(external, capturedIntent.getBooleanExtra(
-                    ConfirmDeviceCredentialBaseFragment.SHOW_CANCEL_BUTTON, false));
-            assertEquals(external, capturedIntent.getBooleanExtra(
-                    ConfirmDeviceCredentialBaseFragment.SHOW_WHEN_LOCKED, false));
-        }
-    }
-
-
-    private ChooseLockSettingsHelper getChooseLockSettingsHelper(Activity mockActivity) {
-        LockPatternUtils mockLockPatternUtils = mock(LockPatternUtils.class);
-        when(mockLockPatternUtils.getKeyguardStoredPasswordQuality(anyInt()))
-                .thenReturn(DevicePolicyManager.PASSWORD_QUALITY_SOMETHING);
-
-        ChooseLockSettingsHelper helper = new ChooseLockSettingsHelper(mockActivity);
-        helper.mLockPatternUtils = mockLockPatternUtils;
-        return helper;
-    }
-
-    private Activity getMockActivity() {
-        Activity mockActivity = mock(Activity.class);
-        when(mockActivity.getSystemService(Context.USER_SERVICE))
-                .thenReturn(getContext().getSystemService(UserManager.class));
-        when(mockActivity.getContentResolver()).thenReturn(getContext().getContentResolver());
-        when(mockActivity.getIntent()).thenReturn(new Intent());
-        return mockActivity;
-    }
-
-
-
-    private static Intent getResultIntent(ArgumentCaptor<Intent> intentCaptor) {
-        List<Intent> capturedIntents = intentCaptor.getAllValues();
-        assertEquals(1, capturedIntents.size());
-        return capturedIntents.get(0);
-    }
-}