Merge "Update SMS mirroring icon to new style." into oc-mr1-dev
diff --git a/res/values/strings.xml b/res/values/strings.xml
index 56771c3..2552a36 100644
--- a/res/values/strings.xml
+++ b/res/values/strings.xml
@@ -1953,6 +1953,8 @@
     <string name="wifi_failed_connect_message">Failed to connect to network</string>
     <!-- Button label to delete a Wi-Fi network -->
     <string name="wifi_forget">Forget</string>
+    <!-- Button label to modify a Wi-Fi network -->
+    <string name="wifi_modify">Modify</string>
     <!-- Failured notification for forget -->
     <string name="wifi_failed_forget_message">Failed to forget network</string>
     <!-- Button label to save a Wi-Fi network configuration -->
@@ -3498,6 +3500,20 @@
          continue. [CHAR LIMIT=100] -->
     <string name="lockpassword_strong_auth_required_work_password">For added security, enter your work password</string>
 
+    <!-- An explanation text that the pattern needs to be solved because the device was factory reset. [CHAR LIMIT=100] -->
+    <string name="lockpassword_confirm_your_pattern_details_frp">Your phone was reset to factory settings. To use this phone, enter your previous pattern.</string>
+    <!-- An explanation text that the pin needs to be solved because the device was factory reset. [CHAR LIMIT=100] -->
+    <string name="lockpassword_confirm_your_pin_details_frp">Your phone was reset to factory settings. To use this phone, enter your previous PIN.</string>
+    <!-- An explanation text that the password needs to be solved because the device was factory reset. [CHAR LIMIT=100] -->
+    <string name="lockpassword_confirm_your_password_details_frp">Your phone was reset to factory settings. To use this phone, enter your previous password.</string>
+
+    <!-- Header shown when pattern needs to be solved because the device was factory reset. [CHAR LIMIT=100] -->
+    <string name="lockpassword_confirm_your_pattern_header_frp">Verify pattern</string>
+    <!-- Header shown when the pin needs to be solved because the device was factory reset. [CHAR LIMIT=100] -->
+    <string name="lockpassword_confirm_your_pin_header_frp">Verify PIN</string>
+    <!-- Header shown when the password needs to be solved because the device was factory reset. [CHAR LIMIT=100] -->
+    <string name="lockpassword_confirm_your_password_header_frp">Verify password</string>
+
     <!-- Security & location settings screen, change security method screen instruction if user
          enters incorrect PIN [CHAR LIMIT=30] -->
     <string name="lockpassword_invalid_pin">Wrong PIN</string>
diff --git a/res/xml/configure_notification_settings.xml b/res/xml/configure_notification_settings.xml
index 1d36c48..21904e6 100644
--- a/res/xml/configure_notification_settings.xml
+++ b/res/xml/configure_notification_settings.xml
@@ -22,16 +22,11 @@
         android:key="dashboard_tile_placeholder"
         android:order="1"/>
 
-    <PreferenceCategory
-        android:key="lock_screen_notifications_profile_header"
-        android:title="@string/profile_section_header">
-
-        <com.android.settings.notification.RestrictedDropDownPreference
-            android:key="lock_screen_notifications_profile"
-            android:title="@string/lock_screen_notifications_title"
-            android:summary="@string/summary_placeholder"/>
-
-    </PreferenceCategory>
+    <!-- When device is locked -->
+    <com.android.settings.notification.RestrictedDropDownPreference
+        android:key="lock_screen_notifications"
+        android:title="@string/lock_screen_notifications_title"
+        android:summary="@string/summary_placeholder"/>
 
     <!-- Notification badging -->
     <SwitchPreference
@@ -43,12 +38,6 @@
         android:key="notification_pulse"
         android:title="@string/notification_pulse_title"/>
 
-    <!-- When device is locked -->
-    <com.android.settings.notification.RestrictedDropDownPreference
-        android:key="lock_screen_notifications"
-        android:title="@string/lock_screen_notifications_title"
-        android:summary="@string/summary_placeholder"/>
-
     <!-- Default notification ringtone -->
     <com.android.settings.DefaultRingtonePreference
         android:key="notification_default_ringtone"
