1 /* 2 * Copyright (C) 2022 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.adservices.download; 18 19 import com.android.adservices.service.stats.AdServicesStatsLog; 20 21 import com.google.android.libraries.mobiledatadownload.Logger; 22 import com.google.android.libraries.mobiledatadownload.internal.logging.LogUtil; 23 import com.google.mobiledatadownload.LogEnumsProto.MddClientEvent.Code; 24 import com.google.mobiledatadownload.LogProto; 25 import com.google.mobiledatadownload.LogProto.DataDownloadFileGroupStats; 26 import com.google.mobiledatadownload.LogProto.MddDownloadResultLog; 27 import com.google.mobiledatadownload.LogProto.MddFileGroupStatus; 28 import com.google.mobiledatadownload.LogProto.MddLogData; 29 import com.google.mobiledatadownload.MobileDataDownloadFileGroupStats; 30 import com.google.mobiledatadownload.MobileDataDownloadFileGroupStorageStats; 31 import com.google.mobiledatadownload.MobileDataDownloadStorageStats; 32 import com.google.protobuf.MessageLite; 33 34 /** A MDD {@link Logger} which uses {@link AdServicesStatsLog} to write logs. */ 35 public class MddLogger implements Logger { 36 private static final String TAG = "AdServicesLogger"; 37 38 @Override log(MessageLite log, int eventCode)39 public void log(MessageLite log, int eventCode) { 40 41 switch (Code.forNumber(eventCode)) { 42 case DATA_DOWNLOAD_FILE_GROUP_STATUS: 43 logFileGroupStatus(log); 44 break; 45 case DATA_DOWNLOAD_RESULT_LOG: 46 logDownloadResult(log); 47 break; 48 case DATA_DOWNLOAD_STORAGE_STATS: 49 logStorageStats(log); 50 break; 51 default: 52 LogUtil.d("%s: Received unsupported event code %d, skipping log", TAG, eventCode); 53 break; 54 } 55 } 56 57 /** Helper method to handle logging File Group Status events. */ logFileGroupStatus(MessageLite log)58 private void logFileGroupStatus(MessageLite log) { 59 // NOTE: log will always be MddLogData 60 MddLogData logData = (MddLogData) log; 61 DataDownloadFileGroupStats mddGroupStats = logData.getDataDownloadFileGroupStats(); 62 MddFileGroupStatus mddFileGroupStatus = logData.getMddFileGroupStatus(); 63 MobileDataDownloadFileGroupStats groupStats = 64 buildGroupStats((int) logData.getSamplingInterval(), mddGroupStats); 65 66 AdServicesStatsLog.write( 67 AdServicesStatsLog.MOBILE_DATA_DOWNLOAD_FILE_GROUP_STATUS_REPORTED, 68 /* file_group_download_status = */ mddFileGroupStatus 69 .getFileGroupDownloadStatus() 70 .getNumber(), 71 /* group_added_timestamp = */ mddFileGroupStatus.getGroupAddedTimestampInSeconds(), 72 /* group_downloaded_timestamp = */ mddFileGroupStatus 73 .getGroupDownloadedTimestampInSeconds(), 74 /* file_group_stats = */ groupStats.toByteArray(), 75 /* days_since_last_log = */ mddFileGroupStatus.getDaysSinceLastLog()); 76 } 77 logDownloadResult(MessageLite log)78 private void logDownloadResult(MessageLite log) { 79 MddLogData logData = (MddLogData) log; 80 MddDownloadResultLog mddDownloadResult = logData.getMddDownloadResultLog(); 81 MobileDataDownloadFileGroupStats groupStats = 82 buildGroupStats( 83 (int) logData.getSamplingInterval(), 84 mddDownloadResult.getDataDownloadFileGroupStats()); 85 AdServicesStatsLog.write( 86 AdServicesStatsLog.MOBILE_DATA_DOWNLOAD_DOWNLOAD_RESULT_REPORTED, 87 /* download_result = */ mddDownloadResult.getResult().getNumber(), 88 /* file_group_stats = */ groupStats.toByteArray()); 89 } 90 logStorageStats(MessageLite log)91 private void logStorageStats(MessageLite log) { 92 MddLogData logData = (MddLogData) log; 93 LogProto.MddStorageStats mddStorageStats = logData.getMddStorageStats(); 94 MobileDataDownloadStorageStats.Builder storageStats = 95 MobileDataDownloadStorageStats.newBuilder(); 96 for (int i = 0; i < mddStorageStats.getDataDownloadFileGroupStatsCount(); i++) { 97 storageStats.addMobileDataDownloadFileGroupStorageStats( 98 MobileDataDownloadFileGroupStorageStats.newBuilder() 99 .setTotalBytesUsed(mddStorageStats.getTotalBytesUsed(i)) 100 .setTotalInlineBytesUsed(mddStorageStats.getTotalInlineBytesUsed(i)) 101 .setDownloadedGroupBytesUsed( 102 mddStorageStats.getDownloadedGroupBytesUsed(i)) 103 .setFileGroupStats( 104 buildGroupStats( 105 (int) logData.getSamplingInterval(), 106 mddStorageStats.getDataDownloadFileGroupStats(i))) 107 .build()); 108 } 109 AdServicesStatsLog.write( 110 AdServicesStatsLog.MOBILE_DATA_DOWNLOAD_FILE_GROUP_STORAGE_STATS_REPORTED, 111 storageStats.build().toByteArray(), 112 mddStorageStats.getTotalMddBytesUsed(), 113 mddStorageStats.getTotalMddDirectoryBytesUsed()); 114 } 115 buildGroupStats( int samplingInterval, DataDownloadFileGroupStats mddGroupStats)116 private static MobileDataDownloadFileGroupStats buildGroupStats( 117 int samplingInterval, DataDownloadFileGroupStats mddGroupStats) { 118 return MobileDataDownloadFileGroupStats.newBuilder() 119 .setSamplingInterval(samplingInterval) 120 .setFileGroupName(mddGroupStats.getFileGroupName()) 121 .setVariantId(mddGroupStats.getVariantId()) 122 .setBuildId(mddGroupStats.getBuildId()) 123 .setFileCount(mddGroupStats.getFileCount()) 124 .setHasAccount(mddGroupStats.getHasAccount()) 125 .build(); 126 } 127 } 128