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

Commit 716e3898 authored by Yohei Yukawa's avatar Yohei Yukawa
Browse files

Remove a redundant abstraction ImeVisibilityApplier

Perhaps the original intention was to use this interface to switch
multiple strategies, but in reality it did not happen.  People often
choose to experiment new behaviors by directly adding them to
DefaultImeVisibilityApplier (often behind the flag) rather than
creating a new implementation of ImeVisibilityApplier. Perhaps it
reminds me of PhoneWindowManager. Probably they are both too early
abstraction.

Let's remove it until we really start using it.

This is a purely mechanical refactoring CL. There must be no behavior
change.

Bug: 350101939
Test: presubmit
Test: atest DefaultImeVisibilityApplierTest
Flag: EXEMPT refactor
Change-Id: I72e54cb91fc09660e5fcd0dfcd9089c4419b62a7
parent c5002e47
Loading
Loading
Loading
Loading
+53 −13
Original line number Diff line number Diff line
@@ -53,10 +53,10 @@ import com.android.server.wm.WindowManagerInternal;
import java.util.Objects;

/**
 * The default implementation of {@link ImeVisibilityApplier} used in
 * {@link InputMethodManagerService}.
 * A stateless helper class for IME visibility operations like show/hide and update Z-ordering
 * relative to the IME targeted window.
 */
final class DefaultImeVisibilityApplier implements ImeVisibilityApplier {
final class DefaultImeVisibilityApplier {

    private static final String TAG = "DefaultImeVisibilityApplier";

@@ -75,9 +75,18 @@ final class DefaultImeVisibilityApplier implements ImeVisibilityApplier {
        mImeTargetVisibilityPolicy = LocalServices.getService(ImeTargetVisibilityPolicy.class);
    }

