Loading core/java/android/window/TaskFragmentOrganizer.java +4 −4 Original line number Diff line number Diff line Loading @@ -16,7 +16,7 @@ package android.window; import static android.window.TaskFragmentTransaction.TYPE_ACTIVITY_REPARENT_TO_TASK; import static android.window.TaskFragmentTransaction.TYPE_ACTIVITY_REPARENTED_TO_TASK; import static android.window.TaskFragmentTransaction.TYPE_TASK_FRAGMENT_APPEARED; import static android.window.TaskFragmentTransaction.TYPE_TASK_FRAGMENT_ERROR; import static android.window.TaskFragmentTransaction.TYPE_TASK_FRAGMENT_INFO_CHANGED; Loading Loading @@ -238,7 +238,7 @@ public class TaskFragmentOrganizer extends WindowOrganizer { * {@link WindowContainerTransaction} if needed. * @hide */ public void onActivityReparentToTask(int taskId, @NonNull Intent activityIntent, public void onActivityReparentedToTask(int taskId, @NonNull Intent activityIntent, @NonNull IBinder activityToken) {} /** Loading Loading @@ -298,8 +298,8 @@ public class TaskFragmentOrganizer extends WindowOrganizer { errorBundle.getSerializable(KEY_ERROR_CALLBACK_EXCEPTION, java.lang.Throwable.class)); break; case TYPE_ACTIVITY_REPARENT_TO_TASK: onActivityReparentToTask( case TYPE_ACTIVITY_REPARENTED_TO_TASK: onActivityReparentedToTask( change.getTaskId(), change.getActivityIntent(), change.getActivityToken()); Loading core/java/android/window/TaskFragmentTransaction.java +4 −4 Original line number Diff line number Diff line Loading @@ -122,7 +122,7 @@ public final class TaskFragmentTransaction implements Parcelable { * then exits Picture-in-picture, it will be reparented back to its original Task. In this case, * we need to notify the organizer so that it can check if the Activity matches any split rule. */ public static final int TYPE_ACTIVITY_REPARENT_TO_TASK = 6; public static final int TYPE_ACTIVITY_REPARENTED_TO_TASK = 6; @IntDef(prefix = { "TYPE_" }, value = { TYPE_TASK_FRAGMENT_APPEARED, Loading @@ -130,7 +130,7 @@ public final class TaskFragmentTransaction implements Parcelable { TYPE_TASK_FRAGMENT_VANISHED, TYPE_TASK_FRAGMENT_PARENT_INFO_CHANGED, TYPE_TASK_FRAGMENT_ERROR, TYPE_ACTIVITY_REPARENT_TO_TASK TYPE_ACTIVITY_REPARENTED_TO_TASK }) @Retention(RetentionPolicy.SOURCE) @interface ChangeType {} Loading Loading @@ -247,7 +247,7 @@ public final class TaskFragmentTransaction implements Parcelable { /** * Intent of the activity that is reparented to the Task for * {@link #TYPE_ACTIVITY_REPARENT_TO_TASK}. * {@link #TYPE_ACTIVITY_REPARENTED_TO_TASK}. */ public Change setActivityIntent(@NonNull Intent intent) { mActivityIntent = requireNonNull(intent); Loading @@ -255,7 +255,7 @@ public final class TaskFragmentTransaction implements Parcelable { } /** * Token of the reparent activity for {@link #TYPE_ACTIVITY_REPARENT_TO_TASK}. * Token of the reparent activity for {@link #TYPE_ACTIVITY_REPARENTED_TO_TASK}. * If the activity belongs to the same process as the organizer, this will be the actual * activity token; if the activity belongs to a different process, the server will generate * a temporary token that the organizer can use to reparent the activity through Loading libs/WindowManager/Jetpack/src/androidx/window/extensions/embedding/JetpackTaskFragmentOrganizer.java +32 −42 Original line number Diff line number Diff line Loading @@ -51,8 +51,11 @@ class JetpackTaskFragmentOrganizer extends TaskFragmentOrganizer { @VisibleForTesting final Map<IBinder, TaskFragmentInfo> mFragmentInfos = new ArrayMap<>(); @NonNull private final TaskFragmentCallback mCallback; @VisibleForTesting @Nullable TaskFragmentAnimationController mAnimationController; /** Loading @@ -63,7 +66,7 @@ class JetpackTaskFragmentOrganizer extends TaskFragmentOrganizer { void onTaskFragmentInfoChanged(@NonNull TaskFragmentInfo taskFragmentInfo); void onTaskFragmentVanished(@NonNull TaskFragmentInfo taskFragmentInfo); void onTaskFragmentParentInfoChanged(int taskId, @NonNull Configuration parentConfig); void onActivityReparentToTask(int taskId, @NonNull Intent activityIntent, void onActivityReparentedToTask(int taskId, @NonNull Intent activityIntent, @NonNull IBinder activityToken); void onTaskFragmentError(@Nullable TaskFragmentInfo taskFragmentInfo, int opType); } Loading @@ -72,7 +75,8 @@ class JetpackTaskFragmentOrganizer extends TaskFragmentOrganizer { * @param executor callbacks from WM Core are posted on this executor. It should be tied to the * UI thread that all other calls into methods of this class are also on. */ JetpackTaskFragmentOrganizer(@NonNull Executor executor, TaskFragmentCallback callback) { JetpackTaskFragmentOrganizer(@NonNull Executor executor, @NonNull TaskFragmentCallback callback) { super(executor); mCallback = callback; } Loading Loading @@ -147,7 +151,8 @@ class JetpackTaskFragmentOrganizer extends TaskFragmentOrganizer { * @param wct WindowContainerTransaction in which the task fragment should be resized. * @param fragmentToken token of an existing TaskFragment. */ void expandTaskFragment(WindowContainerTransaction wct, IBinder fragmentToken) { void expandTaskFragment(@NonNull WindowContainerTransaction wct, @NonNull IBinder fragmentToken) { resizeTaskFragment(wct, fragmentToken, new Rect()); setAdjacentTaskFragments(wct, fragmentToken, null /* secondary */, null /* splitRule */); updateWindowingMode(wct, fragmentToken, WINDOWING_MODE_UNDEFINED); Loading @@ -157,7 +162,7 @@ class JetpackTaskFragmentOrganizer extends TaskFragmentOrganizer { * Expands an existing TaskFragment to fill parent. * @param fragmentToken token of an existing TaskFragment. */ void expandTaskFragment(IBinder fragmentToken) { void expandTaskFragment(@NonNull IBinder fragmentToken) { WindowContainerTransaction wct = new WindowContainerTransaction(); expandTaskFragment(wct, fragmentToken); applyTransaction(wct); Loading @@ -168,7 +173,7 @@ class JetpackTaskFragmentOrganizer extends TaskFragmentOrganizer { * @param fragmentToken token to create new TaskFragment with. * @param activity activity to move to the fill-parent TaskFragment. */ void expandActivity(IBinder fragmentToken, Activity activity) { void expandActivity(@NonNull IBinder fragmentToken, @NonNull Activity activity) { final WindowContainerTransaction wct = new WindowContainerTransaction(); createTaskFragmentAndReparentActivity( wct, fragmentToken, activity.getActivityToken(), new Rect(), Loading @@ -180,8 +185,8 @@ class JetpackTaskFragmentOrganizer extends TaskFragmentOrganizer { * @param ownerToken The token of the activity that creates this task fragment. It does not * have to be a child of this task fragment, but must belong to the same task. */ void createTaskFragment(WindowContainerTransaction wct, IBinder fragmentToken, IBinder ownerToken, @NonNull Rect bounds, @WindowingMode int windowingMode) { void createTaskFragment(@NonNull WindowContainerTransaction wct, @NonNull IBinder fragmentToken, @NonNull IBinder ownerToken, @NonNull Rect bounds, @WindowingMode int windowingMode) { final TaskFragmentCreationParams fragmentOptions = createFragmentOptions(fragmentToken, ownerToken, bounds, windowingMode); wct.createTaskFragment(fragmentOptions); Loading @@ -191,9 +196,9 @@ class JetpackTaskFragmentOrganizer extends TaskFragmentOrganizer { * @param ownerToken The token of the activity that creates this task fragment. It does not * have to be a child of this task fragment, but must belong to the same task. */ private void createTaskFragmentAndReparentActivity( WindowContainerTransaction wct, IBinder fragmentToken, IBinder ownerToken, @NonNull Rect bounds, @WindowingMode int windowingMode, Activity activity) { private void createTaskFragmentAndReparentActivity(@NonNull WindowContainerTransaction wct, @NonNull IBinder fragmentToken, @NonNull IBinder ownerToken, @NonNull Rect bounds, @WindowingMode int windowingMode, @NonNull Activity activity) { createTaskFragment(wct, fragmentToken, ownerToken, bounds, windowingMode); wct.reparentActivityToTaskFragment(fragmentToken, activity.getActivityToken()); } Loading @@ -202,9 +207,9 @@ class JetpackTaskFragmentOrganizer extends TaskFragmentOrganizer { * @param ownerToken The token of the activity that creates this task fragment. It does not * have to be a child of this task fragment, but must belong to the same task. */ private void createTaskFragmentAndStartActivity( WindowContainerTransaction wct, IBinder fragmentToken, IBinder ownerToken, @NonNull Rect bounds, @WindowingMode int windowingMode, Intent activityIntent, private void createTaskFragmentAndStartActivity(@NonNull WindowContainerTransaction wct, @NonNull IBinder fragmentToken, @NonNull IBinder ownerToken, @NonNull Rect bounds, @WindowingMode int windowingMode, @NonNull Intent activityIntent, @Nullable Bundle activityOptions) { createTaskFragment(wct, fragmentToken, ownerToken, bounds, windowingMode); wct.startActivityInTaskFragment(fragmentToken, ownerToken, activityIntent, activityOptions); Loading @@ -225,8 +230,8 @@ class JetpackTaskFragmentOrganizer extends TaskFragmentOrganizer { wct.setAdjacentTaskFragments(primary, secondary, adjacentParams); } TaskFragmentCreationParams createFragmentOptions(IBinder fragmentToken, IBinder ownerToken, Rect bounds, @WindowingMode int windowingMode) { TaskFragmentCreationParams createFragmentOptions(@NonNull IBinder fragmentToken, @NonNull IBinder ownerToken, @NonNull Rect bounds, @WindowingMode int windowingMode) { if (mFragmentInfos.containsKey(fragmentToken)) { throw new IllegalArgumentException( "There is an existing TaskFragment with fragmentToken=" + fragmentToken); Loading @@ -241,7 +246,7 @@ class JetpackTaskFragmentOrganizer extends TaskFragmentOrganizer { .build(); } void resizeTaskFragment(WindowContainerTransaction wct, IBinder fragmentToken, void resizeTaskFragment(@NonNull WindowContainerTransaction wct, @NonNull IBinder fragmentToken, @Nullable Rect bounds) { if (!mFragmentInfos.containsKey(fragmentToken)) { throw new IllegalArgumentException( Loading @@ -253,8 +258,8 @@ class JetpackTaskFragmentOrganizer extends TaskFragmentOrganizer { wct.setBounds(mFragmentInfos.get(fragmentToken).getToken(), bounds); } void updateWindowingMode(WindowContainerTransaction wct, IBinder fragmentToken, @WindowingMode int windowingMode) { void updateWindowingMode(@NonNull WindowContainerTransaction wct, @NonNull IBinder fragmentToken, @WindowingMode int windowingMode) { if (!mFragmentInfos.containsKey(fragmentToken)) { throw new IllegalArgumentException( "Can't find an existing TaskFragment with fragmentToken=" + fragmentToken); Loading @@ -262,7 +267,8 @@ class JetpackTaskFragmentOrganizer extends TaskFragmentOrganizer { wct.setWindowingMode(mFragmentInfos.get(fragmentToken).getToken(), windowingMode); } void deleteTaskFragment(WindowContainerTransaction wct, IBinder fragmentToken) { void deleteTaskFragment(@NonNull WindowContainerTransaction wct, @NonNull IBinder fragmentToken) { if (!mFragmentInfos.containsKey(fragmentToken)) { throw new IllegalArgumentException( "Can't find an existing TaskFragment with fragmentToken=" + fragmentToken); Loading @@ -274,44 +280,31 @@ class JetpackTaskFragmentOrganizer extends TaskFragmentOrganizer { public void onTaskFragmentAppeared(@NonNull TaskFragmentInfo taskFragmentInfo) { final IBinder fragmentToken = taskFragmentInfo.getFragmentToken(); mFragmentInfos.put(fragmentToken, taskFragmentInfo); if (mCallback != null) { mCallback.onTaskFragmentAppeared(taskFragmentInfo); } } @Override public void onTaskFragmentInfoChanged(@NonNull TaskFragmentInfo taskFragmentInfo) { final IBinder fragmentToken = taskFragmentInfo.getFragmentToken(); mFragmentInfos.put(fragmentToken, taskFragmentInfo); if (mCallback != null) { mCallback.onTaskFragmentInfoChanged(taskFragmentInfo); } } @Override public void onTaskFragmentVanished(@NonNull TaskFragmentInfo taskFragmentInfo) { mFragmentInfos.remove(taskFragmentInfo.getFragmentToken()); if (mCallback != null) { mCallback.onTaskFragmentVanished(taskFragmentInfo); } } @Override public void onTaskFragmentParentInfoChanged(int taskId, @NonNull Configuration parentConfig) { if (mCallback != null) { mCallback.onTaskFragmentParentInfoChanged(taskId, parentConfig); } } @Override public void onActivityReparentToTask(int taskId, @NonNull Intent activityIntent, public void onActivityReparentedToTask(int taskId, @NonNull Intent activityIntent, @NonNull IBinder activityToken) { if (mCallback != null) { mCallback.onActivityReparentToTask(taskId, activityIntent, activityToken); } mCallback.onActivityReparentedToTask(taskId, activityIntent, activityToken); } @Override Loading @@ -322,9 +315,6 @@ class JetpackTaskFragmentOrganizer extends TaskFragmentOrganizer { final IBinder fragmentToken = taskFragmentInfo.getFragmentToken(); mFragmentInfos.put(fragmentToken, taskFragmentInfo); } if (mCallback != null) { mCallback.onTaskFragmentError(taskFragmentInfo, opType); } } } libs/WindowManager/Jetpack/src/androidx/window/extensions/embedding/SplitContainer.java +5 −1 Original line number Diff line number Diff line Loading @@ -16,17 +16,21 @@ package androidx.window.extensions.embedding; import android.annotation.NonNull; import android.app.Activity; import android.util.Pair; import android.util.Size; import androidx.annotation.NonNull; /** * Client-side descriptor of a split that holds two containers. */ class SplitContainer { @NonNull private final TaskFragmentContainer mPrimaryContainer; @NonNull private final TaskFragmentContainer mSecondaryContainer; @NonNull private final SplitRule mSplitRule; SplitContainer(@NonNull TaskFragmentContainer primaryContainer, Loading libs/WindowManager/Jetpack/src/androidx/window/extensions/embedding/SplitController.java +12 −9 Original line number Diff line number Diff line Loading @@ -264,7 +264,7 @@ public class SplitController implements JetpackTaskFragmentOrganizer.TaskFragmen } @Override public void onActivityReparentToTask(int taskId, @NonNull Intent activityIntent, public void onActivityReparentedToTask(int taskId, @NonNull Intent activityIntent, @NonNull IBinder activityToken) { synchronized (mLock) { // If the activity belongs to the current app process, we treat it as a new activity Loading Loading @@ -1523,7 +1523,8 @@ public class SplitController implements JetpackTaskFragmentOrganizer.TaskFragmen private final class LifecycleCallbacks extends EmptyLifecycleCallbacksAdapter { @Override public void onActivityPreCreated(Activity activity, Bundle savedInstanceState) { public void onActivityPreCreated(@NonNull Activity activity, @Nullable Bundle savedInstanceState) { synchronized (mLock) { final IBinder activityToken = activity.getActivityToken(); final IBinder initialTaskFragmentToken = getInitialTaskFragmentToken(activity); Loading Loading @@ -1552,7 +1553,8 @@ public class SplitController implements JetpackTaskFragmentOrganizer.TaskFragmen } @Override public void onActivityPostCreated(Activity activity, Bundle savedInstanceState) { public void onActivityPostCreated(@NonNull Activity activity, @Nullable Bundle savedInstanceState) { // Calling after Activity#onCreate is complete to allow the app launch something // first. In case of a configured placeholder activity we want to make sure // that we don't launch it if an activity itself already requested something to be Loading @@ -1563,14 +1565,14 @@ public class SplitController implements JetpackTaskFragmentOrganizer.TaskFragmen } @Override public void onActivityConfigurationChanged(Activity activity) { public void onActivityConfigurationChanged(@NonNull Activity activity) { synchronized (mLock) { SplitController.this.onActivityConfigurationChanged(activity); } } @Override public void onActivityPostDestroyed(Activity activity) { public void onActivityPostDestroyed(@NonNull Activity activity) { synchronized (mLock) { SplitController.this.onActivityDestroyed(activity); } Loading @@ -1582,7 +1584,7 @@ public class SplitController implements JetpackTaskFragmentOrganizer.TaskFragmen private final Handler mHandler = new Handler(Looper.getMainLooper()); @Override public void execute(Runnable r) { public void execute(@NonNull Runnable r) { mHandler.post(r); } } Loading Loading @@ -1662,7 +1664,7 @@ public class SplitController implements JetpackTaskFragmentOrganizer.TaskFragmen * If the two rules have the same presentation, we can reuse the same {@link SplitContainer} if * there is any. */ private static boolean canReuseContainer(SplitRule rule1, SplitRule rule2) { private static boolean canReuseContainer(@NonNull SplitRule rule1, @NonNull SplitRule rule2) { if (!isContainerReusableRule(rule1) || !isContainerReusableRule(rule2)) { return false; } Loading @@ -1670,7 +1672,8 @@ public class SplitController implements JetpackTaskFragmentOrganizer.TaskFragmen } /** Whether the two rules have the same presentation. */ private static boolean haveSamePresentation(SplitPairRule rule1, SplitPairRule rule2) { private static boolean haveSamePresentation(@NonNull SplitPairRule rule1, @NonNull SplitPairRule rule2) { // TODO(b/231655482): add util method to do the comparison in SplitPairRule. return rule1.getSplitRatio() == rule2.getSplitRatio() && rule1.getLayoutDirection() == rule2.getLayoutDirection() Loading @@ -1684,7 +1687,7 @@ public class SplitController implements JetpackTaskFragmentOrganizer.TaskFragmen * Whether it is ok for other rule to reuse the {@link TaskFragmentContainer} of the given * rule. */ private static boolean isContainerReusableRule(SplitRule rule) { private static boolean isContainerReusableRule(@NonNull SplitRule rule) { // We don't expect to reuse the placeholder rule. if (!(rule instanceof SplitPairRule)) { return false; Loading Loading
core/java/android/window/TaskFragmentOrganizer.java +4 −4 Original line number Diff line number Diff line Loading @@ -16,7 +16,7 @@ package android.window; import static android.window.TaskFragmentTransaction.TYPE_ACTIVITY_REPARENT_TO_TASK; import static android.window.TaskFragmentTransaction.TYPE_ACTIVITY_REPARENTED_TO_TASK; import static android.window.TaskFragmentTransaction.TYPE_TASK_FRAGMENT_APPEARED; import static android.window.TaskFragmentTransaction.TYPE_TASK_FRAGMENT_ERROR; import static android.window.TaskFragmentTransaction.TYPE_TASK_FRAGMENT_INFO_CHANGED; Loading Loading @@ -238,7 +238,7 @@ public class TaskFragmentOrganizer extends WindowOrganizer { * {@link WindowContainerTransaction} if needed. * @hide */ public void onActivityReparentToTask(int taskId, @NonNull Intent activityIntent, public void onActivityReparentedToTask(int taskId, @NonNull Intent activityIntent, @NonNull IBinder activityToken) {} /** Loading Loading @@ -298,8 +298,8 @@ public class TaskFragmentOrganizer extends WindowOrganizer { errorBundle.getSerializable(KEY_ERROR_CALLBACK_EXCEPTION, java.lang.Throwable.class)); break; case TYPE_ACTIVITY_REPARENT_TO_TASK: onActivityReparentToTask( case TYPE_ACTIVITY_REPARENTED_TO_TASK: onActivityReparentedToTask( change.getTaskId(), change.getActivityIntent(), change.getActivityToken()); Loading
core/java/android/window/TaskFragmentTransaction.java +4 −4 Original line number Diff line number Diff line Loading @@ -122,7 +122,7 @@ public final class TaskFragmentTransaction implements Parcelable { * then exits Picture-in-picture, it will be reparented back to its original Task. In this case, * we need to notify the organizer so that it can check if the Activity matches any split rule. */ public static final int TYPE_ACTIVITY_REPARENT_TO_TASK = 6; public static final int TYPE_ACTIVITY_REPARENTED_TO_TASK = 6; @IntDef(prefix = { "TYPE_" }, value = { TYPE_TASK_FRAGMENT_APPEARED, Loading @@ -130,7 +130,7 @@ public final class TaskFragmentTransaction implements Parcelable { TYPE_TASK_FRAGMENT_VANISHED, TYPE_TASK_FRAGMENT_PARENT_INFO_CHANGED, TYPE_TASK_FRAGMENT_ERROR, TYPE_ACTIVITY_REPARENT_TO_TASK TYPE_ACTIVITY_REPARENTED_TO_TASK }) @Retention(RetentionPolicy.SOURCE) @interface ChangeType {} Loading Loading @@ -247,7 +247,7 @@ public final class TaskFragmentTransaction implements Parcelable { /** * Intent of the activity that is reparented to the Task for * {@link #TYPE_ACTIVITY_REPARENT_TO_TASK}. * {@link #TYPE_ACTIVITY_REPARENTED_TO_TASK}. */ public Change setActivityIntent(@NonNull Intent intent) { mActivityIntent = requireNonNull(intent); Loading @@ -255,7 +255,7 @@ public final class TaskFragmentTransaction implements Parcelable { } /** * Token of the reparent activity for {@link #TYPE_ACTIVITY_REPARENT_TO_TASK}. * Token of the reparent activity for {@link #TYPE_ACTIVITY_REPARENTED_TO_TASK}. * If the activity belongs to the same process as the organizer, this will be the actual * activity token; if the activity belongs to a different process, the server will generate * a temporary token that the organizer can use to reparent the activity through Loading
libs/WindowManager/Jetpack/src/androidx/window/extensions/embedding/JetpackTaskFragmentOrganizer.java +32 −42 Original line number Diff line number Diff line Loading @@ -51,8 +51,11 @@ class JetpackTaskFragmentOrganizer extends TaskFragmentOrganizer { @VisibleForTesting final Map<IBinder, TaskFragmentInfo> mFragmentInfos = new ArrayMap<>(); @NonNull private final TaskFragmentCallback mCallback; @VisibleForTesting @Nullable TaskFragmentAnimationController mAnimationController; /** Loading @@ -63,7 +66,7 @@ class JetpackTaskFragmentOrganizer extends TaskFragmentOrganizer { void onTaskFragmentInfoChanged(@NonNull TaskFragmentInfo taskFragmentInfo); void onTaskFragmentVanished(@NonNull TaskFragmentInfo taskFragmentInfo); void onTaskFragmentParentInfoChanged(int taskId, @NonNull Configuration parentConfig); void onActivityReparentToTask(int taskId, @NonNull Intent activityIntent, void onActivityReparentedToTask(int taskId, @NonNull Intent activityIntent, @NonNull IBinder activityToken); void onTaskFragmentError(@Nullable TaskFragmentInfo taskFragmentInfo, int opType); } Loading @@ -72,7 +75,8 @@ class JetpackTaskFragmentOrganizer extends TaskFragmentOrganizer { * @param executor callbacks from WM Core are posted on this executor. It should be tied to the * UI thread that all other calls into methods of this class are also on. */ JetpackTaskFragmentOrganizer(@NonNull Executor executor, TaskFragmentCallback callback) { JetpackTaskFragmentOrganizer(@NonNull Executor executor, @NonNull TaskFragmentCallback callback) { super(executor); mCallback = callback; } Loading Loading @@ -147,7 +151,8 @@ class JetpackTaskFragmentOrganizer extends TaskFragmentOrganizer { * @param wct WindowContainerTransaction in which the task fragment should be resized. * @param fragmentToken token of an existing TaskFragment. */ void expandTaskFragment(WindowContainerTransaction wct, IBinder fragmentToken) { void expandTaskFragment(@NonNull WindowContainerTransaction wct, @NonNull IBinder fragmentToken) { resizeTaskFragment(wct, fragmentToken, new Rect()); setAdjacentTaskFragments(wct, fragmentToken, null /* secondary */, null /* splitRule */); updateWindowingMode(wct, fragmentToken, WINDOWING_MODE_UNDEFINED); Loading @@ -157,7 +162,7 @@ class JetpackTaskFragmentOrganizer extends TaskFragmentOrganizer { * Expands an existing TaskFragment to fill parent. * @param fragmentToken token of an existing TaskFragment. */ void expandTaskFragment(IBinder fragmentToken) { void expandTaskFragment(@NonNull IBinder fragmentToken) { WindowContainerTransaction wct = new WindowContainerTransaction(); expandTaskFragment(wct, fragmentToken); applyTransaction(wct); Loading @@ -168,7 +173,7 @@ class JetpackTaskFragmentOrganizer extends TaskFragmentOrganizer { * @param fragmentToken token to create new TaskFragment with. * @param activity activity to move to the fill-parent TaskFragment. */ void expandActivity(IBinder fragmentToken, Activity activity) { void expandActivity(@NonNull IBinder fragmentToken, @NonNull Activity activity) { final WindowContainerTransaction wct = new WindowContainerTransaction(); createTaskFragmentAndReparentActivity( wct, fragmentToken, activity.getActivityToken(), new Rect(), Loading @@ -180,8 +185,8 @@ class JetpackTaskFragmentOrganizer extends TaskFragmentOrganizer { * @param ownerToken The token of the activity that creates this task fragment. It does not * have to be a child of this task fragment, but must belong to the same task. */ void createTaskFragment(WindowContainerTransaction wct, IBinder fragmentToken, IBinder ownerToken, @NonNull Rect bounds, @WindowingMode int windowingMode) { void createTaskFragment(@NonNull WindowContainerTransaction wct, @NonNull IBinder fragmentToken, @NonNull IBinder ownerToken, @NonNull Rect bounds, @WindowingMode int windowingMode) { final TaskFragmentCreationParams fragmentOptions = createFragmentOptions(fragmentToken, ownerToken, bounds, windowingMode); wct.createTaskFragment(fragmentOptions); Loading @@ -191,9 +196,9 @@ class JetpackTaskFragmentOrganizer extends TaskFragmentOrganizer { * @param ownerToken The token of the activity that creates this task fragment. It does not * have to be a child of this task fragment, but must belong to the same task. */ private void createTaskFragmentAndReparentActivity( WindowContainerTransaction wct, IBinder fragmentToken, IBinder ownerToken, @NonNull Rect bounds, @WindowingMode int windowingMode, Activity activity) { private void createTaskFragmentAndReparentActivity(@NonNull WindowContainerTransaction wct, @NonNull IBinder fragmentToken, @NonNull IBinder ownerToken, @NonNull Rect bounds, @WindowingMode int windowingMode, @NonNull Activity activity) { createTaskFragment(wct, fragmentToken, ownerToken, bounds, windowingMode); wct.reparentActivityToTaskFragment(fragmentToken, activity.getActivityToken()); } Loading @@ -202,9 +207,9 @@ class JetpackTaskFragmentOrganizer extends TaskFragmentOrganizer { * @param ownerToken The token of the activity that creates this task fragment. It does not * have to be a child of this task fragment, but must belong to the same task. */ private void createTaskFragmentAndStartActivity( WindowContainerTransaction wct, IBinder fragmentToken, IBinder ownerToken, @NonNull Rect bounds, @WindowingMode int windowingMode, Intent activityIntent, private void createTaskFragmentAndStartActivity(@NonNull WindowContainerTransaction wct, @NonNull IBinder fragmentToken, @NonNull IBinder ownerToken, @NonNull Rect bounds, @WindowingMode int windowingMode, @NonNull Intent activityIntent, @Nullable Bundle activityOptions) { createTaskFragment(wct, fragmentToken, ownerToken, bounds, windowingMode); wct.startActivityInTaskFragment(fragmentToken, ownerToken, activityIntent, activityOptions); Loading @@ -225,8 +230,8 @@ class JetpackTaskFragmentOrganizer extends TaskFragmentOrganizer { wct.setAdjacentTaskFragments(primary, secondary, adjacentParams); } TaskFragmentCreationParams createFragmentOptions(IBinder fragmentToken, IBinder ownerToken, Rect bounds, @WindowingMode int windowingMode) { TaskFragmentCreationParams createFragmentOptions(@NonNull IBinder fragmentToken, @NonNull IBinder ownerToken, @NonNull Rect bounds, @WindowingMode int windowingMode) { if (mFragmentInfos.containsKey(fragmentToken)) { throw new IllegalArgumentException( "There is an existing TaskFragment with fragmentToken=" + fragmentToken); Loading @@ -241,7 +246,7 @@ class JetpackTaskFragmentOrganizer extends TaskFragmentOrganizer { .build(); } void resizeTaskFragment(WindowContainerTransaction wct, IBinder fragmentToken, void resizeTaskFragment(@NonNull WindowContainerTransaction wct, @NonNull IBinder fragmentToken, @Nullable Rect bounds) { if (!mFragmentInfos.containsKey(fragmentToken)) { throw new IllegalArgumentException( Loading @@ -253,8 +258,8 @@ class JetpackTaskFragmentOrganizer extends TaskFragmentOrganizer { wct.setBounds(mFragmentInfos.get(fragmentToken).getToken(), bounds); } void updateWindowingMode(WindowContainerTransaction wct, IBinder fragmentToken, @WindowingMode int windowingMode) { void updateWindowingMode(@NonNull WindowContainerTransaction wct, @NonNull IBinder fragmentToken, @WindowingMode int windowingMode) { if (!mFragmentInfos.containsKey(fragmentToken)) { throw new IllegalArgumentException( "Can't find an existing TaskFragment with fragmentToken=" + fragmentToken); Loading @@ -262,7 +267,8 @@ class JetpackTaskFragmentOrganizer extends TaskFragmentOrganizer { wct.setWindowingMode(mFragmentInfos.get(fragmentToken).getToken(), windowingMode); } void deleteTaskFragment(WindowContainerTransaction wct, IBinder fragmentToken) { void deleteTaskFragment(@NonNull WindowContainerTransaction wct, @NonNull IBinder fragmentToken) { if (!mFragmentInfos.containsKey(fragmentToken)) { throw new IllegalArgumentException( "Can't find an existing TaskFragment with fragmentToken=" + fragmentToken); Loading @@ -274,44 +280,31 @@ class JetpackTaskFragmentOrganizer extends TaskFragmentOrganizer { public void onTaskFragmentAppeared(@NonNull TaskFragmentInfo taskFragmentInfo) { final IBinder fragmentToken = taskFragmentInfo.getFragmentToken(); mFragmentInfos.put(fragmentToken, taskFragmentInfo); if (mCallback != null) { mCallback.onTaskFragmentAppeared(taskFragmentInfo); } } @Override public void onTaskFragmentInfoChanged(@NonNull TaskFragmentInfo taskFragmentInfo) { final IBinder fragmentToken = taskFragmentInfo.getFragmentToken(); mFragmentInfos.put(fragmentToken, taskFragmentInfo); if (mCallback != null) { mCallback.onTaskFragmentInfoChanged(taskFragmentInfo); } } @Override public void onTaskFragmentVanished(@NonNull TaskFragmentInfo taskFragmentInfo) { mFragmentInfos.remove(taskFragmentInfo.getFragmentToken()); if (mCallback != null) { mCallback.onTaskFragmentVanished(taskFragmentInfo); } } @Override public void onTaskFragmentParentInfoChanged(int taskId, @NonNull Configuration parentConfig) { if (mCallback != null) { mCallback.onTaskFragmentParentInfoChanged(taskId, parentConfig); } } @Override public void onActivityReparentToTask(int taskId, @NonNull Intent activityIntent, public void onActivityReparentedToTask(int taskId, @NonNull Intent activityIntent, @NonNull IBinder activityToken) { if (mCallback != null) { mCallback.onActivityReparentToTask(taskId, activityIntent, activityToken); } mCallback.onActivityReparentedToTask(taskId, activityIntent, activityToken); } @Override Loading @@ -322,9 +315,6 @@ class JetpackTaskFragmentOrganizer extends TaskFragmentOrganizer { final IBinder fragmentToken = taskFragmentInfo.getFragmentToken(); mFragmentInfos.put(fragmentToken, taskFragmentInfo); } if (mCallback != null) { mCallback.onTaskFragmentError(taskFragmentInfo, opType); } } }
libs/WindowManager/Jetpack/src/androidx/window/extensions/embedding/SplitContainer.java +5 −1 Original line number Diff line number Diff line Loading @@ -16,17 +16,21 @@ package androidx.window.extensions.embedding; import android.annotation.NonNull; import android.app.Activity; import android.util.Pair; import android.util.Size; import androidx.annotation.NonNull; /** * Client-side descriptor of a split that holds two containers. */ class SplitContainer { @NonNull private final TaskFragmentContainer mPrimaryContainer; @NonNull private final TaskFragmentContainer mSecondaryContainer; @NonNull private final SplitRule mSplitRule; SplitContainer(@NonNull TaskFragmentContainer primaryContainer, Loading
libs/WindowManager/Jetpack/src/androidx/window/extensions/embedding/SplitController.java +12 −9 Original line number Diff line number Diff line Loading @@ -264,7 +264,7 @@ public class SplitController implements JetpackTaskFragmentOrganizer.TaskFragmen } @Override public void onActivityReparentToTask(int taskId, @NonNull Intent activityIntent, public void onActivityReparentedToTask(int taskId, @NonNull Intent activityIntent, @NonNull IBinder activityToken) { synchronized (mLock) { // If the activity belongs to the current app process, we treat it as a new activity Loading Loading @@ -1523,7 +1523,8 @@ public class SplitController implements JetpackTaskFragmentOrganizer.TaskFragmen private final class LifecycleCallbacks extends EmptyLifecycleCallbacksAdapter { @Override public void onActivityPreCreated(Activity activity, Bundle savedInstanceState) { public void onActivityPreCreated(@NonNull Activity activity, @Nullable Bundle savedInstanceState) { synchronized (mLock) { final IBinder activityToken = activity.getActivityToken(); final IBinder initialTaskFragmentToken = getInitialTaskFragmentToken(activity); Loading Loading @@ -1552,7 +1553,8 @@ public class SplitController implements JetpackTaskFragmentOrganizer.TaskFragmen } @Override public void onActivityPostCreated(Activity activity, Bundle savedInstanceState) { public void onActivityPostCreated(@NonNull Activity activity, @Nullable Bundle savedInstanceState) { // Calling after Activity#onCreate is complete to allow the app launch something // first. In case of a configured placeholder activity we want to make sure // that we don't launch it if an activity itself already requested something to be Loading @@ -1563,14 +1565,14 @@ public class SplitController implements JetpackTaskFragmentOrganizer.TaskFragmen } @Override public void onActivityConfigurationChanged(Activity activity) { public void onActivityConfigurationChanged(@NonNull Activity activity) { synchronized (mLock) { SplitController.this.onActivityConfigurationChanged(activity); } } @Override public void onActivityPostDestroyed(Activity activity) { public void onActivityPostDestroyed(@NonNull Activity activity) { synchronized (mLock) { SplitController.this.onActivityDestroyed(activity); } Loading @@ -1582,7 +1584,7 @@ public class SplitController implements JetpackTaskFragmentOrganizer.TaskFragmen private final Handler mHandler = new Handler(Looper.getMainLooper()); @Override public void execute(Runnable r) { public void execute(@NonNull Runnable r) { mHandler.post(r); } } Loading Loading @@ -1662,7 +1664,7 @@ public class SplitController implements JetpackTaskFragmentOrganizer.TaskFragmen * If the two rules have the same presentation, we can reuse the same {@link SplitContainer} if * there is any. */ private static boolean canReuseContainer(SplitRule rule1, SplitRule rule2) { private static boolean canReuseContainer(@NonNull SplitRule rule1, @NonNull SplitRule rule2) { if (!isContainerReusableRule(rule1) || !isContainerReusableRule(rule2)) { return false; } Loading @@ -1670,7 +1672,8 @@ public class SplitController implements JetpackTaskFragmentOrganizer.TaskFragmen } /** Whether the two rules have the same presentation. */ private static boolean haveSamePresentation(SplitPairRule rule1, SplitPairRule rule2) { private static boolean haveSamePresentation(@NonNull SplitPairRule rule1, @NonNull SplitPairRule rule2) { // TODO(b/231655482): add util method to do the comparison in SplitPairRule. return rule1.getSplitRatio() == rule2.getSplitRatio() && rule1.getLayoutDirection() == rule2.getLayoutDirection() Loading @@ -1684,7 +1687,7 @@ public class SplitController implements JetpackTaskFragmentOrganizer.TaskFragmen * Whether it is ok for other rule to reuse the {@link TaskFragmentContainer} of the given * rule. */ private static boolean isContainerReusableRule(SplitRule rule) { private static boolean isContainerReusableRule(@NonNull SplitRule rule) { // We don't expect to reuse the placeholder rule. if (!(rule instanceof SplitPairRule)) { return false; Loading