From 0f2aa68e3c8356b0adcd91a3156ce6934c8b85f2 Mon Sep 17 00:00:00 2001 From: Chris Wren Date: Fri, 2 Aug 2013 12:03:02 -0400 Subject: [PATCH] proper geometry for heads up on tablets. also some code cleanup since things are getting complicated. Bug: 10074485 Change-Id: I900a60f0fdda8d2ef1bcfe01035d6f716e14aa56 --- .../heads_up_window_bg.9.png | Bin 0 -> 2226 bytes .../drawable-xhdpi/heads_up_window_bg.9.png | Bin 0 -> 965 bytes .../res/drawable/heads_up_window_bg.9.png | Bin 500 -> 0 bytes packages/SystemUI/res/layout/heads_up.xml | 18 +- packages/SystemUI/res/values/dimens.xml | 3 + .../statusbar/phone/PhoneStatusBar.java | 15 +- .../policy/HeadsUpNotificationView.java | 212 ++++++++++-------- 7 files changed, 144 insertions(+), 104 deletions(-) create mode 100644 packages/SystemUI/res/drawable-sw600dp-xhdpi/heads_up_window_bg.9.png create mode 100644 packages/SystemUI/res/drawable-xhdpi/heads_up_window_bg.9.png delete mode 100644 packages/SystemUI/res/drawable/heads_up_window_bg.9.png diff --git a/packages/SystemUI/res/drawable-sw600dp-xhdpi/heads_up_window_bg.9.png b/packages/SystemUI/res/drawable-sw600dp-xhdpi/heads_up_window_bg.9.png new file mode 100644 index 0000000000000000000000000000000000000000..6002cfbe95d77166491055267fad19dd38ca3c8f GIT binary patch literal 2226 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 literal 0 HcmV?d00001 diff --git a/packages/SystemUI/res/drawable/heads_up_window_bg.9.png b/packages/SystemUI/res/drawable/heads_up_window_bg.9.png deleted file mode 100644 index c68ccdca0749e6e9fd32de5c105e37885c71b7d9..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 500 zcmVJ_c#}jk_a0Jjv|Ait~P~!y90+<7M;`0N?eG%{pU=Ls`Yei)ifo?=i3t$Q0 znZFCdK*)~IYw=h}Aw#KiTwqSf3!~)=fT`MwLeD-g=_~q370sBgB_VGGE4)e?W0)v1 z03qiQ<42!T)q+Y&t(BBcWoMrG&XT&7ZionL20)EKT*25U!=0KXrd6XwpQuN2t>c(J zW7wa}tz>JLw)eZl2Mv7S|Dj}9P1})Pp|qB@h#k9^LVSj}_G}Q8ZYBLZ%9P0o5E6|9|k^ q^(e2soP^(8PX7G5bxXVH0{IPK#jwIT^iz)j0000 + android:layout_height="wrap_content" + android:layout_width="@dimen/notification_panel_width" + android:id="@+id/content_slider" + android:layout_marginStart="@dimen/notification_panel_margin_left" + > + + diff --git a/packages/SystemUI/res/values/dimens.xml b/packages/SystemUI/res/values/dimens.xml index f90f08a948985..e0b3bc62bb72c 100644 --- a/packages/SystemUI/res/values/dimens.xml +++ b/packages/SystemUI/res/values/dimens.xml @@ -212,4 +212,7 @@ 17dp 32dp + + + -1dp 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 3a8145408c6f8..fc6e74e2dd018 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/phone/PhoneStatusBar.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/phone/PhoneStatusBar.java @@ -362,8 +362,6 @@ public class PhoneStatusBar extends BaseStatusBar { addNavigationBar(); - if (ENABLE_HEADS_UP) addHeadsUpView(); - // Lastly, call to the icon policy to install/update all the icons. mIconPolicy = new PhoneStatusBarPolicy(mContext); } @@ -840,9 +838,8 @@ public class PhoneStatusBar extends BaseStatusBar { private void addHeadsUpView() { WindowManager.LayoutParams lp = new WindowManager.LayoutParams( - ViewGroup.LayoutParams.MATCH_PARENT, - ViewGroup.LayoutParams.WRAP_CONTENT, - WindowManager.LayoutParams.TYPE_STATUS_BAR_SUB_PANEL, // above the status bar! + LayoutParams.MATCH_PARENT, LayoutParams.WRAP_CONTENT, + WindowManager.LayoutParams.TYPE_STATUS_BAR_SUB_PANEL, // below the status bar! WindowManager.LayoutParams.FLAG_LAYOUT_IN_SCREEN | WindowManager.LayoutParams.FLAG_LAYOUT_NO_LIMITS | WindowManager.LayoutParams.FLAG_NOT_TOUCH_MODAL @@ -851,7 +848,8 @@ public class PhoneStatusBar extends BaseStatusBar { | WindowManager.LayoutParams.FLAG_SPLIT_TOUCH, PixelFormat.TRANSLUCENT); lp.flags |= WindowManager.LayoutParams.FLAG_HARDWARE_ACCELERATED; - lp.gravity = Gravity.TOP | Gravity.FILL_HORIZONTAL; + lp.gravity = Gravity.TOP; + lp.y = getStatusBarHeight(); lp.setTitle("Heads Up"); lp.packageName = mContext.getPackageName(); lp.windowAnimations = R.style.Animation_StatusBar_HeadsUp; @@ -2293,6 +2291,7 @@ public class PhoneStatusBar extends BaseStatusBar { @Override public void createAndAddWindows() { addStatusBarWindow(); + if (ENABLE_HEADS_UP) addHeadsUpView(); } private void addStatusBarWindow() { @@ -2364,6 +2363,10 @@ public class PhoneStatusBar extends BaseStatusBar { mSettingsPanel.setLayoutParams(lp); } + if (ENABLE_HEADS_UP && mHeadsUpNotificationView != null) { + mHeadsUpNotificationView.setMargin(mNotificationPanelMarginPx); + } + updateCarrierLabelVisibility(false); } 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 7a8ce4f8a6ef9..4920ba575e7a0 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/policy/HeadsUpNotificationView.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/policy/HeadsUpNotificationView.java @@ -26,6 +26,7 @@ import android.view.MotionEvent; import android.view.View; import android.view.ViewConfiguration; import android.view.ViewGroup; +import android.widget.FrameLayout; import android.widget.LinearLayout; import com.android.systemui.ExpandHelper; @@ -34,7 +35,7 @@ import com.android.systemui.SwipeHelper; import com.android.systemui.statusbar.BaseStatusBar; import com.android.systemui.statusbar.NotificationData; -public class HeadsUpNotificationView extends LinearLayout implements SwipeHelper.Callback, ExpandHelper.Callback { +public class HeadsUpNotificationView extends FrameLayout implements SwipeHelper.Callback, ExpandHelper.Callback { private static final String TAG = "HeadsUpNotificationView"; private static final boolean DEBUG = false; @@ -47,11 +48,8 @@ public class HeadsUpNotificationView extends LinearLayout implements SwipeHelper private ExpandHelper mExpandHelper; private long mStartTouchTime; - public ViewGroup getHolder() { - return mContentHolder; - } - private ViewGroup mContentHolder; + private ViewGroup mContentSlider; private NotificationData.Entry mHeadsUp; @@ -61,101 +59,18 @@ public class HeadsUpNotificationView extends LinearLayout implements SwipeHelper public HeadsUpNotificationView(Context context, AttributeSet attrs, int defStyle) { super(context, attrs, defStyle); - setOrientation(LinearLayout.VERTICAL); mTouchSensitivityDelay = getResources().getInteger(R.integer.heads_up_sensitivity_delay); if (DEBUG) Log.v(TAG, "create() " + mTouchSensitivityDelay); } - @Override - public void onAttachedToWindow() { - float densityScale = getResources().getDisplayMetrics().density; - float pagingTouchSlop = ViewConfiguration.get(getContext()).getScaledPagingTouchSlop(); - mSwipeHelper = new SwipeHelper(SwipeHelper.X, this, densityScale, pagingTouchSlop); - - int minHeight = getResources().getDimensionPixelSize(R.dimen.notification_row_min_height); - int maxHeight = getResources().getDimensionPixelSize(R.dimen.notification_row_max_height); - mExpandHelper = new ExpandHelper(mContext, this, minHeight, maxHeight); - - mContentHolder = (ViewGroup) findViewById(R.id.contentHolder); - if (mHeadsUp != null) { - // whoops, we're on already! - setNotification(mHeadsUp); - } - } - public void setBar(BaseStatusBar bar) { mBar = bar; } - @Override - public boolean onInterceptTouchEvent(MotionEvent ev) { - if (DEBUG) Log.v(TAG, "onInterceptTouchEvent()"); - if (System.currentTimeMillis() < mStartTouchTime) { - return true; - } - return mSwipeHelper.onInterceptTouchEvent(ev) - || mExpandHelper.onInterceptTouchEvent(ev) - || super.onInterceptTouchEvent(ev); - } - - @Override - public boolean onTouchEvent(MotionEvent ev) { - if (System.currentTimeMillis() < mStartTouchTime) { - return false; - } - mBar.resetHeadsUpDecayTimer(); - return mSwipeHelper.onTouchEvent(ev) - || mExpandHelper.onTouchEvent(ev) - || super.onTouchEvent(ev); - } - - public boolean canChildBeDismissed(View v) { - return true; - } - - public void onChildDismissed(View v) { - Log.v(TAG, "User swiped heads up to dismiss"); - mBar.onHeadsUpDismissed(); - } - - public void onBeginDrag(View v) { - } - - public void onDragCancelled(View v) { - mContentHolder.setAlpha(1f); // sometimes this isn't quite reset - } - - public View getChildAtPosition(MotionEvent ev) { + public ViewGroup getHolder() { return mContentHolder; } - public View getChildContentView(View v) { - return v; - } - - @Override - protected void onConfigurationChanged(Configuration newConfig) { - super.onConfigurationChanged(newConfig); - float densityScale = getResources().getDisplayMetrics().density; - mSwipeHelper.setDensityScale(densityScale); - float pagingTouchSlop = ViewConfiguration.get(getContext()).getScaledPagingTouchSlop(); - mSwipeHelper.setPagingTouchSlop(pagingTouchSlop); - } - - @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(); - } - } - public boolean setNotification(NotificationData.Entry headsUp) { mHeadsUp = headsUp; mHeadsUp.row.setExpanded(false); @@ -172,6 +87,92 @@ public class HeadsUpNotificationView extends LinearLayout implements SwipeHelper return true; } + public boolean isInsistent() { + return mHeadsUp != null + && (mHeadsUp.notification.getNotification().flags & Notification.FLAG_INSISTENT) != 0; + } + + public void setMargin(int notificationPanelMarginPx) { + if (DEBUG) Log.v(TAG, "setMargin() " + notificationPanelMarginPx); + if (mContentSlider != null) { + FrameLayout.LayoutParams lp = (FrameLayout.LayoutParams) mContentSlider.getLayoutParams(); + lp.setMarginStart(notificationPanelMarginPx); + mContentSlider.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 + public void onAttachedToWindow() { + float densityScale = getResources().getDisplayMetrics().density; + float pagingTouchSlop = ViewConfiguration.get(getContext()).getScaledPagingTouchSlop(); + mSwipeHelper = new SwipeHelper(SwipeHelper.X, this, densityScale, pagingTouchSlop); + + int minHeight = getResources().getDimensionPixelSize(R.dimen.notification_row_min_height); + int maxHeight = getResources().getDimensionPixelSize(R.dimen.notification_row_max_height); + mExpandHelper = new ExpandHelper(mContext, this, minHeight, maxHeight); + + mContentHolder = (ViewGroup) findViewById(R.id.content_holder); + mContentSlider = (ViewGroup) findViewById(R.id.content_slider); + + if (mHeadsUp != null) { + // whoops, we're on already! + setNotification(mHeadsUp); + } + } + + @Override + public boolean onInterceptTouchEvent(MotionEvent ev) { + if (DEBUG) Log.v(TAG, "onInterceptTouchEvent()"); + if (System.currentTimeMillis() < mStartTouchTime) { + return true; + } + return mSwipeHelper.onInterceptTouchEvent(ev) + || mExpandHelper.onInterceptTouchEvent(ev) + || super.onInterceptTouchEvent(ev); + } + + // View methods + + @Override + public boolean onTouchEvent(MotionEvent ev) { + if (System.currentTimeMillis() < mStartTouchTime) { + return false; + } + mBar.resetHeadsUpDecayTimer(); + return mSwipeHelper.onTouchEvent(ev) + || mExpandHelper.onTouchEvent(ev) + || super.onTouchEvent(ev); + } + + @Override + protected void onConfigurationChanged(Configuration newConfig) { + super.onConfigurationChanged(newConfig); + float densityScale = getResources().getDisplayMetrics().density; + mSwipeHelper.setDensityScale(densityScale); + float pagingTouchSlop = ViewConfiguration.get(getContext()).getScaledPagingTouchSlop(); + mSwipeHelper.setPagingTouchSlop(pagingTouchSlop); + } + + // ExpandHelper.Callback methods + @Override public View getChildAtRawPosition(float x, float y) { return getChildAtPosition(x, y); @@ -201,8 +202,35 @@ public class HeadsUpNotificationView extends LinearLayout implements SwipeHelper } } - public boolean isInsistent() { - return mHeadsUp != null - && (mHeadsUp.notification.getNotification().flags & Notification.FLAG_INSISTENT) != 0; + // SwipeHelper.Callback methods + + @Override + public boolean canChildBeDismissed(View v) { + return true; + } + + @Override + public void onChildDismissed(View v) { + Log.v(TAG, "User swiped heads up to dismiss"); + mBar.onHeadsUpDismissed(); + } + + @Override + public void onBeginDrag(View v) { + } + + @Override + public void onDragCancelled(View v) { + mContentHolder.setAlpha(1f); // sometimes this isn't quite reset + } + + @Override + public View getChildAtPosition(MotionEvent ev) { + return mContentSlider; + } + + @Override + public View getChildContentView(View v) { + return v; } } \ No newline at end of file