From f54090e9bb23e9ed1b4d9e500d856f80d2fbe775 Mon Sep 17 00:00:00 2001 From: Selim Cinek Date: Tue, 17 Jun 2014 17:24:51 -0700 Subject: [PATCH] Scrimming the notifications when QS is open. Bug: 15394230 Change-Id: I4234bde0259ef296db73a43f69a765dbde5ddacd --- .../res/drawable/notification_scrim.xml | 22 ++++++ ...tus_bar_notification_keyguard_overflow.xml | 6 ++ .../layout/status_bar_notification_row.xml | 5 ++ packages/SystemUI/res/values/dimens.xml | 3 + .../ActivatableNotificationView.java | 9 +++ .../systemui/statusbar/ExpandableView.java | 2 + .../statusbar/NotificationScrimView.java | 79 +++++++++++++++++++ .../systemui/statusbar/SpeedBumpView.java | 5 ++ .../phone/NotificationPanelView.java | 11 +++ .../statusbar/stack/AmbientState.java | 9 +++ .../stack/NotificationStackScrollLayout.java | 5 ++ .../statusbar/stack/StackScrollAlgorithm.java | 11 +++ .../statusbar/stack/StackScrollState.java | 9 +++ .../statusbar/stack/StackStateAnimator.java | 3 + 14 files changed, 179 insertions(+) create mode 100644 packages/SystemUI/res/drawable/notification_scrim.xml create mode 100644 packages/SystemUI/src/com/android/systemui/statusbar/NotificationScrimView.java diff --git a/packages/SystemUI/res/drawable/notification_scrim.xml b/packages/SystemUI/res/drawable/notification_scrim.xml new file mode 100644 index 0000000000000..ff7e31f19bac0 --- /dev/null +++ b/packages/SystemUI/res/drawable/notification_scrim.xml @@ -0,0 +1,22 @@ + + + + + + + + \ No newline at end of file diff --git a/packages/SystemUI/res/layout/status_bar_notification_keyguard_overflow.xml b/packages/SystemUI/res/layout/status_bar_notification_keyguard_overflow.xml index c442f796bbda7..f0f50e11fb656 100644 --- a/packages/SystemUI/res/layout/status_bar_notification_keyguard_overflow.xml +++ b/packages/SystemUI/res/layout/status_bar_notification_keyguard_overflow.xml @@ -49,4 +49,10 @@ android:layout_width="120dp" android:layout_height="wrap_content" /> + + + diff --git a/packages/SystemUI/res/layout/status_bar_notification_row.xml b/packages/SystemUI/res/layout/status_bar_notification_row.xml index 5fabd3e829723..7663d54a2498f 100644 --- a/packages/SystemUI/res/layout/status_bar_notification_row.xml +++ b/packages/SystemUI/res/layout/status_bar_notification_row.xml @@ -48,4 +48,9 @@ android:padding="2dp" /> + + diff --git a/packages/SystemUI/res/values/dimens.xml b/packages/SystemUI/res/values/dimens.xml index bbcc9c13c9ea9..66f0ff7e202ed 100644 --- a/packages/SystemUI/res/values/dimens.xml +++ b/packages/SystemUI/res/values/dimens.xml @@ -320,6 +320,9 @@ device. --> 75dp + + 100dp + 75dp diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/ActivatableNotificationView.java b/packages/SystemUI/src/com/android/systemui/statusbar/ActivatableNotificationView.java index 8d19f50e25ad4..f6f78e99020ff 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/ActivatableNotificationView.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/ActivatableNotificationView.java @@ -119,6 +119,7 @@ public abstract class ActivatableNotificationView extends ExpandableOutlineView private NotificationBackgroundView mBackgroundNormal; private NotificationBackgroundView mBackgroundDimmed; + private NotificationScrimView mScrimView; private ObjectAnimator mBackgroundAnimator; private RectF mAppearAnimationRect = new RectF(); private PorterDuffColorFilter mAppearAnimationFilter; @@ -153,6 +154,7 @@ public abstract class ActivatableNotificationView extends ExpandableOutlineView mBackgroundDimmed = (NotificationBackgroundView) findViewById(R.id.backgroundDimmed); updateBackground(); updateBackgroundResources(); + mScrimView = (NotificationScrimView) findViewById(R.id.scrim_view); } private final Runnable mTapTimeoutRunnable = new Runnable() { @@ -379,6 +381,7 @@ public abstract class ActivatableNotificationView extends ExpandableOutlineView setPivotY(actualHeight / 2); mBackgroundNormal.setActualHeight(actualHeight); mBackgroundDimmed.setActualHeight(actualHeight); + mScrimView.setActualHeight(actualHeight); } @Override @@ -386,6 +389,7 @@ public abstract class ActivatableNotificationView extends ExpandableOutlineView super.setClipTopAmount(clipTopAmount); mBackgroundNormal.setClipTopAmount(clipTopAmount); mBackgroundDimmed.setClipTopAmount(clipTopAmount); + mScrimView.setClipTopAmount(clipTopAmount); } @Override @@ -405,6 +409,11 @@ public abstract class ActivatableNotificationView extends ExpandableOutlineView } } + @Override + public void setScrimAmount(float scrimAmount) { + mScrimView.setAlpha(scrimAmount); + } + private void startAppearAnimation(boolean isAppearing, float translationDirection, long delay, final Runnable onFinishedRunnable) { if (mAppearAnimator != null) { diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/ExpandableView.java b/packages/SystemUI/src/com/android/systemui/statusbar/ExpandableView.java index ac2537cc1d558..4d4a8abe75000 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/ExpandableView.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/ExpandableView.java @@ -223,6 +223,8 @@ public abstract class ExpandableView extends FrameLayout { public abstract void performAddAnimation(long delay); + public abstract void setScrimAmount(float scrimAmount); + /** * A listener notifying when {@link #getActualHeight} changes. */ diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/NotificationScrimView.java b/packages/SystemUI/src/com/android/systemui/statusbar/NotificationScrimView.java new file mode 100644 index 0000000000000..440b2c1df871a --- /dev/null +++ b/packages/SystemUI/src/com/android/systemui/statusbar/NotificationScrimView.java @@ -0,0 +1,79 @@ +/* + * Copyright (C) 2014 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License + */ + +package com.android.systemui.statusbar; + +import android.content.Context; +import android.graphics.Canvas; +import android.graphics.PorterDuff; +import android.graphics.drawable.Drawable; +import android.util.AttributeSet; +import android.view.View; + +import com.android.keyguard.R; + +/** + * A view that can be used for both the dimmed and normal background of an notification. + */ +public class NotificationScrimView extends View { + + private Drawable mBackground; + private int mClipTopAmount; + private int mActualHeight; + + public NotificationScrimView(Context context, AttributeSet attrs) { + super(context, attrs); + mBackground = getResources().getDrawable(R.drawable.notification_scrim); + } + + @Override + protected void onDraw(Canvas canvas) { + draw(canvas, mBackground); + } + + private void draw(Canvas canvas, Drawable drawable) { + if (drawable != null) { + drawable.setBounds(0, mClipTopAmount, getWidth(), mActualHeight); + drawable.draw(canvas); + } + } + + @Override + protected boolean verifyDrawable(Drawable who) { + return super.verifyDrawable(who) || who == mBackground; + } + + public void setActualHeight(int actualHeight) { + mActualHeight = actualHeight; + invalidate(); + } + + public int getActualHeight() { + return mActualHeight; + } + + public void setClipTopAmount(int clipTopAmount) { + mClipTopAmount = clipTopAmount; + invalidate(); + } + + @Override + public boolean hasOverlappingRendering() { + + // Prevents this view from creating a layer when alpha is animating. + return false; + } +} diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/SpeedBumpView.java b/packages/SystemUI/src/com/android/systemui/statusbar/SpeedBumpView.java index f80f0fdf1c7ea..650abaa3e09d7 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/SpeedBumpView.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/SpeedBumpView.java @@ -121,4 +121,9 @@ public class SpeedBumpView extends ExpandableView { public void performAddAnimation(long delay) { performVisibilityAnimation(true); } + + @Override + public void setScrimAmount(float scrimAmount) { + // We don't need to scrim the speedbumps + } } diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/phone/NotificationPanelView.java b/packages/SystemUI/src/com/android/systemui/statusbar/phone/NotificationPanelView.java index dde95bf46a773..de1bb4b9d485b 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/phone/NotificationPanelView.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/phone/NotificationPanelView.java @@ -108,6 +108,7 @@ public class NotificationPanelView extends PanelView implements private KeyguardBottomAreaView mKeyguardBottomArea; private boolean mBlockTouches; private ArrayList mSwipeTranslationViews = new ArrayList<>(); + private int mNotificationScrimWaitDistance; public NotificationPanelView(Context context, AttributeSet attrs) { super(context, attrs); @@ -169,6 +170,8 @@ public class NotificationPanelView extends PanelView implements getResources().getDimensionPixelSize(R.dimen.header_notifications_collide_distance); mUnlockMoveDistance = getResources().getDimensionPixelOffset(R.dimen.unlock_move_distance); mClockPositionAlgorithm.loadDimens(getResources()); + mNotificationScrimWaitDistance = + getResources().getDimensionPixelSize(R.dimen.notification_scrim_wait_distance); } @Override @@ -577,9 +580,17 @@ public class NotificationPanelView extends PanelView implements mHeader.setExpansion(height - mQsPeekHeight); setQsTranslation(height); requestScrollerTopPaddingUpdate(false /* animate */); + updateNotificationScrim(height); mStatusBar.userActivity(); } + private void updateNotificationScrim(float height) { + int startDistance = mQsMinExpansionHeight + mNotificationScrimWaitDistance; + float progress = (height - startDistance) / (mQsMaxExpansionHeight - startDistance); + progress = Math.max(0.0f, Math.min(progress, 1.0f)); + mNotificationStackScroller.setScrimAlpha(progress); + } + private void setQsTranslation(float height) { mQsContainer.setY(height - mQsContainer.getHeight()); } diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/stack/AmbientState.java b/packages/SystemUI/src/com/android/systemui/statusbar/stack/AmbientState.java index 6d92b058b5989..fcc951ebba006 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/stack/AmbientState.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/stack/AmbientState.java @@ -32,6 +32,7 @@ public class AmbientState { private float mOverScrollTopAmount; private float mOverScrollBottomAmount; private int mSpeedBumpIndex = -1; + private float mScrimAmount; public int getScrollY() { return mScrollY; @@ -85,6 +86,14 @@ public class AmbientState { } } + public void setScrimAmount(float scrimAmount) { + mScrimAmount = scrimAmount; + } + + public float getScrimAmount() { + return mScrimAmount; + } + public float getOverScrollAmount(boolean top) { return top ? mOverScrollTopAmount : mOverScrollBottomAmount; } 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 ccbaed346e086..d956b4fa61bdb 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/stack/NotificationStackScrollLayout.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/stack/NotificationStackScrollLayout.java @@ -1845,6 +1845,11 @@ public class NotificationStackScrollLayout extends ViewGroup return true; } + public void setScrimAlpha(float progress) { + mAmbientState.setScrimAmount(progress); + requestChildrenUpdate(); + } + /** * A listener that is notified when some child locations might have changed. */ diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/stack/StackScrollAlgorithm.java b/packages/SystemUI/src/com/android/systemui/statusbar/stack/StackScrollAlgorithm.java index 602c22b37aea1..9a4b7980a8e05 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/stack/StackScrollAlgorithm.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/stack/StackScrollAlgorithm.java @@ -154,6 +154,17 @@ public class StackScrollAlgorithm { handleDraggedViews(ambientState, resultState, algorithmState); updateDimmedActivated(ambientState, resultState, algorithmState); updateClipping(resultState, algorithmState); + updateScrimAmount(resultState, algorithmState, ambientState.getScrimAmount()); + } + + private void updateScrimAmount(StackScrollState resultState, + StackScrollAlgorithmState algorithmState, float scrimAmount) { + int childCount = algorithmState.visibleChildren.size(); + for (int i = 0; i < childCount; i++) { + View child = algorithmState.visibleChildren.get(i); + StackScrollState.ViewState childViewState = resultState.getViewStateForView(child); + childViewState.scrimAmount = scrimAmount; + } } private void updateClipping(StackScrollState resultState, diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/stack/StackScrollState.java b/packages/SystemUI/src/com/android/systemui/statusbar/stack/StackScrollState.java index 1ad4accb20f67..02f2cd64c6d52 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/stack/StackScrollState.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/stack/StackScrollState.java @@ -148,6 +148,9 @@ public class StackScrollState { // apply dimming child.setDimmed(state.dimmed, false /* animate */); + // apply scrimming + child.setScrimAmount(state.scrimAmount); + float oldClipTopAmount = child.getClipTopAmount(); if (oldClipTopAmount != state.clipTopAmount) { child.setClipTopAmount(state.clipTopAmount); @@ -222,6 +225,12 @@ public class StackScrollState { float scale; boolean dimmed; + /** + * A value between 0 and 1 indicating how much the view should be scrimmed. + * 1 means that the notifications will be darkened as much as possible. + */ + float scrimAmount; + /** * The amount which the view should be clipped from the top. This is calculated to * perceive consistent shadows. diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/stack/StackStateAnimator.java b/packages/SystemUI/src/com/android/systemui/statusbar/stack/StackStateAnimator.java index 225398a4c9399..0006dadc97036 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/stack/StackStateAnimator.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/stack/StackStateAnimator.java @@ -176,6 +176,9 @@ public class StackStateAnimator { // start dimmed animation child.setDimmed(viewState.dimmed, mAnimationFilter.animateDimmed); + // apply scrimming + child.setScrimAmount(viewState.scrimAmount); + if (wasAdded) { child.performAddAnimation(delay); }