当前位置:   article > 正文

Android 11 显示状态与背光亮度调整_android setbrightnessconfigurationfordisplay

android setbrightnessconfigurationfordisplay

 Power状态更新

主要在PowerManagerService.java,根据系统状态更新下次update的时间,遍历wakelock状态更新显示状态等

一、函数updatePowerStateLocked

根据MDRTY中记录的脏位更新全局电源状态。这是执行电源状态转换的主要功能。我们将它们集中在这里,这样每当重要的事情发生变化时,我们就可以完全重新计算权力状态,并确保每次都以同样的方式进行。重点是在这里收集所有的转换逻辑。

  1. /**
  2. * Updates the global power state based on dirty bits recorded in mDirty.
  3. *
  4. * This is the main function that performs power state transitions.
  5. * We centralize them here so that we can recompute the power state completely
  6. * each time something important changes, and ensure that we do it the same
  7. * way each time. The point is to gather all of the transition logic here.
  8. */
  9. private void updatePowerStateLocked() {
  10. if (!mSystemReady || mDirty == 0) {
  11. return;
  12. }
  13. if (!Thread.holdsLock(mLock)) {
  14. Slog.wtf(TAG, "Power manager lock was not held when calling updatePowerStateLocked");
  15. }
  16. Trace.traceBegin(Trace.TRACE_TAG_POWER, "updatePowerState");
  17. try {
  18. // Phase 0: Basic state updates.
  19. updateIsPoweredLocked(mDirty);
  20. updateStayOnLocked(mDirty);
  21. updateScreenBrightnessBoostLocked(mDirty);
  22. // Phase 1: Update wakefulness.
  23. // Loop because the wake lock and user activity computations are influenced
  24. // by changes in wakefulness.
  25. final long now = mClock.uptimeMillis();
  26. int dirtyPhase2 = 0;
  27. for (;;) {
  28. int dirtyPhase1 = mDirty;
  29. dirtyPhase2 |= dirtyPhase1;
  30. mDirty = 0;
  31. updateWakeLockSummaryLocked(dirtyPhase1);
  32. updateUserActivitySummaryLocked(now, dirtyPhase1);
  33. updateAttentiveStateLocked(now, dirtyPhase1);
  34. if (!updateWakefulnessLocked(dirtyPhase1)) {
  35. break;
  36. }
  37. }
  38. // Phase 2: Lock profiles that became inactive/not kept awake.
  39. updateProfilesLocked(now);
  40. // Phase 3: Update display power state.
  41. final boolean displayBecameReady = updateDisplayPowerStateLocked(dirtyPhase2);
  42. // Phase 4: Update dream state (depends on display ready signal).
  43. updateDreamLocked(dirtyPhase2, displayBecameReady);
  44. // Phase 5: Send notifications, if needed.
  45. finishWakefulnessChangeIfNeededLocked();
  46. // Phase 6: Update suspend blocker.
  47. // Because we might release the last suspend blocker here, we need to make sure
  48. // we finished everything else first!
  49. updateSuspendBlockerLocked();
  50. } finally {
  51. Trace.traceEnd(Trace.TRACE_TAG_POWER);
  52. }
  53. }

(1)基本状态更新

a、函数updateIsPoweredLocked

有需要时更新电池状态 DIRTY_BATTERY_STATE

b、函数updateStayOnLocked

DIRTY_STAY_ON

c、函数updateScreenBrightnessBoostLocked

DIRTY_SCREEN_BRIGHTNESS_BOOST

(2)更新清醒状态

a、函数updateWakeLockSummaryLocked

更新mWakeLockSummary的值,以汇总所有活动唤醒锁的状态。请注意,当系统处于睡眠状态时,大多数唤醒锁都会被忽略。DIRTY_WAKE_LOCKS

b、函数updateUserActivitySummaryLocked

更新mUserActivitySummary的值,以总结用户请求的系统状态,例如屏幕是亮还是暗。 请注意,当系统处于睡眠状态时,用户活动将被忽略 DIRTY_USER_ACTIVITY

c、函数updateAttentiveStateLocked

d、函数updateWakefulnessLocked