@@ -62,4 +51,14 @@
         android:title="@string/fingerprint_swipe_for_notifications_title"
         android:fragment="com.android.settings.gestures.SwipeToNotificationSettings" />
 
+    <PreferenceCategory
+        android:key="lock_screen_notifications_profile_header"
+        android:title="@string/profile_section_header">
+
+        <com.android.settings.notification.RestrictedDropDownPreference
+            android:key="lock_screen_notifications_profile"
+            android:title="@string/lock_screen_notifications_title"
+            android:summary="@string/summary_placeholder"/>
+
+    </PreferenceCategory>
 </PreferenceScreen>
diff --git a/src/com/android/settings/bluetooth/BluetoothPairingPreferenceController.java b/src/com/android/settings/bluetooth/BluetoothPairingPreferenceController.java
index 5141b5c..8ac64e8 100644
--- a/src/com/android/settings/bluetooth/BluetoothPairingPreferenceController.java
+++ b/src/com/android/settings/bluetooth/BluetoothPairingPreferenceController.java
@@ -76,7 +76,7 @@
     public Preference createBluetoothPairingPreference(int order) {
         mPreference = new Preference(mFragment.getPreferenceScreen().getContext());
         mPreference.setKey(KEY_PAIRING);
-        mPreference.setIcon(R.drawable.ic_add);
+        mPreference.setIcon(R.drawable.ic_menu_add);
         mPreference.setOrder(order);
         mPreference.setTitle(R.string.bluetooth_pairing_pref_title);
 
diff --git a/src/com/android/settings/dashboard/suggestions/SuggestionFeatureProviderImpl.java b/src/com/android/settings/dashboard/suggestions/SuggestionFeatureProviderImpl.java
index e4f58d7..f8b5a8b 100644
--- a/src/com/android/settings/dashboard/suggestions/SuggestionFeatureProviderImpl.java
+++ b/src/com/android/settings/dashboard/suggestions/SuggestionFeatureProviderImpl.java
@@ -25,7 +25,6 @@
 import android.provider.Settings.Secure;
 import android.support.annotation.NonNull;
 import android.support.annotation.VisibleForTesting;
-import android.text.format.DateUtils;
 import android.util.Log;
 
 import com.android.internal.logging.nano.MetricsProto;
@@ -55,12 +54,6 @@
 
     private static final String SHARED_PREF_FILENAME = "suggestions";
 
-    // Suggestion category name and expiration threshold for first impression type. Needs to keep
-    // in sync with suggestion_ordering.xml
-    private static final String CATEGORY_FIRST_IMPRESSION =
-            "com.android.settings.suggested.category.FIRST_IMPRESSION";
-    private static final long FIRST_IMPRESSION_EXPIRE_DAY_IN_MILLIS = 14 * DateUtils.DAY_IN_MILLIS;
-
     private final SuggestionRanker mSuggestionRanker;
     private final MetricsFeatureProvider mMetricsFeatureProvider;
 
@@ -141,12 +134,7 @@
                 context, MetricsProto.MetricsEvent.ACTION_SETTINGS_DISMISS_SUGGESTION,
                 getSuggestionIdentifier(context, suggestion));
 
-        boolean isSmartSuggestionEnabled = isSmartSuggestionEnabled(context);
-        if (isSmartSuggestionEnabled) {
-            // Disable smart suggestion if we are still showing first impression suggestions.
-            isSmartSuggestionEnabled = !isShowingFirstImpressionSuggestion(context);
-        }
-        if (!parser.dismissSuggestion(suggestion, isSmartSuggestionEnabled)) {
+        if (!parser.dismissSuggestion(suggestion)) {
             return;
         }
         context.getPackageManager().setComponentEnabledSetting(
@@ -155,19 +143,6 @@
                 PackageManager.DONT_KILL_APP);
     }
 
