| /* |
| * Copyright 2022 Google LLC |
| * |
| * Licensed under the Apache License, Version 2.0 (the "License"); |
| * you may not use this file except in compliance with the License. |
| * You may obtain a copy of the License at |
| * |
| * http://www.apache.org/licenses/LICENSE-2.0 |
| * |
| * Unless required by applicable law or agreed to in writing, software |
| * distributed under the License is distributed on an "AS IS" BASIS, |
| * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. |
| * See the License for the specific language governing permissions and |
| * limitations under the License. |
| */ |
| package com.google.android.libraries.mobiledatadownload.internal.logging; |
| |
| import androidx.annotation.VisibleForTesting; |
| import com.google.errorprone.annotations.CheckReturnValue; |
| import com.google.mobiledatadownload.internal.MetadataProto.DataFileGroupBookkeeping; |
| import com.google.mobiledatadownload.internal.MetadataProto.DataFileGroupInternal; |
| |
| /** Helper logger to log the events associated with an MDD Download or Import operation. */ |
| @CheckReturnValue |
| public final class DownloadStateLogger { |
| private static final String TAG = "FileGroupStatusLogger"; |
| |
| @VisibleForTesting |
| enum Operation { |
| DOWNLOAD, |
| IMPORT, |
| }; |
| |
| private final EventLogger eventLogger; |
| private final Operation operation; |
| |
| private DownloadStateLogger(EventLogger eventLogger, Operation operation) { |
| this.eventLogger = eventLogger; |
| this.operation = operation; |
| } |
| |
| public static DownloadStateLogger forDownload(EventLogger eventLogger) { |
| return new DownloadStateLogger(eventLogger, Operation.DOWNLOAD); |
| } |
| |
| public static DownloadStateLogger forImport(EventLogger eventLogger) { |
| return new DownloadStateLogger(eventLogger, Operation.IMPORT); |
| } |
| |
| public void logStarted(DataFileGroupInternal fileGroup) { |
| switch (operation) { |
| case DOWNLOAD: |
| logEventWithDataFileGroup(0, fileGroup); |
| break; |
| case IMPORT: |
| logEventWithDataFileGroup(0, fileGroup); |
| break; |
| } |
| } |
| |
| public void logPending(DataFileGroupInternal fileGroup) { |
| switch (operation) { |
| case DOWNLOAD: |
| logEventWithDataFileGroup(0, fileGroup); |
| break; |
| case IMPORT: |
| logEventWithDataFileGroup(0, fileGroup); |
| break; |
| } |
| } |
| |
| public void logFailed(DataFileGroupInternal fileGroup) { |
| switch (operation) { |
| case DOWNLOAD: |
| logEventWithDataFileGroup(0, fileGroup); |
| break; |
| case IMPORT: |
| logEventWithDataFileGroup(0, fileGroup); |
| break; |
| } |
| } |
| |
| public void logComplete(DataFileGroupInternal fileGroup) { |
| switch (operation) { |
| case DOWNLOAD: |
| logEventWithDataFileGroup(0, fileGroup); |
| logDownloadLatency(fileGroup); |
| break; |
| case IMPORT: |
| logEventWithDataFileGroup(0, fileGroup); |
| break; |
| } |
| } |
| |
| private void logDownloadLatency(DataFileGroupInternal fileGroup) { |
| // This operation only makes sense for download operation, exit early if it's not the download |
| // operation. |
| if (operation != Operation.DOWNLOAD) { |
| return; |
| } |
| |
| Void fileGroupDetails = null; |
| |
| DataFileGroupBookkeeping bookkeeping = fileGroup.getBookkeeping(); |
| long newFilesReceivedTimestamp = bookkeeping.getGroupNewFilesReceivedTimestamp(); |
| long downloadStartedTimestamp = bookkeeping.getGroupDownloadStartedTimestampInMillis(); |
| long downloadCompleteTimestamp = bookkeeping.getGroupDownloadedTimestampInMillis(); |
| |
| Void downloadLatency = null; |
| |
| eventLogger.logMddDownloadLatency(fileGroupDetails, downloadLatency); |
| } |
| |
| private void logEventWithDataFileGroup(int code, DataFileGroupInternal fileGroup) { |
| eventLogger.logEventSampled( |
| code, |
| fileGroup.getGroupName(), |
| fileGroup.getFileGroupVersionNumber(), |
| fileGroup.getBuildId(), |
| fileGroup.getVariantId()); |
| } |
| } |