该功能根据当前唤醒锁和用户活动状态决定设备是否应该开始做梦。如果清醒状态发生变化,它可能会修改MDRTY。如果唤醒状态发生变化,需要重新启动电源状态计算,则返回true

(3)锁定处于非活动状态/未保持清醒状态的配置文件。

函数updateProfilesLocked

检查配置文件超时并通知应锁定的配置文件

(4)更新显示电源状态。

函数updateDisplayPowerStateLocked

异步更新显示电源状态。更新完成后,mDisplayReady将设置为true。显示控制器会发布一条消息,告诉我们实际的显示电源状态何时已更新,所以我们回到这里再次检查并完成。此函数每次都会重新计算显示电源状态。
return True,如果显示就绪。

(5)更新梦想状态(取决于显示就绪信号)。

函数updateDreamLocked

确定是否向sandman发布消息以更新梦境状态。

(6)如果需要,发送通知

函数finishWakefulnessChangeIfNeededLocked

(7)更新暂停阻止程序

因为我们可能会在这里释放最后一个暂停阻止程序,所以我们需要确保先完成其他所有操作!

函数updateSuspendBlockerLocked

背光亮度调整

主要在DisplayPowerController.java中更新设备状态,在LightsService.java中为实际的操作

一、DisplayPowerController.java函数updatePowerState

获取从PowerManagerService传来的DisplayPowerRequest状态,实时更新背光状态,显示屏状态。

(1)使用策略计算基本显示状态。

主要包括使用POLICY决定显示状态和拨打电话时距离传感器影响显示状态

  1. int state;
  2. float brightnessState = PowerManager.BRIGHTNESS_INVALID_FLOAT;
  3. boolean performScreenOffTransition = false;
  4. switch (mPowerRequest.policy) {
  5. case DisplayPowerRequest.POLICY_OFF:
  6. state = Display.STATE_OFF;
  7. performScreenOffTransition = true;
  8. break;
  9. case DisplayPowerRequest.POLICY_DOZE:
  10. if (mPowerRequest.dozeScreenState != Display.STATE_UNKNOWN) {
  11. state = mPowerRequest.dozeScreenState;
  12. } else {
  13. state = Display.STATE_DOZE;
  14. }
  15. if (!mAllowAutoBrightnessWhileDozingConfig) {
  16. brightnessState = mPowerRequest.dozeScreenBrightness;
  17. mBrightnessReasonTemp.setReason(BrightnessReason.REASON_DOZE);
  18. }
  19. break;
  20. case DisplayPowerRequest.POLICY_VR:
  21. state = Display.STATE_VR;
  22. break;
  23. case DisplayPowerRequest.POLICY_DIM:
  24. case DisplayPowerRequest.POLICY_BRIGHT:
  25. default:
  26. state = Display.STATE_ON;
  27. break;
  28. }
  29. assert(state != Display.STATE_UNKNOWN);
  30. // Apply the proximity sensor.
  31. if (mProximitySensor != null) {
  32. if (mPowerRequest.useProximitySensor && state != Display.STATE_OFF) {
  33. // At this point the policy says that the screen should be on, but we've been
  34. // asked to listen to the prox sensor to adjust the display state, so lets make
  35. // sure the sensor is on.
  36. setProximitySensorEnabled(true);
  37. if (!mScreenOffBecauseOfProximity
  38. && mProximity == PROXIMITY_POSITIVE
  39. && !mIgnoreProximityUntilChanged) {
  40. // Prox sensor already reporting "near" so we should turn off the screen.
  41. // Also checked that we aren't currently set to ignore the proximity sensor
  42. // temporarily.
  43. mScreenOffBecauseOfProximity = true;
  44. sendOnProximityPositiveWithWakelock();
  45. }
  46. } else if (mWaitingForNegativeProximity
  47. && mScreenOffBecauseOfProximity
  48. && mProximity == PROXIMITY_POSITIVE
  49. && state != Display.STATE_OFF) {
  50. // The policy says that we should have the screen on, but it's off due to the prox
  51. // and we've been asked to wait until the screen is far from the user to turn it
  52. // back on. Let keep the prox sensor on so we can tell when it's far again.
  53. setProximitySensorEnabled(true);
  54. } else {
  55. // We haven't been asked to use the prox sensor and we're not waiting on the screen
  56. // to turn back on...so lets shut down the prox sensor.
  57. setProximitySensorEnabled(false);
  58. mWaitingForNegativeProximity = false;
  59. }
  60. if (mScreenOffBecauseOfProximity
  61. && (mProximity != PROXIMITY_POSITIVE || mIgnoreProximityUntilChanged)) {
  62. // The screen *was* off due to prox being near, but now it's "far" so lets turn
  63. // the screen back on. Also turn it back on if we've been asked to ignore the
  64. // prox sensor temporarily.
  65. mScreenOffBecauseOfProximity = false;
  66. sendOnProximityNegativeWithWakelock();
  67. }
  68. } else {
  69. mWaitingForNegativeProximity = false;
  70. mIgnoreProximityUntilChanged = false;
  71. }
  72. if (mScreenOffBecauseOfProximity) {
  73. state = Display.STATE_OFF;
  74. }
  75. // Animate the screen state change unless already animating.
  76. // The transition may be deferred, so after this point we will use the
  77. // actual state instead of the desired one.
  78. final int oldState = mPowerState.getScreenState();
  79. animateScreenStateChange(state, performScreenOffTransition);
  80. state = mPowerState.getScreenState();
  81. if (state == Display.STATE_OFF) {
  82. brightnessState = PowerManager.BRIGHTNESS_OFF_FLOAT;
  83. mBrightnessReasonTemp.setReason(BrightnessReason.REASON_SCREEN_OFF);
  84. }
  85. // Always use the VR brightness when in the VR state.
  86. if (state == Display.STATE_VR) {
  87. brightnessState = mScreenBrightnessForVr;
  88. mBrightnessReasonTemp.setReason(BrightnessReason.REASON_VR);
  89. }

