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

Commit bddb3594 authored by Cosmin Băieș's avatar Cosmin Băieș
Browse files

Add signal for IME request tracking finishing

In [1] InputMethodStatsTest setup was modified to call
finishTrackingPendingImeVisibilityRequests with shell permission
identity, to ensure the required test permissions are available.
However, that is an async call, and if it takes too long the permission
could be cleared before the call is executed.

This adds a completion signal when calling the method, to ensure it
finishes before returning, maintaining the permission available.

  [1]: Ibfdc3ecea9d36ea429f98e89d0e2ee0d44857ca8

Test: atest InputMethodStatsTest
Bug: 346475189
Change-Id: I6a0d158a5e73c8a9cefcde8764c1ea7eca4fb4c8
parent eca8ee30
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);
        }
    }

    /**