diff options
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; } } |