[1/2] OmniGears: move theme switch into styles

Change-Id: Ic8061b45bcb40111874ffec8b7922831524b6509
diff --git a/res/values/custom_arrays.xml b/res/values/custom_arrays.xml
index 8854837..c76ea80 100644
--- a/res/values/custom_arrays.xml
+++ b/res/values/custom_arrays.xml
@@ -304,4 +304,22 @@
         <item>@string/daylight_header_provider</item>
         <item>@string/static_header_provider</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>
+    </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>
+    </string-array>
 </resources>
diff --git a/res/values/custom_strings.xml b/res/values/custom_strings.xml
index b3e8742..7dfb371 100644
--- a/res/values/custom_strings.xml
+++ b/res/values/custom_strings.xml
@@ -423,4 +423,9 @@
 
     <string name="lockscreen_hide_media_title">Disable media wallpaper</string>
     <string name="lockscreen_hide_media_summary">Do not show media metadata as lock screen wallpaper</string>
+
+    <string name="night_mode_title">Theme</string>
+    <string name="night_mode_summary">%s</string>
+    <string name="night_mode_no">Light</string>
+    <string name="night_mode_yes">Dark</string>
 </resources>
diff --git a/res/xml/style_settings.xml b/res/xml/style_settings.xml
index 5dde8ae..f1eab00 100644
--- a/res/xml/style_settings.xml
+++ b/res/xml/style_settings.xml
@@ -17,6 +17,14 @@
 <PreferenceScreen xmlns:android="http://schemas.android.com/apk/res/android"
         xmlns:settings="http://schemas.android.com/apk/res/com.android.settings">
 
+        <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:entries="@array/night_mode_entries"
+            android:entryValues="@array/night_mode_values" />
+
         <PreferenceCategory
             android:key="category_statusbar"
             android:title="@string/statusbar_title">
diff --git a/src/org/omnirom/omnigears/interfacesettings/StyleSettings.java b/src/org/omnirom/omnigears/interfacesettings/StyleSettings.java
index 6fa7b91..565d643 100644
--- a/src/org/omnirom/omnigears/interfacesettings/StyleSettings.java
+++ b/src/org/omnirom/omnigears/interfacesettings/StyleSettings.java
@@ -19,6 +19,7 @@
 
 import android.app.Activity;
 import android.app.AlertDialog;
+import android.app.UiModeManager;
 import android.content.ContentResolver;
 import android.content.Context;
 import android.content.DialogInterface;
@@ -69,12 +70,14 @@
     private static final String CUSTOM_HEADER_PROVIDER = "custom_header_provider";
     private static final String CUSTOM_HEADER_BROWSE = "custom_header_browse";
     private static final String STATUS_BAR_CUSTOM_HEADER = "status_bar_custom_header";
+    private static final String KEY_NIGHT_MODE = "night_mode";
 
     private ListPreference mDaylightHeaderPack;
     private SeekBarPreference mHeaderShadow;
     private ListPreference mHeaderProvider;
     private String mDaylightHeaderProvider;
     private PreferenceScreen mHeaderBrowse;
+    private ListPreference mNightModePreference;
 
     @Override
     protected int getMetricsCategory() {
@@ -134,6 +137,15 @@
 
         mHeaderBrowse = (PreferenceScreen) findPreference(CUSTOM_HEADER_BROWSE);
         mHeaderBrowse.setEnabled(isBrowseHeaderAvailable());
+
+        mNightModePreference = (ListPreference) findPreference(KEY_NIGHT_MODE);
+        if (mNightModePreference != null) {
+            final UiModeManager uiManager = (UiModeManager) getSystemService(
+                    Context.UI_MODE_SERVICE);
+            final int currentNightMode = uiManager.getNightMode();
+            mNightModePreference.setValue(String.valueOf(currentNightMode));
+            mNightModePreference.setOnPreferenceChangeListener(this);
+        }
     }
 
     @Override
@@ -156,6 +168,15 @@
             int valueIndex = mHeaderProvider.findIndexOfValue(value);
             mHeaderProvider.setSummary(mHeaderProvider.getEntries()[valueIndex]);
             mDaylightHeaderPack.setEnabled(value.equals(mDaylightHeaderProvider));
+        } else if (preference == mNightModePreference) {
+            try {
+                final int value = Integer.parseInt((String) newValue);
+                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;
     }