1 /* 2 * Copyright (C) 2023 The Android Open Source Project 3 * 4 * Licensed under the Apache License, Version 2.0 (the "License"); 5 * you may not use this file except in compliance with the License. 6 * You may obtain a copy of the License at 7 * 8 * http://www.apache.org/licenses/LICENSE-2.0 9 * 10 * Unless required by applicable law or agreed to in writing, software 11 * distributed under the License is distributed on an "AS IS" BASIS, 12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13 * See the License for the specific language governing permissions and 14 * limitations under the License. 15 */ 16 17 package com.android.server.autofill; 18 19 import static android.view.autofill.AutofillManager.COMMIT_REASON_UNKNOWN; 20 21 import static com.android.internal.util.FrameworkStatsLog.AUTOFILL_SESSION_COMMITTED; 22 import static com.android.server.autofill.Helper.sVerbose; 23 24 import android.util.Slog; 25 import android.view.autofill.AutofillManager.AutofillCommitReason; 26 27 import com.android.internal.util.FrameworkStatsLog; 28 29 import java.util.Optional; 30 31 /** 32 * Helper class to log Autofill session committed event stats. 33 */ 34 public final class SessionCommittedEventLogger { 35 private static final String TAG = "SessionCommittedEventLogger"; 36 37 private final int mSessionId; 38 private Optional<SessionCommittedEventInternal> mEventInternal; 39 SessionCommittedEventLogger(int sessionId)40 private SessionCommittedEventLogger(int sessionId) { 41 mSessionId = sessionId; 42 mEventInternal = Optional.of(new SessionCommittedEventInternal()); 43 } 44 45 /** 46 * A factory constructor to create SessionCommittedEventLogger. 47 */ forSessionId(int sessionId)48 public static SessionCommittedEventLogger forSessionId(int sessionId) { 49 return new SessionCommittedEventLogger(sessionId); 50 } 51 52 /** 53 * Set component_package_uid as long as mEventInternal presents. 54 */ maybeSetComponentPackageUid(int val)55 public void maybeSetComponentPackageUid(int val) { 56 mEventInternal.ifPresent(event -> { 57 event.mComponentPackageUid = val; 58 }); 59 } 60 61 /** 62 * Set request_count as long as mEventInternal presents. 63 */ maybeSetRequestCount(int val)64 public void maybeSetRequestCount(int val) { 65 mEventInternal.ifPresent(event -> { 66 event.mRequestCount = val; 67 }); 68 } 69 70 /** 71 * Set commit_reason as long as mEventInternal presents. 72 */ maybeSetCommitReason(@utofillCommitReason int val)73 public void maybeSetCommitReason(@AutofillCommitReason int val) { 74 mEventInternal.ifPresent(event -> { 75 event.mCommitReason = val; 76 }); 77 } 78 79 /** Set commit_reason if not already set */ maybeSetCommitReasonIfUnset(@utofillCommitReason int val)80 public void maybeSetCommitReasonIfUnset(@AutofillCommitReason int val) { 81 mEventInternal.ifPresent( 82 event -> { 83 if (event.mCommitReason != COMMIT_REASON_UNKNOWN) { 84 return; 85 } 86 event.mCommitReason = val; 87 }); 88 } 89 90 /** 91 * Set session_duration_millis as long as mEventInternal presents. 92 */ maybeSetSessionDurationMillis(long timestamp)93 public void maybeSetSessionDurationMillis(long timestamp) { 94 mEventInternal.ifPresent(event -> { 95 event.mSessionDurationMillis = timestamp; 96 }); 97 } 98 99 /** Set autofill_service_uid as long as mEventInternal presents. */ maybeSetAutofillServiceUid(int uid)100 public void maybeSetAutofillServiceUid(int uid) { 101 mEventInternal.ifPresent( 102 event -> { 103 event.mServiceUid = uid; 104 }); 105 } 106 107 /** 108 * Set how many save infos there are in current session as long as mEventInternal presents. 109 */ maybeSetSaveInfoCount(int saveInfoCount)110 public void maybeSetSaveInfoCount(int saveInfoCount) { 111 mEventInternal.ifPresent(event -> { 112 event.mSaveInfoCount = saveInfoCount; 113 }); 114 } 115 116 /** 117 * Set how many save data types there are in current session as long as mEventInternal presents. 118 */ maybeSetSaveDataTypeCount(int saveDataTypeCount)119 public void maybeSetSaveDataTypeCount(int saveDataTypeCount) { 120 mEventInternal.ifPresent(event -> { 121 event.mSaveDataTypeCount = saveDataTypeCount; 122 }); 123 } 124 125 /** 126 * Set whether last fill response in session has save info as long as mEventInternal presents. 127 */ maybeSetLastFillResponseHasSaveInfo(boolean lastFillResponseHasSaveInfo)128 public void maybeSetLastFillResponseHasSaveInfo(boolean lastFillResponseHasSaveInfo) { 129 mEventInternal.ifPresent(event -> { 130 event.mLastFillResponseHasSaveInfo = lastFillResponseHasSaveInfo; 131 }); 132 } 133 134 /** 135 * Log an AUTOFILL_SESSION_COMMITTED event. 136 */ logAndEndEvent()137 public void logAndEndEvent() { 138 if (!mEventInternal.isPresent()) { 139 Slog.w(TAG, "Shouldn't be logging AutofillSessionCommitted again for same session."); 140 return; 141 } 142 SessionCommittedEventInternal event = mEventInternal.get(); 143 if (sVerbose) { 144 Slog.v(TAG, "Log AutofillSessionCommitted:" 145 + " sessionId=" + mSessionId 146 + " mComponentPackageUid=" + event.mComponentPackageUid 147 + " mRequestCount=" + event.mRequestCount 148 + " mCommitReason=" + event.mCommitReason 149 + " mSessionDurationMillis=" + event.mSessionDurationMillis 150 + " mServiceUid=" + event.mServiceUid 151 + " mSaveInfoCount=" + event.mSaveInfoCount 152 + " mSaveDataTypeCount=" + event.mSaveDataTypeCount 153 + " mLastFillResponseHasSaveInfo=" + event.mLastFillResponseHasSaveInfo); 154 } 155 FrameworkStatsLog.write( 156 AUTOFILL_SESSION_COMMITTED, 157 mSessionId, 158 event.mComponentPackageUid, 159 event.mRequestCount, 160 event.mCommitReason, 161 event.mSessionDurationMillis, 162 event.mServiceUid, 163 event.mSaveInfoCount, 164 event.mSaveDataTypeCount, 165 event.mLastFillResponseHasSaveInfo); 166 mEventInternal = Optional.empty(); 167 } 168 169 private static final class SessionCommittedEventInternal { 170 int mComponentPackageUid = -1; 171 int mRequestCount = 0; 172 int mCommitReason = COMMIT_REASON_UNKNOWN; 173 long mSessionDurationMillis = 0; 174 int mSaveInfoCount = -1; 175 int mSaveDataTypeCount = -1; 176 boolean mLastFillResponseHasSaveInfo = false; 177 int mServiceUid = -1; 178 SessionCommittedEventInternal()179 SessionCommittedEventInternal() { 180 } 181 } 182 } 183