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

Commit 8fb7787c authored by Jason Monk's avatar Jason Monk
Browse files

Make QS do simpler anim on lock screen

Also add in some tunables to make it easier to play with some
animation options.

Bug: 27301323
Change-Id: I4b6b4978e8473016e8868bf9eb58c02fca0ca5cf
parent 19f47929
Loading
Loading
Loading
Loading
+5 −0
Original line number Original line Diff line number Diff line
@@ -167,6 +167,11 @@ public class PagedTileLayout extends ViewPager implements QSTileLayout {
        }
        }
    };
    };


    public int getColumnCount() {
        if (mPages.size() == 0) return 0;
        return mPages.get(0).mColumns;
    }

    public static class TilePage extends TileLayout {
    public static class TilePage extends TileLayout {
        private int mMaxRows = 3;
        private int mMaxRows = 3;


+88 −9
Original line number Original line Diff line number Diff line
@@ -16,6 +16,7 @@ package com.android.systemui.qs;


import android.util.Log;
import android.util.Log;
import android.view.View;
import android.view.View;
import android.view.View.OnAttachStateChangeListener;
import android.view.View.OnLayoutChangeListener;
import android.view.View.OnLayoutChangeListener;
import android.view.animation.PathInterpolator;
import android.view.animation.PathInterpolator;
import android.widget.TextView;
import android.widget.TextView;
@@ -25,14 +26,20 @@ import com.android.systemui.qs.QSTile.Host.Callback;
import com.android.systemui.qs.TouchAnimator.Builder;
import com.android.systemui.qs.TouchAnimator.Builder;
import com.android.systemui.qs.TouchAnimator.Listener;
import com.android.systemui.qs.TouchAnimator.Listener;
import com.android.systemui.statusbar.phone.QSTileHost;
import com.android.systemui.statusbar.phone.QSTileHost;
import com.android.systemui.tuner.TunerService;
import com.android.systemui.tuner.TunerService.Tunable;


import java.util.ArrayList;
import java.util.ArrayList;
import java.util.Collection;
import java.util.Collection;


public class QSAnimator implements Callback, PageListener, Listener, OnLayoutChangeListener {
public class QSAnimator implements Callback, PageListener, Listener, OnLayoutChangeListener,
        OnAttachStateChangeListener, Tunable {


    private static final String TAG = "QSAnimator";
    private static final String TAG = "QSAnimator";


    private static final String ALLOW_FANCY_ANIMATION = "sysui_qs_fancy_anim";
    private static final String MOVE_FULL_ROWS = "sysui_qs_move_whole_rows";

    public static final PathInterpolator TRANSLATION_Y_INTERPOLATOR =
    public static final PathInterpolator TRANSLATION_Y_INTERPOLATOR =
            new PathInterpolator(.1f, .3f, 1, 1);
            new PathInterpolator(.1f, .3f, 1, 1);


@@ -44,34 +51,77 @@ public class QSAnimator implements Callback, PageListener, Listener, OnLayoutCha
    private final QSPanel mQsPanel;
    private final QSPanel mQsPanel;
    private final QSContainer mQsContainer;
    private final QSContainer mQsContainer;


    private PagedTileLayout mPagedLayout;

    private boolean mOnFirstPage = true;
    private boolean mOnFirstPage = true;
    private TouchAnimator mFirstPageAnimator;
    private TouchAnimator mFirstPageAnimator;
    private TouchAnimator mFirstPageDelayedAnimator;
    private TouchAnimator mFirstPageDelayedAnimator;
    private TouchAnimator mTranslationYAnimator;
    private TouchAnimator mTranslationYAnimator;
    private TouchAnimator mNonfirstPageAnimator;
    private TouchAnimator mNonfirstPageAnimator;


    private boolean mOnKeyguard;

    private boolean mAllowFancy;
    private boolean mFullRows;
    private int mNumQuickTiles;

    public QSAnimator(QSContainer container, QuickQSPanel quickPanel, QSPanel panel) {
    public QSAnimator(QSContainer container, QuickQSPanel quickPanel, QSPanel panel) {
        mQsContainer = container;
        mQsContainer = container;
        mQuickQsPanel = quickPanel;
        mQuickQsPanel = quickPanel;
        mQsPanel = panel;
        mQsPanel = panel;
        mQsPanel.addOnAttachStateChangeListener(this);
        container.addOnLayoutChangeListener(this);
        container.addOnLayoutChangeListener(this);
        QSTileLayout tileLayout = mQsPanel.getTileLayout();
        QSTileLayout tileLayout = mQsPanel.getTileLayout();
        if (tileLayout instanceof PagedTileLayout) {
        if (tileLayout instanceof PagedTileLayout) {
            ((PagedTileLayout) tileLayout).setPageListener(this);
            mPagedLayout = ((PagedTileLayout) tileLayout);
            mPagedLayout.setPageListener(this);
        } else {
        } else {
            Log.w(TAG, "QS Not using page layout");
            Log.w(TAG, "QS Not using page layout");
        }
        }
    }
    }


    public void setOnKeyguard(boolean onKeyguard) {
        mOnKeyguard = onKeyguard;
        if (mOnKeyguard) {
            clearAnimationState();
        }
    }

    public void setHost(QSTileHost qsh) {
    public void setHost(QSTileHost qsh) {
        qsh.addCallback(this);
        qsh.addCallback(this);
    }
    }


    @Override
    public void onViewAttachedToWindow(View v) {
        TunerService.get(mQsContainer.getContext()).addTunable(this, ALLOW_FANCY_ANIMATION,
                MOVE_FULL_ROWS, QuickQSPanel.NUM_QUICK_TILES);
    }

    @Override
    public void onViewDetachedFromWindow(View v) {
        TunerService.get(mQsContainer.getContext()).removeTunable(this);
    }

    @Override
    public void onTuningChanged(String key, String newValue) {
        if (ALLOW_FANCY_ANIMATION.equals(key)) {
            mAllowFancy = newValue == null || Integer.parseInt(newValue) != 0;
            if (!mAllowFancy) {
                clearAnimationState();
            }
        } else if (MOVE_FULL_ROWS.equals(key)) {
            mFullRows = newValue != null && Integer.parseInt(newValue) != 0;
        } else if (QuickQSPanel.NUM_QUICK_TILES.equals(key)) {
            mNumQuickTiles = QuickQSPanel.getNumQuickTiles(mQsContainer.getContext());
            clearAnimationState();
        }
        updateAnimators();
    }

    @Override
    @Override
    public void onPageChanged(boolean isFirst) {
    public void onPageChanged(boolean isFirst) {
        if (mOnFirstPage == isFirst) return;
        if (mOnFirstPage == isFirst) return;
        if (!isFirst) {
        if (!isFirst) {
            setPosition(1);
            clearAnimationState();
            clearAnimationState();
        }
        }
        mOnFirstPage = isFirst;
        mOnFirstPage = isFirst;
@@ -85,6 +135,7 @@ public class QSAnimator implements Callback, PageListener, Listener, OnLayoutCha
        int count = 0;
        int count = 0;
        int[] loc1 = new int[2];
        int[] loc1 = new int[2];
        int[] loc2 = new int[2];
        int[] loc2 = new int[2];
        int lastYDiff = 0;
        firstPageDelayedBuilder.setStartDelay(EXPANDED_TILE_DELAY);
        firstPageDelayedBuilder.setStartDelay(EXPANDED_TILE_DELAY);
        firstPageBuilder.setListener(this);
        firstPageBuilder.setListener(this);
        translationYBuilder.setInterpolator(TRANSLATION_Y_INTERPOLATOR);
        translationYBuilder.setInterpolator(TRANSLATION_Y_INTERPOLATOR);
@@ -92,18 +143,20 @@ public class QSAnimator implements Callback, PageListener, Listener, OnLayoutCha
        firstPageDelayedBuilder.addFloat(mQsPanel.getTileLayout(), "alpha", 0, 1);
        firstPageDelayedBuilder.addFloat(mQsPanel.getTileLayout(), "alpha", 0, 1);
        mAllViews.clear();
        mAllViews.clear();
        mTopFiveQs.clear();
        mTopFiveQs.clear();
        mAllViews.add((View) mQsPanel.getTileLayout());
        for (QSTile<?> tile : tiles) {
        for (QSTile<?> tile : tiles) {
            QSTileBaseView tileView = mQsPanel.getTileView(tile);
            QSTileBaseView tileView = mQsPanel.getTileView(tile);
            final TextView label = ((QSTileView) tileView).getLabel();
            final TextView label = ((QSTileView) tileView).getLabel();
            if (count++ < 5) {
            final View tileIcon = tileView.getIcon();
            if (count < mNumQuickTiles && mAllowFancy) {
                // Quick tiles.
                // Quick tiles.
                QSTileBaseView quickTileView = mQuickQsPanel.getTileView(tile);
                QSTileBaseView quickTileView = mQuickQsPanel.getTileView(tile);
                final View tileIcon = tileView.getIcon();


                getRelativePosition(loc1, quickTileView.getIcon(), mQsContainer);
                getRelativePosition(loc1, quickTileView.getIcon(), mQsContainer);
                getRelativePosition(loc2, tileIcon, mQsContainer);
                getRelativePosition(loc2, tileIcon, mQsContainer);
                final int xDiff = loc2[0] - loc1[0];
                final int xDiff = loc2[0] - loc1[0];
                final int yDiff = loc2[1] - loc1[1];
                final int yDiff = loc2[1] - loc1[1];
                lastYDiff = yDiff;
                // Move the quick tile right from its location to the new one.
                // Move the quick tile right from its location to the new one.
                firstPageBuilder.addFloat(quickTileView, "translationX", 0, xDiff);
                firstPageBuilder.addFloat(quickTileView, "translationX", 0, xDiff);
                translationYBuilder.addFloat(quickTileView, "translationY", 0, yDiff);
                translationYBuilder.addFloat(quickTileView, "translationY", 0, yDiff);
@@ -119,20 +172,38 @@ public class QSAnimator implements Callback, PageListener, Listener, OnLayoutCha


                mTopFiveQs.add(tileIcon);
                mTopFiveQs.add(tileIcon);
                mAllViews.add(tileIcon);
                mAllViews.add(tileIcon);
                mAllViews.add(label);
                mAllViews.add(quickTileView);
                mAllViews.add(quickTileView);
            } else if (mFullRows && isIconInAnimatedRow(count)) {
                firstPageBuilder.addFloat(tileView, "translationY", mQsPanel.getHeight(), 0);
                translationYBuilder.addFloat(label, "translationY", -lastYDiff, 0);
                translationYBuilder.addFloat(tileIcon, "translationY", -lastYDiff, 0);
                mAllViews.add(tileIcon);
                mAllViews.add(label);
            }
            }
            mAllViews.add(tileView);
            mAllViews.add(tileView);
            mAllViews.add(label);
            mAllViews.add(label);
            count++;
        }
        }
        if (mAllowFancy) {
            mFirstPageAnimator = firstPageBuilder.build();
            mFirstPageAnimator = firstPageBuilder.build();
            mFirstPageDelayedAnimator = firstPageDelayedBuilder.build();
            mFirstPageDelayedAnimator = firstPageDelayedBuilder.build();
            mTranslationYAnimator = translationYBuilder.build();
            mTranslationYAnimator = translationYBuilder.build();
        }
        mNonfirstPageAnimator = new TouchAnimator.Builder()
        mNonfirstPageAnimator = new TouchAnimator.Builder()
                .addFloat(mQuickQsPanel, "alpha", 1, 0)
                .addFloat(mQuickQsPanel, "alpha", 1, 0)
                .setEndDelay(.5f)
                .setEndDelay(.5f)
                .build();
                .build();
    }
    }


    private boolean isIconInAnimatedRow(int count) {
        if (mPagedLayout == null) {
            return false;
        }
        final int columnCount = mPagedLayout.getColumnCount();
        return count < ((mNumQuickTiles + columnCount - 1) / columnCount) * columnCount;
    }

    private void getRelativePosition(int[] loc1, View view, View parent) {
    private void getRelativePosition(int[] loc1, View view, View parent) {
        loc1[0] = 0 + view.getWidth() / 2;
        loc1[0] = 0 + view.getWidth() / 2;
        loc1[1] = 0;
        loc1[1] = 0;
@@ -148,7 +219,10 @@ public class QSAnimator implements Callback, PageListener, Listener, OnLayoutCha


    public void setPosition(float position) {
    public void setPosition(float position) {
        if (mFirstPageAnimator == null) return;
        if (mFirstPageAnimator == null) return;
        if (mOnFirstPage) {
        if (mOnKeyguard) {
            return;
        }
        if (mOnFirstPage && mAllowFancy) {
            mQuickQsPanel.setAlpha(1);
            mQuickQsPanel.setAlpha(1);
            mFirstPageAnimator.setPosition(position);
            mFirstPageAnimator.setPosition(position);
            mFirstPageDelayedAnimator.setPosition(position);
            mFirstPageDelayedAnimator.setPosition(position);
@@ -186,12 +260,17 @@ public class QSAnimator implements Callback, PageListener, Listener, OnLayoutCha
    private void clearAnimationState() {
    private void clearAnimationState() {
        final int N = mAllViews.size();
        final int N = mAllViews.size();
        mQuickQsPanel.setAlpha(0);
        mQuickQsPanel.setAlpha(0);
        mQuickQsPanel.setVisibility(View.VISIBLE);
        for (int i = 0; i < N; i++) {
        for (int i = 0; i < N; i++) {
            View v = mAllViews.get(i);
            View v = mAllViews.get(i);
            v.setAlpha(1);
            v.setAlpha(1);
            v.setTranslationX(1);
            v.setTranslationX(1);
            v.setTranslationY(1);
            v.setTranslationY(1);
        }
        }
        final int N2 = mTopFiveQs.size();
        for (int i = 0; i < N2; i++) {
            mTopFiveQs.get(i).setVisibility(View.VISIBLE);
        }
    }
    }


    @Override
    @Override
+1 −0
Original line number Original line Diff line number Diff line
@@ -156,6 +156,7 @@ public class QSContainer extends FrameLayout {
    public void setKeyguardShowing(boolean keyguardShowing) {
    public void setKeyguardShowing(boolean keyguardShowing) {
        if (DEBUG) Log.d(TAG, "setKeyguardShowing " + keyguardShowing);
        if (DEBUG) Log.d(TAG, "setKeyguardShowing " + keyguardShowing);
        mKeyguardShowing = keyguardShowing;
        mKeyguardShowing = keyguardShowing;
        mQSAnimator.setOnKeyguard(keyguardShowing);
        updateQsState();
        updateQsState();
    }
    }


+28 −0
Original line number Original line Diff line number Diff line
@@ -26,6 +26,8 @@ import android.widget.Space;
import com.android.systemui.R;
import com.android.systemui.R;
import com.android.systemui.qs.QSTile.SignalState;
import com.android.systemui.qs.QSTile.SignalState;
import com.android.systemui.qs.QSTile.State;
import com.android.systemui.qs.QSTile.State;
import com.android.systemui.tuner.TunerService;
import com.android.systemui.tuner.TunerService.Tunable;


import java.util.ArrayList;
import java.util.ArrayList;
import java.util.Collection;
import java.util.Collection;
@@ -35,6 +37,8 @@ import java.util.Collection;
 */
 */
public class QuickQSPanel extends QSPanel {
public class QuickQSPanel extends QSPanel {


    public static final String NUM_QUICK_TILES = "sysui_qqs_count";

    private int mMaxTiles;
    private int mMaxTiles;
    private QSPanel mFullPanel;
    private QSPanel mFullPanel;
    private View mHeader;
    private View mHeader;
@@ -51,6 +55,18 @@ public class QuickQSPanel extends QSPanel {
        addView((View) mTileLayout, 1 /* Between brightness and footer */);
        addView((View) mTileLayout, 1 /* Between brightness and footer */);
    }
    }


    @Override
    protected void onAttachedToWindow() {
        super.onAttachedToWindow();
        TunerService.get(mContext).addTunable(mNumTiles, NUM_QUICK_TILES);
    }

    @Override
    protected void onDetachedFromWindow() {
        super.onDetachedFromWindow();
        TunerService.get(mContext).removeTunable(mNumTiles);
    }

    @Override
    @Override
    protected void createCustomizePanel() {
    protected void createCustomizePanel() {
        // No customizing from the header.
        // No customizing from the header.
@@ -86,6 +102,7 @@ public class QuickQSPanel extends QSPanel {


    public void setMaxTiles(int maxTiles) {
    public void setMaxTiles(int maxTiles) {
        mMaxTiles = maxTiles;
        mMaxTiles = maxTiles;
        setTiles(mHost.getTiles());
    }
    }


    @Override
    @Override
@@ -114,6 +131,17 @@ public class QuickQSPanel extends QSPanel {
        super.setTiles(quickTiles);
        super.setTiles(quickTiles);
    }
    }


    private final Tunable mNumTiles = new Tunable() {
        @Override
        public void onTuningChanged(String key, String newValue) {
            setMaxTiles(getNumQuickTiles(mContext));
        }
    };

    public static int getNumQuickTiles(Context context) {
        return TunerService.get(context).getValue(NUM_QUICK_TILES, 5);
    }

    private static class HeaderTileLayout extends LinearLayout implements QSTileLayout {
    private static class HeaderTileLayout extends LinearLayout implements QSTileLayout {


        private final Space mEndSpacer;
        private final Space mEndSpacer;
+0 −1
Original line number Original line Diff line number Diff line
@@ -296,7 +296,6 @@ public class QuickStatusBarHeader extends BaseStatusBarHeader implements
        mHost = host;
        mHost = host;
        host.setHeaderView(this);
        host.setHeaderView(this);
        mHeaderQsPanel.setQSPanelAndHeader(mQsPanel, this);
        mHeaderQsPanel.setQSPanelAndHeader(mQsPanel, this);
        mHeaderQsPanel.setMaxTiles(5);
        mHeaderQsPanel.setHost(host);
        mHeaderQsPanel.setHost(host);
        setUserInfoController(host.getUserInfoController());
        setUserInfoController(host.getUserInfoController());
        setBatteryController(host.getBatteryController());
        setBatteryController(host.getBatteryController());