Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 31ee54a0 authored by Android Build Coastguard Worker's avatar Android Build Coastguard Worker
Browse files

Merge cherrypicks of ['googleplex-android-review.googlesource.com/32575879',...

Merge cherrypicks of ['googleplex-android-review.googlesource.com/32575879', 'googleplex-android-review.googlesource.com/32891320'] into 25Q2-release.

Change-Id: I8c4eb3f4cf17d381995f44ca0e8ddac9394ddb59
parents 4341e620 d26880d9
Loading
Loading
Loading
Loading
+13 −11
Original line number Diff line number Diff line
@@ -341,7 +341,7 @@ public class DreamService extends Service implements Window.Callback {
     */
    public interface WakefulHandler {
        /** Posts a {@link Runnable} to be ran on the underlying {@link Handler}. */
        void post(Runnable r);
        void postIfNeeded(Runnable r);

        /**
         * Returns the underlying {@link Handler}. Should only be used for passing the handler into
@@ -386,8 +386,10 @@ public class DreamService extends Service implements Window.Callback {
        }

        @Override
        public void post(Runnable r) {
            if (mWakeLock != null) {
        public void postIfNeeded(Runnable r) {
            if (mHandler.getLooper().isCurrentThread()) {
                r.run();
            } else if (mWakeLock != null) {
                mHandler.post(mWakeLock.wrap(r));
            } else {
                mHandler.post(r);
@@ -995,17 +997,17 @@ public class DreamService extends Service implements Window.Callback {
        }
    }

    private void post(Runnable runnable) {
    private void postIfNeeded(Runnable runnable) {
        // The handler is based on the populated context is not ready at construction time.
        // therefore we fetch on demand.
        mInjector.getWakefulHandler().post(runnable);
        mInjector.getWakefulHandler().postIfNeeded(runnable);
    }

    /**
     * Updates doze state. Note that this must be called on the mHandler.
     */
    private void updateDoze() {
        post(() -> {
        postIfNeeded(() -> {
            if (mDreamToken == null) {
                Slog.w(mTag, "Updating doze without a dream token.");
                return;
@@ -1047,7 +1049,7 @@ public class DreamService extends Service implements Window.Callback {
     */
    @UnsupportedAppUsage(maxTargetSdk = Build.VERSION_CODES.P, trackingBug = 115609023)
    public void stopDozing() {
        post(() -> {
        postIfNeeded(() -> {
            if (mDreamToken == null) {
                return;
            }
@@ -1290,7 +1292,7 @@ public class DreamService extends Service implements Window.Callback {
                final long token = Binder.clearCallingIdentity();
                try {
                    // Simply finish dream when exit is requested.
                    post(() -> finishInternal());
                    postIfNeeded(() -> finishInternal());
                } finally {
                    Binder.restoreCallingIdentity(token);
                }
@@ -1396,7 +1398,7 @@ public class DreamService extends Service implements Window.Callback {
     * </p>
     */
    public final void finish() {
        post(this::finishInternal);
        postIfNeeded(this::finishInternal);
    }

    private void finishInternal() {
@@ -1458,7 +1460,7 @@ public class DreamService extends Service implements Window.Callback {
     * </p>
     */
    public final void wakeUp() {
        post(()-> wakeUp(false));
        postIfNeeded(()-> wakeUp(false));
    }

    /**
@@ -1964,7 +1966,7 @@ public class DreamService extends Service implements Window.Callback {
                return;
            }

            service.post(() -> consumer.accept(service));
            service.postIfNeeded(() -> consumer.accept(service));
        }

        @Override
+6 −3
Original line number Diff line number Diff line
@@ -326,9 +326,12 @@ final class ImeInsetsSourceProvider extends InsetsSourceProvider {
                // IME input target to update IME request state. For example, switch from a task
                // with showing IME to a split-screen task without showing IME.
                InputTarget imeInputTarget = mDisplayContent.getImeInputTarget();
                if (imeInputTarget != target && imeInputTarget != null) {
                    // The controlTarget should be updated with the visibility of the
                    // current IME input target.
                if (imeInputTarget != target && imeInputTarget != null
                        && imeInputTarget.isRequestedVisible(WindowInsets.Type.ime())
                        != target.isRequestedVisible(WindowInsets.Type.ime())) {
                    // Only update the controlTarget, if it has a different requested visibility
                    // than the imeInputTarget. Otherwise, updateClientVisibility won't invoke
                    // the listener, as nothing changed.
                    reportImeInputTargetStateToControlTarget(imeInputTarget, target,
                            statsToken);
                } else {
+1 −1
Original line number Diff line number Diff line
@@ -201,7 +201,7 @@ public class TestDreamEnvironment {
            doAnswer(invocation -> {
                ((Runnable) invocation.getArgument(0)).run();
                return null;
            }).when(mWakefulHandler).post(any());
            }).when(mWakefulHandler).postIfNeeded(any());
        }
        @Override
        public void init(Context context) {
+39 −1
Original line number Diff line number Diff line
@@ -25,6 +25,7 @@ import static com.android.server.wm.WindowStateAnimator.NO_SURFACE;
import static org.junit.Assert.assertFalse;
import static org.junit.Assert.assertTrue;
import static org.mockito.ArgumentMatchers.any;
import static org.mockito.ArgumentMatchers.anyBoolean;
import static org.mockito.ArgumentMatchers.eq;
import static org.mockito.Mockito.clearInvocations;
import static org.mockito.Mockito.never;
@@ -245,11 +246,48 @@ public class ImeInsetsSourceProviderTest extends WindowTestsBase {

        assertTrue(inputTarget.isRequestedVisible(WindowInsets.Type.ime()));
        assertFalse(controlTarget.isRequestedVisible(WindowInsets.Type.ime()));
        mImeProvider.updateControlForTarget(controlTarget, true /* force */, null /* statsToken */);
        mImeProvider.updateControlForTarget(controlTarget, true /* force */,
                ImeTracker.Token.empty());
        verify(displayWindowInsetsController, times(1)).setImeInputTargetRequestedVisibility(
                eq(true), any());
    }

    @Test
    @RequiresFlagsEnabled(Flags.FLAG_REFACTOR_INSETS_CONTROLLER)
    public void testUpdateControlForTarget_remoteInsetsControlTargetUnchanged()
            throws RemoteException {
        final WindowState ime = newWindowBuilder("ime", TYPE_INPUT_METHOD).build();
        mImeProvider.setWindowContainer(ime, null, null);
        final WindowState inputTarget = newWindowBuilder("app", TYPE_APPLICATION).build();
        final var displayWindowInsetsController = spy(createDisplayWindowInsetsController());
        mDisplayContent.setRemoteInsetsController(displayWindowInsetsController);
        final var controlTarget = mDisplayContent.mRemoteInsetsControlTarget;
        mDisplayContent.setImeInputTarget(inputTarget);
        mDisplayContent.setImeControlTarget(controlTarget);

        // Test for visible
        inputTarget.setRequestedVisibleTypes(WindowInsets.Type.ime());
        controlTarget.updateRequestedVisibleTypes(WindowInsets.Type.ime(), WindowInsets.Type.ime());
        clearInvocations(mDisplayContent);
        assertTrue(inputTarget.isRequestedVisible(WindowInsets.Type.ime()));
        assertTrue((controlTarget.isRequestedVisible(WindowInsets.Type.ime())));
        mImeProvider.updateControlForTarget(controlTarget, true /* force */,
                ImeTracker.Token.empty());
        verify(displayWindowInsetsController, never()).setImeInputTargetRequestedVisibility(
                anyBoolean(), any());

        // Test for not visible
        inputTarget.setRequestedVisibleTypes(0);
        controlTarget.updateRequestedVisibleTypes(0 /* visibleTypes */, WindowInsets.Type.ime());
        clearInvocations(mDisplayContent);
        assertFalse(inputTarget.isRequestedVisible(WindowInsets.Type.ime()));
        assertFalse((controlTarget.isRequestedVisible(WindowInsets.Type.ime())));
        mImeProvider.updateControlForTarget(controlTarget, true /* force */,
                ImeTracker.Token.empty());
        verify(displayWindowInsetsController, never()).setImeInputTargetRequestedVisibility(
                anyBoolean(), any());
    }

    @Test
    @RequiresFlagsEnabled(Flags.FLAG_REFACTOR_INSETS_CONTROLLER)
    public void testOnPostLayout_resetServerVisibilityWhenImeIsNotDrawn() {