Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit b77edbfd authored by John Spurlock's avatar John Spurlock
Browse files

Improve transparent bar transitions.

1. Migrate transparent transitions to the new optimized
background color animations.

2. Ensure sysui animation transparent -> opaque has enough
time to run before window manager crops off the content area.

3. Lose the individual alpha on each status bar icon if the bars
are not opaque.  Animate the alpha if visible, make sure they
play together.

4. Documentation typo fix found in AnimatorSet.

Bug:10344949
Change-Id: I615668ce3c552d3df15dbba5cdeeca67549a0220
parent 9e104087
Loading
Loading
Loading
Loading
+1 −1
Original line number Diff line number Diff line
@@ -114,7 +114,7 @@ public class AnimationSet extends Animation {
     * Constructor to use when building an AnimationSet from code
     * 
     * @param shareInterpolator Pass true if all of the animations in this set
     *        should use the interpolator assocciated with this AnimationSet.
     *        should use the interpolator associated with this AnimationSet.
     *        Pass false if each animation should use its own interpolator.
     */
    public AnimationSet(boolean shareInterpolator) {
+6 −1
Original line number Diff line number Diff line
@@ -70,6 +70,7 @@ import com.android.systemui.R;
import com.android.systemui.RecentsComponent;
import com.android.systemui.SearchPanelView;
import com.android.systemui.SystemUI;
import com.android.systemui.statusbar.phone.BarTransitions;
import com.android.systemui.statusbar.policy.NotificationRowLayout;

import java.util.ArrayList;
@@ -827,7 +828,7 @@ public abstract class BaseStatusBar extends SystemUI implements
        // Construct the icon.
        final StatusBarIconView iconView = new StatusBarIconView(mContext,
                notification.getPackageName() + "/0x" + Integer.toHexString(notification.getId()),
                notification.getNotification());
                notification.getNotification(), getStatusBarMode());
        iconView.setScaleType(ImageView.ScaleType.CENTER_INSIDE);

        final StatusBarIcon ic = new StatusBarIcon(notification.getPackageName(),
@@ -850,6 +851,10 @@ public abstract class BaseStatusBar extends SystemUI implements
        return entry;
    }

    protected int getStatusBarMode() {
        return BarTransitions.MODE_OPAQUE;
    }

    protected void addNotificationViews(NotificationData.Entry entry) {
        // Add the expanded view and icon.
        int pos = mNotificationData.add(entry);
+21 −5
Original line number Diff line number Diff line
@@ -16,6 +16,11 @@

package com.android.systemui.statusbar;

import static com.android.systemui.statusbar.phone.BarTransitions.MODE_OPAQUE;
import static com.android.systemui.statusbar.phone.BarTransitions.MODE_SEMI_TRANSPARENT;
import static com.android.systemui.statusbar.phone.BarTransitions.MODE_TRANSPARENT;

import android.animation.ObjectAnimator;
import android.app.Notification;
import android.content.Context;
import android.content.pm.PackageManager;
@@ -48,10 +53,13 @@ public class StatusBarIconView extends AnimatedImageView {
    private int mNumberY;
    private String mNumberText;
    private Notification mNotification;
    private final float mAlphaWhenOpaque;
    private final float mAlphaWhenTransparent = 1;

    public StatusBarIconView(Context context, String slot, Notification notification) {
    public StatusBarIconView(Context context, String slot, Notification notification, int mode) {
        super(context);
        final Resources res = context.getResources();
        mAlphaWhenOpaque = res.getFraction(R.dimen.status_bar_icon_drawing_alpha, 1, 1);
        mSlot = slot;
        mNumberPain = new Paint();
        mNumberPain.setTextAlign(Paint.Align.CENTER);
@@ -68,8 +76,7 @@ public class StatusBarIconView extends AnimatedImageView {
            final float scale = (float)imageBounds / (float)outerBounds;
            setScaleX(scale);
            setScaleY(scale);
            final float alpha = res.getFraction(R.dimen.status_bar_icon_drawing_alpha, 1, 1);
            setAlpha(alpha);
            setAlpha(getAlphaFor(mode));
        }

        setScaleType(ImageView.ScaleType.CENTER);
@@ -78,13 +85,22 @@ public class StatusBarIconView extends AnimatedImageView {
    public StatusBarIconView(Context context, AttributeSet attrs) {
        super(context, attrs);
        final Resources res = context.getResources();
        mAlphaWhenOpaque = res.getFraction(R.dimen.status_bar_icon_drawing_alpha, 1, 1);
        final int outerBounds = res.getDimensionPixelSize(R.dimen.status_bar_icon_size);
        final int imageBounds = res.getDimensionPixelSize(R.dimen.status_bar_icon_drawing_size);
        final float scale = (float)imageBounds / (float)outerBounds;
        setScaleX(scale);
        setScaleY(scale);
        final float alpha = res.getFraction(R.dimen.status_bar_icon_drawing_alpha, 1, 1);
        setAlpha(alpha);
        setAlpha(getAlphaFor(MODE_OPAQUE));
    }

    public ObjectAnimator animateTransitionTo(int mode) {
        return ObjectAnimator.ofFloat(this, "alpha", getAlpha(), getAlphaFor(mode));
    }

    public float getAlphaFor(int mode) {
        final boolean isTransparent = mode == MODE_SEMI_TRANSPARENT || mode == MODE_TRANSPARENT;
        return isTransparent ? mAlphaWhenTransparent : mAlphaWhenOpaque;
    }

    private static boolean streq(String a, String b) {
+19 −7
Original line number Diff line number Diff line
@@ -60,6 +60,10 @@ public class BarTransitions {
        mSemiTransparent = res.getColor(R.color.status_bar_background_semi_transparent);
    }

    public int getMode() {
        return mMode;
    }

    public void setTransparent(Drawable transparent) {
        mTransparent = transparent;
        if (mMode == MODE_TRANSPARENT) {
@@ -80,14 +84,22 @@ public class BarTransitions {
        onTransition(oldMode, mMode, animate);
    }

    protected Integer getBackgroundColor(int mode) {
        if (mode == MODE_SEMI_TRANSPARENT) return mSemiTransparent;
        if (mode == MODE_OPAQUE) return mOpaque;
        return null;
    }

    protected void onTransition(int oldMode, int newMode, boolean animate) {
        cancelBackgroundColorAnimation();
        if (animate && oldMode == MODE_SEMI_TRANSPARENT && newMode == MODE_OPAQUE) {
            startBackgroundColorAnimation(mSemiTransparent, mOpaque);
        } else if (animate && oldMode == MODE_OPAQUE && newMode == MODE_SEMI_TRANSPARENT) {
            startBackgroundColorAnimation(mOpaque, mSemiTransparent);
        } else if (newMode == MODE_OPAQUE || newMode == MODE_SEMI_TRANSPARENT) {
            mTarget.setBackgroundColor(newMode == MODE_OPAQUE ? mOpaque : mSemiTransparent);
        Integer oldColor = getBackgroundColor(oldMode);
        Integer newColor = getBackgroundColor(newMode);
        if (oldColor != null && newColor != null) {
            if (animate) {
                startBackgroundColorAnimation(oldColor, newColor);
            } else {
                mTarget.setBackgroundColor(newColor);
            }
        } else {
            mTarget.setBackground(newMode == MODE_TRANSPARENT ? mTransparent
                    : newMode == MODE_SEMI_TRANSPARENT ? new ColorDrawable(mSemiTransparent)
+7 −3
Original line number Diff line number Diff line
@@ -843,7 +843,7 @@ public class PhoneStatusBar extends BaseStatusBar {
    public void addIcon(String slot, int index, int viewIndex, StatusBarIcon icon) {
        if (SPEW) Log.d(TAG, "addIcon slot=" + slot + " index=" + index + " viewIndex=" + viewIndex
                + " icon=" + icon);
        StatusBarIconView view = new StatusBarIconView(mContext, slot, null);
        StatusBarIconView view = new StatusBarIconView(mContext, slot, null, getStatusBarMode());
        view.set(icon);
        mStatusIcons.addView(view, viewIndex, new LinearLayout.LayoutParams(mIconSize, mIconSize));
    }
@@ -1921,6 +1921,11 @@ public class PhoneStatusBar extends BaseStatusBar {
        }
    }

    @Override
    protected int getStatusBarMode() {
        return mStatusBarView.getBarTransitions().getMode();
    }

    private int updateBarMode(int oldVis, int newVis, BarTransitions transitions,
            int transientFlag, int transparentFlag, int windowState) {
        final int oldMode = barMode(oldVis, transientFlag, transparentFlag);
@@ -1928,8 +1933,7 @@ public class PhoneStatusBar extends BaseStatusBar {
        if (oldMode == newMode) {
            return -1; // no mode change
        }
        boolean animate = windowState == StatusBarManager.WINDOW_STATE_SHOWING
                && oldMode == MODE_SEMI_TRANSPARENT && newMode == MODE_OPAQUE;
        final boolean animate = windowState == StatusBarManager.WINDOW_STATE_SHOWING;
        transitions.transitionTo(newMode, animate);
        return newMode;
    }
Loading