(2)使用策略计算基本背光状态。

主要包括正常情况下的亮度、光传感器自动调节时的亮度、DIM下的亮度、低电量下的亮度等等

  1. if ((Float.isNaN(brightnessState))
  2. && isValidBrightnessValue(mPowerRequest.screenBrightnessOverride)) {
  3. brightnessState = mPowerRequest.screenBrightnessOverride;
  4. mBrightnessReasonTemp.setReason(BrightnessReason.REASON_OVERRIDE);
  5. mAppliedScreenBrightnessOverride = true;
  6. } else {
  7. mAppliedScreenBrightnessOverride = false;
  8. }
  9. final boolean autoBrightnessEnabledInDoze =
  10. mAllowAutoBrightnessWhileDozingConfig && Display.isDozeState(state);
  11. final boolean autoBrightnessEnabled = mPowerRequest.useAutoBrightness
  12. && (state == Display.STATE_ON || autoBrightnessEnabledInDoze)
  13. && Float.isNaN(brightnessState)
  14. && mAutomaticBrightnessController != null;
  15. final boolean userSetBrightnessChanged = updateUserSetScreenBrightness();
  16. // Use the temporary screen brightness if there isn't an override, either from
  17. // WindowManager or based on the display state.
  18. if (isValidBrightnessValue(mTemporaryScreenBrightness)) {
  19. brightnessState = mTemporaryScreenBrightness;
  20. mAppliedTemporaryBrightness = true;
  21. mBrightnessReasonTemp.setReason(BrightnessReason.REASON_TEMPORARY);
  22. } else {
  23. mAppliedTemporaryBrightness = false;
  24. }
  25. final boolean autoBrightnessAdjustmentChanged = updateAutoBrightnessAdjustment();
  26. if (autoBrightnessAdjustmentChanged) {
  27. mTemporaryAutoBrightnessAdjustment = Float.NaN;
  28. }
  29. // Use the autobrightness adjustment override if set.
  30. final float autoBrightnessAdjustment;
  31. if (!Float.isNaN(mTemporaryAutoBrightnessAdjustment)) {
  32. autoBrightnessAdjustment = mTemporaryAutoBrightnessAdjustment;
  33. brightnessAdjustmentFlags = BrightnessReason.ADJUSTMENT_AUTO_TEMP;
  34. mAppliedTemporaryAutoBrightnessAdjustment = true;
  35. } else {
  36. autoBrightnessAdjustment = mAutoBrightnessAdjustment;
  37. brightnessAdjustmentFlags = BrightnessReason.ADJUSTMENT_AUTO;
  38. mAppliedTemporaryAutoBrightnessAdjustment = false;
  39. }
  40. // Apply brightness boost.
  41. // We do this here after deciding whether auto-brightness is enabled so that we don't
  42. // disable the light sensor during this temporary state. That way when boost ends we will
  43. // be able to resume normal auto-brightness behavior without any delay.
  44. if (mPowerRequest.boostScreenBrightness
  45. && brightnessState != PowerManager.BRIGHTNESS_OFF_FLOAT) {
  46. brightnessState = PowerManager.BRIGHTNESS_MAX;
  47. mBrightnessReasonTemp.setReason(BrightnessReason.REASON_BOOST);
  48. mAppliedBrightnessBoost = true;
  49. } else {
  50. mAppliedBrightnessBoost = false;
  51. }
  52. // If the brightness is already set then it's been overridden by something other than the
  53. // user, or is a temporary adjustment.
  54. boolean userInitiatedChange = (Float.isNaN(brightnessState))
  55. && (autoBrightnessAdjustmentChanged || userSetBrightnessChanged);
  56. boolean hadUserBrightnessPoint = false;
  57. // Configure auto-brightness.
  58. if (mAutomaticBrightnessController != null) {
  59. hadUserBrightnessPoint = mAutomaticBrightnessController.hasUserDataPoints();
  60. mAutomaticBrightnessController.configure(autoBrightnessEnabled,
  61. mBrightnessConfiguration,
  62. mLastUserSetScreenBrightness,
  63. userSetBrightnessChanged, autoBrightnessAdjustment,
  64. autoBrightnessAdjustmentChanged, mPowerRequest.policy);
  65. }
  66. if (mBrightnessTracker != null) {
  67. mBrightnessTracker.setBrightnessConfiguration(mBrightnessConfiguration);
  68. }
  69. // Apply auto-brightness.
  70. boolean slowChange = false;
  71. if (Float.isNaN(brightnessState)) {
  72. float newAutoBrightnessAdjustment = autoBrightnessAdjustment;
  73. if (autoBrightnessEnabled) {
  74. brightnessState = mAutomaticBrightnessController.getAutomaticScreenBrightness();
  75. newAutoBrightnessAdjustment =
  76. mAutomaticBrightnessController.getAutomaticScreenBrightnessAdjustment();
  77. }
  78. if (isValidBrightnessValue(brightnessState)
  79. || brightnessState == PowerManager.BRIGHTNESS_OFF_FLOAT) {
  80. // Use current auto-brightness value and slowly adjust to changes.
  81. brightnessState = clampScreenBrightness(brightnessState);
  82. if (mAppliedAutoBrightness && !autoBrightnessAdjustmentChanged) {
  83. slowChange = true; // slowly adapt to auto-brightness
  84. }
  85. // Tell the rest of the system about the new brightness. Note that we do this
  86. // before applying the low power or dim transformations so that the slider
  87. // accurately represents the full possible range, even if they range changes what
  88. // it means in absolute terms.
  89. putScreenBrightnessSetting(brightnessState);
  90. mAppliedAutoBrightness = true;
  91. mBrightnessReasonTemp.setReason(BrightnessReason.REASON_AUTOMATIC);
  92. } else {
  93. mAppliedAutoBrightness = false;
  94. }
  95. if (autoBrightnessAdjustment != newAutoBrightnessAdjustment) {
  96. // If the autobrightness controller has decided to change the adjustment value
  97. // used, make sure that's reflected in settings.
  98. putAutoBrightnessAdjustmentSetting(newAutoBrightnessAdjustment);
  99. } else {
  100. // Adjustment values resulted in no change
  101. brightnessAdjustmentFlags = 0;
  102. }
  103. } else {
  104. mAppliedAutoBrightness = false;
  105. brightnessAdjustmentFlags = 0;
  106. }
  107. // Use default brightness when dozing unless overridden.
  108. if ((Float.isNaN(brightnessState))
  109. && Display.isDozeState(state)) {
  110. brightnessState = mScreenBrightnessDozeConfig;
  111. mBrightnessReasonTemp.setReason(BrightnessReason.REASON_DOZE_DEFAULT);
  112. }
  113. // Apply manual brightness.
  114. if (Float.isNaN(brightnessState)) {
  115. brightnessState = clampScreenBrightness(mCurrentScreenBrightnessSetting);
  116. mBrightnessReasonTemp.setReason(BrightnessReason.REASON_MANUAL);
  117. }
  118. // Apply dimming by at least some minimum amount when user activity
  119. // timeout is about to expire.
  120. if (mPowerRequest.policy == DisplayPowerRequest.POLICY_DIM) {
  121. if (brightnessState > mScreenBrightnessRangeMinimum) {
  122. brightnessState = Math.max(Math.min(brightnessState
  123. - SCREEN_DIM_MINIMUM_REDUCTION_FLOAT,
  124. mScreenBrightnessDimConfig), mScreenBrightnessRangeMinimum);
  125. mBrightnessReasonTemp.addModifier(BrightnessReason.MODIFIER_DIMMED);
  126. }
  127. if (!mAppliedDimming) {
  128. slowChange = false;
  129. }
  130. mAppliedDimming = true;
  131. } else if (mAppliedDimming) {
  132. slowChange = false;
  133. mAppliedDimming = false;
  134. }
  135. // If low power mode is enabled, scale brightness by screenLowPowerBrightnessFactor
  136. // as long as it is above the minimum threshold.
  137. if (mPowerRequest.lowPowerMode) {
  138. if (brightnessState > mScreenBrightnessRangeMinimum) {
  139. final float brightnessFactor =
  140. Math.min(mPowerRequest.screenLowPowerBrightnessFactor, 1);
  141. final float lowPowerBrightnessFloat = (brightnessState * brightnessFactor);
  142. brightnessState = Math.max(lowPowerBrightnessFloat,
  143. mScreenBrightnessRangeMinimum);
  144. mBrightnessReasonTemp.addModifier(BrightnessReason.MODIFIER_LOW_POWER);
  145. }
  146. if (!mAppliedLowPower) {
  147. slowChange = false;
  148. }
  149. mAppliedLowPower = true;
  150. } else if (mAppliedLowPower) {
  151. slowChange = false;
  152. mAppliedLowPower = false;
  153. }

