From d38aed81420d7d992f65ef2efb5f69c1900fc61d Mon Sep 17 00:00:00 2001 From: Dianne Hackborn Date: Tue, 10 Jun 2014 21:36:35 -0700 Subject: [PATCH] Some tweaks to improve document task creation. - Mark the chooser activity as never launching in to a new task, even if the caller asks for it. These are dialogs so don't make sense as stand-alone tasks. (Maybe later the policy should be to not launch into a new task in any case that the activity is a dialog or even transparent at all.) - Keep track in the task record of whether any activities in it have been shown to the user, and use this to automatically remove the task when all activities finish. This leans up cases where apps are launching stub activities that get turned in to tasks but are never seen by the user because they immediately launch another activity in another task and then finish. Change-Id: I00b641c80aa96bd5071479f36ee2e4d8e3a81aeb --- core/res/AndroidManifest.xml | 3 ++- .../java/com/android/server/am/ActivityRecord.java | 3 +++ .../core/java/com/android/server/am/TaskRecord.java | 12 +++++++++--- .../com/android/server/pm/PackageManagerService.java | 1 + 4 files changed, 15 insertions(+), 4 deletions(-) diff --git a/core/res/AndroidManifest.xml b/core/res/AndroidManifest.xml index 87687793f1605..c5fd83d995adb 100644 --- a/core/res/AndroidManifest.xml +++ b/core/res/AndroidManifest.xml @@ -2688,7 +2688,8 @@ android:theme="@style/Theme.Holo.Dialog.Alert" android:finishOnCloseSystemDialogs="true" android:excludeFromRecents="true" - android:multiprocess="true"> + android:multiprocess="true" + android:documentLaunchMode="never"> diff --git a/services/core/java/com/android/server/am/ActivityRecord.java b/services/core/java/com/android/server/am/ActivityRecord.java index b429b93796028..fe4937174e9f8 100755 --- a/services/core/java/com/android/server/am/ActivityRecord.java +++ b/services/core/java/com/android/server/am/ActivityRecord.java @@ -906,6 +906,9 @@ final class ActivityRecord { } startTime = 0; finishLaunchTickingLocked(); + if (task != null) { + task.hasBeenVisible = true; + } } } diff --git a/services/core/java/com/android/server/am/TaskRecord.java b/services/core/java/com/android/server/am/TaskRecord.java index 79e2d9d095df3..81a0b363cac1d 100644 --- a/services/core/java/com/android/server/am/TaskRecord.java +++ b/services/core/java/com/android/server/am/TaskRecord.java @@ -73,6 +73,7 @@ final class TaskRecord extends ThumbnailHolder { boolean rootWasReset; // True if the intent at the root of the task had // the FLAG_ACTIVITY_RESET_TASK_IF_NEEDED flag. boolean askedCompatMode;// Have asked the user about compat mode for this task. + boolean hasBeenVisible; // Set if any activities in the task have been visible to the user. String stringName; // caching of toString() result. int userId; // user for which this task was created @@ -328,8 +329,12 @@ final class TaskRecord extends ThumbnailHolder { } boolean autoRemoveFromRecents() { - return intent != null && - (intent.getFlags() & Intent.FLAG_ACTIVITY_AUTO_REMOVE_FROM_RECENTS) != 0; + // We will automatically remove the task either if it has explicitly asked for + // this, or it is empty and has never contained an activity that got shown to + // the user. + return (intent != null && + (intent.getFlags() & Intent.FLAG_ACTIVITY_AUTO_REMOVE_FROM_RECENTS) != 0) || + (mActivities.isEmpty() && !hasBeenVisible); } /** @@ -800,7 +805,8 @@ final class TaskRecord extends ThumbnailHolder { } pw.print(prefix); pw.print("lastThumbnail="); pw.print(lastThumbnail); pw.print(" lastDescription="); pw.println(lastDescription); - pw.print(prefix); pw.print("lastActiveTime="); pw.print(lastActiveTime); + pw.print(prefix); pw.print("hasBeenVisible="); pw.print(hasBeenVisible); + pw.print(" lastActiveTime="); pw.print(lastActiveTime); pw.print(" (inactive for "); pw.print((getInactiveDuration()/1000)); pw.println("s)"); } diff --git a/services/core/java/com/android/server/pm/PackageManagerService.java b/services/core/java/com/android/server/pm/PackageManagerService.java index 0c094e8d6f395..c7dd8494bde97 100755 --- a/services/core/java/com/android/server/pm/PackageManagerService.java +++ b/services/core/java/com/android/server/pm/PackageManagerService.java @@ -4988,6 +4988,7 @@ public class PackageManagerService extends IPackageManager.Stub { mResolveActivity.packageName = mAndroidApplication.packageName; mResolveActivity.processName = "system:ui"; mResolveActivity.launchMode = ActivityInfo.LAUNCH_MULTIPLE; + mResolveActivity.documentLaunchMode = ActivityInfo.DOCUMENT_LAUNCH_NEVER; mResolveActivity.flags = ActivityInfo.FLAG_EXCLUDE_FROM_RECENTS; mResolveActivity.theme = R.style.Theme_Holo_Dialog_Alert; mResolveActivity.exported = true;