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

Commit 2348439d authored by Haoran Zhang's avatar Haoran Zhang
Browse files

[Autofill Framework] Add some save related logging

This change adds three log into session comit logger:
1. How many save infos there are in this session
2. How many save data types there are in this session
3. Whether the last fill response has save info

Currently framework is only checking the last fill response for save.
These logs added are for measuring how many benefits it brings for
framework to check previous save info also and whether it benefits to
show save dialogs for different types of data.

Autofill CTS module passes except a known failure:
https://android-build.corp.google.com/test_investigate/?invocationId=I21000010284871536

Bug: b/338600483
Test: atest CtsAutoFillServiceTestCases && local validation with debug
log

Change-Id: I30cd99dacd4d49b021ba66b560c4bce5a66609a3
parent f8e96bdd
Loading
Loading
Loading
Loading
+57 −0
Original line number Diff line number Diff line
@@ -3222,6 +3222,58 @@ final class Session implements RemoteFillService.FillServiceCallbacks, ViewState
        return saveInfo == null ? 0 : saveInfo.getFlags();
    }

    static class SaveInfoStats {
        public int saveInfoCount;
        public int saveDataTypeCount;
    }

    /**
     * Get statistic information of save info in current session. Specifically
     *   1. how many save info the current session has.
     *   2. How many distinct save data types current session has.
     *
     * @return SaveInfoStats returns the above two number in a SaveInfoStats object
     */
    @GuardedBy("mLock")
    private SaveInfoStats getSaveInfoStatsLocked() {
        SaveInfoStats retSaveInfoStats = new SaveInfoStats();
        retSaveInfoStats.saveInfoCount = -1;
        retSaveInfoStats.saveDataTypeCount = -1;

        if (mContexts == null) {
            if (sVerbose) {
                Slog.v(TAG, "getSaveInfoStatsLocked(): mContexts is null");
            }
        } else if (mResponses == null) {
            // Happens when the activity / session was finished before the service replied, or
            // when the service cannot autofill it (and returned a null response).
            if (sVerbose) {
                Slog.v(TAG, "getSaveInfoStatsLocked(): mResponses is null");
            }
            return retSaveInfoStats;
        } else {
            int numSaveInfos = 0;
            int numSaveDataTypes = 0;
            ArraySet<Integer> saveDataTypeSeen = new ArraySet<>();
            final int numResponses = mResponses.size();
            for (int responseNum = 0; responseNum < numResponses; responseNum++) {
                final FillResponse response = mResponses.valueAt(responseNum);
                if (response != null && response.getSaveInfo() != null) {
                    numSaveInfos += 1;
                    int saveDataType = response.getSaveInfo().getType();
                    if (!saveDataTypeSeen.contains(saveDataType)) {
                        saveDataTypeSeen.add(saveDataType);
                        numSaveDataTypes += 1;
                    }
                }
            }
            retSaveInfoStats.saveInfoCount = numSaveInfos;
            retSaveInfoStats.saveDataTypeCount = numSaveDataTypes;
        }

        return retSaveInfoStats;
    }

    /**
     * Generates a {@link android.service.autofill.FillEventHistory.Event#TYPE_CONTEXT_COMMITTED}
     * when necessary.
@@ -3258,6 +3310,11 @@ final class Session implements RemoteFillService.FillServiceCallbacks, ViewState

        mSessionCommittedEventLogger.maybeSetCommitReason(commitReason);
        mSessionCommittedEventLogger.maybeSetRequestCount(mRequestCount);
        SaveInfoStats saveInfoStats = getSaveInfoStatsLocked();
        mSessionCommittedEventLogger.maybeSetSaveInfoCount(saveInfoStats.saveInfoCount);
        mSessionCommittedEventLogger.maybeSetSaveDataTypeCount(saveInfoStats.saveDataTypeCount);
        mSessionCommittedEventLogger.maybeSetLastFillResponseHasSaveInfo(
                getSaveInfoLocked() != null);
        mSaveEventLogger.maybeSetSaveUiNotShownReason(NO_SAVE_REASON_NONE);
    }

+38 −2
Original line number Diff line number Diff line
@@ -93,6 +93,33 @@ public final class SessionCommittedEventLogger {
                });
  }

  /**
   * Set how many save infos there are in current session as long as mEventInternal presents.
   */
  public void maybeSetSaveInfoCount(int saveInfoCount) {
        mEventInternal.ifPresent(event -> {
            event.mSaveInfoCount = saveInfoCount;
        });
  }

  /**
   * Set how many save data types there are in current session as long as mEventInternal presents.
   */
  public void maybeSetSaveDataTypeCount(int saveDataTypeCount) {
        mEventInternal.ifPresent(event -> {
            event.mSaveDataTypeCount = saveDataTypeCount;
        });
  }

  /**
   * Set whether last fill response in session has save info as long as mEventInternal presents.
   */
  public void maybeSetLastFillResponseHasSaveInfo(boolean lastFillResponseHasSaveInfo) {
        mEventInternal.ifPresent(event -> {
            event.mLastFillResponseHasSaveInfo = lastFillResponseHasSaveInfo;
        });
  }

  /**
   * Log an AUTOFILL_SESSION_COMMITTED event.
   */
@@ -109,7 +136,10 @@ public final class SessionCommittedEventLogger {
          + " mRequestCount=" + event.mRequestCount
          + " mCommitReason=" + event.mCommitReason
          + " mSessionDurationMillis=" + event.mSessionDurationMillis
          + " mServiceUid=" + event.mServiceUid);
          + " mServiceUid=" + event.mServiceUid
          + " mSaveInfoCount=" + event.mSaveInfoCount
          + " mSaveDataTypeCount=" + event.mSaveDataTypeCount
          + " mLastFillResponseHasSaveInfo=" + event.mLastFillResponseHasSaveInfo);
    }
    FrameworkStatsLog.write(
        AUTOFILL_SESSION_COMMITTED,
@@ -118,7 +148,10 @@ public final class SessionCommittedEventLogger {
        event.mRequestCount,
        event.mCommitReason,
        event.mSessionDurationMillis,
        event.mServiceUid);
        event.mServiceUid,
        event.mSaveInfoCount,
        event.mSaveDataTypeCount,
        event.mLastFillResponseHasSaveInfo);
    mEventInternal = Optional.empty();
  }

@@ -127,6 +160,9 @@ public final class SessionCommittedEventLogger {
    int mRequestCount = 0;
    int mCommitReason = COMMIT_REASON_UNKNOWN;
    long mSessionDurationMillis = 0;
    int mSaveInfoCount = -1;
    int mSaveDataTypeCount = -1;
    boolean mLastFillResponseHasSaveInfo = false;
    int mServiceUid = -1;

    SessionCommittedEventInternal() {