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

Commit 6c28db66 authored by Pablo Gamito's avatar Pablo Gamito
Browse files

Add Protolog logging to ImeTracker

Flag: android.tracing.imetracker_protolog
Bug: 409972099
Test: atest InputMethodStatsTest
Change-Id: I82d0d85b851ec25001bf5d332de371089dc983de
parent f045ec4d
Loading
Loading
Loading
Loading
+8 −3
Original line number Diff line number Diff line
@@ -16,6 +16,8 @@

package android.view;

import android.view.inputmethod.ImeTracker;

import com.android.internal.protolog.ProtoLogGroup;

/**
@@ -26,12 +28,15 @@ import com.android.internal.protolog.ProtoLogGroup;
 *
 * @hide
 */
final class ViewProtoLogGroups {
    final static ProtoLogGroup IME_INSETS_CONTROLLER = new ProtoLogGroup(
public final class ViewProtoLogGroups {
    static final ProtoLogGroup IME_INSETS_CONTROLLER = new ProtoLogGroup(
            "IME_INSETS_CONTROLLER", "InsetsController", true /* enabled */);
    public static final ProtoLogGroup IME_TRACKER = new ProtoLogGroup(
            "IME_TRACKER", ImeTracker.TAG, true);

    final static ProtoLogGroup[] ALL_GROUPS = {
    static final ProtoLogGroup[] ALL_GROUPS = {
            IME_INSETS_CONTROLLER,
            IME_TRACKER,
    };
}
+30 −13
Original line number Diff line number Diff line
@@ -18,6 +18,7 @@ package android.view.inputmethod;

import static android.view.InsetsController.ANIMATION_TYPE_HIDE;
import static android.view.InsetsController.ANIMATION_TYPE_SHOW;
import static android.view.ViewProtoLogGroups.IME_TRACKER;

import static com.android.internal.inputmethod.InputMethodDebug.softInputDisplayReasonToString;
import static com.android.internal.jank.Cuj.CUJ_IME_INSETS_HIDE_ANIMATION;
@@ -35,6 +36,7 @@ import android.os.Parcel;
import android.os.Parcelable;
import android.os.Process;
import android.os.SystemProperties;
import android.text.TextUtils;
import android.util.Log;
import android.view.InsetsController.AnimationType;
import android.view.SurfaceControl;
@@ -46,6 +48,7 @@ import com.android.internal.inputmethod.InputMethodDebug;
import com.android.internal.inputmethod.SoftInputShowHideReason;
import com.android.internal.jank.InteractionJankMonitor;
import com.android.internal.jank.InteractionJankMonitor.Configuration;
import com.android.internal.protolog.ProtoLog;
import com.android.internal.util.LatencyTracker;

import java.lang.annotation.Retention;
@@ -604,6 +607,10 @@ public interface ImeTracker {
            reloadSystemProperties();
            // Update when system properties change.
            SystemProperties.addChangeCallback(this::reloadSystemProperties);

            if (android.tracing.Flags.imetrackerProtolog()) {
                // TODO(b/410517697): Register ProtoLog groups
            }
        }

        /** Whether {@link #onProgress} calls should be logged. */
@@ -620,11 +627,11 @@ public interface ImeTracker {
            final var token = IInputMethodManagerGlobalInvoker.onStart(tag, uid, type,
                    origin, reason, fromUser);

            Log.i(TAG, token.mTag + ": " + getOnStartPrefix(type)
                    + " at " + Debug.originToString(origin)
                    + " reason " + InputMethodDebug.softInputDisplayReasonToString(reason)
                    + " fromUser " + fromUser,
                    mLogStackTrace ? new Throwable() : null);
            log("%s: %s at %s reason %s fromUser %s%s", token.mTag,
                    getOnStartPrefix(type), Debug.originToString(origin),
                    InputMethodDebug.softInputDisplayReasonToString(reason), fromUser,
                    mLogStackTrace ? " Stack trace=" + Log.getStackTraceString(new Throwable()) : ""
            );
            return token;
        }

@@ -634,7 +641,7 @@ public interface ImeTracker {
            IInputMethodManagerGlobalInvoker.onProgress(token.mBinder, phase);

            if (mLogProgress) {
                Log.i(TAG, token.mTag + ": onProgress at " + Debug.phaseToString(phase));
                log("%s: onProgress at %s", token.mTag, Debug.phaseToString(phase));
            }
        }

@@ -643,13 +650,13 @@ public interface ImeTracker {
            if (token == null) return;
            IInputMethodManagerGlobalInvoker.onFailed(token, phase);

            Log.i(TAG, token.mTag + ": onFailed at " + Debug.phaseToString(phase));
            log("%s: onFailed at %s", token.mTag, Debug.phaseToString(phase));
        }

        @Override
        public void onTodo(@Nullable Token token, @Phase int phase) {
            if (token == null) return;
            Log.i(TAG, token.mTag + ": onTodo at " + Debug.phaseToString(phase));
            log("%s: onTodo at %s", token.mTag, Debug.phaseToString(phase));
        }

        @Override
@@ -657,7 +664,7 @@ public interface ImeTracker {
            if (token == null) return;
            IInputMethodManagerGlobalInvoker.onCancelled(token, phase);

            Log.i(TAG, token.mTag + ": onCancelled at " + Debug.phaseToString(phase));
            log("%s: onCancelled at %s", token.mTag, Debug.phaseToString(phase));
        }

        @Override
@@ -665,7 +672,7 @@ public interface ImeTracker {
            if (token == null) return;
            IInputMethodManagerGlobalInvoker.onShown(token);

            Log.i(TAG, token.mTag + ": onShown");
            log("%s: onShown", token.mTag);
        }

        @Override
@@ -673,7 +680,7 @@ public interface ImeTracker {
            if (token == null) return;
            IInputMethodManagerGlobalInvoker.onHidden(token);

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

        @Override
@@ -681,7 +688,7 @@ public interface ImeTracker {
            if (token == null) return;
            IInputMethodManagerGlobalInvoker.onDispatched(token);

            Log.i(TAG, token.mTag + ": onDispatched");
            log("%s: onDispatched", token.mTag);
        }

        @Override
@@ -689,7 +696,7 @@ public interface ImeTracker {
            if (token == null) return;
            // This is already sent to ImeTrackerService to mark it finished during onDispatched.

            Log.i(TAG, token.mTag + ": onUserFinished " + (shown ? "shown" : "hidden"));
            log("%s: onUserFinished %s", token.mTag, shown ? "shown" : "hidden");
        }

        /**
@@ -912,6 +919,16 @@ public interface ImeTracker {
        Context getAppContext();
    }

    private static void log(@NonNull String messageString, @NonNull Object... args) {
        if (android.tracing.Flags.imetrackerProtolog()) {
            ProtoLog.i(IME_TRACKER, messageString, args);
        } else {
            // Log only to logcat
            final var message = TextUtils.formatSimple(messageString, args);
            Log.i(TAG, message);
        }
    }

    /**
     * A tracker instance which is in charge of communicating with {@link InteractionJankMonitor}.
     * This class disallows instantiating from outside, use {@link #forJank()} to get the singleton.