[2/2] OmniGears: configure doze brightness value

Change-Id: Ic1afab3af2611e4bd08869ed92934a039e83b8ad
diff --git a/res/values/custom_strings.xml b/res/values/custom_strings.xml
index 88282d3..317ae84 100644
--- a/res/values/custom_strings.xml
+++ b/res/values/custom_strings.xml
@@ -176,4 +176,6 @@
     <string name="omniswitch_dialog_running">OmniSwitch is not running. Please make sure to enable it before enabling it as recents.</string>
     <string name="omniswitch_dialog_unavail">OmniSwitch is not installed.</string>
     <string name="omniswitch_title">OmniSwitch</string>
+
+    <string name="doze_brightness_level_title">Brightness level</string>
 </resources>
diff --git a/res/xml/ambient_settings.xml b/res/xml/ambient_settings.xml
index 2a8c4c9..7c61091 100644
--- a/res/xml/ambient_settings.xml
+++ b/res/xml/ambient_settings.xml
@@ -54,6 +54,12 @@
                     android:defaultValue="true"
                     android:dependency="doze_overwrite_value" />
 
+            <Preference
+                    android:key="doze_brightness_level"
+                    android:title="@string/doze_brightness_level_title"
+                    android:persistent="false"
+                    android:dependency="doze_overwrite_value" />
+
             <PreferenceCategory
                     android:key="doze_pulse_category"
                     android:title="@string/doze_pulse_title" >
diff --git a/src/org/omnirom/omnigears/AmbientSettings.java b/src/org/omnirom/omnigears/AmbientSettings.java
index f433fdd..d004a07 100644
--- a/src/org/omnirom/omnigears/AmbientSettings.java
+++ b/src/org/omnirom/omnigears/AmbientSettings.java
@@ -28,6 +28,7 @@
 import android.database.ContentObserver;
 import android.os.Build;
 import android.os.Bundle;
+import android.os.PowerManager;
 import android.os.SystemProperties;
 import android.preference.ListPreference;
 import android.preference.Preference;
@@ -37,8 +38,14 @@
 import android.preference.SwitchPreference;
 import android.provider.SearchIndexableResource;
 import android.provider.Settings;
+import android.text.Editable;
 import android.text.TextUtils;
+import android.text.TextWatcher;
+import android.util.Log;
+import android.view.View;
 import android.widget.Button;
+import android.widget.EditText;
+import android.widget.SeekBar;
 
 import com.android.settings.SettingsPreferenceFragment;
 import com.android.settings.preference.SystemCheckBoxPreference;
@@ -48,7 +55,7 @@
 import java.util.List;
 
 public class AmbientSettings extends SettingsPreferenceFragment implements
