summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--core/java/android/app/servertransaction/ClientTransaction.java5
-rw-r--r--services/core/java/com/android/server/am/ActivityRecord.java12
-rw-r--r--services/tests/servicestests/src/com/android/server/am/ActivityRecordTests.java31
-rw-r--r--services/tests/servicestests/src/com/android/server/am/ActivityTestsBase.java5
4 files changed, 51 insertions, 2 deletions
diff --git a/core/java/android/app/servertransaction/ClientTransaction.java b/core/java/android/app/servertransaction/ClientTransaction.java
index 764ceede5d20..7703c6bef364 100644
--- a/core/java/android/app/servertransaction/ClientTransaction.java
+++ b/core/java/android/app/servertransaction/ClientTransaction.java
@@ -24,6 +24,8 @@ import android.os.Parcel;
import android.os.Parcelable;
import android.os.RemoteException;
+import com.android.internal.annotations.VisibleForTesting;
+
import java.util.ArrayList;
import java.util.List;
import java.util.Objects;
@@ -78,7 +80,8 @@ public class ClientTransaction implements Parcelable, ObjectPoolItem {
}
/** Get the target state lifecycle request. */
- ActivityLifecycleItem getLifecycleStateRequest() {
+ @VisibleForTesting
+ public ActivityLifecycleItem getLifecycleStateRequest() {
return mLifecycleStateRequest;
}
diff --git a/services/core/java/com/android/server/am/ActivityRecord.java b/services/core/java/com/android/server/am/ActivityRecord.java
index 8eb519797641..dc12fac152ca 100644
--- a/services/core/java/com/android/server/am/ActivityRecord.java
+++ b/services/core/java/com/android/server/am/ActivityRecord.java
@@ -135,6 +135,7 @@ import android.app.ResultInfo;
import android.app.servertransaction.MoveToDisplayItem;
import android.app.servertransaction.MultiWindowModeChangeItem;
import android.app.servertransaction.NewIntentItem;
+import android.app.servertransaction.PauseActivityItem;
import android.app.servertransaction.PipModeChangeItem;
import android.app.servertransaction.WindowVisibilityItem;
import android.app.servertransaction.ActivityConfigurationChangeItem;
@@ -1607,6 +1608,17 @@ final class ActivityRecord extends ConfigurationContainer implements AppWindowCo
// The activity may be waiting for stop, but that is no longer appropriate for it.
mStackSupervisor.mStoppingActivities.remove(this);
mStackSupervisor.mGoingToSleepActivities.remove(this);
+
+ // If an activity is not in the paused state when becoming visible, cycle to the paused
+ // state.
+ if (state != PAUSED) {
+ // An activity must be in the {@link PAUSING} state for the system to validate
+ // the move to {@link PAUSED}.
+ state = PAUSING;
+ service.mLifecycleManager.scheduleTransaction(app.thread, appToken,
+ PauseActivityItem.obtain(finishing, false /* userLeaving */,
+ configChangeFlags, false /* dontReport */));
+ }
} catch (Exception e) {
// Just skip on any failure; we'll make it visible when it next restarts.
Slog.w(TAG, "Exception thrown making visibile: " + intent.getComponent(), e);
diff --git a/services/tests/servicestests/src/com/android/server/am/ActivityRecordTests.java b/services/tests/servicestests/src/com/android/server/am/ActivityRecordTests.java
index ee45595f9a87..1dba39f5345a 100644
--- a/services/tests/servicestests/src/com/android/server/am/ActivityRecordTests.java
+++ b/services/tests/servicestests/src/com/android/server/am/ActivityRecordTests.java
@@ -21,6 +21,9 @@ import static android.app.WindowConfiguration.WINDOWING_MODE_FULLSCREEN;
import static android.content.pm.ActivityInfo.RESIZE_MODE_RESIZEABLE;
import static android.content.pm.ActivityInfo.RESIZE_MODE_UNRESIZEABLE;
import static android.view.Display.DEFAULT_DISPLAY;
+
+import static com.android.server.am.ActivityStack.ActivityState.PAUSING;
+import static com.android.server.am.ActivityStack.ActivityState.STOPPED;
import static com.android.server.am.ActivityStack.REMOVE_TASK_MODE_MOVING;
import static com.android.server.policy.WindowManagerPolicy.NAV_BAR_BOTTOM;
import static com.android.server.policy.WindowManagerPolicy.NAV_BAR_LEFT;
@@ -32,11 +35,14 @@ import static org.junit.Assert.assertNull;
import static org.junit.Assert.assertTrue;
import static org.mockito.Mockito.any;
import static org.mockito.Mockito.anyInt;
+import static org.mockito.Mockito.atLeast;
import static org.mockito.Mockito.eq;
import static org.mockito.Mockito.times;
import static org.mockito.Mockito.verify;
import static org.mockito.Mockito.when;
+import android.app.servertransaction.ClientTransaction;
+import android.app.servertransaction.PauseActivityItem;
import android.graphics.Rect;
import android.platform.test.annotations.Presubmit;
import android.support.test.filters.MediumTest;
@@ -46,11 +52,13 @@ import org.junit.runner.RunWith;
import org.junit.Before;
import org.junit.Test;
+import org.mockito.ArgumentCaptor;
+
/**
* Tests for the {@link ActivityRecord} class.
*
* Build/Install/Run:
- * bit FrameworksServicesTests:com.android.server.am.ActivityRecordTests
+ * atest FrameworksServicesTests:com.android.server.am.ActivityRecordTests
*/
@MediumTest
@Presubmit
@@ -101,6 +109,27 @@ public class ActivityRecordTests extends ActivityTestsBase {
}
@Test
+ public void testPausingWhenVisibleFromStopped() throws Exception {
+ mActivity.state = STOPPED;
+ mActivity.makeVisibleIfNeeded(null /* starting */);
+ assertEquals(mActivity.state, PAUSING);
+
+ final ArgumentCaptor<ClientTransaction> transaction =
+ ArgumentCaptor.forClass(ClientTransaction.class);
+ verify(mActivity.app.thread, atLeast(1)).scheduleTransaction(transaction.capture());
+
+ boolean pauseFound = false;
+
+ for (ClientTransaction targetTransaction : transaction.getAllValues()) {
+ if (targetTransaction.getLifecycleStateRequest() instanceof PauseActivityItem) {
+ pauseFound = true;
+ }
+ }
+
+ assertTrue(pauseFound);
+ }
+
+ @Test
public void testPositionLimitedAspectRatioNavBarBottom() throws Exception {
verifyPositionWithLimitedAspectRatio(NAV_BAR_BOTTOM, new Rect(0, 0, 1000, 2000), 1.5f,
new Rect(0, 0, 1000, 1500));
diff --git a/services/tests/servicestests/src/com/android/server/am/ActivityTestsBase.java b/services/tests/servicestests/src/com/android/server/am/ActivityTestsBase.java
index d74d994844ef..96bf49b288c9 100644
--- a/services/tests/servicestests/src/com/android/server/am/ActivityTestsBase.java
+++ b/services/tests/servicestests/src/com/android/server/am/ActivityTestsBase.java
@@ -32,6 +32,7 @@ import static org.mockito.Mockito.spy;
import org.mockito.invocation.InvocationOnMock;
+import android.app.IApplicationThread;
import android.content.ComponentName;
import android.content.Context;
import android.content.Intent;
@@ -177,6 +178,10 @@ public class ActivityTestsBase {
mTaskRecord.addActivityToTop(activity);
}
+ activity.setProcess(new ProcessRecord(null, mService.mContext.getApplicationInfo(),
+ "name", 12345));
+ activity.app.thread = mock(IApplicationThread.class);
+
return activity;
}
}