Merge "[Expand metrics for Autofill]" into tm-qpr-dev
This commit is contained in:
committed by
Android (Google) Code Review
commit
8d7109f665
@@ -32,6 +32,8 @@ import static com.android.internal.util.FrameworkStatsLog.AUTOFILL_PRESENTATION_
|
||||
import static com.android.internal.util.FrameworkStatsLog.AUTOFILL_PRESENTATION_EVENT_REPORTED__DISPLAY_PRESENTATION_TYPE__UNKNOWN_AUTOFILL_DISPLAY_PRESENTATION_TYPE;
|
||||
import static com.android.internal.util.FrameworkStatsLog.AUTOFILL_PRESENTATION_EVENT_REPORTED__PRESENTATION_EVENT_RESULT__ANY_SHOWN;
|
||||
import static com.android.internal.util.FrameworkStatsLog.AUTOFILL_PRESENTATION_EVENT_REPORTED__PRESENTATION_EVENT_RESULT__NONE_SHOWN_ACTIVITY_FINISHED;
|
||||
import static com.android.internal.util.FrameworkStatsLog.AUTOFILL_PRESENTATION_EVENT_REPORTED__PRESENTATION_EVENT_RESULT__NONE_SHOWN_FILL_REQUEST_FAILED;
|
||||
import static com.android.internal.util.FrameworkStatsLog.AUTOFILL_PRESENTATION_EVENT_REPORTED__PRESENTATION_EVENT_RESULT__NONE_SHOWN_NO_FOCUS;
|
||||
import static com.android.internal.util.FrameworkStatsLog.AUTOFILL_PRESENTATION_EVENT_REPORTED__PRESENTATION_EVENT_RESULT__NONE_SHOWN_REQUEST_TIMEOUT;
|
||||
import static com.android.internal.util.FrameworkStatsLog.AUTOFILL_PRESENTATION_EVENT_REPORTED__PRESENTATION_EVENT_RESULT__NONE_SHOWN_SESSION_COMMITTED_PREMATURELY;
|
||||
import static com.android.internal.util.FrameworkStatsLog.AUTOFILL_PRESENTATION_EVENT_REPORTED__PRESENTATION_EVENT_RESULT__NONE_SHOWN_UNKNOWN_REASON;
|
||||
@@ -72,19 +74,32 @@ public final class PresentationStatsEventLogger {
|
||||
NOT_SHOWN_REASON_VIEW_CHANGED,
|
||||
NOT_SHOWN_REASON_ACTIVITY_FINISHED,
|
||||
NOT_SHOWN_REASON_REQUEST_TIMEOUT,
|
||||
NOT_SHOWN_REASON_REQUEST_FAILED,
|
||||
NOT_SHOWN_REASON_NO_FOCUS,
|
||||
NOT_SHOWN_REASON_SESSION_COMMITTED_PREMATURELY,
|
||||
NOT_SHOWN_REASON_UNKNOWN
|
||||
})
|
||||
@Retention(RetentionPolicy.SOURCE)
|
||||
public @interface NotShownReason {}
|
||||
|
||||
public static final int NOT_SHOWN_REASON_ANY_SHOWN = AUTOFILL_PRESENTATION_EVENT_REPORTED__PRESENTATION_EVENT_RESULT__ANY_SHOWN;
|
||||
public static final int NOT_SHOWN_REASON_VIEW_FOCUS_CHANGED = AUTOFILL_PRESENTATION_EVENT_REPORTED__PRESENTATION_EVENT_RESULT__NONE_SHOWN_VIEW_FOCUS_CHANGED;
|
||||
public static final int NOT_SHOWN_REASON_VIEW_CHANGED = AUTOFILL_PRESENTATION_EVENT_REPORTED__PRESENTATION_EVENT_RESULT__NONE_SHOWN_VIEW_CHANGED;
|
||||
public static final int NOT_SHOWN_REASON_ACTIVITY_FINISHED = AUTOFILL_PRESENTATION_EVENT_REPORTED__PRESENTATION_EVENT_RESULT__NONE_SHOWN_ACTIVITY_FINISHED;
|
||||
public static final int NOT_SHOWN_REASON_REQUEST_TIMEOUT = AUTOFILL_PRESENTATION_EVENT_REPORTED__PRESENTATION_EVENT_RESULT__NONE_SHOWN_REQUEST_TIMEOUT;
|
||||
public static final int NOT_SHOWN_REASON_SESSION_COMMITTED_PREMATURELY = AUTOFILL_PRESENTATION_EVENT_REPORTED__PRESENTATION_EVENT_RESULT__NONE_SHOWN_SESSION_COMMITTED_PREMATURELY;
|
||||
public static final int NOT_SHOWN_REASON_UNKNOWN = AUTOFILL_PRESENTATION_EVENT_REPORTED__PRESENTATION_EVENT_RESULT__NONE_SHOWN_UNKNOWN_REASON;
|
||||
public static final int NOT_SHOWN_REASON_ANY_SHOWN =
|
||||
AUTOFILL_PRESENTATION_EVENT_REPORTED__PRESENTATION_EVENT_RESULT__ANY_SHOWN;
|
||||
public static final int NOT_SHOWN_REASON_VIEW_FOCUS_CHANGED =
|
||||
AUTOFILL_PRESENTATION_EVENT_REPORTED__PRESENTATION_EVENT_RESULT__NONE_SHOWN_VIEW_FOCUS_CHANGED;
|
||||
public static final int NOT_SHOWN_REASON_VIEW_CHANGED =
|
||||
AUTOFILL_PRESENTATION_EVENT_REPORTED__PRESENTATION_EVENT_RESULT__NONE_SHOWN_VIEW_CHANGED;
|
||||
public static final int NOT_SHOWN_REASON_ACTIVITY_FINISHED =
|
||||
AUTOFILL_PRESENTATION_EVENT_REPORTED__PRESENTATION_EVENT_RESULT__NONE_SHOWN_ACTIVITY_FINISHED;
|
||||
public static final int NOT_SHOWN_REASON_REQUEST_TIMEOUT =
|
||||
AUTOFILL_PRESENTATION_EVENT_REPORTED__PRESENTATION_EVENT_RESULT__NONE_SHOWN_REQUEST_TIMEOUT;
|
||||
public static final int NOT_SHOWN_REASON_REQUEST_FAILED =
|
||||
AUTOFILL_PRESENTATION_EVENT_REPORTED__PRESENTATION_EVENT_RESULT__NONE_SHOWN_FILL_REQUEST_FAILED;
|
||||
public static final int NOT_SHOWN_REASON_NO_FOCUS =
|
||||
AUTOFILL_PRESENTATION_EVENT_REPORTED__PRESENTATION_EVENT_RESULT__NONE_SHOWN_NO_FOCUS;
|
||||
public static final int NOT_SHOWN_REASON_SESSION_COMMITTED_PREMATURELY =
|
||||
AUTOFILL_PRESENTATION_EVENT_REPORTED__PRESENTATION_EVENT_RESULT__NONE_SHOWN_SESSION_COMMITTED_PREMATURELY;
|
||||
public static final int NOT_SHOWN_REASON_UNKNOWN =
|
||||
AUTOFILL_PRESENTATION_EVENT_REPORTED__PRESENTATION_EVENT_RESULT__NONE_SHOWN_UNKNOWN_REASON;
|
||||
|
||||
private final int mSessionId;
|
||||
private Optional<PresentationStatsEventInternal> mEventInternal;
|
||||
@@ -188,7 +203,8 @@ public final class PresentationStatsEventLogger {
|
||||
|
||||
public void maybeSetInlinePresentationAndSuggestionHostUid(Context context, int userId) {
|
||||
mEventInternal.ifPresent(event -> {
|
||||
event.mDisplayPresentationType = UI_TYPE_INLINE;
|
||||
event.mDisplayPresentationType =
|
||||
AUTOFILL_PRESENTATION_EVENT_REPORTED__DISPLAY_PRESENTATION_TYPE__INLINE;
|
||||
String imeString = Settings.Secure.getStringForUser(context.getContentResolver(),
|
||||
Settings.Secure.DEFAULT_INPUT_METHOD, userId);
|
||||
if (TextUtils.isEmpty(imeString)) {
|
||||
|
||||
@@ -43,6 +43,8 @@ import static com.android.server.autofill.Helper.getNumericValue;
|
||||
import static com.android.server.autofill.Helper.sDebug;
|
||||
import static com.android.server.autofill.Helper.sVerbose;
|
||||
import static com.android.server.autofill.Helper.toArray;
|
||||
import static com.android.server.autofill.PresentationStatsEventLogger.NOT_SHOWN_REASON_NO_FOCUS;
|
||||
import static com.android.server.autofill.PresentationStatsEventLogger.NOT_SHOWN_REASON_REQUEST_FAILED;
|
||||
import static com.android.server.autofill.PresentationStatsEventLogger.NOT_SHOWN_REASON_REQUEST_TIMEOUT;
|
||||
import static com.android.server.autofill.PresentationStatsEventLogger.NOT_SHOWN_REASON_VIEW_CHANGED;
|
||||
import static com.android.server.autofill.PresentationStatsEventLogger.NOT_SHOWN_REASON_VIEW_FOCUS_CHANGED;
|
||||
@@ -402,6 +404,13 @@ final class Session implements RemoteFillService.FillServiceCallbacks, ViewState
|
||||
@GuardedBy("mLock")
|
||||
private PresentationStatsEventLogger mPresentationStatsEventLogger;
|
||||
|
||||
/**
|
||||
* Fill dialog request would likely be sent slightly later.
|
||||
*/
|
||||
@NonNull
|
||||
@GuardedBy("mLock")
|
||||
private boolean mStartedLogEventWithoutFocus;
|
||||
|
||||
void onSwitchInputMethodLocked() {
|
||||
// One caveat is that for the case where the focus is on a field for which regular autofill
|
||||
// returns null, and augmented autofill is triggered, and then the user switches the input
|
||||
@@ -522,6 +531,7 @@ final class Session implements RemoteFillService.FillServiceCallbacks, ViewState
|
||||
}
|
||||
mLastFillRequest = mPendingFillRequest;
|
||||
|
||||
mPresentationStatsEventLogger.maybeSetIsNewRequest(true);
|
||||
mRemoteFillService.onFillRequest(mPendingFillRequest);
|
||||
mPendingInlineSuggestionsRequest = null;
|
||||
mWaitForInlineRequest = false;
|
||||
@@ -1128,6 +1138,7 @@ final class Session implements RemoteFillService.FillServiceCallbacks, ViewState
|
||||
@Override
|
||||
public void onFillRequestSuccess(int requestId, @Nullable FillResponse response,
|
||||
@NonNull String servicePackageName, int requestFlags) {
|
||||
|
||||
final AutofillId[] fieldClassificationIds;
|
||||
|
||||
final LogMaker requestLog;
|
||||
@@ -1285,9 +1296,8 @@ final class Session implements RemoteFillService.FillServiceCallbacks, ViewState
|
||||
}
|
||||
}
|
||||
|
||||
// TODO(b/234185326): Add separate reason for failures.
|
||||
mPresentationStatsEventLogger.maybeSetNoPresentationEventReason(
|
||||
NOT_SHOWN_REASON_REQUEST_TIMEOUT);
|
||||
timedOut ? NOT_SHOWN_REASON_REQUEST_TIMEOUT : NOT_SHOWN_REASON_REQUEST_FAILED);
|
||||
mPresentationStatsEventLogger.logAndEndEvent();
|
||||
}
|
||||
notifyUnavailableToClient(AutofillManager.STATE_UNKNOWN_FAILED,
|
||||
@@ -2816,6 +2826,7 @@ final class Session implements RemoteFillService.FillServiceCallbacks, ViewState
|
||||
@GuardedBy("mLock")
|
||||
private boolean requestNewFillResponseOnViewEnteredIfNecessaryLocked(@NonNull AutofillId id,
|
||||
@NonNull ViewState viewState, int flags) {
|
||||
// Force new response for manual request
|
||||
if ((flags & FLAG_MANUAL_REQUEST) != 0) {
|
||||
mSessionFlags.mAugmentedAutofillOnly = false;
|
||||
if (sDebug) Slog.d(TAG, "Re-starting session on view " + id + " and flags " + flags);
|
||||
@@ -2823,7 +2834,7 @@ final class Session implements RemoteFillService.FillServiceCallbacks, ViewState
|
||||
return true;
|
||||
}
|
||||
|
||||
// If it's not, then check if it it should start a partition.
|
||||
// If it's not, then check if it should start a partition.
|
||||
if (shouldStartNewPartitionLocked(id)) {
|
||||
if (sDebug) {
|
||||
Slog.d(TAG, "Starting partition or augmented request for view id " + id + ": "
|
||||
@@ -2967,11 +2978,19 @@ final class Session implements RemoteFillService.FillServiceCallbacks, ViewState
|
||||
// View is triggering autofill.
|
||||
mCurrentViewId = viewState.id;
|
||||
viewState.update(value, virtualBounds, flags);
|
||||
if (!isRequestSupportFillDialog(flags)) {
|
||||
mSessionFlags.mFillDialogDisabled = true;
|
||||
}
|
||||
mPresentationStatsEventLogger.startNewEvent();
|
||||
mPresentationStatsEventLogger.maybeSetAutofillServiceUid(getAutofillServiceUid());
|
||||
if (isRequestSupportFillDialog(flags)) {
|
||||
// Set the default reason for now if the user doesn't trigger any focus event
|
||||
// on the autofillable view. This can be changed downstream when more
|
||||
// information is available or session is committed.
|
||||
mPresentationStatsEventLogger.maybeSetNoPresentationEventReason(
|
||||
NOT_SHOWN_REASON_NO_FOCUS);
|
||||
mStartedLogEventWithoutFocus = true;
|
||||
} else {
|
||||
mSessionFlags.mFillDialogDisabled = true;
|
||||
mStartedLogEventWithoutFocus = false;
|
||||
}
|
||||
requestNewFillResponseLocked(viewState, ViewState.STATE_STARTED_SESSION, flags);
|
||||
break;
|
||||
case ACTION_VALUE_CHANGED:
|
||||
@@ -3014,6 +3033,8 @@ final class Session implements RemoteFillService.FillServiceCallbacks, ViewState
|
||||
}
|
||||
break;
|
||||
case ACTION_VIEW_ENTERED:
|
||||
boolean startedEventWithoutFocus = mStartedLogEventWithoutFocus;
|
||||
mStartedLogEventWithoutFocus = false;
|
||||
if (sVerbose && virtualBounds != null) {
|
||||
Slog.v(TAG, "entered on virtual child " + id + ": " + virtualBounds);
|
||||
}
|
||||
@@ -3030,9 +3051,15 @@ final class Session implements RemoteFillService.FillServiceCallbacks, ViewState
|
||||
return;
|
||||
}
|
||||
|
||||
mPresentationStatsEventLogger.maybeSetNoPresentationEventReason(
|
||||
NOT_SHOWN_REASON_VIEW_FOCUS_CHANGED);
|
||||
mPresentationStatsEventLogger.logAndEndEvent();
|
||||
// Previously, fill request will only start whenever a view is entered.
|
||||
// With Fill Dialog, request starts prior to view getting entered. So, we can't end
|
||||
// the event at this moment, otherwise we will be wrongly attributing fill dialog
|
||||
// event as concluded.
|
||||
if (!startedEventWithoutFocus) {
|
||||
mPresentationStatsEventLogger.maybeSetNoPresentationEventReason(
|
||||
NOT_SHOWN_REASON_VIEW_FOCUS_CHANGED);
|
||||
mPresentationStatsEventLogger.logAndEndEvent();
|
||||
}
|
||||
|
||||
if ((flags & FLAG_MANUAL_REQUEST) == 0) {
|
||||
// Not a manual request
|
||||
@@ -3060,9 +3087,22 @@ final class Session implements RemoteFillService.FillServiceCallbacks, ViewState
|
||||
}
|
||||
}
|
||||
|
||||
mPresentationStatsEventLogger.startNewEvent();
|
||||
mPresentationStatsEventLogger.maybeSetAutofillServiceUid(getAutofillServiceUid());
|
||||
if (!startedEventWithoutFocus) {
|
||||
mPresentationStatsEventLogger.startNewEvent();
|
||||
mPresentationStatsEventLogger.maybeSetAutofillServiceUid(
|
||||
getAutofillServiceUid());
|
||||
}
|
||||
if (requestNewFillResponseOnViewEnteredIfNecessaryLocked(id, viewState, flags)) {
|
||||
// If a new request was issued even if previously it was fill dialog request,
|
||||
// we should end the log event, and start a new one. However, it leaves us
|
||||
// susceptible to race condition. But since mPresentationStatsEventLogger is
|
||||
// lock guarded, we should be safe.
|
||||
if (startedEventWithoutFocus) {
|
||||
mPresentationStatsEventLogger.logAndEndEvent();
|
||||
mPresentationStatsEventLogger.startNewEvent();
|
||||
mPresentationStatsEventLogger.maybeSetAutofillServiceUid(
|
||||
getAutofillServiceUid());
|
||||
}
|
||||
return;
|
||||
}
|
||||
|
||||
@@ -3289,7 +3329,7 @@ final class Session implements RemoteFillService.FillServiceCallbacks, ViewState
|
||||
if (requestShowInlineSuggestionsLocked(response, filterText)) {
|
||||
final ViewState currentView = mViewStates.get(mCurrentViewId);
|
||||
currentView.setState(ViewState.STATE_INLINE_SHOWN);
|
||||
// TODO(b/137800469): Fix it to log showed only when IME asks for inflation,
|
||||
// TODO(b/248378401): Fix it to log showed only when IME asks for inflation,
|
||||
// rather than here where framework sends back the response.
|
||||
mService.logDatasetShown(id, mClientState, UI_TYPE_INLINE);
|
||||
|
||||
@@ -3310,7 +3350,6 @@ final class Session implements RemoteFillService.FillServiceCallbacks, ViewState
|
||||
|
||||
synchronized (mLock) {
|
||||
mService.logDatasetShown(id, mClientState, UI_TYPE_MENU);
|
||||
|
||||
mPresentationStatsEventLogger.maybeSetCountShown(
|
||||
response.getDatasets(), mCurrentViewId);
|
||||
mPresentationStatsEventLogger.maybeSetDisplayPresentationType(UI_TYPE_MENU);
|
||||
|
||||
Reference in New Issue
Block a user