diff options
5 files changed, 48 insertions, 4 deletions
diff --git a/packages/SystemUI/src/com/android/systemui/shade/NotificationPanelViewController.java b/packages/SystemUI/src/com/android/systemui/shade/NotificationPanelViewController.java index 267b147fa09a..badf9862cdfc 100644 --- a/packages/SystemUI/src/com/android/systemui/shade/NotificationPanelViewController.java +++ b/packages/SystemUI/src/com/android/systemui/shade/NotificationPanelViewController.java @@ -608,7 +608,7 @@ public final class NotificationPanelViewController implements ShadeSurface, Dump private int mLockscreenToDreamingTransitionTranslationY; private int mGoneToDreamingTransitionTranslationY; private int mLockscreenToOccludedTransitionTranslationY; - + private boolean mForceFlingAnimationForTest = false; private final Runnable mFlingCollapseRunnable = () -> fling(0, false /* expand */, mNextCollapseSpeedUpFactor, false /* expandBecauseOfFalsing */); private final Runnable mAnimateKeyguardBottomAreaInvisibleEndRunnable = @@ -1995,11 +1995,19 @@ public final class NotificationPanelViewController implements ShadeSurface, Dump } } }); + if (!mScrimController.isScreenOn() && !mForceFlingAnimationForTest) { + animator.setDuration(1); + } setAnimator(animator); animator.start(); } @VisibleForTesting + void setForceFlingAnimationForTest(boolean force) { + mForceFlingAnimationForTest = force; + } + + @VisibleForTesting void onFlingEnd(boolean cancelled) { mIsFlinging = false; // No overshoot when the animation ends diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/phone/ScrimController.java b/packages/SystemUI/src/com/android/systemui/statusbar/phone/ScrimController.java index c42a6dc5b6f2..a2f392385f80 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/phone/ScrimController.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/phone/ScrimController.java @@ -1594,6 +1594,10 @@ public class ScrimController implements ViewTreeObserver.OnPreDrawListener, Dump mScreenOn = false; } + public boolean isScreenOn() { + return mScreenOn; + } + public void setExpansionAffectsAlpha(boolean expansionAffectsAlpha) { mExpansionAffectsAlpha = expansionAffectsAlpha; } diff --git a/packages/SystemUI/tests/src/com/android/systemui/shade/NotificationPanelViewControllerTest.java b/packages/SystemUI/tests/src/com/android/systemui/shade/NotificationPanelViewControllerTest.java index 987e09c8776c..2b264cc889c2 100644 --- a/packages/SystemUI/tests/src/com/android/systemui/shade/NotificationPanelViewControllerTest.java +++ b/packages/SystemUI/tests/src/com/android/systemui/shade/NotificationPanelViewControllerTest.java @@ -346,6 +346,7 @@ public class NotificationPanelViewControllerTest extends NotificationPanelViewCo public void testOnTouchEvent_expansionResumesAfterBriefTouch() { mFalsingManager.setIsClassifierEnabled(true); mFalsingManager.setIsFalseTouch(false); + mNotificationPanelViewController.setForceFlingAnimationForTest(true); // Start shade collapse with swipe up onTouchEvent(MotionEvent.obtain(0L /* downTime */, 0L /* eventTime */, MotionEvent.ACTION_DOWN, 0f /* x */, 0f /* y */, @@ -374,6 +375,7 @@ public class NotificationPanelViewControllerTest extends NotificationPanelViewCo // fling should still be called after a touch that does not exceed touch slop assertThat(mNotificationPanelViewController.isClosing()).isTrue(); assertThat(mNotificationPanelViewController.isFlinging()).isTrue(); + mNotificationPanelViewController.setForceFlingAnimationForTest(false); } @Test diff --git a/services/core/java/com/android/server/media/projection/MediaProjectionManagerService.java b/services/core/java/com/android/server/media/projection/MediaProjectionManagerService.java index 38aac4648e34..d48fa895dd1e 100644 --- a/services/core/java/com/android/server/media/projection/MediaProjectionManagerService.java +++ b/services/core/java/com/android/server/media/projection/MediaProjectionManagerService.java @@ -940,9 +940,6 @@ public final class MediaProjectionManagerService extends SystemService throw new SecurityException("Media projections require a foreground service" + " of type ServiceInfo.FOREGROUND_SERVICE_TYPE_MEDIA_PROJECTION"); } - - mCallback = callback; - registerCallback(mCallback); try { mToken = callback.asBinder(); mDeathEater = new IBinder.DeathRecipient() { @@ -988,6 +985,11 @@ public final class MediaProjectionManagerService extends SystemService } } startProjectionLocked(this); + + // Register new callbacks after stop has been dispatched to previous session. + mCallback = callback; + registerCallback(mCallback); + // Mark this token as used when the app gets the MediaProjection instance. mCountStarts++; } diff --git a/services/tests/servicestests/src/com/android/server/media/projection/MediaProjectionManagerServiceTest.java b/services/tests/servicestests/src/com/android/server/media/projection/MediaProjectionManagerServiceTest.java index c42928eba85f..e75f9e097e93 100644 --- a/services/tests/servicestests/src/com/android/server/media/projection/MediaProjectionManagerServiceTest.java +++ b/services/tests/servicestests/src/com/android/server/media/projection/MediaProjectionManagerServiceTest.java @@ -73,6 +73,9 @@ import org.mockito.Captor; import org.mockito.Mock; import org.mockito.MockitoAnnotations; +import java.util.concurrent.CountDownLatch; +import java.util.concurrent.TimeUnit; + /** * Tests for the {@link MediaProjectionManagerService} class. * @@ -184,6 +187,29 @@ public class MediaProjectionManagerServiceTest { } @Test + public void testCreateProjection_priorProjectionGrant() throws + NameNotFoundException, InterruptedException { + // Create a first projection. + MediaProjectionManagerService.MediaProjection projection = startProjectionPreconditions(); + FakeIMediaProjectionCallback callback1 = new FakeIMediaProjectionCallback(); + projection.start(callback1); + + // Create a second projection. + MediaProjectionManagerService.MediaProjection secondProjection = + startProjectionPreconditions(); + FakeIMediaProjectionCallback callback2 = new FakeIMediaProjectionCallback(); + secondProjection.start(callback2); + + // Check that the first projection get stopped, but not the second projection. + final int timeout = 5; + boolean stoppedCallback1 = callback1.mLatch.await(timeout, TimeUnit.SECONDS); + boolean stoppedCallback2 = callback2.mLatch.await(timeout, TimeUnit.SECONDS); + + assertThat(stoppedCallback1).isTrue(); + assertThat(stoppedCallback2).isFalse(); + } + + @Test public void testCreateProjection_attemptReuse_noPriorProjectionGrant() throws NameNotFoundException { // Create a first projection. @@ -713,8 +739,10 @@ public class MediaProjectionManagerServiceTest { } private static class FakeIMediaProjectionCallback extends IMediaProjectionCallback.Stub { + CountDownLatch mLatch = new CountDownLatch(1); @Override public void onStop() throws RemoteException { + mLatch.countDown(); } @Override |