-    private boolean isShowingFirstImpressionSuggestion(Context context) {
-        final String keySetupTime = CATEGORY_FIRST_IMPRESSION + SuggestionParser.SETUP_TIME;
-        final long currentTime = System.currentTimeMillis();
-        final SharedPreferences sharedPrefs = getSharedPrefs(context);
-        if (!sharedPrefs.contains(keySetupTime)) {
-            return true;
-        }
-        final long setupTime = sharedPrefs.getLong(keySetupTime, 0);
-        final long elapsedTime = currentTime - setupTime;
-        Log.d(TAG, "Day " + elapsedTime / DateUtils.DAY_IN_MILLIS + " for first impression");
-        return elapsedTime <= FIRST_IMPRESSION_EXPIRE_DAY_IN_MILLIS;
-    }
-
     @Override
     public String getSuggestionIdentifier(Context context, Tile suggestion) {
         if (suggestion.intent == null || suggestion.intent.getComponent() == null
diff --git a/src/com/android/settings/display/AmbientDisplayAlwaysOnPreferenceController.java b/src/com/android/settings/display/AmbientDisplayAlwaysOnPreferenceController.java
index fffa243..280098d 100644
--- a/src/com/android/settings/display/AmbientDisplayAlwaysOnPreferenceController.java
+++ b/src/com/android/settings/display/AmbientDisplayAlwaysOnPreferenceController.java
@@ -37,7 +37,7 @@
     private final int ON = 1;
     private final int OFF = 0;
 
-    private static final String KEY_ALWAYS_ON = "ambient_display_always_on";
+    public static final String KEY_ALWAYS_ON = "ambient_display_always_on";
     private static final int MY_USER = UserHandle.myUserId();
 
     private final AmbientDisplayConfiguration mConfig;
@@ -61,7 +61,11 @@
 
     @Override
     public void updateState(Preference preference) {
-        ((SwitchPreference) preference).setChecked(mConfig.alwaysOnEnabled(MY_USER));
+        ((SwitchPreference) preference).setChecked(isAlwaysOnEnabled(mConfig));
+    }
+
+    public static boolean isAlwaysOnEnabled(AmbientDisplayConfiguration config) {
+        return config.alwaysOnEnabled(MY_USER);
     }
 
     @Override
@@ -77,7 +81,15 @@
 
     @Override
     public boolean isAvailable() {
-        return mConfig.alwaysOnAvailableForUser(MY_USER);
+        return isAvailable(mConfig);
+    }
+
+    public static boolean isAvailable(AmbientDisplayConfiguration config) {
+        return config.alwaysOnAvailableForUser(MY_USER);
+    }
+
+    public static boolean accessibilityInversionEnabled(AmbientDisplayConfiguration config) {
+        return config.accessibilityInversionEnabled(MY_USER);
     }
 
     @Override
diff --git a/src/com/android/settings/fingerprint/FingerprintSettings.java b/src/com/android/settings/fingerprint/FingerprintSettings.java
index 2425c61..4eddcb1 100644
--- a/src/com/android/settings/fingerprint/FingerprintSettings.java
+++ b/src/com/android/settings/fingerprint/FingerprintSettings.java
@@ -402,7 +402,7 @@
             Preference addPreference = new Preference(root.getContext());
             addPreference.setKey(KEY_FINGERPRINT_ADD);
             addPreference.setTitle(R.string.fingerprint_add_title);
-            addPreference.setIcon(R.drawable.ic_add_24dp);
+            addPreference.setIcon(R.drawable.ic_menu_add);
             root.addPreference(addPreference);
             addPreference.setOnPreferenceChangeListener(this);
             updateAddPreference();
diff --git a/src/com/android/settings/notification/ZenModeSettings.java b/src/com/android/settings/notification/ZenModeSettings.java
index 534892c..8cb700b 100644
--- a/src/com/android/settings/notification/ZenModeSettings.java
+++ b/src/com/android/settings/notification/ZenModeSettings.java
@@ -136,7 +136,7 @@
             }
         }
         final Preference p = new Preference(getPrefContext());
