diff --git a/packages/SystemUI/res/values/config.xml b/packages/SystemUI/res/values/config.xml index d34a8b5946f4a..aac2d1f372b06 100644 --- a/packages/SystemUI/res/values/config.xml +++ b/packages/SystemUI/res/values/config.xml @@ -345,4 +345,15 @@ have been scrolled off-screen. --> true + + false + + + true + + + false + diff --git a/packages/SystemUI/res/values/dimens.xml b/packages/SystemUI/res/values/dimens.xml index cdb5af92c0c8d..d031fe84c591d 100644 --- a/packages/SystemUI/res/values/dimens.xml +++ b/packages/SystemUI/res/values/dimens.xml @@ -69,6 +69,10 @@ 92dp + + @dimen/match_parent + 132dp diff --git a/packages/SystemUI/src/com/android/systemui/SwipeHelper.java b/packages/SystemUI/src/com/android/systemui/SwipeHelper.java index 8c4159abf0610..36c38f372b46c 100644 --- a/packages/SystemUI/src/com/android/systemui/SwipeHelper.java +++ b/packages/SystemUI/src/com/android/systemui/SwipeHelper.java @@ -22,6 +22,7 @@ import android.animation.ObjectAnimator; import android.animation.ValueAnimator; import android.animation.ValueAnimator.AnimatorUpdateListener; import android.content.Context; +import android.content.res.Resources; import android.graphics.RectF; import android.os.Handler; import android.util.Log; @@ -30,9 +31,7 @@ import android.view.VelocityTracker; import android.view.View; import android.view.ViewConfiguration; import android.view.accessibility.AccessibilityEvent; - import com.android.systemui.classifier.FalsingManager; -import com.android.systemui.plugins.statusbar.NotificationMenuRowPlugin; import com.android.systemui.plugins.statusbar.NotificationMenuRowPlugin.MenuItem; import com.android.systemui.statusbar.ExpandableNotificationRow; import com.android.systemui.statusbar.FlingAnimationUtils; @@ -88,6 +87,7 @@ public class SwipeHelper implements Gefingerpoken { private int mFalsingThreshold; private boolean mTouchAboveFalsingThreshold; private boolean mDisableHwLayers; + private boolean mFadeDependingOnAmountSwiped; private Context mContext; private HashMap mDismissPendingMap = new HashMap<>(); @@ -98,12 +98,15 @@ public class SwipeHelper implements Gefingerpoken { mHandler = new Handler(); mSwipeDirection = swipeDirection; mVelocityTracker = VelocityTracker.obtain(); - mDensityScale = context.getResources().getDisplayMetrics().density; mPagingTouchSlop = ViewConfiguration.get(context).getScaledPagingTouchSlop(); - mLongPressTimeout = (long) (ViewConfiguration.getLongPressTimeout() * 1.5f); // extra long-press! - mFalsingThreshold = context.getResources().getDimensionPixelSize( - R.dimen.swipe_helper_falsing_threshold); + // Extra long-press! + mLongPressTimeout = (long) (ViewConfiguration.getLongPressTimeout() * 1.5f); + + Resources res = context.getResources(); + mDensityScale = res.getDisplayMetrics().density; + mFalsingThreshold = res.getDimensionPixelSize(R.dimen.swipe_helper_falsing_threshold); + mFadeDependingOnAmountSwiped = res.getBoolean(R.bool.config_fadeDependingOnAmountSwiped); mFalsingManager = FalsingManager.getInstance(context); mFlingAnimationUtils = new FlingAnimationUtils(context, getMaxEscapeAnimDuration() / 1000f); } @@ -173,8 +176,7 @@ public class SwipeHelper implements Gefingerpoken { } protected float getSize(View v) { - return mSwipeDirection == X ? v.getMeasuredWidth() : - v.getMeasuredHeight(); + return mSwipeDirection == X ? v.getMeasuredWidth() : v.getMeasuredHeight(); } public void setMinSwipeProgress(float minSwipeProgress) { @@ -192,6 +194,11 @@ public class SwipeHelper implements Gefingerpoken { } private float getSwipeAlpha(float progress) { + if (mFadeDependingOnAmountSwiped) { + // The more progress has been fade, the lower the alpha value so that the view fades. + return Math.max(1 - progress, 0); + } + return Math.min(0, Math.max(1, progress / SWIPE_PROGRESS_FADE_END)); } @@ -204,9 +211,8 @@ public class SwipeHelper implements Gefingerpoken { float swipeProgress = getSwipeProgressForOffset(animView, translation); if (!mCallback.updateSwipeProgress(animView, dismissable, swipeProgress)) { if (FADE_OUT_DURING_SWIPE && dismissable) { - float alpha = swipeProgress; if (!mDisableHwLayers) { - if (alpha != 0f && alpha != 1f) { + if (swipeProgress != 0f && swipeProgress != 1f) { animView.setLayerType(View.LAYER_TYPE_HARDWARE, null); } else { animView.setLayerType(View.LAYER_TYPE_NONE, null); diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/ExpandableNotificationRow.java b/packages/SystemUI/src/com/android/systemui/statusbar/ExpandableNotificationRow.java index dff09bda88442..7277ff90a771f 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/ExpandableNotificationRow.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/ExpandableNotificationRow.java @@ -24,6 +24,7 @@ import android.animation.ObjectAnimator; import android.animation.ValueAnimator.AnimatorUpdateListener; import android.annotation.Nullable; import android.content.Context; +import android.content.res.Resources; import android.graphics.drawable.AnimatedVectorDrawable; import android.graphics.drawable.AnimationDrawable; import android.graphics.drawable.ColorDrawable; @@ -1143,9 +1144,10 @@ public class ExpandableNotificationRow extends ActivatableNotificationView mMaxHeadsUpHeight = getFontScaledHeight(R.dimen.notification_max_heads_up_height); mMaxHeadsUpHeightIncreased = getFontScaledHeight( R.dimen.notification_max_heads_up_height_increased); - mIncreasedPaddingBetweenElements = getResources() - .getDimensionPixelSize(R.dimen.notification_divider_height_increased); - mIconTransformContentShiftNoIcon = getResources().getDimensionPixelSize( + Resources res = getResources(); + mIncreasedPaddingBetweenElements = res.getDimensionPixelSize( + R.dimen.notification_divider_height_increased); + mIconTransformContentShiftNoIcon = res.getDimensionPixelSize( R.dimen.notification_icon_transform_content_shift); } @@ -1199,30 +1201,39 @@ public class ExpandableNotificationRow extends ActivatableNotificationView mChildrenContainer.setIsLowPriority(mIsLowPriority); mChildrenContainer.setContainingNotification(ExpandableNotificationRow.this); mChildrenContainer.onNotificationUpdated(); - mTranslateableViews.add(mChildrenContainer); + + if (mShouldTranslateContents) { + mTranslateableViews.add(mChildrenContainer); + } } }); - // Add the views that we translate to reveal the menu - mTranslateableViews = new ArrayList(); - for (int i = 0; i < getChildCount(); i++) { - mTranslateableViews.add(getChildAt(i)); + if (mShouldTranslateContents) { + // Add the views that we translate to reveal the menu + mTranslateableViews = new ArrayList<>(); + for (int i = 0; i < getChildCount(); i++) { + mTranslateableViews.add(getChildAt(i)); + } + // Remove views that don't translate + mTranslateableViews.remove(mChildrenContainerStub); + mTranslateableViews.remove(mGutsStub); } - // Remove views that don't translate - mTranslateableViews.remove(mChildrenContainerStub); - mTranslateableViews.remove(mGutsStub); } public void resetTranslation() { if (mTranslateAnim != null) { mTranslateAnim.cancel(); } - if (mTranslateableViews != null) { + + if (!mShouldTranslateContents) { + setTranslationX(0); + } else if (mTranslateableViews != null) { for (int i = 0; i < mTranslateableViews.size(); i++) { mTranslateableViews.get(i).setTranslationX(0); } + invalidateOutline(); } - invalidateOutline(); + mMenuRow.resetMenu(); } @@ -1242,13 +1253,17 @@ public class ExpandableNotificationRow extends ActivatableNotificationView // Don't translate if guts are showing. return; } - // Translate the group of views - for (int i = 0; i < mTranslateableViews.size(); i++) { - if (mTranslateableViews.get(i) != null) { - mTranslateableViews.get(i).setTranslationX(translationX); + if (!mShouldTranslateContents) { + setTranslationX(translationX); + } else if (mTranslateableViews != null) { + // Translate the group of views + for (int i = 0; i < mTranslateableViews.size(); i++) { + if (mTranslateableViews.get(i) != null) { + mTranslateableViews.get(i).setTranslationX(translationX); + } } + invalidateOutline(); } - invalidateOutline(); if (mMenuRow.getMenuView() != null) { mMenuRow.onTranslationUpdate(translationX); } @@ -1256,10 +1271,15 @@ public class ExpandableNotificationRow extends ActivatableNotificationView @Override public float getTranslation() { + if (mShouldTranslateContents) { + return getTranslationX(); + } + if (mTranslateableViews != null && mTranslateableViews.size() > 0) { // All of the views in the list should have same translation, just use first one. return mTranslateableViews.get(0).getTranslationX(); } + return 0; } diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/ExpandableOutlineView.java b/packages/SystemUI/src/com/android/systemui/statusbar/ExpandableOutlineView.java index 91abc8779274c..553c478959815 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/ExpandableOutlineView.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/ExpandableOutlineView.java @@ -17,12 +17,14 @@ package com.android.systemui.statusbar; import android.content.Context; +import android.content.res.Resources; import android.graphics.Outline; import android.graphics.Rect; import android.graphics.RectF; import android.util.AttributeSet; import android.view.View; import android.view.ViewOutlineProvider; +import com.android.systemui.R; /** * Like {@link ExpandableView}, but setting an outline for the height and clipping. @@ -33,10 +35,16 @@ public abstract class ExpandableOutlineView extends ExpandableView { private boolean mCustomOutline; private float mOutlineAlpha = -1f; - ViewOutlineProvider mProvider = new ViewOutlineProvider() { + /** + * {@code true} if the children views of the {@link ExpandableOutlineView} are translated when + * it is moved. Otherwise, the translation is set on the {@code ExpandableOutlineView} itself. + */ + protected boolean mShouldTranslateContents; + + private final ViewOutlineProvider mProvider = new ViewOutlineProvider() { @Override public void getOutline(View view, Outline outline) { - int translation = (int) getTranslation(); + int translation = mShouldTranslateContents ? 0 : (int) getTranslation(); if (!mCustomOutline) { outline.setRect(translation, mClipTopAmount, @@ -52,6 +60,9 @@ public abstract class ExpandableOutlineView extends ExpandableView { public ExpandableOutlineView(Context context, AttributeSet attrs) { super(context, attrs); setOutlineProvider(mProvider); + Resources res = getResources(); + mShouldTranslateContents = + res.getBoolean(R.bool.config_translateNotificationContentsOnSwipe); } @Override diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/notification/NotificationMediaTemplateViewWrapper.java b/packages/SystemUI/src/com/android/systemui/statusbar/notification/NotificationMediaTemplateViewWrapper.java index ef5a25ca52620..a2f488c7d7ed7 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/notification/NotificationMediaTemplateViewWrapper.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/notification/NotificationMediaTemplateViewWrapper.java @@ -17,7 +17,6 @@ package com.android.systemui.statusbar.notification; import android.content.Context; -import android.service.notification.StatusBarNotification; import android.view.View; import com.android.systemui.statusbar.ExpandableNotificationRow; diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/stack/NotificationStackScrollLayout.java b/packages/SystemUI/src/com/android/systemui/statusbar/stack/NotificationStackScrollLayout.java index 391d96b487e48..771e02a4c428c 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/stack/NotificationStackScrollLayout.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/stack/NotificationStackScrollLayout.java @@ -149,6 +149,13 @@ public class NotificationStackScrollLayout extends ViewGroup private int mTopPadding; private int mBottomInset = 0; + /** + * The width of each child View in this layout. A value of -1 or + * {@link android.view.ViewGroup.LayoutParams#MATCH_PARENT} will make it so that the children + * match this View's width. + */ + private int mChildWidth; + /** * The algorithm which calculates the properties for our children */ @@ -205,6 +212,7 @@ public class NotificationStackScrollLayout extends ViewGroup protected DismissView mDismissView; protected EmptyShadeView mEmptyShadeView; private boolean mDismissAllInProgress; + private boolean mFadeNotificationsOnDismiss; /** * Was the scroller scrolled to the top when the down motion was observed? @@ -391,6 +399,7 @@ public class NotificationStackScrollLayout extends ViewGroup mBgColor = context.getColor(R.color.notification_shade_background_color); int minHeight = res.getDimensionPixelSize(R.dimen.notification_min_height); int maxHeight = res.getDimensionPixelSize(R.dimen.notification_max_height); + mChildWidth = res.getDimensionPixelSize(R.dimen.notification_child_width); mExpandHelper = new ExpandHelper(getContext(), this, minHeight, maxHeight); mExpandHelper.setEventSource(this); @@ -402,6 +411,8 @@ public class NotificationStackScrollLayout extends ViewGroup mFalsingManager = FalsingManager.getInstance(context); mShouldDrawNotificationBackground = res.getBoolean(R.bool.config_drawNotificationBackground); + mFadeNotificationsOnDismiss = + res.getBoolean(R.bool.config_fadeNotificationsOnDismiss); updateWillNotDraw(); if (DEBUG) { @@ -536,11 +547,18 @@ public class NotificationStackScrollLayout extends ViewGroup @Override protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) { super.onMeasure(widthMeasureSpec, heightMeasureSpec); + + // If the children want to match the parent's width, then simply pass this View's width + // MeasureSpec. It should contain the width to measure at. + int childWidthSpec = mChildWidth == LayoutParams.MATCH_PARENT + ? widthMeasureSpec + : MeasureSpec.makeMeasureSpec(mChildWidth, MeasureSpec.EXACTLY); + // We need to measure all children even the GONE ones, such that the heights are calculated // correctly as they are used to calculate how many we can fit on the screen. final int size = getChildCount(); for (int i = 0; i < size; i++) { - measureChild(getChildAt(i), widthMeasureSpec, heightMeasureSpec); + measureChild(getChildAt(i), childWidthSpec, heightMeasureSpec); } } @@ -964,7 +982,8 @@ public class NotificationStackScrollLayout extends ViewGroup mScrimController.setTopHeadsUpDragAmount(animView, Math.min(Math.abs(swipeProgress / 2f - 1.0f), 1.0f)); } - return true; // Don't fade out the notification + // Returning true prevents alpha fading. + return !mFadeNotificationsOnDismiss; } @Override