Loading libs/WindowManager/Jetpack/src/androidx/window/extensions/embedding/JetpackTaskFragmentOrganizer.java +3 −4 Original line number Diff line number Diff line Loading @@ -133,8 +133,7 @@ class JetpackTaskFragmentOrganizer extends TaskFragmentOrganizer { // Create or resize the launching TaskFragment. if (mFragmentInfos.containsKey(launchingFragmentToken)) { resizeTaskFragment(wct, launchingFragmentToken, launchingFragmentBounds); wct.setWindowingMode(mFragmentInfos.get(launchingFragmentToken).getToken(), windowingMode); updateWindowingMode(wct, launchingFragmentToken, windowingMode); } else { createTaskFragmentAndReparentActivity(wct, launchingFragmentToken, ownerToken, launchingFragmentBounds, windowingMode, launchingActivity); Loading @@ -157,7 +156,7 @@ class JetpackTaskFragmentOrganizer extends TaskFragmentOrganizer { void expandTaskFragment(WindowContainerTransaction wct, IBinder fragmentToken) { resizeTaskFragment(wct, fragmentToken, new Rect()); setAdjacentTaskFragments(wct, fragmentToken, null /* secondary */, null /* splitRule */); setWindowingMode(wct, fragmentToken, WINDOWING_MODE_UNDEFINED); updateWindowingMode(wct, fragmentToken, WINDOWING_MODE_UNDEFINED); } /** Loading Loading @@ -260,7 +259,7 @@ class JetpackTaskFragmentOrganizer extends TaskFragmentOrganizer { wct.setBounds(mFragmentInfos.get(fragmentToken).getToken(), bounds); } private void setWindowingMode(WindowContainerTransaction wct, IBinder fragmentToken, void updateWindowingMode(WindowContainerTransaction wct, IBinder fragmentToken, @WindowingMode int windowingMode) { if (!mFragmentInfos.containsKey(fragmentToken)) { throw new IllegalArgumentException( Loading libs/WindowManager/Jetpack/src/androidx/window/extensions/embedding/SplitController.java +2 −0 Original line number Diff line number Diff line Loading @@ -17,6 +17,7 @@ package androidx.window.extensions.embedding; import static android.app.WindowConfiguration.WINDOWING_MODE_PINNED; import static android.app.WindowConfiguration.WINDOWING_MODE_UNDEFINED; import static androidx.window.extensions.embedding.SplitContainer.getFinishPrimaryWithSecondaryBehavior; import static androidx.window.extensions.embedding.SplitContainer.getFinishSecondaryWithPrimaryBehavior; Loading Loading @@ -179,6 +180,7 @@ public class SplitController implements JetpackTaskFragmentOrganizer.TaskFragmen // Enter PIP. // All overrides will be cleanup. container.setLastRequestedBounds(null /* bounds */); container.setLastRequestedWindowingMode(WINDOWING_MODE_UNDEFINED); cleanupForEnterPip(wct, container); } else if (wasInPip) { // Exit PIP. Loading libs/WindowManager/Jetpack/src/androidx/window/extensions/embedding/SplitPresenter.java +35 −16 Original line number Diff line number Diff line Loading @@ -30,7 +30,6 @@ import android.util.LayoutDirection; import android.view.View; import android.view.WindowInsets; import android.view.WindowMetrics; import android.window.TaskFragmentCreationParams; import android.window.WindowContainerTransaction; import androidx.annotation.IntDef; Loading Loading @@ -122,7 +121,6 @@ class SplitPresenter extends JetpackTaskFragmentOrganizer { createTaskFragment(wct, secondaryContainer.getTaskFragmentToken(), primaryActivity.getActivityToken(), secondaryRectBounds, windowingMode); secondaryContainer.setLastRequestedBounds(secondaryRectBounds); // Set adjacent to each other so that the containers below will be invisible. setAdjacentTaskFragments(wct, primaryContainer, secondaryContainer, rule); Loading Loading @@ -198,18 +196,10 @@ class SplitPresenter extends JetpackTaskFragmentOrganizer { container = mController.newContainer(activity, taskId); final int windowingMode = mController.getTaskContainer(taskId) .getWindowingModeForSplitTaskFragment(bounds); final TaskFragmentCreationParams fragmentOptions = createFragmentOptions( container.getTaskFragmentToken(), activity.getActivityToken(), bounds, windowingMode); wct.createTaskFragment(fragmentOptions); createTaskFragment(wct, container.getTaskFragmentToken(), activity.getActivityToken(), bounds, windowingMode); wct.reparentActivityToTaskFragment(container.getTaskFragmentToken(), activity.getActivityToken()); container.setLastRequestedBounds(bounds); } else { resizeTaskFragmentIfRegistered(wct, container, bounds); final int windowingMode = mController.getTaskContainer(taskId) Loading Loading @@ -262,9 +252,6 @@ class SplitPresenter extends JetpackTaskFragmentOrganizer { wct.requestFocusOnTaskFragment(primaryContainer.getTaskFragmentToken()); } applyTransaction(wct); primaryContainer.setLastRequestedBounds(primaryRectBounds); secondaryContainer.setLastRequestedBounds(secondaryRectBounds); } /** Loading Loading @@ -346,8 +333,22 @@ class SplitPresenter extends JetpackTaskFragmentOrganizer { @NonNull TaskFragmentContainer container, @WindowingMode int windowingMode) { if (container.getInfo() != null) { wct.setWindowingMode(container.getInfo().getToken(), windowingMode); updateWindowingMode(wct, container.getTaskFragmentToken(), windowingMode); } } @Override void createTaskFragment(@NonNull WindowContainerTransaction wct, @NonNull IBinder fragmentToken, @NonNull IBinder ownerToken, @NonNull Rect bounds, @WindowingMode int windowingMode) { final TaskFragmentContainer container = mController.getContainer(fragmentToken); if (container == null) { throw new IllegalStateException( "Creating a task fragment that is not registered with controller."); } container.setLastRequestedBounds(bounds); container.setLastRequestedWindowingMode(windowingMode); super.createTaskFragment(wct, fragmentToken, ownerToken, bounds, windowingMode); } @Override Loading @@ -368,6 +369,24 @@ class SplitPresenter extends JetpackTaskFragmentOrganizer { super.resizeTaskFragment(wct, fragmentToken, bounds); } @Override void updateWindowingMode(@NonNull WindowContainerTransaction wct, @NonNull IBinder fragmentToken, @WindowingMode int windowingMode) { final TaskFragmentContainer container = mController.getContainer(fragmentToken); if (container == null) { throw new IllegalStateException("Setting windowing mode for a task fragment that is" + " not registered with controller."); } if (container.isLastRequestedWindowingModeEqual(windowingMode)) { // Return early if the windowing mode were already requested return; } container.setLastRequestedWindowingMode(windowingMode); super.updateWindowingMode(wct, fragmentToken, windowingMode); } boolean shouldShowSideBySide(@NonNull SplitContainer splitContainer) { final Rect parentBounds = getParentContainerBounds(splitContainer.getPrimaryContainer()); return shouldShowSideBySide(parentBounds, splitContainer.getSplitRule()); Loading libs/WindowManager/Jetpack/src/androidx/window/extensions/embedding/TaskContainer.java +1 −1 Original line number Diff line number Diff line Loading @@ -106,7 +106,7 @@ class TaskContainer { int getWindowingModeForSplitTaskFragment(@Nullable Rect taskFragmentBounds) { // Only set to multi-windowing mode if the pair are showing side-by-side. Otherwise, it // will be set to UNDEFINED which will then inherit the Task windowing mode. if (taskFragmentBounds == null || taskFragmentBounds.isEmpty()) { if (taskFragmentBounds == null || taskFragmentBounds.isEmpty() || isInPictureInPicture()) { return WINDOWING_MODE_UNDEFINED; } // We use WINDOWING_MODE_MULTI_WINDOW when the Task is fullscreen. Loading libs/WindowManager/Jetpack/src/androidx/window/extensions/embedding/TaskFragmentContainer.java +22 −0 Original line number Diff line number Diff line Loading @@ -17,11 +17,13 @@ package androidx.window.extensions.embedding; import static android.app.ActivityTaskManager.INVALID_TASK_ID; import static android.app.WindowConfiguration.WINDOWING_MODE_UNDEFINED; import android.annotation.NonNull; import android.annotation.Nullable; import android.app.Activity; import android.app.ActivityThread; import android.app.WindowConfiguration.WindowingMode; import android.graphics.Rect; import android.os.Binder; import android.os.IBinder; Loading Loading @@ -72,6 +74,12 @@ class TaskFragmentContainer { */ private final Rect mLastRequestedBounds = new Rect(); /** * Windowing mode that was requested last via {@link android.window.WindowContainerTransaction}. */ @WindowingMode private int mLastRequestedWindowingMode = WINDOWING_MODE_UNDEFINED; /** * Creates a container with an existing activity that will be re-parented to it in a window * container transaction. Loading Loading @@ -300,6 +308,20 @@ class TaskFragmentContainer { } } /** * Checks if last requested windowing mode is equal to the provided value. */ boolean isLastRequestedWindowingModeEqual(@WindowingMode int windowingMode) { return mLastRequestedWindowingMode == windowingMode; } /** * Updates the last requested windowing mode. */ void setLastRequestedWindowingMode(@WindowingMode int windowingModes) { mLastRequestedWindowingMode = windowingModes; } /** Gets the parent leaf Task id. */ int getTaskId() { return mTaskId; Loading Loading
libs/WindowManager/Jetpack/src/androidx/window/extensions/embedding/JetpackTaskFragmentOrganizer.java +3 −4 Original line number Diff line number Diff line Loading @@ -133,8 +133,7 @@ class JetpackTaskFragmentOrganizer extends TaskFragmentOrganizer { // Create or resize the launching TaskFragment. if (mFragmentInfos.containsKey(launchingFragmentToken)) { resizeTaskFragment(wct, launchingFragmentToken, launchingFragmentBounds); wct.setWindowingMode(mFragmentInfos.get(launchingFragmentToken).getToken(), windowingMode); updateWindowingMode(wct, launchingFragmentToken, windowingMode); } else { createTaskFragmentAndReparentActivity(wct, launchingFragmentToken, ownerToken, launchingFragmentBounds, windowingMode, launchingActivity); Loading @@ -157,7 +156,7 @@ class JetpackTaskFragmentOrganizer extends TaskFragmentOrganizer { void expandTaskFragment(WindowContainerTransaction wct, IBinder fragmentToken) { resizeTaskFragment(wct, fragmentToken, new Rect()); setAdjacentTaskFragments(wct, fragmentToken, null /* secondary */, null /* splitRule */); setWindowingMode(wct, fragmentToken, WINDOWING_MODE_UNDEFINED); updateWindowingMode(wct, fragmentToken, WINDOWING_MODE_UNDEFINED); } /** Loading Loading @@ -260,7 +259,7 @@ class JetpackTaskFragmentOrganizer extends TaskFragmentOrganizer { wct.setBounds(mFragmentInfos.get(fragmentToken).getToken(), bounds); } private void setWindowingMode(WindowContainerTransaction wct, IBinder fragmentToken, void updateWindowingMode(WindowContainerTransaction wct, IBinder fragmentToken, @WindowingMode int windowingMode) { if (!mFragmentInfos.containsKey(fragmentToken)) { throw new IllegalArgumentException( Loading
libs/WindowManager/Jetpack/src/androidx/window/extensions/embedding/SplitController.java +2 −0 Original line number Diff line number Diff line Loading @@ -17,6 +17,7 @@ package androidx.window.extensions.embedding; import static android.app.WindowConfiguration.WINDOWING_MODE_PINNED; import static android.app.WindowConfiguration.WINDOWING_MODE_UNDEFINED; import static androidx.window.extensions.embedding.SplitContainer.getFinishPrimaryWithSecondaryBehavior; import static androidx.window.extensions.embedding.SplitContainer.getFinishSecondaryWithPrimaryBehavior; Loading Loading @@ -179,6 +180,7 @@ public class SplitController implements JetpackTaskFragmentOrganizer.TaskFragmen // Enter PIP. // All overrides will be cleanup. container.setLastRequestedBounds(null /* bounds */); container.setLastRequestedWindowingMode(WINDOWING_MODE_UNDEFINED); cleanupForEnterPip(wct, container); } else if (wasInPip) { // Exit PIP. Loading
libs/WindowManager/Jetpack/src/androidx/window/extensions/embedding/SplitPresenter.java +35 −16 Original line number Diff line number Diff line Loading @@ -30,7 +30,6 @@ import android.util.LayoutDirection; import android.view.View; import android.view.WindowInsets; import android.view.WindowMetrics; import android.window.TaskFragmentCreationParams; import android.window.WindowContainerTransaction; import androidx.annotation.IntDef; Loading Loading @@ -122,7 +121,6 @@ class SplitPresenter extends JetpackTaskFragmentOrganizer { createTaskFragment(wct, secondaryContainer.getTaskFragmentToken(), primaryActivity.getActivityToken(), secondaryRectBounds, windowingMode); secondaryContainer.setLastRequestedBounds(secondaryRectBounds); // Set adjacent to each other so that the containers below will be invisible. setAdjacentTaskFragments(wct, primaryContainer, secondaryContainer, rule); Loading Loading @@ -198,18 +196,10 @@ class SplitPresenter extends JetpackTaskFragmentOrganizer { container = mController.newContainer(activity, taskId); final int windowingMode = mController.getTaskContainer(taskId) .getWindowingModeForSplitTaskFragment(bounds); final TaskFragmentCreationParams fragmentOptions = createFragmentOptions( container.getTaskFragmentToken(), activity.getActivityToken(), bounds, windowingMode); wct.createTaskFragment(fragmentOptions); createTaskFragment(wct, container.getTaskFragmentToken(), activity.getActivityToken(), bounds, windowingMode); wct.reparentActivityToTaskFragment(container.getTaskFragmentToken(), activity.getActivityToken()); container.setLastRequestedBounds(bounds); } else { resizeTaskFragmentIfRegistered(wct, container, bounds); final int windowingMode = mController.getTaskContainer(taskId) Loading Loading @@ -262,9 +252,6 @@ class SplitPresenter extends JetpackTaskFragmentOrganizer { wct.requestFocusOnTaskFragment(primaryContainer.getTaskFragmentToken()); } applyTransaction(wct); primaryContainer.setLastRequestedBounds(primaryRectBounds); secondaryContainer.setLastRequestedBounds(secondaryRectBounds); } /** Loading Loading @@ -346,8 +333,22 @@ class SplitPresenter extends JetpackTaskFragmentOrganizer { @NonNull TaskFragmentContainer container, @WindowingMode int windowingMode) { if (container.getInfo() != null) { wct.setWindowingMode(container.getInfo().getToken(), windowingMode); updateWindowingMode(wct, container.getTaskFragmentToken(), windowingMode); } } @Override void createTaskFragment(@NonNull WindowContainerTransaction wct, @NonNull IBinder fragmentToken, @NonNull IBinder ownerToken, @NonNull Rect bounds, @WindowingMode int windowingMode) { final TaskFragmentContainer container = mController.getContainer(fragmentToken); if (container == null) { throw new IllegalStateException( "Creating a task fragment that is not registered with controller."); } container.setLastRequestedBounds(bounds); container.setLastRequestedWindowingMode(windowingMode); super.createTaskFragment(wct, fragmentToken, ownerToken, bounds, windowingMode); } @Override Loading @@ -368,6 +369,24 @@ class SplitPresenter extends JetpackTaskFragmentOrganizer { super.resizeTaskFragment(wct, fragmentToken, bounds); } @Override void updateWindowingMode(@NonNull WindowContainerTransaction wct, @NonNull IBinder fragmentToken, @WindowingMode int windowingMode) { final TaskFragmentContainer container = mController.getContainer(fragmentToken); if (container == null) { throw new IllegalStateException("Setting windowing mode for a task fragment that is" + " not registered with controller."); } if (container.isLastRequestedWindowingModeEqual(windowingMode)) { // Return early if the windowing mode were already requested return; } container.setLastRequestedWindowingMode(windowingMode); super.updateWindowingMode(wct, fragmentToken, windowingMode); } boolean shouldShowSideBySide(@NonNull SplitContainer splitContainer) { final Rect parentBounds = getParentContainerBounds(splitContainer.getPrimaryContainer()); return shouldShowSideBySide(parentBounds, splitContainer.getSplitRule()); Loading
libs/WindowManager/Jetpack/src/androidx/window/extensions/embedding/TaskContainer.java +1 −1 Original line number Diff line number Diff line Loading @@ -106,7 +106,7 @@ class TaskContainer { int getWindowingModeForSplitTaskFragment(@Nullable Rect taskFragmentBounds) { // Only set to multi-windowing mode if the pair are showing side-by-side. Otherwise, it // will be set to UNDEFINED which will then inherit the Task windowing mode. if (taskFragmentBounds == null || taskFragmentBounds.isEmpty()) { if (taskFragmentBounds == null || taskFragmentBounds.isEmpty() || isInPictureInPicture()) { return WINDOWING_MODE_UNDEFINED; } // We use WINDOWING_MODE_MULTI_WINDOW when the Task is fullscreen. Loading
libs/WindowManager/Jetpack/src/androidx/window/extensions/embedding/TaskFragmentContainer.java +22 −0 Original line number Diff line number Diff line Loading @@ -17,11 +17,13 @@ package androidx.window.extensions.embedding; import static android.app.ActivityTaskManager.INVALID_TASK_ID; import static android.app.WindowConfiguration.WINDOWING_MODE_UNDEFINED; import android.annotation.NonNull; import android.annotation.Nullable; import android.app.Activity; import android.app.ActivityThread; import android.app.WindowConfiguration.WindowingMode; import android.graphics.Rect; import android.os.Binder; import android.os.IBinder; Loading Loading @@ -72,6 +74,12 @@ class TaskFragmentContainer { */ private final Rect mLastRequestedBounds = new Rect(); /** * Windowing mode that was requested last via {@link android.window.WindowContainerTransaction}. */ @WindowingMode private int mLastRequestedWindowingMode = WINDOWING_MODE_UNDEFINED; /** * Creates a container with an existing activity that will be re-parented to it in a window * container transaction. Loading Loading @@ -300,6 +308,20 @@ class TaskFragmentContainer { } } /** * Checks if last requested windowing mode is equal to the provided value. */ boolean isLastRequestedWindowingModeEqual(@WindowingMode int windowingMode) { return mLastRequestedWindowingMode == windowingMode; } /** * Updates the last requested windowing mode. */ void setLastRequestedWindowingMode(@WindowingMode int windowingModes) { mLastRequestedWindowingMode = windowingModes; } /** Gets the parent leaf Task id. */ int getTaskId() { return mTaskId; Loading