Fix ordering of notifications, user switcher and QS panel

Also closes the user switcher when opening QS on Keyguard because
touch logic would interleave with QS.

Change-Id: I391dc9bcba7f9e2e99c0854d34ed0ec6efbb2f44
This commit is contained in:
Jorim Jaggi
2014-07-25 16:42:34 +02:00
parent 22fa6e5c49
commit bc976e3f4c
4 changed files with 64 additions and 13 deletions

View File

@@ -56,14 +56,6 @@
android:clipToPadding="false"
android:clipChildren="false">
<ViewStub
android:id="@+id/keyguard_user_switcher"
android:layout_height="wrap_content"
android:layout_width="wrap_content"
android:layout_marginTop="@dimen/status_bar_header_height_keyguard"
android:layout_gravity="end"
android:layout="@layout/keyguard_user_switcher" />
<com.android.systemui.statusbar.phone.ObservableScrollView
android:id="@+id/scroll_view"
android:layout_width="match_parent"
@@ -103,6 +95,14 @@
android:layout_height="match_parent"
android:layout_marginBottom="@dimen/close_handle_underlap"/>
<ViewStub
android:id="@+id/keyguard_user_switcher"
android:layout_height="wrap_content"
android:layout_width="wrap_content"
android:layout_marginTop="@dimen/status_bar_header_height_keyguard"
android:layout_gravity="end"
android:layout="@layout/keyguard_user_switcher" />
</com.android.systemui.statusbar.phone.NotificationsQuickSettingsContainer>
<include layout="@layout/status_bar_expanded_header" />

View File

@@ -17,23 +17,71 @@
package com.android.systemui.statusbar.phone;
import android.content.Context;
import android.graphics.Canvas;
import android.graphics.Rect;
import android.util.AttributeSet;
import android.view.View;
import android.view.ViewStub;
import android.widget.FrameLayout;
import com.android.systemui.R;
/**
* The container with notification stack scroller and quick settings inside.
*/
public class NotificationsQuickSettingsContainer extends FrameLayout {
public class NotificationsQuickSettingsContainer extends FrameLayout
implements ViewStub.OnInflateListener {
private View mScrollView;
private View mUserSwitcher;
private View mStackScroller;
private boolean mInflated;
public NotificationsQuickSettingsContainer(Context context, AttributeSet attrs) {
super(context, attrs);
}
@Override
protected void onFinishInflate() {
super.onFinishInflate();
mScrollView = findViewById(R.id.scroll_view);
mStackScroller = findViewById(R.id.notification_stack_scroller);
ViewStub userSwitcher = (ViewStub) findViewById(R.id.keyguard_user_switcher);
userSwitcher.setOnInflateListener(this);
mUserSwitcher = userSwitcher;
}
@Override
protected boolean fitSystemWindows(Rect insets) {
setPadding(0, 0, 0, insets.bottom);
insets.bottom = 0;
return true;
}
@Override
protected boolean drawChild(Canvas canvas, View child, long drawingTime) {
boolean userSwitcherVisible = mInflated && mUserSwitcher.getVisibility() == View.VISIBLE;
// Invert the order of the scroll view and user switcher such that the notifications receive
// touches first but the panel gets drawn above.
if (child == mScrollView) {
return super.drawChild(canvas, mStackScroller, drawingTime);
} else if (child == mStackScroller) {
return super.drawChild(canvas, userSwitcherVisible ? mUserSwitcher : mScrollView,
drawingTime);
} else if (child == mUserSwitcher) {
return super.drawChild(canvas, userSwitcherVisible ? mScrollView : mUserSwitcher,
drawingTime);
} else {
return super.drawChild(canvas, child, drawingTime);
}
}
@Override
public void onInflate(ViewStub stub, View inflated) {
if (stub == mUserSwitcher) {
mUserSwitcher = inflated;
mInflated = true;
}
}
}

View File

@@ -98,7 +98,7 @@ public class StatusBarHeaderView extends RelativeLayout implements View.OnClickL
private ActivityStarter mActivityStarter;
private BatteryController mBatteryController;
private QSPanel mQSPanel;
private boolean mHasKeyguardUserSwitcher;
private KeyguardUserSwitcher mKeyguardUserSwitcher;
private final Rect mClipBounds = new Rect();
private final StatusIconClipper mStatusIconClipper = new StatusIconClipper();
@@ -300,6 +300,9 @@ public class StatusBarHeaderView extends RelativeLayout implements View.OnClickL
? VISIBLE : GONE);
mBatteryLevel.setVisibility(mKeyguardShowing && mCharging || mExpanded && !mOverscrolled
? View.VISIBLE : View.GONE);
if (mExpanded && !mOverscrolled && mKeyguardUserSwitcherShowing) {
mKeyguardUserSwitcher.hide();
}
}
private void updateSystemIconsLayoutParams() {
@@ -377,7 +380,7 @@ public class StatusBarHeaderView extends RelativeLayout implements View.OnClickL
mDateTime.setClickable(mExpanded);
boolean keyguardSwitcherAvailable =
mHasKeyguardUserSwitcher && mKeyguardShowing && !mExpanded;
mKeyguardUserSwitcher != null && mKeyguardShowing && !mExpanded;
mMultiUserSwitch.setClickable(mExpanded || keyguardSwitcherAvailable);
mMultiUserSwitch.setKeyguardMode(keyguardSwitcherAvailable);
mSystemIconsSuperContainer.setClickable(mExpanded);
@@ -516,7 +519,7 @@ public class StatusBarHeaderView extends RelativeLayout implements View.OnClickL
}
public void setKeyguarUserSwitcher(KeyguardUserSwitcher keyguardUserSwitcher) {
mHasKeyguardUserSwitcher = true;
mKeyguardUserSwitcher = keyguardUserSwitcher;
mMultiUserSwitch.setKeyguardUserSwitcher(keyguardUserSwitcher);
}

View File

@@ -88,7 +88,7 @@ public class KeyguardUserSwitcher {
}
}
private void hide() {
public void hide() {
if (mUserSwitcher != null) {
// TODO: animate
mUserSwitcher.setVisibility(View.GONE);