summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--services/core/java/com/android/server/wm/ActivityRecord.java24
-rw-r--r--services/core/java/com/android/server/wm/ActivityStack.java8
-rw-r--r--services/core/java/com/android/server/wm/WindowProcessController.java5
-rw-r--r--services/tests/wmtests/src/com/android/server/wm/ActivityRecordTests.java12
4 files changed, 34 insertions, 15 deletions
diff --git a/services/core/java/com/android/server/wm/ActivityRecord.java b/services/core/java/com/android/server/wm/ActivityRecord.java
index 0faea61b9d60..6a39eab92211 100644
--- a/services/core/java/com/android/server/wm/ActivityRecord.java
+++ b/services/core/java/com/android/server/wm/ActivityRecord.java
@@ -108,6 +108,7 @@ import static com.android.server.wm.ActivityStack.ActivityState.PAUSED;
import static com.android.server.wm.ActivityStack.ActivityState.PAUSING;
import static com.android.server.wm.ActivityStack.ActivityState.RESTARTING_PROCESS;
import static com.android.server.wm.ActivityStack.ActivityState.RESUMED;
+import static com.android.server.wm.ActivityStack.ActivityState.STARTED;
import static com.android.server.wm.ActivityStack.ActivityState.STOPPED;
import static com.android.server.wm.ActivityStack.ActivityState.STOPPING;
import static com.android.server.wm.ActivityStack.LAUNCH_TICK;
@@ -1924,6 +1925,15 @@ final class ActivityRecord extends ConfigurationContainer {
return state1 == mState || state2 == mState || state3 == mState || state4 == mState;
}
+ /**
+ * Returns {@code true} if the Activity is in one of the specified states.
+ */
+ boolean isState(ActivityState state1, ActivityState state2, ActivityState state3,
+ ActivityState state4, ActivityState state5) {
+ return state1 == mState || state2 == mState || state3 == mState || state4 == mState
+ || state5 == mState;
+ }
+
void notifyAppResumed(boolean wasStopped) {
if (mAppWindowToken == null) {
Slog.w(TAG_WM, "Attempted to notify resumed of non-existing app token: "
@@ -2039,12 +2049,10 @@ final class ActivityRecord extends ConfigurationContainer {
mAtmService.getLifecycleManager().scheduleTransaction(app.getThread(), appToken,
WindowVisibilityItem.obtain(true /* showWindow */));
makeActiveIfNeeded(null /* activeActivity*/);
- if (isState(STOPPING, STOPPED) && isFocusable()) {
- // #shouldMakeActive() only evaluates the topmost activities in task, so
- // activities that are not the topmost in task are not being resumed or paused.
- // For activities that are still in STOPPING or STOPPED state, updates the state
- // to PAUSE at least when making it visible.
- setState(PAUSED, "makeClientVisible");
+ if (isState(STOPPING, STOPPED)) {
+ // Set state to STARTED in order to have consistent state with client while
+ // making an non-active activity visible from stopped.
+ setState(STARTED, "makeClientVisible");
}
} catch (Exception e) {
Slog.w(TAG, "Exception thrown sending visibility update: " + intent.getComponent(), e);
@@ -2120,7 +2128,7 @@ final class ActivityRecord extends ConfigurationContainer {
// calls will lead to noticeable jank. A later call to
// ActivityStack#ensureActivitiesVisibleLocked will bring the activity to a proper
// active state.
- if (!isState(RESUMED, PAUSED, STOPPED, STOPPING)
+ if (!isState(STARTED, RESUMED, PAUSED, STOPPED, STOPPING)
|| getActivityStack().mTranslucentActivityWaiting != null) {
return false;
}
@@ -2648,7 +2656,7 @@ final class ActivityRecord extends ConfigurationContainer {
compatInfo, nonLocalizedLabel, labelRes, icon, logo, windowFlags,
prev != null ? prev.appToken : null, newTask, taskSwitch, isProcessRunning(),
allowTaskSnapshot(),
- mState.ordinal() >= RESUMED.ordinal() && mState.ordinal() <= STOPPED.ordinal(),
+ mState.ordinal() >= STARTED.ordinal() && mState.ordinal() <= STOPPED.ordinal(),
fromRecents);
if (shown) {
mStartingWindowState = STARTING_WINDOW_SHOWN;
diff --git a/services/core/java/com/android/server/wm/ActivityStack.java b/services/core/java/com/android/server/wm/ActivityStack.java
index 74c3069462ea..5be286f4bd2c 100644
--- a/services/core/java/com/android/server/wm/ActivityStack.java
+++ b/services/core/java/com/android/server/wm/ActivityStack.java
@@ -62,6 +62,7 @@ import static com.android.server.wm.ActivityStack.ActivityState.FINISHING;
import static com.android.server.wm.ActivityStack.ActivityState.PAUSED;
import static com.android.server.wm.ActivityStack.ActivityState.PAUSING;
import static com.android.server.wm.ActivityStack.ActivityState.RESUMED;
+import static com.android.server.wm.ActivityStack.ActivityState.STARTED;
import static com.android.server.wm.ActivityStack.ActivityState.STOPPED;
import static com.android.server.wm.ActivityStack.ActivityState.STOPPING;
import static com.android.server.wm.ActivityStackSupervisor.PAUSE_IMMEDIATELY;
@@ -292,6 +293,7 @@ class ActivityStack extends ConfigurationContainer {
enum ActivityState {
INITIALIZING,
+ STARTED,
RESUMED,
PAUSING,
PAUSED,
@@ -1609,7 +1611,7 @@ class ActivityStack extends ConfigurationContainer {
final ArrayList<ActivityRecord> activities = mTaskHistory.get(taskNdx).mActivities;
for (int activityNdx = activities.size() - 1; activityNdx >= 0; --activityNdx) {
final ActivityRecord r = activities.get(activityNdx);
- if (r.isState(STOPPING, STOPPED, PAUSED, PAUSING)) {
+ if (r.isState(STARTED, STOPPING, STOPPED, PAUSED, PAUSING)) {
r.setSleeping(true);
}
}
@@ -2437,6 +2439,7 @@ class ActivityStack extends ConfigurationContainer {
case RESUMED:
case PAUSING:
case PAUSED:
+ case STARTED:
addToStopping(r, true /* scheduleIdle */,
canEnterPictureInPicture /* idleDelayed */, "makeInvisible");
break;
@@ -3873,7 +3876,7 @@ class ActivityStack extends ConfigurationContainer {
}
if (activityNdx >= 0) {
r = mTaskHistory.get(taskNdx).mActivities.get(activityNdx);
- if (r.isState(RESUMED, PAUSING, PAUSED)) {
+ if (r.isState(STARTED, RESUMED, PAUSING, PAUSED)) {
if (!r.isActivityTypeHome() || mService.mHomeProcess != r.app) {
Slog.w(TAG, " Force finishing activity "
+ r.intent.getComponent().flattenToShortString());
@@ -4137,6 +4140,7 @@ class ActivityStack extends ConfigurationContainer {
|| (prevState == PAUSED
&& (mode == FINISH_AFTER_PAUSE || inPinnedWindowingMode()))
|| finishingInNonFocusedStackOrNoRunning
+ || prevState == STARTED
|| prevState == STOPPING
|| prevState == STOPPED
|| prevState == ActivityState.INITIALIZING) {
diff --git a/services/core/java/com/android/server/wm/WindowProcessController.java b/services/core/java/com/android/server/wm/WindowProcessController.java
index bc5e32823547..932e44e7b8c2 100644
--- a/services/core/java/com/android/server/wm/WindowProcessController.java
+++ b/services/core/java/com/android/server/wm/WindowProcessController.java
@@ -27,6 +27,7 @@ import static com.android.server.wm.ActivityStack.ActivityState.INITIALIZING;
import static com.android.server.wm.ActivityStack.ActivityState.PAUSED;
import static com.android.server.wm.ActivityStack.ActivityState.PAUSING;
import static com.android.server.wm.ActivityStack.ActivityState.RESUMED;
+import static com.android.server.wm.ActivityStack.ActivityState.STARTED;
import static com.android.server.wm.ActivityStack.ActivityState.STOPPING;
import static com.android.server.wm.ActivityTaskManagerDebugConfig.DEBUG_CONFIGURATION;
import static com.android.server.wm.ActivityTaskManagerDebugConfig.DEBUG_RELEASE;
@@ -731,10 +732,10 @@ public class WindowProcessController extends ConfigurationContainer<Configuratio
if (DEBUG_RELEASE) Slog.d(TAG_RELEASE, "Abort release; already destroying: " + r);
return null;
}
- // Don't consider any activies that are currently not in a state where they
+ // Don't consider any activities that are currently not in a state where they
// can be destroyed.
if (r.visible || !r.stopped || !r.haveState
- || r.isState(RESUMED, PAUSING, PAUSED, STOPPING)) {
+ || r.isState(STARTED, RESUMED, PAUSING, PAUSED, STOPPING)) {
if (DEBUG_RELEASE) Slog.d(TAG_RELEASE, "Not releasing in-use activity: " + r);
continue;
}
diff --git a/services/tests/wmtests/src/com/android/server/wm/ActivityRecordTests.java b/services/tests/wmtests/src/com/android/server/wm/ActivityRecordTests.java
index 8fbb7f53e668..efbae2b566ad 100644
--- a/services/tests/wmtests/src/com/android/server/wm/ActivityRecordTests.java
+++ b/services/tests/wmtests/src/com/android/server/wm/ActivityRecordTests.java
@@ -31,9 +31,9 @@ import static com.android.dx.mockito.inline.extended.ExtendedMockito.spyOn;
import static com.android.dx.mockito.inline.extended.ExtendedMockito.verify;
import static com.android.dx.mockito.inline.extended.ExtendedMockito.when;
import static com.android.server.wm.ActivityStack.ActivityState.INITIALIZING;
-import static com.android.server.wm.ActivityStack.ActivityState.PAUSED;
import static com.android.server.wm.ActivityStack.ActivityState.PAUSING;
import static com.android.server.wm.ActivityStack.ActivityState.RESUMED;
+import static com.android.server.wm.ActivityStack.ActivityState.STARTED;
import static com.android.server.wm.ActivityStack.ActivityState.STOPPED;
import static com.android.server.wm.ActivityStack.REMOVE_TASK_MODE_MOVING;
import static com.android.server.wm.ActivityStack.STACK_VISIBILITY_INVISIBLE;
@@ -166,7 +166,13 @@ public class ActivityRecordTests extends ActivityTestsBase {
final ActivityRecord topActivity = new ActivityBuilder(mService).setTask(mTask).build();
mStack.mTranslucentActivityWaiting = topActivity;
mActivity.makeVisibleIfNeeded(null /* starting */, true /* reportToClient */);
- assertTrue(mActivity.isState(PAUSED));
+ assertTrue(mActivity.isState(STARTED));
+
+ mStack.mTranslucentActivityWaiting = null;
+ topActivity.changeWindowTranslucency(false);
+ mActivity.setState(STOPPED, "testPausingWhenVisibleFromStopped behind non-opaque");
+ mActivity.makeVisibleIfNeeded(null /* starting */, true /* reportToClient */);
+ assertTrue(mActivity.isState(STARTED));
}
private void ensureActivityConfiguration() {
@@ -442,7 +448,7 @@ public class ActivityRecordTests extends ActivityTestsBase {
topActivity.changeWindowTranslucency(false);
mActivity.setState(ActivityStack.ActivityState.STOPPED, "Testing");
mActivity.makeClientVisible();
- assertEquals(PAUSED, mActivity.getState());
+ assertEquals(STARTED, mActivity.getState());
}
@Test