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

Commit 7336a5d0 authored by Selim Cinek's avatar Selim Cinek Committed by Android Git Automerger
Browse files

am a4e01205: Merge "Changed the overscroll and expanding behaviour." into lmp-preview-dev

* commit 'a4e01205c0782dccfe56597bd1144c75b4e08081':
  Changed the overscroll and expanding behaviour.
parents b73afd0a dffb3e7e
Loading
Loading
Loading
Loading
+3 −0
Original line number Original line Diff line number Diff line
@@ -272,6 +272,9 @@
    <!-- The padding between the individual notification cards. -->
    <!-- The padding between the individual notification cards. -->
    <dimen name="notification_padding">4dp</dimen>
    <dimen name="notification_padding">4dp</dimen>


    <!-- The minimum amount of top overscroll to go to the quick settings. -->
    <dimen name="min_top_overscroll_to_qs">36dp</dimen>

    <!-- The height of the collapsed speed bump view. -->
    <!-- The height of the collapsed speed bump view. -->
    <dimen name="speed_bump_height_collapsed">24dp</dimen>
    <dimen name="speed_bump_height_collapsed">24dp</dimen>


+118 −69
Original line number Original line Diff line number Diff line
@@ -42,6 +42,7 @@ public class ExpandHelper implements Gefingerpoken {
        boolean canChildBeExpanded(View v);
        boolean canChildBeExpanded(View v);
        void setUserExpandedChild(View v, boolean userExpanded);
        void setUserExpandedChild(View v, boolean userExpanded);
        void setUserLockedChild(View v, boolean userLocked);
        void setUserLockedChild(View v, boolean userLocked);
        void expansionStateChanged(boolean isExpanding);
    }
    }


    private static final String TAG = "ExpandHelper";
    private static final String TAG = "ExpandHelper";
