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

Commit 4de351e7 authored by Roman Birg's avatar Roman Birg
Browse files

SystemUI: be more event driven in keyguard visualizer



Change-Id: I1dc5ca44a3cff2d7faef679b4cc3cfdc32a1ab8c
Signed-off-by: default avatarRoman Birg <roman@cyngn.com>
parent d946b22d
Loading
Loading
Loading
Loading
+8 −1
Original line number Diff line number Diff line
@@ -74,7 +74,14 @@ public class VisualizerTile extends QSTile<QSTile.State> implements KeyguardMoni
                if (mPowerSaveModeEnabled) {
                    AsyncTask.execute(mUnlinkVisualizer);
                } else {
                    mMediaMonitor.checkIfPlaying(null);
                    mHandler.post(new Runnable() {
                        @Override
                        public void run() {
                            doLinkage();
                        }
                    });
                    mHandler.removeCallbacks(mRefreshStateRunnable);
                    mHandler.postDelayed(mRefreshStateRunnable, 50);
                }
            }
        }
+87 −33
Original line number Diff line number Diff line
@@ -16,6 +16,7 @@

package com.android.systemui.statusbar;

import android.animation.Animator;
import android.animation.ArgbEvaluator;
import android.animation.ValueAnimator;
import android.app.ActivityManager;
@@ -32,6 +33,7 @@ import android.graphics.Paint;
import android.graphics.Rect;
import android.os.AsyncTask;
import android.os.Handler;
import android.os.HandlerThread;
import android.os.PowerManager;
import android.os.UserHandle;
import android.provider.Settings;
@@ -79,44 +81,23 @@ public class BackDropView extends FrameLayout implements Palette.PaletteAsyncLis
    private Handler mHandler;
    private LockscreenBarEqRenderer mBarRenderer;
    private ValueAnimator mVisualizerColorAnimator;
    private boolean mAnimatingOn;

    public BackDropView(Context context) {
        super(context);
        init();
    }

    public BackDropView(Context context, AttributeSet attrs) {
        super(context, attrs);
        init();
    }

    public BackDropView(Context context, AttributeSet attrs, int defStyleAttr) {
        super(context, attrs, defStyleAttr);
        init();
    }

    public BackDropView(Context context, AttributeSet attrs, int defStyleAttr,
                        int defStyleRes) {
        super(context, attrs, defStyleAttr, defStyleRes);
        init();
    }

    private void init() {
        mHandler = new Handler();
        mMediaMonitor = new MediaMonitor(mContext) {
            @Override
            public void onPlayStateChanged(boolean playing) {
                if (playing) {
                    if (mVisualizerColorAnimator != null && !mVisualizerColorAnimator.isStarted()) {
                        mVisualizerColorAnimator.start();
                    }
                    requestVisualizer(true, 500);
                } else {
                    // user paused, hide visualizer to stop flash
                    requestVisualizer(false, 0);
                }
            }
        };
    }

    @Override
