Make QS panel peek below the header.
Bug: 15210059 Change-Id: I84e45092b3c9c397da8b458dbaa136fd52e665a6
This commit is contained in:
@@ -19,13 +19,11 @@
|
||||
<item android:state_pressed="true">
|
||||
<shape>
|
||||
<solid android:color="@color/background_color_1_press" />
|
||||
<corners android:radius="@*android:dimen/notification_quantum_rounded_rect_radius" />
|
||||
</shape>
|
||||
</item>
|
||||
<item>
|
||||
<shape>
|
||||
<solid android:color="@color/background_color_1" />
|
||||
<corners android:radius="@*android:dimen/notification_quantum_rounded_rect_radius" />
|
||||
</shape>
|
||||
</item>
|
||||
</selector>
|
||||
@@ -13,11 +13,8 @@
|
||||
See the License for the specific language governing permissions and
|
||||
limitations under the License.
|
||||
-->
|
||||
<inset xmlns:android="http://schemas.android.com/apk/res/android"
|
||||
android:insetLeft="@dimen/notification_side_padding"
|
||||
android:insetRight="@dimen/notification_side_padding">
|
||||
<shape>
|
||||
<solid android:color="@color/system_primary_color" />
|
||||
<corners android:radius="@*android:dimen/notification_quantum_rounded_rect_radius" />
|
||||
</shape>
|
||||
</inset>
|
||||
<shape xmlns:android="http://schemas.android.com/apk/res/android">
|
||||
<solid android:color="@color/system_primary_color" />
|
||||
<corners
|
||||
android:radius="@*android:dimen/notification_quantum_rounded_rect_radius"/>
|
||||
</shape>
|
||||
|
||||
@@ -16,11 +16,10 @@
|
||||
<FrameLayout
|
||||
xmlns:android="http://schemas.android.com/apk/res/android"
|
||||
android:id="@+id/quick_settings_container"
|
||||
android:paddingLeft="@dimen/notification_side_padding"
|
||||
android:paddingRight="@dimen/notification_side_padding"
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="wrap_content"
|
||||
android:background="@drawable/qs_panel_background" >
|
||||
android:background="@drawable/qs_panel_background"
|
||||
android:elevation="2dp">
|
||||
<com.android.systemui.qs.QSPanel
|
||||
android:id="@+id/quick_settings_panel"
|
||||
android:background="#0000"
|
||||
|
||||
@@ -59,7 +59,6 @@
|
||||
android:id="@+id/scroll_view"
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="match_parent"
|
||||
android:visibility="invisible"
|
||||
android:scrollbars="none"
|
||||
android:overScrollMode="never"
|
||||
android:fillViewport="true">
|
||||
@@ -71,7 +70,9 @@
|
||||
layout="@layout/qs_panel"
|
||||
android:layout_marginTop="@dimen/status_bar_header_height_expanded"
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="wrap_content"/>
|
||||
android:layout_height="wrap_content"
|
||||
android:layout_marginLeft="@dimen/notification_side_padding"
|
||||
android:layout_marginRight="@dimen/notification_side_padding"/>
|
||||
|
||||
<!-- A view to reserve space for the collapsed stack -->
|
||||
<View
|
||||
@@ -80,7 +81,6 @@
|
||||
</LinearLayout>
|
||||
</com.android.systemui.statusbar.phone.ObservableScrollView>
|
||||
|
||||
|
||||
<com.android.systemui.statusbar.stack.NotificationStackScrollLayout
|
||||
android:id="@+id/notification_stack_scroller"
|
||||
android:layout_width="match_parent"
|
||||
|
||||
@@ -25,7 +25,7 @@
|
||||
android:paddingStart="@dimen/notification_side_padding"
|
||||
android:paddingEnd="@dimen/notification_side_padding"
|
||||
android:baselineAligned="false"
|
||||
android:elevation="10dp"
|
||||
android:elevation="4dp"
|
||||
>
|
||||
|
||||
<View
|
||||
|
||||
@@ -196,6 +196,9 @@
|
||||
<dimen name="qs_dual_tile_height">109dp</dimen>
|
||||
<dimen name="qs_dual_tile_padding">12dp</dimen>
|
||||
|
||||
<!-- How far the expanded QS panel peeks from the header in collapsed state. -->
|
||||
<dimen name="qs_peek_height">8dp</dimen>
|
||||
|
||||
<!-- used by DessertCase -->
|
||||
<dimen name="dessert_case_cell_size">192dp</dimen>
|
||||
|
||||
|
||||
@@ -50,6 +50,7 @@ public class NotificationPanelView extends PanelView implements
|
||||
PhoneStatusBar mStatusBar;
|
||||
private StatusBarHeaderView mHeader;
|
||||
private View mQsContainer;
|
||||
private View mQsPanel;
|
||||
private View mKeyguardStatusView;
|
||||
private ObservableScrollView mScrollView;
|
||||
private View mStackScrollerContainer;
|
||||
@@ -68,6 +69,7 @@ public class NotificationPanelView extends PanelView implements
|
||||
*/
|
||||
private boolean mIntercepting;
|
||||
private boolean mQsExpanded;
|
||||
private boolean mKeyguardShowing;
|
||||
private float mInitialHeightOnTouch;
|
||||
private float mInitialTouchX;
|
||||
private float mInitialTouchY;
|
||||
@@ -77,6 +79,7 @@ public class NotificationPanelView extends PanelView implements
|
||||
private int mQsMinExpansionHeight;
|
||||
private int mQsMaxExpansionHeight;
|
||||
private int mMinStackHeight;
|
||||
private int mQsPeekHeight;
|
||||
private float mNotificationTranslation;
|
||||
private int mStackScrollerIntrinsicPadding;
|
||||
private boolean mQsExpansionEnabled = true;
|
||||
@@ -121,6 +124,7 @@ public class NotificationPanelView extends PanelView implements
|
||||
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);
|
||||
mScrollView = (ObservableScrollView) findViewById(R.id.scroll_view);
|
||||
mScrollView.setListener(this);
|
||||
mNotificationStackScroller = (NotificationStackScrollLayout)
|
||||
@@ -139,22 +143,21 @@ public class NotificationPanelView extends PanelView implements
|
||||
mFlingAnimationUtils = new FlingAnimationUtils(getContext(), 0.4f);
|
||||
mStatusBarMinHeight = getResources().getDimensionPixelSize(
|
||||
com.android.internal.R.dimen.status_bar_height);
|
||||
mQsPeekHeight = getResources().getDimensionPixelSize(R.dimen.qs_peek_height);
|
||||
mClockPositionAlgorithm.loadDimens(getResources());
|
||||
}
|
||||
|
||||
@Override
|
||||
protected void onLayout(boolean changed, int left, int top, int right, int bottom) {
|
||||
super.onLayout(changed, left, top, right, bottom);
|
||||
if (!mQsExpanded) {
|
||||
positionClockAndNotifications();
|
||||
mNotificationStackScroller.setStackHeight(getExpandedHeight());
|
||||
}
|
||||
|
||||
// Calculate quick setting heights.
|
||||
mQsMinExpansionHeight = mHeader.getCollapsedHeight();
|
||||
mQsMinExpansionHeight = mHeader.getCollapsedHeight() + mQsPeekHeight;
|
||||
mQsMaxExpansionHeight = mHeader.getExpandedHeight() + mQsContainer.getHeight();
|
||||
if (mQsExpansionHeight == 0) {
|
||||
mQsExpansionHeight = mQsMinExpansionHeight;
|
||||
if (!mQsExpanded) {
|
||||
setQsExpansion(mQsMinExpansionHeight);
|
||||
positionClockAndNotifications();
|
||||
mNotificationStackScroller.setStackHeight(getExpandedHeight());
|
||||
}
|
||||
}
|
||||
|
||||
@@ -165,7 +168,8 @@ public class NotificationPanelView extends PanelView implements
|
||||
private void positionClockAndNotifications() {
|
||||
boolean animateClock = mNotificationStackScroller.isAddOrRemoveAnimationPending();
|
||||
if (mStatusBar.getBarState() != StatusBarState.KEYGUARD) {
|
||||
mStackScrollerIntrinsicPadding = mHeader.getBottom() + mNotificationTopPadding;
|
||||
mStackScrollerIntrinsicPadding = mHeader.getBottom() + mQsPeekHeight
|
||||
+ mNotificationTopPadding;
|
||||
mTopPaddingAdjustment = 0;
|
||||
} else {
|
||||
mClockPositionAlgorithm.setup(
|
||||
@@ -455,29 +459,38 @@ public class NotificationPanelView extends PanelView implements
|
||||
setQsExpansion(height);
|
||||
}
|
||||
|
||||
private void expandQs() {
|
||||
mHeader.setExpanded(true);
|
||||
mNotificationStackScroller.setEnabled(false);
|
||||
mScrollView.setVisibility(View.VISIBLE);
|
||||
mQsExpanded = true;
|
||||
private void setQsExpanded(boolean expanded) {
|
||||
boolean changed = mQsExpanded != expanded;
|
||||
if (changed) {
|
||||
mQsExpanded = expanded;
|
||||
updateQsState();
|
||||
}
|
||||
}
|
||||
|
||||
private void collapseQs() {
|
||||
mHeader.setExpanded(false);
|
||||
mNotificationStackScroller.setEnabled(true);
|
||||
mScrollView.setVisibility(View.INVISIBLE);
|
||||
mQsExpanded = false;
|
||||
public void setKeyguardShowing(boolean keyguardShowing) {
|
||||
mKeyguardShowing = keyguardShowing;
|
||||
updateQsState();
|
||||
}
|
||||
|
||||
private void updateQsState() {
|
||||
mHeader.setExpanded(mQsExpanded);
|
||||
mNotificationStackScroller.setEnabled(!mQsExpanded);
|
||||
mQsPanel.setVisibility(mQsExpanded ? View.VISIBLE : View.INVISIBLE);
|
||||
mQsContainer.setVisibility(mKeyguardShowing && !mQsExpanded
|
||||
? View.INVISIBLE
|
||||
: View.VISIBLE);
|
||||
mScrollView.setTouchEnabled(mQsExpanded);
|
||||
}
|
||||
|
||||
private void setQsExpansion(float height) {
|
||||
height = Math.min(Math.max(height, mQsMinExpansionHeight), mQsMaxExpansionHeight);
|
||||
if (height > mQsMinExpansionHeight && !mQsExpanded) {
|
||||
expandQs();
|
||||
setQsExpanded(true);
|
||||
} else if (height <= mQsMinExpansionHeight && mQsExpanded) {
|
||||
collapseQs();
|
||||
setQsExpanded(false);
|
||||
}
|
||||
mQsExpansionHeight = height;
|
||||
mHeader.setExpansion(height);
|
||||
mHeader.setExpansion(height - mQsPeekHeight);
|
||||
setQsTranslation(height);
|
||||
setQsStackScrollerPadding(height);
|
||||
mStatusBar.userActivity();
|
||||
|
||||
@@ -30,6 +30,7 @@ public class ObservableScrollView extends ScrollView {
|
||||
private Listener mListener;
|
||||
private int mLastOverscrollAmount;
|
||||
private boolean mDispatchingTouchEvent;
|
||||
private boolean mTouchEnabled = true;
|
||||
|
||||
public ObservableScrollView(Context context, AttributeSet attrs) {
|
||||
super(context, attrs);
|
||||
@@ -39,6 +40,10 @@ public class ObservableScrollView extends ScrollView {
|
||||
mListener = listener;
|
||||
}
|
||||
|
||||
public void setTouchEnabled(boolean touchEnabled) {
|
||||
mTouchEnabled = touchEnabled;
|
||||
}
|
||||
|
||||
public boolean isScrolledToBottom() {
|
||||
return getScrollY() == getMaxScrollY();
|
||||
}
|
||||
@@ -59,6 +64,9 @@ public class ObservableScrollView extends ScrollView {
|
||||
|
||||
@Override
|
||||
public boolean dispatchTouchEvent(MotionEvent ev) {
|
||||
if (!mTouchEnabled) {
|
||||
return false;
|
||||
}
|
||||
mDispatchingTouchEvent = true;
|
||||
boolean result = super.dispatchTouchEvent(ev);
|
||||
mDispatchingTouchEvent = false;
|
||||
|
||||
@@ -2770,9 +2770,11 @@ public class PhoneStatusBar extends BaseStatusBar implements DemoMode,
|
||||
if (mState == StatusBarState.KEYGUARD || mState == StatusBarState.SHADE_LOCKED) {
|
||||
mKeyguardBottomArea.setVisibility(View.VISIBLE);
|
||||
mHeader.setKeyguardShowing(true);
|
||||
mNotificationPanel.setKeyguardShowing(true);
|
||||
} else {
|
||||
mKeyguardBottomArea.setVisibility(View.GONE);
|
||||
mHeader.setKeyguardShowing(false);
|
||||
mNotificationPanel.setKeyguardShowing(false);
|
||||
}
|
||||
|
||||
updateStackScrollerState();
|
||||
|
||||
@@ -38,6 +38,11 @@ import com.android.systemui.statusbar.policy.UserInfoController;
|
||||
*/
|
||||
public class StatusBarHeaderView extends RelativeLayout implements View.OnClickListener {
|
||||
|
||||
/**
|
||||
* How much the header expansion gets rubberbanded while expanding the panel.
|
||||
*/
|
||||
private static final float EXPANSION_RUBBERBAND_FACTOR = 0.35f;
|
||||
|
||||
private boolean mExpanded;
|
||||
private boolean mKeyguardShowing;
|
||||
|
||||
@@ -128,6 +133,7 @@ public class StatusBarHeaderView extends RelativeLayout implements View.OnClickL
|
||||
updateVisibilities();
|
||||
updateSystemIconsLayoutParams();
|
||||
updateBrightnessControllerState();
|
||||
updateZTranslation();
|
||||
if (mQSPanel != null) {
|
||||
mQSPanel.setExpanded(expanded);
|
||||
}
|
||||
@@ -202,18 +208,25 @@ public class StatusBarHeaderView extends RelativeLayout implements View.OnClickL
|
||||
}
|
||||
}
|
||||
|
||||
private void updateZTranslation() {
|
||||
|
||||
// If we are on the Keyguard, we need to set our z position to zero, so we don't get
|
||||
// shadows.
|
||||
if (mKeyguardShowing && !mExpanded) {
|
||||
setZ(0);
|
||||
} else {
|
||||
setTranslationZ(0);
|
||||
}
|
||||
}
|
||||
|
||||
public void setExpansion(float height) {
|
||||
height = (height - mCollapsedHeight) * EXPANSION_RUBBERBAND_FACTOR + mCollapsedHeight;
|
||||
if (height < mCollapsedHeight) {
|
||||
height = mCollapsedHeight;
|
||||
}
|
||||
if (height > mExpandedHeight) {
|
||||
height = mExpandedHeight;
|
||||
}
|
||||
if (mExpanded) {
|
||||
mBackground.setTranslationY(-(mExpandedHeight - height));
|
||||
} else {
|
||||
mBackground.setTranslationY(0);
|
||||
}
|
||||
setClipping(height);
|
||||
}
|
||||
|
||||
@@ -247,14 +260,10 @@ public class StatusBarHeaderView extends RelativeLayout implements View.OnClickL
|
||||
|
||||
public void setKeyguardShowing(boolean keyguardShowing) {
|
||||
mKeyguardShowing = keyguardShowing;
|
||||
if (keyguardShowing) {
|
||||
setZ(0);
|
||||
} else {
|
||||
setTranslationZ(0);
|
||||
}
|
||||
updateHeights();
|
||||
updateWidth();
|
||||
updateVisibilities();
|
||||
updateZTranslation();
|
||||
}
|
||||
|
||||
public void setUserInfoController(UserInfoController userInfoController) {
|
||||
|
||||
Reference in New Issue
Block a user