(3)当屏幕打开或打瞌睡时,设置屏幕亮度的动画。

  1. // Animate the screen brightness when the screen is on or dozing.
  2. // Skip the animation when the screen is off or suspended or transition to/from VR.
  3. if (!mPendingScreenOff) {
  4. if (mSkipScreenOnBrightnessRamp) {
  5. if (state == Display.STATE_ON) {
  6. if (mSkipRampState == RAMP_STATE_SKIP_NONE && mDozing) {
  7. mInitialAutoBrightness = brightnessState;
  8. mSkipRampState = RAMP_STATE_SKIP_INITIAL;
  9. } else if (mSkipRampState == RAMP_STATE_SKIP_INITIAL
  10. && mUseSoftwareAutoBrightnessConfig
  11. && !BrightnessSynchronizer.floatEquals(brightnessState,
  12. mInitialAutoBrightness)) {
  13. mSkipRampState = RAMP_STATE_SKIP_AUTOBRIGHT;
  14. } else if (mSkipRampState == RAMP_STATE_SKIP_AUTOBRIGHT) {
  15. mSkipRampState = RAMP_STATE_SKIP_NONE;
  16. }
  17. } else {
  18. mSkipRampState = RAMP_STATE_SKIP_NONE;
  19. }
  20. }
  21. final boolean wasOrWillBeInVr =
  22. (state == Display.STATE_VR || oldState == Display.STATE_VR);
  23. final boolean initialRampSkip =
  24. state == Display.STATE_ON && mSkipRampState != RAMP_STATE_SKIP_NONE;
  25. // While dozing, sometimes the brightness is split into buckets. Rather than animating
  26. // through the buckets, which is unlikely to be smooth in the first place, just jump
  27. // right to the suggested brightness.
  28. final boolean hasBrightnessBuckets =
  29. Display.isDozeState(state) && mBrightnessBucketsInDozeConfig;
  30. // If the color fade is totally covering the screen then we can change the backlight
  31. // level without it being a noticeable jump since any actual content isn't yet visible.
  32. final boolean isDisplayContentVisible =
  33. mColorFadeEnabled && mPowerState.getColorFadeLevel() == 1.0f;
  34. final boolean brightnessIsTemporary =
  35. mAppliedTemporaryBrightness || mAppliedTemporaryAutoBrightnessAdjustment;
  36. // We only want to animate the brightness if it is between 0.0f and 1.0f.
  37. // brightnessState can contain the values -1.0f and NaN, which we do not want to
  38. // animate to. To avoid this, we check the value first.
  39. // If the brightnessState is off (-1.0f) we still want to animate to the minimum
  40. // brightness (0.0f) to accommodate for LED displays, which can appear bright to the
  41. // user even when the display is all black.
  42. float animateValue = brightnessState == PowerManager.BRIGHTNESS_OFF_FLOAT
  43. ? PowerManager.BRIGHTNESS_MIN : brightnessState;
  44. if (isValidBrightnessValue(animateValue)) {
  45. if (initialRampSkip || hasBrightnessBuckets
  46. || wasOrWillBeInVr || !isDisplayContentVisible || brightnessIsTemporary) {
  47. animateScreenBrightness(animateValue, SCREEN_ANIMATION_RATE_MINIMUM);
  48. } else {
  49. animateScreenBrightness(animateValue,
  50. slowChange ? mBrightnessRampRateSlow : mBrightnessRampRateFast);
  51. }
  52. }
  53. if (!brightnessIsTemporary) {
  54. if (userInitiatedChange && (mAutomaticBrightnessController == null
  55. || !mAutomaticBrightnessController.hasValidAmbientLux())) {
  56. // If we don't have a valid lux reading we can't report a valid
  57. // slider event so notify as if the system changed the brightness.
  58. userInitiatedChange = false;
  59. }
  60. notifyBrightnessChanged(
  61. BrightnessSynchronizer.brightnessFloatToInt(mContext, brightnessState),
  62. userInitiatedChange, hadUserBrightnessPoint);
  63. }
  64. }
  65. // Log any changes to what is currently driving the brightness setting.
  66. if (!mBrightnessReasonTemp.equals(mBrightnessReason) || brightnessAdjustmentFlags != 0) {
  67. Slog.v(TAG, "Brightness [" + brightnessState + "] reason changing to: '"
  68. + mBrightnessReasonTemp.toString(brightnessAdjustmentFlags)
  69. + "', previous reason: '" + mBrightnessReason + "'.");
  70. mBrightnessReason.set(mBrightnessReasonTemp);
  71. }

