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