Loading core/java/android/hardware/display/DisplayManager.java +1 −0 Original line number Original line Diff line number Diff line Loading @@ -941,6 +941,7 @@ public final class DisplayManager { */ */ String KEY_PEAK_REFRESH_RATE_DEFAULT = "peak_refresh_rate_default"; String KEY_PEAK_REFRESH_RATE_DEFAULT = "peak_refresh_rate_default"; // TODO(b/162536543): rename it once it is proved not harmful for users. /** /** * Key for controlling which packages are explicitly blocked from running at refresh rates * Key for controlling which packages are explicitly blocked from running at refresh rates * higher than 60hz. An app may be added to this list if they exhibit performance issues at * higher than 60hz. An app may be added to this list if they exhibit performance issues at Loading services/core/java/com/android/server/wm/DisplayPolicy.java +1 −1 Original line number Original line Diff line number Diff line Loading @@ -649,7 +649,7 @@ public class DisplayPolicy { mRefreshRatePolicy = new RefreshRatePolicy(mService, mRefreshRatePolicy = new RefreshRatePolicy(mService, mDisplayContent.getDisplayInfo(), mDisplayContent.getDisplayInfo(), mService.mHighRefreshRateBlacklist); mService.mHighRefreshRateDenylist); mGestureNavigationSettingsObserver = new GestureNavigationSettingsObserver(mHandler, mGestureNavigationSettingsObserver = new GestureNavigationSettingsObserver(mHandler, mContext, () -> { mContext, () -> { Loading services/core/java/com/android/server/wm/HighRefreshRateBlacklist.java→services/core/java/com/android/server/wm/HighRefreshRateDenylist.java +19 −19 Original line number Original line Diff line number Diff line Loading @@ -34,62 +34,62 @@ import java.io.PrintWriter; /** /** * A Denylist for packages that should force the display out of high refresh rate. * A Denylist for packages that should force the display out of high refresh rate. */ */ class HighRefreshRateBlacklist { class HighRefreshRateDenylist { private final ArraySet<String> mBlacklistedPackages = new ArraySet<>(); private final ArraySet<String> mDenylistedPackages = new ArraySet<>(); @NonNull @NonNull private final String[] mDefaultBlacklist; private final String[] mDefaultDenylist; private final Object mLock = new Object(); private final Object mLock = new Object(); private DeviceConfigInterface mDeviceConfig; private DeviceConfigInterface mDeviceConfig; private OnPropertiesChangedListener mListener = new OnPropertiesChangedListener(); private OnPropertiesChangedListener mListener = new OnPropertiesChangedListener(); static HighRefreshRateBlacklist create(@NonNull Resources r) { static HighRefreshRateDenylist create(@NonNull Resources r) { return new HighRefreshRateBlacklist(r, DeviceConfigInterface.REAL); return new HighRefreshRateDenylist(r, DeviceConfigInterface.REAL); } } @VisibleForTesting @VisibleForTesting HighRefreshRateBlacklist(Resources r, DeviceConfigInterface deviceConfig) { HighRefreshRateDenylist(Resources r, DeviceConfigInterface deviceConfig) { mDefaultBlacklist = r.getStringArray(R.array.config_highRefreshRateBlacklist); mDefaultDenylist = r.getStringArray(R.array.config_highRefreshRateBlacklist); mDeviceConfig = deviceConfig; mDeviceConfig = deviceConfig; mDeviceConfig.addOnPropertiesChangedListener(DeviceConfig.NAMESPACE_DISPLAY_MANAGER, mDeviceConfig.addOnPropertiesChangedListener(DeviceConfig.NAMESPACE_DISPLAY_MANAGER, BackgroundThread.getExecutor(), mListener); BackgroundThread.getExecutor(), mListener); final String property = mDeviceConfig.getProperty(DeviceConfig.NAMESPACE_DISPLAY_MANAGER, final String property = mDeviceConfig.getProperty(DeviceConfig.NAMESPACE_DISPLAY_MANAGER, KEY_HIGH_REFRESH_RATE_BLACKLIST); KEY_HIGH_REFRESH_RATE_BLACKLIST); updateBlacklist(property); updateDenylist(property); } } private void updateBlacklist(@Nullable String property) { private void updateDenylist(@Nullable String property) { synchronized (mLock) { synchronized (mLock) { mBlacklistedPackages.clear(); mDenylistedPackages.clear(); if (property != null) { if (property != null) { String[] packages = property.split(","); String[] packages = property.split(","); for (String pkg : packages) { for (String pkg : packages) { String pkgName = pkg.trim(); String pkgName = pkg.trim(); if (!pkgName.isEmpty()) { if (!pkgName.isEmpty()) { mBlacklistedPackages.add(pkgName); mDenylistedPackages.add(pkgName); } } } } } else { } else { // If there's no config, or the config has been deleted, fallback to the device's // If there's no config, or the config has been deleted, fallback to the device's // default denylist // default denylist for (String pkg : mDefaultBlacklist) { for (String pkg : mDefaultDenylist) { mBlacklistedPackages.add(pkg); mDenylistedPackages.add(pkg); } } } } } } } } boolean isBlacklisted(String packageName) { boolean isDenylisted(String packageName) { synchronized (mLock) { synchronized (mLock) { return mBlacklistedPackages.contains(packageName); return mDenylistedPackages.contains(packageName); } } } } void dump(PrintWriter pw) { void dump(PrintWriter pw) { pw.println("High Refresh Rate Blacklist"); pw.println("High Refresh Rate Denylist"); pw.println(" Packages:"); pw.println(" Packages:"); synchronized (mLock) { synchronized (mLock) { for (String pkg : mBlacklistedPackages) { for (String pkg : mDenylistedPackages) { pw.println(" " + pkg); pw.println(" " + pkg); } } } } Loading @@ -100,13 +100,13 @@ class HighRefreshRateBlacklist { void dispose() { void dispose() { mDeviceConfig.removeOnPropertiesChangedListener(mListener); mDeviceConfig.removeOnPropertiesChangedListener(mListener); mDeviceConfig = null; mDeviceConfig = null; mBlacklistedPackages.clear(); mDenylistedPackages.clear(); } } private class OnPropertiesChangedListener implements DeviceConfig.OnPropertiesChangedListener { private class OnPropertiesChangedListener implements DeviceConfig.OnPropertiesChangedListener { public void onPropertiesChanged(@NonNull DeviceConfig.Properties properties) { public void onPropertiesChanged(@NonNull DeviceConfig.Properties properties) { if (properties.getKeyset().contains(KEY_HIGH_REFRESH_RATE_BLACKLIST)) { if (properties.getKeyset().contains(KEY_HIGH_REFRESH_RATE_BLACKLIST)) { updateBlacklist( updateDenylist( properties.getString(KEY_HIGH_REFRESH_RATE_BLACKLIST, null /*default*/)); properties.getString(KEY_HIGH_REFRESH_RATE_BLACKLIST, null /*default*/)); } } } } Loading services/core/java/com/android/server/wm/RefreshRatePolicy.java +4 −4 Original line number Original line Diff line number Diff line Loading @@ -30,7 +30,7 @@ class RefreshRatePolicy { private final int mLowRefreshRateId; private final int mLowRefreshRateId; private final ArraySet<String> mNonHighRefreshRatePackages = new ArraySet<>(); private final ArraySet<String> mNonHighRefreshRatePackages = new ArraySet<>(); private final HighRefreshRateBlacklist mHighRefreshRateBlacklist; private final HighRefreshRateDenylist mHighRefreshRateDenylist; private final WindowManagerService mWmService; private final WindowManagerService mWmService; /** /** Loading @@ -55,9 +55,9 @@ class RefreshRatePolicy { static final int LAYER_PRIORITY_NOT_FOCUSED_WITH_MODE = 2; static final int LAYER_PRIORITY_NOT_FOCUSED_WITH_MODE = 2; RefreshRatePolicy(WindowManagerService wmService, DisplayInfo displayInfo, RefreshRatePolicy(WindowManagerService wmService, DisplayInfo displayInfo, HighRefreshRateBlacklist blacklist) { HighRefreshRateDenylist denylist) { mLowRefreshRateId = findLowRefreshRateModeId(displayInfo); mLowRefreshRateId = findLowRefreshRateModeId(displayInfo); mHighRefreshRateBlacklist = blacklist; mHighRefreshRateDenylist = denylist; mWmService = wmService; mWmService = wmService; } } Loading Loading @@ -108,7 +108,7 @@ class RefreshRatePolicy { } } // If app is denylisted using higher refresh rate, return default (lower) refresh rate // If app is denylisted using higher refresh rate, return default (lower) refresh rate if (mHighRefreshRateBlacklist.isBlacklisted(packageName)) { if (mHighRefreshRateDenylist.isDenylisted(packageName)) { return mLowRefreshRateId; return mLowRefreshRateId; } } return 0; return 0; Loading services/core/java/com/android/server/wm/WindowManagerService.java +3 −3 Original line number Original line Diff line number Diff line Loading @@ -1005,7 +1005,7 @@ public class WindowManagerService extends IWindowManager.Stub final Configuration mTempConfiguration = new Configuration(); final Configuration mTempConfiguration = new Configuration(); final HighRefreshRateBlacklist mHighRefreshRateBlacklist; final HighRefreshRateDenylist mHighRefreshRateDenylist; // If true, only the core apps and services are being launched because the device // If true, only the core apps and services are being launched because the device // is in a special boot mode, such as being encrypted or waiting for a decryption password. // is in a special boot mode, such as being encrypted or waiting for a decryption password. Loading Loading @@ -1302,7 +1302,7 @@ public class WindowManagerService extends IWindowManager.Stub this, mInputManager, mActivityTaskManager, mH.getLooper()); this, mInputManager, mActivityTaskManager, mH.getLooper()); mDragDropController = new DragDropController(this, mH.getLooper()); mDragDropController = new DragDropController(this, mH.getLooper()); mHighRefreshRateBlacklist = HighRefreshRateBlacklist.create(context.getResources()); mHighRefreshRateDenylist = HighRefreshRateDenylist.create(context.getResources()); mConstants = new WindowManagerConstants(this, DeviceConfigInterface.REAL); mConstants = new WindowManagerConstants(this, DeviceConfigInterface.REAL); mConstants.start(new HandlerExecutor(mH)); mConstants.start(new HandlerExecutor(mH)); Loading Loading @@ -5939,7 +5939,7 @@ public class WindowManagerService extends IWindowManager.Stub private void dumpHighRefreshRateBlacklist(PrintWriter pw) { private void dumpHighRefreshRateBlacklist(PrintWriter pw) { pw.println("WINDOW MANAGER HIGH REFRESH RATE BLACKLIST (dumpsys window refresh)"); pw.println("WINDOW MANAGER HIGH REFRESH RATE BLACKLIST (dumpsys window refresh)"); mHighRefreshRateBlacklist.dump(pw); mHighRefreshRateDenylist.dump(pw); } } private void dumpTraceStatus(PrintWriter pw) { private void dumpTraceStatus(PrintWriter pw) { Loading Loading
core/java/android/hardware/display/DisplayManager.java +1 −0 Original line number Original line Diff line number Diff line Loading @@ -941,6 +941,7 @@ public final class DisplayManager { */ */ String KEY_PEAK_REFRESH_RATE_DEFAULT = "peak_refresh_rate_default"; String KEY_PEAK_REFRESH_RATE_DEFAULT = "peak_refresh_rate_default"; // TODO(b/162536543): rename it once it is proved not harmful for users. /** /** * Key for controlling which packages are explicitly blocked from running at refresh rates * Key for controlling which packages are explicitly blocked from running at refresh rates * higher than 60hz. An app may be added to this list if they exhibit performance issues at * higher than 60hz. An app may be added to this list if they exhibit performance issues at Loading
services/core/java/com/android/server/wm/DisplayPolicy.java +1 −1 Original line number Original line Diff line number Diff line Loading @@ -649,7 +649,7 @@ public class DisplayPolicy { mRefreshRatePolicy = new RefreshRatePolicy(mService, mRefreshRatePolicy = new RefreshRatePolicy(mService, mDisplayContent.getDisplayInfo(), mDisplayContent.getDisplayInfo(), mService.mHighRefreshRateBlacklist); mService.mHighRefreshRateDenylist); mGestureNavigationSettingsObserver = new GestureNavigationSettingsObserver(mHandler, mGestureNavigationSettingsObserver = new GestureNavigationSettingsObserver(mHandler, mContext, () -> { mContext, () -> { Loading
services/core/java/com/android/server/wm/HighRefreshRateBlacklist.java→services/core/java/com/android/server/wm/HighRefreshRateDenylist.java +19 −19 Original line number Original line Diff line number Diff line Loading @@ -34,62 +34,62 @@ import java.io.PrintWriter; /** /** * A Denylist for packages that should force the display out of high refresh rate. * A Denylist for packages that should force the display out of high refresh rate. */ */ class HighRefreshRateBlacklist { class HighRefreshRateDenylist { private final ArraySet<String> mBlacklistedPackages = new ArraySet<>(); private final ArraySet<String> mDenylistedPackages = new ArraySet<>(); @NonNull @NonNull private final String[] mDefaultBlacklist; private final String[] mDefaultDenylist; private final Object mLock = new Object(); private final Object mLock = new Object(); private DeviceConfigInterface mDeviceConfig; private DeviceConfigInterface mDeviceConfig; private OnPropertiesChangedListener mListener = new OnPropertiesChangedListener(); private OnPropertiesChangedListener mListener = new OnPropertiesChangedListener(); static HighRefreshRateBlacklist create(@NonNull Resources r) { static HighRefreshRateDenylist create(@NonNull Resources r) { return new HighRefreshRateBlacklist(r, DeviceConfigInterface.REAL); return new HighRefreshRateDenylist(r, DeviceConfigInterface.REAL); } } @VisibleForTesting @VisibleForTesting HighRefreshRateBlacklist(Resources r, DeviceConfigInterface deviceConfig) { HighRefreshRateDenylist(Resources r, DeviceConfigInterface deviceConfig) { mDefaultBlacklist = r.getStringArray(R.array.config_highRefreshRateBlacklist); mDefaultDenylist = r.getStringArray(R.array.config_highRefreshRateBlacklist); mDeviceConfig = deviceConfig; mDeviceConfig = deviceConfig; mDeviceConfig.addOnPropertiesChangedListener(DeviceConfig.NAMESPACE_DISPLAY_MANAGER, mDeviceConfig.addOnPropertiesChangedListener(DeviceConfig.NAMESPACE_DISPLAY_MANAGER, BackgroundThread.getExecutor(), mListener); BackgroundThread.getExecutor(), mListener); final String property = mDeviceConfig.getProperty(DeviceConfig.NAMESPACE_DISPLAY_MANAGER, final String property = mDeviceConfig.getProperty(DeviceConfig.NAMESPACE_DISPLAY_MANAGER, KEY_HIGH_REFRESH_RATE_BLACKLIST); KEY_HIGH_REFRESH_RATE_BLACKLIST); updateBlacklist(property); updateDenylist(property); } } private void updateBlacklist(@Nullable String property) { private void updateDenylist(@Nullable String property) { synchronized (mLock) { synchronized (mLock) { mBlacklistedPackages.clear(); mDenylistedPackages.clear(); if (property != null) { if (property != null) { String[] packages = property.split(","); String[] packages = property.split(","); for (String pkg : packages) { for (String pkg : packages) { String pkgName = pkg.trim(); String pkgName = pkg.trim(); if (!pkgName.isEmpty()) { if (!pkgName.isEmpty()) { mBlacklistedPackages.add(pkgName); mDenylistedPackages.add(pkgName); } } } } } else { } else { // If there's no config, or the config has been deleted, fallback to the device's // If there's no config, or the config has been deleted, fallback to the device's // default denylist // default denylist for (String pkg : mDefaultBlacklist) { for (String pkg : mDefaultDenylist) { mBlacklistedPackages.add(pkg); mDenylistedPackages.add(pkg); } } } } } } } } boolean isBlacklisted(String packageName) { boolean isDenylisted(String packageName) { synchronized (mLock) { synchronized (mLock) { return mBlacklistedPackages.contains(packageName); return mDenylistedPackages.contains(packageName); } } } } void dump(PrintWriter pw) { void dump(PrintWriter pw) { pw.println("High Refresh Rate Blacklist"); pw.println("High Refresh Rate Denylist"); pw.println(" Packages:"); pw.println(" Packages:"); synchronized (mLock) { synchronized (mLock) { for (String pkg : mBlacklistedPackages) { for (String pkg : mDenylistedPackages) { pw.println(" " + pkg); pw.println(" " + pkg); } } } } Loading @@ -100,13 +100,13 @@ class HighRefreshRateBlacklist { void dispose() { void dispose() { mDeviceConfig.removeOnPropertiesChangedListener(mListener); mDeviceConfig.removeOnPropertiesChangedListener(mListener); mDeviceConfig = null; mDeviceConfig = null; mBlacklistedPackages.clear(); mDenylistedPackages.clear(); } } private class OnPropertiesChangedListener implements DeviceConfig.OnPropertiesChangedListener { private class OnPropertiesChangedListener implements DeviceConfig.OnPropertiesChangedListener { public void onPropertiesChanged(@NonNull DeviceConfig.Properties properties) { public void onPropertiesChanged(@NonNull DeviceConfig.Properties properties) { if (properties.getKeyset().contains(KEY_HIGH_REFRESH_RATE_BLACKLIST)) { if (properties.getKeyset().contains(KEY_HIGH_REFRESH_RATE_BLACKLIST)) { updateBlacklist( updateDenylist( properties.getString(KEY_HIGH_REFRESH_RATE_BLACKLIST, null /*default*/)); properties.getString(KEY_HIGH_REFRESH_RATE_BLACKLIST, null /*default*/)); } } } } Loading
services/core/java/com/android/server/wm/RefreshRatePolicy.java +4 −4 Original line number Original line Diff line number Diff line Loading @@ -30,7 +30,7 @@ class RefreshRatePolicy { private final int mLowRefreshRateId; private final int mLowRefreshRateId; private final ArraySet<String> mNonHighRefreshRatePackages = new ArraySet<>(); private final ArraySet<String> mNonHighRefreshRatePackages = new ArraySet<>(); private final HighRefreshRateBlacklist mHighRefreshRateBlacklist; private final HighRefreshRateDenylist mHighRefreshRateDenylist; private final WindowManagerService mWmService; private final WindowManagerService mWmService; /** /** Loading @@ -55,9 +55,9 @@ class RefreshRatePolicy { static final int LAYER_PRIORITY_NOT_FOCUSED_WITH_MODE = 2; static final int LAYER_PRIORITY_NOT_FOCUSED_WITH_MODE = 2; RefreshRatePolicy(WindowManagerService wmService, DisplayInfo displayInfo, RefreshRatePolicy(WindowManagerService wmService, DisplayInfo displayInfo, HighRefreshRateBlacklist blacklist) { HighRefreshRateDenylist denylist) { mLowRefreshRateId = findLowRefreshRateModeId(displayInfo); mLowRefreshRateId = findLowRefreshRateModeId(displayInfo); mHighRefreshRateBlacklist = blacklist; mHighRefreshRateDenylist = denylist; mWmService = wmService; mWmService = wmService; } } Loading Loading @@ -108,7 +108,7 @@ class RefreshRatePolicy { } } // If app is denylisted using higher refresh rate, return default (lower) refresh rate // If app is denylisted using higher refresh rate, return default (lower) refresh rate if (mHighRefreshRateBlacklist.isBlacklisted(packageName)) { if (mHighRefreshRateDenylist.isDenylisted(packageName)) { return mLowRefreshRateId; return mLowRefreshRateId; } } return 0; return 0; Loading
services/core/java/com/android/server/wm/WindowManagerService.java +3 −3 Original line number Original line Diff line number Diff line Loading @@ -1005,7 +1005,7 @@ public class WindowManagerService extends IWindowManager.Stub final Configuration mTempConfiguration = new Configuration(); final Configuration mTempConfiguration = new Configuration(); final HighRefreshRateBlacklist mHighRefreshRateBlacklist; final HighRefreshRateDenylist mHighRefreshRateDenylist; // If true, only the core apps and services are being launched because the device // If true, only the core apps and services are being launched because the device // is in a special boot mode, such as being encrypted or waiting for a decryption password. // is in a special boot mode, such as being encrypted or waiting for a decryption password. Loading Loading @@ -1302,7 +1302,7 @@ public class WindowManagerService extends IWindowManager.Stub this, mInputManager, mActivityTaskManager, mH.getLooper()); this, mInputManager, mActivityTaskManager, mH.getLooper()); mDragDropController = new DragDropController(this, mH.getLooper()); mDragDropController = new DragDropController(this, mH.getLooper()); mHighRefreshRateBlacklist = HighRefreshRateBlacklist.create(context.getResources()); mHighRefreshRateDenylist = HighRefreshRateDenylist.create(context.getResources()); mConstants = new WindowManagerConstants(this, DeviceConfigInterface.REAL); mConstants = new WindowManagerConstants(this, DeviceConfigInterface.REAL); mConstants.start(new HandlerExecutor(mH)); mConstants.start(new HandlerExecutor(mH)); Loading Loading @@ -5939,7 +5939,7 @@ public class WindowManagerService extends IWindowManager.Stub private void dumpHighRefreshRateBlacklist(PrintWriter pw) { private void dumpHighRefreshRateBlacklist(PrintWriter pw) { pw.println("WINDOW MANAGER HIGH REFRESH RATE BLACKLIST (dumpsys window refresh)"); pw.println("WINDOW MANAGER HIGH REFRESH RATE BLACKLIST (dumpsys window refresh)"); mHighRefreshRateBlacklist.dump(pw); mHighRefreshRateDenylist.dump(pw); } } private void dumpTraceStatus(PrintWriter pw) { private void dumpTraceStatus(PrintWriter pw) { Loading