二、操作背光亮度

(1)LightsService.java函数setBrightness

setBrightness会决定走一下那个流程:

方式1:system_server->SF->HWC HAL->设备节点->背光驱动
方式2:system_server->Light HAL->设备节点->背光驱动

  1. @Override
  2. public void setBrightness(float brightness) {
  3. setBrightness(brightness, BRIGHTNESS_MODE_USER);
  4. }
  5. @Override
  6. public void setBrightness(float brightness, int brightnessMode) {
  7. if (Float.isNaN(brightness)) {
  8. Slog.w(TAG, "Brightness is not valid: " + brightness);
  9. return;
  10. }
  11. synchronized (this) {
  12. // LOW_PERSISTENCE cannot be manually set
  13. if (brightnessMode == BRIGHTNESS_MODE_LOW_PERSISTENCE) {
  14. Slog.w(TAG, "setBrightness with LOW_PERSISTENCE unexpected #" + mHwLight.id
  15. + ": brightness=" + brightness);
  16. return;
  17. }
  18. // Ideally, we'd like to set the brightness mode through the SF/HWC as well, but
  19. // right now we just fall back to the old path through Lights brightessMode is
  20. // anything but USER or the device shouldBeInLowPersistenceMode().
  21. if (brightnessMode == BRIGHTNESS_MODE_USER && !shouldBeInLowPersistenceMode()
  22. && mSurfaceControlMaximumBrightness == 255) {
  23. // New system
  24. // TODO: the last check should be mSurfaceControlMaximumBrightness != 0; the
  25. // reason we enforce 255 right now is to stay consistent with the old path. In
  26. // the future, the framework should be refactored so that brightness is a float
  27. // between 0.0f and 1.0f, and the actual number of supported brightness levels
  28. // is determined in the device-specific implementation.
  29. if (DEBUG) {
  30. Slog.d(TAG, "Using new setBrightness path!");
  31. }
  32. SurfaceControl.setDisplayBrightness(mDisplayToken, brightness);
  33. } else {
  34. // Old system
  35. int brightnessInt = BrightnessSynchronizer.brightnessFloatToInt(
  36. getContext(), brightness);
  37. int color = brightnessInt & 0x000000ff;
  38. color = 0xff000000 | (color << 16) | (color << 8) | color;
  39. setLightLocked(color, LIGHT_FLASH_NONE, 0, 0, brightnessMode);
  40. }
  41. }
  42. }

