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

Commit 11a123ac authored by Louis Chang's avatar Louis Chang Committed by Android (Google) Code Review
Browse files

Merge "Abort AE saved state restoration if it is too late" into main

parents f1b49133 dc6e0ff9
Loading
Loading
Loading
Loading
+14 −0
Original line number Diff line number Diff line
@@ -142,6 +142,19 @@ class BackupHelper {
        }
    }

    void abortTaskContainerRebuilding(@NonNull WindowContainerTransaction wct) {
        // Clean-up the legacy states in the system
        for (int i = mTaskFragmentInfos.size() - 1; i >= 0; i--) {
            final TaskFragmentInfo info = mTaskFragmentInfos.valueAt(i);
            mPresenter.deleteTaskFragment(wct, info.getFragmentToken());
        }
        mPresenter.setSavedState(new Bundle());

        mParcelableTaskContainerDataList.clear();
        mTaskFragmentInfos.clear();
        mTaskFragmentParentInfos.clear();
    }

    boolean hasPendingStateToRestore() {
        return !mParcelableTaskContainerDataList.isEmpty();
    }
@@ -196,6 +209,7 @@ class BackupHelper {

            mController.onTaskFragmentParentRestored(wct, taskContainer.getTaskId(),
                    mTaskFragmentParentInfos.get(taskContainer.getTaskId()));
            mTaskFragmentParentInfos.remove(taskContainer.getTaskId());
            restoredAny = true;
        }

+32 −1
Original line number Diff line number Diff line
@@ -56,6 +56,7 @@ import static androidx.window.extensions.embedding.TaskFragmentContainer.Overlay
import android.annotation.CallbackExecutor;
import android.app.Activity;
import android.app.ActivityClient;
import android.app.ActivityManager;
import android.app.ActivityOptions;
import android.app.ActivityThread;
import android.app.AppGlobals;
@@ -280,7 +281,7 @@ public class SplitController implements JetpackTaskFragmentOrganizer.TaskFragmen
            mSplitRules.clear();
            mSplitRules.addAll(rules);

            if (!Flags.aeBackStackRestore() || !mPresenter.isRebuildTaskContainersNeeded()) {
            if (!Flags.aeBackStackRestore() || !mPresenter.isWaitingToRebuildTaskContainers()) {
                return;
            }

@@ -2893,6 +2894,36 @@ public class SplitController implements JetpackTaskFragmentOrganizer.TaskFragmen
                return;
            }
            synchronized (mLock) {
                if (mPresenter.isWaitingToRebuildTaskContainers()) {
                    Log.w(TAG, "Rebuilding aborted, clean up and restart");

                    // Retrieve the Task intent.
                    final int taskId = getTaskId(activity);
                    Intent taskIntent = null;
                    final ActivityManager am = activity.getSystemService(ActivityManager.class);
                    final List<ActivityManager.AppTask> appTasks = am.getAppTasks();
                    for (ActivityManager.AppTask appTask : appTasks) {
                        if (appTask.getTaskInfo().taskId == taskId) {
                            taskIntent = appTask.getTaskInfo().baseIntent.cloneFilter();
                            break;
                        }
                    }

                    // Clean up and abort the restoration
                    // TODO(b/369488857): also to remove the non-organized activities in the Task?
                    final TransactionRecord transactionRecord =
                            mTransactionManager.startNewTransaction();
                    final WindowContainerTransaction wct = transactionRecord.getTransaction();
                    mPresenter.abortTaskContainerRebuilding(wct);
                    transactionRecord.apply(false /* shouldApplyIndependently */);

                    // Start the Task root activity.
                    if (taskIntent != null) {
                        activity.startActivity(taskIntent);
                    }
                    return;
                }

                final IBinder activityToken = activity.getActivityToken();
                final IBinder initialTaskFragmentToken =
                        getTaskFragmentTokenFromActivityClientRecord(activity);
+5 −1
Original line number Diff line number Diff line
@@ -187,10 +187,14 @@ class SplitPresenter extends JetpackTaskFragmentOrganizer {
        mBackupHelper.scheduleBackup();
    }

    boolean isRebuildTaskContainersNeeded() {
    boolean isWaitingToRebuildTaskContainers() {
        return mBackupHelper.hasPendingStateToRestore();
    }

    void abortTaskContainerRebuilding(@NonNull WindowContainerTransaction wct) {
        mBackupHelper.abortTaskContainerRebuilding(wct);
    }

    boolean rebuildTaskContainers(@NonNull WindowContainerTransaction wct,
            @NonNull Set<EmbeddingRule> rules) {
        return mBackupHelper.rebuildTaskContainers(wct, rules);
+1 −1
Original line number Diff line number Diff line
@@ -156,7 +156,7 @@ class TaskContainer {
        mSplitController = splitController;
        for (ParcelableTaskFragmentContainerData tfData :
                data.getParcelableTaskFragmentContainerDataList()) {
            final TaskFragmentInfo info = taskFragmentInfoMap.get(tfData.mToken);
            final TaskFragmentInfo info = taskFragmentInfoMap.remove(tfData.mToken);
            if (info != null && !info.isEmpty()) {
                final TaskFragmentContainer container =
                        new TaskFragmentContainer(tfData, splitController, this);