From 267f0303a824f827a396dceaeae68acc4ca171c4 Mon Sep 17 00:00:00 2001 From: Roman Birg Date: Thu, 28 May 2015 15:21:37 -0700 Subject: [PATCH] Settings: use WindowManager to set custom DPI Change-Id: I719bf391cc8746466c466b4b5a9a0e2bf9fc0056 Signed-off-by: Roman Birg --- src/com/android/settings/DisplaySettings.java | 51 +++++++++++++++++++++------ 1 file changed, 41 insertions(+), 10 deletions(-) diff --git a/src/com/android/settings/DisplaySettings.java b/src/com/android/settings/DisplaySettings.java index 7d8b5e20ea..48a991b9d9 100644 --- a/src/com/android/settings/DisplaySettings.java +++ b/src/com/android/settings/DisplaySettings.java @@ -20,6 +20,12 @@ import com.android.internal.logging.MetricsLogger; import android.preference.CheckBoxPreference; import android.os.UserHandle; +import android.view.Display; +import android.view.IWindowManager; +import android.view.WindowManager; +import android.view.WindowManagerGlobal; +import android.view.WindowManagerImpl; +import android.widget.Toast; import com.android.internal.view.RotationPolicy; import com.android.settings.DropDownPreference.Callback; import com.android.settings.search.BaseSearchIndexProvider; @@ -169,8 +175,8 @@ public class DisplaySettings extends SettingsPreferenceFragment implements mLcdDensityPreference = (ListPreference) findPreference(KEY_LCD_DENSITY); if (mLcdDensityPreference != null) { - int defaultDensity = DisplayMetrics.DENSITY_DEVICE; - int currentDensity = DisplayMetrics.DENSITY_CURRENT; + int defaultDensity = getDefaultDensity(); + int currentDensity = getCurrentDensity(); if (currentDensity < 10 || currentDensity >= 1000) { // Unsupported value, force default currentDensity = defaultDensity; @@ -275,6 +281,28 @@ public class DisplaySettings extends SettingsPreferenceFragment implements (SwitchPreference) findPreference(KEY_WAKE_WHEN_PLUGGED_OR_UNPLUGGED); } + private int getDefaultDensity() { + IWindowManager wm = IWindowManager.Stub.asInterface(ServiceManager.checkService( + Context.WINDOW_SERVICE)); + try { + return wm.getInitialDisplayDensity(Display.DEFAULT_DISPLAY); + } catch (RemoteException e) { + e.printStackTrace(); + } + return DisplayMetrics.DENSITY_DEVICE; + } + + private int getCurrentDensity() { + IWindowManager wm = IWindowManager.Stub.asInterface(ServiceManager.checkService( + Context.WINDOW_SERVICE)); + try { + return wm.getBaseDisplayDensity(Display.DEFAULT_DISPLAY); + } catch (RemoteException e) { + e.printStackTrace(); + } + return DisplayMetrics.DENSITY_DEVICE; + } + private static boolean allowAllRotations(Context context) { return Resources.getSystem().getBoolean( com.android.internal.R.bool.config_allowAllRotations); @@ -380,7 +408,7 @@ public class DisplaySettings extends SettingsPreferenceFragment implements } private void updateLcdDensityPreferenceDescription(int currentDensity) { - final int summaryResId = currentDensity == DisplayMetrics.DENSITY_DEVICE + final int summaryResId = currentDensity == getDefaultDensity() ? R.string.lcd_density_default_value_format : R.string.lcd_density_value_format; mLcdDensityPreference.setSummary(getString(summaryResId, currentDensity)); } @@ -527,15 +555,11 @@ public class DisplaySettings extends SettingsPreferenceFragment implements } } - private void writeLcdDensityPreference(final Context context, int value) { - try { - SystemProperties.set("persist.sys.lcd_density", Integer.toString(value)); - } catch (RuntimeException e) { - Log.e(TAG, "Unable to save LCD density"); - return; - } + private void writeLcdDensityPreference(final Context context, final int density) { final IActivityManager am = ActivityManagerNative.asInterface( ServiceManager.checkService("activity")); + final IWindowManager wm = IWindowManager.Stub.asInterface(ServiceManager.checkService( + Context.WINDOW_SERVICE)); AsyncTask task = new AsyncTask() { @Override protected void onPreExecute() { @@ -553,6 +577,13 @@ public class DisplaySettings extends SettingsPreferenceFragment implements } catch (InterruptedException e) { // Ignore } + + try { + wm.setForcedDisplayDensity(Display.DEFAULT_DISPLAY, density); + } catch (RemoteException e) { + Log.e(TAG, "Failed to set density to " + density, e); + } + // Restart the UI try { am.restart(); -- 2.11.0