summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rwxr-xr-xservices/core/java/com/android/server/am/ActivityRecord.java25
-rw-r--r--services/core/java/com/android/server/am/ActivityStack.java14
-rw-r--r--services/core/java/com/android/server/wm/WindowManagerService.java31
3 files changed, 51 insertions, 19 deletions
diff --git a/services/core/java/com/android/server/am/ActivityRecord.java b/services/core/java/com/android/server/am/ActivityRecord.java
index 32ca5bfa3049..b75d9bc3bc5b 100755
--- a/services/core/java/com/android/server/am/ActivityRecord.java
+++ b/services/core/java/com/android/server/am/ActivityRecord.java
@@ -196,7 +196,12 @@ final class ActivityRecord {
private boolean inHistory; // are we in the history stack?
final ActivityStackSupervisor mStackSupervisor;
- boolean mStartingWindowShown = false;
+
+ static final int STARTING_WINDOW_NOT_SHOWN = 0;
+ static final int STARTING_WINDOW_SHOWN = 1;
+ static final int STARTING_WINDOW_REMOVED = 2;
+ int mStartingWindowState = STARTING_WINDOW_NOT_SHOWN;
+
boolean mUpdateTaskThumbnailWhenHidden;
ActivityContainer mInitialActivityContainer;
@@ -214,6 +219,19 @@ final class ActivityRecord {
boolean pendingVoiceInteractionStart; // Waiting for activity-invoked voice session
IVoiceInteractionSession voiceSession; // Voice interaction session for this activity
+ private static String startingWindowStateToString(int state) {
+ switch (state) {
+ case STARTING_WINDOW_NOT_SHOWN:
+ return "STARTING_WINDOW_NOT_SHOWN";
+ case STARTING_WINDOW_SHOWN:
+ return "STARTING_WINDOW_SHOWN";
+ case STARTING_WINDOW_REMOVED:
+ return "STARTING_WINDOW_REMOVED";
+ default:
+ return "unknown state=" + state;
+ }
+ }
+
void dump(PrintWriter pw, String prefix) {
final long now = SystemClock.uptimeMillis();
pw.print(prefix); pw.print("packageName="); pw.print(packageName);
@@ -320,8 +338,9 @@ final class ActivityRecord {
pw.print(" inHistory="); pw.print(inHistory);
pw.print(" visible="); pw.print(visible);
pw.print(" sleeping="); pw.print(sleeping);
- pw.print(" idle="); pw.println(idle);
- pw.print(" mStartingWindowShown="); pw.println(mStartingWindowShown);
+ pw.print(" idle="); pw.print(idle);
+ pw.print(" mStartingWindowState=");
+ pw.println(startingWindowStateToString(mStartingWindowState));
pw.print(prefix); pw.print("fullscreen="); pw.print(fullscreen);
pw.print(" noDisplay="); pw.print(noDisplay);
pw.print(" immersive="); pw.print(immersive);
diff --git a/services/core/java/com/android/server/am/ActivityStack.java b/services/core/java/com/android/server/am/ActivityStack.java
index ec37667a37c2..5491b4f9021b 100644
--- a/services/core/java/com/android/server/am/ActivityStack.java
+++ b/services/core/java/com/android/server/am/ActivityStack.java
@@ -34,6 +34,8 @@ import static com.android.server.am.ActivityManagerService.LOCK_SCREEN_SHOWN;
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.STARTING_WINDOW_REMOVED;
+import static com.android.server.am.ActivityRecord.STARTING_WINDOW_SHOWN;
import static com.android.server.am.ActivityStackSupervisor.FindTaskResult;
import static com.android.server.am.ActivityStackSupervisor.MOVING;
import static com.android.server.am.ActivityStackSupervisor.PRESERVE_WINDOWS;
@@ -63,7 +65,6 @@ import android.app.ActivityManager.RunningTaskInfo;
import android.content.ComponentName;
import android.content.Intent;
import android.content.pm.ActivityInfo;
-import android.content.pm.PackageManager;
import android.content.res.Configuration;
import android.graphics.Bitmap;
import android.net.Uri;
@@ -1845,10 +1846,11 @@ final class ActivityStack {
continue;
}
- if (r.state == ActivityState.INITIALIZING && r.mStartingWindowShown) {
+ if (r.state == ActivityState.INITIALIZING
+ && r.mStartingWindowState == STARTING_WINDOW_SHOWN) {
if (DEBUG_VISIBILITY) Slog.w(TAG_VISIBILITY,
"Found orphaned starting window " + r);
- r.mStartingWindowShown = false;
+ r.mStartingWindowState = STARTING_WINDOW_REMOVED;
mWindowManager.removeAppStartingWindow(r.appToken);
}
}
@@ -2263,7 +2265,7 @@ final class ActivityStack {
mService.compatibilityInfoForPackageLocked(next.info.applicationInfo),
next.nonLocalizedLabel, next.labelRes, next.icon, next.logo,
next.windowFlags, null, true);
- next.mStartingWindowShown = true;
+ next.mStartingWindowState = STARTING_WINDOW_SHOWN;
}
mStackSupervisor.startSpecificActivityLocked(next, true, false);
if (DEBUG_STACK) mStackSupervisor.validateTopActivitiesLocked();
@@ -2296,7 +2298,7 @@ final class ActivityStack {
next.nonLocalizedLabel,
next.labelRes, next.icon, next.logo, next.windowFlags,
null, true);
- next.mStartingWindowShown = true;
+ next.mStartingWindowState = STARTING_WINDOW_SHOWN;
}
if (DEBUG_SWITCH) Slog.v(TAG_SWITCH, "Restarting: " + next);
}
@@ -2529,7 +2531,7 @@ final class ActivityStack {
r.info.applicationInfo), r.nonLocalizedLabel,
r.labelRes, r.icon, r.logo, r.windowFlags,
prev != null ? prev.appToken : null, showStartingIcon);
- r.mStartingWindowShown = true;
+ r.mStartingWindowState = STARTING_WINDOW_SHOWN;
}
} else {
// If this is the first activity, don't do any fancy animations,
diff --git a/services/core/java/com/android/server/wm/WindowManagerService.java b/services/core/java/com/android/server/wm/WindowManagerService.java
index daeecfcfb1ab..00d731ae226f 100644
--- a/services/core/java/com/android/server/wm/WindowManagerService.java
+++ b/services/core/java/com/android/server/wm/WindowManagerService.java
@@ -4015,10 +4015,8 @@ public class WindowManagerService extends IWindowManager.Stub
public void removeAppStartingWindow(IBinder token) {
synchronized (mWindowMap) {
- AppWindowToken wtoken = mTokenMap.get(token).appWindowToken;
- if (wtoken.startingWindow != null) {
- scheduleRemoveStartingWindowLocked(wtoken);
- }
+ final AppWindowToken wtoken = mTokenMap.get(token).appWindowToken;
+ scheduleRemoveStartingWindowLocked(wtoken);
}
}
@@ -4497,17 +4495,30 @@ public class WindowManagerService extends IWindowManager.Stub
}
void scheduleRemoveStartingWindowLocked(AppWindowToken wtoken) {
+ if (wtoken == null) {
+ return;
+ }
if (mH.hasMessages(H.REMOVE_STARTING, wtoken)) {
// Already scheduled.
return;
}
- if (wtoken != null && wtoken.startingWindow != null) {
- if (DEBUG_STARTING_WINDOW) Slog.v(TAG_WM, Debug.getCallers(1) +
- ": Schedule remove starting " + wtoken + (wtoken != null ?
- " startingWindow=" + wtoken.startingWindow : ""));
- Message m = mH.obtainMessage(H.REMOVE_STARTING, wtoken);
- mH.sendMessage(m);
+
+ if (wtoken.startingWindow == null) {
+ if (wtoken.startingData != null) {
+ // Starting window has not been added yet, but it is scheduled to be added.
+ // Go ahead and cancel the request.
+ if (DEBUG_STARTING_WINDOW) Slog.v(TAG_WM,
+ "Clearing startingData for token=" + wtoken);
+ wtoken.startingData = null;
+ }
+ return;
}
+
+ if (DEBUG_STARTING_WINDOW) Slog.v(TAG_WM, Debug.getCallers(1) +
+ ": Schedule remove starting " + wtoken + (wtoken != null ?
+ " startingWindow=" + wtoken.startingWindow : ""));
+ Message m = mH.obtainMessage(H.REMOVE_STARTING, wtoken);
+ mH.sendMessage(m);
}
void dumpAppTokensLocked() {