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