Loading core/java/android/provider/Settings.java +8 −0 Original line number Original line Diff line number Diff line Loading @@ -3476,6 +3476,14 @@ public final class Settings { } } }; }; /** * The user selected min refresh rate in frames per second. * * If this isn't set, 0 will be used. * @hide */ public static final String MIN_REFRESH_RATE = "min_refresh_rate"; /** /** * The user selected peak refresh rate in frames per second. * The user selected peak refresh rate in frames per second. * * Loading core/tests/coretests/src/android/provider/SettingsBackupTest.java +1 −0 Original line number Original line Diff line number Diff line Loading @@ -93,6 +93,7 @@ public class SettingsBackupTest { Settings.System.VOLUME_VOICE, // deprecated since API 2? Settings.System.VOLUME_VOICE, // deprecated since API 2? Settings.System.WHEN_TO_MAKE_WIFI_CALLS, // bug? Settings.System.WHEN_TO_MAKE_WIFI_CALLS, // bug? Settings.System.WINDOW_ORIENTATION_LISTENER_LOG, // used for debugging only Settings.System.WINDOW_ORIENTATION_LISTENER_LOG, // used for debugging only Settings.System.MIN_REFRESH_RATE, // depends on hardware capabilities Settings.System.PEAK_REFRESH_RATE // depends on hardware capabilities Settings.System.PEAK_REFRESH_RATE // depends on hardware capabilities ); ); Loading services/core/java/com/android/server/display/DisplayModeDirector.java +52 −24 Original line number Original line Diff line number Diff line Loading @@ -525,8 +525,10 @@ public class DisplayModeDirector { } } private final class SettingsObserver extends ContentObserver { private final class SettingsObserver extends ContentObserver { private final Uri mRefreshRateSetting = private final Uri mPeakRefreshRateSetting = Settings.System.getUriFor(Settings.System.PEAK_REFRESH_RATE); Settings.System.getUriFor(Settings.System.PEAK_REFRESH_RATE); private final Uri mMinRefreshRateSetting = Settings.System.getUriFor(Settings.System.MIN_REFRESH_RATE); private final Uri mLowPowerModeSetting = private final Uri mLowPowerModeSetting = Settings.Global.getUriFor(Settings.Global.LOW_POWER_MODE); Settings.Global.getUriFor(Settings.Global.LOW_POWER_MODE); Loading @@ -542,7 +544,9 @@ public class DisplayModeDirector { public void observe() { public void observe() { final ContentResolver cr = mContext.getContentResolver(); final ContentResolver cr = mContext.getContentResolver(); cr.registerContentObserver(mRefreshRateSetting, false /*notifyDescendants*/, this, cr.registerContentObserver(mPeakRefreshRateSetting, false /*notifyDescendants*/, this, UserHandle.USER_SYSTEM); cr.registerContentObserver(mMinRefreshRateSetting, false /*notifyDescendants*/, this, UserHandle.USER_SYSTEM); UserHandle.USER_SYSTEM); cr.registerContentObserver(mLowPowerModeSetting, false /*notifyDescendants*/, this, cr.registerContentObserver(mLowPowerModeSetting, false /*notifyDescendants*/, this, UserHandle.USER_SYSTEM); UserHandle.USER_SYSTEM); Loading Loading @@ -576,7 +580,8 @@ public class DisplayModeDirector { @Override @Override public void onChange(boolean selfChange, Uri uri, int userId) { public void onChange(boolean selfChange, Uri uri, int userId) { synchronized (mLock) { synchronized (mLock) { if (mRefreshRateSetting.equals(uri)) { if (mPeakRefreshRateSetting.equals(uri) || mMinRefreshRateSetting.equals(uri)) { updateRefreshRateSettingLocked(); updateRefreshRateSettingLocked(); } else if (mLowPowerModeSetting.equals(uri)) { } else if (mLowPowerModeSetting.equals(uri)) { updateLowPowerModeSettingLocked(); updateLowPowerModeSettingLocked(); Loading @@ -594,15 +599,22 @@ public class DisplayModeDirector { vote = null; vote = null; } } updateVoteLocked(Vote.PRIORITY_LOW_POWER_MODE, vote); updateVoteLocked(Vote.PRIORITY_LOW_POWER_MODE, vote); mBrightnessObserver.onLowPowerModeEnabled(inLowPowerMode); mBrightnessObserver.onLowPowerModeEnabledLocked(inLowPowerMode); } } private void updateRefreshRateSettingLocked() { private void updateRefreshRateSettingLocked() { float minRefreshRate = Settings.System.getFloat(mContext.getContentResolver(), Settings.System.MIN_REFRESH_RATE, 0f); float peakRefreshRate = Settings.System.getFloat(mContext.getContentResolver(), float peakRefreshRate = Settings.System.getFloat(mContext.getContentResolver(), Settings.System.PEAK_REFRESH_RATE, mDefaultPeakRefreshRate); Settings.System.PEAK_REFRESH_RATE, mDefaultPeakRefreshRate); Vote vote = Vote.forRefreshRates(0f, peakRefreshRate); if (peakRefreshRate < minRefreshRate) { peakRefreshRate = minRefreshRate; } Vote vote = Vote.forRefreshRates(minRefreshRate, peakRefreshRate); updateVoteLocked(Vote.PRIORITY_USER_SETTING_REFRESH_RATE, vote); updateVoteLocked(Vote.PRIORITY_USER_SETTING_REFRESH_RATE, vote); mBrightnessObserver.onPeakRefreshRateEnabled(peakRefreshRate > 60f); mBrightnessObserver.onRefreshRateSettingChangedLocked(minRefreshRate, peakRefreshRate); } } public void dumpLocked(PrintWriter pw) { public void dumpLocked(PrintWriter pw) { Loading Loading @@ -781,10 +793,10 @@ public class DisplayModeDirector { private final ScreenStateReceiver mScreenStateReceiver; private final ScreenStateReceiver mScreenStateReceiver; // Enable light sensor only when mShouldObserveAmbientChange is true, screen is on, peak // Enable light sensor only when mShouldObserveAmbientChange is true, screen is on, peak // refresh rate enabled and low power mode off. After initialization, these states will // refresh rate changeable and low power mode off. After initialization, these states will // be updated from the same handler thread. // be updated from the same handler thread. private boolean mScreenOn = false; private boolean mScreenOn = false; private boolean mPeakRefreshRateEnabled = false; private boolean mRefreshRateChangeable = false; private boolean mLowPowerModeEnabled = false; private boolean mLowPowerModeEnabled = false; BrightnessObserver(Context context, Handler handler) { BrightnessObserver(Context context, Handler handler) { Loading Loading @@ -817,14 +829,19 @@ public class DisplayModeDirector { mDeviceConfigDisplaySettings.startListening(); mDeviceConfigDisplaySettings.startListening(); } } public void onPeakRefreshRateEnabled(boolean b) { public void onRefreshRateSettingChangedLocked(float min, float max) { if (mPeakRefreshRateEnabled != b) { boolean changeable = (max - min > 1f && max > 60f); mPeakRefreshRateEnabled = b; if (mRefreshRateChangeable != changeable) { mRefreshRateChangeable = changeable; updateSensorStatus(); updateSensorStatus(); if (!changeable) { // Revoke previous vote from BrightnessObserver updateVoteLocked(Vote.PRIORITY_LOW_BRIGHTNESS, null); } } } } } public void onLowPowerModeEnabled(boolean b) { public void onLowPowerModeEnabledLocked(boolean b) { if (mLowPowerModeEnabled != b) { if (mLowPowerModeEnabled != b) { mLowPowerModeEnabled = b; mLowPowerModeEnabled = b; updateSensorStatus(); updateSensorStatus(); Loading Loading @@ -862,9 +879,11 @@ public class DisplayModeDirector { @Override @Override public void onChange(boolean selfChange, Uri uri, int userId) { public void onChange(boolean selfChange, Uri uri, int userId) { synchronized (mLock) { synchronized (mLock) { if (mRefreshRateChangeable) { onBrightnessChangedLocked(); onBrightnessChangedLocked(); } } } } } private void restartObserver() { private void restartObserver() { mShouldObserveDisplayChange = checkShouldObserve(mDisplayBrightnessThresholds); mShouldObserveDisplayChange = checkShouldObserve(mDisplayBrightnessThresholds); Loading Loading @@ -920,12 +939,13 @@ public class DisplayModeDirector { mScreenStateReceiver.unregister(); mScreenStateReceiver.unregister(); } } if (mRefreshRateChangeable) { updateSensorStatus(); updateSensorStatus(); synchronized (mLock) { synchronized (mLock) { onBrightnessChangedLocked(); onBrightnessChangedLocked(); } } } } } /** /** * Checks to see if at least one value is positive, in which case it is necessary to listen * Checks to see if at least one value is positive, in which case it is necessary to listen Loading Loading @@ -991,7 +1011,7 @@ public class DisplayModeDirector { } } if (mShouldObserveAmbientChange && mScreenOn && !mLowPowerModeEnabled if (mShouldObserveAmbientChange && mScreenOn && !mLowPowerModeEnabled && mPeakRefreshRateEnabled) { && mRefreshRateChangeable) { mSensorManager.registerListener(mLightSensorListener, mSensorManager.registerListener(mLightSensorListener, mLightSensor, LIGHT_SENSOR_RATE_MS * 1000, mHandler); mLightSensor, LIGHT_SENSOR_RATE_MS * 1000, mHandler); } else { } else { Loading Loading @@ -1081,6 +1101,8 @@ public class DisplayModeDirector { private final class ScreenStateReceiver extends BroadcastReceiver { private final class ScreenStateReceiver extends BroadcastReceiver { final Context mContext; final Context mContext; boolean mRegistered; public ScreenStateReceiver(Context context) { public ScreenStateReceiver(Context context) { mContext = context; mContext = context; } } Loading @@ -1091,15 +1113,21 @@ public class DisplayModeDirector { } } public void register() { public void register() { if (!mRegistered) { IntentFilter filter = new IntentFilter(); IntentFilter filter = new IntentFilter(); filter.addAction(Intent.ACTION_SCREEN_OFF); filter.addAction(Intent.ACTION_SCREEN_OFF); filter.addAction(Intent.ACTION_SCREEN_ON); filter.addAction(Intent.ACTION_SCREEN_ON); filter.setPriority(IntentFilter.SYSTEM_HIGH_PRIORITY); filter.setPriority(IntentFilter.SYSTEM_HIGH_PRIORITY); mContext.registerReceiver(this, filter, null, mHandler); mContext.registerReceiver(this, filter, null, mHandler); mRegistered = true; } } } public void unregister() { public void unregister() { if (mRegistered) { mContext.unregisterReceiver(this); mContext.unregisterReceiver(this); mRegistered = false; } } } } } } } Loading Loading
core/java/android/provider/Settings.java +8 −0 Original line number Original line Diff line number Diff line Loading @@ -3476,6 +3476,14 @@ public final class Settings { } } }; }; /** * The user selected min refresh rate in frames per second. * * If this isn't set, 0 will be used. * @hide */ public static final String MIN_REFRESH_RATE = "min_refresh_rate"; /** /** * The user selected peak refresh rate in frames per second. * The user selected peak refresh rate in frames per second. * * Loading
core/tests/coretests/src/android/provider/SettingsBackupTest.java +1 −0 Original line number Original line Diff line number Diff line Loading @@ -93,6 +93,7 @@ public class SettingsBackupTest { Settings.System.VOLUME_VOICE, // deprecated since API 2? Settings.System.VOLUME_VOICE, // deprecated since API 2? Settings.System.WHEN_TO_MAKE_WIFI_CALLS, // bug? Settings.System.WHEN_TO_MAKE_WIFI_CALLS, // bug? Settings.System.WINDOW_ORIENTATION_LISTENER_LOG, // used for debugging only Settings.System.WINDOW_ORIENTATION_LISTENER_LOG, // used for debugging only Settings.System.MIN_REFRESH_RATE, // depends on hardware capabilities Settings.System.PEAK_REFRESH_RATE // depends on hardware capabilities Settings.System.PEAK_REFRESH_RATE // depends on hardware capabilities ); ); Loading
services/core/java/com/android/server/display/DisplayModeDirector.java +52 −24 Original line number Original line Diff line number Diff line Loading @@ -525,8 +525,10 @@ public class DisplayModeDirector { } } private final class SettingsObserver extends ContentObserver { private final class SettingsObserver extends ContentObserver { private final Uri mRefreshRateSetting = private final Uri mPeakRefreshRateSetting = Settings.System.getUriFor(Settings.System.PEAK_REFRESH_RATE); Settings.System.getUriFor(Settings.System.PEAK_REFRESH_RATE); private final Uri mMinRefreshRateSetting = Settings.System.getUriFor(Settings.System.MIN_REFRESH_RATE); private final Uri mLowPowerModeSetting = private final Uri mLowPowerModeSetting = Settings.Global.getUriFor(Settings.Global.LOW_POWER_MODE); Settings.Global.getUriFor(Settings.Global.LOW_POWER_MODE); Loading @@ -542,7 +544,9 @@ public class DisplayModeDirector { public void observe() { public void observe() { final ContentResolver cr = mContext.getContentResolver(); final ContentResolver cr = mContext.getContentResolver(); cr.registerContentObserver(mRefreshRateSetting, false /*notifyDescendants*/, this, cr.registerContentObserver(mPeakRefreshRateSetting, false /*notifyDescendants*/, this, UserHandle.USER_SYSTEM); cr.registerContentObserver(mMinRefreshRateSetting, false /*notifyDescendants*/, this, UserHandle.USER_SYSTEM); UserHandle.USER_SYSTEM); cr.registerContentObserver(mLowPowerModeSetting, false /*notifyDescendants*/, this, cr.registerContentObserver(mLowPowerModeSetting, false /*notifyDescendants*/, this, UserHandle.USER_SYSTEM); UserHandle.USER_SYSTEM); Loading Loading @@ -576,7 +580,8 @@ public class DisplayModeDirector { @Override @Override public void onChange(boolean selfChange, Uri uri, int userId) { public void onChange(boolean selfChange, Uri uri, int userId) { synchronized (mLock) { synchronized (mLock) { if (mRefreshRateSetting.equals(uri)) { if (mPeakRefreshRateSetting.equals(uri) || mMinRefreshRateSetting.equals(uri)) { updateRefreshRateSettingLocked(); updateRefreshRateSettingLocked(); } else if (mLowPowerModeSetting.equals(uri)) { } else if (mLowPowerModeSetting.equals(uri)) { updateLowPowerModeSettingLocked(); updateLowPowerModeSettingLocked(); Loading @@ -594,15 +599,22 @@ public class DisplayModeDirector { vote = null; vote = null; } } updateVoteLocked(Vote.PRIORITY_LOW_POWER_MODE, vote); updateVoteLocked(Vote.PRIORITY_LOW_POWER_MODE, vote); mBrightnessObserver.onLowPowerModeEnabled(inLowPowerMode); mBrightnessObserver.onLowPowerModeEnabledLocked(inLowPowerMode); } } private void updateRefreshRateSettingLocked() { private void updateRefreshRateSettingLocked() { float minRefreshRate = Settings.System.getFloat(mContext.getContentResolver(), Settings.System.MIN_REFRESH_RATE, 0f); float peakRefreshRate = Settings.System.getFloat(mContext.getContentResolver(), float peakRefreshRate = Settings.System.getFloat(mContext.getContentResolver(), Settings.System.PEAK_REFRESH_RATE, mDefaultPeakRefreshRate); Settings.System.PEAK_REFRESH_RATE, mDefaultPeakRefreshRate); Vote vote = Vote.forRefreshRates(0f, peakRefreshRate); if (peakRefreshRate < minRefreshRate) { peakRefreshRate = minRefreshRate; } Vote vote = Vote.forRefreshRates(minRefreshRate, peakRefreshRate); updateVoteLocked(Vote.PRIORITY_USER_SETTING_REFRESH_RATE, vote); updateVoteLocked(Vote.PRIORITY_USER_SETTING_REFRESH_RATE, vote); mBrightnessObserver.onPeakRefreshRateEnabled(peakRefreshRate > 60f); mBrightnessObserver.onRefreshRateSettingChangedLocked(minRefreshRate, peakRefreshRate); } } public void dumpLocked(PrintWriter pw) { public void dumpLocked(PrintWriter pw) { Loading Loading @@ -781,10 +793,10 @@ public class DisplayModeDirector { private final ScreenStateReceiver mScreenStateReceiver; private final ScreenStateReceiver mScreenStateReceiver; // Enable light sensor only when mShouldObserveAmbientChange is true, screen is on, peak // Enable light sensor only when mShouldObserveAmbientChange is true, screen is on, peak // refresh rate enabled and low power mode off. After initialization, these states will // refresh rate changeable and low power mode off. After initialization, these states will // be updated from the same handler thread. // be updated from the same handler thread. private boolean mScreenOn = false; private boolean mScreenOn = false; private boolean mPeakRefreshRateEnabled = false; private boolean mRefreshRateChangeable = false; private boolean mLowPowerModeEnabled = false; private boolean mLowPowerModeEnabled = false; BrightnessObserver(Context context, Handler handler) { BrightnessObserver(Context context, Handler handler) { Loading Loading @@ -817,14 +829,19 @@ public class DisplayModeDirector { mDeviceConfigDisplaySettings.startListening(); mDeviceConfigDisplaySettings.startListening(); } } public void onPeakRefreshRateEnabled(boolean b) { public void onRefreshRateSettingChangedLocked(float min, float max) { if (mPeakRefreshRateEnabled != b) { boolean changeable = (max - min > 1f && max > 60f); mPeakRefreshRateEnabled = b; if (mRefreshRateChangeable != changeable) { mRefreshRateChangeable = changeable; updateSensorStatus(); updateSensorStatus(); if (!changeable) { // Revoke previous vote from BrightnessObserver updateVoteLocked(Vote.PRIORITY_LOW_BRIGHTNESS, null); } } } } } public void onLowPowerModeEnabled(boolean b) { public void onLowPowerModeEnabledLocked(boolean b) { if (mLowPowerModeEnabled != b) { if (mLowPowerModeEnabled != b) { mLowPowerModeEnabled = b; mLowPowerModeEnabled = b; updateSensorStatus(); updateSensorStatus(); Loading Loading @@ -862,9 +879,11 @@ public class DisplayModeDirector { @Override @Override public void onChange(boolean selfChange, Uri uri, int userId) { public void onChange(boolean selfChange, Uri uri, int userId) { synchronized (mLock) { synchronized (mLock) { if (mRefreshRateChangeable) { onBrightnessChangedLocked(); onBrightnessChangedLocked(); } } } } } private void restartObserver() { private void restartObserver() { mShouldObserveDisplayChange = checkShouldObserve(mDisplayBrightnessThresholds); mShouldObserveDisplayChange = checkShouldObserve(mDisplayBrightnessThresholds); Loading Loading @@ -920,12 +939,13 @@ public class DisplayModeDirector { mScreenStateReceiver.unregister(); mScreenStateReceiver.unregister(); } } if (mRefreshRateChangeable) { updateSensorStatus(); updateSensorStatus(); synchronized (mLock) { synchronized (mLock) { onBrightnessChangedLocked(); onBrightnessChangedLocked(); } } } } } /** /** * Checks to see if at least one value is positive, in which case it is necessary to listen * Checks to see if at least one value is positive, in which case it is necessary to listen Loading Loading @@ -991,7 +1011,7 @@ public class DisplayModeDirector { } } if (mShouldObserveAmbientChange && mScreenOn && !mLowPowerModeEnabled if (mShouldObserveAmbientChange && mScreenOn && !mLowPowerModeEnabled && mPeakRefreshRateEnabled) { && mRefreshRateChangeable) { mSensorManager.registerListener(mLightSensorListener, mSensorManager.registerListener(mLightSensorListener, mLightSensor, LIGHT_SENSOR_RATE_MS * 1000, mHandler); mLightSensor, LIGHT_SENSOR_RATE_MS * 1000, mHandler); } else { } else { Loading Loading @@ -1081,6 +1101,8 @@ public class DisplayModeDirector { private final class ScreenStateReceiver extends BroadcastReceiver { private final class ScreenStateReceiver extends BroadcastReceiver { final Context mContext; final Context mContext; boolean mRegistered; public ScreenStateReceiver(Context context) { public ScreenStateReceiver(Context context) { mContext = context; mContext = context; } } Loading @@ -1091,15 +1113,21 @@ public class DisplayModeDirector { } } public void register() { public void register() { if (!mRegistered) { IntentFilter filter = new IntentFilter(); IntentFilter filter = new IntentFilter(); filter.addAction(Intent.ACTION_SCREEN_OFF); filter.addAction(Intent.ACTION_SCREEN_OFF); filter.addAction(Intent.ACTION_SCREEN_ON); filter.addAction(Intent.ACTION_SCREEN_ON); filter.setPriority(IntentFilter.SYSTEM_HIGH_PRIORITY); filter.setPriority(IntentFilter.SYSTEM_HIGH_PRIORITY); mContext.registerReceiver(this, filter, null, mHandler); mContext.registerReceiver(this, filter, null, mHandler); mRegistered = true; } } } public void unregister() { public void unregister() { if (mRegistered) { mContext.unregisterReceiver(this); mContext.unregisterReceiver(this); mRegistered = false; } } } } } } } Loading