Merge "Make icon size are the same in factory reset account list."
diff --git a/AndroidManifest.xml b/AndroidManifest.xml
index 25fc62b..7034dc3 100644
--- a/AndroidManifest.xml
+++ b/AndroidManifest.xml
@@ -1710,6 +1710,11 @@
 
         <activity android:name="ChooseLockGeneric"
             android:label="@string/lockpassword_choose_lock_generic_header"
+            android:excludeFromRecents="true"
+            android:exported="false" />
+
+        <activity android:name=".password.SetNewPasswordActivity"
+            android:theme="@android:style/Theme.NoDisplay"
             android:excludeFromRecents="true" >
             <intent-filter android:priority="1">
                 <action android:name="android.app.action.SET_NEW_PASSWORD" />
@@ -3014,7 +3019,7 @@
         </activity>
 
         <activity android:name="Settings$AutomaticStorageManagerSettingsActivity"
-                  android:exported="@bool/config_has_storage_manager"
+                  android:exported="@bool/config_storage_manager_settings_enabled"
                   android:label="@string/automatic_storage_manager_settings"
                   android:taskAffinity="">
             <intent-filter android:priority="1">
diff --git a/res/layout/choose_lock_generic_fingerprint_header.xml b/res/layout/choose_lock_generic_fingerprint_header.xml
index 5ad3004..6a107bf 100644
--- a/res/layout/choose_lock_generic_fingerprint_header.xml
+++ b/res/layout/choose_lock_generic_fingerprint_header.xml
@@ -15,6 +15,7 @@
 -->
 
 <TextView xmlns:android="http://schemas.android.com/apk/res/android"
+    android:id="@+id/fingerprint_header_description"
     android:layout_width="match_parent"
     android:layout_height="wrap_content"
     android:gravity="center_vertical"
@@ -22,4 +23,4 @@
     android:paddingStart="?android:attr/listPreferredItemPaddingStart"
     android:paddingEnd="?android:attr/listPreferredItemPaddingEnd"
     android:text="@string/lock_settings_picker_fingerprint_message"
-    android:textAppearance="@android:style/TextAppearance.Material.Subhead" />
+    style="@style/FingerprintHeaderStyle" />
diff --git a/res/layout/regulatory_info.xml b/res/layout/regulatory_info.xml
index 8cd4157..0a74886 100755
--- a/res/layout/regulatory_info.xml
+++ b/res/layout/regulatory_info.xml
@@ -22,6 +22,7 @@
         android:layout_width="wrap_content"
         android:layout_height="wrap_content"
         android:scaleType="centerCrop"
+        android:contentDescription="@string/regulatory_labels"
         android:src="@drawable/regulatory_info" />
 </ScrollView>
 
diff --git a/res/layout/wifi_dialog.xml b/res/layout/wifi_dialog.xml
index ceb7201..ba1f6fc 100644
--- a/res/layout/wifi_dialog.xml
+++ b/res/layout/wifi_dialog.xml
@@ -287,11 +287,14 @@
                 android:layout_height="wrap_content"
                 style="@style/wifi_item"
                 android:paddingBottom="4dp"
+                android:importantForAccessibility="yes"
+                android:contentDescription="@string/wifi_advanced_toggle_description_collapsed"
                 android:visibility="gone">
             <CheckBox android:id="@+id/wifi_advanced_togglebox"
                     android:layout_width="match_parent"
                     android:layout_height="wrap_content"
                     style="@style/wifi_advanced_toggle"
+                    android:importantForAccessibility="noHideDescendants"
                     android:text="@string/wifi_show_advanced" />
         </LinearLayout>
 
diff --git a/res/values/bools.xml b/res/values/bools.xml
index eef0f5d..59367b55 100644
--- a/res/values/bools.xml
+++ b/res/values/bools.xml
@@ -46,9 +46,6 @@
     <!-- Whether swipe security option is hidden or not -->
     <bool name="config_hide_swipe_security_option">false</bool>
 
-    <!--Whether the storage manager exists. -->
-    <bool name="config_has_storage_manager">false</bool>
-
     <!--Whether help links are defined. -->
     <bool name="config_has_help">false</bool>
 </resources>
diff --git a/res/values/strings.xml b/res/values/strings.xml
index ef9c3dd..b1180c4 100644
--- a/res/values/strings.xml
+++ b/res/values/strings.xml
@@ -1102,6 +1102,12 @@
     <!-- Title for preference that guides the user through creating a backup unlock password for fingerprint [CHAR LIMIT=45]-->
     <string name="fingerprint_unlock_set_unlock_password">Fingerprint + Password</string>
 
+    <!-- Title for preference that guides the user to skip fingerprint setup [CHAR LIMIT=60]-->
+    <string name="fingerprint_unlock_skip_fingerprint">Continue without fingerprint</string>
+
+    <!-- Message shown in screen lock picker while setting up the new screen lock with fingerprint option. [CHAR LIMIT=NONE]-->
+    <string name="fingerprint_unlock_title">You can unlock your phone using your fingerprint. For security, this option requires a backup screen lock.</string>
+
     <!-- Summary for preference that has been disabled by because of the DevicePolicyAdmin, or because device encryption is enabled, or because there are credentials in the credential storage [CHAR LIMIT=50] -->
     <string name="unlock_set_unlock_disabled_summary">Disabled by administrator, encryption policy, or credential storage</string>
 
diff --git a/res/values/styles.xml b/res/values/styles.xml
index 6d7a40c..32c0b4d 100644
--- a/res/values/styles.xml
+++ b/res/values/styles.xml
@@ -439,4 +439,10 @@
         <item name="android:paddingEnd">56dp</item>
     </style>
 
+    <style name="FingerprintHeaderStyle" parent="android:style/TextAppearance.Material.Subhead">
+        <item name="android:paddingTop">16dp</item>
+        <item name="android:textColor">@color/primary_dark_material_light</item>
+        <item name="android:lineSpacingMultiplier">1.2</item>
+    </style>
+
 </resources>
diff --git a/res/xml/security_settings_picker.xml b/res/xml/security_settings_picker.xml
index 7b6069d..6b52156 100644
--- a/res/xml/security_settings_picker.xml
+++ b/res/xml/security_settings_picker.xml
@@ -47,4 +47,9 @@
             android:key="unlock_set_managed"
             android:persistent="false"/>
 
+    <com.android.settingslib.RestrictedPreference
+            android:key="unlock_skip_fingerprint"
+            android:title="@string/fingerprint_unlock_skip_fingerprint"
+            android:persistent="false"/>
+
 </PreferenceScreen>
diff --git a/src/com/android/settings/ChooseLockGeneric.java b/src/com/android/settings/ChooseLockGeneric.java
index f650fae..4ed080d 100644
--- a/src/com/android/settings/ChooseLockGeneric.java
+++ b/src/com/android/settings/ChooseLockGeneric.java
@@ -16,6 +16,11 @@
 
 package com.android.settings;
 
+import static android.app.admin.DevicePolicyManager.ACTION_SET_NEW_PARENT_PROFILE_PASSWORD;
+import static android.app.admin.DevicePolicyManager.ACTION_SET_NEW_PASSWORD;
+import static com.android.settings.ChooseLockPassword.ChooseLockPasswordFragment.RESULT_FINISHED;
+import static com.android.settingslib.RestrictedLockUtils.EnforcedAdmin;
+
 import android.accessibilityservice.AccessibilityServiceInfo;
 import android.app.Activity;
 import android.app.AlertDialog;
@@ -41,17 +46,18 @@
 import android.util.EventLog;
 import android.util.Log;
 import android.view.accessibility.AccessibilityManager;
+import android.widget.TextView;
 
 import com.android.internal.logging.MetricsProto.MetricsEvent;
 import com.android.internal.widget.LockPatternUtils;
 import com.android.settings.core.instrumentation.InstrumentedDialogFragment;
