Loading packages/SettingsLib/src/com/android/settingslib/display/DisplayDensityUtils.java +131 −117 Original line number Diff line number Diff line Loading @@ -30,11 +30,12 @@ import android.view.DisplayInfo; import android.view.IWindowManager; import android.view.WindowManagerGlobal; import androidx.annotation.NonNull; import androidx.annotation.Nullable; import com.android.settingslib.R; import java.util.Arrays; import java.util.HashMap; import java.util.Map; import java.util.function.Predicate; /** Loading Loading @@ -82,38 +83,55 @@ public class DisplayDensityUtils { private final DisplayManager mDisplayManager; /** * The text description of the density values of the default display. */ private String[] mDefaultDisplayDensityEntries; /** * The density values of the default display. * The text description of the density values. */ private int[] mDefaultDisplayDensityValues; @Nullable private final String[] mEntries; /** * The density values, indexed by display unique ID. * The density values. */ private final Map<String, int[]> mValuesPerDisplay = new HashMap(); @Nullable private final int[] mValues; private int mDefaultDensityForDefaultDisplay; private int mCurrentIndex = -1; private final int mDefaultDensity; private final int mCurrentIndex; public DisplayDensityUtils(Context context) { public DisplayDensityUtils(@NonNull Context context) { this(context, INTERNAL_ONLY); } /** * Creates an instance that stores the density values for the displays that satisfy * the predicate. * Creates an instance that stores the density values for the smallest display that satisfies * the predicate. It is enough to store the values for one display because the same density * should be set to all the displays that satisfy the predicate. * @param context The context * @param predicate Determines what displays the density should be set for. The default display * must satisfy this predicate. */ public DisplayDensityUtils(Context context, Predicate predicate) { public DisplayDensityUtils(@NonNull Context context, @NonNull Predicate<DisplayInfo> predicate) { mPredicate = predicate; mDisplayManager = context.getSystemService(DisplayManager.class); Display defaultDisplay = mDisplayManager.getDisplay(Display.DEFAULT_DISPLAY); DisplayInfo defaultDisplayInfo = new DisplayInfo(); if (!defaultDisplay.getDisplayInfo(defaultDisplayInfo)) { Log.w(LOG_TAG, "Cannot fetch display info for the default display"); mEntries = null; mValues = null; mDefaultDensity = 0; mCurrentIndex = -1; return; } if (!mPredicate.test(defaultDisplayInfo)) { throw new IllegalArgumentException( "Predicate must not filter out the default display."); } int idOfSmallestDisplay = Display.DEFAULT_DISPLAY; int minDimensionPx = Math.min(defaultDisplayInfo.logicalWidth, defaultDisplayInfo.logicalHeight); for (Display display : mDisplayManager.getDisplays( DisplayManager.DISPLAY_CATEGORY_ALL_INCLUDING_DISABLED)) { DisplayInfo info = new DisplayInfo(); Loading @@ -122,28 +140,32 @@ public class DisplayDensityUtils { continue; } if (!mPredicate.test(info)) { if (display.getDisplayId() == Display.DEFAULT_DISPLAY) { throw new IllegalArgumentException("Predicate must not filter out the default " + "display."); } continue; } int minDimension = Math.min(info.logicalWidth, info.logicalHeight); if (minDimension < minDimensionPx) { minDimensionPx = minDimension; idOfSmallestDisplay = display.getDisplayId(); } } final int defaultDensity = DisplayDensityUtils.getDefaultDensityForDisplay( display.getDisplayId()); final int defaultDensity = DisplayDensityUtils.getDefaultDensityForDisplay(idOfSmallestDisplay); if (defaultDensity <= 0) { Log.w(LOG_TAG, "Cannot fetch default density for display " + display.getDisplayId()); continue; Log.w(LOG_TAG, "Cannot fetch default density for display " + idOfSmallestDisplay); mEntries = null; mValues = null; mDefaultDensity = 0; mCurrentIndex = -1; return; } final Resources res = context.getResources(); final int currentDensity = info.logicalDensityDpi; final int currentDensity = defaultDisplayInfo.logicalDensityDpi; int currentDensityIndex = -1; // Compute number of "larger" and "smaller" scales for this display. final int minDimensionPx = Math.min(info.logicalWidth, info.logicalHeight); final int maxDensity = DisplayMetrics.DENSITY_MEDIUM * minDimensionPx / MIN_DIMENSION_DP; final float maxScaleDimen = context.getResources().getFraction( Loading Loading @@ -213,30 +235,28 @@ public class DisplayDensityUtils { displayIndex = curIndex; } if (display.getDisplayId() == Display.DEFAULT_DISPLAY) { mDefaultDensityForDefaultDisplay = defaultDensity; mDefaultDensity = defaultDensity; mCurrentIndex = displayIndex; mDefaultDisplayDensityEntries = entries; mDefaultDisplayDensityValues = values; } mValuesPerDisplay.put(info.uniqueId, values); } mEntries = entries; mValues = values; } public String[] getDefaultDisplayDensityEntries() { return mDefaultDisplayDensityEntries; @Nullable public String[] getEntries() { return mEntries; } public int[] getDefaultDisplayDensityValues() { return mDefaultDisplayDensityValues; @Nullable public int[] getValues() { return mValues; } public int getCurrentIndexForDefaultDisplay() { public int getCurrentIndex() { return mCurrentIndex; } public int getDefaultDensityForDefaultDisplay() { return mDefaultDensityForDefaultDisplay; public int getDefaultDensity() { return mDefaultDensity; } /** Loading Loading @@ -311,15 +331,9 @@ public class DisplayDensityUtils { if (!mPredicate.test(info)) { continue; } if (!mValuesPerDisplay.containsKey(info.uniqueId)) { Log.w(LOG_TAG, "Unable to save forced display density setting " + "for display " + info.uniqueId); continue; } final IWindowManager wm = WindowManagerGlobal.getWindowManagerService(); wm.setForcedDisplayDensityForUser(displayId, mValuesPerDisplay.get(info.uniqueId)[index], userId); wm.setForcedDisplayDensityForUser(displayId, mValues[index], userId); } } catch (RemoteException exc) { Log.w(LOG_TAG, "Unable to save forced display density setting"); Loading Loading
packages/SettingsLib/src/com/android/settingslib/display/DisplayDensityUtils.java +131 −117 Original line number Diff line number Diff line Loading @@ -30,11 +30,12 @@ import android.view.DisplayInfo; import android.view.IWindowManager; import android.view.WindowManagerGlobal; import androidx.annotation.NonNull; import androidx.annotation.Nullable; import com.android.settingslib.R; import java.util.Arrays; import java.util.HashMap; import java.util.Map; import java.util.function.Predicate; /** Loading Loading @@ -82,38 +83,55 @@ public class DisplayDensityUtils { private final DisplayManager mDisplayManager; /** * The text description of the density values of the default display. */ private String[] mDefaultDisplayDensityEntries; /** * The density values of the default display. * The text description of the density values. */ private int[] mDefaultDisplayDensityValues; @Nullable private final String[] mEntries; /** * The density values, indexed by display unique ID. * The density values. */ private final Map<String, int[]> mValuesPerDisplay = new HashMap(); @Nullable private final int[] mValues; private int mDefaultDensityForDefaultDisplay; private int mCurrentIndex = -1; private final int mDefaultDensity; private final int mCurrentIndex; public DisplayDensityUtils(Context context) { public DisplayDensityUtils(@NonNull Context context) { this(context, INTERNAL_ONLY); } /** * Creates an instance that stores the density values for the displays that satisfy * the predicate. * Creates an instance that stores the density values for the smallest display that satisfies * the predicate. It is enough to store the values for one display because the same density * should be set to all the displays that satisfy the predicate. * @param context The context * @param predicate Determines what displays the density should be set for. The default display * must satisfy this predicate. */ public DisplayDensityUtils(Context context, Predicate predicate) { public DisplayDensityUtils(@NonNull Context context, @NonNull Predicate<DisplayInfo> predicate) { mPredicate = predicate; mDisplayManager = context.getSystemService(DisplayManager.class); Display defaultDisplay = mDisplayManager.getDisplay(Display.DEFAULT_DISPLAY); DisplayInfo defaultDisplayInfo = new DisplayInfo(); if (!defaultDisplay.getDisplayInfo(defaultDisplayInfo)) { Log.w(LOG_TAG, "Cannot fetch display info for the default display"); mEntries = null; mValues = null; mDefaultDensity = 0; mCurrentIndex = -1; return; } if (!mPredicate.test(defaultDisplayInfo)) { throw new IllegalArgumentException( "Predicate must not filter out the default display."); } int idOfSmallestDisplay = Display.DEFAULT_DISPLAY; int minDimensionPx = Math.min(defaultDisplayInfo.logicalWidth, defaultDisplayInfo.logicalHeight); for (Display display : mDisplayManager.getDisplays( DisplayManager.DISPLAY_CATEGORY_ALL_INCLUDING_DISABLED)) { DisplayInfo info = new DisplayInfo(); Loading @@ -122,28 +140,32 @@ public class DisplayDensityUtils { continue; } if (!mPredicate.test(info)) { if (display.getDisplayId() == Display.DEFAULT_DISPLAY) { throw new IllegalArgumentException("Predicate must not filter out the default " + "display."); } continue; } int minDimension = Math.min(info.logicalWidth, info.logicalHeight); if (minDimension < minDimensionPx) { minDimensionPx = minDimension; idOfSmallestDisplay = display.getDisplayId(); } } final int defaultDensity = DisplayDensityUtils.getDefaultDensityForDisplay( display.getDisplayId()); final int defaultDensity = DisplayDensityUtils.getDefaultDensityForDisplay(idOfSmallestDisplay); if (defaultDensity <= 0) { Log.w(LOG_TAG, "Cannot fetch default density for display " + display.getDisplayId()); continue; Log.w(LOG_TAG, "Cannot fetch default density for display " + idOfSmallestDisplay); mEntries = null; mValues = null; mDefaultDensity = 0; mCurrentIndex = -1; return; } final Resources res = context.getResources(); final int currentDensity = info.logicalDensityDpi; final int currentDensity = defaultDisplayInfo.logicalDensityDpi; int currentDensityIndex = -1; // Compute number of "larger" and "smaller" scales for this display. final int minDimensionPx = Math.min(info.logicalWidth, info.logicalHeight); final int maxDensity = DisplayMetrics.DENSITY_MEDIUM * minDimensionPx / MIN_DIMENSION_DP; final float maxScaleDimen = context.getResources().getFraction( Loading Loading @@ -213,30 +235,28 @@ public class DisplayDensityUtils { displayIndex = curIndex; } if (display.getDisplayId() == Display.DEFAULT_DISPLAY) { mDefaultDensityForDefaultDisplay = defaultDensity; mDefaultDensity = defaultDensity; mCurrentIndex = displayIndex; mDefaultDisplayDensityEntries = entries; mDefaultDisplayDensityValues = values; } mValuesPerDisplay.put(info.uniqueId, values); } mEntries = entries; mValues = values; } public String[] getDefaultDisplayDensityEntries() { return mDefaultDisplayDensityEntries; @Nullable public String[] getEntries() { return mEntries; } public int[] getDefaultDisplayDensityValues() { return mDefaultDisplayDensityValues; @Nullable public int[] getValues() { return mValues; } public int getCurrentIndexForDefaultDisplay() { public int getCurrentIndex() { return mCurrentIndex; } public int getDefaultDensityForDefaultDisplay() { return mDefaultDensityForDefaultDisplay; public int getDefaultDensity() { return mDefaultDensity; } /** Loading Loading @@ -311,15 +331,9 @@ public class DisplayDensityUtils { if (!mPredicate.test(info)) { continue; } if (!mValuesPerDisplay.containsKey(info.uniqueId)) { Log.w(LOG_TAG, "Unable to save forced display density setting " + "for display " + info.uniqueId); continue; } final IWindowManager wm = WindowManagerGlobal.getWindowManagerService(); wm.setForcedDisplayDensityForUser(displayId, mValuesPerDisplay.get(info.uniqueId)[index], userId); wm.setForcedDisplayDensityForUser(displayId, mValues[index], userId); } } catch (RemoteException exc) { Log.w(LOG_TAG, "Unable to save forced display density setting"); Loading