Loading packages/SystemUI/src/com/android/systemui/stackdivider/DividerView.java +16 −0 Original line number Original line Diff line number Diff line Loading @@ -25,6 +25,7 @@ import android.animation.Animator; import android.animation.AnimatorListenerAdapter; import android.animation.AnimatorListenerAdapter; import android.animation.ValueAnimator; import android.animation.ValueAnimator; import android.annotation.Nullable; import android.annotation.Nullable; import android.app.ActivityTaskManager; import android.content.Context; import android.content.Context; import android.content.res.Configuration; import android.content.res.Configuration; import android.graphics.Rect; import android.graphics.Rect; Loading Loading @@ -129,6 +130,7 @@ public class DividerView extends FrameLayout implements OnTouchListener, private int mDividerInsets; private int mDividerInsets; private final Display mDefaultDisplay; private final Display mDefaultDisplay; private boolean mSupportSplitScreenMultiWindow; private int mDividerSize; private int mDividerSize; private int mTouchElevation; private int mTouchElevation; Loading Loading @@ -282,6 +284,8 @@ public class DividerView extends FrameLayout implements OnTouchListener, final DisplayManager displayManager = final DisplayManager displayManager = (DisplayManager) mContext.getSystemService(Context.DISPLAY_SERVICE); (DisplayManager) mContext.getSystemService(Context.DISPLAY_SERVICE); mDefaultDisplay = displayManager.getDisplay(Display.DEFAULT_DISPLAY); mDefaultDisplay = displayManager.getDisplay(Display.DEFAULT_DISPLAY); mSupportSplitScreenMultiWindow = ActivityTaskManager.supportsSplitScreenMultiWindow(mContext); } } @Override @Override Loading Loading @@ -354,6 +358,11 @@ public class DividerView extends FrameLayout implements OnTouchListener, @Override @Override protected void onLayout(boolean changed, int left, int top, int right, int bottom) { protected void onLayout(boolean changed, int left, int top, int right, int bottom) { if (!mSupportSplitScreenMultiWindow) { super.onLayout(changed, left, top, right, bottom); return; } if (mFirstLayout) { if (mFirstLayout) { // Wait for first layout so that the ViewRootImpl surface has been created. // Wait for first layout so that the ViewRootImpl surface has been created. initializeSurfaceState(); initializeSurfaceState(); Loading Loading @@ -1085,6 +1094,13 @@ public class DividerView extends FrameLayout implements OnTouchListener, crop.offsetTo(-(otherTaskRect.left - otherRect.left), crop.offsetTo(-(otherTaskRect.left - otherRect.left), -(otherTaskRect.top - otherRect.top)); -(otherTaskRect.top - otherRect.top)); t.setWindowCrop(mTiles.mSecondarySurface, crop); t.setWindowCrop(mTiles.mSecondarySurface, crop); // Reposition home and recents surfaces or they would be positioned relatively to its // parent (split-screen secondary task) position. for (int i = mTiles.mHomeAndRecentsSurfaces.size() - 1; i >= 0; --i) { t.setPosition(mTiles.mHomeAndRecentsSurfaces.get(i), mTiles.mHomeBounds.left - otherTaskRect.left, mTiles.mHomeBounds.top - otherTaskRect.top); } final SurfaceControl dividerCtrl = getWindowSurfaceControl(); final SurfaceControl dividerCtrl = getWindowSurfaceControl(); if (dividerCtrl != null) { if (dividerCtrl != null) { if (isHorizontalDivision()) { if (isHorizontalDivision()) { Loading packages/SystemUI/src/com/android/systemui/stackdivider/SplitScreenTaskOrganizer.java +6 −1 Original line number Original line Diff line number Diff line Loading @@ -26,12 +26,15 @@ import static android.window.WindowOrganizer.TaskOrganizer; import android.app.ActivityManager.RunningTaskInfo; import android.app.ActivityManager.RunningTaskInfo; import android.app.WindowConfiguration; import android.app.WindowConfiguration; import android.graphics.Rect; import android.os.RemoteException; import android.os.RemoteException; import android.util.Log; import android.util.Log; import android.view.Display; import android.view.Display; import android.window.ITaskOrganizer; import android.view.SurfaceControl; import android.view.SurfaceControl; import android.view.SurfaceSession; import android.view.SurfaceSession; import android.window.ITaskOrganizer; import java.util.ArrayList; class SplitScreenTaskOrganizer extends ITaskOrganizer.Stub { class SplitScreenTaskOrganizer extends ITaskOrganizer.Stub { private static final String TAG = "SplitScreenTaskOrganizer"; private static final String TAG = "SplitScreenTaskOrganizer"; Loading @@ -43,6 +46,8 @@ class SplitScreenTaskOrganizer extends ITaskOrganizer.Stub { SurfaceControl mSecondarySurface; SurfaceControl mSecondarySurface; SurfaceControl mPrimaryDim; SurfaceControl mPrimaryDim; SurfaceControl mSecondaryDim; SurfaceControl mSecondaryDim; ArrayList<SurfaceControl> mHomeAndRecentsSurfaces = new ArrayList<>(); Rect mHomeBounds = new Rect(); final Divider mDivider; final Divider mDivider; SplitScreenTaskOrganizer(Divider divider) { SplitScreenTaskOrganizer(Divider divider) { Loading packages/SystemUI/src/com/android/systemui/stackdivider/WindowManagerProxy.java +10 −4 Original line number Original line Diff line number Diff line Loading @@ -29,9 +29,9 @@ import android.graphics.Rect; import android.os.RemoteException; import android.os.RemoteException; import android.util.Log; import android.util.Log; import android.view.Display; import android.view.Display; import android.view.WindowManagerGlobal; import android.window.IWindowContainer; import android.window.IWindowContainer; import android.window.WindowContainerTransaction; import android.window.WindowContainerTransaction; import android.view.WindowManagerGlobal; import android.window.WindowOrganizer; import android.window.WindowOrganizer; import com.android.internal.annotations.GuardedBy; import com.android.internal.annotations.GuardedBy; Loading Loading @@ -157,6 +157,7 @@ public class WindowManagerProxy { for (int i = homeStacks.size() - 1; i >= 0; --i) { for (int i = homeStacks.size() - 1; i >= 0; --i) { wct.setBounds(homeStacks.get(i), homeBounds); wct.setBounds(homeStacks.get(i), homeBounds); } } layout.mTiles.mHomeBounds.set(homeBounds); return isHomeResizable; return isHomeResizable; } } Loading @@ -180,13 +181,17 @@ public class WindowManagerProxy { if (rootTasks.isEmpty()) { if (rootTasks.isEmpty()) { return false; return false; } } tiles.mHomeAndRecentsSurfaces.clear(); for (int i = rootTasks.size() - 1; i >= 0; --i) { for (int i = rootTasks.size() - 1; i >= 0; --i) { if (rootTasks.get(i).configuration.windowConfiguration.getWindowingMode() final ActivityManager.RunningTaskInfo rootTask = rootTasks.get(i); if (isHomeOrRecentTask(rootTask)) { tiles.mHomeAndRecentsSurfaces.add(rootTask.token.getLeash()); } if (rootTask.configuration.windowConfiguration.getWindowingMode() != WINDOWING_MODE_FULLSCREEN) { != WINDOWING_MODE_FULLSCREEN) { continue; continue; } } wct.reparent(rootTasks.get(i).token, tiles.mSecondary.token, wct.reparent(rootTask.token, tiles.mSecondary.token, true /* onTop */); true /* onTop */); } } boolean isHomeResizable = applyHomeTasksMinimized(layout, null /* parent */, wct); boolean isHomeResizable = applyHomeTasksMinimized(layout, null /* parent */, wct); WindowOrganizer.applyTransaction(wct); WindowOrganizer.applyTransaction(wct); Loading @@ -213,6 +218,7 @@ public class WindowManagerProxy { // Set launch root first so that any task created after getChildContainers and // Set launch root first so that any task created after getChildContainers and // before reparent (pretty unlikely) are put into fullscreen. // before reparent (pretty unlikely) are put into fullscreen. TaskOrganizer.setLaunchRoot(Display.DEFAULT_DISPLAY, null); TaskOrganizer.setLaunchRoot(Display.DEFAULT_DISPLAY, null); tiles.mHomeAndRecentsSurfaces.clear(); // TODO(task-org): Once task-org is more complete, consider using Appeared/Vanished // TODO(task-org): Once task-org is more complete, consider using Appeared/Vanished // plus specific APIs to clean this up. // plus specific APIs to clean this up. List<ActivityManager.RunningTaskInfo> primaryChildren = List<ActivityManager.RunningTaskInfo> primaryChildren = Loading services/core/java/com/android/server/wm/ActivityStack.java +22 −103 Original line number Original line Diff line number Diff line Loading @@ -302,9 +302,6 @@ class ActivityStack extends Task { private static final int TRANSLUCENT_TIMEOUT_MSG = FIRST_ACTIVITY_STACK_MSG + 1; private static final int TRANSLUCENT_TIMEOUT_MSG = FIRST_ACTIVITY_STACK_MSG + 1; // TODO(task-hierarchy): remove when tiles can be actual parents TaskTile mTile = null; private final Handler mHandler; private final Handler mHandler; private class ActivityStackHandler extends Handler { private class ActivityStackHandler extends Handler { Loading Loading @@ -550,10 +547,10 @@ class ActivityStack extends Task { } } ActivityStack(ActivityTaskManagerService atmService, int id, int activityType, ActivityStack(ActivityTaskManagerService atmService, int id, int activityType, ActivityInfo info, Intent intent) { ActivityInfo info, Intent intent, boolean createdByOrganizer) { this(atmService, id, info, intent, null /*voiceSession*/, null /*voiceInteractor*/, this(atmService, id, info, intent, null /*voiceSession*/, null /*voiceInteractor*/, null /*taskDescription*/, null /*stack*/); null /*taskDescription*/, null /*stack*/); mCreatedByOrganizer = createdByOrganizer; setActivityType(activityType); setActivityType(activityType); } } Loading Loading @@ -599,21 +596,12 @@ class ActivityStack extends Task { mCurrentUser = mAtmService.mAmInternal.getCurrentUserId(); mCurrentUser = mAtmService.mAmInternal.getCurrentUserId(); } } @Override public void resolveTileOverrideConfiguration(Configuration newParentConfig) { super.resolveTileOverrideConfiguration(newParentConfig); if (mTile != null) { // If this is a virtual child of a tile, simulate the parent-child relationship mTile.updateResolvedConfig(getResolvedOverrideConfiguration()); } } @Override @Override public void onConfigurationChanged(Configuration newParentConfig) { public void onConfigurationChanged(Configuration newParentConfig) { // Calling Task#onConfigurationChanged() for leaf task since the ops in this method are // Calling Task#onConfigurationChanged() for leaf task since the ops in this method are // particularly for ActivityStack, like preventing bounds changes when inheriting certain // particularly for ActivityStack, like preventing bounds changes when inheriting certain // windowing mode. // windowing mode. if (!isRootTask() || this instanceof TaskTile) { if (!isRootTask()) { super.onConfigurationChanged(newParentConfig); super.onConfigurationChanged(newParentConfig); return; return; } } Loading Loading @@ -688,6 +676,9 @@ class ActivityStack extends Task { @Override @Override public void setWindowingMode(int windowingMode) { public void setWindowingMode(int windowingMode) { // Reset the cached result of toString() stringName = null; // Calling Task#setWindowingMode() for leaf task since this is the a specialization of // Calling Task#setWindowingMode() for leaf task since this is the a specialization of // {@link #setWindowingMode(int)} for ActivityStack. // {@link #setWindowingMode(int)} for ActivityStack. if (!isRootTask()) { if (!isRootTask()) { Loading Loading @@ -741,7 +732,6 @@ class ActivityStack extends Task { final int currentOverrideMode = getRequestedOverrideWindowingMode(); final int currentOverrideMode = getRequestedOverrideWindowingMode(); final DisplayContent display = getDisplay(); final DisplayContent display = getDisplay(); final Task topTask = getTopMostTask(); final Task topTask = getTopMostTask(); final ActivityStack splitScreenStack = display.getRootSplitScreenPrimaryTask(); int windowingMode = preferredWindowingMode; int windowingMode = preferredWindowingMode; if (preferredWindowingMode == WINDOWING_MODE_UNDEFINED if (preferredWindowingMode == WINDOWING_MODE_UNDEFINED && isTransientWindowingMode(currentMode)) { && isTransientWindowingMode(currentMode)) { Loading @@ -755,14 +745,14 @@ class ActivityStack extends Task { windowingMode = display.validateWindowingMode(windowingMode, windowingMode = display.validateWindowingMode(windowingMode, null /* ActivityRecord */, topTask, getActivityType()); null /* ActivityRecord */, topTask, getActivityType()); } } if (splitScreenStack == this if (display.getRootSplitScreenPrimaryTask() == this && windowingMode == WINDOWING_MODE_SPLIT_SCREEN_SECONDARY) { && windowingMode == WINDOWING_MODE_SPLIT_SCREEN_SECONDARY) { // Resolution to split-screen secondary for the primary split-screen stack means // Resolution to split-screen secondary for the primary split-screen stack means // we want to leave split-screen mode. // we want to leave split-screen mode. windowingMode = mRestoreOverrideWindowingMode; windowingMode = mRestoreOverrideWindowingMode; } } final boolean alreadyInSplitScreenMode = display.hasSplitScreenPrimaryTask(); final boolean alreadyInSplitScreenMode = display.isSplitScreenModeActivated(); // Don't send non-resizeable notifications if the windowing mode changed was a side effect // Don't send non-resizeable notifications if the windowing mode changed was a side effect // of us entering split-screen mode. // of us entering split-screen mode. Loading Loading @@ -830,7 +820,7 @@ class ActivityStack extends Task { return; return; } } if (windowingMode == WINDOWING_MODE_SPLIT_SCREEN_PRIMARY && splitScreenStack != null) { if (windowingMode == WINDOWING_MODE_SPLIT_SCREEN_PRIMARY && alreadyInSplitScreenMode) { // We already have a split-screen stack in this display, so just move the tasks over. // We already have a split-screen stack in this display, so just move the tasks over. // TODO: Figure-out how to do all the stuff in // TODO: Figure-out how to do all the stuff in // AMS.setTaskWindowingModeSplitScreenPrimary // AMS.setTaskWindowingModeSplitScreenPrimary Loading Loading @@ -1062,7 +1052,7 @@ class ActivityStack extends Task { final DisplayContent display = getDisplay(); final DisplayContent display = getDisplay(); if (inSplitScreenSecondaryWindowingMode()) { if (inSplitScreenSecondaryWindowingMode()) { // If the stack is in split-screen seconardy mode, we need to make sure we move the // If the stack is in split-screen secondary mode, we need to make sure we move the // primary split-screen stack forward in the case it is currently behind a fullscreen // primary split-screen stack forward in the case it is currently behind a fullscreen // stack so both halves of the split-screen appear on-top and the fullscreen stack isn't // stack so both halves of the split-screen appear on-top and the fullscreen stack isn't // cutting between them. // cutting between them. Loading @@ -1084,12 +1074,13 @@ class ActivityStack extends Task { display.moveHomeStackToFront(reason + " returnToHome"); display.moveHomeStackToFront(reason + " returnToHome"); } } final boolean movingTask = task != null; if (isRootTask()) { display.positionStackAtTop(this, !movingTask /* includingParents */, reason); display.positionStackAtTop(this, false /* includingParents */, reason); if (movingTask) { // This also moves the entire hierarchy branch to top, including parents positionChildAtTop(task); } } if (task == null) { task = this; } task.getParent().positionChildAt(POSITION_TOP, task, true /* includingParents */); } } /** /** Loading @@ -1115,12 +1106,6 @@ class ActivityStack extends Task { } } } } @Override boolean isFocusable() { // Special check for tile which isn't really in the hierarchy return mTile != null ? mTile.isFocusable() : super.isFocusable(); } boolean isTopActivityFocusable() { boolean isTopActivityFocusable() { final ActivityRecord r = topRunningActivity(); final ActivityRecord r = topRunningActivity(); return r != null ? r.isFocusable() return r != null ? r.isFocusable() Loading Loading @@ -3541,6 +3526,10 @@ class ActivityStack extends Task { @Override @Override void onChildPositionChanged(WindowContainer child) { void onChildPositionChanged(WindowContainer child) { if (isOrganized()) { mAtmService.mTaskOrganizerController.dispatchTaskInfoChanged(this, false /* force */); } if (!mChildren.contains(child)) { if (!mChildren.contains(child)) { return; return; } } Loading Loading @@ -3571,11 +3560,6 @@ class ActivityStack extends Task { if (oldDisplay != null && oldDisplay.isRemoving()) { if (oldDisplay != null && oldDisplay.isRemoving()) { postReparent(); postReparent(); } } if (mTile != null && getSurfaceControl() != null) { // by now, the TaskStack should already have been reparented, so we can reparent its // surface here reparentSurfaceControl(getPendingTransaction(), mTile.getSurfaceControl()); } } } void reparent(DisplayContent newParent, boolean onTop) { void reparent(DisplayContent newParent, boolean onTop) { Loading Loading @@ -3613,16 +3597,7 @@ class ActivityStack extends Task { @Override @Override void getRelativeDisplayedPosition(Point outPos) { void getRelativeDisplayedPosition(Point outPos) { // check for tile which is "virtually" a parent. if (mTile != null) { final Rect dispBounds = getDisplayedBounds(); outPos.set(dispBounds.left, dispBounds.top); final Rect parentBounds = mTile.getBounds(); outPos.offset(-parentBounds.left, -parentBounds.top); } else { super.getRelativeDisplayedPosition(outPos); super.getRelativeDisplayedPosition(outPos); } final int outset = getStackOutset(); final int outset = getStackOutset(); outPos.x -= outset; outPos.x -= outset; outPos.y -= outset; outPos.y -= outset; Loading @@ -3632,16 +3607,6 @@ class ActivityStack extends Task { if (mSurfaceControl == null) { if (mSurfaceControl == null) { return; return; } } if (mTile != null) { // Tile controls crop, so the app needs to be able to draw its background outside of // the stack bounds for when the tile crop gets bigger than the stack. if (mLastSurfaceSize.equals(0, 0)) { return; } transaction.setWindowCrop(mSurfaceControl, null); mLastSurfaceSize.set(0, 0); return; } final Rect stackBounds = getDisplayedBounds(); final Rect stackBounds = getDisplayedBounds(); int width = stackBounds.width(); int width = stackBounds.width(); Loading @@ -3665,9 +3630,6 @@ class ActivityStack extends Task { @Override @Override void onDisplayChanged(DisplayContent dc) { void onDisplayChanged(DisplayContent dc) { if (mTile != null && dc != mTile.getDisplay()) { mTile.removeChild(this); } super.onDisplayChanged(dc); super.onDisplayChanged(dc); if (isRootTask()) { if (isRootTask()) { updateSurfaceBounds(); updateSurfaceBounds(); Loading Loading @@ -3810,49 +3772,6 @@ class ActivityStack extends Task { return shouldSleepActivities() || mAtmService.mShuttingDown; return shouldSleepActivities() || mAtmService.mShuttingDown; } } TaskTile getTile() { return mTile; } /** * Don't call this directly. instead use {@link TaskTile#addChild} or * {@link TaskTile#removeChild}. */ void setTile(TaskTile tile) { TaskTile origTile = mTile; mTile = tile; final ConfigurationContainer parent = getParent(); if (parent != null) { onConfigurationChanged(parent.getConfiguration()); } // Reparent to tile surface or back to original parent if (getSurfaceControl() == null) { return; } if (mTile != null) { // don't use reparentSurfaceControl because we need to bypass taskorg check mSurfaceAnimator.reparent(getPendingTransaction(), mTile.getSurfaceControl()); } else if (mTile == null && origTile != null) { mSurfaceAnimator.reparent(getPendingTransaction(), getParentSurfaceControl()); } } @Override public SurfaceControl getParentSurfaceControl() { // Tile is a "virtual" parent, so we need to intercept the parent surface here return mTile != null ? mTile.getSurfaceControl() : super.getParentSurfaceControl(); } @Override void removeImmediately() { // TODO(task-hierarchy): remove this override when tiles are in hierarchy if (mTile != null) { mTile.removeChild(this); } super.removeImmediately(); } @Override @Override public void dumpDebug(ProtoOutputStream proto, long fieldId, public void dumpDebug(ProtoOutputStream proto, long fieldId, @WindowTraceLogLevel int logLevel) { @WindowTraceLogLevel int logLevel) { Loading Loading @@ -3897,7 +3816,7 @@ class ActivityStack extends Task { proto.write(SURFACE_HEIGHT, mSurfaceControl.getHeight()); proto.write(SURFACE_HEIGHT, mSurfaceControl.getHeight()); } } proto.write(CREATED_BY_ORGANIZER, this instanceof TaskTile); proto.write(CREATED_BY_ORGANIZER, mCreatedByOrganizer); proto.end(token); proto.end(token); } } Loading services/core/java/com/android/server/wm/ActivityStackSupervisor.java +11 −9 Original line number Original line Diff line number Diff line Loading @@ -423,6 +423,10 @@ public class ActivityStackSupervisor implements RecentTasks.Callbacks { final ActivityStack toStack = mToDisplay.getOrCreateStack( final ActivityStack toStack = mToDisplay.getOrCreateStack( null, mTmpOptions, task, task.getActivityType(), mOnTop); null, mTmpOptions, task, task.getActivityType(), mOnTop); if (task == toStack) { // The task was reused as the root task. return; } if (mOnTop) { if (mOnTop) { final boolean isTopTask = task == mTopTask; final boolean isTopTask = task == mTopTask; Loading Loading @@ -1704,7 +1708,7 @@ public class ActivityStackSupervisor implements RecentTasks.Callbacks { mRootWindowContainer.getLaunchStack(null, aOptions, task, onTop); mRootWindowContainer.getLaunchStack(null, aOptions, task, onTop); final WindowContainer parent = task.getParent(); final WindowContainer parent = task.getParent(); if (parent == stack) { if (parent == stack || task == stack) { // Nothing else to do since it is already restored in the right stack. // Nothing else to do since it is already restored in the right stack. return true; return true; } } Loading Loading @@ -2237,7 +2241,7 @@ public class ActivityStackSupervisor implements RecentTasks.Callbacks { final boolean isSecondaryDisplayPreferred = final boolean isSecondaryDisplayPreferred = (preferredDisplayId != DEFAULT_DISPLAY && preferredDisplayId != INVALID_DISPLAY); (preferredDisplayId != DEFAULT_DISPLAY && preferredDisplayId != INVALID_DISPLAY); final boolean inSplitScreenMode = actualStack != null final boolean inSplitScreenMode = actualStack != null && actualStack.getDisplay().hasSplitScreenPrimaryTask(); && actualStack.getDisplay().isSplitScreenModeActivated(); if (((!inSplitScreenMode && preferredWindowingMode != WINDOWING_MODE_SPLIT_SCREEN_PRIMARY) if (((!inSplitScreenMode && preferredWindowingMode != WINDOWING_MODE_SPLIT_SCREEN_PRIMARY) && !isSecondaryDisplayPreferred) || !task.isActivityTypeStandardOrUndefined()) { && !isSecondaryDisplayPreferred) || !task.isActivityTypeStandardOrUndefined()) { return; return; Loading Loading @@ -2284,16 +2288,14 @@ public class ActivityStackSupervisor implements RecentTasks.Callbacks { if (!task.supportsSplitScreenWindowingMode() || forceNonResizable) { if (!task.supportsSplitScreenWindowingMode() || forceNonResizable) { // Dismiss docked stack. If task appeared to be in docked stack but is not resizable - // Dismiss docked stack. If task appeared to be in docked stack but is not resizable - // we need to move it to top of fullscreen stack, otherwise it will be covered. // we need to move it to top of fullscreen stack, otherwise it will be covered. final DisplayContent display = task.getStack().getDisplay(); final ActivityStack dockedStack = if (display.isSplitScreenModeActivated()) { task.getStack().getDisplay().getRootSplitScreenPrimaryTask(); if (dockedStack != null) { // Display a warning toast that we tried to put an app that doesn't support // Display a warning toast that we tried to put an app that doesn't support // split-screen in split-screen. // split-screen in split-screen. mService.getTaskChangeNotificationController() mService.getTaskChangeNotificationController() .notifyActivityDismissingDockedStack(); .notifyActivityDismissingDockedStack(); dockedStack.getDisplay().onSplitScreenModeDismissed(); display.onSplitScreenModeDismissed(); dockedStack.getDisplay().ensureActivitiesVisible(null, 0, PRESERVE_WINDOWS, display.ensureActivitiesVisible(null, 0, PRESERVE_WINDOWS, true /* notifyClients */); true /* notifyClients */); } } return; return; Loading Loading @@ -2602,7 +2604,7 @@ public class ActivityStackSupervisor implements RecentTasks.Callbacks { "startActivityFromRecents: Task " + taskId + " not found."); "startActivityFromRecents: Task " + taskId + " not found."); } else if (windowingMode == WINDOWING_MODE_SPLIT_SCREEN_PRIMARY } else if (windowingMode == WINDOWING_MODE_SPLIT_SCREEN_PRIMARY && task.getWindowingMode() != windowingMode) { && task.getWindowingMode() != windowingMode) { mService.moveTaskToSplitScreenPrimaryTile(task, true /* toTop */); mService.moveTaskToSplitScreenPrimaryTask(task, true /* toTop */); } } if (windowingMode != WINDOWING_MODE_SPLIT_SCREEN_PRIMARY) { if (windowingMode != WINDOWING_MODE_SPLIT_SCREEN_PRIMARY) { Loading Loading
packages/SystemUI/src/com/android/systemui/stackdivider/DividerView.java +16 −0 Original line number Original line Diff line number Diff line Loading @@ -25,6 +25,7 @@ import android.animation.Animator; import android.animation.AnimatorListenerAdapter; import android.animation.AnimatorListenerAdapter; import android.animation.ValueAnimator; import android.animation.ValueAnimator; import android.annotation.Nullable; import android.annotation.Nullable; import android.app.ActivityTaskManager; import android.content.Context; import android.content.Context; import android.content.res.Configuration; import android.content.res.Configuration; import android.graphics.Rect; import android.graphics.Rect; Loading Loading @@ -129,6 +130,7 @@ public class DividerView extends FrameLayout implements OnTouchListener, private int mDividerInsets; private int mDividerInsets; private final Display mDefaultDisplay; private final Display mDefaultDisplay; private boolean mSupportSplitScreenMultiWindow; private int mDividerSize; private int mDividerSize; private int mTouchElevation; private int mTouchElevation; Loading Loading @@ -282,6 +284,8 @@ public class DividerView extends FrameLayout implements OnTouchListener, final DisplayManager displayManager = final DisplayManager displayManager = (DisplayManager) mContext.getSystemService(Context.DISPLAY_SERVICE); (DisplayManager) mContext.getSystemService(Context.DISPLAY_SERVICE); mDefaultDisplay = displayManager.getDisplay(Display.DEFAULT_DISPLAY); mDefaultDisplay = displayManager.getDisplay(Display.DEFAULT_DISPLAY); mSupportSplitScreenMultiWindow = ActivityTaskManager.supportsSplitScreenMultiWindow(mContext); } } @Override @Override Loading Loading @@ -354,6 +358,11 @@ public class DividerView extends FrameLayout implements OnTouchListener, @Override @Override protected void onLayout(boolean changed, int left, int top, int right, int bottom) { protected void onLayout(boolean changed, int left, int top, int right, int bottom) { if (!mSupportSplitScreenMultiWindow) { super.onLayout(changed, left, top, right, bottom); return; } if (mFirstLayout) { if (mFirstLayout) { // Wait for first layout so that the ViewRootImpl surface has been created. // Wait for first layout so that the ViewRootImpl surface has been created. initializeSurfaceState(); initializeSurfaceState(); Loading Loading @@ -1085,6 +1094,13 @@ public class DividerView extends FrameLayout implements OnTouchListener, crop.offsetTo(-(otherTaskRect.left - otherRect.left), crop.offsetTo(-(otherTaskRect.left - otherRect.left), -(otherTaskRect.top - otherRect.top)); -(otherTaskRect.top - otherRect.top)); t.setWindowCrop(mTiles.mSecondarySurface, crop); t.setWindowCrop(mTiles.mSecondarySurface, crop); // Reposition home and recents surfaces or they would be positioned relatively to its // parent (split-screen secondary task) position. for (int i = mTiles.mHomeAndRecentsSurfaces.size() - 1; i >= 0; --i) { t.setPosition(mTiles.mHomeAndRecentsSurfaces.get(i), mTiles.mHomeBounds.left - otherTaskRect.left, mTiles.mHomeBounds.top - otherTaskRect.top); } final SurfaceControl dividerCtrl = getWindowSurfaceControl(); final SurfaceControl dividerCtrl = getWindowSurfaceControl(); if (dividerCtrl != null) { if (dividerCtrl != null) { if (isHorizontalDivision()) { if (isHorizontalDivision()) { Loading
packages/SystemUI/src/com/android/systemui/stackdivider/SplitScreenTaskOrganizer.java +6 −1 Original line number Original line Diff line number Diff line Loading @@ -26,12 +26,15 @@ import static android.window.WindowOrganizer.TaskOrganizer; import android.app.ActivityManager.RunningTaskInfo; import android.app.ActivityManager.RunningTaskInfo; import android.app.WindowConfiguration; import android.app.WindowConfiguration; import android.graphics.Rect; import android.os.RemoteException; import android.os.RemoteException; import android.util.Log; import android.util.Log; import android.view.Display; import android.view.Display; import android.window.ITaskOrganizer; import android.view.SurfaceControl; import android.view.SurfaceControl; import android.view.SurfaceSession; import android.view.SurfaceSession; import android.window.ITaskOrganizer; import java.util.ArrayList; class SplitScreenTaskOrganizer extends ITaskOrganizer.Stub { class SplitScreenTaskOrganizer extends ITaskOrganizer.Stub { private static final String TAG = "SplitScreenTaskOrganizer"; private static final String TAG = "SplitScreenTaskOrganizer"; Loading @@ -43,6 +46,8 @@ class SplitScreenTaskOrganizer extends ITaskOrganizer.Stub { SurfaceControl mSecondarySurface; SurfaceControl mSecondarySurface; SurfaceControl mPrimaryDim; SurfaceControl mPrimaryDim; SurfaceControl mSecondaryDim; SurfaceControl mSecondaryDim; ArrayList<SurfaceControl> mHomeAndRecentsSurfaces = new ArrayList<>(); Rect mHomeBounds = new Rect(); final Divider mDivider; final Divider mDivider; SplitScreenTaskOrganizer(Divider divider) { SplitScreenTaskOrganizer(Divider divider) { Loading
packages/SystemUI/src/com/android/systemui/stackdivider/WindowManagerProxy.java +10 −4 Original line number Original line Diff line number Diff line Loading @@ -29,9 +29,9 @@ import android.graphics.Rect; import android.os.RemoteException; import android.os.RemoteException; import android.util.Log; import android.util.Log; import android.view.Display; import android.view.Display; import android.view.WindowManagerGlobal; import android.window.IWindowContainer; import android.window.IWindowContainer; import android.window.WindowContainerTransaction; import android.window.WindowContainerTransaction; import android.view.WindowManagerGlobal; import android.window.WindowOrganizer; import android.window.WindowOrganizer; import com.android.internal.annotations.GuardedBy; import com.android.internal.annotations.GuardedBy; Loading Loading @@ -157,6 +157,7 @@ public class WindowManagerProxy { for (int i = homeStacks.size() - 1; i >= 0; --i) { for (int i = homeStacks.size() - 1; i >= 0; --i) { wct.setBounds(homeStacks.get(i), homeBounds); wct.setBounds(homeStacks.get(i), homeBounds); } } layout.mTiles.mHomeBounds.set(homeBounds); return isHomeResizable; return isHomeResizable; } } Loading @@ -180,13 +181,17 @@ public class WindowManagerProxy { if (rootTasks.isEmpty()) { if (rootTasks.isEmpty()) { return false; return false; } } tiles.mHomeAndRecentsSurfaces.clear(); for (int i = rootTasks.size() - 1; i >= 0; --i) { for (int i = rootTasks.size() - 1; i >= 0; --i) { if (rootTasks.get(i).configuration.windowConfiguration.getWindowingMode() final ActivityManager.RunningTaskInfo rootTask = rootTasks.get(i); if (isHomeOrRecentTask(rootTask)) { tiles.mHomeAndRecentsSurfaces.add(rootTask.token.getLeash()); } if (rootTask.configuration.windowConfiguration.getWindowingMode() != WINDOWING_MODE_FULLSCREEN) { != WINDOWING_MODE_FULLSCREEN) { continue; continue; } } wct.reparent(rootTasks.get(i).token, tiles.mSecondary.token, wct.reparent(rootTask.token, tiles.mSecondary.token, true /* onTop */); true /* onTop */); } } boolean isHomeResizable = applyHomeTasksMinimized(layout, null /* parent */, wct); boolean isHomeResizable = applyHomeTasksMinimized(layout, null /* parent */, wct); WindowOrganizer.applyTransaction(wct); WindowOrganizer.applyTransaction(wct); Loading @@ -213,6 +218,7 @@ public class WindowManagerProxy { // Set launch root first so that any task created after getChildContainers and // Set launch root first so that any task created after getChildContainers and // before reparent (pretty unlikely) are put into fullscreen. // before reparent (pretty unlikely) are put into fullscreen. TaskOrganizer.setLaunchRoot(Display.DEFAULT_DISPLAY, null); TaskOrganizer.setLaunchRoot(Display.DEFAULT_DISPLAY, null); tiles.mHomeAndRecentsSurfaces.clear(); // TODO(task-org): Once task-org is more complete, consider using Appeared/Vanished // TODO(task-org): Once task-org is more complete, consider using Appeared/Vanished // plus specific APIs to clean this up. // plus specific APIs to clean this up. List<ActivityManager.RunningTaskInfo> primaryChildren = List<ActivityManager.RunningTaskInfo> primaryChildren = Loading
services/core/java/com/android/server/wm/ActivityStack.java +22 −103 Original line number Original line Diff line number Diff line Loading @@ -302,9 +302,6 @@ class ActivityStack extends Task { private static final int TRANSLUCENT_TIMEOUT_MSG = FIRST_ACTIVITY_STACK_MSG + 1; private static final int TRANSLUCENT_TIMEOUT_MSG = FIRST_ACTIVITY_STACK_MSG + 1; // TODO(task-hierarchy): remove when tiles can be actual parents TaskTile mTile = null; private final Handler mHandler; private final Handler mHandler; private class ActivityStackHandler extends Handler { private class ActivityStackHandler extends Handler { Loading Loading @@ -550,10 +547,10 @@ class ActivityStack extends Task { } } ActivityStack(ActivityTaskManagerService atmService, int id, int activityType, ActivityStack(ActivityTaskManagerService atmService, int id, int activityType, ActivityInfo info, Intent intent) { ActivityInfo info, Intent intent, boolean createdByOrganizer) { this(atmService, id, info, intent, null /*voiceSession*/, null /*voiceInteractor*/, this(atmService, id, info, intent, null /*voiceSession*/, null /*voiceInteractor*/, null /*taskDescription*/, null /*stack*/); null /*taskDescription*/, null /*stack*/); mCreatedByOrganizer = createdByOrganizer; setActivityType(activityType); setActivityType(activityType); } } Loading Loading @@ -599,21 +596,12 @@ class ActivityStack extends Task { mCurrentUser = mAtmService.mAmInternal.getCurrentUserId(); mCurrentUser = mAtmService.mAmInternal.getCurrentUserId(); } } @Override public void resolveTileOverrideConfiguration(Configuration newParentConfig) { super.resolveTileOverrideConfiguration(newParentConfig); if (mTile != null) { // If this is a virtual child of a tile, simulate the parent-child relationship mTile.updateResolvedConfig(getResolvedOverrideConfiguration()); } } @Override @Override public void onConfigurationChanged(Configuration newParentConfig) { public void onConfigurationChanged(Configuration newParentConfig) { // Calling Task#onConfigurationChanged() for leaf task since the ops in this method are // Calling Task#onConfigurationChanged() for leaf task since the ops in this method are // particularly for ActivityStack, like preventing bounds changes when inheriting certain // particularly for ActivityStack, like preventing bounds changes when inheriting certain // windowing mode. // windowing mode. if (!isRootTask() || this instanceof TaskTile) { if (!isRootTask()) { super.onConfigurationChanged(newParentConfig); super.onConfigurationChanged(newParentConfig); return; return; } } Loading Loading @@ -688,6 +676,9 @@ class ActivityStack extends Task { @Override @Override public void setWindowingMode(int windowingMode) { public void setWindowingMode(int windowingMode) { // Reset the cached result of toString() stringName = null; // Calling Task#setWindowingMode() for leaf task since this is the a specialization of // Calling Task#setWindowingMode() for leaf task since this is the a specialization of // {@link #setWindowingMode(int)} for ActivityStack. // {@link #setWindowingMode(int)} for ActivityStack. if (!isRootTask()) { if (!isRootTask()) { Loading Loading @@ -741,7 +732,6 @@ class ActivityStack extends Task { final int currentOverrideMode = getRequestedOverrideWindowingMode(); final int currentOverrideMode = getRequestedOverrideWindowingMode(); final DisplayContent display = getDisplay(); final DisplayContent display = getDisplay(); final Task topTask = getTopMostTask(); final Task topTask = getTopMostTask(); final ActivityStack splitScreenStack = display.getRootSplitScreenPrimaryTask(); int windowingMode = preferredWindowingMode; int windowingMode = preferredWindowingMode; if (preferredWindowingMode == WINDOWING_MODE_UNDEFINED if (preferredWindowingMode == WINDOWING_MODE_UNDEFINED && isTransientWindowingMode(currentMode)) { && isTransientWindowingMode(currentMode)) { Loading @@ -755,14 +745,14 @@ class ActivityStack extends Task { windowingMode = display.validateWindowingMode(windowingMode, windowingMode = display.validateWindowingMode(windowingMode, null /* ActivityRecord */, topTask, getActivityType()); null /* ActivityRecord */, topTask, getActivityType()); } } if (splitScreenStack == this if (display.getRootSplitScreenPrimaryTask() == this && windowingMode == WINDOWING_MODE_SPLIT_SCREEN_SECONDARY) { && windowingMode == WINDOWING_MODE_SPLIT_SCREEN_SECONDARY) { // Resolution to split-screen secondary for the primary split-screen stack means // Resolution to split-screen secondary for the primary split-screen stack means // we want to leave split-screen mode. // we want to leave split-screen mode. windowingMode = mRestoreOverrideWindowingMode; windowingMode = mRestoreOverrideWindowingMode; } } final boolean alreadyInSplitScreenMode = display.hasSplitScreenPrimaryTask(); final boolean alreadyInSplitScreenMode = display.isSplitScreenModeActivated(); // Don't send non-resizeable notifications if the windowing mode changed was a side effect // Don't send non-resizeable notifications if the windowing mode changed was a side effect // of us entering split-screen mode. // of us entering split-screen mode. Loading Loading @@ -830,7 +820,7 @@ class ActivityStack extends Task { return; return; } } if (windowingMode == WINDOWING_MODE_SPLIT_SCREEN_PRIMARY && splitScreenStack != null) { if (windowingMode == WINDOWING_MODE_SPLIT_SCREEN_PRIMARY && alreadyInSplitScreenMode) { // We already have a split-screen stack in this display, so just move the tasks over. // We already have a split-screen stack in this display, so just move the tasks over. // TODO: Figure-out how to do all the stuff in // TODO: Figure-out how to do all the stuff in // AMS.setTaskWindowingModeSplitScreenPrimary // AMS.setTaskWindowingModeSplitScreenPrimary Loading Loading @@ -1062,7 +1052,7 @@ class ActivityStack extends Task { final DisplayContent display = getDisplay(); final DisplayContent display = getDisplay(); if (inSplitScreenSecondaryWindowingMode()) { if (inSplitScreenSecondaryWindowingMode()) { // If the stack is in split-screen seconardy mode, we need to make sure we move the // If the stack is in split-screen secondary mode, we need to make sure we move the // primary split-screen stack forward in the case it is currently behind a fullscreen // primary split-screen stack forward in the case it is currently behind a fullscreen // stack so both halves of the split-screen appear on-top and the fullscreen stack isn't // stack so both halves of the split-screen appear on-top and the fullscreen stack isn't // cutting between them. // cutting between them. Loading @@ -1084,12 +1074,13 @@ class ActivityStack extends Task { display.moveHomeStackToFront(reason + " returnToHome"); display.moveHomeStackToFront(reason + " returnToHome"); } } final boolean movingTask = task != null; if (isRootTask()) { display.positionStackAtTop(this, !movingTask /* includingParents */, reason); display.positionStackAtTop(this, false /* includingParents */, reason); if (movingTask) { // This also moves the entire hierarchy branch to top, including parents positionChildAtTop(task); } } if (task == null) { task = this; } task.getParent().positionChildAt(POSITION_TOP, task, true /* includingParents */); } } /** /** Loading @@ -1115,12 +1106,6 @@ class ActivityStack extends Task { } } } } @Override boolean isFocusable() { // Special check for tile which isn't really in the hierarchy return mTile != null ? mTile.isFocusable() : super.isFocusable(); } boolean isTopActivityFocusable() { boolean isTopActivityFocusable() { final ActivityRecord r = topRunningActivity(); final ActivityRecord r = topRunningActivity(); return r != null ? r.isFocusable() return r != null ? r.isFocusable() Loading Loading @@ -3541,6 +3526,10 @@ class ActivityStack extends Task { @Override @Override void onChildPositionChanged(WindowContainer child) { void onChildPositionChanged(WindowContainer child) { if (isOrganized()) { mAtmService.mTaskOrganizerController.dispatchTaskInfoChanged(this, false /* force */); } if (!mChildren.contains(child)) { if (!mChildren.contains(child)) { return; return; } } Loading Loading @@ -3571,11 +3560,6 @@ class ActivityStack extends Task { if (oldDisplay != null && oldDisplay.isRemoving()) { if (oldDisplay != null && oldDisplay.isRemoving()) { postReparent(); postReparent(); } } if (mTile != null && getSurfaceControl() != null) { // by now, the TaskStack should already have been reparented, so we can reparent its // surface here reparentSurfaceControl(getPendingTransaction(), mTile.getSurfaceControl()); } } } void reparent(DisplayContent newParent, boolean onTop) { void reparent(DisplayContent newParent, boolean onTop) { Loading Loading @@ -3613,16 +3597,7 @@ class ActivityStack extends Task { @Override @Override void getRelativeDisplayedPosition(Point outPos) { void getRelativeDisplayedPosition(Point outPos) { // check for tile which is "virtually" a parent. if (mTile != null) { final Rect dispBounds = getDisplayedBounds(); outPos.set(dispBounds.left, dispBounds.top); final Rect parentBounds = mTile.getBounds(); outPos.offset(-parentBounds.left, -parentBounds.top); } else { super.getRelativeDisplayedPosition(outPos); super.getRelativeDisplayedPosition(outPos); } final int outset = getStackOutset(); final int outset = getStackOutset(); outPos.x -= outset; outPos.x -= outset; outPos.y -= outset; outPos.y -= outset; Loading @@ -3632,16 +3607,6 @@ class ActivityStack extends Task { if (mSurfaceControl == null) { if (mSurfaceControl == null) { return; return; } } if (mTile != null) { // Tile controls crop, so the app needs to be able to draw its background outside of // the stack bounds for when the tile crop gets bigger than the stack. if (mLastSurfaceSize.equals(0, 0)) { return; } transaction.setWindowCrop(mSurfaceControl, null); mLastSurfaceSize.set(0, 0); return; } final Rect stackBounds = getDisplayedBounds(); final Rect stackBounds = getDisplayedBounds(); int width = stackBounds.width(); int width = stackBounds.width(); Loading @@ -3665,9 +3630,6 @@ class ActivityStack extends Task { @Override @Override void onDisplayChanged(DisplayContent dc) { void onDisplayChanged(DisplayContent dc) { if (mTile != null && dc != mTile.getDisplay()) { mTile.removeChild(this); } super.onDisplayChanged(dc); super.onDisplayChanged(dc); if (isRootTask()) { if (isRootTask()) { updateSurfaceBounds(); updateSurfaceBounds(); Loading Loading @@ -3810,49 +3772,6 @@ class ActivityStack extends Task { return shouldSleepActivities() || mAtmService.mShuttingDown; return shouldSleepActivities() || mAtmService.mShuttingDown; } } TaskTile getTile() { return mTile; } /** * Don't call this directly. instead use {@link TaskTile#addChild} or * {@link TaskTile#removeChild}. */ void setTile(TaskTile tile) { TaskTile origTile = mTile; mTile = tile; final ConfigurationContainer parent = getParent(); if (parent != null) { onConfigurationChanged(parent.getConfiguration()); } // Reparent to tile surface or back to original parent if (getSurfaceControl() == null) { return; } if (mTile != null) { // don't use reparentSurfaceControl because we need to bypass taskorg check mSurfaceAnimator.reparent(getPendingTransaction(), mTile.getSurfaceControl()); } else if (mTile == null && origTile != null) { mSurfaceAnimator.reparent(getPendingTransaction(), getParentSurfaceControl()); } } @Override public SurfaceControl getParentSurfaceControl() { // Tile is a "virtual" parent, so we need to intercept the parent surface here return mTile != null ? mTile.getSurfaceControl() : super.getParentSurfaceControl(); } @Override void removeImmediately() { // TODO(task-hierarchy): remove this override when tiles are in hierarchy if (mTile != null) { mTile.removeChild(this); } super.removeImmediately(); } @Override @Override public void dumpDebug(ProtoOutputStream proto, long fieldId, public void dumpDebug(ProtoOutputStream proto, long fieldId, @WindowTraceLogLevel int logLevel) { @WindowTraceLogLevel int logLevel) { Loading Loading @@ -3897,7 +3816,7 @@ class ActivityStack extends Task { proto.write(SURFACE_HEIGHT, mSurfaceControl.getHeight()); proto.write(SURFACE_HEIGHT, mSurfaceControl.getHeight()); } } proto.write(CREATED_BY_ORGANIZER, this instanceof TaskTile); proto.write(CREATED_BY_ORGANIZER, mCreatedByOrganizer); proto.end(token); proto.end(token); } } Loading
services/core/java/com/android/server/wm/ActivityStackSupervisor.java +11 −9 Original line number Original line Diff line number Diff line Loading @@ -423,6 +423,10 @@ public class ActivityStackSupervisor implements RecentTasks.Callbacks { final ActivityStack toStack = mToDisplay.getOrCreateStack( final ActivityStack toStack = mToDisplay.getOrCreateStack( null, mTmpOptions, task, task.getActivityType(), mOnTop); null, mTmpOptions, task, task.getActivityType(), mOnTop); if (task == toStack) { // The task was reused as the root task. return; } if (mOnTop) { if (mOnTop) { final boolean isTopTask = task == mTopTask; final boolean isTopTask = task == mTopTask; Loading Loading @@ -1704,7 +1708,7 @@ public class ActivityStackSupervisor implements RecentTasks.Callbacks { mRootWindowContainer.getLaunchStack(null, aOptions, task, onTop); mRootWindowContainer.getLaunchStack(null, aOptions, task, onTop); final WindowContainer parent = task.getParent(); final WindowContainer parent = task.getParent(); if (parent == stack) { if (parent == stack || task == stack) { // Nothing else to do since it is already restored in the right stack. // Nothing else to do since it is already restored in the right stack. return true; return true; } } Loading Loading @@ -2237,7 +2241,7 @@ public class ActivityStackSupervisor implements RecentTasks.Callbacks { final boolean isSecondaryDisplayPreferred = final boolean isSecondaryDisplayPreferred = (preferredDisplayId != DEFAULT_DISPLAY && preferredDisplayId != INVALID_DISPLAY); (preferredDisplayId != DEFAULT_DISPLAY && preferredDisplayId != INVALID_DISPLAY); final boolean inSplitScreenMode = actualStack != null final boolean inSplitScreenMode = actualStack != null && actualStack.getDisplay().hasSplitScreenPrimaryTask(); && actualStack.getDisplay().isSplitScreenModeActivated(); if (((!inSplitScreenMode && preferredWindowingMode != WINDOWING_MODE_SPLIT_SCREEN_PRIMARY) if (((!inSplitScreenMode && preferredWindowingMode != WINDOWING_MODE_SPLIT_SCREEN_PRIMARY) && !isSecondaryDisplayPreferred) || !task.isActivityTypeStandardOrUndefined()) { && !isSecondaryDisplayPreferred) || !task.isActivityTypeStandardOrUndefined()) { return; return; Loading Loading @@ -2284,16 +2288,14 @@ public class ActivityStackSupervisor implements RecentTasks.Callbacks { if (!task.supportsSplitScreenWindowingMode() || forceNonResizable) { if (!task.supportsSplitScreenWindowingMode() || forceNonResizable) { // Dismiss docked stack. If task appeared to be in docked stack but is not resizable - // Dismiss docked stack. If task appeared to be in docked stack but is not resizable - // we need to move it to top of fullscreen stack, otherwise it will be covered. // we need to move it to top of fullscreen stack, otherwise it will be covered. final DisplayContent display = task.getStack().getDisplay(); final ActivityStack dockedStack = if (display.isSplitScreenModeActivated()) { task.getStack().getDisplay().getRootSplitScreenPrimaryTask(); if (dockedStack != null) { // Display a warning toast that we tried to put an app that doesn't support // Display a warning toast that we tried to put an app that doesn't support // split-screen in split-screen. // split-screen in split-screen. mService.getTaskChangeNotificationController() mService.getTaskChangeNotificationController() .notifyActivityDismissingDockedStack(); .notifyActivityDismissingDockedStack(); dockedStack.getDisplay().onSplitScreenModeDismissed(); display.onSplitScreenModeDismissed(); dockedStack.getDisplay().ensureActivitiesVisible(null, 0, PRESERVE_WINDOWS, display.ensureActivitiesVisible(null, 0, PRESERVE_WINDOWS, true /* notifyClients */); true /* notifyClients */); } } return; return; Loading Loading @@ -2602,7 +2604,7 @@ public class ActivityStackSupervisor implements RecentTasks.Callbacks { "startActivityFromRecents: Task " + taskId + " not found."); "startActivityFromRecents: Task " + taskId + " not found."); } else if (windowingMode == WINDOWING_MODE_SPLIT_SCREEN_PRIMARY } else if (windowingMode == WINDOWING_MODE_SPLIT_SCREEN_PRIMARY && task.getWindowingMode() != windowingMode) { && task.getWindowingMode() != windowingMode) { mService.moveTaskToSplitScreenPrimaryTile(task, true /* toTop */); mService.moveTaskToSplitScreenPrimaryTask(task, true /* toTop */); } } if (windowingMode != WINDOWING_MODE_SPLIT_SCREEN_PRIMARY) { if (windowingMode != WINDOWING_MODE_SPLIT_SCREEN_PRIMARY) { Loading