diff options
8 files changed, 139 insertions, 94 deletions
diff --git a/packages/SystemUI/res/values/dimens.xml b/packages/SystemUI/res/values/dimens.xml index 8ac3aa1748ce..7c355c9b05e8 100644 --- a/packages/SystemUI/res/values/dimens.xml +++ b/packages/SystemUI/res/values/dimens.xml @@ -650,7 +650,6 @@ <dimen name="keyguard_affordance_icon_width">24dp</dimen> <dimen name="keyguard_indication_margin_bottom">65dp</dimen> - <dimen name="keyguard_indication_margin_bottom_ambient">16dp</dimen> <!-- The text size for battery level --> <dimen name="battery_level_text_size">12sp</dimen> @@ -939,9 +938,8 @@ burn-in on AOD. --> <dimen name="burn_in_prevention_offset_y">50dp</dimen> - <!-- The maximum offset in either direction that the charging indication moves vertically - to prevent burn-in on AOD. --> - <dimen name="charging_indication_burn_in_prevention_offset_y">5dp</dimen> + <!-- The maximum offset in either direction that icons move to prevent burn-in on AOD. --> + <dimen name="default_burn_in_prevention_offset">5dp</dimen> <dimen name="corner_size">8dp</dimen> <dimen name="top_padding">0dp</dimen> diff --git a/packages/SystemUI/src/com/android/systemui/doze/util/BurnInHelper.kt b/packages/SystemUI/src/com/android/systemui/doze/util/BurnInHelper.kt new file mode 100644 index 000000000000..d1e5059756ed --- /dev/null +++ b/packages/SystemUI/src/com/android/systemui/doze/util/BurnInHelper.kt @@ -0,0 +1,51 @@ +/* + * Copyright (C) 2018 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License + */ + +package com.android.systemui.doze.util + +import android.util.MathUtils + +private const val MILLIS_PER_MINUTES = 1000 * 60f +private const val BURN_IN_PREVENTION_PERIOD_Y = 521f +private const val BURN_IN_PREVENTION_PERIOD_X = 83f + +/** + * Returns the translation offset that should be used to avoid burn in at + * the current time (in pixels.) + * + * @param amplitude Maximum translation that will be interpolated. + * @param xAxis If we're moving on X or Y. + */ +fun getBurnInOffset(amplitude: Int, xAxis: Boolean): Int { + return zigzag(System.currentTimeMillis() / MILLIS_PER_MINUTES, + amplitude.toFloat(), + if (xAxis) BURN_IN_PREVENTION_PERIOD_X else BURN_IN_PREVENTION_PERIOD_Y).toInt() +} + +/** + * Implements a continuous, piecewise linear, periodic zig-zag function + * + * Can be thought of as a linear approximation of abs(sin(x))) + * + * @param period period of the function, ie. zigzag(x + period) == zigzag(x) + * @param amplitude maximum value of the function + * @return a value between 0 and amplitude + */ +private fun zigzag(x: Float, amplitude: Float, period: Float): Float { + val xprime = x % period / (period / 2) + val interpolationAmount = if (xprime <= 1) xprime else 2 - xprime + return MathUtils.lerp(0f, amplitude, interpolationAmount) +}
\ No newline at end of file diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/KeyguardIndicationController.java b/packages/SystemUI/src/com/android/systemui/statusbar/KeyguardIndicationController.java index 551e8a9dcb81..0c5f39198b4f 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/KeyguardIndicationController.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/KeyguardIndicationController.java @@ -298,27 +298,6 @@ public class KeyguardIndicationController { if (mVisible) { // Walk down a precedence-ordered list of what indication // should be shown based on user or device state - if (mDozing) { - mTextView.setTextColor(Color.WHITE); - if (!TextUtils.isEmpty(mTransientIndication)) { - // When dozing we ignore any text color and use white instead, because - // colors can be hard to read in low brightness. - mTextView.switchIndication(mTransientIndication); - } else if (mPowerPluggedIn) { - String indication = computePowerIndication(); - if (animate) { - animateText(mTextView, indication); - } else { - mTextView.switchIndication(indication); - } - } else { - String percentage = NumberFormat.getPercentInstance() - .format(mBatteryLevel / 100f); - mTextView.switchIndication(percentage); - } - return; - } - KeyguardUpdateMonitor updateMonitor = KeyguardUpdateMonitor.getInstance(mContext); int userId = KeyguardUpdateMonitor.getCurrentUser(); String trustGrantedIndication = getTrustGrantedIndication(); diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/phone/KeyguardBottomAreaView.java b/packages/SystemUI/src/com/android/systemui/statusbar/phone/KeyguardBottomAreaView.java index d89bcdaffe3e..f667726461f3 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/phone/KeyguardBottomAreaView.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/phone/KeyguardBottomAreaView.java @@ -19,6 +19,7 @@ package com.android.systemui.statusbar.phone; import static android.view.accessibility.AccessibilityNodeInfo.ACTION_CLICK; import static android.view.accessibility.AccessibilityNodeInfo.AccessibilityAction; +import static com.android.systemui.doze.util.BurnInHelperKt.getBurnInOffset; import static com.android.systemui.tuner.LockscreenFragment.LOCKSCREEN_LEFT_BUTTON; import static com.android.systemui.tuner.LockscreenFragment.LOCKSCREEN_LEFT_UNLOCK; import static com.android.systemui.tuner.LockscreenFragment.LOCKSCREEN_RIGHT_BUTTON; @@ -171,7 +172,6 @@ public class KeyguardBottomAreaView extends FrameLayout implements View.OnClickL private LockscreenGestureLogger mLockscreenGestureLogger = new LockscreenGestureLogger(); private boolean mDozing; private int mIndicationBottomMargin; - private int mIndicationBottomMarginAmbient; private float mDarkAmount; private int mBurnInXOffset; private int mBurnInYOffset; @@ -246,10 +246,8 @@ public class KeyguardBottomAreaView extends FrameLayout implements View.OnClickL mIndicationText = findViewById(R.id.keyguard_indication_text); mIndicationBottomMargin = getResources().getDimensionPixelSize( R.dimen.keyguard_indication_margin_bottom); - mIndicationBottomMarginAmbient = getResources().getDimensionPixelSize( - R.dimen.keyguard_indication_margin_bottom_ambient); mBurnInYOffset = getResources().getDimensionPixelSize( - R.dimen.charging_indication_burn_in_prevention_offset_y); + R.dimen.default_burn_in_prevention_offset); updateCameraVisibility(); mUnlockMethodCache = UnlockMethodCache.getInstance(getContext()); mUnlockMethodCache.addListener(this); @@ -320,10 +318,8 @@ public class KeyguardBottomAreaView extends FrameLayout implements View.OnClickL super.onConfigurationChanged(newConfig); mIndicationBottomMargin = getResources().getDimensionPixelSize( R.dimen.keyguard_indication_margin_bottom); - mIndicationBottomMarginAmbient = getResources().getDimensionPixelSize( - R.dimen.keyguard_indication_margin_bottom_ambient); mBurnInYOffset = getResources().getDimensionPixelSize( - R.dimen.charging_indication_burn_in_prevention_offset_y); + R.dimen.default_burn_in_prevention_offset); MarginLayoutParams mlp = (MarginLayoutParams) mIndicationArea.getLayoutParams(); if (mlp.bottomMargin != mIndicationBottomMargin) { mlp.bottomMargin = mIndicationBottomMargin; @@ -567,9 +563,7 @@ public class KeyguardBottomAreaView extends FrameLayout implements View.OnClickL return; } mDarkAmount = darkAmount; - mIndicationArea.setAlpha(MathUtils.lerp(1f, 0.7f, darkAmount)); - mIndicationArea.setTranslationY(MathUtils.lerp(0, - mIndicationBottomMargin - mIndicationBottomMarginAmbient, darkAmount)); + mIndicationArea.setAlpha(1f - darkAmount); } private static boolean isSuccessfulLaunch(int result) { @@ -842,10 +836,10 @@ public class KeyguardBottomAreaView extends FrameLayout implements View.OnClickL public void dozeTimeTick() { if (mDarkAmount == 1) { - // Move indication every minute to avoid burn-in - int dozeTranslation = mIndicationBottomMargin - mIndicationBottomMarginAmbient; - int burnInYOffset = (int) (-mBurnInYOffset + Math.random() * mBurnInYOffset * 2); - mIndicationArea.setTranslationY(dozeTranslation + burnInYOffset); + // Move views every minute to avoid burn-in + int burnInYOffset = getBurnInOffset(mBurnInYOffset * 2, false /* xAxis */) + - mBurnInYOffset; + mLockIcon.setTranslationY(burnInYOffset); } } @@ -854,7 +848,7 @@ public class KeyguardBottomAreaView extends FrameLayout implements View.OnClickL return; } mBurnInXOffset = burnInXOffset; - mIndicationArea.setTranslationX(burnInXOffset); + mLockIcon.setTranslationX(burnInXOffset); } private class DefaultLeftButton implements IntentButton { diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/phone/KeyguardClockPositionAlgorithm.java b/packages/SystemUI/src/com/android/systemui/statusbar/phone/KeyguardClockPositionAlgorithm.java index 042e4ff16d3a..33bc164d807c 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/phone/KeyguardClockPositionAlgorithm.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/phone/KeyguardClockPositionAlgorithm.java @@ -16,6 +16,7 @@ package com.android.systemui.statusbar.phone; +import static com.android.systemui.doze.util.BurnInHelperKt.getBurnInOffset; import static com.android.systemui.statusbar.notification.NotificationUtils.interpolate; import android.content.res.Resources; @@ -30,10 +31,6 @@ import com.android.systemui.R; */ public class KeyguardClockPositionAlgorithm { - private static final long MILLIS_PER_MINUTES = 1000 * 60; - private static final float BURN_IN_PREVENTION_PERIOD_Y = 521; - private static final float BURN_IN_PREVENTION_PERIOD_X = 83; - /** * How much the clock height influences the shade position. * 0 means nothing, 1 means move the shade up by the height of the clock @@ -228,34 +225,15 @@ public class KeyguardClockPositionAlgorithm { } private float burnInPreventionOffsetY() { - return zigzag(System.currentTimeMillis() / MILLIS_PER_MINUTES, - mBurnInPreventionOffsetY * 2, - BURN_IN_PREVENTION_PERIOD_Y) + return getBurnInOffset(mBurnInPreventionOffsetY * 2, false /* xAxis */) - mBurnInPreventionOffsetY; } private float burnInPreventionOffsetX() { - return zigzag(System.currentTimeMillis() / MILLIS_PER_MINUTES, - mBurnInPreventionOffsetX * 2, - BURN_IN_PREVENTION_PERIOD_X) + return getBurnInOffset(mBurnInPreventionOffsetX * 2, true /* xAxis */) - mBurnInPreventionOffsetX; } - /** - * Implements a continuous, piecewise linear, periodic zig-zag function - * - * Can be thought of as a linear approximation of abs(sin(x))) - * - * @param period period of the function, ie. zigzag(x + period) == zigzag(x) - * @param amplitude maximum value of the function - * @return a value between 0 and amplitude - */ - private float zigzag(float x, float amplitude, float period) { - float xprime = (x % period) / (period / 2); - float interpolationAmount = (xprime <= 1) ? xprime : (2 - xprime); - return interpolate(0, amplitude, interpolationAmount); - } - public static class Result { /** diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/phone/KeyguardStatusBarView.java b/packages/SystemUI/src/com/android/systemui/statusbar/phone/KeyguardStatusBarView.java index 5630da6662e9..7c84df91fffa 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/phone/KeyguardStatusBarView.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/phone/KeyguardStatusBarView.java @@ -17,6 +17,7 @@ package com.android.systemui.statusbar.phone; import static com.android.systemui.ScreenDecorations.DisplayCutoutView.boundsFromDirection; +import static com.android.systemui.doze.util.BurnInHelperKt.getBurnInOffset; import android.annotation.ColorInt; import android.content.Context; @@ -70,16 +71,18 @@ public class KeyguardStatusBarView extends RelativeLayout private static final int LAYOUT_CUTOUT = 1; private static final int LAYOUT_NO_CUTOUT = 2; + private final Rect mEmptyRect = new Rect(0, 0, 0, 0); + private boolean mShowPercentAvailable; private boolean mBatteryCharging; private boolean mKeyguardUserSwitcherShowing; private boolean mBatteryListening; private TextView mCarrierLabel; - private View mSystemIconsSuperContainer; private MultiUserSwitch mMultiUserSwitch; private ImageView mMultiUserAvatar; private BatteryMeterView mBatteryView; + private StatusIconContainer mStatusIconContainer; private BatteryController mBatteryController; private KeyguardUserSwitcher mKeyguardUserSwitcher; @@ -99,6 +102,18 @@ public class KeyguardStatusBarView extends RelativeLayout */ private int mCutoutSideNudge = 0; + /** + * How much to move icons to avoid burn in. + */ + private int mBurnInOffset; + private int mCurrentBurnInOffsetX; + private int mCurrentBurnInOffsetY; + + /** + * Ratio representing being in ambient mode or not. + */ + private float mDarkAmount; + public KeyguardStatusBarView(Context context, AttributeSet attrs) { super(context, attrs); } @@ -113,6 +128,7 @@ public class KeyguardStatusBarView extends RelativeLayout mBatteryView = mSystemIconsContainer.findViewById(R.id.battery); mCutoutSpace = findViewById(R.id.cutout_space_view); mStatusIconArea = findViewById(R.id.status_icon_area); + mStatusIconContainer = findViewById(R.id.statusIcons); loadDimens(); updateUserSwitcher(); @@ -169,6 +185,8 @@ public class KeyguardStatusBarView extends RelativeLayout R.dimen.system_icons_super_container_avatarless_margin_end); mCutoutSideNudge = getResources().getDimensionPixelSize( R.dimen.display_cutout_margin_consumption); + mBurnInOffset = getResources().getDimensionPixelSize( + R.dimen.default_burn_in_prevention_offset); mShowPercentAvailable = getContext().getResources().getBoolean( com.android.internal.R.bool.config_battery_percentage_setting_available); } @@ -440,6 +458,14 @@ public class KeyguardStatusBarView extends RelativeLayout } public void onThemeChanged() { + mBatteryView.setColorsFromContext(mContext); + updateIconsAndTextColors(); + // Reload user avatar + ((UserInfoControllerImpl) Dependency.get(UserInfoController.class)) + .onDensityOrFontScaleChanged(); + } + + private void updateIconsAndTextColors() { @ColorInt int textColor = Utils.getColorAttrDefaultColor(mContext, R.attr.wallpaperTextColor); @ColorInt int iconColor = Utils.getColorStateListDefaultColor(mContext, @@ -448,14 +474,9 @@ public class KeyguardStatusBarView extends RelativeLayout float intensity = textColor == Color.WHITE ? 0 : 1; mCarrierLabel.setTextColor(iconColor); mIconManager.setTint(iconColor); - mBatteryView.setColorsFromContext(mContext); - Rect tintArea = new Rect(0, 0, 0, 0); - applyDarkness(R.id.battery, tintArea, intensity, iconColor); - applyDarkness(R.id.clock, tintArea, intensity, iconColor); - // Reload user avatar - ((UserInfoControllerImpl) Dependency.get(UserInfoController.class)) - .onDensityOrFontScaleChanged(); + applyDarkness(R.id.battery, mEmptyRect, intensity * (1f - mDarkAmount), iconColor); + applyDarkness(R.id.clock, mEmptyRect, intensity, iconColor); } private void applyDarkness(int id, Rect tintArea, float intensity, int color) { @@ -475,4 +496,32 @@ public class KeyguardStatusBarView extends RelativeLayout mBatteryView.dump(fd, pw, args); } } + + public void setDarkAmount(float darkAmount) { + mDarkAmount = darkAmount; + if (darkAmount == 0) { + dozeTimeTick(); + } + updateDozeState(); + } + + public void dozeTimeTick() { + mCurrentBurnInOffsetX = getBurnInOffset(mBurnInOffset, true /* xAxis */); + mCurrentBurnInOffsetY = getBurnInOffset(mBurnInOffset, false /* xAxis */); + updateDozeState(); + } + + private void updateDozeState() { + float alpha = 1f - mDarkAmount; + int visibility = alpha != 0f ? VISIBLE : INVISIBLE; + mCarrierLabel.setAlpha(alpha); + mCarrierLabel.setVisibility(visibility); + mStatusIconContainer.setAlpha(alpha); + mStatusIconContainer.setVisibility(visibility); + + mSystemIconsContainer.setTranslationX(-mCurrentBurnInOffsetX * mDarkAmount); + mSystemIconsContainer.setTranslationY(mCurrentBurnInOffsetY * mDarkAmount); + updateIconsAndTextColors(); + } + } diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/phone/NotificationPanelView.java b/packages/SystemUI/src/com/android/systemui/statusbar/phone/NotificationPanelView.java index e5e5d4038c37..3a4c218d337e 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/phone/NotificationPanelView.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/phone/NotificationPanelView.java @@ -63,6 +63,7 @@ import com.android.systemui.classifier.FalsingManager; import com.android.systemui.fragments.FragmentHostManager; import com.android.systemui.fragments.FragmentHostManager.FragmentListener; import com.android.systemui.plugins.qs.QS; +import com.android.systemui.qs.QSFragment; import com.android.systemui.statusbar.FlingAnimationUtils; import com.android.systemui.statusbar.GestureRecorder; import com.android.systemui.statusbar.KeyguardAffordanceView; @@ -455,6 +456,10 @@ public class NotificationPanelView extends PanelView implements initBottomArea(); setDarkAmount(mLinearDarkAmount, mInterpolatedDarkAmount); + if (mKeyguardStatusBar != null) { + mKeyguardStatusBar.onThemeChanged(); + } + setKeyguardStatusViewVisibility(mBarState, false, false); setKeyguardBottomAreaVisibility(mBarState, false); } @@ -1836,10 +1841,10 @@ public class NotificationPanelView extends PanelView implements return; } float alphaQsExpansion = 1 - Math.min(1, getQsExpansionFraction() * 2); - mKeyguardStatusBar.setAlpha(Math.min(getKeyguardContentsAlpha(), alphaQsExpansion) - * mKeyguardStatusBarAnimateAlpha); - mKeyguardStatusBar.setVisibility(mKeyguardStatusBar.getAlpha() != 0f - && !mDozing ? VISIBLE : INVISIBLE); + float newAlpha = Math.min(getKeyguardContentsAlpha(), alphaQsExpansion) + * mKeyguardStatusBarAnimateAlpha; + mKeyguardStatusBar.setAlpha(newAlpha); + mKeyguardStatusBar.setVisibility(newAlpha != 0f ? VISIBLE : INVISIBLE); } private void updateKeyguardBottomAreaAlpha() { @@ -2347,16 +2352,7 @@ public class NotificationPanelView extends PanelView implements } private void updateDozingVisibilities(boolean animate) { - if (mDozing) { - mKeyguardStatusBar.setVisibility(View.INVISIBLE); - mKeyguardBottomArea.setDozing(mDozing, animate); - } else { - mKeyguardStatusBar.setVisibility(View.VISIBLE); - mKeyguardBottomArea.setDozing(mDozing, animate); - if (animate) { - animateKeyguardStatusBarIn(DOZE_ANIMATION_DURATION); - } - } + mKeyguardBottomArea.setDozing(mDozing, animate); } @Override @@ -2749,6 +2745,9 @@ public class NotificationPanelView extends PanelView implements } }); mNotificationStackScroller.setQsContainer((ViewGroup) mQs.getView()); + if (mQs instanceof QSFragment) { + mKeyguardStatusBar.setQSPanel(((QSFragment) mQs).getQsPanel()); + } updateQsExpansion(); } @@ -2811,6 +2810,7 @@ public class NotificationPanelView extends PanelView implements private void setDarkAmount(float linearAmount, float amount) { mInterpolatedDarkAmount = amount; mLinearDarkAmount = linearAmount; + mKeyguardStatusBar.setDarkAmount(mInterpolatedDarkAmount); mKeyguardStatusView.setDarkAmount(mInterpolatedDarkAmount); mKeyguardBottomArea.setDarkAmount(mInterpolatedDarkAmount); positionClockAndNotifications(); @@ -2837,6 +2837,7 @@ public class NotificationPanelView extends PanelView implements } public void dozeTimeTick() { + mKeyguardStatusBar.dozeTimeTick(); mKeyguardStatusView.dozeTimeTick(); mKeyguardBottomArea.dozeTimeTick(); if (mInterpolatedDarkAmount > 0) { diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/phone/StatusBar.java b/packages/SystemUI/src/com/android/systemui/statusbar/phone/StatusBar.java index e1d86387cdfd..103781b7ae3c 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/phone/StatusBar.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/phone/StatusBar.java @@ -381,8 +381,6 @@ public class StatusBar extends SystemUI implements DemoMode, // settings private QSPanel mQSPanel; - // top bar - private KeyguardStatusBarView mKeyguardStatusBar; KeyguardIndicationController mKeyguardIndicationController; // RemoteInputView to be activated after unlock @@ -805,7 +803,6 @@ public class StatusBar extends SystemUI implements DemoMode, mAboveShelfObserver = new AboveShelfObserver(mStackScroller); mAboveShelfObserver.setListener(mStatusBarWindow.findViewById( R.id.notification_container_parent)); - mKeyguardStatusBar = mStatusBarWindow.findViewById(R.id.keyguard_header); mNotificationIconAreaController = SystemUIFactory.getInstance() .createNotificationIconAreaController(context, this); @@ -980,7 +977,6 @@ public class StatusBar extends SystemUI implements DemoMode, ((QSFragment) qs).setHost(qsh); mQSPanel = ((QSFragment) qs).getQsPanel(); mQSPanel.setBrightnessMirror(mBrightnessMirrorController); - mKeyguardStatusBar.setQSPanel(mQSPanel); } }); } @@ -1118,8 +1114,6 @@ public class StatusBar extends SystemUI implements DemoMode, @Override public void onThemeChanged() { - // The status bar on the keyguard is a special layout. - if (mKeyguardStatusBar != null) mKeyguardStatusBar.onThemeChanged(); // Recreate Indication controller because internal references changed mKeyguardIndicationController = SystemUIFactory.getInstance().createKeyguardIndicationController(mContext, @@ -1154,7 +1148,8 @@ public class StatusBar extends SystemUI implements DemoMode, protected void createUserSwitcher() { mKeyguardUserSwitcher = new KeyguardUserSwitcher(mContext, - mStatusBarWindow.findViewById(R.id.keyguard_user_switcher), mKeyguardStatusBar, + mStatusBarWindow.findViewById(R.id.keyguard_user_switcher), + mStatusBarWindow.findViewById(R.id.keyguard_header), mNotificationPanel); } |