summaryrefslogtreecommitdiff
path: root/core/java/android/window/TaskFragmentOrganizer.java
diff options
context:
space:
mode:
Diffstat (limited to 'core/java/android/window/TaskFragmentOrganizer.java')
-rw-r--r--core/java/android/window/TaskFragmentOrganizer.java72
1 files changed, 55 insertions, 17 deletions
diff --git a/core/java/android/window/TaskFragmentOrganizer.java b/core/java/android/window/TaskFragmentOrganizer.java
index c9a568815fb1..84302dd19097 100644
--- a/core/java/android/window/TaskFragmentOrganizer.java
+++ b/core/java/android/window/TaskFragmentOrganizer.java
@@ -32,8 +32,10 @@ import android.content.res.Configuration;
import android.os.Bundle;
import android.os.IBinder;
import android.os.RemoteException;
+import android.util.SparseArray;
import android.view.RemoteAnimationDefinition;
+import java.util.ArrayList;
import java.util.List;
import java.util.concurrent.Executor;
@@ -72,6 +74,12 @@ public class TaskFragmentOrganizer extends WindowOrganizer {
*/
private final Executor mExecutor;
+ // TODO(b/240519866): doing so to keep CTS compatibility. Remove in the next release.
+ /** Map from Task id to client tokens of TaskFragments in the Task. */
+ private final SparseArray<List<IBinder>> mTaskIdToFragmentTokens = new SparseArray<>();
+ /** Map from Task id to Task configuration. */
+ private final SparseArray<Configuration> mTaskIdToConfigurations = new SparseArray<>();
+
public TaskFragmentOrganizer(@NonNull Executor executor) {
mExecutor = executor;
}
@@ -161,6 +169,27 @@ public class TaskFragmentOrganizer extends WindowOrganizer {
@NonNull IBinder fragmentToken, @NonNull Configuration parentConfig) {}
/**
+ * Called when the parent leaf Task of organized TaskFragments is changed.
+ * When the leaf Task is changed, the organizer may want to update the TaskFragments in one
+ * transaction.
+ *
+ * For case like screen size change, it will trigger onTaskFragmentParentInfoChanged with new
+ * Task bounds, but may not trigger onTaskFragmentInfoChanged because there can be an override
+ * bounds.
+ * @hide
+ */
+ public void onTaskFragmentParentInfoChanged(int taskId, @NonNull Configuration parentConfig) {
+ // TODO(b/240519866): doing so to keep CTS compatibility. Remove in the next release.
+ final List<IBinder> tokens = mTaskIdToFragmentTokens.get(taskId);
+ if (tokens == null || tokens.isEmpty()) {
+ return;
+ }
+ for (int i = tokens.size() - 1; i >= 0; i--) {
+ onTaskFragmentParentInfoChanged(tokens.get(i), parentConfig);
+ }
+ }
+
+ /**
* Called when the {@link WindowContainerTransaction} created with
* {@link WindowContainerTransaction#setErrorCallbackToken(IBinder)} failed on the server side.
*
@@ -221,34 +250,43 @@ public class TaskFragmentOrganizer extends WindowOrganizer {
final List<TaskFragmentTransaction.Change> changes = transaction.getChanges();
for (TaskFragmentTransaction.Change change : changes) {
// TODO(b/240519866): apply all changes in one WCT.
+ final int taskId = change.getTaskId();
switch (change.getType()) {
case TYPE_TASK_FRAGMENT_APPEARED:
- onTaskFragmentAppeared(change.getTaskFragmentInfo());
- if (change.getTaskConfiguration() != null) {
- // TODO(b/240519866): convert to pass TaskConfiguration for all TFs in the
- // same Task
- onTaskFragmentParentInfoChanged(
- change.getTaskFragmentToken(),
- change.getTaskConfiguration());
+ // TODO(b/240519866): doing so to keep CTS compatibility. Remove in the next
+ // release.
+ if (!mTaskIdToFragmentTokens.contains(taskId)) {
+ mTaskIdToFragmentTokens.put(taskId, new ArrayList<>());
}
+ mTaskIdToFragmentTokens.get(taskId).add(change.getTaskFragmentToken());
+ onTaskFragmentParentInfoChanged(change.getTaskFragmentToken(),
+ mTaskIdToConfigurations.get(taskId));
+
+ onTaskFragmentAppeared(change.getTaskFragmentInfo());
break;
case TYPE_TASK_FRAGMENT_INFO_CHANGED:
- if (change.getTaskConfiguration() != null) {
- // TODO(b/240519866): convert to pass TaskConfiguration for all TFs in the
- // same Task
- onTaskFragmentParentInfoChanged(
- change.getTaskFragmentToken(),
- change.getTaskConfiguration());
- }
onTaskFragmentInfoChanged(change.getTaskFragmentInfo());
break;
case TYPE_TASK_FRAGMENT_VANISHED:
+ // TODO(b/240519866): doing so to keep CTS compatibility. Remove in the next
+ // release.
+ if (mTaskIdToFragmentTokens.contains(taskId)) {
+ final List<IBinder> tokens = mTaskIdToFragmentTokens.get(taskId);
+ tokens.remove(change.getTaskFragmentToken());
+ if (tokens.isEmpty()) {
+ mTaskIdToFragmentTokens.remove(taskId);
+ mTaskIdToConfigurations.remove(taskId);
+ }
+ }
+
onTaskFragmentVanished(change.getTaskFragmentInfo());
break;
case TYPE_TASK_FRAGMENT_PARENT_INFO_CHANGED:
- onTaskFragmentParentInfoChanged(
- change.getTaskFragmentToken(),
- change.getTaskConfiguration());
+ // TODO(b/240519866): doing so to keep CTS compatibility. Remove in the next
+ // release.
+ mTaskIdToConfigurations.put(taskId, change.getTaskConfiguration());
+
+ onTaskFragmentParentInfoChanged(taskId, change.getTaskConfiguration());
break;
case TYPE_TASK_FRAGMENT_ERROR:
final Bundle errorBundle = change.getErrorBundle();