1 /* 2 * Copyright 2022 Google LLC 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 package com.google.android.libraries.mobiledatadownload.internal.dagger; 17 18 import android.content.Context; 19 import com.google.android.libraries.mobiledatadownload.AccountSource; 20 import com.google.android.libraries.mobiledatadownload.ExperimentationConfig; 21 import com.google.android.libraries.mobiledatadownload.Flags; 22 import com.google.android.libraries.mobiledatadownload.SilentFeedback; 23 import com.google.android.libraries.mobiledatadownload.TimeSource; 24 import com.google.android.libraries.mobiledatadownload.annotations.InstanceId; 25 import com.google.android.libraries.mobiledatadownload.file.SynchronousFileStorage; 26 import com.google.android.libraries.mobiledatadownload.internal.AndroidTimeSource; 27 import com.google.android.libraries.mobiledatadownload.internal.ApplicationContext; 28 import com.google.android.libraries.mobiledatadownload.internal.FileGroupsMetadata; 29 import com.google.android.libraries.mobiledatadownload.internal.SharedFilesMetadata; 30 import com.google.android.libraries.mobiledatadownload.internal.SharedPreferencesFileGroupsMetadata; 31 import com.google.android.libraries.mobiledatadownload.internal.SharedPreferencesSharedFilesMetadata; 32 import com.google.android.libraries.mobiledatadownload.internal.annotations.SequentialControlExecutor; 33 import com.google.android.libraries.mobiledatadownload.internal.experimentation.DownloadStageManager; 34 import com.google.android.libraries.mobiledatadownload.internal.experimentation.NoOpDownloadStageManager; 35 import com.google.android.libraries.mobiledatadownload.internal.logging.EventLogger; 36 import com.google.android.libraries.mobiledatadownload.internal.logging.LoggingStateStore; 37 import com.google.android.libraries.mobiledatadownload.internal.logging.SharedPreferencesLoggingState; 38 import com.google.android.libraries.mobiledatadownload.internal.util.FuturesUtil; 39 import com.google.android.libraries.mobiledatadownload.monitor.DownloadProgressMonitor; 40 import com.google.android.libraries.mobiledatadownload.monitor.NetworkUsageMonitor; 41 import com.google.common.base.Optional; 42 import dagger.Module; 43 import dagger.Provides; 44 import java.security.SecureRandom; 45 import java.util.concurrent.Executor; 46 import javax.inject.Singleton; 47 48 /** Module for MDD Lib dependencies */ 49 @Module 50 public class MainMddLibModule { 51 /** The version of MDD library. Same as mdi_download module version. */ 52 // TODO(b/122271766): Figure out how to update this automatically. 53 // LINT.IfChange 54 public static final int MDD_LIB_VERSION = 516938429; 55 // LINT.ThenChange(<internal>) 56 57 private final SynchronousFileStorage fileStorage; 58 59 private final NetworkUsageMonitor networkUsageMonitor; 60 61 private final EventLogger eventLogger; 62 63 private final Optional<DownloadProgressMonitor> downloadProgressMonitorOptional; 64 65 private final Optional<SilentFeedback> silentFeedbackOptional; 66 67 private final Optional<String> instanceId; 68 69 private final Optional<AccountSource> accountSourceOptional; 70 71 private final Flags flags; 72 73 private final Optional<ExperimentationConfig> experimentationConfigOptional; 74 MainMddLibModule( SynchronousFileStorage fileStorage, NetworkUsageMonitor networkUsageMonitor, EventLogger eventLogger, Optional<DownloadProgressMonitor> downloadProgressMonitorOptional, Optional<SilentFeedback> silentFeedbackOptional, Optional<String> instanceId, Optional<AccountSource> accountSourceOptional, Flags flags, Optional<ExperimentationConfig> experimentationConfigOptional)75 public MainMddLibModule( 76 SynchronousFileStorage fileStorage, 77 NetworkUsageMonitor networkUsageMonitor, 78 EventLogger eventLogger, 79 Optional<DownloadProgressMonitor> downloadProgressMonitorOptional, 80 Optional<SilentFeedback> silentFeedbackOptional, 81 Optional<String> instanceId, 82 Optional<AccountSource> accountSourceOptional, 83 Flags flags, 84 Optional<ExperimentationConfig> experimentationConfigOptional) { 85 this.fileStorage = fileStorage; 86 this.networkUsageMonitor = networkUsageMonitor; 87 this.eventLogger = eventLogger; 88 this.downloadProgressMonitorOptional = downloadProgressMonitorOptional; 89 this.silentFeedbackOptional = silentFeedbackOptional; 90 this.instanceId = instanceId; 91 this.accountSourceOptional = accountSourceOptional; 92 this.flags = flags; 93 this.experimentationConfigOptional = experimentationConfigOptional; 94 } 95 96 @Provides 97 @Singleton provideFileGroupsMetadata( SharedPreferencesFileGroupsMetadata fileGroupsMetadata)98 static FileGroupsMetadata provideFileGroupsMetadata( 99 SharedPreferencesFileGroupsMetadata fileGroupsMetadata) { 100 return fileGroupsMetadata; 101 } 102 103 @Provides 104 @Singleton provideSharedFilesMetadata( SharedPreferencesSharedFilesMetadata sharedFilesMetadata)105 static SharedFilesMetadata provideSharedFilesMetadata( 106 SharedPreferencesSharedFilesMetadata sharedFilesMetadata) { 107 return sharedFilesMetadata; 108 } 109 110 @Provides 111 @Singleton 112 @SuppressWarnings("Framework.StaticProvides") provideEventLogger()113 EventLogger provideEventLogger() { 114 return eventLogger; 115 } 116 117 @Provides 118 @Singleton 119 @SuppressWarnings("Framework.StaticProvides") providesSilentFeedback()120 SilentFeedback providesSilentFeedback() { 121 if (this.silentFeedbackOptional.isPresent()) { 122 return this.silentFeedbackOptional.get(); 123 } else { 124 return (throwable, description, args) -> { 125 // No-op SilentFeedback. 126 }; 127 } 128 } 129 130 @Provides 131 @Singleton 132 @SuppressWarnings("Framework.StaticProvides") provideAccountSourceOptional(@pplicationContext Context context)133 Optional<AccountSource> provideAccountSourceOptional(@ApplicationContext Context context) { 134 return this.accountSourceOptional; 135 } 136 137 @Provides 138 @Singleton provideTimeSource()139 static TimeSource provideTimeSource() { 140 return new AndroidTimeSource(); 141 } 142 143 @Provides 144 @Singleton 145 @InstanceId 146 @SuppressWarnings("Framework.StaticProvides") provideInstanceId()147 Optional<String> provideInstanceId() { 148 return this.instanceId; 149 } 150 151 @Provides 152 @Singleton 153 @SuppressWarnings("Framework.StaticProvides") provideNetworkUsageMonitor()154 NetworkUsageMonitor provideNetworkUsageMonitor() { 155 return this.networkUsageMonitor; 156 } 157 158 @Provides 159 @Singleton 160 @SuppressWarnings("Framework.StaticProvides") 161 // TODO: We don't need to have @Singleton here and few other places in this class 162 // since it comes from the this instance. We should remove this since it could increase APK size. provideDownloadProgressMonitor()163 Optional<DownloadProgressMonitor> provideDownloadProgressMonitor() { 164 return this.downloadProgressMonitorOptional; 165 } 166 167 @Provides 168 @Singleton 169 @SuppressWarnings("Framework.StaticProvides") provideSynchronousFileStorage()170 SynchronousFileStorage provideSynchronousFileStorage() { 171 return this.fileStorage; 172 } 173 174 @Provides 175 @Singleton 176 @SuppressWarnings("Framework.StaticProvides") provideFlags()177 Flags provideFlags() { 178 return this.flags; 179 } 180 181 @Provides 182 @SuppressWarnings("Framework.StaticProvides") provideExperimentationConfigOptional()183 Optional<ExperimentationConfig> provideExperimentationConfigOptional() { 184 return this.experimentationConfigOptional; 185 } 186 187 @Provides 188 @Singleton provideFuturesUtil(@equentialControlExecutor Executor sequentialExecutor)189 static FuturesUtil provideFuturesUtil(@SequentialControlExecutor Executor sequentialExecutor) { 190 return new FuturesUtil(sequentialExecutor); 191 } 192 193 @Provides 194 @Singleton provideLoggingStateStore( @pplicationContext Context context, @InstanceId Optional<String> instanceId, TimeSource timeSource, @SequentialControlExecutor Executor sequentialExecutor)195 static LoggingStateStore provideLoggingStateStore( 196 @ApplicationContext Context context, 197 @InstanceId Optional<String> instanceId, 198 TimeSource timeSource, 199 @SequentialControlExecutor Executor sequentialExecutor) { 200 return SharedPreferencesLoggingState.createFromContext( 201 context, instanceId, timeSource, sequentialExecutor, new SecureRandom()); 202 } 203 204 @Provides 205 @SuppressWarnings("Framework.StaticProvides") provideDownloadStageManager( FileGroupsMetadata fileGroupsMetadata, Optional<ExperimentationConfig> experimentationConfigOptional, @SequentialControlExecutor Executor executor, Flags flags)206 DownloadStageManager provideDownloadStageManager( 207 FileGroupsMetadata fileGroupsMetadata, 208 Optional<ExperimentationConfig> experimentationConfigOptional, 209 @SequentialControlExecutor Executor executor, 210 Flags flags) { 211 return new NoOpDownloadStageManager(); 212 } 213 } 214