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__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__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_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_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_SESSION_COMMITTED_PREMATURELY;
|
||||||
import static com.android.internal.util.FrameworkStatsLog.AUTOFILL_PRESENTATION_EVENT_REPORTED__PRESENTATION_EVENT_RESULT__NONE_SHOWN_UNKNOWN_REASON;
|
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_VIEW_CHANGED,
|
||||||
NOT_SHOWN_REASON_ACTIVITY_FINISHED,
|
NOT_SHOWN_REASON_ACTIVITY_FINISHED,
|
||||||
NOT_SHOWN_REASON_REQUEST_TIMEOUT,
|
NOT_SHOWN_REASON_REQUEST_TIMEOUT,
|
||||||
|
NOT_SHOWN_REASON_REQUEST_FAILED,
|
||||||
|
NOT_SHOWN_REASON_NO_FOCUS,
|
||||||
NOT_SHOWN_REASON_SESSION_COMMITTED_PREMATURELY,
|
NOT_SHOWN_REASON_SESSION_COMMITTED_PREMATURELY,
|
||||||
NOT_SHOWN_REASON_UNKNOWN
|
NOT_SHOWN_REASON_UNKNOWN
|
||||||
})
|
})
|
||||||
@Retention(RetentionPolicy.SOURCE)
|
@Retention(RetentionPolicy.SOURCE)
|
||||||
public @interface NotShownReason {}
|
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_ANY_SHOWN =
|
||||||
public static final int NOT_SHOWN_REASON_VIEW_FOCUS_CHANGED = AUTOFILL_PRESENTATION_EVENT_REPORTED__PRESENTATION_EVENT_RESULT__NONE_SHOWN_VIEW_FOCUS_CHANGED;
|
AUTOFILL_PRESENTATION_EVENT_REPORTED__PRESENTATION_EVENT_RESULT__ANY_SHOWN;
|
||||||
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_VIEW_FOCUS_CHANGED =
|
||||||
public static final int NOT_SHOWN_REASON_ACTIVITY_FINISHED = AUTOFILL_PRESENTATION_EVENT_REPORTED__PRESENTATION_EVENT_RESULT__NONE_SHOWN_ACTIVITY_FINISHED;
|
AUTOFILL_PRESENTATION_EVENT_REPORTED__PRESENTATION_EVENT_RESULT__NONE_SHOWN_VIEW_FOCUS_CHANGED;
|
||||||
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_VIEW_CHANGED =
|
||||||
public static final int NOT_SHOWN_REASON_SESSION_COMMITTED_PREMATURELY = AUTOFILL_PRESENTATION_EVENT_REPORTED__PRESENTATION_EVENT_RESULT__NONE_SHOWN_SESSION_COMMITTED_PREMATURELY;
|
AUTOFILL_PRESENTATION_EVENT_REPORTED__PRESENTATION_EVENT_RESULT__NONE_SHOWN_VIEW_CHANGED;
|
||||||
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_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 final int mSessionId;
|
||||||
private Optional<PresentationStatsEventInternal> mEventInternal;
|
private Optional<PresentationStatsEventInternal> mEventInternal;
|
||||||
@@ -188,7 +203,8 @@ public final class PresentationStatsEventLogger {
|
|||||||
|
|
||||||
public void maybeSetInlinePresentationAndSuggestionHostUid(Context context, int userId) {
|
public void maybeSetInlinePresentationAndSuggestionHostUid(Context context, int userId) {
|
||||||
mEventInternal.ifPresent(event -> {
|
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(),
|
String imeString = Settings.Secure.getStringForUser(context.getContentResolver(),
|
||||||
Settings.Secure.DEFAULT_INPUT_METHOD, userId);
|
Settings.Secure.DEFAULT_INPUT_METHOD, userId);
|
||||||
if (TextUtils.isEmpty(imeString)) {
|
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.sDebug;
|
||||||
import static com.android.server.autofill.Helper.sVerbose;
|
import static com.android.server.autofill.Helper.sVerbose;
|
||||||
import static com.android.server.autofill.Helper.toArray;
|
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_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_CHANGED;
|
||||||
import static com.android.server.autofill.PresentationStatsEventLogger.NOT_SHOWN_REASON_VIEW_FOCUS_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")
|
@GuardedBy("mLock")
|
||||||
private PresentationStatsEventLogger mPresentationStatsEventLogger;
|
private PresentationStatsEventLogger mPresentationStatsEventLogger;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Fill dialog request would likely be sent slightly later.
|
||||||
|
*/
|
||||||
|
@NonNull
|
||||||
|
@GuardedBy("mLock")
|
||||||
|
private boolean mStartedLogEventWithoutFocus;
|
||||||
|
|
||||||
void onSwitchInputMethodLocked() {
|
void onSwitchInputMethodLocked() {
|
||||||
// One caveat is that for the case where the focus is on a field for which regular autofill
|
// 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
|
// 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;
|
mLastFillRequest = mPendingFillRequest;
|
||||||
|
|
||||||
|
mPresentationStatsEventLogger.maybeSetIsNewRequest(true);
|
||||||
mRemoteFillService.onFillRequest(mPendingFillRequest);
|
mRemoteFillService.onFillRequest(mPendingFillRequest);
|
||||||
mPendingInlineSuggestionsRequest = null;
|
mPendingInlineSuggestionsRequest = null;
|
||||||
mWaitForInlineRequest = false;
|
mWaitForInlineRequest = false;
|
||||||
@@ -1128,6 +1138,7 @@ final class Session implements RemoteFillService.FillServiceCallbacks, ViewState
|
|||||||
@Override
|
@Override
|
||||||
public void onFillRequestSuccess(int requestId, @Nullable FillResponse response,
|
public void onFillRequestSuccess(int requestId, @Nullable FillResponse response,
|
||||||
@NonNull String servicePackageName, int requestFlags) {
|
@NonNull String servicePackageName, int requestFlags) {
|
||||||
|
|
||||||
final AutofillId[] fieldClassificationIds;
|
final AutofillId[] fieldClassificationIds;
|
||||||
|
|
||||||
final LogMaker requestLog;
|
final LogMaker requestLog;
|
||||||
@@ -1285,9 +1296,8 @@ final class Session implements RemoteFillService.FillServiceCallbacks, ViewState
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// TODO(b/234185326): Add separate reason for failures.
|
|
||||||
mPresentationStatsEventLogger.maybeSetNoPresentationEventReason(
|
mPresentationStatsEventLogger.maybeSetNoPresentationEventReason(
|
||||||
NOT_SHOWN_REASON_REQUEST_TIMEOUT);
|
timedOut ? NOT_SHOWN_REASON_REQUEST_TIMEOUT : NOT_SHOWN_REASON_REQUEST_FAILED);
|
||||||
mPresentationStatsEventLogger.logAndEndEvent();
|
mPresentationStatsEventLogger.logAndEndEvent();
|
||||||
}
|
}
|
||||||
notifyUnavailableToClient(AutofillManager.STATE_UNKNOWN_FAILED,
|
notifyUnavailableToClient(AutofillManager.STATE_UNKNOWN_FAILED,
|
||||||
@@ -2816,6 +2826,7 @@ final class Session implements RemoteFillService.FillServiceCallbacks, ViewState
|
|||||||
@GuardedBy("mLock")
|
@GuardedBy("mLock")
|
||||||
private boolean requestNewFillResponseOnViewEnteredIfNecessaryLocked(@NonNull AutofillId id,
|
private boolean requestNewFillResponseOnViewEnteredIfNecessaryLocked(@NonNull AutofillId id,
|
||||||
@NonNull ViewState viewState, int flags) {
|
@NonNull ViewState viewState, int flags) {
|
||||||
|
// Force new response for manual request
|
||||||
if ((flags & FLAG_MANUAL_REQUEST) != 0) {
|
if ((flags & FLAG_MANUAL_REQUEST) != 0) {
|
||||||
mSessionFlags.mAugmentedAutofillOnly = false;
|
mSessionFlags.mAugmentedAutofillOnly = false;
|
||||||
if (sDebug) Slog.d(TAG, "Re-starting session on view " + id + " and flags " + flags);
|
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;
|
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 (shouldStartNewPartitionLocked(id)) {
|
||||||
if (sDebug) {
|
if (sDebug) {
|
||||||
Slog.d(TAG, "Starting partition or augmented request for view id " + id + ": "
|
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.
|
// View is triggering autofill.
|
||||||
mCurrentViewId = viewState.id;
|
mCurrentViewId = viewState.id;
|
||||||
viewState.update(value, virtualBounds, flags);
|
viewState.update(value, virtualBounds, flags);
|
||||||
if (!isRequestSupportFillDialog(flags)) {
|
|
||||||
mSessionFlags.mFillDialogDisabled = true;
|
|
||||||
}
|
|
||||||
mPresentationStatsEventLogger.startNewEvent();
|
mPresentationStatsEventLogger.startNewEvent();
|
||||||
mPresentationStatsEventLogger.maybeSetAutofillServiceUid(getAutofillServiceUid());
|
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);
|
requestNewFillResponseLocked(viewState, ViewState.STATE_STARTED_SESSION, flags);
|
||||||
break;
|
break;
|
||||||
case ACTION_VALUE_CHANGED:
|
case ACTION_VALUE_CHANGED:
|
||||||
@@ -3014,6 +3033,8 @@ final class Session implements RemoteFillService.FillServiceCallbacks, ViewState
|
|||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
case ACTION_VIEW_ENTERED:
|
case ACTION_VIEW_ENTERED:
|
||||||
|
boolean startedEventWithoutFocus = mStartedLogEventWithoutFocus;
|
||||||
|
mStartedLogEventWithoutFocus = false;
|
||||||
if (sVerbose && virtualBounds != null) {
|
if (sVerbose && virtualBounds != null) {
|
||||||
Slog.v(TAG, "entered on virtual child " + id + ": " + virtualBounds);
|
Slog.v(TAG, "entered on virtual child " + id + ": " + virtualBounds);
|
||||||
}
|
}
|
||||||
@@ -3030,9 +3051,15 @@ final class Session implements RemoteFillService.FillServiceCallbacks, ViewState
|
|||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
mPresentationStatsEventLogger.maybeSetNoPresentationEventReason(
|
// Previously, fill request will only start whenever a view is entered.
|
||||||
NOT_SHOWN_REASON_VIEW_FOCUS_CHANGED);
|
// With Fill Dialog, request starts prior to view getting entered. So, we can't end
|
||||||
mPresentationStatsEventLogger.logAndEndEvent();
|
// 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) {
|
if ((flags & FLAG_MANUAL_REQUEST) == 0) {
|
||||||
// Not a manual request
|
// Not a manual request
|
||||||
@@ -3060,9 +3087,22 @@ final class Session implements RemoteFillService.FillServiceCallbacks, ViewState
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
mPresentationStatsEventLogger.startNewEvent();
|
if (!startedEventWithoutFocus) {
|
||||||
mPresentationStatsEventLogger.maybeSetAutofillServiceUid(getAutofillServiceUid());
|
mPresentationStatsEventLogger.startNewEvent();
|
||||||
|
mPresentationStatsEventLogger.maybeSetAutofillServiceUid(
|
||||||
|
getAutofillServiceUid());
|
||||||
|
}
|
||||||
if (requestNewFillResponseOnViewEnteredIfNecessaryLocked(id, viewState, flags)) {
|
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;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -3289,7 +3329,7 @@ final class Session implements RemoteFillService.FillServiceCallbacks, ViewState
|
|||||||
if (requestShowInlineSuggestionsLocked(response, filterText)) {
|
if (requestShowInlineSuggestionsLocked(response, filterText)) {
|
||||||
final ViewState currentView = mViewStates.get(mCurrentViewId);
|
final ViewState currentView = mViewStates.get(mCurrentViewId);
|
||||||
currentView.setState(ViewState.STATE_INLINE_SHOWN);
|
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.
|
// rather than here where framework sends back the response.
|
||||||
mService.logDatasetShown(id, mClientState, UI_TYPE_INLINE);
|
mService.logDatasetShown(id, mClientState, UI_TYPE_INLINE);
|
||||||
|
|
||||||
@@ -3310,7 +3350,6 @@ final class Session implements RemoteFillService.FillServiceCallbacks, ViewState
|
|||||||
|
|
||||||
synchronized (mLock) {
|
synchronized (mLock) {
|
||||||
mService.logDatasetShown(id, mClientState, UI_TYPE_MENU);
|
mService.logDatasetShown(id, mClientState, UI_TYPE_MENU);
|
||||||
|
|
||||||
mPresentationStatsEventLogger.maybeSetCountShown(
|
mPresentationStatsEventLogger.maybeSetCountShown(
|
||||||
response.getDatasets(), mCurrentViewId);
|
response.getDatasets(), mCurrentViewId);
|
||||||
mPresentationStatsEventLogger.maybeSetDisplayPresentationType(UI_TYPE_MENU);
|
mPresentationStatsEventLogger.maybeSetDisplayPresentationType(UI_TYPE_MENU);
|
||||||
|
|||||||
Reference in New Issue
Block a user