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

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

Merge "Implements the API to opt-in to auto-save embedding state" into main

parents 1f62ad35 93e76000
Loading
Loading
Loading
Loading
+32 −4
Original line number Diff line number Diff line
@@ -54,6 +54,7 @@ class BackupHelper {
    @NonNull
    private final BackupIdler mBackupIdler = new BackupIdler();
    private boolean mBackupIdlerScheduled;
    private boolean mSaveEmbeddingState = false;

    private final List<ParcelableTaskContainerData> mParcelableTaskContainerDataList =
            new ArrayList<>();
@@ -71,11 +72,32 @@ class BackupHelper {
        }
    }

    void setAutoSaveEmbeddingState(boolean saveEmbeddingState) {
        if (mSaveEmbeddingState == saveEmbeddingState) {
            return;
        }

        Log.i(TAG, "Set save embedding state: " + saveEmbeddingState);
        mSaveEmbeddingState = saveEmbeddingState;
        if (!mSaveEmbeddingState) {
            removeSavedState();
            return;
        }

        if (!hasPendingStateToRestore() && !mController.getTaskContainers().isEmpty()) {
            scheduleBackup();
        }
    }
    /**
     * Schedules a back-up request. It is no-op if there was a request scheduled and not yet
     * completed.
     */
    void scheduleBackup() {
        if (!mSaveEmbeddingState) {
            // TODO(b/289875940): enabled internally for broader testing.
            return;
        }

        if (!mBackupIdlerScheduled) {
            mBackupIdlerScheduled = true;
            Looper.getMainLooper().getQueue().addIdleHandler(mBackupIdler);
@@ -128,7 +150,6 @@ class BackupHelper {
        final List<TaskFragmentInfo> infos = savedState.getParcelableArrayList(
                KEY_RESTORE_TASK_FRAGMENTS_INFO, TaskFragmentInfo.class);
        for (TaskFragmentInfo info : infos) {
            if (DEBUG) Log.d(TAG, "Retrieved: " + info);
            mTaskFragmentInfos.put(info.getFragmentToken(), info);
            mPresenter.updateTaskFragmentInfo(info);
        }
@@ -140,6 +161,11 @@ class BackupHelper {
            if (DEBUG) Log.d(TAG, "Retrieved: " + info);
            mTaskFragmentParentInfos.put(info.getTaskId(), info);
        }

        if (DEBUG) {
            Log.d(TAG, "Retrieved task-fragment info: " + infos.size() + ", task info: "
                    + parentInfos.size());
        }
    }

    void abortTaskContainerRebuilding(@NonNull WindowContainerTransaction wct) {
@@ -148,7 +174,6 @@ class BackupHelper {
            final TaskFragmentInfo info = mTaskFragmentInfos.valueAt(i);
            mPresenter.deleteTaskFragment(wct, info.getFragmentToken());
        }

        removeSavedState();
    }

@@ -190,6 +215,9 @@ class BackupHelper {
        final ArrayMap<String, EmbeddingRule> embeddingRuleMap = new ArrayMap<>();
        for (EmbeddingRule rule : rules) {
            embeddingRuleMap.put(rule.getTag(), rule);
            if (DEBUG) {
                Log.d(TAG, "Tag: " + rule.getTag() + " rule: " + rule);
            }
        }

        boolean restoredAny = false;
@@ -201,7 +229,7 @@ class BackupHelper {
                // has unknown tag, unable to restore.
                if (DEBUG) {
                    Log.d(TAG, "Rebuilding TaskContainer abort! Unknown Tag. Task#"
                            + parcelableTaskContainerData.mTaskId);
                            + parcelableTaskContainerData.mTaskId + ", tags = " + tags);
                }
                continue;
            }
@@ -217,7 +245,7 @@ class BackupHelper {

            final TaskContainer taskContainer = new TaskContainer(parcelableTaskContainerData,
                    mController, mTaskFragmentInfos);
            if (DEBUG) Log.d(TAG, "Created TaskContainer " + taskContainer);
            if (DEBUG) Log.d(TAG, "Created TaskContainer " + taskContainer.getTaskId());
            mController.addTaskContainer(taskContainer.getTaskId(), taskContainer);

            for (ParcelableSplitContainerData splitData :
+12 −0
Original line number Diff line number Diff line
@@ -2886,6 +2886,18 @@ public class SplitController implements JetpackTaskFragmentOrganizer.TaskFragmen
        return getActiveSplitForContainer(container) != null;
    }


    @Override
    public void setAutoSaveEmbeddingState(boolean saveEmbeddingState) {
        if (!Flags.aeBackStackRestore()) {
            return;
        }

        synchronized (mLock) {
            mPresenter.setAutoSaveEmbeddingState(saveEmbeddingState);
        }
    }

    void scheduleBackup() {
        synchronized (mLock) {
            mPresenter.scheduleBackup();
+4 −0
Original line number Diff line number Diff line
@@ -183,6 +183,10 @@ class SplitPresenter extends JetpackTaskFragmentOrganizer {
        }
    }

    void setAutoSaveEmbeddingState(boolean saveEmbeddingState) {
        mBackupHelper.setAutoSaveEmbeddingState(saveEmbeddingState);
    }

    void scheduleBackup() {
        mBackupHelper.scheduleBackup();
    }
+1 −7
Original line number Diff line number Diff line
@@ -48,8 +48,6 @@ import androidx.window.extensions.embedding.SplitAttributes.SplitType;
import androidx.window.extensions.embedding.SplitAttributes.SplitType.ExpandContainersSplitType;
import androidx.window.extensions.embedding.SplitAttributes.SplitType.RatioSplitType;

import com.android.window.flags.Flags;

import java.util.ArrayList;
import java.util.List;
import java.util.Set;
@@ -634,12 +632,8 @@ class TaskContainer {
        // pin container.
        updateAlwaysOnTopOverlayIfNecessary();

        // TODO(b/289875940): Making backup-restore as an opt-in solution, before the flag goes
        //  to next-food.
        if (Flags.aeBackStackRestore()) {
        mSplitController.scheduleBackup();
    }
    }

    private void updateAlwaysOnTopOverlayIfNecessary() {
        final List<TaskFragmentContainer> alwaysOnTopOverlays = mContainers