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

Commit 021b878a authored by Felipe Leme's avatar Felipe Leme
Browse files

Logs how long it took to show the Autofill UI after a field was focused.

Test: adb shell logcat -b events | grep sysui_
Test: adb dumpsys autofill
Test: cts-tradefed run commandAndExit cts-dev -m CtsAutoFillServiceTestCases

Bug: 65376559
Bug: 66508098

Merged-In: Ia17f8b30d6eef0141b020085985b9ebacff7a455
Change-Id: Ia17f8b30d6eef0141b020085985b9ebacff7a455
parent 6f50d163
Loading
Loading
Loading
Loading
+6 −0
Original line number Diff line number Diff line
@@ -4532,6 +4532,12 @@ message MetricsEvent {
    // OS: O MR
    AUTOFILL_SERVICE_DISABLED_SELF = 1135;

    // Counter showing how long it took (in ms) to show the autofill UI after a field was focused
    // Tag FIELD_AUTOFILL_SERVICE: Package of service that processed the request
    // Package: Package of the autofill service
    // OS: O MR
    AUTOFILL_UI_LATENCY = 1136;

    // ---- End O-MR1 Constants, all O-MR1 constants go above this line ----

    // Add new aosp constants above this line.
+4 −1
Original line number Diff line number Diff line
@@ -115,6 +115,7 @@ public final class AutofillManagerService extends SystemService {
    private final SparseBooleanArray mDisabledUsers = new SparseBooleanArray();

    private final LocalLog mRequestsHistory = new LocalLog(20);
    private final LocalLog mUiLatencyHistory = new LocalLog(20);

    private final BroadcastReceiver mBroadcastReceiver = new BroadcastReceiver() {
        @Override
@@ -306,7 +307,7 @@ public final class AutofillManagerService extends SystemService {
        AutofillManagerServiceImpl service = mServicesCache.get(resolvedUserId);
        if (service == null) {
            service = new AutofillManagerServiceImpl(mContext, mLock, mRequestsHistory,
                    resolvedUserId, mUi, mDisabledUsers.get(resolvedUserId));
                    mUiLatencyHistory, resolvedUserId, mUi, mDisabledUsers.get(resolvedUserId));
            mServicesCache.put(userId, service);
        }
        return service;
@@ -736,6 +737,8 @@ public final class AutofillManagerService extends SystemService {
                if (showHistory) {
                    pw.println("Requests history:");
                    mRequestsHistory.reverseDump(fd, pw, args);
                    pw.println("UI latency history:");
                    mUiLatencyHistory.reverseDump(fd, pw, args);
                }
            } finally {
                setDebugLocked(oldDebug);
+5 −2
Original line number Diff line number Diff line
@@ -100,6 +100,8 @@ final class AutofillManagerServiceImpl {
    private static final Random sRandom = new Random();

    private final LocalLog mRequestsHistory;
    private final LocalLog mUiLatencyHistory;

    /**
     * Whether service was disabled for user due to {@link UserManager} restrictions.
     */
@@ -141,10 +143,11 @@ final class AutofillManagerServiceImpl {
    private long mLastPrune = 0;

    AutofillManagerServiceImpl(Context context, Object lock, LocalLog requestsHistory,
            int userId, AutoFillUI ui, boolean disabled) {
            LocalLog uiLatencyHistory, int userId, AutoFillUI ui, boolean disabled) {
        mContext = context;
        mLock = lock;
        mRequestsHistory = requestsHistory;
        mUiLatencyHistory = uiLatencyHistory;
        mUserId = userId;
        mUi = ui;
        updateLocked(disabled);
@@ -399,7 +402,7 @@ final class AutofillManagerServiceImpl {

        final Session newSession = new Session(this, mUi, mContext, mHandlerCaller, mUserId, mLock,
                sessionId, uid, activityToken, appCallbackToken, hasCallback,
                mInfo.getServiceInfo().getComponentName(), packageName);
                mUiLatencyHistory, mInfo.getServiceInfo().getComponentName(), packageName);
        mSessions.put(newSession.id, newSession);

        return newSession;
+53 −1
Original line number Diff line number Diff line
@@ -50,6 +50,7 @@ import android.os.Bundle;
import android.os.IBinder;
import android.os.Parcelable;
import android.os.RemoteException;
import android.os.SystemClock;
import android.service.autofill.AutofillService;
import android.service.autofill.Dataset;
import android.service.autofill.FillContext;
@@ -61,8 +62,10 @@ import android.service.autofill.SaveRequest;
import android.service.autofill.ValueFinder;
import android.util.ArrayMap;
import android.util.ArraySet;
import android.util.LocalLog;
import android.util.Slog;
import android.util.SparseArray;
import android.util.TimeUtils;
import android.view.autofill.AutofillId;
import android.view.autofill.AutofillManager;
import android.view.autofill.AutofillValue;
@@ -176,6 +179,20 @@ final class Session implements RemoteFillService.FillServiceCallbacks, ViewState
    @GuardedBy("mLock")
    private PendingUi mPendingSaveUi;

    /**
     * When the session started (using elapsed time since boot).
     */
    private final long mStartTime;

    /**
     * When the UI was shown for the first time (using elapsed time since boot).
     */
    @GuardedBy("mLock")
    private long mUiShownTime;

    @GuardedBy("mLock")
    private final LocalLog mUiLatencyHistory;

    /**
     * Receiver of assist data from the app's {@link Activity}.
     */
@@ -397,10 +414,11 @@ final class Session implements RemoteFillService.FillServiceCallbacks, ViewState
    Session(@NonNull AutofillManagerServiceImpl service, @NonNull AutoFillUI ui,
            @NonNull Context context, @NonNull HandlerCaller handlerCaller, int userId,
            @NonNull Object lock, int sessionId, int uid, @NonNull IBinder activityToken,
            @NonNull IBinder client, boolean hasCallback,
            @NonNull IBinder client, boolean hasCallback, @NonNull LocalLog uiLatencyHistory,
            @NonNull ComponentName componentName, @NonNull String packageName) {
        id = sessionId;
        this.uid = uid;
        mStartTime = SystemClock.elapsedRealtime();
        mService = service;
        mLock = lock;
        mUi = ui;
@@ -408,6 +426,7 @@ final class Session implements RemoteFillService.FillServiceCallbacks, ViewState
        mRemoteFillService = new RemoteFillService(context, componentName, userId, this);
        mActivityToken = activityToken;
        mHasCallback = hasCallback;
        mUiLatencyHistory = uiLatencyHistory;
        mPackageName = packageName;
        mClient = IAutoFillManagerClient.Stub.asInterface(client);

@@ -1347,6 +1366,31 @@ final class Session implements RemoteFillService.FillServiceCallbacks, ViewState

        getUiForShowing().showFillUi(filledId, response, filterText,
                mService.getServicePackageName(), mPackageName, this);

        synchronized (mLock) {
            if (mUiShownTime == 0) {
                // Log first time UI is shown.
                mUiShownTime = SystemClock.elapsedRealtime();
                final long duration = mUiShownTime - mStartTime;
                if (sDebug) {
                    final StringBuilder msg = new StringBuilder("1st UI for ")
                            .append(mActivityToken)
                            .append(" shown in ");
                    TimeUtils.formatDuration(duration, msg);
                    Slog.d(TAG, msg.toString());
                }
                final StringBuilder historyLog = new StringBuilder("id=").append(id)
                        .append(" app=").append(mActivityToken)
                        .append(" svc=").append(mService.getServicePackageName())
                        .append(" latency=");
                TimeUtils.formatDuration(duration, historyLog);
                mUiLatencyHistory.log(historyLog.toString());

                final LogMaker metricsLog = newLogMaker(MetricsEvent.AUTOFILL_UI_LATENCY)
                        .setCounterValue((int) duration);
                mMetricsLogger.write(metricsLog);
            }
        }
    }

    boolean isDestroyed() {
@@ -1655,6 +1699,14 @@ final class Session implements RemoteFillService.FillServiceCallbacks, ViewState
        pw.print(prefix); pw.print("uid: "); pw.println(uid);
        pw.print(prefix); pw.print("mPackagename: "); pw.println(mPackageName);
        pw.print(prefix); pw.print("mActivityToken: "); pw.println(mActivityToken);
        pw.print(prefix); pw.print("mStartTime: "); pw.println(mStartTime);
        pw.print(prefix); pw.print("Time to show UI: ");
        if (mUiShownTime == 0) {
            pw.println("N/A");
        } else {
            TimeUtils.formatDuration(mUiShownTime - mStartTime, pw);
            pw.println();
        }
        pw.print(prefix); pw.print("mResponses: ");
        if (mResponses == null) {
            pw.println("null");