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

Commit f5c472fe authored by Cosmin Băieș's avatar Cosmin Băieș Committed by Automerger Merge Worker
Browse files

Merge changes I59db19c5,I49ceeefd,I3e3bc097 into udc-dev am: 8c1b5e57

parents d26e0bc5 8c1b5e57
Loading
Loading
Loading
Loading
+28 −17
Original line number Diff line number Diff line
@@ -25,6 +25,7 @@ import android.annotation.RequiresNoPermission;
import android.annotation.RequiresPermission;
import android.annotation.UserIdInt;
import android.content.Context;
import android.os.Binder;
import android.os.IBinder;
import android.os.RemoteException;
import android.os.ResultReceiver;
@@ -33,6 +34,7 @@ import android.view.WindowManager;
import android.window.ImeOnBackInvokedDispatcher;

import com.android.internal.inputmethod.DirectBootAwareness;
import com.android.internal.inputmethod.IImeTracker;
import com.android.internal.inputmethod.IInputMethodClient;
import com.android.internal.inputmethod.IRemoteAccessibilityInputConnection;
import com.android.internal.inputmethod.IRemoteInputConnection;
@@ -40,7 +42,6 @@ import com.android.internal.inputmethod.InputBindResult;
import com.android.internal.inputmethod.SoftInputShowHideReason;
import com.android.internal.inputmethod.StartInputFlags;
import com.android.internal.inputmethod.StartInputReason;
import com.android.internal.view.IImeTracker;
import com.android.internal.view.IInputMethodManager;

