Merge "Disallow task snapshot starting window for intent != ACTION_MAIN" into oc-dev

This commit is contained in:
Jorim Jaggi
2017-04-12 17:06:10 +00:00
committed by Android (Google) Code Review
5 changed files with 42 additions and 33 deletions

View File

@@ -1561,8 +1561,8 @@ final class ActivityRecord extends ConfigurationContainer implements AppWindowCo
mStackSupervisor.mAppVisibilitiesChangedSinceLastPause = true;
}
void notifyAppResumed(boolean wasStopped, boolean allowSavedSurface) {
mWindowContainerController.notifyAppResumed(wasStopped, allowSavedSurface);
void notifyAppResumed(boolean wasStopped) {
mWindowContainerController.notifyAppResumed(wasStopped);
}
void notifyUnknownVisibilityLaunched() {
@@ -2112,7 +2112,8 @@ final class ActivityRecord extends ConfigurationContainer implements AppWindowCo
service.compatibilityInfoForPackageLocked(info.applicationInfo);
final boolean shown = mWindowContainerController.addStartingWindow(packageName, theme,
compatInfo, nonLocalizedLabel, labelRes, icon, logo, windowFlags,
prev != null ? prev.appToken : null, newTask, taskSwitch, isProcessRunning());
prev != null ? prev.appToken : null, newTask, taskSwitch, isProcessRunning(),
allowTaskSnapshot());
if (shown) {
mStartingWindowState = STARTING_WINDOW_SHOWN;
}
@@ -2552,7 +2553,7 @@ final class ActivityRecord extends ConfigurationContainer implements AppWindowCo
preserveWindowOnDeferredRelaunch = false;
}
boolean isProcessRunning() {
private boolean isProcessRunning() {
ProcessRecord proc = app;
if (proc == null) {
proc = service.mProcessNames.get(processName, info.applicationInfo.uid);
@@ -2560,6 +2561,26 @@ final class ActivityRecord extends ConfigurationContainer implements AppWindowCo
return proc != null && proc.thread != null;
}
/**
* @return Whether a task snapshot starting window may be shown.
*/
private boolean allowTaskSnapshot() {
if (newIntents == null) {
return true;
}
// Restrict task snapshot starting window 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 = newIntents.size() - 1; i >= 0; i--) {
final Intent intent = newIntents.get(i);
if (intent != null && !ActivityRecord.isMainIntent(intent)) {
return false;
}
}
return true;
}
void saveToXml(XmlSerializer out) throws IOException, XmlPullParserException {
out.attribute(null, ATTR_ID, String.valueOf(createTime));
out.attribute(null, ATTR_LAUNCHEDFROMUID, String.valueOf(launchedFromUid));

View File

@@ -2531,26 +2531,14 @@ class ActivityStack<T extends StackWindowController> extends ConfigurationContai
}
}
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, false /* andPause */);
}
// Well the app will no longer be stopped.
// Clear app token stopped state in window manager if needed.
next.notifyAppResumed(next.stopped, allowSavedSurface);
next.notifyAppResumed(next.stopped);
EventLog.writeEvent(EventLogTags.AM_RESUME_ACTIVITY, next.userId,
System.identityHashCode(next), next.getTask().taskId,

View File

@@ -449,7 +449,8 @@ public class AppWindowContainerController
public boolean addStartingWindow(String pkg, int theme, CompatibilityInfo compatInfo,
CharSequence nonLocalizedLabel, int labelRes, int icon, int logo, int windowFlags,
IBinder transferFrom, boolean newTask, boolean taskSwitch, boolean processRunning) {
IBinder transferFrom, boolean newTask, boolean taskSwitch, boolean processRunning,
boolean allowTaskSnapshot) {
synchronized(mWindowMap) {
if (DEBUG_STARTING_WINDOW) Slog.v(TAG_WM, "setAppStartingWindow: token=" + mToken
+ " pkg=" + pkg + " transferFrom=" + transferFrom);
@@ -469,7 +470,8 @@ public class AppWindowContainerController
return false;
}
final int type = getStartingWindowType(newTask, taskSwitch, processRunning);
final int type = getStartingWindowType(newTask, taskSwitch, processRunning,
allowTaskSnapshot);
if (type == STARTING_WINDOW_TYPE_SNAPSHOT) {
return createSnapshot();
@@ -539,10 +541,11 @@ public class AppWindowContainerController
return true;
}
private int getStartingWindowType(boolean newTask, boolean taskSwitch, boolean processRunning) {
private int getStartingWindowType(boolean newTask, boolean taskSwitch, boolean processRunning,
boolean allowTaskSnapshot) {
if (newTask || !processRunning) {
return STARTING_WINDOW_TYPE_SPLASH_SCREEN;
} else if (taskSwitch) {
} else if (taskSwitch && allowTaskSnapshot) {
return STARTING_WINDOW_TYPE_SNAPSHOT;
} else {
return STARTING_WINDOW_TYPE_NONE;
@@ -612,13 +615,13 @@ public class AppWindowContainerController
}
}
public void notifyAppResumed(boolean wasStopped, boolean allowSavedSurface) {
public void notifyAppResumed(boolean wasStopped) {
synchronized(mWindowMap) {
if (mContainer == null) {
Slog.w(TAG_WM, "Attempted to notify resumed of non-existing app token: " + mToken);
return;
}
mContainer.notifyAppResumed(wasStopped, allowSavedSurface);
mContainer.notifyAppResumed(wasStopped);
}
}

View File

@@ -582,16 +582,13 @@ class AppWindowToken extends WindowToken implements WindowManagerService.AppFree
* Notify that the app is now resumed, and it was not stopped before, perform a clean
* up of the surfaces
*/
void notifyAppResumed(boolean wasStopped, boolean allowSavedSurface) {
void notifyAppResumed(boolean wasStopped) {
if (DEBUG_ADD_REMOVE) Slog.v(TAG, "notifyAppResumed: wasStopped=" + wasStopped
+ " allowSavedSurface=" + allowSavedSurface + " " + this);
+ " " + this);
mAppStopped = false;
if (!wasStopped) {
destroySurfaces(true /*cleanupOnResume*/);
}
if (!allowSavedSurface) {
destroySavedSurfaces();
}
}
/**

View File

@@ -97,7 +97,7 @@ public class AppWindowContainerControllerTests extends WindowTestsBase {
final WindowTestUtils.TestAppWindowContainerController controller =
createAppWindowController();
controller.addStartingWindow(InstrumentationRegistry.getContext().getPackageName(),
android.R.style.Theme, null, "Test", 0, 0, 0, 0, null, true, true, false);
android.R.style.Theme, null, "Test", 0, 0, 0, 0, null, true, true, false, true);
waitUntilHandlersIdle();
final AppWindowToken atoken = controller.getAppWindowToken();
assertHasStartingWindow(atoken);
@@ -113,11 +113,11 @@ public class AppWindowContainerControllerTests extends WindowTestsBase {
final WindowTestUtils.TestAppWindowContainerController controller2 =
createAppWindowController();
controller1.addStartingWindow(InstrumentationRegistry.getContext().getPackageName(),
android.R.style.Theme, null, "Test", 0, 0, 0, 0, null, true, true, false);
android.R.style.Theme, null, "Test", 0, 0, 0, 0, null, true, true, false, true);
waitUntilHandlersIdle();
controller2.addStartingWindow(InstrumentationRegistry.getContext().getPackageName(),
android.R.style.Theme, null, "Test", 0, 0, 0, 0, controller1.mToken.asBinder(),
true, true, false);
true, true, false, true);
waitUntilHandlersIdle();
assertNoStartingWindow(controller1.getAppWindowToken());
assertHasStartingWindow(controller2.getAppWindowToken());
@@ -134,10 +134,10 @@ public class AppWindowContainerControllerTests extends WindowTestsBase {
// Surprise, ...! Transfer window in the middle of the creation flow.
controller2.addStartingWindow(InstrumentationRegistry.getContext().getPackageName(),
android.R.style.Theme, null, "Test", 0, 0, 0, 0, controller1.mToken.asBinder(),
true, true, false);
true, true, false, true);
});
controller1.addStartingWindow(InstrumentationRegistry.getContext().getPackageName(),
android.R.style.Theme, null, "Test", 0, 0, 0, 0, null, true, true, false);
android.R.style.Theme, null, "Test", 0, 0, 0, 0, null, true, true, false, true);
waitUntilHandlersIdle();
assertNoStartingWindow(controller1.getAppWindowToken());
assertHasStartingWindow(controller2.getAppWindowToken());