• 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.devicelockcontroller.stats;
18 
19 import static com.android.devicelockcontroller.DevicelockStatsLog.CHECK_IN_RETRY_REPORTED__REASON__COUNFIGURATION_UNAVAILABLE;
20 import static com.android.devicelockcontroller.DevicelockStatsLog.CHECK_IN_RETRY_REPORTED__REASON__NETWORK_TIME_UNAVAILABLE;
21 import static com.android.devicelockcontroller.DevicelockStatsLog.CHECK_IN_RETRY_REPORTED__REASON__RESPONSE_UNSPECIFIED;
22 import static com.android.devicelockcontroller.DevicelockStatsLog.CHECK_IN_RETRY_REPORTED__REASON__RPC_FAILURE;
23 import static com.android.devicelockcontroller.DevicelockStatsLog.DEVICE_LOCK_CHECK_IN_REQUEST_REPORTED__TYPE__GET_DEVICE_CHECK_IN_STATUS;
24 import static com.android.devicelockcontroller.DevicelockStatsLog.DEVICE_LOCK_CHECK_IN_REQUEST_REPORTED__TYPE__IS_DEVICE_IN_APPROVED_COUNTRY;
25 import static com.android.devicelockcontroller.DevicelockStatsLog.DEVICE_LOCK_CHECK_IN_REQUEST_REPORTED__TYPE__PAUSE_DEVICE_PROVISIONING;
26 import static com.android.devicelockcontroller.DevicelockStatsLog.DEVICE_LOCK_CHECK_IN_REQUEST_REPORTED__TYPE__REPORT_DEVICE_PROVISION_STATE;
27 import static com.android.devicelockcontroller.DevicelockStatsLog.DEVICE_LOCK_CHECK_IN_RETRY_REPORTED;
28 import static com.android.devicelockcontroller.DevicelockStatsLog.DEVICE_LOCK_KIOSK_APP_REQUEST_REPORTED;
29 import static com.android.devicelockcontroller.DevicelockStatsLog.DEVICE_LOCK_LOCK_UNLOCK_DEVICE_FAILURE_REPORTED;
30 import static com.android.devicelockcontroller.DevicelockStatsLog.DEVICE_LOCK_PROVISIONING_COMPLETE_REPORTED;
31 import static com.android.devicelockcontroller.DevicelockStatsLog.DEVICE_LOCK_PROVISION_FAILURE_REPORTED;
32 import static com.android.devicelockcontroller.DevicelockStatsLog.LOCK_UNLOCK_DEVICE_FAILURE_REPORTED__STATE_POST_COMMAND__CLEARED;
33 import static com.android.devicelockcontroller.DevicelockStatsLog.LOCK_UNLOCK_DEVICE_FAILURE_REPORTED__STATE_POST_COMMAND__LOCKED;
34 import static com.android.devicelockcontroller.DevicelockStatsLog.LOCK_UNLOCK_DEVICE_FAILURE_REPORTED__STATE_POST_COMMAND__UNDEFINED;
35 import static com.android.devicelockcontroller.DevicelockStatsLog.LOCK_UNLOCK_DEVICE_FAILURE_REPORTED__STATE_POST_COMMAND__UNLOCKED;
36 import static com.android.devicelockcontroller.DevicelockStatsLog.PROVISION_FAILURE_REPORTED__REASON__COUNTRY_INFO_UNAVAILABLE;
37 import static com.android.devicelockcontroller.DevicelockStatsLog.PROVISION_FAILURE_REPORTED__REASON__NOT_IN_ELIGIBLE_COUNTRY;
38 import static com.android.devicelockcontroller.DevicelockStatsLog.PROVISION_FAILURE_REPORTED__REASON__PLAY_INSTALLATION_FAILED;
39 import static com.android.devicelockcontroller.DevicelockStatsLog.PROVISION_FAILURE_REPORTED__REASON__PLAY_TASK_UNAVAILABLE;
40 import static com.android.devicelockcontroller.DevicelockStatsLog.PROVISION_FAILURE_REPORTED__REASON__POLICY_ENFORCEMENT_FAILED;
41 import static com.android.devicelockcontroller.DevicelockStatsLog.PROVISION_FAILURE_REPORTED__REASON__UNKNOWN;
42 import static com.android.devicelockcontroller.stats.StatsLogger.CheckInRetryReason.CONFIG_UNAVAILABLE;
43 import static com.android.devicelockcontroller.stats.StatsLogger.CheckInRetryReason.NETWORK_TIME_UNAVAILABLE;
44 import static com.android.devicelockcontroller.stats.StatsLogger.CheckInRetryReason.RESPONSE_UNSPECIFIED;
45 import static com.android.devicelockcontroller.stats.StatsLogger.CheckInRetryReason.RPC_FAILURE;
46 import static com.android.devicelockcontroller.stats.StatsLogger.ProvisionFailureReasonStats.COUNTRY_INFO_UNAVAILABLE;
47 import static com.android.devicelockcontroller.stats.StatsLogger.ProvisionFailureReasonStats.NOT_IN_ELIGIBLE_COUNTRY;
48 import static com.android.devicelockcontroller.stats.StatsLogger.ProvisionFailureReasonStats.PLAY_INSTALLATION_FAILED;
49 import static com.android.devicelockcontroller.stats.StatsLogger.ProvisionFailureReasonStats.PLAY_TASK_UNAVAILABLE;
50 import static com.android.devicelockcontroller.stats.StatsLogger.ProvisionFailureReasonStats.POLICY_ENFORCEMENT_FAILED;
51 import static com.android.devicelockcontroller.stats.StatsLogger.ProvisionFailureReasonStats.UNKNOWN;
52 
53 import com.android.devicelockcontroller.DevicelockStatsLog;
54 import com.android.modules.expresslog.Counter;
55 
56 import java.util.concurrent.TimeUnit;
57 
58 public final class StatsLoggerImpl implements StatsLogger{
59     // The Telemetry Express metric ID for the counter of device reset due to failure of mandatory
60     // provisioning. As defined in
61     // platform/frameworks/proto_logging/stats/express/catalog/device_lock.cfg
62     static final String TEX_ID_DEVICE_RESET_PROVISION_MANDATORY =
63             "device_lock.value_resets_unsuccessful_provisioning_mandatory";
64     // The Telemetry Express metric ID for the counter of device reset due to failure of deferred
65     // provisioning. As defined in
66     // platform/frameworks/proto_logging/stats/express/catalog/device_lock.cfg
67     static final String TEX_ID_DEVICE_RESET_PROVISION_DEFERRED =
68             "device_lock.value_resets_unsuccessful_provisioning_deferred";
69     // The Telemetry Express metric ID for the counter of a successful check in request. As
70     // defined in platform/frameworks/proto_logging/stats/express/catalog/device_lock.cfg
71     static final String TEX_ID_SUCCESSFUL_CHECK_IN_RESPONSE_COUNT =
72             "device_lock.value_successful_check_in_response_count";
73     // The Telemetry Express metric ID for the counter of a successful provisioning. As
74     // defined in platform/frameworks/proto_logging/stats/express/catalog/device_lock.cfg
75     static final String TEX_ID_SUCCESSFUL_PROVISIONING_COUNT =
76             "device_lock.value_successful_provisioning_count";
77     // The Telemetry Express metric ID for the counter of a successful locking. As
78     // defined in platform/frameworks/proto_logging/stats/express/catalog/device_lock.cfg
79     static final String TEX_ID_SUCCESSFUL_LOCKING_COUNT =
80             "device_lock.value_successful_locking_count";
81     // The Telemetry Express metric ID for the counter of a successful unlocking. As
82     // defined in platform/frameworks/proto_logging/stats/express/catalog/device_lock.cfg
83     static final String TEX_ID_SUCCESSFUL_UNLOCKING_COUNT =
84             "device_lock.value_successful_unlocking_count";
85     private static final String TAG = "StatsLogger";
86 
87     @Override
logGetDeviceCheckInStatus()88     public void logGetDeviceCheckInStatus() {
89         DevicelockStatsLog.write(DevicelockStatsLog.DEVICE_LOCK_CHECK_IN_REQUEST_REPORTED,
90                 DEVICE_LOCK_CHECK_IN_REQUEST_REPORTED__TYPE__GET_DEVICE_CHECK_IN_STATUS);
91     }
92 
93     @Override
logPauseDeviceProvisioning()94     public void logPauseDeviceProvisioning() {
95         DevicelockStatsLog.write(DevicelockStatsLog.DEVICE_LOCK_CHECK_IN_REQUEST_REPORTED,
96                 DEVICE_LOCK_CHECK_IN_REQUEST_REPORTED__TYPE__PAUSE_DEVICE_PROVISIONING);
97     }
98 
99     @Override
logReportDeviceProvisionState()100     public void logReportDeviceProvisionState() {
101         DevicelockStatsLog.write(DevicelockStatsLog.DEVICE_LOCK_CHECK_IN_REQUEST_REPORTED,
102                 DEVICE_LOCK_CHECK_IN_REQUEST_REPORTED__TYPE__REPORT_DEVICE_PROVISION_STATE);
103     }
104 
105     @Override
logIsDeviceInApprovedCountry()106     public void logIsDeviceInApprovedCountry() {
107         DevicelockStatsLog.write(DevicelockStatsLog.DEVICE_LOCK_CHECK_IN_REQUEST_REPORTED,
108                 DEVICE_LOCK_CHECK_IN_REQUEST_REPORTED__TYPE__IS_DEVICE_IN_APPROVED_COUNTRY);
109     }
110 
111     @Override
logKioskAppRequest(int uid)112     public void logKioskAppRequest(int uid) {
113         DevicelockStatsLog.write(DEVICE_LOCK_KIOSK_APP_REQUEST_REPORTED, uid);
114     }
115 
116     @Override
logProvisioningComplete(long timeSpentInProvisioningMillis)117     public void logProvisioningComplete(long timeSpentInProvisioningMillis) {
118         DevicelockStatsLog.write(DEVICE_LOCK_PROVISIONING_COMPLETE_REPORTED,
119                 TimeUnit.MILLISECONDS.toSeconds(timeSpentInProvisioningMillis));
120     }
121 
122     @Override
logDeviceReset(boolean isProvisioningMandatory)123     public void logDeviceReset(boolean isProvisioningMandatory) {
124         if (isProvisioningMandatory) {
125             Counter.logIncrement(TEX_ID_DEVICE_RESET_PROVISION_MANDATORY);
126         } else {
127             Counter.logIncrement(TEX_ID_DEVICE_RESET_PROVISION_DEFERRED);
128         }
129     }
130 
131     @Override
logSuccessfulCheckIn()132     public void logSuccessfulCheckIn() {
133         Counter.logIncrement(TEX_ID_SUCCESSFUL_CHECK_IN_RESPONSE_COUNT);
134     }
135 
136     @Override
logSuccessfulProvisioning()137     public void logSuccessfulProvisioning() {
138         Counter.logIncrement(TEX_ID_SUCCESSFUL_PROVISIONING_COUNT);
139     }
140 
141     @Override
logCheckInRetry(@heckInRetryReason int reason)142     public void logCheckInRetry(@CheckInRetryReason int reason) {
143         int checkInRetryReason;
144         switch (reason) {
145             case CONFIG_UNAVAILABLE -> checkInRetryReason =
146                     CHECK_IN_RETRY_REPORTED__REASON__COUNFIGURATION_UNAVAILABLE;
147             case NETWORK_TIME_UNAVAILABLE -> checkInRetryReason =
148                     CHECK_IN_RETRY_REPORTED__REASON__NETWORK_TIME_UNAVAILABLE;
149             case RESPONSE_UNSPECIFIED -> checkInRetryReason =
150                     CHECK_IN_RETRY_REPORTED__REASON__RESPONSE_UNSPECIFIED;
151             case RPC_FAILURE -> checkInRetryReason = CHECK_IN_RETRY_REPORTED__REASON__RPC_FAILURE;
152             default -> checkInRetryReason = CHECK_IN_RETRY_REPORTED__REASON__RESPONSE_UNSPECIFIED;
153         }
154         DevicelockStatsLog.write(DEVICE_LOCK_CHECK_IN_RETRY_REPORTED, checkInRetryReason);
155     }
156 
157     @Override
logProvisionFailure(@rovisionFailureReasonStats int reason)158     public void logProvisionFailure(@ProvisionFailureReasonStats int reason) {
159         int provisionFailureReason;
160         switch (reason) {
161             case POLICY_ENFORCEMENT_FAILED -> provisionFailureReason =
162                     PROVISION_FAILURE_REPORTED__REASON__POLICY_ENFORCEMENT_FAILED;
163             case PLAY_TASK_UNAVAILABLE -> provisionFailureReason =
164                     PROVISION_FAILURE_REPORTED__REASON__PLAY_TASK_UNAVAILABLE;
165             case NOT_IN_ELIGIBLE_COUNTRY -> provisionFailureReason =
166                     PROVISION_FAILURE_REPORTED__REASON__NOT_IN_ELIGIBLE_COUNTRY;
167             case COUNTRY_INFO_UNAVAILABLE -> provisionFailureReason =
168                     PROVISION_FAILURE_REPORTED__REASON__COUNTRY_INFO_UNAVAILABLE;
169             case PLAY_INSTALLATION_FAILED -> provisionFailureReason =
170                     PROVISION_FAILURE_REPORTED__REASON__PLAY_INSTALLATION_FAILED;
171             case UNKNOWN -> provisionFailureReason = PROVISION_FAILURE_REPORTED__REASON__UNKNOWN;
172             default -> provisionFailureReason = PROVISION_FAILURE_REPORTED__REASON__UNKNOWN;
173         }
174         DevicelockStatsLog.write(DEVICE_LOCK_PROVISION_FAILURE_REPORTED, provisionFailureReason);
175     }
176 
177     @Override
logLockDeviceFailure(@eviceStateStats int deviceStatePostCommand)178     public void logLockDeviceFailure(@DeviceStateStats int deviceStatePostCommand) {
179         DevicelockStatsLog.write(DEVICE_LOCK_LOCK_UNLOCK_DEVICE_FAILURE_REPORTED,
180                 /* arg1 = (isLock)*/ true,
181                 getStatePostCommandForLockUnlockDeviceFailure(deviceStatePostCommand));
182     }
183 
184     @Override
logUnlockDeviceFailure(@eviceStateStats int deviceStatePostCommand)185     public void logUnlockDeviceFailure(@DeviceStateStats int deviceStatePostCommand) {
186         DevicelockStatsLog.write(DEVICE_LOCK_LOCK_UNLOCK_DEVICE_FAILURE_REPORTED,
187                 /* arg1 = (isLock)*/ false,
188                 getStatePostCommandForLockUnlockDeviceFailure(deviceStatePostCommand));
189     }
190 
getStatePostCommandForLockUnlockDeviceFailure(@eviceStateStats int deviceState)191     private int getStatePostCommandForLockUnlockDeviceFailure(@DeviceStateStats int deviceState) {
192         switch (deviceState) {
193             case DeviceStateStats.UNDEFINED -> {
194                 return LOCK_UNLOCK_DEVICE_FAILURE_REPORTED__STATE_POST_COMMAND__UNDEFINED;
195             }
196             case DeviceStateStats.UNLOCKED -> {
197                 return LOCK_UNLOCK_DEVICE_FAILURE_REPORTED__STATE_POST_COMMAND__UNLOCKED;
198             }
199             case DeviceStateStats.LOCKED -> {
200                 return LOCK_UNLOCK_DEVICE_FAILURE_REPORTED__STATE_POST_COMMAND__LOCKED;
201             }
202             case DeviceStateStats.CLEARED -> {
203                 return LOCK_UNLOCK_DEVICE_FAILURE_REPORTED__STATE_POST_COMMAND__CLEARED;
204             }
205             default -> {
206                 return LOCK_UNLOCK_DEVICE_FAILURE_REPORTED__STATE_POST_COMMAND__UNDEFINED;
207             }
208         }
209     }
210 
211     @Override
logSuccessfulLockingDevice()212     public void logSuccessfulLockingDevice() {
213         Counter.logIncrement(TEX_ID_SUCCESSFUL_LOCKING_COUNT);
214     }
215 
216     @Override
logSuccessfulUnlockingDevice()217     public void logSuccessfulUnlockingDevice() {
218         Counter.logIncrement(TEX_ID_SUCCESSFUL_UNLOCKING_COUNT);
219     }
220 }
221