Loading libs/WindowManager/Jetpack/src/androidx/window/extensions/embedding/BackupHelper.java +32 −4 Original line number Diff line number Diff line Loading @@ -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<>(); Loading @@ -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); Loading Loading @@ -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); } Loading @@ -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) { Loading @@ -148,7 +174,6 @@ class BackupHelper { final TaskFragmentInfo info = mTaskFragmentInfos.valueAt(i); mPresenter.deleteTaskFragment(wct, info.getFragmentToken()); } removeSavedState(); } Loading Loading @@ -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; Loading @@ -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; } Loading @@ -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 : Loading libs/WindowManager/Jetpack/src/androidx/window/extensions/embedding/SplitController.java +12 −0 Original line number Diff line number Diff line Loading @@ -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(); Loading libs/WindowManager/Jetpack/src/androidx/window/extensions/embedding/SplitPresenter.java +4 −0 Original line number Diff line number Diff line Loading @@ -183,6 +183,10 @@ class SplitPresenter extends JetpackTaskFragmentOrganizer { } } void setAutoSaveEmbeddingState(boolean saveEmbeddingState) { mBackupHelper.setAutoSaveEmbeddingState(saveEmbeddingState); } void scheduleBackup() { mBackupHelper.scheduleBackup(); } Loading libs/WindowManager/Jetpack/src/androidx/window/extensions/embedding/TaskContainer.java +1 −7 Original line number Diff line number Diff line Loading @@ -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; Loading Loading @@ -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 Loading Loading
libs/WindowManager/Jetpack/src/androidx/window/extensions/embedding/BackupHelper.java +32 −4 Original line number Diff line number Diff line Loading @@ -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<>(); Loading @@ -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); Loading Loading @@ -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); } Loading @@ -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) { Loading @@ -148,7 +174,6 @@ class BackupHelper { final TaskFragmentInfo info = mTaskFragmentInfos.valueAt(i); mPresenter.deleteTaskFragment(wct, info.getFragmentToken()); } removeSavedState(); } Loading Loading @@ -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; Loading @@ -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; } Loading @@ -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 : Loading
libs/WindowManager/Jetpack/src/androidx/window/extensions/embedding/SplitController.java +12 −0 Original line number Diff line number Diff line Loading @@ -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(); Loading
libs/WindowManager/Jetpack/src/androidx/window/extensions/embedding/SplitPresenter.java +4 −0 Original line number Diff line number Diff line Loading @@ -183,6 +183,10 @@ class SplitPresenter extends JetpackTaskFragmentOrganizer { } } void setAutoSaveEmbeddingState(boolean saveEmbeddingState) { mBackupHelper.setAutoSaveEmbeddingState(saveEmbeddingState); } void scheduleBackup() { mBackupHelper.scheduleBackup(); } Loading
libs/WindowManager/Jetpack/src/androidx/window/extensions/embedding/TaskContainer.java +1 −7 Original line number Diff line number Diff line Loading @@ -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; Loading Loading @@ -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 Loading