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