Merge "Fix bug #19313587 Settings unusable when userdata is full"
diff --git a/res/drawable/preference_background.xml b/res/drawable/preference_background.xml
index 7f7b560..12bdea8 100644
--- a/res/drawable/preference_background.xml
+++ b/res/drawable/preference_background.xml
@@ -14,9 +14,5 @@
      limitations under the License.
 -->
 
-<inset xmlns:android="http://schemas.android.com/apk/res/android"
-    android:inset="0dip">
-
-    <color android:color="?android:attr/colorBackground" />
-
-</inset>
+<color xmlns:android="http://schemas.android.com/apk/res/android"
+       android:color="?android:attr/colorBackground" />
diff --git a/res/layout/dashboard_category.xml b/res/layout/dashboard_category.xml
index 01afa5d..bee063e 100644
--- a/res/layout/dashboard_category.xml
+++ b/res/layout/dashboard_category.xml
@@ -21,7 +21,7 @@
         android:paddingStart="@dimen/dashboard_category_padding_start"
         android:paddingEnd="@dimen/dashboard_category_padding_end"
         android:orientation="vertical"
-        android:background="@android:color/white"
+        android:background="@color/card_background"
         android:layout_marginBottom="8dip"
         android:elevation="@dimen/dashboard_category_elevation">
 
diff --git a/res/layout/settings_main_dashboard.xml b/res/layout/settings_main_dashboard.xml
index 56f2737..36c8aa2 100644
--- a/res/layout/settings_main_dashboard.xml
+++ b/res/layout/settings_main_dashboard.xml
@@ -21,5 +21,5 @@
              android:id="@+id/main_content"
              android:layout_height="match_parent"
              android:layout_width="match_parent"
-             android:background="@color/dashboard_background_color"
+             android:background="?android:attr/colorBackground"
              />
diff --git a/res/values-night/colors.xml b/res/values-night/colors.xml
new file mode 100644
index 0000000..81d7347
--- /dev/null
+++ b/res/values-night/colors.xml
@@ -0,0 +1,4 @@
+<?xml version="1.0" encoding="utf-8"?>
+<resources>
+    <color name="card_background">#ff424242</color>
+</resources>
\ No newline at end of file
diff --git a/res/values/arrays.xml b/res/values/arrays.xml
index b542d3b..a0afbc3 100644
--- a/res/values/arrays.xml
+++ b/res/values/arrays.xml
@@ -1288,4 +1288,26 @@
         <item>midi</item>
     </string-array>
 
+    <!-- Possible values for user theme in Display Settings.
+         Do not translate. -->
+    <string-array name="night_mode_entries" translatable="false">
+        <!-- Do not translate. -->
+        <item>@string/night_mode_no</item>
+        <!-- Do not translate. -->
+        <item>@string/night_mode_yes</item>
+        <!-- Do not translate. -->
+        <item>@string/night_mode_auto</item>
+    </string-array>
+
+    <!-- These values should match up with the MODE_NIGHT constants in UiModeManager.
+         Do not translate. -->
+    <string-array name="night_mode_values" translatable="false">
+        <!-- Do not translate. -->
+        <item>1</item>
+        <!-- Do not translate. -->
+        <item>2</item>
+        <!-- Do not translate. -->
+        <item>0</item>
+    </string-array>
+
 </resources>
diff --git a/res/values/colors.xml b/res/values/colors.xml
index 9e374e6..6f97f40 100644
--- a/res/values/colors.xml
+++ b/res/values/colors.xml
@@ -64,12 +64,13 @@
     <color name="running_processes_apps_ram">#ff009587</color>
     <color name="running_processes_free_ram">#ffced7db</color>
 
+    <color name="card_background">#ffffffff</color>
+
     <!-- Palette colors referenced by top-level themes. -->
     <color name="theme_primary">#ff263238</color>
     <color name="theme_primary_dark">#ff21272b</color>
     <color name="theme_accent">#ff009688</color>
 
-    <color name="dashboard_background_color">#ffe1e1e0</color>
     <color name="switchbar_background_color">#ff37474f</color>
     <color name="switch_accent_color">#ff7fcac3</color>
 
diff --git a/res/values/strings.xml b/res/values/strings.xml
index ee02364..6e560c1 100644
--- a/res/values/strings.xml
+++ b/res/values/strings.xml
@@ -1889,6 +1889,16 @@
     <string name="auto_brightness_title">Adaptive brightness</string>
     <!-- Sound & display settings screen, setting option summary to enable adaptive brightness [CHAR LIMIT=100] -->
     <string name="auto_brightness_summary">Optimize brightness level for available light</string>
