Loading api/test-current.txt +1 −0 Original line number Original line Diff line number Diff line Loading @@ -111,6 +111,7 @@ package android.app { method public void setLaunchActivityType(int); method public void setLaunchActivityType(int); method public void setLaunchTaskId(int); method public void setLaunchTaskId(int); method public void setLaunchWindowingMode(int); method public void setLaunchWindowingMode(int); method public void setTaskAlwaysOnTop(boolean); method public void setTaskOverlay(boolean, boolean); method public void setTaskOverlay(boolean, boolean); } } Loading core/java/android/app/ActivityOptions.java +27 −0 Original line number Original line Diff line number Diff line Loading @@ -208,6 +208,12 @@ public class ActivityOptions { private static final String KEY_PENDING_INTENT_LAUNCH_FLAGS = private static final String KEY_PENDING_INTENT_LAUNCH_FLAGS = "android.activity.pendingIntentLaunchFlags"; "android.activity.pendingIntentLaunchFlags"; /** * See {@link #setTaskAlwaysOnTop}. * @hide */ private static final String KEY_TASK_ALWAYS_ON_TOP = "android.activity.alwaysOnTop"; /** /** * See {@link #setTaskOverlay}. * See {@link #setTaskOverlay}. * @hide * @hide Loading Loading @@ -337,6 +343,7 @@ public class ActivityOptions { private int mSplitScreenCreateMode = SPLIT_SCREEN_CREATE_MODE_TOP_OR_LEFT; private int mSplitScreenCreateMode = SPLIT_SCREEN_CREATE_MODE_TOP_OR_LEFT; private boolean mLockTaskMode = false; private boolean mLockTaskMode = false; private boolean mDisallowEnterPictureInPictureWhileLaunching; private boolean mDisallowEnterPictureInPictureWhileLaunching; private boolean mTaskAlwaysOnTop; private boolean mTaskOverlay; private boolean mTaskOverlay; private boolean mTaskOverlayCanResume; private boolean mTaskOverlayCanResume; private boolean mAvoidMoveToFront; private boolean mAvoidMoveToFront; Loading Loading @@ -971,6 +978,7 @@ public class ActivityOptions { mLaunchActivityType = opts.getInt(KEY_LAUNCH_ACTIVITY_TYPE, ACTIVITY_TYPE_UNDEFINED); mLaunchActivityType = opts.getInt(KEY_LAUNCH_ACTIVITY_TYPE, ACTIVITY_TYPE_UNDEFINED); mLaunchTaskId = opts.getInt(KEY_LAUNCH_TASK_ID, -1); mLaunchTaskId = opts.getInt(KEY_LAUNCH_TASK_ID, -1); mPendingIntentLaunchFlags = opts.getInt(KEY_PENDING_INTENT_LAUNCH_FLAGS, 0); mPendingIntentLaunchFlags = opts.getInt(KEY_PENDING_INTENT_LAUNCH_FLAGS, 0); mTaskAlwaysOnTop = opts.getBoolean(KEY_TASK_ALWAYS_ON_TOP, false); mTaskOverlay = opts.getBoolean(KEY_TASK_OVERLAY, false); mTaskOverlay = opts.getBoolean(KEY_TASK_OVERLAY, false); mTaskOverlayCanResume = opts.getBoolean(KEY_TASK_OVERLAY_CAN_RESUME, false); mTaskOverlayCanResume = opts.getBoolean(KEY_TASK_OVERLAY_CAN_RESUME, false); mAvoidMoveToFront = opts.getBoolean(KEY_AVOID_MOVE_TO_FRONT, false); mAvoidMoveToFront = opts.getBoolean(KEY_AVOID_MOVE_TO_FRONT, false); Loading Loading @@ -1299,6 +1307,22 @@ public class ActivityOptions { return mPendingIntentLaunchFlags; return mPendingIntentLaunchFlags; } } /** * Set's whether the task for the activity launched with this option should always be on top. * @hide */ @TestApi public void setTaskAlwaysOnTop(boolean alwaysOnTop) { mTaskAlwaysOnTop = alwaysOnTop; } /** * @hide */ public boolean getTaskAlwaysOnTop() { return mTaskAlwaysOnTop; } /** /** * Set's whether the activity launched with this option should be a task overlay. That is the * Set's whether the activity launched with this option should be a task overlay. That is the * activity will always be the top activity of the task. * activity will always be the top activity of the task. Loading Loading @@ -1556,6 +1580,9 @@ public class ActivityOptions { if (mPendingIntentLaunchFlags != 0) { if (mPendingIntentLaunchFlags != 0) { b.putInt(KEY_PENDING_INTENT_LAUNCH_FLAGS, mPendingIntentLaunchFlags); b.putInt(KEY_PENDING_INTENT_LAUNCH_FLAGS, mPendingIntentLaunchFlags); } } if (mTaskAlwaysOnTop) { b.putBoolean(KEY_TASK_ALWAYS_ON_TOP, mTaskAlwaysOnTop); } if (mTaskOverlay) { if (mTaskOverlay) { b.putBoolean(KEY_TASK_OVERLAY, mTaskOverlay); b.putBoolean(KEY_TASK_OVERLAY, mTaskOverlay); } } Loading core/java/android/app/ITaskOrganizerController.aidl +5 −0 Original line number Original line Diff line number Diff line Loading @@ -31,6 +31,11 @@ interface ITaskOrganizerController { */ */ void registerTaskOrganizer(ITaskOrganizer organizer, int windowingMode); void registerTaskOrganizer(ITaskOrganizer organizer, int windowingMode); /** * Unregisters a previously registered task organizer. */ void unregisterTaskOrganizer(ITaskOrganizer organizer); /** /** * Apply multiple WindowContainer operations at once. * Apply multiple WindowContainer operations at once. * @param organizer If non-null this transaction will use the synchronization * @param organizer If non-null this transaction will use the synchronization Loading services/core/java/com/android/server/wm/ActivityStarter.java +34 −16 Original line number Original line Diff line number Diff line Loading @@ -27,8 +27,10 @@ import static android.app.ActivityManager.START_RETURN_INTENT_TO_CALLER; import static android.app.ActivityManager.START_RETURN_LOCK_TASK_MODE_VIOLATION; import static android.app.ActivityManager.START_RETURN_LOCK_TASK_MODE_VIOLATION; import static android.app.ActivityManager.START_SUCCESS; import static android.app.ActivityManager.START_SUCCESS; import static android.app.ActivityManager.START_TASK_TO_FRONT; import static android.app.ActivityManager.START_TASK_TO_FRONT; import static android.app.ActivityTaskManager.INVALID_TASK_ID; import static android.app.WaitResult.LAUNCH_STATE_COLD; import static android.app.WaitResult.LAUNCH_STATE_COLD; import static android.app.WaitResult.LAUNCH_STATE_HOT; import static android.app.WaitResult.LAUNCH_STATE_HOT; import static android.app.WindowConfiguration.WINDOWING_MODE_MULTI_WINDOW; import static android.app.WindowConfiguration.WINDOWING_MODE_SPLIT_SCREEN_PRIMARY; import static android.app.WindowConfiguration.WINDOWING_MODE_SPLIT_SCREEN_PRIMARY; import static android.app.WindowConfiguration.WINDOWING_MODE_SPLIT_SCREEN_SECONDARY; import static android.app.WindowConfiguration.WINDOWING_MODE_SPLIT_SCREEN_SECONDARY; import static android.app.WindowConfiguration.WINDOWING_MODE_UNDEFINED; import static android.app.WindowConfiguration.WINDOWING_MODE_UNDEFINED; Loading Loading @@ -167,6 +169,8 @@ class ActivityStarter { // The display to launch the activity onto, barring any strong reason to do otherwise. // The display to launch the activity onto, barring any strong reason to do otherwise. private int mPreferredDisplayId; private int mPreferredDisplayId; // The windowing mode to apply to the root task, if possible private int mPreferredWindowingMode; private Task mInTask; private Task mInTask; @VisibleForTesting @VisibleForTesting Loading Loading @@ -538,6 +542,7 @@ class ActivityStarter { mStartFlags = starter.mStartFlags; mStartFlags = starter.mStartFlags; mSourceRecord = starter.mSourceRecord; mSourceRecord = starter.mSourceRecord; mPreferredDisplayId = starter.mPreferredDisplayId; mPreferredDisplayId = starter.mPreferredDisplayId; mPreferredWindowingMode = starter.mPreferredWindowingMode; mInTask = starter.mInTask; mInTask = starter.mInTask; mAddingToTask = starter.mAddingToTask; mAddingToTask = starter.mAddingToTask; Loading Loading @@ -1493,8 +1498,6 @@ class ActivityStarter { setInitialState(r, options, inTask, doResume, startFlags, sourceRecord, voiceSession, setInitialState(r, options, inTask, doResume, startFlags, sourceRecord, voiceSession, voiceInteractor, restrictedBgActivity); voiceInteractor, restrictedBgActivity); final int preferredWindowingMode = mLaunchParams.mWindowingMode; computeLaunchingTaskFlags(); computeLaunchingTaskFlags(); computeSourceStack(); computeSourceStack(); Loading Loading @@ -1564,6 +1567,14 @@ class ActivityStarter { if (!mAvoidMoveToFront && mDoResume) { if (!mAvoidMoveToFront && mDoResume) { mTargetStack.moveToFront("reuseOrNewTask"); mTargetStack.moveToFront("reuseOrNewTask"); if (mOptions != null) { if (mPreferredWindowingMode != WINDOWING_MODE_UNDEFINED) { mTargetStack.setWindowingMode(mPreferredWindowingMode); } if (mOptions.getTaskAlwaysOnTop()) { mTargetStack.setAlwaysOnTop(true); } } } } mService.mUgmInternal.grantUriPermissionFromIntent(mCallingUid, mStartActivity.packageName, mService.mUgmInternal.grantUriPermissionFromIntent(mCallingUid, mStartActivity.packageName, Loading Loading @@ -1627,7 +1638,7 @@ class ActivityStarter { // Update the recent tasks list immediately when the activity starts // Update the recent tasks list immediately when the activity starts mSupervisor.mRecentTasks.add(mStartActivity.getTask()); mSupervisor.mRecentTasks.add(mStartActivity.getTask()); mSupervisor.handleNonResizableTaskIfNeeded(mStartActivity.getTask(), mSupervisor.handleNonResizableTaskIfNeeded(mStartActivity.getTask(), preferredWindowingMode, mPreferredDisplayId, mTargetStack); mPreferredWindowingMode, mPreferredDisplayId, mTargetStack); return START_SUCCESS; return START_SUCCESS; } } Loading Loading @@ -1680,9 +1691,10 @@ class ActivityStarter { mSupervisor.getLaunchParamsController().calculate(targetTask, r.info.windowLayout, r, mSupervisor.getLaunchParamsController().calculate(targetTask, r.info.windowLayout, r, sourceRecord, mOptions, PHASE_BOUNDS, mLaunchParams); sourceRecord, mOptions, PHASE_BOUNDS, mLaunchParams); mPreferredDisplayId = mPreferredDisplayId = mLaunchParams.hasPreferredDisplay() mLaunchParams.hasPreferredDisplay() ? mLaunchParams.mPreferredDisplayId ? mLaunchParams.mPreferredDisplayId : DEFAULT_DISPLAY; : DEFAULT_DISPLAY; mPreferredWindowingMode = mLaunchParams.mWindowingMode; } } private int isAllowedToStart(ActivityRecord r, boolean newTask, Task targetTask) { private int isAllowedToStart(ActivityRecord r, boolean newTask, Task targetTask) { Loading Loading @@ -2006,6 +2018,7 @@ class ActivityStarter { mStartFlags = 0; mStartFlags = 0; mSourceRecord = null; mSourceRecord = null; mPreferredDisplayId = INVALID_DISPLAY; mPreferredDisplayId = INVALID_DISPLAY; mPreferredWindowingMode = WINDOWING_MODE_UNDEFINED; mInTask = null; mInTask = null; mAddingToTask = false; mAddingToTask = false; Loading Loading @@ -2054,9 +2067,10 @@ class ActivityStarter { // after we located a reusable task (which might be resided in another display). // after we located a reusable task (which might be resided in another display). mSupervisor.getLaunchParamsController().calculate(inTask, r.info.windowLayout, r, mSupervisor.getLaunchParamsController().calculate(inTask, r.info.windowLayout, r, sourceRecord, options, PHASE_DISPLAY, mLaunchParams); sourceRecord, options, PHASE_DISPLAY, mLaunchParams); mPreferredDisplayId = mPreferredDisplayId = mLaunchParams.hasPreferredDisplay() mLaunchParams.hasPreferredDisplay() ? mLaunchParams.mPreferredDisplayId ? mLaunchParams.mPreferredDisplayId : DEFAULT_DISPLAY; : DEFAULT_DISPLAY; mPreferredWindowingMode = mLaunchParams.mWindowingMode; mLaunchMode = r.launchMode; mLaunchMode = r.launchMode; Loading Loading @@ -2098,7 +2112,7 @@ class ActivityStarter { } } if (mOptions != null) { if (mOptions != null) { if (mOptions.getLaunchTaskId() != -1 && mOptions.getTaskOverlay()) { if (mOptions.getLaunchTaskId() != INVALID_TASK_ID && mOptions.getTaskOverlay()) { r.setTaskOverlay(true); r.setTaskOverlay(true); if (!mOptions.canTaskOverlayResume()) { if (!mOptions.canTaskOverlayResume()) { final Task task = mRootWindowContainer.anyTaskForId( final Task task = mRootWindowContainer.anyTaskForId( Loading Loading @@ -2291,6 +2305,15 @@ class ActivityStarter { * if not or an ActivityRecord with the task into which the new activity should be added. * if not or an ActivityRecord with the task into which the new activity should be added. */ */ private Task getReusableTask() { private Task getReusableTask() { // If a target task is specified, try to reuse that one if (mOptions != null && mOptions.getLaunchTaskId() != INVALID_TASK_ID) { Task launchTask = mRootWindowContainer.anyTaskForId(mOptions.getLaunchTaskId()); if (launchTask != null) { return launchTask; } return null; } // We may want to try to place the new activity in to an existing task. We always // We may want to try to place the new activity in to an existing task. We always // do this if the target activity is singleTask or singleInstance; we will also do // do this if the target activity is singleTask or singleInstance; we will also do // this if NEW_TASK has been requested, and there is not an additional qualifier telling // this if NEW_TASK has been requested, and there is not an additional qualifier telling Loading @@ -2304,12 +2327,7 @@ class ActivityStarter { // same component, then instead of launching bring that one to the front. // same component, then instead of launching bring that one to the front. putIntoExistingTask &= mInTask == null && mStartActivity.resultTo == null; putIntoExistingTask &= mInTask == null && mStartActivity.resultTo == null; ActivityRecord intentActivity = null; ActivityRecord intentActivity = null; if (mOptions != null && mOptions.getLaunchTaskId() != -1) { if (putIntoExistingTask) { Task launchTask = mRootWindowContainer.anyTaskForId(mOptions.getLaunchTaskId()); if (launchTask != null) { return launchTask; } } else if (putIntoExistingTask) { if (LAUNCH_SINGLE_INSTANCE == mLaunchMode) { if (LAUNCH_SINGLE_INSTANCE == mLaunchMode) { // There can be one and only one instance of single instance activity in the // There can be one and only one instance of single instance activity in the // history, and it is always in its own unique task, so we do a special search. // history, and it is always in its own unique task, so we do a special search. Loading services/core/java/com/android/server/wm/InsetsStateController.java +9 −4 Original line number Original line Diff line number Diff line Loading @@ -16,6 +16,7 @@ package com.android.server.wm; package com.android.server.wm; import static android.app.WindowConfiguration.WINDOWING_MODE_MULTI_WINDOW; import static android.app.WindowConfiguration.WINDOWING_MODE_UNDEFINED; import static android.app.WindowConfiguration.WINDOWING_MODE_UNDEFINED; import static android.view.InsetsState.ITYPE_CAPTION_BAR; import static android.view.InsetsState.ITYPE_CAPTION_BAR; import static android.view.InsetsState.ITYPE_IME; import static android.view.InsetsState.ITYPE_IME; Loading Loading @@ -87,7 +88,8 @@ class InsetsStateController { final InsetsSourceProvider provider = target.getControllableInsetProvider(); final InsetsSourceProvider provider = target.getControllableInsetProvider(); final @InternalInsetsType int type = provider != null final @InternalInsetsType int type = provider != null ? provider.getSource().getType() : ITYPE_INVALID; ? provider.getSource().getType() : ITYPE_INVALID; return getInsetsForTypeAndWindowingMode(type, target.getWindowingMode()); return getInsetsForTypeAndWindowingMode(type, target.getWindowingMode(), target.isAlwaysOnTop()); } } InsetsState getInsetsForWindowMetrics(@NonNull WindowManager.LayoutParams attrs) { InsetsState getInsetsForWindowMetrics(@NonNull WindowManager.LayoutParams attrs) { Loading @@ -95,7 +97,9 @@ class InsetsStateController { final WindowToken token = mDisplayContent.getWindowToken(attrs.token); final WindowToken token = mDisplayContent.getWindowToken(attrs.token); final @WindowingMode int windowingMode = token != null final @WindowingMode int windowingMode = token != null ? token.getWindowingMode() : WINDOWING_MODE_UNDEFINED; ? token.getWindowingMode() : WINDOWING_MODE_UNDEFINED; return getInsetsForTypeAndWindowingMode(type, windowingMode); final boolean alwaysOnTop = token != null ? token.isAlwaysOnTop() : false; return getInsetsForTypeAndWindowingMode(type, windowingMode, alwaysOnTop); } } private static @InternalInsetsType int getInsetsTypeForWindowType(int type) { private static @InternalInsetsType int getInsetsTypeForWindowType(int type) { Loading @@ -113,7 +117,7 @@ class InsetsStateController { /** @see #getInsetsForDispatch */ /** @see #getInsetsForDispatch */ private InsetsState getInsetsForTypeAndWindowingMode(@InternalInsetsType int type, private InsetsState getInsetsForTypeAndWindowingMode(@InternalInsetsType int type, @WindowingMode int windowingMode) { @WindowingMode int windowingMode, boolean isAlwaysOnTop) { InsetsState state = mState; InsetsState state = mState; if (type != ITYPE_INVALID) { if (type != ITYPE_INVALID) { Loading Loading @@ -147,7 +151,8 @@ class InsetsStateController { } } } } if (WindowConfiguration.isFloating(windowingMode)) { if (WindowConfiguration.isFloating(windowingMode) || (windowingMode == WINDOWING_MODE_MULTI_WINDOW && isAlwaysOnTop)) { state = new InsetsState(state); state = new InsetsState(state); state.removeSource(ITYPE_STATUS_BAR); state.removeSource(ITYPE_STATUS_BAR); state.removeSource(ITYPE_NAVIGATION_BAR); state.removeSource(ITYPE_NAVIGATION_BAR); Loading Loading
api/test-current.txt +1 −0 Original line number Original line Diff line number Diff line Loading @@ -111,6 +111,7 @@ package android.app { method public void setLaunchActivityType(int); method public void setLaunchActivityType(int); method public void setLaunchTaskId(int); method public void setLaunchTaskId(int); method public void setLaunchWindowingMode(int); method public void setLaunchWindowingMode(int); method public void setTaskAlwaysOnTop(boolean); method public void setTaskOverlay(boolean, boolean); method public void setTaskOverlay(boolean, boolean); } } Loading
core/java/android/app/ActivityOptions.java +27 −0 Original line number Original line Diff line number Diff line Loading @@ -208,6 +208,12 @@ public class ActivityOptions { private static final String KEY_PENDING_INTENT_LAUNCH_FLAGS = private static final String KEY_PENDING_INTENT_LAUNCH_FLAGS = "android.activity.pendingIntentLaunchFlags"; "android.activity.pendingIntentLaunchFlags"; /** * See {@link #setTaskAlwaysOnTop}. * @hide */ private static final String KEY_TASK_ALWAYS_ON_TOP = "android.activity.alwaysOnTop"; /** /** * See {@link #setTaskOverlay}. * See {@link #setTaskOverlay}. * @hide * @hide Loading Loading @@ -337,6 +343,7 @@ public class ActivityOptions { private int mSplitScreenCreateMode = SPLIT_SCREEN_CREATE_MODE_TOP_OR_LEFT; private int mSplitScreenCreateMode = SPLIT_SCREEN_CREATE_MODE_TOP_OR_LEFT; private boolean mLockTaskMode = false; private boolean mLockTaskMode = false; private boolean mDisallowEnterPictureInPictureWhileLaunching; private boolean mDisallowEnterPictureInPictureWhileLaunching; private boolean mTaskAlwaysOnTop; private boolean mTaskOverlay; private boolean mTaskOverlay; private boolean mTaskOverlayCanResume; private boolean mTaskOverlayCanResume; private boolean mAvoidMoveToFront; private boolean mAvoidMoveToFront; Loading Loading @@ -971,6 +978,7 @@ public class ActivityOptions { mLaunchActivityType = opts.getInt(KEY_LAUNCH_ACTIVITY_TYPE, ACTIVITY_TYPE_UNDEFINED); mLaunchActivityType = opts.getInt(KEY_LAUNCH_ACTIVITY_TYPE, ACTIVITY_TYPE_UNDEFINED); mLaunchTaskId = opts.getInt(KEY_LAUNCH_TASK_ID, -1); mLaunchTaskId = opts.getInt(KEY_LAUNCH_TASK_ID, -1); mPendingIntentLaunchFlags = opts.getInt(KEY_PENDING_INTENT_LAUNCH_FLAGS, 0); mPendingIntentLaunchFlags = opts.getInt(KEY_PENDING_INTENT_LAUNCH_FLAGS, 0); mTaskAlwaysOnTop = opts.getBoolean(KEY_TASK_ALWAYS_ON_TOP, false); mTaskOverlay = opts.getBoolean(KEY_TASK_OVERLAY, false); mTaskOverlay = opts.getBoolean(KEY_TASK_OVERLAY, false); mTaskOverlayCanResume = opts.getBoolean(KEY_TASK_OVERLAY_CAN_RESUME, false); mTaskOverlayCanResume = opts.getBoolean(KEY_TASK_OVERLAY_CAN_RESUME, false); mAvoidMoveToFront = opts.getBoolean(KEY_AVOID_MOVE_TO_FRONT, false); mAvoidMoveToFront = opts.getBoolean(KEY_AVOID_MOVE_TO_FRONT, false); Loading Loading @@ -1299,6 +1307,22 @@ public class ActivityOptions { return mPendingIntentLaunchFlags; return mPendingIntentLaunchFlags; } } /** * Set's whether the task for the activity launched with this option should always be on top. * @hide */ @TestApi public void setTaskAlwaysOnTop(boolean alwaysOnTop) { mTaskAlwaysOnTop = alwaysOnTop; } /** * @hide */ public boolean getTaskAlwaysOnTop() { return mTaskAlwaysOnTop; } /** /** * Set's whether the activity launched with this option should be a task overlay. That is the * Set's whether the activity launched with this option should be a task overlay. That is the * activity will always be the top activity of the task. * activity will always be the top activity of the task. Loading Loading @@ -1556,6 +1580,9 @@ public class ActivityOptions { if (mPendingIntentLaunchFlags != 0) { if (mPendingIntentLaunchFlags != 0) { b.putInt(KEY_PENDING_INTENT_LAUNCH_FLAGS, mPendingIntentLaunchFlags); b.putInt(KEY_PENDING_INTENT_LAUNCH_FLAGS, mPendingIntentLaunchFlags); } } if (mTaskAlwaysOnTop) { b.putBoolean(KEY_TASK_ALWAYS_ON_TOP, mTaskAlwaysOnTop); } if (mTaskOverlay) { if (mTaskOverlay) { b.putBoolean(KEY_TASK_OVERLAY, mTaskOverlay); b.putBoolean(KEY_TASK_OVERLAY, mTaskOverlay); } } Loading
core/java/android/app/ITaskOrganizerController.aidl +5 −0 Original line number Original line Diff line number Diff line Loading @@ -31,6 +31,11 @@ interface ITaskOrganizerController { */ */ void registerTaskOrganizer(ITaskOrganizer organizer, int windowingMode); void registerTaskOrganizer(ITaskOrganizer organizer, int windowingMode); /** * Unregisters a previously registered task organizer. */ void unregisterTaskOrganizer(ITaskOrganizer organizer); /** /** * Apply multiple WindowContainer operations at once. * Apply multiple WindowContainer operations at once. * @param organizer If non-null this transaction will use the synchronization * @param organizer If non-null this transaction will use the synchronization Loading
services/core/java/com/android/server/wm/ActivityStarter.java +34 −16 Original line number Original line Diff line number Diff line Loading @@ -27,8 +27,10 @@ import static android.app.ActivityManager.START_RETURN_INTENT_TO_CALLER; import static android.app.ActivityManager.START_RETURN_LOCK_TASK_MODE_VIOLATION; import static android.app.ActivityManager.START_RETURN_LOCK_TASK_MODE_VIOLATION; import static android.app.ActivityManager.START_SUCCESS; import static android.app.ActivityManager.START_SUCCESS; import static android.app.ActivityManager.START_TASK_TO_FRONT; import static android.app.ActivityManager.START_TASK_TO_FRONT; import static android.app.ActivityTaskManager.INVALID_TASK_ID; import static android.app.WaitResult.LAUNCH_STATE_COLD; import static android.app.WaitResult.LAUNCH_STATE_COLD; import static android.app.WaitResult.LAUNCH_STATE_HOT; import static android.app.WaitResult.LAUNCH_STATE_HOT; import static android.app.WindowConfiguration.WINDOWING_MODE_MULTI_WINDOW; import static android.app.WindowConfiguration.WINDOWING_MODE_SPLIT_SCREEN_PRIMARY; import static android.app.WindowConfiguration.WINDOWING_MODE_SPLIT_SCREEN_PRIMARY; import static android.app.WindowConfiguration.WINDOWING_MODE_SPLIT_SCREEN_SECONDARY; import static android.app.WindowConfiguration.WINDOWING_MODE_SPLIT_SCREEN_SECONDARY; import static android.app.WindowConfiguration.WINDOWING_MODE_UNDEFINED; import static android.app.WindowConfiguration.WINDOWING_MODE_UNDEFINED; Loading Loading @@ -167,6 +169,8 @@ class ActivityStarter { // The display to launch the activity onto, barring any strong reason to do otherwise. // The display to launch the activity onto, barring any strong reason to do otherwise. private int mPreferredDisplayId; private int mPreferredDisplayId; // The windowing mode to apply to the root task, if possible private int mPreferredWindowingMode; private Task mInTask; private Task mInTask; @VisibleForTesting @VisibleForTesting Loading Loading @@ -538,6 +542,7 @@ class ActivityStarter { mStartFlags = starter.mStartFlags; mStartFlags = starter.mStartFlags; mSourceRecord = starter.mSourceRecord; mSourceRecord = starter.mSourceRecord; mPreferredDisplayId = starter.mPreferredDisplayId; mPreferredDisplayId = starter.mPreferredDisplayId; mPreferredWindowingMode = starter.mPreferredWindowingMode; mInTask = starter.mInTask; mInTask = starter.mInTask; mAddingToTask = starter.mAddingToTask; mAddingToTask = starter.mAddingToTask; Loading Loading @@ -1493,8 +1498,6 @@ class ActivityStarter { setInitialState(r, options, inTask, doResume, startFlags, sourceRecord, voiceSession, setInitialState(r, options, inTask, doResume, startFlags, sourceRecord, voiceSession, voiceInteractor, restrictedBgActivity); voiceInteractor, restrictedBgActivity); final int preferredWindowingMode = mLaunchParams.mWindowingMode; computeLaunchingTaskFlags(); computeLaunchingTaskFlags(); computeSourceStack(); computeSourceStack(); Loading Loading @@ -1564,6 +1567,14 @@ class ActivityStarter { if (!mAvoidMoveToFront && mDoResume) { if (!mAvoidMoveToFront && mDoResume) { mTargetStack.moveToFront("reuseOrNewTask"); mTargetStack.moveToFront("reuseOrNewTask"); if (mOptions != null) { if (mPreferredWindowingMode != WINDOWING_MODE_UNDEFINED) { mTargetStack.setWindowingMode(mPreferredWindowingMode); } if (mOptions.getTaskAlwaysOnTop()) { mTargetStack.setAlwaysOnTop(true); } } } } mService.mUgmInternal.grantUriPermissionFromIntent(mCallingUid, mStartActivity.packageName, mService.mUgmInternal.grantUriPermissionFromIntent(mCallingUid, mStartActivity.packageName, Loading Loading @@ -1627,7 +1638,7 @@ class ActivityStarter { // Update the recent tasks list immediately when the activity starts // Update the recent tasks list immediately when the activity starts mSupervisor.mRecentTasks.add(mStartActivity.getTask()); mSupervisor.mRecentTasks.add(mStartActivity.getTask()); mSupervisor.handleNonResizableTaskIfNeeded(mStartActivity.getTask(), mSupervisor.handleNonResizableTaskIfNeeded(mStartActivity.getTask(), preferredWindowingMode, mPreferredDisplayId, mTargetStack); mPreferredWindowingMode, mPreferredDisplayId, mTargetStack); return START_SUCCESS; return START_SUCCESS; } } Loading Loading @@ -1680,9 +1691,10 @@ class ActivityStarter { mSupervisor.getLaunchParamsController().calculate(targetTask, r.info.windowLayout, r, mSupervisor.getLaunchParamsController().calculate(targetTask, r.info.windowLayout, r, sourceRecord, mOptions, PHASE_BOUNDS, mLaunchParams); sourceRecord, mOptions, PHASE_BOUNDS, mLaunchParams); mPreferredDisplayId = mPreferredDisplayId = mLaunchParams.hasPreferredDisplay() mLaunchParams.hasPreferredDisplay() ? mLaunchParams.mPreferredDisplayId ? mLaunchParams.mPreferredDisplayId : DEFAULT_DISPLAY; : DEFAULT_DISPLAY; mPreferredWindowingMode = mLaunchParams.mWindowingMode; } } private int isAllowedToStart(ActivityRecord r, boolean newTask, Task targetTask) { private int isAllowedToStart(ActivityRecord r, boolean newTask, Task targetTask) { Loading Loading @@ -2006,6 +2018,7 @@ class ActivityStarter { mStartFlags = 0; mStartFlags = 0; mSourceRecord = null; mSourceRecord = null; mPreferredDisplayId = INVALID_DISPLAY; mPreferredDisplayId = INVALID_DISPLAY; mPreferredWindowingMode = WINDOWING_MODE_UNDEFINED; mInTask = null; mInTask = null; mAddingToTask = false; mAddingToTask = false; Loading Loading @@ -2054,9 +2067,10 @@ class ActivityStarter { // after we located a reusable task (which might be resided in another display). // after we located a reusable task (which might be resided in another display). mSupervisor.getLaunchParamsController().calculate(inTask, r.info.windowLayout, r, mSupervisor.getLaunchParamsController().calculate(inTask, r.info.windowLayout, r, sourceRecord, options, PHASE_DISPLAY, mLaunchParams); sourceRecord, options, PHASE_DISPLAY, mLaunchParams); mPreferredDisplayId = mPreferredDisplayId = mLaunchParams.hasPreferredDisplay() mLaunchParams.hasPreferredDisplay() ? mLaunchParams.mPreferredDisplayId ? mLaunchParams.mPreferredDisplayId : DEFAULT_DISPLAY; : DEFAULT_DISPLAY; mPreferredWindowingMode = mLaunchParams.mWindowingMode; mLaunchMode = r.launchMode; mLaunchMode = r.launchMode; Loading Loading @@ -2098,7 +2112,7 @@ class ActivityStarter { } } if (mOptions != null) { if (mOptions != null) { if (mOptions.getLaunchTaskId() != -1 && mOptions.getTaskOverlay()) { if (mOptions.getLaunchTaskId() != INVALID_TASK_ID && mOptions.getTaskOverlay()) { r.setTaskOverlay(true); r.setTaskOverlay(true); if (!mOptions.canTaskOverlayResume()) { if (!mOptions.canTaskOverlayResume()) { final Task task = mRootWindowContainer.anyTaskForId( final Task task = mRootWindowContainer.anyTaskForId( Loading Loading @@ -2291,6 +2305,15 @@ class ActivityStarter { * if not or an ActivityRecord with the task into which the new activity should be added. * if not or an ActivityRecord with the task into which the new activity should be added. */ */ private Task getReusableTask() { private Task getReusableTask() { // If a target task is specified, try to reuse that one if (mOptions != null && mOptions.getLaunchTaskId() != INVALID_TASK_ID) { Task launchTask = mRootWindowContainer.anyTaskForId(mOptions.getLaunchTaskId()); if (launchTask != null) { return launchTask; } return null; } // We may want to try to place the new activity in to an existing task. We always // We may want to try to place the new activity in to an existing task. We always // do this if the target activity is singleTask or singleInstance; we will also do // do this if the target activity is singleTask or singleInstance; we will also do // this if NEW_TASK has been requested, and there is not an additional qualifier telling // this if NEW_TASK has been requested, and there is not an additional qualifier telling Loading @@ -2304,12 +2327,7 @@ class ActivityStarter { // same component, then instead of launching bring that one to the front. // same component, then instead of launching bring that one to the front. putIntoExistingTask &= mInTask == null && mStartActivity.resultTo == null; putIntoExistingTask &= mInTask == null && mStartActivity.resultTo == null; ActivityRecord intentActivity = null; ActivityRecord intentActivity = null; if (mOptions != null && mOptions.getLaunchTaskId() != -1) { if (putIntoExistingTask) { Task launchTask = mRootWindowContainer.anyTaskForId(mOptions.getLaunchTaskId()); if (launchTask != null) { return launchTask; } } else if (putIntoExistingTask) { if (LAUNCH_SINGLE_INSTANCE == mLaunchMode) { if (LAUNCH_SINGLE_INSTANCE == mLaunchMode) { // There can be one and only one instance of single instance activity in the // There can be one and only one instance of single instance activity in the // history, and it is always in its own unique task, so we do a special search. // history, and it is always in its own unique task, so we do a special search. Loading
services/core/java/com/android/server/wm/InsetsStateController.java +9 −4 Original line number Original line Diff line number Diff line Loading @@ -16,6 +16,7 @@ package com.android.server.wm; package com.android.server.wm; import static android.app.WindowConfiguration.WINDOWING_MODE_MULTI_WINDOW; import static android.app.WindowConfiguration.WINDOWING_MODE_UNDEFINED; import static android.app.WindowConfiguration.WINDOWING_MODE_UNDEFINED; import static android.view.InsetsState.ITYPE_CAPTION_BAR; import static android.view.InsetsState.ITYPE_CAPTION_BAR; import static android.view.InsetsState.ITYPE_IME; import static android.view.InsetsState.ITYPE_IME; Loading Loading @@ -87,7 +88,8 @@ class InsetsStateController { final InsetsSourceProvider provider = target.getControllableInsetProvider(); final InsetsSourceProvider provider = target.getControllableInsetProvider(); final @InternalInsetsType int type = provider != null final @InternalInsetsType int type = provider != null ? provider.getSource().getType() : ITYPE_INVALID; ? provider.getSource().getType() : ITYPE_INVALID; return getInsetsForTypeAndWindowingMode(type, target.getWindowingMode()); return getInsetsForTypeAndWindowingMode(type, target.getWindowingMode(), target.isAlwaysOnTop()); } } InsetsState getInsetsForWindowMetrics(@NonNull WindowManager.LayoutParams attrs) { InsetsState getInsetsForWindowMetrics(@NonNull WindowManager.LayoutParams attrs) { Loading @@ -95,7 +97,9 @@ class InsetsStateController { final WindowToken token = mDisplayContent.getWindowToken(attrs.token); final WindowToken token = mDisplayContent.getWindowToken(attrs.token); final @WindowingMode int windowingMode = token != null final @WindowingMode int windowingMode = token != null ? token.getWindowingMode() : WINDOWING_MODE_UNDEFINED; ? token.getWindowingMode() : WINDOWING_MODE_UNDEFINED; return getInsetsForTypeAndWindowingMode(type, windowingMode); final boolean alwaysOnTop = token != null ? token.isAlwaysOnTop() : false; return getInsetsForTypeAndWindowingMode(type, windowingMode, alwaysOnTop); } } private static @InternalInsetsType int getInsetsTypeForWindowType(int type) { private static @InternalInsetsType int getInsetsTypeForWindowType(int type) { Loading @@ -113,7 +117,7 @@ class InsetsStateController { /** @see #getInsetsForDispatch */ /** @see #getInsetsForDispatch */ private InsetsState getInsetsForTypeAndWindowingMode(@InternalInsetsType int type, private InsetsState getInsetsForTypeAndWindowingMode(@InternalInsetsType int type, @WindowingMode int windowingMode) { @WindowingMode int windowingMode, boolean isAlwaysOnTop) { InsetsState state = mState; InsetsState state = mState; if (type != ITYPE_INVALID) { if (type != ITYPE_INVALID) { Loading Loading @@ -147,7 +151,8 @@ class InsetsStateController { } } } } if (WindowConfiguration.isFloating(windowingMode)) { if (WindowConfiguration.isFloating(windowingMode) || (windowingMode == WINDOWING_MODE_MULTI_WINDOW && isAlwaysOnTop)) { state = new InsetsState(state); state = new InsetsState(state); state.removeSource(ITYPE_STATUS_BAR); state.removeSource(ITYPE_STATUS_BAR); state.removeSource(ITYPE_NAVIGATION_BAR); state.removeSource(ITYPE_NAVIGATION_BAR); Loading