• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 /*
2  * Copyright (C) 2023 The Android Open Source Project
3  *
4  * Licensed under the Apache License, Version 2.0 (the "License");
5  * you may not use this file except in compliance with the License.
6  * You may obtain a copy of the License at
7  *
8  *      http://www.apache.org/licenses/LICENSE-2.0
9  *
10  * Unless required by applicable law or agreed to in writing, software
11  * distributed under the License is distributed on an "AS IS" BASIS,
12  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13  * See the License for the specific language governing permissions and
14  * limitations under the License.
15  */
16 
17 package com.android.server.display.feature;
18 
19 import android.content.Context;
20 import android.os.Build;
21 import android.os.SystemProperties;
22 import android.text.TextUtils;
23 import android.util.Slog;
24 import android.window.DesktopExperienceFlags;
25 
26 import com.android.server.display.feature.flags.Flags;
27 import com.android.server.display.utils.DebugUtils;
28 
29 import java.io.PrintWriter;
30 import java.util.function.Supplier;
31 
32 /**
33  * Utility class to read the flags used in the display manager server.
34  */
35 public class DisplayManagerFlags {
36     private static final String TAG = "DisplayManagerFlags";
37 
38     // To enable these logs, run:
39     // 'adb shell setprop persist.log.tag.DisplayManagerFlags DEBUG && adb reboot'
40     private static final boolean DEBUG = DebugUtils.isDebuggable(TAG);
41 
42     private final FlagState mPortInDisplayLayoutFlagState = new FlagState(
43             Flags.FLAG_ENABLE_PORT_IN_DISPLAY_LAYOUT,
44             Flags::enablePortInDisplayLayout);
45 
46     private final FlagState mAdaptiveToneImprovements1 = new FlagState(
47             Flags.FLAG_ENABLE_ADAPTIVE_TONE_IMPROVEMENTS_1,
48             Flags::enableAdaptiveToneImprovements1);
49 
50     private final FlagState mAdaptiveToneImprovements2 = new FlagState(
51             Flags.FLAG_ENABLE_ADAPTIVE_TONE_IMPROVEMENTS_2,
52             Flags::enableAdaptiveToneImprovements2);
53 
54     private final FlagState mDisplayOffloadFlagState = new FlagState(
55             Flags.FLAG_ENABLE_DISPLAY_OFFLOAD,
56             Flags::enableDisplayOffload);
57 
58     private final FlagState mExternalDisplayLimitModeState = new FlagState(
59             Flags.FLAG_ENABLE_MODE_LIMIT_FOR_EXTERNAL_DISPLAY,
60             Flags::enableModeLimitForExternalDisplay);
61 
62     private final FlagState mDisplayTopology = new FlagState(
63             Flags.FLAG_DISPLAY_TOPOLOGY,
64             DesktopExperienceFlags.DISPLAY_TOPOLOGY::isTrue);
65 
66     private final FlagState mConnectedDisplayErrorHandlingFlagState = new FlagState(
67             Flags.FLAG_ENABLE_CONNECTED_DISPLAY_ERROR_HANDLING,
68             Flags::enableConnectedDisplayErrorHandling);
69 
70     private final FlagState mBackUpSmoothDisplayAndForcePeakRefreshRateFlagState = new FlagState(
71             Flags.FLAG_BACK_UP_SMOOTH_DISPLAY_AND_FORCE_PEAK_REFRESH_RATE,
72             Flags::backUpSmoothDisplayAndForcePeakRefreshRate);
73 
74     private final FlagState mPowerThrottlingClamperFlagState = new FlagState(
75             Flags.FLAG_ENABLE_POWER_THROTTLING_CLAMPER,
76             Flags::enablePowerThrottlingClamper);
77 
78     private final FlagState mEvenDimmerFlagState = new FlagState(
79             Flags.FLAG_EVEN_DIMMER,
80             Flags::evenDimmer);
81     private final FlagState mSmallAreaDetectionFlagState = new FlagState(
82             com.android.graphics.surfaceflinger.flags.Flags.FLAG_ENABLE_SMALL_AREA_DETECTION,
83             com.android.graphics.surfaceflinger.flags.Flags::enableSmallAreaDetection);
84 
85     private final FlagState mDisplayConfigErrorHalFlagState = new FlagState(
86             com.android.graphics.surfaceflinger.flags.Flags.FLAG_DISPLAY_CONFIG_ERROR_HAL,
87             com.android.graphics.surfaceflinger.flags.Flags::displayConfigErrorHal);
88 
89     private final FlagState mSyncedResolutionSwitch = new FlagState(
90             com.android.graphics.surfaceflinger.flags.Flags.FLAG_SYNCED_RESOLUTION_SWITCH,
91             com.android.graphics.surfaceflinger.flags.Flags::syncedResolutionSwitch
92     );
93 
94     private final FlagState mBrightnessIntRangeUserPerceptionFlagState = new FlagState(
95             Flags.FLAG_BRIGHTNESS_INT_RANGE_USER_PERCEPTION,
96             Flags::brightnessIntRangeUserPerception);
97 
98     private final FlagState mRestrictDisplayModes = new FlagState(
99             Flags.FLAG_ENABLE_RESTRICT_DISPLAY_MODES,
100             Flags::enableRestrictDisplayModes);
101 
102     private final FlagState mResolutionBackupRestore = new FlagState(
103             Flags.FLAG_RESOLUTION_BACKUP_RESTORE,
104             Flags::resolutionBackupRestore);
105 
106     private final FlagState mVsyncLowPowerVote = new FlagState(
107             Flags.FLAG_ENABLE_VSYNC_LOW_POWER_VOTE,
108             Flags::enableVsyncLowPowerVote);
109 
110     private final FlagState mVsyncLowLightVote = new FlagState(
111             Flags.FLAG_ENABLE_VSYNC_LOW_LIGHT_VOTE,
112             Flags::enableVsyncLowLightVote);
113 
114     private final FlagState mBrightnessWearBedtimeModeClamperFlagState = new FlagState(
115             Flags.FLAG_BRIGHTNESS_WEAR_BEDTIME_MODE_CLAMPER,
116             Flags::brightnessWearBedtimeModeClamper);
117 
118     private final FlagState mAutoBrightnessModesFlagState = new FlagState(
119             Flags.FLAG_AUTO_BRIGHTNESS_MODES,
120             Flags::autoBrightnessModes);
121 
122     private final FlagState mFastHdrTransitions = new FlagState(
123             Flags.FLAG_FAST_HDR_TRANSITIONS,
124             Flags::fastHdrTransitions);
125 
126     private final FlagState mAlwaysRotateDisplayDevice = new FlagState(
127             Flags.FLAG_ALWAYS_ROTATE_DISPLAY_DEVICE,
128             Flags::alwaysRotateDisplayDevice);
129 
130     private final FlagState mPixelAnisotropyCorrectionEnabled = new FlagState(
131             Flags.FLAG_ENABLE_PIXEL_ANISOTROPY_CORRECTION,
132             Flags::enablePixelAnisotropyCorrection
133     );
134 
135     private final FlagState mSensorBasedBrightnessThrottling = new FlagState(
136             Flags.FLAG_SENSOR_BASED_BRIGHTNESS_THROTTLING,
137             Flags::sensorBasedBrightnessThrottling
138     );
139 
140     private final FlagState mIdleScreenRefreshRateTimeout = new FlagState(
141             Flags.FLAG_IDLE_SCREEN_REFRESH_RATE_TIMEOUT,
142             Flags::idleScreenRefreshRateTimeout
143     );
144 
145     private final FlagState mRefactorDisplayPowerController = new FlagState(
146             Flags.FLAG_REFACTOR_DISPLAY_POWER_CONTROLLER,
147             Flags::refactorDisplayPowerController
148     );
149 
150     private final FlagState mUseFusionProxSensor = new FlagState(
151             Flags.FLAG_USE_FUSION_PROX_SENSOR,
152             Flags::useFusionProxSensor
153     );
154 
155     private final FlagState mDozeBrightnessFloat = new FlagState(
156             Flags.FLAG_DOZE_BRIGHTNESS_FLOAT,
157             Flags::dozeBrightnessFloat);
158 
159     private final FlagState mPeakRefreshRatePhysicalLimit = new FlagState(
160             Flags.FLAG_ENABLE_PEAK_REFRESH_RATE_PHYSICAL_LIMIT,
161             Flags::enablePeakRefreshRatePhysicalLimit
162     );
163 
164     private final FlagState mIgnoreAppPreferredRefreshRate = new FlagState(
165             Flags.FLAG_IGNORE_APP_PREFERRED_REFRESH_RATE_REQUEST,
166             Flags::ignoreAppPreferredRefreshRateRequest
167     );
168 
169     private final FlagState mSynthetic60hzModes = new FlagState(
170             Flags.FLAG_ENABLE_SYNTHETIC_60HZ_MODES,
171             Flags::enableSynthetic60hzModes
172     );
173 
174     private final FlagState mOffloadDozeOverrideHoldsWakelock = new FlagState(
175             Flags.FLAG_OFFLOAD_DOZE_OVERRIDE_HOLDS_WAKELOCK,
176             Flags::offloadDozeOverrideHoldsWakelock
177     );
178 
179     private final FlagState mOffloadSessionCancelBlockScreenOn = new FlagState(
180             Flags.FLAG_OFFLOAD_SESSION_CANCEL_BLOCK_SCREEN_ON,
181             Flags::offloadSessionCancelBlockScreenOn);
182 
183     private final FlagState mNewHdrBrightnessModifier = new FlagState(
184             Flags.FLAG_NEW_HDR_BRIGHTNESS_MODIFIER,
185             Flags::newHdrBrightnessModifier);
186 
187     private final FlagState mIdleScreenConfigInSubscribingLightSensor = new FlagState(
188             Flags.FLAG_IDLE_SCREEN_CONFIG_IN_SUBSCRIBING_LIGHT_SENSOR,
189             Flags::idleScreenConfigInSubscribingLightSensor);
190 
191     private final FlagState mVirtualDisplayLimit =
192             new FlagState(
193                     Flags.FLAG_VIRTUAL_DISPLAY_LIMIT,
194                     Flags::virtualDisplayLimit);
195 
196     private final FlagState mNormalBrightnessForDozeParameter = new FlagState(
197             Flags.FLAG_NORMAL_BRIGHTNESS_FOR_DOZE_PARAMETER,
198             Flags::normalBrightnessForDozeParameter
199     );
200     private final FlagState mBlockAutobrightnessChangesOnStylusUsage = new FlagState(
201             Flags.FLAG_BLOCK_AUTOBRIGHTNESS_CHANGES_ON_STYLUS_USAGE,
202             Flags::blockAutobrightnessChangesOnStylusUsage
203     );
204     private final FlagState mIsUserRefreshRateForExternalDisplayEnabled = new FlagState(
205             Flags.FLAG_ENABLE_USER_REFRESH_RATE_FOR_EXTERNAL_DISPLAY,
206             Flags::enableUserRefreshRateForExternalDisplay
207     );
208 
209     private final FlagState mEnableWaitingConfirmationBeforeMirroring = new FlagState(
210             Flags.FLAG_ENABLE_WAITING_CONFIRMATION_BEFORE_MIRRORING,
211             Flags::enableWaitingConfirmationBeforeMirroring
212     );
213 
214     private final FlagState mEnableApplyDisplayChangedDuringDisplayAdded = new FlagState(
215             Flags.FLAG_ENABLE_APPLY_DISPLAY_CHANGED_DURING_DISPLAY_ADDED,
216             Flags::enableApplyDisplayChangedDuringDisplayAdded
217     );
218 
219     private final FlagState mEnableBatteryStatsForAllDisplays = new FlagState(
220             Flags.FLAG_ENABLE_BATTERY_STATS_FOR_ALL_DISPLAYS,
221             Flags::enableBatteryStatsForAllDisplays
222     );
223 
224     private final FlagState mHasArrSupport = new FlagState(
225             Flags.FLAG_ENABLE_HAS_ARR_SUPPORT,
226             Flags::enableHasArrSupport
227     );
228 
229     private final FlagState mAutoBrightnessModeBedtimeWearFlagState = new FlagState(
230             Flags.FLAG_AUTO_BRIGHTNESS_MODE_BEDTIME_WEAR,
231             Flags::autoBrightnessModeBedtimeWear
232     );
233 
234     private final FlagState mGetSupportedRefreshRatesFlagState = new FlagState(
235             Flags.FLAG_ENABLE_GET_SUPPORTED_REFRESH_RATES,
236             Flags::enableGetSupportedRefreshRates
237     );
238 
239     private final FlagState mEnablePluginManagerFlagState = new FlagState(
240             Flags.FLAG_ENABLE_PLUGIN_MANAGER,
241             Flags::enablePluginManager
242     );
243 
244     private final FlagState mEnableHdrOverridePluginTypeFlagState = new FlagState(
245             Flags.FLAG_ENABLE_HDR_OVERRIDE_PLUGIN_TYPE,
246             Flags::enableHdrOverridePluginType
247     );
248 
249     private final FlagState mDisplayListenerPerformanceImprovementsFlagState = new FlagState(
250             Flags.FLAG_DISPLAY_LISTENER_PERFORMANCE_IMPROVEMENTS,
251             Flags::displayListenerPerformanceImprovements
252     );
253     private final FlagState mEnableDisplayContentModeManagementFlagState = new FlagState(
254             Flags.FLAG_ENABLE_DISPLAY_CONTENT_MODE_MANAGEMENT,
255             DesktopExperienceFlags.ENABLE_DISPLAY_CONTENT_MODE_MANAGEMENT::isTrue
256     );
257 
258     private final FlagState mSubscribeGranularDisplayEvents = new FlagState(
259             Flags.FLAG_SUBSCRIBE_GRANULAR_DISPLAY_EVENTS,
260             Flags::subscribeGranularDisplayEvents
261     );
262 
263     private final FlagState mBaseDensityForExternalDisplays = new FlagState(
264             Flags.FLAG_BASE_DENSITY_FOR_EXTERNAL_DISPLAYS,
265             DesktopExperienceFlags.BASE_DENSITY_FOR_EXTERNAL_DISPLAYS::isTrue
266     );
267 
268     private final FlagState mFramerateOverrideTriggersRrCallbacks = new FlagState(
269             Flags.FLAG_FRAMERATE_OVERRIDE_TRIGGERS_RR_CALLBACKS,
270             Flags::framerateOverrideTriggersRrCallbacks
271     );
272 
273     private final FlagState mRefreshRateEventForForegroundApps = new FlagState(
274             Flags.FLAG_REFRESH_RATE_EVENT_FOR_FOREGROUND_APPS,
275             Flags::refreshRateEventForForegroundApps
276     );
277 
278     private final FlagState mCommittedStateSeparateEvent = new FlagState(
279             Flags.FLAG_COMMITTED_STATE_SEPARATE_EVENT,
280             Flags::committedStateSeparateEvent
281     );
282 
283     private final FlagState mSeparateTimeouts = new FlagState(
284             Flags.FLAG_SEPARATE_TIMEOUTS,
285             Flags::separateTimeouts
286     );
287 
288     private final FlagState mDelayImplicitRrRegistrationUntilRrAccessed = new FlagState(
289             Flags.FLAG_DELAY_IMPLICIT_RR_REGISTRATION_UNTIL_RR_ACCESSED,
290             Flags::delayImplicitRrRegistrationUntilRrAccessed
291     );
292 
293     /**
294      * @return {@code true} if 'port' is allowed in display layout configuration file.
295      */
isPortInDisplayLayoutEnabled()296     public boolean isPortInDisplayLayoutEnabled() {
297         return mPortInDisplayLayoutFlagState.isEnabled();
298     }
299 
300     /** Returns whether power throttling clamper is enabled on not. */
isPowerThrottlingClamperEnabled()301     public boolean isPowerThrottlingClamperEnabled() {
302         return mPowerThrottlingClamperFlagState.isEnabled();
303     }
304 
305     /**
306      * Returns whether adaptive tone improvements are enabled
307      */
isAdaptiveTone1Enabled()308     public boolean isAdaptiveTone1Enabled() {
309         return mAdaptiveToneImprovements1.isEnabled();
310     }
311 
312     /**
313      * Returns whether adaptive tone improvements are enabled
314      */
isAdaptiveTone2Enabled()315     public boolean isAdaptiveTone2Enabled() {
316         return mAdaptiveToneImprovements2.isEnabled();
317     }
318 
319     /** Returns whether resolution range voting feature is enabled or not. */
isDisplayResolutionRangeVotingEnabled()320     public boolean isDisplayResolutionRangeVotingEnabled() {
321         return isExternalDisplayLimitModeEnabled();
322     }
323 
324     /**
325      * @return Whether user preferred mode is added as a vote in
326      *      {@link com.android.server.display.mode.DisplayModeDirector}
327      */
isUserPreferredModeVoteEnabled()328     public boolean isUserPreferredModeVoteEnabled() {
329         return isExternalDisplayLimitModeEnabled();
330     }
331 
332     /**
333      * @return Whether external display mode limitation is enabled.
334      */
isExternalDisplayLimitModeEnabled()335     public boolean isExternalDisplayLimitModeEnabled() {
336         return mExternalDisplayLimitModeState.isEnabled();
337     }
338 
isDisplayTopologyEnabled()339     public boolean isDisplayTopologyEnabled() {
340         return mDisplayTopology.isEnabled();
341     }
342 
343     /**
344      * @return Whether displays refresh rate synchronization is enabled.
345      */
isDisplaysRefreshRatesSynchronizationEnabled()346     public boolean isDisplaysRefreshRatesSynchronizationEnabled() {
347         return isExternalDisplayLimitModeEnabled();
348     }
349 
350     /** Returns whether displayoffload is enabled on not */
isDisplayOffloadEnabled()351     public boolean isDisplayOffloadEnabled() {
352         return mDisplayOffloadFlagState.isEnabled();
353     }
354 
355     /** Returns whether error notifications for connected displays are enabled on not */
isConnectedDisplayErrorHandlingEnabled()356     public boolean isConnectedDisplayErrorHandlingEnabled() {
357         return mConnectedDisplayErrorHandlingFlagState.isEnabled();
358     }
359 
isBackUpSmoothDisplayAndForcePeakRefreshRateEnabled()360     public boolean isBackUpSmoothDisplayAndForcePeakRefreshRateEnabled() {
361         return mBackUpSmoothDisplayAndForcePeakRefreshRateFlagState.isEnabled();
362     }
363 
364     /** Returns whether brightness range is allowed to extend below traditional range. */
isEvenDimmerEnabled()365     public boolean isEvenDimmerEnabled() {
366         return mEvenDimmerFlagState.isEnabled();
367     }
368 
isSmallAreaDetectionEnabled()369     public boolean isSmallAreaDetectionEnabled() {
370         return mSmallAreaDetectionFlagState.isEnabled();
371     }
372 
isDisplayConfigErrorHalEnabled()373     public boolean isDisplayConfigErrorHalEnabled() {
374         return mDisplayConfigErrorHalFlagState.isEnabled();
375     }
376 
isSyncedResolutionSwitchEnabled()377     public boolean isSyncedResolutionSwitchEnabled() {
378         return mSyncedResolutionSwitch.isEnabled();
379     }
380 
isBrightnessIntRangeUserPerceptionEnabled()381     public boolean isBrightnessIntRangeUserPerceptionEnabled() {
382         return mBrightnessIntRangeUserPerceptionFlagState.isEnabled();
383     }
384 
isRestrictDisplayModesEnabled()385     public boolean isRestrictDisplayModesEnabled() {
386         return mRestrictDisplayModes.isEnabled();
387     }
388 
isResolutionBackupRestoreEnabled()389     public boolean isResolutionBackupRestoreEnabled() {
390         return mResolutionBackupRestore.isEnabled();
391     }
392 
isVsyncLowPowerVoteEnabled()393     public boolean isVsyncLowPowerVoteEnabled() {
394         return mVsyncLowPowerVote.isEnabled();
395     }
396 
isVsyncLowLightVoteEnabled()397     public boolean isVsyncLowLightVoteEnabled() {
398         return mVsyncLowLightVote.isEnabled();
399     }
400 
isBrightnessWearBedtimeModeClamperEnabled()401     public boolean isBrightnessWearBedtimeModeClamperEnabled() {
402         return mBrightnessWearBedtimeModeClamperFlagState.isEnabled();
403     }
404 
405     /**
406      * @return Whether generic auto-brightness modes are enabled
407      */
areAutoBrightnessModesEnabled()408     public boolean areAutoBrightnessModesEnabled() {
409         return mAutoBrightnessModesFlagState.isEnabled();
410     }
411 
isFastHdrTransitionsEnabled()412     public boolean isFastHdrTransitionsEnabled() {
413         return mFastHdrTransitions.isEnabled();
414     }
415 
isAlwaysRotateDisplayDeviceEnabled()416     public boolean isAlwaysRotateDisplayDeviceEnabled() {
417         return mAlwaysRotateDisplayDevice.isEnabled();
418     }
419 
isPixelAnisotropyCorrectionInLogicalDisplayEnabled()420     public boolean isPixelAnisotropyCorrectionInLogicalDisplayEnabled() {
421         return mPixelAnisotropyCorrectionEnabled.isEnabled();
422     }
423 
isSensorBasedBrightnessThrottlingEnabled()424     public boolean isSensorBasedBrightnessThrottlingEnabled() {
425         return mSensorBasedBrightnessThrottling.isEnabled();
426     }
427 
isIdleScreenRefreshRateTimeoutEnabled()428     public boolean isIdleScreenRefreshRateTimeoutEnabled() {
429         return mIdleScreenRefreshRateTimeout.isEnabled();
430     }
431 
isRefactorDisplayPowerControllerEnabled()432     public boolean isRefactorDisplayPowerControllerEnabled() {
433         return mRefactorDisplayPowerController.isEnabled();
434     }
435 
isUseFusionProxSensorEnabled()436     public boolean isUseFusionProxSensorEnabled() {
437         return mUseFusionProxSensor.isEnabled();
438     }
439 
getUseFusionProxSensorFlagName()440     public String getUseFusionProxSensorFlagName() {
441         return mUseFusionProxSensor.getName();
442     }
443 
isDozeBrightnessFloatEnabled()444     public boolean isDozeBrightnessFloatEnabled() {
445         return mDozeBrightnessFloat.isEnabled();
446     }
447 
isPeakRefreshRatePhysicalLimitEnabled()448     public boolean isPeakRefreshRatePhysicalLimitEnabled() {
449         return mPeakRefreshRatePhysicalLimit.isEnabled();
450     }
451 
isOffloadDozeOverrideHoldsWakelockEnabled()452     public boolean isOffloadDozeOverrideHoldsWakelockEnabled() {
453         return mOffloadDozeOverrideHoldsWakelock.isEnabled();
454     }
455 
isOffloadSessionCancelBlockScreenOnEnabled()456     public boolean isOffloadSessionCancelBlockScreenOnEnabled() {
457         return mOffloadSessionCancelBlockScreenOn.isEnabled();
458     }
459 
460     /**
461      * @return Whether to ignore preferredRefreshRate app request conversion to display mode or not
462      */
ignoreAppPreferredRefreshRateRequest()463     public boolean ignoreAppPreferredRefreshRateRequest() {
464         return mIgnoreAppPreferredRefreshRate.isEnabled();
465     }
466 
isSynthetic60HzModesEnabled()467     public boolean isSynthetic60HzModesEnabled() {
468         return mSynthetic60hzModes.isEnabled();
469     }
470 
471     /**
472      * @return Whether to use new HDR brightness modifier or not
473      */
useNewHdrBrightnessModifier()474     public boolean useNewHdrBrightnessModifier() {
475         return mNewHdrBrightnessModifier.isEnabled();
476     }
477 
isVirtualDisplayLimitEnabled()478     public boolean isVirtualDisplayLimitEnabled() {
479         return mVirtualDisplayLimit.isEnabled();
480     }
481 
482     /**
483      * @return Whether the useDozeBrightness parameter should be used
484      */
isNormalBrightnessForDozeParameterEnabled(Context context)485     public boolean isNormalBrightnessForDozeParameterEnabled(Context context) {
486         return mNormalBrightnessForDozeParameter.isEnabled() && context.getResources().getBoolean(
487                 com.android.internal.R.bool.config_allowNormalBrightnessForDozePolicy);
488     }
489 
490      /**
491       * @return {@code true} if idle timer refresh rate config is accounted for while subscribing to
492       * the light sensor
493       */
isIdleScreenConfigInSubscribingLightSensorEnabled()494     public boolean isIdleScreenConfigInSubscribingLightSensorEnabled() {
495         return mIdleScreenConfigInSubscribingLightSensor.isEnabled();
496     }
497 
498     /**
499       * @return {@code true} if mirroring won't be enabled until boot completes and the user enables
500       * the display.
501       */
isWaitingConfirmationBeforeMirroringEnabled()502     public boolean isWaitingConfirmationBeforeMirroringEnabled() {
503         return mEnableWaitingConfirmationBeforeMirroring.isEnabled();
504     }
505 
506     /**
507       * @return {@code true} if battery stats is enabled for all displays, not just the primary
508       * display.
509       */
isBatteryStatsEnabledForAllDisplays()510     public boolean isBatteryStatsEnabledForAllDisplays() {
511         return mEnableBatteryStatsForAllDisplays.isEnabled();
512     }
513 
514     /**
515       * @return {@code true} if need to apply display changes during display added event.
516       */
isApplyDisplayChangedDuringDisplayAddedEnabled()517     public boolean isApplyDisplayChangedDuringDisplayAddedEnabled() {
518         return mEnableApplyDisplayChangedDuringDisplayAdded.isEnabled();
519     }
520 
521     /**
522      * @return {@code true} if autobrightness is to be blocked when stylus is being used
523      */
isBlockAutobrightnessChangesOnStylusUsage()524     public boolean isBlockAutobrightnessChangesOnStylusUsage() {
525         return mBlockAutobrightnessChangesOnStylusUsage.isEnabled();
526     }
527 
528     /**
529      * @return {@code true} if need to use user refresh rate settings for
530      * external displays.
531      */
isUserRefreshRateForExternalDisplayEnabled()532     public boolean isUserRefreshRateForExternalDisplayEnabled() {
533         return mIsUserRefreshRateForExternalDisplayEnabled.isEnabled();
534     }
535 
536     /**
537      * @return {@code true} if hasArrSupport API is enabled.
538      */
hasArrSupportFlag()539     public boolean hasArrSupportFlag() {
540         return mHasArrSupport.isEnabled();
541     }
542 
543     /**
544      * @return {@code true} if bedtime mode specific auto-brightness curve should be loaded and be
545      * applied when bedtime mode is enabled.
546      */
isAutoBrightnessModeBedtimeWearEnabled()547     public boolean isAutoBrightnessModeBedtimeWearEnabled() {
548         return mAutoBrightnessModeBedtimeWearFlagState.isEnabled();
549     }
550 
551     /**
552      * @return {@code true} if supported refresh rate api is enabled.
553      */
enableGetSupportedRefreshRates()554     public boolean enableGetSupportedRefreshRates() {
555         return mGetSupportedRefreshRatesFlagState.isEnabled();
556     }
557 
isPluginManagerEnabled()558     public boolean isPluginManagerEnabled() {
559         return mEnablePluginManagerFlagState.isEnabled();
560     }
561 
isHdrOverrideEnabled()562     public boolean isHdrOverrideEnabled() {
563         return mEnableHdrOverridePluginTypeFlagState.isEnabled();
564     }
565 
566     /**
567      * @return {@code true} if the flag for display listener performance improvements is enabled
568      */
isDisplayListenerPerformanceImprovementsEnabled()569     public boolean isDisplayListenerPerformanceImprovementsEnabled() {
570         return mDisplayListenerPerformanceImprovementsFlagState.isEnabled();
571     }
572 
isDisplayContentModeManagementEnabled()573     public boolean isDisplayContentModeManagementEnabled() {
574         return mEnableDisplayContentModeManagementFlagState.isEnabled();
575     }
576 
577     /**
578      * @return {@code true} if the flag for subscribing to granular display events is enabled
579      */
isSubscribeGranularDisplayEventsEnabled()580     public boolean isSubscribeGranularDisplayEventsEnabled() {
581         return mSubscribeGranularDisplayEvents.isEnabled();
582     }
583 
584     /**
585      * @return {@code true} if the flag for base density for external displays is enabled
586      */
isBaseDensityForExternalDisplaysEnabled()587     public boolean isBaseDensityForExternalDisplaysEnabled() {
588         return mBaseDensityForExternalDisplays.isEnabled();
589     }
590 
591     /**
592      * @return {@code true} if the flag triggering refresh rate callbacks when framerate is
593      * overridden is enabled
594      */
isFramerateOverrideTriggersRrCallbacksEnabled()595     public boolean isFramerateOverrideTriggersRrCallbacksEnabled() {
596         return mFramerateOverrideTriggersRrCallbacks.isEnabled();
597     }
598 
599     /**
600      * @return {@code true} if the flag for sending refresh rate events only for the apps in
601      * foreground is enabled
602      */
isRefreshRateEventForForegroundAppsEnabled()603     public boolean isRefreshRateEventForForegroundAppsEnabled() {
604         return mRefreshRateEventForForegroundApps.isEnabled();
605     }
606 
607     /**
608      * @return {@code true} if the flag for having a separate event for display's committed state
609      * is enabled
610      */
isCommittedStateSeparateEventEnabled()611     public boolean isCommittedStateSeparateEventEnabled() {
612         return mCommittedStateSeparateEvent.isEnabled();
613     }
614 
615     /**
616      * @return {@code true} if the flag for having a separate timeouts for power groups
617      * is enabled
618      */
isSeparateTimeoutsEnabled()619     public boolean isSeparateTimeoutsEnabled() {
620         return mSeparateTimeouts.isEnabled();
621     }
622 
623     /**
624      * @return {@code true} if the flag for only explicit subscription for RR changes is enabled
625      */
isDelayImplicitRrRegistrationUntilRrAccessedEnabled()626     public boolean isDelayImplicitRrRegistrationUntilRrAccessedEnabled() {
627         return mDelayImplicitRrRegistrationUntilRrAccessed.isEnabled();
628     }
629 
630     /**
631      * dumps all flagstates
632      * @param pw printWriter
633      */
dump(PrintWriter pw)634     public void dump(PrintWriter pw) {
635         pw.println("DisplayManagerFlags:");
636         pw.println("--------------------");
637         pw.println(" " + mAdaptiveToneImprovements1);
638         pw.println(" " + mAdaptiveToneImprovements2);
639         pw.println(" " + mBackUpSmoothDisplayAndForcePeakRefreshRateFlagState);
640         pw.println(" " + mConnectedDisplayErrorHandlingFlagState);
641         pw.println(" " + mDisplayOffloadFlagState);
642         pw.println(" " + mExternalDisplayLimitModeState);
643         pw.println(" " + mDisplayTopology);
644         pw.println(" " + mPowerThrottlingClamperFlagState);
645         pw.println(" " + mEvenDimmerFlagState);
646         pw.println(" " + mSmallAreaDetectionFlagState);
647         pw.println(" " + mDisplayConfigErrorHalFlagState);
648         pw.println(" " + mSyncedResolutionSwitch);
649         pw.println(" " + mBrightnessIntRangeUserPerceptionFlagState);
650         pw.println(" " + mRestrictDisplayModes);
651         pw.println(" " + mBrightnessWearBedtimeModeClamperFlagState);
652         pw.println(" " + mAutoBrightnessModesFlagState);
653         pw.println(" " + mFastHdrTransitions);
654         pw.println(" " + mAlwaysRotateDisplayDevice);
655         pw.println(" " + mPixelAnisotropyCorrectionEnabled);
656         pw.println(" " + mSensorBasedBrightnessThrottling);
657         pw.println(" " + mIdleScreenRefreshRateTimeout);
658         pw.println(" " + mRefactorDisplayPowerController);
659         pw.println(" " + mResolutionBackupRestore);
660         pw.println(" " + mUseFusionProxSensor);
661         pw.println(" " + mDozeBrightnessFloat);
662         pw.println(" " + mPeakRefreshRatePhysicalLimit);
663         pw.println(" " + mIgnoreAppPreferredRefreshRate);
664         pw.println(" " + mSynthetic60hzModes);
665         pw.println(" " + mOffloadDozeOverrideHoldsWakelock);
666         pw.println(" " + mOffloadSessionCancelBlockScreenOn);
667         pw.println(" " + mNewHdrBrightnessModifier);
668         pw.println(" " + mVirtualDisplayLimit);
669         pw.println(" " + mNormalBrightnessForDozeParameter);
670         pw.println(" " + mIdleScreenConfigInSubscribingLightSensor);
671         pw.println(" " + mEnableWaitingConfirmationBeforeMirroring);
672         pw.println(" " + mEnableBatteryStatsForAllDisplays);
673         pw.println(" " + mEnableApplyDisplayChangedDuringDisplayAdded);
674         pw.println(" " + mBlockAutobrightnessChangesOnStylusUsage);
675         pw.println(" " + mIsUserRefreshRateForExternalDisplayEnabled);
676         pw.println(" " + mHasArrSupport);
677         pw.println(" " + mAutoBrightnessModeBedtimeWearFlagState);
678         pw.println(" " + mGetSupportedRefreshRatesFlagState);
679         pw.println(" " + mEnablePluginManagerFlagState);
680         pw.println(" " + mDisplayListenerPerformanceImprovementsFlagState);
681         pw.println(" " + mSubscribeGranularDisplayEvents);
682         pw.println(" " + mEnableDisplayContentModeManagementFlagState);
683         pw.println(" " + mBaseDensityForExternalDisplays);
684         pw.println(" " + mFramerateOverrideTriggersRrCallbacks);
685         pw.println(" " + mRefreshRateEventForForegroundApps);
686         pw.println(" " + mCommittedStateSeparateEvent);
687         pw.println(" " + mSeparateTimeouts);
688         pw.println(" " + mDelayImplicitRrRegistrationUntilRrAccessed);
689     }
690 
691     private static class FlagState {
692 
693         private final String mName;
694 
695         private final Supplier<Boolean> mFlagFunction;
696         private boolean mEnabledSet;
697         private boolean mEnabled;
698 
FlagState(String name, Supplier<Boolean> flagFunction)699         private FlagState(String name, Supplier<Boolean> flagFunction) {
700             mName = name;
701             mFlagFunction = flagFunction;
702         }
703 
getName()704         private String getName() {
705             return mName;
706         }
707 
isEnabled()708         private boolean isEnabled() {
709             if (mEnabledSet) {
710                 if (DEBUG) {
711                     Slog.d(TAG, mName + ": mEnabled. Recall = " + mEnabled);
712                 }
713                 return mEnabled;
714             }
715             mEnabled = flagOrSystemProperty(mFlagFunction, mName);
716             if (DEBUG) {
717                 Slog.d(TAG, mName + ": mEnabled. Flag value = " + mEnabled);
718             }
719             mEnabledSet = true;
720             return mEnabled;
721         }
722 
flagOrSystemProperty(Supplier<Boolean> flagFunction, String flagName)723         private boolean flagOrSystemProperty(Supplier<Boolean> flagFunction, String flagName) {
724             boolean flagValue = flagFunction.get();
725             // TODO(b/299462337) Remove when the infrastructure is ready.
726             if (Build.IS_ENG || Build.IS_USERDEBUG) {
727                 return SystemProperties.getBoolean("persist.sys." + flagName + "-override",
728                         flagValue);
729             }
730             return flagValue;
731         }
732 
733         @Override
toString()734         public String toString() {
735             // remove com.android.server.display.feature.flags. from the beginning of the name.
736             // align all isEnabled() values.
737             // Adjust lengths if we end up with longer names
738             final int nameLength = mName.length();
739             return TextUtils.substring(mName,  41, nameLength) + ": "
740                     + TextUtils.formatSimple("%" + (93 - nameLength) + "s%s", " " , isEnabled())
741                     + " (def:" + mFlagFunction.get() + ")";
742         }
743     }
744 }
745