summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorCraig Mautner <cmautner@google.com>2014-05-20 19:17:54 -0700
committerCraig Mautner <cmautner@google.com>2014-05-24 09:50:37 -0700
commite67a784eb2c914c04c62ea5dfa1e3751df5582cc (patch)
tree6d729bf0864128a7b508d71cf93b9dacad233011
parent21d24a21ea4aaadd78e73de54168e8a8a8973e4d (diff)
downloadframeworks_base-e67a784eb2c914c04c62ea5dfa1e3751df5582cc.zip
frameworks_base-e67a784eb2c914c04c62ea5dfa1e3751df5582cc.tar.gz
frameworks_base-e67a784eb2c914c04c62ea5dfa1e3751df5582cc.tar.bz2
Modify task navigation to return to recent tasks. DO NOT MERGE
Tasks launched from the recent task list will now return to the list when they are finished. Also tasks that are launched from the notification panel and services will now return to the list, provided that the launcher is not front and center when they are launched. Fixes bug 14464114. Change-Id: Ic0d3731fc7248d1eaa80e5ee399753d80e80c979
-rw-r--r--core/java/android/view/WindowManagerPolicy.java6
-rw-r--r--policy/src/com/android/internal/policy/impl/PhoneWindowManager.java10
-rwxr-xr-xservices/core/java/com/android/server/am/ActivityStack.java102
-rw-r--r--services/core/java/com/android/server/am/ActivityStackSupervisor.java41
-rw-r--r--services/core/java/com/android/server/am/TaskRecord.java44
-rw-r--r--services/core/java/com/android/server/wm/WindowManagerService.java4
6 files changed, 119 insertions, 88 deletions
diff --git a/core/java/android/view/WindowManagerPolicy.java b/core/java/android/view/WindowManagerPolicy.java
index 4fde1e4..1bb20c9 100644
--- a/core/java/android/view/WindowManagerPolicy.java
+++ b/core/java/android/view/WindowManagerPolicy.java
@@ -1144,6 +1144,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 9977193..e178773 100644
--- a/policy/src/com/android/internal/policy/impl/PhoneWindowManager.java
+++ b/policy/src/com/android/internal/policy/impl/PhoneWindowManager.java
@@ -478,6 +478,7 @@ public class PhoneWindowManager implements WindowManagerPolicy {
private static final int MSG_DISABLE_POINTER_LOCATION = 2;
private static final int MSG_DISPATCH_MEDIA_KEY_WITH_WAKE_LOCK = 3;
private static final int MSG_DISPATCH_MEDIA_KEY_REPEAT_WITH_WAKE_LOCK = 4;
+ private static final int MSG_DISPATCH_SHOW_RECENTS = 5;
private class PolicyHandler extends Handler {
@Override
@@ -495,6 +496,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;
}
}
}
@@ -2459,6 +2463,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/ActivityStack.java b/services/core/java/com/android/server/am/ActivityStack.java
index 534fd90..d0ba118 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_SAVED_STATE;
@@ -1040,40 +1044,6 @@ final class ActivityStack {
}
}
- /**
- * Determine if home should be visible below the passed record.
- * @param record activity we are querying for.
- * @return true if home is visible below the passed activity, false otherwise.
- */
- boolean isActivityOverHome(ActivityRecord record) {
- // Start at record and go down, look for either home or a visible fullscreen activity.
- final TaskRecord recordTask = record.task;
- for (int taskNdx = mTaskHistory.indexOf(recordTask); taskNdx >= 0; --taskNdx) {
- TaskRecord task = mTaskHistory.get(taskNdx);
- final ArrayList<ActivityRecord> activities = task.mActivities;
- final int startNdx =
- task == recordTask ? activities.indexOf(record) : activities.size() - 1;
- for (int activityNdx = startNdx; activityNdx >= 0; --activityNdx) {
- final ActivityRecord r = activities.get(activityNdx);
- if (r.isHomeActivity()) {
- return true;
- }
- if (!r.finishing && r.fullscreen) {
- // Passed activity is over a fullscreen activity.
- return false;
- }
- }
- if (task.mOnTopOfHome) {
- // Got to the bottom of a task on top of home without finding a visible fullscreen
- // activity. Home is visible.
- return true;
- }
- }
- // Got to the bottom of this stack and still don't know. If this is over the home stack
- // then record is over home. May not work if we ever get more than two layers.
- return mStackSupervisor.isFrontStack(this);
- }
-
private void setVisibile(ActivityRecord r, boolean visible) {
r.visible = visible;
mWindowManager.setAppVisibility(r.appToken, visible);
@@ -1103,7 +1073,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);
@@ -1114,7 +1085,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;
}
}
@@ -1242,7 +1213,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;
}
@@ -1396,6 +1367,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...
@@ -1403,7 +1375,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;
@@ -1422,22 +1397,24 @@ 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);
}
}
@@ -1808,10 +1785,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);
@@ -2356,8 +2334,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();
@@ -2841,8 +2819,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);
}
@@ -3157,12 +3136,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);
@@ -3274,12 +3254,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);
}
}
@@ -3300,9 +3280,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();
@@ -3743,8 +3724,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 e9565d6..c1a4643 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;
@@ -318,18 +321,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()) {
+ if (r != null && (r.isHomeActivity() || r.isRecentsActivity())) {
mService.setFocusedActivityLocked(r);
return resumeTopActivitiesLocked(mHomeStack, prev, null);
}
@@ -683,7 +695,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);
}
@@ -1615,7 +1627,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;
}
@@ -1799,6 +1811,11 @@ public final class ActivityStackSupervisor implements DisplayListener {
newTaskInfo != null ? newTaskInfo : r.info,
newTaskIntent != null ? newTaskIntent : intent,
voiceSession, voiceInteractor, true), null, true);
+ if (sourceRecord == null) {
+ // Launched from a service or notification or task that is finishing.
+ r.task.setTaskToReturnTo(isFrontStack(mHomeStack) ?
+ mHomeStack.topTask().taskType : RECENTS_ACTIVITY_TYPE);
+ }
if (DEBUG_TASKS) Slog.v(TAG, "Starting new activity " + r + " in new task " +
r.task);
} else {
@@ -1811,7 +1828,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) {
@@ -2162,7 +2179,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="
@@ -2273,7 +2290,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) {
@@ -2530,7 +2547,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 ce83ae6..c07bc1e 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;
@@ -54,7 +57,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";
@@ -104,9 +106,11 @@ 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;
final ActivityManagerService mService;
@@ -123,9 +127,8 @@ 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 _rootWasReset, boolean _askedCompatMode, int _taskType, int _userId,
+ String _lastDescription, ArrayList<ActivityRecord> activities, long lastTimeMoved) {
mService = service;
taskId = _taskId;
intent = _intent;
@@ -138,7 +141,7 @@ final class TaskRecord extends ThumbnailHolder {
rootWasReset = _rootWasReset;
askedCompatMode = _askedCompatMode;
taskType = _taskType;
- mOnTopOfHome = _onTopOfHome;
+ mTaskToReturnTo = HOME_ACTIVITY_TYPE;
userId = _userId;
lastDescription = _lastDescription;
mActivities = activities;
@@ -206,6 +209,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--) {
@@ -477,11 +488,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() {
@@ -623,7 +638,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));
if (lastDescription != null) {
out.attribute(null, ATTR_LASTDESCRIPTION, lastDescription.toString());
@@ -669,7 +683,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;
@@ -697,8 +710,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)) {
@@ -736,8 +747,7 @@ 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);
+ askedCompatMode, taskType, userId, lastDescription, activities, lastTimeOnTop);
for (int activityNdx = activities.size() - 1; activityNdx >=0; --activityNdx) {
final ActivityRecord r = activities.get(activityNdx);
@@ -756,7 +766,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 1a0dd82..6fbb39d 100644
--- a/services/core/java/com/android/server/wm/WindowManagerService.java
+++ b/services/core/java/com/android/server/wm/WindowManagerService.java
@@ -10265,6 +10265,10 @@ public class WindowManagerService extends IWindowManager.Stub
mPolicy.lockNow(options);
}
+ public void showRecentApps() {
+ mPolicy.showRecentApps();
+ }
+
@Override
public boolean isSafeModeEnabled() {
return mSafeMode;