From d3f175c8179e8fbb275a5ef53b5a6fc4d88c1f24 Mon Sep 17 00:00:00 2001 From: Christopher Tate Date: Thu, 14 Jun 2012 14:16:54 -0700 Subject: [PATCH] Don't finish noHistory="true" activities behind the lock screen The foreground activity is stopped when the device goes to sleep, and started again when the device is unlocked. We now distinguish this case from a "normal" stop, and do not finish() a foreground noHistory="true" activity inappropriately when the device sleeps. We also detect the case where an activity is started while the device is still asleep, in which case the foreground noHistory activity is cleaned up as part of bringing the new activity to the foreground. Bug 6657549 Change-Id: I9c6a0830aed0e47e4207b62803b90067c8486112 --- .../java/com/android/server/am/ActivityStack.java | 32 +++++++++++++++++++--- 1 file changed, 28 insertions(+), 4 deletions(-) diff --git a/services/java/com/android/server/am/ActivityStack.java b/services/java/com/android/server/am/ActivityStack.java index 8a86fe7a28b1..1eef2cf0904e 100755 --- a/services/java/com/android/server/am/ActivityStack.java +++ b/services/java/com/android/server/am/ActivityStack.java @@ -1474,6 +1474,21 @@ final class ActivityStack { return true; } + // If the most recent activity was noHistory but was only stopped rather + // than stopped+finished because the device went to sleep, we need to make + // sure to finish it as we're making a new activity topmost. + final ActivityRecord last = mLastPausedActivity; + if (mService.mSleeping && last != null && !last.finishing) { + if ((last.intent.getFlags()&Intent.FLAG_ACTIVITY_NO_HISTORY) != 0 + || (last.info.flags&ActivityInfo.FLAG_NO_HISTORY) != 0) { + if (DEBUG_STATES) { + Slog.d(TAG, "no-history finish of " + last + " on new resume"); + } + requestFinishActivityLocked(last.appToken, Activity.RESULT_CANCELED, null, + "no-history"); + } + } + if (prev != null && prev != next) { if (!prev.waitingVisible && next != null && !next.nowVisible) { prev.waitingVisible = true; @@ -3279,8 +3294,16 @@ final class ActivityStack { if ((r.intent.getFlags()&Intent.FLAG_ACTIVITY_NO_HISTORY) != 0 || (r.info.flags&ActivityInfo.FLAG_NO_HISTORY) != 0) { if (!r.finishing) { - requestFinishActivityLocked(r.appToken, Activity.RESULT_CANCELED, null, - "no-history"); + if (!mService.mSleeping) { + if (DEBUG_STATES) { + Slog.d(TAG, "no-history finish of " + r); + } + requestFinishActivityLocked(r.appToken, Activity.RESULT_CANCELED, null, + "no-history"); + } else { + if (DEBUG_STATES) Slog.d(TAG, "Not finishing noHistory " + r + + " on stop because we're just sleeping"); + } } } @@ -3526,9 +3549,10 @@ final class ActivityStack { final boolean requestFinishActivityLocked(IBinder token, int resultCode, Intent resultData, String reason) { int index = indexOfTokenLocked(token); - if (DEBUG_RESULTS) Slog.v( + if (DEBUG_RESULTS || DEBUG_STATES) Slog.v( TAG, "Finishing activity @" + index + ": token=" + token - + ", result=" + resultCode + ", data=" + resultData); + + ", result=" + resultCode + ", data=" + resultData + + ", reason=" + reason); if (index < 0) { return false; } -- 2.11.0