Don't merge task view transitions in UnfoldTransitionHandler

For TRANSIT_CHANGE TaskViewTransitions needs to do some work (i.e.
reparent the surface & set the position), however, this was being
skipped because the transition was getting merged with the unfold
transition. Skipping the merge allows TaskViewTransitions to apply
these changes in the transition & resolves this issue.

Bug: 286549869
Test: manual - expand a bubble on a folded device
             - unfold the device
             => observe that the bubble remains expanded and the
                content is in the correct position and bounds
Change-Id: I402a47f72510045840715a6583ff3614228e39a3
This commit is contained in:
Mady Mellor
2023-06-12 14:56:39 -07:00
parent 46d3419bc4
commit ca1d1d77d4

View File

@@ -20,6 +20,7 @@ import static android.view.WindowManager.TRANSIT_CHANGE;
import static com.android.wm.shell.protolog.ShellProtoLogGroup.WM_SHELL_TRANSITIONS;
import android.app.ActivityManager;
import android.os.IBinder;
import android.view.SurfaceControl;
import android.window.TransitionInfo;
@@ -178,6 +179,18 @@ public class UnfoldTransitionHandler implements TransitionHandler, UnfoldListene
@NonNull SurfaceControl.Transaction t, @NonNull IBinder mergeTarget,
@NonNull TransitionFinishCallback finishCallback) {
if (info.getType() == TRANSIT_CHANGE) {
// TODO (b/286928742) unfold transition handler should be part of mixed handler to
// handle merges better.
for (int i = 0; i < info.getChanges().size(); ++i) {
final TransitionInfo.Change change = info.getChanges().get(i);
final ActivityManager.RunningTaskInfo taskInfo = change.getTaskInfo();
if (taskInfo != null
&& taskInfo.configuration.windowConfiguration.isAlwaysOnTop()) {
// Tasks that are always on top (e.g. bubbles), will handle their own transition
// as they are on top of everything else. So skip merging transitions here.
return;
}
}
// Apply changes happening during the unfold animation immediately
t.apply();
finishCallback.onTransitionFinished(null, null);