+    <!-- Sound & display settings screen, setting option name to change the user interface theme [CHAR LIMIT=30] -->
+    <string name="night_mode_title">Theme</string>
+    <!-- Sound & display settings screen, setting option summary to change the user interface theme [CHAR LIMIT=100] -->
+    <string name="night_mode_summary">%s</string>
+    <!-- Sound & display settings screen, theme setting value to prefer a light-colored user interface [CHAR LIMIT=30] -->
+    <string name="night_mode_no">Light</string>
+    <!-- Sound & display settings screen, theme setting value to prefer a dark-colored user interface [CHAR LIMIT=30] -->
+    <string name="night_mode_yes">Dark</string>
+    <!-- Sound & display settings screen, theme setting value to automatically switch between a light- or dark-colored user interface [CHAR LIMIT=30] -->
+    <string name="night_mode_auto">Automatic</string>
     <!-- Sound & display settings screen, setting option name to change screen timeout -->
     <string name="screen_timeout">Sleep</string>
     <!-- Sound & display settings screen, setting option name to change screen timeout [CHAR LIMIT=30] -->
@@ -5484,7 +5494,8 @@
     <string name="keywords_display">screen touchscreen</string>
     <string name="keywords_display_brightness_level">dim screen touchscreen battery</string>
     <string name="keywords_display_auto_brightness">dim screen touchscreen battery</string>
-    <string name="keywords_display_wallpaper">background personalize customize diplay</string>
+    <string name="keywords_display_night_mode">dark theme night mode dim screen invert brightness</string>
+    <string name="keywords_display_wallpaper">background personalize customize display</string>
     <string name="keywords_display_font_size">text size</string>
     <string name="keywords_display_cast_screen">project</string>
     <string name="keywords_storage">space disk hard drive device usage</string>
diff --git a/res/values/styles.xml b/res/values/styles.xml
index 83d02d6..82f447f 100644
--- a/res/values/styles.xml
+++ b/res/values/styles.xml
@@ -351,8 +351,4 @@
 
     <style name="TextAppearance.ResultTitle" parent="TextAppearance.CategoryTitle">
     </style>
-
-    <style name="Widget.TimePicker" parent="@*android:style/Widget.Material.Light.TimePicker">
-        <item name="@android:numbersBackgroundColor">@android:color/white</item>
-    </style>
 </resources>
diff --git a/res/values/themes.xml b/res/values/themes.xml
index 4fa0c9f..b569004 100644
--- a/res/values/themes.xml
+++ b/res/values/themes.xml
@@ -137,9 +137,6 @@
         <item name="@*android:regularColor">@color/lock_pattern_view_regular_color</item>
         <item name="@*android:successColor">@color/lock_pattern_view_success_color</item>
         <item name="@*android:errorColor">@color/lock_pattern_view_error_color</item>
-
-        <!-- For the TimePicker -->
-        <item name="@android:timePickerStyle">@style/Widget.TimePicker</item>
     </style>
 
     <style name="Theme.SubSettings" parent="Theme.Settings">
@@ -149,7 +146,7 @@
         <item name="switchBarTheme">@style/Theme.SwitchBar.SubSettings</item>
     </style>
 
-    <style name="Theme.ActionBar" parent="@android:style/Widget.Material.Light.ActionBar.Solid">
+    <style name="Theme.ActionBar" parent="@android:style/Widget.Material.ActionBar.Solid">
         <item name="android:contentInsetStart">@dimen/actionbar_contentInsetStart</item>
     </style>
 
@@ -157,27 +154,17 @@
         <item name="android:contentInsetStart">@dimen/actionbar_subsettings_contentInsetStart</item>
     </style>
 
-    <style name="Theme.SwitchBar.Settings" parent="@android:style/Theme.Material">
+    <style name="Theme.SwitchBar.Settings" parent="@android:style/Theme.Material.Settings">
         <item name="switchBarMarginStart">@dimen/switchbar_margin_start</item>
         <item name="switchBarMarginEnd">@dimen/switchbar_margin_end</item>
     </style>
 
-    <style name="Theme.SwitchBar.SubSettings" parent="@android:style/Theme.Material">
+    <style name="Theme.SwitchBar.SubSettings" parent="@android:style/Theme.Material.Settings">
         <item name="switchBarMarginStart">@dimen/switchbar_subsettings_margin_start</item>
         <item name="switchBarMarginEnd">@dimen/switchbar_subsettings_margin_end</item>
     </style>
 