-        Preference.OnPreferenceChangeListener, OnPreferenceClickListener,
+        Preference.OnPreferenceChangeListener,
         Indexable, ShakeSensorManager.ShakeListener {
     private static final String TAG = "AmbientSettings";
 
@@ -62,6 +69,7 @@
     private static final String KEY_DOZE_SHAKE_CATEGORY = "doze_shake_category";
     private static final String KEY_DOZE_SHAKE_THRESHOLD = "doze_shake_threshold";
     private static final String KEY_DOZE_TIME_MODE = "doze_time_mode";
+    private static final String KEY_DOZE_BRIGHTNESS_LEVEL = "doze_brightness_level";
 
     private int mAccValue;
     private int mOldAccValue;
@@ -75,6 +83,8 @@
     private ShakeSensorManager mShakeSensorManager;
     private AlertDialog mDialog;
     private Button mShakeFoundButton;
+    private DozeBrightnessDialog mDozeBrightnessDialog;
+    private Preference mDozeBrightness;
 
     @Override
     public void onCreate(Bundle savedInstanceState) {
@@ -114,6 +124,8 @@
         updateDozeListMode();
         updateDozeOptions();
         mShakeSensorManager = new ShakeSensorManager(activity, this);
+
+        mDozeBrightness = (Preference) findPreference(KEY_DOZE_BRIGHTNESS_LEVEL);
     }
 
     private static boolean isAccelerometerAvailable(Context context) {
@@ -388,6 +400,10 @@
     public boolean onPreferenceTreeClick(PreferenceScreen preferenceScreen, Preference preference) {
         if (preference == findPreference(KEY_DOZE_OVERWRITE_VALUE)) {
             updateDozeListMode();
+            return true;
+        } else if (preference == mDozeBrightness) {
+            showDozeBrightnessDialog();
+            return true;
         }
         return super.onPreferenceTreeClick(preferenceScreen, preference);
     }
@@ -437,9 +453,116 @@
         return true;
     }
 
-    @Override
-    public boolean onPreferenceClick(Preference preference) {
-        return false;
+    private void showDozeBrightnessDialog() {
+        if (mDozeBrightnessDialog != null && mDozeBrightnessDialog.isShowing()) {
+            return;
+        }
+
+        mDozeBrightnessDialog = new DozeBrightnessDialog(getActivity());
+        mDozeBrightnessDialog.show();
+    }
+
+    private class DozeBrightnessDialog extends AlertDialog implements DialogInterface.OnClickListener {
+
+        private SeekBar mBacklightBar;
+        private EditText mBacklightInput;
+        private int mCurrentBrightness;
+        private int mMaxBrightness;
+
+        public DozeBrightnessDialog(Context context) {
+            super(context);
+        }
+
+        @Override
+        protected void onCreate(Bundle savedInstanceState) {
+            final View v = getLayoutInflater().inflate(R.layout.dialog_manual_brightness, null);
+            final Context context = getContext();
+
+            mBacklightBar = (SeekBar) v.findViewById(R.id.backlight);
+            mBacklightInput = (EditText) v.findViewById(R.id.backlight_input);
+
+            setTitle(R.string.dialog_manual_brightness_title);
+            setCancelable(true);
+            setView(v);
+
+            final int dozeBrightnessConfig = getResources().getInteger(
+                    com.android.internal.R.integer.config_screenBrightnessDoze);
+            mCurrentBrightness = Settings.System.getInt(getContentResolver(),
+                    Settings.System.SCREEN_BRIGHTNESS_DOZE, dozeBrightnessConfig);
+
+            final PowerManager pm = (PowerManager)getSystemService(Context.POWER_SERVICE);
+            mMaxBrightness = pm.getMaximumScreenBrightnessSetting();
+            mBacklightBar.setMax(mMaxBrightness);
+            mBacklightBar.setProgress(mCurrentBrightness);
+            mBacklightInput.setText(String.valueOf(mCurrentBrightness));
+
+            initListeners();
+
+            setButton(DialogInterface.BUTTON_POSITIVE, getResources().getString(R.string.ok), this);
+            setButton(DialogInterface.BUTTON_NEGATIVE, getResources().getString(R.string.cancel), this);
+
+            super.onCreate(savedInstanceState);
+        }
+
+        @Override
+        public void onClick(DialogInterface dialog, int which) {
+            if (which == DialogInterface.BUTTON_POSITIVE) {
+                try {
+                    int newBacklight = Integer.valueOf(mBacklightInput.getText().toString());
+                    Settings.System.putInt(getContext().getContentResolver(),
+                            Settings.System.SCREEN_BRIGHTNESS_DOZE, newBacklight);
+                } catch (NumberFormatException e) {
+                    Log.d(TAG, "NumberFormatException " + e);
+                }
+            }
+        }
+
+        private void initListeners() {
+            mBacklightBar.setOnSeekBarChangeListener(new SeekBar.OnSeekBarChangeListener() {
+                @Override
+                public void onProgressChanged(SeekBar seekBar, int progress, boolean fromUser) {
+                    if (seekBar.getProgress() > 0) {
+                        mBacklightInput.setText(String.valueOf(seekBar.getProgress()));
+                    }
+                }
+                @Override
+                public void onStartTrackingTouch(SeekBar seekBar) {
+                }
+                @Override
+                public void onStopTrackingTouch(SeekBar seekBar) {
+                }
+            });
+
+            mBacklightInput.addTextChangedListener(new TextWatcher() {
+                @Override
+                public void beforeTextChanged(CharSequence s, int start, int count, int after) {
+                }
+                @Override
+                public void onTextChanged(CharSequence s, int start, int before, int count) {
+                }
+                @Override
+                public void afterTextChanged(Editable s) {
+                    boolean ok = false;
+                    try {
+                        int minValue = 1;
+                        int maxValue = mMaxBrightness;
+                        int newBrightness = Integer.valueOf(s.toString());
+
+                        if (newBrightness >= minValue && newBrightness <= maxValue) {
+                            ok = true;
+                            mBacklightBar.setProgress(newBrightness);
+                        }
+                    } catch (NumberFormatException e) {
+                        //ignored, ok is false ayway
+                    }
+
+                    Button okButton = mDozeBrightnessDialog.getButton(DialogInterface.BUTTON_POSITIVE);
+                    if (okButton != null) {
+                        okButton.setEnabled(ok);
+                    }
+                }
+            });
+        }
     }
 
     public static final Indexable.SearchIndexProvider SEARCH_INDEX_DATA_PROVIDER =