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