diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/notification/ActivityLaunchAnimator.java b/packages/SystemUI/src/com/android/systemui/statusbar/notification/ActivityLaunchAnimator.java index 85560fefd9521..6aef6b407f376 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/notification/ActivityLaunchAnimator.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/notification/ActivityLaunchAnimator.java @@ -19,7 +19,6 @@ package com.android.systemui.statusbar.notification; import android.animation.Animator; import android.animation.AnimatorListenerAdapter; import android.animation.ValueAnimator; -import android.annotation.Nullable; import android.app.ActivityManager; import android.graphics.Matrix; import android.graphics.Rect; @@ -42,8 +41,6 @@ import com.android.systemui.statusbar.phone.CollapsedStatusBarFragment; import com.android.systemui.statusbar.phone.NotificationPanelViewController; import com.android.systemui.statusbar.phone.NotificationShadeWindowViewController; -import java.util.concurrent.Executor; - /** * A class that allows activities to be launched in a seamless way where the notification * transforms nicely into the starting window. @@ -62,7 +59,6 @@ public class ActivityLaunchAnimator { private final float mWindowCornerRadius; private final NotificationShadeWindowViewController mNotificationShadeWindowViewController; private final NotificationShadeDepthController mDepthController; - private final Executor mMainExecutor; private Callback mCallback; private final Runnable mTimeoutRunnable = () -> { setAnimationPending(false); @@ -77,14 +73,12 @@ public class ActivityLaunchAnimator { Callback callback, NotificationPanelViewController notificationPanel, NotificationShadeDepthController depthController, - NotificationListContainer container, - Executor mainExecutor) { + NotificationListContainer container) { mNotificationPanel = notificationPanel; mNotificationContainer = container; mDepthController = depthController; mNotificationShadeWindowViewController = notificationShadeWindowViewController; mCallback = callback; - mMainExecutor = mainExecutor; mWindowCornerRadius = ScreenDecorationsUtils .getWindowCornerRadius(mNotificationShadeWindowViewController.getView() .getResources()); @@ -97,7 +91,7 @@ public class ActivityLaunchAnimator { return null; } AnimationRunner animationRunner = new AnimationRunner( - (ExpandableNotificationRow) sourceView, mMainExecutor); + (ExpandableNotificationRow) sourceView); return new RemoteAnimationAdapter(animationRunner, ANIMATION_DURATION, ANIMATION_DURATION - 150 /* statusBarTransitionDelay */); } @@ -140,18 +134,17 @@ public class ActivityLaunchAnimator { class AnimationRunner extends IRemoteAnimationRunner.Stub { - private final ExpandAnimationParameters mParams = new ExpandAnimationParameters(); + private final ExpandableNotificationRow mSourceNotification; + private final ExpandAnimationParameters mParams; private final Rect mWindowCrop = new Rect(); private final float mNotificationCornerRadius; - private final Executor mMainExecutor; - @Nullable private ExpandableNotificationRow mSourceNotification; - @Nullable private SyncRtSurfaceTransactionApplier mSyncRtTransactionApplier; private float mCornerRadius; private boolean mIsFullScreenLaunch = true; + private final SyncRtSurfaceTransactionApplier mSyncRtTransactionApplier; - AnimationRunner(ExpandableNotificationRow sourceNotification, Executor mainExecutor) { - mMainExecutor = mainExecutor; - mSourceNotification = sourceNotification; + public AnimationRunner(ExpandableNotificationRow sourceNofitication) { + mSourceNotification = sourceNofitication; + mParams = new ExpandAnimationParameters(); mSyncRtTransactionApplier = new SyncRtSurfaceTransactionApplier(mSourceNotification); mNotificationCornerRadius = Math.max(mSourceNotification.getCurrentTopRoundness(), mSourceNotification.getCurrentBottomRoundness()); @@ -162,15 +155,13 @@ public class ActivityLaunchAnimator { RemoteAnimationTarget[] remoteAnimationWallpaperTargets, IRemoteAnimationFinishedCallback iRemoteAnimationFinishedCallback) throws RemoteException { - mMainExecutor.execute(() -> { + mSourceNotification.post(() -> { RemoteAnimationTarget primary = getPrimaryRemoteAnimationTarget( remoteAnimationTargets); - if (primary == null || mSourceNotification == null) { + if (primary == null) { setAnimationPending(false); invokeCallback(iRemoteAnimationFinishedCallback); mNotificationPanel.collapse(false /* delayed */, 1.0f /* speedUpFactor */); - mSourceNotification = null; - mSyncRtTransactionApplier = null; return; } @@ -181,14 +172,28 @@ public class ActivityLaunchAnimator { if (!mIsFullScreenLaunch) { mNotificationPanel.collapseWithDuration(ANIMATION_DURATION); } - mParams.initFrom(mSourceNotification); - final int targetWidth = primary.sourceContainerBounds.width(); - final int notificationHeight; - final int notificationWidth; - notificationHeight = mSourceNotification.getActualHeight() - - mSourceNotification.getClipBottomAmount(); - notificationWidth = mSourceNotification.getWidth(); ValueAnimator anim = ValueAnimator.ofFloat(0, 1); + mParams.startPosition = mSourceNotification.getLocationOnScreen(); + mParams.startTranslationZ = mSourceNotification.getTranslationZ(); + mParams.startClipTopAmount = mSourceNotification.getClipTopAmount(); + if (mSourceNotification.isChildInGroup()) { + int parentClip = mSourceNotification + .getNotificationParent().getClipTopAmount(); + mParams.parentStartClipTopAmount = parentClip; + // We need to calculate how much the child is clipped by the parent + // because children always have 0 clipTopAmount + if (parentClip != 0) { + float childClip = parentClip + - mSourceNotification.getTranslationY(); + if (childClip > 0.0f) { + mParams.startClipTopAmount = (int) Math.ceil(childClip); + } + } + } + int targetWidth = primary.sourceContainerBounds.width(); + int notificationHeight = mSourceNotification.getActualHeight() + - mSourceNotification.getClipBottomAmount(); + int notificationWidth = mSourceNotification.getWidth(); anim.setDuration(ANIMATION_DURATION); anim.setInterpolator(Interpolators.LINEAR); anim.addUpdateListener(new ValueAnimator.AnimatorUpdateListener() { @@ -226,11 +231,6 @@ public class ActivityLaunchAnimator { }); } - @Nullable - ExpandableNotificationRow getRow() { - return mSourceNotification; - } - private void invokeCallback(IRemoteAnimationFinishedCallback callback) { try { callback.onAnimationFinished(); @@ -253,9 +253,7 @@ public class ActivityLaunchAnimator { private void setExpandAnimationRunning(boolean running) { mNotificationPanel.setLaunchingNotification(running); - if (mSourceNotification != null) { - mSourceNotification.setExpandAnimationRunning(running); - } + mSourceNotification.setExpandAnimationRunning(running); mNotificationShadeWindowViewController.setExpandAnimationRunning(running); mNotificationContainer.setExpandingNotification(running ? mSourceNotification : null); mAnimationRunning = running; @@ -263,8 +261,6 @@ public class ActivityLaunchAnimator { mCallback.onExpandAnimationFinished(mIsFullScreenLaunch); applyParamsToNotification(null); applyParamsToNotificationShade(null); - mSourceNotification = null; - mSyncRtTransactionApplier = null; } } @@ -276,9 +272,7 @@ public class ActivityLaunchAnimator { } private void applyParamsToNotification(ExpandAnimationParameters params) { - if (mSourceNotification != null) { - mSourceNotification.applyExpandAnimationParams(params); - } + mSourceNotification.applyExpandAnimationParams(params); } private void applyParamsToWindow(RemoteAnimationTarget app) { @@ -293,18 +287,14 @@ public class ActivityLaunchAnimator { .withCornerRadius(mCornerRadius) .withVisibility(true) .build(); - if (mSyncRtTransactionApplier != null) { - mSyncRtTransactionApplier.scheduleApply(true /* earlyWakeup */, params); - } + mSyncRtTransactionApplier.scheduleApply(true /* earlyWakeup */, params); } @Override public void onAnimationCancelled() throws RemoteException { - mMainExecutor.execute(() -> { + mSourceNotification.post(() -> { setAnimationPending(false); mCallback.onLaunchAnimationCancelled(); - mSourceNotification = null; - mSyncRtTransactionApplier = null; }); } }; @@ -369,28 +359,6 @@ public class ActivityLaunchAnimator { public float getStartTranslationZ() { return startTranslationZ; } - - /** Initialize with data pulled from the row. */ - void initFrom(@Nullable ExpandableNotificationRow row) { - if (row == null) { - return; - } - startPosition = row.getLocationOnScreen(); - startTranslationZ = row.getTranslationZ(); - startClipTopAmount = row.getClipTopAmount(); - if (row.isChildInGroup()) { - int parentClip = row.getNotificationParent().getClipTopAmount(); - parentStartClipTopAmount = parentClip; - // We need to calculate how much the child is clipped by the parent - // because children always have 0 clipTopAmount - if (parentClip != 0) { - float childClip = parentClip - row.getTranslationY(); - if (childClip > 0.0f) { - startClipTopAmount = (int) Math.ceil(childClip); - } - } - } - } } public interface Callback { diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/phone/StatusBar.java b/packages/SystemUI/src/com/android/systemui/statusbar/phone/StatusBar.java index 19de191d97539..e0e52001e7402 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/phone/StatusBar.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/phone/StatusBar.java @@ -143,7 +143,6 @@ import com.android.systemui.bubbles.BubbleController; import com.android.systemui.charging.WirelessChargingAnimation; import com.android.systemui.classifier.FalsingLog; import com.android.systemui.colorextraction.SysuiColorExtractor; -import com.android.systemui.dagger.qualifiers.Main; import com.android.systemui.dagger.qualifiers.UiBackground; import com.android.systemui.fragments.ExtensionFragmentListener; import com.android.systemui.fragments.FragmentHostManager; @@ -511,7 +510,6 @@ public class StatusBar extends SystemUI implements DemoMode, private final ScrimController mScrimController; protected DozeScrimController mDozeScrimController; private final Executor mUiBgExecutor; - private final Executor mMainExecutor; protected boolean mDozing; @@ -670,7 +668,6 @@ public class StatusBar extends SystemUI implements DemoMode, DisplayMetrics displayMetrics, MetricsLogger metricsLogger, @UiBackground Executor uiBgExecutor, - @Main Executor mainExecutor, NotificationMediaManager notificationMediaManager, NotificationLockscreenUserManager lockScreenUserManager, NotificationRemoteInputManager remoteInputManager, @@ -751,7 +748,6 @@ public class StatusBar extends SystemUI implements DemoMode, mDisplayMetrics = displayMetrics; mMetricsLogger = metricsLogger; mUiBgExecutor = uiBgExecutor; - mMainExecutor = mainExecutor; mMediaManager = notificationMediaManager; mLockscreenUserManager = lockScreenUserManager; mRemoteInputManager = remoteInputManager; @@ -1279,8 +1275,7 @@ public class StatusBar extends SystemUI implements DemoMode, mActivityLaunchAnimator = new ActivityLaunchAnimator( mNotificationShadeWindowViewController, this, mNotificationPanelViewController, mNotificationShadeDepthControllerLazy.get(), - (NotificationListContainer) mStackScroller, - mMainExecutor); + (NotificationListContainer) mStackScroller); // TODO: inject this. mPresenter = new StatusBarNotificationPresenter(mContext, mNotificationPanelViewController, diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/phone/dagger/StatusBarPhoneModule.java b/packages/SystemUI/src/com/android/systemui/statusbar/phone/dagger/StatusBarPhoneModule.java index 62a3cf040d7ef..02e031217904d 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/phone/dagger/StatusBarPhoneModule.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/phone/dagger/StatusBarPhoneModule.java @@ -33,7 +33,6 @@ import com.android.systemui.assist.AssistManager; import com.android.systemui.broadcast.BroadcastDispatcher; import com.android.systemui.bubbles.BubbleController; import com.android.systemui.colorextraction.SysuiColorExtractor; -import com.android.systemui.dagger.qualifiers.Main; import com.android.systemui.dagger.qualifiers.UiBackground; import com.android.systemui.keyguard.DismissCallbackRegistry; import com.android.systemui.keyguard.KeyguardViewMediator; @@ -146,7 +145,6 @@ public interface StatusBarPhoneModule { DisplayMetrics displayMetrics, MetricsLogger metricsLogger, @UiBackground Executor uiBgExecutor, - @Main Executor mainExecutor, NotificationMediaManager notificationMediaManager, NotificationLockscreenUserManager lockScreenUserManager, NotificationRemoteInputManager remoteInputManager, @@ -226,7 +224,6 @@ public interface StatusBarPhoneModule { displayMetrics, metricsLogger, uiBgExecutor, - mainExecutor, notificationMediaManager, lockScreenUserManager, remoteInputManager, diff --git a/packages/SystemUI/tests/src/com/android/systemui/statusbar/notification/ActivityLaunchAnimatorTest.java b/packages/SystemUI/tests/src/com/android/systemui/statusbar/notification/ActivityLaunchAnimatorTest.java index 1654a54426352..cdef49d6c94d2 100644 --- a/packages/SystemUI/tests/src/com/android/systemui/statusbar/notification/ActivityLaunchAnimatorTest.java +++ b/packages/SystemUI/tests/src/com/android/systemui/statusbar/notification/ActivityLaunchAnimatorTest.java @@ -19,18 +19,14 @@ package com.android.systemui.statusbar.notification; import static org.mockito.ArgumentMatchers.any; import static org.mockito.ArgumentMatchers.anyLong; import static org.mockito.Mockito.doAnswer; -import static org.mockito.Mockito.mock; import static org.mockito.Mockito.verify; import static org.mockito.Mockito.when; import android.app.ActivityManager; -import android.os.RemoteException; import android.test.suitebuilder.annotation.SmallTest; import android.testing.AndroidTestingRunner; import android.testing.TestableLooper; -import android.view.IRemoteAnimationFinishedCallback; import android.view.RemoteAnimationAdapter; -import android.view.RemoteAnimationTarget; import android.view.View; import com.android.systemui.SysuiTestCase; @@ -40,8 +36,6 @@ import com.android.systemui.statusbar.notification.stack.NotificationListContain import com.android.systemui.statusbar.phone.NotificationPanelViewController; import com.android.systemui.statusbar.phone.NotificationShadeWindowView; import com.android.systemui.statusbar.phone.NotificationShadeWindowViewController; -import com.android.systemui.util.concurrency.FakeExecutor; -import com.android.systemui.util.time.FakeSystemClock; import org.junit.Assert; import org.junit.Before; @@ -74,11 +68,9 @@ public class ActivityLaunchAnimatorTest extends SysuiTestCase { private NotificationPanelViewController mNotificationPanelViewController; @Rule public MockitoRule rule = MockitoJUnit.rule(); - private FakeExecutor mExecutor; @Before public void setUp() throws Exception { - mExecutor = new FakeExecutor(new FakeSystemClock()); when(mNotificationShadeWindowViewController.getView()) .thenReturn(mNotificationShadeWindowView); when(mNotificationShadeWindowView.getResources()).thenReturn(mContext.getResources()); @@ -88,8 +80,8 @@ public class ActivityLaunchAnimatorTest extends SysuiTestCase { mCallback, mNotificationPanelViewController, mNotificationShadeDepthController, - mNotificationContainer, - mExecutor); + mNotificationContainer); + } @Test @@ -121,29 +113,6 @@ public class ActivityLaunchAnimatorTest extends SysuiTestCase { verify(mCallback).onExpandAnimationTimedOut(); } - @Test - public void testRowLinkBrokenOnAnimationStartFail() throws RemoteException { - ActivityLaunchAnimator.AnimationRunner runner = mLaunchAnimator.new AnimationRunner(mRow, - mExecutor); - // WHEN onAnimationStart with no valid remote target - runner.onAnimationStart(new RemoteAnimationTarget[0], new RemoteAnimationTarget[0], - mock(IRemoteAnimationFinishedCallback.class)); - mExecutor.runAllReady(); - // THEN the row is nulled out so that it won't be retained - Assert.assertTrue("The row should be null", runner.getRow() == null); - } - - @Test - public void testRowLinkBrokenOnAnimationCancelled() throws RemoteException { - ActivityLaunchAnimator.AnimationRunner runner = mLaunchAnimator.new AnimationRunner(mRow, - mExecutor); - // WHEN onAnimationCancelled - runner.onAnimationCancelled(); - mExecutor.runAllReady(); - // THEN the row is nulled out so that it won't be retained - Assert.assertTrue("The row should be null", runner.getRow() == null); - } - private void executePostsImmediately(View view) { doAnswer((i) -> { Runnable run = i.getArgument(0); diff --git a/packages/SystemUI/tests/src/com/android/systemui/statusbar/phone/StatusBarTest.java b/packages/SystemUI/tests/src/com/android/systemui/statusbar/phone/StatusBarTest.java index 27cbb03b4e9dc..5a08c9ca017b8 100644 --- a/packages/SystemUI/tests/src/com/android/systemui/statusbar/phone/StatusBarTest.java +++ b/packages/SystemUI/tests/src/com/android/systemui/statusbar/phone/StatusBarTest.java @@ -251,7 +251,6 @@ public class StatusBarTest extends SysuiTestCase { @Mock private Lazy mNotificationShadeDepthControllerLazy; private ShadeController mShadeController; private FakeExecutor mUiBgExecutor = new FakeExecutor(new FakeSystemClock()); - private FakeExecutor mMainExecutor = new FakeExecutor(new FakeSystemClock()); private InitController mInitController = new InitController(); @Before @@ -354,7 +353,6 @@ public class StatusBarTest extends SysuiTestCase { new DisplayMetrics(), mMetricsLogger, mUiBgExecutor, - mMainExecutor, mNotificationMediaManager, mLockscreenUserManager, mRemoteInputManager,