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

Commit 1d961d46 authored by Craig Mautner's avatar Craig Mautner
Browse files

Better handle changing app transitions.

When we are in the middle of an app transition and need to change to a
new one we were not ending the old one in a clean state. Also,
wallpapers were defaulting to the wrong animation in certain
situations.

Remove ':' style iterators.

Fixes bug 6486708.

Change-Id: Ied17e8410486020295db380ff68df5dad08bc5cc
parent 6385ff51
Loading
Loading
Loading
Loading
+3 −6
Original line number Diff line number Diff line
@@ -79,12 +79,9 @@ public class AppWindowAnimator {
    }

    public void setDummyAnimation() {
        if (animation == null) {
            if (WindowManagerService.localLOGV) Slog.v(
                TAG, "Setting dummy animation in " + mAppToken);
        if (WindowManagerService.localLOGV) Slog.v(TAG, "Setting dummy animation in " + mAppToken);
        animation = sDummyAnimation;
        animInitialized = false;
        }
        hasTransformation = true;
        transformation.clear();
        transformation.setAlpha(mAppToken.reportedVisible ? 1 : 0);
+26 −5
Original line number Diff line number Diff line
@@ -1638,7 +1638,7 @@ public class WindowManagerService extends IWindowManager.Stub
                // it is of no interest to us.
                if (w.mAppToken.hidden && w.mAppToken.mAppAnimator.animation == null) {
                    if (DEBUG_WALLPAPER) Slog.v(TAG,
                            "Skipping not hidden or animating token: " + w);
                            "Skipping hidden and not animating token: " + w);
                    continue;
                }
            }
@@ -3864,6 +3864,7 @@ public class WindowManagerService extends IWindowManager.Stub
            if (DEBUG_APP_TRANSITIONS) Slog.v(
                    TAG, "Prepare app transition: transit=" + transit
                    + " mNextAppTransition=" + mNextAppTransition
                    + " alwaysKeepCurrent=" + alwaysKeepCurrent
                    + " Callers=" + Debug.getCallers(3));
            if (okToDisplay()) {
                if (mNextAppTransition == WindowManagerPolicy.TRANSIT_UNSET
@@ -3933,6 +3934,15 @@ public class WindowManagerService extends IWindowManager.Stub
        }
    }

    private void cancelWindowAnimations(final AppWindowToken wtoken) {
        for (int i = wtoken.windows.size() - 1; i >= 0; i--) {
            final WindowStateAnimator winAnimator = wtoken.windows.get(i).mWinAnimator;
            if (winAnimator.isAnimating()) {
                winAnimator.clearAnimation();
            }
        }
    }

    public void executeAppTransition() {
        if (!checkCallingPermission(android.Manifest.permission.MANAGE_APP_TOKENS,
                "executeAppTransition()")) {
@@ -3948,6 +3958,12 @@ public class WindowManagerService extends IWindowManager.Stub
            }
            if (mNextAppTransition != WindowManagerPolicy.TRANSIT_UNSET) {
                mAppTransitionReady = true;
                for (int i = mOpeningApps.size() - 1; i >= 0; i--) {
                    cancelWindowAnimations(mOpeningApps.get(i));
                }
                for (int i = mClosingApps.size() - 1; i >= 0; i--) {
                    cancelWindowAnimations(mClosingApps.get(i));
                }
                final long origId = Binder.clearCallingIdentity();
                performLayoutAndPlaceSurfacesLocked();
                Binder.restoreCallingIdentity(origId);
@@ -4295,6 +4311,7 @@ public class WindowManagerService extends IWindowManager.Stub

                if (DEBUG_APP_TRANSITIONS) Slog.v(
                        TAG, "Setting dummy animation on: " + wtoken);
                cancelWindowAnimations(wtoken);
                wtoken.mAppAnimator.setDummyAnimation();
                mOpeningApps.remove(wtoken);
                mClosingApps.remove(wtoken);
@@ -5321,7 +5338,8 @@ public class WindowManagerService extends IWindowManager.Stub
            // the background..)
            if (on) {
                boolean isVisible = false;
                for (WindowState ws : mWindows) {
                for (int i = mWindows.size() - 1; i >= 0; i--) {
                    final WindowState ws = mWindows.get(i);
                    if (ws.mSession.mPid == pid && ws.isVisibleLw()) {
                        isVisible = true;
                        break;
@@ -6439,7 +6457,10 @@ public class WindowManagerService extends IWindowManager.Stub

            int keyboardPresence = 0;
            int navigationPresence = 0;
            for (InputDevice device : mInputManager.getInputDevices()) {
            final InputDevice[] devices = mInputManager.getInputDevices();
            final int len = devices.length;
            for (int i = 0; i < len; i++) {
                InputDevice device = devices[i];
                if (!device.isVirtual()) {
                    final int sources = device.getSources();
                    final int presenceFlag = device.isExternal() ?
@@ -7949,7 +7970,7 @@ public class WindowManagerService extends IWindowManager.Stub
            for (i=0; i<NN && goodToGo; i++) {
                AppWindowToken wtoken = mOpeningApps.get(i);
                if (DEBUG_APP_TRANSITIONS) Slog.v(TAG,
                        "Check opening app" + wtoken + ": allDrawn="
                        "Check opening app=" + wtoken + ": allDrawn="
                        + wtoken.allDrawn + " startingDisplayed="
                        + wtoken.startingDisplayed + " startingMoved="
                        + wtoken.startingMoved);
@@ -8059,7 +8080,7 @@ public class WindowManagerService extends IWindowManager.Stub
                }
                if (DEBUG_APP_TRANSITIONS) Slog.v(TAG,
                        "New transit: " + transit);
            } else if (oldWallpaper != null) {
            } else if ((oldWallpaper != null) && (oldWallpaper != mWallpaperTarget)) {
                // We are transitioning from an activity with
                // a wallpaper to one without.
                transit = WindowManagerPolicy.TRANSIT_WALLPAPER_CLOSE;