Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 322e4031 authored by Craig Mautner's avatar Craig Mautner
Browse files

Further isolate layout side from animation side.

- Use local AppWindowAnimators in WindowAnimator rather than
    using shared WindowManagerService objects.
- Use local WindowStateAnimators in AppWindowAnimator rather
    than use AppToken's WindowState objects.
- Remove redundant WindowManagerService parameter passed to
    AppWindowAnimator ctor.
- Keep from copying parameters from performLayout if the
    parameters haven't changed since the last copy.
- Link WindowStateAnimator to AppWindowAnimator to keep
    from going through WindowStateAnimator.mWin,
    WindowState.mAppToken and AppWindowToken.mAppAnimator.
- Converted attached WindowState in WindowStateAnimator to
    WindowStateAnimator to eliminate multiple conversions.

Change-Id: I5e35af88d8fdc1a7454984eaea91a1bc4f926978
parent fbf885b6
Loading
Loading
Loading
Loading
+11 −10
Original line number Diff line number Diff line
@@ -10,10 +10,8 @@ import android.view.animation.Animation;
import android.view.animation.Transformation;

import java.io.PrintWriter;
import java.util.ArrayList;

/**
 *
 */
public class AppWindowAnimator {
    static final String TAG = "AppWindowAnimator";

@@ -48,12 +46,15 @@ public class AppWindowAnimator {
    Animation thumbnailAnimation;
    final Transformation thumbnailTransformation = new Transformation();

    /** WindowStateAnimator from mAppAnimator.allAppWindows as of last performLayout */
    ArrayList<WindowStateAnimator> mAllAppWinAnimators;

    static final Animation sDummyAnimation = new DummyAnimation();

    public AppWindowAnimator(final WindowManagerService service, final AppWindowToken atoken) {
        mService = service;
    public AppWindowAnimator(final AppWindowToken atoken) {
        mAppToken = atoken;
        mAnimator = service.mAnimator;
        mService = atoken.service;
        mAnimator = atoken.mAnimator;
    }

    public void setAnimation(Animation anim, boolean initialized) {
@@ -255,9 +256,9 @@ public class AppWindowAnimator {

        transformation.clear();

        final int N = mAppToken.windows.size();
        final int N = mAllAppWinAnimators.size();
        for (int i=0; i<N; i++) {
            mAppToken.windows.get(i).mWinAnimator.finishExit();
            mAllAppWinAnimators.get(i).finishExit();
        }
        mAppToken.updateReportedVisibilityLocked();

@@ -266,9 +267,9 @@ public class AppWindowAnimator {

    boolean showAllWindowsLocked() {
        boolean isAnimating = false;
        final int NW = mAppToken.allAppWindows.size();
        final int NW = mAllAppWinAnimators.size();
        for (int i=0; i<NW; i++) {
            WindowStateAnimator winAnimator = mAppToken.allAppWindows.get(i).mWinAnimator;
            WindowStateAnimator winAnimator = mAllAppWinAnimators.get(i);
            if (WindowManagerService.DEBUG_VISIBILITY) Slog.v(TAG,
                    "performing show on: " + winAnimator);
            winAnimator.performShowLocked();
+1 −1
Original line number Diff line number Diff line
@@ -104,7 +104,7 @@ class AppWindowToken extends WindowToken {
        appToken = _token;
        mInputApplicationHandle = new InputApplicationHandle(this);
        mAnimator = service.mAnimator;
        mAppAnimator = new AppWindowAnimator(_service, this);
        mAppAnimator = new AppWindowAnimator(this);
    }

    void sendAppVisibilityToClients() {
+30 −15
Original line number Diff line number Diff line
@@ -21,6 +21,7 @@ import android.view.WindowManagerPolicy;
import android.view.animation.Animation;

import com.android.internal.policy.impl.PhoneWindowManager;
import com.android.server.wm.WindowManagerService.AppWindowAnimParams;
import com.android.server.wm.WindowManagerService.LayoutToAnimatorParams;

import java.io.PrintWriter;
@@ -87,6 +88,8 @@ public class WindowAnimator {
    WindowState mLowerWallpaperTarget = null;
    WindowState mUpperWallpaperTarget = null;

    ArrayList<AppWindowAnimator> mAppAnimators = new ArrayList<AppWindowAnimator>();

    ArrayList<WindowToken> mWallpaperTokens = new ArrayList<WindowToken>();

    /** Parameters being passed from this into mService. */
@@ -143,6 +146,11 @@ public class WindowAnimator {
        synchronized(layoutToAnim) {
            layoutToAnim.mAnimationScheduled = false;

            if (!layoutToAnim.mParamsModified) {
                return;
            }
            layoutToAnim.mParamsModified = false;

            if ((layoutToAnim.mChanges & LayoutToAnimatorParams.WALLPAPER_TOKENS_CHANGED) != 0) {
                layoutToAnim.mChanges &= ~LayoutToAnimatorParams.WALLPAPER_TOKENS_CHANGED;
                mWallpaperTokens = new ArrayList<WindowToken>(layoutToAnim.mWallpaperTokens);
@@ -173,6 +181,16 @@ public class WindowAnimator {
                    mDimParams = dimParams;
                }
            }

            mAppAnimators.clear();
            final int N = layoutToAnim.mAppWindowAnimParams.size();
            for (int i = 0; i < N; i++) {
                final AppWindowAnimParams params = layoutToAnim.mAppWindowAnimParams.get(i);
                AppWindowAnimator appAnimator = params.mAppAnimator;
                appAnimator.mAllAppWinAnimators =
                        new ArrayList<WindowStateAnimator>(params.mWinAnimators);
                mAppAnimators.add(appAnimator);
            }
        }
    }

@@ -197,11 +215,10 @@ public class WindowAnimator {
    }

    private void updateWindowsAppsAndRotationAnimationsLocked() {
        final ArrayList<AppWindowToken> appTokens = mService.mAnimatingAppTokens;
        int i;
        final int NAT = appTokens.size();
        final int NAT = mAppAnimators.size();
        for (i=0; i<NAT; i++) {
            final AppWindowAnimator appAnimator = appTokens.get(i).mAppAnimator;
            final AppWindowAnimator appAnimator = mAppAnimators.get(i);
            final boolean wasAnimating = appAnimator.animation != null
                    && appAnimator.animation != AppWindowAnimator.sDummyAnimation;
            if (appAnimator.stepAnimationLocked(mCurrentTime, mInnerDw, mInnerDh)) {
@@ -373,8 +390,7 @@ public class WindowAnimator {
                    }
                }
            }
            final AppWindowAnimator appAnimator =
                    atoken == null ? null : atoken.mAppAnimator;
            final AppWindowAnimator appAnimator = winAnimator.mAppAnimator;
            if (appAnimator != null && appAnimator.thumbnail != null) {
                if (appAnimator.thumbnailTransactionSeq != mAnimTransactionSequence) {
                    appAnimator.thumbnailTransactionSeq = mAnimTransactionSequence;
@@ -438,8 +454,7 @@ public class WindowAnimator {
            // If this window's app token is running a detached wallpaper
            // animation, make a note so we can ensure the wallpaper is
            // displayed behind it.
            final AppWindowAnimator appAnimator =
                    win.mAppToken == null ? null : win.mAppToken.mAppAnimator;
            final AppWindowAnimator appAnimator = winAnimator.mAppAnimator;
            if (appAnimator != null && appAnimator.animation != null
                    && appAnimator.animating) {
                if ((flags & FLAG_SHOW_WALLPAPER) != 0
@@ -495,18 +510,18 @@ public class WindowAnimator {
    private void testTokenMayBeDrawnLocked() {
        // See if any windows have been drawn, so they (and others
        // associated with them) can now be shown.
        final ArrayList<AppWindowToken> appTokens = mService.mAnimatingAppTokens;
        final int NT = appTokens.size();
        final int NT = mAppAnimators.size();
        for (int i=0; i<NT; i++) {
            AppWindowToken wtoken = appTokens.get(i);
            AppWindowAnimator appAnimator = mAppAnimators.get(i);
            AppWindowToken wtoken = appAnimator.mAppToken;
            final boolean allDrawn = wtoken.allDrawn;
            if (allDrawn != wtoken.mAppAnimator.allDrawn) {
                wtoken.mAppAnimator.allDrawn = allDrawn;
            if (allDrawn != appAnimator.allDrawn) {
                appAnimator.allDrawn = allDrawn;
                if (allDrawn) {
                    // The token has now changed state to having all
                    // windows shown...  what to do, what to do?
                    if (wtoken.mAppAnimator.freezingScreen) {
                        wtoken.mAppAnimator.showAllWindowsLocked();
                    if (appAnimator.freezingScreen) {
                        appAnimator.showAllWindowsLocked();
                        mService.unsetAppFreezingScreenLocked(wtoken, false, true);
                        if (WindowManagerService.DEBUG_ORIENTATION) Slog.i(TAG,
                                "Setting mOrientationChangeComplete=true because wtoken "
@@ -523,7 +538,7 @@ public class WindowAnimator {

                        // We can now show all of the drawn windows!
                        if (!mService.mOpeningApps.contains(wtoken)) {
                            mAnimating |= wtoken.mAppAnimator.showAllWindowsLocked();
                            mAnimating |= appAnimator.showAllWindowsLocked();
                        }
                    }
                }
+75 −45
Original line number Diff line number Diff line
@@ -648,7 +648,25 @@ public class WindowManagerService extends IWindowManager.Stub
    }
    final LayoutFields mInnerFields = new LayoutFields();

    static class AppWindowAnimParams {
        AppWindowAnimator mAppAnimator;
        ArrayList<WindowStateAnimator> mWinAnimators;

        public AppWindowAnimParams(final AppWindowAnimator appAnimator) {
            mAppAnimator = appAnimator;

            final AppWindowToken wtoken = appAnimator.mAppToken;
            mWinAnimators = new ArrayList<WindowStateAnimator>();
            final int N = wtoken.allAppWindows.size();
            for (int i = 0; i < N; i++) {
                mWinAnimators.add(wtoken.allAppWindows.get(i).mWinAnimator);
            }
        }
    }

    static class LayoutToAnimatorParams {
        boolean mParamsModified;

        static final long WALLPAPER_TOKENS_CHANGED = 1 << 0;
        long mChanges;

@@ -659,6 +677,7 @@ public class WindowManagerService extends IWindowManager.Stub
        WindowState mUpperWallpaperTarget;
        DimAnimator.Parameters mDimParams;
        ArrayList<WindowToken> mWallpaperTokens = new ArrayList<WindowToken>();
        ArrayList<AppWindowAnimParams> mAppWindowAnimParams = new ArrayList<AppWindowAnimParams>();
    }
    /** Params from WindowManagerService to WindowAnimator. Do not modify or read without first
     * locking on either mWindowMap or mAnimator and then on mLayoutToAnim */
@@ -7324,52 +7343,11 @@ public class WindowManagerService extends IWindowManager.Stub
                case UPDATE_ANIM_PARAMETERS: {
                    // Used to send multiple changes from the animation side to the layout side.
                    synchronized (mWindowMap) {
                        final WindowAnimator.AnimatorToLayoutParams animToLayout =
                                mAnimator.mAnimToLayout;
                        synchronized (animToLayout) {
                            animToLayout.mUpdateQueued = false;
                            boolean doRequest = false;
                            final int bulkUpdateParams = animToLayout.mBulkUpdateParams;
                            // TODO(cmautner): As the number of bits grows, use masks of bit groups to
                            //  eliminate unnecessary tests.
                            if ((bulkUpdateParams & LayoutFields.SET_UPDATE_ROTATION) != 0) {
                                mInnerFields.mUpdateRotation = true;
                                doRequest = true;
                            }
                            if ((bulkUpdateParams & LayoutFields.SET_WALLPAPER_MAY_CHANGE) != 0) {
                                mInnerFields.mWallpaperMayChange = true;
                                doRequest = true;
                            }
                            if ((bulkUpdateParams & LayoutFields.SET_FORCE_HIDING_CHANGED) != 0) {
                                mInnerFields.mWallpaperForceHidingChanged = true;
                                doRequest = true;
                            }
                            if ((bulkUpdateParams & LayoutFields.SET_ORIENTATION_CHANGE_COMPLETE)
                                    == 0) {
                                mInnerFields.mOrientationChangeComplete = false;
                            } else {
                                mInnerFields.mOrientationChangeComplete = true;
                                if (mWindowsFreezingScreen) {
                                    doRequest = true;
                                }
                            }
                            if ((bulkUpdateParams & LayoutFields.SET_TURN_ON_SCREEN) != 0) {
                                mTurnOnScreen = true;
                            }

                            mPendingLayoutChanges |= animToLayout.mPendingLayoutChanges;
                            if (mPendingLayoutChanges != 0) {
                                doRequest = true;
                            }

                            mWindowDetachedWallpaper = animToLayout.mWindowDetachedWallpaper;

                            if (doRequest) {
                        if (copyAnimToLayoutParamsLocked()) {
                            mH.sendEmptyMessage(CLEAR_PENDING_ACTIONS);
                            performLayoutAndPlaceSurfacesLocked();
                        }
                    }
                    }
                    break;
                }

@@ -9109,16 +9087,26 @@ public class WindowManagerService extends IWindowManager.Stub
            // Copy local params to transfer params.
            ArrayList<WindowStateAnimator> winAnimators = layoutToAnim.mWinAnimators;
            winAnimators.clear();
            final int N = mWindows.size();
            int N = mWindows.size();
            for (int i = 0; i < N; i++) {
                final WindowStateAnimator winAnimator = mWindows.get(i).mWinAnimator;
                if (winAnimator.mSurface != null) {
                    winAnimators.add(winAnimator);
                }
            }

            layoutToAnim.mWallpaperTarget = mWallpaperTarget;
            layoutToAnim.mLowerWallpaperTarget = mLowerWallpaperTarget;
            layoutToAnim.mUpperWallpaperTarget = mUpperWallpaperTarget;

            final ArrayList<AppWindowAnimParams> paramList = layoutToAnim.mAppWindowAnimParams;
            paramList.clear();
            N = mAnimatingAppTokens.size();
            for (int i = 0; i < N; i++) {
                paramList.add(new AppWindowAnimParams(mAnimatingAppTokens.get(i).mAppAnimator));
            }

            layoutToAnim.mParamsModified = true;
            scheduleAnimationLocked();
        }
    }
@@ -9146,6 +9134,48 @@ public class WindowManagerService extends IWindowManager.Stub
        setAnimDimParams(null);
    }

    private boolean copyAnimToLayoutParamsLocked() {
        boolean doRequest = false;
        final WindowAnimator.AnimatorToLayoutParams animToLayout = mAnimator.mAnimToLayout;
        synchronized (animToLayout) {
            animToLayout.mUpdateQueued = false;
            final int bulkUpdateParams = animToLayout.mBulkUpdateParams;
            // TODO(cmautner): As the number of bits grows, use masks of bit groups to
            //  eliminate unnecessary tests.
            if ((bulkUpdateParams & LayoutFields.SET_UPDATE_ROTATION) != 0) {
                mInnerFields.mUpdateRotation = true;
                doRequest = true;
            }
            if ((bulkUpdateParams & LayoutFields.SET_WALLPAPER_MAY_CHANGE) != 0) {
                mInnerFields.mWallpaperMayChange = true;
                doRequest = true;
            }
            if ((bulkUpdateParams & LayoutFields.SET_FORCE_HIDING_CHANGED) != 0) {
                mInnerFields.mWallpaperForceHidingChanged = true;
                doRequest = true;
            }
            if ((bulkUpdateParams & LayoutFields.SET_ORIENTATION_CHANGE_COMPLETE) == 0) {
                mInnerFields.mOrientationChangeComplete = false;
            } else {
                mInnerFields.mOrientationChangeComplete = true;
                if (mWindowsFreezingScreen) {
                    doRequest = true;
                }
            }
            if ((bulkUpdateParams & LayoutFields.SET_TURN_ON_SCREEN) != 0) {
                mTurnOnScreen = true;
            }

            mPendingLayoutChanges |= animToLayout.mPendingLayoutChanges;
            if (mPendingLayoutChanges != 0) {
                doRequest = true;
            }

            mWindowDetachedWallpaper = animToLayout.mWindowDetachedWallpaper;
        }
        return doRequest;
    }

    boolean reclaimSomeSurfaceMemoryLocked(WindowStateAnimator winAnimator, String operation,
                                           boolean secure) {
        final Surface surface = winAnimator.mSurface;
+3 −3
Original line number Diff line number Diff line
@@ -317,9 +317,6 @@ final class WindowState implements WindowManagerPolicy.WindowState {
            mIsFloatingLayer = mIsImWindow || mIsWallpaper;
        }

        mWinAnimator = new WindowStateAnimator(this);
        mWinAnimator.mAlpha = a.alpha;

        WindowState appWin = this;
        while (appWin.mAttachedWindow != null) {
            appWin = appWin.mAttachedWindow;
@@ -335,6 +332,9 @@ final class WindowState implements WindowManagerPolicy.WindowState {
        mRootToken = appToken;
        mAppToken = appToken.appWindowToken;

        mWinAnimator = new WindowStateAnimator(this);
        mWinAnimator.mAlpha = a.alpha;

        mRequestedWidth = 0;
        mRequestedHeight = 0;
        mLastRequestedWidth = 0;
Loading