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