@@ -150,10 +131,34 @@ public class BackDropView extends FrameLayout implements Palette.PaletteAsyncLis
            mSettingsObserver = new SettingsObserver(new Handler());
        }
        mSettingsObserver.observe();

        HandlerThread handlerThread = new HandlerThread(TAG,
                android.os.Process.THREAD_PRIORITY_BACKGROUND);
        handlerThread.start();
        mHandler = new Handler(handlerThread.getLooper());
        mMediaMonitor = new MediaMonitor(mContext) {
            @Override
            public void onPlayStateChanged(boolean playing) {
                if (playing) {
                    if (mVisualizerColorAnimator != null && !mVisualizerColorAnimator.isStarted()) {
                        mVisualizerColorAnimator.start();
                    }
                    requestVisualizer(true, 500);
                } else {
                    requestVisualizer(false, 0);
                }
            }
        };
        mMediaMonitor.setListening(true);
    }

    @Override
    protected void onDetachedFromWindow() {
        mMediaMonitor.setListening(false);
        haltVisualizer();
        mHandler.getLooper().quit();
        mHandler = null;

        super.onDetachedFromWindow();
        mSettingsObserver.unobserve();
        mContext.unregisterReceiver(mReceiver);
@@ -229,8 +234,8 @@ public class BackDropView extends FrameLayout implements Palette.PaletteAsyncLis
    }

    public void setTouching(boolean touching) {
        if (DEBUG) Log.d(TAG, "setTouching() called with " + "touching = [" + touching + "]");
        if (mTouching != touching) {
            if (DEBUG) Log.d(TAG, "setTouching() called with touching = [" + touching + "]");
            mTouching = touching;
            if (mTouching) {
                // immediately hide visualizer
@@ -242,25 +247,44 @@ public class BackDropView extends FrameLayout implements Palette.PaletteAsyncLis
        }
    }

    public void requestVisualizer(boolean show, int delay) {
    /**
     * Show or hide the visualizer
     *
     * @param show True to request visualizer to be visible, false to hide it.
     *             request may not happen based on other conditions.
     *             Pass null to decisively pick one, or the other, based on the current state.
     * @param delay How long to wait before doing the requested action.
     */
    public void requestVisualizer(Boolean show, int delay) {
        if (mVisualizer == null || !mVisualizerEnabled || mPowerSaveModeEnabled) {
            return;
        }
        mHandler.removeCallbacks(mStartVisualizer);
        mHandler.removeCallbacks(mStopVisualizer);

        if (DEBUG) Log.v(TAG, "requestVisualizer(show: " + show + ", delay: " + delay + ")");
        if (show && mScreenOn
        if ((show == null || show) && mScreenOn
                && mPhoneStatusBar.getBarState() == StatusBarState.KEYGUARD
                && !mPhoneStatusBar.isKeyguardFadingAway()
                && !mPhoneStatusBar.isGoingToNotificationShade()
                && !mPhoneStatusBar.isInLaunchTransition()
                && !mPhoneStatusBar.isQsExpanded()
                && mPhoneStatusBar.getCurrentMediaNotificationKey() != null
                && mStack.getActivatedChild() == null
                ) {
                && mStack.getActivatedChild() == null) {
            if (show == null) {
                // be a little more aggresive when we're unsure of what to expect
                if (!mMediaMonitor.isAnythingPlaying()) {
                    return;
                }
                if (mTouching) {
                    mHandler.postDelayed(mResumeVisualizerIfPlayingRunnable, 500);
                    return;
                }
            }

            if (DEBUG) Log.d(TAG, "--> starting visualizer");
            mHandler.postDelayed(mStartVisualizer, delay);
        } else if (!show) {
        } else if ((show == null || !show)) {
            if (DEBUG) Log.d(TAG, "--> stopping visualizer");
            mHandler.postDelayed(mStopVisualizer, delay);
        }
@@ -297,8 +321,32 @@ public class BackDropView extends FrameLayout implements Palette.PaletteAsyncLis
        public void run() {
            if (DEBUG) Log.w(TAG, "mStartVisualizer");

            mHandler.removeCallbacks(mStartVisualizer);

            mVisualizer.animate().cancel();
            mVisualizer.animate()
                    .alpha(1f)
                    .setListener(new Animator.AnimatorListener() {
                        @Override
                        public void onAnimationStart(Animator animation) {
                            mAnimatingOn = true;
                        }

                        @Override
                        public void onAnimationEnd(Animator animation) {
                            mAnimatingOn = false;
                        }

                        @Override
                        public void onAnimationCancel(Animator animation) {
                            mAnimatingOn = false;
                        }

                        @Override
                        public void onAnimationRepeat(Animator animation) {

                        }
                    })
                    .setDuration(VISUALIZER_ANIMATION_DURATION_IN);
            AsyncTask.execute(mLinkVisualizerRunnable);
        }
@@ -309,10 +357,13 @@ public class BackDropView extends FrameLayout implements Palette.PaletteAsyncLis
        public void run() {
            if (DEBUG) Log.w(TAG, "mStopVisualizer");

            mHandler.removeCallbacks(mStopVisualizer);

            mVisualizer.animate().cancel();
            mVisualizer.animate()
                    .alpha(0f)
                    .setDuration(VISUALIZER_ANIMATION_DURATION_OUT);
            AsyncTask.execute(mUninkVisualizerRunnable);
            AsyncTask.execute(mUnLinkVisualizerRunnable);
        }
    };

@@ -326,7 +377,7 @@ public class BackDropView extends FrameLayout implements Palette.PaletteAsyncLis
        }
    };

    private final Runnable mUninkVisualizerRunnable = new Runnable() {
    private final Runnable mUnLinkVisualizerRunnable = new Runnable() {
        @Override
        public void run() {
            if (mVisualizer != null && mLinked) {
@@ -339,8 +390,9 @@ public class BackDropView extends FrameLayout implements Palette.PaletteAsyncLis
    private Runnable mResumeVisualizerIfPlayingRunnable = new Runnable() {
        @Override
        public void run() {
            if (DEBUG) Log.i(TAG, "mResumeVisualizerIfPlayingRunnable");
            if (mMediaMonitor.isAnythingPlaying()) {
                requestVisualizer(true, 250);
                requestVisualizer(null, 250);
            }
        }
    };
@@ -360,7 +412,7 @@ public class BackDropView extends FrameLayout implements Palette.PaletteAsyncLis
                @Override
                public void onScreenTurnedOff(int why) {
                    mScreenOn = false;
                    haltVisualizer();
                    requestVisualizer(false, 0);
                }

                @Override
@@ -443,7 +495,9 @@ public class BackDropView extends FrameLayout implements Palette.PaletteAsyncLis
                //
                mDrawEmpty = true;
            }
            if (mDrawEmpty) {

            // if the 'on' animation is currently running, then always draw
            if (mDrawEmpty && !mAnimatingOn) {
                mVisualizer.setDrawingEnabled(false);
            } else {
                mVisualizer.setDrawingEnabled(true);
+2 −7
Original line number Diff line number Diff line
@@ -1066,7 +1066,6 @@ public class NotificationPanelView extends PanelView implements
    private void setKeyguardBottomAreaVisibility(int statusBarState,
            boolean goingToFullShade) {
        if (goingToFullShade) {
            mStatusBar.requestVisualizer(false, 0);
            mKeyguardBottomArea.animate().cancel();
            mKeyguardBottomArea.animate()
                    .alpha(0f)
@@ -1105,7 +1104,6 @@ public class NotificationPanelView extends PanelView implements
                        .setDuration(mStatusBar.getKeyguardFadingAwayDuration()/2)
                        .start();
            }
            mStatusBar.requestVisualizer(false, 0);
        } else if (mStatusBarState == StatusBarState.SHADE_LOCKED
                && statusBarState == StatusBarState.KEYGUARD) {
            mKeyguardStatusView.animate().cancel();
@@ -1118,7 +1116,6 @@ public class NotificationPanelView extends PanelView implements
                    .setDuration(320)
                    .setInterpolator(PhoneStatusBar.ALPHA_IN)
                    .withEndAction(mAnimateKeyguardStatusViewVisibleEndRunnable);
            mStatusBar.requestVisualizer(true, 320);
        } else if (statusBarState == StatusBarState.KEYGUARD) {
            mKeyguardStatusView.animate().cancel();
            mKeyguardStatusViewAnimating = false;
@@ -1855,7 +1852,8 @@ public class NotificationPanelView extends PanelView implements
    @Override
    public void onSwipingAnimationFinished(boolean snappingBack) {
        if (snappingBack) {
            mStatusBar.requestVisualizer(true, 300);
            mStatusBar.setVisualizerTouching(false);
            mStatusBar.requestVisualizer(null, 0);
        }
    }

@@ -1974,9 +1972,6 @@ public class NotificationPanelView extends PanelView implements
    }

    public void setEmptyDragAmount(float amount) {
        if (amount == 0 && mStatusBarState == StatusBarState.KEYGUARD) {
            mStatusBar.requestVisualizer(true, 300);
        }
        float factor = 0.8f;
        if (mNotificationStackScroller.getNotGoneChildCount() > 0) {
            factor = 0.4f;
+1 −2
Original line number Diff line number Diff line
@@ -863,7 +863,6 @@ public abstract class PanelView extends FrameLayout {
                if (mCancelled) {
                    mHeightAnimator = null;
                    onAnimationFinished.run();
                    mStatusBar.requestVisualizer(true, 250);
                } else {
                    startUnlockHintAnimationPhase2(onAnimationFinished);
                }
@@ -900,7 +899,7 @@ public abstract class PanelView extends FrameLayout {
            public void onAnimationEnd(Animator animation) {
                mHeightAnimator = null;
                onAnimationFinished.run();
                mStatusBar.requestVisualizer(true, 200);
                mStatusBar.requestVisualizer(null, 250);
            }
        });
        animator.start();
+1 −1
Original line number Diff line number Diff line
@@ -5157,7 +5157,7 @@ public class PhoneStatusBar extends BaseStatusBar implements DemoMode,
        return !mNotificationData.getActiveNotifications().isEmpty();
    }

    public void requestVisualizer(boolean show, int delay) {
    public void requestVisualizer(Boolean show, int delay) {
        mBackdrop.requestVisualizer(show, delay);
    }

Loading