@@ -77,7 +78,6 @@ public class ExpandHelper implements Gefingerpoken {
    private boolean mWatchingForPull;
    private boolean mWatchingForPull;
    private boolean mHasPopped;
    private boolean mHasPopped;
    private View mEventSource;
    private View mEventSource;
    private View mCurrView;
    private float mOldHeight;
    private float mOldHeight;
    private float mNaturalHeight;
    private float mNaturalHeight;
    private float mInitialTouchFocusY;
    private float mInitialTouchFocusY;
@@ -86,8 +86,7 @@ public class ExpandHelper implements Gefingerpoken {
    private float mLastFocusY;
    private float mLastFocusY;
    private float mLastSpanY;
    private float mLastSpanY;
    private int mTouchSlop;
    private int mTouchSlop;
    private int mLastMotionY;
    private float mLastMotionY;
    private float mPopLimit;
    private int mPopDuration;
    private int mPopDuration;
    private float mPullGestureMinXSpan;
    private float mPullGestureMinXSpan;
    private Callback mCallback;
    private Callback mCallback;
@@ -95,10 +94,14 @@ public class ExpandHelper implements Gefingerpoken {
    private ViewScaler mScaler;
    private ViewScaler mScaler;
    private ObjectAnimator mScaleAnimation;
    private ObjectAnimator mScaleAnimation;
    private Vibrator mVibrator;
    private Vibrator mVibrator;
    private boolean mEnabled = true;
    private ExpandableView mResizedView;
    private float mCurrentHeight;


    private int mSmallSize;
    private int mSmallSize;
    private int mLargeSize;
    private int mLargeSize;
    private float mMaximumStretch;
    private float mMaximumStretch;
    private boolean mOnlyMovements;


    private int mGravity;
    private int mGravity;


@@ -109,17 +112,14 @@ public class ExpandHelper implements Gefingerpoken {
        @Override
        @Override
        public boolean onScaleBegin(ScaleGestureDetector detector) {
        public boolean onScaleBegin(ScaleGestureDetector detector) {
            if (DEBUG_SCALE) Log.v(TAG, "onscalebegin()");
            if (DEBUG_SCALE) Log.v(TAG, "onscalebegin()");
            float focusX = detector.getFocusX();
            float focusY = detector.getFocusY();


            final ExpandableView underFocus = findView(focusX, focusY);
            startExpanding(mResizedView, STRETCH);
            startExpanding(underFocus, STRETCH);
            return mExpanding;
            return mExpanding;
        }
        }


        @Override
        @Override
        public boolean onScale(ScaleGestureDetector detector) {
        public boolean onScale(ScaleGestureDetector detector) {
            if (DEBUG_SCALE) Log.v(TAG, "onscale() on " + mCurrView);
            if (DEBUG_SCALE) Log.v(TAG, "onscale() on " + mResizedView);
            return true;
            return true;
        }
        }


@@ -138,6 +138,7 @@ public class ExpandHelper implements Gefingerpoken {
        public void setHeight(float h) {
        public void setHeight(float h) {
            if (DEBUG_SCALE) Log.v(TAG, "SetHeight: setting to " + h);
            if (DEBUG_SCALE) Log.v(TAG, "SetHeight: setting to " + h);
            mView.setActualHeight((int) h);
            mView.setActualHeight((int) h);
            mCurrentHeight = h;
        }
        }
        public float getHeight() {
        public float getHeight() {
            return mView.getActualHeight();
            return mView.getActualHeight();
@@ -165,7 +166,6 @@ public class ExpandHelper implements Gefingerpoken {
        mGravity = Gravity.TOP;
        mGravity = Gravity.TOP;
        mScaleAnimation = ObjectAnimator.ofFloat(mScaler, "height", 0f);
        mScaleAnimation = ObjectAnimator.ofFloat(mScaler, "height", 0f);
        mScaleAnimation.setDuration(EXPAND_DURATION);
        mScaleAnimation.setDuration(EXPAND_DURATION);
        mPopLimit = mContext.getResources().getDimension(R.dimen.blinds_pop_threshold);
        mPopDuration = mContext.getResources().getInteger(R.integer.blinds_pop_duration_ms);
        mPopDuration = mContext.getResources().getInteger(R.integer.blinds_pop_duration_ms);
        mPullGestureMinXSpan = mContext.getResources().getDimension(R.dimen.pull_span_min);
        mPullGestureMinXSpan = mContext.getResources().getDimension(R.dimen.pull_span_min);


@@ -188,7 +188,6 @@ public class ExpandHelper implements Gefingerpoken {
        float target = hand + mOldHeight;
        float target = hand + mOldHeight;
        float newHeight = clamp(target);
        float newHeight = clamp(target);
        mScaler.setHeight(newHeight);
        mScaler.setHeight(newHeight);

        mLastFocusY = mSGD.getFocusY();
        mLastFocusY = mSGD.getFocusY();
        mLastSpanY = mSGD.getCurrentSpan();
        mLastSpanY = mSGD.getCurrentSpan();
    }
    }
@@ -252,6 +251,9 @@ public class ExpandHelper implements Gefingerpoken {


    @Override
    @Override
    public boolean onInterceptTouchEvent(MotionEvent ev) {
    public boolean onInterceptTouchEvent(MotionEvent ev) {
        if (!isEnabled()) {
            return false;
        }
        final int action = ev.getAction();
        final int action = ev.getAction();
        if (DEBUG_SCALE) Log.d(TAG, "intercept: act=" + MotionEvent.actionToString(action) +
        if (DEBUG_SCALE) Log.d(TAG, "intercept: act=" + MotionEvent.actionToString(action) +
                         " expanding=" + mExpanding +
                         " expanding=" + mExpanding +
@@ -270,48 +272,46 @@ public class ExpandHelper implements Gefingerpoken {
        if (DEBUG_SCALE) Log.d(TAG, "set initial span: " + mInitialTouchSpan);
        if (DEBUG_SCALE) Log.d(TAG, "set initial span: " + mInitialTouchSpan);


        if (mExpanding) {
        if (mExpanding) {
            mLastMotionY = ev.getRawY();
            return true;
            return true;
        } else {
        } else {
            if ((action == MotionEvent.ACTION_MOVE) && 0 != (mExpansionStyle & BLINDS)) {
            if ((action == MotionEvent.ACTION_MOVE) && 0 != (mExpansionStyle & BLINDS)) {
                // we've begun Venetian blinds style expansion
                // we've begun Venetian blinds style expansion
                return true;
                return true;
            }
            }
            switch (action & MotionEvent.ACTION_MASK) {
            case MotionEvent.ACTION_MOVE: {
                final float xspan = mSGD.getCurrentSpanX();
                final float xspan = mSGD.getCurrentSpanX();
            if ((action == MotionEvent.ACTION_MOVE &&
                if (xspan > mPullGestureMinXSpan &&
                    xspan > mPullGestureMinXSpan &&
                        xspan > mSGD.getCurrentSpanY() && !mExpanding) {
                    xspan > mSGD.getCurrentSpanY())) {
                    // detect a vertical pulling gesture with fingers somewhat separated
                    // detect a vertical pulling gesture with fingers somewhat separated
                    if (DEBUG_SCALE) Log.v(TAG, "got pull gesture (xspan=" + xspan + "px)");
                    if (DEBUG_SCALE) Log.v(TAG, "got pull gesture (xspan=" + xspan + "px)");

                    startExpanding(mResizedView, PULL);
                final ExpandableView underFocus = findView(x, y);
                    mWatchingForPull = false;
                startExpanding(underFocus, PULL);
                return true;
                }
                }
            if (mScrollAdapter != null && !mScrollAdapter.isScrolledToTop()) {
                return false;
            }
            // Now look for other gestures
            switch (action & MotionEvent.ACTION_MASK) {
            case MotionEvent.ACTION_MOVE: {
                if (mWatchingForPull) {
                if (mWatchingForPull) {
                    final int yDiff = y - mLastMotionY;
                    final float yDiff = ev.getRawY() - mInitialTouchY;
                    if (yDiff > mTouchSlop) {
                    if (yDiff > mTouchSlop) {
                        if (DEBUG) Log.v(TAG, "got venetian gesture (dy=" + yDiff + "px)");
                        if (DEBUG) Log.v(TAG, "got venetian gesture (dy=" + yDiff + "px)");
                        mLastMotionY = y;
                        mWatchingForPull = false;
                        final ExpandableView underFocus = findView(x, y);
                        if (mResizedView != null && !isFullyExpanded(mResizedView)) {
                        if (startExpanding(underFocus, BLINDS)) {
                            if (startExpanding(mResizedView, BLINDS)) {
                            mInitialTouchY = mLastMotionY;
                                mLastMotionY = ev.getRawY();
                                mInitialTouchY = ev.getRawY();
                                mHasPopped = false;
                                mHasPopped = false;
                            }
                            }
                        }
                        }
                    }
                    }
                }
                break;
                break;
            }
            }


            case MotionEvent.ACTION_DOWN:
            case MotionEvent.ACTION_DOWN:
                mWatchingForPull = mScrollAdapter != null &&
                mWatchingForPull = mScrollAdapter != null &&
                        isInside(mScrollAdapter.getHostView(), x, y);
                        isInside(mScrollAdapter.getHostView(), x, y)
                mLastMotionY = y;
                        && mScrollAdapter.isScrolledToTop();
                mResizedView = findView(x, y);
                mInitialTouchY = ev.getY();
                break;
                break;


            case MotionEvent.ACTION_CANCEL:
            case MotionEvent.ACTION_CANCEL:
@@ -321,12 +321,28 @@ public class ExpandHelper implements Gefingerpoken {
                clearView();
                clearView();
                break;
                break;
            }
            }
            mLastMotionY = ev.getRawY();
            return mExpanding;
            return mExpanding;
        }
        }
    }
    }


    public void setEnabled(boolean enable) {
        mEnabled = enable;
    }

    private boolean isEnabled() {
        return mEnabled;
    }

    private boolean isFullyExpanded(ExpandableView underFocus) {
        return underFocus.getIntrinsicHeight() == underFocus.getMaxHeight();
    }

    @Override
    @Override
    public boolean onTouchEvent(MotionEvent ev) {
    public boolean onTouchEvent(MotionEvent ev) {
        if (!isEnabled()) {
            return false;
        }
        final int action = ev.getActionMasked();
        final int action = ev.getActionMasked();
        if (DEBUG_SCALE) Log.d(TAG, "touch: act=" + MotionEvent.actionToString(action) +
        if (DEBUG_SCALE) Log.d(TAG, "touch: act=" + MotionEvent.actionToString(action) +
                " expanding=" + mExpanding +
                " expanding=" + mExpanding +
@@ -335,47 +351,71 @@ public class ExpandHelper implements Gefingerpoken {
                (0 != (mExpansionStyle & STRETCH) ? " (stretch)" : ""));
                (0 != (mExpansionStyle & STRETCH) ? " (stretch)" : ""));


        mSGD.onTouchEvent(ev);
        mSGD.onTouchEvent(ev);
        final int x = (int) mSGD.getFocusX();
        final int y = (int) mSGD.getFocusY();


        if (mOnlyMovements) {
            mLastMotionY = ev.getRawY();
            return false;
        }
        switch (action) {
        switch (action) {
            case MotionEvent.ACTION_DOWN:
                mWatchingForPull = mScrollAdapter != null &&
                        isInside(mScrollAdapter.getHostView(), x, y);
                mResizedView = findView(x, y);
                mInitialTouchY = ev.getY();
                break;
            case MotionEvent.ACTION_MOVE: {
            case MotionEvent.ACTION_MOVE: {
                if (0 != (mExpansionStyle & BLINDS)) {
                if (mWatchingForPull) {
                    final float rawHeight = ev.getY() - mInitialTouchY + mOldHeight;
                    final float yDiff = ev.getRawY() - mInitialTouchY;
                    if (yDiff > mTouchSlop) {
                        if (DEBUG) Log.v(TAG, "got venetian gesture (dy=" + yDiff + "px)");
                        mWatchingForPull = false;
                        if (mResizedView != null && !isFullyExpanded(mResizedView)) {
                            if (startExpanding(mResizedView, BLINDS)) {
                                mInitialTouchY = ev.getRawY();
                                mLastMotionY = ev.getRawY();
                                mHasPopped = false;
                            }
                        }
                    }
                }
                if (mExpanding && 0 != (mExpansionStyle & BLINDS)) {
                    final float rawHeight = ev.getRawY() - mLastMotionY + mCurrentHeight;
                    final float newHeight = clamp(rawHeight);
                    final float newHeight = clamp(rawHeight);
                    final boolean wasClosed = (mOldHeight == mSmallSize);
                    boolean isFinished = false;
                    boolean isFinished = false;
                    boolean expanded = false;
                    if (rawHeight > mNaturalHeight) {
                    if (rawHeight > mNaturalHeight) {
                        isFinished = true;
                        isFinished = true;
                        expanded = true;
                    }
                    }
                    if (rawHeight < mSmallSize) {
                    if (rawHeight < mSmallSize) {
                        isFinished = true;
                        isFinished = true;
                        expanded = false;
                    }
                    }


                    final float pull = Math.abs(ev.getY() - mInitialTouchY);
                    if (mHasPopped || pull > mPopLimit) {
                    if (!mHasPopped) {
                    if (!mHasPopped) {
                        vibrate(mPopDuration);
                        vibrate(mPopDuration);
                        mHasPopped = true;
                        mHasPopped = true;
                    }
                    }
                    }


                    if (mHasPopped) {
                    mScaler.setHeight(newHeight);
                    mScaler.setHeight(newHeight);
                    }
                    mLastMotionY = ev.getRawY();

                    if (isFinished) {
                    final int x = (int) mSGD.getFocusX();
                        mCallback.setUserExpandedChild(mResizedView, expanded);
                    final int y = (int) mSGD.getFocusY();
                        mCallback.expansionStateChanged(false);
                    ExpandableView underFocus = findView(x, y);
                        return false;
                    if (isFinished && underFocus != null && underFocus != mCurrView) {
                    } else {
                        finishExpanding(false); // @@@ needed?
                        mCallback.expansionStateChanged(true);
                        startExpanding(underFocus, BLINDS);
                        mInitialTouchY = y;
                        mHasPopped = false;
                    }
                    }
                    return true;
                    return true;
                }
                }


                if (mExpanding) {
                if (mExpanding) {

                    // Gestural expansion is running
                    updateExpansion();
                    updateExpansion();
                    mLastMotionY = ev.getRawY();
                    return true;
                    return true;
                }
                }


@@ -396,6 +436,7 @@ public class ExpandHelper implements Gefingerpoken {
                clearView();
                clearView();
                break;
                break;
        }
        }
        mLastMotionY = ev.getRawY();
        return true;
        return true;
    }
    }


@@ -407,15 +448,16 @@ public class ExpandHelper implements Gefingerpoken {
            return false;
            return false;
        }
        }
        mExpansionStyle = expandType;
        mExpansionStyle = expandType;
        if (mExpanding && v == mCurrView) {
        if (mExpanding && v == mResizedView) {
            return true;
            return true;
        }
        }
        mExpanding = true;
        mExpanding = true;
        mCallback.expansionStateChanged(true);
        if (DEBUG) Log.d(TAG, "scale type " + expandType + " beginning on view: " + v);
        if (DEBUG) Log.d(TAG, "scale type " + expandType + " beginning on view: " + v);
        mCallback.setUserLockedChild(v, true);
        mCallback.setUserLockedChild(v, true);
        setView(v);
        mScaler.setView(v);
        mScaler.setView((ExpandableView) v);
        mOldHeight = mScaler.getHeight();
        mOldHeight = mScaler.getHeight();
        mCurrentHeight = mOldHeight;
        if (mCallback.canChildBeExpanded(v)) {
        if (mCallback.canChildBeExpanded(v)) {
            if (DEBUG) Log.d(TAG, "working on an expandable child");
            if (DEBUG) Log.d(TAG, "working on an expandable child");
            mNaturalHeight = mScaler.getNaturalHeight(mLargeSize);
            mNaturalHeight = mScaler.getNaturalHeight(mLargeSize);
@@ -425,14 +467,13 @@ public class ExpandHelper implements Gefingerpoken {
        }
        }
        if (DEBUG) Log.d(TAG, "got mOldHeight: " + mOldHeight +
        if (DEBUG) Log.d(TAG, "got mOldHeight: " + mOldHeight +
                    " mNaturalHeight: " + mNaturalHeight);
                    " mNaturalHeight: " + mNaturalHeight);
        v.getParent().requestDisallowInterceptTouchEvent(true);
        return true;
        return true;
    }
    }


    private void finishExpanding(boolean force) {
    private void finishExpanding(boolean force) {
        if (!mExpanding) return;
        if (!mExpanding) return;


        if (DEBUG) Log.d(TAG, "scale in finishing on view: " + mCurrView);
        if (DEBUG) Log.d(TAG, "scale in finishing on view: " + mResizedView);


        float currentHeight = mScaler.getHeight();
        float currentHeight = mScaler.getHeight();
        float targetHeight = mSmallSize;
        float targetHeight = mSmallSize;
@@ -446,11 +487,12 @@ public class ExpandHelper implements Gefingerpoken {
        if (mScaleAnimation.isRunning()) {
        if (mScaleAnimation.isRunning()) {
            mScaleAnimation.cancel();
            mScaleAnimation.cancel();
        }
        }
        mCallback.setUserExpandedChild(mCurrView, targetHeight == mNaturalHeight);
        mCallback.setUserExpandedChild(mResizedView, targetHeight == mNaturalHeight);
        mCallback.expansionStateChanged(false);
        if (targetHeight != currentHeight) {
        if (targetHeight != currentHeight) {
            mScaleAnimation.setFloatValues(targetHeight);
            mScaleAnimation.setFloatValues(targetHeight);
            mScaleAnimation.setupStartValues();
            mScaleAnimation.setupStartValues();
            final View scaledView = mCurrView;
            final View scaledView = mResizedView;
            mScaleAnimation.addListener(new AnimatorListenerAdapter() {
            mScaleAnimation.addListener(new AnimatorListenerAdapter() {
                @Override
                @Override
                public void onAnimationEnd(Animator animation) {
                public void onAnimationEnd(Animator animation) {
@@ -460,7 +502,7 @@ public class ExpandHelper implements Gefingerpoken {
            });
            });
            mScaleAnimation.start();
            mScaleAnimation.start();
        } else {
        } else {
            mCallback.setUserLockedChild(mCurrView, false);
            mCallback.setUserLockedChild(mResizedView, false);
        }
        }


        mExpanding = false;
        mExpanding = false;
@@ -470,16 +512,11 @@ public class ExpandHelper implements Gefingerpoken {
        if (DEBUG) Log.d(TAG, "currentHeight is: " + currentHeight);
        if (DEBUG) Log.d(TAG, "currentHeight is: " + currentHeight);
        if (DEBUG) Log.d(TAG, "mSmallSize is: " + mSmallSize);
        if (DEBUG) Log.d(TAG, "mSmallSize is: " + mSmallSize);
        if (DEBUG) Log.d(TAG, "targetHeight is: " + targetHeight);
        if (DEBUG) Log.d(TAG, "targetHeight is: " + targetHeight);
        if (DEBUG) Log.d(TAG, "scale was finished on view: " + mCurrView);
        if (DEBUG) Log.d(TAG, "scale was finished on view: " + mResizedView);
    }
    }


    private void clearView() {
    private void clearView() {
        mCurrView = null;
        mResizedView = null;

    }

    private void setView(View v) {
        mCurrView = v;
    }
    }


    /**
    /**
@@ -493,6 +530,18 @@ public class ExpandHelper implements Gefingerpoken {
        mSGD = new ScaleGestureDetector(mContext, mScaleGestureListener);
        mSGD = new ScaleGestureDetector(mContext, mScaleGestureListener);
    }
    }


    /**
     * Change the expansion mode to only observe movements and don't perform any resizing.
     * This is needed when the expanding is finished and the scroller kicks in,
     * performing an overscroll motion. We only want to shrink it again when we are not
     * overscrolled.
     *
     * @param onlyMovements Should only movements be observed?
     */
    public void onlyObserveMovements(boolean onlyMovements) {
        mOnlyMovements = onlyMovements;
    }

    /**
    /**
     * Triggers haptic feedback.
     * Triggers haptic feedback.
     */
     */
+2 −1
Original line number Original line Diff line number Diff line
@@ -25,7 +25,6 @@ import android.view.View;
import android.view.ViewConfiguration;
import android.view.ViewConfiguration;
import android.view.animation.AnimationUtils;
import android.view.animation.AnimationUtils;
import android.view.animation.Interpolator;
import android.view.animation.Interpolator;

import com.android.systemui.ExpandHelper;
import com.android.systemui.ExpandHelper;
import com.android.systemui.Gefingerpoken;
import com.android.systemui.Gefingerpoken;
import com.android.systemui.R;
import com.android.systemui.R;
@@ -87,6 +86,7 @@ public class DragDownHelper implements Gefingerpoken {
                    captureStartingChild(mInitialTouchX, mInitialTouchY);
                    captureStartingChild(mInitialTouchX, mInitialTouchY);
                    mInitialTouchY = y;
                    mInitialTouchY = y;
                    mInitialTouchX = x;
                    mInitialTouchX = x;
                    mOnDragDownListener.onTouchSlopExceeded();
                    return true;
                    return true;
                }
                }
                break;
                break;
@@ -202,5 +202,6 @@ public class DragDownHelper implements Gefingerpoken {
        void onDraggedDown(View startingChild);
        void onDraggedDown(View startingChild);
        void onDragDownReset();
        void onDragDownReset();
        void onThresholdReached();
        void onThresholdReached();
        void onTouchSlopExceeded();
    }
    }
}
}
+37 −43
Original line number Original line Diff line number Diff line
@@ -83,10 +83,7 @@ public class NotificationPanelView extends PanelView implements
    private float mQsExpansionHeight;
    private float mQsExpansionHeight;
    private int mQsMinExpansionHeight;
    private int mQsMinExpansionHeight;
    private int mQsMaxExpansionHeight;
    private int mQsMaxExpansionHeight;
    private int mMinStackHeight;
    private int mQsPeekHeight;
    private int mQsPeekHeight;
    private float mNotificationTranslation;
    private int mStackScrollerIntrinsicPadding;
    private boolean mStackScrollerOverscrolling;
    private boolean mStackScrollerOverscrolling;
    private boolean mQsExpansionEnabled = true;
    private boolean mQsExpansionEnabled = true;
    private ValueAnimator mQsExpansionAnimator;
    private ValueAnimator mQsExpansionAnimator;
@@ -165,7 +162,6 @@ public class NotificationPanelView extends PanelView implements
        super.loadDimens();
        super.loadDimens();
        mNotificationTopPadding = getResources().getDimensionPixelSize(
        mNotificationTopPadding = getResources().getDimensionPixelSize(
                R.dimen.notifications_top_padding);
                R.dimen.notifications_top_padding);
        mMinStackHeight = getResources().getDimensionPixelSize(R.dimen.collapsed_stack_height);
        mFlingAnimationUtils = new FlingAnimationUtils(getContext(), 0.4f);
        mFlingAnimationUtils = new FlingAnimationUtils(getContext(), 0.4f);
        mStatusBarMinHeight = getResources().getDimensionPixelSize(
        mStatusBarMinHeight = getResources().getDimensionPixelSize(
                com.android.internal.R.dimen.status_bar_height);
                com.android.internal.R.dimen.status_bar_height);
@@ -185,7 +181,8 @@ public class NotificationPanelView extends PanelView implements
        mQsMaxExpansionHeight = mHeader.getExpandedHeight() + mQsContainer.getHeight();
        mQsMaxExpansionHeight = mHeader.getExpandedHeight() + mQsContainer.getHeight();
        if (mQsExpanded) {
        if (mQsExpanded) {
            if (mQsFullyExpanded) {
            if (mQsFullyExpanded) {
                setQsStackScrollerPadding(mQsMaxExpansionHeight);
                mQsExpansionHeight = mQsMaxExpansionHeight;
                requestScrollerTopPaddingUpdate(false /* animate */);
            }
            }
        } else {
        } else {
            if (!mStackScrollerOverscrolling) {
            if (!mStackScrollerOverscrolling) {
@@ -202,11 +199,12 @@ public class NotificationPanelView extends PanelView implements
     */
     */
    private void positionClockAndNotifications() {
    private void positionClockAndNotifications() {
        boolean animateClock = mNotificationStackScroller.isAddOrRemoveAnimationPending();
        boolean animateClock = mNotificationStackScroller.isAddOrRemoveAnimationPending();
        int stackScrollerPadding;
        if (mStatusBar.getBarState() != StatusBarState.KEYGUARD) {
        if (mStatusBar.getBarState() != StatusBarState.KEYGUARD) {
            int bottom = mStackScrollerOverscrolling
            int bottom = mStackScrollerOverscrolling
                    ? mHeader.getCollapsedHeight()
                    ? mHeader.getCollapsedHeight()
                    : mHeader.getBottom();
                    : mHeader.getBottom();
            mStackScrollerIntrinsicPadding = bottom + mQsPeekHeight
            stackScrollerPadding = bottom + mQsPeekHeight
                    + mNotificationTopPadding;
                    + mNotificationTopPadding;
            mTopPaddingAdjustment = 0;
            mTopPaddingAdjustment = 0;
        } else {
        } else {
@@ -224,11 +222,11 @@ public class NotificationPanelView extends PanelView implements
                mKeyguardStatusView.setY(mClockPositionResult.clockY);
                mKeyguardStatusView.setY(mClockPositionResult.clockY);
            }
            }
            applyClockAlpha(mClockPositionResult.clockAlpha);
            applyClockAlpha(mClockPositionResult.clockAlpha);
            mStackScrollerIntrinsicPadding = mClockPositionResult.stackScrollerPadding;
            stackScrollerPadding = mClockPositionResult.stackScrollerPadding;
            mTopPaddingAdjustment = mClockPositionResult.stackScrollerPaddingAdjustment;
            mTopPaddingAdjustment = mClockPositionResult.stackScrollerPaddingAdjustment;
        }
        }
        mNotificationStackScroller.setTopPadding(mStackScrollerIntrinsicPadding,
        mNotificationStackScroller.setIntrinsicPadding(stackScrollerPadding);
                mAnimateNextTopPaddingChange || animateClock);
        requestScrollerTopPaddingUpdate(animateClock);
        mAnimateNextTopPaddingChange = false;
        mAnimateNextTopPaddingChange = false;
    }
    }


@@ -384,6 +382,7 @@ public class NotificationPanelView extends PanelView implements
                    mInitialTouchX = x;
                    mInitialTouchX = x;
                    mQsTracking = true;
                    mQsTracking = true;
                    mIntercepting = false;
                    mIntercepting = false;
                    mNotificationStackScroller.removeLongPressCallback();
                    return true;
                    return true;
                }
                }
                break;
                break;
@@ -523,6 +522,13 @@ public class NotificationPanelView extends PanelView implements
        updateQsState();
        updateQsState();
    }
    }


    @Override
    public void flingTopOverscroll(float velocity, boolean open) {
        mStackScrollerOverscrolling = false;
        setQsExpansion(mQsExpansionHeight);
        flingSettings(velocity, open);
    }

    private void onQsExpansionStarted() {
    private void onQsExpansionStarted() {
        onQsExpansionStarted(0);
        onQsExpansionStarted(0);
    }
    }
@@ -554,7 +560,9 @@ public class NotificationPanelView extends PanelView implements
        mHeader.setExpanded(expandVisually, mStackScrollerOverscrolling);
        mHeader.setExpanded(expandVisually, mStackScrollerOverscrolling);
        mNotificationStackScroller.setEnabled(!mQsExpanded);
        mNotificationStackScroller.setEnabled(!mQsExpanded);
        mQsPanel.setVisibility(expandVisually ? View.VISIBLE : View.INVISIBLE);
        mQsPanel.setVisibility(expandVisually ? View.VISIBLE : View.INVISIBLE);
        mQsContainer.setVisibility(mKeyguardShowing && !mQsExpanded ? View.INVISIBLE : View.VISIBLE);
        mQsContainer.setVisibility(mKeyguardShowing && !expandVisually
                ? View.INVISIBLE
                : View.VISIBLE);
        mScrollView.setTouchEnabled(mQsExpanded);
        mScrollView.setTouchEnabled(mQsExpanded);
    }
    }


@@ -569,9 +577,7 @@ public class NotificationPanelView extends PanelView implements
        mQsExpansionHeight = height;
        mQsExpansionHeight = height;
        mHeader.setExpansion(height - mQsPeekHeight);
        mHeader.setExpansion(height - mQsPeekHeight);
        setQsTranslation(height);
        setQsTranslation(height);
        if (!mStackScrollerOverscrolling) {
        requestScrollerTopPaddingUpdate(false /* animate */);
            setQsStackScrollerPadding(height);
        }
        mStatusBar.userActivity();
        mStatusBar.userActivity();
    }
    }


@@ -579,24 +585,11 @@ public class NotificationPanelView extends PanelView implements
        mQsContainer.setY(height - mQsContainer.getHeight());
        mQsContainer.setY(height - mQsContainer.getHeight());
    }
    }


    private void setQsStackScrollerPadding(float height) {
        float start = height - mScrollView.getScrollY() + mNotificationTopPadding;
        float stackHeight = mNotificationStackScroller.getHeight() - start;
        if (stackHeight <= mMinStackHeight) {
            float overflow = mMinStackHeight - stackHeight;
            stackHeight = mMinStackHeight;
            start = mNotificationStackScroller.getHeight() - stackHeight;
            mNotificationStackScroller.setTranslationY(overflow);
            mNotificationTranslation = overflow + mScrollView.getScrollY();
        } else {
            mNotificationStackScroller.setTranslationY(0);
            mNotificationTranslation = mScrollView.getScrollY();
        }
        mNotificationStackScroller.setTopPadding(clampQsStackScrollerPadding((int) start), false);
    }


    private int clampQsStackScrollerPadding(int desiredPadding) {
    private void requestScrollerTopPaddingUpdate(boolean animate) {
        return Math.max(desiredPadding, mStackScrollerIntrinsicPadding);
        mNotificationStackScroller.updateTopPadding(mQsExpansionHeight,
                mScrollView.getScrollY(),
                mAnimateNextTopPaddingChange || animate);
    }
    }


    private void trackMovement(MotionEvent event) {
    private void trackMovement(MotionEvent event) {
@@ -705,9 +698,11 @@ public class NotificationPanelView extends PanelView implements
    protected int getMaxPanelHeight() {
    protected int getMaxPanelHeight() {
        // TODO: Figure out transition for collapsing when QS is open, adjust height here.
        // TODO: Figure out transition for collapsing when QS is open, adjust height here.
        int maxPanelHeight = super.getMaxPanelHeight();
        int maxPanelHeight = super.getMaxPanelHeight();
        int emptyBottomMargin = mStackScrollerContainer.getHeight()
        int emptyBottomMargin = mNotificationStackScroller.getEmptyBottomMargin();
                - mNotificationStackScroller.getHeight()
        emptyBottomMargin = (int) Math.max(0,
                + mNotificationStackScroller.getEmptyBottomMargin();
                emptyBottomMargin - mNotificationStackScroller.getCurrentOverScrollAmount(true));
        emptyBottomMargin += mStackScrollerContainer.getHeight()
                - mNotificationStackScroller.getHeight();
        int maxHeight = maxPanelHeight - emptyBottomMargin - mTopPaddingAdjustment;
        int maxHeight = maxPanelHeight - emptyBottomMargin - mTopPaddingAdjustment;
        maxHeight = Math.max(maxHeight, mStatusBarMinHeight);
        maxHeight = Math.max(maxHeight, mStatusBarMinHeight);
        return maxHeight;
        return maxHeight;
@@ -814,13 +809,14 @@ public class NotificationPanelView extends PanelView implements


    @Override
    @Override
    protected void onOverExpansionChanged(float overExpansion) {
    protected void onOverExpansionChanged(float overExpansion) {
        if (mStatusBar.getBarState() != StatusBarState.KEYGUARD) {
            float currentOverScroll = mNotificationStackScroller.getCurrentOverScrolledPixels(true);
            float currentOverScroll = mNotificationStackScroller.getCurrentOverScrolledPixels(true);
            float expansionChange = overExpansion - mOverExpansion;
            float expansionChange = overExpansion - mOverExpansion;
            expansionChange *= EXPANSION_RUBBER_BAND_EXTRA_FACTOR;
            expansionChange *= EXPANSION_RUBBER_BAND_EXTRA_FACTOR;
            mNotificationStackScroller.setOverScrolledPixels(currentOverScroll + expansionChange,
            mNotificationStackScroller.setOverScrolledPixels(currentOverScroll + expansionChange,
                    true /* onTop */,
                    true /* onTop */,
                    false /* animate */);
                    false /* animate */);
        super.onOverExpansionChanged(overExpansion);
        }
    }
    }


    @Override
    @Override
@@ -835,7 +831,6 @@ public class NotificationPanelView extends PanelView implements
    @Override
    @Override
    protected void onTrackingStopped(boolean expand) {
    protected void onTrackingStopped(boolean expand) {
        super.onTrackingStopped(expand);
        super.onTrackingStopped(expand);
        mOverExpansion = 0.0f;
        mNotificationStackScroller.setOverScrolledPixels(0.0f, true /* onTop */, true /* animate */);
        mNotificationStackScroller.setOverScrolledPixels(0.0f, true /* onTop */, true /* animate */);
        if (expand && (mStatusBar.getBarState() == StatusBarState.KEYGUARD
        if (expand && (mStatusBar.getBarState() == StatusBarState.KEYGUARD
                || mStatusBar.getBarState() == StatusBarState.SHADE_LOCKED)) {
                || mStatusBar.getBarState() == StatusBarState.SHADE_LOCKED)) {
@@ -860,8 +855,7 @@ public class NotificationPanelView extends PanelView implements
    @Override
    @Override
    public void onScrollChanged() {
    public void onScrollChanged() {
        if (mQsExpanded) {
        if (mQsExpanded) {
            mNotificationStackScroller.setTranslationY(
            requestScrollerTopPaddingUpdate(false /* animate */);
                    mNotificationTranslation - mScrollView.getScrollY());
        }
        }
    }
    }


+6 −5
Original line number Original line Diff line number Diff line
@@ -53,7 +53,7 @@ public abstract class PanelView extends FrameLayout {
    private int mEdgeTapAreaWidth;
    private int mEdgeTapAreaWidth;
    private float mInitialOffsetOnTouch;
    private float mInitialOffsetOnTouch;
    private float mExpandedFraction = 0;
    private float mExpandedFraction = 0;
    private float mExpandedHeight = 0;
    protected float mExpandedHeight = 0;
    private boolean mJustPeeked;
    private boolean mJustPeeked;
    private boolean mClosing;
    private boolean mClosing;
    protected boolean mTracking;
    protected boolean mTracking;
@@ -369,8 +369,10 @@ public abstract class PanelView extends FrameLayout {
    protected void fling(float vel, boolean expand) {
    protected void fling(float vel, boolean expand) {
        cancelPeek();
        cancelPeek();
        float target = expand ? getMaxPanelHeight() : 0.0f;
        float target = expand ? getMaxPanelHeight() : 0.0f;
        if (target == mExpandedHeight) {
        if (target == mExpandedHeight || mOverExpansion > 0) {
            onExpandingFinished();
            onExpandingFinished();
            mExpandedHeight = target;
            mOverExpansion = 0.0f;
            mBar.panelExpansionChanged(this, mExpandedFraction);
            mBar.panelExpansionChanged(this, mExpandedFraction);
            return;
            return;
        }
        }
@@ -459,6 +461,7 @@ public abstract class PanelView extends FrameLayout {
        overExpansion = Math.max(0, overExpansion);
        overExpansion = Math.max(0, overExpansion);
        if (overExpansion != mOverExpansion) {
        if (overExpansion != mOverExpansion) {
            onOverExpansionChanged(overExpansion);
            onOverExpansionChanged(overExpansion);
            mOverExpansion = overExpansion;
        }
        }


        if (DEBUG) {
        if (DEBUG) {
@@ -469,9 +472,7 @@ public abstract class PanelView extends FrameLayout {
        mExpandedFraction = Math.min(1f, (fh == 0) ? 0 : mExpandedHeight / fh);
        mExpandedFraction = Math.min(1f, (fh == 0) ? 0 : mExpandedHeight / fh);
    }
    }


    protected void onOverExpansionChanged(float overExpansion) {
    protected abstract void onOverExpansionChanged(float overExpansion);
        mOverExpansion = overExpansion;
    }


    protected abstract void onHeightUpdated(float expandedHeight);
    protected abstract void onHeightUpdated(float expandedHeight);


Loading