Loading services/core/java/com/android/server/am/ActivityRecord.java +7 −13 Original line number Diff line number Diff line Loading @@ -37,6 +37,8 @@ import static android.content.pm.ActivityInfo.FLAG_MULTIPROCESS; import static android.content.pm.ActivityInfo.FLAG_SHOW_FOR_ALL_USERS; import static android.content.pm.ActivityInfo.FLAG_STATE_NOT_NEEDED; import static android.content.pm.ActivityInfo.LAUNCH_MULTIPLE; import static android.content.pm.ActivityInfo.LAUNCH_SINGLE_INSTANCE; import static android.content.pm.ActivityInfo.LAUNCH_SINGLE_TASK; import static android.content.pm.ActivityInfo.LAUNCH_SINGLE_TOP; import static android.content.pm.ActivityInfo.RESIZE_MODE_FORCE_RESIZEABLE; import static android.content.pm.ActivityInfo.RESIZE_MODE_RESIZEABLE; Loading Loading @@ -773,7 +775,10 @@ final class ActivityRecord implements AppWindowContainerListener { // Remove the activity from the old task and add it to the new task prevTask.removeActivity(this); setTask(newTask, null); // TODO(b/34179495): This should really be set to null in removeActivity() call above, // but really bad things that I can't track down right now happen when I do that. // So, setting it here now and will change later when there is time for investigation. task = null; newTask.addActivityAtIndex(position, this); } Loading Loading @@ -821,19 +826,8 @@ final class ActivityRecord implements AppWindowContainerListener { } } void setTask(TaskRecord newTask, TaskRecord taskToAffiliateWith) { if (task != null && task.removeActivity(this) && task != newTask && task.getStack() != null) { task.getStack().removeTask(task, "setTask"); } task = newTask; setTaskToAffiliateWith(taskToAffiliateWith); } void setTaskToAffiliateWith(TaskRecord taskToAffiliateWith) { if (taskToAffiliateWith != null && launchMode != ActivityInfo.LAUNCH_SINGLE_INSTANCE && launchMode != ActivityInfo.LAUNCH_SINGLE_TASK) { if (launchMode != LAUNCH_SINGLE_INSTANCE && launchMode != LAUNCH_SINGLE_TASK) { task.setTaskToAffiliateWith(taskToAffiliateWith); } } Loading services/core/java/com/android/server/am/ActivityStack.java +7 −3 Original line number Diff line number Diff line Loading @@ -2775,7 +2775,12 @@ final class ActivityStack extends ConfigurationContainer implements StackWindowL // Slot the activity into the history stack and proceed if (DEBUG_ADD_REMOVE) Slog.i(TAG, "Adding activity " + r + " to stack to task " + task, new RuntimeException("here").fillInStackTrace()); // TODO: Need to investigate if it is okay for the controller to already be created by the // time we get to this point. I think it is, but need to double check. // Use test in b/34179495 to trace the call path. if (r.getWindowContainerController() == null) { r.createWindowContainer(); } task.setFrontOfTask(); if (!isHomeOrRecentsStack() || numActivities() > 0) { Loading Loading @@ -2952,8 +2957,7 @@ final class ActivityStack extends ConfigurationContainer implements StackWindowL + targetTask + " Callers=" + Debug.getCallers(4)); if (DEBUG_TASKS) Slog.v(TAG_TASKS, "Pushing next activity " + p + " out to target's task " + target.task); p.setTask(targetTask, null); targetTask.addActivityAtBottom(p); p.reparent(targetTask, 0 /* position - bottom */, "resetTargetTaskIfNeeded"); } mWindowContainerController.positionChildAtBottom( Loading services/core/java/com/android/server/am/ActivityStarter.java +28 −15 Original line number Diff line number Diff line Loading @@ -1615,7 +1615,7 @@ class ActivityStarter { mNewTaskInfo != null ? mNewTaskInfo : mStartActivity.info, mNewTaskIntent != null ? mNewTaskIntent : mIntent, mVoiceSession, mVoiceInteractor, !mLaunchTaskBehind /* toTop */, mStartActivity.mActivityType); mStartActivity.setTask(task, taskToAffiliate); addOrReparentStartingActivity(task, "setTaskFromReuseOrCreateNewTask - mReuseTask"); if (mLaunchBounds != null) { final int stackId = mTargetStack.mStackId; if (StackId.resizeStackWithLaunchBounds(stackId)) { Loading @@ -1625,11 +1625,14 @@ class ActivityStarter { mStartActivity.task.updateOverrideConfiguration(mLaunchBounds); } } if (DEBUG_TASKS) Slog.v(TAG_TASKS, "Starting new activity " + mStartActivity + " in new task " + mStartActivity.task); if (DEBUG_TASKS) Slog.v(TAG_TASKS, "Starting new activity " + mStartActivity + " in new task " + mStartActivity.task); } else { mStartActivity.setTask(mReuseTask, taskToAffiliate); addOrReparentStartingActivity(mReuseTask, "setTaskFromReuseOrCreateNewTask"); } if (taskToAffiliate != null) { mStartActivity.setTaskToAffiliateWith(taskToAffiliate); } if (mSupervisor.isLockTaskModeViolation(mStartActivity.task)) { Loading Loading @@ -1719,7 +1722,7 @@ class ActivityStarter { // An existing activity is starting this new activity, so we want to keep the new one in // the same task as the one that is starting it. mStartActivity.setTask(sourceTask, null); addOrReparentStartingActivity(sourceTask, "setTaskFromSourceRecord"); if (DEBUG_TASKS) Slog.v(TAG_TASKS, "Starting new activity " + mStartActivity + " in existing task " + mStartActivity.task + " from source " + mSourceRecord); return START_SUCCESS; Loading Loading @@ -1752,7 +1755,8 @@ class ActivityStarter { // Check whether we should actually launch the new activity in to the task, // or just reuse the current activity on top. ActivityRecord top = mInTask.getTopActivity(); if (top != null && top.realActivity.equals(mStartActivity.realActivity) && top.userId == mStartActivity.userId) { if (top != null && top.realActivity.equals(mStartActivity.realActivity) && top.userId == mStartActivity.userId) { if ((mLaunchFlags & FLAG_ACTIVITY_SINGLE_TOP) != 0 || mLaunchSingleTop || mLaunchSingleTask) { ActivityStack.logStartActivity(AM_NEW_INTENT, top, top.task); Loading @@ -1761,7 +1765,8 @@ class ActivityStarter { // anything if that is the case, so this is it! return START_RETURN_INTENT_TO_CALLER; } top.deliverNewIntentLocked(mCallingUid, mStartActivity.intent, mStartActivity.launchedFromPackage); top.deliverNewIntentLocked(mCallingUid, mStartActivity.intent, mStartActivity.launchedFromPackage); return START_DELIVERED_TO_TOP; } } Loading @@ -1773,9 +1778,9 @@ class ActivityStarter { return START_TASK_TO_FRONT; } mStartActivity.setTask(mInTask, null); if (DEBUG_TASKS) Slog.v(TAG_TASKS, "Starting new activity " + mStartActivity + " in explicit task " + mStartActivity.task); addOrReparentStartingActivity(mInTask, "setTaskFromInTask"); if (DEBUG_TASKS) Slog.v(TAG_TASKS, "Starting new activity " + mStartActivity + " in explicit task " + mStartActivity.task); return START_SUCCESS; } Loading @@ -1790,10 +1795,18 @@ class ActivityStarter { final TaskRecord task = (prev != null) ? prev.task : mTargetStack.createTaskRecord( mSupervisor.getNextTaskIdForUserLocked(mStartActivity.userId), mStartActivity.info, mIntent, null, null, true, mStartActivity.mActivityType); mStartActivity.setTask(task, null); mStartActivity.task.getStack().positionChildWindowContainerAtTop(mStartActivity.task); if (DEBUG_TASKS) Slog.v(TAG_TASKS, "Starting new activity " + mStartActivity + " in new guessed " + mStartActivity.task); addOrReparentStartingActivity(task, "setTaskToCurrentTopOrCreateNewTask"); mTargetStack.positionChildWindowContainerAtTop(task); if (DEBUG_TASKS) Slog.v(TAG_TASKS, "Starting new activity " + mStartActivity + " in new guessed " + mStartActivity.task); } private void addOrReparentStartingActivity(TaskRecord parent, String reason) { if (mStartActivity.task == null) { parent.addActivityToTop(mStartActivity); } else { mStartActivity.reparent(parent, parent.mActivities.size() /* top */, reason); } } private int adjustLaunchFlagsToDocumentMode(ActivityRecord r, boolean launchSingleInstance, Loading services/core/java/com/android/server/am/TaskRecord.java +14 −1 Original line number Diff line number Diff line Loading @@ -51,6 +51,7 @@ import android.util.Slog; import com.android.internal.app.IVoiceInteractor; import com.android.internal.util.XmlUtils; import com.android.server.wm.AppWindowContainerController; import com.android.server.wm.TaskWindowContainerController; import com.android.server.wm.TaskWindowContainerListener; Loading Loading @@ -1033,6 +1034,12 @@ final class TaskRecord extends ConfigurationContainer implements TaskWindowConta * be in the current task or unparented to any task. */ void addActivityAtIndex(int index, ActivityRecord r) { if (r.task != null && r.task != this) { throw new IllegalArgumentException("Can not add r=" + " to task=" + this + " current parent=" + r.task); } r.task = this; // Remove r first, and if it wasn't already in the list and it's fullscreen, count it. if (!mActivities.remove(r) && r.fullscreen) { // Was not previously in list. Loading Loading @@ -1063,6 +1070,7 @@ final class TaskRecord extends ConfigurationContainer implements TaskWindowConta } } index = Math.min(size, index); mActivities.add(index, r); updateEffectiveIntent(); if (r.isPersistable()) { Loading @@ -1071,7 +1079,12 @@ final class TaskRecord extends ConfigurationContainer implements TaskWindowConta // Sync. with window manager updateOverrideConfigurationFromLaunchBounds(); mWindowContainerController.positionChildAt(r.getWindowContainerController(), index); final AppWindowContainerController appController = r.getWindowContainerController(); if (appController != null) { // Only attempt to move in WM if the child has a controller. It is possible we haven't // created controller for the activity we are starting yet. mWindowContainerController.positionChildAt(appController, index); } r.onOverrideConfigurationSent(); } Loading Loading
services/core/java/com/android/server/am/ActivityRecord.java +7 −13 Original line number Diff line number Diff line Loading @@ -37,6 +37,8 @@ import static android.content.pm.ActivityInfo.FLAG_MULTIPROCESS; import static android.content.pm.ActivityInfo.FLAG_SHOW_FOR_ALL_USERS; import static android.content.pm.ActivityInfo.FLAG_STATE_NOT_NEEDED; import static android.content.pm.ActivityInfo.LAUNCH_MULTIPLE; import static android.content.pm.ActivityInfo.LAUNCH_SINGLE_INSTANCE; import static android.content.pm.ActivityInfo.LAUNCH_SINGLE_TASK; import static android.content.pm.ActivityInfo.LAUNCH_SINGLE_TOP; import static android.content.pm.ActivityInfo.RESIZE_MODE_FORCE_RESIZEABLE; import static android.content.pm.ActivityInfo.RESIZE_MODE_RESIZEABLE; Loading Loading @@ -773,7 +775,10 @@ final class ActivityRecord implements AppWindowContainerListener { // Remove the activity from the old task and add it to the new task prevTask.removeActivity(this); setTask(newTask, null); // TODO(b/34179495): This should really be set to null in removeActivity() call above, // but really bad things that I can't track down right now happen when I do that. // So, setting it here now and will change later when there is time for investigation. task = null; newTask.addActivityAtIndex(position, this); } Loading Loading @@ -821,19 +826,8 @@ final class ActivityRecord implements AppWindowContainerListener { } } void setTask(TaskRecord newTask, TaskRecord taskToAffiliateWith) { if (task != null && task.removeActivity(this) && task != newTask && task.getStack() != null) { task.getStack().removeTask(task, "setTask"); } task = newTask; setTaskToAffiliateWith(taskToAffiliateWith); } void setTaskToAffiliateWith(TaskRecord taskToAffiliateWith) { if (taskToAffiliateWith != null && launchMode != ActivityInfo.LAUNCH_SINGLE_INSTANCE && launchMode != ActivityInfo.LAUNCH_SINGLE_TASK) { if (launchMode != LAUNCH_SINGLE_INSTANCE && launchMode != LAUNCH_SINGLE_TASK) { task.setTaskToAffiliateWith(taskToAffiliateWith); } } Loading
services/core/java/com/android/server/am/ActivityStack.java +7 −3 Original line number Diff line number Diff line Loading @@ -2775,7 +2775,12 @@ final class ActivityStack extends ConfigurationContainer implements StackWindowL // Slot the activity into the history stack and proceed if (DEBUG_ADD_REMOVE) Slog.i(TAG, "Adding activity " + r + " to stack to task " + task, new RuntimeException("here").fillInStackTrace()); // TODO: Need to investigate if it is okay for the controller to already be created by the // time we get to this point. I think it is, but need to double check. // Use test in b/34179495 to trace the call path. if (r.getWindowContainerController() == null) { r.createWindowContainer(); } task.setFrontOfTask(); if (!isHomeOrRecentsStack() || numActivities() > 0) { Loading Loading @@ -2952,8 +2957,7 @@ final class ActivityStack extends ConfigurationContainer implements StackWindowL + targetTask + " Callers=" + Debug.getCallers(4)); if (DEBUG_TASKS) Slog.v(TAG_TASKS, "Pushing next activity " + p + " out to target's task " + target.task); p.setTask(targetTask, null); targetTask.addActivityAtBottom(p); p.reparent(targetTask, 0 /* position - bottom */, "resetTargetTaskIfNeeded"); } mWindowContainerController.positionChildAtBottom( Loading
services/core/java/com/android/server/am/ActivityStarter.java +28 −15 Original line number Diff line number Diff line Loading @@ -1615,7 +1615,7 @@ class ActivityStarter { mNewTaskInfo != null ? mNewTaskInfo : mStartActivity.info, mNewTaskIntent != null ? mNewTaskIntent : mIntent, mVoiceSession, mVoiceInteractor, !mLaunchTaskBehind /* toTop */, mStartActivity.mActivityType); mStartActivity.setTask(task, taskToAffiliate); addOrReparentStartingActivity(task, "setTaskFromReuseOrCreateNewTask - mReuseTask"); if (mLaunchBounds != null) { final int stackId = mTargetStack.mStackId; if (StackId.resizeStackWithLaunchBounds(stackId)) { Loading @@ -1625,11 +1625,14 @@ class ActivityStarter { mStartActivity.task.updateOverrideConfiguration(mLaunchBounds); } } if (DEBUG_TASKS) Slog.v(TAG_TASKS, "Starting new activity " + mStartActivity + " in new task " + mStartActivity.task); if (DEBUG_TASKS) Slog.v(TAG_TASKS, "Starting new activity " + mStartActivity + " in new task " + mStartActivity.task); } else { mStartActivity.setTask(mReuseTask, taskToAffiliate); addOrReparentStartingActivity(mReuseTask, "setTaskFromReuseOrCreateNewTask"); } if (taskToAffiliate != null) { mStartActivity.setTaskToAffiliateWith(taskToAffiliate); } if (mSupervisor.isLockTaskModeViolation(mStartActivity.task)) { Loading Loading @@ -1719,7 +1722,7 @@ class ActivityStarter { // An existing activity is starting this new activity, so we want to keep the new one in // the same task as the one that is starting it. mStartActivity.setTask(sourceTask, null); addOrReparentStartingActivity(sourceTask, "setTaskFromSourceRecord"); if (DEBUG_TASKS) Slog.v(TAG_TASKS, "Starting new activity " + mStartActivity + " in existing task " + mStartActivity.task + " from source " + mSourceRecord); return START_SUCCESS; Loading Loading @@ -1752,7 +1755,8 @@ class ActivityStarter { // Check whether we should actually launch the new activity in to the task, // or just reuse the current activity on top. ActivityRecord top = mInTask.getTopActivity(); if (top != null && top.realActivity.equals(mStartActivity.realActivity) && top.userId == mStartActivity.userId) { if (top != null && top.realActivity.equals(mStartActivity.realActivity) && top.userId == mStartActivity.userId) { if ((mLaunchFlags & FLAG_ACTIVITY_SINGLE_TOP) != 0 || mLaunchSingleTop || mLaunchSingleTask) { ActivityStack.logStartActivity(AM_NEW_INTENT, top, top.task); Loading @@ -1761,7 +1765,8 @@ class ActivityStarter { // anything if that is the case, so this is it! return START_RETURN_INTENT_TO_CALLER; } top.deliverNewIntentLocked(mCallingUid, mStartActivity.intent, mStartActivity.launchedFromPackage); top.deliverNewIntentLocked(mCallingUid, mStartActivity.intent, mStartActivity.launchedFromPackage); return START_DELIVERED_TO_TOP; } } Loading @@ -1773,9 +1778,9 @@ class ActivityStarter { return START_TASK_TO_FRONT; } mStartActivity.setTask(mInTask, null); if (DEBUG_TASKS) Slog.v(TAG_TASKS, "Starting new activity " + mStartActivity + " in explicit task " + mStartActivity.task); addOrReparentStartingActivity(mInTask, "setTaskFromInTask"); if (DEBUG_TASKS) Slog.v(TAG_TASKS, "Starting new activity " + mStartActivity + " in explicit task " + mStartActivity.task); return START_SUCCESS; } Loading @@ -1790,10 +1795,18 @@ class ActivityStarter { final TaskRecord task = (prev != null) ? prev.task : mTargetStack.createTaskRecord( mSupervisor.getNextTaskIdForUserLocked(mStartActivity.userId), mStartActivity.info, mIntent, null, null, true, mStartActivity.mActivityType); mStartActivity.setTask(task, null); mStartActivity.task.getStack().positionChildWindowContainerAtTop(mStartActivity.task); if (DEBUG_TASKS) Slog.v(TAG_TASKS, "Starting new activity " + mStartActivity + " in new guessed " + mStartActivity.task); addOrReparentStartingActivity(task, "setTaskToCurrentTopOrCreateNewTask"); mTargetStack.positionChildWindowContainerAtTop(task); if (DEBUG_TASKS) Slog.v(TAG_TASKS, "Starting new activity " + mStartActivity + " in new guessed " + mStartActivity.task); } private void addOrReparentStartingActivity(TaskRecord parent, String reason) { if (mStartActivity.task == null) { parent.addActivityToTop(mStartActivity); } else { mStartActivity.reparent(parent, parent.mActivities.size() /* top */, reason); } } private int adjustLaunchFlagsToDocumentMode(ActivityRecord r, boolean launchSingleInstance, Loading
services/core/java/com/android/server/am/TaskRecord.java +14 −1 Original line number Diff line number Diff line Loading @@ -51,6 +51,7 @@ import android.util.Slog; import com.android.internal.app.IVoiceInteractor; import com.android.internal.util.XmlUtils; import com.android.server.wm.AppWindowContainerController; import com.android.server.wm.TaskWindowContainerController; import com.android.server.wm.TaskWindowContainerListener; Loading Loading @@ -1033,6 +1034,12 @@ final class TaskRecord extends ConfigurationContainer implements TaskWindowConta * be in the current task or unparented to any task. */ void addActivityAtIndex(int index, ActivityRecord r) { if (r.task != null && r.task != this) { throw new IllegalArgumentException("Can not add r=" + " to task=" + this + " current parent=" + r.task); } r.task = this; // Remove r first, and if it wasn't already in the list and it's fullscreen, count it. if (!mActivities.remove(r) && r.fullscreen) { // Was not previously in list. Loading Loading @@ -1063,6 +1070,7 @@ final class TaskRecord extends ConfigurationContainer implements TaskWindowConta } } index = Math.min(size, index); mActivities.add(index, r); updateEffectiveIntent(); if (r.isPersistable()) { Loading @@ -1071,7 +1079,12 @@ final class TaskRecord extends ConfigurationContainer implements TaskWindowConta // Sync. with window manager updateOverrideConfigurationFromLaunchBounds(); mWindowContainerController.positionChildAt(r.getWindowContainerController(), index); final AppWindowContainerController appController = r.getWindowContainerController(); if (appController != null) { // Only attempt to move in WM if the child has a controller. It is possible we haven't // created controller for the activity we are starting yet. mWindowContainerController.positionChildAt(appController, index); } r.onOverrideConfigurationSent(); } Loading