Loading packages/SystemUI/src/com/android/systemui/statusbar/phone/BiometricUnlockController.java +3 −1 Original line number Diff line number Diff line Loading @@ -414,7 +414,9 @@ public class BiometricUnlockController extends KeyguardUpdateMonitorCallback { return MODE_WAKE_AND_UNLOCK_FROM_DREAM; } if (mStatusBarKeyguardViewManager.isShowing()) { if (mStatusBarKeyguardViewManager.isBouncerShowing() && unlockingAllowed) { if ((mStatusBarKeyguardViewManager.isBouncerShowing() || mStatusBarKeyguardViewManager.isBouncerPartiallyVisible()) && unlockingAllowed) { return MODE_DISMISS_BOUNCER; } else if (unlockingAllowed) { return faceStayingOnKeyguard ? MODE_ONLY_WAKE : MODE_UNLOCK; Loading packages/SystemUI/src/com/android/systemui/statusbar/phone/KeyguardBouncer.java +5 −0 Original line number Diff line number Diff line Loading @@ -334,6 +334,11 @@ public class KeyguardBouncer { && mExpansion == EXPANSION_VISIBLE && !isAnimatingAway(); } public boolean isPartiallyVisible() { return (mShowingSoon || (mRoot != null && mRoot.getVisibility() == View.VISIBLE)) && mExpansion != EXPANSION_HIDDEN && !isAnimatingAway(); } /** * @return {@code true} when bouncer's pre-hide animation already started but isn't completely * hidden yet, {@code false} otherwise. Loading packages/SystemUI/src/com/android/systemui/statusbar/phone/NotificationPanelView.java +20 −4 Original line number Diff line number Diff line Loading @@ -152,9 +152,11 @@ public class NotificationPanelView extends PanelView implements private KeyguardUserSwitcher mKeyguardUserSwitcher; @VisibleForTesting protected KeyguardStatusBarView mKeyguardStatusBar; private ViewGroup mBigClockContainer; @VisibleForTesting protected ViewGroup mBigClockContainer; private QS mQs; private FrameLayout mQsFrame; @VisibleForTesting protected FrameLayout mQsFrame; @VisibleForTesting protected KeyguardStatusView mKeyguardStatusView; private View mQsNavbarScrim; Loading Loading @@ -266,6 +268,7 @@ public class NotificationPanelView extends PanelView implements private int mIndicationBottomPadding; private int mAmbientIndicationBottomPadding; private boolean mIsFullWidth; private boolean mBlockingExpansionForCurrentTouch; /** * Current dark amount that follows regular interpolation curve of animation. Loading Loading @@ -983,6 +986,11 @@ public class NotificationPanelView extends PanelView implements return false; } initDownStates(event); // Make sure the next touch won't the blocked after the current ends. if (event.getAction() == MotionEvent.ACTION_UP || event.getAction() == MotionEvent.ACTION_CANCEL) { mBlockingExpansionForCurrentTouch = false; } if (!mIsExpanding && mPulseExpansionHandler.onTouchEvent(event)) { // We're expanding all the other ones shouldn't get this anymore return true; Loading Loading @@ -1662,7 +1670,7 @@ public class NotificationPanelView extends PanelView implements if (!mQsExpansionEnabled || mCollapsedOnDown) { return false; } View header = mKeyguardShowing ? mKeyguardStatusBar : mQs.getHeader(); View header = mKeyguardShowing || mQs == null ? mKeyguardStatusBar : mQs.getHeader(); final boolean onHeader = x >= mQsFrame.getX() && x <= mQsFrame.getX() + mQsFrame.getWidth() && y >= header.getTop() && y <= header.getBottom(); Loading Loading @@ -2337,7 +2345,7 @@ public class NotificationPanelView extends PanelView implements @Override protected boolean isTrackingBlocked() { return mConflictingQsExpansionGesture && mQsExpanded; return mConflictingQsExpansionGesture && mQsExpanded || mBlockingExpansionForCurrentTouch; } public boolean isQsExpanded() { Loading Loading @@ -2937,6 +2945,14 @@ public class NotificationPanelView extends PanelView implements updateLockIcon(); } /** * Do not let the user drag the shade up and down for the current touch session. * This is necessary to avoid shade expansion while/after the bouncer is dismissed. */ public void blockExpansionForCurrentTouch() { mBlockingExpansionForCurrentTouch = mTracking; } @Override public void dump(FileDescriptor fd, PrintWriter pw, String[] args) { super.dump(fd, pw, args); Loading packages/SystemUI/src/com/android/systemui/statusbar/phone/StatusBarKeyguardViewManager.java +5 −0 Original line number Diff line number Diff line Loading @@ -419,6 +419,7 @@ public class StatusBarKeyguardViewManager implements RemoteInputController.Callb } else if (finishRunnable != null) { finishRunnable.run(); } mNotificationPanelView.blockExpansionForCurrentTouch(); } /** Loading Loading @@ -572,6 +573,10 @@ public class StatusBarKeyguardViewManager implements RemoteInputController.Callb return mBouncer.isShowing(); } public boolean isBouncerPartiallyVisible() { return mBouncer.isPartiallyVisible(); } public boolean isFullscreenBouncer() { return mBouncer.isFullscreenBouncer(); } Loading packages/SystemUI/tests/src/com/android/systemui/statusbar/phone/NotificationPanelViewTest.java +69 −0 Original line number Diff line number Diff line Loading @@ -16,6 +16,8 @@ package com.android.systemui.statusbar.phone; import static com.google.common.truth.Truth.assertThat; import static org.mockito.ArgumentMatchers.eq; import static org.mockito.Mockito.inOrder; import static org.mockito.Mockito.verify; Loading @@ -23,6 +25,8 @@ import static org.mockito.Mockito.when; import android.testing.AndroidTestingRunner; import android.testing.TestableLooper; import android.view.MotionEvent; import android.view.ViewGroup; import androidx.test.filters.SmallTest; Loading @@ -32,6 +36,7 @@ import com.android.systemui.SysuiTestCase; import com.android.systemui.plugins.statusbar.StatusBarStateController; import com.android.systemui.statusbar.AmbientPulseManager; import com.android.systemui.statusbar.NotificationLockscreenUserManager; import com.android.systemui.statusbar.NotificationShelf; import com.android.systemui.statusbar.PulseExpansionHandler; import com.android.systemui.statusbar.StatusBarStateControllerImpl; import com.android.systemui.statusbar.SysuiStatusBarStateController; Loading @@ -53,6 +58,8 @@ import org.mockito.MockitoAnnotations; @TestableLooper.RunWithLooper public class NotificationPanelViewTest extends SysuiTestCase { @Mock private StatusBar mStatusBar; @Mock private SysuiStatusBarStateController mStatusBarStateController; @Mock Loading @@ -62,12 +69,33 @@ public class NotificationPanelViewTest extends SysuiTestCase { @Mock private KeyguardBottomAreaView mKeyguardBottomArea; @Mock private KeyguardBottomAreaView mQsFrame; @Mock private ViewGroup mBigClockContainer; @Mock private ScrimController mScrimController; @Mock private NotificationIconAreaController mNotificationAreaController; @Mock private HeadsUpManagerPhone mHeadsUpManager; @Mock private NotificationShelf mNotificationShelf; @Mock private NotificationGroupManager mGroupManager; @Mock private KeyguardStatusBarView mKeyguardStatusBar; @Mock private HeadsUpTouchHelper.Callback mHeadsUpCallback; @Mock private PanelBar mPanelBar; private NotificationPanelView mNotificationPanelView; @Before public void setup() { MockitoAnnotations.initMocks(this); when(mNotificationStackScrollLayout.getHeight()).thenReturn(1000); when(mNotificationStackScrollLayout.getHeadsUpCallback()).thenReturn(mHeadsUpCallback); when(mHeadsUpCallback.getContext()).thenReturn(mContext); mDependency.injectTestDependency(StatusBarStateController.class, mStatusBarStateController); mDependency.injectMockDependency(ShadeController.class); Loading @@ -80,6 +108,8 @@ public class NotificationPanelViewTest extends SysuiTestCase { new StatusBarStateControllerImpl()); PulseExpansionHandler expansionHandler = new PulseExpansionHandler(mContext, coordinator); mNotificationPanelView = new TestableNotificationPanelView(coordinator, expansionHandler); mNotificationPanelView.setHeadsUpManager(mHeadsUpManager); mNotificationPanelView.setBar(mPanelBar); } @Test Loading @@ -105,6 +135,37 @@ public class NotificationPanelViewTest extends SysuiTestCase { verify(mNotificationStackScrollLayout).setShowDarkShelf(eq(false)); } @Test public void testSetExpandedHeight() { mNotificationPanelView.setExpandedHeight(200); assertThat((int) mNotificationPanelView.getExpandedHeight()).isEqualTo(200); } @Test public void testOnTouchEvent_expansionCanBeBlocked() { mNotificationPanelView.onTouchEvent(MotionEvent.obtain(0L /* downTime */, 0L /* eventTime */, MotionEvent.ACTION_DOWN, 0f /* x */, 0f /* y */, 0 /* metaState */)); mNotificationPanelView.onTouchEvent(MotionEvent.obtain(0L /* downTime */, 0L /* eventTime */, MotionEvent.ACTION_MOVE, 0f /* x */, 200f /* y */, 0 /* metaState */)); assertThat((int) mNotificationPanelView.getExpandedHeight()).isEqualTo(200); assertThat(mNotificationPanelView.isTrackingBlocked()).isFalse(); mNotificationPanelView.blockExpansionForCurrentTouch(); mNotificationPanelView.onTouchEvent(MotionEvent.obtain(0L /* downTime */, 0L /* eventTime */, MotionEvent.ACTION_MOVE, 0f /* x */, 300f /* y */, 0 /* metaState */)); // Expansion should not have changed because it was blocked assertThat((int) mNotificationPanelView.getExpandedHeight()).isEqualTo(200); assertThat(mNotificationPanelView.isTrackingBlocked()).isTrue(); mNotificationPanelView.onTouchEvent(MotionEvent.obtain(0L /* downTime */, 0L /* eventTime */, MotionEvent.ACTION_UP, 0f /* x */, 300f /* y */, 0 /* metaState */)); assertThat(mNotificationPanelView.isTrackingBlocked()).isFalse(); } private class TestableNotificationPanelView extends NotificationPanelView { TestableNotificationPanelView(NotificationWakeUpCoordinator coordinator, PulseExpansionHandler expansionHandler) { Loading @@ -116,6 +177,14 @@ public class NotificationPanelViewTest extends SysuiTestCase { mKeyguardStatusView = NotificationPanelViewTest.this.mKeyguardStatusView; mKeyguardStatusBar = NotificationPanelViewTest.this.mKeyguardStatusBar; mKeyguardBottomArea = NotificationPanelViewTest.this.mKeyguardBottomArea; mBigClockContainer = NotificationPanelViewTest.this.mBigClockContainer; mQsFrame = NotificationPanelViewTest.this.mQsFrame; initDependencies(NotificationPanelViewTest.this.mStatusBar, NotificationPanelViewTest.this.mGroupManager, NotificationPanelViewTest.this.mNotificationShelf, NotificationPanelViewTest.this.mHeadsUpManager, NotificationPanelViewTest.this.mNotificationAreaController, NotificationPanelViewTest.this.mScrimController); } } } Loading
packages/SystemUI/src/com/android/systemui/statusbar/phone/BiometricUnlockController.java +3 −1 Original line number Diff line number Diff line Loading @@ -414,7 +414,9 @@ public class BiometricUnlockController extends KeyguardUpdateMonitorCallback { return MODE_WAKE_AND_UNLOCK_FROM_DREAM; } if (mStatusBarKeyguardViewManager.isShowing()) { if (mStatusBarKeyguardViewManager.isBouncerShowing() && unlockingAllowed) { if ((mStatusBarKeyguardViewManager.isBouncerShowing() || mStatusBarKeyguardViewManager.isBouncerPartiallyVisible()) && unlockingAllowed) { return MODE_DISMISS_BOUNCER; } else if (unlockingAllowed) { return faceStayingOnKeyguard ? MODE_ONLY_WAKE : MODE_UNLOCK; Loading
packages/SystemUI/src/com/android/systemui/statusbar/phone/KeyguardBouncer.java +5 −0 Original line number Diff line number Diff line Loading @@ -334,6 +334,11 @@ public class KeyguardBouncer { && mExpansion == EXPANSION_VISIBLE && !isAnimatingAway(); } public boolean isPartiallyVisible() { return (mShowingSoon || (mRoot != null && mRoot.getVisibility() == View.VISIBLE)) && mExpansion != EXPANSION_HIDDEN && !isAnimatingAway(); } /** * @return {@code true} when bouncer's pre-hide animation already started but isn't completely * hidden yet, {@code false} otherwise. Loading
packages/SystemUI/src/com/android/systemui/statusbar/phone/NotificationPanelView.java +20 −4 Original line number Diff line number Diff line Loading @@ -152,9 +152,11 @@ public class NotificationPanelView extends PanelView implements private KeyguardUserSwitcher mKeyguardUserSwitcher; @VisibleForTesting protected KeyguardStatusBarView mKeyguardStatusBar; private ViewGroup mBigClockContainer; @VisibleForTesting protected ViewGroup mBigClockContainer; private QS mQs; private FrameLayout mQsFrame; @VisibleForTesting protected FrameLayout mQsFrame; @VisibleForTesting protected KeyguardStatusView mKeyguardStatusView; private View mQsNavbarScrim; Loading Loading @@ -266,6 +268,7 @@ public class NotificationPanelView extends PanelView implements private int mIndicationBottomPadding; private int mAmbientIndicationBottomPadding; private boolean mIsFullWidth; private boolean mBlockingExpansionForCurrentTouch; /** * Current dark amount that follows regular interpolation curve of animation. Loading Loading @@ -983,6 +986,11 @@ public class NotificationPanelView extends PanelView implements return false; } initDownStates(event); // Make sure the next touch won't the blocked after the current ends. if (event.getAction() == MotionEvent.ACTION_UP || event.getAction() == MotionEvent.ACTION_CANCEL) { mBlockingExpansionForCurrentTouch = false; } if (!mIsExpanding && mPulseExpansionHandler.onTouchEvent(event)) { // We're expanding all the other ones shouldn't get this anymore return true; Loading Loading @@ -1662,7 +1670,7 @@ public class NotificationPanelView extends PanelView implements if (!mQsExpansionEnabled || mCollapsedOnDown) { return false; } View header = mKeyguardShowing ? mKeyguardStatusBar : mQs.getHeader(); View header = mKeyguardShowing || mQs == null ? mKeyguardStatusBar : mQs.getHeader(); final boolean onHeader = x >= mQsFrame.getX() && x <= mQsFrame.getX() + mQsFrame.getWidth() && y >= header.getTop() && y <= header.getBottom(); Loading Loading @@ -2337,7 +2345,7 @@ public class NotificationPanelView extends PanelView implements @Override protected boolean isTrackingBlocked() { return mConflictingQsExpansionGesture && mQsExpanded; return mConflictingQsExpansionGesture && mQsExpanded || mBlockingExpansionForCurrentTouch; } public boolean isQsExpanded() { Loading Loading @@ -2937,6 +2945,14 @@ public class NotificationPanelView extends PanelView implements updateLockIcon(); } /** * Do not let the user drag the shade up and down for the current touch session. * This is necessary to avoid shade expansion while/after the bouncer is dismissed. */ public void blockExpansionForCurrentTouch() { mBlockingExpansionForCurrentTouch = mTracking; } @Override public void dump(FileDescriptor fd, PrintWriter pw, String[] args) { super.dump(fd, pw, args); Loading
packages/SystemUI/src/com/android/systemui/statusbar/phone/StatusBarKeyguardViewManager.java +5 −0 Original line number Diff line number Diff line Loading @@ -419,6 +419,7 @@ public class StatusBarKeyguardViewManager implements RemoteInputController.Callb } else if (finishRunnable != null) { finishRunnable.run(); } mNotificationPanelView.blockExpansionForCurrentTouch(); } /** Loading Loading @@ -572,6 +573,10 @@ public class StatusBarKeyguardViewManager implements RemoteInputController.Callb return mBouncer.isShowing(); } public boolean isBouncerPartiallyVisible() { return mBouncer.isPartiallyVisible(); } public boolean isFullscreenBouncer() { return mBouncer.isFullscreenBouncer(); } Loading
packages/SystemUI/tests/src/com/android/systemui/statusbar/phone/NotificationPanelViewTest.java +69 −0 Original line number Diff line number Diff line Loading @@ -16,6 +16,8 @@ package com.android.systemui.statusbar.phone; import static com.google.common.truth.Truth.assertThat; import static org.mockito.ArgumentMatchers.eq; import static org.mockito.Mockito.inOrder; import static org.mockito.Mockito.verify; Loading @@ -23,6 +25,8 @@ import static org.mockito.Mockito.when; import android.testing.AndroidTestingRunner; import android.testing.TestableLooper; import android.view.MotionEvent; import android.view.ViewGroup; import androidx.test.filters.SmallTest; Loading @@ -32,6 +36,7 @@ import com.android.systemui.SysuiTestCase; import com.android.systemui.plugins.statusbar.StatusBarStateController; import com.android.systemui.statusbar.AmbientPulseManager; import com.android.systemui.statusbar.NotificationLockscreenUserManager; import com.android.systemui.statusbar.NotificationShelf; import com.android.systemui.statusbar.PulseExpansionHandler; import com.android.systemui.statusbar.StatusBarStateControllerImpl; import com.android.systemui.statusbar.SysuiStatusBarStateController; Loading @@ -53,6 +58,8 @@ import org.mockito.MockitoAnnotations; @TestableLooper.RunWithLooper public class NotificationPanelViewTest extends SysuiTestCase { @Mock private StatusBar mStatusBar; @Mock private SysuiStatusBarStateController mStatusBarStateController; @Mock Loading @@ -62,12 +69,33 @@ public class NotificationPanelViewTest extends SysuiTestCase { @Mock private KeyguardBottomAreaView mKeyguardBottomArea; @Mock private KeyguardBottomAreaView mQsFrame; @Mock private ViewGroup mBigClockContainer; @Mock private ScrimController mScrimController; @Mock private NotificationIconAreaController mNotificationAreaController; @Mock private HeadsUpManagerPhone mHeadsUpManager; @Mock private NotificationShelf mNotificationShelf; @Mock private NotificationGroupManager mGroupManager; @Mock private KeyguardStatusBarView mKeyguardStatusBar; @Mock private HeadsUpTouchHelper.Callback mHeadsUpCallback; @Mock private PanelBar mPanelBar; private NotificationPanelView mNotificationPanelView; @Before public void setup() { MockitoAnnotations.initMocks(this); when(mNotificationStackScrollLayout.getHeight()).thenReturn(1000); when(mNotificationStackScrollLayout.getHeadsUpCallback()).thenReturn(mHeadsUpCallback); when(mHeadsUpCallback.getContext()).thenReturn(mContext); mDependency.injectTestDependency(StatusBarStateController.class, mStatusBarStateController); mDependency.injectMockDependency(ShadeController.class); Loading @@ -80,6 +108,8 @@ public class NotificationPanelViewTest extends SysuiTestCase { new StatusBarStateControllerImpl()); PulseExpansionHandler expansionHandler = new PulseExpansionHandler(mContext, coordinator); mNotificationPanelView = new TestableNotificationPanelView(coordinator, expansionHandler); mNotificationPanelView.setHeadsUpManager(mHeadsUpManager); mNotificationPanelView.setBar(mPanelBar); } @Test Loading @@ -105,6 +135,37 @@ public class NotificationPanelViewTest extends SysuiTestCase { verify(mNotificationStackScrollLayout).setShowDarkShelf(eq(false)); } @Test public void testSetExpandedHeight() { mNotificationPanelView.setExpandedHeight(200); assertThat((int) mNotificationPanelView.getExpandedHeight()).isEqualTo(200); } @Test public void testOnTouchEvent_expansionCanBeBlocked() { mNotificationPanelView.onTouchEvent(MotionEvent.obtain(0L /* downTime */, 0L /* eventTime */, MotionEvent.ACTION_DOWN, 0f /* x */, 0f /* y */, 0 /* metaState */)); mNotificationPanelView.onTouchEvent(MotionEvent.obtain(0L /* downTime */, 0L /* eventTime */, MotionEvent.ACTION_MOVE, 0f /* x */, 200f /* y */, 0 /* metaState */)); assertThat((int) mNotificationPanelView.getExpandedHeight()).isEqualTo(200); assertThat(mNotificationPanelView.isTrackingBlocked()).isFalse(); mNotificationPanelView.blockExpansionForCurrentTouch(); mNotificationPanelView.onTouchEvent(MotionEvent.obtain(0L /* downTime */, 0L /* eventTime */, MotionEvent.ACTION_MOVE, 0f /* x */, 300f /* y */, 0 /* metaState */)); // Expansion should not have changed because it was blocked assertThat((int) mNotificationPanelView.getExpandedHeight()).isEqualTo(200); assertThat(mNotificationPanelView.isTrackingBlocked()).isTrue(); mNotificationPanelView.onTouchEvent(MotionEvent.obtain(0L /* downTime */, 0L /* eventTime */, MotionEvent.ACTION_UP, 0f /* x */, 300f /* y */, 0 /* metaState */)); assertThat(mNotificationPanelView.isTrackingBlocked()).isFalse(); } private class TestableNotificationPanelView extends NotificationPanelView { TestableNotificationPanelView(NotificationWakeUpCoordinator coordinator, PulseExpansionHandler expansionHandler) { Loading @@ -116,6 +177,14 @@ public class NotificationPanelViewTest extends SysuiTestCase { mKeyguardStatusView = NotificationPanelViewTest.this.mKeyguardStatusView; mKeyguardStatusBar = NotificationPanelViewTest.this.mKeyguardStatusBar; mKeyguardBottomArea = NotificationPanelViewTest.this.mKeyguardBottomArea; mBigClockContainer = NotificationPanelViewTest.this.mBigClockContainer; mQsFrame = NotificationPanelViewTest.this.mQsFrame; initDependencies(NotificationPanelViewTest.this.mStatusBar, NotificationPanelViewTest.this.mGroupManager, NotificationPanelViewTest.this.mNotificationShelf, NotificationPanelViewTest.this.mHeadsUpManager, NotificationPanelViewTest.this.mNotificationAreaController, NotificationPanelViewTest.this.mScrimController); } } }