QuickSettings: Hide the expanded header in detail mode.
When a tile's detail panel is showing, hide the header
panel above - giving it more real estate.
Bug:15315490
Change-Id: I8aac0ec0eae5dad7393e334107b6aeac76f54545
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 802e5e5..dce5a30 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/phone/NotificationPanelView.java
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/phone/NotificationPanelView.java
@@ -34,6 +34,7 @@
import android.widget.LinearLayout;
import com.android.systemui.R;
+import com.android.systemui.qs.QSPanel;
import com.android.systemui.statusbar.ExpandableView;
import com.android.systemui.statusbar.FlingAnimationUtils;
import com.android.systemui.statusbar.GestureRecorder;
@@ -51,7 +52,7 @@
PhoneStatusBar mStatusBar;
private StatusBarHeaderView mHeader;
private View mQsContainer;
- private View mQsPanel;
+ private QSPanel mQsPanel;
private View mKeyguardStatusView;
private ObservableScrollView mScrollView;
private View mStackScrollerContainer;
@@ -70,6 +71,7 @@
*/
private boolean mIntercepting;
private boolean mQsExpanded;
+ private boolean mQsFullyExpanded;
private boolean mKeyguardShowing;
private float mInitialHeightOnTouch;
private float mInitialTouchX;
@@ -81,13 +83,14 @@
private int mQsMaxExpansionHeight;
private int mMinStackHeight;
private int mQsPeekHeight;
+ private int mQsHeaderPeekHeight;
+ private boolean mQsShowingDetail;
private float mNotificationTranslation;
private int mStackScrollerIntrinsicPadding;
private boolean mQsExpansionEnabled = true;
private ValueAnimator mQsExpansionAnimator;
private FlingAnimationUtils mFlingAnimationUtils;
private int mStatusBarMinHeight;
-
private Interpolator mFastOutSlowInInterpolator;
private ObjectAnimator mClockAnimator;
private int mClockAnimationTarget = -1;
@@ -130,7 +133,8 @@
mKeyguardStatusView = findViewById(R.id.keyguard_status_view);
mStackScrollerContainer = findViewById(R.id.notification_container_parent);
mQsContainer = findViewById(R.id.quick_settings_container);
- mQsPanel = findViewById(R.id.quick_settings_panel);
+ mQsPanel = (QSPanel) findViewById(R.id.quick_settings_panel);
+ mQsPanel.setCallback(mQsPanelCallback);
mScrollView = (ObservableScrollView) findViewById(R.id.scroll_view);
mScrollView.setListener(this);
mNotificationStackScroller = (NotificationStackScrollLayout)
@@ -154,6 +158,7 @@
mStatusBarMinHeight = getResources().getDimensionPixelSize(
com.android.internal.R.dimen.status_bar_height);
mQsPeekHeight = getResources().getDimensionPixelSize(R.dimen.qs_peek_height);
+ mQsHeaderPeekHeight = getResources().getDimensionPixelSize(R.dimen.qs_header_peek_height);
mClockPositionAlgorithm.loadDimens(getResources());
}
@@ -165,7 +170,9 @@
mQsMinExpansionHeight = mHeader.getCollapsedHeight() + mQsPeekHeight;
mQsMaxExpansionHeight = mHeader.getExpandedHeight() + mQsContainer.getHeight();
if (mQsExpanded) {
- setQsStackScrollerPadding(mQsMaxExpansionHeight);
+ if (mQsFullyExpanded) {
+ setQsStackScrollerPadding(mQsMaxExpansionHeight);
+ }
} else {
setQsExpansion(mQsMinExpansionHeight);
positionClockAndNotifications();
@@ -518,10 +525,39 @@
? View.INVISIBLE
: View.VISIBLE);
mScrollView.setTouchEnabled(mQsExpanded);
+ if (mQsShowingDetail) {
+ if (mQsFullyExpanded) {
+ setQsHeaderPeeking(true);
+ }
+ } else {
+ setQsHeaderPeeking(false);
+ }
+ }
+
+ private void setQsHeaderPeeking(boolean peeking) {
+ final boolean stackIsPeeking = mStackScrollerContainer.getTranslationY() != 0;
+ final boolean headerIsPeeking = mHeader.getTranslationY() != 0;
+ final int ty = mQsHeaderPeekHeight - mHeader.getExpandedHeight();
+ if (peeking) {
+ if (!headerIsPeeking) {
+ mHeader.animate().translationY(ty);
+ }
+ if (!stackIsPeeking) {
+ mStackScrollerContainer.animate().translationY(ty);
+ }
+ } else {
+ if (headerIsPeeking) {
+ mHeader.animate().translationY(0);
+ }
+ if (stackIsPeeking) {
+ mStackScrollerContainer.animate().translationY(0);
+ }
+ }
}
private void setQsExpansion(float height) {
height = Math.min(Math.max(height, mQsMinExpansionHeight), mQsMaxExpansionHeight);
+ mQsFullyExpanded = height == mQsMaxExpansionHeight;
if (height > mQsMinExpansionHeight && !mQsExpanded) {
setQsExpanded(true);
} else if (height <= mQsMinExpansionHeight && mQsExpanded) {
@@ -614,10 +650,16 @@
if (!mQsExpansionEnabled) {
return false;
}
+ final float ty = mHeader.getTranslationY();
boolean onHeader = x >= mHeader.getLeft() && x <= mHeader.getRight()
- && y >= mHeader.getTop() && y <= mHeader.getBottom();
+ && y >= mHeader.getTop() + ty && y <= mHeader.getBottom() + ty;
if (mQsExpanded) {
- return onHeader || (mScrollView.isScrolledToBottom() && yDiff < 0);
+ if (mQsShowingDetail && onHeader) {
+ // bring back the header, crudely
+ setQsHeaderPeeking(false);
+ mQsPanel.setExpanded(false);
+ }
+ return !mQsShowingDetail && onHeader || (mScrollView.isScrolledToBottom() && yDiff < 0);
} else {
return onHeader;
}
@@ -781,4 +823,12 @@
public View getRightIcon() {
return mKeyguardBottomArea.getCameraImageView();
}
+
+ private final QSPanel.Callback mQsPanelCallback = new QSPanel.Callback() {
+ @Override
+ public void onShowingDetail(boolean showingDetail) {
+ mQsShowingDetail = showingDetail;
+ updateQsState();
+ }
+ };
}