• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 /*
2  * Copyright (C) 2024 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.server.healthconnect.injector;
18 
19 import android.app.AppOpsManager;
20 import android.content.Context;
21 import android.health.HealthFitnessStatsLog;
22 import android.health.connect.HealthConnectManager;
23 import android.health.connect.internal.datatypes.utils.HealthConnectMappings;
24 import android.os.Environment;
25 import android.os.UserHandle;
26 
27 import androidx.annotation.Nullable;
28 
29 import com.android.server.LocalManagerRegistry;
30 import com.android.server.appop.AppOpsManagerLocal;
31 import com.android.server.healthconnect.HealthConnectThreadScheduler;
32 import com.android.server.healthconnect.backuprestore.BackupRestore;
33 import com.android.server.healthconnect.exportimport.ExportImportNotificationSender;
34 import com.android.server.healthconnect.exportimport.ExportManager;
35 import com.android.server.healthconnect.fitness.FitnessRecordDeleteHelper;
36 import com.android.server.healthconnect.fitness.FitnessRecordReadHelper;
37 import com.android.server.healthconnect.fitness.FitnessRecordUpsertHelper;
38 import com.android.server.healthconnect.fitness.aggregation.FitnessRecordAggregateHelper;
39 import com.android.server.healthconnect.logging.BackupRestoreLogger;
40 import com.android.server.healthconnect.logging.ExportImportLogger;
41 import com.android.server.healthconnect.logging.UsageStatsCollector;
42 import com.android.server.healthconnect.migration.MigrationBroadcastScheduler;
43 import com.android.server.healthconnect.migration.MigrationCleaner;
44 import com.android.server.healthconnect.migration.MigrationStateManager;
45 import com.android.server.healthconnect.migration.MigrationUiStateManager;
46 import com.android.server.healthconnect.migration.PriorityMigrationHelper;
47 import com.android.server.healthconnect.migration.notification.MigrationNotificationSender;
48 import com.android.server.healthconnect.notifications.HealthConnectNotificationSender;
49 import com.android.server.healthconnect.permission.FirstGrantTimeDatastore;
50 import com.android.server.healthconnect.permission.FirstGrantTimeManager;
51 import com.android.server.healthconnect.permission.HealthConnectPermissionHelper;
52 import com.android.server.healthconnect.permission.HealthPermissionIntentAppsTracker;
53 import com.android.server.healthconnect.permission.PackageInfoUtils;
54 import com.android.server.healthconnect.permission.PermissionPackageChangesOrchestrator;
55 import com.android.server.healthconnect.storage.DailyCleanupJob;
56 import com.android.server.healthconnect.storage.ExportImportSettingsStorage;
57 import com.android.server.healthconnect.storage.HealthConnectContext;
58 import com.android.server.healthconnect.storage.TransactionManager;
59 import com.android.server.healthconnect.storage.datatypehelpers.AccessLogsHelper;
60 import com.android.server.healthconnect.storage.datatypehelpers.ActivityDateHelper;
61 import com.android.server.healthconnect.storage.datatypehelpers.AppInfoHelper;
62 import com.android.server.healthconnect.storage.datatypehelpers.AppOpLogsHelper;
63 import com.android.server.healthconnect.storage.datatypehelpers.ChangeLogsHelper;
64 import com.android.server.healthconnect.storage.datatypehelpers.ChangeLogsRequestHelper;
65 import com.android.server.healthconnect.storage.datatypehelpers.DatabaseHelper.DatabaseHelpers;
66 import com.android.server.healthconnect.storage.datatypehelpers.DatabaseStatsCollector;
67 import com.android.server.healthconnect.storage.datatypehelpers.DeviceInfoHelper;
68 import com.android.server.healthconnect.storage.datatypehelpers.HealthDataCategoryPriorityHelper;
69 import com.android.server.healthconnect.storage.datatypehelpers.MedicalDataSourceHelper;
70 import com.android.server.healthconnect.storage.datatypehelpers.MedicalResourceHelper;
71 import com.android.server.healthconnect.storage.datatypehelpers.MigrationEntityHelper;
72 import com.android.server.healthconnect.storage.datatypehelpers.PreferenceHelper;
73 import com.android.server.healthconnect.storage.datatypehelpers.ReadAccessLogsHelper;
74 import com.android.server.healthconnect.storage.utils.InternalHealthConnectMappings;
75 import com.android.server.healthconnect.storage.utils.PreferencesManager;
76 import com.android.server.healthconnect.tracker.TrackerManager;
77 import com.android.server.healthconnect.tracker.TrackerManagerImpl;
78 import com.android.server.healthconnect.utils.TimeSource;
79 import com.android.server.healthconnect.utils.TimeSourceImpl;
80 
81 import java.io.File;
82 import java.time.Clock;
83 import java.util.Objects;
84 
85 /**
86  * Injector implementation of HealthConnectInjector containing dependencies to be used in production
87  * version of the module.
88  *
89  * @hide
90  */
91 public class HealthConnectInjectorImpl extends HealthConnectInjector {
92 
93     private final Builder mBuilder;
94 
95     private final PackageInfoUtils mPackageInfoUtils;
96     private final TransactionManager mTransactionManager;
97     private final HealthDataCategoryPriorityHelper mHealthDataCategoryPriorityHelper;
98     private final PriorityMigrationHelper mPriorityMigrationHelper;
99     private final PreferenceHelper mPreferenceHelper;
100     private final ExportImportSettingsStorage mExportImportSettingsStorage;
101     private final ExportManager mExportManager;
102     private final MigrationStateManager mMigrationStateManager;
103     private final DeviceInfoHelper mDeviceInfoHelper;
104     private final AppInfoHelper mAppInfoHelper;
105     private final AppOpLogsHelper mAppOpLogsHelper;
106     private final AccessLogsHelper mAccessLogsHelper;
107     private final ActivityDateHelper mActivityDateHelper;
108     private final HealthConnectMappings mHealthConnectMappings;
109     private final InternalHealthConnectMappings mInternalHealthConnectMappings;
110     private final ChangeLogsHelper mChangeLogsHelper;
111     private final ChangeLogsRequestHelper mChangeLogsRequestHelper;
112     private final FirstGrantTimeManager mFirstGrantTimeManager;
113     private final HealthPermissionIntentAppsTracker mPermissionIntentAppsTracker;
114     private final PermissionPackageChangesOrchestrator mPermissionPackageChangesOrchestrator;
115     private final HealthConnectPermissionHelper mHealthConnectPermissionHelper;
116     private final MigrationCleaner mMigrationCleaner;
117     private final TimeSource mTimeSource;
118     private final FitnessRecordUpsertHelper mFitnessRecordUpsertHelper;
119     private final FitnessRecordReadHelper mFitnessRecordReadHelper;
120     private final FitnessRecordDeleteHelper mFitnessRecordDeleteHelper;
121     private final FitnessRecordAggregateHelper mFitnessRecordAggregateHelper;
122     private final MedicalDataSourceHelper mMedicalDataSourceHelper;
123     private final MedicalResourceHelper mMedicalResourceHelper;
124     private final MigrationBroadcastScheduler mMigrationBroadcastScheduler;
125     private final MigrationUiStateManager mMigrationUiStateManager;
126     private final DatabaseHelpers mDatabaseHelpers;
127     private final MigrationEntityHelper mMigrationEntityHelper;
128     private final BackupRestore mBackupRestore;
129     private final PreferencesManager mPreferencesManager;
130     private final ReadAccessLogsHelper mReadAccessLogsHelper;
131     private final HealthConnectNotificationSender mExportImportNotificationSender;
132     private final AppOpsManagerLocal mAppOpsManagerLocal;
133     private final HealthConnectThreadScheduler mThreadScheduler;
134     private final File mEnvironmentDataDirectory;
135     private final HealthFitnessStatsLog mHealthFitnesssStatsLog;
136     private final ExportImportLogger mExportImportLogger;
137     private final TrackerManager mTrackerManager;
138     private final BackupRestoreLogger mBackupRestoreLogger;
139 
HealthConnectInjectorImpl(Context context)140     public HealthConnectInjectorImpl(Context context) {
141         this(new Builder(context));
142     }
143 
HealthConnectInjectorImpl(Builder builder)144     private HealthConnectInjectorImpl(Builder builder) {
145         Context context = builder.mContext;
146         mBuilder = builder;
147 
148         // Don't store the user and make it available via the injector, as this user is always
149         // the first / system user, and doesn't change after that.
150         // Any class that is using this user below are responsible for making sure that they
151         // update any reference to user when it changes.
152         UserHandle userHandle = builder.mUserHandle;
153         mEnvironmentDataDirectory =
154                 builder.mEnvironmentDataDirectory == null
155                         ? Environment.getDataDirectory()
156                         : builder.mEnvironmentDataDirectory;
157         mHealthFitnesssStatsLog =
158                 builder.mStatsLog == null ? new HealthFitnessStatsLog() : builder.mStatsLog;
159         mExportImportLogger = new ExportImportLogger(mHealthFitnesssStatsLog);
160         mBackupRestoreLogger = new BackupRestoreLogger(mHealthFitnesssStatsLog);
161 
162         HealthConnectContext hcContext =
163                 HealthConnectContext.create(
164                         context,
165                         userHandle,
166                         /* databaseDirName= */ null,
167                         mEnvironmentDataDirectory);
168 
169         mDatabaseHelpers = new DatabaseHelpers();
170         mInternalHealthConnectMappings = InternalHealthConnectMappings.getInstance();
171         mHealthConnectMappings = HealthConnectMappings.getInstance();
172         mTimeSource = builder.mTimeSource == null ? new TimeSourceImpl() : builder.mTimeSource;
173         mThreadScheduler =
174                 builder.mThreadScheduler == null
175                         ? new HealthConnectThreadScheduler()
176                         : builder.mThreadScheduler;
177         mMigrationEntityHelper =
178                 builder.mMigrationEntityHelper == null
179                         ? new MigrationEntityHelper(mDatabaseHelpers)
180                         : builder.mMigrationEntityHelper;
181         mExportImportNotificationSender =
182                 builder.mExportImportNotificationSender == null
183                         ? ExportImportNotificationSender.createSender(context)
184                         : builder.mExportImportNotificationSender;
185 
186         mTransactionManager =
187                 builder.mTransactionManager == null
188                         ? TransactionManager.create(hcContext, mInternalHealthConnectMappings)
189                         : builder.mTransactionManager;
190         mAppInfoHelper =
191                 builder.mAppInfoHelper == null
192                         ? new AppInfoHelper(
193                                 hcContext,
194                                 mTransactionManager,
195                                 mInternalHealthConnectMappings,
196                                 mDatabaseHelpers)
197                         : builder.mAppInfoHelper;
198         mPackageInfoUtils =
199                 builder.mPackageInfoUtils == null
200                         ? new PackageInfoUtils()
201                         : builder.mPackageInfoUtils;
202         mPreferenceHelper =
203                 builder.mPreferenceHelper == null
204                         ? new PreferenceHelper(mTransactionManager, mDatabaseHelpers)
205                         : builder.mPreferenceHelper;
206         mHealthDataCategoryPriorityHelper =
207                 builder.mHealthDataCategoryPriorityHelper == null
208                         ? new HealthDataCategoryPriorityHelper(
209                                 hcContext,
210                                 mAppInfoHelper,
211                                 mTransactionManager,
212                                 mPreferenceHelper,
213                                 mPackageInfoUtils,
214                                 mHealthConnectMappings,
215                                 mDatabaseHelpers,
216                                 mThreadScheduler)
217                         : builder.mHealthDataCategoryPriorityHelper;
218         mPriorityMigrationHelper =
219                 builder.mPriorityMigrationHelper == null
220                         ? new PriorityMigrationHelper(
221                                 mHealthDataCategoryPriorityHelper,
222                                 mTransactionManager,
223                                 mDatabaseHelpers)
224                         : builder.mPriorityMigrationHelper;
225         mExportImportSettingsStorage =
226                 builder.mExportImportSettingsStorage == null
227                         ? new ExportImportSettingsStorage(mPreferenceHelper)
228                         : builder.mExportImportSettingsStorage;
229         mExportManager =
230                 builder.mExportManager == null
231                         ? new ExportManager(
232                                 context,
233                                 Clock.systemUTC(),
234                                 mExportImportSettingsStorage,
235                                 mTransactionManager,
236                                 mExportImportNotificationSender,
237                                 mEnvironmentDataDirectory,
238                                 mExportImportLogger)
239                         : builder.mExportManager;
240         mMigrationBroadcastScheduler =
241                 builder.mMigrationBroadcastScheduler == null
242                         ? new MigrationBroadcastScheduler(userHandle)
243                         : builder.mMigrationBroadcastScheduler;
244         mMigrationStateManager =
245                 builder.mMigrationStateManager == null
246                         ? new MigrationStateManager(
247                                 userHandle,
248                                 mPreferenceHelper,
249                                 mMigrationBroadcastScheduler,
250                                 mThreadScheduler)
251                         : builder.mMigrationStateManager;
252         mDeviceInfoHelper =
253                 builder.mDeviceInfoHelper == null
254                         ? new DeviceInfoHelper(mTransactionManager, mDatabaseHelpers)
255                         : builder.mDeviceInfoHelper;
256         mAppOpLogsHelper =
257                 builder.mAppOpLogsHelper == null
258                         ? new AppOpLogsHelper(
259                                 context.getSystemService(AppOpsManager.class),
260                                 context.getPackageManager(),
261                                 HealthConnectManager.getHealthPermissions(context))
262                         : builder.mAppOpLogsHelper;
263         mAccessLogsHelper =
264                 builder.mAccessLogsHelper == null
265                         ? new AccessLogsHelper(
266                                 mTransactionManager,
267                                 mAppInfoHelper,
268                                 mAppOpLogsHelper,
269                                 mDatabaseHelpers)
270                         : builder.mAccessLogsHelper;
271         mReadAccessLogsHelper =
272                 builder.mReadAccessLogsHelper == null
273                         ? new ReadAccessLogsHelper(
274                                 mAppInfoHelper, mTransactionManager, mDatabaseHelpers)
275                         : builder.mReadAccessLogsHelper;
276         mActivityDateHelper =
277                 builder.mActivityDateHelper == null
278                         ? new ActivityDateHelper(
279                                 mTransactionManager,
280                                 mInternalHealthConnectMappings,
281                                 mDatabaseHelpers)
282                         : builder.mActivityDateHelper;
283         mChangeLogsHelper =
284                 builder.mChangeLogsHelper == null
285                         ? new ChangeLogsHelper(mTransactionManager, mDatabaseHelpers)
286                         : builder.mChangeLogsHelper;
287         mChangeLogsRequestHelper =
288                 builder.mChangeLogsRequestHelper == null
289                         ? new ChangeLogsRequestHelper(mTransactionManager, mDatabaseHelpers)
290                         : builder.mChangeLogsRequestHelper;
291         mPermissionIntentAppsTracker =
292                 builder.mPermissionIntentAppsTracker == null
293                         ? new HealthPermissionIntentAppsTracker(context)
294                         : builder.mPermissionIntentAppsTracker;
295         mFirstGrantTimeManager =
296                 builder.mFirstGrantTimeManager == null
297                         ? new FirstGrantTimeManager(
298                                 context,
299                                 mPermissionIntentAppsTracker,
300                                 builder.mFirstGrantTimeDatastore == null
301                                         ? FirstGrantTimeDatastore.createInstance(
302                                                 mEnvironmentDataDirectory)
303                                         : builder.mFirstGrantTimeDatastore,
304                                 mPackageInfoUtils,
305                                 mHealthDataCategoryPriorityHelper,
306                                 mMigrationStateManager,
307                                 mThreadScheduler)
308                         : builder.mFirstGrantTimeManager;
309         mHealthConnectPermissionHelper =
310                 builder.mHealthConnectPermissionHelper == null
311                         ? new HealthConnectPermissionHelper(
312                                 context,
313                                 context.getPackageManager(),
314                                 mPermissionIntentAppsTracker,
315                                 mFirstGrantTimeManager,
316                                 mHealthDataCategoryPriorityHelper,
317                                 mAppInfoHelper,
318                                 mHealthConnectMappings)
319                         : builder.mHealthConnectPermissionHelper;
320         mPermissionPackageChangesOrchestrator =
321                 builder.mPermissionPackageChangesOrchestrator == null
322                         ? new PermissionPackageChangesOrchestrator(
323                                 mPermissionIntentAppsTracker,
324                                 mFirstGrantTimeManager,
325                                 mHealthConnectPermissionHelper,
326                                 userHandle,
327                                 mHealthDataCategoryPriorityHelper,
328                                 mThreadScheduler)
329                         : builder.mPermissionPackageChangesOrchestrator;
330         mMigrationCleaner =
331                 builder.mMigrationCleaner == null
332                         ? new MigrationCleaner(
333                                 mTransactionManager,
334                                 mPriorityMigrationHelper,
335                                 mMigrationEntityHelper)
336                         : builder.mMigrationCleaner;
337         mFitnessRecordUpsertHelper =
338                 builder.mFitnessRecordUpsertHelper == null
339                         ? new FitnessRecordUpsertHelper(
340                                 mTransactionManager,
341                                 mDeviceInfoHelper,
342                                 mAppInfoHelper,
343                                 mAccessLogsHelper,
344                                 mInternalHealthConnectMappings)
345                         : builder.mFitnessRecordUpsertHelper;
346         mFitnessRecordReadHelper =
347                 builder.mFitnessRecordReadHelper == null
348                         ? new FitnessRecordReadHelper(
349                                 mDeviceInfoHelper,
350                                 mAppInfoHelper,
351                                 mAccessLogsHelper,
352                                 mReadAccessLogsHelper,
353                                 mInternalHealthConnectMappings)
354                         : builder.mFitnessRecordReadHelper;
355         mFitnessRecordDeleteHelper =
356                 builder.mFitnessRecordDeleteHelper == null
357                         ? new FitnessRecordDeleteHelper(
358                                 mTransactionManager,
359                                 mAppInfoHelper,
360                                 mAccessLogsHelper,
361                                 mInternalHealthConnectMappings)
362                         : builder.mFitnessRecordDeleteHelper;
363         mFitnessRecordAggregateHelper =
364                 builder.mFitnessRecordAggregateHelper == null
365                         ? new FitnessRecordAggregateHelper(
366                                 mTransactionManager,
367                                 mAppInfoHelper,
368                                 mHealthDataCategoryPriorityHelper,
369                                 mAccessLogsHelper,
370                                 mReadAccessLogsHelper,
371                                 mInternalHealthConnectMappings)
372                         : builder.mFitnessRecordAggregateHelper;
373         mMedicalDataSourceHelper =
374                 builder.mMedicalDataSourceHelper == null
375                         ? new MedicalDataSourceHelper(
376                                 mTransactionManager, mAppInfoHelper, mTimeSource, mAccessLogsHelper)
377                         : builder.mMedicalDataSourceHelper;
378         mMedicalResourceHelper =
379                 builder.mMedicalResourceHelper == null
380                         ? new MedicalResourceHelper(
381                                 mTransactionManager,
382                                 mAppInfoHelper,
383                                 mMedicalDataSourceHelper,
384                                 mTimeSource,
385                                 getAccessLogsHelper())
386                         : builder.mMedicalResourceHelper;
387         mMigrationUiStateManager =
388                 builder.mMigrationUiStateManager == null
389                         ? new MigrationUiStateManager(
390                                 context,
391                                 userHandle,
392                                 mMigrationStateManager,
393                                 new MigrationNotificationSender(context))
394                         : builder.mMigrationUiStateManager;
395         mBackupRestore =
396                 new BackupRestore(
397                         mAppInfoHelper,
398                         mFirstGrantTimeManager,
399                         mMigrationStateManager,
400                         mPreferenceHelper,
401                         mTransactionManager,
402                         mFitnessRecordUpsertHelper,
403                         mFitnessRecordReadHelper,
404                         context,
405                         mDeviceInfoHelper,
406                         mHealthDataCategoryPriorityHelper,
407                         mThreadScheduler,
408                         mEnvironmentDataDirectory);
409         mPreferencesManager =
410                 builder.mPreferencesManager == null
411                         ? new PreferencesManager(mPreferenceHelper)
412                         : builder.mPreferencesManager;
413         mAppOpsManagerLocal =
414                 builder.mAppOpsManagerLocal == null
415                         ? LocalManagerRegistry.getManager(AppOpsManagerLocal.class)
416                         : builder.mAppOpsManagerLocal;
417         mTrackerManager =
418                 builder.mTrackerManager == null
419                         ? new TrackerManagerImpl()
420                         : builder.mTrackerManager;
421     }
422 
423     @Override
getPackageInfoUtils()424     public PackageInfoUtils getPackageInfoUtils() {
425         return mPackageInfoUtils;
426     }
427 
428     @Override
getTransactionManager()429     public TransactionManager getTransactionManager() {
430         return mTransactionManager;
431     }
432 
433     @Override
getHealthDataCategoryPriorityHelper()434     public HealthDataCategoryPriorityHelper getHealthDataCategoryPriorityHelper() {
435         return mHealthDataCategoryPriorityHelper;
436     }
437 
438     @Override
getPriorityMigrationHelper()439     public PriorityMigrationHelper getPriorityMigrationHelper() {
440         return mPriorityMigrationHelper;
441     }
442 
443     @Override
getPreferenceHelper()444     public PreferenceHelper getPreferenceHelper() {
445         return mPreferenceHelper;
446     }
447 
448     @Override
getExportImportSettingsStorage()449     public ExportImportSettingsStorage getExportImportSettingsStorage() {
450         return mExportImportSettingsStorage;
451     }
452 
453     @Override
getExportManager()454     public ExportManager getExportManager() {
455         return mExportManager;
456     }
457 
458     @Override
getExportImportNotificationSender()459     public HealthConnectNotificationSender getExportImportNotificationSender() {
460         return mExportImportNotificationSender;
461     }
462 
463     @Override
getMigrationStateManager()464     public MigrationStateManager getMigrationStateManager() {
465         return mMigrationStateManager;
466     }
467 
468     @Override
getDeviceInfoHelper()469     public DeviceInfoHelper getDeviceInfoHelper() {
470         return mDeviceInfoHelper;
471     }
472 
473     @Override
getAppInfoHelper()474     public AppInfoHelper getAppInfoHelper() {
475         return mAppInfoHelper;
476     }
477 
478     @Override
getAccessLogsHelper()479     public AccessLogsHelper getAccessLogsHelper() {
480         return mAccessLogsHelper;
481     }
482 
483     @Override
getActivityDateHelper()484     public ActivityDateHelper getActivityDateHelper() {
485         return mActivityDateHelper;
486     }
487 
488     @Override
getChangeLogsHelper()489     public ChangeLogsHelper getChangeLogsHelper() {
490         return mChangeLogsHelper;
491     }
492 
493     @Override
getChangeLogsRequestHelper()494     public ChangeLogsRequestHelper getChangeLogsRequestHelper() {
495         return mChangeLogsRequestHelper;
496     }
497 
498     @Override
getHealthConnectMappings()499     public HealthConnectMappings getHealthConnectMappings() {
500         return mHealthConnectMappings;
501     }
502 
503     @Override
getInternalHealthConnectMappings()504     public InternalHealthConnectMappings getInternalHealthConnectMappings() {
505         return mInternalHealthConnectMappings;
506     }
507 
508     @Override
getFirstGrantTimeManager()509     public FirstGrantTimeManager getFirstGrantTimeManager() {
510         return mFirstGrantTimeManager;
511     }
512 
513     @Override
getHealthPermissionIntentAppsTracker()514     public HealthPermissionIntentAppsTracker getHealthPermissionIntentAppsTracker() {
515         return mPermissionIntentAppsTracker;
516     }
517 
518     @Override
getPermissionPackageChangesOrchestrator()519     public PermissionPackageChangesOrchestrator getPermissionPackageChangesOrchestrator() {
520         return mPermissionPackageChangesOrchestrator;
521     }
522 
523     @Override
getHealthConnectPermissionHelper()524     public HealthConnectPermissionHelper getHealthConnectPermissionHelper() {
525         return mHealthConnectPermissionHelper;
526     }
527 
528     @Override
getMigrationCleaner()529     public MigrationCleaner getMigrationCleaner() {
530         return mMigrationCleaner;
531     }
532 
533     @Override
getFitnessRecordUpsertHelper()534     public FitnessRecordUpsertHelper getFitnessRecordUpsertHelper() {
535         return mFitnessRecordUpsertHelper;
536     }
537 
538     @Override
getFitnessRecordReadHelper()539     public FitnessRecordReadHelper getFitnessRecordReadHelper() {
540         return mFitnessRecordReadHelper;
541     }
542 
543     @Override
getFitnessRecordDeleteHelper()544     public FitnessRecordDeleteHelper getFitnessRecordDeleteHelper() {
545         return mFitnessRecordDeleteHelper;
546     }
547 
548     @Override
getFitnessRecordAggregateHelper()549     public FitnessRecordAggregateHelper getFitnessRecordAggregateHelper() {
550         return mFitnessRecordAggregateHelper;
551     }
552 
553     @Override
getMedicalDataSourceHelper()554     public MedicalDataSourceHelper getMedicalDataSourceHelper() {
555         return mMedicalDataSourceHelper;
556     }
557 
558     @Override
getMedicalResourceHelper()559     public MedicalResourceHelper getMedicalResourceHelper() {
560         return mMedicalResourceHelper;
561     }
562 
563     @Override
getTimeSource()564     public TimeSource getTimeSource() {
565         return mTimeSource;
566     }
567 
568     @Override
getMigrationBroadcastScheduler()569     public MigrationBroadcastScheduler getMigrationBroadcastScheduler() {
570         return mMigrationBroadcastScheduler;
571     }
572 
573     @Override
getMigrationUiStateManager()574     public MigrationUiStateManager getMigrationUiStateManager() {
575         return mMigrationUiStateManager;
576     }
577 
578     @Override
getDatabaseHelpers()579     public DatabaseHelpers getDatabaseHelpers() {
580         return mDatabaseHelpers;
581     }
582 
583     @Override
getMigrationEntityHelper()584     public MigrationEntityHelper getMigrationEntityHelper() {
585         return mMigrationEntityHelper;
586     }
587 
588     @Override
getBackupRestore()589     public BackupRestore getBackupRestore() {
590         return mBackupRestore;
591     }
592 
593     @Override
getPreferencesManager()594     public PreferencesManager getPreferencesManager() {
595         return mPreferencesManager;
596     }
597 
598     @Override
getDailyCleanupJob()599     public DailyCleanupJob getDailyCleanupJob() {
600         return new DailyCleanupJob(
601                 getHealthDataCategoryPriorityHelper(),
602                 getPreferencesManager(),
603                 getAppInfoHelper(),
604                 getTransactionManager(),
605                 getFitnessRecordDeleteHelper(),
606                 getActivityDateHelper());
607     }
608 
609     @Override
getDatabaseStatsCollector()610     public DatabaseStatsCollector getDatabaseStatsCollector() {
611         return mBuilder.mDatabaseStatsCollector == null
612                 ? new DatabaseStatsCollector(getTransactionManager())
613                 : mBuilder.mDatabaseStatsCollector;
614     }
615 
616     @Override
getUsageStatsCollector(HealthConnectContext hcContext)617     public UsageStatsCollector getUsageStatsCollector(HealthConnectContext hcContext) {
618         return mBuilder.mUsageStatsCollector == null
619                 ? new UsageStatsCollector(
620                         hcContext,
621                         mPreferenceHelper,
622                         mPreferencesManager,
623                         mAccessLogsHelper,
624                         mTimeSource,
625                         mMedicalResourceHelper,
626                         mMedicalDataSourceHelper,
627                         mPackageInfoUtils)
628                 : mBuilder.mUsageStatsCollector;
629     }
630 
631     @Override
getReadAccessLogsHelper()632     public ReadAccessLogsHelper getReadAccessLogsHelper() {
633         return mReadAccessLogsHelper;
634     }
635 
636     @Override
getAppOpsManagerLocal()637     public AppOpsManagerLocal getAppOpsManagerLocal() {
638         return mAppOpsManagerLocal;
639     }
640 
641     @Override
getThreadScheduler()642     public HealthConnectThreadScheduler getThreadScheduler() {
643         return mThreadScheduler;
644     }
645 
646     @Override
getEnvironmentDataDirectory()647     public File getEnvironmentDataDirectory() {
648         return mEnvironmentDataDirectory;
649     }
650 
651     @Override
getHealthFitnessStatsLog()652     public HealthFitnessStatsLog getHealthFitnessStatsLog() {
653         return mHealthFitnesssStatsLog;
654     }
655 
656     @Override
getExportImportLogger()657     public ExportImportLogger getExportImportLogger() {
658         return mExportImportLogger;
659     }
660 
661     @Override
getBackupRestoreLogger()662     public BackupRestoreLogger getBackupRestoreLogger() {
663         return mBackupRestoreLogger;
664     }
665 
666     @Override
getTrackerManager()667     public TrackerManager getTrackerManager() {
668         return mTrackerManager;
669     }
670 
671     /**
672      * Returns a new Builder of Health Connect Injector
673      *
674      * <p>USE ONLY DURING TESTING.
675      */
newBuilderForTest(Context context)676     public static Builder newBuilderForTest(Context context) {
677         return new Builder(context);
678     }
679 
680     /**
681      * Used to build injector.
682      *
683      * <p>The setters are used only when we need a custom implementation of any dependency which is
684      * ONLY for testing. Do not use setters if we need default implementation of a dependency.
685      */
686     public static class Builder {
687 
688         private final Context mContext;
689         private final UserHandle mUserHandle;
690 
691         @Nullable private PackageInfoUtils mPackageInfoUtils;
692         @Nullable private TransactionManager mTransactionManager;
693         @Nullable private HealthDataCategoryPriorityHelper mHealthDataCategoryPriorityHelper;
694         @Nullable private PriorityMigrationHelper mPriorityMigrationHelper;
695         @Nullable private PreferenceHelper mPreferenceHelper;
696         @Nullable private ExportImportSettingsStorage mExportImportSettingsStorage;
697         @Nullable private ExportManager mExportManager;
698         @Nullable private MigrationStateManager mMigrationStateManager;
699         @Nullable private DeviceInfoHelper mDeviceInfoHelper;
700         @Nullable private AppInfoHelper mAppInfoHelper;
701         @Nullable private AppOpLogsHelper mAppOpLogsHelper;
702         @Nullable private AccessLogsHelper mAccessLogsHelper;
703         @Nullable private ActivityDateHelper mActivityDateHelper;
704         @Nullable private ChangeLogsHelper mChangeLogsHelper;
705         @Nullable private ChangeLogsRequestHelper mChangeLogsRequestHelper;
706         @Nullable private FirstGrantTimeManager mFirstGrantTimeManager;
707         @Nullable private HealthPermissionIntentAppsTracker mPermissionIntentAppsTracker;
708         @Nullable private FirstGrantTimeDatastore mFirstGrantTimeDatastore;
709 
710         @Nullable
711         private PermissionPackageChangesOrchestrator mPermissionPackageChangesOrchestrator;
712 
713         @Nullable private HealthConnectPermissionHelper mHealthConnectPermissionHelper;
714         @Nullable private HealthConnectNotificationSender mExportImportNotificationSender;
715         @Nullable private MigrationCleaner mMigrationCleaner;
716         @Nullable private TimeSource mTimeSource;
717         @Nullable private FitnessRecordUpsertHelper mFitnessRecordUpsertHelper;
718         @Nullable private FitnessRecordReadHelper mFitnessRecordReadHelper;
719         @Nullable private FitnessRecordDeleteHelper mFitnessRecordDeleteHelper;
720         @Nullable private FitnessRecordAggregateHelper mFitnessRecordAggregateHelper;
721         @Nullable private MedicalDataSourceHelper mMedicalDataSourceHelper;
722         @Nullable private MedicalResourceHelper mMedicalResourceHelper;
723         @Nullable private MigrationBroadcastScheduler mMigrationBroadcastScheduler;
724         @Nullable private MigrationUiStateManager mMigrationUiStateManager;
725         @Nullable private MigrationEntityHelper mMigrationEntityHelper;
726         @Nullable private PreferencesManager mPreferencesManager;
727         @Nullable private DatabaseStatsCollector mDatabaseStatsCollector;
728         @Nullable private UsageStatsCollector mUsageStatsCollector;
729         @Nullable private ReadAccessLogsHelper mReadAccessLogsHelper;
730         @Nullable private File mEnvironmentDataDirectory;
731         @Nullable private AppOpsManagerLocal mAppOpsManagerLocal;
732         @Nullable private HealthConnectThreadScheduler mThreadScheduler;
733         @Nullable private HealthFitnessStatsLog mStatsLog;
734         @Nullable private TrackerManager mTrackerManager;
735 
Builder(Context context)736         private Builder(Context context) {
737             mContext = context;
738             mUserHandle = context.getUser();
739         }
740 
741         /** Set fake or custom {@link PackageInfoUtils} */
setPackageInfoUtils(PackageInfoUtils packageInfoUtils)742         public Builder setPackageInfoUtils(PackageInfoUtils packageInfoUtils) {
743             Objects.requireNonNull(packageInfoUtils);
744             mPackageInfoUtils = packageInfoUtils;
745             return this;
746         }
747 
748         /** Set fake or custom {@link TransactionManager} */
setTransactionManager(TransactionManager transactionManager)749         public Builder setTransactionManager(TransactionManager transactionManager) {
750             Objects.requireNonNull(transactionManager);
751             mTransactionManager = transactionManager;
752             return this;
753         }
754 
755         /** Set fake or custom {@link HealthDataCategoryPriorityHelper} */
setHealthDataCategoryPriorityHelper( HealthDataCategoryPriorityHelper healthDataCategoryPriorityHelper)756         public Builder setHealthDataCategoryPriorityHelper(
757                 HealthDataCategoryPriorityHelper healthDataCategoryPriorityHelper) {
758             Objects.requireNonNull(healthDataCategoryPriorityHelper);
759             mHealthDataCategoryPriorityHelper = healthDataCategoryPriorityHelper;
760             return this;
761         }
762 
763         /** Set fake or custom {@link PriorityMigrationHelper} */
setPriorityMigrationHelper(PriorityMigrationHelper priorityMigrationHelper)764         public Builder setPriorityMigrationHelper(PriorityMigrationHelper priorityMigrationHelper) {
765             Objects.requireNonNull(priorityMigrationHelper);
766             mPriorityMigrationHelper = priorityMigrationHelper;
767             return this;
768         }
769 
770         /** Set fake or custom {@link PreferenceHelper} */
setPreferenceHelper(PreferenceHelper preferenceHelper)771         public Builder setPreferenceHelper(PreferenceHelper preferenceHelper) {
772             Objects.requireNonNull(preferenceHelper);
773             mPreferenceHelper = preferenceHelper;
774             return this;
775         }
776 
777         /** Set fake or custom {@link ExportImportSettingsStorage} */
setExportImportSettingsStorage( ExportImportSettingsStorage exportImportSettingsStorage)778         public Builder setExportImportSettingsStorage(
779                 ExportImportSettingsStorage exportImportSettingsStorage) {
780             Objects.requireNonNull(exportImportSettingsStorage);
781             mExportImportSettingsStorage = exportImportSettingsStorage;
782             return this;
783         }
784 
785         /** Set fake or custom {@link ExportManager} */
setExportManager(ExportManager exportManager)786         public Builder setExportManager(ExportManager exportManager) {
787             Objects.requireNonNull(exportManager);
788             mExportManager = exportManager;
789             return this;
790         }
791 
792         /** Set fake or custom {@link MigrationStateManager} */
setMigrationStateManager(MigrationStateManager migrationStateManager)793         public Builder setMigrationStateManager(MigrationStateManager migrationStateManager) {
794             Objects.requireNonNull(migrationStateManager);
795             mMigrationStateManager = migrationStateManager;
796             return this;
797         }
798 
799         /** Set fake or custom {@link DeviceInfoHelper} */
setDeviceInfoHelper(DeviceInfoHelper deviceInfoHelper)800         public Builder setDeviceInfoHelper(DeviceInfoHelper deviceInfoHelper) {
801             Objects.requireNonNull(deviceInfoHelper);
802             mDeviceInfoHelper = deviceInfoHelper;
803             return this;
804         }
805 
806         /** Set fake or custom {@link AppInfoHelper} */
setAppInfoHelper(AppInfoHelper appInfoHelper)807         public Builder setAppInfoHelper(AppInfoHelper appInfoHelper) {
808             Objects.requireNonNull(appInfoHelper);
809             mAppInfoHelper = appInfoHelper;
810             return this;
811         }
812 
813         /** Set fake or custom {@link AppOpLogsHelper} */
setAppOpLogsHelper(AppOpLogsHelper appOpLogsHelper)814         public Builder setAppOpLogsHelper(AppOpLogsHelper appOpLogsHelper) {
815             Objects.requireNonNull(appOpLogsHelper);
816             mAppOpLogsHelper = appOpLogsHelper;
817             return this;
818         }
819 
820         /** Set fake or custom {@link AccessLogsHelper} */
setAccessLogsHelper(AccessLogsHelper accessLogsHelper)821         public Builder setAccessLogsHelper(AccessLogsHelper accessLogsHelper) {
822             Objects.requireNonNull(accessLogsHelper);
823             mAccessLogsHelper = accessLogsHelper;
824             return this;
825         }
826 
827         /** Set fake or custom {@link ActivityDateHelper} */
setActivityDateHelper(ActivityDateHelper activityDateHelper)828         public Builder setActivityDateHelper(ActivityDateHelper activityDateHelper) {
829             Objects.requireNonNull(activityDateHelper);
830             mActivityDateHelper = activityDateHelper;
831             return this;
832         }
833 
834         /** Set fake or custom {@link ChangeLogsHelper} */
setChangeLogsHelper(ChangeLogsHelper changeLogsHelper)835         public Builder setChangeLogsHelper(ChangeLogsHelper changeLogsHelper) {
836             Objects.requireNonNull(changeLogsHelper);
837             mChangeLogsHelper = changeLogsHelper;
838             return this;
839         }
840 
841         /** Set fake or custom {@link ChangeLogsRequestHelper} */
setChangeLogsRequestHelper(ChangeLogsRequestHelper changeLogsRequestHelper)842         public Builder setChangeLogsRequestHelper(ChangeLogsRequestHelper changeLogsRequestHelper) {
843             Objects.requireNonNull(changeLogsRequestHelper);
844             mChangeLogsRequestHelper = changeLogsRequestHelper;
845             return this;
846         }
847 
848         /** Set fake or custom {@link FirstGrantTimeManager} */
setFirstGrantTimeManager(FirstGrantTimeManager firstGrantTimeManager)849         public Builder setFirstGrantTimeManager(FirstGrantTimeManager firstGrantTimeManager) {
850             Objects.requireNonNull(firstGrantTimeManager);
851             mFirstGrantTimeManager = firstGrantTimeManager;
852             return this;
853         }
854 
855         /** Set fake or custom {@link FirstGrantTimeDatastore} */
setFirstGrantTimeDatastore(FirstGrantTimeDatastore firstGrantTimeDatastore)856         public Builder setFirstGrantTimeDatastore(FirstGrantTimeDatastore firstGrantTimeDatastore) {
857             Objects.requireNonNull(firstGrantTimeDatastore);
858             mFirstGrantTimeDatastore = firstGrantTimeDatastore;
859             return this;
860         }
861 
862         /** Set fake or custom {@link HealthPermissionIntentAppsTracker} */
setHealthPermissionIntentAppsTracker( HealthPermissionIntentAppsTracker healthPermissionIntentAppsTracker)863         public Builder setHealthPermissionIntentAppsTracker(
864                 HealthPermissionIntentAppsTracker healthPermissionIntentAppsTracker) {
865             Objects.requireNonNull(healthPermissionIntentAppsTracker);
866             mPermissionIntentAppsTracker = healthPermissionIntentAppsTracker;
867             return this;
868         }
869 
870         /** Set fake or custom {@link PermissionPackageChangesOrchestrator} */
setPermissionPackageChangesOrchestrator( PermissionPackageChangesOrchestrator permissionPackageChangesOrchestrator)871         public Builder setPermissionPackageChangesOrchestrator(
872                 PermissionPackageChangesOrchestrator permissionPackageChangesOrchestrator) {
873             Objects.requireNonNull(permissionPackageChangesOrchestrator);
874             mPermissionPackageChangesOrchestrator = permissionPackageChangesOrchestrator;
875             return this;
876         }
877 
878         /** Set fake or custom {@link HealthConnectPermissionHelper} */
setHealthConnectPermissionHelper( HealthConnectPermissionHelper healthConnectPermissionHelper)879         public Builder setHealthConnectPermissionHelper(
880                 HealthConnectPermissionHelper healthConnectPermissionHelper) {
881             Objects.requireNonNull(healthConnectPermissionHelper);
882             mHealthConnectPermissionHelper = healthConnectPermissionHelper;
883             return this;
884         }
885 
886         /** Set fake or custom {@link HealthConnectNotificationSender} for export/import. */
setExportImportNotificationSender( HealthConnectNotificationSender notificationSender)887         public Builder setExportImportNotificationSender(
888                 HealthConnectNotificationSender notificationSender) {
889             mExportImportNotificationSender = Objects.requireNonNull(notificationSender);
890             return this;
891         }
892 
893         /** Set fake or custom {@link MigrationCleaner} */
setMigrationCleaner(MigrationCleaner migrationCleaner)894         public Builder setMigrationCleaner(MigrationCleaner migrationCleaner) {
895             Objects.requireNonNull(migrationCleaner);
896             mMigrationCleaner = migrationCleaner;
897             return this;
898         }
899 
900         /** Set fake or custom {@link TimeSource} */
setTimeSource(TimeSource timeSource)901         public Builder setTimeSource(TimeSource timeSource) {
902             Objects.requireNonNull(timeSource);
903             mTimeSource = timeSource;
904             return this;
905         }
906 
907         /** Set fake or custom {@link FitnessRecordUpsertHelper} */
setFitnessRecordUpsertHelper( FitnessRecordUpsertHelper fitnessRecordUpsertHelper)908         public Builder setFitnessRecordUpsertHelper(
909                 FitnessRecordUpsertHelper fitnessRecordUpsertHelper) {
910             Objects.requireNonNull(fitnessRecordUpsertHelper);
911             mFitnessRecordUpsertHelper = fitnessRecordUpsertHelper;
912             return this;
913         }
914 
915         /** Set fake or custom {@link FitnessRecordReadHelper} */
setFitnessReadRequestHandler( FitnessRecordReadHelper fitnessRecordReadHelper)916         public Builder setFitnessReadRequestHandler(
917                 FitnessRecordReadHelper fitnessRecordReadHelper) {
918             Objects.requireNonNull(fitnessRecordReadHelper);
919             mFitnessRecordReadHelper = fitnessRecordReadHelper;
920             return this;
921         }
922 
923         /** Set fake or custom {@link FitnessRecordDeleteHelper} */
setFitnessRecordDeleteHelper( FitnessRecordDeleteHelper fitnessRecordDeleteHelper)924         public Builder setFitnessRecordDeleteHelper(
925                 FitnessRecordDeleteHelper fitnessRecordDeleteHelper) {
926             Objects.requireNonNull(fitnessRecordDeleteHelper);
927             mFitnessRecordDeleteHelper = fitnessRecordDeleteHelper;
928             return this;
929         }
930 
931         /** Set fake or custom {@link FitnessRecordDeleteHelper} */
setFitnessRecordDeleteHelper( FitnessRecordAggregateHelper fitnessRecordAggregateHelper)932         public Builder setFitnessRecordDeleteHelper(
933                 FitnessRecordAggregateHelper fitnessRecordAggregateHelper) {
934             Objects.requireNonNull(fitnessRecordAggregateHelper);
935             mFitnessRecordAggregateHelper = fitnessRecordAggregateHelper;
936             return this;
937         }
938 
939         /** Set fake or custom {@link MedicalDataSourceHelper} */
setMedicalDataSourceHelper(MedicalDataSourceHelper medicalDataSourceHelper)940         public Builder setMedicalDataSourceHelper(MedicalDataSourceHelper medicalDataSourceHelper) {
941             Objects.requireNonNull(medicalDataSourceHelper);
942             mMedicalDataSourceHelper = medicalDataSourceHelper;
943             return this;
944         }
945 
946         /** Set fake or custom {@link MedicalResourceHelper} */
setMedicalResourceHelper(MedicalResourceHelper medicalResourceHelper)947         public Builder setMedicalResourceHelper(MedicalResourceHelper medicalResourceHelper) {
948             Objects.requireNonNull(medicalResourceHelper);
949             mMedicalResourceHelper = medicalResourceHelper;
950             return this;
951         }
952 
953         /** Set fake or custom {@link MigrationBroadcastScheduler} */
setMigrationBroadcastScheduler( MigrationBroadcastScheduler migrationBroadcastScheduler)954         public Builder setMigrationBroadcastScheduler(
955                 MigrationBroadcastScheduler migrationBroadcastScheduler) {
956             Objects.requireNonNull(migrationBroadcastScheduler);
957             mMigrationBroadcastScheduler = migrationBroadcastScheduler;
958             return this;
959         }
960 
961         /** Set fake or custom {@link MigrationUiStateManager} */
setMigrationUiStateManager(MigrationUiStateManager migrationUiStateManager)962         public Builder setMigrationUiStateManager(MigrationUiStateManager migrationUiStateManager) {
963             Objects.requireNonNull(migrationUiStateManager);
964             mMigrationUiStateManager = migrationUiStateManager;
965             return this;
966         }
967 
968         /** Set fake or custom {@link MigrationEntityHelper} */
setMigrationEntityHelper(MigrationEntityHelper migrationEntityHelper)969         public Builder setMigrationEntityHelper(MigrationEntityHelper migrationEntityHelper) {
970             Objects.requireNonNull(migrationEntityHelper);
971             mMigrationEntityHelper = migrationEntityHelper;
972             return this;
973         }
974 
975         /** Set fake or custom {@link PreferencesManager} */
setPreferencesManager(PreferencesManager preferencesManager)976         public Builder setPreferencesManager(PreferencesManager preferencesManager) {
977             Objects.requireNonNull(preferencesManager);
978             mPreferencesManager = preferencesManager;
979             return this;
980         }
981 
982         /** Set fake or custom {@link DatabaseStatsCollector} */
setDatabaseStatsCollector(DatabaseStatsCollector databaseStatsCollector)983         public Builder setDatabaseStatsCollector(DatabaseStatsCollector databaseStatsCollector) {
984             Objects.requireNonNull(databaseStatsCollector);
985             mDatabaseStatsCollector = databaseStatsCollector;
986             return this;
987         }
988 
989         /** Set fake or custom {@link UsageStatsCollector} */
setUsageStatsCollector(UsageStatsCollector usageStatsCollector)990         public Builder setUsageStatsCollector(UsageStatsCollector usageStatsCollector) {
991             Objects.requireNonNull(usageStatsCollector);
992             mUsageStatsCollector = usageStatsCollector;
993             return this;
994         }
995 
996         /** Set fake or custom {@link ReadAccessLogsHelper} */
setReadAccessLogsHelper(ReadAccessLogsHelper readAccessLogsHelper)997         public Builder setReadAccessLogsHelper(ReadAccessLogsHelper readAccessLogsHelper) {
998             Objects.requireNonNull(readAccessLogsHelper);
999             mReadAccessLogsHelper = readAccessLogsHelper;
1000             return this;
1001         }
1002 
1003         /** Set a custom directory to use instead of {@link Environment#getDataDirectory()}. */
setEnvironmentDataDirectory(File environmentDataDirectory)1004         public Builder setEnvironmentDataDirectory(File environmentDataDirectory) {
1005             mEnvironmentDataDirectory = Objects.requireNonNull(environmentDataDirectory);
1006             return this;
1007         }
1008 
1009         /** Set fake or custom {@link AppOpsManagerLocal}. */
setAppOpsManagerLocal(AppOpsManagerLocal appOpsManagerLocal)1010         public Builder setAppOpsManagerLocal(AppOpsManagerLocal appOpsManagerLocal) {
1011             mAppOpsManagerLocal = Objects.requireNonNull(appOpsManagerLocal);
1012             return this;
1013         }
1014 
1015         /** Set fake or custom {@link AppOpsManagerLocal}. */
setThreadScheduler(HealthConnectThreadScheduler threadScheduler)1016         public Builder setThreadScheduler(HealthConnectThreadScheduler threadScheduler) {
1017             mThreadScheduler = Objects.requireNonNull(threadScheduler);
1018             return this;
1019         }
1020 
1021         /** Set fake or custom {@link AppOpsManagerLocal}. */
setHealthFitnessStatsLog(HealthFitnessStatsLog statsLog)1022         public Builder setHealthFitnessStatsLog(HealthFitnessStatsLog statsLog) {
1023             mStatsLog = Objects.requireNonNull(statsLog);
1024             return this;
1025         }
1026 
1027         /** Set fake or custom {@link TrackerManager}. */
setTrackerManager(TrackerManager trackerManager)1028         public Builder setTrackerManager(TrackerManager trackerManager) {
1029             mTrackerManager = Objects.requireNonNull(trackerManager);
1030             return this;
1031         }
1032 
1033         /** Build HealthConnectInjector */
build()1034         public HealthConnectInjector build() {
1035             return new HealthConnectInjectorImpl(this);
1036         }
1037     }
1038 }
1039