LCD Density: Input DPI value instead choosing it from the list

Change-Id: I5ede555265222520b5935098907dc1dac38a07fc

Conflicts:
	res/values/slim_strings.xml
	src/com/android/settings/DisplaySettings.java
diff --git a/res/values/custom_strings.xml b/res/values/custom_strings.xml
index c05687e..513faa8 100644
--- a/res/values/custom_strings.xml
+++ b/res/values/custom_strings.xml
@@ -523,8 +523,10 @@
     <string name="lcd_density">LCD density</string>
     <string name="lcd_density_unsupported">Unsupported</string>
     <string name="restarting_ui">Restarting</string>
-    <string name="lcd_density_value_format">%d DPI</string>
-    <string name="lcd_density_default_value_format">%d DPI (default)</string>
+    <string name="lcd_density_value_format">%1$d DPI (default: %2$d DPI)</string>
+    <string name="lcd_density_default_value_format">%1$d DPI (default)</string>
+    <string name="lcd_density_error_msg">The value must be between %1$d and %2$d DPI</string>
+    <string name="lcd_density_dialog_title">Enter value between %1$d and %2$d DPI</string>
 
     <!-- Recents panel -->
     <string name="recents_options_title">Recents Mods</string>
diff --git a/res/xml/display_settings.xml b/res/xml/display_settings.xml
index f2b6074..b4c19f7 100644
--- a/res/xml/display_settings.xml
+++ b/res/xml/display_settings.xml
@@ -84,9 +84,10 @@
                 settings:keywords="@string/keywords_display_cast_screen"
                 android:fragment="com.android.settings.wfd.WifiDisplaySettings" />
 
-        <ListPreference
+        <EditTextPreference
                 android:key="lcd_density"
                 android:title="@string/lcd_density"
+                android:inputType="number"
                 android:persistent="false" />
 
         <PreferenceCategory
diff --git a/src/com/android/settings/DisplaySettings.java b/src/com/android/settings/DisplaySettings.java
index 19296d4..b05f12c 100644
--- a/src/com/android/settings/DisplaySettings.java
+++ b/src/com/android/settings/DisplaySettings.java
@@ -61,6 +61,7 @@
 import android.os.RemoteException;
 import android.os.ServiceManager;
 import android.os.SystemProperties;
+import android.preference.EditTextPreference;
 import android.preference.ListPreference;
 import android.preference.Preference;
 import android.preference.PreferenceManager;
@@ -76,6 +77,7 @@
 import android.util.Log;
 import android.view.IWindowManager;
 import android.view.WindowManagerGlobal;
+import android.widget.Toast;
 
 import com.android.settings.broken.DisplayRotation;
 
@@ -126,7 +128,7 @@
     private final Configuration mCurConfig = new Configuration();
 
     private ListPreference mScreenTimeoutPreference;
-    private ListPreference mLcdDensityPreference;
+    private EditTextPreference mLcdDensityPreference;
     private Preference mScreenSaverPreference;
     private SwitchPreference mLiftToWakePreference;
     private SwitchPreference mAutoBrightnessPreference;
@@ -171,8 +173,7 @@
         disableUnusableTimeouts(mScreenTimeoutPreference);
         updateTimeoutPreferenceDescription(currentTimeout);
 
-        mLcdDensityPreference = (ListPreference) findPreference(KEY_LCD_DENSITY);
-        mLcdDensityPreference = (ListPreference) findPreference(KEY_LCD_DENSITY);
+        mLcdDensityPreference = (EditTextPreference) findPreference(KEY_LCD_DENSITY);
         if (mLcdDensityPreference != null) {
             int defaultDensity = getDefaultDensity();
             int currentDensity = getCurrentDensity();
@@ -181,28 +182,12 @@
                 currentDensity = defaultDensity;
             }
 
