diff options
| author | 2017-08-23 03:38:56 +0000 | |
|---|---|---|
| committer | 2017-08-23 03:38:56 +0000 | |
| commit | f86b91009de3bb164087c429231513a60df4079a (patch) | |
| tree | b816afa713bf9fc0f6f022dcccf5e08d7db0b684 | |
| parent | e83ab7fc07fa24f43f40f17428ae4b9c20d64b5f (diff) | |
| parent | 7f792333c2debd624e021b1f6d4f78ad3ffb4c3b (diff) | |
Merge "Fix activity manager timeout during shutdown" into oc-mr1-dev am: bc06e43c49
am: 7f792333c2
Change-Id: Iad9fec571e686cec9ab1cc7164a798e5c5e83eca
3 files changed, 26 insertions, 27 deletions
diff --git a/services/core/java/com/android/server/am/ActivityStack.java b/services/core/java/com/android/server/am/ActivityStack.java index 923cf0e3ba08..0e51b90b1072 100644 --- a/services/core/java/com/android/server/am/ActivityStack.java +++ b/services/core/java/com/android/server/am/ActivityStack.java @@ -1189,7 +1189,8 @@ class ActivityStack<T extends StackWindowController> extends ConfigurationContai * function get called again when those actions complete. * * @param shuttingDown true when the called because the device is shutting down. - * @return true if something must be done before going to sleep. + * @return true if the stack finished going to sleep, false if the stack only started the + * process of going to sleep (checkReadyForSleep will be called when that process finishes). */ boolean goToSleepIfPossible(boolean shuttingDown) { boolean shouldSleep = true; @@ -1240,10 +1241,10 @@ class ActivityStack<T extends StackWindowController> extends ConfigurationContai goToSleep(); } - return !shouldSleep; + return shouldSleep; } - private void goToSleep() { + void goToSleep() { ensureActivitiesVisibleLocked(null, 0, !PRESERVE_WINDOWS); // Make sure any paused or stopped but visible activities are now sleeping. diff --git a/services/core/java/com/android/server/am/ActivityStackSupervisor.java b/services/core/java/com/android/server/am/ActivityStackSupervisor.java index 1568e8c51d16..441df0b099bd 100644 --- a/services/core/java/com/android/server/am/ActivityStackSupervisor.java +++ b/services/core/java/com/android/server/am/ActivityStackSupervisor.java @@ -3173,15 +3173,7 @@ public class ActivityStackSupervisor extends ConfigurationContainer implements D boolean timedout = false; final long endTime = System.currentTimeMillis() + timeout; while (true) { - boolean cantShutdown = false; - for (int displayNdx = mActivityDisplays.size() - 1; displayNdx >= 0; --displayNdx) { - final ArrayList<ActivityStack> stacks = mActivityDisplays.valueAt(displayNdx).mStacks; - for (int stackNdx = stacks.size() - 1; stackNdx >= 0; --stackNdx) { - cantShutdown |= - stacks.get(stackNdx).goToSleepIfPossible(true /* shuttingDown */); - } - } - if (cantShutdown) { + if (!putStacksToSleepLocked(true /* allowDelay */, true /* shuttingDown */)) { long timeRemaining = endTime - System.currentTimeMillis(); if (timeRemaining > 0) { try { @@ -3268,19 +3260,8 @@ public class ActivityStackSupervisor extends ConfigurationContainer implements D return; } - if (allowDelay) { - boolean dontSleep = false; - for (int displayNdx = mActivityDisplays.size() - 1; displayNdx >= 0; --displayNdx) { - final ActivityDisplay display = mActivityDisplays.valueAt(displayNdx); - final ArrayList<ActivityStack> stacks = display.mStacks; - for (int stackNdx = stacks.size() - 1; stackNdx >= 0; --stackNdx) { - dontSleep |= stacks.get(stackNdx).goToSleepIfPossible(false /* shuttingDown */); - } - } - - if (dontSleep) { - return; - } + if (!putStacksToSleepLocked(allowDelay, false /* shuttingDown */)) { + return; } // Send launch end powerhint before going sleep @@ -3296,6 +3277,23 @@ public class ActivityStackSupervisor extends ConfigurationContainer implements D } } + // Tries to put all activity stacks to sleep. Returns true if all stacks were + // successfully put to sleep. + private boolean putStacksToSleepLocked(boolean allowDelay, boolean shuttingDown) { + boolean allSleep = true; + for (int displayNdx = mActivityDisplays.size() - 1; displayNdx >= 0; --displayNdx) { + final ArrayList<ActivityStack> stacks = mActivityDisplays.valueAt(displayNdx).mStacks; + for (int stackNdx = stacks.size() - 1; stackNdx >= 0; --stackNdx) { + if (allowDelay) { + allSleep &= stacks.get(stackNdx).goToSleepIfPossible(shuttingDown); + } else { + stacks.get(stackNdx).goToSleep(); + } + } + } + return allSleep; + } + boolean reportResumedActivityLocked(ActivityRecord r) { final ActivityStack stack = r.getStack(); if (isFocusedStack(stack)) { diff --git a/services/tests/servicestests/src/com/android/server/am/ActivityStackTests.java b/services/tests/servicestests/src/com/android/server/am/ActivityStackTests.java index ba221591fc92..80e241c0581f 100644 --- a/services/tests/servicestests/src/com/android/server/am/ActivityStackTests.java +++ b/services/tests/servicestests/src/com/android/server/am/ActivityStackTests.java @@ -17,9 +17,9 @@ package com.android.server.am; import static org.junit.Assert.assertEquals; +import static org.junit.Assert.assertFalse; import static org.junit.Assert.assertNotNull; import static org.junit.Assert.assertNull; -import static org.junit.Assert.assertTrue; import android.app.ActivityManager; import android.content.ComponentName; @@ -81,7 +81,7 @@ public class ActivityStackTests extends ActivityTestsBase { final boolean waiting = testStack.goToSleepIfPossible(false); // Ensure we report not being ready for sleep. - assertTrue(waiting); + assertFalse(waiting); // Make sure the resumed activity is untouched. assertEquals(testStack.mResumedActivity, activityRecord); |