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