diff --git a/packages/SystemUI/src/com/android/systemui/dreams/touch/BouncerSwipeTouchHandler.java b/packages/SystemUI/src/com/android/systemui/dreams/touch/BouncerSwipeTouchHandler.java index c6b6056baeaac04f24e7d6641907213df061911c..1cd37749e2c3424e6fee23e22207030513d1c11d 100644 --- a/packages/SystemUI/src/com/android/systemui/dreams/touch/BouncerSwipeTouchHandler.java +++ b/packages/SystemUI/src/com/android/systemui/dreams/touch/BouncerSwipeTouchHandler.java @@ -35,9 +35,11 @@ import androidx.annotation.VisibleForTesting; import com.android.internal.logging.UiEvent; import com.android.internal.logging.UiEventLogger; +import com.android.internal.widget.LockPatternUtils; +import com.android.systemui.bouncer.shared.constants.KeyguardBouncerConstants; import com.android.systemui.dreams.touch.scrim.ScrimController; import com.android.systemui.dreams.touch.scrim.ScrimManager; -import com.android.systemui.bouncer.shared.constants.KeyguardBouncerConstants; +import com.android.systemui.settings.UserTracker; import com.android.systemui.shade.ShadeExpansionChangeEvent; import com.android.systemui.statusbar.NotificationShadeWindowController; import com.android.systemui.statusbar.phone.CentralSurfaces; @@ -76,6 +78,8 @@ public class BouncerSwipeTouchHandler implements DreamTouchHandler { private static final String TAG = "BouncerSwipeTouchHandler"; private final NotificationShadeWindowController mNotificationShadeWindowController; + private final LockPatternUtils mLockPatternUtils; + private final UserTracker mUserTracker; private final float mBouncerZoneScreenPercentage; private final ScrimManager mScrimManager; @@ -151,6 +155,11 @@ public class BouncerSwipeTouchHandler implements DreamTouchHandler { return true; } + // Don't set expansion if the user doesn't have a pin/password set. + if (!mLockPatternUtils.isSecure(mUserTracker.getUserId())) { + return true; + } + // For consistency, we adopt the expansion definition found in the // PanelViewController. In this case, expansion refers to the view above the // bouncer. As that view's expansion shrinks, the bouncer appears. The bouncer @@ -204,6 +213,8 @@ public class BouncerSwipeTouchHandler implements DreamTouchHandler { NotificationShadeWindowController notificationShadeWindowController, ValueAnimatorCreator valueAnimatorCreator, VelocityTrackerFactory velocityTrackerFactory, + LockPatternUtils lockPatternUtils, + UserTracker userTracker, @Named(SWIPE_TO_BOUNCER_FLING_ANIMATION_UTILS_OPENING) FlingAnimationUtils flingAnimationUtils, @Named(SWIPE_TO_BOUNCER_FLING_ANIMATION_UTILS_CLOSING) @@ -213,6 +224,8 @@ public class BouncerSwipeTouchHandler implements DreamTouchHandler { mCentralSurfaces = centralSurfaces; mScrimManager = scrimManager; mNotificationShadeWindowController = notificationShadeWindowController; + mLockPatternUtils = lockPatternUtils; + mUserTracker = userTracker; mBouncerZoneScreenPercentage = swipeRegionPercentage; mFlingAnimationUtils = flingAnimationUtils; mFlingAnimationUtilsClosing = flingAnimationUtilsClosing; @@ -347,6 +360,11 @@ public class BouncerSwipeTouchHandler implements DreamTouchHandler { return; } + // Don't set expansion if the user doesn't have a pin/password set. + if (!mLockPatternUtils.isSecure(mUserTracker.getUserId())) { + return; + } + // The animation utils deal in pixel units, rather than expansion height. final float viewHeight = mTouchSession.getBounds().height(); final float currentHeight = viewHeight * mCurrentExpansion; diff --git a/packages/SystemUI/tests/src/com/android/systemui/dreams/touch/BouncerSwipeTouchHandlerTest.java b/packages/SystemUI/tests/src/com/android/systemui/dreams/touch/BouncerSwipeTouchHandlerTest.java index b82ab9115cf086479226a172448a2ba1e60093b3..3f9b198ee17dcdb4014a5ac50357be61ccf3cf85 100644 --- a/packages/SystemUI/tests/src/com/android/systemui/dreams/touch/BouncerSwipeTouchHandlerTest.java +++ b/packages/SystemUI/tests/src/com/android/systemui/dreams/touch/BouncerSwipeTouchHandlerTest.java @@ -28,6 +28,7 @@ import static org.mockito.Mockito.when; import android.animation.AnimatorListenerAdapter; import android.animation.ValueAnimator; +import android.content.pm.UserInfo; import android.graphics.Rect; import android.graphics.Region; import android.testing.AndroidTestingRunner; @@ -39,10 +40,12 @@ import android.view.VelocityTracker; import androidx.test.filters.SmallTest; import com.android.internal.logging.UiEventLogger; +import com.android.internal.widget.LockPatternUtils; import com.android.systemui.SysuiTestCase; +import com.android.systemui.bouncer.shared.constants.KeyguardBouncerConstants; import com.android.systemui.dreams.touch.scrim.ScrimController; import com.android.systemui.dreams.touch.scrim.ScrimManager; -import com.android.systemui.bouncer.shared.constants.KeyguardBouncerConstants; +import com.android.systemui.settings.FakeUserTracker; import com.android.systemui.shade.ShadeExpansionChangeEvent; import com.android.systemui.shared.system.InputChannelCompat; import com.android.systemui.statusbar.NotificationShadeWindowController; @@ -57,6 +60,7 @@ import org.mockito.Mock; import org.mockito.Mockito; import org.mockito.MockitoAnnotations; +import java.util.Collections; import java.util.Optional; @SmallTest @@ -100,21 +104,34 @@ public class BouncerSwipeTouchHandlerTest extends SysuiTestCase { @Mock UiEventLogger mUiEventLogger; + @Mock + LockPatternUtils mLockPatternUtils; + + FakeUserTracker mUserTracker; + private static final float TOUCH_REGION = .3f; private static final int SCREEN_WIDTH_PX = 1024; private static final int SCREEN_HEIGHT_PX = 100; private static final Rect SCREEN_BOUNDS = new Rect(0, 0, 1024, 100); + private static final UserInfo CURRENT_USER_INFO = new UserInfo( + 10, + /* name= */ "user10", + /* flags= */ 0 + ); @Before public void setup() { MockitoAnnotations.initMocks(this); + mUserTracker = new FakeUserTracker(); mTouchHandler = new BouncerSwipeTouchHandler( mScrimManager, Optional.of(mCentralSurfaces), mNotificationShadeWindowController, mValueAnimatorCreator, mVelocityTrackerFactory, + mLockPatternUtils, + mUserTracker, mFlingAnimationUtils, mFlingAnimationUtilsClosing, TOUCH_REGION, @@ -126,6 +143,9 @@ public class BouncerSwipeTouchHandlerTest extends SysuiTestCase { when(mVelocityTrackerFactory.obtain()).thenReturn(mVelocityTracker); when(mFlingAnimationUtils.getMinVelocityPxPerSecond()).thenReturn(Float.MAX_VALUE); when(mTouchSession.getBounds()).thenReturn(SCREEN_BOUNDS); + when(mLockPatternUtils.isSecure(CURRENT_USER_INFO.id)).thenReturn(true); + + mUserTracker.set(Collections.singletonList(CURRENT_USER_INFO), 0); } /** @@ -265,6 +285,32 @@ public class BouncerSwipeTouchHandlerTest extends SysuiTestCase { verifyScroll(.7f, Direction.DOWN, true, gestureListener); } + /** + * Makes sure the expansion amount is proportional to (1 - scroll). + */ + @Test + public void testSwipeUp_keyguardNotSecure_doesNotExpand() { + when(mLockPatternUtils.isSecure(CURRENT_USER_INFO.id)).thenReturn(false); + mTouchHandler.onSessionStart(mTouchSession); + ArgumentCaptor<GestureDetector.OnGestureListener> gestureListenerCaptor = + ArgumentCaptor.forClass(GestureDetector.OnGestureListener.class); + verify(mTouchSession).registerGestureListener(gestureListenerCaptor.capture()); + + final OnGestureListener gestureListener = gestureListenerCaptor.getValue(); + + final float distanceY = SCREEN_HEIGHT_PX * 0.3f; + final MotionEvent event1 = MotionEvent.obtain(0, 0, MotionEvent.ACTION_MOVE, + 0, SCREEN_HEIGHT_PX, 0); + final MotionEvent event2 = MotionEvent.obtain(0, 0, MotionEvent.ACTION_MOVE, + 0, SCREEN_HEIGHT_PX - distanceY, 0); + + reset(mScrimController); + assertThat(gestureListener.onScroll(event1, event2, 0, distanceY)) + .isTrue(); + // We should not expand since the keyguard is not secure + verify(mScrimController, never()).expand(any()); + } + private void verifyScroll(float percent, Direction direction, boolean isBouncerInitiallyShowing, GestureDetector.OnGestureListener gestureListener) { final float distanceY = SCREEN_HEIGHT_PX * percent;