OSDN Git Service

Lock free app animations (1/n): Get rid of mAllAppWindowAnimators
authorJorim Jaggi <jjaggi@google.com>
Tue, 24 Oct 2017 16:05:26 +0000 (18:05 +0200)
committerJorim Jaggi <jjaggi@google.com>
Wed, 27 Dec 2017 14:05:57 +0000 (15:05 +0100)
Test: go/wm-smoke
Bug: 64674361
Change-Id: If3d888184c99f9c43dd0dcb5455158e1dbca81c2

services/core/java/com/android/server/wm/AppWindowAnimator.java
services/core/java/com/android/server/wm/AppWindowToken.java
services/core/java/com/android/server/wm/WindowSurfacePlacer.java

index 5c1d5b2..fbefd59 100644 (file)
@@ -100,9 +100,6 @@ public class AppWindowAnimator {
     private int mTransit;
     private int mTransitFlags;
 
-    /** WindowStateAnimator from mAppAnimator.allAppWindows as of last performLayout */
-    ArrayList<WindowStateAnimator> mAllAppWinAnimators = new ArrayList<>();
-
     /** True if the current animation was transferred from another AppWindowAnimator.
      *  See {@link #transferCurrentAnimation}*/
     boolean usingTransferredAnimation = false;
@@ -239,8 +236,6 @@ public class AppWindowAnimator {
             toAppAnimator.mTransit = mTransit;
         }
         if (transferWinAnimator != null) {
-            mAllAppWinAnimators.remove(transferWinAnimator);
-            toAppAnimator.mAllAppWinAnimators.add(transferWinAnimator);
             toAppAnimator.hasTransformation = transferWinAnimator.mAppAnimator.hasTransformation;
             if (toAppAnimator.hasTransformation) {
                 toAppAnimator.transformation.set(transferWinAnimator.mAppAnimator.transformation);
@@ -417,25 +412,17 @@ public class AppWindowAnimator {
 
         transformation.clear();
 
-        final int numAllAppWinAnimators = mAllAppWinAnimators.size();
-        for (int i = 0; i < numAllAppWinAnimators; i++) {
-            mAllAppWinAnimators.get(i).mWin.onExitAnimationDone();
-        }
+        mAppToken.forAllWindows(WindowState::onExitAnimationDone, false /* traverseTopToBottom */);
         mService.mAppTransition.notifyAppTransitionFinishedLocked(mAppToken.token);
         return false;
     }
 
     // This must be called while inside a transaction.
-    boolean showAllWindowsLocked() {
-        boolean isAnimating = false;
-        final int NW = mAllAppWinAnimators.size();
-        for (int i=0; i<NW; i++) {
-            WindowStateAnimator winAnimator = mAllAppWinAnimators.get(i);
-            if (DEBUG_VISIBILITY) Slog.v(TAG, "performing show on: " + winAnimator);
-            winAnimator.mWin.performShowLocked();
-            isAnimating |= winAnimator.isAnimationSet();
-        }
-        return isAnimating;
+    void showAllWindowsLocked() {
+        mAppToken.forAllWindows(windowState -> {
+            if (DEBUG_VISIBILITY) Slog.v(TAG, "performing show on: " + windowState);
+            windowState.performShowLocked();
+        }, false /* traverseTopToBottom */);
     }
 
     void dump(PrintWriter pw, String prefix) {
@@ -466,11 +453,6 @@ public class AppWindowAnimator {
             pw.print(prefix); pw.print("thumbnailTransformation=");
                     pw.println(thumbnailTransformation.toShortString());
         }
-        for (int i=0; i<mAllAppWinAnimators.size(); i++) {
-            WindowStateAnimator wanim = mAllAppWinAnimators.get(i);
-            pw.print(prefix); pw.print("App Win Anim #"); pw.print(i);
-                    pw.print(": "); pw.println(wanim);
-        }
     }
 
     void startProlongAnimation(int prolongType) {
index 94a0cb7..80c302b 100644 (file)
@@ -1160,16 +1160,6 @@ class AppWindowToken extends WindowToken implements WindowManagerService.AppFree
         return mChildren.size() == 1 && mChildren.get(0) == win;
     }
 
-    void setAllAppWinAnimators() {
-        final ArrayList<WindowStateAnimator> allAppWinAnimators = mAppAnimator.mAllAppWinAnimators;
-        allAppWinAnimators.clear();
-
-        final int windowsCount = mChildren.size();
-        for (int j = 0; j < windowsCount; j++) {
-            (mChildren.get(j)).addWinAnimatorToList(allAppWinAnimators);
-        }
-    }
-
     @Override
     void onAppTransitionDone() {
         sendingToBottom = false;
@@ -1230,7 +1220,7 @@ class AppWindowToken extends WindowToken implements WindowManagerService.AppFree
 
             // We can now show all of the drawn windows!
             if (!mService.mOpeningApps.contains(this)) {
-                mService.mAnimator.orAnimating(mAppAnimator.showAllWindowsLocked());
+                mAppAnimator.showAllWindowsLocked();
             }
         }
     }
index d8e7457..782e609 100644 (file)
@@ -421,13 +421,12 @@ class WindowSurfacePlacer {
             }
             wtoken.updateReportedVisibilityLocked();
             wtoken.waitingToShow = false;
-            wtoken.setAllAppWinAnimators();
 
             if (SHOW_LIGHT_TRANSACTIONS) Slog.i(TAG,
                     ">>> OPEN TRANSACTION handleAppTransitionReadyLocked()");
             mService.openSurfaceTransaction();
             try {
-                mService.mAnimator.orAnimating(appAnimator.showAllWindowsLocked());
+                appAnimator.showAllWindowsLocked();
             } finally {
                 mService.closeSurfaceTransaction("handleAppTransitionReadyLocked");
                 if (SHOW_LIGHT_TRANSACTIONS) Slog.i(TAG,
@@ -462,12 +461,8 @@ class WindowSurfacePlacer {
             appAnimator.setNullAnimation();
             // TODO: Do we need to add to mNoAnimationNotifyOnTransitionFinished like above if not
             //       animating?
-            wtoken.setAllAppWinAnimators();
             wtoken.setVisibility(animLp, false, transit, false, voiceInteraction);
             wtoken.updateReportedVisibilityLocked();
-            // setAllAppWinAnimators so the windows get onExitAnimationDone once the animation is
-            // done.
-            wtoken.setAllAppWinAnimators();
             // Force the allDrawn flag, because we want to start
             // this guy's animations regardless of whether it's
             // gotten drawn.
@@ -673,9 +668,8 @@ class WindowSurfacePlacer {
                 appAnimator.setNullAnimation();
                 mService.updateTokenInPlaceLocked(wtoken, transit);
                 wtoken.updateReportedVisibilityLocked();
-                wtoken.setAllAppWinAnimators();
                 mService.mAnimator.mAppWindowAnimating |= appAnimator.isAnimating();
-                mService.mAnimator.orAnimating(appAnimator.showAllWindowsLocked());
+                appAnimator.showAllWindowsLocked();
             }
         }
     }