Merge changes I3f3f10e8,I527e401b into sc-dev

* changes:
  Fade background when keyguard user switcher open
  Use correct keyguard margin clock position algorithm
This commit is contained in:
Peter Kalauskas
2021-02-24 18:41:29 +00:00
committed by Android (Google) Code Review
5 changed files with 102 additions and 141 deletions

View File

@@ -37,12 +37,6 @@
android:layout_height="match_parent"
android:layout_width="match_parent" />
<ViewStub
android:id="@+id/keyguard_user_switcher_stub"
android:layout="@layout/keyguard_user_switcher"
android:layout_height="match_parent"
android:layout_width="match_parent" />
<include
layout="@layout/keyguard_status_view"
android:visibility="gone" />
@@ -109,5 +103,11 @@
layout="@layout/keyguard_bottom_area"
android:visibility="gone" />
<ViewStub
android:id="@+id/keyguard_user_switcher_stub"
android:layout="@layout/keyguard_user_switcher"
android:layout_height="match_parent"
android:layout_width="match_parent" />
<include layout="@layout/status_bar_expanded_plugin_frame"/>
</com.android.systemui.statusbar.phone.NotificationPanelView>

View File

@@ -89,7 +89,8 @@ public class KeyguardClockPositionAlgorithm {
private int mNotificationStackHeight;
/**
* Minimum top margin to avoid overlap with status bar.
* Minimum top margin to avoid overlap with status bar, lock icon, or multi-user switcher
* avatar.
*/
private int mMinTopMargin;
@@ -186,15 +187,15 @@ public class KeyguardClockPositionAlgorithm {
/**
* Sets up algorithm values.
*/
public void setup(int statusBarMinHeight, int maxShadeBottom, int notificationStackHeight,
float panelExpansion, int parentHeight, int keyguardStatusHeight,
int userSwitchHeight, int clockPreferredY, int userSwitchPreferredY,
boolean hasCustomClock, boolean hasVisibleNotifs, float dark, float emptyDragAmount,
boolean bypassEnabled, int unlockedStackScrollerPadding, boolean showLockIcon,
float qsExpansion, int cutoutTopInset) {
mMinTopMargin = statusBarMinHeight + (showLockIcon
? mContainerTopPaddingWithLockIcon : mContainerTopPaddingWithoutLockIcon)
+ userSwitchHeight;
public void setup(int keyguardStatusBarHeaderHeight, int maxShadeBottom,
int notificationStackHeight, float panelExpansion, int parentHeight,
int keyguardStatusHeight, int userSwitchHeight, int clockPreferredY,
int userSwitchPreferredY, boolean hasCustomClock, boolean hasVisibleNotifs, float dark,
float emptyDragAmount, boolean bypassEnabled, int unlockedStackScrollerPadding,
boolean showLockIcon, float qsExpansion, int cutoutTopInset) {
mMinTopMargin = keyguardStatusBarHeaderHeight + Math.max(showLockIcon
? mContainerTopPaddingWithLockIcon : mContainerTopPaddingWithoutLockIcon,
userSwitchHeight);
mMaxShadeBottom = maxShadeBottom;
mNotificationStackHeight = notificationStackHeight;
mPanelExpansion = panelExpansion;

View File

@@ -287,21 +287,6 @@ public class NotificationPanelViewController extends PanelViewController {
}
};
final KeyguardUserSwitcherController.KeyguardUserSwitcherListener
mKeyguardUserSwitcherListener =
new KeyguardUserSwitcherController.KeyguardUserSwitcherListener() {
@Override
public void onKeyguardUserSwitcherChanged(boolean open) {
if (mKeyguardUserSwitcherController == null) {
updateUserSwitcherVisibility(false);
} else if (!mKeyguardUserSwitcherController.isSimpleUserSwitcher()) {
updateUserSwitcherVisibility(open
&& mKeyguardStateController.isShowing()
&& !mKeyguardStateController.isKeyguardFadingAway());
}
}
};
private final LayoutInflater mLayoutInflater;
private final PowerManager mPowerManager;
private final AccessibilityManager mAccessibilityManager;
@@ -329,7 +314,6 @@ public class NotificationPanelViewController extends PanelViewController {
private KeyguardAffordanceHelper mAffordanceHelper;
private KeyguardQsUserSwitchController mKeyguardQsUserSwitchController;
private boolean mKeyguardUserSwitcherIsShowing;
private KeyguardUserSwitcherController mKeyguardUserSwitcherController;
private KeyguardStatusBarView mKeyguardStatusBar;
private ViewGroup mBigClockContainer;
@@ -374,6 +358,7 @@ public class NotificationPanelViewController extends PanelViewController {
private ValueAnimator mQsExpansionAnimator;
private FlingAnimationUtils mFlingAnimationUtils;
private int mStatusBarMinHeight;
private int mStatusBarHeaderHeightKeyguard;
private int mNotificationsHeaderCollideDistance;
private float mEmptyDragAmount;
private float mDownX;
@@ -772,6 +757,8 @@ public class NotificationPanelViewController extends PanelViewController {
.setMaxLengthSeconds(0.4f).build();
mStatusBarMinHeight = mResources.getDimensionPixelSize(
com.android.internal.R.dimen.status_bar_height);
mStatusBarHeaderHeightKeyguard = mResources.getDimensionPixelSize(
R.dimen.status_bar_header_height_keyguard);
mQsPeekHeight = mResources.getDimensionPixelSize(R.dimen.qs_peek_height);
mNotificationsHeaderCollideDistance = mResources.getDimensionPixelSize(
R.dimen.header_notifications_collide_distance);
@@ -808,7 +795,6 @@ public class NotificationPanelViewController extends PanelViewController {
// Try to close the switcher so that callbacks are triggered if necessary.
// Otherwise, NPV can get into a state where some of the views are still hidden
mKeyguardUserSwitcherController.closeSwitcherIfOpenAndNotSimple(false);
mKeyguardUserSwitcherController.removeCallback();
}
mKeyguardQsUserSwitchController = null;
@@ -828,7 +814,6 @@ public class NotificationPanelViewController extends PanelViewController {
mKeyguardUserSwitcherComponentFactory.build(keyguardUserSwitcherView);
mKeyguardUserSwitcherController =
userSwitcherComponent.getKeyguardUserSwitcherController();
mKeyguardUserSwitcherController.setCallback(mKeyguardUserSwitcherListener);
mKeyguardUserSwitcherController.init();
mKeyguardStatusBar.setKeyguardUserSwitcherEnabled(true);
} else {
@@ -1069,7 +1054,7 @@ public class NotificationPanelViewController extends PanelViewController {
int totalHeight = mView.getHeight();
int bottomPadding = Math.max(mIndicationBottomPadding, mAmbientIndicationBottomPadding);
int clockPreferredY = mKeyguardStatusViewController.getClockPreferredY(totalHeight);
int userSwitcherPreferredY = mStatusBarMinHeight;
int userSwitcherPreferredY = mStatusBarHeaderHeightKeyguard;
boolean bypassEnabled = mKeyguardBypassController.getBypassEnabled();
final boolean hasVisibleNotifications = mNotificationStackScrollLayoutController
.getVisibleNotificationCount() != 0 || mMediaDataManager.hasActiveMedia();
@@ -1078,7 +1063,8 @@ public class NotificationPanelViewController extends PanelViewController {
? mKeyguardQsUserSwitchController.getUserIconHeight()
: (mKeyguardUserSwitcherController != null
? mKeyguardUserSwitcherController.getUserIconHeight() : 0);
mClockPositionAlgorithm.setup(mStatusBarMinHeight, totalHeight - bottomPadding,
mClockPositionAlgorithm.setup(mStatusBarHeaderHeightKeyguard,
totalHeight - bottomPadding,
mNotificationStackScrollLayoutController.getIntrinsicContentHeight(),
getExpandedFraction(),
totalHeight,
@@ -3523,34 +3509,6 @@ public class NotificationPanelViewController extends PanelViewController {
return false;
}
private void updateUserSwitcherVisibility(boolean open) {
// Do not update if previously called with the same state.
if (mKeyguardUserSwitcherIsShowing == open) {
return;
}
mKeyguardUserSwitcherIsShowing = open;
if (open) {
animateKeyguardStatusBarOut();
mKeyguardStatusViewController.setKeyguardStatusViewVisibility(
mBarState,
true /* keyguardFadingAway */,
true /* goingToFullShade */,
mBarState);
setKeyguardBottomAreaVisibility(mBarState, true);
mNotificationContainerParent.setVisibility(View.GONE);
} else {
animateKeyguardStatusBarIn(StackStateAnimator.ANIMATION_DURATION_STANDARD);
mKeyguardStatusViewController.setKeyguardStatusViewVisibility(
StatusBarState.KEYGUARD,
false,
false,
StatusBarState.SHADE_LOCKED);
setKeyguardBottomAreaVisibility(mBarState, false);
mNotificationContainerParent.setVisibility(View.VISIBLE);
}
}
private void updateDisabledUdfpsController() {
final boolean udfpsEnrolled = mAuthController.getUdfpsRegion() != null
&& mAuthController.isUdfpsEnrolled(

View File

@@ -19,9 +19,13 @@ package com.android.systemui.statusbar.policy;
import static com.android.systemui.statusbar.policy.UserSwitcherController.USER_SWITCH_DISABLED_ALPHA;
import static com.android.systemui.statusbar.policy.UserSwitcherController.USER_SWITCH_ENABLED_ALPHA;
import android.animation.Animator;
import android.animation.AnimatorListenerAdapter;
import android.animation.ObjectAnimator;
import android.content.Context;
import android.content.res.Resources;
import android.database.DataSetObserver;
import android.graphics.Rect;
import android.graphics.drawable.Drawable;
import android.graphics.drawable.LayerDrawable;
import android.os.UserHandle;
@@ -50,7 +54,6 @@ import com.android.systemui.statusbar.notification.stack.StackStateAnimator;
import com.android.systemui.statusbar.phone.DozeParameters;
import com.android.systemui.util.ViewController;
import java.lang.ref.WeakReference;
import java.util.ArrayList;
import javax.inject.Inject;
@@ -73,9 +76,10 @@ public class KeyguardUserSwitcherController extends ViewController<KeyguardUserS
private final KeyguardUserAdapter mAdapter;
private final KeyguardStateController mKeyguardStateController;
private final KeyguardUpdateMonitor mKeyguardUpdateMonitor;
private WeakReference<KeyguardUserSwitcherListener> mKeyguardUserSwitcherCallback;
protected final SysuiStatusBarStateController mStatusBarStateController;
private final KeyguardVisibilityHelper mKeyguardVisibilityHelper;
private ObjectAnimator mBgAnimator;
private final KeyguardUserSwitcherScrim mBackground;
// Child views of KeyguardUserSwitcherView
private KeyguardUserSwitcherListView mListView;
@@ -171,6 +175,7 @@ public class KeyguardUserSwitcherController extends ViewController<KeyguardUserS
mUserSwitcherController, this);
mKeyguardVisibilityHelper = new KeyguardVisibilityHelper(mView,
keyguardStateController, dozeParameters);
mBackground = new KeyguardUserSwitcherScrim(context);
}
@Override
@@ -204,6 +209,9 @@ public class KeyguardUserSwitcherController extends ViewController<KeyguardUserS
mKeyguardUpdateMonitor.registerCallback(mInfoCallback);
mStatusBarStateController.addCallback(mStatusBarStateListener);
mScreenLifecycle.addObserver(mScreenObserver);
mView.addOnLayoutChangeListener(mBackground);
mView.setBackground(mBackground);
mBackground.setAlpha(0);
}
@Override
@@ -217,6 +225,9 @@ public class KeyguardUserSwitcherController extends ViewController<KeyguardUserS
mKeyguardUpdateMonitor.removeCallback(mInfoCallback);
mStatusBarStateController.removeCallback(mStatusBarStateListener);
mScreenLifecycle.removeObserver(mScreenObserver);
mView.removeOnLayoutChangeListener(mBackground);
mView.setBackground(null);
mBackground.setAlpha(0);
}
/**
@@ -338,6 +349,13 @@ public class KeyguardUserSwitcherController extends ViewController<KeyguardUserS
animate);
PropertyAnimator.setProperty(mListView, AnimatableProperty.TRANSLATION_X, -Math.abs(x),
ANIMATION_PROPERTIES, animate);
Rect r = new Rect();
mListView.getDrawingRect(r);
mView.offsetDescendantRectToMyCoords(mListView, r);
mBackground.setGradientCenter(
(int) (mListView.getTranslationX() + r.left + r.width() / 2),
(int) (mListView.getTranslationY() + r.top + r.height() / 2));
}
/**
@@ -372,49 +390,52 @@ public class KeyguardUserSwitcherController extends ViewController<KeyguardUserS
}
/**
* Remove the callback if it exists.
*/
public void removeCallback() {
if (DEBUG) Log.d(TAG, "removeCallback");
mKeyguardUserSwitcherCallback = null;
}
/**
* Register to receive notifications about keyguard user switcher state
* (see {@link KeyguardUserSwitcherListener}.
*
* Only one callback can be used at a time.
*
* @param callback The callback to register
*/
public void setCallback(KeyguardUserSwitcherListener callback) {
if (DEBUG) Log.d(TAG, "setCallback");
mKeyguardUserSwitcherCallback = new WeakReference<>(callback);
}
/**
* If user switcher state changes, notifies all {@link KeyguardUserSwitcherListener}.
* Switcher state is updatd before animations finish.
* NOTE: switcher state is updated before animations finish.
*
* @param animate true to animate transition. The user switcher state (i.e.
* {@link #isUserSwitcherOpen()}) is updated before animation is finished.
*/
private void setUserSwitcherOpened(boolean open, boolean animate) {
boolean wasOpen = mUserSwitcherOpen;
if (DEBUG) {
Log.d(TAG, String.format("setUserSwitcherOpened: %b -> %b (animate=%b)", wasOpen,
open, animate));
Log.d(TAG,
String.format("setUserSwitcherOpened: %b -> %b (animate=%b)",
mUserSwitcherOpen, open, animate));
}
mUserSwitcherOpen = open;
if (mUserSwitcherOpen != wasOpen) {
notifyUserSwitcherStateChanged();
}
updateVisibilities(animate);
}
private void updateVisibilities(boolean animate) {
if (DEBUG) Log.d(TAG, String.format("updateVisibilities: animate=%b", animate));
mEndGuestButton.animate().cancel();
if (mBgAnimator != null) {
mBgAnimator.cancel();
}
if (mUserSwitcherOpen) {
mBgAnimator = ObjectAnimator.ofInt(mBackground, "alpha", 0, 255);
mBgAnimator.setDuration(400);
mBgAnimator.setInterpolator(Interpolators.ALPHA_IN);
mBgAnimator.addListener(new AnimatorListenerAdapter() {
@Override
public void onAnimationEnd(Animator animation) {
mBgAnimator = null;
}
});
mBgAnimator.start();
} else {
mBgAnimator = ObjectAnimator.ofInt(mBackground, "alpha", 255, 0);
mBgAnimator.setDuration(400);
mBgAnimator.setInterpolator(Interpolators.ALPHA_OUT);
mBgAnimator.addListener(new AnimatorListenerAdapter() {
@Override
public void onAnimationEnd(Animator animation) {
mBgAnimator = null;
}
});
mBgAnimator.start();
}
if (mUserSwitcherOpen && mCurrentUserIsGuest) {
// Show the "End guest session" button
mEndGuestButton.setVisibility(View.VISIBLE);
@@ -459,34 +480,6 @@ public class KeyguardUserSwitcherController extends ViewController<KeyguardUserS
return mUserSwitcherOpen;
}
private void notifyUserSwitcherStateChanged() {
if (DEBUG) {
Log.d(TAG, String.format("notifyUserSwitcherStateChanged: mUserSwitcherOpen=%b",
mUserSwitcherOpen));
}
if (mKeyguardUserSwitcherCallback != null) {
KeyguardUserSwitcherListener cb = mKeyguardUserSwitcherCallback.get();
if (cb != null) {
cb.onKeyguardUserSwitcherChanged(mUserSwitcherOpen);
}
}
}
/**
* Callback for keyguard user switcher state information
*/
public interface KeyguardUserSwitcherListener {
/**
* Called when the keyguard enters or leaves user switcher mode. This will be called
* before the animations are finished.
*
* @param open if true, keyguard is showing the user switcher or transitioning from/to user
* switcher mode.
*/
void onKeyguardUserSwitcherChanged(boolean open);
}
static class KeyguardUserAdapter extends
UserSwitcherController.BaseUserAdapter implements View.OnClickListener {

View File

@@ -26,7 +26,6 @@ import android.graphics.RadialGradient;
import android.graphics.Rect;
import android.graphics.Shader;
import android.graphics.drawable.Drawable;
import android.util.LayoutDirection;
import android.view.View;
import com.android.systemui.R;
@@ -38,13 +37,14 @@ public class KeyguardUserSwitcherScrim extends Drawable
implements View.OnLayoutChangeListener {
private static final float OUTER_EXTENT = 2.5f;
private static final float INNER_EXTENT = 0.75f;
private static final float INNER_EXTENT = 0.25f;
private int mDarkColor;
private int mTop;
private int mAlpha = 255;
private Paint mRadialGradientPaint = new Paint();
private int mLayoutWidth;
private int mCircleX;
private int mCircleY;
private int mSize;
public KeyguardUserSwitcherScrim(Context context) {
mDarkColor = context.getColor(
@@ -53,14 +53,11 @@ public class KeyguardUserSwitcherScrim extends Drawable
@Override
public void draw(Canvas canvas) {
boolean isLtr = getLayoutDirection() == LayoutDirection.LTR;
if (mAlpha == 0) {
return;
}
Rect bounds = getBounds();
float width = bounds.width() * OUTER_EXTENT;
float height = (mTop + bounds.height()) * OUTER_EXTENT;
canvas.translate(0, -mTop);
canvas.scale(1, height / width);
canvas.drawRect(isLtr ? bounds.right - width : 0, 0,
isLtr ? bounds.right : bounds.left + width, width, mRadialGradientPaint);
canvas.drawRect(bounds.left, bounds.top, bounds.right, bounds.bottom, mRadialGradientPaint);
}
@Override
@@ -88,24 +85,36 @@ public class KeyguardUserSwitcherScrim extends Drawable
public void onLayoutChange(View v, int left, int top, int right, int bottom, int oldLeft,
int oldTop, int oldRight, int oldBottom) {
if (left != oldLeft || top != oldTop || right != oldRight || bottom != oldBottom) {
mLayoutWidth = right - left;
mTop = top;
int width = right - left;
int height = bottom - top;
mSize = Math.max(width, height);
updatePaint();
}
}
private void updatePaint() {
if (mLayoutWidth == 0) {
if (mSize == 0) {
return;
}
float radius = mLayoutWidth * OUTER_EXTENT;
boolean isLtr = getLayoutDirection() == LayoutDirection.LTR;
float outerRadius = mSize * OUTER_EXTENT;
mRadialGradientPaint.setShader(
new RadialGradient(isLtr ? mLayoutWidth : 0, 0, radius,
new RadialGradient(mCircleX, mCircleY, outerRadius,
new int[] { Color.argb(
(int) (Color.alpha(mDarkColor) * mAlpha / 255f), 0, 0, 0),
Color.TRANSPARENT },
new float[] { Math.max(0f, mLayoutWidth * INNER_EXTENT / radius), 1f },
new float[] { Math.max(0f, INNER_EXTENT / OUTER_EXTENT), 1f },
Shader.TileMode.CLAMP));
}
/**
* Sets the center of the radial gradient used as a background
*
* @param x
* @param y
*/
public void setGradientCenter(int x, int y) {
mCircleX = x;
mCircleY = y;
updatePaint();
}
}