[Expand AutofillPresentationEvent] : Log autofill service and IME uid
Change previously reviewed at ag/19802310, however, it didn't have the same change id as the master one, so grouping of changes would be lost. Hence, created this change. BUG: 243815037 BUG: 243719602 Test: Manual Testing with Sample App. Tested inline suggestions with AwG wit Spotify app force autofill. CTS tests to follow in b/244449560. Change-Id: I58d5b418f5f11e4aaf81ba1153ec04435a4b8205 Merged-In: I58d5b418f5f11e4aaf81ba1153ec04435a4b8205
This commit is contained in:
@@ -41,7 +41,12 @@ import static com.android.server.autofill.Helper.sVerbose;
|
||||
|
||||
import android.annotation.IntDef;
|
||||
import android.annotation.Nullable;
|
||||
import android.content.ComponentName;
|
||||
import android.content.Context;
|
||||
import android.content.pm.PackageManager;
|
||||
import android.provider.Settings;
|
||||
import android.service.autofill.Dataset;
|
||||
import android.text.TextUtils;
|
||||
import android.util.Slog;
|
||||
import android.view.autofill.AutofillId;
|
||||
import android.view.autofill.AutofillManager;
|
||||
@@ -61,7 +66,7 @@ public final class PresentationStatsEventLogger {
|
||||
* Reasons why presentation was not shown. These are wrappers around
|
||||
* {@link com.android.os.AtomsProto.AutofillPresentationEventReported.PresentationEventResult}.
|
||||
*/
|
||||
@IntDef(prefix = { "NOT_SHOWN_REASON" }, value = {
|
||||
@IntDef(prefix = {"NOT_SHOWN_REASON"}, value = {
|
||||
NOT_SHOWN_REASON_ANY_SHOWN,
|
||||
NOT_SHOWN_REASON_VIEW_FOCUS_CHANGED,
|
||||
NOT_SHOWN_REASON_VIEW_CHANGED,
|
||||
@@ -72,6 +77,7 @@ public final class PresentationStatsEventLogger {
|
||||
})
|
||||
@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;
|
||||
@@ -172,6 +178,45 @@ public final class PresentationStatsEventLogger {
|
||||
});
|
||||
}
|
||||
|
||||
public void maybeSetInlinePresentationAndSuggestionHostUid(Context context, int userId) {
|
||||
mEventInternal.ifPresent(event -> {
|
||||
event.mDisplayPresentationType = UI_TYPE_INLINE;
|
||||
String imeString = Settings.Secure.getStringForUser(context.getContentResolver(),
|
||||
Settings.Secure.DEFAULT_INPUT_METHOD, userId);
|
||||
if (TextUtils.isEmpty(imeString)) {
|
||||
Slog.w(TAG, "No default IME found");
|
||||
return;
|
||||
}
|
||||
ComponentName imeComponent = ComponentName.unflattenFromString(imeString);
|
||||
if (imeComponent == null) {
|
||||
Slog.w(TAG, "No default IME found");
|
||||
return;
|
||||
}
|
||||
int imeUid;
|
||||
String packageName = imeComponent.getPackageName();
|
||||
try {
|
||||
imeUid = context.getPackageManager().getApplicationInfoAsUser(packageName,
|
||||
PackageManager.ApplicationInfoFlags.of(0), userId).uid;
|
||||
} catch (PackageManager.NameNotFoundException e) {
|
||||
Slog.w(TAG, "Couldn't find packageName: " + packageName);
|
||||
return;
|
||||
}
|
||||
event.mInlineSuggestionHostUid = imeUid;
|
||||
});
|
||||
}
|
||||
|
||||
public void maybeSetAutofillServiceUid(int uid) {
|
||||
mEventInternal.ifPresent(event -> {
|
||||
event.mAutofillServiceUid = uid;
|
||||
});
|
||||
}
|
||||
|
||||
public void maybeSetIsNewRequest(boolean isRequestTriggered) {
|
||||
mEventInternal.ifPresent(event -> {
|
||||
event.mIsRequestTriggered = isRequestTriggered;
|
||||
});
|
||||
}
|
||||
|
||||
public void logAndEndEvent() {
|
||||
if (!mEventInternal.isPresent()) {
|
||||
Slog.w(TAG, "Shouldn't be logging AutofillPresentationEventReported again for same "
|
||||
@@ -190,7 +235,10 @@ public final class PresentationStatsEventLogger {
|
||||
+ " mCountNotShownImePresentationNotDrawn="
|
||||
+ event.mCountNotShownImePresentationNotDrawn
|
||||
+ " mCountNotShownImeUserNotSeen=" + event.mCountNotShownImeUserNotSeen
|
||||
+ " mDisplayPresentationType=" + event.mDisplayPresentationType);
|
||||
+ " mDisplayPresentationType=" + event.mDisplayPresentationType
|
||||
+ " mAutofillServiceUid=" + event.mAutofillServiceUid
|
||||
+ " mInlineSuggestionHostUid=" + event.mInlineSuggestionHostUid
|
||||
+ " mIsRequestTriggered=" + event.mIsRequestTriggered);
|
||||
}
|
||||
|
||||
// TODO(b/234185326): Distinguish empty responses from other no presentation reasons.
|
||||
@@ -208,7 +256,10 @@ public final class PresentationStatsEventLogger {
|
||||
event.mCountFilteredUserTyping,
|
||||
event.mCountNotShownImePresentationNotDrawn,
|
||||
event.mCountNotShownImeUserNotSeen,
|
||||
event.mDisplayPresentationType);
|
||||
event.mDisplayPresentationType,
|
||||
event.mAutofillServiceUid,
|
||||
event.mInlineSuggestionHostUid,
|
||||
event.mIsRequestTriggered);
|
||||
mEventInternal = Optional.empty();
|
||||
}
|
||||
|
||||
@@ -222,6 +273,9 @@ public final class PresentationStatsEventLogger {
|
||||
int mCountNotShownImePresentationNotDrawn;
|
||||
int mCountNotShownImeUserNotSeen;
|
||||
int mDisplayPresentationType = AUTOFILL_PRESENTATION_EVENT_REPORTED__DISPLAY_PRESENTATION_TYPE__UNKNOWN_AUTOFILL_DISPLAY_PRESENTATION_TYPE;
|
||||
int mAutofillServiceUid = -1;
|
||||
int mInlineSuggestionHostUid = -1;
|
||||
boolean mIsRequestTriggered;
|
||||
|
||||
PresentationStatsEventInternal() {}
|
||||
}
|
||||
|
||||
@@ -66,6 +66,7 @@ import android.content.Context;
|
||||
import android.content.Intent;
|
||||
import android.content.IntentFilter;
|
||||
import android.content.IntentSender;
|
||||
import android.content.pm.ServiceInfo;
|
||||
import android.graphics.Bitmap;
|
||||
import android.graphics.Rect;
|
||||
import android.graphics.drawable.Drawable;
|
||||
@@ -77,6 +78,7 @@ import android.os.Handler;
|
||||
import android.os.IBinder;
|
||||
import android.os.IBinder.DeathRecipient;
|
||||
import android.os.Parcelable;
|
||||
import android.os.Process;
|
||||
import android.os.RemoteCallback;
|
||||
import android.os.RemoteException;
|
||||
import android.os.SystemClock;
|
||||
@@ -2968,6 +2970,7 @@ final class Session implements RemoteFillService.FillServiceCallbacks, ViewState
|
||||
mSessionFlags.mFillDialogDisabled = true;
|
||||
}
|
||||
mPresentationStatsEventLogger.startNewEvent();
|
||||
mPresentationStatsEventLogger.maybeSetAutofillServiceUid(getAutofillServiceUid());
|
||||
requestNewFillResponseLocked(viewState, ViewState.STATE_STARTED_SESSION, flags);
|
||||
break;
|
||||
case ACTION_VALUE_CHANGED:
|
||||
@@ -3057,6 +3060,7 @@ final class Session implements RemoteFillService.FillServiceCallbacks, ViewState
|
||||
}
|
||||
|
||||
mPresentationStatsEventLogger.startNewEvent();
|
||||
mPresentationStatsEventLogger.maybeSetAutofillServiceUid(getAutofillServiceUid());
|
||||
if (requestNewFillResponseOnViewEnteredIfNecessaryLocked(id, viewState, flags)) {
|
||||
return;
|
||||
}
|
||||
@@ -3292,7 +3296,8 @@ final class Session implements RemoteFillService.FillServiceCallbacks, ViewState
|
||||
// shown, inflated, and filtered.
|
||||
mPresentationStatsEventLogger.maybeSetCountShown(
|
||||
response.getDatasets(), mCurrentViewId);
|
||||
mPresentationStatsEventLogger.maybeSetDisplayPresentationType(UI_TYPE_INLINE);
|
||||
mPresentationStatsEventLogger.maybeSetInlinePresentationAndSuggestionHostUid(
|
||||
mContext, userId);
|
||||
return;
|
||||
}
|
||||
}
|
||||
@@ -4639,4 +4644,9 @@ final class Session implements RemoteFillService.FillServiceCallbacks, ViewState
|
||||
return "UNKNOWN_SESSION_STATE_" + sessionState;
|
||||
}
|
||||
}
|
||||
|
||||
private int getAutofillServiceUid() {
|
||||
ServiceInfo serviceInfo = mService.getServiceInfo();
|
||||
return serviceInfo == null ? Process.INVALID_UID : serviceInfo.applicationInfo.uid;
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user