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

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

Merge "Swap source and destination transfer objects."

parents 1658db2a 711f90a7
Loading
Loading
Loading
Loading
+24 −33
Original line number Diff line number Diff line
@@ -10,17 +10,19 @@ import static com.android.server.wm.WindowManagerService.LayoutFields.SET_WALLPA
import static com.android.server.wm.WindowManagerService.LayoutFields.SET_FORCE_HIDING_CHANGED;

import static com.android.server.wm.WindowManagerService.H.SET_DIM_PARAMETERS;
import static com.android.server.wm.WindowManagerService.H.UPDATE_ANIM_PARAMETERS;

import android.content.Context;
import android.os.SystemClock;
import android.util.Log;
import android.util.Slog;
import android.view.Choreographer;
import android.view.Surface;
import android.view.WindowManagerPolicy;
import android.view.animation.Animation;

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

import java.io.PrintWriter;
import java.util.ArrayList;
@@ -36,22 +38,10 @@ public class WindowAnimator {
    final Context mContext;
    final WindowManagerPolicy mPolicy;

    final Choreographer mChoreographer = Choreographer.getInstance();

    ArrayList<WindowStateAnimator> mWinAnimators = new ArrayList<WindowStateAnimator>();

    boolean mAnimating;

    static class LayoutToAnimatorParams {
        boolean mAnimationScheduled;
        ArrayList<WindowStateAnimator> mWinAnimators = new ArrayList<WindowStateAnimator>();
        WindowState mWallpaperTarget;
    }
    /** Params from WindowManagerService. Do not modify or read without first locking on
     * either WindowManagerService.mWindowMap or WindowManagerService.mAnimator.and then on
     * mLayoutToAnim */
    final LayoutToAnimatorParams mLayoutToAnim = new LayoutToAnimatorParams();

    final Runnable mAnimationRunnable;

    int mAdjResult;
@@ -95,6 +85,8 @@ public class WindowAnimator {

    WindowState mWallpaperTarget = null;

    final AnimatorToLayoutParams mAnimToLayout = new AnimatorToLayoutParams();

    WindowAnimator(final WindowManagerService service, final Context context,
            final WindowManagerPolicy policy) {
        mService = service;
@@ -118,9 +110,24 @@ public class WindowAnimator {
        mWindowAnimationBackgroundSurface = new DimSurface(mService.mFxSession);
    }

    /** Locked on mAnimToLayout */
    void updateAnimToLayoutLocked() {
        final AnimatorToLayoutParams animToLayout = mAnimToLayout;
        synchronized (animToLayout) {
            animToLayout.mBulkUpdateParams = mBulkUpdateParams;
            animToLayout.mPendingLayoutChanges = mPendingLayoutChanges;
            animToLayout.mWindowDetachedWallpaper = mWindowDetachedWallpaper;

            if (!animToLayout.mUpdateQueued) {
                animToLayout.mUpdateQueued = true;
                mService.mH.sendMessage(mService.mH.obtainMessage(UPDATE_ANIM_PARAMETERS));
            }
        }
    }

    /** Copy all WindowManagerService params into local params here. Locked on 'this'. */
    private void copyLayoutToAnimParamsLocked() {
        final LayoutToAnimatorParams layoutToAnim = mLayoutToAnim;
        final LayoutToAnimatorParams layoutToAnim = mService.mLayoutToAnim;
        synchronized(layoutToAnim) {
            layoutToAnim.mAnimationScheduled = false;

@@ -129,16 +136,6 @@ public class WindowAnimator {
        }
    }

    /** Note that Locked in this case is on mLayoutToAnim */
    void scheduleAnimationLocked() {
        final LayoutToAnimatorParams layoutToAnim = mLayoutToAnim;
        if (!layoutToAnim.mAnimationScheduled) {
            layoutToAnim.mAnimationScheduled = true;
            mChoreographer.postCallback(
                    Choreographer.CALLBACK_ANIMATION, mAnimationRunnable, null);
        }
    }

    void hideWallpapersLocked(final WindowState w) {
        if ((mService.mWallpaperTarget == w && mService.mLowerWallpaperTarget == null)
                || mService.mWallpaperTarget == null) {
@@ -544,18 +541,12 @@ public class WindowAnimator {
        }

        if (mBulkUpdateParams != 0 || mPendingLayoutChanges != 0) {
            final WindowManagerService.AnimatorToLayoutParams animToLayout = mService.mAnimToLayout;
            synchronized (animToLayout) {
                animToLayout.mBulkUpdateParams = mBulkUpdateParams;
                animToLayout.mPendingLayoutChanges = mPendingLayoutChanges;
                animToLayout.mWindowDetachedWallpaper = mWindowDetachedWallpaper;
                mService.setAnimatorParametersLocked();
            }
            updateAnimToLayoutLocked();
        }

        if (mAnimating) {
            synchronized (mLayoutToAnim) {
                scheduleAnimationLocked();
            synchronized (mService.mLayoutToAnim) {
                mService.scheduleAnimationLocked();
            }
        } else if (wasAnimating) {
            mService.requestTraversalLocked();
+41 −27
Original line number Diff line number Diff line
@@ -98,7 +98,7 @@ import android.util.DisplayMetrics;
import android.util.EventLog;
import android.util.FloatMath;
import android.util.Log;
import android.util.LogPrinter;
//import android.util.LogPrinter;
import android.util.Pair;
import android.util.Slog;
import android.util.SparseIntArray;
@@ -648,6 +648,7 @@ public class WindowManagerService extends IWindowManager.Stub
    }
    final LayoutFields mInnerFields = new LayoutFields();

    // TODO: Move this into WindowAnimator. For some reason it causes the H class to blow up.
    /* Parameters being passed from mAnimator into this.
     * Do not modify unless holding (mWindowMap or mAnimator) and mAnimToLayout in that order */
    static class AnimatorToLayoutParams {
@@ -656,7 +657,17 @@ public class WindowManagerService extends IWindowManager.Stub
        int mPendingLayoutChanges;
        WindowState mWindowDetachedWallpaper;
    }
    final AnimatorToLayoutParams mAnimToLayout = new AnimatorToLayoutParams();

    static class LayoutToAnimatorParams {
        boolean mAnimationScheduled;
        ArrayList<WindowStateAnimator> mWinAnimators = new ArrayList<WindowStateAnimator>();
        WindowState mWallpaperTarget;
        DimAnimator.Parameters mDimParams;
    }
    /** Params from WindowManagerService . Do not modify or read without first locking on
     * either WindowManagerService.mWindowMap or WindowManagerService.mAnimator.and then on
     * mLayoutToAnim */
    final LayoutToAnimatorParams mLayoutToAnim = new LayoutToAnimatorParams();

    /** The lowest wallpaper target with a detached wallpaper animation on it. */
    WindowState mWindowDetachedWallpaper = null;
@@ -3730,6 +3741,7 @@ public class WindowManagerService extends IWindowManager.Stub
        return ActivityInfo.SCREEN_ORIENTATION_UNSPECIFIED;
    }

    @Override
    public Configuration updateOrientationFromAppTokens(
            Configuration currentConfig, IBinder freezeThisOneIfNeeded) {
        if (!checkCallingPermission(android.Manifest.permission.MANAGE_APP_TOKENS,
@@ -5796,7 +5808,7 @@ public class WindowManagerService extends IWindowManager.Stub
                if (mAnimator.mScreenRotationAnimation.setRotation(rotation, mFxSession,
                        MAX_ANIMATION_DURATION, mTransitionAnimationScale,
                        mCurDisplayWidth, mCurDisplayHeight)) {
                    scheduleAnimationLocked();
                    updateLayoutToAnimationLocked();
                }
            }
            Surface.setOrientation(0, rotation);
@@ -7213,8 +7225,7 @@ public class WindowManagerService extends IWindowManager.Stub
                        synchronized (mAnimator) {
                            // Since we're holding both mWindowMap and mAnimator we don't need to
                            // hold mAnimator.mLayoutToAnim.
                            if (mAnimator.mAnimating ||
                                    mAnimator.mLayoutToAnim.mAnimationScheduled) {
                            if (mAnimator.mAnimating || mLayoutToAnim.mAnimationScheduled) {
                                // If we are animating, don't do the gc now but
                                // delay a bit so we don't interrupt the animation.
                                mH.sendMessageDelayed(mH.obtainMessage(H.FORCE_GC),
@@ -7332,10 +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) {
                        synchronized (mAnimToLayout) {
                            mAnimToLayout.mUpdateQueued = false;
                        final AnimatorToLayoutParams animToLayout = mAnimator.mAnimToLayout;
                        synchronized (animToLayout) {
                            animToLayout.mUpdateQueued = false;
                            boolean doRequest = false;
                            final int bulkUpdateParams = mAnimToLayout.mBulkUpdateParams;
                            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) {
@@ -7362,12 +7374,12 @@ public class WindowManagerService extends IWindowManager.Stub
                                mTurnOnScreen = true;
                            }

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

                            mWindowDetachedWallpaper = mAnimToLayout.mWindowDetachedWallpaper;
                            mWindowDetachedWallpaper = animToLayout.mWindowDetachedWallpaper;

                            if (doRequest) {
                                mH.sendEmptyMessage(CLEAR_PENDING_ACTIONS);
@@ -7812,7 +7824,7 @@ public class WindowManagerService extends IWindowManager.Stub
            }
            if (layerChanged && mAnimator.isDimming(winAnimator)) {
                // Force an animation pass just to update the mDimAnimator layer.
                scheduleAnimationLocked();
                updateLayoutToAnimationLocked();
            }
            if (DEBUG_LAYERS) Slog.v(TAG, "Assign layer " + w + ": "
                    + winAnimator.mAnimLayer);
@@ -9032,7 +9044,7 @@ public class WindowManagerService extends IWindowManager.Stub
        // be enabled, because the window obscured flags have changed.
        enableScreenIfNeededLocked();

        scheduleAnimationLocked();
        updateLayoutToAnimationLocked();

        if (DEBUG_WINDOW_TRACE) {
            Slog.e(TAG, "performLayoutAndPlaceSurfacesLockedInner exit: mPendingLayoutChanges="
@@ -9109,8 +9121,18 @@ public class WindowManagerService extends IWindowManager.Stub
        }
    }

    /** Note that Locked in this case is on mLayoutToAnim */
    void scheduleAnimationLocked() {
        final WindowAnimator.LayoutToAnimatorParams layoutToAnim = mAnimator.mLayoutToAnim;
        final LayoutToAnimatorParams layoutToAnim = mLayoutToAnim;
        if (!layoutToAnim.mAnimationScheduled) {
            layoutToAnim.mAnimationScheduled = true;
            mChoreographer.postCallback(
                    Choreographer.CALLBACK_ANIMATION, mAnimator.mAnimationRunnable, null);
        }
    }

    void updateLayoutToAnimationLocked() {
        final LayoutToAnimatorParams layoutToAnim = mLayoutToAnim;
        synchronized (layoutToAnim) {
            // Copy local params to transfer params.
            ArrayList<WindowStateAnimator> winAnimators = layoutToAnim.mWinAnimators;
@@ -9123,7 +9145,7 @@ public class WindowManagerService extends IWindowManager.Stub
                }
            }
            layoutToAnim.mWallpaperTarget = mWallpaperTarget;
            mAnimator.scheduleAnimationLocked();
            scheduleAnimationLocked();
        }
    }

@@ -9431,7 +9453,7 @@ public class WindowManagerService extends IWindowManager.Stub
            if (DEBUG_ORIENTATION) Slog.i(TAG, "**** Dismissing screen rotation animation");
            if (mAnimator.mScreenRotationAnimation.dismiss(mFxSession, MAX_ANIMATION_DURATION,
                    mTransitionAnimationScale, mCurDisplayWidth, mCurDisplayHeight)) {
                scheduleAnimationLocked();
                updateLayoutToAnimationLocked();
            } else {
                mAnimator.mScreenRotationAnimation.kill();
                mAnimator.mScreenRotationAnimation = null;
@@ -10209,12 +10231,4 @@ public class WindowManagerService extends IWindowManager.Stub
                    Integer.toHexString(pendingLayoutChanges));
        }
    }

    /** Locked on mAnimToLayout */
    void setAnimatorParametersLocked() {
        if (!mAnimToLayout.mUpdateQueued) {
            mAnimToLayout.mUpdateQueued = true;
            mH.sendMessage(mH.obtainMessage(H.UPDATE_ANIM_PARAMETERS));
        }
    }
}
+2 −2
Original line number Diff line number Diff line
@@ -907,7 +907,7 @@ final class WindowState implements WindowManagerPolicy.WindowState {
            mWinAnimator.applyAnimationLocked(WindowManagerPolicy.TRANSIT_ENTER, true);
        }
        if (requestAnim) {
            mService.scheduleAnimationLocked();
            mService.updateLayoutToAnimationLocked();
        }
        return true;
    }
@@ -950,7 +950,7 @@ final class WindowState implements WindowManagerPolicy.WindowState {
            }
        }
        if (requestAnim) {
            mService.scheduleAnimationLocked();
            mService.updateLayoutToAnimationLocked();
        }
        return true;
    }
+1 −1
Original line number Diff line number Diff line
@@ -1334,7 +1334,7 @@ class WindowStateAnimator {
            if (DEBUG_SURFACE_TRACE || DEBUG_ANIM)
                Slog.v(TAG, "performShowLocked: mDrawState=HAS_DRAWN in " + this);
            mDrawState = HAS_DRAWN;
            mService.scheduleAnimationLocked();
            mService.updateLayoutToAnimationLocked();

            int i = mWin.mChildWindows.size();
            while (i > 0) {