diff options
author | android-build-team Robot <android-build-team-robot@google.com> | 2019-11-08 23:25:22 +0000 |
---|---|---|
committer | android-build-team Robot <android-build-team-robot@google.com> | 2019-11-08 23:25:22 +0000 |
commit | 50790f20550a20b311328e23d135c91d1d69659a (patch) | |
tree | 6d2347ca0440dc38be826030479c08669dc63285 | |
parent | 0d7e17eb676695de8b19ad2ec33fdfcefa165b97 (diff) | |
parent | ca91ceeb13e1cb6981bdeaedb1c21c3a7b1a58f1 (diff) | |
download | base-android10-qpr1-c-s1-release.tar.gz |
Snap for 5974828 from ca91ceeb13e1cb6981bdeaedb1c21c3a7b1a58f1 to qt-qpr1-c-releaseandroid-10.0.0_r20android10-qpr1-c-s1-release
Change-Id: I9891d51e2ba0442495f982db4c612f457de5a493
23 files changed, 523 insertions, 252 deletions
diff --git a/packages/CarSystemUI/src/com/android/systemui/car/CarNotificationInterruptionStateProvider.java b/packages/CarSystemUI/src/com/android/systemui/car/CarNotificationInterruptionStateProvider.java index afd722ba0091..447e579ece42 100644 --- a/packages/CarSystemUI/src/com/android/systemui/car/CarNotificationInterruptionStateProvider.java +++ b/packages/CarSystemUI/src/com/android/systemui/car/CarNotificationInterruptionStateProvider.java @@ -22,6 +22,7 @@ import com.android.systemui.plugins.statusbar.StatusBarStateController; import com.android.systemui.statusbar.notification.NotificationFilter; import com.android.systemui.statusbar.notification.NotificationInterruptionStateProvider; import com.android.systemui.statusbar.notification.collection.NotificationEntry; +import com.android.systemui.statusbar.policy.BatteryController; import javax.inject.Inject; import javax.inject.Singleton; @@ -34,8 +35,9 @@ public class CarNotificationInterruptionStateProvider extends @Inject public CarNotificationInterruptionStateProvider(Context context, NotificationFilter filter, - StatusBarStateController stateController) { - super(context, filter, stateController); + StatusBarStateController stateController, + BatteryController batteryController) { + super(context, filter, stateController, batteryController); } @Override diff --git a/packages/CarSystemUI/src/com/android/systemui/statusbar/car/CarBatteryController.java b/packages/CarSystemUI/src/com/android/systemui/statusbar/car/CarBatteryController.java index 58f80a4ed968..d79849ccafc6 100644 --- a/packages/CarSystemUI/src/com/android/systemui/statusbar/car/CarBatteryController.java +++ b/packages/CarSystemUI/src/com/android/systemui/statusbar/car/CarBatteryController.java @@ -257,6 +257,11 @@ public class CarBatteryController extends BroadcastReceiver implements BatteryCo return false; } + @Override + public boolean isAodPowerSave() { + return false; + } + private void notifyBatteryLevelChanged() { for (int i = 0, size = mChangeCallbacks.size(); i < size; i++) { mChangeCallbacks.get(i) diff --git a/packages/SystemUI/res/layout/super_status_bar.xml b/packages/SystemUI/res/layout/super_status_bar.xml index a91493003bb5..9716a00a7f72 100644 --- a/packages/SystemUI/res/layout/super_status_bar.xml +++ b/packages/SystemUI/res/layout/super_status_bar.xml @@ -44,7 +44,7 @@ </com.android.systemui.statusbar.BackDropView> <com.android.systemui.statusbar.ScrimView - android:id="@+id/scrim_behind" + android:id="@+id/scrim_for_bubble" android:layout_width="match_parent" android:layout_height="match_parent" android:importantForAccessibility="no" @@ -56,6 +56,14 @@ android:layout_width="match_parent" android:layout_height="wrap_content" /> + <com.android.systemui.statusbar.ScrimView + android:id="@+id/scrim_behind" + android:layout_width="match_parent" + android:layout_height="match_parent" + android:importantForAccessibility="no" + sysui:ignoreRightInset="true" + /> + <include layout="@layout/status_bar_expanded" android:layout_width="match_parent" android:layout_height="match_parent" diff --git a/packages/SystemUI/src/com/android/systemui/SystemUIFactory.java b/packages/SystemUI/src/com/android/systemui/SystemUIFactory.java index 0899d955a1ac..d151f7dc62be 100644 --- a/packages/SystemUI/src/com/android/systemui/SystemUIFactory.java +++ b/packages/SystemUI/src/com/android/systemui/SystemUIFactory.java @@ -123,11 +123,12 @@ public class SystemUIFactory { } public ScrimController createScrimController(ScrimView scrimBehind, ScrimView scrimInFront, + ScrimView scrimForBubble, LockscreenWallpaper lockscreenWallpaper, TriConsumer<ScrimState, Float, GradientColors> scrimStateListener, Consumer<Integer> scrimVisibleListener, DozeParameters dozeParameters, AlarmManager alarmManager, KeyguardMonitor keyguardMonitor) { - return new ScrimController(scrimBehind, scrimInFront, scrimStateListener, + return new ScrimController(scrimBehind, scrimInFront, scrimForBubble, scrimStateListener, scrimVisibleListener, dozeParameters, alarmManager, keyguardMonitor); } diff --git a/packages/SystemUI/src/com/android/systemui/bubbles/BubbleController.java b/packages/SystemUI/src/com/android/systemui/bubbles/BubbleController.java index 5559d29a9050..3cc91de43438 100644 --- a/packages/SystemUI/src/com/android/systemui/bubbles/BubbleController.java +++ b/packages/SystemUI/src/com/android/systemui/bubbles/BubbleController.java @@ -316,10 +316,9 @@ public class BubbleController implements ConfigurationController.ConfigurationLi if (mStackView == null) { mStackView = new BubbleStackView(mContext, mBubbleData, mSurfaceSynchronizer); ViewGroup sbv = mStatusBarWindowController.getStatusBarView(); - // TODO(b/130237686): When you expand the shade on top of expanded bubble, there is no - // scrim between bubble and the shade - int bubblePosition = sbv.indexOfChild(sbv.findViewById(R.id.scrim_behind)) + 1; - sbv.addView(mStackView, bubblePosition, + int bubbleScrimIndex = sbv.indexOfChild(sbv.findViewById(R.id.scrim_for_bubble)); + int stackIndex = bubbleScrimIndex + 1; // Show stack above bubble scrim. + sbv.addView(mStackView, stackIndex, new FrameLayout.LayoutParams(MATCH_PARENT, MATCH_PARENT)); if (mExpandListener != null) { mStackView.setExpandListener(mExpandListener); diff --git a/packages/SystemUI/src/com/android/systemui/doze/DozeFactory.java b/packages/SystemUI/src/com/android/systemui/doze/DozeFactory.java index 90cb05a8e6ee..0e124e48f165 100644 --- a/packages/SystemUI/src/com/android/systemui/doze/DozeFactory.java +++ b/packages/SystemUI/src/com/android/systemui/doze/DozeFactory.java @@ -33,6 +33,7 @@ import com.android.systemui.keyguard.WakefulnessLifecycle; import com.android.systemui.plugins.FalsingManager; import com.android.systemui.statusbar.phone.BiometricUnlockController; import com.android.systemui.statusbar.phone.DozeParameters; +import com.android.systemui.statusbar.policy.BatteryController; import com.android.systemui.util.AsyncSensorManager; import com.android.systemui.util.wakelock.DelayedWakeLock; import com.android.systemui.util.wakelock.WakeLock; @@ -64,7 +65,7 @@ public class DozeFactory { params); DozeMachine machine = new DozeMachine(wrappedService, config, wakeLock, - wakefulnessLifecycle); + wakefulnessLifecycle, Dependency.get(BatteryController.class)); machine.setParts(new DozeMachine.Part[]{ new DozePauser(handler, machine, alarmManager, params.getPolicy()), new DozeFalsingManagerAdapter(falsingManager), diff --git a/packages/SystemUI/src/com/android/systemui/doze/DozeMachine.java b/packages/SystemUI/src/com/android/systemui/doze/DozeMachine.java index 93a51cc20db2..7f2d52780a23 100644 --- a/packages/SystemUI/src/com/android/systemui/doze/DozeMachine.java +++ b/packages/SystemUI/src/com/android/systemui/doze/DozeMachine.java @@ -27,6 +27,7 @@ import com.android.internal.util.Preconditions; import com.android.systemui.keyguard.WakefulnessLifecycle; import com.android.systemui.keyguard.WakefulnessLifecycle.Wakefulness; import com.android.systemui.statusbar.phone.DozeParameters; +import com.android.systemui.statusbar.policy.BatteryController; import com.android.systemui.util.Assert; import com.android.systemui.util.wakelock.WakeLock; @@ -121,6 +122,7 @@ public class DozeMachine { private final WakeLock mWakeLock; private final AmbientDisplayConfiguration mConfig; private final WakefulnessLifecycle mWakefulnessLifecycle; + private final BatteryController mBatteryController; private Part[] mParts; private final ArrayList<State> mQueuedRequests = new ArrayList<>(); @@ -129,11 +131,13 @@ public class DozeMachine { private boolean mWakeLockHeldForCurrentState = false; public DozeMachine(Service service, AmbientDisplayConfiguration config, - WakeLock wakeLock, WakefulnessLifecycle wakefulnessLifecycle) { + WakeLock wakeLock, WakefulnessLifecycle wakefulnessLifecycle, + BatteryController batteryController) { mDozeService = service; mConfig = config; mWakefulnessLifecycle = wakefulnessLifecycle; mWakeLock = wakeLock; + mBatteryController = batteryController; } /** Initializes the set of {@link Part}s. Must be called exactly once after construction. */ @@ -316,6 +320,9 @@ public class DozeMachine { Log.i(TAG, "Dropping pulse done because current state is already done: " + mState); return mState; } + if (requestedState == State.DOZE_AOD && mBatteryController.isAodPowerSave()) { + return State.DOZE; + } if (requestedState == State.DOZE_REQUEST_PULSE && !mState.canPulse()) { Log.i(TAG, "Dropping pulse request because current state can't pulse: " + mState); return mState; diff --git a/packages/SystemUI/src/com/android/systemui/doze/DozeTriggers.java b/packages/SystemUI/src/com/android/systemui/doze/DozeTriggers.java index bab64db4519c..6199a0deb31f 100644 --- a/packages/SystemUI/src/com/android/systemui/doze/DozeTriggers.java +++ b/packages/SystemUI/src/com/android/systemui/doze/DozeTriggers.java @@ -345,7 +345,6 @@ public class DozeTriggers implements DozeMachine.Part { private void checkTriggersAtInit() { if (mUiModeManager.getCurrentModeType() == Configuration.UI_MODE_TYPE_CAR - || mDozeHost.isPowerSaveActive() || mDozeHost.isBlockingDoze() || !mDozeHost.isProvisioned()) { mMachine.requestState(DozeMachine.State.FINISH); @@ -574,8 +573,8 @@ public class DozeTriggers implements DozeMachine.Part { @Override public void onPowerSaveChanged(boolean active) { - if (active) { - mMachine.requestState(DozeMachine.State.FINISH); + if (mDozeHost.isPowerSaveActive()) { + mMachine.requestState(DozeMachine.State.DOZE); } } }; diff --git a/packages/SystemUI/src/com/android/systemui/doze/DozeUi.java b/packages/SystemUI/src/com/android/systemui/doze/DozeUi.java index 1f33af8c3f55..3869e77294e7 100644 --- a/packages/SystemUI/src/com/android/systemui/doze/DozeUi.java +++ b/packages/SystemUI/src/com/android/systemui/doze/DozeUi.java @@ -83,7 +83,8 @@ public class DozeUi implements DozeMachine.Part { */ private void updateAnimateScreenOff() { if (mCanAnimateTransition) { - final boolean controlScreenOff = mDozeParameters.getAlwaysOn() && mKeyguardShowing; + final boolean controlScreenOff = mDozeParameters.getAlwaysOn() && mKeyguardShowing + && !mHost.isPowerSaveActive(); mDozeParameters.setControlScreenOffAnimation(controlScreenOff); mHost.setAnimateScreenOff(controlScreenOff); } diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/notification/NotificationInterruptionStateProvider.java b/packages/SystemUI/src/com/android/systemui/statusbar/notification/NotificationInterruptionStateProvider.java index 150667b86828..ef09434aa395 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/notification/NotificationInterruptionStateProvider.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/notification/NotificationInterruptionStateProvider.java @@ -39,6 +39,7 @@ import com.android.systemui.plugins.statusbar.StatusBarStateController; import com.android.systemui.statusbar.NotificationPresenter; import com.android.systemui.statusbar.StatusBarState; import com.android.systemui.statusbar.notification.collection.NotificationEntry; +import com.android.systemui.statusbar.policy.BatteryController; import com.android.systemui.statusbar.policy.HeadsUpManager; import javax.inject.Inject; @@ -63,6 +64,7 @@ public class NotificationInterruptionStateProvider { private final Context mContext; private final PowerManager mPowerManager; private final IDreamManager mDreamManager; + private final BatteryController mBatteryController; private NotificationPresenter mPresenter; private HeadsUpManager mHeadsUpManager; @@ -75,13 +77,14 @@ public class NotificationInterruptionStateProvider { @Inject public NotificationInterruptionStateProvider(Context context, NotificationFilter filter, - StatusBarStateController stateController) { + StatusBarStateController stateController, BatteryController batteryController) { this(context, (PowerManager) context.getSystemService(Context.POWER_SERVICE), IDreamManager.Stub.asInterface( ServiceManager.checkService(DreamService.DREAM_SERVICE)), new AmbientDisplayConfiguration(context), filter, + batteryController, stateController); } @@ -92,10 +95,12 @@ public class NotificationInterruptionStateProvider { IDreamManager dreamManager, AmbientDisplayConfiguration ambientDisplayConfiguration, NotificationFilter notificationFilter, + BatteryController batteryController, StatusBarStateController statusBarStateController) { mContext = context; mPowerManager = powerManager; mDreamManager = dreamManager; + mBatteryController = batteryController; mAmbientDisplayConfiguration = ambientDisplayConfiguration; mNotificationFilter = notificationFilter; mStatusBarStateController = statusBarStateController; @@ -293,6 +298,13 @@ public class NotificationInterruptionStateProvider { return false; } + if (mBatteryController.isAodPowerSave()) { + if (DEBUG_HEADS_UP) { + Log.d(TAG, "No pulsing: disabled by battery saver: " + sbn.getKey()); + } + return false; + } + if (!canAlertCommon(entry)) { if (DEBUG_HEADS_UP) { Log.d(TAG, "No pulsing: notification shouldn't alert: " + sbn.getKey()); diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/phone/LockIcon.java b/packages/SystemUI/src/com/android/systemui/statusbar/phone/LockIcon.java index 06a2225ed0bf..ecfc45bb1182 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/phone/LockIcon.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/phone/LockIcon.java @@ -604,7 +604,7 @@ public class LockIcon extends KeyguardAffordanceView implements OnUserInfoChange */ public void onScrimVisibilityChanged(@ScrimVisibility int scrimsVisible) { if (mWakeAndUnlockRunning - && scrimsVisible == ScrimController.VISIBILITY_FULLY_TRANSPARENT) { + && scrimsVisible == ScrimController.TRANSPARENT) { mWakeAndUnlockRunning = false; update(); } diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/phone/ScrimController.java b/packages/SystemUI/src/com/android/systemui/statusbar/phone/ScrimController.java index 9019e9a3f44b..2f567177f814 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/phone/ScrimController.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/phone/ScrimController.java @@ -79,23 +79,24 @@ public class ScrimController implements ViewTreeObserver.OnPreDrawListener, OnCo /** * When both scrims have 0 alpha. */ - public static final int VISIBILITY_FULLY_TRANSPARENT = 0; + public static final int TRANSPARENT = 0; /** * When scrims aren't transparent (alpha 0) but also not opaque (alpha 1.) */ - public static final int VISIBILITY_SEMI_TRANSPARENT = 1; + public static final int SEMI_TRANSPARENT = 1; /** * When at least 1 scrim is fully opaque (alpha set to 1.) */ - public static final int VISIBILITY_FULLY_OPAQUE = 2; + public static final int OPAQUE = 2; - @IntDef(prefix = { "VISIBILITY_" }, value = { - VISIBILITY_FULLY_TRANSPARENT, - VISIBILITY_SEMI_TRANSPARENT, - VISIBILITY_FULLY_OPAQUE + @IntDef(prefix = {"VISIBILITY_"}, value = { + TRANSPARENT, + SEMI_TRANSPARENT, + OPAQUE }) @Retention(RetentionPolicy.SOURCE) - public @interface ScrimVisibility {} + public @interface ScrimVisibility { + } /** * Default alpha value for most scrims. @@ -123,8 +124,11 @@ public class ScrimController implements ViewTreeObserver.OnPreDrawListener, OnCo private ScrimState mState = ScrimState.UNINITIALIZED; private final Context mContext; - protected final ScrimView mScrimBehind; + protected final ScrimView mScrimInFront; + protected final ScrimView mScrimBehind; + protected final ScrimView mScrimForBubble; + private final UnlockMethodCache mUnlockMethodCache; private final KeyguardUpdateMonitor mKeyguardUpdateMonitor; private final DozeParameters mDozeParameters; @@ -153,10 +157,15 @@ public class ScrimController implements ViewTreeObserver.OnPreDrawListener, OnCo private Runnable mOnAnimationFinished; private boolean mDeferFinishedListener; private final Interpolator mInterpolator = new DecelerateInterpolator(); - private float mCurrentInFrontAlpha = NOT_INITIALIZED; - private float mCurrentBehindAlpha = NOT_INITIALIZED; - private int mCurrentInFrontTint; - private int mCurrentBehindTint; + + private float mInFrontAlpha = NOT_INITIALIZED; + private float mBehindAlpha = NOT_INITIALIZED; + private float mBubbleAlpha = NOT_INITIALIZED; + + private int mInFrontTint; + private int mBehindTint; + private int mBubbleTint; + private boolean mWallpaperVisibilityTimedOut; private int mScrimsVisibility; private final TriConsumer<ScrimState, Float, GradientColors> mScrimStateListener; @@ -175,14 +184,17 @@ public class ScrimController implements ViewTreeObserver.OnPreDrawListener, OnCo private boolean mWakeLockHeld; private boolean mKeyguardOccluded; - public ScrimController(ScrimView scrimBehind, ScrimView scrimInFront, + public ScrimController(ScrimView scrimBehind, ScrimView scrimInFront, ScrimView scrimForBubble, TriConsumer<ScrimState, Float, GradientColors> scrimStateListener, Consumer<Integer> scrimVisibleListener, DozeParameters dozeParameters, AlarmManager alarmManager, KeyguardMonitor keyguardMonitor) { mScrimBehind = scrimBehind; mScrimInFront = scrimInFront; + mScrimForBubble = scrimForBubble; + mScrimStateListener = scrimStateListener; mScrimVisibleListener = scrimVisibleListener; + mContext = scrimBehind.getContext(); mUnlockMethodCache = UnlockMethodCache.getInstance(mContext); mDarkenWhileDragging = !mUnlockMethodCache.canSkipBouncer(); @@ -213,12 +225,13 @@ public class ScrimController implements ViewTreeObserver.OnPreDrawListener, OnCo final ScrimState[] states = ScrimState.values(); for (int i = 0; i < states.length; i++) { - states[i].init(mScrimInFront, mScrimBehind, mDozeParameters); + states[i].init(mScrimInFront, mScrimBehind, mScrimForBubble, mDozeParameters); states[i].setScrimBehindAlphaKeyguard(mScrimBehindAlphaKeyguard); } mScrimBehind.setDefaultFocusHighlightEnabled(false); mScrimInFront.setDefaultFocusHighlightEnabled(false); + mScrimForBubble.setDefaultFocusHighlightEnabled(false); updateScrims(); } @@ -257,10 +270,14 @@ public class ScrimController implements ViewTreeObserver.OnPreDrawListener, OnCo mBlankScreen = state.getBlanksScreen(); mAnimateChange = state.getAnimateChange(); mAnimationDuration = state.getAnimationDuration(); - mCurrentInFrontTint = state.getFrontTint(); - mCurrentBehindTint = state.getBehindTint(); - mCurrentInFrontAlpha = state.getFrontAlpha(); - mCurrentBehindAlpha = state.getBehindAlpha(); + + mInFrontTint = state.getFrontTint(); + mBehindTint = state.getBehindTint(); + mBubbleTint = state.getBubbleTint(); + + mInFrontAlpha = state.getFrontAlpha(); + mBehindAlpha = state.getBehindAlpha(); + mBubbleAlpha = state.getBubbleAlpha(); applyExpansionToAlpha(); // Scrim might acquire focus when user is navigating with a D-pad or a keyboard. @@ -393,21 +410,20 @@ public class ScrimController implements ViewTreeObserver.OnPreDrawListener, OnCo if (mExpansionFraction != fraction) { mExpansionFraction = fraction; - final boolean keyguardOrUnlocked = mState == ScrimState.UNLOCKED - || mState == ScrimState.KEYGUARD || mState == ScrimState.PULSING; - if (!keyguardOrUnlocked || !mExpansionAffectsAlpha) { + boolean relevantState = (mState == ScrimState.UNLOCKED + || mState == ScrimState.KEYGUARD + || mState == ScrimState.PULSING + || mState == ScrimState.BUBBLE_EXPANDED); + if (!(relevantState && mExpansionAffectsAlpha)) { return; } - applyExpansionToAlpha(); - if (mUpdatePending) { return; } - setOrAdaptCurrentAnimation(mScrimBehind); setOrAdaptCurrentAnimation(mScrimInFront); - + setOrAdaptCurrentAnimation(mScrimForBubble); dispatchScrimState(mScrimBehind.getViewAlpha()); // Reset wallpaper timeout if it's already timeout like expanding panel while PULSING @@ -421,11 +437,10 @@ public class ScrimController implements ViewTreeObserver.OnPreDrawListener, OnCo } private void setOrAdaptCurrentAnimation(View scrim) { - if (!isAnimating(scrim)) { - updateScrimColor(scrim, getCurrentScrimAlpha(scrim), getCurrentScrimTint(scrim)); - } else { + float alpha = getCurrentScrimAlpha(scrim); + if (isAnimating(scrim)) { + // Adapt current animation. ValueAnimator previousAnimator = (ValueAnimator) scrim.getTag(TAG_KEY_ANIM); - float alpha = getCurrentScrimAlpha(scrim); float previousEndValue = (Float) scrim.getTag(TAG_END_ALPHA); float previousStartValue = (Float) scrim.getTag(TAG_START_ALPHA); float relativeDiff = alpha - previousEndValue; @@ -433,6 +448,9 @@ public class ScrimController implements ViewTreeObserver.OnPreDrawListener, OnCo scrim.setTag(TAG_START_ALPHA, newStartValue); scrim.setTag(TAG_END_ALPHA, alpha); previousAnimator.setCurrentPlayTime(previousAnimator.getCurrentPlayTime()); + } else { + // Set animation. + updateScrimColor(scrim, alpha, getCurrentScrimTint(scrim)); } } @@ -441,27 +459,27 @@ public class ScrimController implements ViewTreeObserver.OnPreDrawListener, OnCo return; } - if (mState == ScrimState.UNLOCKED) { + if (mState == ScrimState.UNLOCKED || mState == ScrimState.BUBBLE_EXPANDED) { // Darken scrim as you pull down the shade when unlocked float behindFraction = getInterpolatedFraction(); behindFraction = (float) Math.pow(behindFraction, 0.8f); - mCurrentBehindAlpha = behindFraction * GRADIENT_SCRIM_ALPHA_BUSY; - mCurrentInFrontAlpha = 0; + mBehindAlpha = behindFraction * GRADIENT_SCRIM_ALPHA_BUSY; + mInFrontAlpha = 0; } else if (mState == ScrimState.KEYGUARD || mState == ScrimState.PULSING) { // Either darken of make the scrim transparent when you // pull down the shade float interpolatedFract = getInterpolatedFraction(); float alphaBehind = mState.getBehindAlpha(); if (mDarkenWhileDragging) { - mCurrentBehindAlpha = MathUtils.lerp(GRADIENT_SCRIM_ALPHA_BUSY, alphaBehind, + mBehindAlpha = MathUtils.lerp(GRADIENT_SCRIM_ALPHA_BUSY, alphaBehind, interpolatedFract); - mCurrentInFrontAlpha = mState.getFrontAlpha(); + mInFrontAlpha = mState.getFrontAlpha(); } else { - mCurrentBehindAlpha = MathUtils.lerp(0 /* start */, alphaBehind, + mBehindAlpha = MathUtils.lerp(0 /* start */, alphaBehind, interpolatedFract); - mCurrentInFrontAlpha = mState.getFrontAlpha(); + mInFrontAlpha = mState.getFrontAlpha(); } - mCurrentBehindTint = ColorUtils.blendARGB(ScrimState.BOUNCER.getBehindTint(), + mBehindTint = ColorUtils.blendARGB(ScrimState.BOUNCER.getBehindTint(), mState.getBehindTint(), interpolatedFract); } } @@ -486,8 +504,8 @@ public class ScrimController implements ViewTreeObserver.OnPreDrawListener, OnCo */ public void setAodFrontScrimAlpha(float alpha) { if (((mState == ScrimState.AOD && mDozeParameters.getAlwaysOn()) - || mState == ScrimState.PULSING) && mCurrentInFrontAlpha != alpha) { - mCurrentInFrontAlpha = alpha; + || mState == ScrimState.PULSING) && mInFrontAlpha != alpha) { + mInFrontAlpha = alpha; updateScrims(); } @@ -501,9 +519,9 @@ public class ScrimController implements ViewTreeObserver.OnPreDrawListener, OnCo */ public void prepareForGentleWakeUp() { if (mState == ScrimState.AOD && mDozeParameters.getAlwaysOn()) { - mCurrentInFrontAlpha = 1f; - mCurrentInFrontTint = Color.BLACK; - mCurrentBehindTint = Color.BLACK; + mInFrontAlpha = 1f; + mInFrontTint = Color.BLACK; + mBehindTint = Color.BLACK; mAnimateChange = false; updateScrims(); mAnimateChange = true; @@ -521,8 +539,8 @@ public class ScrimController implements ViewTreeObserver.OnPreDrawListener, OnCo if (mState == ScrimState.PULSING) { float newBehindAlpha = mState.getBehindAlpha(); - if (mCurrentBehindAlpha != newBehindAlpha) { - mCurrentBehindAlpha = newBehindAlpha; + if (mBehindAlpha != newBehindAlpha) { + mBehindAlpha = newBehindAlpha; updateScrims(); } } @@ -544,8 +562,11 @@ public class ScrimController implements ViewTreeObserver.OnPreDrawListener, OnCo // Only animate scrim color if the scrim view is actually visible boolean animateScrimInFront = mScrimInFront.getViewAlpha() != 0 && !mBlankScreen; boolean animateScrimBehind = mScrimBehind.getViewAlpha() != 0 && !mBlankScreen; + boolean animateScrimForBubble = mScrimForBubble.getViewAlpha() != 0 && !mBlankScreen; + mScrimInFront.setColors(mColors, animateScrimInFront); mScrimBehind.setColors(mColors, animateScrimBehind); + mScrimForBubble.setColors(mColors, animateScrimForBubble); // Calculate minimum scrim opacity for white or black text. int textColor = mColors.supportsDarkText() ? Color.BLACK : Color.WHITE; @@ -564,12 +585,13 @@ public class ScrimController implements ViewTreeObserver.OnPreDrawListener, OnCo boolean occludedKeyguard = (mState == ScrimState.PULSING || mState == ScrimState.AOD) && mKeyguardOccluded; if (aodWallpaperTimeout || occludedKeyguard) { - mCurrentBehindAlpha = 1; + mBehindAlpha = 1; } - - setScrimInFrontAlpha(mCurrentInFrontAlpha); - setScrimBehindAlpha(mCurrentBehindAlpha); - + setScrimAlpha(mScrimInFront, mInFrontAlpha); + setScrimAlpha(mScrimBehind, mBehindAlpha); + setScrimAlpha(mScrimForBubble, mBubbleAlpha); + // The animation could have all already finished, let's call onFinished just in case + onFinished(); dispatchScrimsVisible(); } @@ -580,11 +602,11 @@ public class ScrimController implements ViewTreeObserver.OnPreDrawListener, OnCo private void dispatchScrimsVisible() { final int currentScrimVisibility; if (mScrimInFront.getViewAlpha() == 1 || mScrimBehind.getViewAlpha() == 1) { - currentScrimVisibility = VISIBILITY_FULLY_OPAQUE; + currentScrimVisibility = OPAQUE; } else if (mScrimInFront.getViewAlpha() == 0 && mScrimBehind.getViewAlpha() == 0) { - currentScrimVisibility = VISIBILITY_FULLY_TRANSPARENT; + currentScrimVisibility = TRANSPARENT; } else { - currentScrimVisibility = VISIBILITY_SEMI_TRANSPARENT; + currentScrimVisibility = SEMI_TRANSPARENT; } if (mScrimsVisibility != currentScrimVisibility) { @@ -601,18 +623,10 @@ public class ScrimController implements ViewTreeObserver.OnPreDrawListener, OnCo return 0; } else { // woo, special effects - return (float)(1f-0.5f*(1f-Math.cos(3.14159f * Math.pow(1f-frac, 2f)))); + return (float) (1f - 0.5f * (1f - Math.cos(3.14159f * Math.pow(1f - frac, 2f)))); } } - private void setScrimBehindAlpha(float alpha) { - setScrimAlpha(mScrimBehind, alpha); - } - - private void setScrimInFrontAlpha(float alpha) { - setScrimAlpha(mScrimInFront, alpha); - } - private void setScrimAlpha(ScrimView scrim, float alpha) { if (alpha == 0f) { scrim.setClickable(false); @@ -623,17 +637,26 @@ public class ScrimController implements ViewTreeObserver.OnPreDrawListener, OnCo updateScrim(scrim, alpha); } + private String getScrimName(ScrimView scrim) { + if (scrim == mScrimInFront) { + return "front_scrim"; + } else if (scrim == mScrimBehind) { + return "back_scrim"; + } else if (scrim == mScrimForBubble) { + return "bubble_scrim"; + } + return "unknown_scrim"; + } + private void updateScrimColor(View scrim, float alpha, int tint) { alpha = Math.max(0, Math.min(1.0f, alpha)); if (scrim instanceof ScrimView) { ScrimView scrimView = (ScrimView) scrim; - Trace.traceCounter(Trace.TRACE_TAG_APP, - scrim == mScrimInFront ? "front_scrim_alpha" : "back_scrim_alpha", + Trace.traceCounter(Trace.TRACE_TAG_APP, getScrimName(scrimView) + "_alpha", (int) (alpha * 255)); - Trace.traceCounter(Trace.TRACE_TAG_APP, - scrim == mScrimInFront ? "front_scrim_tint" : "back_scrim_tint", + Trace.traceCounter(Trace.TRACE_TAG_APP, getScrimName(scrimView) + "_tint", Color.alpha(tint)); scrimView.setTint(tint); @@ -667,9 +690,9 @@ public class ScrimController implements ViewTreeObserver.OnPreDrawListener, OnCo @Override public void onAnimationEnd(Animator animation) { + scrim.setTag(TAG_KEY_ANIM, null); onFinished(lastCallback); - scrim.setTag(TAG_KEY_ANIM, null); dispatchScrimsVisible(); if (!mDeferFinishedListener && mOnAnimationFinished != null) { @@ -690,9 +713,11 @@ public class ScrimController implements ViewTreeObserver.OnPreDrawListener, OnCo private float getCurrentScrimAlpha(View scrim) { if (scrim == mScrimInFront) { - return mCurrentInFrontAlpha; + return mInFrontAlpha; } else if (scrim == mScrimBehind) { - return mCurrentBehindAlpha; + return mBehindAlpha; + } else if (scrim == mScrimForBubble) { + return mBubbleAlpha; } else { throw new IllegalArgumentException("Unknown scrim view"); } @@ -700,9 +725,11 @@ public class ScrimController implements ViewTreeObserver.OnPreDrawListener, OnCo private int getCurrentScrimTint(View scrim) { if (scrim == mScrimInFront) { - return mCurrentInFrontTint; + return mInFrontTint; } else if (scrim == mScrimBehind) { - return mCurrentBehindTint; + return mBehindTint; + } else if (scrim == mScrimForBubble) { + return mBubbleTint; } else { throw new IllegalArgumentException("Unknown scrim view"); } @@ -729,6 +756,16 @@ public class ScrimController implements ViewTreeObserver.OnPreDrawListener, OnCo } private void onFinished(Callback callback) { + if (isAnimating(mScrimBehind) + || isAnimating(mScrimInFront) + || isAnimating(mScrimForBubble)) { + if (callback != null && callback != mCallback) { + // Since we only notify the callback that we're finished once everything has + // finished, we need to make sure that any changing callbacks are also invoked + callback.onFinished(); + } + return; + } if (mWakeLockHeld) { mWakeLock.release(TAG); mWakeLockHeld = false; @@ -745,8 +782,12 @@ public class ScrimController implements ViewTreeObserver.OnPreDrawListener, OnCo // When unlocking with fingerprint, we'll fade the scrims from black to transparent. // At the end of the animation we need to remove the tint. if (mState == ScrimState.UNLOCKED) { - mCurrentInFrontTint = Color.TRANSPARENT; - mCurrentBehindTint = Color.TRANSPARENT; + mInFrontTint = Color.TRANSPARENT; + mBehindTint = Color.TRANSPARENT; + mBubbleTint = Color.TRANSPARENT; + updateScrimColor(mScrimInFront, mInFrontAlpha, mInFrontTint); + updateScrimColor(mScrimBehind, mBehindAlpha, mBehindTint); + updateScrimColor(mScrimForBubble, mBubbleAlpha, mBubbleTint); } } @@ -805,10 +846,7 @@ public class ScrimController implements ViewTreeObserver.OnPreDrawListener, OnCo } else { // update the alpha directly updateScrimColor(scrim, alpha, getCurrentScrimTint(scrim)); - onFinished(); } - } else { - onFinished(); } } @@ -851,6 +889,7 @@ public class ScrimController implements ViewTreeObserver.OnPreDrawListener, OnCo /** * Executes a callback after the frame has hit the display. + * * @param callback What to run. */ @VisibleForTesting @@ -894,16 +933,35 @@ public class ScrimController implements ViewTreeObserver.OnPreDrawListener, OnCo @Override public void dump(FileDescriptor fd, PrintWriter pw, String[] args) { pw.println(" ScrimController: "); - pw.print(" state: "); pw.println(mState); - pw.print(" frontScrim:"); pw.print(" viewAlpha="); pw.print(mScrimInFront.getViewAlpha()); - pw.print(" alpha="); pw.print(mCurrentInFrontAlpha); - pw.print(" tint=0x"); pw.println(Integer.toHexString(mScrimInFront.getTint())); - - pw.print(" backScrim:"); pw.print(" viewAlpha="); pw.print(mScrimBehind.getViewAlpha()); - pw.print(" alpha="); pw.print(mCurrentBehindAlpha); - pw.print(" tint=0x"); pw.println(Integer.toHexString(mScrimBehind.getTint())); - - pw.print(" mTracking="); pw.println(mTracking); + pw.print(" state: "); + pw.println(mState); + + pw.print(" frontScrim:"); + pw.print(" viewAlpha="); + pw.print(mScrimInFront.getViewAlpha()); + pw.print(" alpha="); + pw.print(mInFrontAlpha); + pw.print(" tint=0x"); + pw.println(Integer.toHexString(mScrimInFront.getTint())); + + pw.print(" backScrim:"); + pw.print(" viewAlpha="); + pw.print(mScrimBehind.getViewAlpha()); + pw.print(" alpha="); + pw.print(mBehindAlpha); + pw.print(" tint=0x"); + pw.println(Integer.toHexString(mScrimBehind.getTint())); + + pw.print(" bubbleScrim:"); + pw.print(" viewAlpha="); + pw.print(mScrimForBubble.getViewAlpha()); + pw.print(" alpha="); + pw.print(mBubbleAlpha); + pw.print(" tint=0x"); + pw.println(Integer.toHexString(mScrimForBubble.getTint())); + + pw.print(" mTracking="); + pw.println(mTracking); } public void setWallpaperSupportsAmbientMode(boolean wallpaperSupportsAmbientMode) { @@ -950,8 +1008,8 @@ public class ScrimController implements ViewTreeObserver.OnPreDrawListener, OnCo // in this case, back-scrim needs to be re-evaluated if (mState == ScrimState.AOD || mState == ScrimState.PULSING) { float newBehindAlpha = mState.getBehindAlpha(); - if (mCurrentBehindAlpha != newBehindAlpha) { - mCurrentBehindAlpha = newBehindAlpha; + if (mBehindAlpha != newBehindAlpha) { + mBehindAlpha = newBehindAlpha; updateScrims(); } } @@ -972,10 +1030,13 @@ public class ScrimController implements ViewTreeObserver.OnPreDrawListener, OnCo public interface Callback { default void onStart() { } + default void onDisplayBlanked() { } + default void onFinished() { } + default void onCancelled() { } /** Returns whether to timeout wallpaper or not. */ diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/phone/ScrimState.java b/packages/SystemUI/src/com/android/systemui/statusbar/phone/ScrimState.java index 5fa861c8a2ac..7463c7c232bd 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/phone/ScrimState.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/phone/ScrimState.java @@ -36,7 +36,6 @@ public enum ScrimState { * On the lock screen. */ KEYGUARD(0) { - @Override public void prepare(ScrimState previousState) { mBlankScreen = false; @@ -53,10 +52,13 @@ public enum ScrimState { } else { mAnimationDuration = ScrimController.ANIMATION_DURATION; } - mCurrentInFrontTint = Color.BLACK; - mCurrentBehindTint = Color.BLACK; - mCurrentBehindAlpha = mScrimBehindAlphaKeyguard; - mCurrentInFrontAlpha = 0; + mFrontTint = Color.BLACK; + mBehindTint = Color.BLACK; + mBubbleTint = Color.TRANSPARENT; + + mFrontAlpha = 0; + mBehindAlpha = mScrimBehindAlphaKeyguard; + mBubbleAlpha = 0; } }, @@ -66,8 +68,9 @@ public enum ScrimState { BOUNCER(1) { @Override public void prepare(ScrimState previousState) { - mCurrentBehindAlpha = ScrimController.GRADIENT_SCRIM_ALPHA_BUSY; - mCurrentInFrontAlpha = 0f; + mBehindAlpha = ScrimController.GRADIENT_SCRIM_ALPHA_BUSY; + mFrontAlpha = 0f; + mBubbleAlpha = 0f; } }, @@ -77,8 +80,9 @@ public enum ScrimState { BOUNCER_SCRIMMED(2) { @Override public void prepare(ScrimState previousState) { - mCurrentBehindAlpha = 0; - mCurrentInFrontAlpha = ScrimController.GRADIENT_SCRIM_ALPHA_BUSY; + mBehindAlpha = 0; + mBubbleAlpha = 0f; + mFrontAlpha = ScrimController.GRADIENT_SCRIM_ALPHA_BUSY; } }, @@ -88,8 +92,9 @@ public enum ScrimState { BRIGHTNESS_MIRROR(3) { @Override public void prepare(ScrimState previousState) { - mCurrentBehindAlpha = 0; - mCurrentInFrontAlpha = 0; + mBehindAlpha = 0; + mFrontAlpha = 0; + mBubbleAlpha = 0; } }, @@ -101,9 +106,16 @@ public enum ScrimState { public void prepare(ScrimState previousState) { final boolean alwaysOnEnabled = mDozeParameters.getAlwaysOn(); mBlankScreen = mDisplayRequiresBlanking; - mCurrentInFrontAlpha = alwaysOnEnabled ? mAodFrontScrimAlpha : 1f; - mCurrentInFrontTint = Color.BLACK; - mCurrentBehindTint = Color.BLACK; + + mFrontTint = Color.BLACK; + mFrontAlpha = alwaysOnEnabled ? mAodFrontScrimAlpha : 1f; + + mBehindTint = Color.BLACK; + mBehindAlpha = ScrimController.TRANSPARENT; + + mBubbleTint = Color.TRANSPARENT; + mBubbleAlpha = ScrimController.TRANSPARENT; + mAnimationDuration = ScrimController.ANIMATION_DURATION_LONG; // DisplayPowerManager may blank the screen for us, // in this case we just need to set our state. @@ -127,9 +139,10 @@ public enum ScrimState { PULSING(5) { @Override public void prepare(ScrimState previousState) { - mCurrentInFrontAlpha = mAodFrontScrimAlpha; - mCurrentBehindTint = Color.BLACK; - mCurrentInFrontTint = Color.BLACK; + mFrontAlpha = mAodFrontScrimAlpha; + mBubbleAlpha = 0f; + mBehindTint = Color.BLACK; + mFrontTint = Color.BLACK; mBlankScreen = mDisplayRequiresBlanking; mAnimationDuration = mWakeLockScreenSensorActive ? ScrimController.ANIMATION_DURATION_LONG : ScrimController.ANIMATION_DURATION; @@ -154,26 +167,33 @@ public enum ScrimState { UNLOCKED(6) { @Override public void prepare(ScrimState previousState) { - mCurrentBehindAlpha = 0; - mCurrentInFrontAlpha = 0; + // State that UI will sync to. + mBehindAlpha = 0; + mFrontAlpha = 0; + mBubbleAlpha = 0; + mAnimationDuration = mKeyguardFadingAway ? mKeyguardFadingAwayDuration : StatusBar.FADE_KEYGUARD_DURATION; mAnimateChange = !mLaunchingAffordanceWithPreview; + mFrontTint = Color.TRANSPARENT; + mBehindTint = Color.TRANSPARENT; + mBubbleTint = Color.TRANSPARENT; + mBlankScreen = false; + if (previousState == ScrimState.AOD) { - // Fade from black to transparent when coming directly from AOD - updateScrimColor(mScrimInFront, 1, Color.BLACK); - updateScrimColor(mScrimBehind, 1, Color.BLACK); + // Set all scrims black, before they fade transparent. + updateScrimColor(mScrimInFront, 1f /* alpha */, Color.BLACK /* tint */); + updateScrimColor(mScrimBehind, 1f /* alpha */, Color.BLACK /* tint */); + updateScrimColor(mScrimForBubble, 1f /* alpha */, Color.BLACK /* tint */); + // Scrims should still be black at the end of the transition. - mCurrentInFrontTint = Color.BLACK; - mCurrentBehindTint = Color.BLACK; + mFrontTint = Color.BLACK; + mBehindTint = Color.BLACK; + mBubbleTint = Color.BLACK; mBlankScreen = true; - } else { - mCurrentInFrontTint = Color.TRANSPARENT; - mCurrentBehindTint = Color.TRANSPARENT; - mBlankScreen = false; } } }, @@ -184,25 +204,36 @@ public enum ScrimState { BUBBLE_EXPANDED(7) { @Override public void prepare(ScrimState previousState) { - mCurrentInFrontTint = Color.TRANSPARENT; - mCurrentBehindTint = Color.TRANSPARENT; + mFrontTint = Color.TRANSPARENT; + mBehindTint = Color.TRANSPARENT; + mBubbleTint = Color.TRANSPARENT; + + mFrontAlpha = ScrimController.TRANSPARENT; + mBehindAlpha = ScrimController.GRADIENT_SCRIM_ALPHA_BUSY; + mBubbleAlpha = ScrimController.GRADIENT_SCRIM_ALPHA_BUSY; + mAnimationDuration = ScrimController.ANIMATION_DURATION; - mCurrentBehindAlpha = ScrimController.GRADIENT_SCRIM_ALPHA_BUSY; mBlankScreen = false; } }; boolean mBlankScreen = false; long mAnimationDuration = ScrimController.ANIMATION_DURATION; - int mCurrentInFrontTint = Color.TRANSPARENT; - int mCurrentBehindTint = Color.TRANSPARENT; + int mFrontTint = Color.TRANSPARENT; + int mBehindTint = Color.TRANSPARENT; + int mBubbleTint = Color.TRANSPARENT; + boolean mAnimateChange = true; - float mCurrentInFrontAlpha; - float mCurrentBehindAlpha; float mAodFrontScrimAlpha; + float mFrontAlpha; + float mBehindAlpha; + float mBubbleAlpha; + float mScrimBehindAlphaKeyguard; ScrimView mScrimInFront; ScrimView mScrimBehind; + ScrimView mScrimForBubble; + DozeParameters mDozeParameters; boolean mDisplayRequiresBlanking; boolean mWallpaperSupportsAmbientMode; @@ -217,13 +248,17 @@ public enum ScrimState { mIndex = index; } - public void init(ScrimView scrimInFront, ScrimView scrimBehind, DozeParameters dozeParameters) { + public void init(ScrimView scrimInFront, ScrimView scrimBehind, ScrimView scrimForBubble, + DozeParameters dozeParameters) { mScrimInFront = scrimInFront; mScrimBehind = scrimBehind; + mScrimForBubble = scrimForBubble; + mDozeParameters = dozeParameters; mDisplayRequiresBlanking = dozeParameters.getDisplayNeedsBlanking(); } + /** Prepare state for transition. */ public void prepare(ScrimState previousState) { } @@ -232,19 +267,27 @@ public enum ScrimState { } public float getFrontAlpha() { - return mCurrentInFrontAlpha; + return mFrontAlpha; } public float getBehindAlpha() { - return mCurrentBehindAlpha; + return mBehindAlpha; + } + + public float getBubbleAlpha() { + return mBubbleAlpha; } public int getFrontTint() { - return mCurrentInFrontTint; + return mFrontTint; } public int getBehindTint() { - return mCurrentBehindTint; + return mBehindTint; + } + + public int getBubbleTint() { + return mBubbleTint; } public long getAnimationDuration() { 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 559df18ef478..fc20d83b9ddb 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/phone/StatusBar.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/phone/StatusBar.java @@ -229,7 +229,6 @@ import com.android.systemui.statusbar.policy.UserInfoController; import com.android.systemui.statusbar.policy.UserInfoControllerImpl; import com.android.systemui.statusbar.policy.UserSwitcherController; import com.android.systemui.statusbar.policy.ZenModeController; -import com.android.systemui.tuner.TunerService; import com.android.systemui.util.InjectionInflationController; import com.android.systemui.volume.VolumeComponent; @@ -812,6 +811,7 @@ public class StatusBar extends SystemUI implements DemoMode, // TODO: Deal with the ugliness that comes from having some of the statusbar broken out // into fragments, but the rest here, it leaves some awkward lifecycle and whatnot. mNotificationPanel = mStatusBarWindow.findViewById(R.id.notification_panel); + mStackScroller = mStatusBarWindow.findViewById(R.id.notification_stack_scroller); mZenController.addCallback(this); NotificationListContainer notifListContainer = (NotificationListContainer) mStackScroller; @@ -932,8 +932,10 @@ public class StatusBar extends SystemUI implements DemoMode, ScrimView scrimBehind = mStatusBarWindow.findViewById(R.id.scrim_behind); ScrimView scrimInFront = mStatusBarWindow.findViewById(R.id.scrim_in_front); + ScrimView scrimForBubble = mStatusBarWindow.findViewById(R.id.scrim_for_bubble); + mScrimController = SystemUIFactory.getInstance().createScrimController( - scrimBehind, scrimInFront, mLockscreenWallpaper, + scrimBehind, scrimInFront, scrimForBubble, mLockscreenWallpaper, (state, alpha, color) -> mLightBarController.setScrimState(state, alpha, color), scrimsVisible -> { if (mStatusBarWindowController != null) { diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/phone/StatusBarWindowController.java b/packages/SystemUI/src/com/android/systemui/statusbar/phone/StatusBarWindowController.java index 946fe0b3a2f8..d3ae5cf35b0c 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/phone/StatusBarWindowController.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/phone/StatusBarWindowController.java @@ -222,7 +222,7 @@ public class StatusBarWindowController implements Callback, Dumpable, Configurat } final boolean scrimsOccludingWallpaper = - state.scrimsVisibility == ScrimController.VISIBILITY_FULLY_OPAQUE; + state.scrimsVisibility == ScrimController.OPAQUE; final boolean keyguardOrAod = state.keyguardShowing || (state.dozing && mDozeParameters.getAlwaysOn()); if (keyguardOrAod && !state.backdropShowing && !scrimsOccludingWallpaper) { @@ -308,7 +308,7 @@ public class StatusBarWindowController implements Callback, Dumpable, Configurat return !state.forceCollapsed && (state.isKeyguardShowingAndNotOccluded() || state.panelVisible || state.keyguardFadingAway || state.bouncerShowing || state.headsUpShowing || state.bubblesShowing - || state.scrimsVisibility != ScrimController.VISIBILITY_FULLY_TRANSPARENT); + || state.scrimsVisibility != ScrimController.TRANSPARENT); } private void applyFitsSystemWindows(State state) { diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/policy/BatteryController.java b/packages/SystemUI/src/com/android/systemui/statusbar/policy/BatteryController.java index 111cdd2cc32a..738d076e13c5 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/policy/BatteryController.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/policy/BatteryController.java @@ -45,9 +45,7 @@ public interface BatteryController extends DemoMode, Dumpable, /** * Returns {@code true} if AOD was disabled by power saving policies. */ - default boolean isAodPowerSave() { - return isPowerSave(); - } + boolean isAodPowerSave(); /** * A listener that will be notified whenever a change in battery level or power save mode has diff --git a/packages/SystemUI/tests/src/com/android/systemui/bubbles/BubbleControllerTest.java b/packages/SystemUI/tests/src/com/android/systemui/bubbles/BubbleControllerTest.java index ba434d4fd0bd..5a4e6c903650 100644 --- a/packages/SystemUI/tests/src/com/android/systemui/bubbles/BubbleControllerTest.java +++ b/packages/SystemUI/tests/src/com/android/systemui/bubbles/BubbleControllerTest.java @@ -74,6 +74,7 @@ import com.android.systemui.statusbar.phone.DozeParameters; import com.android.systemui.statusbar.phone.NotificationGroupManager; import com.android.systemui.statusbar.phone.KeyguardBypassController; import com.android.systemui.statusbar.phone.StatusBarWindowController; +import com.android.systemui.statusbar.policy.BatteryController; import com.android.systemui.statusbar.policy.ConfigurationController; import com.android.systemui.statusbar.policy.HeadsUpManager; import com.android.systemui.statusbar.policy.ZenModeController; @@ -173,7 +174,8 @@ public class BubbleControllerTest extends SysuiTestCase { TestableNotificationInterruptionStateProvider interruptionStateProvider = new TestableNotificationInterruptionStateProvider(mContext, mock(NotificationFilter.class), - mock(StatusBarStateController.class)); + mock(StatusBarStateController.class), + mock(BatteryController.class)); interruptionStateProvider.setUpWithPresenter( mock(NotificationPresenter.class), mock(HeadsUpManager.class), @@ -659,8 +661,9 @@ public class BubbleControllerTest extends SysuiTestCase { NotificationInterruptionStateProvider { TestableNotificationInterruptionStateProvider(Context context, - NotificationFilter filter, StatusBarStateController controller) { - super(context, filter, controller); + NotificationFilter filter, StatusBarStateController controller, + BatteryController batteryController) { + super(context, filter, controller, batteryController); mUseHeadsUp = true; } } diff --git a/packages/SystemUI/tests/src/com/android/systemui/doze/DozeMachineTest.java b/packages/SystemUI/tests/src/com/android/systemui/doze/DozeMachineTest.java index 1e18e51bc079..1eb75aaacbfb 100644 --- a/packages/SystemUI/tests/src/com/android/systemui/doze/DozeMachineTest.java +++ b/packages/SystemUI/tests/src/com/android/systemui/doze/DozeMachineTest.java @@ -46,6 +46,7 @@ import androidx.test.filters.SmallTest; import com.android.systemui.SysuiTestCase; import com.android.systemui.keyguard.WakefulnessLifecycle; +import com.android.systemui.statusbar.policy.BatteryController; import com.android.systemui.util.wakelock.WakeLockFake; import org.junit.Before; @@ -76,8 +77,8 @@ public class DozeMachineTest extends SysuiTestCase { mConfigMock = mock(AmbientDisplayConfiguration.class); mPartMock = mock(DozeMachine.Part.class); - mMachine = new DozeMachine(mServiceFake, mConfigMock, mWakeLockFake, mWakefulnessLifecycle); - + mMachine = new DozeMachine(mServiceFake, mConfigMock, mWakeLockFake, + mWakefulnessLifecycle, mock(BatteryController.class)); mMachine.setParts(new DozeMachine.Part[]{mPartMock}); } diff --git a/packages/SystemUI/tests/src/com/android/systemui/statusbar/NotificationInterruptionStateProviderTest.java b/packages/SystemUI/tests/src/com/android/systemui/statusbar/NotificationInterruptionStateProviderTest.java index a66cf843bbc3..0db1f681a7ac 100644 --- a/packages/SystemUI/tests/src/com/android/systemui/statusbar/NotificationInterruptionStateProviderTest.java +++ b/packages/SystemUI/tests/src/com/android/systemui/statusbar/NotificationInterruptionStateProviderTest.java @@ -53,6 +53,7 @@ import com.android.systemui.plugins.statusbar.StatusBarStateController; import com.android.systemui.statusbar.notification.NotificationFilter; import com.android.systemui.statusbar.notification.NotificationInterruptionStateProvider; import com.android.systemui.statusbar.notification.collection.NotificationEntry; +import com.android.systemui.statusbar.policy.BatteryController; import com.android.systemui.statusbar.policy.HeadsUpManager; import org.junit.Before; @@ -85,6 +86,8 @@ public class NotificationInterruptionStateProviderTest extends SysuiTestCase { HeadsUpManager mHeadsUpManager; @Mock NotificationInterruptionStateProvider.HeadsUpSuppressor mHeadsUpSuppressor; + @Mock + BatteryController mBatteryController; private NotificationInterruptionStateProvider mNotifInterruptionStateProvider; @@ -98,7 +101,8 @@ public class NotificationInterruptionStateProviderTest extends SysuiTestCase { mDreamManager, mAmbientDisplayConfiguration, mNotificationFilter, - mStatusBarStateController); + mStatusBarStateController, + mBatteryController); mNotifInterruptionStateProvider.setUpWithPresenter( mPresenter, @@ -573,17 +577,17 @@ public class NotificationInterruptionStateProviderTest extends SysuiTestCase { /** * Testable class overriding constructor. */ - public class TestableNotificationInterruptionStateProvider extends + public static class TestableNotificationInterruptionStateProvider extends NotificationInterruptionStateProvider { TestableNotificationInterruptionStateProvider(Context context, PowerManager powerManager, IDreamManager dreamManager, AmbientDisplayConfiguration ambientDisplayConfiguration, NotificationFilter notificationFilter, - StatusBarStateController statusBarStateController) { + StatusBarStateController statusBarStateController, + BatteryController batteryController) { super(context, powerManager, dreamManager, ambientDisplayConfiguration, - notificationFilter, - statusBarStateController); + notificationFilter, batteryController, statusBarStateController); } } } diff --git a/packages/SystemUI/tests/src/com/android/systemui/statusbar/phone/ScrimControllerTest.java b/packages/SystemUI/tests/src/com/android/systemui/statusbar/phone/ScrimControllerTest.java index 205312ca508f..d4ad4b6d4f16 100644 --- a/packages/SystemUI/tests/src/com/android/systemui/statusbar/phone/ScrimControllerTest.java +++ b/packages/SystemUI/tests/src/com/android/systemui/statusbar/phone/ScrimControllerTest.java @@ -16,9 +16,9 @@ package com.android.systemui.statusbar.phone; -import static com.android.systemui.statusbar.phone.ScrimController.VISIBILITY_FULLY_OPAQUE; -import static com.android.systemui.statusbar.phone.ScrimController.VISIBILITY_FULLY_TRANSPARENT; -import static com.android.systemui.statusbar.phone.ScrimController.VISIBILITY_SEMI_TRANSPARENT; +import static com.android.systemui.statusbar.phone.ScrimController.OPAQUE; +import static com.android.systemui.statusbar.phone.ScrimController.SEMI_TRANSPARENT; +import static com.android.systemui.statusbar.phone.ScrimController.TRANSPARENT; import static org.mockito.ArgumentMatchers.any; import static org.mockito.ArgumentMatchers.anyInt; @@ -69,6 +69,7 @@ public class ScrimControllerTest extends SysuiTestCase { private SynchronousScrimController mScrimController; private ScrimView mScrimBehind; private ScrimView mScrimInFront; + private ScrimView mScrimForBubble; private ScrimState mScrimState; private float mScrimBehindAlpha; private GradientColors mScrimInFrontColor; @@ -84,6 +85,7 @@ public class ScrimControllerTest extends SysuiTestCase { public void setup() { mScrimBehind = spy(new ScrimView(getContext())); mScrimInFront = new ScrimView(getContext()); + mScrimForBubble = new ScrimView(getContext()); mWakeLock = mock(WakeLock.class); mAlarmManager = mock(AlarmManager.class); mAlwaysOnEnabled = true; @@ -92,6 +94,7 @@ public class ScrimControllerTest extends SysuiTestCase { when(mDozeParamenters.getAlwaysOn()).thenAnswer(invocation -> mAlwaysOnEnabled); when(mDozeParamenters.getDisplayNeedsBlanking()).thenReturn(true); mScrimController = new SynchronousScrimController(mScrimBehind, mScrimInFront, + mScrimForBubble, (scrimState, scrimBehindAlpha, scrimInFrontColor) -> { mScrimState = scrimState; mScrimBehindAlpha = scrimBehindAlpha; @@ -114,21 +117,28 @@ public class ScrimControllerTest extends SysuiTestCase { public void transitionToKeyguard() { mScrimController.transitionTo(ScrimState.KEYGUARD); mScrimController.finishAnimationsImmediately(); - // Front scrim should be transparent - // Back scrim should be visible without tint - assertScrimVisibility(VISIBILITY_FULLY_TRANSPARENT, VISIBILITY_SEMI_TRANSPARENT); - assertScrimTint(mScrimBehind, true /* tinted */); + + assertScrimAlpha(TRANSPARENT /* front */, + SEMI_TRANSPARENT /* back */, + TRANSPARENT /* bubble */); + + assertScrimTint(true /* front */, + true /* behind */, + false /* bubble */); } @Test public void transitionToAod_withRegularWallpaper() { mScrimController.transitionTo(ScrimState.AOD); mScrimController.finishAnimationsImmediately(); - // Front scrim should be transparent - // Back scrim should be visible with tint - assertScrimVisibility(VISIBILITY_FULLY_TRANSPARENT, VISIBILITY_FULLY_OPAQUE); - assertScrimTint(mScrimBehind, true /* tinted */); - assertScrimTint(mScrimInFront, true /* tinted */); + + assertScrimAlpha(TRANSPARENT /* front */, + OPAQUE /* back */, + TRANSPARENT /* bubble */); + + assertScrimTint(true /* front */, + true /* behind */, + false /* bubble */); } @Test @@ -136,14 +146,18 @@ public class ScrimControllerTest extends SysuiTestCase { mScrimController.setWallpaperSupportsAmbientMode(true); mScrimController.transitionTo(ScrimState.AOD); mScrimController.finishAnimationsImmediately(); - // Front scrim should be transparent - // Back scrim should be transparent - assertScrimVisibility(VISIBILITY_FULLY_TRANSPARENT, VISIBILITY_FULLY_TRANSPARENT); + + assertScrimAlpha(TRANSPARENT /* front */, + TRANSPARENT /* back */, + TRANSPARENT /* bubble */); // Pulsing notification should conserve AOD wallpaper. mScrimController.transitionTo(ScrimState.PULSING); mScrimController.finishAnimationsImmediately(); - assertScrimVisibility(VISIBILITY_FULLY_TRANSPARENT, VISIBILITY_FULLY_TRANSPARENT); + + assertScrimAlpha(TRANSPARENT /* front */, + TRANSPARENT /* back */, + TRANSPARENT /* bubble */); } @Test @@ -152,11 +166,14 @@ public class ScrimControllerTest extends SysuiTestCase { mScrimController.setWallpaperSupportsAmbientMode(true); mScrimController.transitionTo(ScrimState.AOD); mScrimController.finishAnimationsImmediately(); - // Front scrim should be transparent - // Back scrim should be visible with tint - assertScrimVisibility(VISIBILITY_FULLY_TRANSPARENT, VISIBILITY_FULLY_OPAQUE); - assertScrimTint(mScrimBehind, true /* tinted */); - assertScrimTint(mScrimInFront, true /* tinted */); + + assertScrimAlpha(TRANSPARENT /* front */, + OPAQUE /* back */, + TRANSPARENT /* bubble */); + + assertScrimTint(true /* front */, + true /* behind */, + false /* bubble */); } @Test @@ -166,11 +183,14 @@ public class ScrimControllerTest extends SysuiTestCase { mScrimController.finishAnimationsImmediately(); mScrimController.setHasBackdrop(true); mScrimController.finishAnimationsImmediately(); - // Front scrim should be transparent - // Back scrim should be visible with tint - assertScrimVisibility(VISIBILITY_FULLY_TRANSPARENT, VISIBILITY_FULLY_OPAQUE); - assertScrimTint(mScrimBehind, true /* tinted */); - assertScrimTint(mScrimInFront, true /* tinted */); + + assertScrimAlpha(TRANSPARENT /* front */, + OPAQUE /* back */, + TRANSPARENT /* bubble */); + + assertScrimTint(true /* front */, + true /* behind */, + false /* bubble */); } @Test @@ -179,27 +199,32 @@ public class ScrimControllerTest extends SysuiTestCase { mScrimController.transitionTo(ScrimState.KEYGUARD); mScrimController.setAodFrontScrimAlpha(0.5f); mScrimController.finishAnimationsImmediately(); - // Front scrim should be transparent - // Back scrim should be visible without tint - assertScrimVisibility(VISIBILITY_FULLY_TRANSPARENT, VISIBILITY_SEMI_TRANSPARENT); + + assertScrimAlpha(TRANSPARENT /* front */, + SEMI_TRANSPARENT /* back */, + TRANSPARENT /* bubble */); // ... but that it does take effect once we enter the AOD state. mScrimController.transitionTo(ScrimState.AOD); mScrimController.finishAnimationsImmediately(); - // Front scrim should be semi-transparent - // Back scrim should be visible - assertScrimVisibility(VISIBILITY_SEMI_TRANSPARENT, VISIBILITY_FULLY_OPAQUE); + assertScrimAlpha(SEMI_TRANSPARENT /* front */, + OPAQUE /* back */, + TRANSPARENT /* bubble */); // ... and that if we set it while we're in AOD, it does take immediate effect. mScrimController.setAodFrontScrimAlpha(1f); - assertScrimVisibility(VISIBILITY_FULLY_OPAQUE, VISIBILITY_FULLY_OPAQUE); + assertScrimAlpha(OPAQUE /* front */, + OPAQUE /* back */, + TRANSPARENT /* bubble */); // ... and make sure we recall the previous front scrim alpha even if we transition away // for a bit. mScrimController.transitionTo(ScrimState.UNLOCKED); mScrimController.transitionTo(ScrimState.AOD); mScrimController.finishAnimationsImmediately(); - assertScrimVisibility(VISIBILITY_FULLY_OPAQUE, VISIBILITY_FULLY_OPAQUE); + assertScrimAlpha(OPAQUE /* front */, + OPAQUE /* back */, + TRANSPARENT /* bubble */); // ... and alpha updates should be completely ignored if always_on is off. // Passing it forward would mess up the wake-up transition. @@ -223,27 +248,36 @@ public class ScrimControllerTest extends SysuiTestCase { mScrimController.setWallpaperSupportsAmbientMode(false); mScrimController.transitionTo(ScrimState.AOD); mScrimController.finishAnimationsImmediately(); - assertScrimVisibility(VISIBILITY_FULLY_TRANSPARENT, VISIBILITY_FULLY_OPAQUE); + assertScrimAlpha(TRANSPARENT /* front */, + OPAQUE /* back */, + TRANSPARENT /* bubble */); mScrimController.transitionTo(ScrimState.PULSING); mScrimController.finishAnimationsImmediately(); // Front scrim should be transparent, but tinted // Back scrim should be semi-transparent so the user can see the wallpaper // Pulse callback should have been invoked - assertScrimVisibility(VISIBILITY_FULLY_TRANSPARENT, VISIBILITY_FULLY_OPAQUE); - assertScrimTint(mScrimBehind, true /* tinted */); + assertScrimAlpha(TRANSPARENT /* front */, + OPAQUE /* back */, + TRANSPARENT /* bubble */); + + assertScrimTint(true /* front */, + true /* behind */, + false /* bubble */); // ... and when ambient goes dark, front scrim should be semi-transparent mScrimController.setAodFrontScrimAlpha(0.5f); mScrimController.finishAnimationsImmediately(); // Front scrim should be semi-transparent - assertScrimVisibility(VISIBILITY_SEMI_TRANSPARENT /* front */, - VISIBILITY_FULLY_OPAQUE /* back */); + assertScrimAlpha(SEMI_TRANSPARENT /* front */, + OPAQUE /* back */, + TRANSPARENT /* bubble */); mScrimController.setWakeLockScreenSensorActive(true); mScrimController.finishAnimationsImmediately(); - assertScrimVisibility(VISIBILITY_SEMI_TRANSPARENT /* front */, - VISIBILITY_SEMI_TRANSPARENT /* back */); + assertScrimAlpha(SEMI_TRANSPARENT /* front */, + SEMI_TRANSPARENT /* back */, + TRANSPARENT /* bubble */); // Reset value since enums are static. mScrimController.setAodFrontScrimAlpha(0f); @@ -255,8 +289,13 @@ public class ScrimControllerTest extends SysuiTestCase { mScrimController.finishAnimationsImmediately(); // Front scrim should be transparent // Back scrim should be visible without tint - assertScrimVisibility(VISIBILITY_FULLY_TRANSPARENT, VISIBILITY_SEMI_TRANSPARENT); - assertScrimTint(mScrimBehind, false /* tinted */); + assertScrimAlpha(TRANSPARENT /* front */, + SEMI_TRANSPARENT /* back */, + TRANSPARENT /* bubble */); + + assertScrimTint(false /* front */, + false /* behind */, + false /* bubble */); } @Test @@ -265,8 +304,12 @@ public class ScrimControllerTest extends SysuiTestCase { mScrimController.finishAnimationsImmediately(); // Front scrim should be transparent // Back scrim should be visible without tint - assertScrimVisibility(VISIBILITY_SEMI_TRANSPARENT, VISIBILITY_FULLY_TRANSPARENT); - assertScrimTint(mScrimBehind, false /* tinted */); + assertScrimAlpha(SEMI_TRANSPARENT /* front */, + TRANSPARENT /* back */, + TRANSPARENT /* bubble */); + assertScrimTint(false /* front */, + false /* behind */, + false /* bubble */); } @Test @@ -274,15 +317,19 @@ public class ScrimControllerTest extends SysuiTestCase { mScrimController.setPanelExpansion(0f); mScrimController.transitionTo(ScrimState.UNLOCKED); mScrimController.finishAnimationsImmediately(); - // Front scrim should be transparent - // Back scrim should be transparent - assertScrimVisibility(VISIBILITY_FULLY_TRANSPARENT, VISIBILITY_FULLY_TRANSPARENT); - assertScrimTint(mScrimBehind, false /* tinted */); - assertScrimTint(mScrimInFront, false /* tinted */); + assertScrimAlpha(TRANSPARENT /* front */, + TRANSPARENT /* back */, + TRANSPARENT /* bubble */); + + assertScrimTint(false /* front */, + false /* behind */, + false /* bubble */); // Back scrim should be visible after start dragging mScrimController.setPanelExpansion(0.5f); - assertScrimVisibility(VISIBILITY_FULLY_TRANSPARENT, VISIBILITY_SEMI_TRANSPARENT); + assertScrimAlpha(TRANSPARENT /* front */, + SEMI_TRANSPARENT /* back */, + TRANSPARENT /* bubble */); } @Test @@ -290,12 +337,19 @@ public class ScrimControllerTest extends SysuiTestCase { mScrimController.transitionTo(ScrimState.BUBBLE_EXPANDED); mScrimController.finishAnimationsImmediately(); + assertScrimTint(false /* front */, + false /* behind */, + false /* bubble */); + // Front scrim should be transparent - Assert.assertEquals(ScrimController.VISIBILITY_FULLY_TRANSPARENT, + Assert.assertEquals(ScrimController.TRANSPARENT, mScrimInFront.getViewAlpha(), 0.0f); // Back scrim should be visible Assert.assertEquals(ScrimController.GRADIENT_SCRIM_ALPHA_BUSY, mScrimBehind.getViewAlpha(), 0.0f); + // Bubble scrim should be visible + Assert.assertEquals(ScrimController.GRADIENT_SCRIM_ALPHA_BUSY, + mScrimBehind.getViewAlpha(), 0.0f); } @Test @@ -364,16 +418,23 @@ public class ScrimControllerTest extends SysuiTestCase { mScrimController.setPanelExpansion(0f); mScrimController.finishAnimationsImmediately(); mScrimController.transitionTo(ScrimState.UNLOCKED); - // Immediately tinted after the transition starts - assertScrimTint(mScrimInFront, true /* tinted */); - assertScrimTint(mScrimBehind, true /* tinted */); + + // Immediately tinted black after the transition starts + assertScrimTint(true /* front */, + true /* behind */, + true /* bubble */); + mScrimController.finishAnimationsImmediately(); - // Front scrim should be transparent - // Back scrim should be transparent - // Neither scrims should be tinted anymore after the animation. - assertScrimVisibility(VISIBILITY_FULLY_TRANSPARENT, VISIBILITY_FULLY_TRANSPARENT); - assertScrimTint(mScrimInFront, false /* tinted */); - assertScrimTint(mScrimBehind, false /* tinted */); + + // All scrims should be transparent at the end of fade transition. + assertScrimAlpha(TRANSPARENT /* front */, + TRANSPARENT /* behind */, + TRANSPARENT /* bubble */); + + // Make sure at the very end of the animation, we're reset to transparent + assertScrimTint(false /* front */, + false /* behind */, + false /* bubble */); } @Test @@ -388,9 +449,11 @@ public class ScrimControllerTest extends SysuiTestCase { // Front scrim should be black in the middle of the transition Assert.assertTrue("Scrim should be visible during transition. Alpha: " + mScrimInFront.getViewAlpha(), mScrimInFront.getViewAlpha() > 0); - assertScrimTint(mScrimInFront, true /* tinted */); + assertScrimTint(true /* front */, + true /* behind */, + true /* bubble */); Assert.assertSame("Scrim should be visible during transition.", - mScrimVisibility, VISIBILITY_FULLY_OPAQUE); + mScrimVisibility, OPAQUE); } }); mScrimController.finishAnimationsImmediately(); @@ -598,11 +661,15 @@ public class ScrimControllerTest extends SysuiTestCase { mScrimController.setKeyguardOccluded(true); mScrimController.transitionTo(ScrimState.AOD); mScrimController.finishAnimationsImmediately(); - assertScrimVisibility(VISIBILITY_FULLY_TRANSPARENT, VISIBILITY_FULLY_OPAQUE); + assertScrimAlpha(TRANSPARENT /* front */, + OPAQUE /* behind */, + TRANSPARENT /* bubble */); mScrimController.transitionTo(ScrimState.PULSING); mScrimController.finishAnimationsImmediately(); - assertScrimVisibility(VISIBILITY_FULLY_TRANSPARENT, VISIBILITY_FULLY_OPAQUE); + assertScrimAlpha(TRANSPARENT /* front */, + OPAQUE /* behind */, + TRANSPARENT /* bubble */); } @Test @@ -610,11 +677,15 @@ public class ScrimControllerTest extends SysuiTestCase { mScrimController.setWallpaperSupportsAmbientMode(true); mScrimController.transitionTo(ScrimState.AOD); mScrimController.finishAnimationsImmediately(); - assertScrimVisibility(VISIBILITY_FULLY_TRANSPARENT, VISIBILITY_FULLY_TRANSPARENT); + assertScrimAlpha(TRANSPARENT /* front */, + TRANSPARENT /* behind */, + TRANSPARENT /* bubble */); mScrimController.setKeyguardOccluded(true); mScrimController.finishAnimationsImmediately(); - assertScrimVisibility(VISIBILITY_FULLY_TRANSPARENT, VISIBILITY_FULLY_OPAQUE); + assertScrimAlpha(TRANSPARENT /* front */, + OPAQUE /* behind */, + TRANSPARENT /* bubble */); } @Test @@ -653,33 +724,68 @@ public class ScrimControllerTest extends SysuiTestCase { mScrimInFront.getDefaultFocusHighlightEnabled()); Assert.assertFalse("Scrim shouldn't have focus highlight", mScrimBehind.getDefaultFocusHighlightEnabled()); + Assert.assertFalse("Scrim shouldn't have focus highlight", + mScrimForBubble.getDefaultFocusHighlightEnabled()); } - private void assertScrimTint(ScrimView scrimView, boolean tinted) { - final boolean viewIsTinted = scrimView.getTint() != Color.TRANSPARENT; - final String name = scrimView == mScrimInFront ? "front" : "back"; + private void assertScrimTint(boolean front, boolean behind, boolean bubble) { + Assert.assertEquals("Tint test failed at state " + mScrimController.getState() + + " with scrim: " + getScrimName(mScrimInFront) + " and tint: " + + Integer.toHexString(mScrimInFront.getTint()), + front, mScrimInFront.getTint() != Color.TRANSPARENT); + Assert.assertEquals("Tint test failed at state " + mScrimController.getState() - +" with scrim: " + name + " and tint: " + Integer.toHexString(scrimView.getTint()), - tinted, viewIsTinted); + + " with scrim: " + getScrimName(mScrimBehind) + " and tint: " + + Integer.toHexString(mScrimBehind.getTint()), + behind, mScrimBehind.getTint() != Color.TRANSPARENT); + + Assert.assertEquals("Tint test failed at state " + mScrimController.getState() + + " with scrim: " + getScrimName(mScrimForBubble) + " and tint: " + + Integer.toHexString(mScrimForBubble.getTint()), + bubble, mScrimForBubble.getTint() != Color.TRANSPARENT); + } + + private String getScrimName(ScrimView scrim) { + if (scrim == mScrimInFront) { + return "front"; + } else if (scrim == mScrimBehind) { + return "back"; + } else if (scrim == mScrimForBubble) { + return "bubble"; + } + return "unknown_scrim"; } - private void assertScrimVisibility(int inFront, int behind) { - boolean inFrontVisible = inFront != ScrimController.VISIBILITY_FULLY_TRANSPARENT; - boolean behindVisible = behind != ScrimController.VISIBILITY_FULLY_TRANSPARENT; - Assert.assertEquals("Unexpected front scrim visibility. Alpha is " - + mScrimInFront.getViewAlpha(), inFrontVisible, mScrimInFront.getViewAlpha() > 0); - Assert.assertEquals("Unexpected back scrim visibility. Alpha is " - + mScrimBehind.getViewAlpha(), behindVisible, mScrimBehind.getViewAlpha() > 0); + private void assertScrimAlpha(int front, int behind, int bubble) { + // Check single scrim visibility. + Assert.assertEquals("Unexpected front scrim alpha: " + + mScrimInFront.getViewAlpha(), + front != TRANSPARENT /* expected */, + mScrimInFront.getViewAlpha() > TRANSPARENT /* actual */); + + Assert.assertEquals("Unexpected back scrim alpha: " + + mScrimBehind.getViewAlpha(), + behind != TRANSPARENT /* expected */, + mScrimBehind.getViewAlpha() > TRANSPARENT /* actual */); + + Assert.assertEquals( + "Unexpected bubble scrim alpha: " + + mScrimForBubble.getViewAlpha(), /* message */ + bubble != TRANSPARENT /* expected */, + mScrimForBubble.getViewAlpha() > TRANSPARENT /* actual */); + // Check combined scrim visibility. final int visibility; - if (inFront == VISIBILITY_FULLY_OPAQUE || behind == VISIBILITY_FULLY_OPAQUE) { - visibility = VISIBILITY_FULLY_OPAQUE; - } else if (inFront > VISIBILITY_FULLY_TRANSPARENT || behind > VISIBILITY_FULLY_TRANSPARENT) { - visibility = VISIBILITY_SEMI_TRANSPARENT; + if (front == OPAQUE || behind == OPAQUE || bubble == OPAQUE) { + visibility = OPAQUE; + } else if (front > TRANSPARENT || behind > TRANSPARENT || bubble > TRANSPARENT) { + visibility = SEMI_TRANSPARENT; } else { - visibility = VISIBILITY_FULLY_TRANSPARENT; + visibility = TRANSPARENT; } - Assert.assertEquals("Invalid visibility.", visibility, mScrimVisibility); + Assert.assertEquals("Invalid visibility.", + visibility /* expected */, + mScrimVisibility); } /** @@ -691,11 +797,12 @@ public class ScrimControllerTest extends SysuiTestCase { boolean mOnPreDrawCalled; SynchronousScrimController(ScrimView scrimBehind, ScrimView scrimInFront, + ScrimView scrimForBubble, TriConsumer<ScrimState, Float, GradientColors> scrimStateListener, Consumer<Integer> scrimVisibleListener, DozeParameters dozeParameters, AlarmManager alarmManager, KeyguardMonitor keyguardMonitor) { - super(scrimBehind, scrimInFront, scrimStateListener, scrimVisibleListener, - dozeParameters, alarmManager, keyguardMonitor); + super(scrimBehind, scrimInFront, scrimForBubble, scrimStateListener, + scrimVisibleListener, dozeParameters, alarmManager, keyguardMonitor); } @Override @@ -706,13 +813,14 @@ public class ScrimControllerTest extends SysuiTestCase { void finishAnimationsImmediately() { boolean[] animationFinished = {false}; - setOnAnimationFinished(()-> animationFinished[0] = true); + setOnAnimationFinished(() -> animationFinished[0] = true); // Execute code that will trigger animations. onPreDraw(); // Force finish all animations. mLooper.processAllMessages(); endAnimation(mScrimBehind, TAG_KEY_ANIM); endAnimation(mScrimInFront, TAG_KEY_ANIM); + endAnimation(mScrimForBubble, TAG_KEY_ANIM); if (!animationFinished[0]) { throw new IllegalStateException("Animation never finished"); @@ -750,6 +858,7 @@ public class ScrimControllerTest extends SysuiTestCase { /** * Do not wait for a frame since we're in a test environment. + * * @param callback What to execute. */ @Override diff --git a/packages/SystemUI/tests/src/com/android/systemui/statusbar/phone/StatusBarTest.java b/packages/SystemUI/tests/src/com/android/systemui/statusbar/phone/StatusBarTest.java index 178ff22eede2..02215a984203 100644 --- a/packages/SystemUI/tests/src/com/android/systemui/statusbar/phone/StatusBarTest.java +++ b/packages/SystemUI/tests/src/com/android/systemui/statusbar/phone/StatusBarTest.java @@ -110,6 +110,7 @@ import com.android.systemui.statusbar.notification.logging.NotificationLogger; import com.android.systemui.statusbar.notification.row.NotificationGutsManager; import com.android.systemui.statusbar.notification.stack.NotificationListContainer; import com.android.systemui.statusbar.notification.stack.NotificationStackScrollLayout; +import com.android.systemui.statusbar.policy.BatteryController; import com.android.systemui.statusbar.policy.DeviceProvisionedController; import com.android.systemui.statusbar.policy.KeyguardMonitor; import com.android.systemui.statusbar.policy.UserSwitcherController; @@ -156,6 +157,7 @@ public class StatusBarTest extends SysuiTestCase { @Mock private NotificationRemoteInputManager mRemoteInputManager; @Mock private RemoteInputController mRemoteInputController; @Mock private StatusBarStateControllerImpl mStatusBarStateController; + @Mock private BatteryController mBatteryController; @Mock private DeviceProvisionedController mDeviceProvisionedController; @Mock private StatusBarNotificationPresenter mNotificationPresenter; @Mock @@ -209,7 +211,7 @@ public class StatusBarTest extends SysuiTestCase { mNotificationInterruptionStateProvider = new TestableNotificationInterruptionStateProvider(mContext, mPowerManager, mDreamManager, mAmbientDisplayConfiguration, mNotificationFilter, - mStatusBarStateController); + mStatusBarStateController, mBatteryController); mDependency.injectTestDependency(NotificationInterruptionStateProvider.class, mNotificationInterruptionStateProvider); mDependency.injectMockDependency(NavigationBarController.class); @@ -873,9 +875,10 @@ public class StatusBarTest extends SysuiTestCase { IDreamManager dreamManager, AmbientDisplayConfiguration ambientDisplayConfiguration, NotificationFilter filter, - StatusBarStateController controller) { + StatusBarStateController controller, + BatteryController batteryController) { super(context, powerManager, dreamManager, ambientDisplayConfiguration, filter, - controller); + batteryController, controller); mUseHeadsUp = true; } } diff --git a/packages/SystemUI/tests/src/com/android/systemui/utils/leaks/FakeBatteryController.java b/packages/SystemUI/tests/src/com/android/systemui/utils/leaks/FakeBatteryController.java index a843cca498a0..df76f01494f3 100644 --- a/packages/SystemUI/tests/src/com/android/systemui/utils/leaks/FakeBatteryController.java +++ b/packages/SystemUI/tests/src/com/android/systemui/utils/leaks/FakeBatteryController.java @@ -48,4 +48,9 @@ public class FakeBatteryController extends BaseLeakChecker<BatteryStateChangeCal public boolean isPowerSave() { return false; } + + @Override + public boolean isAodPowerSave() { + return false; + } } diff --git a/telephony/java/android/telephony/ims/ImsReasonInfo.java b/telephony/java/android/telephony/ims/ImsReasonInfo.java index 20aba4d97849..7241ac5cb14e 100644 --- a/telephony/java/android/telephony/ims/ImsReasonInfo.java +++ b/telephony/java/android/telephony/ims/ImsReasonInfo.java @@ -884,6 +884,12 @@ public final class ImsReasonInfo implements Parcelable { */ public static final int CODE_WFC_SERVICE_NOT_AVAILABLE_IN_THIS_LOCATION = 1623; + /** + * The dialed RTT call should be retried without RTT + * @hide + */ + public static final int CODE_RETRY_ON_IMS_WITHOUT_RTT = 3001; + /* * OEM specific error codes. To be used by OEMs when they don't want to reveal error code which * would be replaced by ERROR_UNSPECIFIED. @@ -1064,6 +1070,7 @@ public final class ImsReasonInfo implements Parcelable { CODE_REJECT_VT_AVPF_NOT_ALLOWED, CODE_REJECT_ONGOING_ENCRYPTED_CALL, CODE_REJECT_ONGOING_CS_CALL, + CODE_RETRY_ON_IMS_WITHOUT_RTT, CODE_OEM_CAUSE_1, CODE_OEM_CAUSE_2, CODE_OEM_CAUSE_3, |