Introducing FeatureProvider and using it for NormalBrightnessController enabling

Bug: b/277877297
Test: manual testing, see comment 15

Change-Id: I88b4e5dfd16b1efbe87bf21459755ff2b4900d1f
This commit is contained in:
Oleg Petsjonkin
2023-06-12 13:53:00 +00:00
parent 0976919ceb
commit 1129bf752a
7 changed files with 342 additions and 228 deletions

View File

@@ -1762,6 +1762,24 @@ public final class DisplayManager {
* 123,1,critical,0.8,default;123,1,moderate,0.6,id_2;456,2,moderate,0.9,critical,0.7 * 123,1,critical,0.8,default;123,1,moderate,0.6,id_2;456,2,moderate,0.9,critical,0.7
*/ */
String KEY_BRIGHTNESS_THROTTLING_DATA = "brightness_throttling_data"; String KEY_BRIGHTNESS_THROTTLING_DATA = "brightness_throttling_data";
/**
* Key for new power controller feature flag. If enabled new DisplayPowerController will
* be used.
* Read value via {@link android.provider.DeviceConfig#getBoolean(String, String, boolean)}
* with {@link android.provider.DeviceConfig#NAMESPACE_DISPLAY_MANAGER} as the namespace.
* @hide
*/
String KEY_NEW_POWER_CONTROLLER = "use_newly_structured_display_power_controller";
/**
* Key for normal brightness mode controller feature flag.
* It enables NormalBrightnessModeController.
* Read value via {@link android.provider.DeviceConfig#getBoolean(String, String, boolean)}
* with {@link android.provider.DeviceConfig#NAMESPACE_DISPLAY_MANAGER} as the namespace.
* @hide
*/
String KEY_USE_NORMAL_BRIGHTNESS_MODE_CONTROLLER = "use_normal_brightness_mode_controller";
} }
/** /**

View File

@@ -18,29 +18,42 @@ package com.android.server.display;
import android.hardware.display.BrightnessInfo; import android.hardware.display.BrightnessInfo;
import android.os.IBinder; import android.os.IBinder;
import android.provider.DeviceConfigInterface;
import com.android.server.display.feature.DeviceConfigParameterProvider;
import java.io.PrintWriter; import java.io.PrintWriter;
import java.util.function.BooleanSupplier; import java.util.function.BooleanSupplier;
class BrightnessRangeController { class BrightnessRangeController {
private static final boolean NBM_FEATURE_FLAG = false;
private final HighBrightnessModeController mHbmController; private final HighBrightnessModeController mHbmController;
private final NormalBrightnessModeController mNormalBrightnessModeController = private final NormalBrightnessModeController mNormalBrightnessModeController =
new NormalBrightnessModeController(); new NormalBrightnessModeController();
private final Runnable mModeChangeCallback; private final Runnable mModeChangeCallback;
private final boolean mUseNbmController;
BrightnessRangeController(HighBrightnessModeController hbmController, BrightnessRangeController(HighBrightnessModeController hbmController,
Runnable modeChangeCallback) { Runnable modeChangeCallback) {
mHbmController = hbmController; this(hbmController, modeChangeCallback,
mModeChangeCallback = modeChangeCallback; new DeviceConfigParameterProvider(DeviceConfigInterface.REAL));
} }
BrightnessRangeController(HighBrightnessModeController hbmController,
Runnable modeChangeCallback, DeviceConfigParameterProvider configParameterProvider) {
mHbmController = hbmController;
mModeChangeCallback = modeChangeCallback;
mUseNbmController = configParameterProvider.isNormalBrightnessControllerFeatureEnabled();
}
void dump(PrintWriter pw) { void dump(PrintWriter pw) {
pw.println("BrightnessRangeController:");
pw.println(" mUseNormalBrightnessController=" + mUseNbmController);
mHbmController.dump(pw); mHbmController.dump(pw);
mNormalBrightnessModeController.dump(pw);
} }
void onAmbientLuxChange(float ambientLux) { void onAmbientLuxChange(float ambientLux) {
@@ -90,7 +103,7 @@ class BrightnessRangeController {
float getCurrentBrightnessMax() { float getCurrentBrightnessMax() {
if (NBM_FEATURE_FLAG && mHbmController.getHighBrightnessMode() if (mUseNbmController && mHbmController.getHighBrightnessMode()
== BrightnessInfo.HIGH_BRIGHTNESS_MODE_OFF) { == BrightnessInfo.HIGH_BRIGHTNESS_MODE_OFF) {
return Math.min(mHbmController.getCurrentBrightnessMax(), return Math.min(mHbmController.getCurrentBrightnessMax(),
mNormalBrightnessModeController.getCurrentBrightnessMax()); mNormalBrightnessModeController.getCurrentBrightnessMax());
@@ -111,7 +124,7 @@ class BrightnessRangeController {
} }
private void applyChanges(BooleanSupplier nbmChangesFunc, Runnable hbmChangesFunc) { private void applyChanges(BooleanSupplier nbmChangesFunc, Runnable hbmChangesFunc) {
if (NBM_FEATURE_FLAG) { if (mUseNbmController) {
boolean nbmTransitionChanged = nbmChangesFunc.getAsBoolean(); boolean nbmTransitionChanged = nbmChangesFunc.getAsBoolean();
hbmChangesFunc.run(); hbmChangesFunc.run();
// if nbm transition changed - trigger callback // if nbm transition changed - trigger callback

View File

@@ -22,7 +22,6 @@ import android.annotation.NonNull;
import android.annotation.Nullable; import android.annotation.Nullable;
import android.content.Context; import android.content.Context;
import android.hardware.display.BrightnessInfo; import android.hardware.display.BrightnessInfo;
import android.hardware.display.DisplayManager;
import android.os.Handler; import android.os.Handler;
import android.os.HandlerExecutor; import android.os.HandlerExecutor;
import android.os.IThermalEventListener; import android.os.IThermalEventListener;
@@ -38,6 +37,7 @@ import android.util.Slog;
import com.android.internal.annotations.VisibleForTesting; import com.android.internal.annotations.VisibleForTesting;
import com.android.server.display.DisplayDeviceConfig.ThermalBrightnessThrottlingData; import com.android.server.display.DisplayDeviceConfig.ThermalBrightnessThrottlingData;
import com.android.server.display.DisplayDeviceConfig.ThermalBrightnessThrottlingData.ThrottlingLevel; import com.android.server.display.DisplayDeviceConfig.ThermalBrightnessThrottlingData.ThrottlingLevel;
import com.android.server.display.feature.DeviceConfigParameterProvider;
import java.io.PrintWriter; import java.io.PrintWriter;
import java.util.ArrayList; import java.util.ArrayList;
@@ -63,7 +63,7 @@ class BrightnessThrottler {
private final Runnable mThrottlingChangeCallback; private final Runnable mThrottlingChangeCallback;
private final SkinThermalStatusObserver mSkinThermalStatusObserver; private final SkinThermalStatusObserver mSkinThermalStatusObserver;
private final DeviceConfigListener mDeviceConfigListener; private final DeviceConfigListener mDeviceConfigListener;
private final DeviceConfigInterface mDeviceConfig; private final DeviceConfigParameterProvider mConfigParameterProvider;
private int mThrottlingStatus; private int mThrottlingStatus;
@@ -118,7 +118,7 @@ class BrightnessThrottler {
mSkinThermalStatusObserver = new SkinThermalStatusObserver(mInjector, mHandler); mSkinThermalStatusObserver = new SkinThermalStatusObserver(mInjector, mHandler);
mUniqueDisplayId = uniqueDisplayId; mUniqueDisplayId = uniqueDisplayId;
mDeviceConfig = injector.getDeviceConfig(); mConfigParameterProvider = new DeviceConfigParameterProvider(injector.getDeviceConfig());
mDeviceConfigListener = new DeviceConfigListener(); mDeviceConfigListener = new DeviceConfigListener();
mThermalBrightnessThrottlingDataId = throttlingDataId; mThermalBrightnessThrottlingDataId = throttlingDataId;
mDdcThermalThrottlingDataMap = thermalBrightnessThrottlingDataMap; mDdcThermalThrottlingDataMap = thermalBrightnessThrottlingDataMap;
@@ -145,7 +145,7 @@ class BrightnessThrottler {
void stop() { void stop() {
mSkinThermalStatusObserver.stopObserving(); mSkinThermalStatusObserver.stopObserving();
mDeviceConfig.removeOnPropertiesChangedListener(mDeviceConfigListener); mConfigParameterProvider.removeOnPropertiesChangedListener(mDeviceConfigListener);
// We're asked to stop throttling, so reset brightness restrictions. // We're asked to stop throttling, so reset brightness restrictions.
mBrightnessCap = PowerManager.BRIGHTNESS_MAX; mBrightnessCap = PowerManager.BRIGHTNESS_MAX;
mBrightnessMaxReason = BrightnessInfo.BRIGHTNESS_MAX_REASON_NONE; mBrightnessMaxReason = BrightnessInfo.BRIGHTNESS_MAX_REASON_NONE;
@@ -248,12 +248,6 @@ class BrightnessThrottler {
mSkinThermalStatusObserver.dump(pw); mSkinThermalStatusObserver.dump(pw);
} }
private String getThermalBrightnessThrottlingDataString() {
return mDeviceConfig.getString(DeviceConfig.NAMESPACE_DISPLAY_MANAGER,
DisplayManager.DeviceConfig.KEY_BRIGHTNESS_THROTTLING_DATA,
/* defaultValue= */ null);
}
// The brightness throttling data id may or may not be specified in the string that is passed // The brightness throttling data id may or may not be specified in the string that is passed
// in, if there is none specified, we assume it is for the default case. Each string passed in // in, if there is none specified, we assume it is for the default case. Each string passed in
// here must be for one display and one throttling id. // here must be for one display and one throttling id.
@@ -318,7 +312,8 @@ class BrightnessThrottler {
private void loadThermalBrightnessThrottlingDataFromDeviceConfig() { private void loadThermalBrightnessThrottlingDataFromDeviceConfig() {
HashMap<String, HashMap<String, ThermalBrightnessThrottlingData>> tempThrottlingData = HashMap<String, HashMap<String, ThermalBrightnessThrottlingData>> tempThrottlingData =
new HashMap<>(1); new HashMap<>(1);
mThermalBrightnessThrottlingDataString = getThermalBrightnessThrottlingDataString(); mThermalBrightnessThrottlingDataString =
mConfigParameterProvider.getBrightnessThrottlingData();
boolean validConfig = true; boolean validConfig = true;
mThermalBrightnessThrottlingDataOverride.clear(); mThermalBrightnessThrottlingDataOverride.clear();
if (mThermalBrightnessThrottlingDataString != null) { if (mThermalBrightnessThrottlingDataString != null) {
@@ -390,8 +385,7 @@ class BrightnessThrottler {
public Executor mExecutor = new HandlerExecutor(mDeviceConfigHandler); public Executor mExecutor = new HandlerExecutor(mDeviceConfigHandler);
public void startListening() { public void startListening() {
mDeviceConfig.addOnPropertiesChangedListener(DeviceConfig.NAMESPACE_DISPLAY_MANAGER, mConfigParameterProvider.addOnPropertiesChangedListener(mExecutor, this);
mExecutor, this);
} }
@Override @Override

View File

@@ -24,7 +24,6 @@ import static android.Manifest.permission.INTERNAL_SYSTEM_WINDOW;
import static android.app.ActivityManager.RunningAppProcessInfo.IMPORTANCE_CACHED; import static android.app.ActivityManager.RunningAppProcessInfo.IMPORTANCE_CACHED;
import static android.app.ActivityManager.RunningAppProcessInfo.IMPORTANCE_GONE; import static android.app.ActivityManager.RunningAppProcessInfo.IMPORTANCE_GONE;
import static android.hardware.display.DisplayManager.EventsMask; import static android.hardware.display.DisplayManager.EventsMask;
import static android.hardware.display.DisplayManager.HDR_OUTPUT_CONTROL_FLAG;
import static android.hardware.display.DisplayManager.VIRTUAL_DISPLAY_FLAG_ALWAYS_UNLOCKED; import static android.hardware.display.DisplayManager.VIRTUAL_DISPLAY_FLAG_ALWAYS_UNLOCKED;
import static android.hardware.display.DisplayManager.VIRTUAL_DISPLAY_FLAG_AUTO_MIRROR; import static android.hardware.display.DisplayManager.VIRTUAL_DISPLAY_FLAG_AUTO_MIRROR;
import static android.hardware.display.DisplayManager.VIRTUAL_DISPLAY_FLAG_CAN_SHOW_WITH_INSECURE_KEYGUARD; import static android.hardware.display.DisplayManager.VIRTUAL_DISPLAY_FLAG_CAN_SHOW_WITH_INSECURE_KEYGUARD;
@@ -42,7 +41,6 @@ import static android.hardware.display.DisplayViewport.VIEWPORT_VIRTUAL;
import static android.hardware.display.HdrConversionMode.HDR_CONVERSION_UNSUPPORTED; import static android.hardware.display.HdrConversionMode.HDR_CONVERSION_UNSUPPORTED;
import static android.os.Process.FIRST_APPLICATION_UID; import static android.os.Process.FIRST_APPLICATION_UID;
import static android.os.Process.ROOT_UID; import static android.os.Process.ROOT_UID;
import static android.provider.DeviceConfig.NAMESPACE_DISPLAY_MANAGER;
import android.Manifest; import android.Manifest;
import android.annotation.NonNull; import android.annotation.NonNull;
@@ -116,7 +114,7 @@ import android.os.SystemProperties;
import android.os.Trace; import android.os.Trace;
import android.os.UserHandle; import android.os.UserHandle;
import android.os.UserManager; import android.os.UserManager;
import android.provider.DeviceConfig; import android.provider.DeviceConfigInterface;
import android.provider.Settings; import android.provider.Settings;
import android.text.TextUtils; import android.text.TextUtils;
import android.util.ArraySet; import android.util.ArraySet;
@@ -152,6 +150,7 @@ import com.android.server.SystemService;
import com.android.server.UiThread; import com.android.server.UiThread;
import com.android.server.companion.virtual.VirtualDeviceManagerInternal; import com.android.server.companion.virtual.VirtualDeviceManagerInternal;
import com.android.server.display.DisplayDeviceConfig.SensorData; import com.android.server.display.DisplayDeviceConfig.SensorData;
import com.android.server.display.feature.DeviceConfigParameterProvider;
import com.android.server.display.layout.Layout; import com.android.server.display.layout.Layout;
import com.android.server.display.mode.DisplayModeDirector; import com.android.server.display.mode.DisplayModeDirector;
import com.android.server.display.utils.SensorUtils; import com.android.server.display.utils.SensorUtils;
@@ -506,6 +505,8 @@ public final class DisplayManagerService extends SystemService {
private final BrightnessSynchronizer mBrightnessSynchronizer; private final BrightnessSynchronizer mBrightnessSynchronizer;
private final DeviceConfigParameterProvider mConfigParameterProvider;
/** /**
* Applications use {@link android.view.Display#getRefreshRate} and * Applications use {@link android.view.Display#getRefreshRate} and
* {@link android.view.Display.Mode#getRefreshRate} to know what is the display refresh rate. * {@link android.view.Display.Mode#getRefreshRate} to know what is the display refresh rate.
@@ -558,6 +559,7 @@ public final class DisplayManagerService extends SystemService {
mWideColorSpace = colorSpaces[1]; mWideColorSpace = colorSpaces[1];
mOverlayProperties = SurfaceControl.getOverlaySupport(); mOverlayProperties = SurfaceControl.getOverlaySupport();
mSystemReady = false; mSystemReady = false;
mConfigParameterProvider = new DeviceConfigParameterProvider(DeviceConfigInterface.REAL);
} }
public void setupSchedulerPolicies() { public void setupSchedulerPolicies() {
@@ -694,11 +696,11 @@ public final class DisplayManagerService extends SystemService {
synchronized (mSyncRoot) { synchronized (mSyncRoot) {
mSafeMode = safeMode; mSafeMode = safeMode;
mSystemReady = true; mSystemReady = true;
mIsHdrOutputControlEnabled = isDeviceConfigHdrOutputControlEnabled(); mIsHdrOutputControlEnabled =
DeviceConfig.addOnPropertiesChangedListener(NAMESPACE_DISPLAY_MANAGER, mConfigParameterProvider.isHdrOutputControlFeatureEnabled();
BackgroundThread.getExecutor(), mConfigParameterProvider.addOnPropertiesChangedListener(BackgroundThread.getExecutor(),
properties -> mIsHdrOutputControlEnabled = properties -> mIsHdrOutputControlEnabled =
isDeviceConfigHdrOutputControlEnabled()); mConfigParameterProvider.isHdrOutputControlFeatureEnabled());
// Just in case the top inset changed before the system was ready. At this point, any // Just in case the top inset changed before the system was ready. At this point, any
// relevant configuration should be in place. // relevant configuration should be in place.
recordTopInsetLocked(mLogicalDisplayMapper.getDisplayLocked(Display.DEFAULT_DISPLAY)); recordTopInsetLocked(mLogicalDisplayMapper.getDisplayLocked(Display.DEFAULT_DISPLAY));
@@ -729,12 +731,6 @@ public final class DisplayManagerService extends SystemService {
mContext.registerReceiver(mIdleModeReceiver, filter); mContext.registerReceiver(mIdleModeReceiver, filter);
} }
private boolean isDeviceConfigHdrOutputControlEnabled() {
return DeviceConfig.getBoolean(NAMESPACE_DISPLAY_MANAGER,
HDR_OUTPUT_CONTROL_FLAG,
true);
}
@VisibleForTesting @VisibleForTesting
Handler getDisplayHandler() { Handler getDisplayHandler() {
return mHandler; return mHandler;
@@ -3158,8 +3154,7 @@ public final class DisplayManagerService extends SystemService {
+ "display: " + display.getDisplayIdLocked()); + "display: " + display.getDisplayIdLocked());
return null; return null;
} }
if (DeviceConfig.getBoolean("display_manager", if (mConfigParameterProvider.isNewPowerControllerFeatureEnabled()) {
"use_newly_structured_display_power_controller", true)) {
displayPowerController = new DisplayPowerController2( displayPowerController = new DisplayPowerController2(
mContext, /* injector= */ null, mDisplayPowerCallbacks, mPowerHandler, mContext, /* injector= */ null, mDisplayPowerCallbacks, mPowerHandler,
mSensorManager, mDisplayBlanker, display, mBrightnessTracker, brightnessSetting, mSensorManager, mDisplayBlanker, display, mBrightnessTracker, brightnessSetting,

View File

@@ -21,6 +21,7 @@ import android.os.PowerManager;
import com.android.server.display.DisplayDeviceConfig.BrightnessLimitMapType; import com.android.server.display.DisplayDeviceConfig.BrightnessLimitMapType;
import java.io.PrintWriter;
import java.util.HashMap; import java.util.HashMap;
import java.util.Map; import java.util.Map;
@@ -60,6 +61,14 @@ class NormalBrightnessModeController {
return recalculateMaxBrightness(); return recalculateMaxBrightness();
} }
void dump(PrintWriter pw) {
pw.println("NormalBrightnessModeController:");
pw.println(" mAutoBrightnessEnabled=" + mAutoBrightnessEnabled);
pw.println(" mAmbientLux=" + mAmbientLux);
pw.println(" mMaxBrightness=" + mMaxBrightness);
pw.println(" mMaxBrightnessLimits=" + mMaxBrightnessLimits);
}
private boolean recalculateMaxBrightness() { private boolean recalculateMaxBrightness() {
float foundAmbientBoundary = Float.MAX_VALUE; float foundAmbientBoundary = Float.MAX_VALUE;
float foundMaxBrightness = PowerManager.BRIGHTNESS_MAX; float foundMaxBrightness = PowerManager.BRIGHTNESS_MAX;

View File

@@ -0,0 +1,168 @@
/*
* Copyright (C) 2023 The Android Open Source Project
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package com.android.server.display.feature;
import android.annotation.NonNull;
import android.annotation.Nullable;
import android.hardware.display.DisplayManager;
import android.provider.DeviceConfig;
import android.provider.DeviceConfigInterface;
import android.util.Slog;
import java.util.concurrent.Executor;
/**
* Helper class to access all DeviceConfig features for display_manager namespace
*
**/
public class DeviceConfigParameterProvider {
private static final String TAG = "DisplayFeatureProvider";
private final DeviceConfigInterface mDeviceConfig;
public DeviceConfigParameterProvider(DeviceConfigInterface deviceConfig) {
mDeviceConfig = deviceConfig;
}
// feature: revamping_display_power_controller_feature
// parameter: use_newly_structured_display_power_controller
public boolean isNewPowerControllerFeatureEnabled() {
return mDeviceConfig.getBoolean(DeviceConfig.NAMESPACE_DISPLAY_MANAGER,
DisplayManager.DeviceConfig.KEY_NEW_POWER_CONTROLLER, true);
}
// feature: hdr_output_control
// parameter: enable_hdr_output_control
public boolean isHdrOutputControlFeatureEnabled() {
return DeviceConfig.getBoolean(DeviceConfig.NAMESPACE_DISPLAY_MANAGER,
DisplayManager.HDR_OUTPUT_CONTROL_FLAG, true);
}
// feature: flexible_brightness_range_feature
// parameter: normal_brightness_mode_controller_enabled
public boolean isNormalBrightnessControllerFeatureEnabled() {
return DeviceConfig.getBoolean(DeviceConfig.NAMESPACE_DISPLAY_MANAGER,
DisplayManager.DeviceConfig.KEY_USE_NORMAL_BRIGHTNESS_MODE_CONTROLLER, false);
}
// feature: smooth_display_feature
// parameter: peak_refresh_rate_default
public float getPeakRefreshRateDefault() {
return mDeviceConfig.getFloat(DeviceConfig.NAMESPACE_DISPLAY_MANAGER,
DisplayManager.DeviceConfig.KEY_PEAK_REFRESH_RATE_DEFAULT, -1);
}
// Test parameters
// usage e.g.: adb shell device_config put display_manager refresh_rate_in_hbm_sunlight 90
// allows to customize brightness throttling data
public String getBrightnessThrottlingData() {
return mDeviceConfig.getString(DeviceConfig.NAMESPACE_DISPLAY_MANAGER,
DisplayManager.DeviceConfig.KEY_BRIGHTNESS_THROTTLING_DATA, null);
}
public int getRefreshRateInHbmSunlight() {
return mDeviceConfig.getInt(DeviceConfig.NAMESPACE_DISPLAY_MANAGER,
DisplayManager.DeviceConfig.KEY_REFRESH_RATE_IN_HBM_SUNLIGHT, -1);
}
public int getRefreshRateInHbmHdr() {
return mDeviceConfig.getInt(DeviceConfig.NAMESPACE_DISPLAY_MANAGER,
DisplayManager.DeviceConfig.KEY_REFRESH_RATE_IN_HBM_HDR, -1);
}
public int getRefreshRateInHighZone() {
return mDeviceConfig.getInt(DeviceConfig.NAMESPACE_DISPLAY_MANAGER,
DisplayManager.DeviceConfig.KEY_REFRESH_RATE_IN_HIGH_ZONE, -1);
}
public int getRefreshRateInLowZone() {
return mDeviceConfig.getInt(DeviceConfig.NAMESPACE_DISPLAY_MANAGER,
DisplayManager.DeviceConfig.KEY_REFRESH_RATE_IN_LOW_ZONE, -1);
}
/** Return null if no such property or wrong format (not comma separated integers). */
@Nullable
public int[] getHighAmbientBrightnessThresholds() {
return getIntArrayProperty(DisplayManager.DeviceConfig
.KEY_FIXED_REFRESH_RATE_HIGH_AMBIENT_BRIGHTNESS_THRESHOLDS);
}
/** Return null if no such property or wrong format (not comma separated integers). */
@Nullable
public int[] getHighDisplayBrightnessThresholds() {
return getIntArrayProperty(DisplayManager.DeviceConfig
.KEY_FIXED_REFRESH_RATE_HIGH_DISPLAY_BRIGHTNESS_THRESHOLDS);
}
/** Return null if no such property or wrong format (not comma separated integers). */
@Nullable
public int[] getLowDisplayBrightnessThresholds() {
return getIntArrayProperty(DisplayManager.DeviceConfig
.KEY_FIXED_REFRESH_RATE_LOW_DISPLAY_BRIGHTNESS_THRESHOLDS);
}
/** Return null if no such property or wrong format (not comma separated integers). */
@Nullable
public int[] getLowAmbientBrightnessThresholds() {
return getIntArrayProperty(DisplayManager.DeviceConfig
.KEY_FIXED_REFRESH_RATE_LOW_AMBIENT_BRIGHTNESS_THRESHOLDS);
}
/** add property change listener to DeviceConfig */
public void addOnPropertiesChangedListener(Executor executor,
DeviceConfig.OnPropertiesChangedListener listener) {
mDeviceConfig.addOnPropertiesChangedListener(DeviceConfig.NAMESPACE_DISPLAY_MANAGER,
executor, listener);
}
/** remove property change listener from DeviceConfig */
public void removeOnPropertiesChangedListener(
DeviceConfig.OnPropertiesChangedListener listener) {
mDeviceConfig.removeOnPropertiesChangedListener(listener);
}
@Nullable
private int[] getIntArrayProperty(String prop) {
String strArray = mDeviceConfig.getString(DeviceConfig.NAMESPACE_DISPLAY_MANAGER, prop,
null);
if (strArray != null) {
return parseIntArray(strArray);
}
return null;
}
@Nullable
private int[] parseIntArray(@NonNull String strArray) {
String[] items = strArray.split(",");
int[] array = new int[items.length];
try {
for (int i = 0; i < array.length; i++) {
array[i] = Integer.parseInt(items[i]);
}
} catch (NumberFormatException e) {
Slog.e(TAG, "Incorrect format for array: '" + strArray + "'", e);
array = null;
}
return array;
}
}

View File

@@ -20,6 +20,7 @@ import static android.hardware.display.DisplayManager.DISPLAY_CATEGORY_ALL_INCLU
import static android.hardware.display.DisplayManagerInternal.REFRESH_RATE_LIMIT_HIGH_BRIGHTNESS_MODE; import static android.hardware.display.DisplayManagerInternal.REFRESH_RATE_LIMIT_HIGH_BRIGHTNESS_MODE;
import static android.os.PowerManager.BRIGHTNESS_INVALID; import static android.os.PowerManager.BRIGHTNESS_INVALID;
import android.annotation.IntegerRes;
import android.annotation.NonNull; import android.annotation.NonNull;
import android.annotation.Nullable; import android.annotation.Nullable;
import android.content.ContentResolver; import android.content.ContentResolver;
@@ -68,6 +69,7 @@ import com.android.internal.display.BrightnessSynchronizer;
import com.android.internal.os.BackgroundThread; import com.android.internal.os.BackgroundThread;
import com.android.server.LocalServices; import com.android.server.LocalServices;
import com.android.server.display.DisplayDeviceConfig; import com.android.server.display.DisplayDeviceConfig;
import com.android.server.display.feature.DeviceConfigParameterProvider;
import com.android.server.display.utils.AmbientFilter; import com.android.server.display.utils.AmbientFilter;
import com.android.server.display.utils.AmbientFilterFactory; import com.android.server.display.utils.AmbientFilterFactory;
import com.android.server.display.utils.SensorUtils; import com.android.server.display.utils.SensorUtils;
@@ -84,6 +86,7 @@ import java.util.List;
import java.util.Locale; import java.util.Locale;
import java.util.Objects; import java.util.Objects;
import java.util.concurrent.Callable; import java.util.concurrent.Callable;
import java.util.function.IntSupplier;
/** /**
* The DisplayModeDirector is responsible for determining what modes are allowed to be automatically * The DisplayModeDirector is responsible for determining what modes are allowed to be automatically
@@ -117,7 +120,7 @@ public class DisplayModeDirector {
private final SensorObserver mSensorObserver; private final SensorObserver mSensorObserver;
private final HbmObserver mHbmObserver; private final HbmObserver mHbmObserver;
private final SkinThermalStatusObserver mSkinThermalStatusObserver; private final SkinThermalStatusObserver mSkinThermalStatusObserver;
private final DeviceConfigInterface mDeviceConfig; private final DeviceConfigParameterProvider mConfigParameterProvider;
private final DeviceConfigDisplaySettings mDeviceConfigDisplaySettings; private final DeviceConfigDisplaySettings mDeviceConfigDisplaySettings;
@GuardedBy("mLock") @GuardedBy("mLock")
@@ -157,7 +160,7 @@ public class DisplayModeDirector {
mSupportedModesByDisplay = new SparseArray<>(); mSupportedModesByDisplay = new SparseArray<>();
mDefaultModeByDisplay = new SparseArray<>(); mDefaultModeByDisplay = new SparseArray<>();
mAppRequestObserver = new AppRequestObserver(); mAppRequestObserver = new AppRequestObserver();
mDeviceConfig = injector.getDeviceConfig(); mConfigParameterProvider = new DeviceConfigParameterProvider(injector.getDeviceConfig());
mDeviceConfigDisplaySettings = new DeviceConfigDisplaySettings(); mDeviceConfigDisplaySettings = new DeviceConfigDisplaySettings();
mSettingsObserver = new SettingsObserver(context, handler); mSettingsObserver = new SettingsObserver(context, handler);
mBrightnessObserver = new BrightnessObserver(context, handler, injector); mBrightnessObserver = new BrightnessObserver(context, handler, injector);
@@ -681,9 +684,9 @@ public class DisplayModeDirector {
synchronized (mLock) { synchronized (mLock) {
mDefaultDisplayDeviceConfig = displayDeviceConfig; mDefaultDisplayDeviceConfig = displayDeviceConfig;
mSettingsObserver.setRefreshRates(displayDeviceConfig, mSettingsObserver.setRefreshRates(displayDeviceConfig,
/* attemptLoadingFromDeviceConfig= */ true); /* attemptReadFromFeatureParams= */ true);
mBrightnessObserver.updateBlockingZoneThresholds(displayDeviceConfig, mBrightnessObserver.updateBlockingZoneThresholds(displayDeviceConfig,
/* attemptLoadingFromDeviceConfig= */ true); /* attemptReadFromFeatureParams= */ true);
mBrightnessObserver.reloadLightSensor(displayDeviceConfig); mBrightnessObserver.reloadLightSensor(displayDeviceConfig);
mHbmObserver.setupHdrRefreshRates(displayDeviceConfig); mHbmObserver.setupHdrRefreshRates(displayDeviceConfig);
} }
@@ -1087,7 +1090,7 @@ public class DisplayModeDirector {
// reading from the DeviceConfig is an intensive IO operation and having it in the // reading from the DeviceConfig is an intensive IO operation and having it in the
// startup phase where we thrive to keep the latency very low has significant impact. // startup phase where we thrive to keep the latency very low has significant impact.
setRefreshRates(/* displayDeviceConfig= */ null, setRefreshRates(/* displayDeviceConfig= */ null,
/* attemptLoadingFromDeviceConfig= */ false); /* attemptReadFromFeatureParams= */ false);
} }
/** /**
@@ -1095,8 +1098,8 @@ public class DisplayModeDirector {
* if missing from DisplayDeviceConfig, and finally fallback to config.xml. * if missing from DisplayDeviceConfig, and finally fallback to config.xml.
*/ */
public void setRefreshRates(DisplayDeviceConfig displayDeviceConfig, public void setRefreshRates(DisplayDeviceConfig displayDeviceConfig,
boolean attemptLoadingFromDeviceConfig) { boolean attemptReadFromFeatureParams) {
setDefaultPeakRefreshRate(displayDeviceConfig, attemptLoadingFromDeviceConfig); setDefaultPeakRefreshRate(displayDeviceConfig, attemptReadFromFeatureParams);
mDefaultRefreshRate = mDefaultRefreshRate =
(displayDeviceConfig == null) ? (float) mContext.getResources().getInteger( (displayDeviceConfig == null) ? (float) mContext.getResources().getInteger(
R.integer.config_defaultRefreshRate) R.integer.config_defaultRefreshRate)
@@ -1113,9 +1116,9 @@ public class DisplayModeDirector {
cr.registerContentObserver(mMatchContentFrameRateSetting, false /*notifyDescendants*/, cr.registerContentObserver(mMatchContentFrameRateSetting, false /*notifyDescendants*/,
this); this);
Float deviceConfigDefaultPeakRefresh = float deviceConfigDefaultPeakRefresh =
mDeviceConfigDisplaySettings.getDefaultPeakRefreshRate(); mConfigParameterProvider.getPeakRefreshRateDefault();
if (deviceConfigDefaultPeakRefresh != null) { if (deviceConfigDefaultPeakRefresh != -1) {
mDefaultPeakRefreshRate = deviceConfigDefaultPeakRefresh; mDefaultPeakRefreshRate = deviceConfigDefaultPeakRefresh;
} }
@@ -1137,7 +1140,7 @@ public class DisplayModeDirector {
synchronized (mLock) { synchronized (mLock) {
if (defaultPeakRefreshRate == null) { if (defaultPeakRefreshRate == null) {
setDefaultPeakRefreshRate(mDefaultDisplayDeviceConfig, setDefaultPeakRefreshRate(mDefaultDisplayDeviceConfig,
/* attemptLoadingFromDeviceConfig= */ false); /* attemptReadFromFeatureParams= */ false);
updateRefreshRateSettingLocked(); updateRefreshRateSettingLocked();
} else if (mDefaultPeakRefreshRate != defaultPeakRefreshRate) { } else if (mDefaultPeakRefreshRate != defaultPeakRefreshRate) {
mDefaultPeakRefreshRate = defaultPeakRefreshRate; mDefaultPeakRefreshRate = defaultPeakRefreshRate;
@@ -1171,18 +1174,17 @@ public class DisplayModeDirector {
} }
private void setDefaultPeakRefreshRate(DisplayDeviceConfig displayDeviceConfig, private void setDefaultPeakRefreshRate(DisplayDeviceConfig displayDeviceConfig,
boolean attemptLoadingFromDeviceConfig) { boolean attemptReadFromFeatureParams) {
Float defaultPeakRefreshRate = null; float defaultPeakRefreshRate = -1;
if (attemptLoadingFromDeviceConfig) { if (attemptReadFromFeatureParams) {
try { try {
defaultPeakRefreshRate = defaultPeakRefreshRate = mConfigParameterProvider.getPeakRefreshRateDefault();
mDeviceConfigDisplaySettings.getDefaultPeakRefreshRate();
} catch (Exception exception) { } catch (Exception exception) {
// Do nothing // Do nothing
} }
} }
if (defaultPeakRefreshRate == null) { if (defaultPeakRefreshRate == -1) {
defaultPeakRefreshRate = defaultPeakRefreshRate =
(displayDeviceConfig == null) ? (float) mContext.getResources().getInteger( (displayDeviceConfig == null) ? (float) mContext.getResources().getInteger(
R.integer.config_defaultPeakRefreshRate) R.integer.config_defaultPeakRefreshRate)
@@ -1528,7 +1530,7 @@ public class DisplayModeDirector {
mHandler = handler; mHandler = handler;
mInjector = injector; mInjector = injector;
updateBlockingZoneThresholds(/* displayDeviceConfig= */ null, updateBlockingZoneThresholds(/* displayDeviceConfig= */ null,
/* attemptLoadingFromDeviceConfig= */ false); /* attemptReadFromFeatureParams= */ false);
mRefreshRateInHighZone = context.getResources().getInteger( mRefreshRateInHighZone = context.getResources().getInteger(
R.integer.config_fixedRefreshRateInHighZone); R.integer.config_fixedRefreshRateInHighZone);
} }
@@ -1537,10 +1539,10 @@ public class DisplayModeDirector {
* This is used to update the blocking zone thresholds from the DeviceConfig, which * This is used to update the blocking zone thresholds from the DeviceConfig, which
* if missing from DisplayDeviceConfig, and finally fallback to config.xml. * if missing from DisplayDeviceConfig, and finally fallback to config.xml.
*/ */
public void updateBlockingZoneThresholds(DisplayDeviceConfig displayDeviceConfig, public void updateBlockingZoneThresholds(@Nullable DisplayDeviceConfig displayDeviceConfig,
boolean attemptLoadingFromDeviceConfig) { boolean attemptReadFromFeatureParams) {
loadLowBrightnessThresholds(displayDeviceConfig, attemptLoadingFromDeviceConfig); loadLowBrightnessThresholds(displayDeviceConfig, attemptReadFromFeatureParams);
loadHighBrightnessThresholds(displayDeviceConfig, attemptLoadingFromDeviceConfig); loadHighBrightnessThresholds(displayDeviceConfig, attemptReadFromFeatureParams);
} }
@VisibleForTesting @VisibleForTesting
@@ -1579,20 +1581,20 @@ public class DisplayModeDirector {
return mRefreshRateInLowZone; return mRefreshRateInLowZone;
} }
private void loadLowBrightnessThresholds(DisplayDeviceConfig displayDeviceConfig, private void loadLowBrightnessThresholds(@Nullable DisplayDeviceConfig displayDeviceConfig,
boolean attemptLoadingFromDeviceConfig) { boolean attemptReadFromFeatureParams) {
loadRefreshRateInHighZone(displayDeviceConfig, attemptLoadingFromDeviceConfig); loadRefreshRateInHighZone(displayDeviceConfig, attemptReadFromFeatureParams);
loadRefreshRateInLowZone(displayDeviceConfig, attemptLoadingFromDeviceConfig); loadRefreshRateInLowZone(displayDeviceConfig, attemptReadFromFeatureParams);
mLowDisplayBrightnessThresholds = loadBrightnessThresholds( mLowDisplayBrightnessThresholds = loadBrightnessThresholds(
() -> mDeviceConfigDisplaySettings.getLowDisplayBrightnessThresholds(), () -> mConfigParameterProvider.getLowDisplayBrightnessThresholds(),
() -> displayDeviceConfig.getLowDisplayBrightnessThresholds(), () -> displayDeviceConfig.getLowDisplayBrightnessThresholds(),
R.array.config_brightnessThresholdsOfPeakRefreshRate, R.array.config_brightnessThresholdsOfPeakRefreshRate,
displayDeviceConfig, attemptLoadingFromDeviceConfig); displayDeviceConfig, attemptReadFromFeatureParams);
mLowAmbientBrightnessThresholds = loadBrightnessThresholds( mLowAmbientBrightnessThresholds = loadBrightnessThresholds(
() -> mDeviceConfigDisplaySettings.getLowAmbientBrightnessThresholds(), () -> mConfigParameterProvider.getLowAmbientBrightnessThresholds(),
() -> displayDeviceConfig.getLowAmbientBrightnessThresholds(), () -> displayDeviceConfig.getLowAmbientBrightnessThresholds(),
R.array.config_ambientThresholdsOfPeakRefreshRate, R.array.config_ambientThresholdsOfPeakRefreshRate,
displayDeviceConfig, attemptLoadingFromDeviceConfig); displayDeviceConfig, attemptReadFromFeatureParams);
if (mLowDisplayBrightnessThresholds.length != mLowAmbientBrightnessThresholds.length) { if (mLowDisplayBrightnessThresholds.length != mLowAmbientBrightnessThresholds.length) {
throw new RuntimeException("display low brightness threshold array and ambient " throw new RuntimeException("display low brightness threshold array and ambient "
+ "brightness threshold array have different length: " + "brightness threshold array have different length: "
@@ -1604,55 +1606,55 @@ public class DisplayModeDirector {
} }
private void loadRefreshRateInLowZone(DisplayDeviceConfig displayDeviceConfig, private void loadRefreshRateInLowZone(DisplayDeviceConfig displayDeviceConfig,
boolean attemptLoadingFromDeviceConfig) { boolean attemptReadFromFeatureParams) {
int refreshRateInLowZone = int refreshRateInLowZone = -1;
(displayDeviceConfig == null) ? mContext.getResources().getInteger( if (attemptReadFromFeatureParams) {
R.integer.config_defaultRefreshRateInZone)
: displayDeviceConfig.getDefaultLowBlockingZoneRefreshRate();
if (attemptLoadingFromDeviceConfig) {
try { try {
refreshRateInLowZone = mDeviceConfig.getInt( refreshRateInLowZone = mConfigParameterProvider.getRefreshRateInLowZone();
DeviceConfig.NAMESPACE_DISPLAY_MANAGER,
DisplayManager.DeviceConfig.KEY_REFRESH_RATE_IN_LOW_ZONE,
refreshRateInLowZone);
} catch (Exception exception) { } catch (Exception exception) {
// Do nothing // Do nothing
} }
} }
if (refreshRateInLowZone == -1) {
refreshRateInLowZone = (displayDeviceConfig == null)
? mContext.getResources().getInteger(
R.integer.config_defaultRefreshRateInZone)
: displayDeviceConfig.getDefaultLowBlockingZoneRefreshRate();
}
mRefreshRateInLowZone = refreshRateInLowZone; mRefreshRateInLowZone = refreshRateInLowZone;
} }
private void loadRefreshRateInHighZone(DisplayDeviceConfig displayDeviceConfig, private void loadRefreshRateInHighZone(DisplayDeviceConfig displayDeviceConfig,
boolean attemptLoadingFromDeviceConfig) { boolean attemptReadFromFeatureParams) {
int refreshRateInHighZone = int refreshRateInHighZone = -1;
(displayDeviceConfig == null) ? mContext.getResources().getInteger( if (attemptReadFromFeatureParams) {
R.integer.config_fixedRefreshRateInHighZone) : displayDeviceConfig
.getDefaultHighBlockingZoneRefreshRate();
if (attemptLoadingFromDeviceConfig) {
try { try {
refreshRateInHighZone = mDeviceConfig.getInt( refreshRateInHighZone = mConfigParameterProvider.getRefreshRateInHighZone();
DeviceConfig.NAMESPACE_DISPLAY_MANAGER,
DisplayManager.DeviceConfig.KEY_REFRESH_RATE_IN_HIGH_ZONE,
refreshRateInHighZone);
} catch (Exception exception) { } catch (Exception exception) {
// Do nothing // Do nothing
} }
} }
if (refreshRateInHighZone == -1) {
refreshRateInHighZone = (displayDeviceConfig == null)
? mContext.getResources().getInteger(
R.integer.config_fixedRefreshRateInHighZone)
: displayDeviceConfig.getDefaultHighBlockingZoneRefreshRate();
}
mRefreshRateInHighZone = refreshRateInHighZone; mRefreshRateInHighZone = refreshRateInHighZone;
} }
private void loadHighBrightnessThresholds(DisplayDeviceConfig displayDeviceConfig, private void loadHighBrightnessThresholds(DisplayDeviceConfig displayDeviceConfig,
boolean attemptLoadingFromDeviceConfig) { boolean attemptReadFromFeatureParams) {
mHighDisplayBrightnessThresholds = loadBrightnessThresholds( mHighDisplayBrightnessThresholds = loadBrightnessThresholds(
() -> mDeviceConfigDisplaySettings.getHighDisplayBrightnessThresholds(), () -> mConfigParameterProvider.getHighDisplayBrightnessThresholds(),
() -> displayDeviceConfig.getHighDisplayBrightnessThresholds(), () -> displayDeviceConfig.getHighDisplayBrightnessThresholds(),
R.array.config_highDisplayBrightnessThresholdsOfFixedRefreshRate, R.array.config_highDisplayBrightnessThresholdsOfFixedRefreshRate,
displayDeviceConfig, attemptLoadingFromDeviceConfig); displayDeviceConfig, attemptReadFromFeatureParams);
mHighAmbientBrightnessThresholds = loadBrightnessThresholds( mHighAmbientBrightnessThresholds = loadBrightnessThresholds(
() -> mDeviceConfigDisplaySettings.getHighAmbientBrightnessThresholds(), () -> mConfigParameterProvider.getHighAmbientBrightnessThresholds(),
() -> displayDeviceConfig.getHighAmbientBrightnessThresholds(), () -> displayDeviceConfig.getHighAmbientBrightnessThresholds(),
R.array.config_highAmbientBrightnessThresholdsOfFixedRefreshRate, R.array.config_highAmbientBrightnessThresholdsOfFixedRefreshRate,
displayDeviceConfig, attemptLoadingFromDeviceConfig); displayDeviceConfig, attemptReadFromFeatureParams);
if (mHighDisplayBrightnessThresholds.length if (mHighDisplayBrightnessThresholds.length
!= mHighAmbientBrightnessThresholds.length) { != mHighAmbientBrightnessThresholds.length) {
throw new RuntimeException("display high brightness threshold array and ambient " throw new RuntimeException("display high brightness threshold array and ambient "
@@ -1668,10 +1670,10 @@ public class DisplayModeDirector {
Callable<int[]> loadFromDeviceConfigDisplaySettingsCallable, Callable<int[]> loadFromDeviceConfigDisplaySettingsCallable,
Callable<int[]> loadFromDisplayDeviceConfigCallable, Callable<int[]> loadFromDisplayDeviceConfigCallable,
int brightnessThresholdOfFixedRefreshRateKey, int brightnessThresholdOfFixedRefreshRateKey,
DisplayDeviceConfig displayDeviceConfig, boolean attemptLoadingFromDeviceConfig) { DisplayDeviceConfig displayDeviceConfig, boolean attemptReadFromFeatureParams) {
int[] brightnessThresholds = null; int[] brightnessThresholds = null;
if (attemptLoadingFromDeviceConfig) { if (attemptReadFromFeatureParams) {
try { try {
brightnessThresholds = brightnessThresholds =
loadFromDeviceConfigDisplaySettingsCallable.call(); loadFromDeviceConfigDisplaySettingsCallable.call();
@@ -1715,9 +1717,9 @@ public class DisplayModeDirector {
// DeviceConfig is accessible after system ready. // DeviceConfig is accessible after system ready.
int[] lowDisplayBrightnessThresholds = int[] lowDisplayBrightnessThresholds =
mDeviceConfigDisplaySettings.getLowDisplayBrightnessThresholds(); mConfigParameterProvider.getLowDisplayBrightnessThresholds();
int[] lowAmbientBrightnessThresholds = int[] lowAmbientBrightnessThresholds =
mDeviceConfigDisplaySettings.getLowAmbientBrightnessThresholds(); mConfigParameterProvider.getLowAmbientBrightnessThresholds();
if (lowDisplayBrightnessThresholds != null && lowAmbientBrightnessThresholds != null if (lowDisplayBrightnessThresholds != null && lowAmbientBrightnessThresholds != null
&& lowDisplayBrightnessThresholds.length && lowDisplayBrightnessThresholds.length
@@ -1727,9 +1729,9 @@ public class DisplayModeDirector {
} }
int[] highDisplayBrightnessThresholds = int[] highDisplayBrightnessThresholds =
mDeviceConfigDisplaySettings.getHighDisplayBrightnessThresholds(); mConfigParameterProvider.getHighDisplayBrightnessThresholds();
int[] highAmbientBrightnessThresholds = int[] highAmbientBrightnessThresholds =
mDeviceConfigDisplaySettings.getHighAmbientBrightnessThresholds(); mConfigParameterProvider.getHighAmbientBrightnessThresholds();
if (highDisplayBrightnessThresholds != null && highAmbientBrightnessThresholds != null if (highDisplayBrightnessThresholds != null && highAmbientBrightnessThresholds != null
&& highDisplayBrightnessThresholds.length && highDisplayBrightnessThresholds.length
@@ -1738,14 +1740,12 @@ public class DisplayModeDirector {
mHighAmbientBrightnessThresholds = highAmbientBrightnessThresholds; mHighAmbientBrightnessThresholds = highAmbientBrightnessThresholds;
} }
final int refreshRateInLowZone = mDeviceConfigDisplaySettings final int refreshRateInLowZone = mConfigParameterProvider.getRefreshRateInLowZone();
.getRefreshRateInLowZone();
if (refreshRateInLowZone != -1) { if (refreshRateInLowZone != -1) {
mRefreshRateInLowZone = refreshRateInLowZone; mRefreshRateInLowZone = refreshRateInLowZone;
} }
final int refreshRateInHighZone = mDeviceConfigDisplaySettings final int refreshRateInHighZone = mConfigParameterProvider.getRefreshRateInHighZone();
.getRefreshRateInHighZone();
if (refreshRateInHighZone != -1) { if (refreshRateInHighZone != -1) {
mRefreshRateInHighZone = refreshRateInHighZone; mRefreshRateInHighZone = refreshRateInHighZone;
} }
@@ -1799,15 +1799,15 @@ public class DisplayModeDirector {
displayDeviceConfig = mDefaultDisplayDeviceConfig; displayDeviceConfig = mDefaultDisplayDeviceConfig;
} }
mLowDisplayBrightnessThresholds = loadBrightnessThresholds( mLowDisplayBrightnessThresholds = loadBrightnessThresholds(
() -> mDeviceConfigDisplaySettings.getLowDisplayBrightnessThresholds(), () -> mConfigParameterProvider.getLowDisplayBrightnessThresholds(),
() -> displayDeviceConfig.getLowDisplayBrightnessThresholds(), () -> displayDeviceConfig.getLowDisplayBrightnessThresholds(),
R.array.config_brightnessThresholdsOfPeakRefreshRate, R.array.config_brightnessThresholdsOfPeakRefreshRate,
displayDeviceConfig, /* attemptLoadingFromDeviceConfig= */ false); displayDeviceConfig, /* attemptReadFromFeatureParams= */ false);
mLowAmbientBrightnessThresholds = loadBrightnessThresholds( mLowAmbientBrightnessThresholds = loadBrightnessThresholds(
() -> mDeviceConfigDisplaySettings.getLowAmbientBrightnessThresholds(), () -> mConfigParameterProvider.getLowAmbientBrightnessThresholds(),
() -> displayDeviceConfig.getLowAmbientBrightnessThresholds(), () -> displayDeviceConfig.getLowAmbientBrightnessThresholds(),
R.array.config_ambientThresholdsOfPeakRefreshRate, R.array.config_ambientThresholdsOfPeakRefreshRate,
displayDeviceConfig, /* attemptLoadingFromDeviceConfig= */ false); displayDeviceConfig, /* attemptReadFromFeatureParams= */ false);
} }
restartObserver(); restartObserver();
} }
@@ -1822,7 +1822,7 @@ public class DisplayModeDirector {
// from there. // from there.
synchronized (mLock) { synchronized (mLock) {
loadRefreshRateInLowZone(mDefaultDisplayDeviceConfig, loadRefreshRateInLowZone(mDefaultDisplayDeviceConfig,
/* attemptLoadingFromDeviceConfig= */ false); /* attemptReadFromFeatureParams= */ false);
} }
restartObserver(); restartObserver();
} else if (refreshRate != mRefreshRateInLowZone) { } else if (refreshRate != mRefreshRateInLowZone) {
@@ -1843,15 +1843,15 @@ public class DisplayModeDirector {
displayDeviceConfig = mDefaultDisplayDeviceConfig; displayDeviceConfig = mDefaultDisplayDeviceConfig;
} }
mHighDisplayBrightnessThresholds = loadBrightnessThresholds( mHighDisplayBrightnessThresholds = loadBrightnessThresholds(
() -> mDeviceConfigDisplaySettings.getHighDisplayBrightnessThresholds(), () -> mConfigParameterProvider.getLowDisplayBrightnessThresholds(),
() -> displayDeviceConfig.getHighDisplayBrightnessThresholds(), () -> displayDeviceConfig.getHighDisplayBrightnessThresholds(),
R.array.config_highDisplayBrightnessThresholdsOfFixedRefreshRate, R.array.config_highDisplayBrightnessThresholdsOfFixedRefreshRate,
displayDeviceConfig, /* attemptLoadingFromDeviceConfig= */ false); displayDeviceConfig, /* attemptReadFromFeatureParams= */ false);
mHighAmbientBrightnessThresholds = loadBrightnessThresholds( mHighAmbientBrightnessThresholds = loadBrightnessThresholds(
() -> mDeviceConfigDisplaySettings.getHighAmbientBrightnessThresholds(), () -> mConfigParameterProvider.getHighAmbientBrightnessThresholds(),
() -> displayDeviceConfig.getHighAmbientBrightnessThresholds(), () -> displayDeviceConfig.getHighAmbientBrightnessThresholds(),
R.array.config_highAmbientBrightnessThresholdsOfFixedRefreshRate, R.array.config_highAmbientBrightnessThresholdsOfFixedRefreshRate,
displayDeviceConfig, /* attemptLoadingFromDeviceConfig= */ false); displayDeviceConfig, /* attemptReadFromFeatureParams= */ false);
} }
restartObserver(); restartObserver();
} }
@@ -1866,7 +1866,7 @@ public class DisplayModeDirector {
// from there. // from there.
synchronized (mLock) { synchronized (mLock) {
loadRefreshRateInHighZone(mDefaultDisplayDeviceConfig, loadRefreshRateInHighZone(mDefaultDisplayDeviceConfig,
/* attemptLoadingFromDeviceConfig= */ false); /* attemptReadFromFeatureParams= */ false);
} }
restartObserver(); restartObserver();
} else if (refreshRate != mRefreshRateInHighZone) { } else if (refreshRate != mRefreshRateInHighZone) {
@@ -2675,113 +2675,55 @@ public class DisplayModeDirector {
private class DeviceConfigDisplaySettings implements DeviceConfig.OnPropertiesChangedListener { private class DeviceConfigDisplaySettings implements DeviceConfig.OnPropertiesChangedListener {
public void startListening() { public void startListening() {
mDeviceConfig.addOnPropertiesChangedListener(DeviceConfig.NAMESPACE_DISPLAY_MANAGER, mConfigParameterProvider.addOnPropertiesChangedListener(
BackgroundThread.getExecutor(), this); BackgroundThread.getExecutor(), this);
} }
/* private int getRefreshRateInHbmHdr(DisplayDeviceConfig displayDeviceConfig) {
* Return null if no such property or wrong format (not comma separated integers). return getRefreshRate(
*/ () -> mConfigParameterProvider.getRefreshRateInHbmHdr(),
public int[] getLowDisplayBrightnessThresholds() { () -> displayDeviceConfig.getDefaultRefreshRateInHbmHdr(),
return getIntArrayProperty( R.integer.config_defaultRefreshRateInHbmHdr,
DisplayManager.DeviceConfig displayDeviceConfig
.KEY_FIXED_REFRESH_RATE_LOW_DISPLAY_BRIGHTNESS_THRESHOLDS); );
} }
/* private int getRefreshRateInHbmSunlight(DisplayDeviceConfig displayDeviceConfig) {
* Return null if no such property or wrong format (not comma separated integers). return getRefreshRate(
*/ () -> mConfigParameterProvider.getRefreshRateInHbmSunlight(),
public int[] getLowAmbientBrightnessThresholds() { () -> displayDeviceConfig.getDefaultRefreshRateInHbmSunlight(),
return getIntArrayProperty( R.integer.config_defaultRefreshRateInHbmSunlight,
DisplayManager.DeviceConfig displayDeviceConfig
.KEY_FIXED_REFRESH_RATE_LOW_AMBIENT_BRIGHTNESS_THRESHOLDS); );
} }
public int getRefreshRateInLowZone() { private int getRefreshRate(IntSupplier fromConfigPram, IntSupplier fromDisplayDeviceConfig,
return mDeviceConfig.getInt( @IntegerRes int configKey, DisplayDeviceConfig displayDeviceConfig) {
DeviceConfig.NAMESPACE_DISPLAY_MANAGER, int refreshRate = -1;
DisplayManager.DeviceConfig.KEY_REFRESH_RATE_IN_LOW_ZONE, -1);
}
/*
* Return null if no such property or wrong format (not comma separated integers).
*/
public int[] getHighDisplayBrightnessThresholds() {
return getIntArrayProperty(
DisplayManager.DeviceConfig
.KEY_FIXED_REFRESH_RATE_HIGH_DISPLAY_BRIGHTNESS_THRESHOLDS);
}
/*
* Return null if no such property or wrong format (not comma separated integers).
*/
public int[] getHighAmbientBrightnessThresholds() {
return getIntArrayProperty(
DisplayManager.DeviceConfig
.KEY_FIXED_REFRESH_RATE_HIGH_AMBIENT_BRIGHTNESS_THRESHOLDS);
}
public int getRefreshRateInHighZone() {
return mDeviceConfig.getInt(
DeviceConfig.NAMESPACE_DISPLAY_MANAGER,
DisplayManager.DeviceConfig.KEY_REFRESH_RATE_IN_HIGH_ZONE,
-1);
}
public int getRefreshRateInHbmHdr(DisplayDeviceConfig displayDeviceConfig) {
int refreshRate =
(displayDeviceConfig == null) ? mContext.getResources().getInteger(
R.integer.config_defaultRefreshRateInHbmHdr)
: displayDeviceConfig.getDefaultRefreshRateInHbmHdr();
try { try {
refreshRate = mDeviceConfig.getInt(DeviceConfig.NAMESPACE_DISPLAY_MANAGER, refreshRate = fromConfigPram.getAsInt();
DisplayManager.DeviceConfig.KEY_REFRESH_RATE_IN_HBM_HDR, } catch (NullPointerException npe) {
refreshRate);
} catch (NullPointerException e) {
// Do Nothing // Do Nothing
} }
return refreshRate; if (refreshRate == -1) {
} refreshRate = (displayDeviceConfig == null)
? mContext.getResources().getInteger(configKey)
public int getRefreshRateInHbmSunlight(DisplayDeviceConfig displayDeviceConfig) { : fromDisplayDeviceConfig.getAsInt();
int refreshRate =
(displayDeviceConfig == null) ? mContext.getResources()
.getInteger(R.integer.config_defaultRefreshRateInHbmSunlight)
: displayDeviceConfig.getDefaultRefreshRateInHbmSunlight();
try {
refreshRate = mDeviceConfig.getInt(DeviceConfig.NAMESPACE_DISPLAY_MANAGER,
DisplayManager.DeviceConfig.KEY_REFRESH_RATE_IN_HBM_SUNLIGHT,
refreshRate);
} catch (NullPointerException e) {
// Do Nothing
} }
return refreshRate; return refreshRate;
} }
/*
* Return null if no such property
*/
public Float getDefaultPeakRefreshRate() {
float defaultPeakRefreshRate = mDeviceConfig.getFloat(
DeviceConfig.NAMESPACE_DISPLAY_MANAGER,
DisplayManager.DeviceConfig.KEY_PEAK_REFRESH_RATE_DEFAULT, -1);
if (defaultPeakRefreshRate == -1) {
return null;
}
return defaultPeakRefreshRate;
}
@Override @Override
public void onPropertiesChanged(@NonNull DeviceConfig.Properties properties) { public void onPropertiesChanged(@NonNull DeviceConfig.Properties properties) {
Float defaultPeakRefreshRate = getDefaultPeakRefreshRate(); float defaultPeakRefreshRate = mConfigParameterProvider.getPeakRefreshRateDefault();
mHandler.obtainMessage(MSG_DEFAULT_PEAK_REFRESH_RATE_CHANGED, mHandler.obtainMessage(MSG_DEFAULT_PEAK_REFRESH_RATE_CHANGED,
defaultPeakRefreshRate).sendToTarget(); defaultPeakRefreshRate == -1 ? null : defaultPeakRefreshRate).sendToTarget();
int[] lowDisplayBrightnessThresholds = getLowDisplayBrightnessThresholds(); int[] lowDisplayBrightnessThresholds =
int[] lowAmbientBrightnessThresholds = getLowAmbientBrightnessThresholds(); mConfigParameterProvider.getLowDisplayBrightnessThresholds();
final int refreshRateInLowZone = getRefreshRateInLowZone(); int[] lowAmbientBrightnessThresholds =
mConfigParameterProvider.getLowAmbientBrightnessThresholds();
final int refreshRateInLowZone = mConfigParameterProvider.getRefreshRateInLowZone();
mHandler.obtainMessage(MSG_LOW_BRIGHTNESS_THRESHOLDS_CHANGED, mHandler.obtainMessage(MSG_LOW_BRIGHTNESS_THRESHOLDS_CHANGED,
new Pair<>(lowDisplayBrightnessThresholds, lowAmbientBrightnessThresholds)) new Pair<>(lowDisplayBrightnessThresholds, lowAmbientBrightnessThresholds))
@@ -2790,9 +2732,11 @@ public class DisplayModeDirector {
mHandler.obtainMessage(MSG_REFRESH_RATE_IN_LOW_ZONE_CHANGED, refreshRateInLowZone, mHandler.obtainMessage(MSG_REFRESH_RATE_IN_LOW_ZONE_CHANGED, refreshRateInLowZone,
0).sendToTarget(); 0).sendToTarget();
int[] highDisplayBrightnessThresholds = getHighDisplayBrightnessThresholds(); int[] highDisplayBrightnessThresholds =
int[] highAmbientBrightnessThresholds = getHighAmbientBrightnessThresholds(); mConfigParameterProvider.getHighDisplayBrightnessThresholds();
final int refreshRateInHighZone = getRefreshRateInHighZone(); int[] highAmbientBrightnessThresholds =
mConfigParameterProvider.getHighAmbientBrightnessThresholds();
final int refreshRateInHighZone = mConfigParameterProvider.getRefreshRateInHighZone();
mHandler.obtainMessage(MSG_HIGH_BRIGHTNESS_THRESHOLDS_CHANGED, mHandler.obtainMessage(MSG_HIGH_BRIGHTNESS_THRESHOLDS_CHANGED,
new Pair<>(highDisplayBrightnessThresholds, highAmbientBrightnessThresholds)) new Pair<>(highDisplayBrightnessThresholds, highAmbientBrightnessThresholds))
@@ -2814,33 +2758,6 @@ public class DisplayModeDirector {
.sendToTarget(); .sendToTarget();
} }
} }
private int[] getIntArrayProperty(String prop) {
String strArray = mDeviceConfig.getString(DeviceConfig.NAMESPACE_DISPLAY_MANAGER, prop,
null);
if (strArray != null) {
return parseIntArray(strArray);
}
return null;
}
private int[] parseIntArray(@NonNull String strArray) {
String[] items = strArray.split(",");
int[] array = new int[items.length];
try {
for (int i = 0; i < array.length; i++) {
array[i] = Integer.parseInt(items[i]);
}
} catch (NumberFormatException e) {
Slog.e(TAG, "Incorrect format for array: '" + strArray + "'", e);
array = null;
}
return array;
}
} }
interface Injector { interface Injector {