Merge "Use colorful +s" into oc-mr1-dev
diff --git a/res/values/strings.xml b/res/values/strings.xml
index 6eae5d1..1c387f3 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 -->
@@ -6833,6 +6835,10 @@
     <!-- [CHAR LIMIT=100] Notification Importance: high importance level description -->
     <string name="notification_importance_high">Make sound and pop on screen</string>
 
+    <!-- [CHAR LIMIT=100] Notification Importance: high importance level description,
+     when the user has picked high importance but disabled sound for it -->
+    <string name="notification_importance_high_silent">Pop on screen</string>
+
     <!-- Importance title strings for the Importance page. Also the first part of the importance
      summary on the channel page-->
 
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/res/xml/connected_devices.xml b/res/xml/connected_devices.xml
index abbeda6..4ca92bf 100644
--- a/res/xml/connected_devices.xml
+++ b/res/xml/connected_devices.xml
@@ -42,6 +42,7 @@
         android:key="sms_mirroring"
         android:title="@string/sms_mirroring_pref"
         android:icon="@drawable/ic_compare_arrows_24dp"
+        android:summary="@string/summary_placeholder"
         android:order="-3"/>
 
     <Preference
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/fuelgauge/AdvancedPowerUsageDetail.java b/src/com/android/settings/fuelgauge/AdvancedPowerUsageDetail.java
index 4717109..3b83fa5 100644
--- a/src/com/android/settings/fuelgauge/AdvancedPowerUsageDetail.java
+++ b/src/com/android/settings/fuelgauge/AdvancedPowerUsageDetail.java
@@ -31,6 +31,7 @@
 import android.support.v14.preference.PreferenceFragment;
 import android.support.v7.preference.Preference;
 import android.text.TextUtils;
+import android.util.Log;
 import android.view.View;
 
 import com.android.internal.logging.nano.MetricsProto.MetricsEvent;
@@ -163,9 +164,15 @@
 
     public static void startBatteryDetailPage(SettingsActivity caller, PreferenceFragment fragment,
             String packageName) {
-        final Bundle args = new Bundle(2);
+        final Bundle args = new Bundle(3);
+        final PackageManager packageManager = caller.getPackageManager();
         args.putString(EXTRA_PACKAGE_NAME, packageName);
         args.putString(EXTRA_POWER_USAGE_PERCENT, Utils.formatPercentage(0));
+        try {
+            args.putInt(EXTRA_UID, packageManager.getPackageUid(packageName, 0 /* no flag */));
+        } catch (PackageManager.NameNotFoundException e) {
+            Log.e(TAG, "Cannot find package: " + packageName, e);
+        }
 
         caller.startPreferencePanelAsUser(fragment, AdvancedPowerUsageDetail.class.getName(), args,
                 R.string.battery_details_title, null, new UserHandle(UserHandle.myUserId()));
diff --git a/src/com/android/settings/network/TetherPreferenceController.java b/src/com/android/settings/network/TetherPreferenceController.java
index 5712907..1c9959e 100644
--- a/src/com/android/settings/network/TetherPreferenceController.java
+++ b/src/com/android/settings/network/TetherPreferenceController.java
@@ -88,8 +88,7 @@
     public TetherPreferenceController(Context context, Lifecycle lifecycle) {
         super(context);
         mBluetoothPan = new AtomicReference<>();
-        mAdminDisallowedTetherConfig = checkIfRestrictionEnforced(
-                mContext, DISALLOW_CONFIG_TETHERING, UserHandle.myUserId()) != null;
+        mAdminDisallowedTetherConfig = isTetherConfigDisallowed(context);
         mConnectivityManager =
                 (ConnectivityManager) context.getSystemService(Context.CONNECTIVITY_SERVICE);
         mBluetoothAdapter = BluetoothAdapter.getDefaultAdapter();
@@ -170,6 +169,11 @@
         }
     }
 
+    public static boolean isTetherConfigDisallowed(Context context) {
+        return checkIfRestrictionEnforced(
+                context, DISALLOW_CONFIG_TETHERING, UserHandle.myUserId()) != null;
+    }
+
     @VisibleForTesting
     void updateSummary() {
         if (mPreference == null) {
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/fuelgauge/AdvancedPowerUsageDetailTest.java b/tests/robotests/src/com/android/settings/fuelgauge/AdvancedPowerUsageDetailTest.java
index c7eebc8..54d043c 100644
--- a/tests/robotests/src/com/android/settings/fuelgauge/AdvancedPowerUsageDetailTest.java
+++ b/tests/robotests/src/com/android/settings/fuelgauge/AdvancedPowerUsageDetailTest.java
@@ -369,6 +369,16 @@
     }
 
     @Test
+    public void testStartBatteryDetailPage_batteryEntryNotExisted_extractUidFromPackageName() throws
+            PackageManager.NameNotFoundException{
+        doReturn(UID).when(mPackageManager).getPackageUid(PACKAGE_NAME[0], 0 /* no flag */);
+
+        AdvancedPowerUsageDetail.startBatteryDetailPage(mTestActivity, null, PACKAGE_NAME[0]);
+
+        assertThat(mBundle.getInt(AdvancedPowerUsageDetail.EXTRA_UID)).isEqualTo(UID);
+    }
+
+    @Test
     public void testStartBatteryDetailPage_defaultPackageNull_chooseFromBatterySipper() {
         mBatteryEntry.defaultPackageName = null;
         mBatteryEntry.sipper.mPackages = PACKAGE_NAME;
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);