    /**
     * Performs showing IME on top of the given window.
     *
     * @param showInputToken a token that represents the requester to show IME
     * @param statsToken     the token tracking the current IME request
     * @param resultReceiver if non-null, this will be called back to the caller when
     *                       it has processed request to tell what it has done
     * @param reason         yhe reason for requesting to show IME
     * @param userId         the target user when performing show IME
     */
    @GuardedBy("ImfLock.class")
    @Override
    public void performShowIme(IBinder showInputToken, @NonNull ImeTracker.Token statsToken,
    void performShowIme(IBinder showInputToken, @NonNull ImeTracker.Token statsToken,
            @InputMethod.ShowFlags int showFlags, ResultReceiver resultReceiver,
            @SoftInputShowHideReason int reason, @UserIdInt int userId) {
        final var bindingController = mService.getInputMethodBindingController(userId);
@@ -105,9 +114,18 @@ final class DefaultImeVisibilityApplier implements ImeVisibilityApplier {
        }
    }

    /**
     * Performs hiding IME to the given window
     *
     * @param hideInputToken a token that represents the requester to hide IME
     * @param statsToken     the token tracking the current IME request
     * @param resultReceiver if non-null, this will be called back to the caller when
     *                       it has processed request to tell what it has done
     * @param reason         the reason for requesting to hide IME
     * @param userId         the target user when performing hide IME
     */
    @GuardedBy("ImfLock.class")
    @Override
    public void performHideIme(IBinder hideInputToken, @NonNull ImeTracker.Token statsToken,
    void performHideIme(IBinder hideInputToken, @NonNull ImeTracker.Token statsToken,
            ResultReceiver resultReceiver, @SoftInputShowHideReason int reason,
            @UserIdInt int userId) {
        final var bindingController = mService.getInputMethodBindingController(userId);
@@ -139,9 +157,18 @@ final class DefaultImeVisibilityApplier implements ImeVisibilityApplier {
        }
    }

    /**
     * Applies the IME visibility from {@link android.inputmethodservice.InputMethodService} with
     * according to the given visibility state.
     *
     * @param windowToken the token of a window for applying the IME visibility
     * @param statsToken  the token tracking the current IME request
     * @param state       the new IME visibility state for the applier to handle
     * @param reason      one of {@link SoftInputShowHideReason}
     * @param userId      the target user when applying the IME visibility state
     */
    @GuardedBy("ImfLock.class")
    @Override
    public void applyImeVisibility(IBinder windowToken, @Nullable ImeTracker.Token statsToken,
    void applyImeVisibility(IBinder windowToken, @Nullable ImeTracker.Token statsToken,
            @ImeVisibilityStateComputer.VisibilityState int state,
            @SoftInputShowHideReason int reason, @UserIdInt int userId) {
        final var bindingController = mService.getInputMethodBindingController(userId);
@@ -211,9 +238,16 @@ final class DefaultImeVisibilityApplier implements ImeVisibilityApplier {
        }
    }

    /**
     * Shows the IME screenshot and attach it to the given IME target window.
     *
     * @param imeTarget   the token of a window to show the IME screenshot
     * @param displayId   the unique id to identify the display
     * @param userId      the target user when when showing the IME screenshot
     * @return {@code true} if success, {@code false} otherwise
     */
    @GuardedBy("ImfLock.class")
    @Override
    public boolean showImeScreenshot(@NonNull IBinder imeTarget, int displayId,
    boolean showImeScreenshot(@NonNull IBinder imeTarget, int displayId,
            @UserIdInt int userId) {
        if (mImeTargetVisibilityPolicy.showImeScreenshot(imeTarget, displayId)) {
            mService.onShowHideSoftInputRequested(false /* show */, imeTarget,
@@ -223,9 +257,15 @@ final class DefaultImeVisibilityApplier implements ImeVisibilityApplier {
        return false;
    }

    /**
     * Removes the IME screenshot on the given display.
     *
     * @param displayId the target display of showing IME screenshot
     * @param userId    the target user of showing IME screenshot
     * @return {@code true} if success, {@code false} otherwise
     */
    @GuardedBy("ImfLock.class")
    @Override
    public boolean removeImeScreenshot(int displayId, @UserIdInt int userId) {
    boolean removeImeScreenshot(int displayId, @UserIdInt int userId) {
        final var userData = mService.getUserData(userId);
        if (mImeTargetVisibilityPolicy.removeImeScreenshot(displayId)) {
            mService.onShowHideSoftInputRequested(false /* show */,
+0 −114
Original line number Diff line number Diff line
/*
 * Copyright (C) 2022 The Android Open Source Project
 *
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 *      http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */

package com.android.server.inputmethod;

import android.annotation.NonNull;
import android.annotation.UserIdInt;
import android.os.IBinder;
import android.os.ResultReceiver;
import android.view.inputmethod.ImeTracker;
import android.view.inputmethod.InputMethod;

import com.android.internal.inputmethod.SoftInputShowHideReason;

/**
 * Interface for IME visibility operations like show/hide and update Z-ordering relative to the IME
 * targeted window.
 */
interface ImeVisibilityApplier {
    /**
     * Performs showing IME on top of the given window.
     *
     * @param showInputToken a token that represents the requester to show IME
     * @param statsToken     the token tracking the current IME request
     * @param resultReceiver if non-null, this will be called back to the caller when
     *                       it has processed request to tell what it has done
     * @param reason         yhe reason for requesting to show IME
     * @param userId         the target user when performing show IME
     */
    default void performShowIme(IBinder showInputToken, @NonNull ImeTracker.Token statsToken,
            @InputMethod.ShowFlags int showFlags, ResultReceiver resultReceiver,
            @SoftInputShowHideReason int reason, @UserIdInt int userId) {
    }

    /**
     * Performs hiding IME to the given window
     *
     * @param hideInputToken a token that represents the requester to hide IME
     * @param statsToken     the token tracking the current IME request
     * @param resultReceiver if non-null, this will be called back to the caller when
     *                       it has processed request to tell what it has done
     * @param reason         the reason for requesting to hide IME
     * @param userId         the target user when performing hide IME
     */
    default void performHideIme(IBinder hideInputToken, @NonNull ImeTracker.Token statsToken,
            ResultReceiver resultReceiver, @SoftInputShowHideReason int reason,
            @UserIdInt int userId) {
    }

    /**
     * Applies the IME visibility from {@link android.inputmethodservice.InputMethodService} with
     * according to the given visibility state.
     *
     * @param windowToken the token of a window for applying the IME visibility
     * @param statsToken  the token tracking the current IME request
     * @param state       the new IME visibility state for the applier to handle
     * @param reason      the reason why the input window is visible or hidden
     * @param userId      the target user when applying the IME visibility state
     */
    default void applyImeVisibility(IBinder windowToken, @NonNull ImeTracker.Token statsToken,
            @ImeVisibilityStateComputer.VisibilityState int state,
            @SoftInputShowHideReason int reason, @UserIdInt int userId) {
    }

    /**
     * Updates the IME Z-ordering relative to the given window.
     *
     * This used to adjust the IME relative layer of the window during
     * {@link InputMethodManagerService} is in switching IME clients.
     *
     * @param windowToken the token of a window to update the Z-ordering relative to the IME
     */
    default void updateImeLayeringByTarget(IBinder windowToken) {
        // TODO: add a method in WindowManagerInternal to call DC#updateImeInputAndControlTarget
        //  here to end up updating IME layering after IMMS#attachNewInputLocked called.
    }

    /**
     * Shows the IME screenshot and attach it to the given IME target window.
     *
     * @param windowToken the token of a window to show the IME screenshot
     * @param displayId   the unique id to identify the display
     * @param userId      the target user when when showing the IME screenshot
     * @return {@code true} if success, {@code false} otherwise
     */
    default boolean showImeScreenshot(@NonNull IBinder windowToken, int displayId,
            @UserIdInt int userId) {
        return false;
    }

    /**
     * Removes the IME screenshot on the given display.
     *
     * @param displayId the target display of showing IME screenshot
     * @param userId    the target user of showing IME screenshot
     * @return {@code true} if success, {@code false} otherwise
     */
    default boolean removeImeScreenshot(int displayId, @UserIdInt int userId) {
        return false;
    }
}
+3 −4
Original line number Diff line number Diff line
@@ -4824,12 +4824,11 @@ public final class InputMethodManagerService implements IInputMethodManagerImpl.
        }
    }

    @GuardedBy("ImfLock.class")
    @VisibleForTesting
    ImeVisibilityApplier getVisibilityApplier() {
        synchronized (ImfLock.class) {
    DefaultImeVisibilityApplier getVisibilityApplierLocked() {
        return mVisibilityApplier;
    }
    }

    void onApplyImeVisibilityFromComputer(IBinder windowToken, @NonNull ImeTracker.Token statsToken,
            @NonNull ImeVisibilityResult result) {
+1 −2
Original line number Diff line number Diff line
@@ -74,9 +74,8 @@ public class DefaultImeVisibilityApplierTest extends InputMethodManagerServiceTe
    @Before
    public void setUp() throws RemoteException {
        super.setUp();
        mVisibilityApplier =
                (DefaultImeVisibilityApplier) mInputMethodManagerService.getVisibilityApplier();
        synchronized (ImfLock.class) {
            mVisibilityApplier = mInputMethodManagerService.getVisibilityApplierLocked();
            mUserId = mInputMethodManagerService.getCurrentImeUserIdLocked();
            mInputMethodManagerService.setAttachedClientForTesting(requireNonNull(
                    mInputMethodManagerService.getClientStateLocked(mMockInputMethodClient)));
+2 −2
Original line number Diff line number Diff line
@@ -58,8 +58,8 @@ import org.junit.runner.RunWith;
import org.mockito.ArgumentCaptor;

/**
 * Test the behavior of {@link ImeVisibilityStateComputer} and {@link ImeVisibilityApplier} when
 * requesting the IME visibility.
 * Test the behavior of {@link ImeVisibilityStateComputer} and {@link DefaultImeVisibilityApplier}
 * when requesting the IME visibility.
 *
 * <p> Build/Install/Run:
 * atest FrameworksInputMethodSystemServerTests:ImeVisibilityStateComputerTest