import java.util.ArrayList;
@@ -581,51 +582,57 @@ final class IInputMethodManagerGlobalInvoker {
        }
    }

    /** @see com.android.server.inputmethod.ImeTrackerService#onRequestShow */
    @AnyThread
    @Nullable
    static IBinder onRequestShow(int uid, @ImeTracker.Origin int origin,
            @SoftInputShowHideReason int reason) {
    @NonNull
    static ImeTracker.Token onRequestShow(@NonNull String tag, int uid,
            @ImeTracker.Origin int origin, @SoftInputShowHideReason int reason) {
        final IImeTracker service = getImeTrackerService();
        if (service == null) {
            return null;
            // Create token with "fake" binder if the service was not found.
            return new ImeTracker.Token(new Binder(), tag);
        }
        try {
            return service.onRequestShow(uid, origin, reason);
            return service.onRequestShow(tag, uid, origin, reason);
        } catch (RemoteException e) {
            throw e.rethrowFromSystemServer();
        }
    }

    /** @see com.android.server.inputmethod.ImeTrackerService#onRequestHide */
    @AnyThread
    @Nullable
    static IBinder onRequestHide(int uid, @ImeTracker.Origin int origin,
            @SoftInputShowHideReason int reason) {
    @NonNull
    static ImeTracker.Token onRequestHide(@NonNull String tag, int uid,
            @ImeTracker.Origin int origin, @SoftInputShowHideReason int reason) {
        final IImeTracker service = getImeTrackerService();
        if (service == null) {
            return null;
            // Create token with "fake" binder if the service was not found.
            return new ImeTracker.Token(new Binder(), tag);
        }
        try {
            return service.onRequestHide(uid, origin, reason);
            return service.onRequestHide(tag, uid, origin, reason);
        } catch (RemoteException e) {
            throw e.rethrowFromSystemServer();
        }
    }

    /** @see com.android.server.inputmethod.ImeTrackerService#onProgress */
    @AnyThread
    static void onProgress(@NonNull IBinder statsToken, @ImeTracker.Phase int phase) {
    static void onProgress(@NonNull IBinder binder, @ImeTracker.Phase int phase) {
        final IImeTracker service = getImeTrackerService();
        if (service == null) {
            return;
        }
        try {
            service.onProgress(statsToken, phase);
            service.onProgress(binder, phase);
        } catch (RemoteException e) {
            throw e.rethrowFromSystemServer();
        }
    }

    /** @see com.android.server.inputmethod.ImeTrackerService#onFailed */
    @AnyThread
    static void onFailed(@NonNull IBinder statsToken, @ImeTracker.Phase int phase) {
    static void onFailed(@NonNull ImeTracker.Token statsToken, @ImeTracker.Phase int phase) {
        final IImeTracker service = getImeTrackerService();
        if (service == null) {
            return;
@@ -637,8 +644,9 @@ final class IInputMethodManagerGlobalInvoker {
        }
    }

    /** @see com.android.server.inputmethod.ImeTrackerService#onCancelled */
    @AnyThread
    static void onCancelled(@NonNull IBinder statsToken, @ImeTracker.Phase int phase) {
    static void onCancelled(@NonNull ImeTracker.Token statsToken, @ImeTracker.Phase int phase) {
        final IImeTracker service = getImeTrackerService();
        if (service == null) {
            return;
@@ -650,8 +658,9 @@ final class IInputMethodManagerGlobalInvoker {
        }
    }

    /** @see com.android.server.inputmethod.ImeTrackerService#onShown */
    @AnyThread
    static void onShown(@NonNull IBinder statsToken) {
    static void onShown(@NonNull ImeTracker.Token statsToken) {
        final IImeTracker service = getImeTrackerService();
        if (service == null) {
            return;
@@ -663,8 +672,9 @@ final class IInputMethodManagerGlobalInvoker {
        }
    }

    /** @see com.android.server.inputmethod.ImeTrackerService#onHidden */
    @AnyThread
    static void onHidden(@NonNull IBinder statsToken) {
    static void onHidden(@NonNull ImeTracker.Token statsToken) {
        final IImeTracker service = getImeTrackerService();
        if (service == null) {
            return;
@@ -676,6 +686,7 @@ final class IInputMethodManagerGlobalInvoker {
        }
    }

    /** @see com.android.server.inputmethod.ImeTrackerService#hasPendingImeVisibilityRequests */
    @AnyThread
    @RequiresPermission(Manifest.permission.TEST_INPUT_METHOD)
    static boolean hasPendingImeVisibilityRequests() {
+61 −41
Original line number Diff line number Diff line
@@ -26,7 +26,6 @@ import android.annotation.NonNull;
import android.annotation.Nullable;
import android.app.ActivityThread;
import android.content.Context;
import android.os.Binder;
import android.os.IBinder;
import android.os.Parcel;
import android.os.Parcelable;
@@ -47,7 +46,7 @@ import java.lang.reflect.Field;
import java.util.Arrays;
import java.util.Locale;
import java.util.Map;
import java.util.Random;
import java.util.concurrent.ThreadLocalRandom;
import java.util.stream.Collectors;

/** @hide */
@@ -321,9 +320,8 @@ public interface ImeTracker {
    /**
     * Creates an IME show request tracking token.
     *
     * @param component the component name where the IME show request was created,
     *                  or {@code null} otherwise
     *                  (defaulting to {@link ActivityThread#currentProcessName()}).
     * @param component the name of the component that created the IME request, or {@code null}
     *                  otherwise (defaulting to {@link ActivityThread#currentProcessName()}).
     * @param uid the uid of the client that requested the IME.
     * @param origin the origin of the IME show request.
     * @param reason the reason why the IME show request was created.
@@ -337,9 +335,8 @@ public interface ImeTracker {
    /**
     * Creates an IME hide request tracking token.
     *
     * @param component the component name where the IME hide request was created,
     *                  or {@code null} otherwise
     *                  (defaulting to {@link ActivityThread#currentProcessName()}).
     * @param component the name of the component that created the IME request, or {@code null}
     *                  otherwise (defaulting to {@link ActivityThread#currentProcessName()}).
     * @param uid the uid of the client that requested the IME.
     * @param origin the origin of the IME hide request.
     * @param reason the reason why the IME hide request was created.
@@ -435,8 +432,7 @@ public interface ImeTracker {
            mLogProgress = SystemProperties.getBoolean("persist.debug.imetracker", false);
            // Update logging flag dynamically.
            SystemProperties.addChangeCallback(() ->
                    mLogProgress =
                            SystemProperties.getBoolean("persist.debug.imetracker", false));
                    mLogProgress = SystemProperties.getBoolean("persist.debug.imetracker", false));
        }

        /** Whether progress should be logged. */
@@ -446,10 +442,9 @@ public interface ImeTracker {
        @Override
        public Token onRequestShow(@Nullable String component, int uid, @Origin int origin,
                @SoftInputShowHideReason int reason) {
            IBinder binder = IInputMethodManagerGlobalInvoker.onRequestShow(uid, origin, reason);
            if (binder == null) binder = new Binder();

            final Token token = Token.build(binder, component);
            final var tag = getTag(component);
            final var token = IInputMethodManagerGlobalInvoker.onRequestShow(tag, uid, origin,
                    reason);

            Log.i(TAG, token.mTag + ": onRequestShow at " + Debug.originToString(origin)
                    + " reason " + InputMethodDebug.softInputDisplayReasonToString(reason));
@@ -461,10 +456,9 @@ public interface ImeTracker {
        @Override
        public Token onRequestHide(@Nullable String component, int uid, @Origin int origin,
                @SoftInputShowHideReason int reason) {
            IBinder binder = IInputMethodManagerGlobalInvoker.onRequestHide(uid, origin, reason);
            if (binder == null) binder = new Binder();

            final Token token = Token.build(binder, component);
            final var tag = getTag(component);
            final var token = IInputMethodManagerGlobalInvoker.onRequestHide(tag, uid, origin,
                    reason);

            Log.i(TAG, token.mTag + ": onRequestHide at " + Debug.originToString(origin)
                    + " reason " + InputMethodDebug.softInputDisplayReasonToString(reason));
@@ -485,7 +479,7 @@ public interface ImeTracker {
        @Override
        public void onFailed(@Nullable Token token, @Phase int phase) {
            if (token == null) return;
            IInputMethodManagerGlobalInvoker.onFailed(token.mBinder, phase);
            IInputMethodManagerGlobalInvoker.onFailed(token, phase);

            Log.i(TAG, token.mTag + ": onFailed at " + Debug.phaseToString(phase));
        }
@@ -499,7 +493,7 @@ public interface ImeTracker {
        @Override
        public void onCancelled(@Nullable Token token, @Phase int phase) {
            if (token == null) return;
            IInputMethodManagerGlobalInvoker.onCancelled(token.mBinder, phase);
            IInputMethodManagerGlobalInvoker.onCancelled(token, phase);

            Log.i(TAG, token.mTag + ": onCancelled at " + Debug.phaseToString(phase));
        }
@@ -507,7 +501,7 @@ public interface ImeTracker {
        @Override
        public void onShown(@Nullable Token token) {
            if (token == null) return;
            IInputMethodManagerGlobalInvoker.onShown(token.mBinder);
            IInputMethodManagerGlobalInvoker.onShown(token);

            Log.i(TAG, token.mTag + ": onShown");
        }
@@ -515,10 +509,24 @@ public interface ImeTracker {
        @Override
        public void onHidden(@Nullable Token token) {
            if (token == null) return;
            IInputMethodManagerGlobalInvoker.onHidden(token.mBinder);
            IInputMethodManagerGlobalInvoker.onHidden(token);

            Log.i(TAG, token.mTag + ": onHidden");
        }

        /**
         * Returns a logging tag using the given component name.
         *
         * @param component the name of the component that created the IME request, or {@code null}
         *                  otherwise (defaulting to {@link ActivityThread#currentProcessName()}).
         */
        @NonNull
        private String getTag(@Nullable String component) {
            if (component == null) {
                component = ActivityThread.currentProcessName();
            }
            return component + ":" + Integer.toHexString(ThreadLocalRandom.current().nextInt());
        }
    };

    /** The singleton IME tracker instance for instrumenting jank metrics. */
@@ -528,28 +536,31 @@ public interface ImeTracker {
    ImeLatencyTracker LATENCY_TRACKER = new ImeLatencyTracker();

    /** A token that tracks the progress of an IME request. */
    class Token implements Parcelable {
    final class Token implements Parcelable {

        /** The binder used to identify this token. */
        @NonNull
        public final IBinder mBinder;
        private final IBinder mBinder;

        /** Logging tag, of the shape "component:random_hexadecimal". */
        @NonNull
        private final String mTag;

        @NonNull
        private static Token build(@NonNull IBinder binder, @Nullable String component) {
            if (component == null) component = ActivityThread.currentProcessName();
            final String tag = component + ":" + Integer.toHexString((new Random().nextInt()));
        public Token(@NonNull IBinder binder, @NonNull String tag) {
            mBinder = binder;
            mTag = tag;
        }

            return new Token(binder, tag);
        private Token(@NonNull Parcel in) {
            mBinder = in.readStrongBinder();
            mTag = in.readString8();
        }

        private Token(@NonNull IBinder binder, @NonNull String tag) {
            mBinder = binder;
            mTag = tag;
        @NonNull
        public IBinder getBinder() {
            return mBinder;
        }

        /** Returns the {@link Token#mTag} */
        @NonNull
        public String getTag() {
            return mTag;
@@ -562,7 +573,7 @@ public interface ImeTracker {
        }

        @Override
        public void writeToParcel(Parcel dest, int flags) {
        public void writeToParcel(@NonNull Parcel dest, int flags) {
            dest.writeStrongBinder(mBinder);
            dest.writeString8(mTag);
        }
@@ -571,12 +582,11 @@ public interface ImeTracker {
        public static final Creator<Token> CREATOR = new Creator<>() {
            @NonNull
            @Override
            public Token createFromParcel(Parcel source) {
                final IBinder binder = source.readStrongBinder();
                final String tag = source.readString8();
                return new Token(binder, tag);
            public Token createFromParcel(@NonNull Parcel in) {
                return new Token(in);
            }

            @NonNull
            @Override
            public Token[] newArray(int size) {
                return new Token[size];
@@ -589,40 +599,50 @@ public interface ImeTracker {
     *
     * Note: This is held in a separate class so that it only gets initialized when actually needed.
     */
    class Debug {
    final class Debug {

        @NonNull
        private static final Map<Integer, String> sTypes =
                getFieldMapping(ImeTracker.class, "TYPE_");
        @NonNull
        private static final Map<Integer, String> sStatus =
                getFieldMapping(ImeTracker.class, "STATUS_");
        @NonNull
        private static final Map<Integer, String> sOrigins =
                getFieldMapping(ImeTracker.class, "ORIGIN_");
        @NonNull
        private static final Map<Integer, String> sPhases =
                getFieldMapping(ImeTracker.class, "PHASE_");

        @NonNull
        public static String typeToString(@Type int type) {
            return sTypes.getOrDefault(type, "TYPE_" + type);
        }

        @NonNull
        public static String statusToString(@Status int status) {
            return sStatus.getOrDefault(status, "STATUS_" + status);
        }

        @NonNull
        public static String originToString(@Origin int origin) {
            return sOrigins.getOrDefault(origin, "ORIGIN_" + origin);
        }

        @NonNull
        public static String phaseToString(@Phase int phase) {
            return sPhases.getOrDefault(phase, "PHASE_" + phase);
        }

        private static Map<Integer, String> getFieldMapping(Class<?> cls, String fieldPrefix) {
        @NonNull
        private static Map<Integer, String> getFieldMapping(Class<?> cls,
                @NonNull String fieldPrefix) {
            return Arrays.stream(cls.getDeclaredFields())
                    .filter(field -> field.getName().startsWith(fieldPrefix))
                    .collect(Collectors.toMap(Debug::getFieldValue, Field::getName));
        }

        private static int getFieldValue(Field field) {
        private static int getFieldValue(@NonNull Field field) {
            try {
                return field.getInt(null);
            } catch (IllegalAccessException e) {
+16 −14
Original line number Diff line number Diff line
@@ -14,43 +14,45 @@
 * limitations under the License.
 */

package com.android.internal.view;
package com.android.internal.inputmethod;

import android.view.inputmethod.ImeTracker;

/**
 * Interface to the global Ime tracker, used by all client applications.
 * Interface to the global IME tracker service, used by all client applications.
 * {@hide}
 */
interface IImeTracker {

    /**
     * Called when an IME show request is created,
     * returns a new Binder to be associated with the IME tracking token.
     * Called when an IME show request is created.
     *
     * @param tag the logging tag.
     * @param uid the uid of the client that requested the IME.
     * @param origin the origin of the IME show request.
     * @param reason the reason why the IME show request was created.
     * @return A new IME tracking token.
     */
    IBinder onRequestShow(int uid, int origin, int reason);
    ImeTracker.Token onRequestShow(String tag, int uid, int origin, int reason);

    /**
     * Called when an IME hide request is created,
     * returns a new Binder to be associated with the IME tracking token.
     * Called when an IME hide request is created.
     *
     * @param tag the logging tag.
     * @param uid the uid of the client that requested the IME.
     * @param origin the origin of the IME hide request.
     * @param reason the reason why the IME hide request was created.
     * @return A new IME tracking token.
     */
    IBinder onRequestHide(int uid, int origin, int reason);
    ImeTracker.Token onRequestHide(String tag, int uid, int origin, int reason);

    /**
     * Called when the IME request progresses to a further phase.
     *
     * @param statsToken the token tracking the current IME request.
     * @param binder the binder of token tracking the current IME request.
     * @param phase the new phase the IME request reached.
     */
    oneway void onProgress(in IBinder statsToken, int phase);
    oneway void onProgress(in IBinder binder, int phase);

    /**
     * Called when the IME request fails.
@@ -58,7 +60,7 @@ interface IImeTracker {
     * @param statsToken the token tracking the current IME request.
     * @param phase the phase the IME request failed at.
     */
    oneway void onFailed(in IBinder statsToken, int phase);
    oneway void onFailed(in ImeTracker.Token statsToken, int phase);

    /**
     * Called when the IME request is cancelled.
@@ -66,21 +68,21 @@ interface IImeTracker {
     * @param statsToken the token tracking the current IME request.
     * @param phase the phase the IME request was cancelled at.
     */
    oneway void onCancelled(in IBinder statsToken, int phase);
    oneway void onCancelled(in ImeTracker.Token statsToken, int phase);

    /**
     * Called when the IME show request is successful.
     *
     * @param statsToken the token tracking the current IME request.
     */
    oneway void onShown(in IBinder statsToken);
    oneway void onShown(in ImeTracker.Token statsToken);

    /**
     * Called when the IME hide request is successful.
     *
     * @param statsToken the token tracking the current IME request.
     */
    oneway void onHidden(in IBinder statsToken);
    oneway void onHidden(in ImeTracker.Token statsToken);

    /**
     * Checks whether there are any pending IME visibility requests.
+1 −1
Original line number Diff line number Diff line
@@ -23,11 +23,11 @@ import android.view.inputmethod.InputMethodSubtype;
import android.view.inputmethod.EditorInfo;
import android.window.ImeOnBackInvokedDispatcher;

import com.android.internal.inputmethod.IImeTracker;
import com.android.internal.inputmethod.IInputMethodClient;
import com.android.internal.inputmethod.IRemoteAccessibilityInputConnection;
import com.android.internal.inputmethod.IRemoteInputConnection;
import com.android.internal.inputmethod.InputBindResult;
import com.android.internal.view.IImeTracker;

/**
 * Public interface to the global input method manager, used by all client
+84 −66

File changed.

Preview size limit exceeded, changes collapsed.

Loading