Loading core/java/android/app/servertransaction/ActivityLifecycleItem.java +1 −1 Original line number Original line Diff line number Diff line Loading @@ -59,7 +59,7 @@ public abstract class ActivityLifecycleItem extends ActivityTransactionItem { } } @Override @Override boolean isActivityLifecycleItem() { public boolean isActivityLifecycleItem() { return true; return true; } } Loading core/java/android/app/servertransaction/ClientTransactionItem.java +1 −1 Original line number Original line Diff line number Diff line Loading @@ -75,7 +75,7 @@ public abstract class ClientTransactionItem implements BaseClientRequest, Parcel /** /** * Whether this is a {@link ActivityLifecycleItem}. * Whether this is a {@link ActivityLifecycleItem}. */ */ boolean isActivityLifecycleItem() { public boolean isActivityLifecycleItem() { return false; return false; } } Loading core/tests/coretests/src/android/app/servertransaction/TransactionExecutorTests.java +37 −32 Original line number Original line Diff line number Diff line Loading @@ -31,6 +31,7 @@ import static org.junit.Assert.assertEquals; import static org.junit.Assert.assertTrue; import static org.junit.Assert.assertTrue; import static org.mockito.ArgumentMatchers.any; import static org.mockito.ArgumentMatchers.any; import static org.mockito.ArgumentMatchers.eq; import static org.mockito.ArgumentMatchers.eq; import static org.mockito.Mockito.doReturn; import static org.mockito.Mockito.inOrder; import static org.mockito.Mockito.inOrder; import static org.mockito.Mockito.mock; import static org.mockito.Mockito.mock; import static org.mockito.Mockito.never; import static org.mockito.Mockito.never; Loading Loading @@ -59,6 +60,8 @@ import org.junit.Before; import org.junit.Test; import org.junit.Test; import org.junit.runner.RunWith; import org.junit.runner.RunWith; import org.mockito.InOrder; import org.mockito.InOrder; import org.mockito.Mock; import org.mockito.MockitoAnnotations; import java.util.Arrays; import java.util.Arrays; import java.util.Collections; import java.util.Collections; Loading @@ -80,20 +83,32 @@ import java.util.stream.Collectors; @Presubmit @Presubmit public class TransactionExecutorTests { public class TransactionExecutorTests { @Mock private ClientTransactionHandler mTransactionHandler; @Mock private ActivityLifecycleItem mActivityLifecycleItem; @Mock private IBinder mActivityToken; @Mock private Activity mActivity; private TransactionExecutor mExecutor; private TransactionExecutor mExecutor; private TransactionExecutorHelper mExecutorHelper; private TransactionExecutorHelper mExecutorHelper; private ClientTransactionHandler mTransactionHandler; private ActivityClientRecord mClientRecord; private ActivityClientRecord mClientRecord; @Before @Before public void setUp() throws Exception { public void setUp() throws Exception { mTransactionHandler = mock(ClientTransactionHandler.class); MockitoAnnotations.initMocks(this); mClientRecord = new ActivityClientRecord(); mClientRecord = new ActivityClientRecord(); when(mTransactionHandler.getActivityClient(any())).thenReturn(mClientRecord); when(mTransactionHandler.getActivityClient(any())).thenReturn(mClientRecord); mExecutor = spy(new TransactionExecutor(mTransactionHandler)); mExecutor = spy(new TransactionExecutor(mTransactionHandler)); mExecutorHelper = new TransactionExecutorHelper(); mExecutorHelper = new TransactionExecutorHelper(); doReturn(true).when(mActivityLifecycleItem).isActivityLifecycleItem(); doReturn(mActivityToken).when(mActivityLifecycleItem).getActivityToken(); doReturn(mActivity).when(mTransactionHandler).getActivity(mActivityToken); } } @Test @Test Loading Loading @@ -229,23 +244,21 @@ public class TransactionExecutorTests { when(callback1.getPostExecutionState()).thenReturn(UNDEFINED); when(callback1.getPostExecutionState()).thenReturn(UNDEFINED); ClientTransactionItem callback2 = mock(ClientTransactionItem.class); ClientTransactionItem callback2 = mock(ClientTransactionItem.class); when(callback2.getPostExecutionState()).thenReturn(UNDEFINED); when(callback2.getPostExecutionState()).thenReturn(UNDEFINED); ActivityLifecycleItem stateRequest = mock(ActivityLifecycleItem.class); IBinder token = mock(IBinder.class); when(stateRequest.getActivityToken()).thenReturn(token); when(mTransactionHandler.getActivity(token)).thenReturn(mock(Activity.class)); ClientTransaction transaction = ClientTransaction.obtain(null /* client */); ClientTransaction transaction = ClientTransaction.obtain(null /* client */); transaction.addCallback(callback1); transaction.addCallback(callback1); transaction.addCallback(callback2); transaction.addCallback(callback2); transaction.setLifecycleStateRequest(stateRequest); transaction.setLifecycleStateRequest(mActivityLifecycleItem); transaction.preExecute(mTransactionHandler); transaction.preExecute(mTransactionHandler); mExecutor.execute(transaction); mExecutor.execute(transaction); InOrder inOrder = inOrder(mTransactionHandler, callback1, callback2, stateRequest); InOrder inOrder = inOrder(mTransactionHandler, callback1, callback2, mActivityLifecycleItem); inOrder.verify(callback1).execute(eq(mTransactionHandler), any()); inOrder.verify(callback1).execute(eq(mTransactionHandler), any()); inOrder.verify(callback2).execute(eq(mTransactionHandler), any()); inOrder.verify(callback2).execute(eq(mTransactionHandler), any()); inOrder.verify(stateRequest).execute(eq(mTransactionHandler), eq(mClientRecord), any()); inOrder.verify(mActivityLifecycleItem).execute(eq(mTransactionHandler), eq(mClientRecord), any()); } } @Test @Test Loading @@ -254,23 +267,21 @@ public class TransactionExecutorTests { when(callback1.getPostExecutionState()).thenReturn(UNDEFINED); when(callback1.getPostExecutionState()).thenReturn(UNDEFINED); ClientTransactionItem callback2 = mock(ClientTransactionItem.class); ClientTransactionItem callback2 = mock(ClientTransactionItem.class); when(callback2.getPostExecutionState()).thenReturn(UNDEFINED); when(callback2.getPostExecutionState()).thenReturn(UNDEFINED); ActivityLifecycleItem stateRequest = mock(ActivityLifecycleItem.class); IBinder token = mock(IBinder.class); when(stateRequest.getActivityToken()).thenReturn(token); when(mTransactionHandler.getActivity(token)).thenReturn(mock(Activity.class)); ClientTransaction transaction = ClientTransaction.obtain(null /* client */); ClientTransaction transaction = ClientTransaction.obtain(null /* client */); transaction.addTransactionItem(callback1); transaction.addTransactionItem(callback1); transaction.addTransactionItem(callback2); transaction.addTransactionItem(callback2); transaction.addTransactionItem(stateRequest); transaction.addTransactionItem(mActivityLifecycleItem); transaction.preExecute(mTransactionHandler); transaction.preExecute(mTransactionHandler); mExecutor.execute(transaction); mExecutor.execute(transaction); InOrder inOrder = inOrder(mTransactionHandler, callback1, callback2, stateRequest); InOrder inOrder = inOrder(mTransactionHandler, callback1, callback2, mActivityLifecycleItem); inOrder.verify(callback1).execute(eq(mTransactionHandler), any()); inOrder.verify(callback1).execute(eq(mTransactionHandler), any()); inOrder.verify(callback2).execute(eq(mTransactionHandler), any()); inOrder.verify(callback2).execute(eq(mTransactionHandler), any()); inOrder.verify(stateRequest).execute(eq(mTransactionHandler), eq(mClientRecord), any()); inOrder.verify(mActivityLifecycleItem).execute(eq(mTransactionHandler), eq(mClientRecord), any()); } } @Test @Test Loading Loading @@ -536,42 +547,36 @@ public class TransactionExecutorTests { @Test @Test public void testActivityItemExecute() { public void testActivityItemExecute() { final IBinder token = mock(IBinder.class); final ClientTransaction transaction = ClientTransaction.obtain(null /* client */); final ClientTransaction transaction = ClientTransaction.obtain(null /* client */); final ActivityTransactionItem activityItem = mock(ActivityTransactionItem.class); final ActivityTransactionItem activityItem = mock(ActivityTransactionItem.class); when(activityItem.getPostExecutionState()).thenReturn(UNDEFINED); when(activityItem.getPostExecutionState()).thenReturn(UNDEFINED); when(activityItem.getActivityToken()).thenReturn(token); when(activityItem.getActivityToken()).thenReturn(mActivityToken); transaction.addCallback(activityItem); transaction.addCallback(activityItem); final ActivityLifecycleItem stateRequest = mock(ActivityLifecycleItem.class); transaction.setLifecycleStateRequest(mActivityLifecycleItem); transaction.setLifecycleStateRequest(stateRequest); when(stateRequest.getActivityToken()).thenReturn(token); when(mTransactionHandler.getActivity(token)).thenReturn(mock(Activity.class)); mExecutor.execute(transaction); mExecutor.execute(transaction); final InOrder inOrder = inOrder(activityItem, stateRequest); final InOrder inOrder = inOrder(activityItem, mActivityLifecycleItem); inOrder.verify(activityItem).execute(eq(mTransactionHandler), eq(mClientRecord), any()); inOrder.verify(activityItem).execute(eq(mTransactionHandler), eq(mClientRecord), any()); inOrder.verify(stateRequest).execute(eq(mTransactionHandler), eq(mClientRecord), any()); inOrder.verify(mActivityLifecycleItem).execute(eq(mTransactionHandler), eq(mClientRecord), any()); } } @Test @Test public void testExecuteTransactionItems_activityItemExecute() { public void testExecuteTransactionItems_activityItemExecute() { final IBinder token = mock(IBinder.class); final ClientTransaction transaction = ClientTransaction.obtain(null /* client */); final ClientTransaction transaction = ClientTransaction.obtain(null /* client */); final ActivityTransactionItem activityItem = mock(ActivityTransactionItem.class); final ActivityTransactionItem activityItem = mock(ActivityTransactionItem.class); when(activityItem.getPostExecutionState()).thenReturn(UNDEFINED); when(activityItem.getPostExecutionState()).thenReturn(UNDEFINED); when(activityItem.getActivityToken()).thenReturn(token); when(activityItem.getActivityToken()).thenReturn(mActivityToken); transaction.addTransactionItem(activityItem); transaction.addTransactionItem(activityItem); final ActivityLifecycleItem stateRequest = mock(ActivityLifecycleItem.class); transaction.addTransactionItem(mActivityLifecycleItem); transaction.addTransactionItem(stateRequest); when(stateRequest.getActivityToken()).thenReturn(token); when(mTransactionHandler.getActivity(token)).thenReturn(mock(Activity.class)); mExecutor.execute(transaction); mExecutor.execute(transaction); final InOrder inOrder = inOrder(activityItem, stateRequest); final InOrder inOrder = inOrder(activityItem, mActivityLifecycleItem); inOrder.verify(activityItem).execute(eq(mTransactionHandler), eq(mClientRecord), any()); inOrder.verify(activityItem).execute(eq(mTransactionHandler), eq(mClientRecord), any()); inOrder.verify(stateRequest).execute(eq(mTransactionHandler), eq(mClientRecord), any()); inOrder.verify(mActivityLifecycleItem).execute(eq(mTransactionHandler), eq(mClientRecord), any()); } } private static int[] shuffledArray(int[] inputArray) { private static int[] shuffledArray(int[] inputArray) { Loading services/core/java/com/android/server/wm/ActivityClientController.java +3 −5 Original line number Original line Diff line number Diff line Loading @@ -70,7 +70,6 @@ import android.app.IRequestFinishCallback; import android.app.PictureInPictureParams; import android.app.PictureInPictureParams; import android.app.PictureInPictureUiState; import android.app.PictureInPictureUiState; import android.app.compat.CompatChanges; import android.app.compat.CompatChanges; import android.app.servertransaction.ClientTransaction; import android.app.servertransaction.EnterPipRequestedItem; import android.app.servertransaction.EnterPipRequestedItem; import android.app.servertransaction.PipStateTransactionItem; import android.app.servertransaction.PipStateTransactionItem; import android.compat.annotation.ChangeId; import android.compat.annotation.ChangeId; Loading Loading @@ -1018,7 +1017,7 @@ class ActivityClientController extends IActivityClientController.Stub { } } try { try { mService.getLifecycleManager().scheduleTransaction(r.app.getThread(), mService.getLifecycleManager().scheduleTransactionItem(r.app.getThread(), EnterPipRequestedItem.obtain(r.token)); EnterPipRequestedItem.obtain(r.token)); return true; return true; } catch (Exception e) { } catch (Exception e) { Loading @@ -1038,9 +1037,8 @@ class ActivityClientController extends IActivityClientController.Stub { } } try { try { final ClientTransaction transaction = ClientTransaction.obtain(r.app.getThread()); mService.getLifecycleManager().scheduleTransactionItem(r.app.getThread(), transaction.addCallback(PipStateTransactionItem.obtain(r.token, pipState)); PipStateTransactionItem.obtain(r.token, pipState)); mService.getLifecycleManager().scheduleTransaction(transaction); } catch (Exception e) { } catch (Exception e) { Slog.w(TAG, "Failed to send pip state transaction item: " Slog.w(TAG, "Failed to send pip state transaction item: " + r.intent.getComponent(), e); + r.intent.getComponent(), e); Loading services/core/java/com/android/server/wm/ActivityRecord.java +25 −27 Original line number Original line Diff line number Diff line Loading @@ -277,7 +277,6 @@ import android.app.servertransaction.ActivityConfigurationChangeItem; import android.app.servertransaction.ActivityLifecycleItem; import android.app.servertransaction.ActivityLifecycleItem; import android.app.servertransaction.ActivityRelaunchItem; import android.app.servertransaction.ActivityRelaunchItem; import android.app.servertransaction.ActivityResultItem; import android.app.servertransaction.ActivityResultItem; import android.app.servertransaction.ClientTransaction; import android.app.servertransaction.ClientTransactionItem; import android.app.servertransaction.ClientTransactionItem; import android.app.servertransaction.DestroyActivityItem; import android.app.servertransaction.DestroyActivityItem; import android.app.servertransaction.MoveToDisplayItem; import android.app.servertransaction.MoveToDisplayItem; Loading Loading @@ -1449,7 +1448,7 @@ final class ActivityRecord extends WindowToken implements WindowManagerService.A + "display, activityRecord=%s, displayId=%d, config=%s", this, displayId, + "display, activityRecord=%s, displayId=%d, config=%s", this, displayId, config); config); mAtmService.getLifecycleManager().scheduleTransaction(app.getThread(), mAtmService.getLifecycleManager().scheduleTransactionItem(app.getThread(), MoveToDisplayItem.obtain(token, displayId, config)); MoveToDisplayItem.obtain(token, displayId, config)); } catch (RemoteException e) { } catch (RemoteException e) { // If process died, whatever. // If process died, whatever. Loading @@ -1466,7 +1465,7 @@ final class ActivityRecord extends WindowToken implements WindowManagerService.A ProtoLog.v(WM_DEBUG_CONFIGURATION, "Sending new config to %s, " ProtoLog.v(WM_DEBUG_CONFIGURATION, "Sending new config to %s, " + "config: %s", this, config); + "config: %s", this, config); mAtmService.getLifecycleManager().scheduleTransaction(app.getThread(), mAtmService.getLifecycleManager().scheduleTransactionItem(app.getThread(), ActivityConfigurationChangeItem.obtain(token, config)); ActivityConfigurationChangeItem.obtain(token, config)); } catch (RemoteException e) { } catch (RemoteException e) { // If process died, whatever. // If process died, whatever. Loading @@ -1487,7 +1486,7 @@ final class ActivityRecord extends WindowToken implements WindowManagerService.A ProtoLog.v(WM_DEBUG_STATES, "Sending position change to %s, onTop: %b", ProtoLog.v(WM_DEBUG_STATES, "Sending position change to %s, onTop: %b", this, onTop); this, onTop); mAtmService.getLifecycleManager().scheduleTransaction(app.getThread(), mAtmService.getLifecycleManager().scheduleTransactionItem(app.getThread(), TopResumedActivityChangeItem.obtain(token, onTop)); TopResumedActivityChangeItem.obtain(token, onTop)); } catch (RemoteException e) { } catch (RemoteException e) { // If process died, whatever. // If process died, whatever. Loading Loading @@ -2750,7 +2749,7 @@ final class ActivityRecord extends WindowToken implements WindowManagerService.A } } try { try { mTransferringSplashScreenState = TRANSFER_SPLASH_SCREEN_ATTACH_TO_CLIENT; mTransferringSplashScreenState = TRANSFER_SPLASH_SCREEN_ATTACH_TO_CLIENT; mAtmService.getLifecycleManager().scheduleTransaction(app.getThread(), mAtmService.getLifecycleManager().scheduleTransactionItem(app.getThread(), TransferSplashScreenViewStateItem.obtain(token, parcelable, TransferSplashScreenViewStateItem.obtain(token, parcelable, windowAnimationLeash)); windowAnimationLeash)); scheduleTransferSplashScreenTimeout(); scheduleTransferSplashScreenTimeout(); Loading Loading @@ -3914,7 +3913,7 @@ final class ActivityRecord extends WindowToken implements WindowManagerService.A try { try { if (DEBUG_SWITCH) Slog.i(TAG_SWITCH, "Destroying: " + this); if (DEBUG_SWITCH) Slog.i(TAG_SWITCH, "Destroying: " + this); mAtmService.getLifecycleManager().scheduleTransaction(app.getThread(), mAtmService.getLifecycleManager().scheduleTransactionItem(app.getThread(), DestroyActivityItem.obtain(token, finishing, configChangeFlags)); DestroyActivityItem.obtain(token, finishing, configChangeFlags)); } catch (Exception e) { } catch (Exception e) { // We can just ignore exceptions here... if the process has crashed, our death // We can just ignore exceptions here... if the process has crashed, our death Loading Loading @@ -4825,7 +4824,7 @@ final class ActivityRecord extends WindowToken implements WindowManagerService.A try { try { final ArrayList<ResultInfo> list = new ArrayList<>(); final ArrayList<ResultInfo> list = new ArrayList<>(); list.add(new ResultInfo(resultWho, requestCode, resultCode, data)); list.add(new ResultInfo(resultWho, requestCode, resultCode, data)); mAtmService.getLifecycleManager().scheduleTransaction(app.getThread(), mAtmService.getLifecycleManager().scheduleTransactionItem(app.getThread(), ActivityResultItem.obtain(token, list)); ActivityResultItem.obtain(token, list)); return; return; } catch (Exception e) { } catch (Exception e) { Loading @@ -4836,22 +4835,23 @@ final class ActivityRecord extends WindowToken implements WindowManagerService.A // Schedule sending results now for Media Projection setup. // Schedule sending results now for Media Projection setup. if (forceSendForMediaProjection && attachedToProcess() && isState(STARTED, PAUSING, PAUSED, if (forceSendForMediaProjection && attachedToProcess() && isState(STARTED, PAUSING, PAUSED, STOPPING, STOPPED)) { STOPPING, STOPPED)) { final ClientTransaction transaction = ClientTransaction.obtain(app.getThread()); // Build result to be returned immediately. // Build result to be returned immediately. transaction.addCallback(ActivityResultItem.obtain( final ActivityResultItem activityResultItem = ActivityResultItem.obtain( token, List.of(new ResultInfo(resultWho, requestCode, resultCode, data)))); token, List.of(new ResultInfo(resultWho, requestCode, resultCode, data))); // When the activity result is delivered, the activity will transition to RESUMED. // When the activity result is delivered, the activity will transition to RESUMED. // Since the activity is only resumed so the result can be immediately delivered, // Since the activity is only resumed so the result can be immediately delivered, // return it to its original lifecycle state. // return it to its original lifecycle state. ActivityLifecycleItem lifecycleItem = getLifecycleItemForCurrentStateForResult(); final ActivityLifecycleItem lifecycleItem = getLifecycleItemForCurrentStateForResult(); try { if (lifecycleItem != null) { if (lifecycleItem != null) { transaction.setLifecycleStateRequest(lifecycleItem); mAtmService.getLifecycleManager().scheduleTransactionAndLifecycleItems( app.getThread(), activityResultItem, lifecycleItem); } else { } else { Slog.w(TAG, "Unable to get the lifecycle item for state " + mState Slog.w(TAG, "Unable to get the lifecycle item for state " + mState + " so couldn't immediately send result"); + " so couldn't immediately send result"); mAtmService.getLifecycleManager().scheduleTransactionItem( app.getThread(), activityResultItem); } } try { mAtmService.getLifecycleManager().scheduleTransaction(transaction); } catch (RemoteException e) { } catch (RemoteException e) { Slog.w(TAG, "Exception thrown sending result to " + this, e); Slog.w(TAG, "Exception thrown sending result to " + this, e); } } Loading Loading @@ -4931,7 +4931,7 @@ final class ActivityRecord extends WindowToken implements WindowManagerService.A // Making sure the client state is RESUMED after transaction completed and doing // Making sure the client state is RESUMED after transaction completed and doing // so only if activity is currently RESUMED. Otherwise, client may have extra // so only if activity is currently RESUMED. Otherwise, client may have extra // life-cycle calls to RESUMED (and PAUSED later). // life-cycle calls to RESUMED (and PAUSED later). mAtmService.getLifecycleManager().scheduleTransaction(app.getThread(), mAtmService.getLifecycleManager().scheduleTransactionItem(app.getThread(), NewIntentItem.obtain(token, ar, mState == RESUMED)); NewIntentItem.obtain(token, ar, mState == RESUMED)); unsent = false; unsent = false; } catch (RemoteException e) { } catch (RemoteException e) { Loading Loading @@ -6156,7 +6156,7 @@ final class ActivityRecord extends WindowToken implements WindowManagerService.A EventLogTags.writeWmPauseActivity(mUserId, System.identityHashCode(this), EventLogTags.writeWmPauseActivity(mUserId, System.identityHashCode(this), shortComponentName, "userLeaving=false", "make-active"); shortComponentName, "userLeaving=false", "make-active"); try { try { mAtmService.getLifecycleManager().scheduleTransaction(app.getThread(), mAtmService.getLifecycleManager().scheduleTransactionItem(app.getThread(), PauseActivityItem.obtain(token, finishing, false /* userLeaving */, PauseActivityItem.obtain(token, finishing, false /* userLeaving */, configChangeFlags, false /* dontReport */, mAutoEnteringPip)); configChangeFlags, false /* dontReport */, mAutoEnteringPip)); } catch (Exception e) { } catch (Exception e) { Loading @@ -6169,7 +6169,7 @@ final class ActivityRecord extends WindowToken implements WindowManagerService.A setState(STARTED, "makeActiveIfNeeded"); setState(STARTED, "makeActiveIfNeeded"); try { try { mAtmService.getLifecycleManager().scheduleTransaction(app.getThread(), mAtmService.getLifecycleManager().scheduleTransactionItem(app.getThread(), StartActivityItem.obtain(token, takeOptions())); StartActivityItem.obtain(token, takeOptions())); } catch (Exception e) { } catch (Exception e) { Slog.w(TAG, "Exception thrown sending start: " + intent.getComponent(), e); Slog.w(TAG, "Exception thrown sending start: " + intent.getComponent(), e); Loading Loading @@ -6467,7 +6467,7 @@ final class ActivityRecord extends WindowToken implements WindowManagerService.A } } EventLogTags.writeWmStopActivity( EventLogTags.writeWmStopActivity( mUserId, System.identityHashCode(this), shortComponentName); mUserId, System.identityHashCode(this), shortComponentName); mAtmService.getLifecycleManager().scheduleTransaction(app.getThread(), mAtmService.getLifecycleManager().scheduleTransactionItem(app.getThread(), StopActivityItem.obtain(token, configChangeFlags)); StopActivityItem.obtain(token, configChangeFlags)); mAtmService.mH.postDelayed(mStopTimeoutRunnable, STOP_TIMEOUT); mAtmService.mH.postDelayed(mStopTimeoutRunnable, STOP_TIMEOUT); Loading Loading @@ -9907,10 +9907,8 @@ final class ActivityRecord extends WindowToken implements WindowManagerService.A } else { } else { lifecycleItem = PauseActivityItem.obtain(token); lifecycleItem = PauseActivityItem.obtain(token); } } final ClientTransaction transaction = ClientTransaction.obtain(app.getThread()); mAtmService.getLifecycleManager().scheduleTransactionAndLifecycleItems( transaction.addCallback(callbackItem); app.getThread(), callbackItem, lifecycleItem); transaction.setLifecycleStateRequest(lifecycleItem); mAtmService.getLifecycleManager().scheduleTransaction(transaction); startRelaunching(); startRelaunching(); // Note: don't need to call pauseIfSleepingLocked() here, because the caller will only // Note: don't need to call pauseIfSleepingLocked() here, because the caller will only // request resume if this activity is currently resumed, which implies we aren't // request resume if this activity is currently resumed, which implies we aren't Loading Loading @@ -10002,7 +10000,7 @@ final class ActivityRecord extends WindowToken implements WindowManagerService.A // The process will be killed until the activity reports stopped with saved state (see // The process will be killed until the activity reports stopped with saved state (see // {@link ActivityTaskManagerService.activityStopped}). // {@link ActivityTaskManagerService.activityStopped}). try { try { mAtmService.getLifecycleManager().scheduleTransaction(app.getThread(), mAtmService.getLifecycleManager().scheduleTransactionItem(app.getThread(), StopActivityItem.obtain(token, 0 /* configChanges */)); StopActivityItem.obtain(token, 0 /* configChanges */)); } catch (RemoteException e) { } catch (RemoteException e) { Slog.w(TAG, "Exception thrown during restart " + this, e); Slog.w(TAG, "Exception thrown during restart " + this, e); Loading Loading
core/java/android/app/servertransaction/ActivityLifecycleItem.java +1 −1 Original line number Original line Diff line number Diff line Loading @@ -59,7 +59,7 @@ public abstract class ActivityLifecycleItem extends ActivityTransactionItem { } } @Override @Override boolean isActivityLifecycleItem() { public boolean isActivityLifecycleItem() { return true; return true; } } Loading
core/java/android/app/servertransaction/ClientTransactionItem.java +1 −1 Original line number Original line Diff line number Diff line Loading @@ -75,7 +75,7 @@ public abstract class ClientTransactionItem implements BaseClientRequest, Parcel /** /** * Whether this is a {@link ActivityLifecycleItem}. * Whether this is a {@link ActivityLifecycleItem}. */ */ boolean isActivityLifecycleItem() { public boolean isActivityLifecycleItem() { return false; return false; } } Loading
core/tests/coretests/src/android/app/servertransaction/TransactionExecutorTests.java +37 −32 Original line number Original line Diff line number Diff line Loading @@ -31,6 +31,7 @@ import static org.junit.Assert.assertEquals; import static org.junit.Assert.assertTrue; import static org.junit.Assert.assertTrue; import static org.mockito.ArgumentMatchers.any; import static org.mockito.ArgumentMatchers.any; import static org.mockito.ArgumentMatchers.eq; import static org.mockito.ArgumentMatchers.eq; import static org.mockito.Mockito.doReturn; import static org.mockito.Mockito.inOrder; import static org.mockito.Mockito.inOrder; import static org.mockito.Mockito.mock; import static org.mockito.Mockito.mock; import static org.mockito.Mockito.never; import static org.mockito.Mockito.never; Loading Loading @@ -59,6 +60,8 @@ import org.junit.Before; import org.junit.Test; import org.junit.Test; import org.junit.runner.RunWith; import org.junit.runner.RunWith; import org.mockito.InOrder; import org.mockito.InOrder; import org.mockito.Mock; import org.mockito.MockitoAnnotations; import java.util.Arrays; import java.util.Arrays; import java.util.Collections; import java.util.Collections; Loading @@ -80,20 +83,32 @@ import java.util.stream.Collectors; @Presubmit @Presubmit public class TransactionExecutorTests { public class TransactionExecutorTests { @Mock private ClientTransactionHandler mTransactionHandler; @Mock private ActivityLifecycleItem mActivityLifecycleItem; @Mock private IBinder mActivityToken; @Mock private Activity mActivity; private TransactionExecutor mExecutor; private TransactionExecutor mExecutor; private TransactionExecutorHelper mExecutorHelper; private TransactionExecutorHelper mExecutorHelper; private ClientTransactionHandler mTransactionHandler; private ActivityClientRecord mClientRecord; private ActivityClientRecord mClientRecord; @Before @Before public void setUp() throws Exception { public void setUp() throws Exception { mTransactionHandler = mock(ClientTransactionHandler.class); MockitoAnnotations.initMocks(this); mClientRecord = new ActivityClientRecord(); mClientRecord = new ActivityClientRecord(); when(mTransactionHandler.getActivityClient(any())).thenReturn(mClientRecord); when(mTransactionHandler.getActivityClient(any())).thenReturn(mClientRecord); mExecutor = spy(new TransactionExecutor(mTransactionHandler)); mExecutor = spy(new TransactionExecutor(mTransactionHandler)); mExecutorHelper = new TransactionExecutorHelper(); mExecutorHelper = new TransactionExecutorHelper(); doReturn(true).when(mActivityLifecycleItem).isActivityLifecycleItem(); doReturn(mActivityToken).when(mActivityLifecycleItem).getActivityToken(); doReturn(mActivity).when(mTransactionHandler).getActivity(mActivityToken); } } @Test @Test Loading Loading @@ -229,23 +244,21 @@ public class TransactionExecutorTests { when(callback1.getPostExecutionState()).thenReturn(UNDEFINED); when(callback1.getPostExecutionState()).thenReturn(UNDEFINED); ClientTransactionItem callback2 = mock(ClientTransactionItem.class); ClientTransactionItem callback2 = mock(ClientTransactionItem.class); when(callback2.getPostExecutionState()).thenReturn(UNDEFINED); when(callback2.getPostExecutionState()).thenReturn(UNDEFINED); ActivityLifecycleItem stateRequest = mock(ActivityLifecycleItem.class); IBinder token = mock(IBinder.class); when(stateRequest.getActivityToken()).thenReturn(token); when(mTransactionHandler.getActivity(token)).thenReturn(mock(Activity.class)); ClientTransaction transaction = ClientTransaction.obtain(null /* client */); ClientTransaction transaction = ClientTransaction.obtain(null /* client */); transaction.addCallback(callback1); transaction.addCallback(callback1); transaction.addCallback(callback2); transaction.addCallback(callback2); transaction.setLifecycleStateRequest(stateRequest); transaction.setLifecycleStateRequest(mActivityLifecycleItem); transaction.preExecute(mTransactionHandler); transaction.preExecute(mTransactionHandler); mExecutor.execute(transaction); mExecutor.execute(transaction); InOrder inOrder = inOrder(mTransactionHandler, callback1, callback2, stateRequest); InOrder inOrder = inOrder(mTransactionHandler, callback1, callback2, mActivityLifecycleItem); inOrder.verify(callback1).execute(eq(mTransactionHandler), any()); inOrder.verify(callback1).execute(eq(mTransactionHandler), any()); inOrder.verify(callback2).execute(eq(mTransactionHandler), any()); inOrder.verify(callback2).execute(eq(mTransactionHandler), any()); inOrder.verify(stateRequest).execute(eq(mTransactionHandler), eq(mClientRecord), any()); inOrder.verify(mActivityLifecycleItem).execute(eq(mTransactionHandler), eq(mClientRecord), any()); } } @Test @Test Loading @@ -254,23 +267,21 @@ public class TransactionExecutorTests { when(callback1.getPostExecutionState()).thenReturn(UNDEFINED); when(callback1.getPostExecutionState()).thenReturn(UNDEFINED); ClientTransactionItem callback2 = mock(ClientTransactionItem.class); ClientTransactionItem callback2 = mock(ClientTransactionItem.class); when(callback2.getPostExecutionState()).thenReturn(UNDEFINED); when(callback2.getPostExecutionState()).thenReturn(UNDEFINED); ActivityLifecycleItem stateRequest = mock(ActivityLifecycleItem.class); IBinder token = mock(IBinder.class); when(stateRequest.getActivityToken()).thenReturn(token); when(mTransactionHandler.getActivity(token)).thenReturn(mock(Activity.class)); ClientTransaction transaction = ClientTransaction.obtain(null /* client */); ClientTransaction transaction = ClientTransaction.obtain(null /* client */); transaction.addTransactionItem(callback1); transaction.addTransactionItem(callback1); transaction.addTransactionItem(callback2); transaction.addTransactionItem(callback2); transaction.addTransactionItem(stateRequest); transaction.addTransactionItem(mActivityLifecycleItem); transaction.preExecute(mTransactionHandler); transaction.preExecute(mTransactionHandler); mExecutor.execute(transaction); mExecutor.execute(transaction); InOrder inOrder = inOrder(mTransactionHandler, callback1, callback2, stateRequest); InOrder inOrder = inOrder(mTransactionHandler, callback1, callback2, mActivityLifecycleItem); inOrder.verify(callback1).execute(eq(mTransactionHandler), any()); inOrder.verify(callback1).execute(eq(mTransactionHandler), any()); inOrder.verify(callback2).execute(eq(mTransactionHandler), any()); inOrder.verify(callback2).execute(eq(mTransactionHandler), any()); inOrder.verify(stateRequest).execute(eq(mTransactionHandler), eq(mClientRecord), any()); inOrder.verify(mActivityLifecycleItem).execute(eq(mTransactionHandler), eq(mClientRecord), any()); } } @Test @Test Loading Loading @@ -536,42 +547,36 @@ public class TransactionExecutorTests { @Test @Test public void testActivityItemExecute() { public void testActivityItemExecute() { final IBinder token = mock(IBinder.class); final ClientTransaction transaction = ClientTransaction.obtain(null /* client */); final ClientTransaction transaction = ClientTransaction.obtain(null /* client */); final ActivityTransactionItem activityItem = mock(ActivityTransactionItem.class); final ActivityTransactionItem activityItem = mock(ActivityTransactionItem.class); when(activityItem.getPostExecutionState()).thenReturn(UNDEFINED); when(activityItem.getPostExecutionState()).thenReturn(UNDEFINED); when(activityItem.getActivityToken()).thenReturn(token); when(activityItem.getActivityToken()).thenReturn(mActivityToken); transaction.addCallback(activityItem); transaction.addCallback(activityItem); final ActivityLifecycleItem stateRequest = mock(ActivityLifecycleItem.class); transaction.setLifecycleStateRequest(mActivityLifecycleItem); transaction.setLifecycleStateRequest(stateRequest); when(stateRequest.getActivityToken()).thenReturn(token); when(mTransactionHandler.getActivity(token)).thenReturn(mock(Activity.class)); mExecutor.execute(transaction); mExecutor.execute(transaction); final InOrder inOrder = inOrder(activityItem, stateRequest); final InOrder inOrder = inOrder(activityItem, mActivityLifecycleItem); inOrder.verify(activityItem).execute(eq(mTransactionHandler), eq(mClientRecord), any()); inOrder.verify(activityItem).execute(eq(mTransactionHandler), eq(mClientRecord), any()); inOrder.verify(stateRequest).execute(eq(mTransactionHandler), eq(mClientRecord), any()); inOrder.verify(mActivityLifecycleItem).execute(eq(mTransactionHandler), eq(mClientRecord), any()); } } @Test @Test public void testExecuteTransactionItems_activityItemExecute() { public void testExecuteTransactionItems_activityItemExecute() { final IBinder token = mock(IBinder.class); final ClientTransaction transaction = ClientTransaction.obtain(null /* client */); final ClientTransaction transaction = ClientTransaction.obtain(null /* client */); final ActivityTransactionItem activityItem = mock(ActivityTransactionItem.class); final ActivityTransactionItem activityItem = mock(ActivityTransactionItem.class); when(activityItem.getPostExecutionState()).thenReturn(UNDEFINED); when(activityItem.getPostExecutionState()).thenReturn(UNDEFINED); when(activityItem.getActivityToken()).thenReturn(token); when(activityItem.getActivityToken()).thenReturn(mActivityToken); transaction.addTransactionItem(activityItem); transaction.addTransactionItem(activityItem); final ActivityLifecycleItem stateRequest = mock(ActivityLifecycleItem.class); transaction.addTransactionItem(mActivityLifecycleItem); transaction.addTransactionItem(stateRequest); when(stateRequest.getActivityToken()).thenReturn(token); when(mTransactionHandler.getActivity(token)).thenReturn(mock(Activity.class)); mExecutor.execute(transaction); mExecutor.execute(transaction); final InOrder inOrder = inOrder(activityItem, stateRequest); final InOrder inOrder = inOrder(activityItem, mActivityLifecycleItem); inOrder.verify(activityItem).execute(eq(mTransactionHandler), eq(mClientRecord), any()); inOrder.verify(activityItem).execute(eq(mTransactionHandler), eq(mClientRecord), any()); inOrder.verify(stateRequest).execute(eq(mTransactionHandler), eq(mClientRecord), any()); inOrder.verify(mActivityLifecycleItem).execute(eq(mTransactionHandler), eq(mClientRecord), any()); } } private static int[] shuffledArray(int[] inputArray) { private static int[] shuffledArray(int[] inputArray) { Loading
services/core/java/com/android/server/wm/ActivityClientController.java +3 −5 Original line number Original line Diff line number Diff line Loading @@ -70,7 +70,6 @@ import android.app.IRequestFinishCallback; import android.app.PictureInPictureParams; import android.app.PictureInPictureParams; import android.app.PictureInPictureUiState; import android.app.PictureInPictureUiState; import android.app.compat.CompatChanges; import android.app.compat.CompatChanges; import android.app.servertransaction.ClientTransaction; import android.app.servertransaction.EnterPipRequestedItem; import android.app.servertransaction.EnterPipRequestedItem; import android.app.servertransaction.PipStateTransactionItem; import android.app.servertransaction.PipStateTransactionItem; import android.compat.annotation.ChangeId; import android.compat.annotation.ChangeId; Loading Loading @@ -1018,7 +1017,7 @@ class ActivityClientController extends IActivityClientController.Stub { } } try { try { mService.getLifecycleManager().scheduleTransaction(r.app.getThread(), mService.getLifecycleManager().scheduleTransactionItem(r.app.getThread(), EnterPipRequestedItem.obtain(r.token)); EnterPipRequestedItem.obtain(r.token)); return true; return true; } catch (Exception e) { } catch (Exception e) { Loading @@ -1038,9 +1037,8 @@ class ActivityClientController extends IActivityClientController.Stub { } } try { try { final ClientTransaction transaction = ClientTransaction.obtain(r.app.getThread()); mService.getLifecycleManager().scheduleTransactionItem(r.app.getThread(), transaction.addCallback(PipStateTransactionItem.obtain(r.token, pipState)); PipStateTransactionItem.obtain(r.token, pipState)); mService.getLifecycleManager().scheduleTransaction(transaction); } catch (Exception e) { } catch (Exception e) { Slog.w(TAG, "Failed to send pip state transaction item: " Slog.w(TAG, "Failed to send pip state transaction item: " + r.intent.getComponent(), e); + r.intent.getComponent(), e); Loading
services/core/java/com/android/server/wm/ActivityRecord.java +25 −27 Original line number Original line Diff line number Diff line Loading @@ -277,7 +277,6 @@ import android.app.servertransaction.ActivityConfigurationChangeItem; import android.app.servertransaction.ActivityLifecycleItem; import android.app.servertransaction.ActivityLifecycleItem; import android.app.servertransaction.ActivityRelaunchItem; import android.app.servertransaction.ActivityRelaunchItem; import android.app.servertransaction.ActivityResultItem; import android.app.servertransaction.ActivityResultItem; import android.app.servertransaction.ClientTransaction; import android.app.servertransaction.ClientTransactionItem; import android.app.servertransaction.ClientTransactionItem; import android.app.servertransaction.DestroyActivityItem; import android.app.servertransaction.DestroyActivityItem; import android.app.servertransaction.MoveToDisplayItem; import android.app.servertransaction.MoveToDisplayItem; Loading Loading @@ -1449,7 +1448,7 @@ final class ActivityRecord extends WindowToken implements WindowManagerService.A + "display, activityRecord=%s, displayId=%d, config=%s", this, displayId, + "display, activityRecord=%s, displayId=%d, config=%s", this, displayId, config); config); mAtmService.getLifecycleManager().scheduleTransaction(app.getThread(), mAtmService.getLifecycleManager().scheduleTransactionItem(app.getThread(), MoveToDisplayItem.obtain(token, displayId, config)); MoveToDisplayItem.obtain(token, displayId, config)); } catch (RemoteException e) { } catch (RemoteException e) { // If process died, whatever. // If process died, whatever. Loading @@ -1466,7 +1465,7 @@ final class ActivityRecord extends WindowToken implements WindowManagerService.A ProtoLog.v(WM_DEBUG_CONFIGURATION, "Sending new config to %s, " ProtoLog.v(WM_DEBUG_CONFIGURATION, "Sending new config to %s, " + "config: %s", this, config); + "config: %s", this, config); mAtmService.getLifecycleManager().scheduleTransaction(app.getThread(), mAtmService.getLifecycleManager().scheduleTransactionItem(app.getThread(), ActivityConfigurationChangeItem.obtain(token, config)); ActivityConfigurationChangeItem.obtain(token, config)); } catch (RemoteException e) { } catch (RemoteException e) { // If process died, whatever. // If process died, whatever. Loading @@ -1487,7 +1486,7 @@ final class ActivityRecord extends WindowToken implements WindowManagerService.A ProtoLog.v(WM_DEBUG_STATES, "Sending position change to %s, onTop: %b", ProtoLog.v(WM_DEBUG_STATES, "Sending position change to %s, onTop: %b", this, onTop); this, onTop); mAtmService.getLifecycleManager().scheduleTransaction(app.getThread(), mAtmService.getLifecycleManager().scheduleTransactionItem(app.getThread(), TopResumedActivityChangeItem.obtain(token, onTop)); TopResumedActivityChangeItem.obtain(token, onTop)); } catch (RemoteException e) { } catch (RemoteException e) { // If process died, whatever. // If process died, whatever. Loading Loading @@ -2750,7 +2749,7 @@ final class ActivityRecord extends WindowToken implements WindowManagerService.A } } try { try { mTransferringSplashScreenState = TRANSFER_SPLASH_SCREEN_ATTACH_TO_CLIENT; mTransferringSplashScreenState = TRANSFER_SPLASH_SCREEN_ATTACH_TO_CLIENT; mAtmService.getLifecycleManager().scheduleTransaction(app.getThread(), mAtmService.getLifecycleManager().scheduleTransactionItem(app.getThread(), TransferSplashScreenViewStateItem.obtain(token, parcelable, TransferSplashScreenViewStateItem.obtain(token, parcelable, windowAnimationLeash)); windowAnimationLeash)); scheduleTransferSplashScreenTimeout(); scheduleTransferSplashScreenTimeout(); Loading Loading @@ -3914,7 +3913,7 @@ final class ActivityRecord extends WindowToken implements WindowManagerService.A try { try { if (DEBUG_SWITCH) Slog.i(TAG_SWITCH, "Destroying: " + this); if (DEBUG_SWITCH) Slog.i(TAG_SWITCH, "Destroying: " + this); mAtmService.getLifecycleManager().scheduleTransaction(app.getThread(), mAtmService.getLifecycleManager().scheduleTransactionItem(app.getThread(), DestroyActivityItem.obtain(token, finishing, configChangeFlags)); DestroyActivityItem.obtain(token, finishing, configChangeFlags)); } catch (Exception e) { } catch (Exception e) { // We can just ignore exceptions here... if the process has crashed, our death // We can just ignore exceptions here... if the process has crashed, our death Loading Loading @@ -4825,7 +4824,7 @@ final class ActivityRecord extends WindowToken implements WindowManagerService.A try { try { final ArrayList<ResultInfo> list = new ArrayList<>(); final ArrayList<ResultInfo> list = new ArrayList<>(); list.add(new ResultInfo(resultWho, requestCode, resultCode, data)); list.add(new ResultInfo(resultWho, requestCode, resultCode, data)); mAtmService.getLifecycleManager().scheduleTransaction(app.getThread(), mAtmService.getLifecycleManager().scheduleTransactionItem(app.getThread(), ActivityResultItem.obtain(token, list)); ActivityResultItem.obtain(token, list)); return; return; } catch (Exception e) { } catch (Exception e) { Loading @@ -4836,22 +4835,23 @@ final class ActivityRecord extends WindowToken implements WindowManagerService.A // Schedule sending results now for Media Projection setup. // Schedule sending results now for Media Projection setup. if (forceSendForMediaProjection && attachedToProcess() && isState(STARTED, PAUSING, PAUSED, if (forceSendForMediaProjection && attachedToProcess() && isState(STARTED, PAUSING, PAUSED, STOPPING, STOPPED)) { STOPPING, STOPPED)) { final ClientTransaction transaction = ClientTransaction.obtain(app.getThread()); // Build result to be returned immediately. // Build result to be returned immediately. transaction.addCallback(ActivityResultItem.obtain( final ActivityResultItem activityResultItem = ActivityResultItem.obtain( token, List.of(new ResultInfo(resultWho, requestCode, resultCode, data)))); token, List.of(new ResultInfo(resultWho, requestCode, resultCode, data))); // When the activity result is delivered, the activity will transition to RESUMED. // When the activity result is delivered, the activity will transition to RESUMED. // Since the activity is only resumed so the result can be immediately delivered, // Since the activity is only resumed so the result can be immediately delivered, // return it to its original lifecycle state. // return it to its original lifecycle state. ActivityLifecycleItem lifecycleItem = getLifecycleItemForCurrentStateForResult(); final ActivityLifecycleItem lifecycleItem = getLifecycleItemForCurrentStateForResult(); try { if (lifecycleItem != null) { if (lifecycleItem != null) { transaction.setLifecycleStateRequest(lifecycleItem); mAtmService.getLifecycleManager().scheduleTransactionAndLifecycleItems( app.getThread(), activityResultItem, lifecycleItem); } else { } else { Slog.w(TAG, "Unable to get the lifecycle item for state " + mState Slog.w(TAG, "Unable to get the lifecycle item for state " + mState + " so couldn't immediately send result"); + " so couldn't immediately send result"); mAtmService.getLifecycleManager().scheduleTransactionItem( app.getThread(), activityResultItem); } } try { mAtmService.getLifecycleManager().scheduleTransaction(transaction); } catch (RemoteException e) { } catch (RemoteException e) { Slog.w(TAG, "Exception thrown sending result to " + this, e); Slog.w(TAG, "Exception thrown sending result to " + this, e); } } Loading Loading @@ -4931,7 +4931,7 @@ final class ActivityRecord extends WindowToken implements WindowManagerService.A // Making sure the client state is RESUMED after transaction completed and doing // Making sure the client state is RESUMED after transaction completed and doing // so only if activity is currently RESUMED. Otherwise, client may have extra // so only if activity is currently RESUMED. Otherwise, client may have extra // life-cycle calls to RESUMED (and PAUSED later). // life-cycle calls to RESUMED (and PAUSED later). mAtmService.getLifecycleManager().scheduleTransaction(app.getThread(), mAtmService.getLifecycleManager().scheduleTransactionItem(app.getThread(), NewIntentItem.obtain(token, ar, mState == RESUMED)); NewIntentItem.obtain(token, ar, mState == RESUMED)); unsent = false; unsent = false; } catch (RemoteException e) { } catch (RemoteException e) { Loading Loading @@ -6156,7 +6156,7 @@ final class ActivityRecord extends WindowToken implements WindowManagerService.A EventLogTags.writeWmPauseActivity(mUserId, System.identityHashCode(this), EventLogTags.writeWmPauseActivity(mUserId, System.identityHashCode(this), shortComponentName, "userLeaving=false", "make-active"); shortComponentName, "userLeaving=false", "make-active"); try { try { mAtmService.getLifecycleManager().scheduleTransaction(app.getThread(), mAtmService.getLifecycleManager().scheduleTransactionItem(app.getThread(), PauseActivityItem.obtain(token, finishing, false /* userLeaving */, PauseActivityItem.obtain(token, finishing, false /* userLeaving */, configChangeFlags, false /* dontReport */, mAutoEnteringPip)); configChangeFlags, false /* dontReport */, mAutoEnteringPip)); } catch (Exception e) { } catch (Exception e) { Loading @@ -6169,7 +6169,7 @@ final class ActivityRecord extends WindowToken implements WindowManagerService.A setState(STARTED, "makeActiveIfNeeded"); setState(STARTED, "makeActiveIfNeeded"); try { try { mAtmService.getLifecycleManager().scheduleTransaction(app.getThread(), mAtmService.getLifecycleManager().scheduleTransactionItem(app.getThread(), StartActivityItem.obtain(token, takeOptions())); StartActivityItem.obtain(token, takeOptions())); } catch (Exception e) { } catch (Exception e) { Slog.w(TAG, "Exception thrown sending start: " + intent.getComponent(), e); Slog.w(TAG, "Exception thrown sending start: " + intent.getComponent(), e); Loading Loading @@ -6467,7 +6467,7 @@ final class ActivityRecord extends WindowToken implements WindowManagerService.A } } EventLogTags.writeWmStopActivity( EventLogTags.writeWmStopActivity( mUserId, System.identityHashCode(this), shortComponentName); mUserId, System.identityHashCode(this), shortComponentName); mAtmService.getLifecycleManager().scheduleTransaction(app.getThread(), mAtmService.getLifecycleManager().scheduleTransactionItem(app.getThread(), StopActivityItem.obtain(token, configChangeFlags)); StopActivityItem.obtain(token, configChangeFlags)); mAtmService.mH.postDelayed(mStopTimeoutRunnable, STOP_TIMEOUT); mAtmService.mH.postDelayed(mStopTimeoutRunnable, STOP_TIMEOUT); Loading Loading @@ -9907,10 +9907,8 @@ final class ActivityRecord extends WindowToken implements WindowManagerService.A } else { } else { lifecycleItem = PauseActivityItem.obtain(token); lifecycleItem = PauseActivityItem.obtain(token); } } final ClientTransaction transaction = ClientTransaction.obtain(app.getThread()); mAtmService.getLifecycleManager().scheduleTransactionAndLifecycleItems( transaction.addCallback(callbackItem); app.getThread(), callbackItem, lifecycleItem); transaction.setLifecycleStateRequest(lifecycleItem); mAtmService.getLifecycleManager().scheduleTransaction(transaction); startRelaunching(); startRelaunching(); // Note: don't need to call pauseIfSleepingLocked() here, because the caller will only // Note: don't need to call pauseIfSleepingLocked() here, because the caller will only // request resume if this activity is currently resumed, which implies we aren't // request resume if this activity is currently resumed, which implies we aren't Loading Loading @@ -10002,7 +10000,7 @@ final class ActivityRecord extends WindowToken implements WindowManagerService.A // The process will be killed until the activity reports stopped with saved state (see // The process will be killed until the activity reports stopped with saved state (see // {@link ActivityTaskManagerService.activityStopped}). // {@link ActivityTaskManagerService.activityStopped}). try { try { mAtmService.getLifecycleManager().scheduleTransaction(app.getThread(), mAtmService.getLifecycleManager().scheduleTransactionItem(app.getThread(), StopActivityItem.obtain(token, 0 /* configChanges */)); StopActivityItem.obtain(token, 0 /* configChanges */)); } catch (RemoteException e) { } catch (RemoteException e) { Slog.w(TAG, "Exception thrown during restart " + this, e); Slog.w(TAG, "Exception thrown during restart " + this, e); Loading