diff --git a/packages/SystemUI/res/layout/super_status_bar.xml b/packages/SystemUI/res/layout/super_status_bar.xml index 75403b91d2994..0cc3c9eb55dcd 100644 --- a/packages/SystemUI/res/layout/super_status_bar.xml +++ b/packages/SystemUI/res/layout/super_status_bar.xml @@ -56,8 +56,6 @@ android:layout_width="match_parent" android:layout_height="wrap_content" /> - - + + + + + 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 b475b64eb2013..a3905b7fa7f13 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/phone/NotificationPanelView.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/phone/NotificationPanelView.java @@ -32,6 +32,8 @@ import android.content.res.Resources; import android.graphics.Canvas; import android.graphics.Color; import android.graphics.Paint; +import android.graphics.PorterDuff; +import android.graphics.PorterDuffXfermode; import android.graphics.Rect; import android.os.PowerManager; import android.util.AttributeSet; @@ -250,6 +252,33 @@ public class NotificationPanelView extends PanelView implements private ArrayList mVerticalTranslationListener = new ArrayList<>(); private HeadsUpAppearanceController mHeadsUpAppearanceController; + private int mPanelAlpha; + private int mCurrentPanelAlpha; + private final Paint mAlphaPaint = new Paint(); + private Runnable mPanelAlphaEndAction; + private AnimatorListenerAdapter mAnimatorListenerAdapter = new AnimatorListenerAdapter() { + @Override + public void onAnimationEnd(Animator animation) { + if (mPanelAlphaEndAction != null) { + mPanelAlphaEndAction.run(); + } + } + }; + private final AnimatableProperty PANEL_ALPHA = AnimatableProperty.from( + "panelAlpha", + NotificationPanelView::setPanelAlphaInternal, + NotificationPanelView::getCurrentPanelAlpha, + R.id.panel_alpha_animator_tag, + R.id.panel_alpha_animator_start_tag, + R.id.panel_alpha_animator_end_tag); + private final AnimationProperties PANEL_ALPHA_OUT_PROPERTIES = new AnimationProperties() + .setDuration(150) + .setCustomInterpolator(PANEL_ALPHA.getProperty(), Interpolators.ALPHA_OUT); + private final AnimationProperties PANEL_ALPHA_IN_PROPERTIES = new AnimationProperties() + .setDuration(200) + .setAnimationFinishListener(mAnimatorListenerAdapter) + .setCustomInterpolator(PANEL_ALPHA.getProperty(), Interpolators.ALPHA_IN); + public NotificationPanelView(Context context, AttributeSet attrs) { super(context, attrs); setWillNotDraw(!DEBUG); @@ -257,6 +286,8 @@ public class NotificationPanelView extends PanelView implements mPowerManager = context.getSystemService(PowerManager.class); mAccessibilityManager = context.getSystemService(AccessibilityManager.class); setAccessibilityPaneTitle(determineAccessibilityPaneTitle()); + mAlphaPaint.setXfermode(new PorterDuffXfermode(PorterDuff.Mode.MULTIPLY)); + setPanelAlpha(255, false /* animate */); } public void setStatusBar(StatusBar bar) { @@ -2302,6 +2333,38 @@ public class NotificationPanelView extends PanelView implements } } + @Override + protected void dispatchDraw(Canvas canvas) { + super.dispatchDraw(canvas); + if (mCurrentPanelAlpha != 255) { + canvas.drawRect(0, 0, canvas.getWidth(), canvas.getHeight(), mAlphaPaint); + } + } + + public float getCurrentPanelAlpha() { + return mCurrentPanelAlpha; + } + + public boolean setPanelAlpha(int alpha, boolean animate) { + if (mPanelAlpha != alpha) { + mPanelAlpha = alpha; + PropertyAnimator.setProperty(this, PANEL_ALPHA, alpha, + alpha == 255 ? PANEL_ALPHA_IN_PROPERTIES : PANEL_ALPHA_OUT_PROPERTIES, animate); + return true; + } + return false; + } + + public void setPanelAlphaInternal(float alpha) { + mCurrentPanelAlpha = (int) alpha; + mAlphaPaint.setARGB(mCurrentPanelAlpha, 255, 255, 255); + invalidate(); + } + + public void setPanelAlphaEndAction(Runnable r) { + mPanelAlphaEndAction = r; + } + @Override protected void onDraw(Canvas canvas) { super.onDraw(canvas); diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/policy/BrightnessMirrorController.java b/packages/SystemUI/src/com/android/systemui/statusbar/policy/BrightnessMirrorController.java index 06a56ffdfb775..e9bdc6848ab00 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/policy/BrightnessMirrorController.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/policy/BrightnessMirrorController.java @@ -22,14 +22,12 @@ import android.util.ArraySet; import android.view.ContextThemeWrapper; import android.view.LayoutInflater; import android.view.View; -import android.view.ViewPropertyAnimator; import android.widget.FrameLayout; import com.android.internal.util.Preconditions; -import com.android.systemui.Interpolators; import com.android.systemui.R; +import com.android.systemui.statusbar.phone.NotificationPanelView; import com.android.systemui.statusbar.phone.StatusBarWindowView; -import com.android.systemui.statusbar.stack.NotificationStackScrollLayout; import java.util.function.Consumer; @@ -39,13 +37,9 @@ import java.util.function.Consumer; public class BrightnessMirrorController implements CallbackController { - private final static long TRANSITION_DURATION_OUT = 150; - private final static long TRANSITION_DURATION_IN = 200; - private final StatusBarWindowView mStatusBarWindow; - private final NotificationStackScrollLayout mStackScroller; private final Consumer mVisibilityCallback; - private final View mNotificationPanel; + private final NotificationPanelView mNotificationPanel; private final ArraySet mBrightnessMirrorListeners = new ArraySet<>(); private final int[] mInt2Cache = new int[2]; private View mBrightnessMirror; @@ -55,38 +49,21 @@ public class BrightnessMirrorController mStatusBarWindow = statusBarWindow; mBrightnessMirror = statusBarWindow.findViewById(R.id.brightness_mirror); mNotificationPanel = statusBarWindow.findViewById(R.id.notification_panel); - mStackScroller = statusBarWindow.findViewById(R.id.notification_stack_scroller); + mNotificationPanel.setPanelAlphaEndAction(() -> { + mBrightnessMirror.setVisibility(View.INVISIBLE); + }); mVisibilityCallback = visibilityCallback; } public void showMirror() { mBrightnessMirror.setVisibility(View.VISIBLE); - mStackScroller.setFadingOut(true); mVisibilityCallback.accept(true); - outAnimation(mNotificationPanel.animate()) - .withLayer(); + mNotificationPanel.setPanelAlpha(0, true /* animate */); } public void hideMirror() { mVisibilityCallback.accept(false); - inAnimation(mNotificationPanel.animate()) - .withLayer() - .withEndAction(() -> { - mBrightnessMirror.setVisibility(View.INVISIBLE); - mStackScroller.setFadingOut(false); - }); - } - - private ViewPropertyAnimator outAnimation(ViewPropertyAnimator a) { - return a.alpha(0.0f) - .setDuration(TRANSITION_DURATION_OUT) - .setInterpolator(Interpolators.ALPHA_OUT) - .withEndAction(null); - } - private ViewPropertyAnimator inAnimation(ViewPropertyAnimator a) { - return a.alpha(1.0f) - .setDuration(TRANSITION_DURATION_IN) - .setInterpolator(Interpolators.ALPHA_IN); + mNotificationPanel.setPanelAlpha(255, true /* animate */); } public void setLocation(View original) { diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/stack/AnimationProperties.java b/packages/SystemUI/src/com/android/systemui/statusbar/stack/AnimationProperties.java index 2f6e6584cc5e9..47df226a7737a 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/stack/AnimationProperties.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/stack/AnimationProperties.java @@ -31,6 +31,7 @@ public class AnimationProperties { public long duration; public long delay; private ArrayMap mInterpolatorMap; + private AnimatorListenerAdapter mAnimatorListenerAdapter; /** * @return an animation filter for this animation. @@ -48,7 +49,12 @@ public class AnimationProperties { * @return a listener that should be run whenever any property finished its animation */ public AnimatorListenerAdapter getAnimationFinishListener() { - return null; + return mAnimatorListenerAdapter; + } + + public AnimationProperties setAnimationFinishListener(AnimatorListenerAdapter listener) { + mAnimatorListenerAdapter = listener; + return this; } public boolean wasAdded(View view) {