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) {