-            int factor = defaultDensity >= 480 ? 40 : 20;
-            int minimumDensity = defaultDensity - 4 * factor;
-            int currentIndex = -1;
-            String[] densityEntries = new String[7];
-            String[] densityValues = new String[7];
-            for (int idx = 0; idx < 7; ++idx) {
-                int val = minimumDensity + factor * idx;
-                int valueFormatResId = val == defaultDensity
-                        ? R.string.lcd_density_default_value_format
-                        : R.string.lcd_density_value_format;
+            int minimumDensity = getMinimumDensity();
+            int maximumDensity = getMaxmimumDensity();
+            String title = getString(R.string.lcd_density_dialog_title);
+            mLcdDensityPreference.setDialogTitle(String.format(title,
+                    minimumDensity, maximumDensity));
 
-                densityEntries[idx] = getString(valueFormatResId, val);
-                densityValues[idx] = Integer.toString(val);
-                if (currentDensity == val) {
-                    currentIndex = idx;
-                }
-            }
-            mLcdDensityPreference.setEntries(densityEntries);
-            mLcdDensityPreference.setEntryValues(densityValues);
-            if (currentIndex != -1) {
-                mLcdDensityPreference.setValueIndex(currentIndex);
-            }
             mLcdDensityPreference.setOnPreferenceChangeListener(this);
             updateLcdDensityPreferenceDescription(currentDensity);
         }
@@ -346,9 +331,15 @@
     }
 
     private void updateLcdDensityPreferenceDescription(int currentDensity) {
-        final int summaryResId = currentDensity == getDefaultDensity()
-                ? R.string.lcd_density_default_value_format : R.string.lcd_density_value_format;
-        mLcdDensityPreference.setSummary(getString(summaryResId, currentDensity));
+        String formattedSummary;
+        if (currentDensity == getDefaultDensity()) {
+           final String summary = getString(R.string.lcd_density_default_value_format);
+           formattedSummary = String.format(summary, currentDensity);
+        } else {
+           final String summary = getString(R.string.lcd_density_value_format);
+           formattedSummary = String.format(summary, currentDensity, getDefaultDensity());
+        }
+        mLcdDensityPreference.setSummary(formattedSummary);
     }
 
     private void updateDisplayRotationPreferenceDescription() {
@@ -612,18 +603,20 @@
         }
         if (KEY_LCD_DENSITY.equals(key)) {
             try {
-                // The value must begin with a decimal number.  It may
-                // optionally be follewed by a space and arbitrary text.
-                String strValue = (String) objValue;
-                int idx = strValue.indexOf(' ');
-                if (idx > 0) {
-                    strValue = strValue.substring(0, idx);
+                int value = Integer.parseInt((String) objValue);
+
+                int minimumDensity = getMinimumDensity();
+                int maximumDensity = getMaxmimumDensity();
+                if (value < minimumDensity || value > maximumDensity) {
+                    final String errorMsg = getString(R.string.lcd_density_error_msg);
+                    Toast.makeText(preference.getContext(), String.format(errorMsg,
+                            minimumDensity, maximumDensity),
+                        Toast.LENGTH_LONG).show();
+                } else {
+                    writeLcdDensityPreference(preference.getContext(), value);
+                    updateLcdDensityPreferenceDescription(value);
                 }
-                int value = Integer.parseInt(strValue);
-                writeLcdDensityPreference(preference.getContext(), value);
-                updateLcdDensityPreferenceDescription(value);
-            }
-            catch (NumberFormatException e) {
+            } catch (NumberFormatException e) {
                 Log.e(TAG, "could not persist display density setting", e);
             }
         }
@@ -665,7 +658,6 @@
         return false;
     }
 
-
     /**
      * Restore the properties associated with this preference on boot
      *
@@ -687,6 +679,18 @@
         }
     }
 
+    private int getMinimumDensity() {
+        int defaultDensity = getDefaultDensity();
+        int factor = defaultDensity >= 480 ? 40 : 20;
+        return defaultDensity - 4 * factor;
+    }
+
+    private int getMaxmimumDensity() {
+        int defaultDensity = getDefaultDensity();
+        int factor = defaultDensity >= 480 ? 40 : 20;
+        return defaultDensity + 4 * factor;
+    }
+
     public static final Indexable.SearchIndexProvider SEARCH_INDEX_DATA_PROVIDER =
             new BaseSearchIndexProvider() {
                 @Override