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

Commit 052db7c2 authored by Craig Mautner's avatar Craig Mautner Committed by Android (Google) Code Review
Browse files

Merge "Further isolate layout side from animation side."

parents 489041dd 322e4031
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