• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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