diff options
| author | Chris Li <lihongyu@google.com> | 2022-08-01 15:39:14 +0800 |
|---|---|---|
| committer | Chris Li <lihongyu@google.com> | 2022-08-04 10:50:11 +0800 |
| commit | 8980a9fe87a447519dbedd0a190248c3a2d3d88c (patch) | |
| tree | c92f12b3ac7c17d0be08dd0f677898bcc0909285 /core/java/android/window/TaskFragmentOrganizer.java | |
| parent | 6b94ca2d5f5ead527532b2a1c489c861485bacb6 (diff) | |
Pass Task configuration changed for all TaskFragments at once
Before, we passed Task configuration changed for every embedded
TaskFragment. Now, we only passed one Task configuration changed for the
whole Task. The organizer will then update TaskFragments in the Task
accordingly.
Bug: 240519866
Test: atest WmTests:TaskFragmentOrganizerControllerTest
Change-Id: I755c11a1bcee0dd0305a090b229e867b79eee46d
Diffstat (limited to 'core/java/android/window/TaskFragmentOrganizer.java')
| -rw-r--r-- | core/java/android/window/TaskFragmentOrganizer.java | 72 |
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(); |
