diff options
7 files changed, 125 insertions, 54 deletions
diff --git a/core/java/android/view/WindowManagerPolicy.java b/core/java/android/view/WindowManagerPolicy.java index d426edc..024600d 100644 --- a/core/java/android/view/WindowManagerPolicy.java +++ b/core/java/android/view/WindowManagerPolicy.java @@ -1154,6 +1154,12 @@ public interface WindowManagerPolicy { public void setLastInputMethodWindowLw(WindowState ime, WindowState target); /** + * Show the recents task list app. + * @hide + */ + public void showRecentApps(); + + /** * @return The current height of the input method window. */ public int getInputMethodWindowVisibleHeightLw(); diff --git a/policy/src/com/android/internal/policy/impl/PhoneWindowManager.java b/policy/src/com/android/internal/policy/impl/PhoneWindowManager.java index 637061d..7f13132 100644 --- a/policy/src/com/android/internal/policy/impl/PhoneWindowManager.java +++ b/policy/src/com/android/internal/policy/impl/PhoneWindowManager.java @@ -521,6 +521,7 @@ public class PhoneWindowManager implements WindowManagerPolicy { private static final int MSG_KEYGUARD_DRAWN_TIMEOUT = 6; private static final int MSG_WINDOW_MANAGER_DRAWN_COMPLETE = 7; private static final int MSG_WAKING_UP = 8; + private static final int MSG_DISPATCH_SHOW_RECENTS = 9; private class PolicyHandler extends Handler { @Override @@ -538,6 +539,9 @@ public class PhoneWindowManager implements WindowManagerPolicy { case MSG_DISPATCH_MEDIA_KEY_REPEAT_WITH_WAKE_LOCK: dispatchMediaKeyRepeatWithWakeLock((KeyEvent)msg.obj); break; + case MSG_DISPATCH_SHOW_RECENTS: + showRecentApps(false); + break; case MSG_KEYGUARD_DRAWN_COMPLETE: if (DEBUG_WAKEUP) Slog.w(TAG, "Setting mKeyguardDrawComplete"); mKeyguardDrawComplete = true; @@ -2589,6 +2593,12 @@ public class PhoneWindowManager implements WindowManagerPolicy { } } + @Override + public void showRecentApps() { + mHandler.removeMessages(MSG_DISPATCH_SHOW_RECENTS); + mHandler.sendEmptyMessage(MSG_DISPATCH_SHOW_RECENTS); + } + private void showRecentApps(boolean triggeredFromAltTab) { mPreloadedRecentApps = false; // preloading no longer needs to be canceled try { diff --git a/services/core/java/com/android/server/am/ActivityManagerService.java b/services/core/java/com/android/server/am/ActivityManagerService.java index 57b56b4..570ac3d 100644 --- a/services/core/java/com/android/server/am/ActivityManagerService.java +++ b/services/core/java/com/android/server/am/ActivityManagerService.java @@ -7230,7 +7230,7 @@ public final class ActivityManagerService extends ActivityManagerNative // Compose the recent task info ActivityManager.RecentTaskInfo rti = new ActivityManager.RecentTaskInfo(); - rti.id = tr.mActivities.isEmpty() ? -1 : tr.taskId; + rti.id = tr.getTopActivity() == null ? -1 : tr.taskId; rti.persistentId = tr.taskId; rti.baseIntent = new Intent(tr.getBaseIntent()); rti.origActivity = tr.origActivity; @@ -7297,6 +7297,12 @@ public final class ActivityManagerService extends ActivityManagerNative continue; } } + if (tr.intent != null && + (tr.intent.getFlags() & Intent.FLAG_ACTIVITY_AUTO_REMOVE_FROM_RECENTS) + != 0 && tr.getTopActivity() == null) { + // Don't include auto remove tasks that are finished or finishing. + continue; + } ActivityManager.RecentTaskInfo rti = createRecentTaskInfoFromTaskRecord(tr); if (!detailed) { diff --git a/services/core/java/com/android/server/am/ActivityStack.java b/services/core/java/com/android/server/am/ActivityStack.java index fe2a473..aa777e1 100755 --- a/services/core/java/com/android/server/am/ActivityStack.java +++ b/services/core/java/com/android/server/am/ActivityStack.java @@ -30,6 +30,10 @@ import static com.android.server.am.ActivityManagerService.DEBUG_USER_LEAVING; import static com.android.server.am.ActivityManagerService.DEBUG_VISBILITY; import static com.android.server.am.ActivityManagerService.VALIDATE_TOKENS; +import static com.android.server.am.ActivityRecord.HOME_ACTIVITY_TYPE; +import static com.android.server.am.ActivityRecord.APPLICATION_ACTIVITY_TYPE; +import static com.android.server.am.ActivityRecord.RECENTS_ACTIVITY_TYPE; + import static com.android.server.am.ActivityStackSupervisor.DEBUG_ADD_REMOVE; import static com.android.server.am.ActivityStackSupervisor.DEBUG_APP; import static com.android.server.am.ActivityStackSupervisor.DEBUG_CONTAINERS; @@ -1095,7 +1099,8 @@ final class ActivityStack { for (int i = mStacks.indexOf(this) + 1; i < mStacks.size(); i++) { final ArrayList<TaskRecord> tasks = mStacks.get(i).getAllTasks(); for (int taskNdx = 0; taskNdx < tasks.size(); taskNdx++) { - final ArrayList<ActivityRecord> activities = tasks.get(taskNdx).mActivities; + final TaskRecord task = tasks.get(taskNdx); + final ArrayList<ActivityRecord> activities = task.mActivities; for (int activityNdx = 0; activityNdx < activities.size(); activityNdx++) { final ActivityRecord r = activities.get(activityNdx); @@ -1106,7 +1111,7 @@ final class ActivityStack { // - Full Screen Activity OR // - On top of Home and our stack is NOT home if (!r.finishing && r.visible && (r.fullscreen || - (!isHomeStack() && r.frontOfTask && tasks.get(taskNdx).mOnTopOfHome))) { + (!isHomeStack() && r.frontOfTask && task.isOverHomeStack()))) { return false; } } @@ -1234,7 +1239,7 @@ final class ActivityStack { // At this point, nothing else needs to be shown if (DEBUG_VISBILITY) Slog.v(TAG, "Fullscreen: at " + r); behindFullscreen = true; - } else if (!isHomeStack() && r.frontOfTask && task.mOnTopOfHome) { + } else if (!isHomeStack() && r.frontOfTask && task.isOverHomeStack()) { if (DEBUG_VISBILITY) Slog.v(TAG, "Showing home: at " + r); behindFullscreen = true; } @@ -1388,6 +1393,7 @@ final class ActivityStack { final boolean userLeaving = mStackSupervisor.mUserLeaving; mStackSupervisor.mUserLeaving = false; + final TaskRecord prevTask = prev != null ? prev.task : null; if (next == null) { // There are no more activities! Let's just start up the // Launcher... @@ -1395,7 +1401,10 @@ final class ActivityStack { if (DEBUG_STATES) Slog.d(TAG, "resumeTopActivityLocked: No more activities go home"); if (DEBUG_STACK) mStackSupervisor.validateTopActivitiesLocked(); // Only resume home if on home display - return isOnHomeDisplay() && mStackSupervisor.resumeHomeActivity(prev); + final int returnTaskType = prevTask == null || !prevTask.isOverHomeStack() ? + HOME_ACTIVITY_TYPE : prevTask.getTaskToReturnTo(); + return isOnHomeDisplay() && + mStackSupervisor.resumeHomeStackTask(returnTaskType, prev); } next.delayedResume = false; @@ -1414,24 +1423,29 @@ final class ActivityStack { } final TaskRecord nextTask = next.task; - final TaskRecord prevTask = prev != null ? prev.task : null; if (prevTask != null && prevTask.stack == this && - prevTask.mOnTopOfHome && prev.finishing && prev.frontOfTask) { + prevTask.isOverHomeStack() && prev.finishing && prev.frontOfTask) { if (DEBUG_STACK) mStackSupervisor.validateTopActivitiesLocked(); if (prevTask == nextTask) { prevTask.setFrontOfTask(); } else if (prevTask != topTask()) { - // This task is going away but it was supposed to return to the home task. + // This task is going away but it was supposed to return to the home stack. // Now the task above it has to return to the home task instead. final int taskNdx = mTaskHistory.indexOf(prevTask) + 1; - mTaskHistory.get(taskNdx).mOnTopOfHome = true; + mTaskHistory.get(taskNdx).setTaskToReturnTo(HOME_ACTIVITY_TYPE); } else { if (DEBUG_STATES && isOnHomeDisplay()) Slog.d(TAG, "resumeTopActivityLocked: Launching home next"); // Only resume home if on home display - return isOnHomeDisplay() && mStackSupervisor.resumeHomeActivity(prev); + final int returnTaskType = prevTask == null || !prevTask.isOverHomeStack() ? + HOME_ACTIVITY_TYPE : prevTask.getTaskToReturnTo(); + return isOnHomeDisplay() && + mStackSupervisor.resumeHomeStackTask(returnTaskType, prev); } } + if (prev != null && prev.isRecentsActivity()) { + nextTask.setTaskToReturnTo(RECENTS_ACTIVITY_TYPE); + } // If we are sleeping, and there is no resumed activity, and the top // activity is paused, well that is the state we want. @@ -1800,10 +1814,11 @@ final class ActivityStack { ActivityStack lastStack = mStackSupervisor.getLastStack(); final boolean fromHome = lastStack.isHomeStack(); if (!isHomeStack() && (fromHome || topTask() != task)) { - task.mOnTopOfHome = fromHome; + task.setTaskToReturnTo(fromHome ? + lastStack.topTask().taskType : APPLICATION_ACTIVITY_TYPE); } } else { - task.mOnTopOfHome = false; + task.setTaskToReturnTo(APPLICATION_ACTIVITY_TYPE); } mTaskHistory.remove(task); @@ -2350,8 +2365,8 @@ final class ActivityStack { ActivityRecord next = topRunningActivityLocked(null); if (next != r) { final TaskRecord task = r.task; - if (r.frontOfTask && task == topTask() && task.mOnTopOfHome) { - mStackSupervisor.moveHomeToTop(); + if (r.frontOfTask && task == topTask() && task.isOverHomeStack()) { + mStackSupervisor.moveHomeStackTaskToTop(task.getTaskToReturnTo()); } } ActivityRecord top = mStackSupervisor.topRunningActivityLocked(); @@ -2843,8 +2858,9 @@ final class ActivityStack { if (task != null && task.removeActivity(r)) { if (DEBUG_STACK) Slog.i(TAG, "removeActivityFromHistoryLocked: last activity removed from " + this); - if (mStackSupervisor.isFrontStack(this) && task == topTask() && task.mOnTopOfHome) { - mStackSupervisor.moveHomeToTop(); + if (mStackSupervisor.isFrontStack(this) && task == topTask() && + task.isOverHomeStack()) { + mStackSupervisor.moveHomeStackTaskToTop(task.getTaskToReturnTo()); } removeTask(task); } @@ -3160,12 +3176,13 @@ final class ActivityStack { } } - void moveHomeTaskToTop() { + void moveHomeStackTaskToTop(int homeStackTaskType) { final int top = mTaskHistory.size() - 1; for (int taskNdx = top; taskNdx >= 0; --taskNdx) { final TaskRecord task = mTaskHistory.get(taskNdx); - if (task.isHomeTask()) { - if (DEBUG_TASKS || DEBUG_STACK) Slog.d(TAG, "moveHomeTaskToTop: moving " + task); + if (task.taskType == homeStackTaskType) { + if (DEBUG_TASKS || DEBUG_STACK) + Slog.d(TAG, "moveHomeStackTaskToTop: moving " + task); mTaskHistory.remove(taskNdx); mTaskHistory.add(top, task); updateTaskMovement(task, true); @@ -3277,12 +3294,12 @@ final class ActivityStack { int numTasks = mTaskHistory.size(); for (int taskNdx = numTasks - 1; taskNdx >= 1; --taskNdx) { final TaskRecord task = mTaskHistory.get(taskNdx); - if (task.mOnTopOfHome) { + if (task.isOverHomeStack()) { break; } if (taskNdx == 1) { // Set the last task before tr to go to home. - task.mOnTopOfHome = true; + task.setTaskToReturnTo(HOME_ACTIVITY_TYPE); } } @@ -3303,9 +3320,10 @@ final class ActivityStack { } final TaskRecord task = mResumedActivity != null ? mResumedActivity.task : null; - if (task == tr && tr.mOnTopOfHome || numTasks <= 1 && isOnHomeDisplay()) { - tr.mOnTopOfHome = false; - return mStackSupervisor.resumeHomeActivity(null); + if (task == tr && tr.isOverHomeStack() || numTasks <= 1 && isOnHomeDisplay()) { + final int taskToReturnTo = tr.getTaskToReturnTo(); + tr.setTaskToReturnTo(APPLICATION_ACTIVITY_TYPE); + return mStackSupervisor.resumeHomeStackTask(taskToReturnTo, null); } mStackSupervisor.resumeTopActivitiesLocked(); @@ -3746,8 +3764,11 @@ final class ActivityStack { final int taskNdx = mTaskHistory.indexOf(task); final int topTaskNdx = mTaskHistory.size() - 1; - if (task.mOnTopOfHome && taskNdx < topTaskNdx) { - mTaskHistory.get(taskNdx + 1).mOnTopOfHome = true; + if (task.isOverHomeStack() && taskNdx < topTaskNdx) { + final TaskRecord nextTask = mTaskHistory.get(taskNdx + 1); + if (!nextTask.isOverHomeStack()) { + nextTask.setTaskToReturnTo(HOME_ACTIVITY_TYPE); + } } mTaskHistory.remove(task); updateTaskMovement(task, true); diff --git a/services/core/java/com/android/server/am/ActivityStackSupervisor.java b/services/core/java/com/android/server/am/ActivityStackSupervisor.java index 4be208b..73266bc 100644 --- a/services/core/java/com/android/server/am/ActivityStackSupervisor.java +++ b/services/core/java/com/android/server/am/ActivityStackSupervisor.java @@ -31,6 +31,9 @@ import static com.android.server.am.ActivityManagerService.DEBUG_TASKS; import static com.android.server.am.ActivityManagerService.DEBUG_USER_LEAVING; import static com.android.server.am.ActivityManagerService.FIRST_SUPERVISOR_STACK_MSG; import static com.android.server.am.ActivityManagerService.TAG; +import static com.android.server.am.ActivityRecord.HOME_ACTIVITY_TYPE; +import static com.android.server.am.ActivityRecord.RECENTS_ACTIVITY_TYPE; +import static com.android.server.am.ActivityRecord.APPLICATION_ACTIVITY_TYPE; import android.app.Activity; import android.app.ActivityManager; @@ -382,17 +385,27 @@ public final class ActivityStackSupervisor implements DisplayListener { } } - void moveHomeToTop() { + void moveHomeStackTaskToTop(int homeStackTaskType) { + if (homeStackTaskType == RECENTS_ACTIVITY_TYPE) { + mWindowManager.showRecentApps(); + return; + } moveHomeStack(true); - mHomeStack.moveHomeTaskToTop(); + mHomeStack.moveHomeStackTaskToTop(homeStackTaskType); } - boolean resumeHomeActivity(ActivityRecord prev) { - moveHomeToTop(); + boolean resumeHomeStackTask(int homeStackTaskType, ActivityRecord prev) { + if (homeStackTaskType == RECENTS_ACTIVITY_TYPE) { + mWindowManager.showRecentApps(); + return false; + } + moveHomeStackTaskToTop(homeStackTaskType); if (prev != null) { - prev.task.mOnTopOfHome = false; + prev.task.setTaskToReturnTo(APPLICATION_ACTIVITY_TYPE); } + ActivityRecord r = mHomeStack.topRunningActivityLocked(null); + // if (r != null && (r.isHomeActivity() || r.isRecentsActivity())) { if (r != null && r.isHomeActivity()) { mService.setFocusedActivityLocked(r); return resumeTopActivitiesLocked(mHomeStack, prev, null); @@ -747,7 +760,7 @@ public final class ActivityStackSupervisor implements DisplayListener { } void startHomeActivity(Intent intent, ActivityInfo aInfo) { - moveHomeToTop(); + moveHomeStackTaskToTop(HOME_ACTIVITY_TYPE); startActivityLocked(null, intent, null, aInfo, null, null, null, null, 0, 0, 0, null, 0, null, false, null, null); } @@ -1697,7 +1710,7 @@ public final class ActivityStackSupervisor implements DisplayListener { (FLAG_ACTIVITY_NEW_TASK | FLAG_ACTIVITY_TASK_ON_HOME)) == (FLAG_ACTIVITY_NEW_TASK | FLAG_ACTIVITY_TASK_ON_HOME)) { // Caller wants to appear on home activity. - intentActivity.task.mOnTopOfHome = true; + intentActivity.task.setTaskToReturnTo(HOME_ACTIVITY_TYPE); } options = null; } @@ -1893,7 +1906,7 @@ public final class ActivityStackSupervisor implements DisplayListener { == (Intent.FLAG_ACTIVITY_NEW_TASK|Intent.FLAG_ACTIVITY_TASK_ON_HOME)) { // Caller wants to appear on home activity, so before starting // their own activity we will bring home to the front. - r.task.mOnTopOfHome = r.task.stack.isOnHomeDisplay(); + r.task.setTaskToReturnTo(HOME_ACTIVITY_TYPE); } } } else if (sourceRecord != null) { @@ -2244,7 +2257,7 @@ public final class ActivityStackSupervisor implements DisplayListener { if ((flags & ActivityManager.MOVE_TASK_WITH_HOME) != 0) { // Caller wants the home activity moved with it. To accomplish this, // we'll just indicate that this task returns to the home task. - task.mOnTopOfHome = true; + task.setTaskToReturnTo(HOME_ACTIVITY_TYPE); } task.stack.moveTaskToFrontLocked(task, null, options); if (DEBUG_STACK) Slog.d(TAG, "findTaskToMoveToFront: moved to front of stack=" @@ -2356,7 +2369,7 @@ public final class ActivityStackSupervisor implements DisplayListener { } mWindowManager.addTask(taskId, stackId, false); } - resumeHomeActivity(null); + resumeHomeStackTask(HOME_ACTIVITY_TYPE, null); } void moveTaskToStack(int taskId, int stackId, boolean toTop) { @@ -2618,7 +2631,7 @@ public final class ActivityStackSupervisor implements DisplayListener { } } else { // Stack was moved to another display while user was swapped out. - resumeHomeActivity(null); + resumeHomeStackTask(HOME_ACTIVITY_TYPE, null); } return homeInFront; } diff --git a/services/core/java/com/android/server/am/TaskRecord.java b/services/core/java/com/android/server/am/TaskRecord.java index e9afc36..a301c4b 100644 --- a/services/core/java/com/android/server/am/TaskRecord.java +++ b/services/core/java/com/android/server/am/TaskRecord.java @@ -17,6 +17,9 @@ package com.android.server.am; import static com.android.server.am.ActivityManagerService.TAG; +import static com.android.server.am.ActivityRecord.HOME_ACTIVITY_TYPE; +import static com.android.server.am.ActivityRecord.APPLICATION_ACTIVITY_TYPE; +import static com.android.server.am.ActivityRecord.RECENTS_ACTIVITY_TYPE; import static com.android.server.am.ActivityStackSupervisor.DEBUG_ADD_REMOVE; import android.app.Activity; @@ -53,7 +56,6 @@ final class TaskRecord extends ThumbnailHolder { private static final String ATTR_ASKEDCOMPATMODE = "asked_compat_mode"; private static final String ATTR_USERID = "user_id"; private static final String ATTR_TASKTYPE = "task_type"; - private static final String ATTR_ONTOPOFHOME = "on_top_of_home"; private static final String ATTR_LASTDESCRIPTION = "last_description"; private static final String ATTR_LASTTIMEMOVED = "last_time_moved"; private static final String ATTR_NEVERRELINQUISH = "never_relinquish_identity"; @@ -107,9 +109,10 @@ final class TaskRecord extends ThumbnailHolder { /** True if persistable, has changed, and has not yet been persisted */ boolean needsPersisting = false; - /** Launch the home activity when leaving this task. Will be false for tasks that are not on - * Display.DEFAULT_DISPLAY. */ - boolean mOnTopOfHome = false; + /** Indication of what to run next when task exits. Use ActivityRecord types. + * ActivityRecord.APPLICATION_ACTIVITY_TYPE indicates to resume the task below this one in the + * task stack. */ + private int mTaskToReturnTo = APPLICATION_ACTIVITY_TYPE; /** If original intent did not allow relinquishing task identity, save that information */ boolean mNeverRelinquishIdentity = true; @@ -132,9 +135,9 @@ final class TaskRecord extends ThumbnailHolder { TaskRecord(ActivityManagerService service, int _taskId, Intent _intent, Intent _affinityIntent, String _affinity, ComponentName _realActivity, ComponentName _origActivity, - boolean _rootWasReset, boolean _askedCompatMode, int _taskType, boolean _onTopOfHome, - int _userId, String _lastDescription, ArrayList<ActivityRecord> activities, - long lastTimeMoved, boolean neverRelinquishIdentity) { + boolean _rootWasReset, boolean _askedCompatMode, int _taskType, int _userId, + String _lastDescription, ArrayList<ActivityRecord> activities, long lastTimeMoved, + boolean neverRelinquishIdentity) { mService = service; taskId = _taskId; intent = _intent; @@ -147,7 +150,7 @@ final class TaskRecord extends ThumbnailHolder { rootWasReset = _rootWasReset; askedCompatMode = _askedCompatMode; taskType = _taskType; - mOnTopOfHome = _onTopOfHome; + mTaskToReturnTo = HOME_ACTIVITY_TYPE; userId = _userId; lastDescription = _lastDescription; mActivities = activities; @@ -224,6 +227,14 @@ final class TaskRecord extends ThumbnailHolder { } } + void setTaskToReturnTo(int taskToReturnTo) { + mTaskToReturnTo = taskToReturnTo; + } + + int getTaskToReturnTo() { + return mTaskToReturnTo; + } + void disposeThumbnail() { super.disposeThumbnail(); for (int i=mActivities.size()-1; i>=0; i--) { @@ -514,11 +525,15 @@ final class TaskRecord extends ThumbnailHolder { } boolean isHomeTask() { - return taskType == ActivityRecord.HOME_ACTIVITY_TYPE; + return taskType == HOME_ACTIVITY_TYPE; } boolean isApplicationTask() { - return taskType == ActivityRecord.APPLICATION_ACTIVITY_TYPE; + return taskType == APPLICATION_ACTIVITY_TYPE; + } + + boolean isOverHomeStack() { + return mTaskToReturnTo == HOME_ACTIVITY_TYPE || mTaskToReturnTo == RECENTS_ACTIVITY_TYPE; } public TaskAccessInfo getTaskAccessInfoLocked() { @@ -688,7 +703,6 @@ final class TaskRecord extends ThumbnailHolder { out.attribute(null, ATTR_ASKEDCOMPATMODE, String.valueOf(askedCompatMode)); out.attribute(null, ATTR_USERID, String.valueOf(userId)); out.attribute(null, ATTR_TASKTYPE, String.valueOf(taskType)); - out.attribute(null, ATTR_ONTOPOFHOME, String.valueOf(mOnTopOfHome)); out.attribute(null, ATTR_LASTTIMEMOVED, String.valueOf(mLastTimeMoved)); out.attribute(null, ATTR_NEVERRELINQUISH, String.valueOf(mNeverRelinquishIdentity)); if (lastDescription != null) { @@ -737,7 +751,6 @@ final class TaskRecord extends ThumbnailHolder { boolean rootHasReset = false; boolean askedCompatMode = false; int taskType = ActivityRecord.APPLICATION_ACTIVITY_TYPE; - boolean onTopOfHome = true; int userId = 0; String lastDescription = null; long lastTimeOnTop = 0; @@ -766,8 +779,6 @@ final class TaskRecord extends ThumbnailHolder { userId = Integer.valueOf(attrValue); } else if (ATTR_TASKTYPE.equals(attrName)) { taskType = Integer.valueOf(attrValue); - } else if (ATTR_ONTOPOFHOME.equals(attrName)) { - onTopOfHome = Boolean.valueOf(attrValue); } else if (ATTR_LASTDESCRIPTION.equals(attrName)) { lastDescription = attrValue; } else if (ATTR_LASTTIMEMOVED.equals(attrName)) { @@ -807,8 +818,8 @@ final class TaskRecord extends ThumbnailHolder { final TaskRecord task = new TaskRecord(stackSupervisor.mService, taskId, intent, affinityIntent, affinity, realActivity, origActivity, rootHasReset, - askedCompatMode, taskType, onTopOfHome, userId, lastDescription, activities, - lastTimeOnTop, neverRelinquishIdentity); + askedCompatMode, taskType, userId, lastDescription, activities, lastTimeOnTop, + neverRelinquishIdentity); for (int activityNdx = activities.size() - 1; activityNdx >=0; --activityNdx) { final ActivityRecord r = activities.get(activityNdx); @@ -827,7 +838,7 @@ final class TaskRecord extends ThumbnailHolder { pw.print(" userId="); pw.print(userId); pw.print(" taskType="); pw.print(taskType); pw.print(" numFullscreen="); pw.print(numFullscreen); - pw.print(" mOnTopOfHome="); pw.println(mOnTopOfHome); + pw.print(" mTaskToReturnTo="); pw.println(mTaskToReturnTo); } if (affinity != null) { pw.print(prefix); pw.print("affinity="); pw.println(affinity); diff --git a/services/core/java/com/android/server/wm/WindowManagerService.java b/services/core/java/com/android/server/wm/WindowManagerService.java index d04d668..9bc30b4 100644 --- a/services/core/java/com/android/server/wm/WindowManagerService.java +++ b/services/core/java/com/android/server/wm/WindowManagerService.java @@ -10321,6 +10321,10 @@ public class WindowManagerService extends IWindowManager.Stub mPolicy.lockNow(options); } + public void showRecentApps() { + mPolicy.showRecentApps(); + } + @Override public boolean isSafeModeEnabled() { return mSafeMode; |