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

Commit 9cd20e70 authored by Felix Stern's avatar Felix Stern
Browse files

Move setImeVisibilityOnFocusedWindowClient to IMMS

Some instances (like of DefaultImeVisibilityApplier) are created inline in IMMS, and therefore not mockable.
As in some tests we want to avoid a call into userData, this CL is moving setImeVisibilityOnFocusedWindowClient
from DefaultImeVisibilityApplier to IMMS, so that we can stub it.

Test: None
Flag: android.view.inputmethod.refactor_insets_controller
Bug: 352615651
Change-Id: I8497e425b9a37c9980e85eaba743cb282fb4826e
parent 583a109a
Loading
Loading
Loading
Loading
+3 −18
Original line number Diff line number Diff line
@@ -202,7 +202,7 @@ final class DefaultImeVisibilityApplier {
                break;
            case STATE_HIDE_IME_EXPLICIT:
                if (Flags.refactorInsetsController()) {
                    setImeVisibilityOnFocusedWindowClient(false, userId, statsToken);
                    mService.setImeVisibilityOnFocusedWindowClient(false, userData, statsToken);
                } else {
                    mService.hideCurrentInputLocked(windowToken, statsToken,
                            0 /* flags */, null /* resultReceiver */, reason, userId);
@@ -210,7 +210,7 @@ final class DefaultImeVisibilityApplier {
                break;
            case STATE_HIDE_IME_NOT_ALWAYS:
                if (Flags.refactorInsetsController()) {
                    setImeVisibilityOnFocusedWindowClient(false, userId, statsToken);
                    mService.setImeVisibilityOnFocusedWindowClient(false, userData, statsToken);
                } else {
                    mService.hideCurrentInputLocked(windowToken, statsToken,
                            InputMethodManager.HIDE_NOT_ALWAYS, null /* resultReceiver */, reason,
@@ -221,7 +221,7 @@ final class DefaultImeVisibilityApplier {
                if (Flags.refactorInsetsController()) {
                    // This can be triggered by IMMS#startInputOrWindowGainedFocus. We need to
                    // set the requestedVisibleTypes in InsetsController first, before applying it.
                    setImeVisibilityOnFocusedWindowClient(true, userId, statsToken);
                    mService.setImeVisibilityOnFocusedWindowClient(true, userData, statsToken);
                } else {
                    mService.showCurrentInputLocked(windowToken, statsToken,
                            InputMethodManager.SHOW_IMPLICIT, MotionEvent.TOOL_TYPE_UNKNOWN,
@@ -276,19 +276,4 @@ final class DefaultImeVisibilityApplier {
        }
        return false;
    }

    @GuardedBy("ImfLock.class")
    private void setImeVisibilityOnFocusedWindowClient(boolean visibility, @UserIdInt int userId,
            @NonNull ImeTracker.Token statsToken) {
        final var userData = mService.getUserData(userId);
        if (userData.mImeBindingState != null
                && userData.mImeBindingState.mFocusedWindowClient != null
                && userData.mImeBindingState.mFocusedWindowClient.mClient != null) {
            userData.mImeBindingState.mFocusedWindowClient.mClient.setImeVisibility(visibility,
                    statsToken);
        } else {
            ImeTracker.forLogging().onFailed(statsToken,
                    ImeTracker.PHASE_SERVER_SET_VISIBILITY_ON_FOCUSED_WINDOW);
        }
    }
}
+28 −43
Original line number Diff line number Diff line
@@ -3147,11 +3147,7 @@ public final class InputMethodManagerService implements IInputMethodManagerImpl.
            if (Flags.refactorInsetsController()) {
                final var visibilityStateComputer = userData.mVisibilityStateComputer;
                boolean wasVisible = visibilityStateComputer.isInputShown();
                if (userData.mImeBindingState != null
                        && userData.mImeBindingState.mFocusedWindowClient != null
                        && userData.mImeBindingState.mFocusedWindowClient.mClient != null) {
                    userData.mImeBindingState.mFocusedWindowClient.mClient
                            .setImeVisibility(true, statsToken);
                if (setImeVisibilityOnFocusedWindowClient(false, userData, statsToken)) {
                    if (resultReceiver != null) {
                        resultReceiver.send(
                                wasVisible ? InputMethodManager.RESULT_UNCHANGED_SHOWN
@@ -3600,13 +3596,9 @@ public final class InputMethodManagerService implements IInputMethodManagerImpl.
            Trace.traceBegin(TRACE_TAG_WINDOW_MANAGER, "IMMS.hideSoftInput");
            if (DEBUG) Slog.v(TAG, "Client requesting input be hidden");
            if (Flags.refactorInsetsController()) {
                if (userData.mImeBindingState != null
                        && userData.mImeBindingState.mFocusedWindowClient != null
                        && userData.mImeBindingState.mFocusedWindowClient.mClient != null) {
                boolean wasVisible = visibilityStateComputer.isInputShown();
                // TODO add windowToken to interface
                    userData.mImeBindingState.mFocusedWindowClient.mClient
                            .setImeVisibility(false, statsToken);
                if (setImeVisibilityOnFocusedWindowClient(false, userData, statsToken)) {
                    if (resultReceiver != null) {
                        resultReceiver.send(wasVisible ? InputMethodManager.RESULT_HIDDEN
                                : InputMethodManager.RESULT_UNCHANGED_HIDDEN, null);
@@ -4943,12 +4935,7 @@ public final class InputMethodManagerService implements IInputMethodManagerImpl.
                    if (Flags.refactorInsetsController()) {
                        userData.mCurClient.mClient.setImeVisibility(false, statsToken);
                        // TODO we will loose the flags here
                        if (userData.mImeBindingState != null
                                && userData.mImeBindingState.mFocusedWindowClient != null
                                && userData.mImeBindingState.mFocusedWindowClient.mClient != null) {
                            userData.mImeBindingState.mFocusedWindowClient.mClient
                                    .setImeVisibility(false, statsToken);
                        }
                        setImeVisibilityOnFocusedWindowClient(false, userData, statsToken);
                    } else {
                        final var visibilityStateComputer = userData.mVisibilityStateComputer;
                        hideCurrentInputLocked(visibilityStateComputer.getLastImeTargetWindow(),
@@ -4981,14 +4968,8 @@ public final class InputMethodManagerService implements IInputMethodManagerImpl.
                final long ident = Binder.clearCallingIdentity();
                try {
                    if (Flags.refactorInsetsController()) {
                        userData.mCurClient.mClient.setImeVisibility(false, statsToken);
                        // TODO we will loose the flags here
                        if (userData.mImeBindingState != null
                                && userData.mImeBindingState.mFocusedWindowClient != null
                                && userData.mImeBindingState.mFocusedWindowClient.mClient != null) {
                            userData.mImeBindingState.mFocusedWindowClient.mClient
                                    .setImeVisibility(true, statsToken);
                        }
                        userData.mCurClient.mClient.setImeVisibility(true, statsToken);
                        setImeVisibilityOnFocusedWindowClient(true, userData, statsToken);
                    } else {
                        final var visibilityStateComputer = userData.mVisibilityStateComputer;
                        showCurrentInputLocked(visibilityStateComputer.getLastImeTargetWindow(),
@@ -5150,13 +5131,8 @@ public final class InputMethodManagerService implements IInputMethodManagerImpl.
                    final int userId = resolveImeUserIdFromDisplayIdLocked(originatingDisplayId);
                    final var userData = getUserData(userId);
                    if (Flags.refactorInsetsController()) {
                        if (userData.mImeBindingState != null
                                && userData.mImeBindingState.mFocusedWindowClient != null
                                && userData.mImeBindingState.mFocusedWindowClient.mClient != null) {
                            userData.mImeBindingState.mFocusedWindowClient.mClient
                                    .setImeVisibility(false,
                        setImeVisibilityOnFocusedWindowClient(false, userData,
                                null /* TODO(b329229469) check statsToken */);
                        }
                    } else {

                        hideCurrentInputLocked(userData.mImeBindingState.mFocusedWindow,
@@ -6825,16 +6801,8 @@ public final class InputMethodManagerService implements IInputMethodManagerImpl.
                    final InputMethodSettings settings = InputMethodSettingsRepository.get(userId);
                    final var userData = getUserData(userId);
                    if (Flags.refactorInsetsController()) {
                        if (userData.mImeBindingState != null
                                && userData.mImeBindingState.mFocusedWindowClient != null
                                && userData.mImeBindingState.mFocusedWindowClient.mClient
                                != null) {
                            userData.mImeBindingState.mFocusedWindowClient.mClient
                                    .setImeVisibility(false,
                        setImeVisibilityOnFocusedWindowClient(false, userData,
                                null /* TODO(b329229469) initialize statsToken here? */);
                        } else {
                            // TODO(b329229469): ImeTracker?
                        }
                    } else {
                        hideCurrentInputLocked(userData.mImeBindingState.mFocusedWindow,
                                0 /* flags */,
@@ -6873,6 +6841,23 @@ public final class InputMethodManagerService implements IInputMethodManagerImpl.
        return ShellCommandResult.SUCCESS;
    }

    @GuardedBy("ImfLock.class")
    boolean setImeVisibilityOnFocusedWindowClient(boolean visible, UserData userData,
            @NonNull ImeTracker.Token statsToken) {
        if (Flags.refactorInsetsController()) {
            if (userData.mImeBindingState != null
                    && userData.mImeBindingState.mFocusedWindowClient != null
                    && userData.mImeBindingState.mFocusedWindowClient.mClient != null) {
                userData.mImeBindingState.mFocusedWindowClient.mClient.setImeVisibility(visible,
                        statsToken);
                return true;
            }
            ImeTracker.forLogging().onFailed(statsToken,
                    ImeTracker.PHASE_SERVER_SET_VISIBILITY_ON_FOCUSED_WINDOW);
        }
        return false;
    }

    /**
     * Handles {@code adb shell cmd input_method tracing start/stop/save-for-bugreport}.
     *