+import com.android.settings.fingerprint.FingerprintEnrollBase;
+import com.android.settings.fingerprint.FingerprintEnrollFindSensor;
 import com.android.settingslib.RestrictedLockUtils;
 import com.android.settingslib.RestrictedPreference;
 
 import java.util.List;
 
-import static com.android.settingslib.RestrictedLockUtils.EnforcedAdmin;
-
 public class ChooseLockGeneric extends SettingsActivity {
     public static final String CONFIRM_CREDENTIALS = "confirm_credentials";
 
@@ -61,8 +67,8 @@
         modIntent.putExtra(EXTRA_SHOW_FRAGMENT, getFragmentClass().getName());
 
         String action = modIntent.getAction();
-        if (DevicePolicyManager.ACTION_SET_NEW_PASSWORD.equals(action)
-                || DevicePolicyManager.ACTION_SET_NEW_PARENT_PROFILE_PASSWORD.equals(action)) {
+        if (ACTION_SET_NEW_PASSWORD.equals(action)
+                || ACTION_SET_NEW_PARENT_PROFILE_PASSWORD.equals(action)) {
             modIntent.putExtra(EXTRA_HIDE_DRAWER, true);
         }
         return modIntent;
@@ -90,6 +96,7 @@
         private static final String KEY_UNLOCK_SET_PASSWORD = "unlock_set_password";
         private static final String KEY_UNLOCK_SET_PATTERN = "unlock_set_pattern";
         private static final String KEY_UNLOCK_SET_MANAGED = "unlock_set_managed";
+        private static final String KEY_SKIP_FINGERPRINT = "unlock_skip_fingerprint";
         private static final String PASSWORD_CONFIRMED = "password_confirmed";
         private static final String WAITING_FOR_CONFIRMATION = "waiting_for_confirmation";
         public static final String MINIMUM_QUALITY_KEY = "minimum_quality";
@@ -101,6 +108,8 @@
         private static final int CONFIRM_EXISTING_REQUEST = 100;
         private static final int ENABLE_ENCRYPTION_REQUEST = 101;
         private static final int CHOOSE_LOCK_REQUEST = 102;
+        private static final int CHOOSE_LOCK_BEFORE_FINGERPRINT_REQUEST = 103;
+        private static final int SKIP_FINGERPRINT_REQUEST = 104;
 
         private ChooseLockSettingsHelper mChooseLockSettingsHelper;
         private DevicePolicyManager mDPM;
@@ -119,6 +128,7 @@
         private int mUserId;
         private boolean mHideDrawer = false;
         private ManagedLockPasswordProvider mManagedPasswordProvider;
+        private boolean mIsSetNewPassword = false;
 
         protected boolean mForFingerprint = false;
 
@@ -131,12 +141,15 @@
         public void onCreate(Bundle savedInstanceState) {
             super.onCreate(savedInstanceState);
 
+            String chooseLockAction = getActivity().getIntent().getAction();
             mFingerprintManager =
                 (FingerprintManager) getActivity().getSystemService(Context.FINGERPRINT_SERVICE);
             mDPM = (DevicePolicyManager) getSystemService(Context.DEVICE_POLICY_SERVICE);
             mKeyStore = KeyStore.getInstance();
             mChooseLockSettingsHelper = new ChooseLockSettingsHelper(this.getActivity());
             mLockPatternUtils = new LockPatternUtils(getActivity());
+            mIsSetNewPassword = ACTION_SET_NEW_PARENT_PROFILE_PASSWORD.equals(chooseLockAction)
+                    || ACTION_SET_NEW_PASSWORD.equals(chooseLockAction);
 
             // Defaults to needing to confirm credentials
             final boolean confirmCredentials = getActivity().getIntent()
@@ -154,6 +167,16 @@
                     ChooseLockSettingsHelper.EXTRA_KEY_FOR_FINGERPRINT, false);
             mForChangeCredRequiredForBoot = getArguments() != null && getArguments().getBoolean(
                     ChooseLockSettingsHelper.EXTRA_KEY_FOR_CHANGE_CRED_REQUIRED_FOR_BOOT);
+            if (mIsSetNewPassword) {
+                // In ACTION_SET_NEW_PARENT_PROFILE_PASSWORD or ACTION_SET_NEW_PASSWORD, the user
+                // will be asked to confirm the password if one has been set.
+                // On fingerprint supported device, fingerprint options are represented in the
+                // options. If the user chooses to skip fingerprint setup, ChooseLockGeneric is
+                // relaunched to only show options without fingerprint. In this case, we shouldn't
+                // ask the user to confirm the password again.
+                mPasswordConfirmed = getActivity().getIntent().getBooleanExtra(
+                        PASSWORD_CONFIRMED, false);
+            }
 
             if (savedInstanceState != null) {
                 mPasswordConfirmed = savedInstanceState.getBoolean(PASSWORD_CONFIRMED);
@@ -168,9 +191,8 @@
                     UserManager.get(getActivity()),
                     null,
                     getActivity().getIntent().getExtras()).getIdentifier();
-            if (DevicePolicyManager.ACTION_SET_NEW_PARENT_PROFILE_PASSWORD.equals(
-                    getActivity().getIntent().getAction()) ||
-                    !mLockPatternUtils.isSeparateProfileChallengeAllowed(targetUser)) {
+            if (ACTION_SET_NEW_PARENT_PROFILE_PASSWORD.equals(chooseLockAction)
+                    || !mLockPatternUtils.isSeparateProfileChallengeAllowed(targetUser)) {
                 // Always use parent if explicitely requested or if profile challenge is not
                 // supported
                 Bundle arguments = getArguments();
@@ -180,8 +202,7 @@
                 mUserId = targetUser;
             }
 
-            if (DevicePolicyManager.ACTION_SET_NEW_PASSWORD
-                    .equals(getActivity().getIntent().getAction())
+            if (ACTION_SET_NEW_PASSWORD.equals(chooseLockAction)
                     && UserManager.get(getActivity()).isManagedProfile(mUserId)
                     && mLockPatternUtils.isSeparateProfileChallengeEnabled(mUserId)) {
                 getActivity().setTitle(R.string.lock_settings_picker_title_profile);
@@ -216,6 +237,10 @@
         protected void addHeaderView() {
             if (mForFingerprint) {
                 setHeaderView(R.layout.choose_lock_generic_fingerprint_header);
+                if (mIsSetNewPassword) {
+                    ((TextView) getHeaderView().findViewById(R.id.fingerprint_header_description))
+                            .setText(R.string.fingerprint_unlock_title);
+                }
             }
         }
 
@@ -228,6 +253,12 @@
                 // unlock method to an insecure one
                 showFactoryResetProtectionWarningDialog(key);
                 return true;
+            } else if (KEY_SKIP_FINGERPRINT.equals(key)) {
+                Intent chooseLockGenericIntent = new Intent(getActivity(), ChooseLockGeneric.class);
+                chooseLockGenericIntent.setAction(getIntent().getAction());
+                chooseLockGenericIntent.putExtra(PASSWORD_CONFIRMED, mPasswordConfirmed);
+                startActivityForResult(chooseLockGenericIntent, SKIP_FINGERPRINT_REQUEST);
+                return true;
             } else {
                 return setUnlockMethod(key);
             }
@@ -302,6 +333,20 @@
                     getActivity().setResult(resultCode, data);
                     finish();
                 }
+            } else if (requestCode == CHOOSE_LOCK_BEFORE_FINGERPRINT_REQUEST
+                    && resultCode == FingerprintEnrollBase.RESULT_FINISHED) {
+                Intent intent = new Intent(getActivity(), FingerprintEnrollFindSensor.class);
+                if (data != null) {
+                    intent.putExtras(data.getExtras());
+                }
+                startActivity(intent);
+                finish();
+            } else if (requestCode == SKIP_FINGERPRINT_REQUEST) {
+                if (resultCode != RESULT_CANCELED) {
+                    getActivity().setResult(
+                            resultCode == RESULT_FINISHED ? RESULT_OK : resultCode, data);
+                    finish();
+                }
             } else {
                 getActivity().setResult(Activity.RESULT_CANCELED);
                 finish();
@@ -375,6 +420,10 @@
             } else {
                 removePreference(KEY_UNLOCK_SET_MANAGED);
             }
+
+            if (!(mForFingerprint && mIsSetNewPassword)) {
+                removePreference(KEY_SKIP_FINGERPRINT);
+            }
         }
 
         private void updateCurrentPreference() {
@@ -612,7 +661,10 @@
             quality = upgradeQuality(quality);
             Intent intent = getIntentForUnlockMethod(quality, disabled);
             if (intent != null) {
-                startActivityForResult(intent, CHOOSE_LOCK_REQUEST);
+                startActivityForResult(intent,
+                        mIsSetNewPassword && mHasChallenge
+                                ? CHOOSE_LOCK_BEFORE_FINGERPRINT_REQUEST
+                                : CHOOSE_LOCK_REQUEST);
                 return;
             }
 
@@ -620,8 +672,8 @@
                 mLockPatternUtils.setSeparateProfileChallengeEnabled(mUserId, true, mUserPassword);
                 mChooseLockSettingsHelper.utils().clearLock(mUserId);
                 mChooseLockSettingsHelper.utils().setLockScreenDisabled(disabled, mUserId);
-                removeAllFingerprintForUserAndFinish(mUserId);
                 getActivity().setResult(Activity.RESULT_OK);
+                removeAllFingerprintForUserAndFinish(mUserId);
             } else {
                 removeAllFingerprintForUserAndFinish(mUserId);
             }
diff --git a/src/com/android/settings/RadioInfo.java b/src/com/android/settings/RadioInfo.java
index af1392c..9c9eceb 100644
--- a/src/com/android/settings/RadioInfo.java
+++ b/src/com/android/settings/RadioInfo.java
@@ -29,7 +29,6 @@
 import android.os.Bundle;
 import android.os.Handler;
 import android.os.Message;
-import android.os.SystemProperties;
 import android.telephony.CellInfo;
 import android.telephony.CellInfoCdma;
 import android.telephony.CellInfoGsm;
@@ -343,6 +342,11 @@
     @Override
     public void onCreate(Bundle icicle) {
         super.onCreate(icicle);
+        if (!android.os.Process.myUserHandle().isSystem()) {
+            Log.e(TAG, "Not run from system user, don't do anything.");
+            finish();
+            return;
+        }
 
         setContentView(R.layout.radio_info);
 
diff --git a/src/com/android/settings/SettingsPreferenceFragment.java b/src/com/android/settings/SettingsPreferenceFragment.java
index 5cc4011..575194b 100644
--- a/src/com/android/settings/SettingsPreferenceFragment.java
+++ b/src/com/android/settings/SettingsPreferenceFragment.java
@@ -86,11 +86,36 @@
     private boolean mIsDataSetObserverRegistered = false;
     private RecyclerView.AdapterDataObserver mDataSetObserver =
             new RecyclerView.AdapterDataObserver() {
-        @Override
-        public void onChanged() {
-            onDataSetChanged();
-        }
-    };
+                @Override
+                public void onChanged() {
+                    onDataSetChanged();
+                }
+
+                @Override
+                public void onItemRangeChanged(int positionStart, int itemCount) {
+                    onDataSetChanged();
+                }
+
+                @Override
+                public void onItemRangeChanged(int positionStart, int itemCount, Object payload) {
+                    onDataSetChanged();
+                }
+
+                @Override
+                public void onItemRangeInserted(int positionStart, int itemCount) {
+                    onDataSetChanged();
+                }
+
+                @Override
+                public void onItemRangeRemoved(int positionStart, int itemCount) {
+                    onDataSetChanged();
+                }
+
+                @Override
+                public void onItemRangeMoved(int fromPosition, int toPosition, int itemCount) {
+                    onDataSetChanged();
+                }
+            };
 
     private ViewGroup mPinnedHeaderFrameLayout;
     private ViewGroup mButtonBar;
diff --git a/src/com/android/settings/bluetooth/DeviceProfilesSettings.java b/src/com/android/settings/bluetooth/DeviceProfilesSettings.java
index f9b507d..a2c6776 100755
--- a/src/com/android/settings/bluetooth/DeviceProfilesSettings.java
+++ b/src/com/android/settings/bluetooth/DeviceProfilesSettings.java
@@ -115,7 +115,7 @@
                 EditText deviceName = (EditText) mRootView.findViewById(R.id.name);
                 mCachedDevice.setName(deviceName.getText().toString());
                 break;
-            case DialogInterface.BUTTON_NEGATIVE:
+            case DialogInterface.BUTTON_NEUTRAL:
                 mCachedDevice.unpair();
                 com.android.settings.bluetooth.Utils.updateSearchIndex(getContext(),
                         BluetoothSettings.class.getName(), mCachedDevice.getName(),
diff --git a/src/com/android/settings/core/instrumentation/SharedPreferencesLogger.java b/src/com/android/settings/core/instrumentation/SharedPreferencesLogger.java
index 6a67e45..101f1b5 100644
--- a/src/com/android/settings/core/instrumentation/SharedPreferencesLogger.java
+++ b/src/com/android/settings/core/instrumentation/SharedPreferencesLogger.java
@@ -21,6 +21,7 @@
 import android.content.pm.PackageManager;
 import android.os.AsyncTask;
 import android.text.TextUtils;
+import android.util.ArraySet;
 
 import com.android.internal.logging.MetricsProto.MetricsEvent;
 import com.android.settings.overlay.FeatureFactory;
@@ -33,11 +34,13 @@
     private final String mTag;
     private final Context mContext;
     private final MetricsFeatureProvider mMetricsFeature;
+    private final Set<String> mPreferenceKeySet;
 
     public SharedPreferencesLogger(Context context, String tag) {
         mContext = context;
         mTag = tag;
         mMetricsFeature = FeatureFactory.getFactory(context).getMetricsFeatureProvider();
+        mPreferenceKeySet = new ArraySet<>();
     }
 
     @Override
@@ -96,7 +99,15 @@
     }
 
     private void logValue(String key, String value) {
-        mMetricsFeature.count(mContext, mTag + "/" + key + "|" + value, 1);
+        final String prefKey = mTag + "/" + key;
+        if (!mPreferenceKeySet.contains(prefKey)) {
+            // Pref key doesn't exist in set, this is initial display so we skip metrics but
+            // keeps track of this key.
+            mPreferenceKeySet.add(prefKey);
+            return;
+        }
+        // Pref key exists in set, log it's change in metrics.
+        mMetricsFeature.count(mContext, prefKey + "|" + value, 1);
     }
 
     private void logPackageName(String key, String value) {
diff --git a/src/com/android/settings/dashboard/DashboardFeatureProvider.java b/src/com/android/settings/dashboard/DashboardFeatureProvider.java
new file mode 100644
index 0000000..e4976f5
--- /dev/null
+++ b/src/com/android/settings/dashboard/DashboardFeatureProvider.java
@@ -0,0 +1,26 @@
+/*
+ * Copyright (C) 2016 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.dashboard;
+
+import android.content.Context;
+
+/**
+ * FeatureProvider for dashboard (aka settings homepage).
+ */
+public interface DashboardFeatureProvider {
+
+    boolean shouldUseNewIALayout(Context context);
+}
diff --git a/src/com/android/settings/dashboard/DashboardFeatureProviderImpl.java b/src/com/android/settings/dashboard/DashboardFeatureProviderImpl.java
new file mode 100644
index 0000000..d07729a
--- /dev/null
+++ b/src/com/android/settings/dashboard/DashboardFeatureProviderImpl.java
@@ -0,0 +1,31 @@
+/*
+ * Copyright (C) 2015 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.dashboard;
+
+import android.content.Context;
+
+/**
+ * Impl for {@code DashboardFeatureProvider}.
+ */
+public class DashboardFeatureProviderImpl implements DashboardFeatureProvider {
+
+    @Override
+    public boolean shouldUseNewIALayout(Context context) {
+        return false;
+    }
+
+}
diff --git a/src/com/android/settings/datausage/BillingCycleSettings.java b/src/com/android/settings/datausage/BillingCycleSettings.java
index deadc54..ce020b1 100644
--- a/src/com/android/settings/datausage/BillingCycleSettings.java
+++ b/src/com/android/settings/datausage/BillingCycleSettings.java
@@ -35,6 +35,7 @@
 import android.widget.NumberPicker;
 import android.widget.Spinner;
 
+import com.android.internal.annotations.VisibleForTesting;
 import com.android.internal.logging.MetricsProto.MetricsEvent;
 import com.android.settings.R;
 import com.android.settings.core.instrumentation.InstrumentedDialogFragment;
@@ -60,7 +61,7 @@
     private static final String KEY_BILLING_CYCLE = "billing_cycle";
     private static final String KEY_SET_DATA_WARNING = "set_data_warning";
     private static final String KEY_DATA_WARNING = "data_warning";
-    private static final String KEY_SET_DATA_LIMIT = "set_data_limit";
+    @VisibleForTesting static final String KEY_SET_DATA_LIMIT = "set_data_limit";
     private static final String KEY_DATA_LIMIT = "data_limit";
 
     private NetworkTemplate mNetworkTemplate;
@@ -139,12 +140,13 @@
     public boolean onPreferenceChange(Preference preference, Object newValue) {
         if (mEnableDataLimit == preference) {
             boolean enabled = (Boolean) newValue;
-            if (enabled) {
-                ConfirmLimitFragment.show(this);
-            } else {
+            if (!enabled) {
                 setPolicyLimitBytes(LIMIT_DISABLED);
+                return true;
             }
-            return true;
+            ConfirmLimitFragment.show(this);
+            // This preference is enabled / disabled by ConfirmLimitFragment.
+            return false;
         } else if (mEnableDataWarning == preference) {
             boolean enabled = (Boolean) newValue;
             if (enabled) {
@@ -162,7 +164,8 @@
         return MetricsEvent.BILLING_CYCLE;
     }
 
-    private void setPolicyLimitBytes(long limitBytes) {
+    @VisibleForTesting
+    void setPolicyLimitBytes(long limitBytes) {
         if (LOGD) Log.d(TAG, "setPolicyLimitBytes()");
         services.mPolicyEditor.setPolicyLimitBytes(mNetworkTemplate, limitBytes);
         updatePrefs();
@@ -373,7 +376,7 @@
     public static class ConfirmLimitFragment extends InstrumentedDialogFragment implements
             DialogInterface.OnClickListener {
         private static final String EXTRA_MESSAGE = "message";
-        private static final String EXTRA_LIMIT_BYTES = "limitBytes";
+        @VisibleForTesting static final String EXTRA_LIMIT_BYTES = "limitBytes";
         public static final float FLOAT = 1.2f;
 
         public static void show(BillingCycleSettings parent) {
@@ -423,12 +426,14 @@
 
         @Override
         public void onClick(DialogInterface dialog, int which) {
+            final BillingCycleSettings target = (BillingCycleSettings) getTargetFragment();
             if (which != DialogInterface.BUTTON_POSITIVE) return;
             final long limitBytes = getArguments().getLong(EXTRA_LIMIT_BYTES);
-            final BillingCycleSettings target = (BillingCycleSettings) getTargetFragment();
             if (target != null) {
                 target.setPolicyLimitBytes(limitBytes);
             }
+            target.getPreferenceManager().getSharedPreferences().edit()
+                    .putBoolean(KEY_SET_DATA_LIMIT, true).apply();
         }
     }
 }
diff --git a/src/com/android/settings/fingerprint/FingerprintEnrollBase.java b/src/com/android/settings/fingerprint/FingerprintEnrollBase.java
index 65cc92e..d581804 100644
--- a/src/com/android/settings/fingerprint/FingerprintEnrollBase.java
+++ b/src/com/android/settings/fingerprint/FingerprintEnrollBase.java
@@ -36,7 +36,7 @@
  */
 public abstract class FingerprintEnrollBase extends InstrumentedActivity
         implements View.OnClickListener {
-    static final int RESULT_FINISHED = FingerprintSettings.RESULT_FINISHED;
+    public static final int RESULT_FINISHED = FingerprintSettings.RESULT_FINISHED;
     static final int RESULT_SKIP = FingerprintSettings.RESULT_SKIP;
     static final int RESULT_TIMEOUT = FingerprintSettings.RESULT_TIMEOUT;
 
diff --git a/src/com/android/settings/overlay/FeatureFactory.java b/src/com/android/settings/overlay/FeatureFactory.java
index 83ea297..7099b3f 100644
--- a/src/com/android/settings/overlay/FeatureFactory.java
+++ b/src/com/android/settings/overlay/FeatureFactory.java
@@ -22,6 +22,7 @@
 
 import com.android.settings.R;
 import com.android.settings.core.instrumentation.MetricsFeatureProvider;
+import com.android.settings.dashboard.DashboardFeatureProvider;
 import com.android.settings.fuelgauge.PowerUsageFeatureProvider;
 
 /**
@@ -67,6 +68,8 @@
 
     public abstract PowerUsageFeatureProvider getPowerUsageFeatureProvider();
 
+    public abstract DashboardFeatureProvider getDashboardFeatureProvider();
+
     public static final class FactoryNotFoundException extends RuntimeException {
         public FactoryNotFoundException(Throwable throwable) {
             super("Unable to create factory. Did you misconfigure Proguard?", throwable);
diff --git a/src/com/android/settings/overlay/FeatureFactoryImpl.java b/src/com/android/settings/overlay/FeatureFactoryImpl.java
index 035a7f9..8f71363 100644
--- a/src/com/android/settings/overlay/FeatureFactoryImpl.java
+++ b/src/com/android/settings/overlay/FeatureFactoryImpl.java
@@ -21,6 +21,8 @@
 
 import com.android.settings.core.instrumentation.MetricsFeatureProvider;
 import com.android.settings.core.instrumentation.MetricsFeatureProviderImpl;
+import com.android.settings.dashboard.DashboardFeatureProvider;
+import com.android.settings.dashboard.DashboardFeatureProviderImpl;
 import com.android.settings.fuelgauge.PowerUsageFeatureProvider;
 
 /**
@@ -30,6 +32,7 @@
 public final class FeatureFactoryImpl extends FeatureFactory {
 
     private MetricsFeatureProvider mMetricsFeatureProvider;
+    private DashboardFeatureProviderImpl mDashboardFeatureProvider;
 
     @Override
     public SupportFeatureProvider getSupportFeatureProvider(Context context) {
@@ -49,4 +52,12 @@
         return null;
     }
 
+    @Override
+    public DashboardFeatureProvider getDashboardFeatureProvider() {
+        if (mDashboardFeatureProvider == null) {
+            mDashboardFeatureProvider = new DashboardFeatureProviderImpl();
+        }
+        return mDashboardFeatureProvider;
+    }
+
 }
diff --git a/src/com/android/settings/password/SetNewPasswordActivity.java b/src/com/android/settings/password/SetNewPasswordActivity.java
new file mode 100644
index 0000000..7cdf006
--- /dev/null
+++ b/src/com/android/settings/password/SetNewPasswordActivity.java
@@ -0,0 +1,55 @@
+/*
+ * Copyright (C) 2016 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.password;
+
+import android.annotation.Nullable;
+import android.app.Activity;
+import android.app.admin.DevicePolicyManager;
+import android.content.Intent;
+import android.os.Bundle;
+
+import com.android.settings.ChooseLockGeneric;
+
+/**
+ * Trampolines {@link DevicePolicyManager#ACTION_SET_NEW_PASSWORD} and
+ * {@link DevicePolicyManager#ACTION_SET_NEW_PARENT_PROFILE_PASSWORD} intent to the appropriate UI
+ * activity for handling set new password.
+ */
+public class SetNewPasswordActivity extends Activity implements SetNewPasswordController.Ui {
+    private String mNewPasswordAction;
+    private SetNewPasswordController mSetNewPasswordController;
+
+    @Override
+    protected void onCreate(Bundle savedState) {
+        super.onCreate(savedState);
+
+        mNewPasswordAction = getIntent().getAction();
+        mSetNewPasswordController = new SetNewPasswordController(this, this);
+        mSetNewPasswordController.dispatchSetNewPasswordIntent();
+    }
+
+    @Override
+    public void launchChooseLock(@Nullable Bundle chooseLockFingerprintExtras) {
+        Intent intent = new Intent(this, ChooseLockGeneric.class)
+                .setAction(mNewPasswordAction);
+        if (chooseLockFingerprintExtras != null) {
+            intent.putExtras(chooseLockFingerprintExtras);
+        }
+        startActivity(intent);
+        finish();
+    }
+}
diff --git a/src/com/android/settings/password/SetNewPasswordController.java b/src/com/android/settings/password/SetNewPasswordController.java
new file mode 100644
index 0000000..470723b
--- /dev/null
+++ b/src/com/android/settings/password/SetNewPasswordController.java
@@ -0,0 +1,114 @@
+/*
+ * Copyright (C) 2016 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.password;
+
+import static com.android.internal.util.Preconditions.checkNotNull;
+
+import android.annotation.Nullable;
+import android.app.admin.DevicePolicyManager;
+import android.content.Context;
+import android.content.Intent;
+import android.content.pm.PackageManager;
+import android.hardware.fingerprint.FingerprintManager;
+import android.os.Bundle;
+import android.os.UserHandle;
+
+import com.android.internal.annotations.VisibleForTesting;
+import com.android.settings.ChooseLockGeneric;
+import com.android.settings.ChooseLockSettingsHelper;
+
+/**
+ * Business logic for {@link SetNewPasswordActivity}.
+ *
+ * <p>On devices that supports fingerprint, this controller directs the user to configure
+ * fingerprint + a backup password if the device admin allows fingerprint for keyguard and
+ * the user has never configured a fingerprint before.
+ */
+final class SetNewPasswordController {
+
+    interface Ui {
+        /** Starts the {@link ChooseLockGeneric} activity with the given extras. */
+        void launchChooseLock(@Nullable Bundle chooseLockFingerprintExtras);
+    }
+
+    private final int mCurrentUserId;
+    private final PackageManager mPackageManager;
+    @Nullable private final FingerprintManager mFingerprintManager;
+    private final DevicePolicyManager mDevicePolicyManager;
+    private final Ui mUi;
+
+    public SetNewPasswordController(Context context, Ui ui) {
+        this(context.getUserId(),
+                context.getPackageManager(),
+                (FingerprintManager) context.getSystemService(Context.FINGERPRINT_SERVICE),
+                (DevicePolicyManager) context.getSystemService(Context.DEVICE_POLICY_SERVICE),
+                ui);
+    }
+
+    @VisibleForTesting
+    SetNewPasswordController(
+            int currentUserId,
+            PackageManager packageManager,
+            FingerprintManager fingerprintManager,
+            DevicePolicyManager devicePolicyManager,
+            Ui ui) {
+        mCurrentUserId = currentUserId;
+        mPackageManager = checkNotNull(packageManager);
+        mFingerprintManager = fingerprintManager;
+        mDevicePolicyManager = checkNotNull(devicePolicyManager);
+        mUi = checkNotNull(ui);
+    }
+
+    /**
+     * Dispatches the set new password intent to the correct activity that handles it.
+     */
+    public void dispatchSetNewPasswordIntent() {
+        if (mPackageManager.hasSystemFeature(PackageManager.FEATURE_FINGERPRINT)
+                && mFingerprintManager != null
+                && mFingerprintManager.isHardwareDetected()
+                && !mFingerprintManager.hasEnrolledFingerprints()
+                && !isFingerprintDisabledByAdmin()) {
+            mUi.launchChooseLock(getFingerprintChooseLockExtras());
+        } else {
+            mUi.launchChooseLock(null);
+        }
+    }
+
+    private Bundle getFingerprintChooseLockExtras() {
+        Bundle chooseLockExtras = new Bundle();
+        if (mFingerprintManager != null) {
+            long challenge = mFingerprintManager.preEnroll();
+            chooseLockExtras.putInt(ChooseLockGeneric.ChooseLockGenericFragment.MINIMUM_QUALITY_KEY,
+                    DevicePolicyManager.PASSWORD_QUALITY_SOMETHING);
+            chooseLockExtras.putBoolean(
+                    ChooseLockGeneric.ChooseLockGenericFragment.HIDE_DISABLED_PREFS, true);
+            chooseLockExtras.putBoolean(ChooseLockSettingsHelper.EXTRA_KEY_HAS_CHALLENGE, true);
+            chooseLockExtras.putLong(ChooseLockSettingsHelper.EXTRA_KEY_CHALLENGE, challenge);
+            chooseLockExtras.putBoolean(ChooseLockSettingsHelper.EXTRA_KEY_FOR_FINGERPRINT, true);
+            if (mCurrentUserId != UserHandle.USER_NULL) {
+                chooseLockExtras.putInt(Intent.EXTRA_USER_ID, mCurrentUserId);
+            }
+        }
+        return chooseLockExtras;
+    }
+
+    private boolean isFingerprintDisabledByAdmin() {
+        int disabledFeatures = mDevicePolicyManager.getKeyguardDisabledFeatures(
+                null, mCurrentUserId);
+        return (disabledFeatures & DevicePolicyManager.KEYGUARD_DISABLE_FINGERPRINT) != 0;
+    }
+}
diff --git a/src/com/android/settings/wifi/WifiConfigController.java b/src/com/android/settings/wifi/WifiConfigController.java
index 350e0c3..460d210 100644
--- a/src/com/android/settings/wifi/WifiConfigController.java
+++ b/src/com/android/settings/wifi/WifiConfigController.java
@@ -54,6 +54,7 @@
 import android.widget.CompoundButton;
 import android.widget.CompoundButton.OnCheckedChangeListener;
 import android.widget.EditText;
+import android.widget.LinearLayout;
 import android.widget.Spinner;
 import android.widget.TextView;
 
@@ -262,13 +263,13 @@
                 showSecurityFields();
                 showIpConfigFields();
                 showProxyFields();
+                final CheckBox advancedTogglebox =
+                        (CheckBox) mView.findViewById(R.id.wifi_advanced_togglebox);
                 mView.findViewById(R.id.wifi_advanced_toggle).setVisibility(View.VISIBLE);
-                ((CheckBox) mView.findViewById(R.id.wifi_advanced_togglebox))
-                        .setOnCheckedChangeListener(this);
-                if (showAdvancedFields) {
-                    ((CheckBox) mView.findViewById(R.id.wifi_advanced_togglebox)).setChecked(true);
-                    mView.findViewById(R.id.wifi_advanced_fields).setVisibility(View.VISIBLE);
-                }
+                advancedTogglebox.setOnCheckedChangeListener(this);
+                advancedTogglebox.setChecked(showAdvancedFields);
+                mView.findViewById(R.id.wifi_advanced_fields)
+                        .setVisibility(showAdvancedFields ? View.VISIBLE : View.GONE);
             }
 
             if (mMode == WifiConfigUiBase.MODE_MODIFY) {
@@ -1210,11 +1211,18 @@
                 ((EditText) mPasswordView).setSelection(pos);
             }
         } else if (view.getId() == R.id.wifi_advanced_togglebox) {
+            final View advancedToggle = mView.findViewById(R.id.wifi_advanced_toggle);
+            final int toggleVisibility;
+            final int stringID;
             if (isChecked) {
-                mView.findViewById(R.id.wifi_advanced_fields).setVisibility(View.VISIBLE);
+                toggleVisibility = View.VISIBLE;
+                stringID = R.string.wifi_advanced_toggle_description_expanded;
             } else {
-                mView.findViewById(R.id.wifi_advanced_fields).setVisibility(View.GONE);
+                toggleVisibility = View.GONE;
+                stringID = R.string.wifi_advanced_toggle_description_collapsed;
             }
+            mView.findViewById(R.id.wifi_advanced_fields).setVisibility(toggleVisibility);
+            advancedToggle.setContentDescription(mContext.getString(stringID));
         }
     }
 
diff --git a/tests/robotests/src/com/android/settings/core/instrumentation/InstrumentedDialogFragmentTest.java b/tests/robotests/src/com/android/settings/core/instrumentation/InstrumentedDialogFragmentTest.java
index f9e6b46..14b3bb4 100644
--- a/tests/robotests/src/com/android/settings/core/instrumentation/InstrumentedDialogFragmentTest.java
+++ b/tests/robotests/src/com/android/settings/core/instrumentation/InstrumentedDialogFragmentTest.java
@@ -23,7 +23,7 @@
 import org.junit.runner.RunWith;
 import org.robolectric.RobolectricTestRunner;
 import org.robolectric.annotation.Config;
-import org.robolectric.util.FragmentTestUtil;
+import org.robolectric.shadows.ShadowApplication;
 
 import static com.google.common.truth.Truth.assertThat;
 
@@ -58,7 +58,7 @@
         // Precondition: no metrics feature
         assertThat(fragment.getMetricsFeatureProvider()).isNull();
 
-        FragmentTestUtil.startFragment(fragment);
+        fragment.onAttach(ShadowApplication.getInstance().getApplicationContext());
 
         // Verify: has metrics feature
         assertThat(fragment.getMetricsFeatureProvider()).isNotNull();
diff --git a/tests/robotests/src/com/android/settings/core/instrumentation/SharedPreferenceLoggerTest.java b/tests/robotests/src/com/android/settings/core/instrumentation/SharedPreferenceLoggerTest.java
index 11f2784..a3e0e45 100644
--- a/tests/robotests/src/com/android/settings/core/instrumentation/SharedPreferenceLoggerTest.java
+++ b/tests/robotests/src/com/android/settings/core/instrumentation/SharedPreferenceLoggerTest.java
@@ -16,6 +16,7 @@
 package com.android.settings.core.instrumentation;
 
 import android.content.Context;
+import android.content.SharedPreferences;
 
 import com.android.settings.TestConfig;
 import com.android.settings.overlay.FeatureFactory;
@@ -32,7 +33,7 @@
 import static org.mockito.Matchers.any;
 import static org.mockito.Matchers.anyInt;
 import static org.mockito.Matchers.anyString;
-import static org.mockito.Mockito.spy;
+import static org.mockito.Mockito.times;
 import static org.mockito.Mockito.verify;
 
 @RunWith(RobolectricTestRunner.class)
@@ -62,27 +63,53 @@
     }
 
     @Test
-    public void putInt_shouldLogCount() {
-        mSharedPrefLogger.edit().putInt(TEST_KEY, 1);
-        verify(mLogWriter).count(any(Context.class), anyString(), anyInt());
+    public void putInt_shouldNotLogInitialPut() {
+        final SharedPreferences.Editor editor = mSharedPrefLogger.edit();
+        editor.putInt(TEST_KEY, 1);
+        editor.putInt(TEST_KEY, 1);
+        editor.putInt(TEST_KEY, 1);
+        editor.putInt(TEST_KEY, 2);
+        editor.putInt(TEST_KEY, 2);
+        editor.putInt(TEST_KEY, 2);
+        editor.putInt(TEST_KEY, 2);
+
+        verify(mLogWriter, times(6)).count(any(Context.class), anyString(), anyInt());
     }
 
     @Test
-    public void putBoolean_shouldLogCount() {
-        mSharedPrefLogger.edit().putBoolean(TEST_KEY, true);
-        verify(mLogWriter).count(any(Context.class), anyString(), anyInt());
+    public void putBoolean_shouldNotLogInitialPut() {
+        final SharedPreferences.Editor editor = mSharedPrefLogger.edit();
+        editor.putBoolean(TEST_KEY, true);
+        editor.putBoolean(TEST_KEY, true);
+        editor.putBoolean(TEST_KEY, false);
+        editor.putBoolean(TEST_KEY, false);
+        editor.putBoolean(TEST_KEY, false);
+
+        verify(mLogWriter, times(4)).count(any(Context.class), anyString(), anyInt());
     }
 
     @Test
-    public void putLong_shouldLogCount() {
-        mSharedPrefLogger.edit().putLong(TEST_KEY, 1);
-        verify(mLogWriter).count(any(Context.class), anyString(), anyInt());
+    public void putLong_shouldNotLogInitialPut() {
+        final SharedPreferences.Editor editor = mSharedPrefLogger.edit();
+        editor.putLong(TEST_KEY, 1);
+        editor.putLong(TEST_KEY, 1);
+        editor.putLong(TEST_KEY, 1);
+        editor.putLong(TEST_KEY, 1);
+        editor.putLong(TEST_KEY, 2);
+
+        verify(mLogWriter, times(4)).count(any(Context.class), anyString(), anyInt());
     }
 
     @Test
-    public void putFloat_shouldLogCount() {
-        mSharedPrefLogger.edit().putInt(TEST_KEY, 1);
-        verify(mLogWriter).count(any(Context.class), anyString(), anyInt());
+    public void putFloat_shouldNotLogInitialPut() {
+        final SharedPreferences.Editor editor = mSharedPrefLogger.edit();
+        editor.putFloat(TEST_KEY, 1);
+        editor.putFloat(TEST_KEY, 1);
+        editor.putFloat(TEST_KEY, 1);
+        editor.putFloat(TEST_KEY, 1);
+        editor.putFloat(TEST_KEY, 2);
+
+        verify(mLogWriter, times(4)).count(any(Context.class), anyString(), anyInt());
     }
 
 }
diff --git a/tests/robotests/src/com/android/settings/datausage/BillingCycleSettingsTest.java b/tests/robotests/src/com/android/settings/datausage/BillingCycleSettingsTest.java
new file mode 100644
index 0000000..9ebb580
--- /dev/null
+++ b/tests/robotests/src/com/android/settings/datausage/BillingCycleSettingsTest.java
@@ -0,0 +1,86 @@
+/*
+ * Copyright (C) 2016 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.datausage;
+
+import android.content.Context;
+import android.content.DialogInterface;
+import android.content.SharedPreferences;
+import android.os.Bundle;
+import android.support.v7.preference.PreferenceManager;
+
+import com.android.settings.TestConfig;
+
+import org.junit.Before;
+import org.junit.Test;
+import org.junit.runner.RunWith;
+import org.mockito.Mock;
+import org.mockito.MockitoAnnotations;
+import org.robolectric.RobolectricTestRunner;
+import org.robolectric.RuntimeEnvironment;
+import org.robolectric.annotation.Config;
+
+import static junit.framework.Assert.assertFalse;
+import static junit.framework.Assert.assertTrue;
+import static org.mockito.Matchers.anyLong;
+import static org.mockito.Mockito.never;
+import static org.mockito.Mockito.verify;
+import static org.mockito.Mockito.when;
+
+@RunWith(RobolectricTestRunner.class)
+@Config(manifest = TestConfig.MANIFEST_PATH, sdk = TestConfig.SDK_VERSION)
+public class BillingCycleSettingsTest {
+
+    private static final int LIMIT_BYTES = 123;
+
+    @Mock
+    BillingCycleSettings mMockBillingCycleSettings;
+    BillingCycleSettings.ConfirmLimitFragment mConfirmLimitFragment;
+    @Mock
+    PreferenceManager mMockPreferenceManager;
+    SharedPreferences mSharedPreferences;
+
+    @Before
+    public void setUp() {
+        MockitoAnnotations.initMocks(this);
+        mConfirmLimitFragment = new BillingCycleSettings.ConfirmLimitFragment();
+        mConfirmLimitFragment.setTargetFragment(mMockBillingCycleSettings, 0);
+        mSharedPreferences = RuntimeEnvironment.application.getSharedPreferences(
+                "testSharedPreferences", Context.MODE_PRIVATE);
+        when(mMockBillingCycleSettings.getPreferenceManager()).thenReturn(mMockPreferenceManager);
+        when(mMockPreferenceManager.getSharedPreferences()).thenReturn(mSharedPreferences);
+        final Bundle args = new Bundle();
+        args.putLong(BillingCycleSettings.ConfirmLimitFragment.EXTRA_LIMIT_BYTES, LIMIT_BYTES);
+        mConfirmLimitFragment.setArguments(args);
+        mSharedPreferences.edit().putBoolean(
+                BillingCycleSettings.KEY_SET_DATA_LIMIT, false).apply();
+    }
+
+    @Test
+    public void testDataUsageLimit_shouldNotBeSetOnCancel() {
+        mConfirmLimitFragment.onClick(null, DialogInterface.BUTTON_NEGATIVE);
+
+        assertFalse(mSharedPreferences.getBoolean(BillingCycleSettings.KEY_SET_DATA_LIMIT, true));
+        verify(mMockBillingCycleSettings, never()).setPolicyLimitBytes(anyLong());
+    }
+
+    @Test
+    public void testDataUsageLimit_shouldBeSetOnConfirmation() {
+        mConfirmLimitFragment.onClick(null, DialogInterface.BUTTON_POSITIVE);
+
+        assertTrue(mSharedPreferences.getBoolean(BillingCycleSettings.KEY_SET_DATA_LIMIT, false));
+        verify(mMockBillingCycleSettings).setPolicyLimitBytes(LIMIT_BYTES);
+    }
+}
\ No newline at end of file
diff --git a/tests/robotests/src/com/android/settings/password/SetNewPasswordControllerTest.java b/tests/robotests/src/com/android/settings/password/SetNewPasswordControllerTest.java
new file mode 100644
index 0000000..61dbe08
--- /dev/null
+++ b/tests/robotests/src/com/android/settings/password/SetNewPasswordControllerTest.java
@@ -0,0 +1,183 @@
+/*
+ * Copyright (C) 2016 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.password;
+
+import static android.content.pm.PackageManager.FEATURE_FINGERPRINT;
+import static com.android.settings.ChooseLockGeneric.ChooseLockGenericFragment.HIDE_DISABLED_PREFS;
+import static com.android.settings.ChooseLockGeneric.ChooseLockGenericFragment.MINIMUM_QUALITY_KEY;
+import static com.android.settings.ChooseLockSettingsHelper.EXTRA_KEY_CHALLENGE;
+import static com.android.settings.ChooseLockSettingsHelper.EXTRA_KEY_FOR_FINGERPRINT;
+import static com.android.settings.ChooseLockSettingsHelper.EXTRA_KEY_HAS_CHALLENGE;
+import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertTrue;
+import static org.mockito.Matchers.any;
+import static org.mockito.Matchers.eq;
+import static org.mockito.Mockito.verify;
+import static org.mockito.Mockito.when;
+
+import android.app.admin.DevicePolicyManager;
+import android.content.ComponentName;
+import android.content.Intent;
+import android.content.pm.PackageManager;
+import android.hardware.fingerprint.FingerprintManager;
+import android.os.Bundle;
+
+import com.android.settings.TestConfig;
+
+import org.junit.Before;
+import org.junit.Test;
+import org.junit.runner.RunWith;
+import org.mockito.ArgumentCaptor;
+import org.mockito.Mock;
+import org.mockito.MockitoAnnotations;
+import org.robolectric.RobolectricTestRunner;
+import org.robolectric.annotation.Config;
+
+/**
+ * Tests for {@link SetNewPasswordController}.
+ */
+@RunWith(RobolectricTestRunner.class)
+@Config(manifest = TestConfig.MANIFEST_PATH, sdk = TestConfig.SDK_VERSION)
+public final class SetNewPasswordControllerTest {
+    private static final int CURRENT_UID = 101;
+    private static final long FINGERPRINT_CHALLENGE = -9876512313131L;
+
+    @Mock PackageManager mPackageManager;
+    @Mock FingerprintManager mFingerprintManager;
+    @Mock DevicePolicyManager mDevicePolicyManager;
+
+    @Mock private SetNewPasswordController.Ui mUi;
+    private SetNewPasswordController mSetNewPasswordController;
+
+    @Before
+    public void setUp()  {
+        MockitoAnnotations.initMocks(this);
+
+        mSetNewPasswordController = new SetNewPasswordController(
+                CURRENT_UID, mPackageManager, mFingerprintManager, mDevicePolicyManager, mUi);
+
+        when(mFingerprintManager.preEnroll()).thenReturn(FINGERPRINT_CHALLENGE);
+        when(mPackageManager.hasSystemFeature(eq(FEATURE_FINGERPRINT))).thenReturn(true);
+    }
+
+    @Test
+    public void launchChooseLockWithFingerprint() {
+        // GIVEN the device supports fingerprint.
+        when(mFingerprintManager.isHardwareDetected()).thenReturn(true);
+        // GIVEN there are no enrolled fingerprints.
+        when(mFingerprintManager.hasEnrolledFingerprints()).thenReturn(false);
+        // GIVEN DPC does not disallow fingerprint for keyguard usage.
+        when(mDevicePolicyManager.getKeyguardDisabledFeatures(any(ComponentName.class)))
+                .thenReturn(0);
+
+        // WHEN the controller dispatches a set new password intent.
+        mSetNewPasswordController.dispatchSetNewPasswordIntent();
+
+        // THEN the choose lock activity is launched with fingerprint extras.
+        ArgumentCaptor<Bundle> bundleArgumentCaptor = ArgumentCaptor.forClass(Bundle.class);
+        verify(mUi).launchChooseLock(bundleArgumentCaptor.capture());
+        // THEN the extras have all values for fingerprint setup.
+        compareFingerprintExtras(bundleArgumentCaptor.getValue());
+    }
+
+    @Test
+    public void launchChooseLockWithoutFingerprint_noFingerprintFeature() {
+        // GIVEN the device does NOT support fingerprint feature.
+        when(mPackageManager.hasSystemFeature(eq(FEATURE_FINGERPRINT))).thenReturn(false);
+
+        // WHEN the controller dispatches a set new password intent.
+        mSetNewPasswordController.dispatchSetNewPasswordIntent();
+
+        // THEN the choose lock activity is launched without fingerprint extras.
+        verify(mUi).launchChooseLock(null);
+    }
+
+    @Test
+    public void launchChooseLockWithoutFingerprint_noFingerprintSensor() {
+        // GIVEN the device does NOT support fingerprint.
+        when(mFingerprintManager.isHardwareDetected()).thenReturn(false);
+        // GIVEN there are no enrolled fingerprints.
+        when(mFingerprintManager.hasEnrolledFingerprints()).thenReturn(false);
+        // GIVEN DPC does not disallow fingerprint for keyguard usage.
+        when(mDevicePolicyManager.getKeyguardDisabledFeatures(any(ComponentName.class)))
+                .thenReturn(0);
+
+        // WHEN the controller dispatches a set new password intent.
+        mSetNewPasswordController.dispatchSetNewPasswordIntent();
+
+        // THEN the choose lock activity is launched without fingerprint extras.
+        verify(mUi).launchChooseLock(null);
+    }
+
+    @Test
+    public void launchChooseLockWithoutFingerprint_hasFingerprintEnrolled() {
+        // GIVEN the device supports fingerprint.
+        when(mFingerprintManager.isHardwareDetected()).thenReturn(true);
+        // GIVEN there are no enrolled fingerprints.
+        when(mFingerprintManager.hasEnrolledFingerprints()).thenReturn(true);
+        // GIVEN DPC does not disallow fingerprint for keyguard usage.
+        when(mDevicePolicyManager.getKeyguardDisabledFeatures(any(ComponentName.class)))
+                .thenReturn(0);
+
+        // WHEN the controller dispatches a set new password intent.
+        mSetNewPasswordController.dispatchSetNewPasswordIntent();
+
+        // THEN the choose lock activity is launched without fingerprint extras.
+        verify(mUi).launchChooseLock(null);
+    }
+
+    @Test
+    public void launchChooseLockWithoutFingerprint_deviceAdminDisallowFingerprintForKeyguard() {
+        // GIVEN the device supports fingerprint.
+        when(mFingerprintManager.isHardwareDetected()).thenReturn(true);
+        // GIVEN there is an enrolled fingerprint.
+        when(mFingerprintManager.hasEnrolledFingerprints()).thenReturn(true);
+        // GIVEN DPC disallows fingerprint for keyguard usage.
+        when(mDevicePolicyManager.getKeyguardDisabledFeatures(any(ComponentName.class)))
+                .thenReturn(DevicePolicyManager.KEYGUARD_DISABLE_FINGERPRINT);
+
+        // WHEN the controller dispatches a set new password intent.
+        mSetNewPasswordController.dispatchSetNewPasswordIntent();
+
+        // THEN the choose lock activity is launched without fingerprint extras.
+        verify(mUi).launchChooseLock(null);
+    }
+
+    private void compareFingerprintExtras(Bundle actualBundle) {
+        assertEquals(
+                "Password quality must be something in order to config fingerprint.",
+                DevicePolicyManager.PASSWORD_QUALITY_SOMETHING,
+                actualBundle.getInt(MINIMUM_QUALITY_KEY));
+        assertTrue(
+                "All disabled preference should be removed.",
+                actualBundle.getBoolean(HIDE_DISABLED_PREFS));
+        assertTrue(
+                "There must be a fingerprint challenge.",
+                actualBundle.getBoolean(EXTRA_KEY_HAS_CHALLENGE));
+        assertEquals(
+                "The fingerprint challenge must come from the FingerprintManager",
+                FINGERPRINT_CHALLENGE,
+                actualBundle.getLong(EXTRA_KEY_CHALLENGE));
+        assertTrue(
+                "The request must be a fingerprint set up request.",
+                actualBundle.getBoolean(EXTRA_KEY_FOR_FINGERPRINT));
+        assertEquals(
+                "User id must be equaled to the input one.",
+                CURRENT_UID,
+                actualBundle.getInt(Intent.EXTRA_USER_ID));
+    }
+}
diff --git a/tests/robotests/src/com/android/settings/widget/RtlCompatibleViewPagerTest.java b/tests/robotests/src/com/android/settings/widget/RtlCompatibleViewPagerTest.java
index 2b3613f..b5213f1 100644
--- a/tests/robotests/src/com/android/settings/widget/RtlCompatibleViewPagerTest.java
+++ b/tests/robotests/src/com/android/settings/widget/RtlCompatibleViewPagerTest.java
@@ -16,47 +16,46 @@
 
 package com.android.settings.widget;
 
-import android.annotation.Nullable;
-import android.app.Activity;
-import android.os.Bundle;
 import android.os.Parcelable;
+import android.support.v4.view.PagerAdapter;
 import android.text.TextUtils;
 import android.view.View;
 import android.view.ViewGroup;
+
 import com.android.settings.TestConfig;
 import com.android.settings.shadow.ShadowTextUtils;
+
 import org.junit.Before;
 import org.junit.Test;
 import org.junit.runner.RunWith;
-
-import static com.google.common.truth.Truth.assertThat;
+import org.robolectric.RobolectricTestRunner;
+import org.robolectric.annotation.Config;
+import org.robolectric.shadows.ShadowApplication;
 
 import java.util.Locale;
 
-import android.support.v4.view.PagerAdapter;
-import org.robolectric.RobolectricTestRunner;
-import org.robolectric.annotation.Config;
-import org.robolectric.Robolectric;
+import static com.google.common.truth.Truth.assertThat;
 
 @RunWith(RobolectricTestRunner.class)
 @Config(manifest = TestConfig.MANIFEST_PATH, sdk = TestConfig.SDK_VERSION)
 public class RtlCompatibleViewPagerTest {
-    private ViewPagerTestActivity mTestActivity;
-    private RtlCompatibleViewPager mTestViewPager;
+
     private Locale mLocaleEn;
     private Locale mLocaleHe;
+    private RtlCompatibleViewPager mViewPager;
 
     @Before
     public void setUp() {
-        mTestActivity = Robolectric.setupActivity(ViewPagerTestActivity.class);
-        mTestViewPager = mTestActivity.getViewPager();
+        mViewPager = new RtlCompatibleViewPager(
+                ShadowApplication.getInstance().getApplicationContext());
+        mViewPager.setAdapter(new ViewPagerAdapter());
         mLocaleEn = new Locale("en");
         mLocaleHe = new Locale("he");
     }
 
     @Test
     @Config(shadows = {ShadowTextUtils.class})
-    public void testRtlCompatible() {
+    public void testGetCurrentItem_shouldMaintainIndexDuringLocaleChange() {
         testRtlCompatibleInner(0);
         testRtlCompatibleInner(1);
     }
@@ -64,41 +63,20 @@
     private void testRtlCompatibleInner(int currentItem) {
         // Set up the environment
         Locale.setDefault(mLocaleEn);
+        mViewPager.setCurrentItem(currentItem);
+
         assertThat(TextUtils.getLayoutDirectionFromLocale(Locale.getDefault()))
                 .isEqualTo(View.LAYOUT_DIRECTION_LTR);
-        mTestViewPager.setCurrentItem(currentItem);
-        assertThat(mTestViewPager.getCurrentItem()).isEqualTo(currentItem);
+        assertThat(mViewPager.getCurrentItem()).isEqualTo(currentItem);
 
         // Simulate to change the language to RTL
-        Parcelable savedInstance = mTestViewPager.onSaveInstanceState();
+        Parcelable savedInstance = mViewPager.onSaveInstanceState();
         Locale.setDefault(mLocaleHe);
+        mViewPager.onRestoreInstanceState(savedInstance);
+
         assertThat(TextUtils.getLayoutDirectionFromLocale(Locale.getDefault()))
                 .isEqualTo(View.LAYOUT_DIRECTION_RTL);
-        mTestViewPager.onRestoreInstanceState(savedInstance);
-
-        assertThat(mTestViewPager.getCurrentItem()).isEqualTo(currentItem);
-    }
-
-
-    /**
-     * Test activity that contains RTL viewpager
-     */
-    private static class ViewPagerTestActivity extends Activity {
-        private RtlCompatibleViewPager mViewPager;
-
-        @Override
-        protected void onCreate(@Nullable Bundle savedInstanceState) {
-            super.onCreate(savedInstanceState);
-
-            mViewPager = new RtlCompatibleViewPager(ViewPagerTestActivity.this);
-            mViewPager.setAdapter(new ViewPagerAdapter());
-
-            setContentView(mViewPager);
-        }
-
-        public RtlCompatibleViewPager getViewPager() {
-            return mViewPager;
-        }
+        assertThat(mViewPager.getCurrentItem()).isEqualTo(currentItem);
     }
 
     /**
@@ -122,11 +100,6 @@
         }
 
         @Override
-        public void destroyItem(ViewGroup collection, int position, Object view) {
-            collection.removeView((View) view);
-        }
-
-        @Override
         public Object instantiateItem(ViewGroup container, int position) {
             return null;
         }