Loading services/core/java/com/android/server/AnimationThread.java +1 −1 Original line number Diff line number Diff line Loading @@ -64,7 +64,7 @@ public final class AnimationThread extends ServiceThread { */ @VisibleForTesting public static void dispose() { synchronized (DisplayThread.class) { synchronized (AnimationThread.class) { if (sInstance == null) { return; } Loading services/core/java/com/android/server/UiThread.java +18 −0 Original line number Diff line number Diff line Loading @@ -21,6 +21,8 @@ import android.os.Looper; import android.os.Process; import android.os.Trace; import com.android.internal.annotations.VisibleForTesting; /** * Shared singleton thread for showing UI. This is a foreground thread, and in * additional should not have operations that can take more than a few ms scheduled Loading Loading @@ -68,4 +70,20 @@ public final class UiThread extends ServiceThread { return sHandler; } } /** * Disposes current ui thread if it's initialized. Should only be used in tests to set up a * new environment. */ @VisibleForTesting public static void dispose() { synchronized (UiThread.class) { if (sInstance == null) { return; } getHandler().runWithScissors(sInstance::quit, 0 /* timeout */); sInstance = null; } } } services/core/java/com/android/server/am/ActivityManagerService.java +2 −1 Original line number Diff line number Diff line Loading @@ -2405,7 +2405,8 @@ public class ActivityManagerService extends IActivityManager.Stub final ActiveUids activeUids = new ActiveUids(this, false /* postChangesToAtm */); mProcessList.init(this, activeUids); mLowMemDetector = null; mOomAdjuster = new OomAdjuster(this, mProcessList, activeUids, handlerThread); mOomAdjuster = hasHandlerThread ? new OomAdjuster(this, mProcessList, activeUids, handlerThread) : null; mIntentFirewall = hasHandlerThread ? new IntentFirewall(new IntentFirewallInterface(), mHandler) : null; Loading services/tests/wmtests/src/com/android/server/wm/ActivityDisplayTests.java +7 −13 Original line number Diff line number Diff line Loading @@ -24,11 +24,9 @@ import static android.app.WindowConfiguration.WINDOWING_MODE_PINNED; import static android.content.pm.ActivityInfo.FLAG_ALWAYS_FOCUSABLE; import static android.content.pm.ActivityInfo.FLAG_SHOW_WHEN_LOCKED; import static com.android.dx.mockito.inline.extended.ExtendedMockito.clearInvocations; import static com.android.dx.mockito.inline.extended.ExtendedMockito.doReturn; import static com.android.dx.mockito.inline.extended.ExtendedMockito.never; import static com.android.dx.mockito.inline.extended.ExtendedMockito.reset; import static com.android.dx.mockito.inline.extended.ExtendedMockito.spy; import static com.android.dx.mockito.inline.extended.ExtendedMockito.spyOn; import static com.android.dx.mockito.inline.extended.ExtendedMockito.verify; import static com.android.server.wm.ActivityStackSupervisor.ON_TOP; Loading @@ -49,6 +47,7 @@ import android.platform.test.annotations.Presubmit; import androidx.test.filters.SmallTest; import org.junit.Test; import org.junit.runner.RunWith; import java.util.ArrayList; import java.util.concurrent.CompletableFuture; Loading @@ -62,6 +61,7 @@ import java.util.concurrent.TimeUnit; */ @SmallTest @Presubmit @RunWith(WindowTestRunner.class) public class ActivityDisplayTests extends ActivityTestsBase { @Test Loading Loading @@ -142,30 +142,24 @@ public class ActivityDisplayTests extends ActivityTestsBase { // Create a display which supports system decoration and allows reparenting stacks to // another display when the display is removed. final ActivityDisplay display = createNewActivityDisplay(); spyOn(display); doReturn(false).when(display).shouldDestroyContentOnRemove(); doReturn(true).when(display).supportsSystemDecorations(); mRootActivityContainer.addChild(display, ActivityDisplay.POSITION_TOP); // Put home stack on the display. final ActivityStack homeStack = display.createStack( WINDOWING_MODE_FULLSCREEN, ACTIVITY_TYPE_HOME, ON_TOP); final TaskRecord task = new TaskBuilder(mSupervisor).setStack(homeStack).build(); new ActivityBuilder(mService).setTask(task).build(); display.removeChild(homeStack); final ActivityStack spiedHomeStack = spy(homeStack); display.addChild(spiedHomeStack, ActivityDisplay.POSITION_TOP); reset(spiedHomeStack); final ActivityStack homeStack = new StackBuilder(mRootActivityContainer) .setDisplay(display).setActivityType(ACTIVITY_TYPE_HOME).build(); // Put a finishing standard activity which will be reparented. final ActivityStack stack = createFullscreenStackWithSimpleActivityAt(display); stack.topRunningActivityLocked().makeFinishingLocked(); clearInvocations(homeStack); display.remove(); // The removed display should have no focused stack and its home stack should never resume. assertNull(display.getFocusedStack()); verify(spiedHomeStack, never()).resumeTopActivityUncheckedLocked(any(), any()); verify(homeStack, never()).resumeTopActivityUncheckedLocked(any(), any()); } private ActivityStack createFullscreenStackWithSimpleActivityAt(ActivityDisplay display) { Loading services/tests/wmtests/src/com/android/server/wm/ActivityRecordTests.java +1 −3 Original line number Diff line number Diff line Loading @@ -103,8 +103,6 @@ import org.junit.Test; import org.junit.runner.RunWith; import org.mockito.invocation.InvocationOnMock; import java.util.concurrent.TimeUnit; /** * Tests for the {@link ActivityRecord} class. * Loading Loading @@ -646,7 +644,7 @@ public class ActivityRecordTests extends ActivityTestsBase { // The override configuration should be reset and the activity's process will be killed. assertFalse(mActivity.inSizeCompatMode()); verify(mActivity).restartProcessIfVisible(); mLockRule.runWithScissors(mService.mH, () -> { }, TimeUnit.SECONDS.toMillis(3)); waitHandlerIdle(mService.mH); verify(mService.mAmInternal).killProcess( eq(mActivity.app.mName), eq(mActivity.app.mUid), anyString()); } Loading Loading
services/core/java/com/android/server/AnimationThread.java +1 −1 Original line number Diff line number Diff line Loading @@ -64,7 +64,7 @@ public final class AnimationThread extends ServiceThread { */ @VisibleForTesting public static void dispose() { synchronized (DisplayThread.class) { synchronized (AnimationThread.class) { if (sInstance == null) { return; } Loading
services/core/java/com/android/server/UiThread.java +18 −0 Original line number Diff line number Diff line Loading @@ -21,6 +21,8 @@ import android.os.Looper; import android.os.Process; import android.os.Trace; import com.android.internal.annotations.VisibleForTesting; /** * Shared singleton thread for showing UI. This is a foreground thread, and in * additional should not have operations that can take more than a few ms scheduled Loading Loading @@ -68,4 +70,20 @@ public final class UiThread extends ServiceThread { return sHandler; } } /** * Disposes current ui thread if it's initialized. Should only be used in tests to set up a * new environment. */ @VisibleForTesting public static void dispose() { synchronized (UiThread.class) { if (sInstance == null) { return; } getHandler().runWithScissors(sInstance::quit, 0 /* timeout */); sInstance = null; } } }
services/core/java/com/android/server/am/ActivityManagerService.java +2 −1 Original line number Diff line number Diff line Loading @@ -2405,7 +2405,8 @@ public class ActivityManagerService extends IActivityManager.Stub final ActiveUids activeUids = new ActiveUids(this, false /* postChangesToAtm */); mProcessList.init(this, activeUids); mLowMemDetector = null; mOomAdjuster = new OomAdjuster(this, mProcessList, activeUids, handlerThread); mOomAdjuster = hasHandlerThread ? new OomAdjuster(this, mProcessList, activeUids, handlerThread) : null; mIntentFirewall = hasHandlerThread ? new IntentFirewall(new IntentFirewallInterface(), mHandler) : null; Loading
services/tests/wmtests/src/com/android/server/wm/ActivityDisplayTests.java +7 −13 Original line number Diff line number Diff line Loading @@ -24,11 +24,9 @@ import static android.app.WindowConfiguration.WINDOWING_MODE_PINNED; import static android.content.pm.ActivityInfo.FLAG_ALWAYS_FOCUSABLE; import static android.content.pm.ActivityInfo.FLAG_SHOW_WHEN_LOCKED; import static com.android.dx.mockito.inline.extended.ExtendedMockito.clearInvocations; import static com.android.dx.mockito.inline.extended.ExtendedMockito.doReturn; import static com.android.dx.mockito.inline.extended.ExtendedMockito.never; import static com.android.dx.mockito.inline.extended.ExtendedMockito.reset; import static com.android.dx.mockito.inline.extended.ExtendedMockito.spy; import static com.android.dx.mockito.inline.extended.ExtendedMockito.spyOn; import static com.android.dx.mockito.inline.extended.ExtendedMockito.verify; import static com.android.server.wm.ActivityStackSupervisor.ON_TOP; Loading @@ -49,6 +47,7 @@ import android.platform.test.annotations.Presubmit; import androidx.test.filters.SmallTest; import org.junit.Test; import org.junit.runner.RunWith; import java.util.ArrayList; import java.util.concurrent.CompletableFuture; Loading @@ -62,6 +61,7 @@ import java.util.concurrent.TimeUnit; */ @SmallTest @Presubmit @RunWith(WindowTestRunner.class) public class ActivityDisplayTests extends ActivityTestsBase { @Test Loading Loading @@ -142,30 +142,24 @@ public class ActivityDisplayTests extends ActivityTestsBase { // Create a display which supports system decoration and allows reparenting stacks to // another display when the display is removed. final ActivityDisplay display = createNewActivityDisplay(); spyOn(display); doReturn(false).when(display).shouldDestroyContentOnRemove(); doReturn(true).when(display).supportsSystemDecorations(); mRootActivityContainer.addChild(display, ActivityDisplay.POSITION_TOP); // Put home stack on the display. final ActivityStack homeStack = display.createStack( WINDOWING_MODE_FULLSCREEN, ACTIVITY_TYPE_HOME, ON_TOP); final TaskRecord task = new TaskBuilder(mSupervisor).setStack(homeStack).build(); new ActivityBuilder(mService).setTask(task).build(); display.removeChild(homeStack); final ActivityStack spiedHomeStack = spy(homeStack); display.addChild(spiedHomeStack, ActivityDisplay.POSITION_TOP); reset(spiedHomeStack); final ActivityStack homeStack = new StackBuilder(mRootActivityContainer) .setDisplay(display).setActivityType(ACTIVITY_TYPE_HOME).build(); // Put a finishing standard activity which will be reparented. final ActivityStack stack = createFullscreenStackWithSimpleActivityAt(display); stack.topRunningActivityLocked().makeFinishingLocked(); clearInvocations(homeStack); display.remove(); // The removed display should have no focused stack and its home stack should never resume. assertNull(display.getFocusedStack()); verify(spiedHomeStack, never()).resumeTopActivityUncheckedLocked(any(), any()); verify(homeStack, never()).resumeTopActivityUncheckedLocked(any(), any()); } private ActivityStack createFullscreenStackWithSimpleActivityAt(ActivityDisplay display) { Loading
services/tests/wmtests/src/com/android/server/wm/ActivityRecordTests.java +1 −3 Original line number Diff line number Diff line Loading @@ -103,8 +103,6 @@ import org.junit.Test; import org.junit.runner.RunWith; import org.mockito.invocation.InvocationOnMock; import java.util.concurrent.TimeUnit; /** * Tests for the {@link ActivityRecord} class. * Loading Loading @@ -646,7 +644,7 @@ public class ActivityRecordTests extends ActivityTestsBase { // The override configuration should be reset and the activity's process will be killed. assertFalse(mActivity.inSizeCompatMode()); verify(mActivity).restartProcessIfVisible(); mLockRule.runWithScissors(mService.mH, () -> { }, TimeUnit.SECONDS.toMillis(3)); waitHandlerIdle(mService.mH); verify(mService.mAmInternal).killProcess( eq(mActivity.app.mName), eq(mActivity.app.mUid), anyString()); } Loading