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

Commit c2081458 authored by Evan Rosky's avatar Evan Rosky
Browse files

Use an isolated token to represent shell transitions

The Transition object itself used to be the token; however,
this means binder can hold onto it and prevent GC. This is
also more consistent with how WM handles tokens in general

Bug: 258913831
Test: atest TransitionTests
Change-Id: Ibe04cca04dd517629bd2fec707224574293a1bc2
parent 23a1d2e3
Loading
Loading
Loading
Loading
+1 −1
Original line number Diff line number Diff line
@@ -3353,7 +3353,7 @@ class DisplayContent extends RootDisplayArea implements WindowManagerPolicy.Disp
                    }
                }
                mWmService.mLatencyTracker.onActionStart(ACTION_ROTATE_SCREEN);
                controller.mTransitionMetricsReporter.associate(t,
                controller.mTransitionMetricsReporter.associate(t.getToken(),
                        startTime -> mWmService.mLatencyTracker.onActionEnd(ACTION_ROTATE_SCREEN));
                startAsyncRotation(false /* shouldDebounce */);
            }
+35 −7
Original line number Diff line number Diff line
@@ -98,6 +98,7 @@ import com.android.server.wm.utils.RotationAnimationUtils;

import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.ref.WeakReference;
import java.util.ArrayList;
import java.util.List;
import java.util.Objects;
@@ -107,7 +108,7 @@ import java.util.function.Predicate;
 * Represents a logical transition.
 * @see TransitionController
 */
class Transition extends Binder implements BLASTSyncEngine.TransactionReadyListener {
class Transition implements BLASTSyncEngine.TransactionReadyListener {
    private static final String TAG = "Transition";
    private static final String TRACE_NAME_PLAY_TRANSITION = "PlayTransition";

@@ -158,6 +159,7 @@ class Transition extends Binder implements BLASTSyncEngine.TransactionReadyListe
    private @TransitionFlags int mFlags;
    private final TransitionController mController;
    private final BLASTSyncEngine mSyncEngine;
    private final Token mToken;
    private RemoteTransition mRemoteTransition = null;

    /** Only use for clean-up after binder death! */
@@ -220,10 +222,26 @@ class Transition extends Binder implements BLASTSyncEngine.TransactionReadyListe
        mFlags = flags;
        mController = controller;
        mSyncEngine = syncEngine;
        mToken = new Token(this);

        controller.mTransitionTracer.logState(this);
    }

    @Nullable
    static Transition fromBinder(@NonNull IBinder token) {
        try {
            return ((Token) token).mTransition.get();
        } catch (ClassCastException e) {
            Slog.w(TAG, "Invalid transition token: " + token, e);
            return null;
        }
    }

    @NonNull
    IBinder getToken() {
        return mToken;
    }

    void addFlag(int flag) {
        mFlags |= flag;
    }
@@ -1034,7 +1052,7 @@ class Transition extends Binder implements BLASTSyncEngine.TransactionReadyListe
                ProtoLog.v(ProtoLogGroup.WM_DEBUG_WINDOW_TRANSITIONS,
                        "Calling onTransitionReady: %s", info);
                mController.getTransitionPlayer().onTransitionReady(
                        this, info, transaction, mFinishTransaction);
                        mToken, info, transaction, mFinishTransaction);
                if (Trace.isTagEnabled(TRACE_TAG_WINDOW_MANAGER)) {
                    Trace.asyncTraceBegin(TRACE_TAG_WINDOW_MANAGER, TRACE_NAME_PLAY_TRANSITION,
                            System.identityHashCode(this));
@@ -1067,7 +1085,7 @@ class Transition extends Binder implements BLASTSyncEngine.TransactionReadyListe
        if (mFinishTransaction != null) {
            mFinishTransaction.apply();
        }
        mController.finishTransition(this);
        mController.finishTransition(mToken);
    }

    /** @see RecentsAnimationController#attachNavigationBarToApp */
@@ -1850,10 +1868,6 @@ class Transition extends Binder implements BLASTSyncEngine.TransactionReadyListe
        return isCollecting() && mSyncId >= 0;
    }

    static Transition fromBinder(IBinder binder) {
        return (Transition) binder;
    }

    @VisibleForTesting
    static class ChangeInfo {
        private static final int FLAG_NONE = 0;
@@ -2345,4 +2359,18 @@ class Transition extends Binder implements BLASTSyncEngine.TransactionReadyListe
            }
        }
    }

    private static class Token extends Binder {
        final WeakReference<Transition> mTransition;

        Token(Transition transition) {
            mTransition = new WeakReference<>(transition);
        }

        @Override
        public String toString() {
            return "Token{" + Integer.toHexString(System.identityHashCode(this)) + " "
                    + mTransition.get() + "}";
        }
    }
}
+3 −2
Original line number Diff line number Diff line
@@ -458,8 +458,9 @@ class TransitionController {
                info = new ActivityManager.RunningTaskInfo();
                startTask.fillTaskInfo(info);
            }
            mTransitionPlayer.requestStartTransition(transition, new TransitionRequestInfo(
                    transition.mType, info, remoteTransition, displayChange));
            mTransitionPlayer.requestStartTransition(transition.getToken(),
                    new TransitionRequestInfo(transition.mType, info, remoteTransition,
                            displayChange));
            transition.setRemoteTransition(remoteTransition);
        } catch (RemoteException e) {
            Slog.e(TAG, "Error requesting transition", e);
+2 −2
Original line number Diff line number Diff line
@@ -307,7 +307,7 @@ class WindowOrganizerController extends IWindowOrganizerController.Stub
                                        nextTransition.setAllReady();
                                    }
                                });
                        return nextTransition;
                        return nextTransition.getToken();
                    }
                    transition = mTransitionController.createTransition(type);
                }
@@ -316,7 +316,7 @@ class WindowOrganizerController extends IWindowOrganizerController.Stub
                if (needsSetReady) {
                    transition.setAllReady();
                }
                return transition;
                return transition.getToken();
            }
        } finally {
            Binder.restoreCallingIdentity(ident);
+1 −1
Original line number Diff line number Diff line
@@ -369,7 +369,7 @@ public class WallpaperControllerTests extends WindowTestsBase {
        final SurfaceControl.Transaction t = mock(SurfaceControl.Transaction.class);
        token.finishSync(t, false /* cancel */);
        transit.onTransactionReady(transit.getSyncId(), t);
        dc.mTransitionController.finishTransition(transit);
        dc.mTransitionController.finishTransition(transit.getToken());
        assertFalse(wallpaperWindow.isVisible());
        assertFalse(token.isVisible());

Loading