From 198a0306e5b0ef6b02d61e299a4b4ab4c1c2cdc8 Mon Sep 17 00:00:00 2001 From: Daniel Sandler Date: Fri, 17 Aug 2012 16:04:31 -0400 Subject: [PATCH] Fix the seesaw behavior on the status panels. The code in onMeasure that attempts to accommodate changing child boundaries (i.e. an expanding/collapsing notification) was locking the window size to the child measurement, even though another window was trying to seesaw it closed. We now only activate the rubberband behavior when the size of the children changes, not on each onMeasure(). Lots of other small fixes to the panel expansion logic, too, including ensuring that the expanded fraction doesn't jump to 1.0f when the panel content hasn't been laid out yet (causing the entire screen to become dim for a second thanks to PhoneStatusBarView.panelExpansionChanged). This change also restores the ability of Binder clients (such as accessibility systems) to expand and collapse the status bar. Bug: 7008196 Bug: 6995518 Bug: 6628429 Change-Id: Ib0244a27aef2b4dbe19be98f7e039a9d38f1b80e --- .../systemui/statusbar/BaseStatusBar.java | 7 ++- .../systemui/statusbar/phone/PanelBar.java | 46 +++++++++++++------ .../systemui/statusbar/phone/PanelView.java | 35 ++++++++++---- .../statusbar/phone/PhoneStatusBar.java | 9 ++-- .../statusbar/phone/PhoneStatusBarView.java | 7 +++ .../statusbar/phone/StatusBarWindowView.java | 19 +++++++- 6 files changed, 90 insertions(+), 33 deletions(-) diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/BaseStatusBar.java b/packages/SystemUI/src/com/android/systemui/statusbar/BaseStatusBar.java index 923cd931661b3..ecb8fed2ec073 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/BaseStatusBar.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/BaseStatusBar.java @@ -84,8 +84,8 @@ import java.util.ArrayList; public abstract class BaseStatusBar extends SystemUI implements CommandQueue.Callbacks { - static final String TAG = "StatusBar"; - private static final boolean DEBUG = false; + public static final String TAG = "StatusBar"; + public static final boolean DEBUG = false; public static final boolean MULTIUSER_DEBUG = false; protected static final int MSG_TOGGLE_RECENTS_PANEL = 1020; @@ -162,6 +162,9 @@ public abstract class BaseStatusBar extends SystemUI implements private RemoteViews.OnClickHandler mOnClickHandler = new RemoteViews.OnClickHandler() { @Override public boolean onClickHandler(View view, PendingIntent pendingIntent, Intent fillInIntent) { + if (DEBUG) { + Slog.v(TAG, "Notification click handler invoked for intent: " + pendingIntent); + } final boolean isActivity = pendingIntent.isActivity(); if (isActivity) { try { diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/phone/PanelBar.java b/packages/SystemUI/src/com/android/systemui/statusbar/phone/PanelBar.java index bffb9033ebae3..9a3648fea67e0 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/phone/PanelBar.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/phone/PanelBar.java @@ -10,22 +10,23 @@ import android.widget.FrameLayout; public class PanelBar extends FrameLayout { public static final boolean DEBUG = false; - public static final String TAG = PanelView.class.getSimpleName(); + public static final String TAG = PanelBar.class.getSimpleName(); public static final void LOG(String fmt, Object... args) { if (!DEBUG) return; Slog.v(TAG, String.format(fmt, args)); } + public static final int STATE_CLOSED = 0; + public static final int STATE_OPENING = 1; + public static final int STATE_OPEN = 2; + private PanelHolder mPanelHolder; private ArrayList mPanels = new ArrayList(); protected PanelView mTouchingPanel; - private static final int STATE_CLOSED = 0; - private static final int STATE_TRANSITIONING = 1; - private static final int STATE_OPEN = 2; private int mState = STATE_CLOSED; private boolean mTracking; - private void go(int state) { + public void go(int state) { LOG("go state: %d -> %d", mState, state); mState = state; } @@ -80,18 +81,21 @@ public class PanelBar extends FrameLayout { // figure out which panel needs to be talked to here if (event.getAction() == MotionEvent.ACTION_DOWN) { - mTouchingPanel = selectPanelForTouchX(event.getX()); - mPanelHolder.setSelectedPanel(mTouchingPanel); - LOG("PanelBar.onTouch: state=%d ACTION_DOWN: panel %s", mState, mTouchingPanel.getName()); - if (mState == STATE_CLOSED || mState == STATE_OPEN) { - go(STATE_TRANSITIONING); - onPanelPeeked(); - } + final PanelView panel = selectPanelForTouchX(event.getX()); + LOG("PanelBar.onTouch: state=%d ACTION_DOWN: panel %s", mState, panel); + startOpeningPanel(panel); } final boolean result = mTouchingPanel.getHandle().dispatchTouchEvent(event); return result; } + // called from PanelView when self-expanding, too + public void startOpeningPanel(PanelView panel) { + LOG("startOpeningPanel: " + panel); + mTouchingPanel = panel; + mPanelHolder.setSelectedPanel(mTouchingPanel); + } + public void panelExpansionChanged(PanelView panel, float frac) { boolean fullyClosed = true; PanelView fullyOpenedPanel = null; @@ -99,6 +103,10 @@ public class PanelBar extends FrameLayout { for (PanelView pv : mPanels) { // adjust any other panels that may be partially visible if (pv.getExpandedHeight() > 0f) { + if (mState == STATE_CLOSED) { + go(STATE_OPENING); + onPanelPeeked(); + } fullyClosed = false; final float thisFrac = pv.getExpandedFraction(); LOG("panelExpansionChanged: -> %s: f=%.1f", pv.getName(), thisFrac); @@ -112,7 +120,7 @@ public class PanelBar extends FrameLayout { if (fullyOpenedPanel != null && !mTracking) { go(STATE_OPEN); onPanelFullyOpened(fullyOpenedPanel); - } else if (fullyClosed && !mTracking) { + } else if (fullyClosed && !mTracking && mState != STATE_CLOSED) { go(STATE_CLOSED); onAllPanelsCollapsed(); } @@ -122,13 +130,21 @@ public class PanelBar extends FrameLayout { } public void collapseAllPanels(boolean animate) { + boolean waiting = false; for (PanelView pv : mPanels) { - if (animate && pv == mTouchingPanel) { - mTouchingPanel.collapse(); + if (animate && !pv.isFullyCollapsed()) { + pv.collapse(); + waiting = true; } else { pv.setExpandedFraction(0); // just in case } } + if (!waiting) { + // it's possible that nothing animated, so we replicate the termination + // conditions of panelExpansionChanged here + go(STATE_CLOSED); + onAllPanelsCollapsed(); + } } public void onPanelPeeked() { diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/phone/PanelView.java b/packages/SystemUI/src/com/android/systemui/statusbar/phone/PanelView.java index 1c244d4e8c9fc..a4a3a6aa7bdff 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/phone/PanelView.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/phone/PanelView.java @@ -9,6 +9,7 @@ import android.util.Slog; import android.view.MotionEvent; import android.view.VelocityTracker; import android.view.View; +import android.view.ViewGroup; import android.widget.FrameLayout; import com.android.systemui.R; @@ -18,7 +19,7 @@ import com.android.systemui.statusbar.policy.LocationController; import com.android.systemui.statusbar.policy.NetworkController; public class PanelView extends FrameLayout { - public static final boolean DEBUG = false; + public static final boolean DEBUG = PanelBar.DEBUG; public static final String TAG = PanelView.class.getSimpleName(); public final void LOG(String fmt, Object... args) { if (!DEBUG) return; @@ -298,10 +299,16 @@ public class PanelView extends FrameLayout { LOG("onMeasure(%d, %d) -> (%d, %d)", widthMeasureSpec, heightMeasureSpec, getMeasuredWidth(), getMeasuredHeight()); - mFullHeight = getMeasuredHeight(); - // if one of our children is getting smaller, we should track that - if (!mTracking && !mRubberbanding && !mTimeAnimator.isStarted() && mExpandedHeight > 0 && mExpandedHeight != mFullHeight) { - mExpandedHeight = mFullHeight; + + // Did one of our children change size? + int newHeight = getMeasuredHeight(); + if (newHeight != mFullHeight) { + mFullHeight = newHeight; + // If the user isn't actively poking us, let's rubberband to the content + if (!mTracking && !mRubberbanding && !mTimeAnimator.isStarted() + && mExpandedHeight > 0 && mExpandedHeight != mFullHeight) { + mExpandedHeight = mFullHeight; + } } heightMeasureSpec = MeasureSpec.makeMeasureSpec( (int) mExpandedHeight, MeasureSpec.AT_MOST); // MeasureSpec.getMode(heightMeasureSpec)); @@ -310,6 +317,7 @@ public class PanelView extends FrameLayout { public void setExpandedHeight(float height) { + mTracking = mRubberbanding = false; post(mStopAnimator); setExpandedHeightInternal(height); } @@ -326,21 +334,26 @@ public class PanelView extends FrameLayout { // Hmm, full height hasn't been computed yet } - LOG("setExpansion: height=%.1f fh=%.1f tracking=%s rubber=%s", h, fh, mTracking?"T":"f", mRubberbanding?"T":"f"); - if (h < 0) h = 0; if (!(STRETCH_PAST_CONTENTS && (mTracking || mRubberbanding)) && h > fh) h = fh; mExpandedHeight = h; + LOG("setExpansion: height=%.1f fh=%.1f tracking=%s rubber=%s", h, fh, mTracking?"T":"f", mRubberbanding?"T":"f"); + requestLayout(); // FrameLayout.LayoutParams lp = (FrameLayout.LayoutParams) getLayoutParams(); // lp.height = (int) mExpandedHeight; // setLayoutParams(lp); - mExpandedFraction = Math.min(1f, h / fh); + mExpandedFraction = Math.min(1f, (fh == 0) ? 0 : h / fh); } private float getFullHeight() { + if (mFullHeight <= 0) { + LOG("Forcing measure() since fullHeight=" + mFullHeight); + measure(MeasureSpec.makeMeasureSpec(LayoutParams.WRAP_CONTENT, MeasureSpec.EXACTLY), + MeasureSpec.makeMeasureSpec(LayoutParams.WRAP_CONTENT, MeasureSpec.EXACTLY)); + } return mFullHeight; } @@ -385,8 +398,12 @@ public class PanelView extends FrameLayout { } public void expand() { - if (!isFullyExpanded()) { + if (isFullyCollapsed()) { + mBar.startOpeningPanel(this); + LOG("expand: calling fling(%s, true)", mSelfExpandVelocityPx); fling (mSelfExpandVelocityPx, /*always=*/ true); + } else if (DEBUG) { + LOG("skipping expansion: is expanded"); } } } 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 8f6a9034f3c99..c55da5dcaf488 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/phone/PhoneStatusBar.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/phone/PhoneStatusBar.java @@ -95,7 +95,7 @@ import java.util.ArrayList; public class PhoneStatusBar extends BaseStatusBar { static final String TAG = "PhoneStatusBar"; - public static final boolean DEBUG = false; + public static final boolean DEBUG = BaseStatusBar.DEBUG; public static final boolean SPEW = DEBUG; public static final boolean DUMPTRUCK = true; // extra dumpsys info @@ -285,9 +285,6 @@ public class PhoneStatusBar extends BaseStatusBar { mStatusBarWindow = (StatusBarWindowView) View.inflate(context, R.layout.super_status_bar, null); - if (DEBUG) { - mStatusBarWindow.setBackgroundColor(0x6000FF80); - } mStatusBarWindow.mService = this; mStatusBarWindow.setOnTouchListener(new View.OnTouchListener() { @Override @@ -1160,7 +1157,7 @@ public class PhoneStatusBar extends BaseStatusBar { public void animateCollapse(int flags) { if (SPEW) { - Slog.d(TAG, "animateCollapse(): " + Slog.d(TAG, "animateCollapse():" + " mExpandedVisible=" + mExpandedVisible + " mAnimating=" + mAnimating + " mAnimatingReveal=" + mAnimatingReveal @@ -1203,7 +1200,7 @@ public class PhoneStatusBar extends BaseStatusBar { } // Ensure the panel is fully collapsed (just in case; bug 6765842) - mStatusBarView.collapseAllPanels(/*animate=*/ false); + // @@@ mStatusBarView.collapseAllPanels(/*animate=*/ false); mExpandedVisible = false; mPile.setLayoutTransitionsEnabled(false); diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/phone/PhoneStatusBarView.java b/packages/SystemUI/src/com/android/systemui/statusbar/phone/PhoneStatusBarView.java index 8fe525c01a4d3..95b618ad0ce9a 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/phone/PhoneStatusBarView.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/phone/PhoneStatusBarView.java @@ -27,6 +27,7 @@ import android.graphics.Rect; import android.os.SystemClock; import android.util.AttributeSet; import android.util.Log; +import android.util.Slog; import android.view.KeyEvent; import android.view.MotionEvent; import android.view.View; @@ -41,6 +42,8 @@ import com.android.systemui.statusbar.policy.FixedSizeDrawable; public class PhoneStatusBarView extends PanelBar { private static final String TAG = "PhoneStatusBarView"; + private static final boolean DEBUG = PhoneStatusBar.DEBUG; + PhoneStatusBar mBar; int mScrimColor; float mMinFlingGutter; @@ -152,6 +155,10 @@ public class PhoneStatusBarView extends PanelBar { public void panelExpansionChanged(PanelView pv, float frac) { super.panelExpansionChanged(pv, frac); + if (DEBUG) { + Slog.v(TAG, "panelExpansionChanged: f=" + frac); + } + if (mFadingPanel == pv && mScrimColor != 0 && ActivityManager.isHighEndGfx()) { // woo, special effects diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/phone/StatusBarWindowView.java b/packages/SystemUI/src/com/android/systemui/statusbar/phone/StatusBarWindowView.java index e0b7fe6f9c286..f83517b8ff4f0 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/phone/StatusBarWindowView.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/phone/StatusBarWindowView.java @@ -17,6 +17,8 @@ package com.android.systemui.statusbar.phone; import android.content.Context; +import android.graphics.Canvas; +import android.graphics.Paint; import android.util.AttributeSet; import android.util.Log; import android.view.KeyEvent; @@ -28,12 +30,14 @@ import android.widget.TextSwitcher; import com.android.systemui.ExpandHelper; import com.android.systemui.R; +import com.android.systemui.statusbar.BaseStatusBar; import com.android.systemui.statusbar.policy.NotificationRowLayout; public class StatusBarWindowView extends FrameLayout { - private static final String TAG = "StatusBarWindowView"; + public static final String TAG = "StatusBarWindowView"; + public static final boolean DEBUG = BaseStatusBar.DEBUG; private ExpandHelper mExpandHelper; private NotificationRowLayout latestItems; @@ -44,6 +48,7 @@ public class StatusBarWindowView extends FrameLayout public StatusBarWindowView(Context context, AttributeSet attrs) { super(context, attrs); setMotionEventSplittingEnabled(false); + setWillNotDraw(!DEBUG); } @Override @@ -101,5 +106,17 @@ public class StatusBarWindowView extends FrameLayout } return handled; } + + @Override + public void onDraw(Canvas canvas) { + super.onDraw(canvas); + if (DEBUG) { + Paint pt = new Paint(); + pt.setColor(0x80FFFF00); + pt.setStrokeWidth(12.0f); + pt.setStyle(Paint.Style.STROKE); + canvas.drawRect(0, 0, canvas.getWidth(), canvas.getHeight(), pt); + } + } }