From 64c5b0cfe37d6211ac2398f2f4a049eba7a43086 Mon Sep 17 00:00:00 2001 From: Sarthak Agarwal Date: Fri, 2 Sep 2022 12:02:37 +0530 Subject: [PATCH] Fixes #4334: Log report creation support for performance metrics collection (#4388) * qualifiers and constants for metric record and upload times * comments * dagger provides for flags * rename to enablePerformanceMetricCollection * initial proto * nit fixes * nit fixes * comments. * nits * nit * updates. * updates. * nits. * metric log inclusion. * base setup. * name correction. * nits. * nits. * storage comment * pss comment * network usage comment. * network usage comment - part 2. * metric addition in proto definitions. * metricLog --> loggableMetric * proto definitions in oppiaLogger * wording update for transmission * dependency/api updates. * nits. * metric controller and oppiaLogger * nits * logger-controller pattern, single utils * nits * comments * performance metric event logger nits. * nits. * deleting unused interfaces. * log generator to metric log scheduler * nits * worker functions to schedule logging, renaming * nits. * clearing up build errors. * nits. * removal of dependency from oppiaLogger and basing the entire implementation on Logger-Controller * performanceMetricController tests + fakeLogger * fakeLogger tests * nits * tests for the new logger. * tests for the worker + renaming of package to logScheduler * tests for work manager initializer * initial base setup for utils test * nits * nits * performanceMetricsUtils tests * nits * renamed logUpload to logReport + nits * nits * review updates. * nit * review updates - 2 * isAppInForeground revamp * isAppInForeground revamp * nits * domain tests repair * app tests repair * nits. * nits. * nits. * nits. * nit * test update. * test update. * nit * todo issue number update -- static check * comments. * nits. * utils test + nits * utils test + nits * nits * test rearrangement * nits * test fixes. * nits * memory and storage tier updates * memory and storage tier updates * updates. * nits * test file exemptions refactor due to file renaming. * additional tests, nit fixes. * activity manager shadow and assessor test * nit * nit * shadow traffic stats + assessor test fix. * custom shadow tests * module deps * tests * nits * metricLogScheduler refactor and test * exemption removal * nits * updates. * variable nits + parameterized test exemption * app component dependencies. * nits * logging module bazel build, config module creation * testing robolectric bazel module update * domain bazel build fixes * working oppia bazel build * nits. * nits. * nit for bazel building * addition of test file for module * bazel tests fixes * more fixes. * reformatting * nits * nits * dep fix * deps fix * deps fix * nit * nits * nits * test fixes -- renaming. * deps addition * previous merge correction * nits * updates. * nits * bazel update. * nit * nits. --- .../oppia/android/app/application/BUILD.bazel | 4 + .../alpha/AlphaApplicationComponent.kt | 12 +- .../AlphaKenyaApplicationComponent.kt | 12 +- .../dev/DeveloperApplicationComponent.kt | 12 +- .../AdministratorControlsActivityTest.kt | 7 +- .../AdministratorControlsFragmentTest.kt | 7 +- .../AppVersionActivityTest.kt | 7 +- .../ProfileAndDeviceIdActivityTest.kt | 7 +- .../ProfileAndDeviceIdFragmentTest.kt | 7 +- .../CompletedStoryListActivityTest.kt | 7 +- .../LessonThumbnailImageViewTest.kt | 7 +- .../MathExpressionInteractionsViewTest.kt | 7 +- .../DrawableBindingAdaptersTest.kt | 7 +- .../ImageViewBindingAdaptersTest.kt | 8 +- .../databinding/MarginBindingAdaptersTest.kt | 8 +- ...StateAssemblerMarginBindingAdaptersTest.kt | 8 +- ...tateAssemblerPaddingBindingAdaptersTest.kt | 8 +- .../TextViewBindingAdaptersTest.kt | 7 +- .../databinding/ViewBindingAdaptersTest.kt | 8 +- .../DeveloperOptionsActivityTest.kt | 7 +- .../DeveloperOptionsFragmentTest.kt | 7 +- .../MarkChaptersCompletedActivityTest.kt | 7 +- .../MarkChaptersCompletedFragmentTest.kt | 7 +- .../MarkStoriesCompletedActivityTest.kt | 7 +- .../MarkStoriesCompletedFragmentTest.kt | 7 +- .../MarkTopicsCompletedActivityTest.kt | 7 +- .../MarkTopicsCompletedFragmentTest.kt | 7 +- .../devoptions/ViewEventLogsActivityTest.kt | 10 +- .../devoptions/ViewEventLogsFragmentTest.kt | 12 +- .../ForceNetworkTypeActivityTest.kt | 8 +- .../ForceNetworkTypeFragmentTest.kt | 8 +- .../MathExpressionParserActivityTest.kt | 7 +- .../MathExpressionParserFragmentTest.kt | 7 +- .../android/app/faq/FAQListFragmentTest.kt | 7 +- .../android/app/faq/FAQSingleActivityTest.kt | 7 +- .../android/app/faq/FaqListActivityTest.kt | 7 +- .../android/app/help/HelpActivityTest.kt | 7 +- .../android/app/help/HelpFragmentTest.kt | 7 +- .../android/app/home/HomeActivityTest.kt | 7 +- .../app/home/RecentlyPlayedFragmentTest.kt | 7 +- .../app/home/TopicSummaryViewModelTest.kt | 7 +- .../android/app/home/WelcomeViewModelTest.kt | 7 +- .../PromotedStoryListViewModelTest.kt | 7 +- .../PromotedStoryViewModelTest.kt | 7 +- .../mydownloads/MyDownloadsActivityTest.kt | 7 +- .../mydownloads/MyDownloadsFragmentTest.kt | 7 +- .../app/onboarding/OnboardingActivityTest.kt | 7 +- .../app/onboarding/OnboardingFragmentTest.kt | 7 +- .../OngoingTopicListActivityTest.kt | 7 +- .../app/options/AppLanguageActivityTest.kt | 7 +- .../app/options/AppLanguageFragmentTest.kt | 7 +- .../app/options/AudioLanguageActivityTest.kt | 7 +- .../app/options/AudioLanguageFragmentTest.kt | 7 +- .../app/options/OptionsActivityTest.kt | 7 +- .../app/options/OptionsFragmentTest.kt | 7 +- .../options/ReadingTextSizeActivityTest.kt | 7 +- .../options/ReadingTextSizeFragmentTest.kt | 7 +- .../android/app/parser/HtmlParserTest.kt | 7 +- .../parser/ListItemLeadingMarginSpanTest.kt | 7 +- .../app/player/audio/AudioFragmentTest.kt | 7 +- .../exploration/ExplorationActivityTest.kt | 8 +- .../app/player/state/StateFragmentTest.kt | 7 +- .../app/policies/PoliciesActivityTest.kt | 7 +- .../app/policies/PoliciesFragmentTest.kt | 7 +- .../app/profile/AddProfileActivityTest.kt | 7 +- .../app/profile/AdminAuthActivityTest.kt | 7 +- .../app/profile/AdminPinActivityTest.kt | 7 +- .../app/profile/PinPasswordActivityTest.kt | 7 +- .../app/profile/ProfileChooserFragmentTest.kt | 7 +- .../ProfilePictureActivityTest.kt | 7 +- .../ProfileProgressActivityTest.kt | 7 +- .../ProfileProgressFragmentTest.kt | 7 +- .../app/recyclerview/BindableAdapterTest.kt | 7 +- .../resumelesson/ResumeLessonActivityTest.kt | 7 +- .../resumelesson/ResumeLessonFragmentTest.kt | 7 +- .../profile/ProfileEditActivityTest.kt | 7 +- .../profile/ProfileEditFragmentTest.kt | 7 +- .../profile/ProfileListActivityTest.kt | 7 +- .../profile/ProfileListFragmentTest.kt | 7 +- .../profile/ProfileRenameActivityTest.kt | 7 +- .../profile/ProfileRenameFragmentTest.kt | 7 +- .../profile/ProfileResetPinActivityTest.kt | 7 +- .../profile/ProfileResetPinFragmentTest.kt | 7 +- .../android/app/splash/SplashActivityTest.kt | 7 +- .../android/app/story/StoryActivityTest.kt | 7 +- .../android/app/story/StoryFragmentTest.kt | 7 +- .../app/testing/DragDropTestActivityTest.kt | 7 +- ...ImageRegionSelectionInteractionViewTest.kt | 7 +- .../InputInteractionViewTestActivityTest.kt | 7 +- .../NavigationDrawerActivityDebugTest.kt | 7 +- .../NavigationDrawerActivityProdTest.kt | 7 +- ...tFontScaleConfigurationUtilActivityTest.kt | 7 +- .../testing/TopicTestActivityForStoryTest.kt | 7 +- .../app/thirdparty/LicenseListActivityTest.kt | 8 +- .../app/thirdparty/LicenseListFragmentTest.kt | 8 +- .../LicenseTextViewerActivityTest.kt | 8 +- .../LicenseTextViewerFragmentTest.kt | 8 +- .../ThirdPartyDependencyListActivityTest.kt | 8 +- .../ThirdPartyDependencyListFragmentTest.kt | 8 +- .../android/app/topic/TopicActivityTest.kt | 7 +- .../android/app/topic/TopicFragmentTest.kt | 7 +- .../conceptcard/ConceptCardFragmentTest.kt | 7 +- .../app/topic/info/TopicInfoFragmentTest.kt | 7 +- .../topic/lessons/TopicLessonsFragmentTest.kt | 7 +- .../practice/TopicPracticeFragmentTest.kt | 7 +- .../QuestionPlayerActivityTest.kt | 7 +- .../revision/TopicRevisionFragmentTest.kt | 7 +- .../revisioncard/RevisionCardActivityTest.kt | 7 +- .../revisioncard/RevisionCardFragmentTest.kt | 7 +- .../app/utility/RatioExtensionsTest.kt | 7 +- .../walkthrough/WalkthroughActivityTest.kt | 7 +- .../WalkthroughFinalFragmentTest.kt | 7 +- .../WalkthroughTopicListFragmentTest.kt | 7 +- .../WalkthroughWelcomeFragmentTest.kt | 7 +- .../activity/ActivityIntentFactoriesTest.kt | 7 +- .../android/app/home/HomeActivityLocalTest.kt | 7 +- .../app/parser/FractionParsingUiErrorTest.kt | 7 +- .../app/parser/StringToRatioParserTest.kt | 7 +- .../ExplorationActivityLocalTest.kt | 7 +- .../player/state/StateFragmentLocalTest.kt | 7 +- .../ProfileChooserFragmentLocalTest.kt | 7 +- .../app/story/StoryActivityLocalTest.kt | 7 +- .../app/testing/CompletedStoryListSpanTest.kt | 7 +- .../oppia/android/app/testing/HomeSpanTest.kt | 7 +- .../app/testing/OngoingTopicListSpanTest.kt | 7 +- .../PlatformParameterIntegrationTest.kt | 7 +- .../app/testing/ProfileChooserSpanTest.kt | 7 +- .../testing/ProfileProgressSpanCountTest.kt | 7 +- .../app/testing/RecentlyPlayedSpanTest.kt | 7 +- .../app/testing/TopicRevisionSpanTest.kt | 7 +- .../app/testing/activity/TestActivityTest.kt | 7 +- .../AdministratorControlsFragmentTest.kt | 7 +- .../testing/options/OptionsFragmentTest.kt | 7 +- .../player/split/PlayerSplitScreenTest.kt | 7 +- .../state/StateFragmentAccessibilityTest.kt | 7 +- .../topic/info/TopicInfoFragmentLocalTest.kt | 7 +- .../lessons/TopicLessonsFragmentLocalTest.kt | 7 +- .../QuestionPlayerActivityLocalTest.kt | 7 +- .../RevisionCardActivityLocalTest.kt | 7 +- .../AppLanguageResourceHandlerTest.kt | 7 +- .../AppLanguageWatcherMixinTest.kt | 7 +- .../MathExpressionAccessibilityUtilTest.kt | 7 +- domain/BUILD.bazel | 6 + .../domain/oppialogger/LogStorageModule.kt | 13 + .../analytics/ApplicationLifecycleObserver.kt | 3 + .../domain/oppialogger/analytics/BUILD.bazel | 52 ++ .../analytics/PerformanceMetricsController.kt | 193 ++++++ .../analytics/PerformanceMetricsLogger.kt | 305 ++++++++++ .../PerformanceMetricsLoggerModule.kt | 16 + .../oppialogger/analytics/testing/BUILD.bazel | 22 + .../analytics/testing/FakeLogScheduler.kt | 58 ++ .../oppialogger/logscheduler/BUILD.bazel | 61 ++ .../logscheduler/MetricLogSchedulerModule.kt | 14 + .../logscheduler/MetricLogSchedulingWorker.kt | 125 ++++ .../MetricLogSchedulingWorkerFactory.kt | 22 + .../PerformanceMetricsLogScheduler.kt | 50 ++ .../oppialogger/loguploader/BUILD.bazel | 6 +- .../LogReportWorkManagerInitializer.kt | 195 ++++++ ...rkerModule.kt => LogReportWorkerModule.kt} | 6 +- .../LogUploadWorkManagerInitializer.kt | 74 --- .../WorkManagerConfigurationModule.kt | 5 +- .../ApplicationLifecycleObserverTest.kt | 17 + .../PerformanceMetricsControllerTest.kt | 555 ++++++++++++++++++ .../PerformanceMetricsLoggerModuleTest.kt | 106 ++++ .../analytics/PerformanceMetricsLoggerTest.kt | 315 ++++++++++ .../analytics/testing/FakeLogSchedulerTest.kt | 182 ++++++ .../MetricLogSchedulerModuleTest.kt | 79 +++ .../MetricLogSchedulingWorkerTest.kt | 292 +++++++++ .../PerformanceMetricsLogSchedulerTest.kt | 205 +++++++ ...=> LogReportWorkManagerInitializerTest.kt} | 111 +++- .../loguploader/LogUploadWorkerTest.kt | 2 +- .../application/TestApplicationComponent.kt | 12 +- model/src/main/proto/BUILD.bazel | 11 + .../src/main/proto/performance_metrics.proto | 12 +- .../file_content_validation_checks.textproto | 2 + scripts/assets/test_file_exemptions.textproto | 6 +- testing/BUILD.bazel | 6 + .../testing/FakePerformanceMetricAssessor.kt | 67 +++ .../FakePerformanceMetricsEventLogger.kt | 41 ++ .../android/testing/TestLogReportingModule.kt | 12 + .../android/testing/robolectric/BUILD.bazel | 24 + .../robolectric/OppiaShadowActivityManager.kt | 54 ++ .../robolectric/OppiaShadowTrafficStats.kt | 57 ++ .../FakePerformanceMetricAssessorTest.kt | 174 ++++++ .../FakePerformanceMetricsEventLoggerTest.kt | 324 ++++++++++ ...alizeDefaultLocaleRuleCustomContextTest.kt | 7 +- ...InitializeDefaultLocaleRuleOmissionTest.kt | 7 +- .../junit/InitializeDefaultLocaleRuleTest.kt | 7 +- .../OppiaShadowActivityManagerTest.kt | 160 +++++ .../OppiaShadowTrafficStatsTest.kt | 111 ++++ utility/BUILD.bazel | 8 + .../oppia/android/util/logging/BUILD.bazel | 12 + .../util/logging/MetricLogScheduler.kt | 31 + .../android/util/logging/firebase/BUILD.bazel | 2 + .../firebase/DebugLogReportingModule.kt | 8 + .../logging/firebase/FirebaseEventLogger.kt | 23 +- .../logging/firebase/LogReportingModule.kt | 8 + .../logging/performancemetrics/BUILD.bazel | 71 +++ .../PerformanceMetricsAssessor.kt | 38 ++ .../PerformanceMetricsAssessorImpl.kt | 73 +++ .../PerformanceMetricsAssessorModule.kt | 14 + .../PerformanceMetricsConfigurationsModule.kt | 51 ++ .../PerformanceMetricsEventLogger.kt | 13 + .../PerformanceMetricsAssessorImplTest.kt | 343 +++++++++++ .../PerformanceMetricsAssessorModuleTest.kt | 91 +++ ...formanceMetricsConfigurationsModuleTest.kt | 121 ++++ 206 files changed, 5579 insertions(+), 540 deletions(-) create mode 100644 domain/src/main/java/org/oppia/android/domain/oppialogger/analytics/PerformanceMetricsController.kt create mode 100644 domain/src/main/java/org/oppia/android/domain/oppialogger/analytics/PerformanceMetricsLogger.kt create mode 100644 domain/src/main/java/org/oppia/android/domain/oppialogger/analytics/PerformanceMetricsLoggerModule.kt create mode 100644 domain/src/main/java/org/oppia/android/domain/oppialogger/analytics/testing/BUILD.bazel create mode 100644 domain/src/main/java/org/oppia/android/domain/oppialogger/analytics/testing/FakeLogScheduler.kt create mode 100644 domain/src/main/java/org/oppia/android/domain/oppialogger/logscheduler/BUILD.bazel create mode 100644 domain/src/main/java/org/oppia/android/domain/oppialogger/logscheduler/MetricLogSchedulerModule.kt create mode 100644 domain/src/main/java/org/oppia/android/domain/oppialogger/logscheduler/MetricLogSchedulingWorker.kt create mode 100644 domain/src/main/java/org/oppia/android/domain/oppialogger/logscheduler/MetricLogSchedulingWorkerFactory.kt create mode 100644 domain/src/main/java/org/oppia/android/domain/oppialogger/logscheduler/PerformanceMetricsLogScheduler.kt create mode 100644 domain/src/main/java/org/oppia/android/domain/oppialogger/loguploader/LogReportWorkManagerInitializer.kt rename domain/src/main/java/org/oppia/android/domain/oppialogger/loguploader/{LogUploadWorkerModule.kt => LogReportWorkerModule.kt} (71%) delete mode 100644 domain/src/main/java/org/oppia/android/domain/oppialogger/loguploader/LogUploadWorkManagerInitializer.kt create mode 100644 domain/src/test/java/org/oppia/android/domain/oppialogger/analytics/PerformanceMetricsControllerTest.kt create mode 100644 domain/src/test/java/org/oppia/android/domain/oppialogger/analytics/PerformanceMetricsLoggerModuleTest.kt create mode 100644 domain/src/test/java/org/oppia/android/domain/oppialogger/analytics/PerformanceMetricsLoggerTest.kt create mode 100644 domain/src/test/java/org/oppia/android/domain/oppialogger/analytics/testing/FakeLogSchedulerTest.kt create mode 100644 domain/src/test/java/org/oppia/android/domain/oppialogger/logscheduler/MetricLogSchedulerModuleTest.kt create mode 100644 domain/src/test/java/org/oppia/android/domain/oppialogger/logscheduler/MetricLogSchedulingWorkerTest.kt create mode 100644 domain/src/test/java/org/oppia/android/domain/oppialogger/logscheduler/PerformanceMetricsLogSchedulerTest.kt rename domain/src/test/java/org/oppia/android/domain/oppialogger/loguploader/{LogUploadWorkManagerInitializerTest.kt => LogReportWorkManagerInitializerTest.kt} (59%) create mode 100644 testing/src/main/java/org/oppia/android/testing/FakePerformanceMetricAssessor.kt create mode 100644 testing/src/main/java/org/oppia/android/testing/FakePerformanceMetricsEventLogger.kt create mode 100644 testing/src/main/java/org/oppia/android/testing/robolectric/OppiaShadowActivityManager.kt create mode 100644 testing/src/main/java/org/oppia/android/testing/robolectric/OppiaShadowTrafficStats.kt create mode 100644 testing/src/test/java/org/oppia/android/testing/FakePerformanceMetricAssessorTest.kt create mode 100644 testing/src/test/java/org/oppia/android/testing/FakePerformanceMetricsEventLoggerTest.kt create mode 100644 testing/src/test/java/org/oppia/android/testing/robolectric/OppiaShadowActivityManagerTest.kt create mode 100644 testing/src/test/java/org/oppia/android/testing/robolectric/OppiaShadowTrafficStatsTest.kt create mode 100644 utility/src/main/java/org/oppia/android/util/logging/MetricLogScheduler.kt create mode 100644 utility/src/main/java/org/oppia/android/util/logging/performancemetrics/BUILD.bazel create mode 100644 utility/src/main/java/org/oppia/android/util/logging/performancemetrics/PerformanceMetricsAssessor.kt create mode 100644 utility/src/main/java/org/oppia/android/util/logging/performancemetrics/PerformanceMetricsAssessorImpl.kt create mode 100644 utility/src/main/java/org/oppia/android/util/logging/performancemetrics/PerformanceMetricsAssessorModule.kt create mode 100644 utility/src/main/java/org/oppia/android/util/logging/performancemetrics/PerformanceMetricsConfigurationsModule.kt create mode 100644 utility/src/main/java/org/oppia/android/util/logging/performancemetrics/PerformanceMetricsEventLogger.kt create mode 100644 utility/src/test/java/org/oppia/android/util/logging/performancemetrics/PerformanceMetricsAssessorImplTest.kt create mode 100644 utility/src/test/java/org/oppia/android/util/logging/performancemetrics/PerformanceMetricsAssessorModuleTest.kt create mode 100644 utility/src/test/java/org/oppia/android/util/logging/performancemetrics/PerformanceMetricsConfigurationsModuleTest.kt diff --git a/app/src/main/java/org/oppia/android/app/application/BUILD.bazel b/app/src/main/java/org/oppia/android/app/application/BUILD.bazel index 9b2927ff303..593be4f261a 100644 --- a/app/src/main/java/org/oppia/android/app/application/BUILD.bazel +++ b/app/src/main/java/org/oppia/android/app/application/BUILD.bazel @@ -115,8 +115,10 @@ android_library( "//domain/src/main/java/org/oppia/android/domain/classify/rules/ratioinput:ratio_input_module", "//domain/src/main/java/org/oppia/android/domain/classify/rules/textinput:text_input_rule_module", "//domain/src/main/java/org/oppia/android/domain/onboarding:retriever_prod_module", + "//domain/src/main/java/org/oppia/android/domain/oppialogger/analytics:performance_metrics_logger_module", "//domain/src/main/java/org/oppia/android/domain/oppialogger/analytics:prod_module", "//domain/src/main/java/org/oppia/android/domain/oppialogger/exceptions:logger_module", + "//domain/src/main/java/org/oppia/android/domain/oppialogger/logscheduler:metric_log_scheduler_module", "//domain/src/main/java/org/oppia/android/domain/oppialogger/loguploader:worker_module", "//utility/src/main/java/org/oppia/android/util/accessibility:prod_module", "//utility/src/main/java/org/oppia/android/util/caching:asset_prod_module", @@ -124,6 +126,8 @@ android_library( "//utility/src/main/java/org/oppia/android/util/locale:prod_module", "//utility/src/main/java/org/oppia/android/util/logging:prod_module", "//utility/src/main/java/org/oppia/android/util/logging/firebase:prod_module", + "//utility/src/main/java/org/oppia/android/util/logging/performancemetrics:performance_metrics_assessor_module", + "//utility/src/main/java/org/oppia/android/util/logging/performancemetrics:performance_metrics_configurations_module", "//utility/src/main/java/org/oppia/android/util/networking:debug_util_module", "//utility/src/main/java/org/oppia/android/util/parser/html:html_parser_entity_type_module", "//utility/src/main/java/org/oppia/android/util/parser/image:glide_image_loader_module", diff --git a/app/src/main/java/org/oppia/android/app/application/alpha/AlphaApplicationComponent.kt b/app/src/main/java/org/oppia/android/app/application/alpha/AlphaApplicationComponent.kt index 8aa2c20f6bd..997ff520abf 100644 --- a/app/src/main/java/org/oppia/android/app/application/alpha/AlphaApplicationComponent.kt +++ b/app/src/main/java/org/oppia/android/app/application/alpha/AlphaApplicationComponent.kt @@ -33,8 +33,10 @@ import org.oppia.android.domain.onboarding.ExpirationMetaDataRetrieverModule import org.oppia.android.domain.oppialogger.LogStorageModule import org.oppia.android.domain.oppialogger.LoggingIdentifierModule import org.oppia.android.domain.oppialogger.analytics.ApplicationLifecycleModule +import org.oppia.android.domain.oppialogger.analytics.PerformanceMetricsLoggerModule import org.oppia.android.domain.oppialogger.exceptions.UncaughtExceptionLoggerModule -import org.oppia.android.domain.oppialogger.loguploader.LogUploadWorkerModule +import org.oppia.android.domain.oppialogger.logscheduler.MetricLogSchedulerModule +import org.oppia.android.domain.oppialogger.loguploader.LogReportWorkerModule import org.oppia.android.domain.platformparameter.PlatformParameterModule import org.oppia.android.domain.platformparameter.PlatformParameterSingletonModule import org.oppia.android.domain.platformparameter.syncup.PlatformParameterSyncUpWorkerModule @@ -50,6 +52,8 @@ import org.oppia.android.util.logging.LoggerModule import org.oppia.android.util.logging.SyncStatusModule import org.oppia.android.util.logging.firebase.FirebaseLogUploaderModule import org.oppia.android.util.logging.firebase.LogReportingModule +import org.oppia.android.util.logging.performancemetrics.PerformanceMetricsAssessorModule +import org.oppia.android.util.logging.performancemetrics.PerformanceMetricsConfigurationsModule import org.oppia.android.util.networking.NetworkConnectionDebugUtilModule import org.oppia.android.util.networking.NetworkConnectionUtilProdModule import org.oppia.android.util.parser.html.HtmlParserEntityTypeModule @@ -77,7 +81,7 @@ import javax.inject.Singleton LogStorageModule::class, IntentFactoryShimModule::class, ViewBindingShimModule::class, PrimeTopicAssetsControllerModule::class, ExpirationMetaDataRetrieverModule::class, RatioInputModule::class, UncaughtExceptionLoggerModule::class, - ApplicationStartupListenerModule::class, LogUploadWorkerModule::class, + ApplicationStartupListenerModule::class, LogReportWorkerModule::class, WorkManagerConfigurationModule::class, HintsAndSolutionConfigModule::class, FirebaseLogUploaderModule::class, NetworkModule::class, PracticeTabModule::class, PlatformParameterModule::class, PlatformParameterSingletonModule::class, @@ -89,7 +93,9 @@ import javax.inject.Singleton LoggingIdentifierModule::class, ApplicationLifecycleModule::class, NetworkConnectionDebugUtilModule::class, LoggingIdentifierModule::class, SyncStatusModule::class, LogReportingModule::class, NetworkConnectionUtilProdModule::class, - HintsAndSolutionProdModule::class + HintsAndSolutionProdModule::class, MetricLogSchedulerModule::class, + PerformanceMetricsLoggerModule::class, PerformanceMetricsAssessorModule::class, + PerformanceMetricsConfigurationsModule::class ] ) interface AlphaApplicationComponent : ApplicationComponent { diff --git a/app/src/main/java/org/oppia/android/app/application/alphakenya/AlphaKenyaApplicationComponent.kt b/app/src/main/java/org/oppia/android/app/application/alphakenya/AlphaKenyaApplicationComponent.kt index 5a31d7f8f4d..2d20f037a76 100644 --- a/app/src/main/java/org/oppia/android/app/application/alphakenya/AlphaKenyaApplicationComponent.kt +++ b/app/src/main/java/org/oppia/android/app/application/alphakenya/AlphaKenyaApplicationComponent.kt @@ -33,8 +33,10 @@ import org.oppia.android.domain.onboarding.ExpirationMetaDataRetrieverModule import org.oppia.android.domain.oppialogger.LogStorageModule import org.oppia.android.domain.oppialogger.LoggingIdentifierModule import org.oppia.android.domain.oppialogger.analytics.ApplicationLifecycleModule +import org.oppia.android.domain.oppialogger.analytics.PerformanceMetricsLoggerModule import org.oppia.android.domain.oppialogger.exceptions.UncaughtExceptionLoggerModule -import org.oppia.android.domain.oppialogger.loguploader.LogUploadWorkerModule +import org.oppia.android.domain.oppialogger.logscheduler.MetricLogSchedulerModule +import org.oppia.android.domain.oppialogger.loguploader.LogReportWorkerModule import org.oppia.android.domain.platformparameter.PlatformParameterAlphaKenyaModule import org.oppia.android.domain.platformparameter.PlatformParameterSingletonModule import org.oppia.android.domain.platformparameter.syncup.PlatformParameterSyncUpWorkerModule @@ -50,6 +52,8 @@ import org.oppia.android.util.logging.LoggerModule import org.oppia.android.util.logging.SyncStatusModule import org.oppia.android.util.logging.firebase.FirebaseLogUploaderModule import org.oppia.android.util.logging.firebase.LogReportingModule +import org.oppia.android.util.logging.performancemetrics.PerformanceMetricsAssessorModule +import org.oppia.android.util.logging.performancemetrics.PerformanceMetricsConfigurationsModule import org.oppia.android.util.networking.NetworkConnectionDebugUtilModule import org.oppia.android.util.networking.NetworkConnectionUtilProdModule import org.oppia.android.util.parser.html.HtmlParserEntityTypeModule @@ -77,7 +81,7 @@ import javax.inject.Singleton LogStorageModule::class, IntentFactoryShimModule::class, ViewBindingShimModule::class, PrimeTopicAssetsControllerModule::class, ExpirationMetaDataRetrieverModule::class, RatioInputModule::class, UncaughtExceptionLoggerModule::class, - ApplicationStartupListenerModule::class, LogUploadWorkerModule::class, + ApplicationStartupListenerModule::class, LogReportWorkerModule::class, WorkManagerConfigurationModule::class, HintsAndSolutionConfigAlphaKenyaModule::class, FirebaseLogUploaderModule::class, NetworkModule::class, PracticeTabModule::class, PlatformParameterAlphaKenyaModule::class, PlatformParameterSingletonModule::class, @@ -89,7 +93,9 @@ import javax.inject.Singleton LoggingIdentifierModule::class, ApplicationLifecycleModule::class, NetworkConnectionDebugUtilModule::class, LoggingIdentifierModule::class, SyncStatusModule::class, LogReportingModule::class, NetworkConnectionUtilProdModule::class, - HintsAndSolutionProdModule::class + HintsAndSolutionProdModule::class, MetricLogSchedulerModule::class, + PerformanceMetricsLoggerModule::class, PerformanceMetricsAssessorModule::class, + PerformanceMetricsConfigurationsModule::class ] ) interface AlphaKenyaApplicationComponent : ApplicationComponent { diff --git a/app/src/main/java/org/oppia/android/app/application/dev/DeveloperApplicationComponent.kt b/app/src/main/java/org/oppia/android/app/application/dev/DeveloperApplicationComponent.kt index aee630025d2..9d2bd782568 100644 --- a/app/src/main/java/org/oppia/android/app/application/dev/DeveloperApplicationComponent.kt +++ b/app/src/main/java/org/oppia/android/app/application/dev/DeveloperApplicationComponent.kt @@ -34,8 +34,10 @@ import org.oppia.android.domain.onboarding.ExpirationMetaDataRetrieverModule import org.oppia.android.domain.oppialogger.LogStorageModule import org.oppia.android.domain.oppialogger.LoggingIdentifierModule import org.oppia.android.domain.oppialogger.analytics.ApplicationLifecycleModule +import org.oppia.android.domain.oppialogger.analytics.PerformanceMetricsLoggerModule import org.oppia.android.domain.oppialogger.exceptions.UncaughtExceptionLoggerModule -import org.oppia.android.domain.oppialogger.loguploader.LogUploadWorkerModule +import org.oppia.android.domain.oppialogger.logscheduler.MetricLogSchedulerModule +import org.oppia.android.domain.oppialogger.loguploader.LogReportWorkerModule import org.oppia.android.domain.platformparameter.PlatformParameterModule import org.oppia.android.domain.platformparameter.PlatformParameterSingletonModule import org.oppia.android.domain.platformparameter.syncup.PlatformParameterSyncUpWorkerModule @@ -51,6 +53,8 @@ import org.oppia.android.util.logging.LoggerModule import org.oppia.android.util.logging.SyncStatusModule import org.oppia.android.util.logging.firebase.DebugLogReportingModule import org.oppia.android.util.logging.firebase.FirebaseLogUploaderModule +import org.oppia.android.util.logging.performancemetrics.PerformanceMetricsAssessorModule +import org.oppia.android.util.logging.performancemetrics.PerformanceMetricsConfigurationsModule import org.oppia.android.util.networking.NetworkConnectionDebugUtilModule import org.oppia.android.util.networking.NetworkConnectionUtilDebugModule import org.oppia.android.util.parser.html.HtmlParserEntityTypeModule @@ -79,7 +83,7 @@ import javax.inject.Singleton ViewBindingShimModule::class, PrimeTopicAssetsControllerModule::class, ExpirationMetaDataRetrieverModule::class, RatioInputModule::class, UncaughtExceptionLoggerModule::class, ApplicationStartupListenerModule::class, - LogUploadWorkerModule::class, WorkManagerConfigurationModule::class, + LogReportWorkerModule::class, WorkManagerConfigurationModule::class, HintsAndSolutionConfigModule::class, HintsAndSolutionDebugModule::class, FirebaseLogUploaderModule::class, NetworkModule::class, PracticeTabModule::class, PlatformParameterModule::class, PlatformParameterSingletonModule::class, @@ -90,7 +94,9 @@ import javax.inject.Singleton NumericExpressionInputModule::class, AlgebraicExpressionInputModule::class, MathEquationInputModule::class, SplitScreenInteractionModule::class, LoggingIdentifierModule::class, ApplicationLifecycleModule::class, - NetworkConnectionDebugUtilModule::class, LoggingIdentifierModule::class, SyncStatusModule::class + NetworkConnectionDebugUtilModule::class, LoggingIdentifierModule::class, + SyncStatusModule::class, MetricLogSchedulerModule::class, PerformanceMetricsLoggerModule::class, + PerformanceMetricsAssessorModule::class, PerformanceMetricsConfigurationsModule::class ] ) interface DeveloperApplicationComponent : ApplicationComponent { diff --git a/app/src/sharedTest/java/org/oppia/android/app/administratorcontrols/AdministratorControlsActivityTest.kt b/app/src/sharedTest/java/org/oppia/android/app/administratorcontrols/AdministratorControlsActivityTest.kt index 1b46cb78cb4..5918ad0614f 100644 --- a/app/src/sharedTest/java/org/oppia/android/app/administratorcontrols/AdministratorControlsActivityTest.kt +++ b/app/src/sharedTest/java/org/oppia/android/app/administratorcontrols/AdministratorControlsActivityTest.kt @@ -89,7 +89,8 @@ import org.oppia.android.domain.onboarding.ExpirationMetaDataRetrieverModule import org.oppia.android.domain.oppialogger.LogStorageModule import org.oppia.android.domain.oppialogger.LoggingIdentifierModule import org.oppia.android.domain.oppialogger.analytics.ApplicationLifecycleModule -import org.oppia.android.domain.oppialogger.loguploader.LogUploadWorkerModule +import org.oppia.android.domain.oppialogger.logscheduler.MetricLogSchedulerModule +import org.oppia.android.domain.oppialogger.loguploader.LogReportWorkerModule import org.oppia.android.domain.platformparameter.PlatformParameterSingletonModule import org.oppia.android.domain.question.QuestionModule import org.oppia.android.domain.topic.PrimeTopicAssetsControllerModule @@ -824,7 +825,7 @@ class AdministratorControlsActivityTest { AccessibilityTestModule::class, LogStorageModule::class, CachingTestModule::class, PrimeTopicAssetsControllerModule::class, ExpirationMetaDataRetrieverModule::class, ViewBindingShimModule::class, RatioInputModule::class, WorkManagerConfigurationModule::class, - ApplicationStartupListenerModule::class, LogUploadWorkerModule::class, + ApplicationStartupListenerModule::class, LogReportWorkerModule::class, HintsAndSolutionConfigModule::class, HintsAndSolutionProdModule::class, FirebaseLogUploaderModule::class, FakeOppiaClockModule::class, PracticeTabModule::class, DeveloperOptionsStarterModule::class, DeveloperOptionsModule::class, @@ -834,7 +835,7 @@ class AdministratorControlsActivityTest { NumericExpressionInputModule::class, AlgebraicExpressionInputModule::class, MathEquationInputModule::class, SplitScreenInteractionModule::class, LoggingIdentifierModule::class, ApplicationLifecycleModule::class, - SyncStatusModule::class + SyncStatusModule::class, MetricLogSchedulerModule::class ] ) interface TestApplicationComponent : ApplicationComponent { diff --git a/app/src/sharedTest/java/org/oppia/android/app/administratorcontrols/AdministratorControlsFragmentTest.kt b/app/src/sharedTest/java/org/oppia/android/app/administratorcontrols/AdministratorControlsFragmentTest.kt index 2f737fe499b..ae58e53a313 100644 --- a/app/src/sharedTest/java/org/oppia/android/app/administratorcontrols/AdministratorControlsFragmentTest.kt +++ b/app/src/sharedTest/java/org/oppia/android/app/administratorcontrols/AdministratorControlsFragmentTest.kt @@ -80,7 +80,8 @@ import org.oppia.android.domain.onboarding.ExpirationMetaDataRetrieverModule import org.oppia.android.domain.oppialogger.LogStorageModule import org.oppia.android.domain.oppialogger.LoggingIdentifierModule import org.oppia.android.domain.oppialogger.analytics.ApplicationLifecycleModule -import org.oppia.android.domain.oppialogger.loguploader.LogUploadWorkerModule +import org.oppia.android.domain.oppialogger.logscheduler.MetricLogSchedulerModule +import org.oppia.android.domain.oppialogger.loguploader.LogReportWorkerModule import org.oppia.android.domain.platformparameter.PlatformParameterSingletonModule import org.oppia.android.domain.question.QuestionModule import org.oppia.android.domain.topic.PrimeTopicAssetsControllerModule @@ -602,7 +603,7 @@ class AdministratorControlsFragmentTest { AccessibilityTestModule::class, LogStorageModule::class, CachingTestModule::class, PrimeTopicAssetsControllerModule::class, ExpirationMetaDataRetrieverModule::class, ViewBindingShimModule::class, RatioInputModule::class, WorkManagerConfigurationModule::class, - ApplicationStartupListenerModule::class, LogUploadWorkerModule::class, + ApplicationStartupListenerModule::class, LogReportWorkerModule::class, HintsAndSolutionConfigModule::class, HintsAndSolutionProdModule::class, FirebaseLogUploaderModule::class, FakeOppiaClockModule::class, PracticeTabModule::class, DeveloperOptionsStarterModule::class, DeveloperOptionsModule::class, @@ -612,7 +613,7 @@ class AdministratorControlsFragmentTest { NumericExpressionInputModule::class, AlgebraicExpressionInputModule::class, MathEquationInputModule::class, SplitScreenInteractionModule::class, LoggingIdentifierModule::class, ApplicationLifecycleModule::class, - SyncStatusModule::class + SyncStatusModule::class, MetricLogSchedulerModule::class ] ) interface TestApplicationComponent : ApplicationComponent { diff --git a/app/src/sharedTest/java/org/oppia/android/app/administratorcontrols/AppVersionActivityTest.kt b/app/src/sharedTest/java/org/oppia/android/app/administratorcontrols/AppVersionActivityTest.kt index 894b70c8199..4d3875e7a30 100644 --- a/app/src/sharedTest/java/org/oppia/android/app/administratorcontrols/AppVersionActivityTest.kt +++ b/app/src/sharedTest/java/org/oppia/android/app/administratorcontrols/AppVersionActivityTest.kt @@ -69,7 +69,8 @@ import org.oppia.android.domain.onboarding.ExpirationMetaDataRetrieverModule import org.oppia.android.domain.oppialogger.LogStorageModule import org.oppia.android.domain.oppialogger.LoggingIdentifierModule import org.oppia.android.domain.oppialogger.analytics.ApplicationLifecycleModule -import org.oppia.android.domain.oppialogger.loguploader.LogUploadWorkerModule +import org.oppia.android.domain.oppialogger.logscheduler.MetricLogSchedulerModule +import org.oppia.android.domain.oppialogger.loguploader.LogReportWorkerModule import org.oppia.android.domain.platformparameter.PlatformParameterModule import org.oppia.android.domain.platformparameter.PlatformParameterSingletonModule import org.oppia.android.domain.question.QuestionModule @@ -280,7 +281,7 @@ class AppVersionActivityTest { AccessibilityTestModule::class, LogStorageModule::class, CachingTestModule::class, PrimeTopicAssetsControllerModule::class, ExpirationMetaDataRetrieverModule::class, ViewBindingShimModule::class, RatioInputModule::class, WorkManagerConfigurationModule::class, - ApplicationStartupListenerModule::class, LogUploadWorkerModule::class, + ApplicationStartupListenerModule::class, LogReportWorkerModule::class, HintsAndSolutionConfigModule::class, HintsAndSolutionProdModule::class, FirebaseLogUploaderModule::class, FakeOppiaClockModule::class, PracticeTabModule::class, DeveloperOptionsStarterModule::class, DeveloperOptionsModule::class, @@ -290,7 +291,7 @@ class AppVersionActivityTest { NumericExpressionInputModule::class, AlgebraicExpressionInputModule::class, MathEquationInputModule::class, SplitScreenInteractionModule::class, LoggingIdentifierModule::class, ApplicationLifecycleModule::class, - SyncStatusModule::class + SyncStatusModule::class, MetricLogSchedulerModule::class ] ) interface TestApplicationComponent : ApplicationComponent { diff --git a/app/src/sharedTest/java/org/oppia/android/app/administratorcontrols/learneranalytics/ProfileAndDeviceIdActivityTest.kt b/app/src/sharedTest/java/org/oppia/android/app/administratorcontrols/learneranalytics/ProfileAndDeviceIdActivityTest.kt index beb69438acf..e0b44a0a5fa 100644 --- a/app/src/sharedTest/java/org/oppia/android/app/administratorcontrols/learneranalytics/ProfileAndDeviceIdActivityTest.kt +++ b/app/src/sharedTest/java/org/oppia/android/app/administratorcontrols/learneranalytics/ProfileAndDeviceIdActivityTest.kt @@ -58,8 +58,9 @@ import org.oppia.android.domain.onboarding.ExpirationMetaDataRetrieverModule import org.oppia.android.domain.oppialogger.ApplicationIdSeed import org.oppia.android.domain.oppialogger.LogStorageModule import org.oppia.android.domain.oppialogger.OppiaLogger +import org.oppia.android.domain.oppialogger.logscheduler.MetricLogSchedulerModule +import org.oppia.android.domain.oppialogger.loguploader.LogReportWorkerModule import org.oppia.android.domain.oppialogger.loguploader.LogUploadWorkerFactory -import org.oppia.android.domain.oppialogger.loguploader.LogUploadWorkerModule import org.oppia.android.domain.platformparameter.PlatformParameterModule import org.oppia.android.domain.platformparameter.PlatformParameterSingletonModule import org.oppia.android.domain.question.QuestionModule @@ -189,7 +190,7 @@ class ProfileAndDeviceIdActivityTest { AccessibilityTestModule::class, LogStorageModule::class, CachingTestModule::class, PrimeTopicAssetsControllerModule::class, ExpirationMetaDataRetrieverModule::class, ViewBindingShimModule::class, RatioInputModule::class, WorkManagerConfigurationModule::class, - ApplicationStartupListenerModule::class, LogUploadWorkerModule::class, + ApplicationStartupListenerModule::class, LogReportWorkerModule::class, HintsAndSolutionConfigModule::class, HintsAndSolutionProdModule::class, FirebaseLogUploaderModule::class, FakeOppiaClockModule::class, PracticeTabModule::class, DeveloperOptionsStarterModule::class, DeveloperOptionsModule::class, @@ -198,7 +199,7 @@ class ProfileAndDeviceIdActivityTest { AssetModule::class, LocaleProdModule::class, ActivityRecreatorTestModule::class, SyncStatusModule::class, SplitScreenInteractionModule::class, NumericExpressionInputModule::class, AlgebraicExpressionInputModule::class, - MathEquationInputModule::class + MathEquationInputModule::class, MetricLogSchedulerModule::class ] ) interface TestApplicationComponent : ApplicationComponent { diff --git a/app/src/sharedTest/java/org/oppia/android/app/administratorcontrols/learneranalytics/ProfileAndDeviceIdFragmentTest.kt b/app/src/sharedTest/java/org/oppia/android/app/administratorcontrols/learneranalytics/ProfileAndDeviceIdFragmentTest.kt index affe4a867b5..1c99c20e542 100644 --- a/app/src/sharedTest/java/org/oppia/android/app/administratorcontrols/learneranalytics/ProfileAndDeviceIdFragmentTest.kt +++ b/app/src/sharedTest/java/org/oppia/android/app/administratorcontrols/learneranalytics/ProfileAndDeviceIdFragmentTest.kt @@ -76,9 +76,10 @@ import org.oppia.android.domain.oppialogger.ApplicationIdSeed import org.oppia.android.domain.oppialogger.LogStorageModule import org.oppia.android.domain.oppialogger.OppiaLogger import org.oppia.android.domain.oppialogger.analytics.LearnerAnalyticsLogger +import org.oppia.android.domain.oppialogger.logscheduler.MetricLogSchedulerModule +import org.oppia.android.domain.oppialogger.loguploader.LogReportWorkerModule import org.oppia.android.domain.oppialogger.loguploader.LogUploadWorker import org.oppia.android.domain.oppialogger.loguploader.LogUploadWorkerFactory -import org.oppia.android.domain.oppialogger.loguploader.LogUploadWorkerModule import org.oppia.android.domain.platformparameter.PlatformParameterSingletonModule import org.oppia.android.domain.question.QuestionModule import org.oppia.android.domain.topic.PrimeTopicAssetsControllerModule @@ -615,7 +616,7 @@ class ProfileAndDeviceIdFragmentTest { LogStorageModule::class, CachingTestModule::class, PrimeTopicAssetsControllerModule::class, ExpirationMetaDataRetrieverModule::class, ViewBindingShimModule::class, RatioInputModule::class, WorkManagerConfigurationModule::class, - ApplicationStartupListenerModule::class, LogUploadWorkerModule::class, + ApplicationStartupListenerModule::class, LogReportWorkerModule::class, HintsAndSolutionConfigModule::class, HintsAndSolutionProdModule::class, FirebaseLogUploaderModule::class, FakeOppiaClockModule::class, PracticeTabModule::class, DeveloperOptionsStarterModule::class, DeveloperOptionsModule::class, @@ -624,7 +625,7 @@ class ProfileAndDeviceIdFragmentTest { AssetModule::class, LocaleProdModule::class, ActivityRecreatorTestModule::class, SyncStatusModule::class, SplitScreenInteractionModule::class, NumericExpressionInputModule::class, AlgebraicExpressionInputModule::class, - MathEquationInputModule::class + MathEquationInputModule::class, MetricLogSchedulerModule::class ] ) interface TestApplicationComponent : ApplicationComponent { diff --git a/app/src/sharedTest/java/org/oppia/android/app/completedstorylist/CompletedStoryListActivityTest.kt b/app/src/sharedTest/java/org/oppia/android/app/completedstorylist/CompletedStoryListActivityTest.kt index df59509cf92..dc1c7fd5a82 100644 --- a/app/src/sharedTest/java/org/oppia/android/app/completedstorylist/CompletedStoryListActivityTest.kt +++ b/app/src/sharedTest/java/org/oppia/android/app/completedstorylist/CompletedStoryListActivityTest.kt @@ -70,7 +70,8 @@ import org.oppia.android.domain.onboarding.ExpirationMetaDataRetrieverModule import org.oppia.android.domain.oppialogger.LogStorageModule import org.oppia.android.domain.oppialogger.LoggingIdentifierModule import org.oppia.android.domain.oppialogger.analytics.ApplicationLifecycleModule -import org.oppia.android.domain.oppialogger.loguploader.LogUploadWorkerModule +import org.oppia.android.domain.oppialogger.logscheduler.MetricLogSchedulerModule +import org.oppia.android.domain.oppialogger.loguploader.LogReportWorkerModule import org.oppia.android.domain.platformparameter.PlatformParameterModule import org.oppia.android.domain.platformparameter.PlatformParameterSingletonModule import org.oppia.android.domain.question.QuestionModule @@ -503,7 +504,7 @@ class CompletedStoryListActivityTest { AccessibilityTestModule::class, LogStorageModule::class, CachingTestModule::class, PrimeTopicAssetsControllerModule::class, ExpirationMetaDataRetrieverModule::class, ViewBindingShimModule::class, RatioInputModule::class, WorkManagerConfigurationModule::class, - ApplicationStartupListenerModule::class, LogUploadWorkerModule::class, + ApplicationStartupListenerModule::class, LogReportWorkerModule::class, HintsAndSolutionConfigModule::class, HintsAndSolutionProdModule::class, FirebaseLogUploaderModule::class, FakeOppiaClockModule::class, PracticeTabModule::class, DeveloperOptionsStarterModule::class, DeveloperOptionsModule::class, @@ -513,7 +514,7 @@ class CompletedStoryListActivityTest { NumericExpressionInputModule::class, AlgebraicExpressionInputModule::class, MathEquationInputModule::class, SplitScreenInteractionModule::class, LoggingIdentifierModule::class, ApplicationLifecycleModule::class, - SyncStatusModule::class + SyncStatusModule::class, MetricLogSchedulerModule::class ] ) interface TestApplicationComponent : ApplicationComponent { diff --git a/app/src/sharedTest/java/org/oppia/android/app/customview/LessonThumbnailImageViewTest.kt b/app/src/sharedTest/java/org/oppia/android/app/customview/LessonThumbnailImageViewTest.kt index e45061db40d..e9fd803c1e3 100644 --- a/app/src/sharedTest/java/org/oppia/android/app/customview/LessonThumbnailImageViewTest.kt +++ b/app/src/sharedTest/java/org/oppia/android/app/customview/LessonThumbnailImageViewTest.kt @@ -53,7 +53,8 @@ import org.oppia.android.domain.onboarding.ExpirationMetaDataRetrieverModule import org.oppia.android.domain.oppialogger.LogStorageModule import org.oppia.android.domain.oppialogger.LoggingIdentifierModule import org.oppia.android.domain.oppialogger.analytics.ApplicationLifecycleModule -import org.oppia.android.domain.oppialogger.loguploader.LogUploadWorkerModule +import org.oppia.android.domain.oppialogger.logscheduler.MetricLogSchedulerModule +import org.oppia.android.domain.oppialogger.loguploader.LogReportWorkerModule import org.oppia.android.domain.platformparameter.PlatformParameterModule import org.oppia.android.domain.platformparameter.PlatformParameterSingletonModule import org.oppia.android.domain.question.QuestionModule @@ -161,7 +162,7 @@ class LessonThumbnailImageViewTest { AccessibilityTestModule::class, LogStorageModule::class, CachingTestModule::class, PrimeTopicAssetsControllerModule::class, ExpirationMetaDataRetrieverModule::class, ViewBindingShimModule::class, RatioInputModule::class, WorkManagerConfigurationModule::class, - ApplicationStartupListenerModule::class, LogUploadWorkerModule::class, + ApplicationStartupListenerModule::class, LogReportWorkerModule::class, HintsAndSolutionConfigModule::class, HintsAndSolutionProdModule::class, FirebaseLogUploaderModule::class, FakeOppiaClockModule::class, PracticeTabModule::class, DeveloperOptionsStarterModule::class, DeveloperOptionsModule::class, @@ -171,7 +172,7 @@ class LessonThumbnailImageViewTest { NumericExpressionInputModule::class, AlgebraicExpressionInputModule::class, MathEquationInputModule::class, SplitScreenInteractionModule::class, LoggingIdentifierModule::class, ApplicationLifecycleModule::class, - SyncStatusModule::class + SyncStatusModule::class, MetricLogSchedulerModule::class ] ) interface TestApplicationComponent : ApplicationComponent { diff --git a/app/src/sharedTest/java/org/oppia/android/app/customview/interaction/MathExpressionInteractionsViewTest.kt b/app/src/sharedTest/java/org/oppia/android/app/customview/interaction/MathExpressionInteractionsViewTest.kt index 453409d3d18..100c5a437f8 100644 --- a/app/src/sharedTest/java/org/oppia/android/app/customview/interaction/MathExpressionInteractionsViewTest.kt +++ b/app/src/sharedTest/java/org/oppia/android/app/customview/interaction/MathExpressionInteractionsViewTest.kt @@ -68,7 +68,8 @@ import org.oppia.android.domain.onboarding.ExpirationMetaDataRetrieverModule import org.oppia.android.domain.oppialogger.LogStorageModule import org.oppia.android.domain.oppialogger.LoggingIdentifierModule import org.oppia.android.domain.oppialogger.analytics.ApplicationLifecycleModule -import org.oppia.android.domain.oppialogger.loguploader.LogUploadWorkerModule +import org.oppia.android.domain.oppialogger.logscheduler.MetricLogSchedulerModule +import org.oppia.android.domain.oppialogger.loguploader.LogReportWorkerModule import org.oppia.android.domain.platformparameter.PlatformParameterModule import org.oppia.android.domain.platformparameter.PlatformParameterSingletonModule import org.oppia.android.domain.question.QuestionModule @@ -1763,7 +1764,7 @@ class MathExpressionInteractionsViewTest { AccessibilityTestModule::class, LogStorageModule::class, CachingTestModule::class, PrimeTopicAssetsControllerModule::class, ExpirationMetaDataRetrieverModule::class, ViewBindingShimModule::class, RatioInputModule::class, WorkManagerConfigurationModule::class, - ApplicationStartupListenerModule::class, LogUploadWorkerModule::class, + ApplicationStartupListenerModule::class, LogReportWorkerModule::class, HintsAndSolutionConfigModule::class, HintsAndSolutionProdModule::class, FirebaseLogUploaderModule::class, FakeOppiaClockModule::class, PracticeTabModule::class, DeveloperOptionsStarterModule::class, DeveloperOptionsModule::class, @@ -1773,7 +1774,7 @@ class MathExpressionInteractionsViewTest { NumericExpressionInputModule::class, AlgebraicExpressionInputModule::class, MathEquationInputModule::class, SplitScreenInteractionModule::class, LoggingIdentifierModule::class, ApplicationLifecycleModule::class, - SyncStatusModule::class + SyncStatusModule::class, MetricLogSchedulerModule::class ] ) interface TestApplicationComponent : ApplicationComponent { diff --git a/app/src/sharedTest/java/org/oppia/android/app/databinding/DrawableBindingAdaptersTest.kt b/app/src/sharedTest/java/org/oppia/android/app/databinding/DrawableBindingAdaptersTest.kt index 0a9961aaa12..1bee02bb647 100644 --- a/app/src/sharedTest/java/org/oppia/android/app/databinding/DrawableBindingAdaptersTest.kt +++ b/app/src/sharedTest/java/org/oppia/android/app/databinding/DrawableBindingAdaptersTest.kt @@ -59,7 +59,8 @@ import org.oppia.android.domain.onboarding.ExpirationMetaDataRetrieverModule import org.oppia.android.domain.oppialogger.LogStorageModule import org.oppia.android.domain.oppialogger.LoggingIdentifierModule import org.oppia.android.domain.oppialogger.analytics.ApplicationLifecycleModule -import org.oppia.android.domain.oppialogger.loguploader.LogUploadWorkerModule +import org.oppia.android.domain.oppialogger.logscheduler.MetricLogSchedulerModule +import org.oppia.android.domain.oppialogger.loguploader.LogReportWorkerModule import org.oppia.android.domain.platformparameter.PlatformParameterModule import org.oppia.android.domain.platformparameter.PlatformParameterSingletonModule import org.oppia.android.domain.question.QuestionModule @@ -172,7 +173,7 @@ class DrawableBindingAdaptersTest { AccessibilityTestModule::class, LogStorageModule::class, CachingTestModule::class, PrimeTopicAssetsControllerModule::class, ExpirationMetaDataRetrieverModule::class, ViewBindingShimModule::class, RatioInputModule::class, WorkManagerConfigurationModule::class, - ApplicationStartupListenerModule::class, LogUploadWorkerModule::class, + ApplicationStartupListenerModule::class, LogReportWorkerModule::class, HintsAndSolutionConfigModule::class, HintsAndSolutionProdModule::class, FirebaseLogUploaderModule::class, FakeOppiaClockModule::class, PracticeTabModule::class, DeveloperOptionsStarterModule::class, DeveloperOptionsModule::class, @@ -182,7 +183,7 @@ class DrawableBindingAdaptersTest { NumericExpressionInputModule::class, AlgebraicExpressionInputModule::class, MathEquationInputModule::class, SplitScreenInteractionModule::class, LoggingIdentifierModule::class, ApplicationLifecycleModule::class, - SyncStatusModule::class + SyncStatusModule::class, MetricLogSchedulerModule::class ] ) interface TestApplicationComponent : ApplicationComponent { diff --git a/app/src/sharedTest/java/org/oppia/android/app/databinding/ImageViewBindingAdaptersTest.kt b/app/src/sharedTest/java/org/oppia/android/app/databinding/ImageViewBindingAdaptersTest.kt index 6b36d3068dd..6559b4e211b 100644 --- a/app/src/sharedTest/java/org/oppia/android/app/databinding/ImageViewBindingAdaptersTest.kt +++ b/app/src/sharedTest/java/org/oppia/android/app/databinding/ImageViewBindingAdaptersTest.kt @@ -63,7 +63,8 @@ import org.oppia.android.domain.onboarding.ExpirationMetaDataRetrieverModule import org.oppia.android.domain.oppialogger.LogStorageModule import org.oppia.android.domain.oppialogger.LoggingIdentifierModule import org.oppia.android.domain.oppialogger.analytics.ApplicationLifecycleModule -import org.oppia.android.domain.oppialogger.loguploader.LogUploadWorkerModule +import org.oppia.android.domain.oppialogger.logscheduler.MetricLogSchedulerModule +import org.oppia.android.domain.oppialogger.loguploader.LogReportWorkerModule import org.oppia.android.domain.platformparameter.PlatformParameterModule import org.oppia.android.domain.platformparameter.PlatformParameterSingletonModule import org.oppia.android.domain.question.QuestionModule @@ -214,7 +215,7 @@ class ImageViewBindingAdaptersTest { AccessibilityTestModule::class, LogStorageModule::class, CachingTestModule::class, PrimeTopicAssetsControllerModule::class, ExpirationMetaDataRetrieverModule::class, ViewBindingShimModule::class, RatioInputModule::class, WorkManagerConfigurationModule::class, - ApplicationStartupListenerModule::class, LogUploadWorkerModule::class, + ApplicationStartupListenerModule::class, LogReportWorkerModule::class, HintsAndSolutionConfigModule::class, HintsAndSolutionProdModule::class, FirebaseLogUploaderModule::class, FakeOppiaClockModule::class, PracticeTabModule::class, DeveloperOptionsStarterModule::class, DeveloperOptionsModule::class, @@ -223,7 +224,8 @@ class ImageViewBindingAdaptersTest { AssetModule::class, LocaleProdModule::class, ActivityRecreatorTestModule::class, NumericExpressionInputModule::class, AlgebraicExpressionInputModule::class, MathEquationInputModule::class, SplitScreenInteractionModule::class, - LoggingIdentifierModule::class, ApplicationLifecycleModule::class, SyncStatusModule::class + LoggingIdentifierModule::class, ApplicationLifecycleModule::class, SyncStatusModule::class, + MetricLogSchedulerModule::class ] ) /** Create a TestApplicationComponent. */ diff --git a/app/src/sharedTest/java/org/oppia/android/app/databinding/MarginBindingAdaptersTest.kt b/app/src/sharedTest/java/org/oppia/android/app/databinding/MarginBindingAdaptersTest.kt index 1153bd7ef6f..51af7e5e519 100644 --- a/app/src/sharedTest/java/org/oppia/android/app/databinding/MarginBindingAdaptersTest.kt +++ b/app/src/sharedTest/java/org/oppia/android/app/databinding/MarginBindingAdaptersTest.kt @@ -64,7 +64,8 @@ import org.oppia.android.domain.onboarding.ExpirationMetaDataRetrieverModule import org.oppia.android.domain.oppialogger.LogStorageModule import org.oppia.android.domain.oppialogger.LoggingIdentifierModule import org.oppia.android.domain.oppialogger.analytics.ApplicationLifecycleModule -import org.oppia.android.domain.oppialogger.loguploader.LogUploadWorkerModule +import org.oppia.android.domain.oppialogger.logscheduler.MetricLogSchedulerModule +import org.oppia.android.domain.oppialogger.loguploader.LogReportWorkerModule import org.oppia.android.domain.platformparameter.PlatformParameterModule import org.oppia.android.domain.platformparameter.PlatformParameterSingletonModule import org.oppia.android.domain.question.QuestionModule @@ -302,7 +303,7 @@ class MarginBindingAdaptersTest { AccessibilityTestModule::class, LogStorageModule::class, CachingTestModule::class, PrimeTopicAssetsControllerModule::class, ExpirationMetaDataRetrieverModule::class, ViewBindingShimModule::class, RatioInputModule::class, WorkManagerConfigurationModule::class, - ApplicationStartupListenerModule::class, LogUploadWorkerModule::class, + ApplicationStartupListenerModule::class, LogReportWorkerModule::class, HintsAndSolutionConfigModule::class, HintsAndSolutionProdModule::class, FirebaseLogUploaderModule::class, FakeOppiaClockModule::class, PracticeTabModule::class, DeveloperOptionsStarterModule::class, DeveloperOptionsModule::class, @@ -311,7 +312,8 @@ class MarginBindingAdaptersTest { AssetModule::class, LocaleProdModule::class, ActivityRecreatorTestModule::class, NumericExpressionInputModule::class, AlgebraicExpressionInputModule::class, MathEquationInputModule::class, SplitScreenInteractionModule::class, - LoggingIdentifierModule::class, ApplicationLifecycleModule::class, SyncStatusModule::class + LoggingIdentifierModule::class, ApplicationLifecycleModule::class, SyncStatusModule::class, + MetricLogSchedulerModule::class ] ) /** Create a TestApplicationComponent. */ diff --git a/app/src/sharedTest/java/org/oppia/android/app/databinding/StateAssemblerMarginBindingAdaptersTest.kt b/app/src/sharedTest/java/org/oppia/android/app/databinding/StateAssemblerMarginBindingAdaptersTest.kt index e297c8cf07f..8f24ad52f76 100644 --- a/app/src/sharedTest/java/org/oppia/android/app/databinding/StateAssemblerMarginBindingAdaptersTest.kt +++ b/app/src/sharedTest/java/org/oppia/android/app/databinding/StateAssemblerMarginBindingAdaptersTest.kt @@ -66,7 +66,8 @@ import org.oppia.android.domain.onboarding.ExpirationMetaDataRetrieverModule import org.oppia.android.domain.oppialogger.LogStorageModule import org.oppia.android.domain.oppialogger.LoggingIdentifierModule import org.oppia.android.domain.oppialogger.analytics.ApplicationLifecycleModule -import org.oppia.android.domain.oppialogger.loguploader.LogUploadWorkerModule +import org.oppia.android.domain.oppialogger.logscheduler.MetricLogSchedulerModule +import org.oppia.android.domain.oppialogger.loguploader.LogReportWorkerModule import org.oppia.android.domain.platformparameter.PlatformParameterModule import org.oppia.android.domain.platformparameter.PlatformParameterSingletonModule import org.oppia.android.domain.question.QuestionModule @@ -490,7 +491,7 @@ class StateAssemblerMarginBindingAdaptersTest { AccessibilityTestModule::class, LogStorageModule::class, CachingTestModule::class, PrimeTopicAssetsControllerModule::class, ExpirationMetaDataRetrieverModule::class, ViewBindingShimModule::class, RatioInputModule::class, WorkManagerConfigurationModule::class, - ApplicationStartupListenerModule::class, LogUploadWorkerModule::class, + ApplicationStartupListenerModule::class, LogReportWorkerModule::class, HintsAndSolutionConfigModule::class, HintsAndSolutionProdModule::class, FirebaseLogUploaderModule::class, FakeOppiaClockModule::class, PracticeTabModule::class, DeveloperOptionsStarterModule::class, DeveloperOptionsModule::class, @@ -499,7 +500,8 @@ class StateAssemblerMarginBindingAdaptersTest { AssetModule::class, LocaleProdModule::class, ActivityRecreatorTestModule::class, NumericExpressionInputModule::class, AlgebraicExpressionInputModule::class, MathEquationInputModule::class, SplitScreenInteractionModule::class, - LoggingIdentifierModule::class, ApplicationLifecycleModule::class, SyncStatusModule::class + LoggingIdentifierModule::class, ApplicationLifecycleModule::class, SyncStatusModule::class, + MetricLogSchedulerModule::class ] ) /** Create a TestApplicationComponent. */ diff --git a/app/src/sharedTest/java/org/oppia/android/app/databinding/StateAssemblerPaddingBindingAdaptersTest.kt b/app/src/sharedTest/java/org/oppia/android/app/databinding/StateAssemblerPaddingBindingAdaptersTest.kt index 1bf0b3191c5..d4c2448a4db 100644 --- a/app/src/sharedTest/java/org/oppia/android/app/databinding/StateAssemblerPaddingBindingAdaptersTest.kt +++ b/app/src/sharedTest/java/org/oppia/android/app/databinding/StateAssemblerPaddingBindingAdaptersTest.kt @@ -64,7 +64,8 @@ import org.oppia.android.domain.onboarding.ExpirationMetaDataRetrieverModule import org.oppia.android.domain.oppialogger.LogStorageModule import org.oppia.android.domain.oppialogger.LoggingIdentifierModule import org.oppia.android.domain.oppialogger.analytics.ApplicationLifecycleModule -import org.oppia.android.domain.oppialogger.loguploader.LogUploadWorkerModule +import org.oppia.android.domain.oppialogger.logscheduler.MetricLogSchedulerModule +import org.oppia.android.domain.oppialogger.loguploader.LogReportWorkerModule import org.oppia.android.domain.platformparameter.PlatformParameterModule import org.oppia.android.domain.platformparameter.PlatformParameterSingletonModule import org.oppia.android.domain.question.QuestionModule @@ -488,7 +489,7 @@ class StateAssemblerPaddingBindingAdaptersTest { AccessibilityTestModule::class, LogStorageModule::class, CachingTestModule::class, PrimeTopicAssetsControllerModule::class, ExpirationMetaDataRetrieverModule::class, ViewBindingShimModule::class, RatioInputModule::class, WorkManagerConfigurationModule::class, - ApplicationStartupListenerModule::class, LogUploadWorkerModule::class, + ApplicationStartupListenerModule::class, LogReportWorkerModule::class, HintsAndSolutionConfigModule::class, HintsAndSolutionProdModule::class, FirebaseLogUploaderModule::class, FakeOppiaClockModule::class, PracticeTabModule::class, DeveloperOptionsStarterModule::class, DeveloperOptionsModule::class, @@ -497,7 +498,8 @@ class StateAssemblerPaddingBindingAdaptersTest { AssetModule::class, LocaleProdModule::class, ActivityRecreatorTestModule::class, NumericExpressionInputModule::class, AlgebraicExpressionInputModule::class, MathEquationInputModule::class, SplitScreenInteractionModule::class, - LoggingIdentifierModule::class, ApplicationLifecycleModule::class, SyncStatusModule::class + LoggingIdentifierModule::class, ApplicationLifecycleModule::class, SyncStatusModule::class, + MetricLogSchedulerModule::class ] ) diff --git a/app/src/sharedTest/java/org/oppia/android/app/databinding/TextViewBindingAdaptersTest.kt b/app/src/sharedTest/java/org/oppia/android/app/databinding/TextViewBindingAdaptersTest.kt index c20b2af3164..ebd73e65eda 100644 --- a/app/src/sharedTest/java/org/oppia/android/app/databinding/TextViewBindingAdaptersTest.kt +++ b/app/src/sharedTest/java/org/oppia/android/app/databinding/TextViewBindingAdaptersTest.kt @@ -57,7 +57,8 @@ import org.oppia.android.domain.onboarding.ExpirationMetaDataRetrieverModule import org.oppia.android.domain.oppialogger.LogStorageModule import org.oppia.android.domain.oppialogger.LoggingIdentifierModule import org.oppia.android.domain.oppialogger.analytics.ApplicationLifecycleModule -import org.oppia.android.domain.oppialogger.loguploader.LogUploadWorkerModule +import org.oppia.android.domain.oppialogger.logscheduler.MetricLogSchedulerModule +import org.oppia.android.domain.oppialogger.loguploader.LogReportWorkerModule import org.oppia.android.domain.platformparameter.PlatformParameterModule import org.oppia.android.domain.platformparameter.PlatformParameterSingletonModule import org.oppia.android.domain.question.QuestionModule @@ -321,7 +322,7 @@ class TextViewBindingAdaptersTest { AccessibilityTestModule::class, LogStorageModule::class, CachingTestModule::class, PrimeTopicAssetsControllerModule::class, ExpirationMetaDataRetrieverModule::class, ViewBindingShimModule::class, RatioInputModule::class, WorkManagerConfigurationModule::class, - ApplicationStartupListenerModule::class, LogUploadWorkerModule::class, + ApplicationStartupListenerModule::class, LogReportWorkerModule::class, HintsAndSolutionConfigModule::class, HintsAndSolutionProdModule::class, FirebaseLogUploaderModule::class, FakeOppiaClockModule::class, PracticeTabModule::class, DeveloperOptionsStarterModule::class, DeveloperOptionsModule::class, @@ -331,7 +332,7 @@ class TextViewBindingAdaptersTest { NumericExpressionInputModule::class, AlgebraicExpressionInputModule::class, MathEquationInputModule::class, SplitScreenInteractionModule::class, LoggingIdentifierModule::class, ApplicationLifecycleModule::class, - SyncStatusModule::class + SyncStatusModule::class, MetricLogSchedulerModule::class ] ) interface TestApplicationComponent : ApplicationComponent { diff --git a/app/src/sharedTest/java/org/oppia/android/app/databinding/ViewBindingAdaptersTest.kt b/app/src/sharedTest/java/org/oppia/android/app/databinding/ViewBindingAdaptersTest.kt index c1735ce7351..5127d9aec73 100644 --- a/app/src/sharedTest/java/org/oppia/android/app/databinding/ViewBindingAdaptersTest.kt +++ b/app/src/sharedTest/java/org/oppia/android/app/databinding/ViewBindingAdaptersTest.kt @@ -61,7 +61,8 @@ import org.oppia.android.domain.onboarding.ExpirationMetaDataRetrieverModule import org.oppia.android.domain.oppialogger.LogStorageModule import org.oppia.android.domain.oppialogger.LoggingIdentifierModule import org.oppia.android.domain.oppialogger.analytics.ApplicationLifecycleModule -import org.oppia.android.domain.oppialogger.loguploader.LogUploadWorkerModule +import org.oppia.android.domain.oppialogger.logscheduler.MetricLogSchedulerModule +import org.oppia.android.domain.oppialogger.loguploader.LogReportWorkerModule import org.oppia.android.domain.platformparameter.PlatformParameterModule import org.oppia.android.domain.platformparameter.PlatformParameterSingletonModule import org.oppia.android.domain.question.QuestionModule @@ -222,7 +223,7 @@ class ViewBindingAdaptersTest { AccessibilityTestModule::class, LogStorageModule::class, CachingTestModule::class, PrimeTopicAssetsControllerModule::class, ExpirationMetaDataRetrieverModule::class, ViewBindingShimModule::class, RatioInputModule::class, WorkManagerConfigurationModule::class, - ApplicationStartupListenerModule::class, LogUploadWorkerModule::class, + ApplicationStartupListenerModule::class, LogReportWorkerModule::class, HintsAndSolutionConfigModule::class, HintsAndSolutionProdModule::class, FirebaseLogUploaderModule::class, FakeOppiaClockModule::class, PracticeTabModule::class, DeveloperOptionsStarterModule::class, DeveloperOptionsModule::class, @@ -231,7 +232,8 @@ class ViewBindingAdaptersTest { AssetModule::class, LocaleProdModule::class, ActivityRecreatorTestModule::class, NumericExpressionInputModule::class, AlgebraicExpressionInputModule::class, MathEquationInputModule::class, SplitScreenInteractionModule::class, - LoggingIdentifierModule::class, ApplicationLifecycleModule::class, SyncStatusModule::class + LoggingIdentifierModule::class, ApplicationLifecycleModule::class, SyncStatusModule::class, + MetricLogSchedulerModule::class ] ) /** Create a TestApplicationComponent. */ diff --git a/app/src/sharedTest/java/org/oppia/android/app/devoptions/DeveloperOptionsActivityTest.kt b/app/src/sharedTest/java/org/oppia/android/app/devoptions/DeveloperOptionsActivityTest.kt index e5022299560..f5be1badb63 100644 --- a/app/src/sharedTest/java/org/oppia/android/app/devoptions/DeveloperOptionsActivityTest.kt +++ b/app/src/sharedTest/java/org/oppia/android/app/devoptions/DeveloperOptionsActivityTest.kt @@ -79,7 +79,8 @@ import org.oppia.android.domain.onboarding.ExpirationMetaDataRetrieverModule import org.oppia.android.domain.oppialogger.LogStorageModule import org.oppia.android.domain.oppialogger.LoggingIdentifierModule import org.oppia.android.domain.oppialogger.analytics.ApplicationLifecycleModule -import org.oppia.android.domain.oppialogger.loguploader.LogUploadWorkerModule +import org.oppia.android.domain.oppialogger.logscheduler.MetricLogSchedulerModule +import org.oppia.android.domain.oppialogger.loguploader.LogReportWorkerModule import org.oppia.android.domain.platformparameter.PlatformParameterModule import org.oppia.android.domain.platformparameter.PlatformParameterSingletonModule import org.oppia.android.domain.question.QuestionModule @@ -313,7 +314,7 @@ class DeveloperOptionsActivityTest { AccessibilityTestModule::class, LogStorageModule::class, CachingTestModule::class, PrimeTopicAssetsControllerModule::class, ExpirationMetaDataRetrieverModule::class, ViewBindingShimModule::class, RatioInputModule::class, WorkManagerConfigurationModule::class, - ApplicationStartupListenerModule::class, LogUploadWorkerModule::class, + ApplicationStartupListenerModule::class, LogReportWorkerModule::class, HintsAndSolutionConfigModule::class, HintsAndSolutionProdModule::class, FirebaseLogUploaderModule::class, FakeOppiaClockModule::class, PracticeTabModule::class, DeveloperOptionsStarterModule::class, DeveloperOptionsModule::class, @@ -324,7 +325,7 @@ class DeveloperOptionsActivityTest { NumericExpressionInputModule::class, AlgebraicExpressionInputModule::class, MathEquationInputModule::class, SplitScreenInteractionModule::class, LoggingIdentifierModule::class, ApplicationLifecycleModule::class, - SyncStatusModule::class + SyncStatusModule::class, MetricLogSchedulerModule::class ] ) interface TestApplicationComponent : ApplicationComponent { diff --git a/app/src/sharedTest/java/org/oppia/android/app/devoptions/DeveloperOptionsFragmentTest.kt b/app/src/sharedTest/java/org/oppia/android/app/devoptions/DeveloperOptionsFragmentTest.kt index 3c039beadf5..98130794bda 100644 --- a/app/src/sharedTest/java/org/oppia/android/app/devoptions/DeveloperOptionsFragmentTest.kt +++ b/app/src/sharedTest/java/org/oppia/android/app/devoptions/DeveloperOptionsFragmentTest.kt @@ -75,7 +75,8 @@ import org.oppia.android.domain.onboarding.ExpirationMetaDataRetrieverModule import org.oppia.android.domain.oppialogger.LogStorageModule import org.oppia.android.domain.oppialogger.LoggingIdentifierModule import org.oppia.android.domain.oppialogger.analytics.ApplicationLifecycleModule -import org.oppia.android.domain.oppialogger.loguploader.LogUploadWorkerModule +import org.oppia.android.domain.oppialogger.logscheduler.MetricLogSchedulerModule +import org.oppia.android.domain.oppialogger.loguploader.LogReportWorkerModule import org.oppia.android.domain.platformparameter.PlatformParameterModule import org.oppia.android.domain.platformparameter.PlatformParameterSingletonModule import org.oppia.android.domain.question.QuestionModule @@ -644,7 +645,7 @@ class DeveloperOptionsFragmentTest { AccessibilityTestModule::class, LogStorageModule::class, CachingTestModule::class, PrimeTopicAssetsControllerModule::class, ExpirationMetaDataRetrieverModule::class, ViewBindingShimModule::class, RatioInputModule::class, WorkManagerConfigurationModule::class, - ApplicationStartupListenerModule::class, LogUploadWorkerModule::class, + ApplicationStartupListenerModule::class, LogReportWorkerModule::class, HintsAndSolutionConfigModule::class, HintsAndSolutionProdModule::class, FirebaseLogUploaderModule::class, FakeOppiaClockModule::class, PracticeTabModule::class, DeveloperOptionsStarterModule::class, DeveloperOptionsModule::class, @@ -655,7 +656,7 @@ class DeveloperOptionsFragmentTest { NumericExpressionInputModule::class, AlgebraicExpressionInputModule::class, MathEquationInputModule::class, SplitScreenInteractionModule::class, LoggingIdentifierModule::class, ApplicationLifecycleModule::class, - SyncStatusModule::class + SyncStatusModule::class, MetricLogSchedulerModule::class ] ) interface TestApplicationComponent : ApplicationComponent { diff --git a/app/src/sharedTest/java/org/oppia/android/app/devoptions/MarkChaptersCompletedActivityTest.kt b/app/src/sharedTest/java/org/oppia/android/app/devoptions/MarkChaptersCompletedActivityTest.kt index 1244ee96e90..1f3326161e7 100644 --- a/app/src/sharedTest/java/org/oppia/android/app/devoptions/MarkChaptersCompletedActivityTest.kt +++ b/app/src/sharedTest/java/org/oppia/android/app/devoptions/MarkChaptersCompletedActivityTest.kt @@ -56,7 +56,8 @@ import org.oppia.android.domain.onboarding.ExpirationMetaDataRetrieverModule import org.oppia.android.domain.oppialogger.LogStorageModule import org.oppia.android.domain.oppialogger.LoggingIdentifierModule import org.oppia.android.domain.oppialogger.analytics.ApplicationLifecycleModule -import org.oppia.android.domain.oppialogger.loguploader.LogUploadWorkerModule +import org.oppia.android.domain.oppialogger.logscheduler.MetricLogSchedulerModule +import org.oppia.android.domain.oppialogger.loguploader.LogReportWorkerModule import org.oppia.android.domain.platformparameter.PlatformParameterModule import org.oppia.android.domain.platformparameter.PlatformParameterSingletonModule import org.oppia.android.domain.question.QuestionModule @@ -175,7 +176,7 @@ class MarkChaptersCompletedActivityTest { AccessibilityTestModule::class, LogStorageModule::class, CachingTestModule::class, PrimeTopicAssetsControllerModule::class, ExpirationMetaDataRetrieverModule::class, ViewBindingShimModule::class, RatioInputModule::class, WorkManagerConfigurationModule::class, - ApplicationStartupListenerModule::class, LogUploadWorkerModule::class, + ApplicationStartupListenerModule::class, LogReportWorkerModule::class, HintsAndSolutionConfigModule::class, HintsAndSolutionProdModule::class, FirebaseLogUploaderModule::class, FakeOppiaClockModule::class, PracticeTabModule::class, DeveloperOptionsStarterModule::class, DeveloperOptionsModule::class, @@ -186,7 +187,7 @@ class MarkChaptersCompletedActivityTest { NumericExpressionInputModule::class, AlgebraicExpressionInputModule::class, MathEquationInputModule::class, SplitScreenInteractionModule::class, LoggingIdentifierModule::class, ApplicationLifecycleModule::class, - SyncStatusModule::class + SyncStatusModule::class, MetricLogSchedulerModule::class ] ) interface TestApplicationComponent : ApplicationComponent { diff --git a/app/src/sharedTest/java/org/oppia/android/app/devoptions/MarkChaptersCompletedFragmentTest.kt b/app/src/sharedTest/java/org/oppia/android/app/devoptions/MarkChaptersCompletedFragmentTest.kt index 928e30a086a..62272000673 100644 --- a/app/src/sharedTest/java/org/oppia/android/app/devoptions/MarkChaptersCompletedFragmentTest.kt +++ b/app/src/sharedTest/java/org/oppia/android/app/devoptions/MarkChaptersCompletedFragmentTest.kt @@ -65,7 +65,8 @@ import org.oppia.android.domain.onboarding.ExpirationMetaDataRetrieverModule import org.oppia.android.domain.oppialogger.LogStorageModule import org.oppia.android.domain.oppialogger.LoggingIdentifierModule import org.oppia.android.domain.oppialogger.analytics.ApplicationLifecycleModule -import org.oppia.android.domain.oppialogger.loguploader.LogUploadWorkerModule +import org.oppia.android.domain.oppialogger.logscheduler.MetricLogSchedulerModule +import org.oppia.android.domain.oppialogger.loguploader.LogReportWorkerModule import org.oppia.android.domain.platformparameter.PlatformParameterModule import org.oppia.android.domain.platformparameter.PlatformParameterSingletonModule import org.oppia.android.domain.question.QuestionModule @@ -903,7 +904,7 @@ class MarkChaptersCompletedFragmentTest { AccessibilityTestModule::class, LogStorageModule::class, CachingTestModule::class, PrimeTopicAssetsControllerModule::class, ExpirationMetaDataRetrieverModule::class, ViewBindingShimModule::class, RatioInputModule::class, WorkManagerConfigurationModule::class, - ApplicationStartupListenerModule::class, LogUploadWorkerModule::class, + ApplicationStartupListenerModule::class, LogReportWorkerModule::class, HintsAndSolutionConfigModule::class, HintsAndSolutionProdModule::class, FirebaseLogUploaderModule::class, FakeOppiaClockModule::class, PracticeTabModule::class, DeveloperOptionsStarterModule::class, DeveloperOptionsModule::class, @@ -914,7 +915,7 @@ class MarkChaptersCompletedFragmentTest { NumericExpressionInputModule::class, AlgebraicExpressionInputModule::class, MathEquationInputModule::class, SplitScreenInteractionModule::class, LoggingIdentifierModule::class, ApplicationLifecycleModule::class, - SyncStatusModule::class + SyncStatusModule::class, MetricLogSchedulerModule::class ] ) interface TestApplicationComponent : ApplicationComponent { diff --git a/app/src/sharedTest/java/org/oppia/android/app/devoptions/MarkStoriesCompletedActivityTest.kt b/app/src/sharedTest/java/org/oppia/android/app/devoptions/MarkStoriesCompletedActivityTest.kt index 0deb989b06d..b4b998b9f7c 100644 --- a/app/src/sharedTest/java/org/oppia/android/app/devoptions/MarkStoriesCompletedActivityTest.kt +++ b/app/src/sharedTest/java/org/oppia/android/app/devoptions/MarkStoriesCompletedActivityTest.kt @@ -56,7 +56,8 @@ import org.oppia.android.domain.onboarding.ExpirationMetaDataRetrieverModule import org.oppia.android.domain.oppialogger.LogStorageModule import org.oppia.android.domain.oppialogger.LoggingIdentifierModule import org.oppia.android.domain.oppialogger.analytics.ApplicationLifecycleModule -import org.oppia.android.domain.oppialogger.loguploader.LogUploadWorkerModule +import org.oppia.android.domain.oppialogger.logscheduler.MetricLogSchedulerModule +import org.oppia.android.domain.oppialogger.loguploader.LogReportWorkerModule import org.oppia.android.domain.platformparameter.PlatformParameterModule import org.oppia.android.domain.platformparameter.PlatformParameterSingletonModule import org.oppia.android.domain.question.QuestionModule @@ -175,7 +176,7 @@ class MarkStoriesCompletedActivityTest { AccessibilityTestModule::class, LogStorageModule::class, CachingTestModule::class, PrimeTopicAssetsControllerModule::class, ExpirationMetaDataRetrieverModule::class, ViewBindingShimModule::class, RatioInputModule::class, WorkManagerConfigurationModule::class, - ApplicationStartupListenerModule::class, LogUploadWorkerModule::class, + ApplicationStartupListenerModule::class, LogReportWorkerModule::class, HintsAndSolutionConfigModule::class, HintsAndSolutionProdModule::class, FirebaseLogUploaderModule::class, FakeOppiaClockModule::class, PracticeTabModule::class, DeveloperOptionsStarterModule::class, DeveloperOptionsModule::class, @@ -186,7 +187,7 @@ class MarkStoriesCompletedActivityTest { NumericExpressionInputModule::class, AlgebraicExpressionInputModule::class, MathEquationInputModule::class, SplitScreenInteractionModule::class, LoggingIdentifierModule::class, ApplicationLifecycleModule::class, - SyncStatusModule::class + SyncStatusModule::class, MetricLogSchedulerModule::class ] ) interface TestApplicationComponent : ApplicationComponent { diff --git a/app/src/sharedTest/java/org/oppia/android/app/devoptions/MarkStoriesCompletedFragmentTest.kt b/app/src/sharedTest/java/org/oppia/android/app/devoptions/MarkStoriesCompletedFragmentTest.kt index 5e8c2c5dc4f..9613d6d6729 100644 --- a/app/src/sharedTest/java/org/oppia/android/app/devoptions/MarkStoriesCompletedFragmentTest.kt +++ b/app/src/sharedTest/java/org/oppia/android/app/devoptions/MarkStoriesCompletedFragmentTest.kt @@ -65,7 +65,8 @@ import org.oppia.android.domain.onboarding.ExpirationMetaDataRetrieverModule import org.oppia.android.domain.oppialogger.LogStorageModule import org.oppia.android.domain.oppialogger.LoggingIdentifierModule import org.oppia.android.domain.oppialogger.analytics.ApplicationLifecycleModule -import org.oppia.android.domain.oppialogger.loguploader.LogUploadWorkerModule +import org.oppia.android.domain.oppialogger.logscheduler.MetricLogSchedulerModule +import org.oppia.android.domain.oppialogger.loguploader.LogReportWorkerModule import org.oppia.android.domain.platformparameter.PlatformParameterModule import org.oppia.android.domain.platformparameter.PlatformParameterSingletonModule import org.oppia.android.domain.question.QuestionModule @@ -580,7 +581,7 @@ class MarkStoriesCompletedFragmentTest { AccessibilityTestModule::class, LogStorageModule::class, CachingTestModule::class, PrimeTopicAssetsControllerModule::class, ExpirationMetaDataRetrieverModule::class, ViewBindingShimModule::class, RatioInputModule::class, WorkManagerConfigurationModule::class, - ApplicationStartupListenerModule::class, LogUploadWorkerModule::class, + ApplicationStartupListenerModule::class, LogReportWorkerModule::class, HintsAndSolutionConfigModule::class, HintsAndSolutionProdModule::class, FirebaseLogUploaderModule::class, FakeOppiaClockModule::class, PracticeTabModule::class, DeveloperOptionsStarterModule::class, DeveloperOptionsModule::class, @@ -591,7 +592,7 @@ class MarkStoriesCompletedFragmentTest { NumericExpressionInputModule::class, AlgebraicExpressionInputModule::class, MathEquationInputModule::class, SplitScreenInteractionModule::class, LoggingIdentifierModule::class, ApplicationLifecycleModule::class, - SyncStatusModule::class + SyncStatusModule::class, MetricLogSchedulerModule::class ] ) interface TestApplicationComponent : ApplicationComponent { diff --git a/app/src/sharedTest/java/org/oppia/android/app/devoptions/MarkTopicsCompletedActivityTest.kt b/app/src/sharedTest/java/org/oppia/android/app/devoptions/MarkTopicsCompletedActivityTest.kt index 0aedf6d8d4e..5107bd10697 100644 --- a/app/src/sharedTest/java/org/oppia/android/app/devoptions/MarkTopicsCompletedActivityTest.kt +++ b/app/src/sharedTest/java/org/oppia/android/app/devoptions/MarkTopicsCompletedActivityTest.kt @@ -56,7 +56,8 @@ import org.oppia.android.domain.onboarding.ExpirationMetaDataRetrieverModule import org.oppia.android.domain.oppialogger.LogStorageModule import org.oppia.android.domain.oppialogger.LoggingIdentifierModule import org.oppia.android.domain.oppialogger.analytics.ApplicationLifecycleModule -import org.oppia.android.domain.oppialogger.loguploader.LogUploadWorkerModule +import org.oppia.android.domain.oppialogger.logscheduler.MetricLogSchedulerModule +import org.oppia.android.domain.oppialogger.loguploader.LogReportWorkerModule import org.oppia.android.domain.platformparameter.PlatformParameterModule import org.oppia.android.domain.platformparameter.PlatformParameterSingletonModule import org.oppia.android.domain.question.QuestionModule @@ -175,7 +176,7 @@ class MarkTopicsCompletedActivityTest { AccessibilityTestModule::class, LogStorageModule::class, CachingTestModule::class, PrimeTopicAssetsControllerModule::class, ExpirationMetaDataRetrieverModule::class, ViewBindingShimModule::class, RatioInputModule::class, WorkManagerConfigurationModule::class, - ApplicationStartupListenerModule::class, LogUploadWorkerModule::class, + ApplicationStartupListenerModule::class, LogReportWorkerModule::class, HintsAndSolutionConfigModule::class, HintsAndSolutionProdModule::class, FirebaseLogUploaderModule::class, FakeOppiaClockModule::class, PracticeTabModule::class, DeveloperOptionsStarterModule::class, DeveloperOptionsModule::class, @@ -186,7 +187,7 @@ class MarkTopicsCompletedActivityTest { NumericExpressionInputModule::class, AlgebraicExpressionInputModule::class, MathEquationInputModule::class, SplitScreenInteractionModule::class, LoggingIdentifierModule::class, ApplicationLifecycleModule::class, - SyncStatusModule::class + SyncStatusModule::class, MetricLogSchedulerModule::class ] ) interface TestApplicationComponent : ApplicationComponent { diff --git a/app/src/sharedTest/java/org/oppia/android/app/devoptions/MarkTopicsCompletedFragmentTest.kt b/app/src/sharedTest/java/org/oppia/android/app/devoptions/MarkTopicsCompletedFragmentTest.kt index 9f677943e57..7ddd3a668ac 100644 --- a/app/src/sharedTest/java/org/oppia/android/app/devoptions/MarkTopicsCompletedFragmentTest.kt +++ b/app/src/sharedTest/java/org/oppia/android/app/devoptions/MarkTopicsCompletedFragmentTest.kt @@ -65,7 +65,8 @@ import org.oppia.android.domain.onboarding.ExpirationMetaDataRetrieverModule import org.oppia.android.domain.oppialogger.LogStorageModule import org.oppia.android.domain.oppialogger.LoggingIdentifierModule import org.oppia.android.domain.oppialogger.analytics.ApplicationLifecycleModule -import org.oppia.android.domain.oppialogger.loguploader.LogUploadWorkerModule +import org.oppia.android.domain.oppialogger.logscheduler.MetricLogSchedulerModule +import org.oppia.android.domain.oppialogger.loguploader.LogReportWorkerModule import org.oppia.android.domain.platformparameter.PlatformParameterModule import org.oppia.android.domain.platformparameter.PlatformParameterSingletonModule import org.oppia.android.domain.question.QuestionModule @@ -550,7 +551,7 @@ class MarkTopicsCompletedFragmentTest { AccessibilityTestModule::class, LogStorageModule::class, CachingTestModule::class, PrimeTopicAssetsControllerModule::class, ExpirationMetaDataRetrieverModule::class, ViewBindingShimModule::class, RatioInputModule::class, WorkManagerConfigurationModule::class, - ApplicationStartupListenerModule::class, LogUploadWorkerModule::class, + ApplicationStartupListenerModule::class, LogReportWorkerModule::class, HintsAndSolutionConfigModule::class, HintsAndSolutionProdModule::class, FirebaseLogUploaderModule::class, FakeOppiaClockModule::class, PracticeTabModule::class, DeveloperOptionsStarterModule::class, DeveloperOptionsModule::class, @@ -561,7 +562,7 @@ class MarkTopicsCompletedFragmentTest { NumericExpressionInputModule::class, AlgebraicExpressionInputModule::class, MathEquationInputModule::class, SplitScreenInteractionModule::class, LoggingIdentifierModule::class, ApplicationLifecycleModule::class, - SyncStatusModule::class + SyncStatusModule::class, MetricLogSchedulerModule::class ] ) interface TestApplicationComponent : ApplicationComponent { diff --git a/app/src/sharedTest/java/org/oppia/android/app/devoptions/ViewEventLogsActivityTest.kt b/app/src/sharedTest/java/org/oppia/android/app/devoptions/ViewEventLogsActivityTest.kt index 109e70e701c..2104922adec 100644 --- a/app/src/sharedTest/java/org/oppia/android/app/devoptions/ViewEventLogsActivityTest.kt +++ b/app/src/sharedTest/java/org/oppia/android/app/devoptions/ViewEventLogsActivityTest.kt @@ -57,7 +57,8 @@ import org.oppia.android.domain.onboarding.ExpirationMetaDataRetrieverModule import org.oppia.android.domain.oppialogger.LogStorageModule import org.oppia.android.domain.oppialogger.LoggingIdentifierModule import org.oppia.android.domain.oppialogger.analytics.ApplicationLifecycleModule -import org.oppia.android.domain.oppialogger.loguploader.LogUploadWorkerModule +import org.oppia.android.domain.oppialogger.logscheduler.MetricLogSchedulerModule +import org.oppia.android.domain.oppialogger.loguploader.LogReportWorkerModule import org.oppia.android.domain.platformparameter.PlatformParameterModule import org.oppia.android.domain.platformparameter.PlatformParameterSingletonModule import org.oppia.android.domain.question.QuestionModule @@ -77,6 +78,8 @@ import org.oppia.android.util.logging.LoggerModule import org.oppia.android.util.logging.SyncStatusModule import org.oppia.android.util.logging.firebase.DebugLogReportingModule import org.oppia.android.util.logging.firebase.FirebaseLogUploaderModule +import org.oppia.android.util.logging.performancemetrics.PerformanceMetricsAssessorModule +import org.oppia.android.util.logging.performancemetrics.PerformanceMetricsConfigurationsModule import org.oppia.android.util.networking.NetworkConnectionDebugUtilModule import org.oppia.android.util.networking.NetworkConnectionUtilDebugModule import org.oppia.android.util.parser.html.HtmlParserEntityTypeModule @@ -163,7 +166,7 @@ class ViewEventLogsActivityTest { AccessibilityTestModule::class, LogStorageModule::class, CachingTestModule::class, PrimeTopicAssetsControllerModule::class, ExpirationMetaDataRetrieverModule::class, ViewBindingShimModule::class, RatioInputModule::class, WorkManagerConfigurationModule::class, - ApplicationStartupListenerModule::class, LogUploadWorkerModule::class, + ApplicationStartupListenerModule::class, LogReportWorkerModule::class, HintsAndSolutionConfigModule::class, HintsAndSolutionProdModule::class, FirebaseLogUploaderModule::class, FakeOppiaClockModule::class, PracticeTabModule::class, DeveloperOptionsStarterModule::class, DeveloperOptionsModule::class, @@ -174,7 +177,8 @@ class ViewEventLogsActivityTest { NumericExpressionInputModule::class, AlgebraicExpressionInputModule::class, MathEquationInputModule::class, SplitScreenInteractionModule::class, LoggingIdentifierModule::class, ApplicationLifecycleModule::class, - SyncStatusModule::class + SyncStatusModule::class, MetricLogSchedulerModule::class, + PerformanceMetricsAssessorModule::class, PerformanceMetricsConfigurationsModule::class ] ) interface TestApplicationComponent : ApplicationComponent { diff --git a/app/src/sharedTest/java/org/oppia/android/app/devoptions/ViewEventLogsFragmentTest.kt b/app/src/sharedTest/java/org/oppia/android/app/devoptions/ViewEventLogsFragmentTest.kt index 8d6e26325a3..e10ba410943 100644 --- a/app/src/sharedTest/java/org/oppia/android/app/devoptions/ViewEventLogsFragmentTest.kt +++ b/app/src/sharedTest/java/org/oppia/android/app/devoptions/ViewEventLogsFragmentTest.kt @@ -17,7 +17,6 @@ import androidx.test.espresso.matcher.ViewMatchers.withText import androidx.test.ext.junit.runners.AndroidJUnit4 import com.google.firebase.FirebaseApp import dagger.Component -import org.hamcrest.Matchers.not import org.junit.After import org.junit.Before import org.junit.Rule @@ -63,7 +62,8 @@ import org.oppia.android.domain.oppialogger.LogStorageModule import org.oppia.android.domain.oppialogger.LoggingIdentifierModule import org.oppia.android.domain.oppialogger.OppiaLogger import org.oppia.android.domain.oppialogger.analytics.ApplicationLifecycleModule -import org.oppia.android.domain.oppialogger.loguploader.LogUploadWorkerModule +import org.oppia.android.domain.oppialogger.logscheduler.MetricLogSchedulerModule +import org.oppia.android.domain.oppialogger.loguploader.LogReportWorkerModule import org.oppia.android.domain.platformparameter.PlatformParameterModule import org.oppia.android.domain.platformparameter.PlatformParameterSingletonModule import org.oppia.android.domain.question.QuestionModule @@ -85,6 +85,8 @@ import org.oppia.android.util.logging.LoggerModule import org.oppia.android.util.logging.SyncStatusModule import org.oppia.android.util.logging.firebase.DebugLogReportingModule import org.oppia.android.util.logging.firebase.FirebaseLogUploaderModule +import org.oppia.android.util.logging.performancemetrics.PerformanceMetricsAssessorModule +import org.oppia.android.util.logging.performancemetrics.PerformanceMetricsConfigurationsModule import org.oppia.android.util.networking.NetworkConnectionDebugUtilModule import org.oppia.android.util.networking.NetworkConnectionUtilDebugModule import org.oppia.android.util.parser.html.HtmlParserEntityTypeModule @@ -564,7 +566,7 @@ class ViewEventLogsFragmentTest { AccessibilityTestModule::class, LogStorageModule::class, CachingTestModule::class, PrimeTopicAssetsControllerModule::class, ExpirationMetaDataRetrieverModule::class, ViewBindingShimModule::class, RatioInputModule::class, WorkManagerConfigurationModule::class, - ApplicationStartupListenerModule::class, LogUploadWorkerModule::class, + ApplicationStartupListenerModule::class, LogReportWorkerModule::class, HintsAndSolutionConfigModule::class, HintsAndSolutionProdModule::class, FirebaseLogUploaderModule::class, FakeOppiaClockModule::class, PracticeTabModule::class, DeveloperOptionsStarterModule::class, DeveloperOptionsModule::class, @@ -574,7 +576,9 @@ class ViewEventLogsFragmentTest { PlatformParameterSingletonModule::class, NumericExpressionInputModule::class, AlgebraicExpressionInputModule::class, MathEquationInputModule::class, SplitScreenInteractionModule::class, - LoggingIdentifierModule::class, ApplicationLifecycleModule::class, SyncStatusModule::class + LoggingIdentifierModule::class, ApplicationLifecycleModule::class, SyncStatusModule::class, + MetricLogSchedulerModule::class, PerformanceMetricsAssessorModule::class, + PerformanceMetricsConfigurationsModule::class ] ) diff --git a/app/src/sharedTest/java/org/oppia/android/app/devoptions/forcenetworktype/ForceNetworkTypeActivityTest.kt b/app/src/sharedTest/java/org/oppia/android/app/devoptions/forcenetworktype/ForceNetworkTypeActivityTest.kt index dd0cdd29398..1647b6b5dee 100644 --- a/app/src/sharedTest/java/org/oppia/android/app/devoptions/forcenetworktype/ForceNetworkTypeActivityTest.kt +++ b/app/src/sharedTest/java/org/oppia/android/app/devoptions/forcenetworktype/ForceNetworkTypeActivityTest.kt @@ -57,7 +57,8 @@ import org.oppia.android.domain.onboarding.ExpirationMetaDataRetrieverModule import org.oppia.android.domain.oppialogger.LogStorageModule import org.oppia.android.domain.oppialogger.LoggingIdentifierModule import org.oppia.android.domain.oppialogger.analytics.ApplicationLifecycleModule -import org.oppia.android.domain.oppialogger.loguploader.LogUploadWorkerModule +import org.oppia.android.domain.oppialogger.logscheduler.MetricLogSchedulerModule +import org.oppia.android.domain.oppialogger.loguploader.LogReportWorkerModule import org.oppia.android.domain.platformparameter.PlatformParameterModule import org.oppia.android.domain.platformparameter.PlatformParameterSingletonModule import org.oppia.android.domain.question.QuestionModule @@ -167,7 +168,7 @@ class ForceNetworkTypeActivityTest { AccessibilityTestModule::class, LogStorageModule::class, CachingTestModule::class, PrimeTopicAssetsControllerModule::class, ExpirationMetaDataRetrieverModule::class, ViewBindingShimModule::class, RatioInputModule::class, NetworkConfigProdModule::class, - ApplicationStartupListenerModule::class, LogUploadWorkerModule::class, + ApplicationStartupListenerModule::class, LogReportWorkerModule::class, WorkManagerConfigurationModule::class, HintsAndSolutionConfigModule::class, FirebaseLogUploaderModule::class, FakeOppiaClockModule::class, PracticeTabModule::class, DeveloperOptionsStarterModule::class, DeveloperOptionsModule::class, @@ -177,7 +178,8 @@ class ForceNetworkTypeActivityTest { PlatformParameterSingletonModule::class, NumericExpressionInputModule::class, AlgebraicExpressionInputModule::class, MathEquationInputModule::class, SplitScreenInteractionModule::class, - LoggingIdentifierModule::class, ApplicationLifecycleModule::class, SyncStatusModule::class + LoggingIdentifierModule::class, ApplicationLifecycleModule::class, SyncStatusModule::class, + MetricLogSchedulerModule::class ] ) /** [ApplicationComponent] for [ForceNetworkTypeActivityTest]. */ diff --git a/app/src/sharedTest/java/org/oppia/android/app/devoptions/forcenetworktype/ForceNetworkTypeFragmentTest.kt b/app/src/sharedTest/java/org/oppia/android/app/devoptions/forcenetworktype/ForceNetworkTypeFragmentTest.kt index defd8e3d336..d6c30067abe 100644 --- a/app/src/sharedTest/java/org/oppia/android/app/devoptions/forcenetworktype/ForceNetworkTypeFragmentTest.kt +++ b/app/src/sharedTest/java/org/oppia/android/app/devoptions/forcenetworktype/ForceNetworkTypeFragmentTest.kt @@ -62,7 +62,8 @@ import org.oppia.android.domain.onboarding.ExpirationMetaDataRetrieverModule import org.oppia.android.domain.oppialogger.LogStorageModule import org.oppia.android.domain.oppialogger.LoggingIdentifierModule import org.oppia.android.domain.oppialogger.analytics.ApplicationLifecycleModule -import org.oppia.android.domain.oppialogger.loguploader.LogUploadWorkerModule +import org.oppia.android.domain.oppialogger.logscheduler.MetricLogSchedulerModule +import org.oppia.android.domain.oppialogger.loguploader.LogReportWorkerModule import org.oppia.android.domain.platformparameter.PlatformParameterModule import org.oppia.android.domain.platformparameter.PlatformParameterSingletonModule import org.oppia.android.domain.question.QuestionModule @@ -383,7 +384,7 @@ class ForceNetworkTypeFragmentTest { AccessibilityTestModule::class, LogStorageModule::class, CachingTestModule::class, PrimeTopicAssetsControllerModule::class, ExpirationMetaDataRetrieverModule::class, ViewBindingShimModule::class, RatioInputModule::class, NetworkConfigProdModule::class, - ApplicationStartupListenerModule::class, LogUploadWorkerModule::class, + ApplicationStartupListenerModule::class, LogReportWorkerModule::class, WorkManagerConfigurationModule::class, HintsAndSolutionConfigModule::class, FirebaseLogUploaderModule::class, FakeOppiaClockModule::class, PracticeTabModule::class, DeveloperOptionsStarterModule::class, DeveloperOptionsModule::class, @@ -393,7 +394,8 @@ class ForceNetworkTypeFragmentTest { PlatformParameterSingletonModule::class, NumericExpressionInputModule::class, AlgebraicExpressionInputModule::class, MathEquationInputModule::class, SplitScreenInteractionModule::class, - LoggingIdentifierModule::class, ApplicationLifecycleModule::class, SyncStatusModule::class + LoggingIdentifierModule::class, ApplicationLifecycleModule::class, SyncStatusModule::class, + MetricLogSchedulerModule::class ] ) /** [ApplicationComponent] for [ForceNetworkTypeFragmentTest]. */ diff --git a/app/src/sharedTest/java/org/oppia/android/app/devoptions/mathexpressionparser/MathExpressionParserActivityTest.kt b/app/src/sharedTest/java/org/oppia/android/app/devoptions/mathexpressionparser/MathExpressionParserActivityTest.kt index 149e44b36d2..e9a86da55ae 100644 --- a/app/src/sharedTest/java/org/oppia/android/app/devoptions/mathexpressionparser/MathExpressionParserActivityTest.kt +++ b/app/src/sharedTest/java/org/oppia/android/app/devoptions/mathexpressionparser/MathExpressionParserActivityTest.kt @@ -54,7 +54,8 @@ import org.oppia.android.domain.onboarding.ExpirationMetaDataRetrieverModule import org.oppia.android.domain.oppialogger.LogStorageModule import org.oppia.android.domain.oppialogger.LoggingIdentifierModule import org.oppia.android.domain.oppialogger.analytics.ApplicationLifecycleModule -import org.oppia.android.domain.oppialogger.loguploader.LogUploadWorkerModule +import org.oppia.android.domain.oppialogger.logscheduler.MetricLogSchedulerModule +import org.oppia.android.domain.oppialogger.loguploader.LogReportWorkerModule import org.oppia.android.domain.platformparameter.PlatformParameterModule import org.oppia.android.domain.platformparameter.PlatformParameterSingletonModule import org.oppia.android.domain.question.QuestionModule @@ -152,7 +153,7 @@ class MathExpressionParserActivityTest { AccessibilityTestModule::class, LogStorageModule::class, CachingTestModule::class, PrimeTopicAssetsControllerModule::class, ExpirationMetaDataRetrieverModule::class, ViewBindingShimModule::class, RatioInputModule::class, WorkManagerConfigurationModule::class, - ApplicationStartupListenerModule::class, LogUploadWorkerModule::class, + ApplicationStartupListenerModule::class, LogReportWorkerModule::class, HintsAndSolutionConfigModule::class, HintsAndSolutionProdModule::class, FirebaseLogUploaderModule::class, FakeOppiaClockModule::class, PracticeTabModule::class, DeveloperOptionsStarterModule::class, DeveloperOptionsModule::class, @@ -162,7 +163,7 @@ class MathExpressionParserActivityTest { NumericExpressionInputModule::class, AlgebraicExpressionInputModule::class, MathEquationInputModule::class, SplitScreenInteractionModule::class, LoggingIdentifierModule::class, ApplicationLifecycleModule::class, - SyncStatusModule::class + SyncStatusModule::class, MetricLogSchedulerModule::class ] ) interface TestApplicationComponent : ApplicationComponent { diff --git a/app/src/sharedTest/java/org/oppia/android/app/devoptions/mathexpressionparser/MathExpressionParserFragmentTest.kt b/app/src/sharedTest/java/org/oppia/android/app/devoptions/mathexpressionparser/MathExpressionParserFragmentTest.kt index 39a65aa5273..6bf88c29bf3 100644 --- a/app/src/sharedTest/java/org/oppia/android/app/devoptions/mathexpressionparser/MathExpressionParserFragmentTest.kt +++ b/app/src/sharedTest/java/org/oppia/android/app/devoptions/mathexpressionparser/MathExpressionParserFragmentTest.kt @@ -64,7 +64,8 @@ import org.oppia.android.domain.onboarding.ExpirationMetaDataRetrieverModule import org.oppia.android.domain.oppialogger.LogStorageModule import org.oppia.android.domain.oppialogger.LoggingIdentifierModule import org.oppia.android.domain.oppialogger.analytics.ApplicationLifecycleModule -import org.oppia.android.domain.oppialogger.loguploader.LogUploadWorkerModule +import org.oppia.android.domain.oppialogger.logscheduler.MetricLogSchedulerModule +import org.oppia.android.domain.oppialogger.loguploader.LogReportWorkerModule import org.oppia.android.domain.platformparameter.PlatformParameterModule import org.oppia.android.domain.platformparameter.PlatformParameterSingletonModule import org.oppia.android.domain.question.QuestionModule @@ -1402,7 +1403,7 @@ class MathExpressionParserFragmentTest { AccessibilityTestModule::class, LogStorageModule::class, CachingTestModule::class, PrimeTopicAssetsControllerModule::class, ExpirationMetaDataRetrieverModule::class, ViewBindingShimModule::class, RatioInputModule::class, WorkManagerConfigurationModule::class, - ApplicationStartupListenerModule::class, LogUploadWorkerModule::class, + ApplicationStartupListenerModule::class, LogReportWorkerModule::class, HintsAndSolutionConfigModule::class, HintsAndSolutionProdModule::class, FirebaseLogUploaderModule::class, FakeOppiaClockModule::class, PracticeTabModule::class, DeveloperOptionsStarterModule::class, DeveloperOptionsModule::class, @@ -1412,7 +1413,7 @@ class MathExpressionParserFragmentTest { NumericExpressionInputModule::class, AlgebraicExpressionInputModule::class, MathEquationInputModule::class, SplitScreenInteractionModule::class, LoggingIdentifierModule::class, ApplicationLifecycleModule::class, - SyncStatusModule::class + SyncStatusModule::class, MetricLogSchedulerModule::class ] ) interface TestApplicationComponent : ApplicationComponent { diff --git a/app/src/sharedTest/java/org/oppia/android/app/faq/FAQListFragmentTest.kt b/app/src/sharedTest/java/org/oppia/android/app/faq/FAQListFragmentTest.kt index f5401ca0893..e6f86c7cbbf 100644 --- a/app/src/sharedTest/java/org/oppia/android/app/faq/FAQListFragmentTest.kt +++ b/app/src/sharedTest/java/org/oppia/android/app/faq/FAQListFragmentTest.kt @@ -68,7 +68,8 @@ import org.oppia.android.domain.onboarding.ExpirationMetaDataRetrieverModule import org.oppia.android.domain.oppialogger.LogStorageModule import org.oppia.android.domain.oppialogger.LoggingIdentifierModule import org.oppia.android.domain.oppialogger.analytics.ApplicationLifecycleModule -import org.oppia.android.domain.oppialogger.loguploader.LogUploadWorkerModule +import org.oppia.android.domain.oppialogger.logscheduler.MetricLogSchedulerModule +import org.oppia.android.domain.oppialogger.loguploader.LogReportWorkerModule import org.oppia.android.domain.platformparameter.PlatformParameterModule import org.oppia.android.domain.platformparameter.PlatformParameterSingletonModule import org.oppia.android.domain.question.QuestionModule @@ -236,7 +237,7 @@ class FAQListFragmentTest { AccessibilityTestModule::class, LogStorageModule::class, CachingTestModule::class, PrimeTopicAssetsControllerModule::class, ExpirationMetaDataRetrieverModule::class, ViewBindingShimModule::class, RatioInputModule::class, WorkManagerConfigurationModule::class, - ApplicationStartupListenerModule::class, LogUploadWorkerModule::class, + ApplicationStartupListenerModule::class, LogReportWorkerModule::class, HintsAndSolutionConfigModule::class, HintsAndSolutionProdModule::class, FirebaseLogUploaderModule::class, FakeOppiaClockModule::class, PracticeTabModule::class, DeveloperOptionsStarterModule::class, DeveloperOptionsModule::class, @@ -246,7 +247,7 @@ class FAQListFragmentTest { NumericExpressionInputModule::class, AlgebraicExpressionInputModule::class, MathEquationInputModule::class, SplitScreenInteractionModule::class, LoggingIdentifierModule::class, ApplicationLifecycleModule::class, - SyncStatusModule::class + SyncStatusModule::class, MetricLogSchedulerModule::class ] ) interface TestApplicationComponent : ApplicationComponent { diff --git a/app/src/sharedTest/java/org/oppia/android/app/faq/FAQSingleActivityTest.kt b/app/src/sharedTest/java/org/oppia/android/app/faq/FAQSingleActivityTest.kt index e557fd60a10..79c2ab467fb 100644 --- a/app/src/sharedTest/java/org/oppia/android/app/faq/FAQSingleActivityTest.kt +++ b/app/src/sharedTest/java/org/oppia/android/app/faq/FAQSingleActivityTest.kt @@ -63,7 +63,8 @@ import org.oppia.android.domain.onboarding.ExpirationMetaDataRetrieverModule import org.oppia.android.domain.oppialogger.LogStorageModule import org.oppia.android.domain.oppialogger.LoggingIdentifierModule import org.oppia.android.domain.oppialogger.analytics.ApplicationLifecycleModule -import org.oppia.android.domain.oppialogger.loguploader.LogUploadWorkerModule +import org.oppia.android.domain.oppialogger.logscheduler.MetricLogSchedulerModule +import org.oppia.android.domain.oppialogger.loguploader.LogReportWorkerModule import org.oppia.android.domain.platformparameter.PlatformParameterModule import org.oppia.android.domain.platformparameter.PlatformParameterSingletonModule import org.oppia.android.domain.question.QuestionModule @@ -214,7 +215,7 @@ class FAQSingleActivityTest { AccessibilityTestModule::class, LogStorageModule::class, CachingTestModule::class, PrimeTopicAssetsControllerModule::class, ExpirationMetaDataRetrieverModule::class, ViewBindingShimModule::class, RatioInputModule::class, WorkManagerConfigurationModule::class, - ApplicationStartupListenerModule::class, LogUploadWorkerModule::class, + ApplicationStartupListenerModule::class, LogReportWorkerModule::class, HintsAndSolutionConfigModule::class, HintsAndSolutionProdModule::class, FirebaseLogUploaderModule::class, FakeOppiaClockModule::class, PracticeTabModule::class, DeveloperOptionsStarterModule::class, DeveloperOptionsModule::class, @@ -224,7 +225,7 @@ class FAQSingleActivityTest { NumericExpressionInputModule::class, AlgebraicExpressionInputModule::class, MathEquationInputModule::class, SplitScreenInteractionModule::class, LoggingIdentifierModule::class, ApplicationLifecycleModule::class, - SyncStatusModule::class + SyncStatusModule::class, MetricLogSchedulerModule::class ] ) interface TestApplicationComponent : ApplicationComponent { diff --git a/app/src/sharedTest/java/org/oppia/android/app/faq/FaqListActivityTest.kt b/app/src/sharedTest/java/org/oppia/android/app/faq/FaqListActivityTest.kt index baad49bd787..66b90ab902a 100644 --- a/app/src/sharedTest/java/org/oppia/android/app/faq/FaqListActivityTest.kt +++ b/app/src/sharedTest/java/org/oppia/android/app/faq/FaqListActivityTest.kt @@ -51,7 +51,8 @@ import org.oppia.android.domain.onboarding.ExpirationMetaDataRetrieverModule import org.oppia.android.domain.oppialogger.LogStorageModule import org.oppia.android.domain.oppialogger.LoggingIdentifierModule import org.oppia.android.domain.oppialogger.analytics.ApplicationLifecycleModule -import org.oppia.android.domain.oppialogger.loguploader.LogUploadWorkerModule +import org.oppia.android.domain.oppialogger.logscheduler.MetricLogSchedulerModule +import org.oppia.android.domain.oppialogger.loguploader.LogReportWorkerModule import org.oppia.android.domain.platformparameter.PlatformParameterModule import org.oppia.android.domain.platformparameter.PlatformParameterSingletonModule import org.oppia.android.domain.question.QuestionModule @@ -141,7 +142,7 @@ class FaqListActivityTest { AccessibilityTestModule::class, LogStorageModule::class, CachingTestModule::class, PrimeTopicAssetsControllerModule::class, ExpirationMetaDataRetrieverModule::class, ViewBindingShimModule::class, RatioInputModule::class, WorkManagerConfigurationModule::class, - ApplicationStartupListenerModule::class, LogUploadWorkerModule::class, + ApplicationStartupListenerModule::class, LogReportWorkerModule::class, HintsAndSolutionConfigModule::class, HintsAndSolutionProdModule::class, FirebaseLogUploaderModule::class, FakeOppiaClockModule::class, PracticeTabModule::class, DeveloperOptionsStarterModule::class, DeveloperOptionsModule::class, @@ -151,7 +152,7 @@ class FaqListActivityTest { NumericExpressionInputModule::class, AlgebraicExpressionInputModule::class, MathEquationInputModule::class, SplitScreenInteractionModule::class, LoggingIdentifierModule::class, ApplicationLifecycleModule::class, - SyncStatusModule::class + SyncStatusModule::class, MetricLogSchedulerModule::class ] ) interface TestApplicationComponent : ApplicationComponent { diff --git a/app/src/sharedTest/java/org/oppia/android/app/help/HelpActivityTest.kt b/app/src/sharedTest/java/org/oppia/android/app/help/HelpActivityTest.kt index 7a284ed0d26..659279b6035 100644 --- a/app/src/sharedTest/java/org/oppia/android/app/help/HelpActivityTest.kt +++ b/app/src/sharedTest/java/org/oppia/android/app/help/HelpActivityTest.kt @@ -50,7 +50,8 @@ import org.oppia.android.domain.onboarding.ExpirationMetaDataRetrieverModule import org.oppia.android.domain.oppialogger.LogStorageModule import org.oppia.android.domain.oppialogger.LoggingIdentifierModule import org.oppia.android.domain.oppialogger.analytics.ApplicationLifecycleModule -import org.oppia.android.domain.oppialogger.loguploader.LogUploadWorkerModule +import org.oppia.android.domain.oppialogger.logscheduler.MetricLogSchedulerModule +import org.oppia.android.domain.oppialogger.loguploader.LogReportWorkerModule import org.oppia.android.domain.platformparameter.PlatformParameterModule import org.oppia.android.domain.platformparameter.PlatformParameterSingletonModule import org.oppia.android.domain.question.QuestionModule @@ -143,7 +144,7 @@ class HelpActivityTest { AccessibilityTestModule::class, LogStorageModule::class, CachingTestModule::class, PrimeTopicAssetsControllerModule::class, ExpirationMetaDataRetrieverModule::class, ViewBindingShimModule::class, RatioInputModule::class, WorkManagerConfigurationModule::class, - ApplicationStartupListenerModule::class, LogUploadWorkerModule::class, + ApplicationStartupListenerModule::class, LogReportWorkerModule::class, HintsAndSolutionConfigModule::class, HintsAndSolutionProdModule::class, FirebaseLogUploaderModule::class, FakeOppiaClockModule::class, PracticeTabModule::class, DeveloperOptionsStarterModule::class, DeveloperOptionsModule::class, @@ -153,7 +154,7 @@ class HelpActivityTest { NumericExpressionInputModule::class, AlgebraicExpressionInputModule::class, MathEquationInputModule::class, SplitScreenInteractionModule::class, LoggingIdentifierModule::class, ApplicationLifecycleModule::class, - SyncStatusModule::class + SyncStatusModule::class, MetricLogSchedulerModule::class ] ) interface TestApplicationComponent : ApplicationComponent { diff --git a/app/src/sharedTest/java/org/oppia/android/app/help/HelpFragmentTest.kt b/app/src/sharedTest/java/org/oppia/android/app/help/HelpFragmentTest.kt index 931f0a2d0e2..085d91bda44 100644 --- a/app/src/sharedTest/java/org/oppia/android/app/help/HelpFragmentTest.kt +++ b/app/src/sharedTest/java/org/oppia/android/app/help/HelpFragmentTest.kt @@ -81,7 +81,8 @@ import org.oppia.android.domain.onboarding.ExpirationMetaDataRetrieverModule import org.oppia.android.domain.oppialogger.LogStorageModule import org.oppia.android.domain.oppialogger.LoggingIdentifierModule import org.oppia.android.domain.oppialogger.analytics.ApplicationLifecycleModule -import org.oppia.android.domain.oppialogger.loguploader.LogUploadWorkerModule +import org.oppia.android.domain.oppialogger.logscheduler.MetricLogSchedulerModule +import org.oppia.android.domain.oppialogger.loguploader.LogReportWorkerModule import org.oppia.android.domain.platformparameter.PlatformParameterModule import org.oppia.android.domain.platformparameter.PlatformParameterSingletonModule import org.oppia.android.domain.question.QuestionModule @@ -1431,7 +1432,7 @@ class HelpFragmentTest { AccessibilityTestModule::class, LogStorageModule::class, CachingTestModule::class, PrimeTopicAssetsControllerModule::class, ExpirationMetaDataRetrieverModule::class, ViewBindingShimModule::class, RatioInputModule::class, WorkManagerConfigurationModule::class, - ApplicationStartupListenerModule::class, LogUploadWorkerModule::class, + ApplicationStartupListenerModule::class, LogReportWorkerModule::class, HintsAndSolutionConfigModule::class, HintsAndSolutionProdModule::class, FirebaseLogUploaderModule::class, FakeOppiaClockModule::class, PracticeTabModule::class, DeveloperOptionsStarterModule::class, DeveloperOptionsModule::class, @@ -1441,7 +1442,7 @@ class HelpFragmentTest { NumericExpressionInputModule::class, AlgebraicExpressionInputModule::class, MathEquationInputModule::class, SplitScreenInteractionModule::class, LoggingIdentifierModule::class, ApplicationLifecycleModule::class, - SyncStatusModule::class + SyncStatusModule::class, MetricLogSchedulerModule::class ] ) interface TestApplicationComponent : ApplicationComponent { diff --git a/app/src/sharedTest/java/org/oppia/android/app/home/HomeActivityTest.kt b/app/src/sharedTest/java/org/oppia/android/app/home/HomeActivityTest.kt index 8d0fa6bc777..99e47450a8a 100644 --- a/app/src/sharedTest/java/org/oppia/android/app/home/HomeActivityTest.kt +++ b/app/src/sharedTest/java/org/oppia/android/app/home/HomeActivityTest.kt @@ -97,7 +97,8 @@ import org.oppia.android.domain.onboarding.ExpirationMetaDataRetrieverModule import org.oppia.android.domain.oppialogger.LogStorageModule import org.oppia.android.domain.oppialogger.LoggingIdentifierModule import org.oppia.android.domain.oppialogger.analytics.ApplicationLifecycleModule -import org.oppia.android.domain.oppialogger.loguploader.LogUploadWorkerModule +import org.oppia.android.domain.oppialogger.logscheduler.MetricLogSchedulerModule +import org.oppia.android.domain.oppialogger.loguploader.LogReportWorkerModule import org.oppia.android.domain.platformparameter.PlatformParameterModule import org.oppia.android.domain.platformparameter.PlatformParameterSingletonModule import org.oppia.android.domain.question.QuestionModule @@ -1800,7 +1801,7 @@ class HomeActivityTest { AccessibilityTestModule::class, LogStorageModule::class, CachingTestModule::class, PrimeTopicAssetsControllerModule::class, ExpirationMetaDataRetrieverModule::class, ViewBindingShimModule::class, RatioInputModule::class, WorkManagerConfigurationModule::class, - ApplicationStartupListenerModule::class, LogUploadWorkerModule::class, + ApplicationStartupListenerModule::class, LogReportWorkerModule::class, HintsAndSolutionConfigModule::class, HintsAndSolutionProdModule::class, FirebaseLogUploaderModule::class, FakeOppiaClockModule::class, PracticeTabModule::class, DeveloperOptionsStarterModule::class, DeveloperOptionsModule::class, @@ -1810,7 +1811,7 @@ class HomeActivityTest { NumericExpressionInputModule::class, AlgebraicExpressionInputModule::class, MathEquationInputModule::class, SplitScreenInteractionModule::class, LoggingIdentifierModule::class, ApplicationLifecycleModule::class, - SyncStatusModule::class + SyncStatusModule::class, MetricLogSchedulerModule::class ] ) interface TestApplicationComponent : ApplicationComponent { diff --git a/app/src/sharedTest/java/org/oppia/android/app/home/RecentlyPlayedFragmentTest.kt b/app/src/sharedTest/java/org/oppia/android/app/home/RecentlyPlayedFragmentTest.kt index 157e4032e81..672069768fd 100644 --- a/app/src/sharedTest/java/org/oppia/android/app/home/RecentlyPlayedFragmentTest.kt +++ b/app/src/sharedTest/java/org/oppia/android/app/home/RecentlyPlayedFragmentTest.kt @@ -84,7 +84,8 @@ import org.oppia.android.domain.onboarding.ExpirationMetaDataRetrieverModule import org.oppia.android.domain.oppialogger.LogStorageModule import org.oppia.android.domain.oppialogger.LoggingIdentifierModule import org.oppia.android.domain.oppialogger.analytics.ApplicationLifecycleModule -import org.oppia.android.domain.oppialogger.loguploader.LogUploadWorkerModule +import org.oppia.android.domain.oppialogger.logscheduler.MetricLogSchedulerModule +import org.oppia.android.domain.oppialogger.loguploader.LogReportWorkerModule import org.oppia.android.domain.platformparameter.PlatformParameterModule import org.oppia.android.domain.platformparameter.PlatformParameterSingletonModule import org.oppia.android.domain.question.QuestionModule @@ -1495,7 +1496,7 @@ class RecentlyPlayedFragmentTest { AccessibilityTestModule::class, LogStorageModule::class, CachingTestModule::class, PrimeTopicAssetsControllerModule::class, ExpirationMetaDataRetrieverModule::class, ViewBindingShimModule::class, RatioInputModule::class, WorkManagerConfigurationModule::class, - ApplicationStartupListenerModule::class, LogUploadWorkerModule::class, + ApplicationStartupListenerModule::class, LogReportWorkerModule::class, HintsAndSolutionConfigModule::class, HintsAndSolutionProdModule::class, FirebaseLogUploaderModule::class, FakeOppiaClockModule::class, PracticeTabModule::class, DeveloperOptionsStarterModule::class, DeveloperOptionsModule::class, @@ -1505,7 +1506,7 @@ class RecentlyPlayedFragmentTest { NumericExpressionInputModule::class, AlgebraicExpressionInputModule::class, MathEquationInputModule::class, SplitScreenInteractionModule::class, LoggingIdentifierModule::class, ApplicationLifecycleModule::class, - SyncStatusModule::class + SyncStatusModule::class, MetricLogSchedulerModule::class ] ) interface TestApplicationComponent : ApplicationComponent { diff --git a/app/src/sharedTest/java/org/oppia/android/app/home/TopicSummaryViewModelTest.kt b/app/src/sharedTest/java/org/oppia/android/app/home/TopicSummaryViewModelTest.kt index 4b6b1351d10..7e6cedb6445 100644 --- a/app/src/sharedTest/java/org/oppia/android/app/home/TopicSummaryViewModelTest.kt +++ b/app/src/sharedTest/java/org/oppia/android/app/home/TopicSummaryViewModelTest.kt @@ -52,7 +52,8 @@ import org.oppia.android.domain.onboarding.ExpirationMetaDataRetrieverModule import org.oppia.android.domain.oppialogger.LogStorageModule import org.oppia.android.domain.oppialogger.LoggingIdentifierModule import org.oppia.android.domain.oppialogger.analytics.ApplicationLifecycleModule -import org.oppia.android.domain.oppialogger.loguploader.LogUploadWorkerModule +import org.oppia.android.domain.oppialogger.logscheduler.MetricLogSchedulerModule +import org.oppia.android.domain.oppialogger.loguploader.LogReportWorkerModule import org.oppia.android.domain.platformparameter.PlatformParameterModule import org.oppia.android.domain.platformparameter.PlatformParameterSingletonModule import org.oppia.android.domain.question.QuestionModule @@ -361,7 +362,7 @@ class TopicSummaryViewModelTest { ImageClickInputModule::class, LogStorageModule::class, IntentFactoryShimModule::class, ViewBindingShimModule::class, CachingTestModule::class, RatioInputModule::class, PrimeTopicAssetsControllerModule::class, ExpirationMetaDataRetrieverModule::class, - ApplicationStartupListenerModule::class, LogUploadWorkerModule::class, + ApplicationStartupListenerModule::class, LogReportWorkerModule::class, WorkManagerConfigurationModule::class, HintsAndSolutionConfigModule::class, FirebaseLogUploaderModule::class, FakeOppiaClockModule::class, PracticeTabModule::class, DeveloperOptionsStarterModule::class, DeveloperOptionsModule::class, @@ -372,7 +373,7 @@ class TopicSummaryViewModelTest { NumericExpressionInputModule::class, AlgebraicExpressionInputModule::class, MathEquationInputModule::class, SplitScreenInteractionModule::class, LoggingIdentifierModule::class, ApplicationLifecycleModule::class, - SyncStatusModule::class + SyncStatusModule::class, MetricLogSchedulerModule::class ] ) interface TestApplicationComponent : ApplicationComponent { diff --git a/app/src/sharedTest/java/org/oppia/android/app/home/WelcomeViewModelTest.kt b/app/src/sharedTest/java/org/oppia/android/app/home/WelcomeViewModelTest.kt index b041e1e92d1..7505e4d774c 100644 --- a/app/src/sharedTest/java/org/oppia/android/app/home/WelcomeViewModelTest.kt +++ b/app/src/sharedTest/java/org/oppia/android/app/home/WelcomeViewModelTest.kt @@ -52,7 +52,8 @@ import org.oppia.android.domain.onboarding.ExpirationMetaDataRetrieverModule import org.oppia.android.domain.oppialogger.LogStorageModule import org.oppia.android.domain.oppialogger.LoggingIdentifierModule import org.oppia.android.domain.oppialogger.analytics.ApplicationLifecycleModule -import org.oppia.android.domain.oppialogger.loguploader.LogUploadWorkerModule +import org.oppia.android.domain.oppialogger.logscheduler.MetricLogSchedulerModule +import org.oppia.android.domain.oppialogger.loguploader.LogReportWorkerModule import org.oppia.android.domain.platformparameter.PlatformParameterModule import org.oppia.android.domain.platformparameter.PlatformParameterSingletonModule import org.oppia.android.domain.question.QuestionModule @@ -345,7 +346,7 @@ class WelcomeViewModelTest { ImageClickInputModule::class, LogStorageModule::class, IntentFactoryShimModule::class, ViewBindingShimModule::class, CachingTestModule::class, RatioInputModule::class, PrimeTopicAssetsControllerModule::class, ExpirationMetaDataRetrieverModule::class, - ApplicationStartupListenerModule::class, LogUploadWorkerModule::class, + ApplicationStartupListenerModule::class, LogReportWorkerModule::class, WorkManagerConfigurationModule::class, HintsAndSolutionConfigModule::class, FirebaseLogUploaderModule::class, FakeOppiaClockModule::class, PracticeTabModule::class, DeveloperOptionsStarterModule::class, DeveloperOptionsModule::class, @@ -356,7 +357,7 @@ class WelcomeViewModelTest { NumericExpressionInputModule::class, AlgebraicExpressionInputModule::class, MathEquationInputModule::class, SplitScreenInteractionModule::class, LoggingIdentifierModule::class, ApplicationLifecycleModule::class, - SyncStatusModule::class + SyncStatusModule::class, MetricLogSchedulerModule::class ] ) interface TestApplicationComponent : ApplicationComponent { diff --git a/app/src/sharedTest/java/org/oppia/android/app/home/promotedlist/PromotedStoryListViewModelTest.kt b/app/src/sharedTest/java/org/oppia/android/app/home/promotedlist/PromotedStoryListViewModelTest.kt index 94ea2653fc9..aee3ce36441 100644 --- a/app/src/sharedTest/java/org/oppia/android/app/home/promotedlist/PromotedStoryListViewModelTest.kt +++ b/app/src/sharedTest/java/org/oppia/android/app/home/promotedlist/PromotedStoryListViewModelTest.kt @@ -53,7 +53,8 @@ import org.oppia.android.domain.onboarding.ExpirationMetaDataRetrieverModule import org.oppia.android.domain.oppialogger.LogStorageModule import org.oppia.android.domain.oppialogger.LoggingIdentifierModule import org.oppia.android.domain.oppialogger.analytics.ApplicationLifecycleModule -import org.oppia.android.domain.oppialogger.loguploader.LogUploadWorkerModule +import org.oppia.android.domain.oppialogger.logscheduler.MetricLogSchedulerModule +import org.oppia.android.domain.oppialogger.loguploader.LogReportWorkerModule import org.oppia.android.domain.platformparameter.PlatformParameterModule import org.oppia.android.domain.platformparameter.PlatformParameterSingletonModule import org.oppia.android.domain.question.QuestionModule @@ -357,7 +358,7 @@ class PromotedStoryListViewModelTest { ImageClickInputModule::class, LogStorageModule::class, IntentFactoryShimModule::class, ViewBindingShimModule::class, CachingTestModule::class, RatioInputModule::class, PrimeTopicAssetsControllerModule::class, ExpirationMetaDataRetrieverModule::class, - ApplicationStartupListenerModule::class, LogUploadWorkerModule::class, + ApplicationStartupListenerModule::class, LogReportWorkerModule::class, WorkManagerConfigurationModule::class, HintsAndSolutionConfigModule::class, FirebaseLogUploaderModule::class, FakeOppiaClockModule::class, PracticeTabModule::class, DeveloperOptionsStarterModule::class, DeveloperOptionsModule::class, @@ -368,7 +369,7 @@ class PromotedStoryListViewModelTest { NumericExpressionInputModule::class, AlgebraicExpressionInputModule::class, MathEquationInputModule::class, SplitScreenInteractionModule::class, LoggingIdentifierModule::class, ApplicationLifecycleModule::class, - SyncStatusModule::class + SyncStatusModule::class, MetricLogSchedulerModule::class ] ) interface TestApplicationComponent : ApplicationComponent { diff --git a/app/src/sharedTest/java/org/oppia/android/app/home/promotedlist/PromotedStoryViewModelTest.kt b/app/src/sharedTest/java/org/oppia/android/app/home/promotedlist/PromotedStoryViewModelTest.kt index 58f9a657ff1..6208ea3fbec 100644 --- a/app/src/sharedTest/java/org/oppia/android/app/home/promotedlist/PromotedStoryViewModelTest.kt +++ b/app/src/sharedTest/java/org/oppia/android/app/home/promotedlist/PromotedStoryViewModelTest.kt @@ -51,7 +51,8 @@ import org.oppia.android.domain.onboarding.ExpirationMetaDataRetrieverModule import org.oppia.android.domain.oppialogger.LogStorageModule import org.oppia.android.domain.oppialogger.LoggingIdentifierModule import org.oppia.android.domain.oppialogger.analytics.ApplicationLifecycleModule -import org.oppia.android.domain.oppialogger.loguploader.LogUploadWorkerModule +import org.oppia.android.domain.oppialogger.logscheduler.MetricLogSchedulerModule +import org.oppia.android.domain.oppialogger.loguploader.LogReportWorkerModule import org.oppia.android.domain.platformparameter.PlatformParameterModule import org.oppia.android.domain.platformparameter.PlatformParameterSingletonModule import org.oppia.android.domain.question.QuestionModule @@ -367,7 +368,7 @@ class PromotedStoryViewModelTest { ImageClickInputModule::class, LogStorageModule::class, IntentFactoryShimModule::class, ViewBindingShimModule::class, CachingTestModule::class, RatioInputModule::class, PrimeTopicAssetsControllerModule::class, ExpirationMetaDataRetrieverModule::class, - ApplicationStartupListenerModule::class, LogUploadWorkerModule::class, + ApplicationStartupListenerModule::class, LogReportWorkerModule::class, WorkManagerConfigurationModule::class, HintsAndSolutionConfigModule::class, FirebaseLogUploaderModule::class, FakeOppiaClockModule::class, PracticeTabModule::class, DeveloperOptionsStarterModule::class, DeveloperOptionsModule::class, @@ -378,7 +379,7 @@ class PromotedStoryViewModelTest { NumericExpressionInputModule::class, AlgebraicExpressionInputModule::class, MathEquationInputModule::class, SplitScreenInteractionModule::class, LoggingIdentifierModule::class, ApplicationLifecycleModule::class, - SyncStatusModule::class + SyncStatusModule::class, MetricLogSchedulerModule::class ] ) interface TestApplicationComponent : ApplicationComponent { diff --git a/app/src/sharedTest/java/org/oppia/android/app/mydownloads/MyDownloadsActivityTest.kt b/app/src/sharedTest/java/org/oppia/android/app/mydownloads/MyDownloadsActivityTest.kt index 7c074f3ac7e..a9b9c815a49 100644 --- a/app/src/sharedTest/java/org/oppia/android/app/mydownloads/MyDownloadsActivityTest.kt +++ b/app/src/sharedTest/java/org/oppia/android/app/mydownloads/MyDownloadsActivityTest.kt @@ -49,7 +49,8 @@ import org.oppia.android.domain.onboarding.ExpirationMetaDataRetrieverModule import org.oppia.android.domain.oppialogger.LogStorageModule import org.oppia.android.domain.oppialogger.LoggingIdentifierModule import org.oppia.android.domain.oppialogger.analytics.ApplicationLifecycleModule -import org.oppia.android.domain.oppialogger.loguploader.LogUploadWorkerModule +import org.oppia.android.domain.oppialogger.logscheduler.MetricLogSchedulerModule +import org.oppia.android.domain.oppialogger.loguploader.LogReportWorkerModule import org.oppia.android.domain.platformparameter.PlatformParameterModule import org.oppia.android.domain.platformparameter.PlatformParameterSingletonModule import org.oppia.android.domain.question.QuestionModule @@ -131,7 +132,7 @@ class MyDownloadsActivityTest { AccessibilityTestModule::class, LogStorageModule::class, CachingTestModule::class, PrimeTopicAssetsControllerModule::class, ExpirationMetaDataRetrieverModule::class, ViewBindingShimModule::class, RatioInputModule::class, WorkManagerConfigurationModule::class, - ApplicationStartupListenerModule::class, LogUploadWorkerModule::class, + ApplicationStartupListenerModule::class, LogReportWorkerModule::class, HintsAndSolutionConfigModule::class, HintsAndSolutionProdModule::class, FirebaseLogUploaderModule::class, FakeOppiaClockModule::class, PracticeTabModule::class, DeveloperOptionsStarterModule::class, DeveloperOptionsModule::class, @@ -141,7 +142,7 @@ class MyDownloadsActivityTest { NumericExpressionInputModule::class, AlgebraicExpressionInputModule::class, MathEquationInputModule::class, SplitScreenInteractionModule::class, LoggingIdentifierModule::class, ApplicationLifecycleModule::class, - SyncStatusModule::class + SyncStatusModule::class, MetricLogSchedulerModule::class ] ) interface TestApplicationComponent : ApplicationComponent { diff --git a/app/src/sharedTest/java/org/oppia/android/app/mydownloads/MyDownloadsFragmentTest.kt b/app/src/sharedTest/java/org/oppia/android/app/mydownloads/MyDownloadsFragmentTest.kt index e00a159ed6a..a1aa44be743 100644 --- a/app/src/sharedTest/java/org/oppia/android/app/mydownloads/MyDownloadsFragmentTest.kt +++ b/app/src/sharedTest/java/org/oppia/android/app/mydownloads/MyDownloadsFragmentTest.kt @@ -60,7 +60,8 @@ import org.oppia.android.domain.onboarding.ExpirationMetaDataRetrieverModule import org.oppia.android.domain.oppialogger.LogStorageModule import org.oppia.android.domain.oppialogger.LoggingIdentifierModule import org.oppia.android.domain.oppialogger.analytics.ApplicationLifecycleModule -import org.oppia.android.domain.oppialogger.loguploader.LogUploadWorkerModule +import org.oppia.android.domain.oppialogger.logscheduler.MetricLogSchedulerModule +import org.oppia.android.domain.oppialogger.loguploader.LogReportWorkerModule import org.oppia.android.domain.platformparameter.PlatformParameterModule import org.oppia.android.domain.platformparameter.PlatformParameterSingletonModule import org.oppia.android.domain.question.QuestionModule @@ -222,7 +223,7 @@ class MyDownloadsFragmentTest { AccessibilityTestModule::class, LogStorageModule::class, CachingTestModule::class, PrimeTopicAssetsControllerModule::class, ExpirationMetaDataRetrieverModule::class, ViewBindingShimModule::class, RatioInputModule::class, WorkManagerConfigurationModule::class, - ApplicationStartupListenerModule::class, LogUploadWorkerModule::class, + ApplicationStartupListenerModule::class, LogReportWorkerModule::class, HintsAndSolutionConfigModule::class, HintsAndSolutionProdModule::class, FirebaseLogUploaderModule::class, FakeOppiaClockModule::class, PracticeTabModule::class, DeveloperOptionsStarterModule::class, DeveloperOptionsModule::class, @@ -232,7 +233,7 @@ class MyDownloadsFragmentTest { NumericExpressionInputModule::class, AlgebraicExpressionInputModule::class, MathEquationInputModule::class, SplitScreenInteractionModule::class, LoggingIdentifierModule::class, ApplicationLifecycleModule::class, - SyncStatusModule::class + SyncStatusModule::class, MetricLogSchedulerModule::class ] ) interface TestApplicationComponent : ApplicationComponent { diff --git a/app/src/sharedTest/java/org/oppia/android/app/onboarding/OnboardingActivityTest.kt b/app/src/sharedTest/java/org/oppia/android/app/onboarding/OnboardingActivityTest.kt index 4a75018850e..412a7674a49 100644 --- a/app/src/sharedTest/java/org/oppia/android/app/onboarding/OnboardingActivityTest.kt +++ b/app/src/sharedTest/java/org/oppia/android/app/onboarding/OnboardingActivityTest.kt @@ -50,7 +50,8 @@ import org.oppia.android.domain.onboarding.ExpirationMetaDataRetrieverModule import org.oppia.android.domain.oppialogger.LogStorageModule import org.oppia.android.domain.oppialogger.LoggingIdentifierModule import org.oppia.android.domain.oppialogger.analytics.ApplicationLifecycleModule -import org.oppia.android.domain.oppialogger.loguploader.LogUploadWorkerModule +import org.oppia.android.domain.oppialogger.logscheduler.MetricLogSchedulerModule +import org.oppia.android.domain.oppialogger.loguploader.LogReportWorkerModule import org.oppia.android.domain.platformparameter.PlatformParameterModule import org.oppia.android.domain.platformparameter.PlatformParameterSingletonModule import org.oppia.android.domain.question.QuestionModule @@ -140,7 +141,7 @@ class OnboardingActivityTest { AccessibilityTestModule::class, LogStorageModule::class, CachingTestModule::class, PrimeTopicAssetsControllerModule::class, ExpirationMetaDataRetrieverModule::class, ViewBindingShimModule::class, RatioInputModule::class, WorkManagerConfigurationModule::class, - ApplicationStartupListenerModule::class, LogUploadWorkerModule::class, + ApplicationStartupListenerModule::class, LogReportWorkerModule::class, HintsAndSolutionConfigModule::class, HintsAndSolutionProdModule::class, FirebaseLogUploaderModule::class, FakeOppiaClockModule::class, PracticeTabModule::class, DeveloperOptionsStarterModule::class, DeveloperOptionsModule::class, @@ -150,7 +151,7 @@ class OnboardingActivityTest { NumericExpressionInputModule::class, AlgebraicExpressionInputModule::class, MathEquationInputModule::class, SplitScreenInteractionModule::class, LoggingIdentifierModule::class, ApplicationLifecycleModule::class, - SyncStatusModule::class + SyncStatusModule::class, MetricLogSchedulerModule::class ] ) interface TestApplicationComponent : ApplicationComponent { diff --git a/app/src/sharedTest/java/org/oppia/android/app/onboarding/OnboardingFragmentTest.kt b/app/src/sharedTest/java/org/oppia/android/app/onboarding/OnboardingFragmentTest.kt index cbeb01d1d79..5b3d03d8824 100644 --- a/app/src/sharedTest/java/org/oppia/android/app/onboarding/OnboardingFragmentTest.kt +++ b/app/src/sharedTest/java/org/oppia/android/app/onboarding/OnboardingFragmentTest.kt @@ -78,7 +78,8 @@ import org.oppia.android.domain.onboarding.ExpirationMetaDataRetrieverModule import org.oppia.android.domain.oppialogger.LogStorageModule import org.oppia.android.domain.oppialogger.LoggingIdentifierModule import org.oppia.android.domain.oppialogger.analytics.ApplicationLifecycleModule -import org.oppia.android.domain.oppialogger.loguploader.LogUploadWorkerModule +import org.oppia.android.domain.oppialogger.logscheduler.MetricLogSchedulerModule +import org.oppia.android.domain.oppialogger.loguploader.LogReportWorkerModule import org.oppia.android.domain.platformparameter.PlatformParameterModule import org.oppia.android.domain.platformparameter.PlatformParameterSingletonModule import org.oppia.android.domain.question.QuestionModule @@ -712,7 +713,7 @@ class OnboardingFragmentTest { AccessibilityTestModule::class, LogStorageModule::class, CachingTestModule::class, PrimeTopicAssetsControllerModule::class, ExpirationMetaDataRetrieverModule::class, ViewBindingShimModule::class, RatioInputModule::class, WorkManagerConfigurationModule::class, - ApplicationStartupListenerModule::class, LogUploadWorkerModule::class, + ApplicationStartupListenerModule::class, LogReportWorkerModule::class, HintsAndSolutionConfigModule::class, HintsAndSolutionProdModule::class, FirebaseLogUploaderModule::class, FakeOppiaClockModule::class, PracticeTabModule::class, DeveloperOptionsStarterModule::class, DeveloperOptionsModule::class, @@ -722,7 +723,7 @@ class OnboardingFragmentTest { NumericExpressionInputModule::class, AlgebraicExpressionInputModule::class, MathEquationInputModule::class, SplitScreenInteractionModule::class, LoggingIdentifierModule::class, ApplicationLifecycleModule::class, - SyncStatusModule::class + SyncStatusModule::class, MetricLogSchedulerModule::class ] ) interface TestApplicationComponent : ApplicationComponent { diff --git a/app/src/sharedTest/java/org/oppia/android/app/ongoingtopiclist/OngoingTopicListActivityTest.kt b/app/src/sharedTest/java/org/oppia/android/app/ongoingtopiclist/OngoingTopicListActivityTest.kt index e5caa8c9196..c9d0f8ff1d1 100644 --- a/app/src/sharedTest/java/org/oppia/android/app/ongoingtopiclist/OngoingTopicListActivityTest.kt +++ b/app/src/sharedTest/java/org/oppia/android/app/ongoingtopiclist/OngoingTopicListActivityTest.kt @@ -69,7 +69,8 @@ import org.oppia.android.domain.onboarding.ExpirationMetaDataRetrieverModule import org.oppia.android.domain.oppialogger.LogStorageModule import org.oppia.android.domain.oppialogger.LoggingIdentifierModule import org.oppia.android.domain.oppialogger.analytics.ApplicationLifecycleModule -import org.oppia.android.domain.oppialogger.loguploader.LogUploadWorkerModule +import org.oppia.android.domain.oppialogger.logscheduler.MetricLogSchedulerModule +import org.oppia.android.domain.oppialogger.loguploader.LogReportWorkerModule import org.oppia.android.domain.platformparameter.PlatformParameterModule import org.oppia.android.domain.platformparameter.PlatformParameterSingletonModule import org.oppia.android.domain.question.QuestionModule @@ -447,7 +448,7 @@ class OngoingTopicListActivityTest { AccessibilityTestModule::class, LogStorageModule::class, CachingTestModule::class, PrimeTopicAssetsControllerModule::class, ExpirationMetaDataRetrieverModule::class, ViewBindingShimModule::class, RatioInputModule::class, WorkManagerConfigurationModule::class, - ApplicationStartupListenerModule::class, LogUploadWorkerModule::class, + ApplicationStartupListenerModule::class, LogReportWorkerModule::class, HintsAndSolutionConfigModule::class, HintsAndSolutionProdModule::class, FirebaseLogUploaderModule::class, FakeOppiaClockModule::class, PracticeTabModule::class, DeveloperOptionsStarterModule::class, DeveloperOptionsModule::class, @@ -457,7 +458,7 @@ class OngoingTopicListActivityTest { NumericExpressionInputModule::class, AlgebraicExpressionInputModule::class, MathEquationInputModule::class, SplitScreenInteractionModule::class, LoggingIdentifierModule::class, ApplicationLifecycleModule::class, - SyncStatusModule::class + SyncStatusModule::class, MetricLogSchedulerModule::class ] ) interface TestApplicationComponent : ApplicationComponent { diff --git a/app/src/sharedTest/java/org/oppia/android/app/options/AppLanguageActivityTest.kt b/app/src/sharedTest/java/org/oppia/android/app/options/AppLanguageActivityTest.kt index 395f1bfa6d0..62965d09a72 100644 --- a/app/src/sharedTest/java/org/oppia/android/app/options/AppLanguageActivityTest.kt +++ b/app/src/sharedTest/java/org/oppia/android/app/options/AppLanguageActivityTest.kt @@ -50,7 +50,8 @@ import org.oppia.android.domain.onboarding.ExpirationMetaDataRetrieverModule import org.oppia.android.domain.oppialogger.LogStorageModule import org.oppia.android.domain.oppialogger.LoggingIdentifierModule import org.oppia.android.domain.oppialogger.analytics.ApplicationLifecycleModule -import org.oppia.android.domain.oppialogger.loguploader.LogUploadWorkerModule +import org.oppia.android.domain.oppialogger.logscheduler.MetricLogSchedulerModule +import org.oppia.android.domain.oppialogger.loguploader.LogReportWorkerModule import org.oppia.android.domain.platformparameter.PlatformParameterModule import org.oppia.android.domain.platformparameter.PlatformParameterSingletonModule import org.oppia.android.domain.question.QuestionModule @@ -150,7 +151,7 @@ class AppLanguageActivityTest { AccessibilityTestModule::class, LogStorageModule::class, CachingTestModule::class, PrimeTopicAssetsControllerModule::class, ExpirationMetaDataRetrieverModule::class, ViewBindingShimModule::class, RatioInputModule::class, WorkManagerConfigurationModule::class, - ApplicationStartupListenerModule::class, LogUploadWorkerModule::class, + ApplicationStartupListenerModule::class, LogReportWorkerModule::class, HintsAndSolutionConfigModule::class, HintsAndSolutionProdModule::class, FirebaseLogUploaderModule::class, FakeOppiaClockModule::class, PracticeTabModule::class, DeveloperOptionsStarterModule::class, DeveloperOptionsModule::class, @@ -160,7 +161,7 @@ class AppLanguageActivityTest { NumericExpressionInputModule::class, AlgebraicExpressionInputModule::class, MathEquationInputModule::class, SplitScreenInteractionModule::class, LoggingIdentifierModule::class, ApplicationLifecycleModule::class, - SyncStatusModule::class + SyncStatusModule::class, MetricLogSchedulerModule::class ] ) interface TestApplicationComponent : ApplicationComponent { diff --git a/app/src/sharedTest/java/org/oppia/android/app/options/AppLanguageFragmentTest.kt b/app/src/sharedTest/java/org/oppia/android/app/options/AppLanguageFragmentTest.kt index 1720dc9ebf2..78966f2e217 100644 --- a/app/src/sharedTest/java/org/oppia/android/app/options/AppLanguageFragmentTest.kt +++ b/app/src/sharedTest/java/org/oppia/android/app/options/AppLanguageFragmentTest.kt @@ -59,7 +59,8 @@ import org.oppia.android.domain.onboarding.ExpirationMetaDataRetrieverModule import org.oppia.android.domain.oppialogger.LogStorageModule import org.oppia.android.domain.oppialogger.LoggingIdentifierModule import org.oppia.android.domain.oppialogger.analytics.ApplicationLifecycleModule -import org.oppia.android.domain.oppialogger.loguploader.LogUploadWorkerModule +import org.oppia.android.domain.oppialogger.logscheduler.MetricLogSchedulerModule +import org.oppia.android.domain.oppialogger.loguploader.LogReportWorkerModule import org.oppia.android.domain.platformparameter.PlatformParameterModule import org.oppia.android.domain.platformparameter.PlatformParameterSingletonModule import org.oppia.android.domain.question.QuestionModule @@ -246,7 +247,7 @@ class AppLanguageFragmentTest { ViewBindingShimModule::class, ApplicationStartupListenerModule::class, RatioInputModule::class, HintsAndSolutionConfigModule::class, WorkManagerConfigurationModule::class, FirebaseLogUploaderModule::class, - LogUploadWorkerModule::class, FakeOppiaClockModule::class, PracticeTabModule::class, + LogReportWorkerModule::class, FakeOppiaClockModule::class, PracticeTabModule::class, DeveloperOptionsStarterModule::class, DeveloperOptionsModule::class, ExplorationStorageModule::class, NetworkModule::class, HintsAndSolutionProdModule::class, NetworkConnectionUtilDebugModule::class, NetworkConnectionDebugUtilModule::class, @@ -255,7 +256,7 @@ class AppLanguageFragmentTest { NumericExpressionInputModule::class, AlgebraicExpressionInputModule::class, MathEquationInputModule::class, SplitScreenInteractionModule::class, LoggingIdentifierModule::class, ApplicationLifecycleModule::class, - SyncStatusModule::class + SyncStatusModule::class, MetricLogSchedulerModule::class ] ) interface TestApplicationComponent : ApplicationComponent { diff --git a/app/src/sharedTest/java/org/oppia/android/app/options/AudioLanguageActivityTest.kt b/app/src/sharedTest/java/org/oppia/android/app/options/AudioLanguageActivityTest.kt index fa2bed58f8b..eb69586b13c 100644 --- a/app/src/sharedTest/java/org/oppia/android/app/options/AudioLanguageActivityTest.kt +++ b/app/src/sharedTest/java/org/oppia/android/app/options/AudioLanguageActivityTest.kt @@ -50,7 +50,8 @@ import org.oppia.android.domain.onboarding.ExpirationMetaDataRetrieverModule import org.oppia.android.domain.oppialogger.LogStorageModule import org.oppia.android.domain.oppialogger.LoggingIdentifierModule import org.oppia.android.domain.oppialogger.analytics.ApplicationLifecycleModule -import org.oppia.android.domain.oppialogger.loguploader.LogUploadWorkerModule +import org.oppia.android.domain.oppialogger.logscheduler.MetricLogSchedulerModule +import org.oppia.android.domain.oppialogger.loguploader.LogReportWorkerModule import org.oppia.android.domain.platformparameter.PlatformParameterModule import org.oppia.android.domain.platformparameter.PlatformParameterSingletonModule import org.oppia.android.domain.question.QuestionModule @@ -150,7 +151,7 @@ class AudioLanguageActivityTest { AccessibilityTestModule::class, LogStorageModule::class, CachingTestModule::class, PrimeTopicAssetsControllerModule::class, ExpirationMetaDataRetrieverModule::class, ViewBindingShimModule::class, RatioInputModule::class, WorkManagerConfigurationModule::class, - ApplicationStartupListenerModule::class, LogUploadWorkerModule::class, + ApplicationStartupListenerModule::class, LogReportWorkerModule::class, HintsAndSolutionConfigModule::class, HintsAndSolutionProdModule::class, FirebaseLogUploaderModule::class, FakeOppiaClockModule::class, PracticeTabModule::class, DeveloperOptionsStarterModule::class, DeveloperOptionsModule::class, @@ -160,7 +161,7 @@ class AudioLanguageActivityTest { NumericExpressionInputModule::class, AlgebraicExpressionInputModule::class, MathEquationInputModule::class, SplitScreenInteractionModule::class, LoggingIdentifierModule::class, ApplicationLifecycleModule::class, - SyncStatusModule::class + SyncStatusModule::class, MetricLogSchedulerModule::class ] ) interface TestApplicationComponent : ApplicationComponent { diff --git a/app/src/sharedTest/java/org/oppia/android/app/options/AudioLanguageFragmentTest.kt b/app/src/sharedTest/java/org/oppia/android/app/options/AudioLanguageFragmentTest.kt index 4376d4ebeb3..dbb338d76e2 100644 --- a/app/src/sharedTest/java/org/oppia/android/app/options/AudioLanguageFragmentTest.kt +++ b/app/src/sharedTest/java/org/oppia/android/app/options/AudioLanguageFragmentTest.kt @@ -58,7 +58,8 @@ import org.oppia.android.domain.onboarding.ExpirationMetaDataRetrieverModule import org.oppia.android.domain.oppialogger.LogStorageModule import org.oppia.android.domain.oppialogger.LoggingIdentifierModule import org.oppia.android.domain.oppialogger.analytics.ApplicationLifecycleModule -import org.oppia.android.domain.oppialogger.loguploader.LogUploadWorkerModule +import org.oppia.android.domain.oppialogger.logscheduler.MetricLogSchedulerModule +import org.oppia.android.domain.oppialogger.loguploader.LogReportWorkerModule import org.oppia.android.domain.platformparameter.PlatformParameterModule import org.oppia.android.domain.platformparameter.PlatformParameterSingletonModule import org.oppia.android.domain.question.QuestionModule @@ -238,7 +239,7 @@ class AudioLanguageFragmentTest { PrimeTopicAssetsControllerModule::class, ExpirationMetaDataRetrieverModule::class, ViewBindingShimModule::class, ApplicationStartupListenerModule::class, RatioInputModule::class, HintsAndSolutionConfigModule::class, - WorkManagerConfigurationModule::class, LogUploadWorkerModule::class, + WorkManagerConfigurationModule::class, LogReportWorkerModule::class, FirebaseLogUploaderModule::class, FakeOppiaClockModule::class, PracticeTabModule::class, DeveloperOptionsStarterModule::class, DeveloperOptionsModule::class, ExplorationStorageModule::class, NetworkModule::class, HintsAndSolutionProdModule::class, @@ -248,7 +249,7 @@ class AudioLanguageFragmentTest { NumericExpressionInputModule::class, AlgebraicExpressionInputModule::class, MathEquationInputModule::class, SplitScreenInteractionModule::class, LoggingIdentifierModule::class, ApplicationLifecycleModule::class, - SyncStatusModule::class + SyncStatusModule::class, MetricLogSchedulerModule::class ] ) interface TestApplicationComponent : ApplicationComponent { diff --git a/app/src/sharedTest/java/org/oppia/android/app/options/OptionsActivityTest.kt b/app/src/sharedTest/java/org/oppia/android/app/options/OptionsActivityTest.kt index 51ef476ad81..b90e05fd338 100644 --- a/app/src/sharedTest/java/org/oppia/android/app/options/OptionsActivityTest.kt +++ b/app/src/sharedTest/java/org/oppia/android/app/options/OptionsActivityTest.kt @@ -50,7 +50,8 @@ import org.oppia.android.domain.onboarding.ExpirationMetaDataRetrieverModule import org.oppia.android.domain.oppialogger.LogStorageModule import org.oppia.android.domain.oppialogger.LoggingIdentifierModule import org.oppia.android.domain.oppialogger.analytics.ApplicationLifecycleModule -import org.oppia.android.domain.oppialogger.loguploader.LogUploadWorkerModule +import org.oppia.android.domain.oppialogger.logscheduler.MetricLogSchedulerModule +import org.oppia.android.domain.oppialogger.loguploader.LogReportWorkerModule import org.oppia.android.domain.platformparameter.PlatformParameterModule import org.oppia.android.domain.platformparameter.PlatformParameterSingletonModule import org.oppia.android.domain.question.QuestionModule @@ -142,7 +143,7 @@ class OptionsActivityTest { AccessibilityTestModule::class, LogStorageModule::class, CachingTestModule::class, PrimeTopicAssetsControllerModule::class, ExpirationMetaDataRetrieverModule::class, ViewBindingShimModule::class, RatioInputModule::class, WorkManagerConfigurationModule::class, - ApplicationStartupListenerModule::class, LogUploadWorkerModule::class, + ApplicationStartupListenerModule::class, LogReportWorkerModule::class, HintsAndSolutionConfigModule::class, HintsAndSolutionProdModule::class, FirebaseLogUploaderModule::class, FakeOppiaClockModule::class, PracticeTabModule::class, DeveloperOptionsStarterModule::class, DeveloperOptionsModule::class, @@ -152,7 +153,7 @@ class OptionsActivityTest { NumericExpressionInputModule::class, AlgebraicExpressionInputModule::class, MathEquationInputModule::class, SplitScreenInteractionModule::class, LoggingIdentifierModule::class, ApplicationLifecycleModule::class, - SyncStatusModule::class + SyncStatusModule::class, MetricLogSchedulerModule::class ] ) interface TestApplicationComponent : ApplicationComponent { diff --git a/app/src/sharedTest/java/org/oppia/android/app/options/OptionsFragmentTest.kt b/app/src/sharedTest/java/org/oppia/android/app/options/OptionsFragmentTest.kt index 8d8dd411b1b..50701da0b58 100644 --- a/app/src/sharedTest/java/org/oppia/android/app/options/OptionsFragmentTest.kt +++ b/app/src/sharedTest/java/org/oppia/android/app/options/OptionsFragmentTest.kt @@ -70,7 +70,8 @@ import org.oppia.android.domain.onboarding.ExpirationMetaDataRetrieverModule import org.oppia.android.domain.oppialogger.LogStorageModule import org.oppia.android.domain.oppialogger.LoggingIdentifierModule import org.oppia.android.domain.oppialogger.analytics.ApplicationLifecycleModule -import org.oppia.android.domain.oppialogger.loguploader.LogUploadWorkerModule +import org.oppia.android.domain.oppialogger.logscheduler.MetricLogSchedulerModule +import org.oppia.android.domain.oppialogger.loguploader.LogReportWorkerModule import org.oppia.android.domain.platformparameter.PlatformParameterSingletonModule import org.oppia.android.domain.question.QuestionModule import org.oppia.android.domain.topic.PrimeTopicAssetsControllerModule @@ -642,7 +643,7 @@ class OptionsFragmentTest { AccessibilityTestModule::class, LogStorageModule::class, CachingTestModule::class, PrimeTopicAssetsControllerModule::class, ExpirationMetaDataRetrieverModule::class, ViewBindingShimModule::class, RatioInputModule::class, WorkManagerConfigurationModule::class, - ApplicationStartupListenerModule::class, LogUploadWorkerModule::class, + ApplicationStartupListenerModule::class, LogReportWorkerModule::class, HintsAndSolutionConfigModule::class, HintsAndSolutionProdModule::class, FirebaseLogUploaderModule::class, FakeOppiaClockModule::class, PracticeTabModule::class, DeveloperOptionsStarterModule::class, DeveloperOptionsModule::class, @@ -652,7 +653,7 @@ class OptionsFragmentTest { NumericExpressionInputModule::class, AlgebraicExpressionInputModule::class, MathEquationInputModule::class, SplitScreenInteractionModule::class, LoggingIdentifierModule::class, ApplicationLifecycleModule::class, - SyncStatusModule::class + SyncStatusModule::class, MetricLogSchedulerModule::class ] ) interface TestApplicationComponent : ApplicationComponent { diff --git a/app/src/sharedTest/java/org/oppia/android/app/options/ReadingTextSizeActivityTest.kt b/app/src/sharedTest/java/org/oppia/android/app/options/ReadingTextSizeActivityTest.kt index ae37f1cea24..40fd59f6fb8 100644 --- a/app/src/sharedTest/java/org/oppia/android/app/options/ReadingTextSizeActivityTest.kt +++ b/app/src/sharedTest/java/org/oppia/android/app/options/ReadingTextSizeActivityTest.kt @@ -50,7 +50,8 @@ import org.oppia.android.domain.onboarding.ExpirationMetaDataRetrieverModule import org.oppia.android.domain.oppialogger.LogStorageModule import org.oppia.android.domain.oppialogger.LoggingIdentifierModule import org.oppia.android.domain.oppialogger.analytics.ApplicationLifecycleModule -import org.oppia.android.domain.oppialogger.loguploader.LogUploadWorkerModule +import org.oppia.android.domain.oppialogger.logscheduler.MetricLogSchedulerModule +import org.oppia.android.domain.oppialogger.loguploader.LogReportWorkerModule import org.oppia.android.domain.platformparameter.PlatformParameterModule import org.oppia.android.domain.platformparameter.PlatformParameterSingletonModule import org.oppia.android.domain.question.QuestionModule @@ -150,7 +151,7 @@ class ReadingTextSizeActivityTest { AccessibilityTestModule::class, LogStorageModule::class, CachingTestModule::class, PrimeTopicAssetsControllerModule::class, ExpirationMetaDataRetrieverModule::class, ViewBindingShimModule::class, RatioInputModule::class, WorkManagerConfigurationModule::class, - ApplicationStartupListenerModule::class, LogUploadWorkerModule::class, + ApplicationStartupListenerModule::class, LogReportWorkerModule::class, HintsAndSolutionConfigModule::class, HintsAndSolutionProdModule::class, FirebaseLogUploaderModule::class, FakeOppiaClockModule::class, PracticeTabModule::class, DeveloperOptionsStarterModule::class, DeveloperOptionsModule::class, @@ -160,7 +161,7 @@ class ReadingTextSizeActivityTest { NumericExpressionInputModule::class, AlgebraicExpressionInputModule::class, MathEquationInputModule::class, SplitScreenInteractionModule::class, LoggingIdentifierModule::class, ApplicationLifecycleModule::class, - SyncStatusModule::class + SyncStatusModule::class, MetricLogSchedulerModule::class ] ) interface TestApplicationComponent : ApplicationComponent { diff --git a/app/src/sharedTest/java/org/oppia/android/app/options/ReadingTextSizeFragmentTest.kt b/app/src/sharedTest/java/org/oppia/android/app/options/ReadingTextSizeFragmentTest.kt index 52e4e3e40fe..46284607705 100644 --- a/app/src/sharedTest/java/org/oppia/android/app/options/ReadingTextSizeFragmentTest.kt +++ b/app/src/sharedTest/java/org/oppia/android/app/options/ReadingTextSizeFragmentTest.kt @@ -65,7 +65,8 @@ import org.oppia.android.domain.onboarding.ExpirationMetaDataRetrieverModule import org.oppia.android.domain.oppialogger.LogStorageModule import org.oppia.android.domain.oppialogger.LoggingIdentifierModule import org.oppia.android.domain.oppialogger.analytics.ApplicationLifecycleModule -import org.oppia.android.domain.oppialogger.loguploader.LogUploadWorkerModule +import org.oppia.android.domain.oppialogger.logscheduler.MetricLogSchedulerModule +import org.oppia.android.domain.oppialogger.loguploader.LogReportWorkerModule import org.oppia.android.domain.platformparameter.PlatformParameterModule import org.oppia.android.domain.platformparameter.PlatformParameterSingletonModule import org.oppia.android.domain.question.QuestionModule @@ -305,7 +306,7 @@ class ReadingTextSizeFragmentTest { ViewBindingShimModule::class, ApplicationStartupListenerModule::class, RatioInputModule::class, HintsAndSolutionConfigModule::class, WorkManagerConfigurationModule::class, FirebaseLogUploaderModule::class, - LogUploadWorkerModule::class, FakeOppiaClockModule::class, PracticeTabModule::class, + LogReportWorkerModule::class, FakeOppiaClockModule::class, PracticeTabModule::class, DeveloperOptionsStarterModule::class, DeveloperOptionsModule::class, ExplorationStorageModule::class, NetworkModule::class, HintsAndSolutionProdModule::class, NetworkConnectionUtilDebugModule::class, NetworkConnectionDebugUtilModule::class, @@ -314,7 +315,7 @@ class ReadingTextSizeFragmentTest { NumericExpressionInputModule::class, AlgebraicExpressionInputModule::class, MathEquationInputModule::class, SplitScreenInteractionModule::class, LoggingIdentifierModule::class, ApplicationLifecycleModule::class, - SyncStatusModule::class + SyncStatusModule::class, MetricLogSchedulerModule::class ] ) interface TestApplicationComponent : ApplicationComponent { diff --git a/app/src/sharedTest/java/org/oppia/android/app/parser/HtmlParserTest.kt b/app/src/sharedTest/java/org/oppia/android/app/parser/HtmlParserTest.kt index 189215323b4..6cc3bbcb4a0 100644 --- a/app/src/sharedTest/java/org/oppia/android/app/parser/HtmlParserTest.kt +++ b/app/src/sharedTest/java/org/oppia/android/app/parser/HtmlParserTest.kt @@ -90,7 +90,8 @@ import org.oppia.android.domain.onboarding.ExpirationMetaDataRetrieverModule import org.oppia.android.domain.oppialogger.LogStorageModule import org.oppia.android.domain.oppialogger.LoggingIdentifierModule import org.oppia.android.domain.oppialogger.analytics.ApplicationLifecycleModule -import org.oppia.android.domain.oppialogger.loguploader.LogUploadWorkerModule +import org.oppia.android.domain.oppialogger.logscheduler.MetricLogSchedulerModule +import org.oppia.android.domain.oppialogger.loguploader.LogReportWorkerModule import org.oppia.android.domain.platformparameter.PlatformParameterModule import org.oppia.android.domain.platformparameter.PlatformParameterSingletonModule import org.oppia.android.domain.question.QuestionModule @@ -896,7 +897,7 @@ class HtmlParserTest { AccessibilityTestModule::class, LogStorageModule::class, CachingTestModule::class, PrimeTopicAssetsControllerModule::class, ExpirationMetaDataRetrieverModule::class, ViewBindingShimModule::class, RatioInputModule::class, WorkManagerConfigurationModule::class, - ApplicationStartupListenerModule::class, LogUploadWorkerModule::class, + ApplicationStartupListenerModule::class, LogReportWorkerModule::class, HintsAndSolutionConfigModule::class, HintsAndSolutionProdModule::class, FirebaseLogUploaderModule::class, FakeOppiaClockModule::class, PracticeTabModule::class, DeveloperOptionsStarterModule::class, DeveloperOptionsModule::class, @@ -906,7 +907,7 @@ class HtmlParserTest { NumericExpressionInputModule::class, AlgebraicExpressionInputModule::class, MathEquationInputModule::class, SplitScreenInteractionModule::class, LoggingIdentifierModule::class, ApplicationLifecycleModule::class, - SyncStatusModule::class + SyncStatusModule::class, MetricLogSchedulerModule::class ] ) interface TestApplicationComponent : ApplicationComponent { diff --git a/app/src/sharedTest/java/org/oppia/android/app/parser/ListItemLeadingMarginSpanTest.kt b/app/src/sharedTest/java/org/oppia/android/app/parser/ListItemLeadingMarginSpanTest.kt index ca6620e317e..1ccba698308 100644 --- a/app/src/sharedTest/java/org/oppia/android/app/parser/ListItemLeadingMarginSpanTest.kt +++ b/app/src/sharedTest/java/org/oppia/android/app/parser/ListItemLeadingMarginSpanTest.kt @@ -72,7 +72,8 @@ import org.oppia.android.domain.onboarding.ExpirationMetaDataRetrieverModule import org.oppia.android.domain.oppialogger.LogStorageModule import org.oppia.android.domain.oppialogger.LoggingIdentifierModule import org.oppia.android.domain.oppialogger.analytics.ApplicationLifecycleModule -import org.oppia.android.domain.oppialogger.loguploader.LogUploadWorkerModule +import org.oppia.android.domain.oppialogger.logscheduler.MetricLogSchedulerModule +import org.oppia.android.domain.oppialogger.loguploader.LogReportWorkerModule import org.oppia.android.domain.platformparameter.PlatformParameterModule import org.oppia.android.domain.platformparameter.PlatformParameterSingletonModule import org.oppia.android.domain.question.QuestionModule @@ -1095,7 +1096,7 @@ class ListItemLeadingMarginSpanTest { AccessibilityTestModule::class, LogStorageModule::class, CachingTestModule::class, PrimeTopicAssetsControllerModule::class, ExpirationMetaDataRetrieverModule::class, ViewBindingShimModule::class, RatioInputModule::class, WorkManagerConfigurationModule::class, - ApplicationStartupListenerModule::class, LogUploadWorkerModule::class, + ApplicationStartupListenerModule::class, LogReportWorkerModule::class, HintsAndSolutionConfigModule::class, HintsAndSolutionProdModule::class, FirebaseLogUploaderModule::class, FakeOppiaClockModule::class, PracticeTabModule::class, DeveloperOptionsStarterModule::class, DeveloperOptionsModule::class, @@ -1105,7 +1106,7 @@ class ListItemLeadingMarginSpanTest { NumericExpressionInputModule::class, AlgebraicExpressionInputModule::class, MathEquationInputModule::class, SplitScreenInteractionModule::class, LoggingIdentifierModule::class, ApplicationLifecycleModule::class, - SyncStatusModule::class + SyncStatusModule::class, MetricLogSchedulerModule::class ] ) diff --git a/app/src/sharedTest/java/org/oppia/android/app/player/audio/AudioFragmentTest.kt b/app/src/sharedTest/java/org/oppia/android/app/player/audio/AudioFragmentTest.kt index 026a0eb3a6a..30186b1cc96 100644 --- a/app/src/sharedTest/java/org/oppia/android/app/player/audio/AudioFragmentTest.kt +++ b/app/src/sharedTest/java/org/oppia/android/app/player/audio/AudioFragmentTest.kt @@ -74,7 +74,8 @@ import org.oppia.android.domain.onboarding.ExpirationMetaDataRetrieverModule import org.oppia.android.domain.oppialogger.LogStorageModule import org.oppia.android.domain.oppialogger.LoggingIdentifierModule import org.oppia.android.domain.oppialogger.analytics.ApplicationLifecycleModule -import org.oppia.android.domain.oppialogger.loguploader.LogUploadWorkerModule +import org.oppia.android.domain.oppialogger.logscheduler.MetricLogSchedulerModule +import org.oppia.android.domain.oppialogger.loguploader.LogReportWorkerModule import org.oppia.android.domain.platformparameter.PlatformParameterModule import org.oppia.android.domain.platformparameter.PlatformParameterSingletonModule import org.oppia.android.domain.profile.ProfileManagementController @@ -467,7 +468,7 @@ class AudioFragmentTest { AccessibilityTestModule::class, LogStorageModule::class, CachingTestModule::class, PrimeTopicAssetsControllerModule::class, ExpirationMetaDataRetrieverModule::class, ViewBindingShimModule::class, RatioInputModule::class, WorkManagerConfigurationModule::class, - ApplicationStartupListenerModule::class, LogUploadWorkerModule::class, + ApplicationStartupListenerModule::class, LogReportWorkerModule::class, HintsAndSolutionConfigModule::class, HintsAndSolutionProdModule::class, FirebaseLogUploaderModule::class, FakeOppiaClockModule::class, PracticeTabModule::class, DeveloperOptionsStarterModule::class, DeveloperOptionsModule::class, @@ -477,7 +478,7 @@ class AudioFragmentTest { NumericExpressionInputModule::class, AlgebraicExpressionInputModule::class, MathEquationInputModule::class, SplitScreenInteractionModule::class, LoggingIdentifierModule::class, ApplicationLifecycleModule::class, - SyncStatusModule::class + SyncStatusModule::class, MetricLogSchedulerModule::class ] ) interface TestApplicationComponent : ApplicationComponent { diff --git a/app/src/sharedTest/java/org/oppia/android/app/player/exploration/ExplorationActivityTest.kt b/app/src/sharedTest/java/org/oppia/android/app/player/exploration/ExplorationActivityTest.kt index 13ea34c89a2..2020e38b87b 100644 --- a/app/src/sharedTest/java/org/oppia/android/app/player/exploration/ExplorationActivityTest.kt +++ b/app/src/sharedTest/java/org/oppia/android/app/player/exploration/ExplorationActivityTest.kt @@ -105,7 +105,8 @@ import org.oppia.android.domain.onboarding.ExpirationMetaDataRetrieverModule import org.oppia.android.domain.oppialogger.LogStorageModule import org.oppia.android.domain.oppialogger.LoggingIdentifierModule import org.oppia.android.domain.oppialogger.analytics.ApplicationLifecycleModule -import org.oppia.android.domain.oppialogger.loguploader.LogUploadWorkerModule +import org.oppia.android.domain.oppialogger.logscheduler.MetricLogSchedulerModule +import org.oppia.android.domain.oppialogger.loguploader.LogReportWorkerModule import org.oppia.android.domain.platformparameter.PlatformParameterModule import org.oppia.android.domain.platformparameter.PlatformParameterSingletonModule import org.oppia.android.domain.question.QuestionModule @@ -1947,7 +1948,7 @@ class ExplorationActivityTest { AccessibilityTestModule::class, LogStorageModule::class, CachingTestModule::class, PrimeTopicAssetsControllerModule::class, ExpirationMetaDataRetrieverModule::class, ViewBindingShimModule::class, RatioInputModule::class, WorkManagerConfigurationModule::class, - ApplicationStartupListenerModule::class, LogUploadWorkerModule::class, + ApplicationStartupListenerModule::class, LogReportWorkerModule::class, HintsAndSolutionConfigModule::class, HintsAndSolutionProdModule::class, FirebaseLogUploaderModule::class, FakeOppiaClockModule::class, PracticeTabModule::class, DeveloperOptionsStarterModule::class, DeveloperOptionsModule::class, @@ -1956,7 +1957,8 @@ class ExplorationActivityTest { AssetModule::class, LocaleProdModule::class, ActivityRecreatorTestModule::class, NumericExpressionInputModule::class, AlgebraicExpressionInputModule::class, MathEquationInputModule::class, SplitScreenInteractionModule::class, - LoggingIdentifierModule::class, ApplicationLifecycleModule::class, SyncStatusModule::class + LoggingIdentifierModule::class, ApplicationLifecycleModule::class, SyncStatusModule::class, + MetricLogSchedulerModule::class ] ) diff --git a/app/src/sharedTest/java/org/oppia/android/app/player/state/StateFragmentTest.kt b/app/src/sharedTest/java/org/oppia/android/app/player/state/StateFragmentTest.kt index ecbe1f15c4d..f1898d255d3 100644 --- a/app/src/sharedTest/java/org/oppia/android/app/player/state/StateFragmentTest.kt +++ b/app/src/sharedTest/java/org/oppia/android/app/player/state/StateFragmentTest.kt @@ -128,7 +128,8 @@ import org.oppia.android.domain.onboarding.ExpirationMetaDataRetrieverModule import org.oppia.android.domain.oppialogger.LogStorageModule import org.oppia.android.domain.oppialogger.LoggingIdentifierModule import org.oppia.android.domain.oppialogger.analytics.ApplicationLifecycleModule -import org.oppia.android.domain.oppialogger.loguploader.LogUploadWorkerModule +import org.oppia.android.domain.oppialogger.logscheduler.MetricLogSchedulerModule +import org.oppia.android.domain.oppialogger.loguploader.LogReportWorkerModule import org.oppia.android.domain.platformparameter.PlatformParameterModule import org.oppia.android.domain.platformparameter.PlatformParameterSingletonModule import org.oppia.android.domain.question.QuestionModule @@ -4308,7 +4309,7 @@ class StateFragmentTest { ExpirationMetaDataRetrieverModule::class, ViewBindingShimModule::class, RatioInputModule::class, ApplicationStartupListenerModule::class, HintsAndSolutionConfigFastShowTestModule::class, HintsAndSolutionProdModule::class, - WorkManagerConfigurationModule::class, LogUploadWorkerModule::class, + WorkManagerConfigurationModule::class, LogReportWorkerModule::class, FirebaseLogUploaderModule::class, FakeOppiaClockModule::class, PracticeTabModule::class, DeveloperOptionsStarterModule::class, DeveloperOptionsModule::class, ExplorationStorageModule::class, NetworkConnectionUtilDebugModule::class, @@ -4318,7 +4319,7 @@ class StateFragmentTest { NumericExpressionInputModule::class, AlgebraicExpressionInputModule::class, MathEquationInputModule::class, SplitScreenInteractionModule::class, LoggingIdentifierModule::class, ApplicationLifecycleModule::class, - SyncStatusModule::class + SyncStatusModule::class, MetricLogSchedulerModule::class ] ) interface TestApplicationComponent : ApplicationComponent { diff --git a/app/src/sharedTest/java/org/oppia/android/app/policies/PoliciesActivityTest.kt b/app/src/sharedTest/java/org/oppia/android/app/policies/PoliciesActivityTest.kt index 6e182dbb936..40789301bbd 100644 --- a/app/src/sharedTest/java/org/oppia/android/app/policies/PoliciesActivityTest.kt +++ b/app/src/sharedTest/java/org/oppia/android/app/policies/PoliciesActivityTest.kt @@ -51,7 +51,8 @@ import org.oppia.android.domain.onboarding.ExpirationMetaDataRetrieverModule import org.oppia.android.domain.oppialogger.LogStorageModule import org.oppia.android.domain.oppialogger.LoggingIdentifierModule import org.oppia.android.domain.oppialogger.analytics.ApplicationLifecycleModule -import org.oppia.android.domain.oppialogger.loguploader.LogUploadWorkerModule +import org.oppia.android.domain.oppialogger.logscheduler.MetricLogSchedulerModule +import org.oppia.android.domain.oppialogger.loguploader.LogReportWorkerModule import org.oppia.android.domain.platformparameter.PlatformParameterModule import org.oppia.android.domain.platformparameter.PlatformParameterSingletonModule import org.oppia.android.domain.question.QuestionModule @@ -173,7 +174,7 @@ class PoliciesActivityTest { AccessibilityTestModule::class, LogStorageModule::class, CachingTestModule::class, PrimeTopicAssetsControllerModule::class, ExpirationMetaDataRetrieverModule::class, ViewBindingShimModule::class, RatioInputModule::class, WorkManagerConfigurationModule::class, - ApplicationStartupListenerModule::class, LogUploadWorkerModule::class, + ApplicationStartupListenerModule::class, LogReportWorkerModule::class, HintsAndSolutionConfigModule::class, HintsAndSolutionProdModule::class, FirebaseLogUploaderModule::class, FakeOppiaClockModule::class, PracticeTabModule::class, DeveloperOptionsStarterModule::class, DeveloperOptionsModule::class, @@ -183,7 +184,7 @@ class PoliciesActivityTest { NumericExpressionInputModule::class, AlgebraicExpressionInputModule::class, MathEquationInputModule::class, SplitScreenInteractionModule::class, LoggingIdentifierModule::class, ApplicationLifecycleModule::class, - SyncStatusModule::class + SyncStatusModule::class, MetricLogSchedulerModule::class ] ) interface TestApplicationComponent : ApplicationComponent { diff --git a/app/src/sharedTest/java/org/oppia/android/app/policies/PoliciesFragmentTest.kt b/app/src/sharedTest/java/org/oppia/android/app/policies/PoliciesFragmentTest.kt index 0fde4e38fa8..f2ffe23dd5c 100644 --- a/app/src/sharedTest/java/org/oppia/android/app/policies/PoliciesFragmentTest.kt +++ b/app/src/sharedTest/java/org/oppia/android/app/policies/PoliciesFragmentTest.kt @@ -74,7 +74,8 @@ import org.oppia.android.domain.onboarding.ExpirationMetaDataRetrieverModule import org.oppia.android.domain.oppialogger.LogStorageModule import org.oppia.android.domain.oppialogger.LoggingIdentifierModule import org.oppia.android.domain.oppialogger.analytics.ApplicationLifecycleModule -import org.oppia.android.domain.oppialogger.loguploader.LogUploadWorkerModule +import org.oppia.android.domain.oppialogger.logscheduler.MetricLogSchedulerModule +import org.oppia.android.domain.oppialogger.loguploader.LogReportWorkerModule import org.oppia.android.domain.platformparameter.PlatformParameterModule import org.oppia.android.domain.platformparameter.PlatformParameterSingletonModule import org.oppia.android.domain.question.QuestionModule @@ -326,7 +327,7 @@ class PoliciesFragmentTest { AccessibilityTestModule::class, LogStorageModule::class, CachingTestModule::class, PrimeTopicAssetsControllerModule::class, ExpirationMetaDataRetrieverModule::class, ViewBindingShimModule::class, RatioInputModule::class, WorkManagerConfigurationModule::class, - ApplicationStartupListenerModule::class, LogUploadWorkerModule::class, + ApplicationStartupListenerModule::class, LogReportWorkerModule::class, HintsAndSolutionConfigModule::class, HintsAndSolutionProdModule::class, FirebaseLogUploaderModule::class, FakeOppiaClockModule::class, PracticeTabModule::class, DeveloperOptionsStarterModule::class, DeveloperOptionsModule::class, @@ -336,7 +337,7 @@ class PoliciesFragmentTest { NumericExpressionInputModule::class, AlgebraicExpressionInputModule::class, MathEquationInputModule::class, SplitScreenInteractionModule::class, LoggingIdentifierModule::class, ApplicationLifecycleModule::class, - SyncStatusModule::class + SyncStatusModule::class, MetricLogSchedulerModule::class ] ) interface TestApplicationComponent : ApplicationComponent { diff --git a/app/src/sharedTest/java/org/oppia/android/app/profile/AddProfileActivityTest.kt b/app/src/sharedTest/java/org/oppia/android/app/profile/AddProfileActivityTest.kt index 9629aa9a6c1..4cd82b31973 100644 --- a/app/src/sharedTest/java/org/oppia/android/app/profile/AddProfileActivityTest.kt +++ b/app/src/sharedTest/java/org/oppia/android/app/profile/AddProfileActivityTest.kt @@ -84,7 +84,8 @@ import org.oppia.android.domain.onboarding.ExpirationMetaDataRetrieverModule import org.oppia.android.domain.oppialogger.LogStorageModule import org.oppia.android.domain.oppialogger.LoggingIdentifierModule import org.oppia.android.domain.oppialogger.analytics.ApplicationLifecycleModule -import org.oppia.android.domain.oppialogger.loguploader.LogUploadWorkerModule +import org.oppia.android.domain.oppialogger.logscheduler.MetricLogSchedulerModule +import org.oppia.android.domain.oppialogger.loguploader.LogReportWorkerModule import org.oppia.android.domain.platformparameter.PlatformParameterModule import org.oppia.android.domain.platformparameter.PlatformParameterSingletonModule import org.oppia.android.domain.question.QuestionModule @@ -1721,7 +1722,7 @@ class AddProfileActivityTest { AccessibilityTestModule::class, LogStorageModule::class, CachingTestModule::class, PrimeTopicAssetsControllerModule::class, ExpirationMetaDataRetrieverModule::class, ViewBindingShimModule::class, RatioInputModule::class, WorkManagerConfigurationModule::class, - ApplicationStartupListenerModule::class, LogUploadWorkerModule::class, + ApplicationStartupListenerModule::class, LogReportWorkerModule::class, HintsAndSolutionConfigModule::class, HintsAndSolutionProdModule::class, FirebaseLogUploaderModule::class, FakeOppiaClockModule::class, PracticeTabModule::class, DeveloperOptionsStarterModule::class, DeveloperOptionsModule::class, @@ -1731,7 +1732,7 @@ class AddProfileActivityTest { NumericExpressionInputModule::class, AlgebraicExpressionInputModule::class, MathEquationInputModule::class, SplitScreenInteractionModule::class, LoggingIdentifierModule::class, ApplicationLifecycleModule::class, - SyncStatusModule::class + SyncStatusModule::class, MetricLogSchedulerModule::class ] ) interface TestApplicationComponent : ApplicationComponent { diff --git a/app/src/sharedTest/java/org/oppia/android/app/profile/AdminAuthActivityTest.kt b/app/src/sharedTest/java/org/oppia/android/app/profile/AdminAuthActivityTest.kt index 98236590291..c4934f2611c 100644 --- a/app/src/sharedTest/java/org/oppia/android/app/profile/AdminAuthActivityTest.kt +++ b/app/src/sharedTest/java/org/oppia/android/app/profile/AdminAuthActivityTest.kt @@ -70,7 +70,8 @@ import org.oppia.android.domain.onboarding.ExpirationMetaDataRetrieverModule import org.oppia.android.domain.oppialogger.LogStorageModule import org.oppia.android.domain.oppialogger.LoggingIdentifierModule import org.oppia.android.domain.oppialogger.analytics.ApplicationLifecycleModule -import org.oppia.android.domain.oppialogger.loguploader.LogUploadWorkerModule +import org.oppia.android.domain.oppialogger.logscheduler.MetricLogSchedulerModule +import org.oppia.android.domain.oppialogger.loguploader.LogReportWorkerModule import org.oppia.android.domain.platformparameter.PlatformParameterModule import org.oppia.android.domain.platformparameter.PlatformParameterSingletonModule import org.oppia.android.domain.question.QuestionModule @@ -660,7 +661,7 @@ class AdminAuthActivityTest { AccessibilityTestModule::class, LogStorageModule::class, CachingTestModule::class, PrimeTopicAssetsControllerModule::class, ExpirationMetaDataRetrieverModule::class, ViewBindingShimModule::class, RatioInputModule::class, WorkManagerConfigurationModule::class, - ApplicationStartupListenerModule::class, LogUploadWorkerModule::class, + ApplicationStartupListenerModule::class, LogReportWorkerModule::class, HintsAndSolutionConfigModule::class, HintsAndSolutionProdModule::class, FirebaseLogUploaderModule::class, FakeOppiaClockModule::class, PracticeTabModule::class, DeveloperOptionsStarterModule::class, DeveloperOptionsModule::class, @@ -671,7 +672,7 @@ class AdminAuthActivityTest { NumericExpressionInputModule::class, AlgebraicExpressionInputModule::class, MathEquationInputModule::class, SplitScreenInteractionModule::class, LoggingIdentifierModule::class, ApplicationLifecycleModule::class, - SyncStatusModule::class + SyncStatusModule::class, MetricLogSchedulerModule::class ] ) interface TestApplicationComponent : ApplicationComponent { diff --git a/app/src/sharedTest/java/org/oppia/android/app/profile/AdminPinActivityTest.kt b/app/src/sharedTest/java/org/oppia/android/app/profile/AdminPinActivityTest.kt index 6159eddba5c..4f66269badb 100644 --- a/app/src/sharedTest/java/org/oppia/android/app/profile/AdminPinActivityTest.kt +++ b/app/src/sharedTest/java/org/oppia/android/app/profile/AdminPinActivityTest.kt @@ -79,7 +79,8 @@ import org.oppia.android.domain.onboarding.ExpirationMetaDataRetrieverModule import org.oppia.android.domain.oppialogger.LogStorageModule import org.oppia.android.domain.oppialogger.LoggingIdentifierModule import org.oppia.android.domain.oppialogger.analytics.ApplicationLifecycleModule -import org.oppia.android.domain.oppialogger.loguploader.LogUploadWorkerModule +import org.oppia.android.domain.oppialogger.logscheduler.MetricLogSchedulerModule +import org.oppia.android.domain.oppialogger.loguploader.LogReportWorkerModule import org.oppia.android.domain.platformparameter.PlatformParameterModule import org.oppia.android.domain.platformparameter.PlatformParameterSingletonModule import org.oppia.android.domain.question.QuestionModule @@ -1079,7 +1080,7 @@ class AdminPinActivityTest { AccessibilityTestModule::class, LogStorageModule::class, CachingTestModule::class, PrimeTopicAssetsControllerModule::class, ExpirationMetaDataRetrieverModule::class, ViewBindingShimModule::class, RatioInputModule::class, WorkManagerConfigurationModule::class, - ApplicationStartupListenerModule::class, LogUploadWorkerModule::class, + ApplicationStartupListenerModule::class, LogReportWorkerModule::class, HintsAndSolutionConfigModule::class, HintsAndSolutionProdModule::class, FirebaseLogUploaderModule::class, FakeOppiaClockModule::class, PracticeTabModule::class, DeveloperOptionsStarterModule::class, DeveloperOptionsModule::class, @@ -1089,7 +1090,7 @@ class AdminPinActivityTest { NumericExpressionInputModule::class, AlgebraicExpressionInputModule::class, MathEquationInputModule::class, SplitScreenInteractionModule::class, LoggingIdentifierModule::class, ApplicationLifecycleModule::class, - SyncStatusModule::class + SyncStatusModule::class, MetricLogSchedulerModule::class ] ) interface TestApplicationComponent : ApplicationComponent { diff --git a/app/src/sharedTest/java/org/oppia/android/app/profile/PinPasswordActivityTest.kt b/app/src/sharedTest/java/org/oppia/android/app/profile/PinPasswordActivityTest.kt index 76f4a79eb69..f7f5fa8fe29 100644 --- a/app/src/sharedTest/java/org/oppia/android/app/profile/PinPasswordActivityTest.kt +++ b/app/src/sharedTest/java/org/oppia/android/app/profile/PinPasswordActivityTest.kt @@ -73,7 +73,8 @@ import org.oppia.android.domain.onboarding.ExpirationMetaDataRetrieverModule import org.oppia.android.domain.oppialogger.LogStorageModule import org.oppia.android.domain.oppialogger.LoggingIdentifierModule import org.oppia.android.domain.oppialogger.analytics.ApplicationLifecycleModule -import org.oppia.android.domain.oppialogger.loguploader.LogUploadWorkerModule +import org.oppia.android.domain.oppialogger.logscheduler.MetricLogSchedulerModule +import org.oppia.android.domain.oppialogger.loguploader.LogReportWorkerModule import org.oppia.android.domain.platformparameter.PlatformParameterModule import org.oppia.android.domain.platformparameter.PlatformParameterSingletonModule import org.oppia.android.domain.question.QuestionModule @@ -1140,7 +1141,7 @@ class PinPasswordActivityTest { AccessibilityTestModule::class, LogStorageModule::class, CachingTestModule::class, PrimeTopicAssetsControllerModule::class, ExpirationMetaDataRetrieverModule::class, ViewBindingShimModule::class, RatioInputModule::class, WorkManagerConfigurationModule::class, - ApplicationStartupListenerModule::class, LogUploadWorkerModule::class, + ApplicationStartupListenerModule::class, LogReportWorkerModule::class, HintsAndSolutionConfigModule::class, HintsAndSolutionProdModule::class, FirebaseLogUploaderModule::class, FakeOppiaClockModule::class, PracticeTabModule::class, DeveloperOptionsStarterModule::class, DeveloperOptionsModule::class, @@ -1151,7 +1152,7 @@ class PinPasswordActivityTest { NumericExpressionInputModule::class, AlgebraicExpressionInputModule::class, MathEquationInputModule::class, SplitScreenInteractionModule::class, LoggingIdentifierModule::class, ApplicationLifecycleModule::class, - SyncStatusModule::class + SyncStatusModule::class, MetricLogSchedulerModule::class ] ) interface TestApplicationComponent : ApplicationComponent { diff --git a/app/src/sharedTest/java/org/oppia/android/app/profile/ProfileChooserFragmentTest.kt b/app/src/sharedTest/java/org/oppia/android/app/profile/ProfileChooserFragmentTest.kt index d90eee72e20..cdcee36d429 100644 --- a/app/src/sharedTest/java/org/oppia/android/app/profile/ProfileChooserFragmentTest.kt +++ b/app/src/sharedTest/java/org/oppia/android/app/profile/ProfileChooserFragmentTest.kt @@ -72,7 +72,8 @@ import org.oppia.android.domain.onboarding.ExpirationMetaDataRetrieverModule import org.oppia.android.domain.oppialogger.LogStorageModule import org.oppia.android.domain.oppialogger.LoggingIdentifierModule import org.oppia.android.domain.oppialogger.analytics.ApplicationLifecycleModule -import org.oppia.android.domain.oppialogger.loguploader.LogUploadWorkerModule +import org.oppia.android.domain.oppialogger.logscheduler.MetricLogSchedulerModule +import org.oppia.android.domain.oppialogger.loguploader.LogReportWorkerModule import org.oppia.android.domain.platformparameter.PlatformParameterModule import org.oppia.android.domain.platformparameter.PlatformParameterSingletonModule import org.oppia.android.domain.profile.ProfileManagementController @@ -518,7 +519,7 @@ class ProfileChooserFragmentTest { AccessibilityTestModule::class, LogStorageModule::class, CachingTestModule::class, PrimeTopicAssetsControllerModule::class, ExpirationMetaDataRetrieverModule::class, ViewBindingShimModule::class, RatioInputModule::class, WorkManagerConfigurationModule::class, - ApplicationStartupListenerModule::class, LogUploadWorkerModule::class, + ApplicationStartupListenerModule::class, LogReportWorkerModule::class, HintsAndSolutionConfigModule::class, HintsAndSolutionProdModule::class, FirebaseLogUploaderModule::class, FakeOppiaClockModule::class, PracticeTabModule::class, DeveloperOptionsStarterModule::class, DeveloperOptionsModule::class, @@ -528,7 +529,7 @@ class ProfileChooserFragmentTest { NumericExpressionInputModule::class, AlgebraicExpressionInputModule::class, MathEquationInputModule::class, SplitScreenInteractionModule::class, LoggingIdentifierModule::class, ApplicationLifecycleModule::class, - SyncStatusModule::class + SyncStatusModule::class, MetricLogSchedulerModule::class ] ) interface TestApplicationComponent : ApplicationComponent { diff --git a/app/src/sharedTest/java/org/oppia/android/app/profileprogress/ProfilePictureActivityTest.kt b/app/src/sharedTest/java/org/oppia/android/app/profileprogress/ProfilePictureActivityTest.kt index f0c957a2ea4..f1e9541bb3c 100644 --- a/app/src/sharedTest/java/org/oppia/android/app/profileprogress/ProfilePictureActivityTest.kt +++ b/app/src/sharedTest/java/org/oppia/android/app/profileprogress/ProfilePictureActivityTest.kt @@ -58,7 +58,8 @@ import org.oppia.android.domain.onboarding.ExpirationMetaDataRetrieverModule import org.oppia.android.domain.oppialogger.LogStorageModule import org.oppia.android.domain.oppialogger.LoggingIdentifierModule import org.oppia.android.domain.oppialogger.analytics.ApplicationLifecycleModule -import org.oppia.android.domain.oppialogger.loguploader.LogUploadWorkerModule +import org.oppia.android.domain.oppialogger.logscheduler.MetricLogSchedulerModule +import org.oppia.android.domain.oppialogger.loguploader.LogReportWorkerModule import org.oppia.android.domain.platformparameter.PlatformParameterModule import org.oppia.android.domain.platformparameter.PlatformParameterSingletonModule import org.oppia.android.domain.question.QuestionModule @@ -193,7 +194,7 @@ class ProfilePictureActivityTest { AccessibilityTestModule::class, LogStorageModule::class, CachingTestModule::class, PrimeTopicAssetsControllerModule::class, ExpirationMetaDataRetrieverModule::class, ViewBindingShimModule::class, RatioInputModule::class, WorkManagerConfigurationModule::class, - ApplicationStartupListenerModule::class, LogUploadWorkerModule::class, + ApplicationStartupListenerModule::class, LogReportWorkerModule::class, HintsAndSolutionConfigModule::class, HintsAndSolutionProdModule::class, FirebaseLogUploaderModule::class, FakeOppiaClockModule::class, PracticeTabModule::class, DeveloperOptionsStarterModule::class, DeveloperOptionsModule::class, @@ -203,7 +204,7 @@ class ProfilePictureActivityTest { NumericExpressionInputModule::class, AlgebraicExpressionInputModule::class, MathEquationInputModule::class, SplitScreenInteractionModule::class, LoggingIdentifierModule::class, ApplicationLifecycleModule::class, - SyncStatusModule::class + SyncStatusModule::class, MetricLogSchedulerModule::class ] ) interface TestApplicationComponent : ApplicationComponent { diff --git a/app/src/sharedTest/java/org/oppia/android/app/profileprogress/ProfileProgressActivityTest.kt b/app/src/sharedTest/java/org/oppia/android/app/profileprogress/ProfileProgressActivityTest.kt index 6b05ea0bf15..4716612c00e 100644 --- a/app/src/sharedTest/java/org/oppia/android/app/profileprogress/ProfileProgressActivityTest.kt +++ b/app/src/sharedTest/java/org/oppia/android/app/profileprogress/ProfileProgressActivityTest.kt @@ -50,7 +50,8 @@ import org.oppia.android.domain.onboarding.ExpirationMetaDataRetrieverModule import org.oppia.android.domain.oppialogger.LogStorageModule import org.oppia.android.domain.oppialogger.LoggingIdentifierModule import org.oppia.android.domain.oppialogger.analytics.ApplicationLifecycleModule -import org.oppia.android.domain.oppialogger.loguploader.LogUploadWorkerModule +import org.oppia.android.domain.oppialogger.logscheduler.MetricLogSchedulerModule +import org.oppia.android.domain.oppialogger.loguploader.LogReportWorkerModule import org.oppia.android.domain.platformparameter.PlatformParameterModule import org.oppia.android.domain.platformparameter.PlatformParameterSingletonModule import org.oppia.android.domain.question.QuestionModule @@ -144,7 +145,7 @@ class ProfileProgressActivityTest { AccessibilityTestModule::class, LogStorageModule::class, CachingTestModule::class, PrimeTopicAssetsControllerModule::class, ExpirationMetaDataRetrieverModule::class, ViewBindingShimModule::class, RatioInputModule::class, WorkManagerConfigurationModule::class, - ApplicationStartupListenerModule::class, LogUploadWorkerModule::class, + ApplicationStartupListenerModule::class, LogReportWorkerModule::class, HintsAndSolutionConfigModule::class, HintsAndSolutionProdModule::class, FirebaseLogUploaderModule::class, FakeOppiaClockModule::class, PracticeTabModule::class, DeveloperOptionsStarterModule::class, DeveloperOptionsModule::class, @@ -154,7 +155,7 @@ class ProfileProgressActivityTest { NumericExpressionInputModule::class, AlgebraicExpressionInputModule::class, MathEquationInputModule::class, SplitScreenInteractionModule::class, LoggingIdentifierModule::class, ApplicationLifecycleModule::class, - SyncStatusModule::class + SyncStatusModule::class, MetricLogSchedulerModule::class ] ) interface TestApplicationComponent : ApplicationComponent { diff --git a/app/src/sharedTest/java/org/oppia/android/app/profileprogress/ProfileProgressFragmentTest.kt b/app/src/sharedTest/java/org/oppia/android/app/profileprogress/ProfileProgressFragmentTest.kt index b2955dcb059..3593c3a83b7 100644 --- a/app/src/sharedTest/java/org/oppia/android/app/profileprogress/ProfileProgressFragmentTest.kt +++ b/app/src/sharedTest/java/org/oppia/android/app/profileprogress/ProfileProgressFragmentTest.kt @@ -90,7 +90,8 @@ import org.oppia.android.domain.onboarding.ExpirationMetaDataRetrieverModule import org.oppia.android.domain.oppialogger.LogStorageModule import org.oppia.android.domain.oppialogger.LoggingIdentifierModule import org.oppia.android.domain.oppialogger.analytics.ApplicationLifecycleModule -import org.oppia.android.domain.oppialogger.loguploader.LogUploadWorkerModule +import org.oppia.android.domain.oppialogger.logscheduler.MetricLogSchedulerModule +import org.oppia.android.domain.oppialogger.loguploader.LogReportWorkerModule import org.oppia.android.domain.platformparameter.PlatformParameterModule import org.oppia.android.domain.platformparameter.PlatformParameterSingletonModule import org.oppia.android.domain.question.QuestionModule @@ -845,7 +846,7 @@ class ProfileProgressFragmentTest { LogStorageModule::class, CachingTestModule::class, PrimeTopicAssetsControllerModule::class, ExpirationMetaDataRetrieverModule::class, ViewBindingShimModule::class, RatioInputModule::class, ApplicationStartupListenerModule::class, - LogUploadWorkerModule::class, WorkManagerConfigurationModule::class, + LogReportWorkerModule::class, WorkManagerConfigurationModule::class, HintsAndSolutionConfigModule::class, HintsAndSolutionProdModule::class, FirebaseLogUploaderModule::class, FakeOppiaClockModule::class, PracticeTabModule::class, DeveloperOptionsStarterModule::class, DeveloperOptionsModule::class, @@ -855,7 +856,7 @@ class ProfileProgressFragmentTest { NumericExpressionInputModule::class, AlgebraicExpressionInputModule::class, MathEquationInputModule::class, SplitScreenInteractionModule::class, LoggingIdentifierModule::class, ApplicationLifecycleModule::class, - SyncStatusModule::class + SyncStatusModule::class, MetricLogSchedulerModule::class ] ) interface TestApplicationComponent : ApplicationComponent { diff --git a/app/src/sharedTest/java/org/oppia/android/app/recyclerview/BindableAdapterTest.kt b/app/src/sharedTest/java/org/oppia/android/app/recyclerview/BindableAdapterTest.kt index a0b1d3577a3..e8a168ee1af 100644 --- a/app/src/sharedTest/java/org/oppia/android/app/recyclerview/BindableAdapterTest.kt +++ b/app/src/sharedTest/java/org/oppia/android/app/recyclerview/BindableAdapterTest.kt @@ -88,7 +88,8 @@ import org.oppia.android.domain.onboarding.ExpirationMetaDataRetrieverModule import org.oppia.android.domain.oppialogger.LogStorageModule import org.oppia.android.domain.oppialogger.LoggingIdentifierModule import org.oppia.android.domain.oppialogger.analytics.ApplicationLifecycleModule -import org.oppia.android.domain.oppialogger.loguploader.LogUploadWorkerModule +import org.oppia.android.domain.oppialogger.logscheduler.MetricLogSchedulerModule +import org.oppia.android.domain.oppialogger.loguploader.LogReportWorkerModule import org.oppia.android.domain.platformparameter.PlatformParameterModule import org.oppia.android.domain.platformparameter.PlatformParameterSingletonModule import org.oppia.android.domain.question.QuestionModule @@ -755,7 +756,7 @@ class BindableAdapterTest { AccessibilityTestModule::class, LogStorageModule::class, CachingTestModule::class, PrimeTopicAssetsControllerModule::class, ExpirationMetaDataRetrieverModule::class, ViewBindingShimModule::class, RatioInputModule::class, WorkManagerConfigurationModule::class, - ApplicationStartupListenerModule::class, LogUploadWorkerModule::class, + ApplicationStartupListenerModule::class, LogReportWorkerModule::class, HintsAndSolutionConfigModule::class, HintsAndSolutionProdModule::class, FirebaseLogUploaderModule::class, FakeOppiaClockModule::class, PracticeTabModule::class, DeveloperOptionsStarterModule::class, DeveloperOptionsModule::class, @@ -766,7 +767,7 @@ class BindableAdapterTest { NumericExpressionInputModule::class, AlgebraicExpressionInputModule::class, MathEquationInputModule::class, SplitScreenInteractionModule::class, LoggingIdentifierModule::class, ApplicationLifecycleModule::class, - SyncStatusModule::class + SyncStatusModule::class, MetricLogSchedulerModule::class ] ) interface TestApplicationComponent : ApplicationComponent { diff --git a/app/src/sharedTest/java/org/oppia/android/app/resumelesson/ResumeLessonActivityTest.kt b/app/src/sharedTest/java/org/oppia/android/app/resumelesson/ResumeLessonActivityTest.kt index 636fe149c84..e76a4ac0ab6 100644 --- a/app/src/sharedTest/java/org/oppia/android/app/resumelesson/ResumeLessonActivityTest.kt +++ b/app/src/sharedTest/java/org/oppia/android/app/resumelesson/ResumeLessonActivityTest.kt @@ -65,7 +65,8 @@ import org.oppia.android.domain.onboarding.ExpirationMetaDataRetrieverModule import org.oppia.android.domain.oppialogger.LogStorageModule import org.oppia.android.domain.oppialogger.LoggingIdentifierModule import org.oppia.android.domain.oppialogger.analytics.ApplicationLifecycleModule -import org.oppia.android.domain.oppialogger.loguploader.LogUploadWorkerModule +import org.oppia.android.domain.oppialogger.logscheduler.MetricLogSchedulerModule +import org.oppia.android.domain.oppialogger.loguploader.LogReportWorkerModule import org.oppia.android.domain.platformparameter.PlatformParameterModule import org.oppia.android.domain.platformparameter.PlatformParameterSingletonModule import org.oppia.android.domain.question.QuestionModule @@ -214,7 +215,7 @@ class ResumeLessonActivityTest { AccessibilityTestModule::class, LogStorageModule::class, CachingTestModule::class, PrimeTopicAssetsControllerModule::class, ExpirationMetaDataRetrieverModule::class, ViewBindingShimModule::class, RatioInputModule::class, WorkManagerConfigurationModule::class, - ApplicationStartupListenerModule::class, LogUploadWorkerModule::class, + ApplicationStartupListenerModule::class, LogReportWorkerModule::class, HintsAndSolutionConfigModule::class, HintsAndSolutionProdModule::class, FirebaseLogUploaderModule::class, FakeOppiaClockModule::class, PracticeTabModule::class, DeveloperOptionsStarterModule::class, DeveloperOptionsModule::class, @@ -224,7 +225,7 @@ class ResumeLessonActivityTest { NumericExpressionInputModule::class, AlgebraicExpressionInputModule::class, MathEquationInputModule::class, SplitScreenInteractionModule::class, LoggingIdentifierModule::class, ApplicationLifecycleModule::class, - SyncStatusModule::class + SyncStatusModule::class, MetricLogSchedulerModule::class ] ) interface TestApplicationComponent : ApplicationComponent { diff --git a/app/src/sharedTest/java/org/oppia/android/app/resumelesson/ResumeLessonFragmentTest.kt b/app/src/sharedTest/java/org/oppia/android/app/resumelesson/ResumeLessonFragmentTest.kt index bb5a9228d51..1bf70dde862 100644 --- a/app/src/sharedTest/java/org/oppia/android/app/resumelesson/ResumeLessonFragmentTest.kt +++ b/app/src/sharedTest/java/org/oppia/android/app/resumelesson/ResumeLessonFragmentTest.kt @@ -65,7 +65,8 @@ import org.oppia.android.domain.onboarding.ExpirationMetaDataRetrieverModule import org.oppia.android.domain.oppialogger.LogStorageModule import org.oppia.android.domain.oppialogger.LoggingIdentifierModule import org.oppia.android.domain.oppialogger.analytics.ApplicationLifecycleModule -import org.oppia.android.domain.oppialogger.loguploader.LogUploadWorkerModule +import org.oppia.android.domain.oppialogger.logscheduler.MetricLogSchedulerModule +import org.oppia.android.domain.oppialogger.loguploader.LogReportWorkerModule import org.oppia.android.domain.platformparameter.PlatformParameterModule import org.oppia.android.domain.platformparameter.PlatformParameterSingletonModule import org.oppia.android.domain.question.QuestionModule @@ -303,7 +304,7 @@ class ResumeLessonFragmentTest { AccessibilityTestModule::class, LogStorageModule::class, CachingTestModule::class, PrimeTopicAssetsControllerModule::class, ExpirationMetaDataRetrieverModule::class, ViewBindingShimModule::class, RatioInputModule::class, WorkManagerConfigurationModule::class, - ApplicationStartupListenerModule::class, LogUploadWorkerModule::class, + ApplicationStartupListenerModule::class, LogReportWorkerModule::class, HintsAndSolutionConfigModule::class, HintsAndSolutionProdModule::class, FirebaseLogUploaderModule::class, FakeOppiaClockModule::class, PracticeTabModule::class, DeveloperOptionsStarterModule::class, DeveloperOptionsModule::class, @@ -313,7 +314,7 @@ class ResumeLessonFragmentTest { NumericExpressionInputModule::class, AlgebraicExpressionInputModule::class, MathEquationInputModule::class, SplitScreenInteractionModule::class, LoggingIdentifierModule::class, ApplicationLifecycleModule::class, - SyncStatusModule::class + SyncStatusModule::class, MetricLogSchedulerModule::class ] ) interface TestApplicationComponent : ApplicationComponent { diff --git a/app/src/sharedTest/java/org/oppia/android/app/settings/profile/ProfileEditActivityTest.kt b/app/src/sharedTest/java/org/oppia/android/app/settings/profile/ProfileEditActivityTest.kt index efdbb35eeff..f950c6f152c 100644 --- a/app/src/sharedTest/java/org/oppia/android/app/settings/profile/ProfileEditActivityTest.kt +++ b/app/src/sharedTest/java/org/oppia/android/app/settings/profile/ProfileEditActivityTest.kt @@ -66,7 +66,8 @@ import org.oppia.android.domain.onboarding.ExpirationMetaDataRetrieverModule import org.oppia.android.domain.oppialogger.LogStorageModule import org.oppia.android.domain.oppialogger.LoggingIdentifierModule import org.oppia.android.domain.oppialogger.analytics.ApplicationLifecycleModule -import org.oppia.android.domain.oppialogger.loguploader.LogUploadWorkerModule +import org.oppia.android.domain.oppialogger.logscheduler.MetricLogSchedulerModule +import org.oppia.android.domain.oppialogger.loguploader.LogReportWorkerModule import org.oppia.android.domain.platformparameter.PlatformParameterModule import org.oppia.android.domain.platformparameter.PlatformParameterSingletonModule import org.oppia.android.domain.profile.ProfileManagementController @@ -367,7 +368,7 @@ class ProfileEditActivityTest { AccessibilityTestModule::class, LogStorageModule::class, CachingTestModule::class, PrimeTopicAssetsControllerModule::class, ExpirationMetaDataRetrieverModule::class, ViewBindingShimModule::class, RatioInputModule::class, WorkManagerConfigurationModule::class, - ApplicationStartupListenerModule::class, LogUploadWorkerModule::class, + ApplicationStartupListenerModule::class, LogReportWorkerModule::class, HintsAndSolutionConfigModule::class, HintsAndSolutionProdModule::class, FirebaseLogUploaderModule::class, FakeOppiaClockModule::class, PracticeTabModule::class, DeveloperOptionsStarterModule::class, DeveloperOptionsModule::class, @@ -377,7 +378,7 @@ class ProfileEditActivityTest { NumericExpressionInputModule::class, AlgebraicExpressionInputModule::class, MathEquationInputModule::class, SplitScreenInteractionModule::class, LoggingIdentifierModule::class, ApplicationLifecycleModule::class, - SyncStatusModule::class + SyncStatusModule::class, MetricLogSchedulerModule::class ] ) interface TestApplicationComponent : ApplicationComponent { diff --git a/app/src/sharedTest/java/org/oppia/android/app/settings/profile/ProfileEditFragmentTest.kt b/app/src/sharedTest/java/org/oppia/android/app/settings/profile/ProfileEditFragmentTest.kt index ddcda48de71..84d523c5200 100644 --- a/app/src/sharedTest/java/org/oppia/android/app/settings/profile/ProfileEditFragmentTest.kt +++ b/app/src/sharedTest/java/org/oppia/android/app/settings/profile/ProfileEditFragmentTest.kt @@ -66,7 +66,8 @@ import org.oppia.android.domain.onboarding.ExpirationMetaDataRetrieverModule import org.oppia.android.domain.oppialogger.LogStorageModule import org.oppia.android.domain.oppialogger.LoggingIdentifierModule import org.oppia.android.domain.oppialogger.analytics.ApplicationLifecycleModule -import org.oppia.android.domain.oppialogger.loguploader.LogUploadWorkerModule +import org.oppia.android.domain.oppialogger.logscheduler.MetricLogSchedulerModule +import org.oppia.android.domain.oppialogger.loguploader.LogReportWorkerModule import org.oppia.android.domain.platformparameter.PlatformParameterModule import org.oppia.android.domain.platformparameter.PlatformParameterSingletonModule import org.oppia.android.domain.profile.ProfileManagementController @@ -344,7 +345,7 @@ class ProfileEditFragmentTest { AccessibilityTestModule::class, LogStorageModule::class, CachingTestModule::class, PrimeTopicAssetsControllerModule::class, ExpirationMetaDataRetrieverModule::class, ViewBindingShimModule::class, RatioInputModule::class, WorkManagerConfigurationModule::class, - ApplicationStartupListenerModule::class, LogUploadWorkerModule::class, + ApplicationStartupListenerModule::class, LogReportWorkerModule::class, HintsAndSolutionConfigModule::class, HintsAndSolutionProdModule::class, FirebaseLogUploaderModule::class, FakeOppiaClockModule::class, PracticeTabModule::class, DeveloperOptionsStarterModule::class, DeveloperOptionsModule::class, @@ -354,7 +355,7 @@ class ProfileEditFragmentTest { NumericExpressionInputModule::class, AlgebraicExpressionInputModule::class, MathEquationInputModule::class, SplitScreenInteractionModule::class, LoggingIdentifierModule::class, ApplicationLifecycleModule::class, - SyncStatusModule::class + SyncStatusModule::class, MetricLogSchedulerModule::class ] ) diff --git a/app/src/sharedTest/java/org/oppia/android/app/settings/profile/ProfileListActivityTest.kt b/app/src/sharedTest/java/org/oppia/android/app/settings/profile/ProfileListActivityTest.kt index 4bf44638958..ea0e29aaac2 100644 --- a/app/src/sharedTest/java/org/oppia/android/app/settings/profile/ProfileListActivityTest.kt +++ b/app/src/sharedTest/java/org/oppia/android/app/settings/profile/ProfileListActivityTest.kt @@ -50,7 +50,8 @@ import org.oppia.android.domain.onboarding.ExpirationMetaDataRetrieverModule import org.oppia.android.domain.oppialogger.LogStorageModule import org.oppia.android.domain.oppialogger.LoggingIdentifierModule import org.oppia.android.domain.oppialogger.analytics.ApplicationLifecycleModule -import org.oppia.android.domain.oppialogger.loguploader.LogUploadWorkerModule +import org.oppia.android.domain.oppialogger.logscheduler.MetricLogSchedulerModule +import org.oppia.android.domain.oppialogger.loguploader.LogReportWorkerModule import org.oppia.android.domain.platformparameter.PlatformParameterModule import org.oppia.android.domain.platformparameter.PlatformParameterSingletonModule import org.oppia.android.domain.question.QuestionModule @@ -140,7 +141,7 @@ class ProfileListActivityTest { AccessibilityTestModule::class, LogStorageModule::class, CachingTestModule::class, PrimeTopicAssetsControllerModule::class, ExpirationMetaDataRetrieverModule::class, ViewBindingShimModule::class, RatioInputModule::class, WorkManagerConfigurationModule::class, - ApplicationStartupListenerModule::class, LogUploadWorkerModule::class, + ApplicationStartupListenerModule::class, LogReportWorkerModule::class, HintsAndSolutionConfigModule::class, HintsAndSolutionProdModule::class, FirebaseLogUploaderModule::class, FakeOppiaClockModule::class, PracticeTabModule::class, DeveloperOptionsStarterModule::class, DeveloperOptionsModule::class, @@ -150,7 +151,7 @@ class ProfileListActivityTest { NumericExpressionInputModule::class, AlgebraicExpressionInputModule::class, MathEquationInputModule::class, SplitScreenInteractionModule::class, LoggingIdentifierModule::class, ApplicationLifecycleModule::class, - SyncStatusModule::class + SyncStatusModule::class, MetricLogSchedulerModule::class ] ) interface TestApplicationComponent : ApplicationComponent { diff --git a/app/src/sharedTest/java/org/oppia/android/app/settings/profile/ProfileListFragmentTest.kt b/app/src/sharedTest/java/org/oppia/android/app/settings/profile/ProfileListFragmentTest.kt index bbf88cff9dc..6e8ac36d94f 100644 --- a/app/src/sharedTest/java/org/oppia/android/app/settings/profile/ProfileListFragmentTest.kt +++ b/app/src/sharedTest/java/org/oppia/android/app/settings/profile/ProfileListFragmentTest.kt @@ -65,7 +65,8 @@ import org.oppia.android.domain.onboarding.ExpirationMetaDataRetrieverModule import org.oppia.android.domain.oppialogger.LogStorageModule import org.oppia.android.domain.oppialogger.LoggingIdentifierModule import org.oppia.android.domain.oppialogger.analytics.ApplicationLifecycleModule -import org.oppia.android.domain.oppialogger.loguploader.LogUploadWorkerModule +import org.oppia.android.domain.oppialogger.logscheduler.MetricLogSchedulerModule +import org.oppia.android.domain.oppialogger.loguploader.LogReportWorkerModule import org.oppia.android.domain.platformparameter.PlatformParameterModule import org.oppia.android.domain.platformparameter.PlatformParameterSingletonModule import org.oppia.android.domain.question.QuestionModule @@ -378,7 +379,7 @@ class ProfileListFragmentTest { AccessibilityTestModule::class, LogStorageModule::class, CachingTestModule::class, PrimeTopicAssetsControllerModule::class, ExpirationMetaDataRetrieverModule::class, ViewBindingShimModule::class, RatioInputModule::class, WorkManagerConfigurationModule::class, - ApplicationStartupListenerModule::class, LogUploadWorkerModule::class, + ApplicationStartupListenerModule::class, LogReportWorkerModule::class, HintsAndSolutionConfigModule::class, HintsAndSolutionProdModule::class, FirebaseLogUploaderModule::class, FakeOppiaClockModule::class, PracticeTabModule::class, DeveloperOptionsStarterModule::class, DeveloperOptionsModule::class, @@ -388,7 +389,7 @@ class ProfileListFragmentTest { NumericExpressionInputModule::class, AlgebraicExpressionInputModule::class, MathEquationInputModule::class, SplitScreenInteractionModule::class, LoggingIdentifierModule::class, ApplicationLifecycleModule::class, - SyncStatusModule::class + SyncStatusModule::class, MetricLogSchedulerModule::class ] ) interface TestApplicationComponent : ApplicationComponent { diff --git a/app/src/sharedTest/java/org/oppia/android/app/settings/profile/ProfileRenameActivityTest.kt b/app/src/sharedTest/java/org/oppia/android/app/settings/profile/ProfileRenameActivityTest.kt index a6a0d30c004..55d6e85a511 100644 --- a/app/src/sharedTest/java/org/oppia/android/app/settings/profile/ProfileRenameActivityTest.kt +++ b/app/src/sharedTest/java/org/oppia/android/app/settings/profile/ProfileRenameActivityTest.kt @@ -51,7 +51,8 @@ import org.oppia.android.domain.onboarding.ExpirationMetaDataRetrieverModule import org.oppia.android.domain.oppialogger.LogStorageModule import org.oppia.android.domain.oppialogger.LoggingIdentifierModule import org.oppia.android.domain.oppialogger.analytics.ApplicationLifecycleModule -import org.oppia.android.domain.oppialogger.loguploader.LogUploadWorkerModule +import org.oppia.android.domain.oppialogger.logscheduler.MetricLogSchedulerModule +import org.oppia.android.domain.oppialogger.loguploader.LogReportWorkerModule import org.oppia.android.domain.platformparameter.PlatformParameterModule import org.oppia.android.domain.platformparameter.PlatformParameterSingletonModule import org.oppia.android.domain.question.QuestionModule @@ -162,7 +163,7 @@ class ProfileRenameActivityTest { AccessibilityTestModule::class, LogStorageModule::class, CachingTestModule::class, PrimeTopicAssetsControllerModule::class, ExpirationMetaDataRetrieverModule::class, ViewBindingShimModule::class, RatioInputModule::class, WorkManagerConfigurationModule::class, - ApplicationStartupListenerModule::class, LogUploadWorkerModule::class, + ApplicationStartupListenerModule::class, LogReportWorkerModule::class, HintsAndSolutionConfigModule::class, HintsAndSolutionProdModule::class, FirebaseLogUploaderModule::class, FakeOppiaClockModule::class, PracticeTabModule::class, DeveloperOptionsStarterModule::class, DeveloperOptionsModule::class, @@ -173,7 +174,7 @@ class ProfileRenameActivityTest { NumericExpressionInputModule::class, AlgebraicExpressionInputModule::class, MathEquationInputModule::class, SplitScreenInteractionModule::class, LoggingIdentifierModule::class, ApplicationLifecycleModule::class, - SyncStatusModule::class + SyncStatusModule::class, MetricLogSchedulerModule::class ] ) interface TestApplicationComponent : ApplicationComponent { diff --git a/app/src/sharedTest/java/org/oppia/android/app/settings/profile/ProfileRenameFragmentTest.kt b/app/src/sharedTest/java/org/oppia/android/app/settings/profile/ProfileRenameFragmentTest.kt index f88763417df..9744a3daead 100644 --- a/app/src/sharedTest/java/org/oppia/android/app/settings/profile/ProfileRenameFragmentTest.kt +++ b/app/src/sharedTest/java/org/oppia/android/app/settings/profile/ProfileRenameFragmentTest.kt @@ -67,7 +67,8 @@ import org.oppia.android.domain.onboarding.ExpirationMetaDataRetrieverModule import org.oppia.android.domain.oppialogger.LogStorageModule import org.oppia.android.domain.oppialogger.LoggingIdentifierModule import org.oppia.android.domain.oppialogger.analytics.ApplicationLifecycleModule -import org.oppia.android.domain.oppialogger.loguploader.LogUploadWorkerModule +import org.oppia.android.domain.oppialogger.logscheduler.MetricLogSchedulerModule +import org.oppia.android.domain.oppialogger.loguploader.LogReportWorkerModule import org.oppia.android.domain.platformparameter.PlatformParameterModule import org.oppia.android.domain.platformparameter.PlatformParameterSingletonModule import org.oppia.android.domain.question.QuestionModule @@ -452,7 +453,7 @@ class ProfileRenameFragmentTest { AccessibilityTestModule::class, LogStorageModule::class, CachingTestModule::class, PrimeTopicAssetsControllerModule::class, ExpirationMetaDataRetrieverModule::class, ViewBindingShimModule::class, RatioInputModule::class, WorkManagerConfigurationModule::class, - ApplicationStartupListenerModule::class, LogUploadWorkerModule::class, + ApplicationStartupListenerModule::class, LogReportWorkerModule::class, HintsAndSolutionConfigModule::class, HintsAndSolutionProdModule::class, FirebaseLogUploaderModule::class, FakeOppiaClockModule::class, PracticeTabModule::class, DeveloperOptionsStarterModule::class, DeveloperOptionsModule::class, @@ -462,7 +463,7 @@ class ProfileRenameFragmentTest { NumericExpressionInputModule::class, AlgebraicExpressionInputModule::class, MathEquationInputModule::class, SplitScreenInteractionModule::class, LoggingIdentifierModule::class, ApplicationLifecycleModule::class, - SyncStatusModule::class + SyncStatusModule::class, MetricLogSchedulerModule::class ] ) interface TestApplicationComponent : ApplicationComponent { diff --git a/app/src/sharedTest/java/org/oppia/android/app/settings/profile/ProfileResetPinActivityTest.kt b/app/src/sharedTest/java/org/oppia/android/app/settings/profile/ProfileResetPinActivityTest.kt index 67a3fd83b5d..38c6df5615d 100644 --- a/app/src/sharedTest/java/org/oppia/android/app/settings/profile/ProfileResetPinActivityTest.kt +++ b/app/src/sharedTest/java/org/oppia/android/app/settings/profile/ProfileResetPinActivityTest.kt @@ -52,7 +52,8 @@ import org.oppia.android.domain.onboarding.ExpirationMetaDataRetrieverModule import org.oppia.android.domain.oppialogger.LogStorageModule import org.oppia.android.domain.oppialogger.LoggingIdentifierModule import org.oppia.android.domain.oppialogger.analytics.ApplicationLifecycleModule -import org.oppia.android.domain.oppialogger.loguploader.LogUploadWorkerModule +import org.oppia.android.domain.oppialogger.logscheduler.MetricLogSchedulerModule +import org.oppia.android.domain.oppialogger.loguploader.LogReportWorkerModule import org.oppia.android.domain.platformparameter.PlatformParameterModule import org.oppia.android.domain.platformparameter.PlatformParameterSingletonModule import org.oppia.android.domain.question.QuestionModule @@ -173,7 +174,7 @@ class ProfileResetPinActivityTest { AccessibilityTestModule::class, LogStorageModule::class, CachingTestModule::class, PrimeTopicAssetsControllerModule::class, ExpirationMetaDataRetrieverModule::class, ViewBindingShimModule::class, RatioInputModule::class, WorkManagerConfigurationModule::class, - ApplicationStartupListenerModule::class, LogUploadWorkerModule::class, + ApplicationStartupListenerModule::class, LogReportWorkerModule::class, HintsAndSolutionConfigModule::class, HintsAndSolutionProdModule::class, FirebaseLogUploaderModule::class, FakeOppiaClockModule::class, PracticeTabModule::class, DeveloperOptionsStarterModule::class, DeveloperOptionsModule::class, @@ -184,7 +185,7 @@ class ProfileResetPinActivityTest { NumericExpressionInputModule::class, AlgebraicExpressionInputModule::class, MathEquationInputModule::class, SplitScreenInteractionModule::class, LoggingIdentifierModule::class, ApplicationLifecycleModule::class, - SyncStatusModule::class + SyncStatusModule::class, MetricLogSchedulerModule::class ] ) interface TestApplicationComponent : ApplicationComponent { diff --git a/app/src/sharedTest/java/org/oppia/android/app/settings/profile/ProfileResetPinFragmentTest.kt b/app/src/sharedTest/java/org/oppia/android/app/settings/profile/ProfileResetPinFragmentTest.kt index 4a137a97356..dc210acaa36 100644 --- a/app/src/sharedTest/java/org/oppia/android/app/settings/profile/ProfileResetPinFragmentTest.kt +++ b/app/src/sharedTest/java/org/oppia/android/app/settings/profile/ProfileResetPinFragmentTest.kt @@ -68,7 +68,8 @@ import org.oppia.android.domain.onboarding.ExpirationMetaDataRetrieverModule import org.oppia.android.domain.oppialogger.LogStorageModule import org.oppia.android.domain.oppialogger.LoggingIdentifierModule import org.oppia.android.domain.oppialogger.analytics.ApplicationLifecycleModule -import org.oppia.android.domain.oppialogger.loguploader.LogUploadWorkerModule +import org.oppia.android.domain.oppialogger.logscheduler.MetricLogSchedulerModule +import org.oppia.android.domain.oppialogger.loguploader.LogReportWorkerModule import org.oppia.android.domain.platformparameter.PlatformParameterModule import org.oppia.android.domain.platformparameter.PlatformParameterSingletonModule import org.oppia.android.domain.question.QuestionModule @@ -1015,7 +1016,7 @@ class ProfileResetPinFragmentTest { AccessibilityTestModule::class, LogStorageModule::class, CachingTestModule::class, PrimeTopicAssetsControllerModule::class, ExpirationMetaDataRetrieverModule::class, ViewBindingShimModule::class, RatioInputModule::class, WorkManagerConfigurationModule::class, - ApplicationStartupListenerModule::class, LogUploadWorkerModule::class, + ApplicationStartupListenerModule::class, LogReportWorkerModule::class, HintsAndSolutionConfigModule::class, HintsAndSolutionProdModule::class, FirebaseLogUploaderModule::class, FakeOppiaClockModule::class, PracticeTabModule::class, DeveloperOptionsStarterModule::class, DeveloperOptionsModule::class, @@ -1026,7 +1027,7 @@ class ProfileResetPinFragmentTest { AlgebraicExpressionInputModule::class, MathEquationInputModule::class, SplitScreenInteractionModule::class, LoggingIdentifierModule::class, ApplicationLifecycleModule::class, - SyncStatusModule::class + SyncStatusModule::class, MetricLogSchedulerModule::class ] ) interface TestApplicationComponent : ApplicationComponent { diff --git a/app/src/sharedTest/java/org/oppia/android/app/splash/SplashActivityTest.kt b/app/src/sharedTest/java/org/oppia/android/app/splash/SplashActivityTest.kt index 3fe1604bb31..e554c9df2e1 100644 --- a/app/src/sharedTest/java/org/oppia/android/app/splash/SplashActivityTest.kt +++ b/app/src/sharedTest/java/org/oppia/android/app/splash/SplashActivityTest.kt @@ -73,7 +73,8 @@ import org.oppia.android.domain.onboarding.testing.FakeExpirationMetaDataRetriev import org.oppia.android.domain.oppialogger.LogStorageModule import org.oppia.android.domain.oppialogger.LoggingIdentifierModule import org.oppia.android.domain.oppialogger.analytics.ApplicationLifecycleModule -import org.oppia.android.domain.oppialogger.loguploader.LogUploadWorkerModule +import org.oppia.android.domain.oppialogger.logscheduler.MetricLogSchedulerModule +import org.oppia.android.domain.oppialogger.loguploader.LogReportWorkerModule import org.oppia.android.domain.platformparameter.PlatformParameterModule import org.oppia.android.domain.platformparameter.PlatformParameterSingletonModule import org.oppia.android.domain.question.QuestionModule @@ -478,7 +479,7 @@ class SplashActivityTest { PrimeTopicAssetsControllerModule::class, ExpirationMetaDataRetrieverTestModule::class, ViewBindingShimModule::class, RatioInputModule::class, NetworkConfigProdModule::class, ApplicationStartupListenerModule::class, HintsAndSolutionConfigModule::class, - LogUploadWorkerModule::class, WorkManagerConfigurationModule::class, + LogReportWorkerModule::class, WorkManagerConfigurationModule::class, FirebaseLogUploaderModule::class, FakeOppiaClockModule::class, PracticeTabModule::class, DeveloperOptionsStarterModule::class, DeveloperOptionsModule::class, ExplorationStorageModule::class, NetworkModule::class, HintsAndSolutionProdModule::class, @@ -488,7 +489,7 @@ class SplashActivityTest { NumericExpressionInputModule::class, AlgebraicExpressionInputModule::class, MathEquationInputModule::class, SplitScreenInteractionModule::class, LoggingIdentifierModule::class, ApplicationLifecycleModule::class, - SyncStatusModule::class + SyncStatusModule::class, MetricLogSchedulerModule::class ] ) interface TestApplicationComponent : ApplicationComponent { diff --git a/app/src/sharedTest/java/org/oppia/android/app/story/StoryActivityTest.kt b/app/src/sharedTest/java/org/oppia/android/app/story/StoryActivityTest.kt index 9cca4e9781e..54df28345a1 100644 --- a/app/src/sharedTest/java/org/oppia/android/app/story/StoryActivityTest.kt +++ b/app/src/sharedTest/java/org/oppia/android/app/story/StoryActivityTest.kt @@ -64,7 +64,8 @@ import org.oppia.android.domain.onboarding.ExpirationMetaDataRetrieverModule import org.oppia.android.domain.oppialogger.LogStorageModule import org.oppia.android.domain.oppialogger.LoggingIdentifierModule import org.oppia.android.domain.oppialogger.analytics.ApplicationLifecycleModule -import org.oppia.android.domain.oppialogger.loguploader.LogUploadWorkerModule +import org.oppia.android.domain.oppialogger.logscheduler.MetricLogSchedulerModule +import org.oppia.android.domain.oppialogger.loguploader.LogReportWorkerModule import org.oppia.android.domain.platformparameter.PlatformParameterModule import org.oppia.android.domain.platformparameter.PlatformParameterSingletonModule import org.oppia.android.domain.question.QuestionModule @@ -224,7 +225,7 @@ class StoryActivityTest { AccessibilityTestModule::class, LogStorageModule::class, CachingTestModule::class, PrimeTopicAssetsControllerModule::class, ExpirationMetaDataRetrieverModule::class, ViewBindingShimModule::class, RatioInputModule::class, WorkManagerConfigurationModule::class, - ApplicationStartupListenerModule::class, LogUploadWorkerModule::class, + ApplicationStartupListenerModule::class, LogReportWorkerModule::class, HintsAndSolutionConfigModule::class, HintsAndSolutionProdModule::class, FirebaseLogUploaderModule::class, FakeOppiaClockModule::class, PracticeTabModule::class, DeveloperOptionsStarterModule::class, DeveloperOptionsModule::class, @@ -234,7 +235,7 @@ class StoryActivityTest { NumericExpressionInputModule::class, AlgebraicExpressionInputModule::class, MathEquationInputModule::class, SplitScreenInteractionModule::class, LoggingIdentifierModule::class, ApplicationLifecycleModule::class, - SyncStatusModule::class + SyncStatusModule::class, MetricLogSchedulerModule::class ] ) interface TestApplicationComponent : ApplicationComponent { diff --git a/app/src/sharedTest/java/org/oppia/android/app/story/StoryFragmentTest.kt b/app/src/sharedTest/java/org/oppia/android/app/story/StoryFragmentTest.kt index f22f9aeab77..74fae89ca56 100644 --- a/app/src/sharedTest/java/org/oppia/android/app/story/StoryFragmentTest.kt +++ b/app/src/sharedTest/java/org/oppia/android/app/story/StoryFragmentTest.kt @@ -98,7 +98,8 @@ import org.oppia.android.domain.onboarding.ExpirationMetaDataRetrieverModule import org.oppia.android.domain.oppialogger.LogStorageModule import org.oppia.android.domain.oppialogger.LoggingIdentifierModule import org.oppia.android.domain.oppialogger.analytics.ApplicationLifecycleModule -import org.oppia.android.domain.oppialogger.loguploader.LogUploadWorkerModule +import org.oppia.android.domain.oppialogger.logscheduler.MetricLogSchedulerModule +import org.oppia.android.domain.oppialogger.loguploader.LogReportWorkerModule import org.oppia.android.domain.platformparameter.PlatformParameterModule import org.oppia.android.domain.platformparameter.PlatformParameterSingletonModule import org.oppia.android.domain.question.QuestionModule @@ -892,7 +893,7 @@ class StoryFragmentTest { AccessibilityTestModule::class, LogStorageModule::class, CachingTestModule::class, PrimeTopicAssetsControllerModule::class, ExpirationMetaDataRetrieverModule::class, ViewBindingShimModule::class, RatioInputModule::class, WorkManagerConfigurationModule::class, - ApplicationStartupListenerModule::class, LogUploadWorkerModule::class, + ApplicationStartupListenerModule::class, LogReportWorkerModule::class, HintsAndSolutionConfigModule::class, HintsAndSolutionProdModule::class, FirebaseLogUploaderModule::class, FakeOppiaClockModule::class, PracticeTabModule::class, DeveloperOptionsStarterModule::class, DeveloperOptionsModule::class, @@ -902,7 +903,7 @@ class StoryFragmentTest { NumericExpressionInputModule::class, AlgebraicExpressionInputModule::class, MathEquationInputModule::class, SplitScreenInteractionModule::class, LoggingIdentifierModule::class, ApplicationLifecycleModule::class, - SyncStatusModule::class + SyncStatusModule::class, MetricLogSchedulerModule::class ] ) interface TestApplicationComponent : ApplicationComponent { diff --git a/app/src/sharedTest/java/org/oppia/android/app/testing/DragDropTestActivityTest.kt b/app/src/sharedTest/java/org/oppia/android/app/testing/DragDropTestActivityTest.kt index 0d3c55261f1..fc866ddceb1 100644 --- a/app/src/sharedTest/java/org/oppia/android/app/testing/DragDropTestActivityTest.kt +++ b/app/src/sharedTest/java/org/oppia/android/app/testing/DragDropTestActivityTest.kt @@ -61,7 +61,8 @@ import org.oppia.android.domain.onboarding.ExpirationMetaDataRetrieverModule import org.oppia.android.domain.oppialogger.LogStorageModule import org.oppia.android.domain.oppialogger.LoggingIdentifierModule import org.oppia.android.domain.oppialogger.analytics.ApplicationLifecycleModule -import org.oppia.android.domain.oppialogger.loguploader.LogUploadWorkerModule +import org.oppia.android.domain.oppialogger.logscheduler.MetricLogSchedulerModule +import org.oppia.android.domain.oppialogger.loguploader.LogReportWorkerModule import org.oppia.android.domain.platformparameter.PlatformParameterModule import org.oppia.android.domain.platformparameter.PlatformParameterSingletonModule import org.oppia.android.domain.question.QuestionModule @@ -217,7 +218,7 @@ class DragDropTestActivityTest { AccessibilityTestModule::class, LogStorageModule::class, CachingTestModule::class, PrimeTopicAssetsControllerModule::class, ExpirationMetaDataRetrieverModule::class, ViewBindingShimModule::class, RatioInputModule::class, WorkManagerConfigurationModule::class, - ApplicationStartupListenerModule::class, LogUploadWorkerModule::class, + ApplicationStartupListenerModule::class, LogReportWorkerModule::class, HintsAndSolutionConfigModule::class, HintsAndSolutionProdModule::class, FirebaseLogUploaderModule::class, FakeOppiaClockModule::class, PracticeTabModule::class, DeveloperOptionsStarterModule::class, DeveloperOptionsModule::class, @@ -227,7 +228,7 @@ class DragDropTestActivityTest { NumericExpressionInputModule::class, AlgebraicExpressionInputModule::class, MathEquationInputModule::class, SplitScreenInteractionModule::class, LoggingIdentifierModule::class, ApplicationLifecycleModule::class, - SyncStatusModule::class + SyncStatusModule::class, MetricLogSchedulerModule::class ] ) interface TestApplicationComponent : ApplicationComponent { diff --git a/app/src/sharedTest/java/org/oppia/android/app/testing/ImageRegionSelectionInteractionViewTest.kt b/app/src/sharedTest/java/org/oppia/android/app/testing/ImageRegionSelectionInteractionViewTest.kt index 54c5f4d0c73..20d315e0475 100644 --- a/app/src/sharedTest/java/org/oppia/android/app/testing/ImageRegionSelectionInteractionViewTest.kt +++ b/app/src/sharedTest/java/org/oppia/android/app/testing/ImageRegionSelectionInteractionViewTest.kt @@ -72,7 +72,8 @@ import org.oppia.android.domain.onboarding.ExpirationMetaDataRetrieverModule import org.oppia.android.domain.oppialogger.LogStorageModule import org.oppia.android.domain.oppialogger.LoggingIdentifierModule import org.oppia.android.domain.oppialogger.analytics.ApplicationLifecycleModule -import org.oppia.android.domain.oppialogger.loguploader.LogUploadWorkerModule +import org.oppia.android.domain.oppialogger.logscheduler.MetricLogSchedulerModule +import org.oppia.android.domain.oppialogger.loguploader.LogReportWorkerModule import org.oppia.android.domain.platformparameter.PlatformParameterModule import org.oppia.android.domain.platformparameter.PlatformParameterSingletonModule import org.oppia.android.domain.question.QuestionModule @@ -404,7 +405,7 @@ class ImageRegionSelectionInteractionViewTest { AccessibilityTestModule::class, LogStorageModule::class, CachingTestModule::class, PrimeTopicAssetsControllerModule::class, ExpirationMetaDataRetrieverModule::class, ViewBindingShimModule::class, RatioInputModule::class, WorkManagerConfigurationModule::class, - ApplicationStartupListenerModule::class, LogUploadWorkerModule::class, + ApplicationStartupListenerModule::class, LogReportWorkerModule::class, HintsAndSolutionConfigModule::class, HintsAndSolutionProdModule::class, FirebaseLogUploaderModule::class, FakeOppiaClockModule::class, PracticeTabModule::class, DeveloperOptionsStarterModule::class, DeveloperOptionsModule::class, @@ -414,7 +415,7 @@ class ImageRegionSelectionInteractionViewTest { NumericExpressionInputModule::class, AlgebraicExpressionInputModule::class, MathEquationInputModule::class, SplitScreenInteractionModule::class, LoggingIdentifierModule::class, ApplicationLifecycleModule::class, - SyncStatusModule::class + SyncStatusModule::class, MetricLogSchedulerModule::class ] ) interface TestApplicationComponent : ApplicationComponent { diff --git a/app/src/sharedTest/java/org/oppia/android/app/testing/InputInteractionViewTestActivityTest.kt b/app/src/sharedTest/java/org/oppia/android/app/testing/InputInteractionViewTestActivityTest.kt index 68404f0feaa..da4d3031acd 100644 --- a/app/src/sharedTest/java/org/oppia/android/app/testing/InputInteractionViewTestActivityTest.kt +++ b/app/src/sharedTest/java/org/oppia/android/app/testing/InputInteractionViewTestActivityTest.kt @@ -67,7 +67,8 @@ import org.oppia.android.domain.onboarding.ExpirationMetaDataRetrieverModule import org.oppia.android.domain.oppialogger.LogStorageModule import org.oppia.android.domain.oppialogger.LoggingIdentifierModule import org.oppia.android.domain.oppialogger.analytics.ApplicationLifecycleModule -import org.oppia.android.domain.oppialogger.loguploader.LogUploadWorkerModule +import org.oppia.android.domain.oppialogger.logscheduler.MetricLogSchedulerModule +import org.oppia.android.domain.oppialogger.loguploader.LogReportWorkerModule import org.oppia.android.domain.platformparameter.PlatformParameterModule import org.oppia.android.domain.platformparameter.PlatformParameterSingletonModule import org.oppia.android.domain.question.QuestionModule @@ -1115,7 +1116,7 @@ class InputInteractionViewTestActivityTest { AccessibilityTestModule::class, LogStorageModule::class, CachingTestModule::class, PrimeTopicAssetsControllerModule::class, ExpirationMetaDataRetrieverModule::class, ViewBindingShimModule::class, RatioInputModule::class, WorkManagerConfigurationModule::class, - ApplicationStartupListenerModule::class, LogUploadWorkerModule::class, + ApplicationStartupListenerModule::class, LogReportWorkerModule::class, HintsAndSolutionConfigModule::class, HintsAndSolutionProdModule::class, FirebaseLogUploaderModule::class, FakeOppiaClockModule::class, PracticeTabModule::class, DeveloperOptionsStarterModule::class, DeveloperOptionsModule::class, @@ -1125,7 +1126,7 @@ class InputInteractionViewTestActivityTest { NumericExpressionInputModule::class, AlgebraicExpressionInputModule::class, MathEquationInputModule::class, SplitScreenInteractionModule::class, LoggingIdentifierModule::class, ApplicationLifecycleModule::class, - SyncStatusModule::class + SyncStatusModule::class, MetricLogSchedulerModule::class ] ) interface TestApplicationComponent : ApplicationComponent { diff --git a/app/src/sharedTest/java/org/oppia/android/app/testing/NavigationDrawerActivityDebugTest.kt b/app/src/sharedTest/java/org/oppia/android/app/testing/NavigationDrawerActivityDebugTest.kt index 017b47e5702..69a7cfcc0ac 100644 --- a/app/src/sharedTest/java/org/oppia/android/app/testing/NavigationDrawerActivityDebugTest.kt +++ b/app/src/sharedTest/java/org/oppia/android/app/testing/NavigationDrawerActivityDebugTest.kt @@ -87,7 +87,8 @@ import org.oppia.android.domain.onboarding.ExpirationMetaDataRetrieverModule import org.oppia.android.domain.oppialogger.LogStorageModule import org.oppia.android.domain.oppialogger.LoggingIdentifierModule import org.oppia.android.domain.oppialogger.analytics.ApplicationLifecycleModule -import org.oppia.android.domain.oppialogger.loguploader.LogUploadWorkerModule +import org.oppia.android.domain.oppialogger.logscheduler.MetricLogSchedulerModule +import org.oppia.android.domain.oppialogger.loguploader.LogReportWorkerModule import org.oppia.android.domain.platformparameter.PlatformParameterModule import org.oppia.android.domain.platformparameter.PlatformParameterSingletonModule import org.oppia.android.domain.question.QuestionModule @@ -428,7 +429,7 @@ class NavigationDrawerActivityDebugTest { AccessibilityTestModule::class, LogStorageModule::class, CachingTestModule::class, PrimeTopicAssetsControllerModule::class, ExpirationMetaDataRetrieverModule::class, ViewBindingShimModule::class, RatioInputModule::class, WorkManagerConfigurationModule::class, - ApplicationStartupListenerModule::class, LogUploadWorkerModule::class, + ApplicationStartupListenerModule::class, LogReportWorkerModule::class, HintsAndSolutionConfigModule::class, HintsAndSolutionProdModule::class, FirebaseLogUploaderModule::class, FakeOppiaClockModule::class, PracticeTabModule::class, DeveloperOptionsStarterModule::class, DeveloperOptionsModule::class, @@ -438,7 +439,7 @@ class NavigationDrawerActivityDebugTest { NumericExpressionInputModule::class, AlgebraicExpressionInputModule::class, MathEquationInputModule::class, SplitScreenInteractionModule::class, LoggingIdentifierModule::class, ApplicationLifecycleModule::class, - SyncStatusModule::class + SyncStatusModule::class, MetricLogSchedulerModule::class ] ) interface TestApplicationComponent : ApplicationComponent { diff --git a/app/src/sharedTest/java/org/oppia/android/app/testing/NavigationDrawerActivityProdTest.kt b/app/src/sharedTest/java/org/oppia/android/app/testing/NavigationDrawerActivityProdTest.kt index 8acb7046c00..c7a0fc12355 100644 --- a/app/src/sharedTest/java/org/oppia/android/app/testing/NavigationDrawerActivityProdTest.kt +++ b/app/src/sharedTest/java/org/oppia/android/app/testing/NavigationDrawerActivityProdTest.kt @@ -95,7 +95,8 @@ import org.oppia.android.domain.onboarding.ExpirationMetaDataRetrieverModule import org.oppia.android.domain.oppialogger.LogStorageModule import org.oppia.android.domain.oppialogger.LoggingIdentifierModule import org.oppia.android.domain.oppialogger.analytics.ApplicationLifecycleModule -import org.oppia.android.domain.oppialogger.loguploader.LogUploadWorkerModule +import org.oppia.android.domain.oppialogger.logscheduler.MetricLogSchedulerModule +import org.oppia.android.domain.oppialogger.loguploader.LogReportWorkerModule import org.oppia.android.domain.platformparameter.PlatformParameterModule import org.oppia.android.domain.platformparameter.PlatformParameterSingletonModule import org.oppia.android.domain.question.QuestionModule @@ -977,7 +978,7 @@ class NavigationDrawerActivityProdTest { AccessibilityTestModule::class, LogStorageModule::class, CachingTestModule::class, PrimeTopicAssetsControllerModule::class, ExpirationMetaDataRetrieverModule::class, ViewBindingShimModule::class, RatioInputModule::class, WorkManagerConfigurationModule::class, - ApplicationStartupListenerModule::class, LogUploadWorkerModule::class, + ApplicationStartupListenerModule::class, LogReportWorkerModule::class, HintsAndSolutionConfigModule::class, HintsAndSolutionProdModule::class, FirebaseLogUploaderModule::class, FakeOppiaClockModule::class, PracticeTabModule::class, DeveloperOptionsModule::class, ExplorationStorageModule::class, NetworkModule::class, @@ -987,7 +988,7 @@ class NavigationDrawerActivityProdTest { AlgebraicExpressionInputModule::class, MathEquationInputModule::class, SplitScreenInteractionModule::class, LoggingIdentifierModule::class, ApplicationLifecycleModule::class, - SyncStatusModule::class + SyncStatusModule::class, MetricLogSchedulerModule::class ] ) interface TestApplicationComponent : ApplicationComponent { diff --git a/app/src/sharedTest/java/org/oppia/android/app/testing/TestFontScaleConfigurationUtilActivityTest.kt b/app/src/sharedTest/java/org/oppia/android/app/testing/TestFontScaleConfigurationUtilActivityTest.kt index 42d893f3abb..7488560d8d9 100644 --- a/app/src/sharedTest/java/org/oppia/android/app/testing/TestFontScaleConfigurationUtilActivityTest.kt +++ b/app/src/sharedTest/java/org/oppia/android/app/testing/TestFontScaleConfigurationUtilActivityTest.kt @@ -56,7 +56,8 @@ import org.oppia.android.domain.onboarding.ExpirationMetaDataRetrieverModule import org.oppia.android.domain.oppialogger.LogStorageModule import org.oppia.android.domain.oppialogger.LoggingIdentifierModule import org.oppia.android.domain.oppialogger.analytics.ApplicationLifecycleModule -import org.oppia.android.domain.oppialogger.loguploader.LogUploadWorkerModule +import org.oppia.android.domain.oppialogger.logscheduler.MetricLogSchedulerModule +import org.oppia.android.domain.oppialogger.loguploader.LogReportWorkerModule import org.oppia.android.domain.platformparameter.PlatformParameterModule import org.oppia.android.domain.platformparameter.PlatformParameterSingletonModule import org.oppia.android.domain.question.QuestionModule @@ -195,7 +196,7 @@ class TestFontScaleConfigurationUtilActivityTest { AccessibilityTestModule::class, LogStorageModule::class, CachingTestModule::class, PrimeTopicAssetsControllerModule::class, ExpirationMetaDataRetrieverModule::class, ViewBindingShimModule::class, RatioInputModule::class, WorkManagerConfigurationModule::class, - ApplicationStartupListenerModule::class, LogUploadWorkerModule::class, + ApplicationStartupListenerModule::class, LogReportWorkerModule::class, HintsAndSolutionConfigModule::class, HintsAndSolutionProdModule::class, FirebaseLogUploaderModule::class, FakeOppiaClockModule::class, PracticeTabModule::class, DeveloperOptionsStarterModule::class, DeveloperOptionsModule::class, @@ -205,7 +206,7 @@ class TestFontScaleConfigurationUtilActivityTest { NumericExpressionInputModule::class, AlgebraicExpressionInputModule::class, MathEquationInputModule::class, SplitScreenInteractionModule::class, LoggingIdentifierModule::class, ApplicationLifecycleModule::class, - SyncStatusModule::class + SyncStatusModule::class, MetricLogSchedulerModule::class ] ) interface TestApplicationComponent : ApplicationComponent { diff --git a/app/src/sharedTest/java/org/oppia/android/app/testing/TopicTestActivityForStoryTest.kt b/app/src/sharedTest/java/org/oppia/android/app/testing/TopicTestActivityForStoryTest.kt index 6311b17fa9a..5aebaae32fa 100644 --- a/app/src/sharedTest/java/org/oppia/android/app/testing/TopicTestActivityForStoryTest.kt +++ b/app/src/sharedTest/java/org/oppia/android/app/testing/TopicTestActivityForStoryTest.kt @@ -62,7 +62,8 @@ import org.oppia.android.domain.onboarding.ExpirationMetaDataRetrieverModule import org.oppia.android.domain.oppialogger.LogStorageModule import org.oppia.android.domain.oppialogger.LoggingIdentifierModule import org.oppia.android.domain.oppialogger.analytics.ApplicationLifecycleModule -import org.oppia.android.domain.oppialogger.loguploader.LogUploadWorkerModule +import org.oppia.android.domain.oppialogger.logscheduler.MetricLogSchedulerModule +import org.oppia.android.domain.oppialogger.loguploader.LogReportWorkerModule import org.oppia.android.domain.platformparameter.PlatformParameterModule import org.oppia.android.domain.platformparameter.PlatformParameterSingletonModule import org.oppia.android.domain.question.QuestionModule @@ -192,7 +193,7 @@ class TopicTestActivityForStoryTest { AccessibilityTestModule::class, LogStorageModule::class, CachingTestModule::class, PrimeTopicAssetsControllerModule::class, ExpirationMetaDataRetrieverModule::class, ViewBindingShimModule::class, RatioInputModule::class, WorkManagerConfigurationModule::class, - ApplicationStartupListenerModule::class, LogUploadWorkerModule::class, + ApplicationStartupListenerModule::class, LogReportWorkerModule::class, HintsAndSolutionConfigModule::class, HintsAndSolutionProdModule::class, FirebaseLogUploaderModule::class, FakeOppiaClockModule::class, PracticeTabModule::class, DeveloperOptionsStarterModule::class, DeveloperOptionsModule::class, @@ -202,7 +203,7 @@ class TopicTestActivityForStoryTest { NumericExpressionInputModule::class, AlgebraicExpressionInputModule::class, MathEquationInputModule::class, SplitScreenInteractionModule::class, LoggingIdentifierModule::class, ApplicationLifecycleModule::class, - SyncStatusModule::class + SyncStatusModule::class, MetricLogSchedulerModule::class ] ) interface TestApplicationComponent : ApplicationComponent { diff --git a/app/src/sharedTest/java/org/oppia/android/app/thirdparty/LicenseListActivityTest.kt b/app/src/sharedTest/java/org/oppia/android/app/thirdparty/LicenseListActivityTest.kt index 9d2caf4de06..efb85e232b1 100644 --- a/app/src/sharedTest/java/org/oppia/android/app/thirdparty/LicenseListActivityTest.kt +++ b/app/src/sharedTest/java/org/oppia/android/app/thirdparty/LicenseListActivityTest.kt @@ -51,7 +51,8 @@ import org.oppia.android.domain.onboarding.ExpirationMetaDataRetrieverModule import org.oppia.android.domain.oppialogger.LogStorageModule import org.oppia.android.domain.oppialogger.LoggingIdentifierModule import org.oppia.android.domain.oppialogger.analytics.ApplicationLifecycleModule -import org.oppia.android.domain.oppialogger.loguploader.LogUploadWorkerModule +import org.oppia.android.domain.oppialogger.logscheduler.MetricLogSchedulerModule +import org.oppia.android.domain.oppialogger.loguploader.LogReportWorkerModule import org.oppia.android.domain.platformparameter.PlatformParameterModule import org.oppia.android.domain.platformparameter.PlatformParameterSingletonModule import org.oppia.android.domain.question.QuestionModule @@ -152,7 +153,7 @@ class LicenseListActivityTest { AccessibilityTestModule::class, LogStorageModule::class, CachingTestModule::class, PrimeTopicAssetsControllerModule::class, ExpirationMetaDataRetrieverModule::class, ViewBindingShimModule::class, RatioInputModule::class, WorkManagerConfigurationModule::class, - ApplicationStartupListenerModule::class, LogUploadWorkerModule::class, + ApplicationStartupListenerModule::class, LogReportWorkerModule::class, HintsAndSolutionConfigModule::class, HintsAndSolutionProdModule::class, FirebaseLogUploaderModule::class, FakeOppiaClockModule::class, PracticeTabModule::class, DeveloperOptionsStarterModule::class, DeveloperOptionsModule::class, @@ -161,7 +162,8 @@ class LicenseListActivityTest { AssetModule::class, LocaleProdModule::class, ActivityRecreatorTestModule::class, NumericExpressionInputModule::class, AlgebraicExpressionInputModule::class, MathEquationInputModule::class, SplitScreenInteractionModule::class, - LoggingIdentifierModule::class, ApplicationLifecycleModule::class, SyncStatusModule::class + LoggingIdentifierModule::class, ApplicationLifecycleModule::class, SyncStatusModule::class, + MetricLogSchedulerModule::class ] ) diff --git a/app/src/sharedTest/java/org/oppia/android/app/thirdparty/LicenseListFragmentTest.kt b/app/src/sharedTest/java/org/oppia/android/app/thirdparty/LicenseListFragmentTest.kt index 31d05596c1c..4fd305d3ce0 100644 --- a/app/src/sharedTest/java/org/oppia/android/app/thirdparty/LicenseListFragmentTest.kt +++ b/app/src/sharedTest/java/org/oppia/android/app/thirdparty/LicenseListFragmentTest.kt @@ -67,7 +67,8 @@ import org.oppia.android.domain.onboarding.ExpirationMetaDataRetrieverModule import org.oppia.android.domain.oppialogger.LogStorageModule import org.oppia.android.domain.oppialogger.LoggingIdentifierModule import org.oppia.android.domain.oppialogger.analytics.ApplicationLifecycleModule -import org.oppia.android.domain.oppialogger.loguploader.LogUploadWorkerModule +import org.oppia.android.domain.oppialogger.logscheduler.MetricLogSchedulerModule +import org.oppia.android.domain.oppialogger.loguploader.LogReportWorkerModule import org.oppia.android.domain.platformparameter.PlatformParameterModule import org.oppia.android.domain.platformparameter.PlatformParameterSingletonModule import org.oppia.android.domain.question.QuestionModule @@ -362,7 +363,7 @@ class LicenseListFragmentTest { AccessibilityTestModule::class, LogStorageModule::class, CachingTestModule::class, PrimeTopicAssetsControllerModule::class, ExpirationMetaDataRetrieverModule::class, ViewBindingShimModule::class, RatioInputModule::class, WorkManagerConfigurationModule::class, - ApplicationStartupListenerModule::class, LogUploadWorkerModule::class, + ApplicationStartupListenerModule::class, LogReportWorkerModule::class, HintsAndSolutionConfigModule::class, HintsAndSolutionProdModule::class, FirebaseLogUploaderModule::class, FakeOppiaClockModule::class, PracticeTabModule::class, DeveloperOptionsStarterModule::class, DeveloperOptionsModule::class, @@ -371,7 +372,8 @@ class LicenseListFragmentTest { AssetModule::class, LocaleProdModule::class, ActivityRecreatorTestModule::class, NumericExpressionInputModule::class, AlgebraicExpressionInputModule::class, MathEquationInputModule::class, SplitScreenInteractionModule::class, - LoggingIdentifierModule::class, ApplicationLifecycleModule::class, SyncStatusModule::class + LoggingIdentifierModule::class, ApplicationLifecycleModule::class, SyncStatusModule::class, + MetricLogSchedulerModule::class ] ) diff --git a/app/src/sharedTest/java/org/oppia/android/app/thirdparty/LicenseTextViewerActivityTest.kt b/app/src/sharedTest/java/org/oppia/android/app/thirdparty/LicenseTextViewerActivityTest.kt index 8f88e75d8bb..a751f1b52de 100644 --- a/app/src/sharedTest/java/org/oppia/android/app/thirdparty/LicenseTextViewerActivityTest.kt +++ b/app/src/sharedTest/java/org/oppia/android/app/thirdparty/LicenseTextViewerActivityTest.kt @@ -52,7 +52,8 @@ import org.oppia.android.domain.onboarding.ExpirationMetaDataRetrieverModule import org.oppia.android.domain.oppialogger.LogStorageModule import org.oppia.android.domain.oppialogger.LoggingIdentifierModule import org.oppia.android.domain.oppialogger.analytics.ApplicationLifecycleModule -import org.oppia.android.domain.oppialogger.loguploader.LogUploadWorkerModule +import org.oppia.android.domain.oppialogger.logscheduler.MetricLogSchedulerModule +import org.oppia.android.domain.oppialogger.loguploader.LogReportWorkerModule import org.oppia.android.domain.platformparameter.PlatformParameterModule import org.oppia.android.domain.platformparameter.PlatformParameterSingletonModule import org.oppia.android.domain.question.QuestionModule @@ -161,7 +162,7 @@ class LicenseTextViewerActivityTest { AccessibilityTestModule::class, LogStorageModule::class, CachingTestModule::class, PrimeTopicAssetsControllerModule::class, ExpirationMetaDataRetrieverModule::class, ViewBindingShimModule::class, RatioInputModule::class, WorkManagerConfigurationModule::class, - ApplicationStartupListenerModule::class, LogUploadWorkerModule::class, + ApplicationStartupListenerModule::class, LogReportWorkerModule::class, HintsAndSolutionConfigModule::class, HintsAndSolutionProdModule::class, FirebaseLogUploaderModule::class, FakeOppiaClockModule::class, PracticeTabModule::class, DeveloperOptionsStarterModule::class, DeveloperOptionsModule::class, @@ -170,7 +171,8 @@ class LicenseTextViewerActivityTest { AssetModule::class, LocaleProdModule::class, ActivityRecreatorTestModule::class, NumericExpressionInputModule::class, AlgebraicExpressionInputModule::class, MathEquationInputModule::class, SplitScreenInteractionModule::class, - LoggingIdentifierModule::class, ApplicationLifecycleModule::class, SyncStatusModule::class + LoggingIdentifierModule::class, ApplicationLifecycleModule::class, SyncStatusModule::class, + MetricLogSchedulerModule::class ] ) diff --git a/app/src/sharedTest/java/org/oppia/android/app/thirdparty/LicenseTextViewerFragmentTest.kt b/app/src/sharedTest/java/org/oppia/android/app/thirdparty/LicenseTextViewerFragmentTest.kt index 62406e2ba8d..bd5f229906f 100644 --- a/app/src/sharedTest/java/org/oppia/android/app/thirdparty/LicenseTextViewerFragmentTest.kt +++ b/app/src/sharedTest/java/org/oppia/android/app/thirdparty/LicenseTextViewerFragmentTest.kt @@ -57,7 +57,8 @@ import org.oppia.android.domain.onboarding.ExpirationMetaDataRetrieverModule import org.oppia.android.domain.oppialogger.LogStorageModule import org.oppia.android.domain.oppialogger.LoggingIdentifierModule import org.oppia.android.domain.oppialogger.analytics.ApplicationLifecycleModule -import org.oppia.android.domain.oppialogger.loguploader.LogUploadWorkerModule +import org.oppia.android.domain.oppialogger.logscheduler.MetricLogSchedulerModule +import org.oppia.android.domain.oppialogger.loguploader.LogReportWorkerModule import org.oppia.android.domain.platformparameter.PlatformParameterModule import org.oppia.android.domain.platformparameter.PlatformParameterSingletonModule import org.oppia.android.domain.question.QuestionModule @@ -340,7 +341,7 @@ class LicenseTextViewerFragmentTest { AccessibilityTestModule::class, LogStorageModule::class, CachingTestModule::class, PrimeTopicAssetsControllerModule::class, ExpirationMetaDataRetrieverModule::class, ViewBindingShimModule::class, RatioInputModule::class, WorkManagerConfigurationModule::class, - ApplicationStartupListenerModule::class, LogUploadWorkerModule::class, + ApplicationStartupListenerModule::class, LogReportWorkerModule::class, HintsAndSolutionConfigModule::class, HintsAndSolutionProdModule::class, FirebaseLogUploaderModule::class, FakeOppiaClockModule::class, PracticeTabModule::class, DeveloperOptionsStarterModule::class, DeveloperOptionsModule::class, @@ -349,7 +350,8 @@ class LicenseTextViewerFragmentTest { AssetModule::class, LocaleProdModule::class, ActivityRecreatorTestModule::class, NumericExpressionInputModule::class, AlgebraicExpressionInputModule::class, MathEquationInputModule::class, SplitScreenInteractionModule::class, - LoggingIdentifierModule::class, ApplicationLifecycleModule::class, SyncStatusModule::class + LoggingIdentifierModule::class, ApplicationLifecycleModule::class, SyncStatusModule::class, + MetricLogSchedulerModule::class ] ) diff --git a/app/src/sharedTest/java/org/oppia/android/app/thirdparty/ThirdPartyDependencyListActivityTest.kt b/app/src/sharedTest/java/org/oppia/android/app/thirdparty/ThirdPartyDependencyListActivityTest.kt index 6f904e3c2f9..2298212d383 100644 --- a/app/src/sharedTest/java/org/oppia/android/app/thirdparty/ThirdPartyDependencyListActivityTest.kt +++ b/app/src/sharedTest/java/org/oppia/android/app/thirdparty/ThirdPartyDependencyListActivityTest.kt @@ -51,7 +51,8 @@ import org.oppia.android.domain.onboarding.ExpirationMetaDataRetrieverModule import org.oppia.android.domain.oppialogger.LogStorageModule import org.oppia.android.domain.oppialogger.LoggingIdentifierModule import org.oppia.android.domain.oppialogger.analytics.ApplicationLifecycleModule -import org.oppia.android.domain.oppialogger.loguploader.LogUploadWorkerModule +import org.oppia.android.domain.oppialogger.logscheduler.MetricLogSchedulerModule +import org.oppia.android.domain.oppialogger.loguploader.LogReportWorkerModule import org.oppia.android.domain.platformparameter.PlatformParameterModule import org.oppia.android.domain.platformparameter.PlatformParameterSingletonModule import org.oppia.android.domain.question.QuestionModule @@ -149,7 +150,7 @@ class ThirdPartyDependencyListActivityTest { AccessibilityTestModule::class, LogStorageModule::class, CachingTestModule::class, PrimeTopicAssetsControllerModule::class, ExpirationMetaDataRetrieverModule::class, ViewBindingShimModule::class, RatioInputModule::class, WorkManagerConfigurationModule::class, - ApplicationStartupListenerModule::class, LogUploadWorkerModule::class, + ApplicationStartupListenerModule::class, LogReportWorkerModule::class, HintsAndSolutionConfigModule::class, HintsAndSolutionProdModule::class, FirebaseLogUploaderModule::class, FakeOppiaClockModule::class, PracticeTabModule::class, DeveloperOptionsStarterModule::class, DeveloperOptionsModule::class, @@ -158,7 +159,8 @@ class ThirdPartyDependencyListActivityTest { AssetModule::class, LocaleProdModule::class, ActivityRecreatorTestModule::class, NumericExpressionInputModule::class, AlgebraicExpressionInputModule::class, MathEquationInputModule::class, SplitScreenInteractionModule::class, - LoggingIdentifierModule::class, ApplicationLifecycleModule::class, SyncStatusModule::class + LoggingIdentifierModule::class, ApplicationLifecycleModule::class, SyncStatusModule::class, + MetricLogSchedulerModule::class ] ) diff --git a/app/src/sharedTest/java/org/oppia/android/app/thirdparty/ThirdPartyDependencyListFragmentTest.kt b/app/src/sharedTest/java/org/oppia/android/app/thirdparty/ThirdPartyDependencyListFragmentTest.kt index 1109f817ac6..f9dd5befd2e 100644 --- a/app/src/sharedTest/java/org/oppia/android/app/thirdparty/ThirdPartyDependencyListFragmentTest.kt +++ b/app/src/sharedTest/java/org/oppia/android/app/thirdparty/ThirdPartyDependencyListFragmentTest.kt @@ -66,7 +66,8 @@ import org.oppia.android.domain.onboarding.ExpirationMetaDataRetrieverModule import org.oppia.android.domain.oppialogger.LogStorageModule import org.oppia.android.domain.oppialogger.LoggingIdentifierModule import org.oppia.android.domain.oppialogger.analytics.ApplicationLifecycleModule -import org.oppia.android.domain.oppialogger.loguploader.LogUploadWorkerModule +import org.oppia.android.domain.oppialogger.logscheduler.MetricLogSchedulerModule +import org.oppia.android.domain.oppialogger.loguploader.LogReportWorkerModule import org.oppia.android.domain.platformparameter.PlatformParameterModule import org.oppia.android.domain.platformparameter.PlatformParameterSingletonModule import org.oppia.android.domain.question.QuestionModule @@ -472,7 +473,7 @@ class ThirdPartyDependencyListFragmentTest { AccessibilityTestModule::class, LogStorageModule::class, CachingTestModule::class, PrimeTopicAssetsControllerModule::class, ExpirationMetaDataRetrieverModule::class, ViewBindingShimModule::class, RatioInputModule::class, WorkManagerConfigurationModule::class, - ApplicationStartupListenerModule::class, LogUploadWorkerModule::class, + ApplicationStartupListenerModule::class, LogReportWorkerModule::class, HintsAndSolutionConfigModule::class, HintsAndSolutionProdModule::class, FirebaseLogUploaderModule::class, FakeOppiaClockModule::class, PracticeTabModule::class, DeveloperOptionsStarterModule::class, DeveloperOptionsModule::class, @@ -481,7 +482,8 @@ class ThirdPartyDependencyListFragmentTest { AssetModule::class, LocaleProdModule::class, ActivityRecreatorTestModule::class, NumericExpressionInputModule::class, AlgebraicExpressionInputModule::class, MathEquationInputModule::class, SplitScreenInteractionModule::class, - LoggingIdentifierModule::class, ApplicationLifecycleModule::class, SyncStatusModule::class + LoggingIdentifierModule::class, ApplicationLifecycleModule::class, SyncStatusModule::class, + MetricLogSchedulerModule::class ] ) diff --git a/app/src/sharedTest/java/org/oppia/android/app/topic/TopicActivityTest.kt b/app/src/sharedTest/java/org/oppia/android/app/topic/TopicActivityTest.kt index 93e663a8a4a..15c80f80eca 100644 --- a/app/src/sharedTest/java/org/oppia/android/app/topic/TopicActivityTest.kt +++ b/app/src/sharedTest/java/org/oppia/android/app/topic/TopicActivityTest.kt @@ -63,7 +63,8 @@ import org.oppia.android.domain.onboarding.ExpirationMetaDataRetrieverModule import org.oppia.android.domain.oppialogger.LogStorageModule import org.oppia.android.domain.oppialogger.LoggingIdentifierModule import org.oppia.android.domain.oppialogger.analytics.ApplicationLifecycleModule -import org.oppia.android.domain.oppialogger.loguploader.LogUploadWorkerModule +import org.oppia.android.domain.oppialogger.logscheduler.MetricLogSchedulerModule +import org.oppia.android.domain.oppialogger.loguploader.LogReportWorkerModule import org.oppia.android.domain.platformparameter.PlatformParameterModule import org.oppia.android.domain.platformparameter.PlatformParameterSingletonModule import org.oppia.android.domain.question.QuestionModule @@ -198,7 +199,7 @@ class TopicActivityTest { AccessibilityTestModule::class, LogStorageModule::class, CachingTestModule::class, PrimeTopicAssetsControllerModule::class, ExpirationMetaDataRetrieverModule::class, ViewBindingShimModule::class, RatioInputModule::class, WorkManagerConfigurationModule::class, - ApplicationStartupListenerModule::class, LogUploadWorkerModule::class, + ApplicationStartupListenerModule::class, LogReportWorkerModule::class, HintsAndSolutionConfigModule::class, HintsAndSolutionProdModule::class, FirebaseLogUploaderModule::class, FakeOppiaClockModule::class, PracticeTabModule::class, DeveloperOptionsStarterModule::class, DeveloperOptionsModule::class, @@ -208,7 +209,7 @@ class TopicActivityTest { NumericExpressionInputModule::class, AlgebraicExpressionInputModule::class, MathEquationInputModule::class, SplitScreenInteractionModule::class, LoggingIdentifierModule::class, ApplicationLifecycleModule::class, - SyncStatusModule::class + SyncStatusModule::class, MetricLogSchedulerModule::class ] ) interface TestApplicationComponent : ApplicationComponent { diff --git a/app/src/sharedTest/java/org/oppia/android/app/topic/TopicFragmentTest.kt b/app/src/sharedTest/java/org/oppia/android/app/topic/TopicFragmentTest.kt index 48700e24d59..87fb560776c 100644 --- a/app/src/sharedTest/java/org/oppia/android/app/topic/TopicFragmentTest.kt +++ b/app/src/sharedTest/java/org/oppia/android/app/topic/TopicFragmentTest.kt @@ -74,7 +74,8 @@ import org.oppia.android.domain.onboarding.ExpirationMetaDataRetrieverModule import org.oppia.android.domain.oppialogger.LogStorageModule import org.oppia.android.domain.oppialogger.LoggingIdentifierModule import org.oppia.android.domain.oppialogger.analytics.ApplicationLifecycleModule -import org.oppia.android.domain.oppialogger.loguploader.LogUploadWorkerModule +import org.oppia.android.domain.oppialogger.logscheduler.MetricLogSchedulerModule +import org.oppia.android.domain.oppialogger.loguploader.LogReportWorkerModule import org.oppia.android.domain.platformparameter.PlatformParameterModule import org.oppia.android.domain.platformparameter.PlatformParameterSingletonModule import org.oppia.android.domain.question.QuestionModule @@ -652,7 +653,7 @@ class TopicFragmentTest { AccessibilityTestModule::class, LogStorageModule::class, CachingTestModule::class, PrimeTopicAssetsControllerModule::class, ExpirationMetaDataRetrieverModule::class, ViewBindingShimModule::class, RatioInputModule::class, WorkManagerConfigurationModule::class, - ApplicationStartupListenerModule::class, LogUploadWorkerModule::class, + ApplicationStartupListenerModule::class, LogReportWorkerModule::class, HintsAndSolutionConfigModule::class, HintsAndSolutionProdModule::class, FirebaseLogUploaderModule::class, FakeOppiaClockModule::class, DeveloperOptionsStarterModule::class, DeveloperOptionsModule::class, @@ -663,7 +664,7 @@ class TopicFragmentTest { NumericExpressionInputModule::class, AlgebraicExpressionInputModule::class, MathEquationInputModule::class, SplitScreenInteractionModule::class, LoggingIdentifierModule::class, ApplicationLifecycleModule::class, - SyncStatusModule::class + SyncStatusModule::class, MetricLogSchedulerModule::class ] ) interface TestApplicationComponent : ApplicationComponent { diff --git a/app/src/sharedTest/java/org/oppia/android/app/topic/conceptcard/ConceptCardFragmentTest.kt b/app/src/sharedTest/java/org/oppia/android/app/topic/conceptcard/ConceptCardFragmentTest.kt index c0898715487..6a3c9d7be97 100644 --- a/app/src/sharedTest/java/org/oppia/android/app/topic/conceptcard/ConceptCardFragmentTest.kt +++ b/app/src/sharedTest/java/org/oppia/android/app/topic/conceptcard/ConceptCardFragmentTest.kt @@ -72,7 +72,8 @@ import org.oppia.android.domain.onboarding.ExpirationMetaDataRetrieverModule import org.oppia.android.domain.oppialogger.LogStorageModule import org.oppia.android.domain.oppialogger.LoggingIdentifierModule import org.oppia.android.domain.oppialogger.analytics.ApplicationLifecycleModule -import org.oppia.android.domain.oppialogger.loguploader.LogUploadWorkerModule +import org.oppia.android.domain.oppialogger.logscheduler.MetricLogSchedulerModule +import org.oppia.android.domain.oppialogger.loguploader.LogReportWorkerModule import org.oppia.android.domain.platformparameter.PlatformParameterModule import org.oppia.android.domain.platformparameter.PlatformParameterSingletonModule import org.oppia.android.domain.question.QuestionModule @@ -423,7 +424,7 @@ class ConceptCardFragmentTest { AccessibilityTestModule::class, LogStorageModule::class, PrimeTopicAssetsControllerModule::class, ExpirationMetaDataRetrieverModule::class, ViewBindingShimModule::class, RatioInputModule::class, WorkManagerConfigurationModule::class, - ApplicationStartupListenerModule::class, LogUploadWorkerModule::class, + ApplicationStartupListenerModule::class, LogReportWorkerModule::class, HintsAndSolutionConfigModule::class, HintsAndSolutionProdModule::class, FirebaseLogUploaderModule::class, FakeOppiaClockModule::class, PracticeTabModule::class, DeveloperOptionsStarterModule::class, DeveloperOptionsModule::class, @@ -434,7 +435,7 @@ class ConceptCardFragmentTest { NumericExpressionInputModule::class, AlgebraicExpressionInputModule::class, MathEquationInputModule::class, SplitScreenInteractionModule::class, LoggingIdentifierModule::class, ApplicationLifecycleModule::class, - SyncStatusModule::class + SyncStatusModule::class, MetricLogSchedulerModule::class ] ) interface TestApplicationComponent : ApplicationComponent { diff --git a/app/src/sharedTest/java/org/oppia/android/app/topic/info/TopicInfoFragmentTest.kt b/app/src/sharedTest/java/org/oppia/android/app/topic/info/TopicInfoFragmentTest.kt index 4c8c0eef8b6..e743d17c05d 100644 --- a/app/src/sharedTest/java/org/oppia/android/app/topic/info/TopicInfoFragmentTest.kt +++ b/app/src/sharedTest/java/org/oppia/android/app/topic/info/TopicInfoFragmentTest.kt @@ -76,7 +76,8 @@ import org.oppia.android.domain.onboarding.ExpirationMetaDataRetrieverModule import org.oppia.android.domain.oppialogger.LogStorageModule import org.oppia.android.domain.oppialogger.LoggingIdentifierModule import org.oppia.android.domain.oppialogger.analytics.ApplicationLifecycleModule -import org.oppia.android.domain.oppialogger.loguploader.LogUploadWorkerModule +import org.oppia.android.domain.oppialogger.logscheduler.MetricLogSchedulerModule +import org.oppia.android.domain.oppialogger.loguploader.LogReportWorkerModule import org.oppia.android.domain.platformparameter.PlatformParameterModule import org.oppia.android.domain.platformparameter.PlatformParameterSingletonModule import org.oppia.android.domain.question.QuestionModule @@ -479,7 +480,7 @@ class TopicInfoFragmentTest { AccessibilityTestModule::class, LogStorageModule::class, CachingTestModule::class, PrimeTopicAssetsControllerModule::class, ExpirationMetaDataRetrieverModule::class, ViewBindingShimModule::class, RatioInputModule::class, WorkManagerConfigurationModule::class, - ApplicationStartupListenerModule::class, LogUploadWorkerModule::class, + ApplicationStartupListenerModule::class, LogReportWorkerModule::class, HintsAndSolutionConfigModule::class, HintsAndSolutionProdModule::class, FirebaseLogUploaderModule::class, FakeOppiaClockModule::class, PracticeTabModule::class, DeveloperOptionsStarterModule::class, DeveloperOptionsModule::class, @@ -490,7 +491,7 @@ class TopicInfoFragmentTest { NumericExpressionInputModule::class, AlgebraicExpressionInputModule::class, MathEquationInputModule::class, SplitScreenInteractionModule::class, LoggingIdentifierModule::class, ApplicationLifecycleModule::class, - SyncStatusModule::class + SyncStatusModule::class, MetricLogSchedulerModule::class ] ) interface TestApplicationComponent : ApplicationComponent { diff --git a/app/src/sharedTest/java/org/oppia/android/app/topic/lessons/TopicLessonsFragmentTest.kt b/app/src/sharedTest/java/org/oppia/android/app/topic/lessons/TopicLessonsFragmentTest.kt index 32b7a7086c4..2e12f85d07a 100644 --- a/app/src/sharedTest/java/org/oppia/android/app/topic/lessons/TopicLessonsFragmentTest.kt +++ b/app/src/sharedTest/java/org/oppia/android/app/topic/lessons/TopicLessonsFragmentTest.kt @@ -83,7 +83,8 @@ import org.oppia.android.domain.onboarding.ExpirationMetaDataRetrieverModule import org.oppia.android.domain.oppialogger.LogStorageModule import org.oppia.android.domain.oppialogger.LoggingIdentifierModule import org.oppia.android.domain.oppialogger.analytics.ApplicationLifecycleModule -import org.oppia.android.domain.oppialogger.loguploader.LogUploadWorkerModule +import org.oppia.android.domain.oppialogger.logscheduler.MetricLogSchedulerModule +import org.oppia.android.domain.oppialogger.loguploader.LogReportWorkerModule import org.oppia.android.domain.platformparameter.PlatformParameterModule import org.oppia.android.domain.platformparameter.PlatformParameterSingletonModule import org.oppia.android.domain.question.QuestionModule @@ -1008,7 +1009,7 @@ class TopicLessonsFragmentTest { AccessibilityTestModule::class, LogStorageModule::class, CachingTestModule::class, PrimeTopicAssetsControllerModule::class, ExpirationMetaDataRetrieverModule::class, ViewBindingShimModule::class, RatioInputModule::class, WorkManagerConfigurationModule::class, - ApplicationStartupListenerModule::class, LogUploadWorkerModule::class, + ApplicationStartupListenerModule::class, LogReportWorkerModule::class, HintsAndSolutionConfigModule::class, HintsAndSolutionProdModule::class, FirebaseLogUploaderModule::class, FakeOppiaClockModule::class, PracticeTabModule::class, DeveloperOptionsStarterModule::class, DeveloperOptionsModule::class, @@ -1019,7 +1020,7 @@ class TopicLessonsFragmentTest { NumericExpressionInputModule::class, AlgebraicExpressionInputModule::class, MathEquationInputModule::class, SplitScreenInteractionModule::class, LoggingIdentifierModule::class, ApplicationLifecycleModule::class, - SyncStatusModule::class + SyncStatusModule::class, MetricLogSchedulerModule::class ] ) interface TestApplicationComponent : ApplicationComponent { diff --git a/app/src/sharedTest/java/org/oppia/android/app/topic/practice/TopicPracticeFragmentTest.kt b/app/src/sharedTest/java/org/oppia/android/app/topic/practice/TopicPracticeFragmentTest.kt index 5a15bdcbd35..98ae842aa2d 100644 --- a/app/src/sharedTest/java/org/oppia/android/app/topic/practice/TopicPracticeFragmentTest.kt +++ b/app/src/sharedTest/java/org/oppia/android/app/topic/practice/TopicPracticeFragmentTest.kt @@ -73,7 +73,8 @@ import org.oppia.android.domain.onboarding.ExpirationMetaDataRetrieverModule import org.oppia.android.domain.oppialogger.LogStorageModule import org.oppia.android.domain.oppialogger.LoggingIdentifierModule import org.oppia.android.domain.oppialogger.analytics.ApplicationLifecycleModule -import org.oppia.android.domain.oppialogger.loguploader.LogUploadWorkerModule +import org.oppia.android.domain.oppialogger.logscheduler.MetricLogSchedulerModule +import org.oppia.android.domain.oppialogger.loguploader.LogReportWorkerModule import org.oppia.android.domain.platformparameter.PlatformParameterModule import org.oppia.android.domain.platformparameter.PlatformParameterSingletonModule import org.oppia.android.domain.question.QuestionModule @@ -424,7 +425,7 @@ class TopicPracticeFragmentTest { AccessibilityTestModule::class, LogStorageModule::class, CachingTestModule::class, PrimeTopicAssetsControllerModule::class, ExpirationMetaDataRetrieverModule::class, ViewBindingShimModule::class, RatioInputModule::class, WorkManagerConfigurationModule::class, - ApplicationStartupListenerModule::class, LogUploadWorkerModule::class, + ApplicationStartupListenerModule::class, LogReportWorkerModule::class, HintsAndSolutionConfigModule::class, HintsAndSolutionProdModule::class, FirebaseLogUploaderModule::class, FakeOppiaClockModule::class, PracticeTabModule::class, DeveloperOptionsStarterModule::class, DeveloperOptionsModule::class, @@ -435,7 +436,7 @@ class TopicPracticeFragmentTest { NumericExpressionInputModule::class, AlgebraicExpressionInputModule::class, MathEquationInputModule::class, SplitScreenInteractionModule::class, LoggingIdentifierModule::class, ApplicationLifecycleModule::class, - SyncStatusModule::class + SyncStatusModule::class, MetricLogSchedulerModule::class ] ) interface TestApplicationComponent : ApplicationComponent { diff --git a/app/src/sharedTest/java/org/oppia/android/app/topic/questionplayer/QuestionPlayerActivityTest.kt b/app/src/sharedTest/java/org/oppia/android/app/topic/questionplayer/QuestionPlayerActivityTest.kt index 18bedd79642..8fbee49074d 100644 --- a/app/src/sharedTest/java/org/oppia/android/app/topic/questionplayer/QuestionPlayerActivityTest.kt +++ b/app/src/sharedTest/java/org/oppia/android/app/topic/questionplayer/QuestionPlayerActivityTest.kt @@ -96,7 +96,8 @@ import org.oppia.android.domain.onboarding.ExpirationMetaDataRetrieverModule import org.oppia.android.domain.oppialogger.LogStorageModule import org.oppia.android.domain.oppialogger.LoggingIdentifierModule import org.oppia.android.domain.oppialogger.analytics.ApplicationLifecycleModule -import org.oppia.android.domain.oppialogger.loguploader.LogUploadWorkerModule +import org.oppia.android.domain.oppialogger.logscheduler.MetricLogSchedulerModule +import org.oppia.android.domain.oppialogger.loguploader.LogReportWorkerModule import org.oppia.android.domain.platformparameter.PlatformParameterModule import org.oppia.android.domain.platformparameter.PlatformParameterSingletonModule import org.oppia.android.domain.question.InternalMasteryMultiplyFactor @@ -715,7 +716,7 @@ class QuestionPlayerActivityTest { ViewBindingShimModule::class, ApplicationStartupListenerModule::class, HintsAndSolutionConfigFastShowTestModule::class, HintsAndSolutionProdModule::class, WorkManagerConfigurationModule::class, FirebaseLogUploaderModule::class, - LogUploadWorkerModule::class, FakeOppiaClockModule::class, PracticeTabModule::class, + LogReportWorkerModule::class, FakeOppiaClockModule::class, PracticeTabModule::class, DeveloperOptionsStarterModule::class, DeveloperOptionsModule::class, ExplorationStorageModule::class, NetworkModule::class, NetworkConfigProdModule::class, NetworkConnectionUtilDebugModule::class, NetworkConnectionDebugUtilModule::class, @@ -724,7 +725,7 @@ class QuestionPlayerActivityTest { NumericExpressionInputModule::class, AlgebraicExpressionInputModule::class, MathEquationInputModule::class, SplitScreenInteractionModule::class, LoggingIdentifierModule::class, ApplicationLifecycleModule::class, - SyncStatusModule::class + SyncStatusModule::class, MetricLogSchedulerModule::class ] ) interface TestApplicationComponent : ApplicationComponent { diff --git a/app/src/sharedTest/java/org/oppia/android/app/topic/revision/TopicRevisionFragmentTest.kt b/app/src/sharedTest/java/org/oppia/android/app/topic/revision/TopicRevisionFragmentTest.kt index 726c9e6eb80..86da92fe690 100644 --- a/app/src/sharedTest/java/org/oppia/android/app/topic/revision/TopicRevisionFragmentTest.kt +++ b/app/src/sharedTest/java/org/oppia/android/app/topic/revision/TopicRevisionFragmentTest.kt @@ -74,7 +74,8 @@ import org.oppia.android.domain.onboarding.ExpirationMetaDataRetrieverModule import org.oppia.android.domain.oppialogger.LogStorageModule import org.oppia.android.domain.oppialogger.LoggingIdentifierModule import org.oppia.android.domain.oppialogger.analytics.ApplicationLifecycleModule -import org.oppia.android.domain.oppialogger.loguploader.LogUploadWorkerModule +import org.oppia.android.domain.oppialogger.logscheduler.MetricLogSchedulerModule +import org.oppia.android.domain.oppialogger.loguploader.LogReportWorkerModule import org.oppia.android.domain.platformparameter.PlatformParameterModule import org.oppia.android.domain.platformparameter.PlatformParameterSingletonModule import org.oppia.android.domain.question.QuestionModule @@ -320,7 +321,7 @@ class TopicRevisionFragmentTest { AccessibilityTestModule::class, LogStorageModule::class, CachingTestModule::class, PrimeTopicAssetsControllerModule::class, ExpirationMetaDataRetrieverModule::class, ViewBindingShimModule::class, RatioInputModule::class, WorkManagerConfigurationModule::class, - ApplicationStartupListenerModule::class, LogUploadWorkerModule::class, + ApplicationStartupListenerModule::class, LogReportWorkerModule::class, HintsAndSolutionConfigModule::class, HintsAndSolutionProdModule::class, FirebaseLogUploaderModule::class, FakeOppiaClockModule::class, PracticeTabModule::class, DeveloperOptionsStarterModule::class, DeveloperOptionsModule::class, @@ -331,7 +332,7 @@ class TopicRevisionFragmentTest { NumericExpressionInputModule::class, AlgebraicExpressionInputModule::class, MathEquationInputModule::class, SplitScreenInteractionModule::class, LoggingIdentifierModule::class, ApplicationLifecycleModule::class, - SyncStatusModule::class + SyncStatusModule::class, MetricLogSchedulerModule::class ] ) interface TestApplicationComponent : ApplicationComponent { diff --git a/app/src/sharedTest/java/org/oppia/android/app/topic/revisioncard/RevisionCardActivityTest.kt b/app/src/sharedTest/java/org/oppia/android/app/topic/revisioncard/RevisionCardActivityTest.kt index c83c20ddef9..6d8fbf9be40 100644 --- a/app/src/sharedTest/java/org/oppia/android/app/topic/revisioncard/RevisionCardActivityTest.kt +++ b/app/src/sharedTest/java/org/oppia/android/app/topic/revisioncard/RevisionCardActivityTest.kt @@ -64,7 +64,8 @@ import org.oppia.android.domain.onboarding.ExpirationMetaDataRetrieverModule import org.oppia.android.domain.oppialogger.LogStorageModule import org.oppia.android.domain.oppialogger.LoggingIdentifierModule import org.oppia.android.domain.oppialogger.analytics.ApplicationLifecycleModule -import org.oppia.android.domain.oppialogger.loguploader.LogUploadWorkerModule +import org.oppia.android.domain.oppialogger.logscheduler.MetricLogSchedulerModule +import org.oppia.android.domain.oppialogger.loguploader.LogReportWorkerModule import org.oppia.android.domain.platformparameter.PlatformParameterModule import org.oppia.android.domain.platformparameter.PlatformParameterSingletonModule import org.oppia.android.domain.question.QuestionModule @@ -274,7 +275,7 @@ class RevisionCardActivityTest { AccessibilityTestModule::class, LogStorageModule::class, CachingTestModule::class, PrimeTopicAssetsControllerModule::class, ExpirationMetaDataRetrieverModule::class, ViewBindingShimModule::class, RatioInputModule::class, WorkManagerConfigurationModule::class, - ApplicationStartupListenerModule::class, LogUploadWorkerModule::class, + ApplicationStartupListenerModule::class, LogReportWorkerModule::class, HintsAndSolutionConfigModule::class, HintsAndSolutionProdModule::class, FirebaseLogUploaderModule::class, FakeOppiaClockModule::class, PracticeTabModule::class, DeveloperOptionsStarterModule::class, DeveloperOptionsModule::class, @@ -285,7 +286,7 @@ class RevisionCardActivityTest { NumericExpressionInputModule::class, AlgebraicExpressionInputModule::class, MathEquationInputModule::class, SplitScreenInteractionModule::class, LoggingIdentifierModule::class, ApplicationLifecycleModule::class, - SyncStatusModule::class + SyncStatusModule::class, MetricLogSchedulerModule::class ] ) interface TestApplicationComponent : ApplicationComponent { diff --git a/app/src/sharedTest/java/org/oppia/android/app/topic/revisioncard/RevisionCardFragmentTest.kt b/app/src/sharedTest/java/org/oppia/android/app/topic/revisioncard/RevisionCardFragmentTest.kt index e0f30bbef08..84f04139d51 100644 --- a/app/src/sharedTest/java/org/oppia/android/app/topic/revisioncard/RevisionCardFragmentTest.kt +++ b/app/src/sharedTest/java/org/oppia/android/app/topic/revisioncard/RevisionCardFragmentTest.kt @@ -82,7 +82,8 @@ import org.oppia.android.domain.onboarding.ExpirationMetaDataRetrieverModule import org.oppia.android.domain.oppialogger.LogStorageModule import org.oppia.android.domain.oppialogger.LoggingIdentifierModule import org.oppia.android.domain.oppialogger.analytics.ApplicationLifecycleModule -import org.oppia.android.domain.oppialogger.loguploader.LogUploadWorkerModule +import org.oppia.android.domain.oppialogger.logscheduler.MetricLogSchedulerModule +import org.oppia.android.domain.oppialogger.loguploader.LogReportWorkerModule import org.oppia.android.domain.platformparameter.PlatformParameterModule import org.oppia.android.domain.platformparameter.PlatformParameterSingletonModule import org.oppia.android.domain.question.QuestionModule @@ -590,7 +591,7 @@ class RevisionCardFragmentTest { AccessibilityTestModule::class, LogStorageModule::class, PrimeTopicAssetsControllerModule::class, ExpirationMetaDataRetrieverModule::class, ViewBindingShimModule::class, RatioInputModule::class, WorkManagerConfigurationModule::class, - ApplicationStartupListenerModule::class, LogUploadWorkerModule::class, + ApplicationStartupListenerModule::class, LogReportWorkerModule::class, HintsAndSolutionConfigModule::class, HintsAndSolutionProdModule::class, FirebaseLogUploaderModule::class, FakeOppiaClockModule::class, PracticeTabModule::class, DeveloperOptionsStarterModule::class, DeveloperOptionsModule::class, @@ -601,7 +602,7 @@ class RevisionCardFragmentTest { NumericExpressionInputModule::class, AlgebraicExpressionInputModule::class, MathEquationInputModule::class, SplitScreenInteractionModule::class, LoggingIdentifierModule::class, ApplicationLifecycleModule::class, - SyncStatusModule::class + SyncStatusModule::class, MetricLogSchedulerModule::class ] ) interface TestApplicationComponent : ApplicationComponent { diff --git a/app/src/sharedTest/java/org/oppia/android/app/utility/RatioExtensionsTest.kt b/app/src/sharedTest/java/org/oppia/android/app/utility/RatioExtensionsTest.kt index c9dd3e508cc..3596c8533d1 100644 --- a/app/src/sharedTest/java/org/oppia/android/app/utility/RatioExtensionsTest.kt +++ b/app/src/sharedTest/java/org/oppia/android/app/utility/RatioExtensionsTest.kt @@ -49,7 +49,8 @@ import org.oppia.android.domain.onboarding.ExpirationMetaDataRetrieverModule import org.oppia.android.domain.oppialogger.LogStorageModule import org.oppia.android.domain.oppialogger.LoggingIdentifierModule import org.oppia.android.domain.oppialogger.analytics.ApplicationLifecycleModule -import org.oppia.android.domain.oppialogger.loguploader.LogUploadWorkerModule +import org.oppia.android.domain.oppialogger.logscheduler.MetricLogSchedulerModule +import org.oppia.android.domain.oppialogger.loguploader.LogReportWorkerModule import org.oppia.android.domain.platformparameter.PlatformParameterModule import org.oppia.android.domain.platformparameter.PlatformParameterSingletonModule import org.oppia.android.domain.question.QuestionModule @@ -147,7 +148,7 @@ class RatioExtensionsTest { AccessibilityTestModule::class, LogStorageModule::class, CachingTestModule::class, PrimeTopicAssetsControllerModule::class, ExpirationMetaDataRetrieverModule::class, ViewBindingShimModule::class, RatioInputModule::class, WorkManagerConfigurationModule::class, - ApplicationStartupListenerModule::class, LogUploadWorkerModule::class, + ApplicationStartupListenerModule::class, LogReportWorkerModule::class, HintsAndSolutionConfigModule::class, HintsAndSolutionProdModule::class, FirebaseLogUploaderModule::class, FakeOppiaClockModule::class, PracticeTabModule::class, DeveloperOptionsStarterModule::class, DeveloperOptionsModule::class, @@ -158,7 +159,7 @@ class RatioExtensionsTest { NumericExpressionInputModule::class, AlgebraicExpressionInputModule::class, MathEquationInputModule::class, SplitScreenInteractionModule::class, LoggingIdentifierModule::class, ApplicationLifecycleModule::class, - SyncStatusModule::class + SyncStatusModule::class, MetricLogSchedulerModule::class ] ) interface TestApplicationComponent : ApplicationComponent { diff --git a/app/src/sharedTest/java/org/oppia/android/app/walkthrough/WalkthroughActivityTest.kt b/app/src/sharedTest/java/org/oppia/android/app/walkthrough/WalkthroughActivityTest.kt index 4eca4362df3..cd49b90d400 100644 --- a/app/src/sharedTest/java/org/oppia/android/app/walkthrough/WalkthroughActivityTest.kt +++ b/app/src/sharedTest/java/org/oppia/android/app/walkthrough/WalkthroughActivityTest.kt @@ -62,7 +62,8 @@ import org.oppia.android.domain.onboarding.ExpirationMetaDataRetrieverModule import org.oppia.android.domain.oppialogger.LogStorageModule import org.oppia.android.domain.oppialogger.LoggingIdentifierModule import org.oppia.android.domain.oppialogger.analytics.ApplicationLifecycleModule -import org.oppia.android.domain.oppialogger.loguploader.LogUploadWorkerModule +import org.oppia.android.domain.oppialogger.logscheduler.MetricLogSchedulerModule +import org.oppia.android.domain.oppialogger.loguploader.LogReportWorkerModule import org.oppia.android.domain.platformparameter.PlatformParameterModule import org.oppia.android.domain.platformparameter.PlatformParameterSingletonModule import org.oppia.android.domain.question.QuestionModule @@ -225,7 +226,7 @@ class WalkthroughActivityTest { AccessibilityTestModule::class, LogStorageModule::class, CachingTestModule::class, PrimeTopicAssetsControllerModule::class, ExpirationMetaDataRetrieverModule::class, ViewBindingShimModule::class, RatioInputModule::class, WorkManagerConfigurationModule::class, - ApplicationStartupListenerModule::class, LogUploadWorkerModule::class, + ApplicationStartupListenerModule::class, LogReportWorkerModule::class, HintsAndSolutionConfigModule::class, HintsAndSolutionProdModule::class, FirebaseLogUploaderModule::class, FakeOppiaClockModule::class, PracticeTabModule::class, DeveloperOptionsStarterModule::class, DeveloperOptionsModule::class, @@ -236,7 +237,7 @@ class WalkthroughActivityTest { NumericExpressionInputModule::class, AlgebraicExpressionInputModule::class, MathEquationInputModule::class, SplitScreenInteractionModule::class, LoggingIdentifierModule::class, ApplicationLifecycleModule::class, - SyncStatusModule::class + SyncStatusModule::class, MetricLogSchedulerModule::class ] ) interface TestApplicationComponent : ApplicationComponent { diff --git a/app/src/sharedTest/java/org/oppia/android/app/walkthrough/WalkthroughFinalFragmentTest.kt b/app/src/sharedTest/java/org/oppia/android/app/walkthrough/WalkthroughFinalFragmentTest.kt index 5180aa3350b..7bdea47cd8c 100644 --- a/app/src/sharedTest/java/org/oppia/android/app/walkthrough/WalkthroughFinalFragmentTest.kt +++ b/app/src/sharedTest/java/org/oppia/android/app/walkthrough/WalkthroughFinalFragmentTest.kt @@ -65,7 +65,8 @@ import org.oppia.android.domain.onboarding.ExpirationMetaDataRetrieverModule import org.oppia.android.domain.oppialogger.LogStorageModule import org.oppia.android.domain.oppialogger.LoggingIdentifierModule import org.oppia.android.domain.oppialogger.analytics.ApplicationLifecycleModule -import org.oppia.android.domain.oppialogger.loguploader.LogUploadWorkerModule +import org.oppia.android.domain.oppialogger.logscheduler.MetricLogSchedulerModule +import org.oppia.android.domain.oppialogger.loguploader.LogReportWorkerModule import org.oppia.android.domain.platformparameter.PlatformParameterModule import org.oppia.android.domain.platformparameter.PlatformParameterSingletonModule import org.oppia.android.domain.question.QuestionModule @@ -282,7 +283,7 @@ class WalkthroughFinalFragmentTest { AccessibilityTestModule::class, LogStorageModule::class, CachingTestModule::class, PrimeTopicAssetsControllerModule::class, ExpirationMetaDataRetrieverModule::class, ViewBindingShimModule::class, RatioInputModule::class, WorkManagerConfigurationModule::class, - ApplicationStartupListenerModule::class, LogUploadWorkerModule::class, + ApplicationStartupListenerModule::class, LogReportWorkerModule::class, HintsAndSolutionConfigModule::class, HintsAndSolutionProdModule::class, FirebaseLogUploaderModule::class, FakeOppiaClockModule::class, PracticeTabModule::class, DeveloperOptionsStarterModule::class, DeveloperOptionsModule::class, @@ -293,7 +294,7 @@ class WalkthroughFinalFragmentTest { NumericExpressionInputModule::class, AlgebraicExpressionInputModule::class, MathEquationInputModule::class, SplitScreenInteractionModule::class, LoggingIdentifierModule::class, ApplicationLifecycleModule::class, - SyncStatusModule::class + SyncStatusModule::class, MetricLogSchedulerModule::class ] ) interface TestApplicationComponent : ApplicationComponent { diff --git a/app/src/sharedTest/java/org/oppia/android/app/walkthrough/WalkthroughTopicListFragmentTest.kt b/app/src/sharedTest/java/org/oppia/android/app/walkthrough/WalkthroughTopicListFragmentTest.kt index 7e51303ff99..f334d5e7080 100644 --- a/app/src/sharedTest/java/org/oppia/android/app/walkthrough/WalkthroughTopicListFragmentTest.kt +++ b/app/src/sharedTest/java/org/oppia/android/app/walkthrough/WalkthroughTopicListFragmentTest.kt @@ -66,7 +66,8 @@ import org.oppia.android.domain.onboarding.ExpirationMetaDataRetrieverModule import org.oppia.android.domain.oppialogger.LogStorageModule import org.oppia.android.domain.oppialogger.LoggingIdentifierModule import org.oppia.android.domain.oppialogger.analytics.ApplicationLifecycleModule -import org.oppia.android.domain.oppialogger.loguploader.LogUploadWorkerModule +import org.oppia.android.domain.oppialogger.logscheduler.MetricLogSchedulerModule +import org.oppia.android.domain.oppialogger.loguploader.LogReportWorkerModule import org.oppia.android.domain.platformparameter.PlatformParameterModule import org.oppia.android.domain.platformparameter.PlatformParameterSingletonModule import org.oppia.android.domain.question.QuestionModule @@ -308,7 +309,7 @@ class WalkthroughTopicListFragmentTest { AccessibilityTestModule::class, LogStorageModule::class, PrimeTopicAssetsControllerModule::class, ExpirationMetaDataRetrieverModule::class, ViewBindingShimModule::class, RatioInputModule::class, WorkManagerConfigurationModule::class, - ApplicationStartupListenerModule::class, LogUploadWorkerModule::class, + ApplicationStartupListenerModule::class, LogReportWorkerModule::class, HintsAndSolutionConfigModule::class, HintsAndSolutionProdModule::class, FirebaseLogUploaderModule::class, FakeOppiaClockModule::class, PracticeTabModule::class, DeveloperOptionsStarterModule::class, DeveloperOptionsModule::class, @@ -319,7 +320,7 @@ class WalkthroughTopicListFragmentTest { NumericExpressionInputModule::class, AlgebraicExpressionInputModule::class, MathEquationInputModule::class, SplitScreenInteractionModule::class, LoggingIdentifierModule::class, ApplicationLifecycleModule::class, - SyncStatusModule::class + SyncStatusModule::class, MetricLogSchedulerModule::class ] ) interface TestApplicationComponent : ApplicationComponent { diff --git a/app/src/sharedTest/java/org/oppia/android/app/walkthrough/WalkthroughWelcomeFragmentTest.kt b/app/src/sharedTest/java/org/oppia/android/app/walkthrough/WalkthroughWelcomeFragmentTest.kt index d124e67a7fb..59b4f9f4ca8 100644 --- a/app/src/sharedTest/java/org/oppia/android/app/walkthrough/WalkthroughWelcomeFragmentTest.kt +++ b/app/src/sharedTest/java/org/oppia/android/app/walkthrough/WalkthroughWelcomeFragmentTest.kt @@ -61,7 +61,8 @@ import org.oppia.android.domain.onboarding.ExpirationMetaDataRetrieverModule import org.oppia.android.domain.oppialogger.LogStorageModule import org.oppia.android.domain.oppialogger.LoggingIdentifierModule import org.oppia.android.domain.oppialogger.analytics.ApplicationLifecycleModule -import org.oppia.android.domain.oppialogger.loguploader.LogUploadWorkerModule +import org.oppia.android.domain.oppialogger.logscheduler.MetricLogSchedulerModule +import org.oppia.android.domain.oppialogger.loguploader.LogReportWorkerModule import org.oppia.android.domain.platformparameter.PlatformParameterModule import org.oppia.android.domain.platformparameter.PlatformParameterSingletonModule import org.oppia.android.domain.question.QuestionModule @@ -205,7 +206,7 @@ class WalkthroughWelcomeFragmentTest { AccessibilityTestModule::class, LogStorageModule::class, CachingTestModule::class, PrimeTopicAssetsControllerModule::class, ExpirationMetaDataRetrieverModule::class, ViewBindingShimModule::class, RatioInputModule::class, WorkManagerConfigurationModule::class, - ApplicationStartupListenerModule::class, LogUploadWorkerModule::class, + ApplicationStartupListenerModule::class, LogReportWorkerModule::class, HintsAndSolutionConfigModule::class, HintsAndSolutionProdModule::class, FirebaseLogUploaderModule::class, FakeOppiaClockModule::class, PracticeTabModule::class, DeveloperOptionsStarterModule::class, DeveloperOptionsModule::class, @@ -216,7 +217,7 @@ class WalkthroughWelcomeFragmentTest { NumericExpressionInputModule::class, AlgebraicExpressionInputModule::class, MathEquationInputModule::class, SplitScreenInteractionModule::class, LoggingIdentifierModule::class, ApplicationLifecycleModule::class, - SyncStatusModule::class + SyncStatusModule::class, MetricLogSchedulerModule::class ] ) interface TestApplicationComponent : ApplicationComponent { diff --git a/app/src/test/java/org/oppia/android/app/activity/ActivityIntentFactoriesTest.kt b/app/src/test/java/org/oppia/android/app/activity/ActivityIntentFactoriesTest.kt index 92711443d86..f0491f38b65 100644 --- a/app/src/test/java/org/oppia/android/app/activity/ActivityIntentFactoriesTest.kt +++ b/app/src/test/java/org/oppia/android/app/activity/ActivityIntentFactoriesTest.kt @@ -52,7 +52,8 @@ import org.oppia.android.domain.onboarding.testing.ExpirationMetaDataRetrieverTe import org.oppia.android.domain.oppialogger.LogStorageModule import org.oppia.android.domain.oppialogger.LoggingIdentifierModule import org.oppia.android.domain.oppialogger.analytics.ApplicationLifecycleModule -import org.oppia.android.domain.oppialogger.loguploader.LogUploadWorkerModule +import org.oppia.android.domain.oppialogger.logscheduler.MetricLogSchedulerModule +import org.oppia.android.domain.oppialogger.loguploader.LogReportWorkerModule import org.oppia.android.domain.platformparameter.PlatformParameterModule import org.oppia.android.domain.platformparameter.PlatformParameterSingletonModule import org.oppia.android.domain.question.QuestionModule @@ -171,7 +172,7 @@ class ActivityIntentFactoriesTest { PrimeTopicAssetsControllerModule::class, ExpirationMetaDataRetrieverTestModule::class, ViewBindingShimModule::class, RatioInputModule::class, NetworkConfigProdModule::class, ApplicationStartupListenerModule::class, HintsAndSolutionConfigModule::class, - LogUploadWorkerModule::class, WorkManagerConfigurationModule::class, + LogReportWorkerModule::class, WorkManagerConfigurationModule::class, FirebaseLogUploaderModule::class, FakeOppiaClockModule::class, PracticeTabModule::class, DeveloperOptionsStarterModule::class, DeveloperOptionsModule::class, ExplorationStorageModule::class, NetworkModule::class, HintsAndSolutionProdModule::class, @@ -181,7 +182,7 @@ class ActivityIntentFactoriesTest { NumericExpressionInputModule::class, AlgebraicExpressionInputModule::class, MathEquationInputModule::class, SplitScreenInteractionModule::class, LoggingIdentifierModule::class, ApplicationLifecycleModule::class, - SyncStatusModule::class + SyncStatusModule::class, MetricLogSchedulerModule::class ] ) interface TestApplicationComponent : ApplicationComponent { diff --git a/app/src/test/java/org/oppia/android/app/home/HomeActivityLocalTest.kt b/app/src/test/java/org/oppia/android/app/home/HomeActivityLocalTest.kt index d62ea81ea88..445649d393b 100644 --- a/app/src/test/java/org/oppia/android/app/home/HomeActivityLocalTest.kt +++ b/app/src/test/java/org/oppia/android/app/home/HomeActivityLocalTest.kt @@ -53,7 +53,8 @@ import org.oppia.android.domain.onboarding.ExpirationMetaDataRetrieverModule import org.oppia.android.domain.oppialogger.LogStorageModule import org.oppia.android.domain.oppialogger.LoggingIdentifierModule import org.oppia.android.domain.oppialogger.analytics.ApplicationLifecycleModule -import org.oppia.android.domain.oppialogger.loguploader.LogUploadWorkerModule +import org.oppia.android.domain.oppialogger.logscheduler.MetricLogSchedulerModule +import org.oppia.android.domain.oppialogger.loguploader.LogReportWorkerModule import org.oppia.android.domain.platformparameter.PlatformParameterModule import org.oppia.android.domain.platformparameter.PlatformParameterSingletonModule import org.oppia.android.domain.question.QuestionModule @@ -142,7 +143,7 @@ class HomeActivityLocalTest { ImageClickInputModule::class, LogStorageModule::class, IntentFactoryShimModule::class, ViewBindingShimModule::class, CachingTestModule::class, RatioInputModule::class, PrimeTopicAssetsControllerModule::class, ExpirationMetaDataRetrieverModule::class, - ApplicationStartupListenerModule::class, LogUploadWorkerModule::class, + ApplicationStartupListenerModule::class, LogReportWorkerModule::class, WorkManagerConfigurationModule::class, HintsAndSolutionConfigModule::class, FirebaseLogUploaderModule::class, FakeOppiaClockModule::class, PracticeTabModule::class, DeveloperOptionsStarterModule::class, DeveloperOptionsModule::class, @@ -153,7 +154,7 @@ class HomeActivityLocalTest { AlgebraicExpressionInputModule::class, MathEquationInputModule::class, SplitScreenInteractionModule::class, LoggingIdentifierModule::class, ApplicationLifecycleModule::class, - SyncStatusModule::class + SyncStatusModule::class, MetricLogSchedulerModule::class ] ) interface TestApplicationComponent : ApplicationComponent { diff --git a/app/src/test/java/org/oppia/android/app/parser/FractionParsingUiErrorTest.kt b/app/src/test/java/org/oppia/android/app/parser/FractionParsingUiErrorTest.kt index 1c456d24630..d6cb209d2c1 100644 --- a/app/src/test/java/org/oppia/android/app/parser/FractionParsingUiErrorTest.kt +++ b/app/src/test/java/org/oppia/android/app/parser/FractionParsingUiErrorTest.kt @@ -48,7 +48,8 @@ import org.oppia.android.domain.onboarding.ExpirationMetaDataRetrieverModule import org.oppia.android.domain.oppialogger.LogStorageModule import org.oppia.android.domain.oppialogger.LoggingIdentifierModule import org.oppia.android.domain.oppialogger.analytics.ApplicationLifecycleModule -import org.oppia.android.domain.oppialogger.loguploader.LogUploadWorkerModule +import org.oppia.android.domain.oppialogger.logscheduler.MetricLogSchedulerModule +import org.oppia.android.domain.oppialogger.loguploader.LogReportWorkerModule import org.oppia.android.domain.platformparameter.PlatformParameterModule import org.oppia.android.domain.platformparameter.PlatformParameterSingletonModule import org.oppia.android.domain.question.QuestionModule @@ -253,7 +254,7 @@ class FractionParsingUiErrorTest { AccessibilityTestModule::class, LogStorageModule::class, CachingTestModule::class, PrimeTopicAssetsControllerModule::class, ExpirationMetaDataRetrieverModule::class, ViewBindingShimModule::class, RatioInputModule::class, WorkManagerConfigurationModule::class, - ApplicationStartupListenerModule::class, LogUploadWorkerModule::class, + ApplicationStartupListenerModule::class, LogReportWorkerModule::class, HintsAndSolutionConfigModule::class, HintsAndSolutionProdModule::class, FirebaseLogUploaderModule::class, FakeOppiaClockModule::class, PracticeTabModule::class, DeveloperOptionsStarterModule::class, DeveloperOptionsModule::class, @@ -263,7 +264,7 @@ class FractionParsingUiErrorTest { NumericExpressionInputModule::class, AlgebraicExpressionInputModule::class, MathEquationInputModule::class, SplitScreenInteractionModule::class, LoggingIdentifierModule::class, ApplicationLifecycleModule::class, - SyncStatusModule::class + SyncStatusModule::class, MetricLogSchedulerModule::class ] ) interface TestApplicationComponent : ApplicationComponent { diff --git a/app/src/test/java/org/oppia/android/app/parser/StringToRatioParserTest.kt b/app/src/test/java/org/oppia/android/app/parser/StringToRatioParserTest.kt index 27063d77e1f..73ab39d434f 100644 --- a/app/src/test/java/org/oppia/android/app/parser/StringToRatioParserTest.kt +++ b/app/src/test/java/org/oppia/android/app/parser/StringToRatioParserTest.kt @@ -49,7 +49,8 @@ import org.oppia.android.domain.onboarding.ExpirationMetaDataRetrieverModule import org.oppia.android.domain.oppialogger.LogStorageModule import org.oppia.android.domain.oppialogger.LoggingIdentifierModule import org.oppia.android.domain.oppialogger.analytics.ApplicationLifecycleModule -import org.oppia.android.domain.oppialogger.loguploader.LogUploadWorkerModule +import org.oppia.android.domain.oppialogger.logscheduler.MetricLogSchedulerModule +import org.oppia.android.domain.oppialogger.loguploader.LogReportWorkerModule import org.oppia.android.domain.platformparameter.PlatformParameterModule import org.oppia.android.domain.platformparameter.PlatformParameterSingletonModule import org.oppia.android.domain.question.QuestionModule @@ -257,7 +258,7 @@ class StringToRatioParserTest { AccessibilityTestModule::class, LogStorageModule::class, CachingTestModule::class, PrimeTopicAssetsControllerModule::class, ExpirationMetaDataRetrieverModule::class, ViewBindingShimModule::class, RatioInputModule::class, WorkManagerConfigurationModule::class, - ApplicationStartupListenerModule::class, LogUploadWorkerModule::class, + ApplicationStartupListenerModule::class, LogReportWorkerModule::class, HintsAndSolutionConfigModule::class, HintsAndSolutionProdModule::class, FirebaseLogUploaderModule::class, FakeOppiaClockModule::class, PracticeTabModule::class, DeveloperOptionsStarterModule::class, DeveloperOptionsModule::class, @@ -267,7 +268,7 @@ class StringToRatioParserTest { NumericExpressionInputModule::class, AlgebraicExpressionInputModule::class, MathEquationInputModule::class, SplitScreenInteractionModule::class, LoggingIdentifierModule::class, ApplicationLifecycleModule::class, - SyncStatusModule::class + SyncStatusModule::class, MetricLogSchedulerModule::class ] ) interface TestApplicationComponent : ApplicationComponent { diff --git a/app/src/test/java/org/oppia/android/app/player/exploration/ExplorationActivityLocalTest.kt b/app/src/test/java/org/oppia/android/app/player/exploration/ExplorationActivityLocalTest.kt index 360220da811..1c875e82863 100644 --- a/app/src/test/java/org/oppia/android/app/player/exploration/ExplorationActivityLocalTest.kt +++ b/app/src/test/java/org/oppia/android/app/player/exploration/ExplorationActivityLocalTest.kt @@ -54,7 +54,8 @@ import org.oppia.android.domain.onboarding.ExpirationMetaDataRetrieverModule import org.oppia.android.domain.oppialogger.LogStorageModule import org.oppia.android.domain.oppialogger.LoggingIdentifierModule import org.oppia.android.domain.oppialogger.analytics.ApplicationLifecycleModule -import org.oppia.android.domain.oppialogger.loguploader.LogUploadWorkerModule +import org.oppia.android.domain.oppialogger.logscheduler.MetricLogSchedulerModule +import org.oppia.android.domain.oppialogger.loguploader.LogReportWorkerModule import org.oppia.android.domain.platformparameter.PlatformParameterModule import org.oppia.android.domain.platformparameter.PlatformParameterSingletonModule import org.oppia.android.domain.question.QuestionModule @@ -203,7 +204,7 @@ class ExplorationActivityLocalTest { ImageClickInputModule::class, LogStorageModule::class, IntentFactoryShimModule::class, ViewBindingShimModule::class, CachingTestModule::class, RatioInputModule::class, PrimeTopicAssetsControllerModule::class, ExpirationMetaDataRetrieverModule::class, - ApplicationStartupListenerModule::class, LogUploadWorkerModule::class, + ApplicationStartupListenerModule::class, LogReportWorkerModule::class, WorkManagerConfigurationModule::class, HintsAndSolutionConfigModule::class, FirebaseLogUploaderModule::class, FakeOppiaClockModule::class, PracticeTabModule::class, DeveloperOptionsStarterModule::class, DeveloperOptionsModule::class, @@ -214,7 +215,7 @@ class ExplorationActivityLocalTest { AlgebraicExpressionInputModule::class, MathEquationInputModule::class, SplitScreenInteractionModule::class, LoggingIdentifierModule::class, ApplicationLifecycleModule::class, - SyncStatusModule::class + SyncStatusModule::class, MetricLogSchedulerModule::class ] ) interface TestApplicationComponent : ApplicationComponent { diff --git a/app/src/test/java/org/oppia/android/app/player/state/StateFragmentLocalTest.kt b/app/src/test/java/org/oppia/android/app/player/state/StateFragmentLocalTest.kt index 5589132a0f7..30849532780 100644 --- a/app/src/test/java/org/oppia/android/app/player/state/StateFragmentLocalTest.kt +++ b/app/src/test/java/org/oppia/android/app/player/state/StateFragmentLocalTest.kt @@ -108,7 +108,8 @@ import org.oppia.android.domain.onboarding.ExpirationMetaDataRetrieverModule import org.oppia.android.domain.oppialogger.LogStorageModule import org.oppia.android.domain.oppialogger.LoggingIdentifierModule import org.oppia.android.domain.oppialogger.analytics.ApplicationLifecycleModule -import org.oppia.android.domain.oppialogger.loguploader.LogUploadWorkerModule +import org.oppia.android.domain.oppialogger.logscheduler.MetricLogSchedulerModule +import org.oppia.android.domain.oppialogger.loguploader.LogReportWorkerModule import org.oppia.android.domain.platformparameter.PlatformParameterModule import org.oppia.android.domain.platformparameter.PlatformParameterSingletonModule import org.oppia.android.domain.question.QuestionModule @@ -2286,7 +2287,7 @@ class StateFragmentLocalTest { AccessibilityTestModule::class, LogStorageModule::class, PrimeTopicAssetsControllerModule::class, ExpirationMetaDataRetrieverModule::class, ViewBindingShimModule::class, RatioInputModule::class, WorkManagerConfigurationModule::class, - ApplicationStartupListenerModule::class, LogUploadWorkerModule::class, + ApplicationStartupListenerModule::class, LogReportWorkerModule::class, HintsAndSolutionConfigModule::class, HintsAndSolutionProdModule::class, FirebaseLogUploaderModule::class, FakeOppiaClockModule::class, PracticeTabModule::class, DeveloperOptionsStarterModule::class, DeveloperOptionsModule::class, @@ -2296,7 +2297,7 @@ class StateFragmentLocalTest { NumericExpressionInputModule::class, AlgebraicExpressionInputModule::class, MathEquationInputModule::class, SplitScreenInteractionModule::class, LoggingIdentifierModule::class, ApplicationLifecycleModule::class, - SyncStatusModule::class + SyncStatusModule::class, MetricLogSchedulerModule::class ] ) interface TestApplicationComponent : ApplicationComponent { diff --git a/app/src/test/java/org/oppia/android/app/profile/ProfileChooserFragmentLocalTest.kt b/app/src/test/java/org/oppia/android/app/profile/ProfileChooserFragmentLocalTest.kt index 9831c6fe66f..df5ab8f58d0 100644 --- a/app/src/test/java/org/oppia/android/app/profile/ProfileChooserFragmentLocalTest.kt +++ b/app/src/test/java/org/oppia/android/app/profile/ProfileChooserFragmentLocalTest.kt @@ -50,7 +50,8 @@ import org.oppia.android.domain.onboarding.ExpirationMetaDataRetrieverModule import org.oppia.android.domain.oppialogger.LogStorageModule import org.oppia.android.domain.oppialogger.LoggingIdentifierModule import org.oppia.android.domain.oppialogger.analytics.ApplicationLifecycleModule -import org.oppia.android.domain.oppialogger.loguploader.LogUploadWorkerModule +import org.oppia.android.domain.oppialogger.logscheduler.MetricLogSchedulerModule +import org.oppia.android.domain.oppialogger.loguploader.LogReportWorkerModule import org.oppia.android.domain.platformparameter.PlatformParameterModule import org.oppia.android.domain.platformparameter.PlatformParameterSingletonModule import org.oppia.android.domain.question.QuestionModule @@ -133,7 +134,7 @@ class ProfileChooserFragmentLocalTest { PrimeTopicAssetsControllerModule::class, ExpirationMetaDataRetrieverModule::class, ViewBindingShimModule::class, RatioInputModule::class, NetworkConfigProdModule::class, ApplicationStartupListenerModule::class, HintsAndSolutionConfigModule::class, - LogUploadWorkerModule::class, WorkManagerConfigurationModule::class, + LogReportWorkerModule::class, WorkManagerConfigurationModule::class, FirebaseLogUploaderModule::class, FakeOppiaClockModule::class, PracticeTabModule::class, DeveloperOptionsStarterModule::class, DeveloperOptionsModule::class, ExplorationStorageModule::class, NetworkModule::class, HintsAndSolutionProdModule::class, @@ -142,7 +143,7 @@ class ProfileChooserFragmentLocalTest { NumericExpressionInputModule::class, AlgebraicExpressionInputModule::class, MathEquationInputModule::class, SplitScreenInteractionModule::class, LoggingIdentifierModule::class, ApplicationLifecycleModule::class, - SyncStatusModule::class + SyncStatusModule::class, MetricLogSchedulerModule::class ] ) interface TestApplicationComponent : ApplicationComponent { diff --git a/app/src/test/java/org/oppia/android/app/story/StoryActivityLocalTest.kt b/app/src/test/java/org/oppia/android/app/story/StoryActivityLocalTest.kt index ebca8ce96a5..5d9cc5e3e75 100644 --- a/app/src/test/java/org/oppia/android/app/story/StoryActivityLocalTest.kt +++ b/app/src/test/java/org/oppia/android/app/story/StoryActivityLocalTest.kt @@ -52,7 +52,8 @@ import org.oppia.android.domain.onboarding.ExpirationMetaDataRetrieverModule import org.oppia.android.domain.oppialogger.LogStorageModule import org.oppia.android.domain.oppialogger.LoggingIdentifierModule import org.oppia.android.domain.oppialogger.analytics.ApplicationLifecycleModule -import org.oppia.android.domain.oppialogger.loguploader.LogUploadWorkerModule +import org.oppia.android.domain.oppialogger.logscheduler.MetricLogSchedulerModule +import org.oppia.android.domain.oppialogger.loguploader.LogReportWorkerModule import org.oppia.android.domain.platformparameter.PlatformParameterModule import org.oppia.android.domain.platformparameter.PlatformParameterSingletonModule import org.oppia.android.domain.question.QuestionModule @@ -157,7 +158,7 @@ class StoryActivityLocalTest { ImageClickInputModule::class, LogStorageModule::class, CachingTestModule::class, PrimeTopicAssetsControllerModule::class, ExpirationMetaDataRetrieverModule::class, ViewBindingShimModule::class, RatioInputModule::class, WorkManagerConfigurationModule::class, - ApplicationStartupListenerModule::class, LogUploadWorkerModule::class, + ApplicationStartupListenerModule::class, LogReportWorkerModule::class, HintsAndSolutionConfigModule::class, HintsAndSolutionProdModule::class, FirebaseLogUploaderModule::class, FakeOppiaClockModule::class, PracticeTabModule::class, DeveloperOptionsStarterModule::class, DeveloperOptionsModule::class, @@ -167,7 +168,7 @@ class StoryActivityLocalTest { NumericExpressionInputModule::class, AlgebraicExpressionInputModule::class, MathEquationInputModule::class, SplitScreenInteractionModule::class, LoggingIdentifierModule::class, ApplicationLifecycleModule::class, - SyncStatusModule::class + SyncStatusModule::class, MetricLogSchedulerModule::class ] ) interface TestApplicationComponent : ApplicationComponent { diff --git a/app/src/test/java/org/oppia/android/app/testing/CompletedStoryListSpanTest.kt b/app/src/test/java/org/oppia/android/app/testing/CompletedStoryListSpanTest.kt index 724a72ab179..86a05a175dc 100644 --- a/app/src/test/java/org/oppia/android/app/testing/CompletedStoryListSpanTest.kt +++ b/app/src/test/java/org/oppia/android/app/testing/CompletedStoryListSpanTest.kt @@ -54,7 +54,8 @@ import org.oppia.android.domain.onboarding.ExpirationMetaDataRetrieverModule import org.oppia.android.domain.oppialogger.LogStorageModule import org.oppia.android.domain.oppialogger.LoggingIdentifierModule import org.oppia.android.domain.oppialogger.analytics.ApplicationLifecycleModule -import org.oppia.android.domain.oppialogger.loguploader.LogUploadWorkerModule +import org.oppia.android.domain.oppialogger.logscheduler.MetricLogSchedulerModule +import org.oppia.android.domain.oppialogger.loguploader.LogReportWorkerModule import org.oppia.android.domain.platformparameter.PlatformParameterModule import org.oppia.android.domain.platformparameter.PlatformParameterSingletonModule import org.oppia.android.domain.question.QuestionModule @@ -165,7 +166,7 @@ class CompletedStoryListSpanTest { ImageClickInputModule::class, LogStorageModule::class, IntentFactoryShimModule::class, ViewBindingShimModule::class, CachingTestModule::class, RatioInputModule::class, PrimeTopicAssetsControllerModule::class, ExpirationMetaDataRetrieverModule::class, - ApplicationStartupListenerModule::class, LogUploadWorkerModule::class, + ApplicationStartupListenerModule::class, LogReportWorkerModule::class, WorkManagerConfigurationModule::class, HintsAndSolutionConfigModule::class, FirebaseLogUploaderModule::class, FakeOppiaClockModule::class, PracticeTabModule::class, DeveloperOptionsStarterModule::class, DeveloperOptionsModule::class, @@ -176,7 +177,7 @@ class CompletedStoryListSpanTest { AlgebraicExpressionInputModule::class, MathEquationInputModule::class, SplitScreenInteractionModule::class, LoggingIdentifierModule::class, ApplicationLifecycleModule::class, - SyncStatusModule::class + SyncStatusModule::class, MetricLogSchedulerModule::class ] ) interface TestApplicationComponent : ApplicationComponent { diff --git a/app/src/test/java/org/oppia/android/app/testing/HomeSpanTest.kt b/app/src/test/java/org/oppia/android/app/testing/HomeSpanTest.kt index db17bd4e90e..83e920a77bd 100644 --- a/app/src/test/java/org/oppia/android/app/testing/HomeSpanTest.kt +++ b/app/src/test/java/org/oppia/android/app/testing/HomeSpanTest.kt @@ -54,7 +54,8 @@ import org.oppia.android.domain.onboarding.ExpirationMetaDataRetrieverModule import org.oppia.android.domain.oppialogger.LogStorageModule import org.oppia.android.domain.oppialogger.LoggingIdentifierModule import org.oppia.android.domain.oppialogger.analytics.ApplicationLifecycleModule -import org.oppia.android.domain.oppialogger.loguploader.LogUploadWorkerModule +import org.oppia.android.domain.oppialogger.logscheduler.MetricLogSchedulerModule +import org.oppia.android.domain.oppialogger.loguploader.LogReportWorkerModule import org.oppia.android.domain.platformparameter.PlatformParameterModule import org.oppia.android.domain.platformparameter.PlatformParameterSingletonModule import org.oppia.android.domain.question.QuestionModule @@ -179,7 +180,7 @@ class HomeSpanTest { ImageClickInputModule::class, LogStorageModule::class, IntentFactoryShimModule::class, ViewBindingShimModule::class, CachingTestModule::class, RatioInputModule::class, PrimeTopicAssetsControllerModule::class, ExpirationMetaDataRetrieverModule::class, - ApplicationStartupListenerModule::class, LogUploadWorkerModule::class, + ApplicationStartupListenerModule::class, LogReportWorkerModule::class, WorkManagerConfigurationModule::class, HintsAndSolutionConfigModule::class, FirebaseLogUploaderModule::class, FakeOppiaClockModule::class, PracticeTabModule::class, DeveloperOptionsStarterModule::class, DeveloperOptionsModule::class, @@ -190,7 +191,7 @@ class HomeSpanTest { AlgebraicExpressionInputModule::class, MathEquationInputModule::class, SplitScreenInteractionModule::class, LoggingIdentifierModule::class, ApplicationLifecycleModule::class, - SyncStatusModule::class + SyncStatusModule::class, MetricLogSchedulerModule::class ] ) interface TestApplicationComponent : ApplicationComponent { diff --git a/app/src/test/java/org/oppia/android/app/testing/OngoingTopicListSpanTest.kt b/app/src/test/java/org/oppia/android/app/testing/OngoingTopicListSpanTest.kt index e1940a4ff1a..fc6c6aff74e 100644 --- a/app/src/test/java/org/oppia/android/app/testing/OngoingTopicListSpanTest.kt +++ b/app/src/test/java/org/oppia/android/app/testing/OngoingTopicListSpanTest.kt @@ -55,7 +55,8 @@ import org.oppia.android.domain.onboarding.ExpirationMetaDataRetrieverModule import org.oppia.android.domain.oppialogger.LogStorageModule import org.oppia.android.domain.oppialogger.LoggingIdentifierModule import org.oppia.android.domain.oppialogger.analytics.ApplicationLifecycleModule -import org.oppia.android.domain.oppialogger.loguploader.LogUploadWorkerModule +import org.oppia.android.domain.oppialogger.logscheduler.MetricLogSchedulerModule +import org.oppia.android.domain.oppialogger.loguploader.LogReportWorkerModule import org.oppia.android.domain.platformparameter.PlatformParameterModule import org.oppia.android.domain.platformparameter.PlatformParameterSingletonModule import org.oppia.android.domain.question.QuestionModule @@ -176,7 +177,7 @@ class OngoingTopicListSpanTest { ImageClickInputModule::class, LogStorageModule::class, IntentFactoryShimModule::class, ViewBindingShimModule::class, CachingTestModule::class, RatioInputModule::class, PrimeTopicAssetsControllerModule::class, ExpirationMetaDataRetrieverModule::class, - ApplicationStartupListenerModule::class, LogUploadWorkerModule::class, + ApplicationStartupListenerModule::class, LogReportWorkerModule::class, WorkManagerConfigurationModule::class, HintsAndSolutionConfigModule::class, FirebaseLogUploaderModule::class, FakeOppiaClockModule::class, PracticeTabModule::class, DeveloperOptionsStarterModule::class, DeveloperOptionsModule::class, @@ -187,7 +188,7 @@ class OngoingTopicListSpanTest { AlgebraicExpressionInputModule::class, MathEquationInputModule::class, SplitScreenInteractionModule::class, LoggingIdentifierModule::class, ApplicationLifecycleModule::class, - SyncStatusModule::class + SyncStatusModule::class, MetricLogSchedulerModule::class ] ) interface TestApplicationComponent : ApplicationComponent { diff --git a/app/src/test/java/org/oppia/android/app/testing/PlatformParameterIntegrationTest.kt b/app/src/test/java/org/oppia/android/app/testing/PlatformParameterIntegrationTest.kt index 6a6e051cc77..5d30677deb7 100644 --- a/app/src/test/java/org/oppia/android/app/testing/PlatformParameterIntegrationTest.kt +++ b/app/src/test/java/org/oppia/android/app/testing/PlatformParameterIntegrationTest.kt @@ -68,7 +68,8 @@ import org.oppia.android.domain.onboarding.ExpirationMetaDataRetrieverModule import org.oppia.android.domain.oppialogger.LogStorageModule import org.oppia.android.domain.oppialogger.LoggingIdentifierModule import org.oppia.android.domain.oppialogger.analytics.ApplicationLifecycleModule -import org.oppia.android.domain.oppialogger.loguploader.LogUploadWorkerModule +import org.oppia.android.domain.oppialogger.logscheduler.MetricLogSchedulerModule +import org.oppia.android.domain.oppialogger.loguploader.LogReportWorkerModule import org.oppia.android.domain.platformparameter.PlatformParameterController import org.oppia.android.domain.platformparameter.PlatformParameterModule import org.oppia.android.domain.platformparameter.PlatformParameterSingletonModule @@ -349,7 +350,7 @@ class PlatformParameterIntegrationTest { AccessibilityTestModule::class, LogStorageModule::class, CachingTestModule::class, PrimeTopicAssetsControllerModule::class, ExpirationMetaDataRetrieverModule::class, ViewBindingShimModule::class, RatioInputModule::class, WorkManagerConfigurationModule::class, - ApplicationStartupListenerModule::class, LogUploadWorkerModule::class, + ApplicationStartupListenerModule::class, LogReportWorkerModule::class, HintsAndSolutionConfigModule::class, HintsAndSolutionProdModule::class, FirebaseLogUploaderModule::class, FakeOppiaClockModule::class, PracticeTabModule::class, DeveloperOptionsStarterModule::class, DeveloperOptionsModule::class, @@ -360,7 +361,7 @@ class PlatformParameterIntegrationTest { NumericExpressionInputModule::class, AlgebraicExpressionInputModule::class, MathEquationInputModule::class, SplitScreenInteractionModule::class, LoggingIdentifierModule::class, ApplicationLifecycleModule::class, - SyncStatusModule::class + SyncStatusModule::class, MetricLogSchedulerModule::class ] ) interface TestApplicationComponent : ApplicationComponent { diff --git a/app/src/test/java/org/oppia/android/app/testing/ProfileChooserSpanTest.kt b/app/src/test/java/org/oppia/android/app/testing/ProfileChooserSpanTest.kt index 9b0988a43ed..ac18c7ff49f 100644 --- a/app/src/test/java/org/oppia/android/app/testing/ProfileChooserSpanTest.kt +++ b/app/src/test/java/org/oppia/android/app/testing/ProfileChooserSpanTest.kt @@ -53,7 +53,8 @@ import org.oppia.android.domain.onboarding.ExpirationMetaDataRetrieverModule import org.oppia.android.domain.oppialogger.LogStorageModule import org.oppia.android.domain.oppialogger.LoggingIdentifierModule import org.oppia.android.domain.oppialogger.analytics.ApplicationLifecycleModule -import org.oppia.android.domain.oppialogger.loguploader.LogUploadWorkerModule +import org.oppia.android.domain.oppialogger.logscheduler.MetricLogSchedulerModule +import org.oppia.android.domain.oppialogger.loguploader.LogReportWorkerModule import org.oppia.android.domain.platformparameter.PlatformParameterModule import org.oppia.android.domain.platformparameter.PlatformParameterSingletonModule import org.oppia.android.domain.question.QuestionModule @@ -378,7 +379,7 @@ class ProfileChooserSpanTest { ImageClickInputModule::class, LogStorageModule::class, IntentFactoryShimModule::class, ViewBindingShimModule::class, CachingTestModule::class, RatioInputModule::class, PrimeTopicAssetsControllerModule::class, ExpirationMetaDataRetrieverModule::class, - ApplicationStartupListenerModule::class, LogUploadWorkerModule::class, + ApplicationStartupListenerModule::class, LogReportWorkerModule::class, WorkManagerConfigurationModule::class, HintsAndSolutionConfigModule::class, FirebaseLogUploaderModule::class, FakeOppiaClockModule::class, PracticeTabModule::class, DeveloperOptionsStarterModule::class, DeveloperOptionsModule::class, @@ -389,7 +390,7 @@ class ProfileChooserSpanTest { AlgebraicExpressionInputModule::class, MathEquationInputModule::class, SplitScreenInteractionModule::class, LoggingIdentifierModule::class, ApplicationLifecycleModule::class, - SyncStatusModule::class + SyncStatusModule::class, MetricLogSchedulerModule::class ] ) interface TestApplicationComponent : ApplicationComponent { diff --git a/app/src/test/java/org/oppia/android/app/testing/ProfileProgressSpanCountTest.kt b/app/src/test/java/org/oppia/android/app/testing/ProfileProgressSpanCountTest.kt index ddb8bf06ac8..7b515278346 100644 --- a/app/src/test/java/org/oppia/android/app/testing/ProfileProgressSpanCountTest.kt +++ b/app/src/test/java/org/oppia/android/app/testing/ProfileProgressSpanCountTest.kt @@ -54,7 +54,8 @@ import org.oppia.android.domain.onboarding.ExpirationMetaDataRetrieverModule import org.oppia.android.domain.oppialogger.LogStorageModule import org.oppia.android.domain.oppialogger.LoggingIdentifierModule import org.oppia.android.domain.oppialogger.analytics.ApplicationLifecycleModule -import org.oppia.android.domain.oppialogger.loguploader.LogUploadWorkerModule +import org.oppia.android.domain.oppialogger.logscheduler.MetricLogSchedulerModule +import org.oppia.android.domain.oppialogger.loguploader.LogReportWorkerModule import org.oppia.android.domain.platformparameter.PlatformParameterModule import org.oppia.android.domain.platformparameter.PlatformParameterSingletonModule import org.oppia.android.domain.question.QuestionModule @@ -162,7 +163,7 @@ class ProfileProgressSpanCountTest { ImageClickInputModule::class, LogStorageModule::class, IntentFactoryShimModule::class, ViewBindingShimModule::class, CachingTestModule::class, RatioInputModule::class, PrimeTopicAssetsControllerModule::class, ExpirationMetaDataRetrieverModule::class, - ApplicationStartupListenerModule::class, LogUploadWorkerModule::class, + ApplicationStartupListenerModule::class, LogReportWorkerModule::class, WorkManagerConfigurationModule::class, HintsAndSolutionConfigModule::class, FirebaseLogUploaderModule::class, FakeOppiaClockModule::class, PracticeTabModule::class, DeveloperOptionsStarterModule::class, DeveloperOptionsModule::class, @@ -173,7 +174,7 @@ class ProfileProgressSpanCountTest { AlgebraicExpressionInputModule::class, MathEquationInputModule::class, SplitScreenInteractionModule::class, LoggingIdentifierModule::class, ApplicationLifecycleModule::class, - SyncStatusModule::class + SyncStatusModule::class, MetricLogSchedulerModule::class ] ) interface TestApplicationComponent : ApplicationComponent { diff --git a/app/src/test/java/org/oppia/android/app/testing/RecentlyPlayedSpanTest.kt b/app/src/test/java/org/oppia/android/app/testing/RecentlyPlayedSpanTest.kt index 493ac5ce52b..4571ab23451 100644 --- a/app/src/test/java/org/oppia/android/app/testing/RecentlyPlayedSpanTest.kt +++ b/app/src/test/java/org/oppia/android/app/testing/RecentlyPlayedSpanTest.kt @@ -56,7 +56,8 @@ import org.oppia.android.domain.onboarding.ExpirationMetaDataRetrieverModule import org.oppia.android.domain.oppialogger.LogStorageModule import org.oppia.android.domain.oppialogger.LoggingIdentifierModule import org.oppia.android.domain.oppialogger.analytics.ApplicationLifecycleModule -import org.oppia.android.domain.oppialogger.loguploader.LogUploadWorkerModule +import org.oppia.android.domain.oppialogger.logscheduler.MetricLogSchedulerModule +import org.oppia.android.domain.oppialogger.loguploader.LogReportWorkerModule import org.oppia.android.domain.platformparameter.PlatformParameterModule import org.oppia.android.domain.platformparameter.PlatformParameterSingletonModule import org.oppia.android.domain.question.QuestionModule @@ -297,7 +298,7 @@ class RecentlyPlayedSpanTest { ImageClickInputModule::class, LogStorageModule::class, IntentFactoryShimModule::class, ViewBindingShimModule::class, CachingTestModule::class, RatioInputModule::class, PrimeTopicAssetsControllerModule::class, ExpirationMetaDataRetrieverModule::class, - ApplicationStartupListenerModule::class, LogUploadWorkerModule::class, + ApplicationStartupListenerModule::class, LogReportWorkerModule::class, WorkManagerConfigurationModule::class, HintsAndSolutionConfigModule::class, FirebaseLogUploaderModule::class, FakeOppiaClockModule::class, PracticeTabModule::class, DeveloperOptionsStarterModule::class, DeveloperOptionsModule::class, @@ -308,7 +309,7 @@ class RecentlyPlayedSpanTest { AlgebraicExpressionInputModule::class, MathEquationInputModule::class, SplitScreenInteractionModule::class, LoggingIdentifierModule::class, ApplicationLifecycleModule::class, - SyncStatusModule::class + SyncStatusModule::class, MetricLogSchedulerModule::class ] ) interface TestApplicationComponent : ApplicationComponent { diff --git a/app/src/test/java/org/oppia/android/app/testing/TopicRevisionSpanTest.kt b/app/src/test/java/org/oppia/android/app/testing/TopicRevisionSpanTest.kt index edf710c64b4..9ea7e810383 100644 --- a/app/src/test/java/org/oppia/android/app/testing/TopicRevisionSpanTest.kt +++ b/app/src/test/java/org/oppia/android/app/testing/TopicRevisionSpanTest.kt @@ -53,7 +53,8 @@ import org.oppia.android.domain.onboarding.ExpirationMetaDataRetrieverModule import org.oppia.android.domain.oppialogger.LogStorageModule import org.oppia.android.domain.oppialogger.LoggingIdentifierModule import org.oppia.android.domain.oppialogger.analytics.ApplicationLifecycleModule -import org.oppia.android.domain.oppialogger.loguploader.LogUploadWorkerModule +import org.oppia.android.domain.oppialogger.logscheduler.MetricLogSchedulerModule +import org.oppia.android.domain.oppialogger.loguploader.LogReportWorkerModule import org.oppia.android.domain.platformparameter.PlatformParameterModule import org.oppia.android.domain.platformparameter.PlatformParameterSingletonModule import org.oppia.android.domain.question.QuestionModule @@ -162,7 +163,7 @@ class TopicRevisionSpanTest { ImageClickInputModule::class, LogStorageModule::class, IntentFactoryShimModule::class, ViewBindingShimModule::class, CachingTestModule::class, RatioInputModule::class, PrimeTopicAssetsControllerModule::class, ExpirationMetaDataRetrieverModule::class, - ApplicationStartupListenerModule::class, LogUploadWorkerModule::class, + ApplicationStartupListenerModule::class, LogReportWorkerModule::class, WorkManagerConfigurationModule::class, HintsAndSolutionConfigModule::class, FirebaseLogUploaderModule::class, FakeOppiaClockModule::class, PracticeTabModule::class, DeveloperOptionsStarterModule::class, DeveloperOptionsModule::class, @@ -173,7 +174,7 @@ class TopicRevisionSpanTest { AlgebraicExpressionInputModule::class, MathEquationInputModule::class, SplitScreenInteractionModule::class, LoggingIdentifierModule::class, ApplicationLifecycleModule::class, - SyncStatusModule::class + SyncStatusModule::class, MetricLogSchedulerModule::class ] ) interface TestApplicationComponent : ApplicationComponent { diff --git a/app/src/test/java/org/oppia/android/app/testing/activity/TestActivityTest.kt b/app/src/test/java/org/oppia/android/app/testing/activity/TestActivityTest.kt index 1866c48e456..bb510bd60c1 100644 --- a/app/src/test/java/org/oppia/android/app/testing/activity/TestActivityTest.kt +++ b/app/src/test/java/org/oppia/android/app/testing/activity/TestActivityTest.kt @@ -50,7 +50,8 @@ import org.oppia.android.domain.onboarding.testing.ExpirationMetaDataRetrieverTe import org.oppia.android.domain.oppialogger.LogStorageModule import org.oppia.android.domain.oppialogger.LoggingIdentifierModule import org.oppia.android.domain.oppialogger.analytics.ApplicationLifecycleModule -import org.oppia.android.domain.oppialogger.loguploader.LogUploadWorkerModule +import org.oppia.android.domain.oppialogger.logscheduler.MetricLogSchedulerModule +import org.oppia.android.domain.oppialogger.loguploader.LogReportWorkerModule import org.oppia.android.domain.platformparameter.PlatformParameterModule import org.oppia.android.domain.platformparameter.PlatformParameterSingletonModule import org.oppia.android.domain.question.QuestionModule @@ -188,7 +189,7 @@ class TestActivityTest { PrimeTopicAssetsControllerModule::class, ExpirationMetaDataRetrieverTestModule::class, ViewBindingShimModule::class, RatioInputModule::class, NetworkConfigProdModule::class, ApplicationStartupListenerModule::class, HintsAndSolutionConfigModule::class, - LogUploadWorkerModule::class, WorkManagerConfigurationModule::class, + LogReportWorkerModule::class, WorkManagerConfigurationModule::class, FirebaseLogUploaderModule::class, FakeOppiaClockModule::class, PracticeTabModule::class, DeveloperOptionsStarterModule::class, DeveloperOptionsModule::class, ExplorationStorageModule::class, NetworkModule::class, HintsAndSolutionProdModule::class, @@ -198,7 +199,7 @@ class TestActivityTest { NumericExpressionInputModule::class, AlgebraicExpressionInputModule::class, MathEquationInputModule::class, SplitScreenInteractionModule::class, LoggingIdentifierModule::class, ApplicationLifecycleModule::class, - SyncStatusModule::class + SyncStatusModule::class, MetricLogSchedulerModule::class ] ) interface TestApplicationComponent : ApplicationComponent { diff --git a/app/src/test/java/org/oppia/android/app/testing/administratorcontrols/AdministratorControlsFragmentTest.kt b/app/src/test/java/org/oppia/android/app/testing/administratorcontrols/AdministratorControlsFragmentTest.kt index 14ce543faa6..1f95d05540e 100644 --- a/app/src/test/java/org/oppia/android/app/testing/administratorcontrols/AdministratorControlsFragmentTest.kt +++ b/app/src/test/java/org/oppia/android/app/testing/administratorcontrols/AdministratorControlsFragmentTest.kt @@ -60,7 +60,8 @@ import org.oppia.android.domain.onboarding.ExpirationMetaDataRetrieverModule import org.oppia.android.domain.oppialogger.LogStorageModule import org.oppia.android.domain.oppialogger.LoggingIdentifierModule import org.oppia.android.domain.oppialogger.analytics.ApplicationLifecycleModule -import org.oppia.android.domain.oppialogger.loguploader.LogUploadWorkerModule +import org.oppia.android.domain.oppialogger.logscheduler.MetricLogSchedulerModule +import org.oppia.android.domain.oppialogger.loguploader.LogReportWorkerModule import org.oppia.android.domain.platformparameter.PlatformParameterModule import org.oppia.android.domain.platformparameter.PlatformParameterSingletonModule import org.oppia.android.domain.question.QuestionModule @@ -187,7 +188,7 @@ class AdministratorControlsFragmentTest { AccessibilityTestModule::class, LogStorageModule::class, CachingTestModule::class, PrimeTopicAssetsControllerModule::class, ExpirationMetaDataRetrieverModule::class, ViewBindingShimModule::class, RatioInputModule::class, WorkManagerConfigurationModule::class, - ApplicationStartupListenerModule::class, LogUploadWorkerModule::class, + ApplicationStartupListenerModule::class, LogReportWorkerModule::class, HintsAndSolutionConfigModule::class, HintsAndSolutionProdModule::class, FirebaseLogUploaderModule::class, FakeOppiaClockModule::class, PracticeTabModule::class, DeveloperOptionsStarterModule::class, DeveloperOptionsModule::class, @@ -197,7 +198,7 @@ class AdministratorControlsFragmentTest { NumericExpressionInputModule::class, AlgebraicExpressionInputModule::class, MathEquationInputModule::class, SplitScreenInteractionModule::class, LoggingIdentifierModule::class, ApplicationLifecycleModule::class, - SyncStatusModule::class + SyncStatusModule::class, MetricLogSchedulerModule::class ] ) interface TestApplicationComponent : ApplicationComponent { diff --git a/app/src/test/java/org/oppia/android/app/testing/options/OptionsFragmentTest.kt b/app/src/test/java/org/oppia/android/app/testing/options/OptionsFragmentTest.kt index 0c9b6968ccd..3ebe6f52678 100644 --- a/app/src/test/java/org/oppia/android/app/testing/options/OptionsFragmentTest.kt +++ b/app/src/test/java/org/oppia/android/app/testing/options/OptionsFragmentTest.kt @@ -61,7 +61,8 @@ import org.oppia.android.domain.onboarding.ExpirationMetaDataRetrieverModule import org.oppia.android.domain.oppialogger.LogStorageModule import org.oppia.android.domain.oppialogger.LoggingIdentifierModule import org.oppia.android.domain.oppialogger.analytics.ApplicationLifecycleModule -import org.oppia.android.domain.oppialogger.loguploader.LogUploadWorkerModule +import org.oppia.android.domain.oppialogger.logscheduler.MetricLogSchedulerModule +import org.oppia.android.domain.oppialogger.loguploader.LogReportWorkerModule import org.oppia.android.domain.platformparameter.PlatformParameterSingletonModule import org.oppia.android.domain.question.QuestionModule import org.oppia.android.domain.topic.PrimeTopicAssetsControllerModule @@ -242,7 +243,7 @@ class OptionsFragmentTest { PrimeTopicAssetsControllerModule::class, ExpirationMetaDataRetrieverModule::class, ViewBindingShimModule::class, ApplicationStartupListenerModule::class, RatioInputModule::class, HintsAndSolutionConfigModule::class, NetworkConfigProdModule::class, - WorkManagerConfigurationModule::class, LogUploadWorkerModule::class, + WorkManagerConfigurationModule::class, LogReportWorkerModule::class, FirebaseLogUploaderModule::class, FakeOppiaClockModule::class, PracticeTabModule::class, DeveloperOptionsStarterModule::class, DeveloperOptionsModule::class, ExplorationStorageModule::class, NetworkModule::class, HintsAndSolutionProdModule::class, @@ -251,7 +252,7 @@ class OptionsFragmentTest { NumericExpressionInputModule::class, AlgebraicExpressionInputModule::class, MathEquationInputModule::class, SplitScreenInteractionModule::class, LoggingIdentifierModule::class, ApplicationLifecycleModule::class, - SyncStatusModule::class + SyncStatusModule::class, MetricLogSchedulerModule::class ] ) interface TestApplicationComponent : ApplicationComponent { diff --git a/app/src/test/java/org/oppia/android/app/testing/player/split/PlayerSplitScreenTest.kt b/app/src/test/java/org/oppia/android/app/testing/player/split/PlayerSplitScreenTest.kt index 5b20e41d31c..a7d14d4a6c2 100644 --- a/app/src/test/java/org/oppia/android/app/testing/player/split/PlayerSplitScreenTest.kt +++ b/app/src/test/java/org/oppia/android/app/testing/player/split/PlayerSplitScreenTest.kt @@ -51,7 +51,8 @@ import org.oppia.android.domain.onboarding.ExpirationMetaDataRetrieverModule import org.oppia.android.domain.oppialogger.LogStorageModule import org.oppia.android.domain.oppialogger.LoggingIdentifierModule import org.oppia.android.domain.oppialogger.analytics.ApplicationLifecycleModule -import org.oppia.android.domain.oppialogger.loguploader.LogUploadWorkerModule +import org.oppia.android.domain.oppialogger.logscheduler.MetricLogSchedulerModule +import org.oppia.android.domain.oppialogger.loguploader.LogReportWorkerModule import org.oppia.android.domain.platformparameter.PlatformParameterModule import org.oppia.android.domain.platformparameter.PlatformParameterSingletonModule import org.oppia.android.domain.question.QuestionModule @@ -195,7 +196,7 @@ class PlayerSplitScreenTest { ImageClickInputModule::class, LogStorageModule::class, IntentFactoryShimModule::class, ViewBindingShimModule::class, CachingTestModule::class, RatioInputModule::class, PrimeTopicAssetsControllerModule::class, ExpirationMetaDataRetrieverModule::class, - ApplicationStartupListenerModule::class, LogUploadWorkerModule::class, + ApplicationStartupListenerModule::class, LogReportWorkerModule::class, WorkManagerConfigurationModule::class, HintsAndSolutionConfigModule::class, FirebaseLogUploaderModule::class, FakeOppiaClockModule::class, PracticeTabModule::class, DeveloperOptionsStarterModule::class, DeveloperOptionsModule::class, @@ -206,7 +207,7 @@ class PlayerSplitScreenTest { AlgebraicExpressionInputModule::class, MathEquationInputModule::class, SplitScreenInteractionModule::class, LoggingIdentifierModule::class, ApplicationLifecycleModule::class, - SyncStatusModule::class + SyncStatusModule::class, MetricLogSchedulerModule::class ] ) interface TestApplicationComponent : ApplicationComponent { diff --git a/app/src/test/java/org/oppia/android/app/testing/player/state/StateFragmentAccessibilityTest.kt b/app/src/test/java/org/oppia/android/app/testing/player/state/StateFragmentAccessibilityTest.kt index 8c22af7c2d9..11c88ca340c 100644 --- a/app/src/test/java/org/oppia/android/app/testing/player/state/StateFragmentAccessibilityTest.kt +++ b/app/src/test/java/org/oppia/android/app/testing/player/state/StateFragmentAccessibilityTest.kt @@ -57,7 +57,8 @@ import org.oppia.android.domain.onboarding.ExpirationMetaDataRetrieverModule import org.oppia.android.domain.oppialogger.LogStorageModule import org.oppia.android.domain.oppialogger.LoggingIdentifierModule import org.oppia.android.domain.oppialogger.analytics.ApplicationLifecycleModule -import org.oppia.android.domain.oppialogger.loguploader.LogUploadWorkerModule +import org.oppia.android.domain.oppialogger.logscheduler.MetricLogSchedulerModule +import org.oppia.android.domain.oppialogger.loguploader.LogReportWorkerModule import org.oppia.android.domain.platformparameter.PlatformParameterModule import org.oppia.android.domain.platformparameter.PlatformParameterSingletonModule import org.oppia.android.domain.question.QuestionModule @@ -202,7 +203,7 @@ class StateFragmentAccessibilityTest { ImageClickInputModule::class, LogStorageModule::class, IntentFactoryShimModule::class, ViewBindingShimModule::class, CachingTestModule::class, RatioInputModule::class, PrimeTopicAssetsControllerModule::class, ExpirationMetaDataRetrieverModule::class, - ApplicationStartupListenerModule::class, LogUploadWorkerModule::class, + ApplicationStartupListenerModule::class, LogReportWorkerModule::class, WorkManagerConfigurationModule::class, HintsAndSolutionConfigModule::class, FirebaseLogUploaderModule::class, FakeOppiaClockModule::class, PracticeTabModule::class, DeveloperOptionsStarterModule::class, DeveloperOptionsModule::class, @@ -213,7 +214,7 @@ class StateFragmentAccessibilityTest { AlgebraicExpressionInputModule::class, MathEquationInputModule::class, SplitScreenInteractionModule::class, LoggingIdentifierModule::class, ApplicationLifecycleModule::class, - SyncStatusModule::class + SyncStatusModule::class, MetricLogSchedulerModule::class ] ) interface TestApplicationComponent : ApplicationComponent { diff --git a/app/src/test/java/org/oppia/android/app/topic/info/TopicInfoFragmentLocalTest.kt b/app/src/test/java/org/oppia/android/app/topic/info/TopicInfoFragmentLocalTest.kt index fd517ae0c36..68b9da3603a 100644 --- a/app/src/test/java/org/oppia/android/app/topic/info/TopicInfoFragmentLocalTest.kt +++ b/app/src/test/java/org/oppia/android/app/topic/info/TopicInfoFragmentLocalTest.kt @@ -50,7 +50,8 @@ import org.oppia.android.domain.onboarding.ExpirationMetaDataRetrieverModule import org.oppia.android.domain.oppialogger.LogStorageModule import org.oppia.android.domain.oppialogger.LoggingIdentifierModule import org.oppia.android.domain.oppialogger.analytics.ApplicationLifecycleModule -import org.oppia.android.domain.oppialogger.loguploader.LogUploadWorkerModule +import org.oppia.android.domain.oppialogger.logscheduler.MetricLogSchedulerModule +import org.oppia.android.domain.oppialogger.loguploader.LogReportWorkerModule import org.oppia.android.domain.platformparameter.PlatformParameterModule import org.oppia.android.domain.platformparameter.PlatformParameterSingletonModule import org.oppia.android.domain.question.QuestionModule @@ -145,7 +146,7 @@ class TopicInfoFragmentLocalTest { ImageClickInputModule::class, LogStorageModule::class, CachingTestModule::class, PrimeTopicAssetsControllerModule::class, ExpirationMetaDataRetrieverModule::class, ViewBindingShimModule::class, RatioInputModule::class, WorkManagerConfigurationModule::class, - ApplicationStartupListenerModule::class, LogUploadWorkerModule::class, + ApplicationStartupListenerModule::class, LogReportWorkerModule::class, HintsAndSolutionConfigModule::class, HintsAndSolutionProdModule::class, FirebaseLogUploaderModule::class, FakeOppiaClockModule::class, PracticeTabModule::class, DeveloperOptionsStarterModule::class, DeveloperOptionsModule::class, @@ -155,7 +156,7 @@ class TopicInfoFragmentLocalTest { NumericExpressionInputModule::class, AlgebraicExpressionInputModule::class, MathEquationInputModule::class, SplitScreenInteractionModule::class, LoggingIdentifierModule::class, ApplicationLifecycleModule::class, - SyncStatusModule::class + SyncStatusModule::class, MetricLogSchedulerModule::class ] ) interface TestApplicationComponent : ApplicationComponent { diff --git a/app/src/test/java/org/oppia/android/app/topic/lessons/TopicLessonsFragmentLocalTest.kt b/app/src/test/java/org/oppia/android/app/topic/lessons/TopicLessonsFragmentLocalTest.kt index 919664f7e58..cd09a71eb8b 100644 --- a/app/src/test/java/org/oppia/android/app/topic/lessons/TopicLessonsFragmentLocalTest.kt +++ b/app/src/test/java/org/oppia/android/app/topic/lessons/TopicLessonsFragmentLocalTest.kt @@ -49,7 +49,8 @@ import org.oppia.android.domain.onboarding.ExpirationMetaDataRetrieverModule import org.oppia.android.domain.oppialogger.LogStorageModule import org.oppia.android.domain.oppialogger.LoggingIdentifierModule import org.oppia.android.domain.oppialogger.analytics.ApplicationLifecycleModule -import org.oppia.android.domain.oppialogger.loguploader.LogUploadWorkerModule +import org.oppia.android.domain.oppialogger.logscheduler.MetricLogSchedulerModule +import org.oppia.android.domain.oppialogger.loguploader.LogReportWorkerModule import org.oppia.android.domain.platformparameter.PlatformParameterModule import org.oppia.android.domain.platformparameter.PlatformParameterSingletonModule import org.oppia.android.domain.question.QuestionModule @@ -148,7 +149,7 @@ class TopicLessonsFragmentLocalTest { ImageClickInputModule::class, LogStorageModule::class, CachingTestModule::class, PrimeTopicAssetsControllerModule::class, ExpirationMetaDataRetrieverModule::class, ViewBindingShimModule::class, RatioInputModule::class, WorkManagerConfigurationModule::class, - ApplicationStartupListenerModule::class, LogUploadWorkerModule::class, + ApplicationStartupListenerModule::class, LogReportWorkerModule::class, HintsAndSolutionConfigModule::class, HintsAndSolutionProdModule::class, FirebaseLogUploaderModule::class, FakeOppiaClockModule::class, PracticeTabModule::class, DeveloperOptionsStarterModule::class, DeveloperOptionsModule::class, @@ -158,7 +159,7 @@ class TopicLessonsFragmentLocalTest { NumericExpressionInputModule::class, AlgebraicExpressionInputModule::class, MathEquationInputModule::class, SplitScreenInteractionModule::class, LoggingIdentifierModule::class, ApplicationLifecycleModule::class, - SyncStatusModule::class + SyncStatusModule::class, MetricLogSchedulerModule::class ] ) interface TestApplicationComponent : ApplicationComponent { diff --git a/app/src/test/java/org/oppia/android/app/topic/questionplayer/QuestionPlayerActivityLocalTest.kt b/app/src/test/java/org/oppia/android/app/topic/questionplayer/QuestionPlayerActivityLocalTest.kt index 35862612657..aedeb8e43cc 100644 --- a/app/src/test/java/org/oppia/android/app/topic/questionplayer/QuestionPlayerActivityLocalTest.kt +++ b/app/src/test/java/org/oppia/android/app/topic/questionplayer/QuestionPlayerActivityLocalTest.kt @@ -66,7 +66,8 @@ import org.oppia.android.domain.onboarding.ExpirationMetaDataRetrieverModule import org.oppia.android.domain.oppialogger.LogStorageModule import org.oppia.android.domain.oppialogger.LoggingIdentifierModule import org.oppia.android.domain.oppialogger.analytics.ApplicationLifecycleModule -import org.oppia.android.domain.oppialogger.loguploader.LogUploadWorkerModule +import org.oppia.android.domain.oppialogger.logscheduler.MetricLogSchedulerModule +import org.oppia.android.domain.oppialogger.loguploader.LogReportWorkerModule import org.oppia.android.domain.platformparameter.PlatformParameterModule import org.oppia.android.domain.platformparameter.PlatformParameterSingletonModule import org.oppia.android.domain.question.InternalMasteryMultiplyFactor @@ -497,7 +498,7 @@ class QuestionPlayerActivityLocalTest { PrimeTopicAssetsControllerModule::class, ExpirationMetaDataRetrieverModule::class, ViewBindingShimModule::class, ApplicationStartupListenerModule::class, RatioInputModule::class, HintsAndSolutionConfigModule::class, NetworkConfigProdModule::class, - LogUploadWorkerModule::class, WorkManagerConfigurationModule::class, + LogReportWorkerModule::class, WorkManagerConfigurationModule::class, FirebaseLogUploaderModule::class, FakeOppiaClockModule::class, PracticeTabModule::class, DeveloperOptionsStarterModule::class, DeveloperOptionsModule::class, ExplorationStorageModule::class, NetworkModule::class, HintsAndSolutionProdModule::class, @@ -506,7 +507,7 @@ class QuestionPlayerActivityLocalTest { NumericExpressionInputModule::class, AlgebraicExpressionInputModule::class, MathEquationInputModule::class, SplitScreenInteractionModule::class, LoggingIdentifierModule::class, ApplicationLifecycleModule::class, - SyncStatusModule::class + SyncStatusModule::class, MetricLogSchedulerModule::class ] ) interface TestApplicationComponent : ApplicationComponent { diff --git a/app/src/test/java/org/oppia/android/app/topic/revisioncard/RevisionCardActivityLocalTest.kt b/app/src/test/java/org/oppia/android/app/topic/revisioncard/RevisionCardActivityLocalTest.kt index fda93fb355e..510f56bd197 100644 --- a/app/src/test/java/org/oppia/android/app/topic/revisioncard/RevisionCardActivityLocalTest.kt +++ b/app/src/test/java/org/oppia/android/app/topic/revisioncard/RevisionCardActivityLocalTest.kt @@ -49,7 +49,8 @@ import org.oppia.android.domain.onboarding.ExpirationMetaDataRetrieverModule import org.oppia.android.domain.oppialogger.LogStorageModule import org.oppia.android.domain.oppialogger.LoggingIdentifierModule import org.oppia.android.domain.oppialogger.analytics.ApplicationLifecycleModule -import org.oppia.android.domain.oppialogger.loguploader.LogUploadWorkerModule +import org.oppia.android.domain.oppialogger.logscheduler.MetricLogSchedulerModule +import org.oppia.android.domain.oppialogger.loguploader.LogReportWorkerModule import org.oppia.android.domain.platformparameter.PlatformParameterModule import org.oppia.android.domain.platformparameter.PlatformParameterSingletonModule import org.oppia.android.domain.question.QuestionModule @@ -138,7 +139,7 @@ class RevisionCardActivityLocalTest { PrimeTopicAssetsControllerModule::class, ExpirationMetaDataRetrieverModule::class, ViewBindingShimModule::class, RatioInputModule::class, NetworkConfigProdModule::class, ApplicationStartupListenerModule::class, HintsAndSolutionConfigModule::class, - LogUploadWorkerModule::class, WorkManagerConfigurationModule::class, + LogReportWorkerModule::class, WorkManagerConfigurationModule::class, FirebaseLogUploaderModule::class, FakeOppiaClockModule::class, PracticeTabModule::class, DeveloperOptionsStarterModule::class, DeveloperOptionsModule::class, ExplorationStorageModule::class, NetworkModule::class, HintsAndSolutionProdModule::class, @@ -147,7 +148,7 @@ class RevisionCardActivityLocalTest { NumericExpressionInputModule::class, AlgebraicExpressionInputModule::class, MathEquationInputModule::class, SplitScreenInteractionModule::class, LoggingIdentifierModule::class, ApplicationLifecycleModule::class, - SyncStatusModule::class + SyncStatusModule::class, MetricLogSchedulerModule::class ] ) interface TestApplicationComponent : ApplicationComponent { diff --git a/app/src/test/java/org/oppia/android/app/translation/AppLanguageResourceHandlerTest.kt b/app/src/test/java/org/oppia/android/app/translation/AppLanguageResourceHandlerTest.kt index e23173d0f1b..3ef2af12404 100644 --- a/app/src/test/java/org/oppia/android/app/translation/AppLanguageResourceHandlerTest.kt +++ b/app/src/test/java/org/oppia/android/app/translation/AppLanguageResourceHandlerTest.kt @@ -55,7 +55,8 @@ import org.oppia.android.domain.onboarding.testing.ExpirationMetaDataRetrieverTe import org.oppia.android.domain.oppialogger.LogStorageModule import org.oppia.android.domain.oppialogger.LoggingIdentifierModule import org.oppia.android.domain.oppialogger.analytics.ApplicationLifecycleModule -import org.oppia.android.domain.oppialogger.loguploader.LogUploadWorkerModule +import org.oppia.android.domain.oppialogger.logscheduler.MetricLogSchedulerModule +import org.oppia.android.domain.oppialogger.loguploader.LogReportWorkerModule import org.oppia.android.domain.platformparameter.PlatformParameterModule import org.oppia.android.domain.platformparameter.PlatformParameterSingletonModule import org.oppia.android.domain.question.QuestionModule @@ -546,7 +547,7 @@ class AppLanguageResourceHandlerTest { PrimeTopicAssetsControllerModule::class, ExpirationMetaDataRetrieverTestModule::class, ViewBindingShimModule::class, RatioInputModule::class, NetworkConfigProdModule::class, ApplicationStartupListenerModule::class, HintsAndSolutionConfigModule::class, - LogUploadWorkerModule::class, WorkManagerConfigurationModule::class, + LogReportWorkerModule::class, WorkManagerConfigurationModule::class, FirebaseLogUploaderModule::class, FakeOppiaClockModule::class, PracticeTabModule::class, DeveloperOptionsStarterModule::class, DeveloperOptionsModule::class, ExplorationStorageModule::class, NetworkModule::class, HintsAndSolutionProdModule::class, @@ -556,7 +557,7 @@ class AppLanguageResourceHandlerTest { NumericExpressionInputModule::class, AlgebraicExpressionInputModule::class, MathEquationInputModule::class, SplitScreenInteractionModule::class, LoggingIdentifierModule::class, ApplicationLifecycleModule::class, - SyncStatusModule::class + SyncStatusModule::class, MetricLogSchedulerModule::class ] ) interface TestApplicationComponent : ApplicationComponent { diff --git a/app/src/test/java/org/oppia/android/app/translation/AppLanguageWatcherMixinTest.kt b/app/src/test/java/org/oppia/android/app/translation/AppLanguageWatcherMixinTest.kt index daa9f02e4a6..21ac94faac3 100644 --- a/app/src/test/java/org/oppia/android/app/translation/AppLanguageWatcherMixinTest.kt +++ b/app/src/test/java/org/oppia/android/app/translation/AppLanguageWatcherMixinTest.kt @@ -60,7 +60,8 @@ import org.oppia.android.domain.onboarding.testing.ExpirationMetaDataRetrieverTe import org.oppia.android.domain.oppialogger.LogStorageModule import org.oppia.android.domain.oppialogger.LoggingIdentifierModule import org.oppia.android.domain.oppialogger.analytics.ApplicationLifecycleModule -import org.oppia.android.domain.oppialogger.loguploader.LogUploadWorkerModule +import org.oppia.android.domain.oppialogger.logscheduler.MetricLogSchedulerModule +import org.oppia.android.domain.oppialogger.loguploader.LogReportWorkerModule import org.oppia.android.domain.platformparameter.PlatformParameterModule import org.oppia.android.domain.platformparameter.PlatformParameterSingletonModule import org.oppia.android.domain.question.QuestionModule @@ -261,7 +262,7 @@ class AppLanguageWatcherMixinTest { PrimeTopicAssetsControllerModule::class, ExpirationMetaDataRetrieverTestModule::class, ViewBindingShimModule::class, RatioInputModule::class, NetworkConfigProdModule::class, ApplicationStartupListenerModule::class, HintsAndSolutionConfigModule::class, - LogUploadWorkerModule::class, WorkManagerConfigurationModule::class, + LogReportWorkerModule::class, WorkManagerConfigurationModule::class, FirebaseLogUploaderModule::class, FakeOppiaClockModule::class, PracticeTabModule::class, DeveloperOptionsStarterModule::class, DeveloperOptionsModule::class, ExplorationStorageModule::class, NetworkModule::class, HintsAndSolutionProdModule::class, @@ -271,7 +272,7 @@ class AppLanguageWatcherMixinTest { NumericExpressionInputModule::class, AlgebraicExpressionInputModule::class, MathEquationInputModule::class, SplitScreenInteractionModule::class, LoggingIdentifierModule::class, ApplicationLifecycleModule::class, - SyncStatusModule::class + SyncStatusModule::class, MetricLogSchedulerModule::class ] ) interface TestApplicationComponent : ApplicationComponent { diff --git a/app/src/test/java/org/oppia/android/app/utility/math/MathExpressionAccessibilityUtilTest.kt b/app/src/test/java/org/oppia/android/app/utility/math/MathExpressionAccessibilityUtilTest.kt index badd403918f..d742b20a586 100644 --- a/app/src/test/java/org/oppia/android/app/utility/math/MathExpressionAccessibilityUtilTest.kt +++ b/app/src/test/java/org/oppia/android/app/utility/math/MathExpressionAccessibilityUtilTest.kt @@ -67,7 +67,8 @@ import org.oppia.android.domain.onboarding.testing.ExpirationMetaDataRetrieverTe import org.oppia.android.domain.oppialogger.LogStorageModule import org.oppia.android.domain.oppialogger.LoggingIdentifierModule import org.oppia.android.domain.oppialogger.analytics.ApplicationLifecycleModule -import org.oppia.android.domain.oppialogger.loguploader.LogUploadWorkerModule +import org.oppia.android.domain.oppialogger.logscheduler.MetricLogSchedulerModule +import org.oppia.android.domain.oppialogger.loguploader.LogReportWorkerModule import org.oppia.android.domain.platformparameter.PlatformParameterModule import org.oppia.android.domain.platformparameter.PlatformParameterSingletonModule import org.oppia.android.domain.question.QuestionModule @@ -1320,7 +1321,7 @@ class MathExpressionAccessibilityUtilTest { PrimeTopicAssetsControllerModule::class, ExpirationMetaDataRetrieverTestModule::class, ViewBindingShimModule::class, RatioInputModule::class, NetworkConfigProdModule::class, ApplicationStartupListenerModule::class, HintsAndSolutionConfigModule::class, - LogUploadWorkerModule::class, WorkManagerConfigurationModule::class, + LogReportWorkerModule::class, WorkManagerConfigurationModule::class, FirebaseLogUploaderModule::class, FakeOppiaClockModule::class, PracticeTabModule::class, DeveloperOptionsStarterModule::class, DeveloperOptionsModule::class, ExplorationStorageModule::class, NetworkModule::class, HintsAndSolutionProdModule::class, @@ -1330,7 +1331,7 @@ class MathExpressionAccessibilityUtilTest { NumericExpressionInputModule::class, AlgebraicExpressionInputModule::class, MathEquationInputModule::class, SplitScreenInteractionModule::class, LoggingIdentifierModule::class, ApplicationLifecycleModule::class, - SyncStatusModule::class + SyncStatusModule::class, MetricLogSchedulerModule::class ] ) interface TestApplicationComponent : ApplicationComponent { diff --git a/domain/BUILD.bazel b/domain/BUILD.bazel index 3a3d9f37f74..e13cc36c9a6 100755 --- a/domain/BUILD.bazel +++ b/domain/BUILD.bazel @@ -107,6 +107,7 @@ kt_android_library( "//domain/src/main/java/org/oppia/android/domain/oppialogger:oppia_logger", "//domain/src/main/java/org/oppia/android/domain/oppialogger:startup_listener", "//domain/src/main/java/org/oppia/android/domain/oppialogger/exceptions:controller", + "//domain/src/main/java/org/oppia/android/domain/oppialogger/logscheduler:metric_log_scheduling_worker_factory", "//domain/src/main/java/org/oppia/android/domain/oppialogger/loguploader:worker_factory", "//domain/src/main/java/org/oppia/android/domain/profile:profile_management_controller", "//domain/src/main/java/org/oppia/android/domain/state:state_deck", @@ -182,8 +183,10 @@ TEST_DEPS = [ "//domain/src/main/java/org/oppia/android/domain/onboarding:state_controller", "//domain/src/main/java/org/oppia/android/domain/oppialogger:prod_module", "//domain/src/main/java/org/oppia/android/domain/oppialogger/analytics:prod_module", + "//domain/src/main/java/org/oppia/android/domain/oppialogger/analytics/testing:fake_log_scheduler", "//domain/src/main/java/org/oppia/android/domain/oppialogger/exceptions:logger_module", "//domain/src/main/java/org/oppia/android/domain/oppialogger/exceptions:startup_listener", + "//domain/src/main/java/org/oppia/android/domain/oppialogger/logscheduler:metric_log_scheduler_module", "//domain/src/main/java/org/oppia/android/domain/oppialogger/loguploader:worker_factory", "//domain/src/main/java/org/oppia/android/domain/oppialogger/loguploader:worker_module", "//domain/src/main/java/org/oppia/android/domain/testing/oppialogger/loguploader:fake_log_uploader", @@ -212,6 +215,9 @@ TEST_DEPS = [ "//utility/src/main/java/org/oppia/android/util/extensions:context_extensions", "//utility/src/main/java/org/oppia/android/util/locale:prod_module", "//utility/src/main/java/org/oppia/android/util/logging:prod_module", + "//utility/src/main/java/org/oppia/android/util/logging/firebase:prod_module", + "//utility/src/main/java/org/oppia/android/util/logging/performancemetrics:performance_metrics_assessor_module", + "//utility/src/main/java/org/oppia/android/util/logging/performancemetrics:performance_metrics_configurations_module", "//utility/src/main/java/org/oppia/android/util/networking:debug_module", "//utility/src/main/java/org/oppia/android/util/networking:debug_util_module", "//utility/src/main/java/org/oppia/android/util/system:prod_module", diff --git a/domain/src/main/java/org/oppia/android/domain/oppialogger/LogStorageModule.kt b/domain/src/main/java/org/oppia/android/domain/oppialogger/LogStorageModule.kt index bea59db840e..73fe03a7a3d 100644 --- a/domain/src/main/java/org/oppia/android/domain/oppialogger/LogStorageModule.kt +++ b/domain/src/main/java/org/oppia/android/domain/oppialogger/LogStorageModule.kt @@ -10,6 +10,9 @@ annotation class EventLogStorageCacheSize @Qualifier annotation class ExceptionLogStorageCacheSize +@Qualifier +annotation class PerformanceMetricsLogStorageCacheSize + /** Provider to return any constants required during the storage of log reports. */ @Module class LogStorageModule { @@ -33,4 +36,14 @@ class LogStorageModule { @Provides @ExceptionLogStorageCacheSize fun provideExceptionLogStorageCacheSize(): Int = 25 + + /** + * Provides the maximum number of performance metrics logs that can be cached on disk. + * + * At a configured cache size of 25k records & estimating 121 bytes per record, it's expected that + * no more than 3.02MB will be required for cache disk space. + */ + @Provides + @PerformanceMetricsLogStorageCacheSize + fun provideMetricLogStorageCacheSize(): Int = 25_000 } diff --git a/domain/src/main/java/org/oppia/android/domain/oppialogger/analytics/ApplicationLifecycleObserver.kt b/domain/src/main/java/org/oppia/android/domain/oppialogger/analytics/ApplicationLifecycleObserver.kt index e49bf08b3c4..5a9dd411387 100644 --- a/domain/src/main/java/org/oppia/android/domain/oppialogger/analytics/ApplicationLifecycleObserver.kt +++ b/domain/src/main/java/org/oppia/android/domain/oppialogger/analytics/ApplicationLifecycleObserver.kt @@ -24,6 +24,7 @@ class ApplicationLifecycleObserver @Inject constructor( private val learnerAnalyticsLogger: LearnerAnalyticsLogger, private val profileManagementController: ProfileManagementController, private val oppiaLogger: OppiaLogger, + private val performanceMetricsController: PerformanceMetricsController, @LearnerAnalyticsInactivityLimitMillis private val inactivityLimitMillis: Long, @BackgroundDispatcher private val backgroundDispatcher: CoroutineDispatcher ) : ApplicationStartupListener, LifecycleObserver { @@ -39,6 +40,7 @@ class ApplicationLifecycleObserver @Inject constructor( /** Occurs when application comes to foreground. */ @OnLifecycleEvent(Lifecycle.Event.ON_START) fun onAppInForeground() { + performanceMetricsController.setAppInForeground() val timeDifferenceMs = oppiaClock.getCurrentTimeMs() - firstTimestamp if (timeDifferenceMs > inactivityLimitMillis) { loggingIdentifierController.updateSessionId() @@ -49,6 +51,7 @@ class ApplicationLifecycleObserver @Inject constructor( /** Occurs when application goes to background. */ @OnLifecycleEvent(Lifecycle.Event.ON_STOP) fun onAppInBackground() { + performanceMetricsController.setAppInBackground() firstTimestamp = oppiaClock.getCurrentTimeMs() logAppLifecycleEventInBackground(learnerAnalyticsLogger::logAppInBackground) } diff --git a/domain/src/main/java/org/oppia/android/domain/oppialogger/analytics/BUILD.bazel b/domain/src/main/java/org/oppia/android/domain/oppialogger/analytics/BUILD.bazel index 5616ff68418..f1f3915e280 100644 --- a/domain/src/main/java/org/oppia/android/domain/oppialogger/analytics/BUILD.bazel +++ b/domain/src/main/java/org/oppia/android/domain/oppialogger/analytics/BUILD.bazel @@ -24,6 +24,26 @@ kt_android_library( ], ) +kt_android_library( + name = "performance_metrics_controller", + srcs = [ + "PerformanceMetricsController.kt", + ], + visibility = ["//domain/src/main/java/org/oppia/android/domain/oppialogger:__subpackages__"], + deps = [ + ":dagger", + "//data/src/main/java/org/oppia/android/data/persistence:cache_store", + "//domain/src/main/java/org/oppia/android/domain/oppialogger:prod_module", + "//model/src/main/proto:performance_metrics_event_logger_java_proto_lite", + "//utility/src/main/java/org/oppia/android/util/data:data_provider", + "//utility/src/main/java/org/oppia/android/util/logging:console_logger", + "//utility/src/main/java/org/oppia/android/util/logging:exception_logger", + "//utility/src/main/java/org/oppia/android/util/logging/performancemetrics:performance_metrics_assessor", + "//utility/src/main/java/org/oppia/android/util/logging/performancemetrics:performance_metrics_event_logger", + "//utility/src/main/java/org/oppia/android/util/networking:network_connection_util", + ], +) + kt_android_library( name = "learner_analytics_logger", srcs = [ @@ -39,6 +59,37 @@ kt_android_library( ], ) +kt_android_library( + name = "performance_metrics_logger", + srcs = [ + "PerformanceMetricsLogger.kt", + ], + visibility = ["//:oppia_api_visibility"], + deps = [ + ":dagger", + ":performance_metrics_controller", + "//domain/src/main/java/org/oppia/android/domain/oppialogger:logging_identifier_controller", + "//domain/src/main/java/org/oppia/android/domain/oppialogger:oppia_logger", + "//domain/src/main/java/org/oppia/android/domain/oppialogger:startup_listener", + "//model/src/main/proto:performance_metrics_event_logger_java_proto_lite", + "//utility/src/main/java/org/oppia/android/util/logging/performancemetrics:performance_metrics_assessor", + "//utility/src/main/java/org/oppia/android/util/logging/performancemetrics:performance_metrics_event_logger", + ], +) + +kt_android_library( + name = "performance_metrics_logger_module", + srcs = [ + "PerformanceMetricsLoggerModule.kt", + ], + visibility = ["//:oppia_prod_module_visibility"], + deps = [ + ":dagger", + ":performance_metrics_logger", + "//domain/src/main/java/org/oppia/android/domain/oppialogger:startup_listener", + ], +) + kt_android_library( name = "learner_analytics_inactivity_limit_millis", srcs = [ @@ -59,6 +110,7 @@ kt_android_library( deps = [ ":dagger", ":learner_analytics_inactivity_limit_millis", + ":performance_metrics_controller", "//domain/src/main/java/org/oppia/android/domain/oppialogger:logging_identifier_controller", "//domain/src/main/java/org/oppia/android/domain/oppialogger:startup_listener", "//domain/src/main/java/org/oppia/android/domain/profile:profile_management_controller", diff --git a/domain/src/main/java/org/oppia/android/domain/oppialogger/analytics/PerformanceMetricsController.kt b/domain/src/main/java/org/oppia/android/domain/oppialogger/analytics/PerformanceMetricsController.kt new file mode 100644 index 00000000000..ee8cca7b6c5 --- /dev/null +++ b/domain/src/main/java/org/oppia/android/domain/oppialogger/analytics/PerformanceMetricsController.kt @@ -0,0 +1,193 @@ +package org.oppia.android.domain.oppialogger.analytics + +import org.oppia.android.app.model.OppiaMetricLog +import org.oppia.android.app.model.OppiaMetricLog.Priority +import org.oppia.android.app.model.OppiaMetricLogs +import org.oppia.android.data.persistence.PersistentCacheStore +import org.oppia.android.domain.oppialogger.PerformanceMetricsLogStorageCacheSize +import org.oppia.android.util.data.DataProvider +import org.oppia.android.util.logging.ConsoleLogger +import org.oppia.android.util.logging.ExceptionLogger +import org.oppia.android.util.logging.performancemetrics.PerformanceMetricsAssessor +import org.oppia.android.util.logging.performancemetrics.PerformanceMetricsEventLogger +import org.oppia.android.util.networking.NetworkConnectionUtil +import java.lang.IllegalStateException +import javax.inject.Inject +import javax.inject.Singleton + +/** + * Controller for handling performance metrics event logging. + * + * Callers should not use this class directly; instead, they should use ``PerformanceMetricsLogger`` + * which provides convenience log methods. + */ +@Singleton +class PerformanceMetricsController @Inject constructor( + private val performanceMetricsAssessor: PerformanceMetricsAssessor, + private val consoleLogger: ConsoleLogger, + private val networkConnectionUtil: NetworkConnectionUtil, + private val exceptionLogger: ExceptionLogger, + private val performanceMetricsEventLogger: PerformanceMetricsEventLogger, + cacheStoreFactory: PersistentCacheStore.Factory, + @PerformanceMetricsLogStorageCacheSize private val metricLogStorageCacheSize: Int +) { + + private var isAppInForeground: Boolean = false + + private val metricLogStore = + cacheStoreFactory.create("metric_logs", OppiaMetricLogs.getDefaultInstance()) + + /** + * Logs a performance metric occurring at [currentScreen] defined by [loggableMetric] + * corresponding to a time [timestamp]. + * + * This will schedule a background upload of the event if there's internet connectivity, otherwise + * it will cache the event for a later upload. + */ + fun logPerformanceMetricsEvent( + timestamp: Long, + currentScreen: OppiaMetricLog.CurrentScreen, + loggableMetric: OppiaMetricLog.LoggableMetric, + priority: Priority + ) { + uploadOrCacheLog(createMetricLog(timestamp, priority, currentScreen, loggableMetric)) + } + + /** Either uploads or caches [oppiaMetricLog] depending on current internet connectivity. */ + private fun uploadOrCacheLog(oppiaMetricLog: OppiaMetricLog) { + when (networkConnectionUtil.getCurrentConnectionStatus()) { + NetworkConnectionUtil.ProdConnectionStatus.NONE -> cacheMetricLog(oppiaMetricLog) + else -> performanceMetricsEventLogger.logPerformanceMetric(oppiaMetricLog) + } + } + + /** + * Adds a metric log to the storage. + * + * At first, it checks if the size of the store isn't exceeding [metricLogStorageCacheSize]. If + * the limit is exceeded then the least recent event is removed from the [metricLogStore]. After + * this, the [oppiaMetricLog] is added to the store. + */ + private fun cacheMetricLog(oppiaMetricLog: OppiaMetricLog) { + metricLogStore.storeDataAsync(updateInMemoryCache = true) { oppiaMetricLogs -> + val storeSize = oppiaMetricLogs.oppiaMetricLogList.size + if (storeSize + 1 > metricLogStorageCacheSize) { + val eventLogRemovalIndex = getLeastRecentMetricLogIndex(oppiaMetricLogs) + if (eventLogRemovalIndex != null) { + return@storeDataAsync oppiaMetricLogs.toBuilder() + .removeOppiaMetricLog(eventLogRemovalIndex) + .addOppiaMetricLog(oppiaMetricLog) + .build() + } else { + // TODO(#1433): Refactoring for logging exceptions to both console and exception loggers. + val exception = + IllegalStateException( + "Least Recent Event index absent -- MetricLogStorageCacheSize is 0" + ) + consoleLogger.e( + "PerformanceMetricsController", + "Failure while caching metric log.", + exception + ) + exceptionLogger.logException(exception) + } + } + return@storeDataAsync oppiaMetricLogs.toBuilder().addOppiaMetricLog(oppiaMetricLog).build() + }.invokeOnCompletion { + it?.let { consoleLogger.e("PerformanceMetricsController", "Failed to store metric log.", it) } + } + } + + /** Returns a metric log containing relevant data for metric log reporting. */ + private fun createMetricLog( + timestamp: Long, + priority: Priority, + currentScreen: OppiaMetricLog.CurrentScreen, + loggableMetric: OppiaMetricLog.LoggableMetric + ): OppiaMetricLog { + return OppiaMetricLog.newBuilder().apply { + this.timestampMillis = timestamp + this.priority = priority + this.currentScreen = currentScreen + this.loggableMetric = loggableMetric + this.isAppInForeground = this@PerformanceMetricsController.isAppInForeground + this.storageTier = performanceMetricsAssessor.getDeviceStorageTier() + this.memoryTier = performanceMetricsAssessor.getDeviceMemoryTier() + }.build() + } + + /** + * Returns the index of the least recent event from the existing store on the basis of recency and + * priority. + * + * At first, it checks the index of the least recent event which has LOW priority. If that + * returns null, then it checks the index of the least recent event which has MEDIUM priority. If + * that returns null, then it checks the index of the least recent event regardless of the + * priority is returned. + */ + private fun getLeastRecentMetricLogIndex(oppiaMetricLogs: OppiaMetricLogs): Int? = + oppiaMetricLogs.oppiaMetricLogList.withIndex() + .filter { it.value.priority == Priority.LOW_PRIORITY } + .minByOrNull { it.value.timestampMillis }?.index + ?: getLeastRecentMediumPriorityEventIndex(oppiaMetricLogs) + + /** + * Returns the index of the least recent event from the existing store on the basis of recency and + * priority. + * + * At first, it checks the index of the least recent event which has MEDIUM priority. If that + * returns null, then it checks the index of the least recent event regardless of the + * priority is returned. + */ + private fun getLeastRecentMediumPriorityEventIndex(oppiaMetricLogs: OppiaMetricLogs): Int? = + oppiaMetricLogs.oppiaMetricLogList.withIndex() + .filter { it.value.priority == Priority.MEDIUM_PRIORITY } + .minByOrNull { it.value.timestampMillis }?.index + ?: getLeastRecentGeneralEventIndex(oppiaMetricLogs) + + /** Returns the index of the least recent event regardless of their priority. */ + private fun getLeastRecentGeneralEventIndex(oppiaMetricLogs: OppiaMetricLogs): Int? = + oppiaMetricLogs.oppiaMetricLogList.withIndex() + .minByOrNull { it.value.timestampMillis }?.index + + /** Returns a data provider for log reports that have been recorded for upload. */ + fun getMetricLogStore(): DataProvider = metricLogStore + + /** + * Returns a list of metric log reports that have been recorded for upload. + * + * As we are using the await call on the deferred output of readDataAsync, the failure case would + * be caught and it'll throw an error. + */ + suspend fun getMetricLogStoreList(): List { + return metricLogStore.readDataAsync().await().oppiaMetricLogList + } + + /** Removes the first metric log report that had been recorded for upload. */ + fun removeFirstMetricLogFromStore() { + metricLogStore.storeDataAsync(updateInMemoryCache = true) { oppiaEventLogs -> + return@storeDataAsync oppiaEventLogs.toBuilder().removeOppiaMetricLog(0).build() + }.invokeOnCompletion { + it?.let { + consoleLogger.e( + "PerformanceMetricsController", + "Failed to remove metric log.", + it + ) + } + } + } + + /** Sets [isAppInForeground] to true when application is in or returns to foreground. */ + fun setAppInForeground() { + this.isAppInForeground = true + } + + /** Sets [isAppInForeground] to false when application goes to background. */ + fun setAppInBackground() { + this.isAppInForeground = false + } + + /** Returns a boolean value indicating whether the application is currently in foreground or not. */ + fun getIsAppInForeground() = this.isAppInForeground +} diff --git a/domain/src/main/java/org/oppia/android/domain/oppialogger/analytics/PerformanceMetricsLogger.kt b/domain/src/main/java/org/oppia/android/domain/oppialogger/analytics/PerformanceMetricsLogger.kt new file mode 100644 index 00000000000..48a6bda8ad1 --- /dev/null +++ b/domain/src/main/java/org/oppia/android/domain/oppialogger/analytics/PerformanceMetricsLogger.kt @@ -0,0 +1,305 @@ +package org.oppia.android.domain.oppialogger.analytics + +import org.oppia.android.app.model.OppiaMetricLog +import org.oppia.android.domain.oppialogger.ApplicationStartupListener +import org.oppia.android.util.logging.performancemetrics.PerformanceMetricsAssessor +import org.oppia.android.util.system.OppiaClock +import javax.inject.Inject +import javax.inject.Singleton + +/** + * Convenience logger for performance metrics related analytics events. + * + * This logger is meant primarily to be used directly in places where a certain performance metric + * has to be logged. + */ +@Singleton +class PerformanceMetricsLogger @Inject constructor( + private val performanceMetricsController: PerformanceMetricsController, + private val performanceMetricsAssessor: PerformanceMetricsAssessor, + private val oppiaClock: OppiaClock +) : ApplicationStartupListener { + + /** + * Timestamp indicating the time of application start-up. It will be used to calculate the + * cold-startup latency of the application. + * + * We're using a large Long value such that the time difference based on any timestamp will be + * negative and thus ignored until the app records initial time during [onCreate]. + */ + private var firstTimestamp: Long = Long.MAX_VALUE + + override fun onCreate() { + firstTimestamp = oppiaClock.getCurrentTimeMs() + } + + /** + * Logs the apk size of the application as a performance metric for the current state of the app. + * It must be noted that the value of this metric won't change across calls during the same + * application instance. + * + * @param currentScreen denotes the application screen at which this metric has been logged + */ + fun logApkSize(currentScreen: OppiaMetricLog.CurrentScreen) { + performanceMetricsController.logLowPriorityMetricEvent( + oppiaClock.getCurrentTimeMs(), + currentScreen, + createApkSizeLoggableMetric(performanceMetricsAssessor.getApkSize()) + ) + } + + /** + * Logs the storage usage of the application as a performance metric for the current state of the + * app. It must be noted that the value of this metric will change across calls during the same + * application instance. + * + * @param currentScreen denotes the application screen at which this metric has been logged + */ + fun logStorageUsage(currentScreen: OppiaMetricLog.CurrentScreen) { + performanceMetricsController.logLowPriorityMetricEvent( + oppiaClock.getCurrentTimeMs(), + currentScreen, + createStorageUsageLoggableMetric(performanceMetricsAssessor.getUsedStorage()) + ) + } + + /** + * Logs the startup latency of the application as a performance metric for the current state of + * the app. This metric should only be logged when the application starts. + * + * @param currentScreen denotes the application screen at which this metric has been logged + */ + fun logStartupLatency(currentScreen: OppiaMetricLog.CurrentScreen) { + val startupLatency = oppiaClock.getCurrentTimeMs() - firstTimestamp + if (startupLatency >= 0) { + performanceMetricsController.logLowPriorityMetricEvent( + oppiaClock.getCurrentTimeMs(), + currentScreen, + createStartupLatencyLoggableMetric(startupLatency) + ) + } + } + + /** + * Logs the memory usage of the application as a performance metric for the current state of the + * app. It must be noted that the value of this metric will change across calls during the same + * application instance. + * + * @param currentScreen denotes the application screen at which this metric has been logged + */ + fun logMemoryUsage(currentScreen: OppiaMetricLog.CurrentScreen) { + performanceMetricsController.logMediumPriorityMetricEvent( + oppiaClock.getCurrentTimeMs(), + currentScreen, + createMemoryUsageLoggableMetric(performanceMetricsAssessor.getTotalPssUsed()) + ) + } + + /** + * Logs the network usage of the application as a performance metric for the current state of the + * app. It must be noted that the value of this metric will change across calls during the same + * application instance. + * + * @param currentScreen denotes the application screen at which this metric has been logged + */ + fun logNetworkUsage(currentScreen: OppiaMetricLog.CurrentScreen) { + performanceMetricsController.logHighPriorityMetricEvent( + oppiaClock.getCurrentTimeMs(), + currentScreen, + createNetworkUsageLoggableMetric( + performanceMetricsAssessor.getTotalReceivedBytes(), + performanceMetricsAssessor.getTotalSentBytes() + ) + ) + } + + /** + * Logs the cpu usage of the application as a performance metric for the current state of the + * app. It must be noted that the value of this metric will change across calls during the same + * application instance. + * + * @param currentScreen denotes the application screen at which this metric has been logged + * @param cpuUsage denotes the current cpu usage of the application + */ + fun logCpuUsage(cpuUsage: Long, currentScreen: OppiaMetricLog.CurrentScreen) { + performanceMetricsController.logHighPriorityMetricEvent( + oppiaClock.getCurrentTimeMs(), + currentScreen, + createCpuUsageLoggableMetric(cpuUsage) + ) + } + + internal companion object { + /** + * Logs a high priority performance metric occurring at [currentScreen] defined by [loggableMetric]. + * + * This will schedule a background upload of the event if there's internet connectivity, otherwise + * it will cache the event for a later upload. + * + * This method should only be used for logging periodic metrics like network and cpu usage of the + * application. These metrics are important to log and should be prioritized over metrics logged + * via [logMediumPriorityMetricEvent] and [logLowPriorityMetricEvent]. + */ + private fun PerformanceMetricsController.logHighPriorityMetricEvent( + timestamp: Long, + currentScreen: OppiaMetricLog.CurrentScreen, + loggableMetric: OppiaMetricLog.LoggableMetric + ) { + logPerformanceMetricsEvent( + timestamp, + currentScreen, + loggableMetric, + OppiaMetricLog.Priority.HIGH_PRIORITY + ) + } + + /** + * Logs a medium priority performance metric occurring at [currentScreen] defined by [loggableMetric]. + * + * This will schedule a background upload of the event if there's internet connectivity, otherwise + * it will cache the event for a later upload. + * + * Medium priority metrics may be removed from the event cache if device space is limited, and + * there's no connectivity for immediately sending events. These metrics will however be + * prioritised over Low priority metrics. + * + * This method should only be used for logging ui-specific metrics like memory usage of the + * application. These metrics are important to log (but not as important as high priority metrics) + * and should be prioritized over metrics logged via [logLowPriorityMetricEvent]. + */ + private fun PerformanceMetricsController.logMediumPriorityMetricEvent( + timestamp: Long, + currentScreen: OppiaMetricLog.CurrentScreen, + loggableMetric: OppiaMetricLog.LoggableMetric + ) { + logPerformanceMetricsEvent( + timestamp, + currentScreen, + loggableMetric, + OppiaMetricLog.Priority.MEDIUM_PRIORITY + ) + } + + /** + * Logs a low priority performance metric occurring at [currentScreen] defined by [loggableMetric] + * corresponding to time [timestamp]. + * + * This will schedule a background upload of the event if there's internet connectivity, otherwise + * it will cache the event for a later upload. + * + * Low priority metrics may be removed from the event cache if device space is limited, and + * there's no connectivity for immediately sending events. + * + * This method should only be used for logging metrics that are to be logged at the beginning of + * the application like apk size and storage usage. + * + * Callers should use this for events that are nice to have, but okay to miss occasionally (as + * it's unexpected for events to actually be dropped since the app is configured to support a + * large number of cached events at one time). + */ + private fun PerformanceMetricsController.logLowPriorityMetricEvent( + timestamp: Long, + currentScreen: OppiaMetricLog.CurrentScreen, + loggableMetric: OppiaMetricLog.LoggableMetric + ) { + logPerformanceMetricsEvent( + timestamp, + currentScreen, + loggableMetric, + OppiaMetricLog.Priority.LOW_PRIORITY + ) + } + } + + /** + * Returns the loggable metric of the performance metric event log indicating the size of the + * apk file of the application. + */ + private fun createApkSizeLoggableMetric( + apkSize: Long + ): OppiaMetricLog.LoggableMetric { + return OppiaMetricLog.LoggableMetric.newBuilder() + .setApkSizeMetric( + OppiaMetricLog.ApkSizeMetric.newBuilder() + .setApkSizeBytes(apkSize) + .build() + ).build() + } + + /** + * Returns the loggable metric of the performance metric event log indicating the amount of + * storage space used by the application on user's device. + */ + private fun createStorageUsageLoggableMetric( + storageUsage: Long + ): OppiaMetricLog.LoggableMetric { + return OppiaMetricLog.LoggableMetric.newBuilder() + .setStorageUsageMetric( + OppiaMetricLog.StorageUsageMetric.newBuilder() + .setStorageUsageBytes(storageUsage) + .build() + ).build() + } + + /** + * Returns the loggable metric of the performance metric event log indicating the number of + * milliseconds required to start up the application from a cold start. + */ + private fun createStartupLatencyLoggableMetric( + startupLatency: Long + ): OppiaMetricLog.LoggableMetric { + return OppiaMetricLog.LoggableMetric.newBuilder() + .setStartupLatencyMetric( + OppiaMetricLog.StartupLatencyMetric.newBuilder() + .setStartupLatencyMillis(startupLatency) + .build() + ).build() + } + + /** + * Returns the loggable metric of the performance metric event log indicating the the amount of + * memory used by the application on user's device. + */ + private fun createMemoryUsageLoggableMetric( + totalPssBytes: Long + ): OppiaMetricLog.LoggableMetric { + return OppiaMetricLog.LoggableMetric.newBuilder() + .setMemoryUsageMetric( + OppiaMetricLog.MemoryUsageMetric.newBuilder() + .setTotalPssBytes(totalPssBytes) + .build() + ).build() + } + + /** + * Returns the loggable metric of the performance metric event log indicating the the amount of + * CPU used by the application on user's device. + */ + private fun createCpuUsageLoggableMetric( + cpuUsage: Long + ): OppiaMetricLog.LoggableMetric { + return OppiaMetricLog.LoggableMetric.newBuilder() + .setCpuUsageMetric( + OppiaMetricLog.CpuUsageMetric.newBuilder() + .setCpuUsageMetric(cpuUsage) + .build() + ).build() + } + + /** + * Returns the loggable metric of the performance metric event log indicating the the amount of + * network used by the application on user's device. + */ + private fun createNetworkUsageLoggableMetric( + totalBytesReceived: Long, + totalBytesSent: Long + ): OppiaMetricLog.LoggableMetric { + return OppiaMetricLog.LoggableMetric.newBuilder() + .setNetworkUsageMetric( + OppiaMetricLog.NetworkUsageMetric.newBuilder() + .setBytesSent(totalBytesSent) + .setBytesReceived(totalBytesReceived) + .build() + ).build() + } +} diff --git a/domain/src/main/java/org/oppia/android/domain/oppialogger/analytics/PerformanceMetricsLoggerModule.kt b/domain/src/main/java/org/oppia/android/domain/oppialogger/analytics/PerformanceMetricsLoggerModule.kt new file mode 100644 index 00000000000..e8cf37beac6 --- /dev/null +++ b/domain/src/main/java/org/oppia/android/domain/oppialogger/analytics/PerformanceMetricsLoggerModule.kt @@ -0,0 +1,16 @@ +package org.oppia.android.domain.oppialogger.analytics + +import dagger.Binds +import dagger.Module +import dagger.multibindings.IntoSet +import org.oppia.android.domain.oppialogger.ApplicationStartupListener + +/** Binds [PerformanceMetricsLogger] as an [ApplicationStartupListener] */ +@Module +abstract class PerformanceMetricsLoggerModule { + @Binds + @IntoSet + abstract fun providePerformanceMetricsLogger( + performanceMetricsLogger: PerformanceMetricsLogger + ): ApplicationStartupListener +} diff --git a/domain/src/main/java/org/oppia/android/domain/oppialogger/analytics/testing/BUILD.bazel b/domain/src/main/java/org/oppia/android/domain/oppialogger/analytics/testing/BUILD.bazel new file mode 100644 index 00000000000..a92a8aa723a --- /dev/null +++ b/domain/src/main/java/org/oppia/android/domain/oppialogger/analytics/testing/BUILD.bazel @@ -0,0 +1,22 @@ +""" +Package for testing utilities for log uploading functionality. +""" + +load("@dagger//:workspace_defs.bzl", "dagger_rules") +load("@io_bazel_rules_kotlin//kotlin:kotlin.bzl", "kt_android_library") + +kt_android_library( + name = "fake_log_scheduler", + testonly = True, + srcs = [ + "FakeLogScheduler.kt", + ], + visibility = ["//:oppia_testing_visibility"], + deps = [ + ":dagger", + "//utility/src/main/java/org/oppia/android/util/logging:log_uploader", + "//utility/src/main/java/org/oppia/android/util/logging:metric_log_scheduler", + ], +) + +dagger_rules() diff --git a/domain/src/main/java/org/oppia/android/domain/oppialogger/analytics/testing/FakeLogScheduler.kt b/domain/src/main/java/org/oppia/android/domain/oppialogger/analytics/testing/FakeLogScheduler.kt new file mode 100644 index 00000000000..12973e595fa --- /dev/null +++ b/domain/src/main/java/org/oppia/android/domain/oppialogger/analytics/testing/FakeLogScheduler.kt @@ -0,0 +1,58 @@ +package org.oppia.android.domain.oppialogger.analytics.testing + +import androidx.work.PeriodicWorkRequest +import androidx.work.WorkManager +import org.oppia.android.util.logging.MetricLogScheduler +import java.util.UUID +import javax.inject.Inject +import javax.inject.Singleton + +/** A test specific fake for the log uploader. */ +@Singleton +class FakeLogScheduler @Inject constructor() : MetricLogScheduler { + private val schedulingStorageUsageMetricLoggingRequestIdList = mutableListOf() + private val schedulingPeriodicUiMetricLoggingRequestIdList = mutableListOf() + private val schedulingPeriodicBackgroundMetricsLoggingRequestIdList = mutableListOf() + + override fun enqueueWorkRequestForPeriodicBackgroundMetrics( + workManager: WorkManager, + workRequest: PeriodicWorkRequest + ) { + schedulingPeriodicBackgroundMetricsLoggingRequestIdList.add(workRequest.id) + } + + override fun enqueueWorkRequestForStorageUsage( + workManager: WorkManager, + workRequest: PeriodicWorkRequest + ) { + schedulingStorageUsageMetricLoggingRequestIdList.add(workRequest.id) + } + + override fun enqueueWorkRequestForPeriodicUiMetrics( + workManager: WorkManager, + workRequest: PeriodicWorkRequest + ) { + schedulingPeriodicUiMetricLoggingRequestIdList.add(workRequest.id) + } + + /** + * Returns the most recent work request id that's stored in the + * [schedulingStorageUsageMetricLoggingRequestIdList]. + */ + fun getMostRecentStorageUsageMetricLoggingRequestId() = + schedulingStorageUsageMetricLoggingRequestIdList.last() + + /** + * Returns the most recent work request id that's stored in the + * [schedulingPeriodicUiMetricLoggingRequestIdList]. + */ + fun getMostRecentPeriodicUiMetricLoggingRequestId() = + schedulingPeriodicUiMetricLoggingRequestIdList.last() + + /** + * Returns the most recent work request id that's stored in the + * [schedulingPeriodicBackgroundMetricsLoggingRequestIdList]. + */ + fun getMostRecentPeriodicBackgroundMetricLoggingRequestId() = + schedulingPeriodicBackgroundMetricsLoggingRequestIdList.last() +} diff --git a/domain/src/main/java/org/oppia/android/domain/oppialogger/logscheduler/BUILD.bazel b/domain/src/main/java/org/oppia/android/domain/oppialogger/logscheduler/BUILD.bazel new file mode 100644 index 00000000000..66c38ba23a2 --- /dev/null +++ b/domain/src/main/java/org/oppia/android/domain/oppialogger/logscheduler/BUILD.bazel @@ -0,0 +1,61 @@ +""" +Library for providing log scheduling functionality to the Oppia android app. +""" + +load("@dagger//:workspace_defs.bzl", "dagger_rules") +load("@io_bazel_rules_kotlin//kotlin:kotlin.bzl", "kt_android_library") + +kt_android_library( + name = "performance_metrics_log_scheduler", + srcs = [ + "PerformanceMetricsLogScheduler.kt", + ], + deps = [ + ":metric_log_scheduling_worker", + "//third_party:androidx_work_work-runtime-ktx", + "//utility/src/main/java/org/oppia/android/util/logging:metric_log_scheduler", + ], +) + +kt_android_library( + name = "metric_log_scheduling_worker", + srcs = [ + "MetricLogSchedulingWorker.kt", + ], + visibility = ["//:oppia_api_visibility"], + deps = [ + "//domain/src/main/java/org/oppia/android/domain/oppialogger/exceptions:controller", + "//domain/src/main/java/org/oppia/android/domain/util:extensions", + "//third_party:androidx_work_work-runtime-ktx", + "//utility/src/main/java/org/oppia/android/util/logging:console_logger", + "//utility/src/main/java/org/oppia/android/util/threading:annotations", + ], +) + +kt_android_library( + name = "metric_log_scheduling_worker_factory", + srcs = [ + "MetricLogSchedulingWorkerFactory.kt", + ], + visibility = ["//domain:__pkg__"], + deps = [ + ":metric_log_scheduling_worker", + "//third_party:androidx_work_work-runtime-ktx", + ], +) + +kt_android_library( + name = "metric_log_scheduler_module", + srcs = [ + "MetricLogSchedulerModule.kt", + ], + visibility = ["//:oppia_prod_module_visibility"], + deps = [ + ":dagger", + ":performance_metrics_log_scheduler", + "//domain/src/main/java/org/oppia/android/domain/oppialogger:startup_listener", + "//utility/src/main/java/org/oppia/android/util/logging:metric_log_scheduler", + ], +) + +dagger_rules() diff --git a/domain/src/main/java/org/oppia/android/domain/oppialogger/logscheduler/MetricLogSchedulerModule.kt b/domain/src/main/java/org/oppia/android/domain/oppialogger/logscheduler/MetricLogSchedulerModule.kt new file mode 100644 index 00000000000..7594d6460ec --- /dev/null +++ b/domain/src/main/java/org/oppia/android/domain/oppialogger/logscheduler/MetricLogSchedulerModule.kt @@ -0,0 +1,14 @@ +package org.oppia.android.domain.oppialogger.logscheduler + +import dagger.Binds +import dagger.Module +import org.oppia.android.util.logging.MetricLogScheduler + +/** Provides metric log scheduler related dependencies. */ +@Module +abstract class MetricLogSchedulerModule { + @Binds + abstract fun provideMetricLogScheduler( + performanceMetricLogScheduler: PerformanceMetricsLogScheduler + ): MetricLogScheduler +} diff --git a/domain/src/main/java/org/oppia/android/domain/oppialogger/logscheduler/MetricLogSchedulingWorker.kt b/domain/src/main/java/org/oppia/android/domain/oppialogger/logscheduler/MetricLogSchedulingWorker.kt new file mode 100644 index 00000000000..8767b2206a1 --- /dev/null +++ b/domain/src/main/java/org/oppia/android/domain/oppialogger/logscheduler/MetricLogSchedulingWorker.kt @@ -0,0 +1,125 @@ +package org.oppia.android.domain.oppialogger.logscheduler + +import android.content.Context +import androidx.work.ListenableWorker +import androidx.work.WorkerParameters +import com.google.common.util.concurrent.ListenableFuture +import com.google.common.util.concurrent.SettableFuture +import kotlinx.coroutines.CoroutineDispatcher +import kotlinx.coroutines.CoroutineScope +import kotlinx.coroutines.async +import org.oppia.android.domain.util.getStringFromData +import org.oppia.android.util.logging.ConsoleLogger +import org.oppia.android.util.threading.BackgroundDispatcher +import javax.inject.Inject + +/** + * Worker class that generates metric log reports regarding the performance of the application + * and then stores it in in device cache. + */ +class MetricLogSchedulingWorker private constructor( + context: Context, + params: WorkerParameters, + private val consoleLogger: ConsoleLogger, + @BackgroundDispatcher private val backgroundDispatcher: CoroutineDispatcher +) : ListenableWorker(context, params) { + + companion object { + private const val TAG = "MetricLogSchedulingWorker" + /** + * The key for an input key-value pair for [MetricLogSchedulingWorker] where one of + * [PERIODIC_BACKGROUND_METRIC_WORKER], [PERIODIC_UI_METRIC_WORKER] and [STORAGE_USAGE_WORKER] indicates what + * kind of work to perform. + */ + const val WORKER_CASE_KEY = "metric_log_scheduling_worker_case_key" + /** + * Indicates to [MetricLogSchedulingWorker] that it should schedule logging for periodic + * performance metrics. + */ + const val PERIODIC_BACKGROUND_METRIC_WORKER = "periodic_background_metric_worker" + /** + * Indicates to [MetricLogSchedulingWorker] that it should schedule logging for storage usage + * performance metrics. + */ + const val STORAGE_USAGE_WORKER = "storage_usage_worker" + /** + * Indicates to [MetricLogSchedulingWorker] that it should schedule logging for ui-related + * memory usage performance metrics. + */ + const val PERIODIC_UI_METRIC_WORKER = "periodic_ui_metric_worker" + } + + override fun startWork(): ListenableFuture { + val backgroundScope = CoroutineScope(backgroundDispatcher) + val result = backgroundScope.async { + when (inputData.getStringFromData(WORKER_CASE_KEY)) { + PERIODIC_BACKGROUND_METRIC_WORKER -> schedulePeriodicBackgroundMetricLogging() + STORAGE_USAGE_WORKER -> scheduleStorageUsageMetricLogging() + PERIODIC_UI_METRIC_WORKER -> schedulePeriodicUiMetricLogging() + else -> Result.failure() + } + } + + val future = SettableFuture.create() + result.invokeOnCompletion { failure -> + if (failure != null) { + future.setException(failure) + } else { + future.set(result.getCompleted()) + } + } + // TODO(#3715): Add withTimeout() to avoid potential hanging. + return future + } + + private fun schedulePeriodicBackgroundMetricLogging(): Result { + return try { + // TODO(#4340): Add functionality to log cpu and network usage performance metrics. + Result.success() + } catch (e: Exception) { + consoleLogger.e(TAG, e.toString(), e) + return Result.failure() + } + } + + private fun scheduleStorageUsageMetricLogging(): Result { + return try { + // TODO(#4340): Add functionality to log storage usage performance metrics. + Result.success() + } catch (e: Exception) { + consoleLogger.e(TAG, e.toString(), e) + return Result.failure() + } + } + + private fun schedulePeriodicUiMetricLogging(): Result { + return try { + // TODO(#4340): Add functionality to log memory usage performance metrics. + Result.success() + } catch (e: Exception) { + consoleLogger.e(TAG, e.toString(), e) + return Result.failure() + } + } + + /** Creates an instance of [MetricLogSchedulingWorker] by properly injecting dependencies. */ + class Factory @Inject constructor( + private val consoleLogger: ConsoleLogger, + @BackgroundDispatcher private val backgroundDispatcher: CoroutineDispatcher + ) { + /** + * Returns a new [MetricLogSchedulingWorker]. + * + * This [MetricLogSchedulingWorker] implements the [ListenableWorker] for facilitating metric + * log scheduling. + */ + fun create(context: Context, params: WorkerParameters): ListenableWorker { + return MetricLogSchedulingWorker( + context, + params, + consoleLogger, + backgroundDispatcher + ) + } + } +} diff --git a/domain/src/main/java/org/oppia/android/domain/oppialogger/logscheduler/MetricLogSchedulingWorkerFactory.kt b/domain/src/main/java/org/oppia/android/domain/oppialogger/logscheduler/MetricLogSchedulingWorkerFactory.kt new file mode 100644 index 00000000000..c8dae69942e --- /dev/null +++ b/domain/src/main/java/org/oppia/android/domain/oppialogger/logscheduler/MetricLogSchedulingWorkerFactory.kt @@ -0,0 +1,22 @@ +package org.oppia.android.domain.oppialogger.logscheduler + +import android.content.Context +import androidx.work.ListenableWorker +import androidx.work.WorkerFactory +import androidx.work.WorkerParameters +import javax.inject.Inject + +/** Custom [WorkerFactory] for the [MetricLogSchedulingWorker]. */ +class MetricLogSchedulingWorkerFactory @Inject constructor( + private val workerFactory: MetricLogSchedulingWorker.Factory +) : WorkerFactory() { + + /** Returns a new [MetricLogSchedulingWorker] for the given context and parameters. */ + override fun createWorker( + appContext: Context, + workerClassName: String, + workerParameters: WorkerParameters + ): ListenableWorker { + return workerFactory.create(appContext, workerParameters) + } +} diff --git a/domain/src/main/java/org/oppia/android/domain/oppialogger/logscheduler/PerformanceMetricsLogScheduler.kt b/domain/src/main/java/org/oppia/android/domain/oppialogger/logscheduler/PerformanceMetricsLogScheduler.kt new file mode 100644 index 00000000000..de82dc42dfa --- /dev/null +++ b/domain/src/main/java/org/oppia/android/domain/oppialogger/logscheduler/PerformanceMetricsLogScheduler.kt @@ -0,0 +1,50 @@ +package org.oppia.android.domain.oppialogger.logscheduler + +import androidx.work.ExistingPeriodicWorkPolicy +import androidx.work.PeriodicWorkRequest +import androidx.work.WorkManager +import org.oppia.android.util.logging.MetricLogScheduler +import javax.inject.Inject + +private const val OPPIA_PERIODIC_METRIC_WORK = "OPPIA_PERIODIC_METRIC_WORK" +private const val OPPIA_STORAGE_USAGE_WORK = "OPPIA_STORAGE_USAGE_WORK" +private const val OPPIA_MEMORY_USAGE_WORK = "OPPIA_MEMORY_USAGE_WORK" + +/** + * Enqueues work requests for generating metric log reports for gaining an insight regarding into + * the performance of the application. + */ +class PerformanceMetricsLogScheduler @Inject constructor() : MetricLogScheduler { + override fun enqueueWorkRequestForPeriodicBackgroundMetrics( + workManager: WorkManager, + workRequest: PeriodicWorkRequest + ) { + workManager.enqueueUniquePeriodicWork( + OPPIA_PERIODIC_METRIC_WORK, + ExistingPeriodicWorkPolicy.KEEP, + workRequest + ) + } + + override fun enqueueWorkRequestForStorageUsage( + workManager: WorkManager, + workRequest: PeriodicWorkRequest + ) { + workManager.enqueueUniquePeriodicWork( + OPPIA_STORAGE_USAGE_WORK, + ExistingPeriodicWorkPolicy.KEEP, + workRequest + ) + } + + override fun enqueueWorkRequestForPeriodicUiMetrics( + workManager: WorkManager, + workRequest: PeriodicWorkRequest + ) { + workManager.enqueueUniquePeriodicWork( + OPPIA_MEMORY_USAGE_WORK, + ExistingPeriodicWorkPolicy.KEEP, + workRequest + ) + } +} diff --git a/domain/src/main/java/org/oppia/android/domain/oppialogger/loguploader/BUILD.bazel b/domain/src/main/java/org/oppia/android/domain/oppialogger/loguploader/BUILD.bazel index dceb88ec499..5b8f53e4f17 100644 --- a/domain/src/main/java/org/oppia/android/domain/oppialogger/loguploader/BUILD.bazel +++ b/domain/src/main/java/org/oppia/android/domain/oppialogger/loguploader/BUILD.bazel @@ -8,13 +8,15 @@ load("@io_bazel_rules_kotlin//kotlin:kotlin.bzl", "kt_android_library") kt_android_library( name = "initializer", srcs = [ - "LogUploadWorkManagerInitializer.kt", + "LogReportWorkManagerInitializer.kt", ], deps = [ ":worker", "//domain/src/main/java/org/oppia/android/domain/oppialogger:startup_listener", + "//domain/src/main/java/org/oppia/android/domain/oppialogger/logscheduler:metric_log_scheduling_worker", "//third_party:androidx_work_work-runtime-ktx", "//utility/src/main/java/org/oppia/android/util/logging:log_uploader", + "//utility/src/main/java/org/oppia/android/util/logging:metric_log_scheduler", ], ) @@ -50,7 +52,7 @@ kt_android_library( kt_android_library( name = "worker_module", srcs = [ - "LogUploadWorkerModule.kt", + "LogReportWorkerModule.kt", ], visibility = ["//:oppia_prod_module_visibility"], deps = [ diff --git a/domain/src/main/java/org/oppia/android/domain/oppialogger/loguploader/LogReportWorkManagerInitializer.kt b/domain/src/main/java/org/oppia/android/domain/oppialogger/loguploader/LogReportWorkManagerInitializer.kt new file mode 100644 index 00000000000..3bab2316a2b --- /dev/null +++ b/domain/src/main/java/org/oppia/android/domain/oppialogger/loguploader/LogReportWorkManagerInitializer.kt @@ -0,0 +1,195 @@ +package org.oppia.android.domain.oppialogger.loguploader + +import android.content.Context +import androidx.work.Constraints +import androidx.work.Data +import androidx.work.NetworkType +import androidx.work.PeriodicWorkRequest +import androidx.work.WorkManager +import org.oppia.android.domain.oppialogger.ApplicationStartupListener +import org.oppia.android.domain.oppialogger.logscheduler.MetricLogSchedulingWorker +import org.oppia.android.util.logging.LogUploader +import org.oppia.android.util.logging.MetricLogScheduler +import org.oppia.android.util.platformparameter.PerformanceMetricsCollectionHighFrequencyTimeIntervalInMinutes +import org.oppia.android.util.platformparameter.PerformanceMetricsCollectionLowFrequencyTimeIntervalInMinutes +import org.oppia.android.util.platformparameter.PlatformParameterValue +import java.util.UUID +import java.util.concurrent.TimeUnit +import javax.inject.Inject + +/** + * Enqueues unique periodic work requests for uploading events and exceptions to the remote service + * on application creation. + */ +class LogReportWorkManagerInitializer @Inject constructor( + private val context: Context, + private val logUploader: LogUploader, + private val metricLogScheduler: MetricLogScheduler, + @PerformanceMetricsCollectionHighFrequencyTimeIntervalInMinutes + performanceMetricsCollectionHighFrequencyTimeInterval: PlatformParameterValue, + @PerformanceMetricsCollectionLowFrequencyTimeIntervalInMinutes + performanceMetricCollectionLowFrequencyTimeInterval: PlatformParameterValue +) : ApplicationStartupListener { + + private val logReportWorkerConstraints = Constraints.Builder() + .setRequiredNetworkType(NetworkType.CONNECTED) + .setRequiresBatteryNotLow(true) + .build() + + private val workerCaseForUploadingEvents: Data = Data.Builder() + .putString( + LogUploadWorker.WORKER_CASE_KEY, + LogUploadWorker.EVENT_WORKER + ) + .build() + + private val workerCaseForUploadingExceptions: Data = Data.Builder() + .putString( + LogUploadWorker.WORKER_CASE_KEY, + LogUploadWorker.EXCEPTION_WORKER + ) + .build() + + private val workerCaseForSchedulingPeriodicBackgroundMetricLogs: Data = Data.Builder() + .putString( + MetricLogSchedulingWorker.WORKER_CASE_KEY, + MetricLogSchedulingWorker.PERIODIC_BACKGROUND_METRIC_WORKER + ) + .build() + + private val workerCaseForSchedulingStorageUsageMetricLogs: Data = Data.Builder() + .putString( + MetricLogSchedulingWorker.WORKER_CASE_KEY, + MetricLogSchedulingWorker.STORAGE_USAGE_WORKER + ) + .build() + + private val workerCaseForSchedulingPeriodicUiMetricLogs: Data = Data.Builder() + .putString( + MetricLogSchedulingWorker.WORKER_CASE_KEY, + MetricLogSchedulingWorker.PERIODIC_UI_METRIC_WORKER + ) + .build() + + private val workRequestForUploadingEvents: PeriodicWorkRequest = PeriodicWorkRequest + .Builder(LogUploadWorker::class.java, 6, TimeUnit.HOURS) + .setInputData(workerCaseForUploadingEvents) + .setConstraints(logReportWorkerConstraints) + .build() + + private val workRequestForUploadingExceptions: PeriodicWorkRequest = PeriodicWorkRequest + .Builder(LogUploadWorker::class.java, 6, TimeUnit.HOURS) + .setInputData(workerCaseForUploadingExceptions) + .setConstraints(logReportWorkerConstraints) + .build() + + private val workRequestForSchedulingPeriodicBackgroundMetricLogs: PeriodicWorkRequest = + PeriodicWorkRequest.Builder( + MetricLogSchedulingWorker::class.java, + performanceMetricsCollectionHighFrequencyTimeInterval.value.toLong(), + TimeUnit.MINUTES + ) + .setInputData(workerCaseForSchedulingPeriodicBackgroundMetricLogs) + .setConstraints(logReportWorkerConstraints) + .build() + + private val workRequestForSchedulingStorageUsageMetricLogs: PeriodicWorkRequest = + PeriodicWorkRequest.Builder( + MetricLogSchedulingWorker::class.java, + performanceMetricCollectionLowFrequencyTimeInterval.value.toLong(), + TimeUnit.MINUTES + ) + .setInputData(workerCaseForSchedulingStorageUsageMetricLogs) + .setConstraints(logReportWorkerConstraints) + .build() + + private val workRequestForSchedulingPeriodicUiMetricLogs: PeriodicWorkRequest = + PeriodicWorkRequest.Builder( + MetricLogSchedulingWorker::class.java, + performanceMetricsCollectionHighFrequencyTimeInterval.value.toLong(), + TimeUnit.MINUTES + ) + .setInputData(workerCaseForSchedulingPeriodicUiMetricLogs) + .setConstraints(logReportWorkerConstraints) + .build() + + override fun onCreate() { + val workManager = WorkManager.getInstance(context) + logUploader.enqueueWorkRequestForEvents(workManager, workRequestForUploadingEvents) + logUploader.enqueueWorkRequestForExceptions(workManager, workRequestForUploadingExceptions) + metricLogScheduler.enqueueWorkRequestForPeriodicBackgroundMetrics( + workManager, + workRequestForSchedulingPeriodicBackgroundMetricLogs + ) + metricLogScheduler.enqueueWorkRequestForStorageUsage( + workManager, + workRequestForSchedulingStorageUsageMetricLogs + ) + metricLogScheduler.enqueueWorkRequestForPeriodicUiMetrics( + workManager, + workRequestForSchedulingPeriodicUiMetricLogs + ) + } + + /** Returns the worker constraints set for the log reporting work requests. */ + fun getLogReportWorkerConstraints(): Constraints = logReportWorkerConstraints + + /** Returns the [UUID] of the work request that is enqueued for uploading event logs. */ + fun getWorkRequestForEventsId(): UUID = workRequestForUploadingEvents.id + + /** Returns the [UUID] of the work request that is enqueued for uploading exception logs. */ + fun getWorkRequestForExceptionsId(): UUID = workRequestForUploadingExceptions.id + + /** + * Returns the [UUID] of the work request that is enqueued for scheduling memory usage + * performance metrics collection. + */ + fun getWorkRequestForSchedulingPeriodicUiMetricLogsId(): UUID = + workRequestForSchedulingPeriodicUiMetricLogs.id + + /** + * Returns the [UUID] of the work request that is enqueued for scheduling storage usage + * performance metrics collection. + */ + fun getWorkRequestForSchedulingStorageUsageMetricLogsId(): UUID = + workRequestForSchedulingStorageUsageMetricLogs.id + + /** + * Returns the [UUID] of the work request that is enqueued for scheduling periodic performance + * metrics collection. + */ + fun getWorkRequestForSchedulingPeriodicBackgroundPerformanceMetricLogsId(): UUID = + workRequestForSchedulingPeriodicBackgroundMetricLogs.id + + /** + * Returns the [Data] that goes into the work request that is enqueued for uploading event logs. + */ + fun getWorkRequestDataForEvents(): Data = workerCaseForUploadingEvents + + /** + * Returns the [Data] that goes into the work request that is enqueued for uploading exception + * logs. + */ + fun getWorkRequestDataForExceptions(): Data = workerCaseForUploadingExceptions + + /** + * Returns the [Data] that goes into the work request that is enqueued for scheduling storage + * usage performance metrics collection. + */ + fun getWorkRequestDataForSchedulingStorageUsageMetricLogs(): Data = + workerCaseForSchedulingStorageUsageMetricLogs + + /** + * Returns the [Data] that goes into the work request that is enqueued for scheduling memory + * usage performance metrics collection. + */ + fun getWorkRequestDataForSchedulingPeriodicUiMetricLogs(): Data = + workerCaseForSchedulingPeriodicUiMetricLogs + + /** + * Returns the [Data] that goes into the work request that is enqueued for scheduling periodic + * performance metrics collection. + */ + fun getWorkRequestDataForSchedulingPeriodicBackgroundPerformanceMetricLogs(): Data = + workerCaseForSchedulingPeriodicBackgroundMetricLogs +} diff --git a/domain/src/main/java/org/oppia/android/domain/oppialogger/loguploader/LogUploadWorkerModule.kt b/domain/src/main/java/org/oppia/android/domain/oppialogger/loguploader/LogReportWorkerModule.kt similarity index 71% rename from domain/src/main/java/org/oppia/android/domain/oppialogger/loguploader/LogUploadWorkerModule.kt rename to domain/src/main/java/org/oppia/android/domain/oppialogger/loguploader/LogReportWorkerModule.kt index 97da4387bc0..d3b8e0efbfc 100644 --- a/domain/src/main/java/org/oppia/android/domain/oppialogger/loguploader/LogUploadWorkerModule.kt +++ b/domain/src/main/java/org/oppia/android/domain/oppialogger/loguploader/LogReportWorkerModule.kt @@ -7,11 +7,11 @@ import org.oppia.android.domain.oppialogger.ApplicationStartupListener /** Provides [LogUploadWorker] related dependencies. */ @Module -interface LogUploadWorkerModule { +interface LogReportWorkerModule { @Binds @IntoSet - fun bindLogUploadWorkRequest( - logUploadWorkManagerInitializer: LogUploadWorkManagerInitializer + fun bindLogReportWorkRequest( + logReportWorkManagerInitializer: LogReportWorkManagerInitializer ): ApplicationStartupListener } diff --git a/domain/src/main/java/org/oppia/android/domain/oppialogger/loguploader/LogUploadWorkManagerInitializer.kt b/domain/src/main/java/org/oppia/android/domain/oppialogger/loguploader/LogUploadWorkManagerInitializer.kt deleted file mode 100644 index 5eafd701c40..00000000000 --- a/domain/src/main/java/org/oppia/android/domain/oppialogger/loguploader/LogUploadWorkManagerInitializer.kt +++ /dev/null @@ -1,74 +0,0 @@ -package org.oppia.android.domain.oppialogger.loguploader - -import android.content.Context -import androidx.work.Constraints -import androidx.work.Data -import androidx.work.NetworkType -import androidx.work.PeriodicWorkRequest -import androidx.work.WorkManager -import org.oppia.android.domain.oppialogger.ApplicationStartupListener -import org.oppia.android.util.logging.LogUploader -import java.util.UUID -import java.util.concurrent.TimeUnit -import javax.inject.Inject -import javax.inject.Singleton - -/** Enqueues unique periodic work requests for uploading events and exceptions to the remote service on application creation. */ -@Singleton -class LogUploadWorkManagerInitializer @Inject constructor( - private val context: Context, - private val logUploader: LogUploader -) : ApplicationStartupListener { - - private val logUploadWorkerConstraints = Constraints.Builder() - .setRequiredNetworkType(NetworkType.CONNECTED) - .setRequiresBatteryNotLow(true) - .build() - - private val workerCaseForUploadingEvents: Data = Data.Builder() - .putString( - LogUploadWorker.WORKER_CASE_KEY, - LogUploadWorker.EVENT_WORKER - ) - .build() - - private val workerCaseForUploadingExceptions: Data = Data.Builder() - .putString( - LogUploadWorker.WORKER_CASE_KEY, - LogUploadWorker.EXCEPTION_WORKER - ) - .build() - - private val workRequestForUploadingEvents: PeriodicWorkRequest = PeriodicWorkRequest - .Builder(LogUploadWorker::class.java, 6, TimeUnit.HOURS) - .setInputData(workerCaseForUploadingEvents) - .setConstraints(logUploadWorkerConstraints) - .build() - - private val workRequestForUploadingExceptions: PeriodicWorkRequest = PeriodicWorkRequest - .Builder(LogUploadWorker::class.java, 6, TimeUnit.HOURS) - .setInputData(workerCaseForUploadingExceptions) - .setConstraints(logUploadWorkerConstraints) - .build() - - override fun onCreate() { - val workManager = WorkManager.getInstance(context) - logUploader.enqueueWorkRequestForEvents(workManager, workRequestForUploadingEvents) - logUploader.enqueueWorkRequestForExceptions(workManager, workRequestForUploadingExceptions) - } - - /** Returns the worker constraints set for the log uploading work requests. */ - fun getLogUploadWorkerConstraints(): Constraints = logUploadWorkerConstraints - - /** Returns the [UUID] of the work request that is enqueued for uploading event logs. */ - fun getWorkRequestForEventsId(): UUID = workRequestForUploadingEvents.id - - /** Returns the [UUID] of the work request that is enqueued for uploading exception logs. */ - fun getWorkRequestForExceptionsId(): UUID = workRequestForUploadingExceptions.id - - /** Returns the [Data] that goes into the work request that is enqueued for uploading event logs. */ - fun getWorkRequestDataForEvents(): Data = workerCaseForUploadingEvents - - /** Returns the [Data] that goes into the work request that is enqueued for uploading exception logs. */ - fun getWorkRequestDataForExceptions(): Data = workerCaseForUploadingExceptions -} diff --git a/domain/src/main/java/org/oppia/android/domain/workmanager/WorkManagerConfigurationModule.kt b/domain/src/main/java/org/oppia/android/domain/workmanager/WorkManagerConfigurationModule.kt index 88244242d3c..11fa8e5f82f 100644 --- a/domain/src/main/java/org/oppia/android/domain/workmanager/WorkManagerConfigurationModule.kt +++ b/domain/src/main/java/org/oppia/android/domain/workmanager/WorkManagerConfigurationModule.kt @@ -4,6 +4,7 @@ import androidx.work.Configuration import androidx.work.DelegatingWorkerFactory import dagger.Module import dagger.Provides +import org.oppia.android.domain.oppialogger.logscheduler.MetricLogSchedulingWorkerFactory import org.oppia.android.domain.oppialogger.loguploader.LogUploadWorkerFactory import org.oppia.android.domain.platformparameter.syncup.PlatformParameterSyncUpWorkerFactory import javax.inject.Singleton @@ -16,11 +17,13 @@ class WorkManagerConfigurationModule { @Provides fun provideWorkManagerConfiguration( logUploadWorkerFactory: LogUploadWorkerFactory, - platformParameterSyncUpWorkerFactory: PlatformParameterSyncUpWorkerFactory + platformParameterSyncUpWorkerFactory: PlatformParameterSyncUpWorkerFactory, + metricLogSchedulingWorkerFactory: MetricLogSchedulingWorkerFactory ): Configuration { val delegatingWorkerFactory = DelegatingWorkerFactory() delegatingWorkerFactory.addFactory(logUploadWorkerFactory) delegatingWorkerFactory.addFactory(platformParameterSyncUpWorkerFactory) + delegatingWorkerFactory.addFactory(metricLogSchedulingWorkerFactory) return Configuration.Builder().setWorkerFactory(delegatingWorkerFactory).build() } } diff --git a/domain/src/test/java/org/oppia/android/domain/oppialogger/analytics/ApplicationLifecycleObserverTest.kt b/domain/src/test/java/org/oppia/android/domain/oppialogger/analytics/ApplicationLifecycleObserverTest.kt index 0b27589fbd2..2127964d663 100644 --- a/domain/src/test/java/org/oppia/android/domain/oppialogger/analytics/ApplicationLifecycleObserverTest.kt +++ b/domain/src/test/java/org/oppia/android/domain/oppialogger/analytics/ApplicationLifecycleObserverTest.kt @@ -63,6 +63,7 @@ class ApplicationLifecycleObserverTest { @Inject lateinit var monitorFactory: DataProviderTestMonitor.Factory @Inject lateinit var fakeEventLogger: FakeEventLogger @Inject lateinit var profileManagementController: ProfileManagementController + @Inject lateinit var performanceMetricsController: PerformanceMetricsController @Test fun testObserver_getSessionId_backgroundApp_thenForeground_limitExceeded_sessionIdUpdated() { @@ -152,6 +153,22 @@ class ApplicationLifecycleObserverTest { } } + @Test + fun testObserver_onAppInForeground_setsAppInForeground() { + setUpTestApplicationComponent() + applicationLifecycleObserver.onAppInForeground() + + assertThat(performanceMetricsController.getIsAppInForeground()).isTrue() + } + + @Test + fun testObserver_onAppInBackground_setsAppInBackground() { + setUpTestApplicationComponent() + applicationLifecycleObserver.onAppInBackground() + + assertThat(performanceMetricsController.getIsAppInForeground()).isFalse() + } + private fun waitInBackgroundFor(millis: Long) { applicationLifecycleObserver.onAppInBackground() testCoroutineDispatchers.runCurrent() diff --git a/domain/src/test/java/org/oppia/android/domain/oppialogger/analytics/PerformanceMetricsControllerTest.kt b/domain/src/test/java/org/oppia/android/domain/oppialogger/analytics/PerformanceMetricsControllerTest.kt new file mode 100644 index 00000000000..df198f52b8b --- /dev/null +++ b/domain/src/test/java/org/oppia/android/domain/oppialogger/analytics/PerformanceMetricsControllerTest.kt @@ -0,0 +1,555 @@ +package org.oppia.android.domain.oppialogger.analytics + +import android.app.Application +import android.content.Context +import androidx.test.core.app.ApplicationProvider +import androidx.test.runner.AndroidJUnit4 +import com.google.common.truth.Truth.assertThat +import dagger.BindsInstance +import dagger.Component +import dagger.Module +import dagger.Provides +import org.junit.Before +import org.junit.Test +import org.junit.runner.RunWith +import org.oppia.android.app.model.OppiaMetricLog +import org.oppia.android.app.model.OppiaMetricLog.CurrentScreen.SCREEN_UNSPECIFIED +import org.oppia.android.app.model.OppiaMetricLog.LoggableMetric.LoggableMetricTypeCase.APK_SIZE_METRIC +import org.oppia.android.app.model.OppiaMetricLog.LoggableMetric.LoggableMetricTypeCase.CPU_USAGE_METRIC +import org.oppia.android.app.model.OppiaMetricLog.LoggableMetric.LoggableMetricTypeCase.MEMORY_USAGE_METRIC +import org.oppia.android.app.model.OppiaMetricLog.LoggableMetric.LoggableMetricTypeCase.NETWORK_USAGE_METRIC +import org.oppia.android.app.model.OppiaMetricLog.LoggableMetric.LoggableMetricTypeCase.STARTUP_LATENCY_METRIC +import org.oppia.android.app.model.OppiaMetricLog.LoggableMetric.LoggableMetricTypeCase.STORAGE_USAGE_METRIC +import org.oppia.android.app.model.OppiaMetricLog.Priority.HIGH_PRIORITY +import org.oppia.android.app.model.OppiaMetricLog.Priority.LOW_PRIORITY +import org.oppia.android.app.model.OppiaMetricLog.Priority.MEDIUM_PRIORITY +import org.oppia.android.domain.oppialogger.EventLogStorageCacheSize +import org.oppia.android.domain.oppialogger.LoggingIdentifierModule +import org.oppia.android.domain.oppialogger.OppiaLogger +import org.oppia.android.domain.oppialogger.PerformanceMetricsLogStorageCacheSize +import org.oppia.android.domain.oppialogger.logscheduler.MetricLogSchedulerModule +import org.oppia.android.domain.platformparameter.PlatformParameterModule +import org.oppia.android.domain.platformparameter.PlatformParameterSingletonModule +import org.oppia.android.testing.FakePerformanceMetricsEventLogger +import org.oppia.android.testing.TestLogReportingModule +import org.oppia.android.testing.data.DataProviderTestMonitor +import org.oppia.android.testing.logging.SyncStatusTestModule +import org.oppia.android.testing.robolectric.RobolectricModule +import org.oppia.android.testing.threading.TestDispatcherModule +import org.oppia.android.testing.time.FakeOppiaClock +import org.oppia.android.testing.time.FakeOppiaClockModule +import org.oppia.android.util.data.DataProviders +import org.oppia.android.util.data.DataProvidersInjector +import org.oppia.android.util.data.DataProvidersInjectorProvider +import org.oppia.android.util.locale.LocaleProdModule +import org.oppia.android.util.logging.EnableConsoleLog +import org.oppia.android.util.logging.EnableFileLog +import org.oppia.android.util.logging.GlobalLogLevel +import org.oppia.android.util.logging.LogLevel +import org.oppia.android.util.networking.NetworkConnectionDebugUtil +import org.oppia.android.util.networking.NetworkConnectionUtil.ProdConnectionStatus.NONE +import org.oppia.android.util.networking.NetworkConnectionUtilDebugModule +import org.robolectric.annotation.Config +import org.robolectric.annotation.LooperMode +import javax.inject.Inject +import javax.inject.Singleton + +private const val TEST_TIMESTAMP = Long.MAX_VALUE +private const val TEST_CPU_USAGE = Long.MAX_VALUE +private const val TEST_APK_SIZE = Long.MAX_VALUE +private const val TEST_STORAGE_USAGE = Long.MAX_VALUE +private const val TEST_STARTUP_LATENCY = Long.MAX_VALUE +private const val TEST_NETWORK_USAGE = Long.MAX_VALUE +private const val TEST_MEMORY_USAGE = Long.MAX_VALUE + +/** Tests for [PerformanceMetricsController]. */ +// FunctionName: test names are conventionally named with underscores. +@Suppress("FunctionName") +@RunWith(AndroidJUnit4::class) +@LooperMode(LooperMode.Mode.PAUSED) +@Config(application = PerformanceMetricsControllerTest.TestApplication::class) +class PerformanceMetricsControllerTest { + + @Inject + lateinit var performanceMetricsController: PerformanceMetricsController + + @Inject + lateinit var oppiaLogger: OppiaLogger + + @Inject + lateinit var networkConnectionUtil: NetworkConnectionDebugUtil + + @Inject + lateinit var fakePerformanceMetricsEventLogger: FakePerformanceMetricsEventLogger + + @Inject + lateinit var dataProviders: DataProviders + + @Inject + lateinit var monitorFactory: DataProviderTestMonitor.Factory + + @Inject + lateinit var fakeOppiaClock: FakeOppiaClock + + private val apkSizeTestLoggableMetric = OppiaMetricLog.LoggableMetric.newBuilder() + .setApkSizeMetric( + OppiaMetricLog.ApkSizeMetric.newBuilder() + .setApkSizeBytes(TEST_APK_SIZE) + .build() + ).build() + + private val storageUsageTestLoggableMetric = OppiaMetricLog.LoggableMetric.newBuilder() + .setStorageUsageMetric( + OppiaMetricLog.StorageUsageMetric.newBuilder() + .setStorageUsageBytes(TEST_STORAGE_USAGE) + .build() + ).build() + + private val startupLatencyTestLoggableMetric = OppiaMetricLog.LoggableMetric.newBuilder() + .setStartupLatencyMetric( + OppiaMetricLog.StartupLatencyMetric.newBuilder() + .setStartupLatencyMillis(TEST_STARTUP_LATENCY) + .build() + ).build() + + private val cpuUsageTestLoggableMetric = OppiaMetricLog.LoggableMetric.newBuilder() + .setCpuUsageMetric( + OppiaMetricLog.CpuUsageMetric.newBuilder() + .setCpuUsageMetric(TEST_CPU_USAGE) + .build() + ).build() + + private val networkUsageTestLoggableMetric = OppiaMetricLog.LoggableMetric.newBuilder() + .setNetworkUsageMetric( + OppiaMetricLog.NetworkUsageMetric.newBuilder() + .setBytesReceived(TEST_NETWORK_USAGE) + .setBytesSent(TEST_NETWORK_USAGE) + .build() + ).build() + + private val memoryUsageTestLoggableMetric = OppiaMetricLog.LoggableMetric.newBuilder() + .setMemoryUsageMetric( + OppiaMetricLog.MemoryUsageMetric.newBuilder() + .setTotalPssBytes(TEST_MEMORY_USAGE) + .build() + ).build() + + @Before + fun setUp() { + setUpTestApplicationComponent() + fakeOppiaClock.setFakeTimeMode(FakeOppiaClock.FakeTimeMode.MODE_FIXED_FAKE_TIME) + fakeOppiaClock.setCurrentTimeMs(TEST_TIMESTAMP) + } + + @Test + fun testController_logPerformanceMetric_withApkSizeLoggableMetric_checkLogsMetric() { + performanceMetricsController.logPerformanceMetricsEvent( + TEST_TIMESTAMP, + SCREEN_UNSPECIFIED, + apkSizeTestLoggableMetric, + LOW_PRIORITY + ) + + val performanceMetricsLog = + fakePerformanceMetricsEventLogger.getMostRecentPerformanceMetricsEvent() + + assertThat(performanceMetricsLog.timestampMillis).isEqualTo(TEST_TIMESTAMP) + assertThat(performanceMetricsLog.currentScreen).isEqualTo(SCREEN_UNSPECIFIED) + assertThat(performanceMetricsLog.priority).isEqualTo(LOW_PRIORITY) + assertThat(performanceMetricsLog.loggableMetric.loggableMetricTypeCase).isEqualTo( + APK_SIZE_METRIC + ) + } + + @Test + fun testController_logPerformanceMetric_withStorageUsageLoggableMetric_checkLogsMetric() { + performanceMetricsController.logPerformanceMetricsEvent( + TEST_TIMESTAMP, + SCREEN_UNSPECIFIED, + storageUsageTestLoggableMetric, + LOW_PRIORITY + ) + + val performanceMetricsLog = + fakePerformanceMetricsEventLogger.getMostRecentPerformanceMetricsEvent() + + assertThat(performanceMetricsLog.timestampMillis).isEqualTo(TEST_TIMESTAMP) + assertThat(performanceMetricsLog.currentScreen).isEqualTo(SCREEN_UNSPECIFIED) + assertThat(performanceMetricsLog.priority).isEqualTo(LOW_PRIORITY) + assertThat(performanceMetricsLog.loggableMetric.loggableMetricTypeCase).isEqualTo( + STORAGE_USAGE_METRIC + ) + } + + @Test + fun testController_logPerformanceMetric_withStartupLatencyLoggableMetric_checkLogsMetric() { + performanceMetricsController.logPerformanceMetricsEvent( + TEST_TIMESTAMP, + SCREEN_UNSPECIFIED, + startupLatencyTestLoggableMetric, + LOW_PRIORITY + ) + + val performanceMetricsLog = + fakePerformanceMetricsEventLogger.getMostRecentPerformanceMetricsEvent() + + assertThat(performanceMetricsLog.timestampMillis).isEqualTo(TEST_TIMESTAMP) + assertThat(performanceMetricsLog.currentScreen).isEqualTo(SCREEN_UNSPECIFIED) + assertThat(performanceMetricsLog.priority).isEqualTo(LOW_PRIORITY) + assertThat(performanceMetricsLog.loggableMetric.loggableMetricTypeCase).isEqualTo( + STARTUP_LATENCY_METRIC + ) + } + + @Test + fun testController_logPerformanceMetric_withMemoryUsageLoggableMetric_checkLogsMetric() { + performanceMetricsController.logPerformanceMetricsEvent( + TEST_TIMESTAMP, + SCREEN_UNSPECIFIED, + memoryUsageTestLoggableMetric, + MEDIUM_PRIORITY + ) + + val performanceMetricsLog = + fakePerformanceMetricsEventLogger.getMostRecentPerformanceMetricsEvent() + + assertThat(performanceMetricsLog.timestampMillis).isEqualTo(TEST_TIMESTAMP) + assertThat(performanceMetricsLog.currentScreen).isEqualTo(SCREEN_UNSPECIFIED) + assertThat(performanceMetricsLog.priority).isEqualTo(MEDIUM_PRIORITY) + assertThat(performanceMetricsLog.loggableMetric.loggableMetricTypeCase).isEqualTo( + MEMORY_USAGE_METRIC + ) + } + + @Test + fun testController_logPerformanceMetric_withNetworkUsageLoggableMetric_checkLogsMetric() { + performanceMetricsController.logPerformanceMetricsEvent( + TEST_TIMESTAMP, + SCREEN_UNSPECIFIED, + networkUsageTestLoggableMetric, + HIGH_PRIORITY + ) + + val performanceMetricsLog = + fakePerformanceMetricsEventLogger.getMostRecentPerformanceMetricsEvent() + + assertThat(performanceMetricsLog.timestampMillis).isEqualTo(TEST_TIMESTAMP) + assertThat(performanceMetricsLog.currentScreen).isEqualTo(SCREEN_UNSPECIFIED) + assertThat(performanceMetricsLog.priority).isEqualTo(HIGH_PRIORITY) + assertThat(performanceMetricsLog.loggableMetric.loggableMetricTypeCase).isEqualTo( + NETWORK_USAGE_METRIC + ) + } + + @Test + fun testController_logPerformanceMetric_withCpuUsageLoggableMetric_checkLogsMetric() { + performanceMetricsController.logPerformanceMetricsEvent( + TEST_TIMESTAMP, + SCREEN_UNSPECIFIED, + cpuUsageTestLoggableMetric, + HIGH_PRIORITY + ) + + val performanceMetricsLog = + fakePerformanceMetricsEventLogger.getMostRecentPerformanceMetricsEvent() + + assertThat(performanceMetricsLog.timestampMillis).isEqualTo(TEST_TIMESTAMP) + assertThat(performanceMetricsLog.currentScreen).isEqualTo(SCREEN_UNSPECIFIED) + assertThat(performanceMetricsLog.priority).isEqualTo(HIGH_PRIORITY) + assertThat(performanceMetricsLog.loggableMetric.loggableMetricTypeCase).isEqualTo( + CPU_USAGE_METRIC + ) + } + + @Test + fun testController_logPerformanceMetric_withNoNetwork_checkLogsEventToStore() { + networkConnectionUtil.setCurrentConnectionStatus(NONE) + performanceMetricsController.logPerformanceMetricsEvent( + TEST_TIMESTAMP, + SCREEN_UNSPECIFIED, + apkSizeTestLoggableMetric, + LOW_PRIORITY + ) + + val eventLogsProvider = performanceMetricsController.getMetricLogStore() + + val performanceMetricsLog = + monitorFactory.waitForNextSuccessfulResult(eventLogsProvider).getOppiaMetricLog(0) + assertThat(performanceMetricsLog.timestampMillis).isEqualTo(TEST_TIMESTAMP) + assertThat(performanceMetricsLog.priority).isEqualTo(LOW_PRIORITY) + assertThat(performanceMetricsLog.loggableMetric.loggableMetricTypeCase).isEqualTo( + APK_SIZE_METRIC + ) + } + + @Test + fun testController_logPerformanceMetric_withNoNetwork_exceedLimit_checkEventLogStoreSize() { + networkConnectionUtil.setCurrentConnectionStatus(NONE) + logMultiplePerformanceMetrics() + + val eventLogsProvider = performanceMetricsController.getMetricLogStore() + + val performanceMetricLogs = monitorFactory.waitForNextSuccessfulResult(eventLogsProvider) + assertThat(performanceMetricLogs.oppiaMetricLogList).hasSize(2) + } + + @Test + fun testController_logMultiplePerformanceMetrics_withNoNetwork_checkOrderInCache() { + networkConnectionUtil.setCurrentConnectionStatus(NONE) + performanceMetricsController.logPerformanceMetricsEvent( + TEST_TIMESTAMP, + SCREEN_UNSPECIFIED, + apkSizeTestLoggableMetric, + LOW_PRIORITY + ) + performanceMetricsController.logPerformanceMetricsEvent( + TEST_TIMESTAMP, + SCREEN_UNSPECIFIED, + cpuUsageTestLoggableMetric, + HIGH_PRIORITY + ) + + val metricLogsProvider = performanceMetricsController.getMetricLogStore() + + val metricLogs = monitorFactory.waitForNextSuccessfulResult(metricLogsProvider) + val firstEventLog = metricLogs.getOppiaMetricLog(0) + val secondEventLog = metricLogs.getOppiaMetricLog(1) + + assertThat(firstEventLog.priority).isEqualTo(LOW_PRIORITY) + assertThat(secondEventLog.priority).isEqualTo(HIGH_PRIORITY) + } + + @Test + fun testController_logPerformanceMetric_switchToNoNetwork_logPerformanceMetric_checkManagement() { + performanceMetricsController.logPerformanceMetricsEvent( + TEST_TIMESTAMP, + SCREEN_UNSPECIFIED, + cpuUsageTestLoggableMetric, + HIGH_PRIORITY + ) + networkConnectionUtil.setCurrentConnectionStatus(NONE) + performanceMetricsController.logPerformanceMetricsEvent( + TEST_TIMESTAMP, + SCREEN_UNSPECIFIED, + apkSizeTestLoggableMetric, + LOW_PRIORITY + ) + + val metricLogsProvider = performanceMetricsController.getMetricLogStore() + + val uploadedMetricLog = fakePerformanceMetricsEventLogger.getMostRecentPerformanceMetricsEvent() + val cachedMetricLog = + monitorFactory.waitForNextSuccessfulResult(metricLogsProvider).getOppiaMetricLog(0) + + assertThat(uploadedMetricLog.timestampMillis).isEqualTo(TEST_TIMESTAMP) + assertThat(uploadedMetricLog.priority).isEqualTo(HIGH_PRIORITY) + assertThat(uploadedMetricLog.loggableMetric.loggableMetricTypeCase).isEqualTo(CPU_USAGE_METRIC) + + assertThat(cachedMetricLog.timestampMillis).isEqualTo(TEST_TIMESTAMP) + assertThat(cachedMetricLog.priority).isEqualTo(LOW_PRIORITY) + assertThat(cachedMetricLog.loggableMetric.loggableMetricTypeCase).isEqualTo(APK_SIZE_METRIC) + } + + @Test + fun testController_logPerformanceMetrics_exceedLimit_withNoNetwork_checkCorrectEventIsEvicted() { + networkConnectionUtil.setCurrentConnectionStatus(NONE) + logMultiplePerformanceMetrics() + + val metricLogsProvider = performanceMetricsController.getMetricLogStore() + + val metricLogs = monitorFactory.waitForNextSuccessfulResult(metricLogsProvider) + val firstMetricLog = metricLogs.getOppiaMetricLog(0) + val secondMetricLog = metricLogs.getOppiaMetricLog(1) + assertThat(metricLogs.oppiaMetricLogList).hasSize(2) + // In this case, 1 LOW, 1 HIGH and 2 MEDIUM priority metric logs were logged. So while pruning, + // only records with HIGH and MEDIUM priority should be retained. + assertThat(firstMetricLog.priority).isEqualTo(HIGH_PRIORITY) + assertThat(secondMetricLog.priority).isEqualTo(HIGH_PRIORITY) + // If we analyse the implementation of logMultiplePerformanceMetrics(), we can see that record + // pruning will begin from the logging of the third record. At first, the first event log will + // be removed as it has LOW priority and the event logged at the third place will become the + // event record at the second place in the store. When the forth event gets logged then the + // pruning will again happen on the basis of priority as MEDIUM priority event will be evicted. + // Now, when the fifth event gets logged then pruning happen based on purely based on timestamp + // of the event as both event logs have HIGH priority. As the second event's timestamp was + // lesser than that of the fourth event, it will be pruned from the store and the fifth event + // will become the second event in the store. + assertThat(firstMetricLog.timestampMillis).isEqualTo(1556093110000) + assertThat(secondMetricLog.timestampMillis).isEqualTo(1556094110000) + } + + @Test + fun testController_setAppInForeground_getIsAppInForeground_returnsCorrectValue() { + performanceMetricsController.setAppInForeground() + + val isAppInForeground = performanceMetricsController.getIsAppInForeground() + + assertThat(isAppInForeground).isTrue() + } + + @Test + fun testController_setAppInForeground_logMetric_logsMetricWithAppInForeground() { + performanceMetricsController.setAppInForeground() + performanceMetricsController.logPerformanceMetricsEvent( + TEST_TIMESTAMP, + SCREEN_UNSPECIFIED, + apkSizeTestLoggableMetric, + LOW_PRIORITY + ) + + val performanceMetricsLog = + fakePerformanceMetricsEventLogger.getMostRecentPerformanceMetricsEvent() + + assertThat(performanceMetricsLog.timestampMillis).isEqualTo(TEST_TIMESTAMP) + assertThat(performanceMetricsLog.currentScreen).isEqualTo(SCREEN_UNSPECIFIED) + assertThat(performanceMetricsLog.priority).isEqualTo(LOW_PRIORITY) + assertThat(performanceMetricsLog.loggableMetric.loggableMetricTypeCase).isEqualTo( + APK_SIZE_METRIC + ) + assertThat(performanceMetricsLog.isAppInForeground).isTrue() + } + + @Test + fun testController_setAppInBackground_getIsAppInForeground_returnsCorrectValue() { + performanceMetricsController.setAppInBackground() + + val isAppInForeground = performanceMetricsController.getIsAppInForeground() + + assertThat(isAppInForeground).isFalse() + } + + @Test + fun testController_setAppInBackground_logMetric_logsMetricWithAppInBackground() { + performanceMetricsController.setAppInBackground() + performanceMetricsController.logPerformanceMetricsEvent( + TEST_TIMESTAMP, + SCREEN_UNSPECIFIED, + apkSizeTestLoggableMetric, + LOW_PRIORITY + ) + + val performanceMetricsLog = + fakePerformanceMetricsEventLogger.getMostRecentPerformanceMetricsEvent() + + assertThat(performanceMetricsLog.timestampMillis).isEqualTo(TEST_TIMESTAMP) + assertThat(performanceMetricsLog.currentScreen).isEqualTo(SCREEN_UNSPECIFIED) + assertThat(performanceMetricsLog.priority).isEqualTo(LOW_PRIORITY) + assertThat(performanceMetricsLog.loggableMetric.loggableMetricTypeCase).isEqualTo( + APK_SIZE_METRIC + ) + assertThat(performanceMetricsLog.isAppInForeground).isFalse() + } + + private fun logMultiplePerformanceMetrics() { + performanceMetricsController.logPerformanceMetricsEvent( + 1556094120000, + SCREEN_UNSPECIFIED, + apkSizeTestLoggableMetric, + LOW_PRIORITY + ) + + performanceMetricsController.logPerformanceMetricsEvent( + 1556090110000, + SCREEN_UNSPECIFIED, + apkSizeTestLoggableMetric, + HIGH_PRIORITY + ) + + performanceMetricsController.logPerformanceMetricsEvent( + 1556092100000, + SCREEN_UNSPECIFIED, + apkSizeTestLoggableMetric, + MEDIUM_PRIORITY + ) + + performanceMetricsController.logPerformanceMetricsEvent( + 1556093110000, + SCREEN_UNSPECIFIED, + apkSizeTestLoggableMetric, + HIGH_PRIORITY + ) + + performanceMetricsController.logPerformanceMetricsEvent( + 1556094110000, + SCREEN_UNSPECIFIED, + apkSizeTestLoggableMetric, + HIGH_PRIORITY + ) + } + + private fun setUpTestApplicationComponent() { + ApplicationProvider.getApplicationContext().inject(this) + } + + // TODO(#89): Move this to a common test application component. + @Module + class TestModule { + @Provides + @Singleton + fun provideContext(application: Application): Context { + return application + } + + // TODO(#59): Either isolate these to their own shared test module, or use the real logging + // module in tests to avoid needing to specify these settings for tests. + @EnableConsoleLog + @Provides + fun provideEnableConsoleLog(): Boolean = true + + @EnableFileLog + @Provides + fun provideEnableFileLog(): Boolean = false + + @GlobalLogLevel + @Provides + fun provideGlobalLogLevel(): LogLevel = LogLevel.VERBOSE + } + + @Module + class TestLogStorageModule { + + @Provides + @PerformanceMetricsLogStorageCacheSize + fun providePerformanceMetricsLogStorageCacheSize(): Int = 2 + + @Provides + @EventLogStorageCacheSize + fun provideEventLogStorageCacheSize(): Int = 2 + } + + // TODO(#89): Move this to a common test application component. + @Singleton + @Component( + modules = [ + TestModule::class, TestLogReportingModule::class, RobolectricModule::class, + TestDispatcherModule::class, TestLogStorageModule::class, + NetworkConnectionUtilDebugModule::class, LocaleProdModule::class, FakeOppiaClockModule::class, + PlatformParameterModule::class, PlatformParameterSingletonModule::class, + LoggingIdentifierModule::class, SyncStatusTestModule::class, MetricLogSchedulerModule::class + ] + ) + interface TestApplicationComponent : DataProvidersInjector { + @Component.Builder + interface Builder { + @BindsInstance + fun setApplication(application: Application): Builder + fun build(): TestApplicationComponent + } + + fun inject(performanceMetricsControllerTest: PerformanceMetricsControllerTest) + } + + class TestApplication : Application(), DataProvidersInjectorProvider { + private val component: TestApplicationComponent by lazy { + DaggerPerformanceMetricsControllerTest_TestApplicationComponent.builder() + .setApplication(this) + .build() + } + + fun inject(performanceMetricsControllerTest: PerformanceMetricsControllerTest) { + component.inject(performanceMetricsControllerTest) + } + + override fun getDataProvidersInjector(): DataProvidersInjector = component + } +} diff --git a/domain/src/test/java/org/oppia/android/domain/oppialogger/analytics/PerformanceMetricsLoggerModuleTest.kt b/domain/src/test/java/org/oppia/android/domain/oppialogger/analytics/PerformanceMetricsLoggerModuleTest.kt new file mode 100644 index 00000000000..d52ead57e0f --- /dev/null +++ b/domain/src/test/java/org/oppia/android/domain/oppialogger/analytics/PerformanceMetricsLoggerModuleTest.kt @@ -0,0 +1,106 @@ +package org.oppia.android.domain.oppialogger.analytics + +import android.app.Application +import android.content.Context +import androidx.test.core.app.ApplicationProvider +import androidx.test.ext.junit.runners.AndroidJUnit4 +import com.google.common.truth.Truth.assertThat +import dagger.Binds +import dagger.BindsInstance +import dagger.Component +import dagger.Module +import dagger.multibindings.Multibinds +import org.junit.Before +import org.junit.Test +import org.junit.runner.RunWith +import org.oppia.android.domain.oppialogger.ApplicationStartupListener +import org.oppia.android.domain.oppialogger.LogStorageModule +import org.oppia.android.domain.oppialogger.LoggingIdentifierModule +import org.oppia.android.domain.platformparameter.PlatformParameterSingletonModule +import org.oppia.android.testing.TestLogReportingModule +import org.oppia.android.testing.platformparameter.TestPlatformParameterModule +import org.oppia.android.testing.robolectric.RobolectricModule +import org.oppia.android.testing.threading.TestDispatcherModule +import org.oppia.android.testing.time.FakeOppiaClockModule +import org.oppia.android.util.data.DataProvidersInjector +import org.oppia.android.util.data.DataProvidersInjectorProvider +import org.oppia.android.util.locale.LocaleProdModule +import org.oppia.android.util.logging.LoggerModule +import org.oppia.android.util.logging.SyncStatusModule +import org.oppia.android.util.networking.NetworkConnectionUtilDebugModule +import org.robolectric.annotation.Config +import org.robolectric.annotation.LooperMode +import javax.inject.Inject +import javax.inject.Singleton + +/** Tests for [PerformanceMetricsLoggerModule]. */ +// FunctionName: test names are conventionally named with underscores. +@Suppress("FunctionName") +@RunWith(AndroidJUnit4::class) +@LooperMode(LooperMode.Mode.PAUSED) +@Config(application = PerformanceMetricsLoggerModuleTest.TestApplication::class) +class PerformanceMetricsLoggerModuleTest { + @Inject + lateinit var startupListeners: Set<@JvmSuppressWildcards ApplicationStartupListener> + + @Before + fun setUp() { + setUpTestApplicationComponent() + } + + @Test + fun testInjectApplicationStartupListenerSet_includesPerformanceMetricsLogger() { + assertThat(startupListeners.any { it is PerformanceMetricsLogger }).isTrue() + } + + private fun setUpTestApplicationComponent() { + ApplicationProvider.getApplicationContext().inject(this) + } + + // TODO(#89): Move this to a common test application component. + @Module + interface TestModule { + @Binds + fun provideContext(application: Application): Context + + @Multibinds + fun bindStartupListenerSet(): Set + } + + // TODO(#89): Move this to a common test application component. + @Singleton + @Component( + modules = [ + TestModule::class, TestLogReportingModule::class, LogStorageModule::class, + TestDispatcherModule::class, RobolectricModule::class, FakeOppiaClockModule::class, + NetworkConnectionUtilDebugModule::class, LocaleProdModule::class, + TestPlatformParameterModule::class, PlatformParameterSingletonModule::class, + LoggingIdentifierModule::class, ApplicationLifecycleModule::class, + LoggerModule::class, SyncStatusModule::class, PerformanceMetricsLoggerModule::class + ] + ) + interface TestApplicationComponent : DataProvidersInjector { + @Component.Builder + interface Builder { + @BindsInstance + fun setApplication(application: Application): Builder + fun build(): TestApplicationComponent + } + + fun inject(test: PerformanceMetricsLoggerModuleTest) + } + + class TestApplication : Application(), DataProvidersInjectorProvider { + private val component: TestApplicationComponent by lazy { + DaggerPerformanceMetricsLoggerModuleTest_TestApplicationComponent.builder() + .setApplication(this) + .build() + } + + fun inject(test: PerformanceMetricsLoggerModuleTest) { + component.inject(test) + } + + override fun getDataProvidersInjector(): DataProvidersInjector = component + } +} diff --git a/domain/src/test/java/org/oppia/android/domain/oppialogger/analytics/PerformanceMetricsLoggerTest.kt b/domain/src/test/java/org/oppia/android/domain/oppialogger/analytics/PerformanceMetricsLoggerTest.kt new file mode 100644 index 00000000000..e26b8767689 --- /dev/null +++ b/domain/src/test/java/org/oppia/android/domain/oppialogger/analytics/PerformanceMetricsLoggerTest.kt @@ -0,0 +1,315 @@ +package org.oppia.android.domain.oppialogger.analytics + +import android.app.Application +import android.content.Context +import androidx.test.core.app.ApplicationProvider +import androidx.test.ext.junit.runners.AndroidJUnit4 +import com.google.common.truth.Truth.assertThat +import dagger.Binds +import dagger.BindsInstance +import dagger.Component +import dagger.Module +import dagger.Provides +import org.junit.Before +import org.junit.Test +import org.junit.runner.RunWith +import org.mockito.Mock +import org.oppia.android.app.model.OppiaMetricLog +import org.oppia.android.app.model.OppiaMetricLog.CurrentScreen.HOME_SCREEN +import org.oppia.android.app.model.OppiaMetricLog.CurrentScreen.SCREEN_UNSPECIFIED +import org.oppia.android.app.model.OppiaMetricLog.LoggableMetric.LoggableMetricTypeCase.APK_SIZE_METRIC +import org.oppia.android.app.model.OppiaMetricLog.LoggableMetric.LoggableMetricTypeCase.CPU_USAGE_METRIC +import org.oppia.android.app.model.OppiaMetricLog.LoggableMetric.LoggableMetricTypeCase.MEMORY_USAGE_METRIC +import org.oppia.android.app.model.OppiaMetricLog.LoggableMetric.LoggableMetricTypeCase.NETWORK_USAGE_METRIC +import org.oppia.android.app.model.OppiaMetricLog.LoggableMetric.LoggableMetricTypeCase.STARTUP_LATENCY_METRIC +import org.oppia.android.app.model.OppiaMetricLog.LoggableMetric.LoggableMetricTypeCase.STORAGE_USAGE_METRIC +import org.oppia.android.app.model.OppiaMetricLog.Priority.HIGH_PRIORITY +import org.oppia.android.app.model.OppiaMetricLog.Priority.LOW_PRIORITY +import org.oppia.android.app.model.OppiaMetricLog.Priority.MEDIUM_PRIORITY +import org.oppia.android.domain.oppialogger.EventLogStorageCacheSize +import org.oppia.android.domain.oppialogger.LoggingIdentifierModule +import org.oppia.android.domain.oppialogger.PerformanceMetricsLogStorageCacheSize +import org.oppia.android.domain.platformparameter.PlatformParameterModule +import org.oppia.android.domain.platformparameter.PlatformParameterSingletonModule +import org.oppia.android.testing.FakePerformanceMetricAssessor +import org.oppia.android.testing.FakePerformanceMetricsEventLogger +import org.oppia.android.testing.TestLogReportingModule +import org.oppia.android.testing.logging.SyncStatusTestModule +import org.oppia.android.testing.robolectric.RobolectricModule +import org.oppia.android.testing.threading.TestDispatcherModule +import org.oppia.android.testing.time.FakeOppiaClock +import org.oppia.android.testing.time.FakeOppiaClockModule +import org.oppia.android.util.data.DataProvidersInjector +import org.oppia.android.util.data.DataProvidersInjectorProvider +import org.oppia.android.util.locale.LocaleProdModule +import org.oppia.android.util.logging.EnableConsoleLog +import org.oppia.android.util.logging.EnableFileLog +import org.oppia.android.util.logging.GlobalLogLevel +import org.oppia.android.util.logging.LogLevel +import org.oppia.android.util.logging.performancemetrics.PerformanceMetricsAssessor +import org.oppia.android.util.networking.NetworkConnectionUtilDebugModule +import org.robolectric.annotation.Config +import org.robolectric.annotation.LooperMode +import javax.inject.Inject +import javax.inject.Singleton + +private const val TEST_TIMESTAMP = Long.MAX_VALUE +private const val TEST_CPU_USAGE = Long.MAX_VALUE +private const val TEST_APK_SIZE = Long.MAX_VALUE +private const val TEST_STORAGE_USAGE = Long.MAX_VALUE +private const val TEST_TOTAL_PSS = Long.MAX_VALUE +private const val TEST_BYTES_SENT = Long.MAX_VALUE +private const val TEST_BYTES_RECEIVED = Long.MAX_VALUE + +/** Tests for [PerformanceMetricsLoggerTest]. */ +// FunctionName: test names are conventionally named with underscores. +@Suppress("FunctionName") +@RunWith(AndroidJUnit4::class) +@LooperMode(LooperMode.Mode.PAUSED) +@Config(application = PerformanceMetricsLoggerTest.TestApplication::class) +class PerformanceMetricsLoggerTest { + + @Inject + lateinit var performanceMetricsLogger: PerformanceMetricsLogger + + @Inject + lateinit var performanceMetricsController: PerformanceMetricsController + + @Inject + lateinit var fakePerformanceMetricsEventLogger: FakePerformanceMetricsEventLogger + + @Inject + lateinit var fakeOppiaClock: FakeOppiaClock + + @Inject + lateinit var fakePerformanceMetricAssessor: FakePerformanceMetricAssessor + + @Mock + lateinit var context: Context + + private val testDeviceStorageTier = OppiaMetricLog.StorageTier.MEDIUM_STORAGE + private val testDeviceMemoryTier = OppiaMetricLog.MemoryTier.MEDIUM_MEMORY_TIER + + @Before + fun setUp() { + setUpTestApplicationComponent() + setUpFakePerformanceMetricsUtils() + fakeOppiaClock.setFakeTimeMode(FakeOppiaClock.FakeTimeMode.MODE_FIXED_FAKE_TIME) + fakeOppiaClock.setCurrentTimeMs(TEST_TIMESTAMP) + } + + @Test + fun testLogger_logApkSizePerformanceMetric_verifyLogsMetricCorrectly() { + val apkSize = fakePerformanceMetricAssessor.getApkSize() + val memoryTier = fakePerformanceMetricAssessor.getDeviceMemoryTier() + val storageTier = fakePerformanceMetricAssessor.getDeviceStorageTier() + val isAppInForeground = performanceMetricsController.getIsAppInForeground() + performanceMetricsLogger.logApkSize(HOME_SCREEN) + + val loggedEvent = fakePerformanceMetricsEventLogger.getMostRecentPerformanceMetricsEvent() + assertThat(loggedEvent.timestampMillis).isEqualTo(TEST_TIMESTAMP) + assertThat(loggedEvent.priority).isEqualTo(LOW_PRIORITY) + assertThat(loggedEvent.currentScreen).isEqualTo(HOME_SCREEN) + assertThat(loggedEvent.loggableMetric.loggableMetricTypeCase).isEqualTo(APK_SIZE_METRIC) + assertThat(loggedEvent.loggableMetric.apkSizeMetric.apkSizeBytes).isEqualTo(apkSize) + assertThat(loggedEvent.memoryTier).isEqualTo(memoryTier) + assertThat(loggedEvent.storageTier).isEqualTo(storageTier) + assertThat(loggedEvent.isAppInForeground).isEqualTo(isAppInForeground) + } + + @Test + fun testLogger_logStorageUsagePerformanceMetric_verifyLogsMetricCorrectly() { + val memoryTier = fakePerformanceMetricAssessor.getDeviceMemoryTier() + val storageTier = fakePerformanceMetricAssessor.getDeviceStorageTier() + val isAppInForeground = performanceMetricsController.getIsAppInForeground() + val storageUsage = fakePerformanceMetricAssessor.getUsedStorage() + performanceMetricsLogger.logStorageUsage(HOME_SCREEN) + + val loggedEvent = fakePerformanceMetricsEventLogger.getMostRecentPerformanceMetricsEvent() + assertThat(loggedEvent.timestampMillis).isEqualTo(TEST_TIMESTAMP) + assertThat(loggedEvent.priority).isEqualTo(LOW_PRIORITY) + assertThat(loggedEvent.currentScreen).isEqualTo(HOME_SCREEN) + assertThat(loggedEvent.loggableMetric.loggableMetricTypeCase).isEqualTo(STORAGE_USAGE_METRIC) + assertThat(loggedEvent.loggableMetric.storageUsageMetric.storageUsageBytes).isEqualTo( + storageUsage + ) + assertThat(loggedEvent.memoryTier).isEqualTo(memoryTier) + assertThat(loggedEvent.storageTier).isEqualTo(storageTier) + assertThat(loggedEvent.isAppInForeground).isEqualTo(isAppInForeground) + } + + @Test + fun testLogger_logMemoryUsagePerformanceMetric_verifyLogsMetricCorrectly() { + val memoryUsage = fakePerformanceMetricAssessor.getTotalPssUsed() + val memoryTier = fakePerformanceMetricAssessor.getDeviceMemoryTier() + val storageTier = fakePerformanceMetricAssessor.getDeviceStorageTier() + val isAppInForeground = performanceMetricsController.getIsAppInForeground() + performanceMetricsLogger.logMemoryUsage(SCREEN_UNSPECIFIED) + + val loggedEvent = fakePerformanceMetricsEventLogger.getMostRecentPerformanceMetricsEvent() + assertThat(loggedEvent.timestampMillis).isEqualTo(TEST_TIMESTAMP) + assertThat(loggedEvent.priority).isEqualTo(MEDIUM_PRIORITY) + assertThat(loggedEvent.currentScreen).isEqualTo(SCREEN_UNSPECIFIED) + assertThat(loggedEvent.loggableMetric.loggableMetricTypeCase).isEqualTo(MEMORY_USAGE_METRIC) + assertThat(loggedEvent.loggableMetric.memoryUsageMetric.totalPssBytes).isEqualTo(memoryUsage) + assertThat(loggedEvent.memoryTier).isEqualTo(memoryTier) + assertThat(loggedEvent.storageTier).isEqualTo(storageTier) + assertThat(loggedEvent.isAppInForeground).isEqualTo(isAppInForeground) + } + + @Test + fun testLogger_logStartupLatencyPerformanceMetric_verifyLogsMetricCorrectly() { + val memoryTier = fakePerformanceMetricAssessor.getDeviceMemoryTier() + val storageTier = fakePerformanceMetricAssessor.getDeviceStorageTier() + val isAppInForeground = performanceMetricsController.getIsAppInForeground() + performanceMetricsLogger.logStartupLatency(HOME_SCREEN) + + val loggedEvent = fakePerformanceMetricsEventLogger.getMostRecentPerformanceMetricsEvent() + assertThat(loggedEvent.timestampMillis).isEqualTo(TEST_TIMESTAMP) + assertThat(loggedEvent.priority).isEqualTo(LOW_PRIORITY) + assertThat(loggedEvent.currentScreen).isEqualTo(HOME_SCREEN) + assertThat(loggedEvent.loggableMetric.loggableMetricTypeCase).isEqualTo(STARTUP_LATENCY_METRIC) + // Startup latency millis will be equal to 0 since the initial timestamp is equal to + // Long.MAX_VALUE and using FakeOppiaClock we've set the recording timestamp to also be + // Long.MAX_VALUE. The difference between the two equals 0 and hence the startup latency millis. + assertThat(loggedEvent.loggableMetric.startupLatencyMetric.startupLatencyMillis).isEqualTo(0) + assertThat(loggedEvent.memoryTier).isEqualTo(memoryTier) + assertThat(loggedEvent.storageTier).isEqualTo(storageTier) + assertThat(loggedEvent.isAppInForeground).isEqualTo(isAppInForeground) + } + + @Test + fun testLogger_logCpuUsagePerformanceMetric_verifyLogsMetricCorrectly() { + val memoryTier = fakePerformanceMetricAssessor.getDeviceMemoryTier() + val storageTier = fakePerformanceMetricAssessor.getDeviceStorageTier() + val isAppInForeground = performanceMetricsController.getIsAppInForeground() + performanceMetricsLogger.logCpuUsage(TEST_CPU_USAGE, SCREEN_UNSPECIFIED) + + val loggedEvent = fakePerformanceMetricsEventLogger.getMostRecentPerformanceMetricsEvent() + assertThat(loggedEvent.timestampMillis).isEqualTo(TEST_TIMESTAMP) + assertThat(loggedEvent.priority).isEqualTo(HIGH_PRIORITY) + assertThat(loggedEvent.currentScreen).isEqualTo(SCREEN_UNSPECIFIED) + assertThat(loggedEvent.loggableMetric.loggableMetricTypeCase).isEqualTo(CPU_USAGE_METRIC) + assertThat(loggedEvent.loggableMetric.cpuUsageMetric.cpuUsageMetric).isEqualTo(TEST_CPU_USAGE) + assertThat(loggedEvent.memoryTier).isEqualTo(memoryTier) + assertThat(loggedEvent.storageTier).isEqualTo(storageTier) + assertThat(loggedEvent.isAppInForeground).isEqualTo(isAppInForeground) + } + + @Test + fun testLogger_logNetworkUsagePerformanceMetric_verifyLogsMetricCorrectly() { + val bytesSent = fakePerformanceMetricAssessor.getTotalSentBytes() + val bytesReceived = fakePerformanceMetricAssessor.getTotalReceivedBytes() + val memoryTier = fakePerformanceMetricAssessor.getDeviceMemoryTier() + val storageTier = fakePerformanceMetricAssessor.getDeviceStorageTier() + val isAppInForeground = performanceMetricsController.getIsAppInForeground() + performanceMetricsLogger.logNetworkUsage(SCREEN_UNSPECIFIED) + + val loggedEvent = fakePerformanceMetricsEventLogger.getMostRecentPerformanceMetricsEvent() + assertThat(loggedEvent.timestampMillis).isEqualTo(TEST_TIMESTAMP) + assertThat(loggedEvent.priority).isEqualTo(HIGH_PRIORITY) + assertThat(loggedEvent.currentScreen).isEqualTo(SCREEN_UNSPECIFIED) + assertThat(loggedEvent.loggableMetric.loggableMetricTypeCase).isEqualTo(NETWORK_USAGE_METRIC) + assertThat(loggedEvent.loggableMetric.networkUsageMetric.bytesSent).isEqualTo(bytesSent) + assertThat(loggedEvent.loggableMetric.networkUsageMetric.bytesReceived).isEqualTo(bytesReceived) + assertThat(loggedEvent.memoryTier).isEqualTo(memoryTier) + assertThat(loggedEvent.storageTier).isEqualTo(storageTier) + assertThat(loggedEvent.isAppInForeground).isEqualTo(isAppInForeground) + } + + private fun setUpTestApplicationComponent() { + ApplicationProvider.getApplicationContext().inject(this) + } + + private fun setUpFakePerformanceMetricsUtils() { + fakePerformanceMetricAssessor.apply { + setApkSize(TEST_APK_SIZE) + setStorageUsage(TEST_STORAGE_USAGE) + setTotalPss(TEST_TOTAL_PSS) + setTotalSentBytes(TEST_BYTES_SENT) + setTotalReceivedBytes(TEST_BYTES_RECEIVED) + setDeviceStorageTier(testDeviceStorageTier) + setDeviceMemoryTier(testDeviceMemoryTier) + } + } + + // TODO(#89): Move this to a common test application component. + @Module + class TestModule { + @Provides + @Singleton + fun provideContext(application: Application): Context { + return application + } + + // TODO(#59): Either isolate these to their own shared test module, or use the real logging + // module in tests to avoid needing to specify these settings for tests. + @EnableConsoleLog + @Provides + fun provideEnableConsoleLog(): Boolean = true + + @EnableFileLog + @Provides + fun provideEnableFileLog(): Boolean = false + + @GlobalLogLevel + @Provides + fun provideGlobalLogLevel(): LogLevel = LogLevel.VERBOSE + } + + @Module + class TestLogStorageModule { + + @Provides + @PerformanceMetricsLogStorageCacheSize + fun providePerformanceMetricsLogStorageCacheSize(): Int = 2 + + @Provides + @EventLogStorageCacheSize + fun provideEventLogStorageCacheSize(): Int = 2 + } + + @Module + interface TestPerformanceMetricsModule { + @Binds + fun bindPerformanceMetricsUtils( + fakePerformanceMetricAssessor: FakePerformanceMetricAssessor + ): PerformanceMetricsAssessor + } + + // TODO(#89): Move this to a common test application component. + @Singleton + @Component( + modules = [ + TestModule::class, TestLogReportingModule::class, RobolectricModule::class, + TestDispatcherModule::class, TestLogStorageModule::class, + NetworkConnectionUtilDebugModule::class, LocaleProdModule::class, FakeOppiaClockModule::class, + PlatformParameterModule::class, PlatformParameterSingletonModule::class, + LoggingIdentifierModule::class, SyncStatusTestModule::class + ] + ) + interface TestApplicationComponent : DataProvidersInjector { + @Component.Builder + interface Builder { + @BindsInstance + fun setApplication(application: Application): Builder + fun build(): TestApplicationComponent + } + + fun inject(performanceMetricsLoggerTest: PerformanceMetricsLoggerTest) + } + + class TestApplication : Application(), DataProvidersInjectorProvider { + private val component: TestApplicationComponent by lazy { + DaggerPerformanceMetricsLoggerTest_TestApplicationComponent.builder() + .setApplication(this) + .build() + } + + fun inject(performanceMetricsLoggerTest: PerformanceMetricsLoggerTest) { + component.inject(performanceMetricsLoggerTest) + } + + override fun getDataProvidersInjector(): DataProvidersInjector = component + } +} diff --git a/domain/src/test/java/org/oppia/android/domain/oppialogger/analytics/testing/FakeLogSchedulerTest.kt b/domain/src/test/java/org/oppia/android/domain/oppialogger/analytics/testing/FakeLogSchedulerTest.kt new file mode 100644 index 00000000000..f0be27177ef --- /dev/null +++ b/domain/src/test/java/org/oppia/android/domain/oppialogger/analytics/testing/FakeLogSchedulerTest.kt @@ -0,0 +1,182 @@ +package org.oppia.android.domain.oppialogger.analytics.testing + +import android.app.Application +import android.content.Context +import androidx.test.core.app.ApplicationProvider +import androidx.test.ext.junit.runners.AndroidJUnit4 +import androidx.work.Configuration +import androidx.work.Data +import androidx.work.PeriodicWorkRequestBuilder +import androidx.work.WorkManager +import androidx.work.testing.SynchronousExecutor +import androidx.work.testing.WorkManagerTestInitHelper +import com.google.common.truth.Truth.assertThat +import dagger.Binds +import dagger.BindsInstance +import dagger.Component +import dagger.Module +import org.junit.Before +import org.junit.Test +import org.junit.runner.RunWith +import org.oppia.android.domain.oppialogger.logscheduler.MetricLogSchedulingWorker +import org.oppia.android.domain.oppialogger.logscheduler.MetricLogSchedulingWorkerFactory +import org.oppia.android.domain.oppialogger.loguploader.LogUploadWorker +import org.oppia.android.testing.robolectric.RobolectricModule +import org.oppia.android.testing.threading.TestDispatcherModule +import org.oppia.android.util.data.DataProvidersInjector +import org.oppia.android.util.data.DataProvidersInjectorProvider +import org.oppia.android.util.locale.LocaleProdModule +import org.oppia.android.util.logging.LoggerModule +import org.oppia.android.util.logging.MetricLogScheduler +import org.oppia.android.util.logging.firebase.LogReportingModule +import org.oppia.android.util.logging.performancemetrics.PerformanceMetricsAssessorModule +import org.oppia.android.util.logging.performancemetrics.PerformanceMetricsConfigurationsModule +import org.oppia.android.util.system.OppiaClockModule +import org.robolectric.annotation.Config +import org.robolectric.annotation.LooperMode +import java.util.concurrent.TimeUnit +import javax.inject.Inject +import javax.inject.Singleton + +/** Tests for [FakeLogScheduler]. */ +// FunctionName: test names are conventionally named with underscores. +@Suppress("FunctionName") +@RunWith(AndroidJUnit4::class) +@LooperMode(LooperMode.Mode.PAUSED) +@Config(application = FakeLogSchedulerTest.TestApplication::class) +class FakeLogSchedulerTest { + + @Inject + lateinit var fakeLogScheduler: FakeLogScheduler + + @Inject + lateinit var workerFactory: MetricLogSchedulingWorkerFactory + + @Inject + lateinit var context: Context + + @Before + fun setUp() { + setUpTestApplicationComponent() + val config = Configuration.Builder() + .setExecutor(SynchronousExecutor()) + .setWorkerFactory(workerFactory) + .build() + WorkManagerTestInitHelper.initializeTestWorkManager(context, config) + } + + @Test + fun testFakeScheduler_scheduleStorageLogging_verifyScheduling() { + val workManager = WorkManager.getInstance(context) + + val inputData = Data.Builder().putString( + MetricLogSchedulingWorker.WORKER_CASE_KEY, + MetricLogSchedulingWorker.STORAGE_USAGE_WORKER + ).build() + + val request = PeriodicWorkRequestBuilder(10, TimeUnit.SECONDS) + .setInputData(inputData) + .build() + + fakeLogScheduler.enqueueWorkRequestForStorageUsage( + workManager, + request + ) + + assertThat(fakeLogScheduler.getMostRecentStorageUsageMetricLoggingRequestId()) + .isEqualTo(request.id) + } + + @Test + fun testFakeScheduler_schedulePeriodicBackgroundMetricsLogging_verifyScheduling() { + val workManager = WorkManager.getInstance(context) + + val inputData = Data.Builder().putString( + MetricLogSchedulingWorker.WORKER_CASE_KEY, + MetricLogSchedulingWorker.PERIODIC_BACKGROUND_METRIC_WORKER + ).build() + + val request = PeriodicWorkRequestBuilder(10, TimeUnit.SECONDS) + .setInputData(inputData) + .build() + + fakeLogScheduler.enqueueWorkRequestForPeriodicBackgroundMetrics( + workManager, + request + ) + + assertThat(fakeLogScheduler.getMostRecentPeriodicBackgroundMetricLoggingRequestId()) + .isEqualTo(request.id) + } + + @Test + fun testFakeScheduler_schedulePeriodicUiMetricsLogging_verifyScheduling() { + val workManager = WorkManager.getInstance(context) + + val inputData = Data.Builder().putString( + MetricLogSchedulingWorker.WORKER_CASE_KEY, + MetricLogSchedulingWorker.PERIODIC_UI_METRIC_WORKER + ).build() + + val request = PeriodicWorkRequestBuilder(10, TimeUnit.SECONDS) + .setInputData(inputData) + .build() + + fakeLogScheduler.enqueueWorkRequestForPeriodicUiMetrics( + workManager, + request + ) + + assertThat(fakeLogScheduler.getMostRecentPeriodicUiMetricLoggingRequestId()) + .isEqualTo(request.id) + } + + private fun setUpTestApplicationComponent() { + ApplicationProvider.getApplicationContext().inject(this) + } + + // TODO(#89): Move this to a common test application component. + @Module + interface TestModule { + @Binds + fun provideContext(application: Application): Context + + @Binds + fun bindMetricLogScheduler(fakeLogScheduler: FakeLogScheduler): MetricLogScheduler + } + + // TODO(#89): Move this to a common test application component. + @Singleton + @Component( + modules = [ + TestModule::class, PerformanceMetricsAssessorModule::class, LoggerModule::class, + TestDispatcherModule::class, LogReportingModule::class, RobolectricModule::class, + PerformanceMetricsConfigurationsModule::class, LocaleProdModule::class, + OppiaClockModule::class + ] + ) + interface TestApplicationComponent : DataProvidersInjector { + @Component.Builder + interface Builder { + @BindsInstance + fun setApplication(application: Application): Builder + fun build(): TestApplicationComponent + } + + fun inject(test: FakeLogSchedulerTest) + } + + class TestApplication : Application(), DataProvidersInjectorProvider { + private val component: TestApplicationComponent by lazy { + DaggerFakeLogSchedulerTest_TestApplicationComponent.builder() + .setApplication(this) + .build() + } + + fun inject(test: FakeLogSchedulerTest) { + component.inject(test) + } + + override fun getDataProvidersInjector(): DataProvidersInjector = component + } +} diff --git a/domain/src/test/java/org/oppia/android/domain/oppialogger/logscheduler/MetricLogSchedulerModuleTest.kt b/domain/src/test/java/org/oppia/android/domain/oppialogger/logscheduler/MetricLogSchedulerModuleTest.kt new file mode 100644 index 00000000000..ac65b6d1c92 --- /dev/null +++ b/domain/src/test/java/org/oppia/android/domain/oppialogger/logscheduler/MetricLogSchedulerModuleTest.kt @@ -0,0 +1,79 @@ +package org.oppia.android.domain.oppialogger.logscheduler + +import android.app.Application +import android.content.Context +import androidx.test.core.app.ApplicationProvider +import androidx.test.ext.junit.runners.AndroidJUnit4 +import com.google.common.truth.Truth.assertThat +import dagger.Binds +import dagger.BindsInstance +import dagger.Component +import dagger.Module +import org.junit.Before +import org.junit.Test +import org.junit.runner.RunWith +import org.oppia.android.testing.robolectric.RobolectricModule +import org.oppia.android.testing.time.FakeOppiaClockModule +import org.oppia.android.util.locale.LocaleProdModule +import org.oppia.android.util.logging.LoggerModule +import org.oppia.android.util.logging.MetricLogScheduler +import org.robolectric.annotation.Config +import org.robolectric.annotation.LooperMode +import javax.inject.Inject +import javax.inject.Singleton + +/** Tests for [MetricLogSchedulerModule]. */ +// FunctionName: test names are conventionally named with underscores. +@Suppress("FunctionName") +@RunWith(AndroidJUnit4::class) +@LooperMode(LooperMode.Mode.PAUSED) +@Config(manifest = Config.NONE) +class MetricLogSchedulerModuleTest { + + @Inject + lateinit var metricLogScheduler: MetricLogScheduler + + @Before + fun setUp() { + setUpTestApplicationComponent() + } + + @Test + fun testModule_injectsProductionImplementationOfMetricLogScheduler() { + assertThat(metricLogScheduler).isInstanceOf(PerformanceMetricsLogScheduler::class.java) + } + + private fun setUpTestApplicationComponent() { + DaggerMetricLogSchedulerModuleTest_TestApplicationComponent.builder() + .setApplication(ApplicationProvider.getApplicationContext()) + .build() + .inject(this) + } + + // TODO(#89): Move this to a common test application component. + @Module + interface TestModule { + @Binds + fun provideContext(application: Application): Context + } + + // TODO(#89): Move this to a common test application component. + @Singleton + @Component( + modules = [ + TestModule::class, MetricLogSchedulerModule::class, LoggerModule::class, + RobolectricModule::class, LocaleProdModule::class, FakeOppiaClockModule::class + ] + ) + interface TestApplicationComponent { + @Component.Builder + interface Builder { + @BindsInstance + fun setApplication(application: Application): Builder + + fun build(): TestApplicationComponent + } + + fun inject(metricLogSchedulerModuleTest: MetricLogSchedulerModuleTest) + } +} diff --git a/domain/src/test/java/org/oppia/android/domain/oppialogger/logscheduler/MetricLogSchedulingWorkerTest.kt b/domain/src/test/java/org/oppia/android/domain/oppialogger/logscheduler/MetricLogSchedulingWorkerTest.kt new file mode 100644 index 00000000000..57c32579979 --- /dev/null +++ b/domain/src/test/java/org/oppia/android/domain/oppialogger/logscheduler/MetricLogSchedulingWorkerTest.kt @@ -0,0 +1,292 @@ +package org.oppia.android.domain.oppialogger.logscheduler + +import android.app.Application +import android.content.Context +import androidx.test.core.app.ApplicationProvider +import androidx.test.ext.junit.runners.AndroidJUnit4 +import androidx.test.platform.app.InstrumentationRegistry +import androidx.work.Configuration +import androidx.work.Data +import androidx.work.OneTimeWorkRequest +import androidx.work.OneTimeWorkRequestBuilder +import androidx.work.WorkInfo +import androidx.work.WorkManager +import androidx.work.testing.SynchronousExecutor +import androidx.work.testing.WorkManagerTestInitHelper +import com.google.common.truth.Truth.assertThat +import dagger.Binds +import dagger.BindsInstance +import dagger.Component +import dagger.Module +import dagger.Provides +import org.junit.Before +import org.junit.Test +import org.junit.runner.RunWith +import org.oppia.android.domain.oppialogger.EventLogStorageCacheSize +import org.oppia.android.domain.oppialogger.ExceptionLogStorageCacheSize +import org.oppia.android.domain.oppialogger.LoggingIdentifierModule +import org.oppia.android.domain.oppialogger.OppiaLogger +import org.oppia.android.domain.oppialogger.PerformanceMetricsLogStorageCacheSize +import org.oppia.android.domain.oppialogger.analytics.ApplicationLifecycleModule +import org.oppia.android.domain.oppialogger.analytics.PerformanceMetricsController +import org.oppia.android.domain.oppialogger.loguploader.LogReportWorkerModule +import org.oppia.android.domain.oppialogger.loguploader.LogUploadWorker +import org.oppia.android.domain.platformparameter.PlatformParameterModule +import org.oppia.android.domain.platformparameter.PlatformParameterSingletonModule +import org.oppia.android.domain.testing.oppialogger.loguploader.FakeLogUploader +import org.oppia.android.testing.FakeEventLogger +import org.oppia.android.testing.FakeExceptionLogger +import org.oppia.android.testing.FakePerformanceMetricsEventLogger +import org.oppia.android.testing.logging.SyncStatusTestModule +import org.oppia.android.testing.robolectric.RobolectricModule +import org.oppia.android.testing.threading.TestCoroutineDispatchers +import org.oppia.android.testing.threading.TestDispatcherModule +import org.oppia.android.testing.time.FakeOppiaClockModule +import org.oppia.android.util.caching.AssetModule +import org.oppia.android.util.data.DataProviders +import org.oppia.android.util.data.DataProvidersInjector +import org.oppia.android.util.data.DataProvidersInjectorProvider +import org.oppia.android.util.locale.LocaleProdModule +import org.oppia.android.util.logging.EventLogger +import org.oppia.android.util.logging.ExceptionLogger +import org.oppia.android.util.logging.LogUploader +import org.oppia.android.util.logging.LoggerModule +import org.oppia.android.util.logging.performancemetrics.PerformanceMetricsAssessorModule +import org.oppia.android.util.logging.performancemetrics.PerformanceMetricsConfigurationsModule +import org.oppia.android.util.logging.performancemetrics.PerformanceMetricsEventLogger +import org.oppia.android.util.networking.NetworkConnectionDebugUtil +import org.oppia.android.util.networking.NetworkConnectionUtilDebugModule +import org.robolectric.annotation.Config +import org.robolectric.annotation.LooperMode +import javax.inject.Inject +import javax.inject.Singleton + +private const val INCORRECT_WORKER_CASE = "incorrect_worker_case" + +/** Tests for [MetricLogSchedulingWorker]. */ +// FunctionName: test names are conventionally named with underscores. +@Suppress("FunctionName") +@RunWith(AndroidJUnit4::class) +@LooperMode(LooperMode.Mode.PAUSED) +@Config(application = MetricLogSchedulingWorkerTest.TestApplication::class) +class MetricLogSchedulingWorkerTest { + @Inject + lateinit var networkConnectionUtil: NetworkConnectionDebugUtil + + @Inject + lateinit var fakePerformanceMetricsEventLogger: FakePerformanceMetricsEventLogger + + @Inject + lateinit var oppiaLogger: OppiaLogger + + @Inject + lateinit var performanceMetricsController: PerformanceMetricsController + + @Inject + lateinit var metricLogSchedulingWorkerFactory: MetricLogSchedulingWorkerFactory + + @Inject + lateinit var dataProviders: DataProviders + + @Inject + lateinit var testCoroutineDispatchers: TestCoroutineDispatchers + + private lateinit var context: Context + + @Before + fun setUp() { + setUpTestApplicationComponent() + context = InstrumentationRegistry.getInstrumentation().targetContext + val config = Configuration.Builder() + .setExecutor(SynchronousExecutor()) + .setWorkerFactory(metricLogSchedulingWorkerFactory) + .build() + WorkManagerTestInitHelper.initializeTestWorkManager(context, config) + } + + @Test + fun testWorker_enqueueRequest_verifyStorageUsagePerformanceMetricLogging() { + val workManager = WorkManager.getInstance(ApplicationProvider.getApplicationContext()) + + val inputData = Data.Builder().putString( + MetricLogSchedulingWorker.WORKER_CASE_KEY, + MetricLogSchedulingWorker.STORAGE_USAGE_WORKER + ).build() + + val request: OneTimeWorkRequest = OneTimeWorkRequestBuilder() + .setInputData(inputData) + .build() + + workManager.enqueue(request) + testCoroutineDispatchers.runCurrent() + val workInfo = workManager.getWorkInfoById(request.id) + + assertThat(workInfo.get().state).isEqualTo(WorkInfo.State.SUCCEEDED) + // TODO(#4340): Verify functionality to log storage usage performance metrics. + } + + @Test + fun testWorker_enqueueRequest_verifyPeriodicBackgroundPerformanceMetricsLogging() { + val workManager = WorkManager.getInstance(ApplicationProvider.getApplicationContext()) + + val inputData = Data.Builder().putString( + MetricLogSchedulingWorker.WORKER_CASE_KEY, + MetricLogSchedulingWorker.PERIODIC_BACKGROUND_METRIC_WORKER + ).build() + + val request: OneTimeWorkRequest = OneTimeWorkRequestBuilder() + .setInputData(inputData) + .build() + + workManager.enqueue(request) + testCoroutineDispatchers.runCurrent() + val workInfo = workManager.getWorkInfoById(request.id) + + assertThat(workInfo.get().state).isEqualTo(WorkInfo.State.SUCCEEDED) + // TODO(#4340): Verify functionality to log cpu and network usage performance metrics. + } + + @Test + fun testWorker_enqueueRequest_verifyPeriodicUiPerformanceMetricsLogging() { + val workManager = WorkManager.getInstance(ApplicationProvider.getApplicationContext()) + + val inputData = Data.Builder().putString( + MetricLogSchedulingWorker.WORKER_CASE_KEY, + MetricLogSchedulingWorker.PERIODIC_UI_METRIC_WORKER + ).build() + + val request: OneTimeWorkRequest = OneTimeWorkRequestBuilder() + .setInputData(inputData) + .build() + + workManager.enqueue(request) + testCoroutineDispatchers.runCurrent() + val workInfo = workManager.getWorkInfoById(request.id) + + assertThat(workInfo.get().state).isEqualTo(WorkInfo.State.SUCCEEDED) + // TODO(#4340): Verify functionality to log memory usage performance metrics. + } + + @Test + fun testWorker_enqueueRequest_writeFails_verifyFailure() { + val workManager = WorkManager.getInstance(ApplicationProvider.getApplicationContext()) + + val request: OneTimeWorkRequest = OneTimeWorkRequestBuilder() + .build() + + workManager.enqueue(request) + testCoroutineDispatchers.runCurrent() + val workInfo = workManager.getWorkInfoById(request.id) + + assertThat(workInfo.get().state).isEqualTo(WorkInfo.State.FAILED) + assertThat(fakePerformanceMetricsEventLogger.noPerformanceMetricsEventsPresent()).isTrue() + } + + @Test + fun testScheduler_enqueueRequestForIncorrectWorkerCase_verifyWorkRequestReturnsFailureResult() { + val workManager = WorkManager.getInstance(ApplicationProvider.getApplicationContext()) + + val inputData: Data = Data.Builder() + .putString( + MetricLogSchedulingWorker.WORKER_CASE_KEY, + INCORRECT_WORKER_CASE + ).build() + + val request = OneTimeWorkRequestBuilder() + .setInputData(inputData) + .build() + + workManager.enqueue(request) + testCoroutineDispatchers.runCurrent() + val workInfo = workManager.getWorkInfoById(request.id) + + assertThat(workInfo.get().state).isEqualTo(WorkInfo.State.FAILED) + } + + private fun setUpTestApplicationComponent() { + DaggerMetricLogSchedulingWorkerTest_TestApplicationComponent.builder() + .setApplication(ApplicationProvider.getApplicationContext()) + .build() + .inject(this) + } + + // TODO(#89): Move this to a common test application component. + @Module + class TestModule { + @Provides + fun provideContext(application: Application): Context = application + + @Provides + fun bindFakeEventLogger(fakeEventLogger: FakeEventLogger): EventLogger = fakeEventLogger + + @Provides + fun bindFakeExceptionLogger(fakeLogger: FakeExceptionLogger): ExceptionLogger = fakeLogger + + @Provides + fun bindFakePerformanceMetricsEventLogger( + fakePerformanceMetricsEventLogger: FakePerformanceMetricsEventLogger + ): PerformanceMetricsEventLogger = fakePerformanceMetricsEventLogger + } + + @Module + class TestLogStorageModule { + + @Provides + @EventLogStorageCacheSize + fun provideEventLogStorageCacheSize(): Int = 2 + + @Provides + @ExceptionLogStorageCacheSize + fun provideExceptionLogStorageSize(): Int = 2 + + @Provides + @PerformanceMetricsLogStorageCacheSize + fun providePerformanceMetricsLogStorageCacheSize(): Int = 2 + } + + @Module + interface TestFirebaseLogUploaderModule { + + @Binds + fun bindsFakeLogUploader(fakeLogUploader: FakeLogUploader): LogUploader + } + + // TODO(#89): Move this to a common test application component. + @Singleton + @Component( + modules = [ + TestModule::class, RobolectricModule::class, TestLogStorageModule::class, + TestDispatcherModule::class, LogReportWorkerModule::class, + TestFirebaseLogUploaderModule::class, FakeOppiaClockModule::class, + NetworkConnectionUtilDebugModule::class, LocaleProdModule::class, LoggerModule::class, + AssetModule::class, PlatformParameterModule::class, PlatformParameterSingletonModule::class, + LoggingIdentifierModule::class, SyncStatusTestModule::class, + PerformanceMetricsAssessorModule::class, PerformanceMetricsConfigurationsModule::class, + ApplicationLifecycleModule::class + ] + ) + interface TestApplicationComponent : DataProvidersInjector { + @Component.Builder + interface Builder { + @BindsInstance + fun setApplication(application: Application): Builder + fun build(): TestApplicationComponent + } + + fun inject(metricLogSchedulingWorkerTest: MetricLogSchedulingWorkerTest) + } + + class TestApplication : Application(), DataProvidersInjectorProvider { + private val component: TestApplicationComponent by lazy { + DaggerMetricLogSchedulingWorkerTest_TestApplicationComponent.builder() + .setApplication(this) + .build() + } + + fun inject(metricLogSchedulingWorkerTest: MetricLogSchedulingWorkerTest) { + component.inject(metricLogSchedulingWorkerTest) + } + + override fun getDataProvidersInjector(): DataProvidersInjector = component + } +} diff --git a/domain/src/test/java/org/oppia/android/domain/oppialogger/logscheduler/PerformanceMetricsLogSchedulerTest.kt b/domain/src/test/java/org/oppia/android/domain/oppialogger/logscheduler/PerformanceMetricsLogSchedulerTest.kt new file mode 100644 index 00000000000..7d8985f71b2 --- /dev/null +++ b/domain/src/test/java/org/oppia/android/domain/oppialogger/logscheduler/PerformanceMetricsLogSchedulerTest.kt @@ -0,0 +1,205 @@ +package org.oppia.android.domain.oppialogger.logscheduler + +import android.app.Application +import android.content.Context +import androidx.test.core.app.ApplicationProvider +import androidx.test.ext.junit.runners.AndroidJUnit4 +import androidx.work.Configuration +import androidx.work.Data +import androidx.work.PeriodicWorkRequest +import androidx.work.WorkInfo +import androidx.work.WorkManager +import androidx.work.testing.SynchronousExecutor +import androidx.work.testing.WorkManagerTestInitHelper +import com.google.common.truth.Truth.assertThat +import dagger.Binds +import dagger.BindsInstance +import dagger.Component +import dagger.Module +import org.junit.Before +import org.junit.Test +import org.junit.runner.RunWith +import org.oppia.android.domain.oppialogger.LoggingIdentifierModule +import org.oppia.android.domain.oppialogger.analytics.ApplicationLifecycleModule +import org.oppia.android.domain.oppialogger.loguploader.LogReportWorkerModule +import org.oppia.android.domain.platformparameter.PlatformParameterModule +import org.oppia.android.domain.platformparameter.PlatformParameterSingletonModule +import org.oppia.android.testing.logging.SyncStatusTestModule +import org.oppia.android.testing.robolectric.RobolectricModule +import org.oppia.android.testing.threading.TestCoroutineDispatchers +import org.oppia.android.testing.threading.TestDispatcherModule +import org.oppia.android.testing.time.FakeOppiaClockModule +import org.oppia.android.util.caching.AssetModule +import org.oppia.android.util.data.DataProvidersInjector +import org.oppia.android.util.data.DataProvidersInjectorProvider +import org.oppia.android.util.locale.LocaleProdModule +import org.oppia.android.util.logging.LoggerModule +import org.oppia.android.util.logging.firebase.LogReportingModule +import org.oppia.android.util.logging.performancemetrics.PerformanceMetricsAssessorModule +import org.oppia.android.util.logging.performancemetrics.PerformanceMetricsConfigurationsModule +import org.oppia.android.util.networking.NetworkConnectionUtilDebugModule +import org.robolectric.annotation.Config +import org.robolectric.annotation.LooperMode +import java.util.concurrent.TimeUnit +import javax.inject.Inject +import javax.inject.Singleton + +/** Tests for [PerformanceMetricsLogScheduler]. */ +// FunctionName: test names are conventionally named with underscores. +@Suppress("FunctionName") +@RunWith(AndroidJUnit4::class) +@LooperMode(LooperMode.Mode.PAUSED) +@Config(application = PerformanceMetricsLogSchedulerTest.TestApplication::class) +class PerformanceMetricsLogSchedulerTest { + + @Inject + lateinit var performanceMetricsLogScheduler: PerformanceMetricsLogScheduler + + @Inject + lateinit var metricLogSchedulingWorkerFactory: MetricLogSchedulingWorkerFactory + + @Inject + lateinit var testCoroutineDispatchers: TestCoroutineDispatchers + + @Inject + lateinit var context: Context + + private lateinit var workManager: WorkManager + + private val workerCaseForSchedulingPeriodicBackgroundMetricLogs: Data = Data.Builder() + .putString( + MetricLogSchedulingWorker.WORKER_CASE_KEY, + MetricLogSchedulingWorker.PERIODIC_BACKGROUND_METRIC_WORKER + ) + .build() + + private val workerCaseForSchedulingStorageUsageMetricLogs: Data = Data.Builder() + .putString( + MetricLogSchedulingWorker.WORKER_CASE_KEY, + MetricLogSchedulingWorker.STORAGE_USAGE_WORKER + ) + .build() + + private val workerCaseForSchedulingPeriodicUiMetricLogs: Data = Data.Builder() + .putString( + MetricLogSchedulingWorker.WORKER_CASE_KEY, + MetricLogSchedulingWorker.PERIODIC_UI_METRIC_WORKER + ) + .build() + + @Before + fun setUp() { + setUpTestApplicationComponent() + val config = Configuration.Builder() + .setExecutor(SynchronousExecutor()) + .setWorkerFactory(metricLogSchedulingWorkerFactory) + .build() + WorkManagerTestInitHelper.initializeTestWorkManager(context, config) + workManager = WorkManager.getInstance(ApplicationProvider.getApplicationContext()) + } + + @Test + fun testScheduler_enqueueRequestForPeriodicBackgroundMetrics_workRequestGetsEnqueued() { + val request = PeriodicWorkRequest + .Builder(MetricLogSchedulingWorker::class.java, 15, TimeUnit.MINUTES) + .setInputData(workerCaseForSchedulingPeriodicBackgroundMetricLogs) + .build() + + performanceMetricsLogScheduler.enqueueWorkRequestForPeriodicBackgroundMetrics( + workManager, + request + ) + testCoroutineDispatchers.runCurrent() + val workInfo = workManager.getWorkInfoById(request.id) + + assertThat(workInfo.get().state).isEqualTo(WorkInfo.State.ENQUEUED) + } + + @Test + fun testScheduler_enqueueRequestForPeriodicUiMetric_workRequestGetsEnqueued() { + val request = PeriodicWorkRequest + .Builder(MetricLogSchedulingWorker::class.java, 15, TimeUnit.MINUTES) + .setInputData(workerCaseForSchedulingPeriodicUiMetricLogs) + .build() + + performanceMetricsLogScheduler.enqueueWorkRequestForPeriodicUiMetrics( + workManager, + request + ) + testCoroutineDispatchers.runCurrent() + val workInfo = workManager.getWorkInfoById(request.id) + + assertThat(workInfo.get().state).isEqualTo(WorkInfo.State.ENQUEUED) + } + + @Test + fun testScheduler_enqueueRequestForStorageMetric_workRequestGetsEnqueued() { + val request = PeriodicWorkRequest + .Builder(MetricLogSchedulingWorker::class.java, 15, TimeUnit.MINUTES) + .setInputData(workerCaseForSchedulingStorageUsageMetricLogs) + .build() + + performanceMetricsLogScheduler.enqueueWorkRequestForStorageUsage( + workManager, + request + ) + testCoroutineDispatchers.runCurrent() + val workInfo = workManager.getWorkInfoById(request.id) + + assertThat(workInfo.get().state).isEqualTo(WorkInfo.State.ENQUEUED) + } + + private fun setUpTestApplicationComponent() { + DaggerPerformanceMetricsLogSchedulerTest_TestApplicationComponent.builder() + .setApplication(ApplicationProvider.getApplicationContext()) + .build() + .inject(this) + } + + // TODO(#89): Move this to a common test application component. + @Module + interface TestModule { + @Binds + fun provideContext(application: Application): Context + } + + // TODO(#89): Move this to a common test application component. + @Singleton + @Component( + modules = [ + TestModule::class, MetricLogSchedulerModule::class, LoggerModule::class, + RobolectricModule::class, LocaleProdModule::class, FakeOppiaClockModule::class, + TestDispatcherModule::class, LogReportWorkerModule::class, FakeOppiaClockModule::class, + NetworkConnectionUtilDebugModule::class, LocaleProdModule::class, LoggerModule::class, + AssetModule::class, PlatformParameterModule::class, PlatformParameterSingletonModule::class, + LoggingIdentifierModule::class, SyncStatusTestModule::class, + PerformanceMetricsAssessorModule::class, ApplicationLifecycleModule::class, + LogReportingModule::class, PerformanceMetricsConfigurationsModule::class + ] + ) + interface TestApplicationComponent : DataProvidersInjector { + @Component.Builder + interface Builder { + @BindsInstance + fun setApplication(application: Application): Builder + + fun build(): TestApplicationComponent + } + + fun inject(performanceMetricsLogSchedulerTest: PerformanceMetricsLogSchedulerTest) + } + + class TestApplication : Application(), DataProvidersInjectorProvider { + private val component: TestApplicationComponent by lazy { + DaggerPerformanceMetricsLogSchedulerTest_TestApplicationComponent.builder() + .setApplication(this) + .build() + } + + fun inject(performanceMetricsLogSchedulerTest: PerformanceMetricsLogSchedulerTest) { + component.inject(performanceMetricsLogSchedulerTest) + } + + override fun getDataProvidersInjector(): DataProvidersInjector = component + } +} diff --git a/domain/src/test/java/org/oppia/android/domain/oppialogger/loguploader/LogUploadWorkManagerInitializerTest.kt b/domain/src/test/java/org/oppia/android/domain/oppialogger/loguploader/LogReportWorkManagerInitializerTest.kt similarity index 59% rename from domain/src/test/java/org/oppia/android/domain/oppialogger/loguploader/LogUploadWorkManagerInitializerTest.kt rename to domain/src/test/java/org/oppia/android/domain/oppialogger/loguploader/LogReportWorkManagerInitializerTest.kt index 141d90098b9..50b92a0573e 100644 --- a/domain/src/test/java/org/oppia/android/domain/oppialogger/loguploader/LogUploadWorkManagerInitializerTest.kt +++ b/domain/src/test/java/org/oppia/android/domain/oppialogger/loguploader/LogReportWorkManagerInitializerTest.kt @@ -8,6 +8,7 @@ import androidx.test.platform.app.InstrumentationRegistry import androidx.work.Configuration import androidx.work.Constraints import androidx.work.Data +import androidx.work.DelegatingWorkerFactory import androidx.work.NetworkType import androidx.work.testing.SynchronousExecutor import androidx.work.testing.WorkManagerTestInitHelper @@ -24,8 +25,12 @@ import org.oppia.android.domain.oppialogger.EventLogStorageCacheSize import org.oppia.android.domain.oppialogger.ExceptionLogStorageCacheSize import org.oppia.android.domain.oppialogger.LoggingIdentifierModule import org.oppia.android.domain.oppialogger.OppiaLogger +import org.oppia.android.domain.oppialogger.PerformanceMetricsLogStorageCacheSize import org.oppia.android.domain.oppialogger.analytics.ApplicationLifecycleModule +import org.oppia.android.domain.oppialogger.analytics.testing.FakeLogScheduler import org.oppia.android.domain.oppialogger.exceptions.ExceptionsController +import org.oppia.android.domain.oppialogger.logscheduler.MetricLogSchedulingWorker +import org.oppia.android.domain.oppialogger.logscheduler.MetricLogSchedulingWorkerFactory import org.oppia.android.domain.platformparameter.PlatformParameterModule import org.oppia.android.domain.platformparameter.PlatformParameterSingletonModule import org.oppia.android.domain.testing.oppialogger.loguploader.FakeLogUploader @@ -41,6 +46,7 @@ import org.oppia.android.util.data.DataProviders import org.oppia.android.util.locale.LocaleProdModule import org.oppia.android.util.logging.LogUploader import org.oppia.android.util.logging.LoggerModule +import org.oppia.android.util.logging.MetricLogScheduler import org.oppia.android.util.logging.SyncStatusModule import org.oppia.android.util.networking.NetworkConnectionDebugUtil import org.oppia.android.util.networking.NetworkConnectionUtilDebugModule @@ -52,13 +58,16 @@ import javax.inject.Singleton @RunWith(AndroidJUnit4::class) @LooperMode(LooperMode.Mode.PAUSED) @Config(manifest = Config.NONE) -class LogUploadWorkManagerInitializerTest { +class LogReportWorkManagerInitializerTest { @Inject lateinit var logUploadWorkerFactory: LogUploadWorkerFactory @Inject - lateinit var logUploadWorkManagerInitializer: LogUploadWorkManagerInitializer + lateinit var metricLogSchedulingWorkerFactory: MetricLogSchedulingWorkerFactory + + @Inject + lateinit var logReportWorkManagerInitializer: LogReportWorkManagerInitializer @Inject lateinit var exceptionsController: ExceptionsController @@ -81,6 +90,9 @@ class LogUploadWorkManagerInitializerTest { @Inject lateinit var fakeLogUploader: FakeLogUploader + @Inject + lateinit var fakeLogScheduler: FakeLogScheduler + @Inject lateinit var testCoroutineDispatchers: TestCoroutineDispatchers @@ -90,26 +102,47 @@ class LogUploadWorkManagerInitializerTest { fun setUp() { setUpTestApplicationComponent() context = InstrumentationRegistry.getInstrumentation().targetContext + + val delegatingWorkerFactory = DelegatingWorkerFactory() + delegatingWorkerFactory.addFactory(logUploadWorkerFactory) + delegatingWorkerFactory.addFactory(metricLogSchedulingWorkerFactory) + val config = Configuration.Builder() .setExecutor(SynchronousExecutor()) - .setWorkerFactory(logUploadWorkerFactory) + .setWorkerFactory(delegatingWorkerFactory) .build() WorkManagerTestInitHelper.initializeTestWorkManager(context, config) } @Test fun testWorkRequest_onCreate_enqueuesRequest_verifyRequestId() { - logUploadWorkManagerInitializer.onCreate() + logReportWorkManagerInitializer.onCreate() testCoroutineDispatchers.runCurrent() - val enqueuedEventWorkRequestId = logUploadWorkManagerInitializer.getWorkRequestForEventsId() + val enqueuedEventWorkRequestId = logReportWorkManagerInitializer.getWorkRequestForEventsId() val enqueuedExceptionWorkRequestId = - logUploadWorkManagerInitializer.getWorkRequestForExceptionsId() + logReportWorkManagerInitializer.getWorkRequestForExceptionsId() + val enqueuedSchedulingStorageUsageMetricWorkRequestId = + logReportWorkManagerInitializer.getWorkRequestForSchedulingStorageUsageMetricLogsId() + val enqueuedSchedulingPeriodicUiMetricWorkRequestId = + logReportWorkManagerInitializer.getWorkRequestForSchedulingPeriodicUiMetricLogsId() + val enqueuedSchedulingPeriodicBackgroundPerformanceMetricWorkRequestId = + logReportWorkManagerInitializer + .getWorkRequestForSchedulingPeriodicBackgroundPerformanceMetricLogsId() assertThat(fakeLogUploader.getMostRecentEventRequestId()).isEqualTo(enqueuedEventWorkRequestId) assertThat(fakeLogUploader.getMostRecentExceptionRequestId()).isEqualTo( enqueuedExceptionWorkRequestId ) + assertThat(fakeLogScheduler.getMostRecentStorageUsageMetricLoggingRequestId()).isEqualTo( + enqueuedSchedulingStorageUsageMetricWorkRequestId + ) + assertThat(fakeLogScheduler.getMostRecentPeriodicUiMetricLoggingRequestId()).isEqualTo( + enqueuedSchedulingPeriodicUiMetricWorkRequestId + ) + assertThat(fakeLogScheduler.getMostRecentPeriodicBackgroundMetricLoggingRequestId()).isEqualTo( + enqueuedSchedulingPeriodicBackgroundPerformanceMetricWorkRequestId + ) } @Test @@ -120,7 +153,7 @@ class LogUploadWorkManagerInitializerTest { .build() val logUploadingWorkRequestConstraints = - logUploadWorkManagerInitializer.getLogUploadWorkerConstraints() + logReportWorkManagerInitializer.getLogReportWorkerConstraints() assertThat(logUploadingWorkRequestConstraints).isEqualTo(workerConstraints) } @@ -134,7 +167,7 @@ class LogUploadWorkManagerInitializerTest { ) .build() - assertThat(logUploadWorkManagerInitializer.getWorkRequestDataForEvents()).isEqualTo( + assertThat(logReportWorkManagerInitializer.getWorkRequestDataForEvents()).isEqualTo( workerCaseForUploadingEvents ) } @@ -148,13 +181,56 @@ class LogUploadWorkManagerInitializerTest { ) .build() - assertThat(logUploadWorkManagerInitializer.getWorkRequestDataForExceptions()).isEqualTo( - workerCaseForUploadingExceptions - ) + assertThat( + logReportWorkManagerInitializer.getWorkRequestDataForExceptions() + ).isEqualTo(workerCaseForUploadingExceptions) + } + + @Test + fun testWorkRequest_verifyWorkRequestData_forSchedulingStorageUsageMetricLogs() { + val workerCaseForSchedulingStorageUsageMetricLogs: Data = Data.Builder() + .putString( + MetricLogSchedulingWorker.WORKER_CASE_KEY, + MetricLogSchedulingWorker.STORAGE_USAGE_WORKER + ) + .build() + + assertThat( + logReportWorkManagerInitializer.getWorkRequestDataForSchedulingStorageUsageMetricLogs() + ).isEqualTo(workerCaseForSchedulingStorageUsageMetricLogs) + } + + @Test + fun testWorkRequest_verifyWorkRequestData_forSchedulingPeriodicBackgroundPerformanceMetricLogs() { + val workerCaseForSchedulingPeriodicPerformanceMetricLogs: Data = Data.Builder() + .putString( + MetricLogSchedulingWorker.WORKER_CASE_KEY, + MetricLogSchedulingWorker.PERIODIC_BACKGROUND_METRIC_WORKER + ) + .build() + + assertThat( + logReportWorkManagerInitializer + .getWorkRequestDataForSchedulingPeriodicBackgroundPerformanceMetricLogs() + ).isEqualTo(workerCaseForSchedulingPeriodicPerformanceMetricLogs) + } + + @Test + fun testWorkRequest_verifyWorkRequestData_forSchedulingPeriodicUiMetricLogs() { + val workerCaseForSchedulingMemoryUsageMetricLogs: Data = Data.Builder() + .putString( + MetricLogSchedulingWorker.WORKER_CASE_KEY, + MetricLogSchedulingWorker.PERIODIC_UI_METRIC_WORKER + ) + .build() + + assertThat( + logReportWorkManagerInitializer.getWorkRequestDataForSchedulingPeriodicUiMetricLogs() + ).isEqualTo(workerCaseForSchedulingMemoryUsageMetricLogs) } private fun setUpTestApplicationComponent() { - DaggerLogUploadWorkManagerInitializerTest_TestApplicationComponent.builder() + DaggerLogReportWorkManagerInitializerTest_TestApplicationComponent.builder() .setApplication(ApplicationProvider.getApplicationContext()) .build() .inject(this) @@ -180,6 +256,10 @@ class LogUploadWorkManagerInitializerTest { @Provides @ExceptionLogStorageCacheSize fun provideExceptionLogStorageSize(): Int = 2 + + @Provides + @PerformanceMetricsLogStorageCacheSize + fun providePerformanceMetricsLogStorageCacheSize(): Int = 2 } @Module @@ -187,6 +267,9 @@ class LogUploadWorkManagerInitializerTest { @Binds fun bindsFakeLogUploader(fakeLogUploader: FakeLogUploader): LogUploader + + @Binds + fun bindsFakeLogScheduler(fakeLogScheduler: FakeLogScheduler): MetricLogScheduler } // TODO(#89): Move this to a common test application component. @@ -195,7 +278,7 @@ class LogUploadWorkManagerInitializerTest { modules = [ TestModule::class, TestLogReportingModule::class, RobolectricModule::class, TestLogStorageModule::class, TestDispatcherModule::class, - LogUploadWorkerModule::class, TestFirebaseLogUploaderModule::class, + LogReportWorkerModule::class, TestFirebaseLogUploaderModule::class, FakeOppiaClockModule::class, NetworkConnectionUtilDebugModule::class, LocaleProdModule::class, LoggerModule::class, AssetModule::class, LoggerModule::class, PlatformParameterModule::class, PlatformParameterSingletonModule::class, LoggingIdentifierModule::class, @@ -210,6 +293,6 @@ class LogUploadWorkManagerInitializerTest { fun build(): TestApplicationComponent } - fun inject(logUploadWorkRequestTest: LogUploadWorkManagerInitializerTest) + fun inject(logUploadWorkRequestTest: LogReportWorkManagerInitializerTest) } } diff --git a/domain/src/test/java/org/oppia/android/domain/oppialogger/loguploader/LogUploadWorkerTest.kt b/domain/src/test/java/org/oppia/android/domain/oppialogger/loguploader/LogUploadWorkerTest.kt index ffdd501d390..3e7881b4525 100644 --- a/domain/src/test/java/org/oppia/android/domain/oppialogger/loguploader/LogUploadWorkerTest.kt +++ b/domain/src/test/java/org/oppia/android/domain/oppialogger/loguploader/LogUploadWorkerTest.kt @@ -336,7 +336,7 @@ class LogUploadWorkerTest { @Component( modules = [ TestModule::class, RobolectricModule::class, TestLogStorageModule::class, - TestDispatcherModule::class, LogUploadWorkerModule::class, + TestDispatcherModule::class, LogReportWorkerModule::class, TestFirebaseLogUploaderModule::class, FakeOppiaClockModule::class, NetworkConnectionUtilDebugModule::class, LocaleProdModule::class, LoggerModule::class, AssetModule::class, PlatformParameterModule::class, PlatformParameterSingletonModule::class, diff --git a/instrumentation/src/java/org/oppia/android/instrumentation/application/TestApplicationComponent.kt b/instrumentation/src/java/org/oppia/android/instrumentation/application/TestApplicationComponent.kt index 22bedb239cb..b8f2ba6422a 100644 --- a/instrumentation/src/java/org/oppia/android/instrumentation/application/TestApplicationComponent.kt +++ b/instrumentation/src/java/org/oppia/android/instrumentation/application/TestApplicationComponent.kt @@ -33,8 +33,10 @@ import org.oppia.android.domain.onboarding.ExpirationMetaDataRetrieverModule import org.oppia.android.domain.oppialogger.LogStorageModule import org.oppia.android.domain.oppialogger.LoggingIdentifierModule import org.oppia.android.domain.oppialogger.analytics.ApplicationLifecycleModule +import org.oppia.android.domain.oppialogger.analytics.PerformanceMetricsLoggerModule import org.oppia.android.domain.oppialogger.exceptions.UncaughtExceptionLoggerModule -import org.oppia.android.domain.oppialogger.loguploader.LogUploadWorkerModule +import org.oppia.android.domain.oppialogger.logscheduler.MetricLogSchedulerModule +import org.oppia.android.domain.oppialogger.loguploader.LogReportWorkerModule import org.oppia.android.domain.platformparameter.PlatformParameterModule import org.oppia.android.domain.platformparameter.PlatformParameterSingletonModule import org.oppia.android.domain.platformparameter.syncup.PlatformParameterSyncUpWorkerModule @@ -49,6 +51,8 @@ import org.oppia.android.util.logging.LoggerModule import org.oppia.android.util.logging.SyncStatusModule import org.oppia.android.util.logging.firebase.DebugLogReportingModule import org.oppia.android.util.logging.firebase.FirebaseLogUploaderModule +import org.oppia.android.util.logging.performancemetrics.PerformanceMetricsAssessorModule +import org.oppia.android.util.logging.performancemetrics.PerformanceMetricsConfigurationsModule import org.oppia.android.util.networking.NetworkConnectionDebugUtilModule import org.oppia.android.util.networking.NetworkConnectionUtilDebugModule import org.oppia.android.util.parser.html.HtmlParserEntityTypeModule @@ -79,7 +83,7 @@ import javax.inject.Singleton ViewBindingShimModule::class, PrimeTopicAssetsControllerModule::class, ExpirationMetaDataRetrieverModule::class, RatioInputModule::class, UncaughtExceptionLoggerModule::class, ApplicationStartupListenerModule::class, - LogUploadWorkerModule::class, WorkManagerConfigurationModule::class, + LogReportWorkerModule::class, WorkManagerConfigurationModule::class, HintsAndSolutionConfigModule::class, HintsAndSolutionProdModule::class, FirebaseLogUploaderModule::class, NetworkModule::class, PracticeTabModule::class, PlatformParameterModule::class, PlatformParameterSingletonModule::class, @@ -90,7 +94,9 @@ import javax.inject.Singleton NumericExpressionInputModule::class, AlgebraicExpressionInputModule::class, MathEquationInputModule::class, SplitScreenInteractionModule::class, LoggingIdentifierModule::class, ApplicationLifecycleModule::class, - SyncStatusModule::class, NetworkConnectionDebugUtilModule::class + SyncStatusModule::class, NetworkConnectionDebugUtilModule::class, + MetricLogSchedulerModule::class, PerformanceMetricsLoggerModule::class, + PerformanceMetricsAssessorModule::class, PerformanceMetricsConfigurationsModule::class ] ) interface TestApplicationComponent : ApplicationComponent { diff --git a/model/src/main/proto/BUILD.bazel b/model/src/main/proto/BUILD.bazel index 02838f1c01c..c6d19966e44 100644 --- a/model/src/main/proto/BUILD.bazel +++ b/model/src/main/proto/BUILD.bazel @@ -50,6 +50,17 @@ java_lite_proto_library( deps = [":event_logger_proto"], ) +oppia_proto_library( + name = "performance_metrics_event_logger_proto", + srcs = ["performance_metrics.proto"], +) + +java_lite_proto_library( + name = "performance_metrics_event_logger_java_proto_lite", + visibility = ["//:oppia_api_visibility"], + deps = [":performance_metrics_event_logger_proto"], +) + oppia_proto_library( name = "exploration_checkpoint_proto", srcs = ["exploration_checkpoint.proto"], diff --git a/model/src/main/proto/performance_metrics.proto b/model/src/main/proto/performance_metrics.proto index a6019cfb772..85c54cdd828 100644 --- a/model/src/main/proto/performance_metrics.proto +++ b/model/src/main/proto/performance_metrics.proto @@ -85,16 +85,14 @@ message OppiaMetricLog { // Structure of the network usage metric. message NetworkUsageMetric { - // Usage data is collected in discrete bins of time called 'Buckets'. The time interval of this - // bucket is customizable and depends on the query that we are making. This data is logged after - // the bucket's timeframe. + // Both metrics count the packets across all network interfaces, and always increases + // monotonically since device reboot. Statistics are measured at the network layer, so they + // include both TCP and UDP usage. - // This field denotes the number of bytes received by the application on the device during - // this bucket's time interval. + // This field denotes the number of bytes received by the application since device reboot. int64 bytes_received = 1; - // This field denotes the number of bytes sent by the application on the device during - // this bucket's time interval. + // This field denotes the number of bytes sent by the application since device reboot. int64 bytes_sent = 2; } diff --git a/scripts/assets/file_content_validation_checks.textproto b/scripts/assets/file_content_validation_checks.textproto index 369a38ee68d..ab76d9e3ddf 100644 --- a/scripts/assets/file_content_validation_checks.textproto +++ b/scripts/assets/file_content_validation_checks.textproto @@ -33,6 +33,7 @@ file_content_checks { failure_message: "SettableFuture should only be used in pre-approved locations since it's easy to potentially mess up & lead to a hanging ListenableFuture." exempted_file_name: "domain/src/main/java/org/oppia/android/domain/oppialogger/loguploader/LogUploadWorker.kt" exempted_file_name: "domain/src/main/java/org/oppia/android/domain/platformparameter/syncup/PlatformParameterSyncUpWorker.kt" + exempted_file_name: "domain/src/main/java/org/oppia/android/domain/oppialogger/logscheduler/MetricLogSchedulingWorker.kt" exempted_file_name: "scripts/src/javatests/org/oppia/android/scripts/regex/RegexPatternValidationCheckTest.kt" } file_content_checks { @@ -308,6 +309,7 @@ file_content_checks { exempted_file_name: "utility/src/test/java/org/oppia/android/util/math/MathTokenizerTest.kt" exempted_file_name: "utility/src/test/java/org/oppia/android/util/math/PolynomialExtensionsTest.kt" exempted_file_name: "utility/src/test/java/org/oppia/android/util/math/RealExtensionsTest.kt" + exempted_file_name: "utility/src/test/java/org/oppia/android/util/logging/performancemetrics/PerformanceMetricsAssessorImplTest.kt" exempted_file_patterns: "testing/src/main/java/org/oppia/android/testing/junit/.+?\\.kt" } file_content_checks { diff --git a/scripts/assets/test_file_exemptions.textproto b/scripts/assets/test_file_exemptions.textproto index fc9609ccae0..24119196db3 100644 --- a/scripts/assets/test_file_exemptions.textproto +++ b/scripts/assets/test_file_exemptions.textproto @@ -636,7 +636,7 @@ exempted_file_path: "domain/src/main/java/org/oppia/android/domain/oppialogger/L exempted_file_path: "domain/src/main/java/org/oppia/android/domain/oppialogger/analytics/LearnerAnalyticsInactivityLimitMillis.kt" exempted_file_path: "domain/src/main/java/org/oppia/android/domain/oppialogger/exceptions/UncaughtExceptionLoggerModule.kt" exempted_file_path: "domain/src/main/java/org/oppia/android/domain/oppialogger/loguploader/LogUploadWorkerFactory.kt" -exempted_file_path: "domain/src/main/java/org/oppia/android/domain/oppialogger/loguploader/LogUploadWorkerModule.kt" +exempted_file_path: "domain/src/main/java/org/oppia/android/domain/oppialogger/loguploader/LogReportWorkerModule.kt" exempted_file_path: "domain/src/main/java/org/oppia/android/domain/platformparameter/PlatformParameterAlphaKenyaModule.kt" exempted_file_path: "domain/src/main/java/org/oppia/android/domain/platformparameter/PlatformParameterSingletonImpl.kt" exempted_file_path: "domain/src/main/java/org/oppia/android/domain/platformparameter/PlatformParameterSingletonModule.kt" @@ -824,3 +824,7 @@ exempted_file_path: "utility/src/main/java/org/oppia/android/util/threading/Conc exempted_file_path: "utility/src/main/java/org/oppia/android/util/threading/DispatcherInjector.kt" exempted_file_path: "utility/src/main/java/org/oppia/android/util/threading/DispatcherInjectorProvider.kt" exempted_file_path: "utility/src/main/java/org/oppia/android/util/threading/DispatcherModule.kt" +exempted_file_path: "utility/src/main/java/org/oppia/android/util/logging/performancemetrics/PerformanceMetricsAssessor.kt" +exempted_file_path: "utility/src/main/java/org/oppia/android/util/logging/MetricLogScheduler.kt" +exempted_file_path: "utility/src/main/java/org/oppia/android/util/logging/performancemetrics/PerformanceMetricsEventLogger.kt" +exempted_file_path: "domain/src/main/java/org/oppia/android/domain/oppialogger/logscheduler/MetricLogSchedulingWorkerFactory.kt" diff --git a/testing/BUILD.bazel b/testing/BUILD.bazel index 49cee29f1c1..cfb0a7133a3 100644 --- a/testing/BUILD.bazel +++ b/testing/BUILD.bazel @@ -37,6 +37,7 @@ kt_android_library( "//domain", "//domain/src/main/java/org/oppia/android/domain/classify:interactions_module", "//domain/src/main/java/org/oppia/android/domain/profile:profile_management_controller", + "//model/src/main/proto:performance_metrics_event_logger_java_proto_lite", "//testing/src/main/java/org/oppia/android/testing/data:async_result_subject", "//testing/src/main/java/org/oppia/android/testing/threading:test_coroutine_dispatchers", "//testing/src/main/java/org/oppia/android/testing/time:fake_oppia_clock", @@ -61,6 +62,8 @@ kt_android_library( "//third_party:org_mockito_mockito-core", "//third_party:org_robolectric_robolectric", "//utility", + "//utility/src/main/java/org/oppia/android/util/logging/performancemetrics:performance_metrics_assessor", + "//utility/src/main/java/org/oppia/android/util/logging/performancemetrics:performance_metrics_event_logger", "//utility/src/main/java/org/oppia/android/util/parser/image:glide_image_loader_module", "//utility/src/main/java/org/oppia/android/util/parser/image:image_loader", "//utility/src/main/java/org/oppia/android/util/parser/image:image_parsing_module", @@ -79,6 +82,7 @@ TEST_DEPS = [ "//domain/src/main/java/org/oppia/android/domain/oppialogger:prod_module", "//domain/src/main/java/org/oppia/android/domain/oppialogger/analytics:prod_module", "//domain/src/main/java/org/oppia/android/domain/profile:profile_management_controller", + "//model/src/main/proto:performance_metrics_event_logger_java_proto_lite", "//testing/src/main/java/org/oppia/android/testing/data:async_result_subject", "//testing/src/main/java/org/oppia/android/testing/data:data_provider_test_monitor", "//testing/src/main/java/org/oppia/android/testing/espresso:text_input_action", @@ -109,6 +113,8 @@ TEST_DEPS = [ "//utility/src/main/java/org/oppia/android/util/caching/testing:caching_test_module", "//utility/src/main/java/org/oppia/android/util/locale:prod_module", "//utility/src/main/java/org/oppia/android/util/logging:prod_module", + "//utility/src/main/java/org/oppia/android/util/logging/performancemetrics:performance_metrics_assessor", + "//utility/src/main/java/org/oppia/android/util/logging/performancemetrics:performance_metrics_event_logger", "//utility/src/main/java/org/oppia/android/util/networking:debug_module", "//utility/src/main/java/org/oppia/android/util/system:prod_module", ] diff --git a/testing/src/main/java/org/oppia/android/testing/FakePerformanceMetricAssessor.kt b/testing/src/main/java/org/oppia/android/testing/FakePerformanceMetricAssessor.kt new file mode 100644 index 00000000000..f797b922029 --- /dev/null +++ b/testing/src/main/java/org/oppia/android/testing/FakePerformanceMetricAssessor.kt @@ -0,0 +1,67 @@ +package org.oppia.android.testing + +import org.oppia.android.app.model.OppiaMetricLog +import org.oppia.android.util.logging.performancemetrics.PerformanceMetricsAssessor +import javax.inject.Inject +import javax.inject.Singleton + +/** A test specific fake for performance metric utils. */ +@Singleton +class FakePerformanceMetricAssessor @Inject constructor() : PerformanceMetricsAssessor { + private var testApkSize = 0L + private var testStorageUsage = 0L + private var testTotalPss = 0L + private var testTotalBytesSent = 0L + private var testTotalReceivedBytes = 0L + private var testDeviceStorageTier = OppiaMetricLog.StorageTier.MEDIUM_STORAGE + private var testDeviceMemoryTier = OppiaMetricLog.MemoryTier.MEDIUM_MEMORY_TIER + + override fun getApkSize(): Long = testApkSize + + override fun getUsedStorage(): Long = testStorageUsage + + override fun getTotalPssUsed(): Long = testTotalPss + + override fun getTotalSentBytes(): Long = testTotalBytesSent + + override fun getTotalReceivedBytes(): Long = testTotalReceivedBytes + + override fun getDeviceStorageTier(): OppiaMetricLog.StorageTier = testDeviceStorageTier + + override fun getDeviceMemoryTier(): OppiaMetricLog.MemoryTier = testDeviceMemoryTier + + /** Sets [apkSize] as the value of [testApkSize]. */ + fun setApkSize(apkSize: Long) { + testApkSize = apkSize + } + + /** Sets [storageUsage] as the value of [testStorageUsage]. */ + fun setStorageUsage(storageUsage: Long) { + testStorageUsage = storageUsage + } + + /** Sets [totalPss] as the value of [testTotalPss]. */ + fun setTotalPss(totalPss: Long) { + testTotalPss = totalPss + } + + /** Sets [sentBytes] as the value of [testTotalBytesSent]. */ + fun setTotalSentBytes(sentBytes: Long) { + testTotalBytesSent = sentBytes + } + + /** Sets [receivedBytes] as the value of [testTotalReceivedBytes]. */ + fun setTotalReceivedBytes(receivedBytes: Long) { + testTotalReceivedBytes = receivedBytes + } + + /** Sets [storageTier] as the value of [testDeviceStorageTier]. */ + fun setDeviceStorageTier(storageTier: OppiaMetricLog.StorageTier) { + testDeviceStorageTier = storageTier + } + + /** Sets [memoryTier] as the value of [testDeviceMemoryTier]. */ + fun setDeviceMemoryTier(memoryTier: OppiaMetricLog.MemoryTier) { + testDeviceMemoryTier = memoryTier + } +} diff --git a/testing/src/main/java/org/oppia/android/testing/FakePerformanceMetricsEventLogger.kt b/testing/src/main/java/org/oppia/android/testing/FakePerformanceMetricsEventLogger.kt new file mode 100644 index 00000000000..c48666eb680 --- /dev/null +++ b/testing/src/main/java/org/oppia/android/testing/FakePerformanceMetricsEventLogger.kt @@ -0,0 +1,41 @@ +package org.oppia.android.testing + +import org.oppia.android.app.model.OppiaMetricLog +import org.oppia.android.util.logging.performancemetrics.PerformanceMetricsEventLogger +import java.util.concurrent.CopyOnWriteArrayList +import javax.inject.Inject +import javax.inject.Singleton + +/** A test specific fake for the event logger. */ +@Singleton +class FakePerformanceMetricsEventLogger @Inject constructor() : PerformanceMetricsEventLogger { + private val performanceMetricsEventList = CopyOnWriteArrayList() + + override fun logPerformanceMetric(oppiaMetricLog: OppiaMetricLog) { + performanceMetricsEventList.add(oppiaMetricLog) + } + + /** Returns the oldest event that's been logged. */ + fun getOldestPerformanceMetricsEvent(): OppiaMetricLog = performanceMetricsEventList.first() + + /** Returns the most recently logged event. */ + fun getMostRecentPerformanceMetricsEvent(): OppiaMetricLog = + getMostRecentPerformanceMetricsEvents(count = 1).first() + + /** Returns the most recent [count] logged events. */ + fun getMostRecentPerformanceMetricsEvents(count: Int): List = + performanceMetricsEventList.takeLast(count) + + /** Clears all the events that are currently logged. */ + fun clearAllPerformanceMetricsEvents() = performanceMetricsEventList.clear() + + /** Checks if a certain event has been logged or not. */ + fun hasPerformanceMetricsEventLogged(oppiaMetricLog: OppiaMetricLog): Boolean = + performanceMetricsEventList.contains(oppiaMetricLog) + + /** Returns true if there are no events logged. */ + fun noPerformanceMetricsEventsPresent(): Boolean = performanceMetricsEventList.isEmpty() + + /** Returns the number of events logged to date (and not cleared by [clearAllPerformanceMetricsEvents]). */ + fun getPerformanceMetricsEventListCount(): Int = performanceMetricsEventList.size +} diff --git a/testing/src/main/java/org/oppia/android/testing/TestLogReportingModule.kt b/testing/src/main/java/org/oppia/android/testing/TestLogReportingModule.kt index 627577511ac..4d8c7f37753 100644 --- a/testing/src/main/java/org/oppia/android/testing/TestLogReportingModule.kt +++ b/testing/src/main/java/org/oppia/android/testing/TestLogReportingModule.kt @@ -4,6 +4,8 @@ import dagger.Binds import dagger.Module import org.oppia.android.util.logging.EventLogger import org.oppia.android.util.logging.ExceptionLogger +import org.oppia.android.util.logging.performancemetrics.PerformanceMetricsAssessor +import org.oppia.android.util.logging.performancemetrics.PerformanceMetricsEventLogger /** Provides fake log reporting dependencies. */ @Module @@ -14,4 +16,14 @@ interface TestLogReportingModule { @Binds fun bindFakeEventLogger(fakeEventLogger: FakeEventLogger): EventLogger + + @Binds + fun bindFakePerformanceMetricsEventLogger( + fakePerformanceMetricsEventLogger: FakePerformanceMetricsEventLogger + ): PerformanceMetricsEventLogger + + @Binds + fun bindFakePerformanceMetricsAssessor( + fakePerformanceMetricAssessor: FakePerformanceMetricAssessor + ): PerformanceMetricsAssessor } diff --git a/testing/src/main/java/org/oppia/android/testing/robolectric/BUILD.bazel b/testing/src/main/java/org/oppia/android/testing/robolectric/BUILD.bazel index 89c998daa24..15870e33871 100644 --- a/testing/src/main/java/org/oppia/android/testing/robolectric/BUILD.bazel +++ b/testing/src/main/java/org/oppia/android/testing/robolectric/BUILD.bazel @@ -50,4 +50,28 @@ kt_android_library( ], ) +kt_android_library( + name = "oppia_shadow_activity_manager", + testonly = True, + srcs = [ + "OppiaShadowActivityManager.kt", + ], + visibility = ["//:oppia_testing_visibility"], + deps = [ + "//third_party:org_robolectric_robolectric", + ], +) + +kt_android_library( + name = "oppia_shadow_traffic_stats", + testonly = True, + srcs = [ + "OppiaShadowTrafficStats.kt", + ], + visibility = ["//:oppia_testing_visibility"], + deps = [ + "//third_party:org_robolectric_robolectric", + ], +) + dagger_rules() diff --git a/testing/src/main/java/org/oppia/android/testing/robolectric/OppiaShadowActivityManager.kt b/testing/src/main/java/org/oppia/android/testing/robolectric/OppiaShadowActivityManager.kt new file mode 100644 index 00000000000..b2aedb35be0 --- /dev/null +++ b/testing/src/main/java/org/oppia/android/testing/robolectric/OppiaShadowActivityManager.kt @@ -0,0 +1,54 @@ +package org.oppia.android.testing.robolectric + +import android.app.ActivityManager +import android.os.Debug +import org.robolectric.annotation.Implementation +import org.robolectric.annotation.Implements +import org.robolectric.shadows.ShadowActivityManager + +/** + * Shadows the Activity Manager to extend its testing capabilities. + * + * There is an existing robolectric shadow of Activity Manager but that doesn't provide us enough + * control over Debug.MemoryInfo and hence memory usage can't be tested using that. + */ +@Implements(ActivityManager::class) +class OppiaShadowActivityManager : ShadowActivityManager() { + + private var processMemoryInfo: Array? = arrayOf(Debug.MemoryInfo()) + + private var memoryInfo: ActivityManager.MemoryInfo = ActivityManager.MemoryInfo() + + /** + * Sets [memoryInfo] as part of [processMemoryInfo] which is then returned whenever + * [getProcessMemoryInfo] is called. + */ + fun setProcessMemoryInfo(memoryInfo: Debug.MemoryInfo) { + processMemoryInfo?.set(0, memoryInfo) + } + + /** Sets [memoryInfo] as equal to [memoryInfoValue]. */ + override fun setMemoryInfo(memoryInfoValue: ActivityManager.MemoryInfo) { + this.memoryInfo = memoryInfoValue + } + + /** + * Robolectric shadow override of [ActivityManager.getProcessMemoryInfo]. Note that the value of + * [pids] isn't taken into account in this implementation unlike the actual one. + */ + @Implementation + fun getProcessMemoryInfo(pids: IntArray?): Array? { + return processMemoryInfo + } + + /** Robolectric shadow override of [ActivityManager.getMemoryInfo]. */ + @Implementation + public override fun getMemoryInfo(outInfo: ActivityManager.MemoryInfo) { + outInfo.apply { + availMem = memoryInfo.availMem + outInfo.lowMemory = memoryInfo.lowMemory + outInfo.threshold = memoryInfo.threshold + outInfo.totalMem = memoryInfo.totalMem + } + } +} diff --git a/testing/src/main/java/org/oppia/android/testing/robolectric/OppiaShadowTrafficStats.kt b/testing/src/main/java/org/oppia/android/testing/robolectric/OppiaShadowTrafficStats.kt new file mode 100644 index 00000000000..bd418b58025 --- /dev/null +++ b/testing/src/main/java/org/oppia/android/testing/robolectric/OppiaShadowTrafficStats.kt @@ -0,0 +1,57 @@ +package org.oppia.android.testing.robolectric + +import android.net.TrafficStats +import org.robolectric.annotation.Implementation +import org.robolectric.annotation.Implements + +private const val DEFAULT_BYTE_VALUE = 0L +private var uidTxBytes = DEFAULT_BYTE_VALUE +private var uidRxBytes = DEFAULT_BYTE_VALUE + +/** + * Shadows the Traffic Stats to extend its testing capabilities. + * + * There is an existing robolectric shadow of Traffic Stats but that doesn't provide us enough + * control over network bytes sent/received for a specific UID and hence network usage can't be + * tested using that. + */ +@Implements(TrafficStats::class) +class OppiaShadowTrafficStats { + + /** Sets [uidTxBytes] as equal to [bytes]. */ + fun setUidTxBytes(bytes: Long) { + uidTxBytes = bytes + } + + /** Sets [uidRxBytes] as equal to [bytes]. */ + fun setUidRxBytes(bytes: Long) { + uidRxBytes = bytes + } + + companion object { + /** + * Robolectric shadow override of [TrafficStats.getUidRxBytes]. Note that the value of + * [uid] isn't taken into account in this implementation unlike the actual one. + */ + @Implementation + @JvmStatic + fun getUidRxBytes(uid: Int): Long = uidRxBytes + + /** + * Robolectric shadow override of [TrafficStats.getUidTxBytes]. Note that the value of + * [uid] isn't taken into account in this implementation unlike the actual one. + */ + @Implementation + @JvmStatic + fun getUidTxBytes(uid: Int): Long = uidTxBytes + + /** + * Resets [uidTxBytes] and [uidRxBytes] values. This should always be called in a tear-down + * method to avoid leaking state between tests. + */ + fun reset() { + uidRxBytes = DEFAULT_BYTE_VALUE + uidTxBytes = DEFAULT_BYTE_VALUE + } + } +} diff --git a/testing/src/test/java/org/oppia/android/testing/FakePerformanceMetricAssessorTest.kt b/testing/src/test/java/org/oppia/android/testing/FakePerformanceMetricAssessorTest.kt new file mode 100644 index 00000000000..cb43cd5aaf0 --- /dev/null +++ b/testing/src/test/java/org/oppia/android/testing/FakePerformanceMetricAssessorTest.kt @@ -0,0 +1,174 @@ +package org.oppia.android.testing + +import android.app.Application +import android.content.Context +import androidx.test.core.app.ApplicationProvider +import androidx.test.ext.junit.runners.AndroidJUnit4 +import com.google.common.truth.Truth.assertThat +import dagger.BindsInstance +import dagger.Component +import dagger.Module +import dagger.Provides +import org.junit.Before +import org.junit.Test +import org.junit.runner.RunWith +import org.oppia.android.app.model.OppiaMetricLog +import org.robolectric.annotation.Config +import org.robolectric.annotation.LooperMode +import javax.inject.Inject +import javax.inject.Singleton + +private const val ONE_MEGABYTE = 1024L * 1024L +private const val TEST_APK_SIZE = ONE_MEGABYTE * 3L +private const val TEST_STORAGE_USAGE = ONE_MEGABYTE * 7L +private const val TEST_TOTAL_PSS = ONE_MEGABYTE * 2L +private const val TEST_BYTES_SENT = ONE_MEGABYTE +private const val TEST_BYTES_RECEIVED = ONE_MEGABYTE +private const val DEFAULT_TEST_APK_SIZE = 0L +private const val DEFAULT_TEST_STORAGE_USAGE = 0L +private const val DEFAULT_TEST_TOTAL_PSS = 0L +private const val DEFAULT_TEST_BYTES_SENT = 0L +private const val DEFAULT_TEST_BYTES_RECEIVED = 0L + +/** Tests for [FakePerformanceMetricAssessor]. */ +@RunWith(AndroidJUnit4::class) +@LooperMode(LooperMode.Mode.PAUSED) +@Config(manifest = Config.NONE) +class FakePerformanceMetricAssessorTest { + + @Inject + lateinit var fakePerformanceMetricAssessor: FakePerformanceMetricAssessor + + @Before + fun setUp() { + setUpTestApplicationComponent() + } + + @Test + fun testFakeMetricAssessor_setApkSize_returnsCorrectApkSize() { + fakePerformanceMetricAssessor.setApkSize(TEST_APK_SIZE) + + assertThat(fakePerformanceMetricAssessor.getApkSize()).isEqualTo(TEST_APK_SIZE) + } + + @Test + fun testFakeMetricAssessor_getApkSize_returnsDefaultApkSize() { + assertThat(fakePerformanceMetricAssessor.getApkSize()).isEqualTo(DEFAULT_TEST_APK_SIZE) + } + + @Test + fun testFakeMetricAssessor_setStorageUsage_returnsCorrectStorageSize() { + fakePerformanceMetricAssessor.setStorageUsage(TEST_STORAGE_USAGE) + + assertThat(fakePerformanceMetricAssessor.getUsedStorage()).isEqualTo(TEST_STORAGE_USAGE) + } + + @Test + fun testFakeMetricAssessor_getStorageUsage_returnsDefaultStorageUsage() { + assertThat(fakePerformanceMetricAssessor.getUsedStorage()).isEqualTo(DEFAULT_TEST_STORAGE_USAGE) + } + + @Test + fun testFakeMetricAssessor_setTotalPss_returnsCorrectTotalPss() { + fakePerformanceMetricAssessor.setTotalPss(TEST_TOTAL_PSS) + + assertThat(fakePerformanceMetricAssessor.getTotalPssUsed()).isEqualTo(TEST_TOTAL_PSS) + } + + @Test + fun testFakeMetricAssessor_getTotalPss_returnsDefaultTotalPss() { + assertThat(fakePerformanceMetricAssessor.getUsedStorage()).isEqualTo(DEFAULT_TEST_TOTAL_PSS) + } + + @Test + fun testFakeMetricAssessor_setTotalSentBytes_returnsCorrectTotalSentBytes() { + fakePerformanceMetricAssessor.setTotalSentBytes(TEST_BYTES_SENT) + + assertThat(fakePerformanceMetricAssessor.getTotalSentBytes()).isEqualTo(TEST_BYTES_SENT) + } + + @Test + fun testFakeMetricAssessor_getTotalSentBytes_returnsDefaultTotalSentBytes() { + assertThat(fakePerformanceMetricAssessor.getTotalSentBytes()).isEqualTo(DEFAULT_TEST_BYTES_SENT) + } + + @Test + fun testFakeMetricAssessor_setTotalReceivedBytes_returnsCorrectTotalReceivedBytes() { + fakePerformanceMetricAssessor.setTotalReceivedBytes(TEST_BYTES_RECEIVED) + + assertThat(fakePerformanceMetricAssessor.getTotalReceivedBytes()) + .isEqualTo(TEST_BYTES_RECEIVED) + } + + @Test + fun testFakeMetricAssessor_getTotalReceivedBytes_returnsDefaultTotalReceivedBytes() { + assertThat(fakePerformanceMetricAssessor.getTotalReceivedBytes()) + .isEqualTo(DEFAULT_TEST_BYTES_RECEIVED) + } + + @Test + fun testFakeMetricAssessor_setDeviceStorageTier_returnsCorrectTotalDeviceStorageTier() { + val testDeviceStorageTier = OppiaMetricLog.StorageTier.LOW_STORAGE + fakePerformanceMetricAssessor.setDeviceStorageTier(testDeviceStorageTier) + + assertThat(fakePerformanceMetricAssessor.getDeviceStorageTier()) + .isEqualTo(testDeviceStorageTier) + } + + @Test + fun testFakeMetricAssessor_getDeviceStorageTier_returnsDefaultTotalDeviceStorageTier() { + val defaultTestDeviceStorageTier = OppiaMetricLog.StorageTier.MEDIUM_STORAGE + + assertThat(fakePerformanceMetricAssessor.getDeviceStorageTier()).isEqualTo( + defaultTestDeviceStorageTier + ) + } + + @Test + fun testFakeMetricAssessor_setDeviceMemoryTier_returnsCorrectTotalDeviceMemoryTier() { + val testDeviceMemoryTier = OppiaMetricLog.MemoryTier.LOW_MEMORY_TIER + fakePerformanceMetricAssessor.setDeviceMemoryTier(testDeviceMemoryTier) + + assertThat(fakePerformanceMetricAssessor.getDeviceMemoryTier()).isEqualTo(testDeviceMemoryTier) + } + + @Test + fun testFakeMetricAssessor_getDeviceMemoryTier_returnsDefaultTotalDeviceMemoryTier() { + val defaultTestDeviceMemoryTier = OppiaMetricLog.MemoryTier.MEDIUM_MEMORY_TIER + + assertThat(fakePerformanceMetricAssessor.getDeviceMemoryTier()).isEqualTo( + defaultTestDeviceMemoryTier + ) + } + + private fun setUpTestApplicationComponent() { + DaggerFakePerformanceMetricAssessorTest_TestApplicationComponent.builder() + .setApplication(ApplicationProvider.getApplicationContext()) + .build() + .inject(this) + } + + // TODO(#89): Move this to a common test application component. + @Module + class TestModule { + @Provides + @Singleton + fun provideContext(application: Application): Context { + return application + } + } + + // TODO(#89): Move this to a common test application component. + @Singleton + @Component(modules = [TestModule::class, TestLogReportingModule::class]) + interface TestApplicationComponent { + @Component.Builder + interface Builder { + @BindsInstance + fun setApplication(application: Application): Builder + fun build(): TestApplicationComponent + } + + fun inject(fakePerformanceMetricAssessorTest: FakePerformanceMetricAssessorTest) + } +} diff --git a/testing/src/test/java/org/oppia/android/testing/FakePerformanceMetricsEventLoggerTest.kt b/testing/src/test/java/org/oppia/android/testing/FakePerformanceMetricsEventLoggerTest.kt new file mode 100644 index 00000000000..63afc482661 --- /dev/null +++ b/testing/src/test/java/org/oppia/android/testing/FakePerformanceMetricsEventLoggerTest.kt @@ -0,0 +1,324 @@ +package org.oppia.android.testing + +import android.app.Application +import android.content.Context +import androidx.test.core.app.ApplicationProvider +import androidx.test.ext.junit.runners.AndroidJUnit4 +import com.google.common.truth.Truth.assertThat +import dagger.BindsInstance +import dagger.Component +import dagger.Module +import dagger.Provides +import org.junit.Before +import org.junit.Test +import org.junit.runner.RunWith +import org.oppia.android.app.model.OppiaMetricLog +import org.oppia.android.app.model.OppiaMetricLog.Priority.HIGH_PRIORITY +import org.oppia.android.app.model.OppiaMetricLog.Priority.MEDIUM_PRIORITY +import org.oppia.android.domain.oppialogger.LogStorageModule +import org.oppia.android.testing.robolectric.RobolectricModule +import org.oppia.android.testing.threading.TestDispatcherModule +import org.oppia.android.testing.time.FakeOppiaClockModule +import org.oppia.android.util.logging.performancemetrics.PerformanceMetricsEventLogger +import org.robolectric.annotation.Config +import org.robolectric.annotation.LooperMode +import javax.inject.Inject +import javax.inject.Singleton + +/** Tests for [FakePerformanceMetricsEventLogger]. */ +// FunctionName: test names are conventionally named with underscores. +@Suppress("FunctionName") +@RunWith(AndroidJUnit4::class) +@LooperMode(LooperMode.Mode.PAUSED) +@Config(manifest = Config.NONE) +class FakePerformanceMetricsEventLoggerTest { + + @Inject + lateinit var fakePerformanceMetricsEventLogger: FakePerformanceMetricsEventLogger + @Inject + lateinit var performanceMetricsEventLogger: PerformanceMetricsEventLogger + + private val metricLog1 = OppiaMetricLog.newBuilder().setPriority(HIGH_PRIORITY).build() + private val metricLog2 = OppiaMetricLog.newBuilder().setPriority(MEDIUM_PRIORITY).build() + + @Before + fun setUp() { + setUpTestApplicationComponent() + } + + @Test + fun testFakeMetricsEventLogger_logPerformanceMetric_returnsMetricEvent() { + performanceMetricsEventLogger.logPerformanceMetric(metricLog1) + val event = fakePerformanceMetricsEventLogger.getMostRecentPerformanceMetricsEvent() + + assertThat(event).isEqualTo(metricLog1) + assertThat(event.priority).isEqualTo(HIGH_PRIORITY) + } + + @Test + fun testFakeMetricsEventLogger_logMetricEventTwice_returnsLatestEvent() { + performanceMetricsEventLogger.logPerformanceMetric(metricLog1) + performanceMetricsEventLogger.logPerformanceMetric(metricLog2) + val event = fakePerformanceMetricsEventLogger.getMostRecentPerformanceMetricsEvent() + + assertThat(event).isEqualTo(metricLog2) + assertThat(event.priority).isEqualTo(MEDIUM_PRIORITY) + } + + @Test + fun testFakeMetricsEventLogger_logEvent_clearAllEvents_logEventAgain_returnsLatestEvent() { + performanceMetricsEventLogger.logPerformanceMetric(metricLog1) + fakePerformanceMetricsEventLogger.clearAllPerformanceMetricsEvents() + performanceMetricsEventLogger.logPerformanceMetric(metricLog2) + val event = fakePerformanceMetricsEventLogger.getMostRecentPerformanceMetricsEvent() + + assertThat(event).isEqualTo(metricLog2) + assertThat(event.priority).isEqualTo(MEDIUM_PRIORITY) + } + + @Test + fun testFakeMetricsEventLogger_logNothing_getMostRecent_returnsFailure() { + assertThrows(NoSuchElementException::class) { + fakePerformanceMetricsEventLogger.getMostRecentPerformanceMetricsEvent() + } + } + + @Test + fun testFakeMetricsEventLogger_logEvent_clearAllEvents_getMostRecent_returnsFailure() { + performanceMetricsEventLogger.logPerformanceMetric(metricLog1) + fakePerformanceMetricsEventLogger.clearAllPerformanceMetricsEvents() + + assertThrows(NoSuchElementException::class) { + fakePerformanceMetricsEventLogger.getMostRecentPerformanceMetricsEvent() + } + } + + @Test + fun testFakeMetricsEventLogger_clearAllEvents_returnsEmptyList() { + fakePerformanceMetricsEventLogger.clearAllPerformanceMetricsEvents() + val isListEmpty = fakePerformanceMetricsEventLogger.noPerformanceMetricsEventsPresent() + + assertThat(isListEmpty).isTrue() + } + + @Test + fun testFakeMetricsEventLogger_logEvent_clearAllEvents_returnsEmptyList() { + performanceMetricsEventLogger.logPerformanceMetric(metricLog1) + fakePerformanceMetricsEventLogger.clearAllPerformanceMetricsEvents() + val isListEmpty = fakePerformanceMetricsEventLogger.noPerformanceMetricsEventsPresent() + + assertThat(isListEmpty).isTrue() + } + + @Test + fun testFakeMetricsEventLogger_logMultipleEvents_clearAllEvents_returnsEmptyList() { + performanceMetricsEventLogger.logPerformanceMetric(metricLog1) + performanceMetricsEventLogger.logPerformanceMetric(metricLog2) + fakePerformanceMetricsEventLogger.clearAllPerformanceMetricsEvents() + val isListEmpty = fakePerformanceMetricsEventLogger.noPerformanceMetricsEventsPresent() + + assertThat(isListEmpty).isTrue() + } + + @Test + fun testFakeMetricsEventLogger_logEvent_returnsNonEmptyList() { + performanceMetricsEventLogger.logPerformanceMetric(metricLog1) + val isListEmpty = fakePerformanceMetricsEventLogger.noPerformanceMetricsEventsPresent() + + assertThat(isListEmpty).isFalse() + } + + @Test + fun testFakeMetricsEventLogger_logMultipleEvents_returnsNonEmptyList() { + performanceMetricsEventLogger.logPerformanceMetric(metricLog1) + performanceMetricsEventLogger.logPerformanceMetric(metricLog2) + + val eventLogStatus1 = fakePerformanceMetricsEventLogger.hasPerformanceMetricsEventLogged( + metricLog1 + ) + val eventLogStatus2 = fakePerformanceMetricsEventLogger.hasPerformanceMetricsEventLogged( + metricLog2 + ) + val eventListStatus = fakePerformanceMetricsEventLogger.noPerformanceMetricsEventsPresent() + + assertThat(eventListStatus).isFalse() + assertThat(eventLogStatus1).isTrue() + assertThat(eventLogStatus2).isTrue() + } + + @Test + fun testGetOldestEvent_noEventsLogged_throwsException() { + assertThrows(NoSuchElementException::class) { + fakePerformanceMetricsEventLogger.getOldestPerformanceMetricsEvent() + } + } + + @Test + fun testGetOldestEvent_oneEventLogged_returnsLoggedEvent() { + performanceMetricsEventLogger.logPerformanceMetric(metricLog1) + + val oldestEvent = fakePerformanceMetricsEventLogger.getOldestPerformanceMetricsEvent() + + assertThat(oldestEvent).isEqualTo(metricLog1) + } + + @Test + fun testGetOldestEvent_twoEventsLogged_returnsFirstEventLogged() { + performanceMetricsEventLogger.logPerformanceMetric(metricLog2) + performanceMetricsEventLogger.logPerformanceMetric(metricLog1) + + val oldestEvent = fakePerformanceMetricsEventLogger.getOldestPerformanceMetricsEvent() + + assertThat(oldestEvent).isEqualTo(metricLog2) + } + + @Test + fun testGetOldestEvent_twoEventsLogged_clearEvents_throwsException() { + performanceMetricsEventLogger.logPerformanceMetric(metricLog2) + performanceMetricsEventLogger.logPerformanceMetric(metricLog1) + fakePerformanceMetricsEventLogger.clearAllPerformanceMetricsEvents() + + assertThrows(NoSuchElementException::class) { + fakePerformanceMetricsEventLogger.getOldestPerformanceMetricsEvent() + } + } + + @Test + fun testGetOldestEvent_eventLogged_cleared_newEventLogged_returnsLatestEventLog() { + performanceMetricsEventLogger.logPerformanceMetric(metricLog2) + fakePerformanceMetricsEventLogger.clearAllPerformanceMetricsEvents() + performanceMetricsEventLogger.logPerformanceMetric(metricLog1) + + val oldestEvent = fakePerformanceMetricsEventLogger.getOldestPerformanceMetricsEvent() + + assertThat(oldestEvent).isEqualTo(metricLog1) + } + + @Test + fun testGetMostRecentEvents_twoEvents_noEventsLogged_returnsEmptyList() { + val mostRecentEvents = fakePerformanceMetricsEventLogger.getMostRecentPerformanceMetricsEvents( + count = 2 + ) + + assertThat(mostRecentEvents).isEmpty() + } + + @Test + fun testGetMostRecentEvents_twoEvents_oneEventLogged_returnsOneItemList() { + performanceMetricsEventLogger.logPerformanceMetric(metricLog1) + + val mostRecentEvents = fakePerformanceMetricsEventLogger.getMostRecentPerformanceMetricsEvents( + count = 2 + ) + + assertThat(mostRecentEvents).containsExactly(metricLog1) + } + + @Test + fun testGetMostRecentEvents_twoEvents_twoEventsLogged_returnsEventsInOrder() { + performanceMetricsEventLogger.logPerformanceMetric(metricLog2) + performanceMetricsEventLogger.logPerformanceMetric(metricLog1) + + val mostRecentEvents = fakePerformanceMetricsEventLogger.getMostRecentPerformanceMetricsEvents( + count = 2 + ) + + assertThat(mostRecentEvents).containsExactly(metricLog2, metricLog1).inOrder() + } + + @Test + fun testGetMostRecentEvents_oneEvent_twoEventsLogged_returnsSingleLatestEvent() { + performanceMetricsEventLogger.logPerformanceMetric(metricLog2) + performanceMetricsEventLogger.logPerformanceMetric(metricLog1) + + val mostRecentEvents = fakePerformanceMetricsEventLogger.getMostRecentPerformanceMetricsEvents( + count = 1 + ) + + assertThat(mostRecentEvents).containsExactly(metricLog1) + } + + @Test + fun testGetMostRecentEvents_zeroEvents_twoEventsLogged_returnsEmptyList() { + performanceMetricsEventLogger.logPerformanceMetric(metricLog2) + performanceMetricsEventLogger.logPerformanceMetric(metricLog1) + + val mostRecentEvents = fakePerformanceMetricsEventLogger.getMostRecentPerformanceMetricsEvents( + count = 0 + ) + + assertThat(mostRecentEvents).isEmpty() + } + + @Test + fun testGetMostRecentEvents_negativeEvents_twoEventsLogged_throwsException() { + performanceMetricsEventLogger.logPerformanceMetric(metricLog2) + performanceMetricsEventLogger.logPerformanceMetric(metricLog1) + + assertThrows(IllegalArgumentException::class) { + fakePerformanceMetricsEventLogger.getMostRecentPerformanceMetricsEvents(count = -1) + } + } + + @Test + fun testGetMostRecentEvents_twoEventsLogged_eventsCleared_returnsEmptyList() { + performanceMetricsEventLogger.logPerformanceMetric(metricLog2) + performanceMetricsEventLogger.logPerformanceMetric(metricLog1) + fakePerformanceMetricsEventLogger.clearAllPerformanceMetricsEvents() + + val mostRecentEvents = fakePerformanceMetricsEventLogger.getMostRecentPerformanceMetricsEvents( + count = 2 + ) + + assertThat(mostRecentEvents).isEmpty() + } + + @Test + fun testGetMostRecentEvents_eventLogged_cleared_newEventLogged_returnsNewestEvent() { + performanceMetricsEventLogger.logPerformanceMetric(metricLog1) + fakePerformanceMetricsEventLogger.clearAllPerformanceMetricsEvents() + performanceMetricsEventLogger.logPerformanceMetric(metricLog2) + + val mostRecentEvents = fakePerformanceMetricsEventLogger.getMostRecentPerformanceMetricsEvents( + count = 2 + ) + + assertThat(mostRecentEvents).containsExactly(metricLog2) + } + + private fun setUpTestApplicationComponent() { + DaggerFakePerformanceMetricsEventLoggerTest_TestApplicationComponent.builder() + .setApplication(ApplicationProvider.getApplicationContext()) + .build() + .inject(this) + } + + // TODO(#89): Move this to a common test application component. + @Module + class TestModule { + @Provides + @Singleton + fun provideContext(application: Application): Context { + return application + } + } + + // TODO(#89): Move this to a common test application component. + @Singleton + @Component( + modules = [ + TestModule::class, TestLogReportingModule::class, RobolectricModule::class, + TestDispatcherModule::class, LogStorageModule::class, FakeOppiaClockModule::class + ] + ) + interface TestApplicationComponent { + @Component.Builder + interface Builder { + @BindsInstance + fun setApplication(application: Application): Builder + fun build(): TestApplicationComponent + } + + fun inject(fakePerformanceMetricsEventLoggerTest: FakePerformanceMetricsEventLoggerTest) + } +} diff --git a/testing/src/test/java/org/oppia/android/testing/junit/InitializeDefaultLocaleRuleCustomContextTest.kt b/testing/src/test/java/org/oppia/android/testing/junit/InitializeDefaultLocaleRuleCustomContextTest.kt index ff396b8c9a1..51e520fb94b 100644 --- a/testing/src/test/java/org/oppia/android/testing/junit/InitializeDefaultLocaleRuleCustomContextTest.kt +++ b/testing/src/test/java/org/oppia/android/testing/junit/InitializeDefaultLocaleRuleCustomContextTest.kt @@ -50,7 +50,8 @@ import org.oppia.android.domain.onboarding.testing.ExpirationMetaDataRetrieverTe import org.oppia.android.domain.oppialogger.LogStorageModule import org.oppia.android.domain.oppialogger.LoggingIdentifierModule import org.oppia.android.domain.oppialogger.analytics.ApplicationLifecycleModule -import org.oppia.android.domain.oppialogger.loguploader.LogUploadWorkerModule +import org.oppia.android.domain.oppialogger.logscheduler.MetricLogSchedulerModule +import org.oppia.android.domain.oppialogger.loguploader.LogReportWorkerModule import org.oppia.android.domain.platformparameter.PlatformParameterModule import org.oppia.android.domain.platformparameter.PlatformParameterSingletonModule import org.oppia.android.domain.question.QuestionModule @@ -254,7 +255,7 @@ class InitializeDefaultLocaleRuleCustomContextTest { PrimeTopicAssetsControllerModule::class, ExpirationMetaDataRetrieverTestModule::class, ViewBindingShimModule::class, RatioInputModule::class, NetworkConfigProdModule::class, ApplicationStartupListenerModule::class, HintsAndSolutionConfigModule::class, - LogUploadWorkerModule::class, WorkManagerConfigurationModule::class, + LogReportWorkerModule::class, WorkManagerConfigurationModule::class, FirebaseLogUploaderModule::class, FakeOppiaClockModule::class, PracticeTabModule::class, DeveloperOptionsStarterModule::class, DeveloperOptionsModule::class, ExplorationStorageModule::class, NetworkModule::class, HintsAndSolutionProdModule::class, @@ -264,7 +265,7 @@ class InitializeDefaultLocaleRuleCustomContextTest { NumericExpressionInputModule::class, AlgebraicExpressionInputModule::class, MathEquationInputModule::class, SplitScreenInteractionModule::class, LoggingIdentifierModule::class, ApplicationLifecycleModule::class, - SyncStatusModule::class + SyncStatusModule::class, MetricLogSchedulerModule::class ] ) interface TestApplicationComponent : ApplicationComponent { diff --git a/testing/src/test/java/org/oppia/android/testing/junit/InitializeDefaultLocaleRuleOmissionTest.kt b/testing/src/test/java/org/oppia/android/testing/junit/InitializeDefaultLocaleRuleOmissionTest.kt index 455863ee05c..65b3bc82a08 100644 --- a/testing/src/test/java/org/oppia/android/testing/junit/InitializeDefaultLocaleRuleOmissionTest.kt +++ b/testing/src/test/java/org/oppia/android/testing/junit/InitializeDefaultLocaleRuleOmissionTest.kt @@ -47,7 +47,8 @@ import org.oppia.android.domain.onboarding.testing.ExpirationMetaDataRetrieverTe import org.oppia.android.domain.oppialogger.LogStorageModule import org.oppia.android.domain.oppialogger.LoggingIdentifierModule import org.oppia.android.domain.oppialogger.analytics.ApplicationLifecycleModule -import org.oppia.android.domain.oppialogger.loguploader.LogUploadWorkerModule +import org.oppia.android.domain.oppialogger.logscheduler.MetricLogSchedulerModule +import org.oppia.android.domain.oppialogger.loguploader.LogReportWorkerModule import org.oppia.android.domain.platformparameter.PlatformParameterModule import org.oppia.android.domain.platformparameter.PlatformParameterSingletonModule import org.oppia.android.domain.question.QuestionModule @@ -130,7 +131,7 @@ class InitializeDefaultLocaleRuleOmissionTest { PrimeTopicAssetsControllerModule::class, ExpirationMetaDataRetrieverTestModule::class, ViewBindingShimModule::class, RatioInputModule::class, NetworkConfigProdModule::class, ApplicationStartupListenerModule::class, HintsAndSolutionConfigModule::class, - LogUploadWorkerModule::class, WorkManagerConfigurationModule::class, + LogReportWorkerModule::class, WorkManagerConfigurationModule::class, FirebaseLogUploaderModule::class, FakeOppiaClockModule::class, PracticeTabModule::class, DeveloperOptionsStarterModule::class, DeveloperOptionsModule::class, ExplorationStorageModule::class, NetworkModule::class, HintsAndSolutionProdModule::class, @@ -140,7 +141,7 @@ class InitializeDefaultLocaleRuleOmissionTest { NumericExpressionInputModule::class, AlgebraicExpressionInputModule::class, MathEquationInputModule::class, SplitScreenInteractionModule::class, LoggingIdentifierModule::class, ApplicationLifecycleModule::class, - SyncStatusModule::class + SyncStatusModule::class, MetricLogSchedulerModule::class ] ) interface TestApplicationComponent : ApplicationComponent { diff --git a/testing/src/test/java/org/oppia/android/testing/junit/InitializeDefaultLocaleRuleTest.kt b/testing/src/test/java/org/oppia/android/testing/junit/InitializeDefaultLocaleRuleTest.kt index 79b77aefb03..a53e4b716e0 100644 --- a/testing/src/test/java/org/oppia/android/testing/junit/InitializeDefaultLocaleRuleTest.kt +++ b/testing/src/test/java/org/oppia/android/testing/junit/InitializeDefaultLocaleRuleTest.kt @@ -51,7 +51,8 @@ import org.oppia.android.domain.onboarding.testing.ExpirationMetaDataRetrieverTe import org.oppia.android.domain.oppialogger.LogStorageModule import org.oppia.android.domain.oppialogger.LoggingIdentifierModule import org.oppia.android.domain.oppialogger.analytics.ApplicationLifecycleModule -import org.oppia.android.domain.oppialogger.loguploader.LogUploadWorkerModule +import org.oppia.android.domain.oppialogger.logscheduler.MetricLogSchedulerModule +import org.oppia.android.domain.oppialogger.loguploader.LogReportWorkerModule import org.oppia.android.domain.platformparameter.PlatformParameterModule import org.oppia.android.domain.platformparameter.PlatformParameterSingletonModule import org.oppia.android.domain.question.QuestionModule @@ -134,7 +135,7 @@ class InitializeDefaultLocaleRuleTest { PrimeTopicAssetsControllerModule::class, ExpirationMetaDataRetrieverTestModule::class, ViewBindingShimModule::class, RatioInputModule::class, NetworkConfigProdModule::class, ApplicationStartupListenerModule::class, HintsAndSolutionConfigModule::class, - LogUploadWorkerModule::class, WorkManagerConfigurationModule::class, + LogReportWorkerModule::class, WorkManagerConfigurationModule::class, FirebaseLogUploaderModule::class, FakeOppiaClockModule::class, PracticeTabModule::class, DeveloperOptionsStarterModule::class, DeveloperOptionsModule::class, ExplorationStorageModule::class, NetworkModule::class, HintsAndSolutionProdModule::class, @@ -144,7 +145,7 @@ class InitializeDefaultLocaleRuleTest { NumericExpressionInputModule::class, AlgebraicExpressionInputModule::class, MathEquationInputModule::class, SplitScreenInteractionModule::class, LoggingIdentifierModule::class, ApplicationLifecycleModule::class, - SyncStatusModule::class + SyncStatusModule::class, MetricLogSchedulerModule::class ] ) interface TestApplicationComponent : ApplicationComponent { diff --git a/testing/src/test/java/org/oppia/android/testing/robolectric/OppiaShadowActivityManagerTest.kt b/testing/src/test/java/org/oppia/android/testing/robolectric/OppiaShadowActivityManagerTest.kt new file mode 100644 index 00000000000..b6b6df2c20c --- /dev/null +++ b/testing/src/test/java/org/oppia/android/testing/robolectric/OppiaShadowActivityManagerTest.kt @@ -0,0 +1,160 @@ +package org.oppia.android.testing.robolectric + +import android.app.ActivityManager +import android.app.Application +import android.content.Context +import android.os.Build +import android.os.Debug +import androidx.test.core.app.ApplicationProvider +import androidx.test.ext.junit.runners.AndroidJUnit4 +import com.google.common.truth.Truth.assertThat +import dagger.BindsInstance +import dagger.Component +import dagger.Module +import dagger.Provides +import org.junit.Before +import org.junit.Test +import org.junit.runner.RunWith +import org.robolectric.Shadows.shadowOf +import org.robolectric.annotation.Config +import org.robolectric.annotation.LooperMode +import javax.inject.Inject +import javax.inject.Singleton + +/** Tests for [OppiaShadowActivityManager]. */ +// FunctionName: test names are conventionally named with underscores. +@Suppress("FunctionName") +@RunWith(AndroidJUnit4::class) +@LooperMode(LooperMode.Mode.PAUSED) +@Config( + manifest = Config.NONE, + sdk = [Build.VERSION_CODES.P], + shadows = [OppiaShadowActivityManager::class] +) +class OppiaShadowActivityManagerTest { + @Inject + lateinit var context: Context + + private val oppiaShadowActivityManager: OppiaShadowActivityManager + get() = shadowOf( + context.getSystemService(Context.ACTIVITY_SERVICE) as ActivityManager + ) as OppiaShadowActivityManager + + @Before + fun setUp() { + setUpTestApplicationComponent() + } + + @Test + fun testCustomShadow_initialState_debugMemoryInfo_returnsDefaultState() { + val defaultDebugMemoryShadow = oppiaShadowActivityManager.getProcessMemoryInfo(intArrayOf(0)) + assertThat(defaultDebugMemoryShadow).isNotNull() + assertThat(defaultDebugMemoryShadow?.size).isNotEqualTo(0) + assertThat(defaultDebugMemoryShadow?.get(0)?.totalPss).isEqualTo(0) + } + + @Test + fun testCustomShadow_initialState_memoryInfo_returnsDefaultState() { + val outInfo = ActivityManager.MemoryInfo() + oppiaShadowActivityManager.getMemoryInfo(outInfo) + assertThat(outInfo.totalMem).isEqualTo(0) + assertThat(outInfo.availMem).isEqualTo(0) + assertThat(outInfo.lowMemory).isEqualTo(false) + assertThat(outInfo.threshold).isEqualTo(0) + } + + @Test + fun testCustomShadow_setDebugMemoryInfo_returnsCorrectValue() { + val debugMemoryInfo = Debug.MemoryInfo().apply { + this.nativePss = 2 + this.dalvikPss = 1 + this.otherPss = 3 + } + oppiaShadowActivityManager.setProcessMemoryInfo(debugMemoryInfo) + + val returnedDebugMemoryInfo = oppiaShadowActivityManager.getProcessMemoryInfo(intArrayOf(0)) + assertThat(returnedDebugMemoryInfo?.get(0)?.nativePss).isEqualTo(2) + assertThat(returnedDebugMemoryInfo?.get(0)?.dalvikPss).isEqualTo(1) + assertThat(returnedDebugMemoryInfo?.get(0)?.otherPss).isEqualTo(3) + // Since totalPss = nativePss + dalvikPss + otherPss. + assertThat(returnedDebugMemoryInfo?.get(0)?.totalPss).isEqualTo(6) + } + + @Test + fun testCustomShadow_setMemoryInfo_returnsCorrectOutInfo() { + val memoryInfo = ActivityManager.MemoryInfo().apply { + this.availMem = 1 + this.totalMem = 2 + this.lowMemory = true + this.threshold = 10 + } + oppiaShadowActivityManager.setMemoryInfo(memoryInfo) + + val outInfo = ActivityManager.MemoryInfo() + oppiaShadowActivityManager.getMemoryInfo(outInfo) + assertThat(outInfo.totalMem).isEqualTo(2) + assertThat(outInfo.availMem).isEqualTo(1) + assertThat(outInfo.lowMemory).isEqualTo(true) + assertThat(outInfo.threshold).isEqualTo(10) + } + + @Test + fun testCustomShadow_setMemoryInfo_setDataInOutInfo_returnsCorrectDataInOutInfo() { + val memoryInfo = ActivityManager.MemoryInfo().apply { + this.availMem = 1 + this.totalMem = 2 + this.lowMemory = true + this.threshold = 10 + } + oppiaShadowActivityManager.setMemoryInfo(memoryInfo) + + val outInfo = ActivityManager.MemoryInfo().apply { + this.availMem = 5 + this.totalMem = 3 + this.lowMemory = false + this.threshold = 43 + } + + oppiaShadowActivityManager.getMemoryInfo(outInfo) + assertThat(outInfo.totalMem).isEqualTo(2) + assertThat(outInfo.availMem).isEqualTo(1) + assertThat(outInfo.lowMemory).isTrue() + assertThat(outInfo.threshold).isEqualTo(10) + } + + private fun setUpTestApplicationComponent() { + DaggerOppiaShadowActivityManagerTest_TestApplicationComponent.builder() + .setApplication(ApplicationProvider.getApplicationContext()) + .build() + .inject(this) + } + + // TODO(#89): Move this to a common test application component. + @Module + class TestModule { + @Provides + @Singleton + fun provideContext(application: Application): Context { + return application + } + } + + // TODO(#89): Move this to a common test application component. + @Singleton + @Component( + modules = [ + TestModule::class + ] + ) + interface TestApplicationComponent { + @Component.Builder + interface Builder { + @BindsInstance + fun setApplication(application: Application): Builder + + fun build(): TestApplicationComponent + } + + fun inject(oppiaShadowActivityManagerTest: OppiaShadowActivityManagerTest) + } +} diff --git a/testing/src/test/java/org/oppia/android/testing/robolectric/OppiaShadowTrafficStatsTest.kt b/testing/src/test/java/org/oppia/android/testing/robolectric/OppiaShadowTrafficStatsTest.kt new file mode 100644 index 00000000000..4532c593db4 --- /dev/null +++ b/testing/src/test/java/org/oppia/android/testing/robolectric/OppiaShadowTrafficStatsTest.kt @@ -0,0 +1,111 @@ +package org.oppia.android.testing.robolectric + +import android.app.Application +import android.content.Context +import android.net.TrafficStats +import android.os.Build +import androidx.test.core.app.ApplicationProvider +import androidx.test.ext.junit.runners.AndroidJUnit4 +import com.google.common.truth.Truth.assertThat +import dagger.BindsInstance +import dagger.Component +import dagger.Module +import dagger.Provides +import org.junit.After +import org.junit.Before +import org.junit.Test +import org.junit.runner.RunWith +import org.robolectric.annotation.Config +import org.robolectric.annotation.LooperMode +import org.robolectric.shadow.api.Shadow +import javax.inject.Inject +import javax.inject.Singleton + +private const val ARBITRARY_UID = 0 + +/** Tests for [OppiaShadowTrafficStats]. */ +// FunctionName: test names are conventionally named with underscores. +@Suppress("FunctionName") +@RunWith(AndroidJUnit4::class) +@LooperMode(LooperMode.Mode.PAUSED) +@Config( + manifest = Config.NONE, + sdk = [Build.VERSION_CODES.P], + shadows = [OppiaShadowTrafficStats::class] +) +class OppiaShadowTrafficStatsTest { + + @Inject + lateinit var context: Context + + private val oppiaShadowTrafficStats: OppiaShadowTrafficStats + get() = + Shadow.extract(Shadow.newInstanceOf(TrafficStats::class.java)) as OppiaShadowTrafficStats + + @Before + fun setUp() { + setUpTestApplicationComponent() + } + + @After + fun tearDown() { + // Make sure this is reset between tests. + OppiaShadowTrafficStats.reset() + } + + @Test + fun testCustomShadow_initialState_returnsDefaultValuesForTxAndRxBytes() { + assertThat(OppiaShadowTrafficStats.getUidRxBytes(ARBITRARY_UID)).isEqualTo(0L) + assertThat(OppiaShadowTrafficStats.getUidTxBytes(ARBITRARY_UID)).isEqualTo(0L) + } + + @Test + fun testCustomShadow_setUidTxBytes_returnsCorrectTxBytesValue() { + oppiaShadowTrafficStats.setUidTxBytes(9) + assertThat(OppiaShadowTrafficStats.getUidTxBytes(ARBITRARY_UID)).isEqualTo(9L) + assertThat(OppiaShadowTrafficStats.getUidRxBytes(ARBITRARY_UID)).isEqualTo(0) + } + + @Test + fun testCustomShadow_setUidRxBytes_returnsCorrectTxBytesValue() { + oppiaShadowTrafficStats.setUidRxBytes(9) + assertThat(OppiaShadowTrafficStats.getUidRxBytes(ARBITRARY_UID)).isEqualTo(9L) + assertThat(OppiaShadowTrafficStats.getUidTxBytes(ARBITRARY_UID)).isEqualTo(0) + } + + private fun setUpTestApplicationComponent() { + DaggerOppiaShadowTrafficStatsTest_TestApplicationComponent.builder() + .setApplication(ApplicationProvider.getApplicationContext()) + .build() + .inject(this) + } + + // TODO(#89): Move this to a common test application component. + @Module + class TestModule { + @Provides + @Singleton + fun provideContext(application: Application): Context { + return application + } + } + + // TODO(#89): Move this to a common test application component. + @Singleton + @Component( + modules = [ + TestModule::class + ] + ) + interface TestApplicationComponent { + @Component.Builder + interface Builder { + @BindsInstance + fun setApplication(application: Application): Builder + + fun build(): TestApplicationComponent + } + + fun inject(oppiaShadowTrafficStatsTest: OppiaShadowTrafficStatsTest) + } +} diff --git a/utility/BUILD.bazel b/utility/BUILD.bazel index 2dabd0d1216..522bd9744c0 100644 --- a/utility/BUILD.bazel +++ b/utility/BUILD.bazel @@ -109,7 +109,12 @@ TEST_DEPS = [ "//model/src/main/proto:test_models", "//testing", "//testing/src/main/java/org/oppia/android/testing/data:data_provider_test_monitor", + "//testing/src/main/java/org/oppia/android/testing/junit:oppia_parameterized_test_runner", + "//testing/src/main/java/org/oppia/android/testing/junit:parameterized_robolectric_test_runner", "//testing/src/main/java/org/oppia/android/testing/mockito", + "//testing/src/main/java/org/oppia/android/testing/platformparameter:test_module", + "//testing/src/main/java/org/oppia/android/testing/robolectric:oppia_shadow_activity_manager", + "//testing/src/main/java/org/oppia/android/testing/robolectric:oppia_shadow_traffic_stats", "//testing/src/main/java/org/oppia/android/testing/robolectric:test_module", "//testing/src/main/java/org/oppia/android/testing/threading:test_module", "//testing/src/main/java/org/oppia/android/testing/time:test_module", @@ -128,6 +133,9 @@ TEST_DEPS = [ "//utility/src/main/java/org/oppia/android/util/extensions:bundle_extensions", "//utility/src/main/java/org/oppia/android/util/locale:prod_module", "//utility/src/main/java/org/oppia/android/util/logging:event_bundle_creator", + "//utility/src/main/java/org/oppia/android/util/logging/firebase:prod_module", + "//utility/src/main/java/org/oppia/android/util/logging/performancemetrics:performance_metrics_assessor_module", + "//utility/src/main/java/org/oppia/android/util/logging/performancemetrics:performance_metrics_configurations_module", "//utility/src/main/java/org/oppia/android/util/networking:debug_module", "//utility/src/main/java/org/oppia/android/util/parser/html:tag_handlers", "//utility/src/main/java/org/oppia/android/util/parser/image:glide_image_loader", diff --git a/utility/src/main/java/org/oppia/android/util/logging/BUILD.bazel b/utility/src/main/java/org/oppia/android/util/logging/BUILD.bazel index 0354a058096..a96279e3f68 100644 --- a/utility/src/main/java/org/oppia/android/util/logging/BUILD.bazel +++ b/utility/src/main/java/org/oppia/android/util/logging/BUILD.bazel @@ -126,6 +126,18 @@ kt_android_library( ], ) +kt_android_library( + name = "metric_log_scheduler", + srcs = [ + "MetricLogScheduler.kt", + ], + visibility = ["//:oppia_api_visibility"], + deps = [ + "//third_party:androidx_work_work-runtime", + "//third_party:androidx_work_work-runtime-ktx", + ], +) + kt_android_library( name = "sync_status_manager", srcs = [ diff --git a/utility/src/main/java/org/oppia/android/util/logging/MetricLogScheduler.kt b/utility/src/main/java/org/oppia/android/util/logging/MetricLogScheduler.kt new file mode 100644 index 00000000000..463179cf15a --- /dev/null +++ b/utility/src/main/java/org/oppia/android/util/logging/MetricLogScheduler.kt @@ -0,0 +1,31 @@ +package org.oppia.android.util.logging + +import androidx.work.PeriodicWorkRequest +import androidx.work.WorkManager + +/** Scheduler for scheduling metric log reports related to the performance of the application. */ +interface MetricLogScheduler { + /** + * Enqueues a [workRequest] using the [workManager] for scheduling metric collection of periodic + * metrics like network and cpu usage. + */ + fun enqueueWorkRequestForPeriodicBackgroundMetrics( + workManager: WorkManager, + workRequest: PeriodicWorkRequest + ) + + /** + * Enqueues a [workRequest] using the [workManager] for scheduling metric collection of storage + * usage of the application on the current device. + */ + fun enqueueWorkRequestForStorageUsage(workManager: WorkManager, workRequest: PeriodicWorkRequest) + + /** + * Enqueues a [workRequest] using the [workManager] for scheduling metric collection of periodic + * ui metrics like memory usage. + */ + fun enqueueWorkRequestForPeriodicUiMetrics( + workManager: WorkManager, + workRequest: PeriodicWorkRequest + ) +} diff --git a/utility/src/main/java/org/oppia/android/util/logging/firebase/BUILD.bazel b/utility/src/main/java/org/oppia/android/util/logging/firebase/BUILD.bazel index 66454426511..b67cff7f82b 100644 --- a/utility/src/main/java/org/oppia/android/util/logging/firebase/BUILD.bazel +++ b/utility/src/main/java/org/oppia/android/util/logging/firebase/BUILD.bazel @@ -24,6 +24,7 @@ kt_android_library( ], deps = [ "//model/src/main/proto:event_logger_java_proto_lite", + "//model/src/main/proto:performance_metrics_event_logger_java_proto_lite", "//third_party:androidx_work_work-runtime", "//third_party:androidx_work_work-runtime-ktx", "//third_party:com_google_firebase_firebase-analytics", @@ -32,6 +33,7 @@ kt_android_library( "//utility/src/main/java/org/oppia/android/util/logging:event_logger", "//utility/src/main/java/org/oppia/android/util/logging:log_uploader", "//utility/src/main/java/org/oppia/android/util/logging:sync_status_manager", + "//utility/src/main/java/org/oppia/android/util/logging/performancemetrics:performance_metrics_event_logger", "//utility/src/main/java/org/oppia/android/util/networking:network_connection_util", ], ) diff --git a/utility/src/main/java/org/oppia/android/util/logging/firebase/DebugLogReportingModule.kt b/utility/src/main/java/org/oppia/android/util/logging/firebase/DebugLogReportingModule.kt index 0b628a3190e..d31b656aba3 100644 --- a/utility/src/main/java/org/oppia/android/util/logging/firebase/DebugLogReportingModule.kt +++ b/utility/src/main/java/org/oppia/android/util/logging/firebase/DebugLogReportingModule.kt @@ -5,6 +5,7 @@ import dagger.Module import dagger.Provides import org.oppia.android.util.logging.EventLogger import org.oppia.android.util.logging.ExceptionLogger +import org.oppia.android.util.logging.performancemetrics.PerformanceMetricsEventLogger import javax.inject.Singleton /** Provides debug log reporting dependencies. */ @@ -18,4 +19,11 @@ class DebugLogReportingModule { @Provides @Singleton fun provideDebugEventLogger(debugEventLogger: DebugEventLogger): EventLogger = debugEventLogger + + @Provides + @Singleton + fun providePerformanceMetricsEventLogger( + factory: FirebaseEventLogger.Factory + ): PerformanceMetricsEventLogger = + factory.createPerformanceMetricEventLogger() } diff --git a/utility/src/main/java/org/oppia/android/util/logging/firebase/FirebaseEventLogger.kt b/utility/src/main/java/org/oppia/android/util/logging/firebase/FirebaseEventLogger.kt index a4f61516e54..b2a1f71d4ef 100644 --- a/utility/src/main/java/org/oppia/android/util/logging/firebase/FirebaseEventLogger.kt +++ b/utility/src/main/java/org/oppia/android/util/logging/firebase/FirebaseEventLogger.kt @@ -5,8 +5,10 @@ import android.content.Context import android.os.Bundle import com.google.firebase.analytics.FirebaseAnalytics import org.oppia.android.app.model.EventLog +import org.oppia.android.app.model.OppiaMetricLog import org.oppia.android.util.logging.EventBundleCreator import org.oppia.android.util.logging.EventLogger +import org.oppia.android.util.logging.performancemetrics.PerformanceMetricsEventLogger import org.oppia.android.util.networking.NetworkConnectionUtil import java.util.Locale import javax.inject.Inject @@ -19,7 +21,7 @@ class FirebaseEventLogger private constructor( private val firebaseAnalytics: FirebaseAnalytics, private val networkConnectionUtil: NetworkConnectionUtil, private val eventBundleCreator: EventBundleCreator -) : EventLogger { +) : EventLogger, PerformanceMetricsEventLogger { /** * Logs an event to Firebase Analytics with [NETWORK_USER_PROPERTY] and [COUNTRY_USER_PROPERTY]. */ @@ -32,6 +34,13 @@ class FirebaseEventLogger private constructor( firebaseAnalytics.setUserProperty(NETWORK_USER_PROPERTY, getNetworkStatus()) } + /** + * Logs a performance metric to Firebase Analytics with [NETWORK_USER_PROPERTY] and [COUNTRY_USER_PROPERTY]. + */ + override fun logPerformanceMetric(oppiaMetricLog: OppiaMetricLog) { + // TODO(#4335): Add implementation to upload performance metrics logs to firebase. + } + private fun getNetworkStatus(): String { return when (networkConnectionUtil.getCurrentConnectionStatus()) { NetworkConnectionUtil.ProdConnectionStatus.LOCAL -> @@ -57,8 +66,20 @@ class FirebaseEventLogger private constructor( * Returns a new [FirebaseEventLogger] for the current application context. * * Generally, only one of these needs to be created per application. + * + * This [FirebaseEventLogger] implements the [EventLogger] for facilitating analytics log + * reporting. */ fun create(): EventLogger = FirebaseEventLogger(firebaseAnalytics, networkConnectionUtil, eventBundleCreator) + + /** + * Returns a new [FirebaseEventLogger] for the current application context. + * + * This [FirebaseEventLogger] implements the [PerformanceMetricsEventLogger] for facilitating + * performance metrics log reporting. + */ + fun createPerformanceMetricEventLogger(): PerformanceMetricsEventLogger = + FirebaseEventLogger(firebaseAnalytics, networkConnectionUtil, eventBundleCreator) } } diff --git a/utility/src/main/java/org/oppia/android/util/logging/firebase/LogReportingModule.kt b/utility/src/main/java/org/oppia/android/util/logging/firebase/LogReportingModule.kt index 21d8fd20345..aaa8bd329c4 100644 --- a/utility/src/main/java/org/oppia/android/util/logging/firebase/LogReportingModule.kt +++ b/utility/src/main/java/org/oppia/android/util/logging/firebase/LogReportingModule.kt @@ -5,6 +5,7 @@ import dagger.Module import dagger.Provides import org.oppia.android.util.logging.EventLogger import org.oppia.android.util.logging.ExceptionLogger +import org.oppia.android.util.logging.performancemetrics.PerformanceMetricsEventLogger import javax.inject.Singleton /** Provides Firebase-specific logging implementations. */ @@ -18,4 +19,11 @@ class LogReportingModule { @Provides @Singleton fun provideEventLogger(factory: FirebaseEventLogger.Factory): EventLogger = factory.create() + + @Provides + @Singleton + fun providePerformanceMetricsEventLogger( + factory: FirebaseEventLogger.Factory + ): PerformanceMetricsEventLogger = + factory.createPerformanceMetricEventLogger() } diff --git a/utility/src/main/java/org/oppia/android/util/logging/performancemetrics/BUILD.bazel b/utility/src/main/java/org/oppia/android/util/logging/performancemetrics/BUILD.bazel new file mode 100644 index 00000000000..3e83fdcdb06 --- /dev/null +++ b/utility/src/main/java/org/oppia/android/util/logging/performancemetrics/BUILD.bazel @@ -0,0 +1,71 @@ +""" +General purpose utilities for performance metrics logging. +""" + +load("@dagger//:workspace_defs.bzl", "dagger_rules") +load("@io_bazel_rules_kotlin//kotlin:kotlin.bzl", "kt_android_library") + +kt_android_library( + name = "performance_metrics_event_logger", + srcs = [ + "PerformanceMetricsEventLogger.kt", + ], + visibility = ["//:oppia_api_visibility"], + deps = [ + "//model/src/main/proto:performance_metrics_event_logger_java_proto_lite", + ], +) + +kt_android_library( + name = "performance_metrics_assessor", + srcs = [ + "PerformanceMetricsAssessor.kt", + ], + visibility = ["//:oppia_api_visibility"], + deps = [ + "//model/src/main/proto:performance_metrics_event_logger_java_proto_lite", + ], +) + +kt_android_library( + name = "performance_metrics_assessor_module", + srcs = [ + "PerformanceMetricsAssessorModule.kt", + ], + visibility = ["//:oppia_prod_module_visibility"], + deps = [ + ":dagger", + ":performance_metrics_assessor_impl", + "//model/src/main/proto:performance_metrics_event_logger_java_proto_lite", + "//third_party:javax_inject_javax_inject", + ], +) + +kt_android_library( + name = "performance_metrics_assessor_impl", + srcs = [ + "PerformanceMetricsAssessorImpl.kt", + ], + visibility = ["//:oppia_api_visibility"], + deps = [ + ":performance_metrics_assessor", + ":performance_metrics_configurations_module", + "//model/src/main/proto:performance_metrics_event_logger_java_proto_lite", + "//third_party:javax_inject_javax_inject", + ], +) + +kt_android_library( + name = "performance_metrics_configurations_module", + srcs = [ + "PerformanceMetricsConfigurationsModule.kt", + ], + visibility = ["//:oppia_prod_module_visibility"], + deps = [ + ":dagger", + "//model/src/main/proto:performance_metrics_event_logger_java_proto_lite", + "//third_party:javax_inject_javax_inject", + ], +) + +dagger_rules() diff --git a/utility/src/main/java/org/oppia/android/util/logging/performancemetrics/PerformanceMetricsAssessor.kt b/utility/src/main/java/org/oppia/android/util/logging/performancemetrics/PerformanceMetricsAssessor.kt new file mode 100644 index 00000000000..5bdd9ba5761 --- /dev/null +++ b/utility/src/main/java/org/oppia/android/util/logging/performancemetrics/PerformanceMetricsAssessor.kt @@ -0,0 +1,38 @@ +package org.oppia.android.util.logging.performancemetrics + +import org.oppia.android.app.model.OppiaMetricLog + +/** Utility to extract performance metrics from the underlying Android system. */ +interface PerformanceMetricsAssessor { + + /** Returns the size of the app's installed APK file, in bytes. */ + fun getApkSize(): Long + + /** + * Returns the amount of storage usage by the app on user's device in bytes. + * This storage size is the cumulative size of app-specific files which include the application + * cache but not the apk size. + */ + fun getUsedStorage(): Long + + /** Returns the number of bytes sent by the application over a network since device reboot. */ + fun getTotalSentBytes(): Long + + /** Returns the number of bytes received by the application over a network since device reboot. */ + fun getTotalReceivedBytes(): Long + + /** Returns the amount of memory used by the application on the device in bytes. */ + fun getTotalPssUsed(): Long + + /** + * Returns the [OppiaMetricLog.StorageTier] of the device by analysing the total storage + * capacity of the device. + */ + fun getDeviceStorageTier(): OppiaMetricLog.StorageTier + + /** + * Returns the [OppiaMetricLog.MemoryTier] of the device by analysing the total memory + * capacity of the device. + */ + fun getDeviceMemoryTier(): OppiaMetricLog.MemoryTier +} diff --git a/utility/src/main/java/org/oppia/android/util/logging/performancemetrics/PerformanceMetricsAssessorImpl.kt b/utility/src/main/java/org/oppia/android/util/logging/performancemetrics/PerformanceMetricsAssessorImpl.kt new file mode 100644 index 00000000000..d8a0818c60c --- /dev/null +++ b/utility/src/main/java/org/oppia/android/util/logging/performancemetrics/PerformanceMetricsAssessorImpl.kt @@ -0,0 +1,73 @@ +package org.oppia.android.util.logging.performancemetrics + +import android.app.ActivityManager +import android.content.Context +import android.net.TrafficStats +import org.oppia.android.app.model.OppiaMetricLog +import org.oppia.android.app.model.OppiaMetricLog.MemoryTier.HIGH_MEMORY_TIER +import org.oppia.android.app.model.OppiaMetricLog.MemoryTier.LOW_MEMORY_TIER +import org.oppia.android.app.model.OppiaMetricLog.MemoryTier.MEDIUM_MEMORY_TIER +import org.oppia.android.app.model.OppiaMetricLog.StorageTier.HIGH_STORAGE +import org.oppia.android.app.model.OppiaMetricLog.StorageTier.LOW_STORAGE +import org.oppia.android.app.model.OppiaMetricLog.StorageTier.MEDIUM_STORAGE +import java.io.File +import javax.inject.Inject +import javax.inject.Singleton + +/** Utility to extract performance metrics from the underlying Android system. */ +@Singleton +class PerformanceMetricsAssessorImpl @Inject constructor( + private val context: Context, + @LowStorageTierUpperBound private val lowStorageTierUpperBound: Long, + @MediumStorageTierUpperBound private val mediumStorageTierUpperBound: Long, + @LowMemoryTierUpperBound private val lowMemoryTierUpperBound: Long, + @MediumMemoryTierUpperBound private val mediumMemoryTierUpperBound: Long +) : PerformanceMetricsAssessor { + + private val activityManager: ActivityManager by lazy { + context.getSystemService(Context.ACTIVITY_SERVICE) as ActivityManager + } + + override fun getApkSize(): Long { + val apkPath = + context.packageManager.getPackageInfo(context.packageName, 0).applicationInfo.sourceDir + return File(apkPath).length() + } + + override fun getUsedStorage(): Long { + val permanentStorageUsage = context.filesDir?.listFiles()?.map { it.length() }?.sum() ?: 0L + val cacheStorageUsage = context.cacheDir?.listFiles()?.map { it.length() }?.sum() ?: 0L + return permanentStorageUsage + cacheStorageUsage + } + + override fun getTotalSentBytes(): Long = TrafficStats.getUidTxBytes(context.applicationInfo.uid) + + override fun getTotalReceivedBytes(): Long = + TrafficStats.getUidRxBytes(context.applicationInfo.uid) + + override fun getTotalPssUsed(): Long { + val pid = ActivityManager.RunningAppProcessInfo().pid + val processMemoryInfo = activityManager.getProcessMemoryInfo(intArrayOf(pid)) + return processMemoryInfo?.map { it.totalPss }?.sum()?.toLong() ?: 0L + } + + override fun getDeviceStorageTier(): OppiaMetricLog.StorageTier { + val usedStorage = getUsedStorage() + return when { + usedStorage <= lowStorageTierUpperBound -> LOW_STORAGE + usedStorage <= mediumStorageTierUpperBound -> MEDIUM_STORAGE + else -> HIGH_STORAGE + } + } + + override fun getDeviceMemoryTier(): OppiaMetricLog.MemoryTier { + val memoryInfo = ActivityManager.MemoryInfo() + activityManager.getMemoryInfo(memoryInfo) + val totalMemory = memoryInfo.totalMem + return when { + totalMemory <= lowMemoryTierUpperBound -> LOW_MEMORY_TIER + totalMemory <= mediumMemoryTierUpperBound -> MEDIUM_MEMORY_TIER + else -> HIGH_MEMORY_TIER + } + } +} diff --git a/utility/src/main/java/org/oppia/android/util/logging/performancemetrics/PerformanceMetricsAssessorModule.kt b/utility/src/main/java/org/oppia/android/util/logging/performancemetrics/PerformanceMetricsAssessorModule.kt new file mode 100644 index 00000000000..603ff9fe14b --- /dev/null +++ b/utility/src/main/java/org/oppia/android/util/logging/performancemetrics/PerformanceMetricsAssessorModule.kt @@ -0,0 +1,14 @@ +package org.oppia.android.util.logging.performancemetrics + +import dagger.Module +import dagger.Provides + +/** Provides production-specific performance metrics utilities related dependencies. */ +@Module +class PerformanceMetricsAssessorModule { + + @Provides + fun providePerformanceMetricsAssessor( + performanceMetricsAssessorImpl: PerformanceMetricsAssessorImpl + ): PerformanceMetricsAssessor = performanceMetricsAssessorImpl +} diff --git a/utility/src/main/java/org/oppia/android/util/logging/performancemetrics/PerformanceMetricsConfigurationsModule.kt b/utility/src/main/java/org/oppia/android/util/logging/performancemetrics/PerformanceMetricsConfigurationsModule.kt new file mode 100644 index 00000000000..33e0b408446 --- /dev/null +++ b/utility/src/main/java/org/oppia/android/util/logging/performancemetrics/PerformanceMetricsConfigurationsModule.kt @@ -0,0 +1,51 @@ +package org.oppia.android.util.logging.performancemetrics + +import dagger.Module +import dagger.Provides +import org.oppia.android.app.model.OppiaMetricLog.MemoryTier +import org.oppia.android.app.model.OppiaMetricLog.StorageTier +import javax.inject.Qualifier + +private const val ONE_GIGABYTE = 1024L * 1024L * 1024L +private const val TWO_GIGABYTES = ONE_GIGABYTE * 2L +private const val THREE_GIGABYTES = ONE_GIGABYTE * 3L +private const val THIRTY_TWO_GIGABYTES = ONE_GIGABYTE * 32L +private const val SIXTY_FOUR_GIGABYTES = ONE_GIGABYTE * 64L + +/** Corresponds to a long value that denotes the non-inclusive upper bound of [StorageTier.LOW_STORAGE]. */ +@Qualifier +annotation class LowStorageTierUpperBound + +/** Corresponds to a long value that denotes the inclusive upper bound of [StorageTier.MEDIUM_STORAGE]. */ +@Qualifier +annotation class MediumStorageTierUpperBound + +/** Corresponds to a long value that denotes the non-inclusive upper bound of [MemoryTier.LOW_MEMORY_TIER]. */ +@Qualifier +annotation class LowMemoryTierUpperBound + +/** Corresponds to a long value that denotes the inclusive upper bound of [MemoryTier.MEDIUM_MEMORY_TIER]. */ +@Qualifier +annotation class MediumMemoryTierUpperBound + +/** + * Provides production-specific metrics-related storage and memory configuration values. + */ +@Module +class PerformanceMetricsConfigurationsModule { + @Provides + @LowStorageTierUpperBound + fun provideLowStorageTierUpperBound(): Long = THIRTY_TWO_GIGABYTES + + @Provides + @MediumStorageTierUpperBound + fun provideMediumStorageTierUpperBound(): Long = SIXTY_FOUR_GIGABYTES + + @Provides + @LowMemoryTierUpperBound + fun provideLowMemoryTierUpperBound(): Long = TWO_GIGABYTES + + @Provides + @MediumMemoryTierUpperBound + fun provideMediumMemoryTierUpperBound(): Long = THREE_GIGABYTES +} diff --git a/utility/src/main/java/org/oppia/android/util/logging/performancemetrics/PerformanceMetricsEventLogger.kt b/utility/src/main/java/org/oppia/android/util/logging/performancemetrics/PerformanceMetricsEventLogger.kt new file mode 100644 index 00000000000..a224aa08b70 --- /dev/null +++ b/utility/src/main/java/org/oppia/android/util/logging/performancemetrics/PerformanceMetricsEventLogger.kt @@ -0,0 +1,13 @@ +package org.oppia.android.util.logging.performancemetrics + +import org.oppia.android.app.model.OppiaMetricLog + +/** Logger for uploading performance metrics event logs to remote services. */ +interface PerformanceMetricsEventLogger { + /** + * Logs a performance metric to remote services. + * + * @param oppiaMetricLog refers to the log object which contains all the relevant data to be reported. + */ + fun logPerformanceMetric(oppiaMetricLog: OppiaMetricLog) +} diff --git a/utility/src/test/java/org/oppia/android/util/logging/performancemetrics/PerformanceMetricsAssessorImplTest.kt b/utility/src/test/java/org/oppia/android/util/logging/performancemetrics/PerformanceMetricsAssessorImplTest.kt new file mode 100644 index 00000000000..d6b3cb6185e --- /dev/null +++ b/utility/src/test/java/org/oppia/android/util/logging/performancemetrics/PerformanceMetricsAssessorImplTest.kt @@ -0,0 +1,343 @@ +package org.oppia.android.util.logging.performancemetrics + +import android.app.ActivityManager +import android.app.Application +import android.content.Context +import android.content.pm.PackageInfo +import android.net.TrafficStats +import android.os.Debug +import androidx.test.core.app.ApplicationProvider +import com.google.common.truth.Truth.assertThat +import dagger.BindsInstance +import dagger.Component +import dagger.Module +import dagger.Provides +import org.junit.Before +import org.junit.Test +import org.junit.runner.RunWith +import org.oppia.android.app.model.OppiaMetricLog +import org.oppia.android.testing.TestLogReportingModule +import org.oppia.android.testing.junit.OppiaParameterizedTestRunner +import org.oppia.android.testing.junit.OppiaParameterizedTestRunner.Parameter +import org.oppia.android.testing.junit.OppiaParameterizedTestRunner.RunParameterized +import org.oppia.android.testing.junit.OppiaParameterizedTestRunner.SelectRunnerPlatform +import org.oppia.android.testing.junit.ParameterizedRobolectricTestRunner +import org.oppia.android.testing.platformparameter.TestPlatformParameterModule +import org.oppia.android.testing.robolectric.OppiaShadowActivityManager +import org.oppia.android.testing.robolectric.OppiaShadowTrafficStats +import org.oppia.android.testing.robolectric.RobolectricModule +import org.oppia.android.testing.threading.TestDispatcherModule +import org.oppia.android.testing.time.FakeOppiaClockModule +import org.oppia.android.util.data.DataProvidersInjector +import org.oppia.android.util.data.DataProvidersInjectorProvider +import org.oppia.android.util.locale.LocaleProdModule +import org.oppia.android.util.logging.EnableConsoleLog +import org.oppia.android.util.logging.EnableFileLog +import org.oppia.android.util.logging.GlobalLogLevel +import org.oppia.android.util.logging.LogLevel +import org.oppia.android.util.logging.SyncStatusModule +import org.oppia.android.util.networking.NetworkConnectionUtilDebugModule +import org.robolectric.Shadows.shadowOf +import org.robolectric.annotation.Config +import org.robolectric.annotation.LooperMode +import org.robolectric.shadow.api.Shadow.extract +import org.robolectric.shadow.api.Shadow.newInstanceOf +import java.io.File +import javax.inject.Inject +import javax.inject.Singleton + +private const val TEST_APP_PATH = "TEST_APP_PATH" +private const val TEST_APP_PATH_CACHE = "TEST_APP_PATH_CACHE" +private const val TEST_APP_SUB_PATH = "TEST_APP_SUB_PATH" +private const val TEST_APP_SEMI_SUB_PATH = "TEST_APP_SEMI_SUB_PATH" +private const val TEST_FILE_NAME = "TEST_FILE_NAME" +private const val ONE_KILOBYTE = 1024 +private const val ONE_MEGABYTE = ONE_KILOBYTE * 1024 +private const val TWO_MEGABYTES = ONE_MEGABYTE * 2L +private const val TWO_AND_HALF_MEGABYTES = ONE_MEGABYTE * 2.5 +private const val THREE_MEGABYTES = ONE_MEGABYTE * 3L +private const val ONE_GIGABYTE = ONE_MEGABYTE * 1024 +private const val TWO_GIGABYTES = ONE_GIGABYTE * 2L +private const val THREE_GIGABYTES = ONE_GIGABYTE * 3L + +/** Tests for [PerformanceMetricsAssessorImpl]. */ +// FunctionName: test names are conventionally named with underscores. +@Suppress("FunctionName") +@LooperMode(LooperMode.Mode.PAUSED) +@RunWith(OppiaParameterizedTestRunner::class) +@SelectRunnerPlatform(ParameterizedRobolectricTestRunner::class) +@Config( + application = PerformanceMetricsAssessorImplTest.TestApplication::class, + shadows = [OppiaShadowActivityManager::class, OppiaShadowTrafficStats::class] +) +class PerformanceMetricsAssessorImplTest { + + @Parameter + var totalMemory: Long = Long.MIN_VALUE // Inited because primitives can't be lateinit. + + @Inject + lateinit var performanceMetricsAssessorImpl: PerformanceMetricsAssessorImpl + + @Inject + lateinit var context: Context + + private val shadowActivityManager by lazy { + shadowOf( + context.getSystemService(Context.ACTIVITY_SERVICE) as ActivityManager + ) as OppiaShadowActivityManager + } + + private val shadowTrafficStats by lazy { + extract(newInstanceOf(TrafficStats::class.java)) as OppiaShadowTrafficStats + } + + @Before + fun setUp() { + setUpTestApplicationComponent() + } + + @Test + fun testAssessor_createFilesWithContent_getTotalStorageUsed_retsCorrectStorageUsage() { + context.openFileOutput(TEST_APP_PATH, Context.MODE_PRIVATE) + .write(ByteArray(ONE_MEGABYTE)) + File.createTempFile(TEST_FILE_NAME, null, context.cacheDir) + .writeBytes(ByteArray(ONE_MEGABYTE)) + + assertThat(performanceMetricsAssessorImpl.getUsedStorage()).isEqualTo(ONE_MEGABYTE * 2) + } + + @Test + fun testAssessor_createFilesWithContent_withNesting_getTotStorageUsed_retsCorrectStorageUsage() { + val mainFile = File(TEST_APP_PATH) + val cacheFile = File.createTempFile(TEST_APP_PATH_CACHE, null, context.cacheDir) + val subFile = File(mainFile, TEST_APP_SUB_PATH) + val semiSubFile = File(subFile, TEST_APP_SEMI_SUB_PATH) + + context.openFileOutput(TEST_APP_PATH, Context.MODE_PRIVATE).write(ByteArray(ONE_MEGABYTE)) + cacheFile.writeBytes(ByteArray(ONE_MEGABYTE)) + context.openFileOutput(subFile.name, Context.MODE_PRIVATE).write(ByteArray(ONE_MEGABYTE)) + context.openFileOutput(semiSubFile.name, Context.MODE_PRIVATE).write(ByteArray(ONE_MEGABYTE)) + + assertThat(performanceMetricsAssessorImpl.getUsedStorage()).isEqualTo(ONE_MEGABYTE * 4) + } + + @Test + fun testAssessor_writeBytesLowerThanLowTierHigherBound_retsLowStorageUsageTier() { + context.openFileOutput(TEST_APP_PATH, Context.MODE_PRIVATE) + .write(ByteArray(ONE_KILOBYTE)) + assertThat(performanceMetricsAssessorImpl.getDeviceStorageTier()) + .isEqualTo(OppiaMetricLog.StorageTier.LOW_STORAGE) + } + + @Test + fun testAssessor_writeBytesEqualToLowTierHigherBound_retsLowStorageUsageTier() { + context.openFileOutput(TEST_APP_PATH, Context.MODE_PRIVATE) + .write(ByteArray(ONE_MEGABYTE)) + assertThat(performanceMetricsAssessorImpl.getDeviceStorageTier()) + .isEqualTo(OppiaMetricLog.StorageTier.LOW_STORAGE) + } + + @Test + fun testAssessor_writeBytesGreaterThanMediumTierLowerBound_retsMediumStorageUsageTier() { + context.openFileOutput(TEST_APP_PATH, Context.MODE_PRIVATE) + .write(ByteArray(TWO_AND_HALF_MEGABYTES.toInt())) + assertThat(performanceMetricsAssessorImpl.getDeviceStorageTier()) + .isEqualTo(OppiaMetricLog.StorageTier.MEDIUM_STORAGE) + } + + @Test + fun testAssessor_writeBytesEqualToMedTierHigherBound_retsMediumStorageUsageTier() { + context.openFileOutput(TEST_APP_PATH, Context.MODE_PRIVATE) + .write(ByteArray(THREE_MEGABYTES.toInt())) + assertThat(performanceMetricsAssessorImpl.getDeviceStorageTier()) + .isEqualTo(OppiaMetricLog.StorageTier.MEDIUM_STORAGE) + } + + @Test + fun testAssessor_writeBytesGreaterThanHighTierLowerBound_retsHighStorageTier() { + context.openFileOutput(TEST_APP_PATH, Context.MODE_PRIVATE) + .write(ByteArray(TWO_MEGABYTES.toInt() * 2)) + assertThat(performanceMetricsAssessorImpl.getDeviceStorageTier()) + .isEqualTo(OppiaMetricLog.StorageTier.HIGH_STORAGE) + } + + @Test + fun testAssessor_getBytesSent_returnsCorrectAmountOfNetworkBytesSent() { + shadowTrafficStats.setUidTxBytes(20L) + + assertThat(performanceMetricsAssessorImpl.getTotalSentBytes()).isEqualTo(20L) + } + + @Test + fun testAssessor_getBytesReceived_returnsCorrectAmountOfNetworkBytesReceived() { + shadowTrafficStats.setUidRxBytes(20L) + + assertThat(performanceMetricsAssessorImpl.getTotalReceivedBytes()).isEqualTo(20L) + } + + @Test + fun testAssessor_setProcessMemoryInfo_setTotalPss_returnsCorrectMemoryUsage() { + shadowActivityManager.setProcessMemoryInfo( + Debug.MemoryInfo().apply { + this.nativePss = 2 + this.dalvikPss = 1 + this.otherPss = 4 + } + ) + + assertThat(performanceMetricsAssessorImpl.getTotalPssUsed()).isEqualTo(7) + } + + @Test + fun testAssessor_removeCurrentApp_installTestApp_returnsCorrectApkSize() { + val shadowPackageManager = shadowOf(context.packageManager) + File(TEST_APP_PATH).writeBytes(ByteArray(ONE_MEGABYTE)) + val applicationInfo = context.applicationInfo.apply { + this.sourceDir = TEST_APP_PATH + } + shadowPackageManager.removePackage(context.packageName) + shadowPackageManager.installPackage( + PackageInfo().apply { + this.packageName = context.packageName + this.applicationInfo = applicationInfo + } + ) + val apkSize = performanceMetricsAssessorImpl.getApkSize() + assertThat(apkSize).isEqualTo(ONE_MEGABYTE) + } + + @Test + @RunParameterized( + OppiaParameterizedTestRunner.Iteration("memoryEqualToLowerBound", "totalMemory=0"), + OppiaParameterizedTestRunner.Iteration("memoryInRange", "totalMemory=1147483648"), + OppiaParameterizedTestRunner.Iteration("memoryJustBelowUpperBound", "totalMemory=2147483647") + ) + fun testAssessor_setTotalMemoryForLowMemoryRange_returnsCorrectLowMemoryTier() { + val memoryInfo = ActivityManager.MemoryInfo() + memoryInfo.totalMem = totalMemory + shadowActivityManager.setMemoryInfo(memoryInfo) + val memoryTier = performanceMetricsAssessorImpl.getDeviceMemoryTier() + + assertThat(memoryTier).isEqualTo(OppiaMetricLog.MemoryTier.LOW_MEMORY_TIER) + } + + @Test + @RunParameterized( + OppiaParameterizedTestRunner.Iteration("memoryEqualToLowerBound", "totalMemory=2147483649"), + OppiaParameterizedTestRunner.Iteration("memoryInRange", "totalMemory=2684354560"), + OppiaParameterizedTestRunner.Iteration("memoryEqualToUpperBound", "totalMemory=3221225472") + ) + fun testAssessor_setTotalMemoryForMediumMemoryRange_retsCorrectMediumMemoryTier() { + val memoryInfo = ActivityManager.MemoryInfo() + memoryInfo.totalMem = totalMemory + shadowActivityManager.setMemoryInfo(memoryInfo) + val memoryTier = performanceMetricsAssessorImpl.getDeviceMemoryTier() + + assertThat(memoryTier).isEqualTo(OppiaMetricLog.MemoryTier.MEDIUM_MEMORY_TIER) + } + + @Test + @RunParameterized( + OppiaParameterizedTestRunner.Iteration("memoryEqualToLowerBound", "totalMemory=3221225473"), + OppiaParameterizedTestRunner.Iteration("memoryInRange", "totalMemory=5221225472"), + OppiaParameterizedTestRunner.Iteration( + "memoryEqualToMaxValue", + "totalMemory=9223372036854775807" + ) + ) + fun testAssessor_setTotalMemoryForHighMemoryRange_retsCorrectHighMemoryTier() { + val memoryInfo = ActivityManager.MemoryInfo() + memoryInfo.totalMem = totalMemory + shadowActivityManager.setMemoryInfo(memoryInfo) + val memoryTier = performanceMetricsAssessorImpl.getDeviceMemoryTier() + + assertThat(memoryTier).isEqualTo(OppiaMetricLog.MemoryTier.HIGH_MEMORY_TIER) + } + + private fun setUpTestApplicationComponent() { + ApplicationProvider.getApplicationContext().inject(this) + } + + // TODO(#89): Move this to a common test application component. + @Module + class TestModule { + + @Provides + @Singleton + fun providesContext(application: Application): Context = application + + // TODO(#59): Either isolate these to their own shared test module, or use the real logging + // module in tests to avoid needing to specify these settings for tests. + @EnableConsoleLog + @Provides + fun provideEnableConsoleLog(): Boolean = true + + @EnableFileLog + @Provides + fun provideEnableFileLog(): Boolean = false + + @GlobalLogLevel + @Provides + fun provideGlobalLogLevel(): LogLevel = LogLevel.VERBOSE + } + + @Module + class TestPerformanceMetricsAssessorModule { + @Provides + fun providePerformanceMetricsAssessor( + performanceMetricsAssessorImpl: PerformanceMetricsAssessorImpl + ): PerformanceMetricsAssessor = performanceMetricsAssessorImpl + + @Provides + @LowStorageTierUpperBound + fun provideLowStorageTierUpperBound(): Long = TWO_MEGABYTES + + @Provides + @MediumStorageTierUpperBound + fun provideMediumStorageTierUpperBound(): Long = THREE_MEGABYTES + + @Provides + @LowMemoryTierUpperBound + fun provideLowMemoryTierUpperBound(): Long = TWO_GIGABYTES + + @Provides + @MediumMemoryTierUpperBound + fun provideMediumMemoryTierUpperBound(): Long = THREE_GIGABYTES + } + + // TODO(#89): Move this to a common test application component. + @Singleton + @Component( + modules = [ + TestModule::class, TestLogReportingModule::class, + TestDispatcherModule::class, RobolectricModule::class, FakeOppiaClockModule::class, + NetworkConnectionUtilDebugModule::class, LocaleProdModule::class, + TestPlatformParameterModule::class, SyncStatusModule::class, + TestPerformanceMetricsAssessorModule::class + ] + ) + interface TestApplicationComponent : DataProvidersInjector { + @Component.Builder + interface Builder { + @BindsInstance + fun setApplication(application: Application): Builder + fun build(): TestApplicationComponent + } + + fun inject(performanceMetricsUtilsTest: PerformanceMetricsAssessorImplTest) + } + + class TestApplication : Application(), DataProvidersInjectorProvider { + private val component: TestApplicationComponent by lazy { + DaggerPerformanceMetricsAssessorImplTest_TestApplicationComponent.builder() + .setApplication(this) + .build() + } + + fun inject(performanceMetricsUtilsTest: PerformanceMetricsAssessorImplTest) { + component.inject(performanceMetricsUtilsTest) + } + + override fun getDataProvidersInjector(): DataProvidersInjector = component + } +} diff --git a/utility/src/test/java/org/oppia/android/util/logging/performancemetrics/PerformanceMetricsAssessorModuleTest.kt b/utility/src/test/java/org/oppia/android/util/logging/performancemetrics/PerformanceMetricsAssessorModuleTest.kt new file mode 100644 index 00000000000..6a88d8522a2 --- /dev/null +++ b/utility/src/test/java/org/oppia/android/util/logging/performancemetrics/PerformanceMetricsAssessorModuleTest.kt @@ -0,0 +1,91 @@ +package org.oppia.android.util.logging.performancemetrics + +import android.app.Application +import android.content.Context +import androidx.test.core.app.ApplicationProvider +import androidx.test.ext.junit.runners.AndroidJUnit4 +import com.google.common.truth.Truth.assertThat +import dagger.Binds +import dagger.BindsInstance +import dagger.Component +import dagger.Module +import org.junit.Before +import org.junit.Test +import org.junit.runner.RunWith +import org.oppia.android.testing.robolectric.RobolectricModule +import org.oppia.android.testing.threading.TestDispatcherModule +import org.oppia.android.util.data.DataProvidersInjector +import org.oppia.android.util.data.DataProvidersInjectorProvider +import org.oppia.android.util.logging.LoggerModule +import org.oppia.android.util.logging.firebase.LogReportingModule +import org.robolectric.annotation.Config +import org.robolectric.annotation.LooperMode +import javax.inject.Inject +import javax.inject.Singleton + +/** Tests for [PerformanceMetricsAssessorModule]. */ +// FunctionName: test names are conventionally named with underscores. +@Suppress("FunctionName") +@RunWith(AndroidJUnit4::class) +@LooperMode(LooperMode.Mode.PAUSED) +@Config(application = PerformanceMetricsAssessorModuleTest.TestApplication::class) +class PerformanceMetricsAssessorModuleTest { + + @Inject + lateinit var performanceMetricsAssessor: PerformanceMetricsAssessor + + @Before + fun setUp() { + setUpTestApplicationComponent() + } + + @Test + fun testInjectAssessor_injectsPerformanceMetricsAssessorImpl() { + assertThat(performanceMetricsAssessor).isInstanceOf(PerformanceMetricsAssessorImpl::class.java) + } + + private fun setUpTestApplicationComponent() { + ApplicationProvider.getApplicationContext().inject(this) + } + + // TODO(#89): Move this to a common test application component. + @Module + interface TestModule { + @Binds + fun provideContext(application: Application): Context + } + + // TODO(#89): Move this to a common test application component. + @Singleton + @Component( + modules = [ + TestModule::class, PerformanceMetricsAssessorModule::class, LoggerModule::class, + TestDispatcherModule::class, LogReportingModule::class, RobolectricModule::class, + PerformanceMetricsConfigurationsModule::class + ] + ) + interface TestApplicationComponent : DataProvidersInjector { + @Component.Builder + interface Builder { + @BindsInstance + fun setApplication(application: Application): Builder + fun build(): TestApplicationComponent + } + + fun inject(test: PerformanceMetricsAssessorModuleTest) + } + + class TestApplication : Application(), DataProvidersInjectorProvider { + private val component: TestApplicationComponent by lazy { + DaggerPerformanceMetricsAssessorModuleTest_TestApplicationComponent.builder() + .setApplication(this) + .build() + } + + fun inject(test: PerformanceMetricsAssessorModuleTest) { + component.inject(test) + } + + override fun getDataProvidersInjector(): DataProvidersInjector = component + } +} diff --git a/utility/src/test/java/org/oppia/android/util/logging/performancemetrics/PerformanceMetricsConfigurationsModuleTest.kt b/utility/src/test/java/org/oppia/android/util/logging/performancemetrics/PerformanceMetricsConfigurationsModuleTest.kt new file mode 100644 index 00000000000..dde7045ad67 --- /dev/null +++ b/utility/src/test/java/org/oppia/android/util/logging/performancemetrics/PerformanceMetricsConfigurationsModuleTest.kt @@ -0,0 +1,121 @@ +package org.oppia.android.util.logging.performancemetrics + +import android.app.Application +import android.content.Context +import androidx.test.core.app.ApplicationProvider +import androidx.test.ext.junit.runners.AndroidJUnit4 +import com.google.common.truth.Truth.assertThat +import dagger.Binds +import dagger.BindsInstance +import dagger.Component +import dagger.Module +import org.junit.Before +import org.junit.Test +import org.junit.runner.RunWith +import org.oppia.android.testing.robolectric.RobolectricModule +import org.oppia.android.testing.threading.TestDispatcherModule +import org.oppia.android.util.data.DataProvidersInjector +import org.oppia.android.util.data.DataProvidersInjectorProvider +import org.oppia.android.util.logging.LoggerModule +import org.oppia.android.util.logging.firebase.LogReportingModule +import org.robolectric.annotation.Config +import org.robolectric.annotation.LooperMode +import javax.inject.Inject +import javax.inject.Singleton + +private const val ONE_GIGABYTE = 1024L * 1024L * 1024L + +/** Tests for [PerformanceMetricsConfigurationsModule]. */ +// FunctionName: test names are conventionally named with underscores. +@Suppress("FunctionName") +@RunWith(AndroidJUnit4::class) +@LooperMode(LooperMode.Mode.PAUSED) +@Config(application = PerformanceMetricsConfigurationsModuleTest.TestApplication::class) +class PerformanceMetricsConfigurationsModuleTest { + + @JvmField + @field:[Inject MediumMemoryTierUpperBound] + var mediumMemoryTierUpperBound: Long = 0L + + @JvmField + @field:[Inject LowMemoryTierUpperBound] + var lowMemoryTierUpperBound: Long = 0L + + @JvmField + @field:[Inject LowStorageTierUpperBound] + var lowStorageTierUpperBound: Long = 0L + + @JvmField + @field:[Inject MediumStorageTierUpperBound] + var mediumStorageTierUpperBound: Long = 0L + + @Before + fun setUp() { + setUpTestApplicationComponent() + } + + @Test + fun testLowStorageTierUpperBound_isThirtyTwoGigabytes() { + assertThat(lowStorageTierUpperBound).isEqualTo(ONE_GIGABYTE * 32L) + } + + @Test + fun testMediumStorageTierUpperBound_isSixtyFourGigabytes() { + assertThat(mediumStorageTierUpperBound).isEqualTo(ONE_GIGABYTE * 64L) + } + + @Test + fun testLowMemoryTierUpperBound_isTwoGigabytes() { + assertThat(lowMemoryTierUpperBound).isEqualTo(ONE_GIGABYTE * 2L) + } + + @Test + fun testLowMemoryTierUpperBound_isThreeGigabytes() { + assertThat(mediumMemoryTierUpperBound).isEqualTo(ONE_GIGABYTE * 3L) + } + + private fun setUpTestApplicationComponent() { + ApplicationProvider.getApplicationContext().inject(this) + } + + // TODO(#89): Move this to a common test application component. + @Module + interface TestModule { + @Binds + fun provideContext(application: Application): Context + } + + // TODO(#89): Move this to a common test application component. + @Singleton + @Component( + modules = [ + TestModule::class, PerformanceMetricsAssessorModule::class, LoggerModule::class, + TestDispatcherModule::class, LogReportingModule::class, RobolectricModule::class, + PerformanceMetricsConfigurationsModule::class + ] + ) + interface TestApplicationComponent : DataProvidersInjector { + @Component.Builder + interface Builder { + @BindsInstance + fun setApplication(application: Application): Builder + fun build(): TestApplicationComponent + } + + fun inject(test: PerformanceMetricsConfigurationsModuleTest) + } + + class TestApplication : Application(), DataProvidersInjectorProvider { + private val component: TestApplicationComponent by lazy { + DaggerPerformanceMetricsConfigurationsModuleTest_TestApplicationComponent.builder() + .setApplication(this) + .build() + } + + fun inject(test: PerformanceMetricsConfigurationsModuleTest) { + component.inject(test) + } + + override fun getDataProvidersInjector(): DataProvidersInjector = component + } +}