-    <style name="Theme.DialogWhenLarge" parent="@android:style/Theme.Material.Light.DialogWhenLarge">
-        <!-- Explicitly override the background color. -->
-        <item name="android:colorBackground">@android:color/white</item>
-
-        <!-- Used by the ActionBar -->
-        <item name="android:colorPrimary">@color/theme_primary</item>
-        <!-- Used by the StatusBar -->
-        <item name="android:colorPrimaryDark">@color/theme_primary_dark</item>
-        <!-- Used by controls, e.g. CheckBox, ProgressBar, etc. -->
-        <item name="android:colorAccent">@color/theme_accent</item>
-
+    <style name="Theme.DialogWhenLarge" parent="@android:style/Theme.Material.DayNight.DialogWhenLarge">
         <!-- Redefine the ActionBar style for contentInsetStart -->
         <item name="android:actionBarStyle">@style/Theme.ActionBar</item>
 
@@ -203,19 +190,9 @@
         <item name="preferenceBackgroundColor">@drawable/preference_background</item>
     </style>
 
-    <style name="Theme.AlertDialog" parent="@*android:style/Theme.Material.Light.Dialog.Alert">
+    <style name="Theme.AlertDialog" parent="@*android:style/Theme.Material.DayNight.Dialog.Alert">
         <item name="android:windowSoftInputMode">adjustResize</item>
 
-        <!-- Explicitly override the background color. -->
-        <item name="android:colorBackground">@android:color/white</item>
-
-        <!-- Used by the ActionBar -->
-        <item name="android:colorPrimary">@color/theme_primary</item>
-        <!-- Used by the StatusBar -->
-        <item name="android:colorPrimaryDark">@color/theme_primary_dark</item>
-        <!-- Used by controls, e.g. CheckBox, ProgressBar, etc. -->
-        <item name="android:colorAccent">@color/theme_accent</item>
-
         <!-- Redefine the ActionBar style for contentInsetStart -->
         <item name="android:actionBarStyle">@style/Theme.ActionBar</item>
     </style>
diff --git a/res/xml/display_settings.xml b/res/xml/display_settings.xml
index 6cfad2d..db650f3 100644
--- a/res/xml/display_settings.xml
+++ b/res/xml/display_settings.xml
@@ -33,6 +33,15 @@
                 android:summary="@string/auto_brightness_summary"
                 android:persistent="false" />
 
+        <ListPreference
+            android:key="night_mode"
+            android:title="@string/night_mode_title"
+            settings:keywords="@string/keywords_display_night_mode"
+            android:summary="@string/night_mode_summary"
+            android:persistent="false"
+            android:entries="@array/night_mode_entries"
+            android:entryValues="@array/night_mode_values" />
+
         <PreferenceScreen
                 android:key="wallpaper"
                 android:title="@string/wallpaper_settings_title"
diff --git a/src/com/android/settings/DisplaySettings.java b/src/com/android/settings/DisplaySettings.java
index ddd6728..337ec23 100644
--- a/src/com/android/settings/DisplaySettings.java
+++ b/src/com/android/settings/DisplaySettings.java
@@ -32,6 +32,7 @@
 import android.app.Activity;
 import android.app.ActivityManagerNative;
 import android.app.Dialog;
+import android.app.UiModeManager;
 import android.app.admin.DevicePolicyManager;
 import android.content.ContentResolver;
 import android.content.Context;
@@ -70,6 +71,7 @@
     private static final String KEY_DOZE = "doze";
     private static final String KEY_AUTO_BRIGHTNESS = "auto_brightness";
     private static final String KEY_AUTO_ROTATE = "auto_rotate";
+    private static final String KEY_NIGHT_MODE = "night_mode";
 
     private static final int DLG_GLOBAL_CHANGE_WARNING = 1;
 
@@ -78,6 +80,7 @@
     private final Configuration mCurConfig = new Configuration();
 
     private ListPreference mScreenTimeoutPreference;
+    private ListPreference mNightModePreference;
     private Preference mScreenSaverPreference;
     private SwitchPreference mLiftToWakePreference;
     private SwitchPreference mDozePreference;
@@ -165,6 +168,13 @@
         } else {
             removePreference(KEY_AUTO_ROTATE);
         }
