DO NOT MERGE -- Only use saved surface if started by launcher or moved to front am: 813be138ae am: 9f92bc2602
am: 8673e303a7
Change-Id: I34d205de8f368df05e068548a69448da397d2e41
diff --git a/core/java/android/view/IWindowManager.aidl b/core/java/android/view/IWindowManager.aidl
index 0601219..81469c8 100644
--- a/core/java/android/view/IWindowManager.aidl
+++ b/core/java/android/view/IWindowManager.aidl
@@ -173,7 +173,7 @@
in CompatibilityInfo compatInfo, CharSequence nonLocalizedLabel, int labelRes,
int icon, int logo, int windowFlags, IBinder transferFrom, boolean createIfNeeded);
void setAppVisibility(IBinder token, boolean visible);
- void notifyAppResumed(IBinder token, boolean wasStopped);
+ void notifyAppResumed(IBinder token, boolean wasStopped, boolean allowSavedSurface);
void notifyAppStopped(IBinder token);
void startAppFreezingScreen(IBinder token, int configChanges);
void stopAppFreezingScreen(IBinder token, boolean force);
diff --git a/services/core/java/com/android/server/am/ActivityRecord.java b/services/core/java/com/android/server/am/ActivityRecord.java
index a9503dc..bbe7405 100644
--- a/services/core/java/com/android/server/am/ActivityRecord.java
+++ b/services/core/java/com/android/server/am/ActivityRecord.java
@@ -750,6 +750,14 @@
&& intent.getType() == null;
}
+ static boolean isMainIntent(Intent intent) {
+ return Intent.ACTION_MAIN.equals(intent.getAction())
+ && intent.hasCategory(Intent.CATEGORY_LAUNCHER)
+ && intent.getCategories().size() == 1
+ && intent.getData() == null
+ && intent.getType() == null;
+ }
+
private boolean canLaunchHomeActivity(int uid, ActivityRecord sourceRecord) {
if (uid == Process.myUid() || uid == 0) {
// System process can launch home activity.
diff --git a/services/core/java/com/android/server/am/ActivityStack.java b/services/core/java/com/android/server/am/ActivityStack.java
index a27adf7..8c4c0ad 100644
--- a/services/core/java/com/android/server/am/ActivityStack.java
+++ b/services/core/java/com/android/server/am/ActivityStack.java
@@ -2485,13 +2485,25 @@
}
}
+ boolean allowSavedSurface = true;
if (next.newIntents != null) {
+ // Restrict saved surface to launcher start, or there is no intent at all
+ // (eg. task being brought to front). If the intent is something else,
+ // likely the app is going to show some specific page or view, instead of
+ // what's left last time.
+ for (int i = next.newIntents.size() - 1; i >= 0; i--) {
+ final Intent intent = next.newIntents.get(i);
+ if (intent != null && !ActivityRecord.isMainIntent(intent)) {
+ allowSavedSurface = false;
+ break;
+ }
+ }
next.app.thread.scheduleNewIntent(next.newIntents, next.appToken);
}
// Well the app will no longer be stopped.
// Clear app token stopped state in window manager if needed.
- mWindowManager.notifyAppResumed(next.appToken, next.stopped);
+ mWindowManager.notifyAppResumed(next.appToken, next.stopped, allowSavedSurface);
EventLog.writeEvent(EventLogTags.AM_RESUME_ACTIVITY, next.userId,
System.identityHashCode(next), next.task.taskId, next.shortComponentName);
diff --git a/services/core/java/com/android/server/wm/AppWindowToken.java b/services/core/java/com/android/server/wm/AppWindowToken.java
index b065392..621e43a 100644
--- a/services/core/java/com/android/server/wm/AppWindowToken.java
+++ b/services/core/java/com/android/server/wm/AppWindowToken.java
@@ -439,12 +439,16 @@
* Notify that the app is now resumed, and it was not stopped before, perform a clean
* up of the surfaces
*/
- void notifyAppResumed(boolean wasStopped) {
- if (DEBUG_ADD_REMOVE) Slog.v(TAG, "notifyAppResumed: wasStopped=" + wasStopped + " " + this);
+ void notifyAppResumed(boolean wasStopped, boolean allowSavedSurface) {
+ if (DEBUG_ADD_REMOVE) Slog.v(TAG, "notifyAppResumed: wasStopped=" + wasStopped
+ + " allowSavedSurface=" + allowSavedSurface + " " + this);
mAppStopped = false;
if (!wasStopped) {
destroySurfaces(true /*cleanupOnResume*/);
}
+ if (!allowSavedSurface) {
+ destroySavedSurfaces();
+ }
}
/**
diff --git a/services/core/java/com/android/server/wm/WindowManagerService.java b/services/core/java/com/android/server/wm/WindowManagerService.java
index 1f82f0c..2145e9b 100644
--- a/services/core/java/com/android/server/wm/WindowManagerService.java
+++ b/services/core/java/com/android/server/wm/WindowManagerService.java
@@ -4479,7 +4479,7 @@
}
@Override
- public void notifyAppResumed(IBinder token, boolean wasStopped) {
+ public void notifyAppResumed(IBinder token, boolean wasStopped, boolean allowSavedSurface) {
if (!checkCallingPermission(android.Manifest.permission.MANAGE_APP_TOKENS,
"notifyAppResumed()")) {
throw new SecurityException("Requires MANAGE_APP_TOKENS permission");
@@ -4492,7 +4492,7 @@
Slog.w(TAG_WM, "Attempted to notify resumed of non-existing app token: " + token);
return;
}
- wtoken.notifyAppResumed(wasStopped);
+ wtoken.notifyAppResumed(wasStopped, allowSavedSurface);
}
}
diff --git a/tools/layoutlib/bridge/src/android/view/IWindowManagerImpl.java b/tools/layoutlib/bridge/src/android/view/IWindowManagerImpl.java
index 5a9860d..58df301 100644
--- a/tools/layoutlib/bridge/src/android/view/IWindowManagerImpl.java
+++ b/tools/layoutlib/bridge/src/android/view/IWindowManagerImpl.java
@@ -351,7 +351,8 @@
}
@Override
- public void notifyAppResumed(IBinder token, boolean wasStopped) throws RemoteException {
+ public void notifyAppResumed(IBinder token, boolean wasStopped, boolean allowSavedSurface)
+ throws RemoteException {
// TODO Auto-generated method stub
}