-        p.setIcon(R.drawable.ic_add);
+        p.setIcon(R.drawable.ic_menu_add);
         p.setTitle(R.string.zen_mode_add_rule);
         p.setPersistent(false);
         p.setOnPreferenceClickListener(new Preference.OnPreferenceClickListener() {
diff --git a/src/com/android/settings/password/ConfirmLockPassword.java b/src/com/android/settings/password/ConfirmLockPassword.java
index 328646b..dcb7b66 100644
--- a/src/com/android/settings/password/ConfirmLockPassword.java
+++ b/src/com/android/settings/password/ConfirmLockPassword.java
@@ -197,11 +197,19 @@
         }
 
         private int getDefaultHeader() {
+            if (mFrp) {
+                return mIsAlpha ? R.string.lockpassword_confirm_your_password_header_frp
+                        : R.string.lockpassword_confirm_your_pin_header_frp;
+            }
             return mIsAlpha ? R.string.lockpassword_confirm_your_password_header
                     : R.string.lockpassword_confirm_your_pin_header;
         }
 
         private int getDefaultDetails() {
+            if (mFrp) {
+                return mIsAlpha ? R.string.lockpassword_confirm_your_password_details_frp
+                        : R.string.lockpassword_confirm_your_pin_details_frp;
+            }
             boolean isStrongAuthRequired = isStrongAuthRequired();
             boolean isProfile = UserManager.get(getActivity()).isManagedProfile(mEffectiveUserId);
             // Map boolean flags to an index by isStrongAuth << 2 + isProfile << 1 + isAlpha.
diff --git a/src/com/android/settings/password/ConfirmLockPattern.java b/src/com/android/settings/password/ConfirmLockPattern.java
index eb42784..60d5a01 100644
--- a/src/com/android/settings/password/ConfirmLockPattern.java
+++ b/src/com/android/settings/password/ConfirmLockPattern.java
@@ -243,6 +243,9 @@
         }
 
         private int getDefaultDetails() {
+            if (mFrp) {
+                return R.string.lockpassword_confirm_your_pattern_details_frp;
+            }
             final boolean isStrongAuthRequired = isStrongAuthRequired();
             if (UserManager.get(getActivity()).isManagedProfile(mEffectiveUserId)) {
                 return isStrongAuthRequired
@@ -296,7 +299,7 @@
                     if (mHeaderText != null) {
                         mHeaderTextView.setText(mHeaderText);
                     } else {
-                        mHeaderTextView.setText(R.string.lockpassword_confirm_your_pattern_header);
+                        mHeaderTextView.setText(getDefaultHeader());
                     }
                     if (mDetailsText != null) {
                         mDetailsTextView.setText(mDetailsText);
@@ -331,6 +334,11 @@
             mHeaderTextView.announceForAccessibility(mHeaderTextView.getText());
         }
 
+        private int getDefaultHeader() {
+            return mFrp ? R.string.lockpassword_confirm_your_pattern_header_frp
+                    : R.string.lockpassword_confirm_your_pattern_header;
+        }
+
         private Runnable mClearPatternRunnable = new Runnable() {
             public void run() {
                 mLockPatternView.clearPattern();
diff --git a/tests/robotests/src/com/android/settings/dashboard/suggestions/SuggestionFeatureProviderImplTest.java b/tests/robotests/src/com/android/settings/dashboard/suggestions/SuggestionFeatureProviderImplTest.java
index 2fde357..59b918a 100644
--- a/tests/robotests/src/com/android/settings/dashboard/suggestions/SuggestionFeatureProviderImplTest.java
+++ b/tests/robotests/src/com/android/settings/dashboard/suggestions/SuggestionFeatureProviderImplTest.java
@@ -17,8 +17,17 @@
 package com.android.settings.dashboard.suggestions;
 
 
-import android.app.ActivityManager;
+import static com.google.common.truth.Truth.assertThat;
+import static org.mockito.Matchers.any;
+import static org.mockito.Matchers.anyInt;
+import static org.mockito.Matchers.anyString;
+import static org.mockito.Matchers.eq;
+import static org.mockito.Mockito.never;
+import static org.mockito.Mockito.verify;
+import static org.mockito.Mockito.verifyZeroInteractions;
+import static org.mockito.Mockito.when;
 
+import android.app.ActivityManager;
 import android.content.ComponentName;
 import android.content.Context;
 import android.content.Intent;
@@ -59,18 +68,6 @@
 import java.util.ArrayList;
 import java.util.List;
 
-import static com.google.common.truth.Truth.assertThat;
-import static org.mockito.Matchers.any;
-import static org.mockito.Matchers.anyBoolean;
-import static org.mockito.Matchers.anyInt;
-import static org.mockito.Matchers.anyString;
-import static org.mockito.Matchers.eq;
-import static org.mockito.Mockito.never;
-import static org.mockito.Mockito.spy;
-import static org.mockito.Mockito.verify;
-import static org.mockito.Mockito.verifyZeroInteractions;
-import static org.mockito.Mockito.when;
-
 @RunWith(SettingsRobolectricTestRunner.class)
 @Config(manifest = TestConfig.MANIFEST_PATH,
         sdk = TestConfig.SDK_VERSION,
@@ -337,7 +334,7 @@
 
     @Test
     public void dismissSuggestion_hasMoreDismissCount_shouldNotDisableComponent() {
-        when(mSuggestionParser.dismissSuggestion(any(Tile.class), anyBoolean()))
+        when(mSuggestionParser.dismissSuggestion(any(Tile.class)))
                 .thenReturn(false);
         mProvider.dismissSuggestion(mContext, mSuggestionParser, mSuggestion);
 
@@ -349,25 +346,6 @@
     }
 
     @Test
-    public void dismissSuggestion_isShowingFirstImpressionType_dismissWithoutSmartSuggestionRule() {
-        mProvider = spy(mProvider);
-        when(mProvider.isSmartSuggestionEnabled(any(Context.class))).thenReturn(true);
-        final SharedPreferences pref = RuntimeEnvironment.application.getSharedPreferences(
-                "test_pref", Context.MODE_PRIVATE);
-        when(mProvider.getSharedPrefs(mContext)).thenReturn(pref);
-        when(mSuggestionParser.dismissSuggestion(any(Tile.class), anyBoolean()))
-                .thenReturn(false);
-
-        mProvider.dismissSuggestion(mContext, mSuggestionParser, mSuggestion);
-
-        verify(mFactory.metricsFeatureProvider).action(
-                eq(mContext),
-                eq(MetricsProto.MetricsEvent.ACTION_SETTINGS_DISMISS_SUGGESTION),
-                anyString());
-        verify(mSuggestionParser).dismissSuggestion(any(Tile.class), eq(false));
-    }
-
-    @Test
     public void dismissSuggestion_noContext_shouldDoNothing() {
         mProvider.dismissSuggestion(null, mSuggestionParser, mSuggestion);
 
@@ -376,7 +354,7 @@
 
     @Test
     public void dismissSuggestion_hasNoMoreDismissCount_shouldDisableComponent() {
-        when(mSuggestionParser.dismissSuggestion(any(Tile.class), anyBoolean()))
+        when(mSuggestionParser.dismissSuggestion(any(Tile.class)))
                 .thenReturn(true);
 
         mProvider.dismissSuggestion(mContext, mSuggestionParser, mSuggestion);
diff --git a/tests/robotests/src/com/android/settings/testutils/shadow/ShadowSecureSettings.java b/tests/robotests/src/com/android/settings/testutils/shadow/ShadowSecureSettings.java
index 1ae5398..0f61a5d 100644
--- a/tests/robotests/src/com/android/settings/testutils/shadow/ShadowSecureSettings.java
+++ b/tests/robotests/src/com/android/settings/testutils/shadow/ShadowSecureSettings.java
@@ -89,6 +89,32 @@
         }
     }
 
+    @Implementation
+    public static boolean putFloatForUser(
+            ContentResolver resolver, String name, float value, int userHandle) {
+        final Table<Integer, String, Object> userTable = getUserTable(resolver);
+        synchronized (userTable) {
+            userTable.put(userHandle, name, value);
+            return true;
+        }
+    }
+
+    @Implementation
+    public static float getFloatForUser(
+            ContentResolver resolver, String name, float def, int userHandle) {
+        final Table<Integer, String, Object> userTable = getUserTable(resolver);
+        synchronized (userTable) {
+            final Object object = userTable.get(userHandle, name);
+            return object instanceof Float ? (Float) object : def;
+        }
+    }
+
+    public static void clear() {
+        synchronized (sUserDataMap) {
+            sUserDataMap.clear();
+        }
+    }
+
     private static Table<Integer, String, Object> getUserTable(ContentResolver contentResolver) {
         synchronized (sUserDataMap) {
             Table<Integer, String, Object> table = sUserDataMap.get(contentResolver);