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

Commit f2811b31 authored by Chris Li's avatar Chris Li
Browse files

Defer transition ready when during applyTransaction

Bug: 335562144
Bug: 333529514
Test: verify with start activity in TF
Change-Id: I76e2ad4f5f9061715f465bd77d3a2a61ddf55feb
parent b485ab8a
Loading
Loading
Loading
Loading
+10 −0
Original line number Original line Diff line number Diff line
@@ -89,3 +89,13 @@ flag {
    bug: "306666082"
    bug: "306666082"
    is_fixed_read_only: true
    is_fixed_read_only: true
}
}

flag {
    namespace: "windowing_sdk"
    name: "always_defer_transition_when_apply_wct"
    description: "Report error when defer transition fails when it should not"
    bug: "335562144"
    metadata {
        purpose: PURPOSE_BUGFIX
    }
}
 No newline at end of file
+8 −12
Original line number Original line Diff line number Diff line
@@ -609,6 +609,11 @@ class WindowOrganizerController extends IWindowOrganizerController.Stub
        ProtoLog.v(WM_DEBUG_WINDOW_ORGANIZER, "Apply window transaction, syncId=%d", syncId);
        ProtoLog.v(WM_DEBUG_WINDOW_ORGANIZER, "Apply window transaction, syncId=%d", syncId);
        mService.deferWindowLayout();
        mService.deferWindowLayout();
        mService.mTaskSupervisor.setDeferRootVisibilityUpdate(true /* deferUpdate */);
        mService.mTaskSupervisor.setDeferRootVisibilityUpdate(true /* deferUpdate */);
        final boolean shouldDeferTransitionReady = transition != null && !t.isEmpty()
                && (transition.isCollecting() || Flags.alwaysDeferTransitionWhenApplyWct());
        if (shouldDeferTransitionReady) {
            transition.deferTransitionReady();
        }
        try {
        try {
            final ArraySet<WindowContainer<?>> haveConfigChanges = new ArraySet<>();
            final ArraySet<WindowContainer<?>> haveConfigChanges = new ArraySet<>();
            if (transition != null) {
            if (transition != null) {
@@ -761,6 +766,9 @@ class WindowOrganizerController extends IWindowOrganizerController.Stub
                mService.mWindowManager.mWindowPlacerLocked.requestTraversal();
                mService.mWindowManager.mWindowPlacerLocked.requestTraversal();
            }
            }
        } finally {
        } finally {
            if (shouldDeferTransitionReady) {
                transition.continueTransitionReady();
            }
            mService.mTaskSupervisor.setDeferRootVisibilityUpdate(false /* deferUpdate */);
            mService.mTaskSupervisor.setDeferRootVisibilityUpdate(false /* deferUpdate */);
            mService.continueWindowLayout();
            mService.continueWindowLayout();
        }
        }
@@ -1100,14 +1108,8 @@ class WindowOrganizerController extends IWindowOrganizerController.Stub
                launchOpts.remove(WindowContainerTransaction.HierarchyOp.LAUNCH_KEY_TASK_ID);
                launchOpts.remove(WindowContainerTransaction.HierarchyOp.LAUNCH_KEY_TASK_ID);
                final SafeActivityOptions safeOptions =
                final SafeActivityOptions safeOptions =
                        SafeActivityOptions.fromBundle(launchOpts, caller.mPid, caller.mUid);
                        SafeActivityOptions.fromBundle(launchOpts, caller.mPid, caller.mUid);
                if (transition != null) {
                    transition.deferTransitionReady();
                }
                waitAsyncStart(() -> mService.mTaskSupervisor.startActivityFromRecents(
                waitAsyncStart(() -> mService.mTaskSupervisor.startActivityFromRecents(
                        caller.mPid, caller.mUid, taskId, safeOptions));
                        caller.mPid, caller.mUid, taskId, safeOptions));
                if (transition != null) {
                    transition.continueTransitionReady();
                }
                break;
                break;
            }
            }
            case HIERARCHY_OP_TYPE_REORDER:
            case HIERARCHY_OP_TYPE_REORDER:
@@ -1185,17 +1187,11 @@ class WindowOrganizerController extends IWindowOrganizerController.Stub
                    activityOptions.setCallerDisplayId(DEFAULT_DISPLAY);
                    activityOptions.setCallerDisplayId(DEFAULT_DISPLAY);
                }
                }
                final Bundle options = activityOptions != null ? activityOptions.toBundle() : null;
                final Bundle options = activityOptions != null ? activityOptions.toBundle() : null;
                if (transition != null) {
                    transition.deferTransitionReady();
                }
                int res = waitAsyncStart(() -> mService.mAmInternal.sendIntentSender(
                int res = waitAsyncStart(() -> mService.mAmInternal.sendIntentSender(
                        hop.getPendingIntent().getTarget(),
                        hop.getPendingIntent().getTarget(),
                        hop.getPendingIntent().getWhitelistToken(), 0 /* code */,
                        hop.getPendingIntent().getWhitelistToken(), 0 /* code */,
                        hop.getActivityIntent(), resolvedType, null /* finishReceiver */,
                        hop.getActivityIntent(), resolvedType, null /* finishReceiver */,
                        null /* requiredPermission */, options));
                        null /* requiredPermission */, options));
                if (transition != null) {
                    transition.continueTransitionReady();
                }
                if (ActivityManager.isStartResultSuccessful(res)) {
                if (ActivityManager.isStartResultSuccessful(res)) {
                    effects |= TRANSACT_EFFECTS_LIFECYCLE;
                    effects |= TRANSACT_EFFECTS_LIFECYCLE;
                }
                }