From de61fd7822ea15fb691405c1aae472caa58e83ba Mon Sep 17 00:00:00 2001 From: Adrian Roos Date: Mon, 26 May 2014 14:59:15 +0200 Subject: [PATCH] Implement HUN visuals: shadows and translucency Bug: 15106201 Change-Id: I718e3d36355d0f58abc3daadb8c6a9d554f29bec --- .../heads_up_window_bg.9.png | Bin 504 -> 0 bytes .../heads_up_window_bg.9.png | Bin 1391 -> 0 bytes .../heads_up_window_bg.9.png | Bin 1207 -> 0 bytes .../SystemUI/res/layout-sw600dp/heads_up.xml | 30 ------- packages/SystemUI/res/layout/heads_up.xml | 46 ++++++----- .../src/com/android/systemui/SwipeHelper.java | 7 +- .../statusbar/phone/PhoneStatusBar.java | 2 +- .../policy/HeadsUpNotificationView.java | 73 +++++++++++------- 8 files changed, 76 insertions(+), 82 deletions(-) delete mode 100644 packages/SystemUI/res/drawable-sw600dp-hdpi/heads_up_window_bg.9.png delete mode 100644 packages/SystemUI/res/drawable-sw600dp-xhdpi/heads_up_window_bg.9.png delete mode 100644 packages/SystemUI/res/drawable-sw600dp-xxhdpi/heads_up_window_bg.9.png delete mode 100644 packages/SystemUI/res/layout-sw600dp/heads_up.xml diff --git a/packages/SystemUI/res/drawable-sw600dp-hdpi/heads_up_window_bg.9.png b/packages/SystemUI/res/drawable-sw600dp-hdpi/heads_up_window_bg.9.png deleted file mode 100644 index b30cf15b28bf9390d521541c5798cea76e6d1723..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 504 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 VTJ)$EI4A%B002ovPDHLkV1gTUK}P@p diff --git a/packages/SystemUI/res/layout-sw600dp/heads_up.xml b/packages/SystemUI/res/layout-sw600dp/heads_up.xml deleted file mode 100644 index f7035fe0319cc..0000000000000 --- a/packages/SystemUI/res/layout-sw600dp/heads_up.xml +++ /dev/null @@ -1,30 +0,0 @@ - - - - - diff --git a/packages/SystemUI/res/layout/heads_up.xml b/packages/SystemUI/res/layout/heads_up.xml index 7d9cfa1c49f01..236fdc3359389 100644 --- a/packages/SystemUI/res/layout/heads_up.xml +++ b/packages/SystemUI/res/layout/heads_up.xml @@ -1,26 +1,30 @@ \ No newline at end of file + android:layout_height="match_parent" + android:layout_width="match_parent"> + + + + \ No newline at end of file diff --git a/packages/SystemUI/src/com/android/systemui/SwipeHelper.java b/packages/SystemUI/src/com/android/systemui/SwipeHelper.java index 6387a924f0ff9..1b12cb07cb8ec 100644 --- a/packages/SystemUI/src/com/android/systemui/SwipeHelper.java +++ b/packages/SystemUI/src/com/android/systemui/SwipeHelper.java @@ -56,6 +56,7 @@ public class SwipeHelper implements Gefingerpoken { static final float ALPHA_FADE_END = 0.5f; // fraction of thumbnail width // beyond which alpha->0 private float mMinAlpha = 0f; + private float mMaxAlpha = 1f; private float mPagingTouchSlop; private Callback mCallback; @@ -140,6 +141,10 @@ public class SwipeHelper implements Gefingerpoken { mMinAlpha = minAlpha; } + public void setMaxAlpha(float maxAlpha) { + mMaxAlpha = maxAlpha; + } + private float getAlphaForOffset(View view) { float viewSize = getSize(view); final float fadeSize = ALPHA_FADE_END * viewSize; @@ -150,7 +155,7 @@ public class SwipeHelper implements Gefingerpoken { } else if (pos < viewSize * (1.0f - ALPHA_FADE_START)) { result = 1.0f + (viewSize * ALPHA_FADE_START + pos) / fadeSize; } - return Math.max(mMinAlpha, result); + return Math.min(Math.max(mMinAlpha, result), mMaxAlpha); } private void updateAlphaFromOffset(View animView, boolean dismissable) { diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/phone/PhoneStatusBar.java b/packages/SystemUI/src/com/android/systemui/statusbar/phone/PhoneStatusBar.java index 0922abd77db90..40985001b5491 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/phone/PhoneStatusBar.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/phone/PhoneStatusBar.java @@ -966,7 +966,7 @@ public class PhoneStatusBar extends BaseStatusBar implements DemoMode, private void addHeadsUpView() { WindowManager.LayoutParams lp = new WindowManager.LayoutParams( - LayoutParams.MATCH_PARENT, LayoutParams.WRAP_CONTENT, + LayoutParams.MATCH_PARENT, LayoutParams.MATCH_PARENT, WindowManager.LayoutParams.TYPE_STATUS_BAR_PANEL, // above the status bar! WindowManager.LayoutParams.FLAG_LAYOUT_IN_SCREEN | WindowManager.LayoutParams.FLAG_LAYOUT_NO_LIMITS diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/policy/HeadsUpNotificationView.java b/packages/SystemUI/src/com/android/systemui/statusbar/policy/HeadsUpNotificationView.java index 81e2cb381967d..9271e717c41eb 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/policy/HeadsUpNotificationView.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/policy/HeadsUpNotificationView.java @@ -18,6 +18,7 @@ package com.android.systemui.statusbar.policy; import android.content.Context; import android.content.res.Configuration; +import android.graphics.Outline; import android.graphics.Rect; import android.util.AttributeSet; import android.util.Log; @@ -25,6 +26,7 @@ import android.view.MotionEvent; import android.view.View; import android.view.ViewConfiguration; import android.view.ViewGroup; +import android.view.ViewTreeObserver; import android.widget.FrameLayout; import com.android.systemui.ExpandHelper; @@ -35,14 +37,17 @@ import com.android.systemui.statusbar.BaseStatusBar; import com.android.systemui.statusbar.ExpandableView; import com.android.systemui.statusbar.NotificationData; -public class HeadsUpNotificationView extends FrameLayout implements SwipeHelper.Callback, ExpandHelper.Callback { +public class HeadsUpNotificationView extends FrameLayout implements SwipeHelper.Callback, ExpandHelper.Callback, + ViewTreeObserver.OnComputeInternalInsetsListener { private static final String TAG = "HeadsUpNotificationView"; private static final boolean DEBUG = false; private static final boolean SPEW = DEBUG; Rect mTmpRect = new Rect(); + int[] mTmpTwoArray = new int[2]; private final int mTouchSensitivityDelay; + private final float mMaxAlpha = 0.95f; private SwipeHelper mSwipeHelper; private EdgeSwipeHelper mEdgeSwipeHelper; @@ -87,8 +92,9 @@ public class HeadsUpNotificationView extends FrameLayout implements SwipeHelper. } mContentHolder.setX(0); mContentHolder.setVisibility(View.VISIBLE); - mContentHolder.setAlpha(1f); + mContentHolder.setAlpha(mMaxAlpha); mContentHolder.addView(mHeadsUp.row); + mSwipeHelper.snapChild(mContentHolder, 1f); mStartTouchTime = System.currentTimeMillis() + mTouchSensitivityDelay; } @@ -99,32 +105,6 @@ public class HeadsUpNotificationView extends FrameLayout implements SwipeHelper. return mHeadsUp == null || mHeadsUp.notification.isClearable(); } - public void setMargin(int notificationPanelMarginPx) { - if (SPEW) Log.v(TAG, "setMargin() " + notificationPanelMarginPx); - if (mContentHolder != null && - mContentHolder.getLayoutParams() instanceof FrameLayout.LayoutParams) { - FrameLayout.LayoutParams lp = (FrameLayout.LayoutParams) mContentHolder.getLayoutParams(); - lp.setMarginStart(notificationPanelMarginPx); - mContentHolder.setLayoutParams(lp); - } - } - - // LinearLayout methods - - @Override - public void onDraw(android.graphics.Canvas c) { - super.onDraw(c); - if (DEBUG) { - //Log.d(TAG, "onDraw: canvas height: " + c.getHeight() + "px; measured height: " - // + getMeasuredHeight() + "px"); - c.save(); - c.clipRect(6, 6, c.getWidth() - 6, getMeasuredHeight() - 6, - android.graphics.Region.Op.DIFFERENCE); - c.drawColor(0xFFcc00cc); - c.restore(); - } - } - // ViewGroup methods @Override @@ -134,6 +114,7 @@ public class HeadsUpNotificationView extends FrameLayout implements SwipeHelper. float pagingTouchSlop = viewConfiguration.getScaledPagingTouchSlop(); float touchSlop = viewConfiguration.getScaledTouchSlop(); mSwipeHelper = new SwipeHelper(SwipeHelper.X, this, densityScale, pagingTouchSlop); + mSwipeHelper.setMaxAlpha(mMaxAlpha); mEdgeSwipeHelper = new EdgeSwipeHelper(touchSlop); int minHeight = getResources().getDimensionPixelSize(R.dimen.notification_min_height); @@ -146,6 +127,8 @@ public class HeadsUpNotificationView extends FrameLayout implements SwipeHelper. // whoops, we're on already! setNotification(mHeadsUp); } + + getViewTreeObserver().addOnComputeInternalInsetsListener(this); } @Override @@ -162,6 +145,20 @@ public class HeadsUpNotificationView extends FrameLayout implements SwipeHelper. // View methods + @Override + public void onDraw(android.graphics.Canvas c) { + super.onDraw(c); + if (DEBUG) { + //Log.d(TAG, "onDraw: canvas height: " + c.getHeight() + "px; measured height: " + // + getMeasuredHeight() + "px"); + c.save(); + c.clipRect(6, 6, c.getWidth() - 6, getMeasuredHeight() - 6, + android.graphics.Region.Op.DIFFERENCE); + c.drawColor(0xFFcc00cc); + c.restore(); + } + } + @Override public boolean onTouchEvent(MotionEvent ev) { if (System.currentTimeMillis() < mStartTouchTime) { @@ -183,6 +180,14 @@ public class HeadsUpNotificationView extends FrameLayout implements SwipeHelper. mSwipeHelper.setPagingTouchSlop(pagingTouchSlop); } + @Override + protected void onLayout(boolean changed, int left, int top, int right, int bottom) { + super.onLayout(changed, left, top, right, bottom); + Outline o = new Outline(); + o.setRect(0, 0, mContentHolder.getWidth(), mContentHolder.getHeight()); + mContentHolder.setOutline(o); + } + // ExpandHelper.Callback methods @Override @@ -233,7 +238,7 @@ public class HeadsUpNotificationView extends FrameLayout implements SwipeHelper. @Override public void onDragCancelled(View v) { - mContentHolder.setAlpha(1f); // sometimes this isn't quite reset + mContentHolder.setAlpha(mMaxAlpha); // sometimes this isn't quite reset } @Override @@ -250,6 +255,16 @@ public class HeadsUpNotificationView extends FrameLayout implements SwipeHelper. return mContentHolder; } + @Override + public void onComputeInternalInsets(ViewTreeObserver.InternalInsetsInfo info) { + mContentHolder.getLocationOnScreen(mTmpTwoArray); + + info.setTouchableInsets(ViewTreeObserver.InternalInsetsInfo.TOUCHABLE_INSETS_REGION); + info.touchableRegion.set(mTmpTwoArray[0], mTmpTwoArray[1], + mTmpTwoArray[0] + mContentHolder.getWidth(), + mTmpTwoArray[1] + mContentHolder.getHeight()); + } + private class EdgeSwipeHelper implements Gefingerpoken { private static final boolean DEBUG_EDGE_SWIPE = false; private final float mTouchSlop;