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

Commit 19009bd6 authored by Cosmin Băieș's avatar Cosmin Băieș Committed by Android (Google) Code Review
Browse files

Merge "Add signal for IME request tracking finishing" into main

parents 646ad8b6 bddb3594
Loading
Loading
Loading
Loading
+12 −1
Original line number Diff line number Diff line
@@ -29,9 +29,11 @@ import android.os.IBinder;
import android.os.RemoteException;
import android.os.ResultReceiver;
import android.os.ServiceManager;
import android.util.ExceptionUtils;
import android.view.WindowManager;
import android.window.ImeOnBackInvokedDispatcher;

import com.android.internal.infra.AndroidFuture;
import com.android.internal.inputmethod.DirectBootAwareness;
import com.android.internal.inputmethod.IBooleanListener;
import com.android.internal.inputmethod.IConnectionlessHandwritingCallback;
@@ -48,6 +50,7 @@ import com.android.internal.view.IInputMethodManager;

import java.util.ArrayList;
import java.util.List;
import java.util.concurrent.TimeUnit;
import java.util.function.Consumer;

/**
@@ -62,6 +65,10 @@ import java.util.function.Consumer;
 * a wrapper method in {@link InputMethodManagerGlobal} instead of making this class public.</p>
 */
final class IInputMethodManagerGlobalInvoker {

    /** The threshold in milliseconds for an {@link AndroidFuture} completion signal. */
    private static final long TIMEOUT_MS = 10_000;

    @Nullable
    private static volatile IInputMethodManager sServiceCache = null;

@@ -801,9 +808,13 @@ final class IInputMethodManagerGlobalInvoker {
            return;
        }
        try {
            service.finishTrackingPendingImeVisibilityRequests();
            final var completionSignal = new AndroidFuture<Void>();
            service.finishTrackingPendingImeVisibilityRequests(completionSignal);
            completionSignal.get(TIMEOUT_MS, TimeUnit.MILLISECONDS);
        } catch (RemoteException e) {
            throw e.rethrowFromSystemServer();
        } catch (Exception e) {
            throw ExceptionUtils.propagate(e);
        }
    }

+6 −1
Original line number Diff line number Diff line
@@ -18,6 +18,8 @@ package com.android.internal.inputmethod;

import android.view.inputmethod.ImeTracker;

import com.android.internal.infra.AndroidFuture;

/**
 * Interface to the global IME tracker service, used by all client applications.
 * {@hide}
@@ -98,9 +100,12 @@ interface IImeTracker {
    /**
     * Finishes the tracking of any pending IME visibility requests. This won't stop the actual
     * requests, but allows resetting the state when starting up test runs.
     *
     * @param completionSignal used to signal when the tracking has been finished.
     */
    @EnforcePermission("TEST_INPUT_METHOD")
    @JavaPassthrough(annotation="@android.annotation.RequiresPermission(value = "
            + "android.Manifest.permission.TEST_INPUT_METHOD)")
    oneway void finishTrackingPendingImeVisibilityRequests();
    oneway void finishTrackingPendingImeVisibilityRequests(
        in AndroidFuture completionSignal /* T=Void */);
}
+12 −3
Original line number Diff line number Diff line
@@ -28,6 +28,7 @@ import android.util.Log;
import android.view.inputmethod.ImeTracker;

import com.android.internal.annotations.GuardedBy;
import com.android.internal.infra.AndroidFuture;
import com.android.internal.inputmethod.IImeTracker;
import com.android.internal.inputmethod.InputMethodDebug;
import com.android.internal.inputmethod.SoftInputShowHideReason;
@@ -174,11 +175,19 @@ public final class ImeTrackerService extends IImeTracker.Stub {

    @EnforcePermission(Manifest.permission.TEST_INPUT_METHOD)
    @Override
    public void finishTrackingPendingImeVisibilityRequests() {
    public void finishTrackingPendingImeVisibilityRequests(
            @NonNull AndroidFuture completionSignal /* T=Void */) {
        super.finishTrackingPendingImeVisibilityRequests_enforcePermission();
        @SuppressWarnings("unchecked")
        final AndroidFuture<Void> typedCompletionSignal = completionSignal;
        try {
            synchronized (mLock) {
                mHistory.mLiveEntries.clear();
            }
            typedCompletionSignal.complete(null);
        } catch (Throwable e) {
            typedCompletionSignal.completeExceptionally(e);
        }
    }

    /**