Loading core/java/android/app/ActivityManager.java +8 −0 Original line number Diff line number Diff line Loading @@ -2113,7 +2113,9 @@ public class ActivityManager { public int[] taskIds; public String[] taskNames; public Rect[] taskBounds; public int[] taskUserIds; public int displayId; public int userId; @Override public int describeContents() { Loading @@ -2137,7 +2139,9 @@ public class ActivityManager { dest.writeInt(taskBounds[i].right); dest.writeInt(taskBounds[i].bottom); } dest.writeIntArray(taskUserIds); dest.writeInt(displayId); dest.writeInt(userId); } public void readFromParcel(Parcel source) { Loading @@ -2157,7 +2161,9 @@ public class ActivityManager { } else { taskBounds = null; } taskUserIds = source.createIntArray(); displayId = source.readInt(); userId = source.readInt(); } public static final Creator<StackInfo> CREATOR = new Creator<StackInfo>() { Loading @@ -2183,6 +2189,7 @@ public class ActivityManager { sb.append(prefix); sb.append("Stack id="); sb.append(stackId); sb.append(" bounds="); sb.append(bounds.toShortString()); sb.append(" displayId="); sb.append(displayId); sb.append(" userId="); sb.append(userId); sb.append("\n"); prefix = prefix + " "; for (int i = 0; i < taskIds.length; ++i) { Loading @@ -2191,6 +2198,7 @@ public class ActivityManager { if (taskBounds != null) { sb.append(" bounds="); sb.append(taskBounds[i].toShortString()); } sb.append(" userId=").append(taskUserIds[i]); sb.append("\n"); } return sb.toString(); Loading services/core/java/com/android/server/am/ActivityStack.java +18 −17 Original line number Diff line number Diff line Loading @@ -1424,16 +1424,15 @@ final class ActivityStack { final void ensureActivitiesVisibleLocked(ActivityRecord starting, int configChanges, boolean preserveWindows) { ActivityRecord top = topRunningActivityLocked(); if (top == null) { return; } if (DEBUG_VISIBILITY) Slog.v(TAG_VISIBILITY, "ensureActivitiesVisible behind " + top + " configChanges=0x" + Integer.toHexString(configChanges)); if (top != null) { checkTranslucentActivityWaiting(top); } // If the top activity is not fullscreen, then we need to // make sure any activities under it are now visible. boolean aboveTop = true; boolean aboveTop = top != null; final boolean stackInvisible = !isStackVisibleLocked(); boolean behindFullscreenActivity = stackInvisible; boolean noStackActivityResumed = (isInStackLocked(starting) == null); Loading @@ -1447,13 +1446,15 @@ final class ActivityStack { if (r.finishing) { continue; } if (aboveTop && r != top) { final boolean isTop = r == top; if (aboveTop && !isTop) { continue; } aboveTop = false; // mLaunchingBehind: Activities launching behind are at the back of the task stack // but must be drawn initially for the animation as though they were visible. if (!behindFullscreenActivity || r.mLaunchTaskBehind) { if ((!behindFullscreenActivity || r.mLaunchTaskBehind) && okToShowLocked(r)) { if (DEBUG_VISIBILITY) Slog.v(TAG_VISIBILITY, "Make visible? " + r + " finishing=" + r.finishing + " state=" + r.state); Loading @@ -1464,7 +1465,7 @@ final class ActivityStack { } if (r.app == null || r.app.thread == null) { if (makeVisibleAndRestartIfNeeded(starting, configChanges, top, if (makeVisibleAndRestartIfNeeded(starting, configChanges, isTop, noStackActivityResumed, r)) { if (activityNdx >= activities.size()) { // Record may be removed if its process needs to restart. Loading @@ -1474,18 +1475,19 @@ final class ActivityStack { } } } else if (r.visible) { if (alreadyVisible(r)) { // If this activity is already visible, then there is nothing to do here. if (handleAlreadyVisible(r)) { noStackActivityResumed = false; } } else { becomeVisible(starting, r); makeVisible(starting, r); } // Aggregate current change flags. configChanges |= r.configChangeFlags; behindFullscreenActivity = updateBehindFullscreen(stackInvisible, behindFullscreenActivity, task, r); } else { becomeInvisible(stackInvisible, behindFullscreenActivity, r); makeInvisible(stackInvisible, behindFullscreenActivity, r); } } if (mStackId == FREEFORM_WORKSPACE_STACK_ID) { Loading Loading @@ -1516,12 +1518,12 @@ final class ActivityStack { } private boolean makeVisibleAndRestartIfNeeded(ActivityRecord starting, int configChanges, ActivityRecord top, boolean noStackActivityResumed, ActivityRecord r) { boolean isTop, boolean noStackActivityResumed, ActivityRecord r) { // We need to make sure the app is running if it's the top, or it is just made visible from // invisible. If the app is already visible, it must have died while it was visible. In this // case, we'll show the dead window but will not restart the app. Otherwise we could end up // thrashing. if (r == top || !r.visible) { if (isTop || !r.visible) { // This activity needs to be visible, but isn't even running... // get it started and resume if no other stack in this stack is resumed. if (DEBUG_VISIBILITY) Slog.v(TAG_VISIBILITY, "Start and freeze screen for " + r); Loading @@ -1540,7 +1542,7 @@ final class ActivityStack { return false; } private void becomeInvisible(boolean stackInvisible, boolean behindFullscreenActivity, private void makeInvisible(boolean stackInvisible, boolean behindFullscreenActivity, ActivityRecord r) { if (DEBUG_VISIBILITY) Slog.v(TAG_VISIBILITY, "Make invisible? " + r + " finishing=" + r.finishing + " state=" + r.state + " stackInvisible=" + stackInvisible Loading Loading @@ -1606,7 +1608,7 @@ final class ActivityStack { return behindFullscreenActivity; } private void becomeVisible(ActivityRecord starting, ActivityRecord r) { private void makeVisible(ActivityRecord starting, ActivityRecord r) { // This activity is not currently visible, but is running. Tell it to become visible. r.visible = true; if (r.state != ActivityState.RESUMED && r != starting) { Loading @@ -1631,8 +1633,7 @@ final class ActivityStack { } } private boolean alreadyVisible(ActivityRecord r) { // If this activity is already visible, then there is nothing else to do here. private boolean handleAlreadyVisible(ActivityRecord r) { if (DEBUG_VISIBILITY) Slog.v(TAG_VISIBILITY, "Skipping: already visible at " + r); r.stopFreezingScreenLocked(false); try { Loading services/core/java/com/android/server/am/ActivityStackSupervisor.java +5 −2 Original line number Diff line number Diff line Loading @@ -2702,7 +2702,6 @@ public final class ActivityStackSupervisor implements DisplayListener { Configuration config) { if (DEBUG_ALL) Slog.v(TAG, "Activity idle: " + token); ArrayList<ActivityRecord> stops = null; ArrayList<ActivityRecord> finishes = null; ArrayList<UserState> startingUsers = null; int NS = 0; Loading Loading @@ -2756,7 +2755,7 @@ public final class ActivityStackSupervisor implements DisplayListener { } // Atomically retrieve all of the other things to do. stops = processStoppingActivitiesLocked(true); final ArrayList<ActivityRecord> stops = processStoppingActivitiesLocked(true); NS = stops != null ? stops.size() : 0; if ((NF = mFinishingActivities.size()) > 0) { finishes = new ArrayList<>(mFinishingActivities); Loading Loading @@ -4304,12 +4303,14 @@ public final class ActivityStackSupervisor implements DisplayListener { mWindowManager.getStackBounds(stack.mStackId, info.bounds); info.displayId = Display.DEFAULT_DISPLAY; info.stackId = stack.mStackId; info.userId = stack.mCurrentUser; ArrayList<TaskRecord> tasks = stack.getAllTasks(); final int numTasks = tasks.size(); int[] taskIds = new int[numTasks]; String[] taskNames = new String[numTasks]; Rect[] taskBounds = new Rect[numTasks]; int[] taskUserIds = new int[numTasks]; for (int i = 0; i < numTasks; ++i) { final TaskRecord task = tasks.get(i); taskIds[i] = task.taskId; Loading @@ -4319,10 +4320,12 @@ public final class ActivityStackSupervisor implements DisplayListener { : "unknown"; taskBounds[i] = new Rect(); mWindowManager.getTaskBounds(task.taskId, taskBounds[i]); taskUserIds[i] = task.userId; } info.taskIds = taskIds; info.taskNames = taskNames; info.taskBounds = taskBounds; info.taskUserIds = taskUserIds; return info; } Loading Loading
core/java/android/app/ActivityManager.java +8 −0 Original line number Diff line number Diff line Loading @@ -2113,7 +2113,9 @@ public class ActivityManager { public int[] taskIds; public String[] taskNames; public Rect[] taskBounds; public int[] taskUserIds; public int displayId; public int userId; @Override public int describeContents() { Loading @@ -2137,7 +2139,9 @@ public class ActivityManager { dest.writeInt(taskBounds[i].right); dest.writeInt(taskBounds[i].bottom); } dest.writeIntArray(taskUserIds); dest.writeInt(displayId); dest.writeInt(userId); } public void readFromParcel(Parcel source) { Loading @@ -2157,7 +2161,9 @@ public class ActivityManager { } else { taskBounds = null; } taskUserIds = source.createIntArray(); displayId = source.readInt(); userId = source.readInt(); } public static final Creator<StackInfo> CREATOR = new Creator<StackInfo>() { Loading @@ -2183,6 +2189,7 @@ public class ActivityManager { sb.append(prefix); sb.append("Stack id="); sb.append(stackId); sb.append(" bounds="); sb.append(bounds.toShortString()); sb.append(" displayId="); sb.append(displayId); sb.append(" userId="); sb.append(userId); sb.append("\n"); prefix = prefix + " "; for (int i = 0; i < taskIds.length; ++i) { Loading @@ -2191,6 +2198,7 @@ public class ActivityManager { if (taskBounds != null) { sb.append(" bounds="); sb.append(taskBounds[i].toShortString()); } sb.append(" userId=").append(taskUserIds[i]); sb.append("\n"); } return sb.toString(); Loading
services/core/java/com/android/server/am/ActivityStack.java +18 −17 Original line number Diff line number Diff line Loading @@ -1424,16 +1424,15 @@ final class ActivityStack { final void ensureActivitiesVisibleLocked(ActivityRecord starting, int configChanges, boolean preserveWindows) { ActivityRecord top = topRunningActivityLocked(); if (top == null) { return; } if (DEBUG_VISIBILITY) Slog.v(TAG_VISIBILITY, "ensureActivitiesVisible behind " + top + " configChanges=0x" + Integer.toHexString(configChanges)); if (top != null) { checkTranslucentActivityWaiting(top); } // If the top activity is not fullscreen, then we need to // make sure any activities under it are now visible. boolean aboveTop = true; boolean aboveTop = top != null; final boolean stackInvisible = !isStackVisibleLocked(); boolean behindFullscreenActivity = stackInvisible; boolean noStackActivityResumed = (isInStackLocked(starting) == null); Loading @@ -1447,13 +1446,15 @@ final class ActivityStack { if (r.finishing) { continue; } if (aboveTop && r != top) { final boolean isTop = r == top; if (aboveTop && !isTop) { continue; } aboveTop = false; // mLaunchingBehind: Activities launching behind are at the back of the task stack // but must be drawn initially for the animation as though they were visible. if (!behindFullscreenActivity || r.mLaunchTaskBehind) { if ((!behindFullscreenActivity || r.mLaunchTaskBehind) && okToShowLocked(r)) { if (DEBUG_VISIBILITY) Slog.v(TAG_VISIBILITY, "Make visible? " + r + " finishing=" + r.finishing + " state=" + r.state); Loading @@ -1464,7 +1465,7 @@ final class ActivityStack { } if (r.app == null || r.app.thread == null) { if (makeVisibleAndRestartIfNeeded(starting, configChanges, top, if (makeVisibleAndRestartIfNeeded(starting, configChanges, isTop, noStackActivityResumed, r)) { if (activityNdx >= activities.size()) { // Record may be removed if its process needs to restart. Loading @@ -1474,18 +1475,19 @@ final class ActivityStack { } } } else if (r.visible) { if (alreadyVisible(r)) { // If this activity is already visible, then there is nothing to do here. if (handleAlreadyVisible(r)) { noStackActivityResumed = false; } } else { becomeVisible(starting, r); makeVisible(starting, r); } // Aggregate current change flags. configChanges |= r.configChangeFlags; behindFullscreenActivity = updateBehindFullscreen(stackInvisible, behindFullscreenActivity, task, r); } else { becomeInvisible(stackInvisible, behindFullscreenActivity, r); makeInvisible(stackInvisible, behindFullscreenActivity, r); } } if (mStackId == FREEFORM_WORKSPACE_STACK_ID) { Loading Loading @@ -1516,12 +1518,12 @@ final class ActivityStack { } private boolean makeVisibleAndRestartIfNeeded(ActivityRecord starting, int configChanges, ActivityRecord top, boolean noStackActivityResumed, ActivityRecord r) { boolean isTop, boolean noStackActivityResumed, ActivityRecord r) { // We need to make sure the app is running if it's the top, or it is just made visible from // invisible. If the app is already visible, it must have died while it was visible. In this // case, we'll show the dead window but will not restart the app. Otherwise we could end up // thrashing. if (r == top || !r.visible) { if (isTop || !r.visible) { // This activity needs to be visible, but isn't even running... // get it started and resume if no other stack in this stack is resumed. if (DEBUG_VISIBILITY) Slog.v(TAG_VISIBILITY, "Start and freeze screen for " + r); Loading @@ -1540,7 +1542,7 @@ final class ActivityStack { return false; } private void becomeInvisible(boolean stackInvisible, boolean behindFullscreenActivity, private void makeInvisible(boolean stackInvisible, boolean behindFullscreenActivity, ActivityRecord r) { if (DEBUG_VISIBILITY) Slog.v(TAG_VISIBILITY, "Make invisible? " + r + " finishing=" + r.finishing + " state=" + r.state + " stackInvisible=" + stackInvisible Loading Loading @@ -1606,7 +1608,7 @@ final class ActivityStack { return behindFullscreenActivity; } private void becomeVisible(ActivityRecord starting, ActivityRecord r) { private void makeVisible(ActivityRecord starting, ActivityRecord r) { // This activity is not currently visible, but is running. Tell it to become visible. r.visible = true; if (r.state != ActivityState.RESUMED && r != starting) { Loading @@ -1631,8 +1633,7 @@ final class ActivityStack { } } private boolean alreadyVisible(ActivityRecord r) { // If this activity is already visible, then there is nothing else to do here. private boolean handleAlreadyVisible(ActivityRecord r) { if (DEBUG_VISIBILITY) Slog.v(TAG_VISIBILITY, "Skipping: already visible at " + r); r.stopFreezingScreenLocked(false); try { Loading
services/core/java/com/android/server/am/ActivityStackSupervisor.java +5 −2 Original line number Diff line number Diff line Loading @@ -2702,7 +2702,6 @@ public final class ActivityStackSupervisor implements DisplayListener { Configuration config) { if (DEBUG_ALL) Slog.v(TAG, "Activity idle: " + token); ArrayList<ActivityRecord> stops = null; ArrayList<ActivityRecord> finishes = null; ArrayList<UserState> startingUsers = null; int NS = 0; Loading Loading @@ -2756,7 +2755,7 @@ public final class ActivityStackSupervisor implements DisplayListener { } // Atomically retrieve all of the other things to do. stops = processStoppingActivitiesLocked(true); final ArrayList<ActivityRecord> stops = processStoppingActivitiesLocked(true); NS = stops != null ? stops.size() : 0; if ((NF = mFinishingActivities.size()) > 0) { finishes = new ArrayList<>(mFinishingActivities); Loading Loading @@ -4304,12 +4303,14 @@ public final class ActivityStackSupervisor implements DisplayListener { mWindowManager.getStackBounds(stack.mStackId, info.bounds); info.displayId = Display.DEFAULT_DISPLAY; info.stackId = stack.mStackId; info.userId = stack.mCurrentUser; ArrayList<TaskRecord> tasks = stack.getAllTasks(); final int numTasks = tasks.size(); int[] taskIds = new int[numTasks]; String[] taskNames = new String[numTasks]; Rect[] taskBounds = new Rect[numTasks]; int[] taskUserIds = new int[numTasks]; for (int i = 0; i < numTasks; ++i) { final TaskRecord task = tasks.get(i); taskIds[i] = task.taskId; Loading @@ -4319,10 +4320,12 @@ public final class ActivityStackSupervisor implements DisplayListener { : "unknown"; taskBounds[i] = new Rect(); mWindowManager.getTaskBounds(task.taskId, taskBounds[i]); taskUserIds[i] = task.userId; } info.taskIds = taskIds; info.taskNames = taskNames; info.taskBounds = taskBounds; info.taskUserIds = taskUserIds; return info; } Loading