Loading packages/SystemUI/src/com/android/systemui/dreams/touch/BouncerSwipeTouchHandler.java +19 −1 Original line number Diff line number Diff line Loading @@ -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; Loading Loading @@ -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; Loading Loading @@ -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 Loading Loading @@ -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) Loading @@ -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; Loading Loading @@ -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; Loading packages/SystemUI/tests/src/com/android/systemui/dreams/touch/BouncerSwipeTouchHandlerTest.java +47 −1 Original line number Diff line number Diff line Loading @@ -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; Loading @@ -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; Loading @@ -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 Loading Loading @@ -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, Loading @@ -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); } /** Loading Loading @@ -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; Loading Loading
packages/SystemUI/src/com/android/systemui/dreams/touch/BouncerSwipeTouchHandler.java +19 −1 Original line number Diff line number Diff line Loading @@ -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; Loading Loading @@ -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; Loading Loading @@ -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 Loading Loading @@ -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) Loading @@ -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; Loading Loading @@ -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; Loading
packages/SystemUI/tests/src/com/android/systemui/dreams/touch/BouncerSwipeTouchHandlerTest.java +47 −1 Original line number Diff line number Diff line Loading @@ -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; Loading @@ -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; Loading @@ -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 Loading Loading @@ -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, Loading @@ -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); } /** Loading Loading @@ -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; Loading