From 1cd2473ca2034761b2e5822b51c28643f054832c Mon Sep 17 00:00:00 2001 From: Fiona Campbell Date: Thu, 10 Sep 2020 16:23:52 +0100 Subject: [PATCH] Add fallback ID checking for DisplayDeviceConfig Some devices already have DisplayDeviceConfig files identified without a stable flag, and new ones will have it with the flag. This CL tries to find a DisplayDeviceConfig with identifiers in the following priority order: * physicalDisplayId (new format includes "stable" flag) display_id_.xml * physicalDisplayId without a stable flag (old system) display_.xml * portId display_port_.xml Add dumpsys & toString() Bug: 166473251 Test: manual & check dumpsys Change-Id: I9b762b040a16a99f51fb6d7538da4ca8afd9a859 --- .../server/display/DisplayDeviceConfig.java | 74 ++++++++++++++++--- .../server/display/LocalDisplayAdapter.java | 9 ++- 2 files changed, 70 insertions(+), 13 deletions(-) diff --git a/services/core/java/com/android/server/display/DisplayDeviceConfig.java b/services/core/java/com/android/server/display/DisplayDeviceConfig.java index 0d824334d8736..23e5a43a359f4 100644 --- a/services/core/java/com/android/server/display/DisplayDeviceConfig.java +++ b/services/core/java/com/android/server/display/DisplayDeviceConfig.java @@ -18,6 +18,7 @@ package com.android.server.display; import android.os.Environment; import android.util.Slog; +import android.view.DisplayAddress; import com.android.server.display.config.DisplayConfiguration; import com.android.server.display.config.NitsMap; @@ -31,6 +32,7 @@ import java.io.File; import java.io.FileInputStream; import java.io.IOException; import java.io.InputStream; +import java.util.Arrays; import java.util.List; import javax.xml.datatype.DatatypeConfigurationException; @@ -45,7 +47,11 @@ public class DisplayDeviceConfig { private static final String ETC_DIR = "etc"; private static final String DISPLAY_CONFIG_DIR = "displayconfig"; - private static final String CONFIG_FILE_FORMAT = "display_%d.xml"; + private static final String CONFIG_FILE_FORMAT = "display_%s.xml"; + private static final String PORT_SUFFIX_FORMAT = "port_%d"; + private static final String STABLE_ID_SUFFIX_FORMAT = "id_%d"; + private static final String NO_SUFFIX_FORMAT = "%d"; + private static final long STABLE_FLAG = 1L << 62; private float[] mNits; private float[] mBrightness; @@ -55,17 +61,43 @@ public class DisplayDeviceConfig { /** * Creates an instance for the specified display. - * + * Tries to find a file with identifier in the following priority order: + *
    + *
  1. physicalDisplayId
  2. + *
  3. physicalDisplayId without a stable flag (old system)
  4. + *
  5. portId
  6. + *
* @param physicalDisplayId The display ID for which to load the configuration. * @return A configuration instance for the specified display. */ public static DisplayDeviceConfig create(long physicalDisplayId) { - final DisplayDeviceConfig config = new DisplayDeviceConfig(); - final String filename = String.format(CONFIG_FILE_FORMAT, physicalDisplayId); + DisplayDeviceConfig config; + + // Create config using filename from physical ID (including "stable" bit). + config = getConfigFromSuffix(STABLE_ID_SUFFIX_FORMAT, physicalDisplayId); + if (config != null) { + return config; + } + + // Create config using filename from physical ID (excluding "stable" bit). + final long withoutStableFlag = physicalDisplayId & ~STABLE_FLAG; + config = getConfigFromSuffix(NO_SUFFIX_FORMAT, withoutStableFlag); + if (config != null) { + return config; + } + + // Create config using filename from port ID. + final DisplayAddress.Physical physicalAddress = + DisplayAddress.fromPhysicalDisplayId(physicalDisplayId); + int port = physicalAddress.getPort(); + config = getConfigFromSuffix(PORT_SUFFIX_FORMAT, port); + if (config != null) { + return config; + } + + // None of these files exist. + return null; - config.initFromFile(Environment.buildPath( - Environment.getProductDirectory(), ETC_DIR, DISPLAY_CONFIG_DIR, filename)); - return config; } /** @@ -86,6 +118,30 @@ public class DisplayDeviceConfig { return mBrightness; } + @Override + public String toString() { + String str = "DisplayDeviceConfig{" + + "mBrightness=" + Arrays.toString(mBrightness) + + ", mNits=" + Arrays.toString(mNits) + + "}"; + return str; + } + + private static DisplayDeviceConfig getConfigFromSuffix(String suffixFormat, long idNumber) { + + final String suffix = String.format(suffixFormat, idNumber); + final String filename = String.format(CONFIG_FILE_FORMAT, suffix); + final File filePath = Environment.buildPath( + Environment.getProductDirectory(), ETC_DIR, DISPLAY_CONFIG_DIR, filename); + + if (filePath.exists()) { + final DisplayDeviceConfig config = new DisplayDeviceConfig(); + config.initFromFile(filePath); + return config; + } + return null; + } + private void initFromFile(File configFile) { if (!configFile.exists()) { // Display configuration files aren't required to exist. @@ -121,13 +177,13 @@ public class DisplayDeviceConfig { if (i > 0) { if (nits[i] < nits[i - 1]) { Slog.e(TAG, "screenBrightnessMap must be non-decreasing, ignoring rest " - + " of configuration. Nits: " + nits[i] + " < " + nits[i - 1]); + + " of configuration. Nits: " + nits[i] + " < " + nits[i - 1]); return; } if (backlight[i] < backlight[i - 1]) { Slog.e(TAG, "screenBrightnessMap must be non-decreasing, ignoring rest " - + " of configuration. Value: " + backlight[i] + " < " + + " of configuration. Value: " + backlight[i] + " < " + backlight[i - 1]); return; } diff --git a/services/core/java/com/android/server/display/LocalDisplayAdapter.java b/services/core/java/com/android/server/display/LocalDisplayAdapter.java index 0be428bdba475..507a265f0203f 100644 --- a/services/core/java/com/android/server/display/LocalDisplayAdapter.java +++ b/services/core/java/com/android/server/display/LocalDisplayAdapter.java @@ -391,11 +391,11 @@ final class LocalDisplayAdapter extends DisplayAdapter { Spline sysToNits = null; // Load the mapping from nits to HAL brightness range (display-device-config.xml) - DisplayDeviceConfig config = DisplayDeviceConfig.create(mPhysicalDisplayId); - mDisplayDeviceConfig = config; - if (config == null) { + mDisplayDeviceConfig = DisplayDeviceConfig.create(mPhysicalDisplayId); + if (mDisplayDeviceConfig == null) { return; } + final float[] halNits = mDisplayDeviceConfig.getNits(); final float[] halBrightness = mDisplayDeviceConfig.getBrightness(); if (halNits == null || halBrightness == null) { @@ -942,7 +942,8 @@ final class LocalDisplayAdapter extends DisplayAdapter { for (int i = 0; i < mSupportedModes.size(); i++) { pw.println(" " + mSupportedModes.valueAt(i)); } - pw.print("mSupportedColorModes=" + mSupportedColorModes.toString()); + pw.println("mSupportedColorModes=" + mSupportedColorModes.toString()); + pw.print("mDisplayDeviceConfig=" + mDisplayDeviceConfig); } private int findDisplayConfigIdLocked(int modeId, int configGroup) {