Revert "Break strong ref to ExpandableNotificationRow"

Revert "Pass main executor to ActivityLaunchAnimator"

Revert submission 11213348-launch-animation-leak

Reason for revert: Regression b/156840927
Reverted Changes:
Id43847e3d:Break strong ref to ExpandableNotificationRow
I57ffe83b7:Pass main executor to ActivityLaunchAnimator
I5bddc38ac:Pass main executor to ActivityLaunchAnimator
Fixes: b/156840927

Change-Id: Icda11a53c0bbf826037af0736c65c0e57e8ce2e6
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 85560fe..6aef6b4 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 @@
 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.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 @@
     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 @@
             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 @@
             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 @@
 
     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 @@
                 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 @@
                 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 @@
             });
         }
 
-        @Nullable
-        ExpandableNotificationRow getRow() {
-            return mSourceNotification;
-        }
-
         private void invokeCallback(IRemoteAnimationFinishedCallback callback) {
             try {
                 callback.onAnimationFinished();
@@ -253,9 +253,7 @@
 
         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 @@
                 mCallback.onExpandAnimationFinished(mIsFullScreenLaunch);
                 applyParamsToNotification(null);
                 applyParamsToNotificationShade(null);
-                mSourceNotification = null;
-                mSyncRtTransactionApplier = null;
             }
 
         }
@@ -276,9 +272,7 @@
         }
 
         private void applyParamsToNotification(ExpandAnimationParameters params) {
-            if (mSourceNotification != null) {
-                mSourceNotification.applyExpandAnimationParams(params);
-            }
+            mSourceNotification.applyExpandAnimationParams(params);
         }
 
         private void applyParamsToWindow(RemoteAnimationTarget app) {
@@ -293,18 +287,14 @@
                     .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 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 19de191..e0e52001 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.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 @@
     private final ScrimController mScrimController;
     protected DozeScrimController mDozeScrimController;
     private final Executor mUiBgExecutor;
-    private final Executor mMainExecutor;
 
     protected boolean mDozing;
 
@@ -670,7 +668,6 @@
             DisplayMetrics displayMetrics,
             MetricsLogger metricsLogger,
             @UiBackground Executor uiBgExecutor,
-            @Main Executor mainExecutor,
             NotificationMediaManager notificationMediaManager,
             NotificationLockscreenUserManager lockScreenUserManager,
             NotificationRemoteInputManager remoteInputManager,
@@ -751,7 +748,6 @@
         mDisplayMetrics = displayMetrics;
         mMetricsLogger = metricsLogger;
         mUiBgExecutor = uiBgExecutor;
-        mMainExecutor = mainExecutor;
         mMediaManager = notificationMediaManager;
         mLockscreenUserManager = lockScreenUserManager;
         mRemoteInputManager = remoteInputManager;
@@ -1279,8 +1275,7 @@
         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 62a3cf0..02e0312 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.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 @@
             DisplayMetrics displayMetrics,
             MetricsLogger metricsLogger,
             @UiBackground Executor uiBgExecutor,
-            @Main Executor mainExecutor,
             NotificationMediaManager notificationMediaManager,
             NotificationLockscreenUserManager lockScreenUserManager,
             NotificationRemoteInputManager remoteInputManager,
@@ -226,7 +224,6 @@
                 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 1654a5442..cdef49d 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 @@
 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.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 @@
     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 @@
                 mCallback,
                 mNotificationPanelViewController,
                 mNotificationShadeDepthController,
-                mNotificationContainer,
-                mExecutor);
+                mNotificationContainer);
+
     }
 
     @Test
@@ -121,29 +113,6 @@
         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 27cbb03..5a08c9c 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 @@
     @Mock private Lazy<NotificationShadeDepthController> 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 @@
                 new DisplayMetrics(),
                 mMetricsLogger,
                 mUiBgExecutor,
-                mMainExecutor,
                 mNotificationMediaManager,
                 mLockscreenUserManager,
                 mRemoteInputManager,