(2)SurfaceControl.setDisplayBrightness

此方法的流程为:system_server->SF->HWC HAL->设备节点->背光驱动

(3)函数setLightLocked

通过 android.hardware.light.ILights/default获取Light HAL,走流程:

方式2:system_server->Light HAL->设备节点->背光驱动

  1. private void setLightLocked(int color, int mode, int onMS, int offMS, int brightnessMode) {
  2. if (shouldBeInLowPersistenceMode()) {
  3. brightnessMode = BRIGHTNESS_MODE_LOW_PERSISTENCE;
  4. } else if (brightnessMode == BRIGHTNESS_MODE_LOW_PERSISTENCE) {
  5. brightnessMode = mLastBrightnessMode;
  6. }
  7. if (!mInitialized || color != mColor || mode != mMode || onMS != mOnMS ||
  8. offMS != mOffMS || mBrightnessMode != brightnessMode) {
  9. if (DEBUG) {
  10. Slog.v(TAG, "setLight #" + mHwLight.id + ": color=#"
  11. + Integer.toHexString(color) + ": brightnessMode=" + brightnessMode);
  12. }
  13. mInitialized = true;
  14. mLastColor = mColor;
  15. mColor = color;
  16. mMode = mode;
  17. mOnMS = onMS;
  18. mOffMS = offMS;
  19. mBrightnessMode = brightnessMode;
  20. setLightUnchecked(color, mode, onMS, offMS, brightnessMode);
  21. }
  22. }
  23. private void setLightUnchecked(int color, int mode, int onMS, int offMS,
  24. int brightnessMode) {
  25. Trace.traceBegin(Trace.TRACE_TAG_POWER, "setLightState(" + mHwLight.id + ", 0x"
  26. + Integer.toHexString(color) + ")");
  27. try {
  28. if (mVintfLights != null) {
  29. HwLightState lightState = new HwLightState();
  30. lightState.color = color;
  31. lightState.flashMode = (byte) mode;
  32. lightState.flashOnMs = onMS;
  33. lightState.flashOffMs = offMS;
  34. lightState.brightnessMode = (byte) brightnessMode;
  35. mVintfLights.get().setLightState(mHwLight.id, lightState);
  36. } else {
  37. setLight_native(mHwLight.id, color, mode, onMS, offMS, brightnessMode);
  38. }
  39. } catch (RemoteException | UnsupportedOperationException ex) {
  40. Slog.e(TAG, "Failed issuing setLightState", ex);
  41. } finally {
  42. Trace.traceEnd(Trace.TRACE_TAG_POWER);
  43. }
  44. }

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/笔触狂放9/article/detail/713778
推荐阅读
相关标签
  

闽ICP备14008679号