+
+        mNightModePreference = (ListPreference) findPreference(KEY_NIGHT_MODE);
+        final UiModeManager uiManager = (UiModeManager) getSystemService(
+                Context.UI_MODE_SERVICE);
+        final int currentNightMode = uiManager.getNightMode();
+        mNightModePreference.setValue(String.valueOf(currentNightMode));
+        mNightModePreference.setOnPreferenceChangeListener(this);
     }
 
     private static boolean allowAllRotations(Context context) {
@@ -381,6 +391,16 @@
             boolean value = (Boolean) objValue;
             Settings.Secure.putInt(getContentResolver(), DOZE_ENABLED, value ? 1 : 0);
         }
+        if (preference == mNightModePreference) {
+            try {
+                final int value = Integer.parseInt((String) objValue);
+                final UiModeManager uiManager = (UiModeManager) getSystemService(
+                        Context.UI_MODE_SERVICE);
+                uiManager.setNightMode(value);
+            } catch (NumberFormatException e) {
+                Log.e(TAG, "could not persist night mode setting", e);
+            }
+        }
         return true;
     }
 
diff --git a/src/com/android/settings/sim/SimSettings.java b/src/com/android/settings/sim/SimSettings.java
index eaf932f..3ebc250 100644
--- a/src/com/android/settings/sim/SimSettings.java
+++ b/src/com/android/settings/sim/SimSettings.java
@@ -368,8 +368,14 @@
                 numberView.setText(PhoneNumberUtils.formatNumber(rawNumber));
             }
 
+            final TelephonyManager tm =
+                        (TelephonyManager) getActivity().getSystemService(
+                        Context.TELEPHONY_SERVICE);
+            String simCarrierName = tm.getSimOperatorNameForSubscription(mSubInfoRecord
+                        .getSubscriptionId());
             TextView carrierView = (TextView)dialogLayout.findViewById(R.id.carrier);
-            carrierView.setText(mSubInfoRecord.getCarrierName());
+            carrierView.setText(!TextUtils.isEmpty(simCarrierName) ? simCarrierName :
+                    getContext().getString(com.android.internal.R.string.unknownName));
 
             builder.setTitle(String.format(res.getString(R.string.sim_editor_title),
                     (mSubInfoRecord.getSimSlotIndex() + 1)));
diff --git a/src/com/android/settings/wifi/AccessPointPreference.java b/src/com/android/settings/wifi/AccessPointPreference.java
index 3975434..f68410a 100644
--- a/src/com/android/settings/wifi/AccessPointPreference.java
+++ b/src/com/android/settings/wifi/AccessPointPreference.java
@@ -15,12 +15,16 @@
  */
 package com.android.settings.wifi;
 
+import android.app.AppGlobals;
 import android.content.Context;
+import android.content.pm.ApplicationInfo;
+import android.content.pm.IPackageManager;
 import android.content.pm.PackageManager;
-import android.content.pm.PackageManager.NameNotFoundException;
 import android.graphics.drawable.Drawable;
 import android.graphics.drawable.StateListDrawable;
 import android.net.wifi.WifiConfiguration;
+import android.os.RemoteException;
+import android.os.UserHandle;
 import android.preference.Preference;
 import android.view.View;
 import android.widget.TextView;
@@ -71,13 +75,22 @@
         Drawable drawable = pm.getDefaultActivityIcon();
         if (mConfig == null) {
             drawable.setAlpha(0);
-        } else if (mConfig.creatorName.equals(systemName)) {
-            drawable = getContext().getApplicationInfo().loadIcon(pm);
         } else {
-            try {
-                drawable = pm.getApplicationIcon(mConfig.creatorName);
-            } catch (NameNotFoundException nnfe) {
-                // use default app icon
+            int userId = UserHandle.getUserId(mConfig.creatorUid);
+            ApplicationInfo appInfo = null;
+            if (mConfig.creatorName.equals(systemName)) {
+                appInfo = getContext().getApplicationInfo();
+            } else {
+                try {
+                    IPackageManager ipm = AppGlobals.getPackageManager();
+                    appInfo = ipm.getApplicationInfo(mConfig.creatorName, 0 /* flags */, userId);
+                } catch (RemoteException rex) {
+                    // use default app icon
+                }
+            }
+            if (appInfo != null) {
+                drawable = appInfo.loadIcon(pm);
+                drawable = pm.getUserBadgedIcon(drawable, new UserHandle(userId));
             }
         }