From c851395f2835eeedba1f6d45d164c9635fcd10e3 Mon Sep 17 00:00:00 2001 From: Saptak Manna Date: Sat, 1 Mar 2025 20:36:54 +0530 Subject: [PATCH 01/36] Add new feature flags --- .../PlatformParameterAlphaModule.kt | 28 +++++++++++++++ .../PlatformParameterModule.kt | 28 +++++++++++++++ .../TestPlatformParameterModule.kt | 34 +++++++++++++++++++ .../platformparameter/FeatureFlagConstants.kt | 24 +++++++++++++ 4 files changed, 114 insertions(+) diff --git a/domain/src/main/java/org/oppia/android/domain/platformparameter/PlatformParameterAlphaModule.kt b/domain/src/main/java/org/oppia/android/domain/platformparameter/PlatformParameterAlphaModule.kt index b9b9b92c338..161ce1fce91 100644 --- a/domain/src/main/java/org/oppia/android/domain/platformparameter/PlatformParameterAlphaModule.kt +++ b/domain/src/main/java/org/oppia/android/domain/platformparameter/PlatformParameterAlphaModule.kt @@ -23,6 +23,10 @@ import org.oppia.android.util.platformparameter.ENABLE_ONBOARDING_FLOW_V2 import org.oppia.android.util.platformparameter.ENABLE_ONBOARDING_FLOW_V2_DEFAULT_VALUE import org.oppia.android.util.platformparameter.ENABLE_PERFORMANCE_METRICS_COLLECTION import org.oppia.android.util.platformparameter.ENABLE_PERFORMANCE_METRICS_COLLECTION_DEFAULT_VALUE +import org.oppia.android.util.platformparameter.ENABLE_TOPIC_INFO_TAB +import org.oppia.android.util.platformparameter.ENABLE_TOPIC_INFO_TAB_DEFAULT_VALUE +import org.oppia.android.util.platformparameter.ENABLE_TOPIC_PRACTICE_TAB +import org.oppia.android.util.platformparameter.ENABLE_TOPIC_PRACTICE_TAB_DEFAULT_VALUE import org.oppia.android.util.platformparameter.EXTRA_TOPIC_TABS_UI import org.oppia.android.util.platformparameter.EnableAppAndOsDeprecation import org.oppia.android.util.platformparameter.EnableDownloadsSupport @@ -37,6 +41,8 @@ import org.oppia.android.util.platformparameter.EnableNpsSurvey import org.oppia.android.util.platformparameter.EnableOnboardingFlowV2 import org.oppia.android.util.platformparameter.EnablePerformanceMetricsCollection import org.oppia.android.util.platformparameter.EnableSpotlightUi +import org.oppia.android.util.platformparameter.EnableTopicInfoTab +import org.oppia.android.util.platformparameter.EnableTopicPracticeTab import org.oppia.android.util.platformparameter.FAST_LANGUAGE_SWITCHING_IN_LESSON import org.oppia.android.util.platformparameter.FAST_LANGUAGE_SWITCHING_IN_LESSON_DEFAULT_VALUE import org.oppia.android.util.platformparameter.FORCED_APP_UPDATE_VERSION_CODE @@ -344,4 +350,26 @@ class PlatformParameterAlphaModule { ENABLE_MULTIPLE_CLASSROOMS_DEFAULT_VALUE ) } + + @Provides + @EnableTopicInfoTab + fun provideEnableTopicInfoTab( + platformParameterSingleton: PlatformParameterSingleton + ): PlatformParameterValue { + return platformParameterSingleton.getBooleanPlatformParameter(ENABLE_TOPIC_INFO_TAB) + ?: PlatformParameterValue.createDefaultParameter( + ENABLE_TOPIC_INFO_TAB_DEFAULT_VALUE + ) + } + + @Provides + @EnableTopicPracticeTab + fun provideEnableTopicPracticeTab( + platformParameterSingleton: PlatformParameterSingleton + ): PlatformParameterValue { + return platformParameterSingleton.getBooleanPlatformParameter(ENABLE_TOPIC_PRACTICE_TAB) + ?: PlatformParameterValue.createDefaultParameter( + ENABLE_TOPIC_PRACTICE_TAB_DEFAULT_VALUE + ) + } } diff --git a/domain/src/main/java/org/oppia/android/domain/platformparameter/PlatformParameterModule.kt b/domain/src/main/java/org/oppia/android/domain/platformparameter/PlatformParameterModule.kt index 2bafaedf87d..eb136dad30e 100644 --- a/domain/src/main/java/org/oppia/android/domain/platformparameter/PlatformParameterModule.kt +++ b/domain/src/main/java/org/oppia/android/domain/platformparameter/PlatformParameterModule.kt @@ -24,6 +24,10 @@ import org.oppia.android.util.platformparameter.ENABLE_ONBOARDING_FLOW_V2_DEFAUL import org.oppia.android.util.platformparameter.ENABLE_PERFORMANCE_METRICS_COLLECTION import org.oppia.android.util.platformparameter.ENABLE_PERFORMANCE_METRICS_COLLECTION_DEFAULT_VALUE import org.oppia.android.util.platformparameter.ENABLE_SPOTLIGHT_UI_DEFAULT_VALUE +import org.oppia.android.util.platformparameter.ENABLE_TOPIC_INFO_TAB +import org.oppia.android.util.platformparameter.ENABLE_TOPIC_INFO_TAB_DEFAULT_VALUE +import org.oppia.android.util.platformparameter.ENABLE_TOPIC_PRACTICE_TAB +import org.oppia.android.util.platformparameter.ENABLE_TOPIC_PRACTICE_TAB_DEFAULT_VALUE import org.oppia.android.util.platformparameter.EXTRA_TOPIC_TABS_UI import org.oppia.android.util.platformparameter.EnableAppAndOsDeprecation import org.oppia.android.util.platformparameter.EnableDownloadsSupport @@ -38,6 +42,8 @@ import org.oppia.android.util.platformparameter.EnableNpsSurvey import org.oppia.android.util.platformparameter.EnableOnboardingFlowV2 import org.oppia.android.util.platformparameter.EnablePerformanceMetricsCollection import org.oppia.android.util.platformparameter.EnableSpotlightUi +import org.oppia.android.util.platformparameter.EnableTopicInfoTab +import org.oppia.android.util.platformparameter.EnableTopicPracticeTab import org.oppia.android.util.platformparameter.FAST_LANGUAGE_SWITCHING_IN_LESSON import org.oppia.android.util.platformparameter.FAST_LANGUAGE_SWITCHING_IN_LESSON_DEFAULT_VALUE import org.oppia.android.util.platformparameter.FORCED_APP_UPDATE_VERSION_CODE @@ -346,4 +352,26 @@ class PlatformParameterModule { ENABLE_MULTIPLE_CLASSROOMS_DEFAULT_VALUE ) } + + @Provides + @EnableTopicInfoTab + fun provideEnableTopicInfoTab( + platformParameterSingleton: PlatformParameterSingleton + ): PlatformParameterValue { + return platformParameterSingleton.getBooleanPlatformParameter(ENABLE_TOPIC_INFO_TAB) + ?: PlatformParameterValue.createDefaultParameter( + ENABLE_TOPIC_INFO_TAB_DEFAULT_VALUE + ) + } + + @Provides + @EnableTopicPracticeTab + fun provideEnableTopicPracticeTab( + platformParameterSingleton: PlatformParameterSingleton + ): PlatformParameterValue { + return platformParameterSingleton.getBooleanPlatformParameter(ENABLE_TOPIC_PRACTICE_TAB) + ?: PlatformParameterValue.createDefaultParameter( + ENABLE_TOPIC_PRACTICE_TAB_DEFAULT_VALUE + ) + } } diff --git a/testing/src/main/java/org/oppia/android/testing/platformparameter/TestPlatformParameterModule.kt b/testing/src/main/java/org/oppia/android/testing/platformparameter/TestPlatformParameterModule.kt index fc848d39233..1be714df544 100644 --- a/testing/src/main/java/org/oppia/android/testing/platformparameter/TestPlatformParameterModule.kt +++ b/testing/src/main/java/org/oppia/android/testing/platformparameter/TestPlatformParameterModule.kt @@ -65,6 +65,10 @@ import org.oppia.android.util.platformparameter.SYNC_UP_WORKER_TIME_PERIOD_IN_HO import org.oppia.android.util.platformparameter.SplashScreenWelcomeMsg import org.oppia.android.util.platformparameter.SyncUpWorkerTimePeriodHours import javax.inject.Singleton +import org.oppia.android.util.platformparameter.ENABLE_TOPIC_INFO_TAB_DEFAULT_VALUE +import org.oppia.android.util.platformparameter.ENABLE_TOPIC_PRACTICE_TAB_DEFAULT_VALUE +import org.oppia.android.util.platformparameter.EnableTopicInfoTab +import org.oppia.android.util.platformparameter.EnableTopicPracticeTab /* Fake Platform Parameter Module that provides individual Platform Parameters for testing. */ @Module @@ -320,6 +324,22 @@ class TestPlatformParameterModule { return PlatformParameterValue.createDefaultParameter(enableMultipleClassrooms) } + @Provides + @EnableTopicInfoTab + fun provideEnableTopicInfoTab( + platformParameterSingleton: PlatformParameterSingleton + ): PlatformParameterValue { + return PlatformParameterValue.createDefaultParameter(enableTopicInfoTab) + } + + @Provides + @EnableTopicPracticeTab + fun provideEnableTopicPracticeTab( + platformParameterSingleton: PlatformParameterSingleton + ): PlatformParameterValue { + return PlatformParameterValue.createDefaultParameter(enableTopicPracticeTab) + } + companion object { private var enableDownloadsSupport = ENABLE_DOWNLOADS_SUPPORT_DEFAULT_VALUE private var enableEditAccountsOptionsUi = ENABLE_EDIT_ACCOUNTS_OPTIONS_UI_DEFAULT_VALUE @@ -340,6 +360,8 @@ class TestPlatformParameterModule { private var enableNpsSurvey = ENABLE_NPS_SURVEY_DEFAULT_VALUE private var enableOnboardingFlowV2 = ENABLE_ONBOARDING_FLOW_V2_DEFAULT_VALUE private var enableMultipleClassrooms = ENABLE_MULTIPLE_CLASSROOMS_DEFAULT_VALUE + private var enableTopicInfoTab = ENABLE_TOPIC_INFO_TAB_DEFAULT_VALUE + private var enableTopicPracticeTab = ENABLE_TOPIC_PRACTICE_TAB_DEFAULT_VALUE @VisibleForTesting(otherwise = VisibleForTesting.NONE) fun forceEnableDownloadsSupport(value: Boolean) { @@ -418,6 +440,18 @@ class TestPlatformParameterModule { enableAppAndOsDeprecation = value } + /** Enables forcing [EnableTopicInfoTab] platform parameter flag from tests. */ + @VisibleForTesting(otherwise = VisibleForTesting.NONE) + fun forceEnableTopicInfoTab(value: Boolean) { + enableTopicInfoTab = value + } + + /** Enables forcing [EnableTopicPracticeTab] platform parameter flag from tests. */ + @VisibleForTesting(otherwise = VisibleForTesting.NONE) + fun forceEnableTopicPracticeTab(value: Boolean) { + enableTopicPracticeTab = value + } + @VisibleForTesting(otherwise = VisibleForTesting.NONE) fun reset() { enableDownloadsSupport = ENABLE_DOWNLOADS_SUPPORT_DEFAULT_VALUE diff --git a/utility/src/main/java/org/oppia/android/util/platformparameter/FeatureFlagConstants.kt b/utility/src/main/java/org/oppia/android/util/platformparameter/FeatureFlagConstants.kt index 39a63ec453a..dae5bec994d 100644 --- a/utility/src/main/java/org/oppia/android/util/platformparameter/FeatureFlagConstants.kt +++ b/utility/src/main/java/org/oppia/android/util/platformparameter/FeatureFlagConstants.kt @@ -179,3 +179,27 @@ const val ENABLE_MULTIPLE_CLASSROOMS = "enable_multiple_classrooms" /** Default value of the feature flag corresponding to [EnableMultipleClassrooms]. */ const val ENABLE_MULTIPLE_CLASSROOMS_DEFAULT_VALUE = true + +/** + * Qualifier for the feature flag corresponding to enabling the topic info tab. + */ +@Qualifier +annotation class EnableTopicInfoTab + +/** Name of the feature flag that controls whether to enable the topic info tab. */ +const val ENABLE_TOPIC_INFO_TAB = "enable_topic_info_tab" + +/** Default value for the feature flag corresponding to [EnableTopicInfoTab]. */ +const val ENABLE_TOPIC_INFO_TAB_DEFAULT_VALUE = false + +/** + * Qualifier for the feature flag corresponding to enabling the topic practice tab. + */ +@Qualifier +annotation class EnableTopicPracticeTab + +/** Name of the feature flag that controls whether to enable the topic practice tab. */ +const val ENABLE_TOPIC_PRACTICE_TAB = "enable_topic_practice_tab" + +/** Default value for the feature flag corresponding to [EnableTopicPracticeTab]. */ +const val ENABLE_TOPIC_PRACTICE_TAB_DEFAULT_VALUE = false From 2cc5137eb34e7a0f8c70450648ae187cc23df1d7 Mon Sep 17 00:00:00 2001 From: Saptak Manna Date: Sun, 2 Mar 2025 13:42:28 +0530 Subject: [PATCH 02/36] Replace enableExtraTopicTabsUi usage with enableTopicInfoTab & enableTopicPracticeTab --- .../app/topic/TopicFragmentPresenter.kt | 35 ++++++++++++---- .../org/oppia/android/app/topic/TopicTab.kt | 42 +++++++++++++++---- .../android/app/topic/ViewPagerAdapter.kt | 7 ++-- 3 files changed, 67 insertions(+), 17 deletions(-) diff --git a/app/src/main/java/org/oppia/android/app/topic/TopicFragmentPresenter.kt b/app/src/main/java/org/oppia/android/app/topic/TopicFragmentPresenter.kt index 5b04139073f..71e24301ce6 100644 --- a/app/src/main/java/org/oppia/android/app/topic/TopicFragmentPresenter.kt +++ b/app/src/main/java/org/oppia/android/app/topic/TopicFragmentPresenter.kt @@ -21,9 +21,10 @@ import org.oppia.android.databinding.TopicFragmentBinding import org.oppia.android.domain.oppialogger.OppiaLogger import org.oppia.android.domain.oppialogger.analytics.AnalyticsController import org.oppia.android.util.accessibility.AccessibilityService -import org.oppia.android.util.platformparameter.EnableExtraTopicTabsUi import org.oppia.android.util.platformparameter.PlatformParameterValue import javax.inject.Inject +import org.oppia.android.util.platformparameter.EnableTopicInfoTab +import org.oppia.android.util.platformparameter.EnableTopicPracticeTab /** The presenter for [TopicFragment]. */ @FragmentScope @@ -33,7 +34,8 @@ class TopicFragmentPresenter @Inject constructor( private val viewModel: TopicViewModel, private val oppiaLogger: OppiaLogger, private val analyticsController: AnalyticsController, - @EnableExtraTopicTabsUi private val enableExtraTopicTabsUi: PlatformParameterValue, + @EnableTopicInfoTab private val enableTopicInfoTab: PlatformParameterValue, + @EnableTopicPracticeTab private val enableTopicPracticeTab: PlatformParameterValue, private val resourceHandler: AppLanguageResourceHandler ) { @Inject @@ -122,7 +124,15 @@ class TopicFragmentPresenter @Inject constructor( } private fun computeTabPosition(tab: TopicTab): Int { - return if (enableExtraTopicTabsUi.value) tab.positionWithFourTabs else tab.positionWithTwoTabs + return if (enableTopicInfoTab.value && enableTopicPracticeTab.value) { + tab.positionWithFourTabs + } else if (enableTopicInfoTab.value) { + tab.positionWithThreeTabsWithInfo + } else if (enableTopicPracticeTab.value) { + tab.positionWithThreeTabsWithPractice + } else { + tab.positionWithTwoTabs + } } private fun setUpViewPager( @@ -138,17 +148,22 @@ class TopicFragmentPresenter @Inject constructor( classroomId, topicId, storyId, - enableExtraTopicTabsUi.value + enableTopicInfoTab.value, + enableTopicPracticeTab.value ) viewPager2.adapter = adapter TabLayoutMediator(tabLayout, viewPager2) { tab, position -> - val topicTab = TopicTab.getTabForPosition(position, enableExtraTopicTabsUi.value) + val topicTab = TopicTab.getTabForPosition( + position, + enableTopicInfoTab.value, + enableTopicPracticeTab.value + ) tab.text = resourceHandler.getStringInLocale(topicTab.tabLabelResId) tab.icon = ContextCompat.getDrawable(activity, topicTab.tabIconResId) tab.contentDescription = resourceHandler.getStringInLocale(topicTab.contentDescriptionResId) }.attach() if (!isConfigChanged && topicId.isNotEmpty()) { - if (enableExtraTopicTabsUi.value) { + if (enableTopicInfoTab.value) { setCurrentTab(if (storyId.isNotEmpty()) TopicTab.LEARN else TopicTab.INFO) } else { setCurrentTab(TopicTab.LEARN) @@ -156,7 +171,13 @@ class TopicFragmentPresenter @Inject constructor( } viewPager2.registerOnPageChangeCallback(object : ViewPager2.OnPageChangeCallback() { override fun onPageSelected(position: Int) { - logTopicEvents(TopicTab.getTabForPosition(position, enableExtraTopicTabsUi.value)) + logTopicEvents( + TopicTab.getTabForPosition( + position, + enableTopicInfoTab.value, + enableTopicPracticeTab.value + ) + ) } }) } diff --git a/app/src/main/java/org/oppia/android/app/topic/TopicTab.kt b/app/src/main/java/org/oppia/android/app/topic/TopicTab.kt index 055e7107cb3..9acf541112f 100644 --- a/app/src/main/java/org/oppia/android/app/topic/TopicTab.kt +++ b/app/src/main/java/org/oppia/android/app/topic/TopicTab.kt @@ -7,6 +7,8 @@ import org.oppia.android.R /** Enum to store the tabs of [TopicFragment] and get tab by position. */ enum class TopicTab( val positionWithTwoTabs: Int, + val positionWithThreeTabsWithInfo: Int, + val positionWithThreeTabsWithPractice: Int, val positionWithFourTabs: Int, @StringRes val tabLabelResId: Int, @DrawableRes val tabIconResId: Int, @@ -14,6 +16,8 @@ enum class TopicTab( ) { INFO( positionWithTwoTabs = -1, + positionWithThreeTabsWithInfo = 0, + positionWithThreeTabsWithPractice = -1, positionWithFourTabs = 0, tabLabelResId = R.string.info, tabIconResId = R.drawable.ic_info_icon_24dp, @@ -21,6 +25,8 @@ enum class TopicTab( ), LEARN( positionWithTwoTabs = 0, + positionWithThreeTabsWithInfo = 1, + positionWithThreeTabsWithPractice = 0, positionWithFourTabs = 1, tabLabelResId = R.string.learn, tabIconResId = R.drawable.ic_lessons_icon_24dp, @@ -28,6 +34,8 @@ enum class TopicTab( ), PRACTICE( positionWithTwoTabs = -1, + positionWithThreeTabsWithInfo = -1, + positionWithThreeTabsWithPractice = 1, positionWithFourTabs = 2, tabLabelResId = R.string.practice, tabIconResId = R.drawable.ic_practice_icon_24dp, @@ -35,6 +43,8 @@ enum class TopicTab( ), STUDY( positionWithTwoTabs = 1, + positionWithThreeTabsWithInfo = 2, + positionWithThreeTabsWithPractice = 2, positionWithFourTabs = 3, tabLabelResId = R.string.study, tabIconResId = R.drawable.ic_revision_icon_24dp, @@ -44,20 +54,38 @@ enum class TopicTab( companion object { /** * Returns the [TopicTab] corresponding to the specified tab position, considering whether the - * info and practice tabs are enabled per [enableExtraTopicTabsUi]. + * info and practice tabs are enabled per [enableTopicInfoTab] and [enableTopicPracticeTab] + * respectively. */ - fun getTabForPosition(position: Int, enableExtraTopicTabsUi: Boolean): TopicTab { + fun getTabForPosition( + position: Int, + enableTopicInfoTab: Boolean, + enableTopicPracticeTab: Boolean + ): TopicTab { return checkNotNull( values().find { - position == if (enableExtraTopicTabsUi) { + position == if (enableTopicInfoTab && enableTopicPracticeTab) { it.positionWithFourTabs - } else it.positionWithTwoTabs + } else if (enableTopicInfoTab) { + it.positionWithThreeTabsWithInfo + } else if (enableTopicPracticeTab) { + it.positionWithThreeTabsWithPractice + } else { + it.positionWithTwoTabs + } } ) { "No tab corresponding to position: $position" } } - /** Returns the number of active tabs considering [enableExtraTopicTabsUi]. */ - fun getTabCount(enableExtraTopicTabsUi: Boolean) = - if (enableExtraTopicTabsUi) values().size else values().size - 2 + /** + * Returns the number of active tabs considering [enableTopicInfoTab] and + * [enableTopicPracticeTab]. + */ + fun getTabCount(enableTopicInfoTab: Boolean, enableTopicPracticeTab: Boolean) = + if (enableTopicInfoTab && enableTopicPracticeTab) + values().size + else if (enableTopicInfoTab || enableTopicPracticeTab) + values().size - 1 + else values().size - 2 } } diff --git a/app/src/main/java/org/oppia/android/app/topic/ViewPagerAdapter.kt b/app/src/main/java/org/oppia/android/app/topic/ViewPagerAdapter.kt index 7f93e7928cf..15456873cbb 100644 --- a/app/src/main/java/org/oppia/android/app/topic/ViewPagerAdapter.kt +++ b/app/src/main/java/org/oppia/android/app/topic/ViewPagerAdapter.kt @@ -15,13 +15,14 @@ class ViewPagerAdapter( private val classroomId: String, private val topicId: String, private val storyId: String, - private val enableExtraTopicTabsUi: Boolean + private val enableTopicInfoTab: Boolean, + private val enableTopicPracticeTab: Boolean ) : FragmentStateAdapter(fragment) { - override fun getItemCount(): Int = TopicTab.getTabCount(enableExtraTopicTabsUi) + override fun getItemCount(): Int = TopicTab.getTabCount(enableTopicInfoTab, enableTopicPracticeTab) override fun createFragment(position: Int): Fragment { - return when (TopicTab.getTabForPosition(position, enableExtraTopicTabsUi)) { + return when (TopicTab.getTabForPosition(position, enableTopicInfoTab, enableTopicPracticeTab)) { TopicTab.INFO -> { TopicInfoFragment.newInstance(profileId, topicId) } From dd106e701ffa1bebfc0e6753641236750b6df3c6 Mon Sep 17 00:00:00 2001 From: Saptak Manna Date: Sun, 2 Mar 2025 13:49:20 +0530 Subject: [PATCH 03/36] Enable practice tab for alpha builds --- .../domain/platformparameter/PlatformParameterAlphaModule.kt | 5 +---- 1 file changed, 1 insertion(+), 4 deletions(-) diff --git a/domain/src/main/java/org/oppia/android/domain/platformparameter/PlatformParameterAlphaModule.kt b/domain/src/main/java/org/oppia/android/domain/platformparameter/PlatformParameterAlphaModule.kt index 161ce1fce91..64dcfc873db 100644 --- a/domain/src/main/java/org/oppia/android/domain/platformparameter/PlatformParameterAlphaModule.kt +++ b/domain/src/main/java/org/oppia/android/domain/platformparameter/PlatformParameterAlphaModule.kt @@ -367,9 +367,6 @@ class PlatformParameterAlphaModule { fun provideEnableTopicPracticeTab( platformParameterSingleton: PlatformParameterSingleton ): PlatformParameterValue { - return platformParameterSingleton.getBooleanPlatformParameter(ENABLE_TOPIC_PRACTICE_TAB) - ?: PlatformParameterValue.createDefaultParameter( - ENABLE_TOPIC_PRACTICE_TAB_DEFAULT_VALUE - ) + return PlatformParameterValue.createDefaultParameter(true) } } From 8394a3f2e0cec34ad75488a669a7dd510a6e54fc Mon Sep 17 00:00:00 2001 From: Saptak Manna Date: Sun, 2 Mar 2025 13:52:15 +0530 Subject: [PATCH 04/36] Remove unused parameter --- .../domain/platformparameter/PlatformParameterAlphaModule.kt | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/domain/src/main/java/org/oppia/android/domain/platformparameter/PlatformParameterAlphaModule.kt b/domain/src/main/java/org/oppia/android/domain/platformparameter/PlatformParameterAlphaModule.kt index 64dcfc873db..06e2673b463 100644 --- a/domain/src/main/java/org/oppia/android/domain/platformparameter/PlatformParameterAlphaModule.kt +++ b/domain/src/main/java/org/oppia/android/domain/platformparameter/PlatformParameterAlphaModule.kt @@ -364,9 +364,7 @@ class PlatformParameterAlphaModule { @Provides @EnableTopicPracticeTab - fun provideEnableTopicPracticeTab( - platformParameterSingleton: PlatformParameterSingleton - ): PlatformParameterValue { + fun provideEnableTopicPracticeTab(): PlatformParameterValue { return PlatformParameterValue.createDefaultParameter(true) } } From ec425d5e98b581b247f046719b0a48f66a66e123 Mon Sep 17 00:00:00 2001 From: Saptak Manna Date: Sun, 2 Mar 2025 14:14:42 +0530 Subject: [PATCH 05/36] Remove EXTRA_TOPIC_TABS_UI feature flag --- .../oppialogger/analytics/FeatureFlagsLogger.kt | 15 ++++++++++----- .../PlatformParameterAlphaModule.kt | 17 ----------------- .../PlatformParameterModule.kt | 15 --------------- .../analytics/FeatureFlagsLoggerTest.kt | 6 ++++-- .../TestPlatformParameterModule.kt | 16 ++++------------ .../platformparameter/FeatureFlagConstants.kt | 12 ------------ 6 files changed, 18 insertions(+), 63 deletions(-) diff --git a/domain/src/main/java/org/oppia/android/domain/oppialogger/analytics/FeatureFlagsLogger.kt b/domain/src/main/java/org/oppia/android/domain/oppialogger/analytics/FeatureFlagsLogger.kt index f6983f25aee..567798abb71 100644 --- a/domain/src/main/java/org/oppia/android/domain/oppialogger/analytics/FeatureFlagsLogger.kt +++ b/domain/src/main/java/org/oppia/android/domain/oppialogger/analytics/FeatureFlagsLogger.kt @@ -10,11 +10,11 @@ import org.oppia.android.util.platformparameter.ENABLE_MULTIPLE_CLASSROOMS import org.oppia.android.util.platformparameter.ENABLE_NPS_SURVEY import org.oppia.android.util.platformparameter.ENABLE_ONBOARDING_FLOW_V2 import org.oppia.android.util.platformparameter.ENABLE_PERFORMANCE_METRICS_COLLECTION -import org.oppia.android.util.platformparameter.EXTRA_TOPIC_TABS_UI +import org.oppia.android.util.platformparameter.ENABLE_TOPIC_INFO_TAB +import org.oppia.android.util.platformparameter.ENABLE_TOPIC_PRACTICE_TAB import org.oppia.android.util.platformparameter.EnableAppAndOsDeprecation import org.oppia.android.util.platformparameter.EnableDownloadsSupport import org.oppia.android.util.platformparameter.EnableEditAccountsOptionsUi -import org.oppia.android.util.platformparameter.EnableExtraTopicTabsUi import org.oppia.android.util.platformparameter.EnableFastLanguageSwitchingInLesson import org.oppia.android.util.platformparameter.EnableInteractionConfigChangeStateRetention import org.oppia.android.util.platformparameter.EnableLearnerStudyAnalytics @@ -24,6 +24,8 @@ import org.oppia.android.util.platformparameter.EnableNpsSurvey import org.oppia.android.util.platformparameter.EnableOnboardingFlowV2 import org.oppia.android.util.platformparameter.EnablePerformanceMetricsCollection import org.oppia.android.util.platformparameter.EnableSpotlightUi +import org.oppia.android.util.platformparameter.EnableTopicInfoTab +import org.oppia.android.util.platformparameter.EnableTopicPracticeTab import org.oppia.android.util.platformparameter.FAST_LANGUAGE_SWITCHING_IN_LESSON import org.oppia.android.util.platformparameter.INTERACTION_CONFIG_CHANGE_STATE_RETENTION import org.oppia.android.util.platformparameter.LEARNER_STUDY_ANALYTICS @@ -45,8 +47,6 @@ class FeatureFlagsLogger @Inject constructor( private val analyticsController: AnalyticsController, @EnableDownloadsSupport private val enableDownloadsSupport: PlatformParameterValue, - @EnableExtraTopicTabsUi - private val enableExtraTopicTabsUi: PlatformParameterValue, @EnableLearnerStudyAnalytics private val enableLearnerStudyAnalytics: PlatformParameterValue, @EnableFastLanguageSwitchingInLesson @@ -69,6 +69,10 @@ class FeatureFlagsLogger @Inject constructor( private val enableOnboardingFlowV2: PlatformParameterValue, @EnableMultipleClassrooms private val enableMultipleClassrooms: PlatformParameterValue, + @EnableTopicInfoTab + private val enableTopicInfoTab: PlatformParameterValue, + @EnableTopicPracticeTab + private val enableTopicPracticeTab: PlatformParameterValue, ) { /** * A variable containing a list of all the feature flags in the app. @@ -77,7 +81,6 @@ class FeatureFlagsLogger @Inject constructor( */ private var featureFlagItemMap: Map> = mapOf( DOWNLOADS_SUPPORT to enableDownloadsSupport, - EXTRA_TOPIC_TABS_UI to enableExtraTopicTabsUi, LEARNER_STUDY_ANALYTICS to enableLearnerStudyAnalytics, FAST_LANGUAGE_SWITCHING_IN_LESSON to enableFastLanguageSwitchingInLesson, LOGGING_LEARNER_STUDY_IDS to enableLoggingLearnerStudyIds, @@ -89,6 +92,8 @@ class FeatureFlagsLogger @Inject constructor( ENABLE_NPS_SURVEY to enableNpsSurvey, ENABLE_ONBOARDING_FLOW_V2 to enableOnboardingFlowV2, ENABLE_MULTIPLE_CLASSROOMS to enableMultipleClassrooms, + ENABLE_TOPIC_INFO_TAB to enableTopicInfoTab, + ENABLE_TOPIC_PRACTICE_TAB to enableTopicPracticeTab, ) /** diff --git a/domain/src/main/java/org/oppia/android/domain/platformparameter/PlatformParameterAlphaModule.kt b/domain/src/main/java/org/oppia/android/domain/platformparameter/PlatformParameterAlphaModule.kt index 06e2673b463..2a0d5e53c65 100644 --- a/domain/src/main/java/org/oppia/android/domain/platformparameter/PlatformParameterAlphaModule.kt +++ b/domain/src/main/java/org/oppia/android/domain/platformparameter/PlatformParameterAlphaModule.kt @@ -13,7 +13,6 @@ import org.oppia.android.util.platformparameter.EDIT_ACCOUNTS_OPTIONS_UI import org.oppia.android.util.platformparameter.ENABLE_APP_AND_OS_DEPRECATION_DEFAULT_VALUE import org.oppia.android.util.platformparameter.ENABLE_DOWNLOADS_SUPPORT_DEFAULT_VALUE import org.oppia.android.util.platformparameter.ENABLE_EDIT_ACCOUNTS_OPTIONS_UI_DEFAULT_VALUE -import org.oppia.android.util.platformparameter.ENABLE_EXTRA_TOPIC_TABS_UI_DEFAULT_VALUE import org.oppia.android.util.platformparameter.ENABLE_INTERACTION_CONFIG_CHANGE_STATE_RETENTION_DEFAULT_VALUE import org.oppia.android.util.platformparameter.ENABLE_MULTIPLE_CLASSROOMS import org.oppia.android.util.platformparameter.ENABLE_MULTIPLE_CLASSROOMS_DEFAULT_VALUE @@ -25,13 +24,9 @@ import org.oppia.android.util.platformparameter.ENABLE_PERFORMANCE_METRICS_COLLE import org.oppia.android.util.platformparameter.ENABLE_PERFORMANCE_METRICS_COLLECTION_DEFAULT_VALUE import org.oppia.android.util.platformparameter.ENABLE_TOPIC_INFO_TAB import org.oppia.android.util.platformparameter.ENABLE_TOPIC_INFO_TAB_DEFAULT_VALUE -import org.oppia.android.util.platformparameter.ENABLE_TOPIC_PRACTICE_TAB -import org.oppia.android.util.platformparameter.ENABLE_TOPIC_PRACTICE_TAB_DEFAULT_VALUE -import org.oppia.android.util.platformparameter.EXTRA_TOPIC_TABS_UI import org.oppia.android.util.platformparameter.EnableAppAndOsDeprecation import org.oppia.android.util.platformparameter.EnableDownloadsSupport import org.oppia.android.util.platformparameter.EnableEditAccountsOptionsUi -import org.oppia.android.util.platformparameter.EnableExtraTopicTabsUi import org.oppia.android.util.platformparameter.EnableFastLanguageSwitchingInLesson import org.oppia.android.util.platformparameter.EnableInteractionConfigChangeStateRetention import org.oppia.android.util.platformparameter.EnableLearnerStudyAnalytics @@ -221,18 +216,6 @@ class PlatformParameterAlphaModule { ?: PlatformParameterValue.createDefaultParameter(true) // Enable spotlights for alpha users. } - @Provides - @EnableExtraTopicTabsUi - fun provideEnableExtraTopicTabsUi( - platformParameterSingleton: PlatformParameterSingleton - ): PlatformParameterValue { - return platformParameterSingleton.getBooleanPlatformParameter( - EXTRA_TOPIC_TABS_UI - ) ?: PlatformParameterValue.createDefaultParameter( - ENABLE_EXTRA_TOPIC_TABS_UI_DEFAULT_VALUE - ) - } - @Provides @EnableInteractionConfigChangeStateRetention fun provideEnableInteractionConfigChangeStateRetention( diff --git a/domain/src/main/java/org/oppia/android/domain/platformparameter/PlatformParameterModule.kt b/domain/src/main/java/org/oppia/android/domain/platformparameter/PlatformParameterModule.kt index eb136dad30e..344e819c078 100644 --- a/domain/src/main/java/org/oppia/android/domain/platformparameter/PlatformParameterModule.kt +++ b/domain/src/main/java/org/oppia/android/domain/platformparameter/PlatformParameterModule.kt @@ -13,7 +13,6 @@ import org.oppia.android.util.platformparameter.EDIT_ACCOUNTS_OPTIONS_UI import org.oppia.android.util.platformparameter.ENABLE_APP_AND_OS_DEPRECATION_DEFAULT_VALUE import org.oppia.android.util.platformparameter.ENABLE_DOWNLOADS_SUPPORT_DEFAULT_VALUE import org.oppia.android.util.platformparameter.ENABLE_EDIT_ACCOUNTS_OPTIONS_UI_DEFAULT_VALUE -import org.oppia.android.util.platformparameter.ENABLE_EXTRA_TOPIC_TABS_UI_DEFAULT_VALUE import org.oppia.android.util.platformparameter.ENABLE_INTERACTION_CONFIG_CHANGE_STATE_RETENTION_DEFAULT_VALUE import org.oppia.android.util.platformparameter.ENABLE_MULTIPLE_CLASSROOMS import org.oppia.android.util.platformparameter.ENABLE_MULTIPLE_CLASSROOMS_DEFAULT_VALUE @@ -28,11 +27,9 @@ import org.oppia.android.util.platformparameter.ENABLE_TOPIC_INFO_TAB import org.oppia.android.util.platformparameter.ENABLE_TOPIC_INFO_TAB_DEFAULT_VALUE import org.oppia.android.util.platformparameter.ENABLE_TOPIC_PRACTICE_TAB import org.oppia.android.util.platformparameter.ENABLE_TOPIC_PRACTICE_TAB_DEFAULT_VALUE -import org.oppia.android.util.platformparameter.EXTRA_TOPIC_TABS_UI import org.oppia.android.util.platformparameter.EnableAppAndOsDeprecation import org.oppia.android.util.platformparameter.EnableDownloadsSupport import org.oppia.android.util.platformparameter.EnableEditAccountsOptionsUi -import org.oppia.android.util.platformparameter.EnableExtraTopicTabsUi import org.oppia.android.util.platformparameter.EnableFastLanguageSwitchingInLesson import org.oppia.android.util.platformparameter.EnableInteractionConfigChangeStateRetention import org.oppia.android.util.platformparameter.EnableLearnerStudyAnalytics @@ -223,18 +220,6 @@ class PlatformParameterModule { ?: PlatformParameterValue.createDefaultParameter(ENABLE_SPOTLIGHT_UI_DEFAULT_VALUE) } - @Provides - @EnableExtraTopicTabsUi - fun provideEnableExtraTopicTabsUi( - platformParameterSingleton: PlatformParameterSingleton - ): PlatformParameterValue { - return platformParameterSingleton.getBooleanPlatformParameter( - EXTRA_TOPIC_TABS_UI - ) ?: PlatformParameterValue.createDefaultParameter( - ENABLE_EXTRA_TOPIC_TABS_UI_DEFAULT_VALUE - ) - } - @Provides @EnableInteractionConfigChangeStateRetention fun provideEnableInteractionConfigChangeStateRetention( diff --git a/domain/src/test/java/org/oppia/android/domain/oppialogger/analytics/FeatureFlagsLoggerTest.kt b/domain/src/test/java/org/oppia/android/domain/oppialogger/analytics/FeatureFlagsLoggerTest.kt index 73abeb09be5..43be765930a 100644 --- a/domain/src/test/java/org/oppia/android/domain/oppialogger/analytics/FeatureFlagsLoggerTest.kt +++ b/domain/src/test/java/org/oppia/android/domain/oppialogger/analytics/FeatureFlagsLoggerTest.kt @@ -50,7 +50,8 @@ import org.oppia.android.util.platformparameter.ENABLE_MULTIPLE_CLASSROOMS import org.oppia.android.util.platformparameter.ENABLE_NPS_SURVEY import org.oppia.android.util.platformparameter.ENABLE_ONBOARDING_FLOW_V2 import org.oppia.android.util.platformparameter.ENABLE_PERFORMANCE_METRICS_COLLECTION -import org.oppia.android.util.platformparameter.EXTRA_TOPIC_TABS_UI +import org.oppia.android.util.platformparameter.ENABLE_TOPIC_INFO_TAB +import org.oppia.android.util.platformparameter.ENABLE_TOPIC_PRACTICE_TAB import org.oppia.android.util.platformparameter.FAST_LANGUAGE_SWITCHING_IN_LESSON import org.oppia.android.util.platformparameter.INTERACTION_CONFIG_CHANGE_STATE_RETENTION import org.oppia.android.util.platformparameter.LEARNER_STUDY_ANALYTICS @@ -166,7 +167,6 @@ class FeatureFlagsLoggerTest { @Test @Iteration("downloads_support", "index=0", "flagName=$DOWNLOADS_SUPPORT") - @Iteration("extra_topic_tabs_ui", "index=1", "flagName=$EXTRA_TOPIC_TABS_UI") @Iteration("learner_study_analytics", "index=2", "flagName=$LEARNER_STUDY_ANALYTICS") @Iteration( "fast_language_switching_in_lesson", "index=3", @@ -187,6 +187,8 @@ class FeatureFlagsLoggerTest { @Iteration("enable_nps_survey", "index=10", "flagName=$ENABLE_NPS_SURVEY") @Iteration("enable_onboarding_flow_v2", "index=11", "flagName=$ENABLE_ONBOARDING_FLOW_V2") @Iteration("enable_multiple_classrooms", "index=12", "flagName=$ENABLE_MULTIPLE_CLASSROOMS") + @Iteration("extra_topic_info_tab", "index=1", "flagName=$ENABLE_TOPIC_INFO_TAB") + @Iteration("enable_topic_practice_tab", "index=1", "flagName=$ENABLE_TOPIC_PRACTICE_TAB") fun testLogFeatureFlags_allFeatureFlagNamesAreLogged() { featureFlagsLogger.logAllFeatureFlags(TEST_SESSION_ID) diff --git a/testing/src/main/java/org/oppia/android/testing/platformparameter/TestPlatformParameterModule.kt b/testing/src/main/java/org/oppia/android/testing/platformparameter/TestPlatformParameterModule.kt index 1be714df544..8217764a72f 100644 --- a/testing/src/main/java/org/oppia/android/testing/platformparameter/TestPlatformParameterModule.kt +++ b/testing/src/main/java/org/oppia/android/testing/platformparameter/TestPlatformParameterModule.kt @@ -14,16 +14,16 @@ import org.oppia.android.util.platformparameter.DOWNLOADS_SUPPORT import org.oppia.android.util.platformparameter.ENABLE_APP_AND_OS_DEPRECATION_DEFAULT_VALUE import org.oppia.android.util.platformparameter.ENABLE_DOWNLOADS_SUPPORT_DEFAULT_VALUE import org.oppia.android.util.platformparameter.ENABLE_EDIT_ACCOUNTS_OPTIONS_UI_DEFAULT_VALUE -import org.oppia.android.util.platformparameter.ENABLE_EXTRA_TOPIC_TABS_UI_DEFAULT_VALUE import org.oppia.android.util.platformparameter.ENABLE_INTERACTION_CONFIG_CHANGE_STATE_RETENTION_DEFAULT_VALUE import org.oppia.android.util.platformparameter.ENABLE_MULTIPLE_CLASSROOMS_DEFAULT_VALUE import org.oppia.android.util.platformparameter.ENABLE_NPS_SURVEY_DEFAULT_VALUE import org.oppia.android.util.platformparameter.ENABLE_ONBOARDING_FLOW_V2_DEFAULT_VALUE import org.oppia.android.util.platformparameter.ENABLE_PERFORMANCE_METRICS_COLLECTION_DEFAULT_VALUE +import org.oppia.android.util.platformparameter.ENABLE_TOPIC_INFO_TAB_DEFAULT_VALUE +import org.oppia.android.util.platformparameter.ENABLE_TOPIC_PRACTICE_TAB_DEFAULT_VALUE import org.oppia.android.util.platformparameter.EnableAppAndOsDeprecation import org.oppia.android.util.platformparameter.EnableDownloadsSupport import org.oppia.android.util.platformparameter.EnableEditAccountsOptionsUi -import org.oppia.android.util.platformparameter.EnableExtraTopicTabsUi import org.oppia.android.util.platformparameter.EnableFastLanguageSwitchingInLesson import org.oppia.android.util.platformparameter.EnableInteractionConfigChangeStateRetention import org.oppia.android.util.platformparameter.EnableLearnerStudyAnalytics @@ -33,6 +33,8 @@ import org.oppia.android.util.platformparameter.EnableNpsSurvey import org.oppia.android.util.platformparameter.EnableOnboardingFlowV2 import org.oppia.android.util.platformparameter.EnablePerformanceMetricsCollection import org.oppia.android.util.platformparameter.EnableSpotlightUi +import org.oppia.android.util.platformparameter.EnableTopicInfoTab +import org.oppia.android.util.platformparameter.EnableTopicPracticeTab import org.oppia.android.util.platformparameter.FAST_LANGUAGE_SWITCHING_IN_LESSON_DEFAULT_VALUE import org.oppia.android.util.platformparameter.FORCED_APP_UPDATE_VERSION_CODE import org.oppia.android.util.platformparameter.ForcedAppUpdateVersionCode @@ -65,10 +67,6 @@ import org.oppia.android.util.platformparameter.SYNC_UP_WORKER_TIME_PERIOD_IN_HO import org.oppia.android.util.platformparameter.SplashScreenWelcomeMsg import org.oppia.android.util.platformparameter.SyncUpWorkerTimePeriodHours import javax.inject.Singleton -import org.oppia.android.util.platformparameter.ENABLE_TOPIC_INFO_TAB_DEFAULT_VALUE -import org.oppia.android.util.platformparameter.ENABLE_TOPIC_PRACTICE_TAB_DEFAULT_VALUE -import org.oppia.android.util.platformparameter.EnableTopicInfoTab -import org.oppia.android.util.platformparameter.EnableTopicPracticeTab /* Fake Platform Parameter Module that provides individual Platform Parameters for testing. */ @Module @@ -227,11 +225,6 @@ class TestPlatformParameterModule { ) } - @Provides - @EnableExtraTopicTabsUi - fun provideEnableExtraTopicTabsUi(): PlatformParameterValue = - PlatformParameterValue.createDefaultParameter(enableExtraTopicTabsUi) - @Provides @EnableInteractionConfigChangeStateRetention fun provideEnableInteractionConfigChangeStateRetention(): PlatformParameterValue = @@ -459,7 +452,6 @@ class TestPlatformParameterModule { enableLearnerStudyAnalytics = LEARNER_STUDY_ANALYTICS_DEFAULT_VALUE enableFastLanguageSwitchingInLesson = FAST_LANGUAGE_SWITCHING_IN_LESSON_DEFAULT_VALUE enableLoggingLearnerStudyIds = LOGGING_LEARNER_STUDY_IDS_DEFAULT_VALUE - enableExtraTopicTabsUi = ENABLE_EXTRA_TOPIC_TABS_UI_DEFAULT_VALUE enableInteractionConfigChangeStateRetention = ENABLE_INTERACTION_CONFIG_CHANGE_STATE_RETENTION_DEFAULT_VALUE enablePerformanceMetricsCollection = ENABLE_PERFORMANCE_METRICS_COLLECTION_DEFAULT_VALUE diff --git a/utility/src/main/java/org/oppia/android/util/platformparameter/FeatureFlagConstants.kt b/utility/src/main/java/org/oppia/android/util/platformparameter/FeatureFlagConstants.kt index dae5bec994d..6d071287caa 100644 --- a/utility/src/main/java/org/oppia/android/util/platformparameter/FeatureFlagConstants.kt +++ b/utility/src/main/java/org/oppia/android/util/platformparameter/FeatureFlagConstants.kt @@ -24,18 +24,6 @@ const val DOWNLOADS_SUPPORT = "android_enable_downloads_support" /** Default value for feature flag corresponding to [EnableDownloadsSupport]. */ const val ENABLE_DOWNLOADS_SUPPORT_DEFAULT_VALUE = false -/** - * Qualifier for the feature flag corresponding to enabling the extra topic tabs: practice and info. - */ -@Qualifier -annotation class EnableExtraTopicTabsUi - -/** Name of the feature flag that controls whether to enable the extra topics tab UI. */ -const val EXTRA_TOPIC_TABS_UI = "android_enable_extra_topic_tabs_ui" - -/** Default value for the feature flag corresponding to [EnableExtraTopicTabsUi]. */ -const val ENABLE_EXTRA_TOPIC_TABS_UI_DEFAULT_VALUE = false - /** * Qualifier for the feature flag that controls the visibility of [ProfileAndDeviceIdActivity] * and working of learner study related analytics logging. From 19b6bb7e94be713c4b03a53ca434ef3286a844d8 Mon Sep 17 00:00:00 2001 From: Saptak Manna Date: Sun, 2 Mar 2025 14:16:43 +0530 Subject: [PATCH 06/36] Fix index of featureFlagItemMap in test --- .../analytics/FeatureFlagsLoggerTest.kt | 26 +++++++++---------- 1 file changed, 13 insertions(+), 13 deletions(-) diff --git a/domain/src/test/java/org/oppia/android/domain/oppialogger/analytics/FeatureFlagsLoggerTest.kt b/domain/src/test/java/org/oppia/android/domain/oppialogger/analytics/FeatureFlagsLoggerTest.kt index 43be765930a..c7c2ca006b0 100644 --- a/domain/src/test/java/org/oppia/android/domain/oppialogger/analytics/FeatureFlagsLoggerTest.kt +++ b/domain/src/test/java/org/oppia/android/domain/oppialogger/analytics/FeatureFlagsLoggerTest.kt @@ -167,28 +167,28 @@ class FeatureFlagsLoggerTest { @Test @Iteration("downloads_support", "index=0", "flagName=$DOWNLOADS_SUPPORT") - @Iteration("learner_study_analytics", "index=2", "flagName=$LEARNER_STUDY_ANALYTICS") + @Iteration("learner_study_analytics", "index=1", "flagName=$LEARNER_STUDY_ANALYTICS") @Iteration( - "fast_language_switching_in_lesson", "index=3", + "fast_language_switching_in_lesson", "index=2", "flagName=$FAST_LANGUAGE_SWITCHING_IN_LESSON" ) - @Iteration("logging_learner_study_ids", "index=4", "flagName=$LOGGING_LEARNER_STUDY_IDS") - @Iteration("edit_accounts_options_ui", "index=5", "flagName=$EDIT_ACCOUNTS_OPTIONS_UI") + @Iteration("logging_learner_study_ids", "index=3", "flagName=$LOGGING_LEARNER_STUDY_IDS") + @Iteration("edit_accounts_options_ui", "index=4", "flagName=$EDIT_ACCOUNTS_OPTIONS_UI") @Iteration( - "enable_performance_metrics_collection", "index=6", + "enable_performance_metrics_collection", "index=5", "flagName=$ENABLE_PERFORMANCE_METRICS_COLLECTION" ) - @Iteration("spotlight_ui", "index=7", "flagName=$SPOTLIGHT_UI") + @Iteration("spotlight_ui", "index=6", "flagName=$SPOTLIGHT_UI") @Iteration( - "interaction_config_change_state_retention", "index=8", + "interaction_config_change_state_retention", "index=7", "flagName=$INTERACTION_CONFIG_CHANGE_STATE_RETENTION" ) - @Iteration("app_and_os_deprecation", "index=9", "flagName=$APP_AND_OS_DEPRECATION") - @Iteration("enable_nps_survey", "index=10", "flagName=$ENABLE_NPS_SURVEY") - @Iteration("enable_onboarding_flow_v2", "index=11", "flagName=$ENABLE_ONBOARDING_FLOW_V2") - @Iteration("enable_multiple_classrooms", "index=12", "flagName=$ENABLE_MULTIPLE_CLASSROOMS") - @Iteration("extra_topic_info_tab", "index=1", "flagName=$ENABLE_TOPIC_INFO_TAB") - @Iteration("enable_topic_practice_tab", "index=1", "flagName=$ENABLE_TOPIC_PRACTICE_TAB") + @Iteration("app_and_os_deprecation", "index=8", "flagName=$APP_AND_OS_DEPRECATION") + @Iteration("enable_nps_survey", "index=9", "flagName=$ENABLE_NPS_SURVEY") + @Iteration("enable_onboarding_flow_v2", "index=10", "flagName=$ENABLE_ONBOARDING_FLOW_V2") + @Iteration("enable_multiple_classrooms", "index=11", "flagName=$ENABLE_MULTIPLE_CLASSROOMS") + @Iteration("extra_topic_info_tab", "index=12", "flagName=$ENABLE_TOPIC_INFO_TAB") + @Iteration("enable_topic_practice_tab", "index=13", "flagName=$ENABLE_TOPIC_PRACTICE_TAB") fun testLogFeatureFlags_allFeatureFlagNamesAreLogged() { featureFlagsLogger.logAllFeatureFlags(TEST_SESSION_ID) From e1cf4769a14fd80648e945422f15256ac2003dfe Mon Sep 17 00:00:00 2001 From: Saptak Manna Date: Sun, 2 Mar 2025 14:20:34 +0530 Subject: [PATCH 07/36] Fix lint tests --- .../oppia/android/app/topic/TopicFragmentPresenter.kt | 4 ++-- .../java/org/oppia/android/app/topic/ViewPagerAdapter.kt | 3 ++- .../platformparameter/TestPlatformParameterModule.kt | 9 ++------- 3 files changed, 6 insertions(+), 10 deletions(-) diff --git a/app/src/main/java/org/oppia/android/app/topic/TopicFragmentPresenter.kt b/app/src/main/java/org/oppia/android/app/topic/TopicFragmentPresenter.kt index 71e24301ce6..cd0f0a37a8b 100644 --- a/app/src/main/java/org/oppia/android/app/topic/TopicFragmentPresenter.kt +++ b/app/src/main/java/org/oppia/android/app/topic/TopicFragmentPresenter.kt @@ -21,10 +21,10 @@ import org.oppia.android.databinding.TopicFragmentBinding import org.oppia.android.domain.oppialogger.OppiaLogger import org.oppia.android.domain.oppialogger.analytics.AnalyticsController import org.oppia.android.util.accessibility.AccessibilityService -import org.oppia.android.util.platformparameter.PlatformParameterValue -import javax.inject.Inject import org.oppia.android.util.platformparameter.EnableTopicInfoTab import org.oppia.android.util.platformparameter.EnableTopicPracticeTab +import org.oppia.android.util.platformparameter.PlatformParameterValue +import javax.inject.Inject /** The presenter for [TopicFragment]. */ @FragmentScope diff --git a/app/src/main/java/org/oppia/android/app/topic/ViewPagerAdapter.kt b/app/src/main/java/org/oppia/android/app/topic/ViewPagerAdapter.kt index 15456873cbb..ab5fd5ab4d4 100644 --- a/app/src/main/java/org/oppia/android/app/topic/ViewPagerAdapter.kt +++ b/app/src/main/java/org/oppia/android/app/topic/ViewPagerAdapter.kt @@ -19,7 +19,8 @@ class ViewPagerAdapter( private val enableTopicPracticeTab: Boolean ) : FragmentStateAdapter(fragment) { - override fun getItemCount(): Int = TopicTab.getTabCount(enableTopicInfoTab, enableTopicPracticeTab) + override fun getItemCount(): Int = + TopicTab.getTabCount(enableTopicInfoTab, enableTopicPracticeTab) override fun createFragment(position: Int): Fragment { return when (TopicTab.getTabForPosition(position, enableTopicInfoTab, enableTopicPracticeTab)) { diff --git a/testing/src/main/java/org/oppia/android/testing/platformparameter/TestPlatformParameterModule.kt b/testing/src/main/java/org/oppia/android/testing/platformparameter/TestPlatformParameterModule.kt index 8217764a72f..fc5a0a59be1 100644 --- a/testing/src/main/java/org/oppia/android/testing/platformparameter/TestPlatformParameterModule.kt +++ b/testing/src/main/java/org/oppia/android/testing/platformparameter/TestPlatformParameterModule.kt @@ -340,7 +340,6 @@ class TestPlatformParameterModule { private var enableFastLanguageSwitchingInLesson = FAST_LANGUAGE_SWITCHING_IN_LESSON_DEFAULT_VALUE private var enableLoggingLearnerStudyIds = LOGGING_LEARNER_STUDY_IDS_DEFAULT_VALUE - private var enableExtraTopicTabsUi = ENABLE_EXTRA_TOPIC_TABS_UI_DEFAULT_VALUE private var enableInteractionConfigChangeStateRetention = ENABLE_INTERACTION_CONFIG_CHANGE_STATE_RETENTION_DEFAULT_VALUE private var enablePerformanceMetricsCollection = @@ -385,12 +384,6 @@ class TestPlatformParameterModule { enableLoggingLearnerStudyIds = value } - /** Enables forcing [EnableExtraTopicTabsUi] platform parameter flag from tests. */ - @VisibleForTesting(otherwise = VisibleForTesting.NONE) - fun forceEnableExtraTopicTabsUi(value: Boolean) { - enableExtraTopicTabsUi = value - } - /** Enables forcing [EnableInteractionConfigChangeStateRetention] platform parameter flag from tests. */ @VisibleForTesting(otherwise = VisibleForTesting.NONE) fun forceEnableInteractionConfigChangeStateRetention(value: Boolean) { @@ -458,6 +451,8 @@ class TestPlatformParameterModule { enableAppAndOsDeprecation = ENABLE_APP_AND_OS_DEPRECATION_DEFAULT_VALUE enableOnboardingFlowV2 = ENABLE_ONBOARDING_FLOW_V2_DEFAULT_VALUE enableMultipleClassrooms = ENABLE_MULTIPLE_CLASSROOMS_DEFAULT_VALUE + enableTopicInfoTab = ENABLE_TOPIC_INFO_TAB_DEFAULT_VALUE + enableTopicPracticeTab = ENABLE_TOPIC_PRACTICE_TAB_DEFAULT_VALUE } } } From 4c35b713fcacec3255396153e817123b9376cf9c Mon Sep 17 00:00:00 2001 From: Saptak Manna Date: Sun, 2 Mar 2025 14:55:08 +0530 Subject: [PATCH 08/36] Fix tests --- .../android/app/topic/TopicFragmentTest.kt | 135 +++++++++++------- .../TestPlatformParameterModule.kt | 8 +- 2 files changed, 85 insertions(+), 58 deletions(-) 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 3d2ed2bb238..1f5258fac49 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 @@ -119,7 +119,8 @@ import org.oppia.android.util.networking.NetworkConnectionUtilDebugModule import org.oppia.android.util.parser.html.HtmlParserEntityTypeModule import org.oppia.android.util.parser.image.GlideImageLoaderModule import org.oppia.android.util.parser.image.ImageParsingModule -import org.oppia.android.util.platformparameter.EnableExtraTopicTabsUi +import org.oppia.android.util.platformparameter.EnableTopicInfoTab +import org.oppia.android.util.platformparameter.EnableTopicPracticeTab import org.oppia.android.util.platformparameter.PlatformParameterValue import org.robolectric.annotation.Config import org.robolectric.annotation.LooperMode @@ -174,8 +175,11 @@ class TopicFragmentTest { @Inject lateinit var fakeAccessibilityService: FakeAccessibilityService - @field:[Inject EnableExtraTopicTabsUi] - lateinit var enableExtraTopicTabsUi: PlatformParameterValue + @field:[Inject EnableTopicInfoTab] + lateinit var enableTopicInfoTab: PlatformParameterValue + + @field:[Inject EnableTopicPracticeTab] + lateinit var enableTopicPracticeTab: PlatformParameterValue private val profileId = ProfileId.newBuilder().setInternalId(0).build() private val TOPIC_NAME = "Fractions" @@ -194,7 +198,7 @@ class TopicFragmentTest { @Test fun testTopicFragment_toolbarTitle_isDisplayedSuccessfully() { - initializeApplicationComponent(enableExtraTabsUi = false) + initializeApplicationComponent(enableTopicInfoTab = false, enableTopicPracticeTab = false) launchTopicActivityIntent( profileId, TEST_CLASSROOM_ID_1, FRACTIONS_TOPIC_ID ).use { @@ -205,7 +209,7 @@ class TopicFragmentTest { @Test fun testLessonsTabSpotlight_spotlightAlreadySeen_checkSpotlightNotShown() { - initializeApplicationComponent(false) + initializeApplicationComponent(enableTopicInfoTab = false, enableTopicPracticeTab = false) markSpotlightSeen(FIRST_CHAPTER) launch( createTopicActivityIntent( @@ -229,7 +233,7 @@ class TopicFragmentTest { @Test fun testTopicLessonTabSpotlight_spotlightNotSeenBefore_checkSpotlightIsShown() { - initializeApplicationComponent(false) + initializeApplicationComponent(enableTopicInfoTab = false, enableTopicPracticeTab = false) activityTestRule.launchActivity( createTopicActivityIntent( profileId, @@ -243,7 +247,7 @@ class TopicFragmentTest { @Test fun testFirstChapterSpotlight_setToShowOnFirstLogin_checkSpotlightShown() { - initializeApplicationComponent(false) + initializeApplicationComponent(enableTopicInfoTab = false, enableTopicPracticeTab = false) markSpotlightSeen(TOPIC_LESSON_TAB) activityTestRule.launchActivity( createTopicPlayStoryActivityIntent( @@ -259,7 +263,7 @@ class TopicFragmentTest { @Test fun testFirstChapterSpotlight_setToShowOnFirstLogin_alreadySeen_checkSpotlightNotShown() { - initializeApplicationComponent(false) + initializeApplicationComponent(enableTopicInfoTab = false, enableTopicPracticeTab = false) launch( createTopicPlayStoryActivityIntent( profileId, @@ -290,7 +294,7 @@ class TopicFragmentTest { @Test fun testRevisionTabSpotlight_setToShowAfterAtleast3ChaptersCompleted_notSeenBefore_checkShown() { - initializeApplicationComponent(false) + initializeApplicationComponent(enableTopicInfoTab = false, enableTopicPracticeTab = false) markSpotlightSeen(FIRST_CHAPTER) markSpotlightSeen(TOPIC_LESSON_TAB) storyProgressTestHelper.markCompletedFractionsStory0Exp0(profileId, false) @@ -310,7 +314,7 @@ class TopicFragmentTest { @Test fun testRevisionTabSpotlight_setToShowAfterAtleast3ChaptersCompleted_notComplete_checkNotShown() { - initializeApplicationComponent(false) + initializeApplicationComponent(enableTopicInfoTab = false, enableTopicPracticeTab = false) markSpotlightSeen(TOPIC_LESSON_TAB) markSpotlightSeen(FIRST_CHAPTER) launch( @@ -325,7 +329,7 @@ class TopicFragmentTest { @Test fun testRevisionTabSpotlight_setToShowAfterAtleast3ChaptersCompleted_alreadySeen_checkNotShown() { - initializeApplicationComponent(false) + initializeApplicationComponent(enableTopicInfoTab = false, enableTopicPracticeTab = false) markSpotlightSeen(TOPIC_LESSON_TAB) markSpotlightSeen(FIRST_CHAPTER) fakeOppiaClock.setFakeTimeMode(FakeOppiaClock.FakeTimeMode.MODE_UPTIME_MILLIS) @@ -354,7 +358,7 @@ class TopicFragmentTest { @Test fun testTopicFragment_toolbarTitle_readerOff_marqueeInRtl_isDisplayedCorrectly() { - initializeApplicationComponent(false) + initializeApplicationComponent(enableTopicInfoTab = false, enableTopicPracticeTab = false) markSpotlightSeen(TOPIC_LESSON_TAB) fakeAccessibilityService.setScreenReaderEnabled(false) activityTestRule.launchActivity( @@ -377,7 +381,7 @@ class TopicFragmentTest { @Test fun testTopicFragment_toolbarTitle_readerOn_marqueeInRtl_isDisplayedCorrectly() { - initializeApplicationComponent(false) + initializeApplicationComponent(enableTopicInfoTab = false, enableTopicPracticeTab = false) markSpotlightSeen(TOPIC_LESSON_TAB) fakeAccessibilityService.setScreenReaderEnabled(true) activityTestRule.launchActivity( @@ -400,7 +404,7 @@ class TopicFragmentTest { @Test fun testTopicFragment_toolbarTitle_readerOff_marqueeInLtr_isDisplayedCorrectly() { - initializeApplicationComponent(false) + initializeApplicationComponent(enableTopicInfoTab = false, enableTopicPracticeTab = false) markSpotlightSeen(TOPIC_LESSON_TAB) fakeAccessibilityService.setScreenReaderEnabled(false) activityTestRule.launchActivity( @@ -422,7 +426,7 @@ class TopicFragmentTest { @Test fun testTopicFragment_toolbarTitle_readerOn_marqueeInLtr_isDisplayedCorrectly() { - initializeApplicationComponent(false) + initializeApplicationComponent(enableTopicInfoTab = false, enableTopicPracticeTab = false) markSpotlightSeen(TOPIC_LESSON_TAB) fakeAccessibilityService.setScreenReaderEnabled(true) activityTestRule.launchActivity( @@ -444,7 +448,7 @@ class TopicFragmentTest { @Test fun testTopicFragment_clickOnToolbarNavigationButton_closeActivity() { - initializeApplicationComponent(false) + initializeApplicationComponent(enableTopicInfoTab = false, enableTopicPracticeTab = false) activityTestRule.launchActivity( createTopicActivityIntent( profileId, @@ -458,7 +462,7 @@ class TopicFragmentTest { @Test fun testTopicFragment_showsTopicFragmentWithMultipleTabs() { - initializeApplicationComponent(enableExtraTabsUi = false) + initializeApplicationComponent(enableTopicInfoTab = false, enableTopicPracticeTab = false) launchTopicActivityIntent(profileId, TEST_CLASSROOM_ID_1, FRACTIONS_TOPIC_ID).use { onView(withId(R.id.topic_tabs_container)).perform(click()).check(matches(isDisplayed())) } @@ -466,7 +470,7 @@ class TopicFragmentTest { @Test fun testTopicFragment_swipePage_hasSwipedPage() { - initializeApplicationComponent(enableExtraTabsUi = false) + initializeApplicationComponent(enableTopicInfoTab = false, enableTopicPracticeTab = false) launchTopicActivityIntent(profileId, TEST_CLASSROOM_ID_1, FRACTIONS_TOPIC_ID).use { onView(withId(R.id.topic_tabs_viewpager)).check(matches(isDisplayed())) onView(withId(R.id.topic_tabs_viewpager)).perform(swipeLeft()) @@ -476,13 +480,14 @@ class TopicFragmentTest { @Test fun testTopicFragment_enableExtraTabs_infoTopicTab_isDisplayedInTabLayout() { - initializeApplicationComponent(enableExtraTabsUi = true) + initializeApplicationComponent(enableTopicInfoTab = true, enableTopicPracticeTab = false) launchTopicActivityIntent(profileId, TEST_CLASSROOM_ID_1, FRACTIONS_TOPIC_ID).use { onView( withText( TopicTab.getTabForPosition( position = INFO_TAB_POSITION, - enableExtraTopicTabsUi.value + enableTopicInfoTab.value, + enableTopicPracticeTab.value ).name ) ).check(matches(isDescendantOfA(withId(R.id.topic_tabs_container)))) @@ -491,7 +496,7 @@ class TopicFragmentTest { @Test fun testTopicFragment_disableExtraTabs_infoTopicTab_isNotDisplayedInTabLayout() { - initializeApplicationComponent(enableExtraTabsUi = false) + initializeApplicationComponent(enableTopicInfoTab = false, enableTopicPracticeTab = false) launchTopicActivityIntent(profileId, TEST_CLASSROOM_ID_1, FRACTIONS_TOPIC_ID).use { onView(withText(TopicTab.getTabForPosition(position = INFO_TAB_POSITION, true).name)) .check(doesNotExist()) @@ -500,7 +505,7 @@ class TopicFragmentTest { @Test fun testTopicFragment_disableExtraTabs_defaultTabIsLessons() { - initializeApplicationComponent(enableExtraTabsUi = false) + initializeApplicationComponent(enableTopicInfoTab = false, enableTopicPracticeTab = false) launchTopicPlayStoryActivityIntent( profileId, TEST_CLASSROOM_ID_1, @@ -513,7 +518,7 @@ class TopicFragmentTest { @Test fun testTopicFragment_enableExtraTabs_defaultTabIsLessons() { - initializeApplicationComponent(enableExtraTabsUi = true) + initializeApplicationComponent(enableTopicInfoTab = true, enableTopicPracticeTab = true) launchTopicPlayStoryActivityIntent( profileId, TEST_CLASSROOM_ID_1, @@ -526,7 +531,7 @@ class TopicFragmentTest { @Test fun testTopicFragment_disableExtraTabs_clickOnLessonsTab_showsPlayTabSelected() { - initializeApplicationComponent(enableExtraTabsUi = false) + initializeApplicationComponent(enableTopicInfoTab = false, enableTopicPracticeTab = false) launchTopicActivityIntent(profileId, TEST_CLASSROOM_ID_1, FRACTIONS_TOPIC_ID).use { clickTabAtPosition(position = LESSON_TAB_POSITION_EXTRA_TABS_DISABLED) verifyTabTitleAtPosition(position = LESSON_TAB_POSITION_EXTRA_TABS_DISABLED) @@ -535,7 +540,7 @@ class TopicFragmentTest { @Test fun testTopicFragment_clickOnLessonsTab_showsPlayTabWithContentMatched() { - initializeApplicationComponent(enableExtraTabsUi = true) + initializeApplicationComponent(enableTopicInfoTab = false, enableTopicPracticeTab = false) markAllSpotlightsSeen() launchTopicActivityIntent(profileId, TEST_CLASSROOM_ID_1, FRACTIONS_TOPIC_ID).use { testCoroutineDispatchers.runCurrent() @@ -552,10 +557,14 @@ class TopicFragmentTest { @Test fun testTopicFragment_practiceTabEnabled_practiceTopicTabIsDisplayedInTabLayout() { - initializeApplicationComponent(enableExtraTabsUi = true) + initializeApplicationComponent(enableTopicInfoTab = false, enableTopicPracticeTab = true) launchTopicActivityIntent(profileId, TEST_CLASSROOM_ID_1, FRACTIONS_TOPIC_ID).use { val practiceTab = - TopicTab.getTabForPosition(position = PRACTICE_TAB_POSITION, enableExtraTopicTabsUi.value) + TopicTab.getTabForPosition( + position = PRACTICE_TAB_POSITION, + enableTopicInfoTab.value, + enableTopicPracticeTab.value + ) onView(withText(practiceTab.name)).check( matches( isDescendantOfA( @@ -570,19 +579,23 @@ class TopicFragmentTest { @Test fun testTopicFragment_disableExtraTabs_practiceTopicTabIsNotDisplayedInTabLayout() { - initializeApplicationComponent(enableExtraTabsUi = false) + initializeApplicationComponent(enableTopicInfoTab = false, enableTopicPracticeTab = false) launchTopicActivityIntent(profileId, TEST_CLASSROOM_ID_1, FRACTIONS_TOPIC_ID).use { // Unconditionally retrieve the practice tab name since this test is verifying that it's not // enabled. val practiceTab = - TopicTab.getTabForPosition(position = PRACTICE_TAB_POSITION, enableExtraTopicTabsUi = true) + TopicTab.getTabForPosition( + position = PRACTICE_TAB_POSITION, + enableTopicInfoTab = false, + enableTopicPracticeTab = true + ) onView(withText(practiceTab.name)).check(doesNotExist()) } } @Test fun testTopicFragment_disableExtraTabs_configChange_practiceTopicTabIsNotDisplayed() { - initializeApplicationComponent(enableExtraTabsUi = false) + initializeApplicationComponent(enableTopicInfoTab = false, enableTopicPracticeTab = false) launchTopicActivityIntent(profileId, TEST_CLASSROOM_ID_1, FRACTIONS_TOPIC_ID).use { onView(isRoot()).perform(orientationLandscape()) testCoroutineDispatchers.runCurrent() @@ -590,7 +603,11 @@ class TopicFragmentTest { // Unconditionally retrieve the practice tab name since this test is verifying that it's not // enabled. val practiceTab = - TopicTab.getTabForPosition(position = PRACTICE_TAB_POSITION, enableExtraTopicTabsUi = true) + TopicTab.getTabForPosition( + position = PRACTICE_TAB_POSITION, + enableTopicInfoTab = false, + enableTopicPracticeTab = true + ) // The tab should still not be visible even after a configuration change. onView(withText(practiceTab.name)).check(doesNotExist()) } @@ -598,7 +615,7 @@ class TopicFragmentTest { @Test fun testTopicFragment_enableExtraTabs_clickOnPracticeTab_showsPracticeTabSelected() { - initializeApplicationComponent(enableExtraTabsUi = true) + initializeApplicationComponent(enableTopicInfoTab = false, enableTopicPracticeTab = true) launchTopicActivityIntent(profileId, TEST_CLASSROOM_ID_1, FRACTIONS_TOPIC_ID).use { clickTabAtPosition(position = PRACTICE_TAB_POSITION) verifyTabTitleAtPosition(position = PRACTICE_TAB_POSITION) @@ -607,7 +624,7 @@ class TopicFragmentTest { @Test fun testTopicFragment_enableExtraTabs_clickOnPracticeTab_showsPracticeTabWithContentMatched() { - initializeApplicationComponent(enableExtraTabsUi = true) + initializeApplicationComponent(enableTopicInfoTab = false, enableTopicPracticeTab = true) markAllSpotlightsSeen() launchTopicActivityIntent(profileId, TEST_CLASSROOM_ID_1, FRACTIONS_TOPIC_ID).use { testCoroutineDispatchers.runCurrent() @@ -624,7 +641,7 @@ class TopicFragmentTest { @Test fun testTopicFragment_clickOnReviewTab_showsReviewTabSelected() { - initializeApplicationComponent(enableExtraTabsUi = false) + initializeApplicationComponent(enableTopicInfoTab = false, enableTopicPracticeTab = false) launchTopicActivityIntent(profileId, TEST_CLASSROOM_ID_1, FRACTIONS_TOPIC_ID).use { clickTabAtPosition(position = REVISION_TAB_POSITION_EXTRA_TABS_DISABLED) verifyTabTitleAtPosition(position = REVISION_TAB_POSITION_EXTRA_TABS_DISABLED) @@ -633,7 +650,7 @@ class TopicFragmentTest { @Test fun testTopicFragment_clickOnReviewTab_showsReviewTabWithContentMatched() { - initializeApplicationComponent(enableExtraTabsUi = false) + initializeApplicationComponent(enableTopicInfoTab = false, enableTopicPracticeTab = false) markAllSpotlightsSeen() launchTopicActivityIntent(profileId, TEST_CLASSROOM_ID_1, FRACTIONS_TOPIC_ID).use { testCoroutineDispatchers.runCurrent() @@ -650,7 +667,7 @@ class TopicFragmentTest { @Test fun testTopicFragment_enableExtraTabs_clickOnReviewTab_thenInfoTab_showsInfoTab() { - initializeApplicationComponent(enableExtraTabsUi = true) + initializeApplicationComponent(enableTopicInfoTab = true, enableTopicPracticeTab = false) launchTopicActivityIntent(profileId, TEST_CLASSROOM_ID_1, FRACTIONS_TOPIC_ID).use { clickTabAtPosition(position = REVISION_TAB_POSITION) clickTabAtPosition(position = INFO_TAB_POSITION) @@ -660,7 +677,7 @@ class TopicFragmentTest { @Test fun enableExtraTabs_clickOnReviewTab_thenInfoTab_showsInfoTabWithContentMatched() { - initializeApplicationComponent(enableExtraTabsUi = true) + initializeApplicationComponent(enableTopicInfoTab = true, enableTopicPracticeTab = false) launchTopicActivityIntent(profileId, TEST_CLASSROOM_ID_1, FRACTIONS_TOPIC_ID).use { testCoroutineDispatchers.runCurrent() clickTabAtPosition(position = REVISION_TAB_POSITION) @@ -677,7 +694,7 @@ class TopicFragmentTest { @Test fun testTopicFragment_clickOnLessonsTab_configChange_showsSameTabAndItsContent() { - initializeApplicationComponent(enableExtraTabsUi = false) + initializeApplicationComponent(enableTopicInfoTab = false, enableTopicPracticeTab = false) launchTopicActivityIntent(profileId, TEST_CLASSROOM_ID_1, FRACTIONS_TOPIC_ID).use { testCoroutineDispatchers.runCurrent() clickTabAtPosition(position = LESSON_TAB_POSITION_EXTRA_TABS_DISABLED) @@ -695,7 +712,7 @@ class TopicFragmentTest { @Test fun enableExtraTabs_clickOnPracticeTab_configChange_showsSameTabAndItsContent() { - initializeApplicationComponent(enableExtraTabsUi = true) + initializeApplicationComponent(enableTopicInfoTab = false, enableTopicPracticeTab = true) markAllSpotlightsSeen() launchTopicActivityIntent(profileId, TEST_CLASSROOM_ID_1, FRACTIONS_TOPIC_ID).use { testCoroutineDispatchers.runCurrent() @@ -721,7 +738,7 @@ class TopicFragmentTest { @Test fun testTopicFragment_clickOnReviewTab_configChange_showsSameTabAndItsContent() { - initializeApplicationComponent(enableExtraTabsUi = false) + initializeApplicationComponent(enableTopicInfoTab = false, enableTopicPracticeTab = false) markAllSpotlightsSeen() launchTopicActivityIntent(profileId, TEST_CLASSROOM_ID_1, FRACTIONS_TOPIC_ID).use { testCoroutineDispatchers.runCurrent() @@ -740,7 +757,7 @@ class TopicFragmentTest { @Test fun testTopicFragment_enableExtraTabs_configChange_showsDefaultTabAndItsContent() { - initializeApplicationComponent(enableExtraTabsUi = true) + initializeApplicationComponent(enableTopicInfoTab = true, enableTopicPracticeTab = true) launchTopicPlayStoryActivityIntent( profileId, TEST_CLASSROOM_ID_1, @@ -761,7 +778,7 @@ class TopicFragmentTest { @Test fun testTopicFragment_disableExtraTabs_configChange_showsDefaultTabAndItsContent() { - initializeApplicationComponent(enableExtraTabsUi = false) + initializeApplicationComponent(enableTopicInfoTab = false, enableTopicPracticeTab = false) launchTopicPlayStoryActivityIntent( profileId, TEST_CLASSROOM_ID_1, @@ -782,7 +799,7 @@ class TopicFragmentTest { @Test fun enableExtraTabs_withStoryId_clickOnPracticeTab_configChange_showsSameTabAndItsContent() { - initializeApplicationComponent(enableExtraTabsUi = true) + initializeApplicationComponent(enableTopicInfoTab = false, enableTopicPracticeTab = true) markAllSpotlightsSeen() launchTopicPlayStoryActivityIntent( profileId, @@ -812,7 +829,7 @@ class TopicFragmentTest { @Test fun testOpenFragment_lessonsTabDefaulted_logsLessonsTabOpen() { - initializeApplicationComponent(enableExtraTabsUi = false) + initializeApplicationComponent(enableTopicInfoTab = false, enableTopicPracticeTab = false) markAllSpotlightsSeen() launchTopicPlayStoryActivityIntent( profileId, @@ -829,7 +846,7 @@ class TopicFragmentTest { @Test fun testOpenFragment_lessonsTabDefaulted_switchToRevisionTab_logsRevisionTabOpen() { - initializeApplicationComponent(enableExtraTabsUi = false) + initializeApplicationComponent(enableTopicInfoTab = false, enableTopicPracticeTab = false) markAllSpotlightsSeen() launchTopicPlayStoryActivityIntent( profileId, @@ -849,7 +866,7 @@ class TopicFragmentTest { @Test fun testOpenFragment_lessonsTabDefaulted_switchToRevisionTabThenBack_logsLessonsTabOpenAgain() { - initializeApplicationComponent(enableExtraTabsUi = false) + initializeApplicationComponent(enableTopicInfoTab = false, enableTopicPracticeTab = false) markAllSpotlightsSeen() launchTopicPlayStoryActivityIntent( profileId, @@ -871,7 +888,7 @@ class TopicFragmentTest { @Test fun testOpenFragment_extraTabs_openInfoTab_logsInfoTabOpen() { - initializeApplicationComponent(enableExtraTabsUi = true) + initializeApplicationComponent(enableTopicInfoTab = true, enableTopicPracticeTab = false) markAllSpotlightsSeen() launchTopicPlayStoryActivityIntent( profileId, @@ -891,7 +908,7 @@ class TopicFragmentTest { @Test fun testOpenFragment_extraTabs_openQuestionsTab_logsInfoQuestionsOpen() { - initializeApplicationComponent(enableExtraTabsUi = true) + initializeApplicationComponent(enableTopicInfoTab = false, enableTopicPracticeTab = true) markAllSpotlightsSeen() launchTopicPlayStoryActivityIntent( profileId, @@ -975,7 +992,13 @@ class TopicFragmentTest { private fun clickTabAtPosition(position: Int) { onView( allOf( - withText(TopicTab.getTabForPosition(position, enableExtraTopicTabsUi.value).name), + withText( + TopicTab.getTabForPosition( + position, + enableTopicInfoTab.value, + enableTopicPracticeTab.value + ).name + ), isDescendantOfA(withId(R.id.topic_tabs_container)) ) ).perform(click()) @@ -985,7 +1008,11 @@ class TopicFragmentTest { onView(withId(R.id.topic_tabs_container)).check( matches( matchCurrentTabTitle( - TopicTab.getTabForPosition(position, enableExtraTopicTabsUi.value).name + TopicTab.getTabForPosition( + position, + enableTopicInfoTab.value, + enableTopicPracticeTab.value + ).name ) ) ) @@ -1026,8 +1053,12 @@ class TopicFragmentTest { testCoroutineDispatchers.runCurrent() } - private fun initializeApplicationComponent(enableExtraTabsUi: Boolean) { - TestPlatformParameterModule.forceEnableExtraTopicTabsUi(enableExtraTabsUi) + private fun initializeApplicationComponent( + enableTopicInfoTab: Boolean, + enableTopicPracticeTab: Boolean + ) { + TestPlatformParameterModule.forceEnableTopicInfoTab(enableTopicInfoTab) + TestPlatformParameterModule.forceEnableTopicPracticeTab(enableTopicPracticeTab) setUpTestApplicationComponent() testCoroutineDispatchers.registerIdlingResource() fakeOppiaClock.setFakeTimeMode(FakeOppiaClock.FakeTimeMode.MODE_UPTIME_MILLIS) diff --git a/testing/src/main/java/org/oppia/android/testing/platformparameter/TestPlatformParameterModule.kt b/testing/src/main/java/org/oppia/android/testing/platformparameter/TestPlatformParameterModule.kt index fc5a0a59be1..6d41eea5a4f 100644 --- a/testing/src/main/java/org/oppia/android/testing/platformparameter/TestPlatformParameterModule.kt +++ b/testing/src/main/java/org/oppia/android/testing/platformparameter/TestPlatformParameterModule.kt @@ -319,17 +319,13 @@ class TestPlatformParameterModule { @Provides @EnableTopicInfoTab - fun provideEnableTopicInfoTab( - platformParameterSingleton: PlatformParameterSingleton - ): PlatformParameterValue { + fun provideEnableTopicInfoTab(): PlatformParameterValue { return PlatformParameterValue.createDefaultParameter(enableTopicInfoTab) } @Provides @EnableTopicPracticeTab - fun provideEnableTopicPracticeTab( - platformParameterSingleton: PlatformParameterSingleton - ): PlatformParameterValue { + fun provideEnableTopicPracticeTab(): PlatformParameterValue { return PlatformParameterValue.createDefaultParameter(enableTopicPracticeTab) } From b58eb88a2483596b82f0b88cf8d18cdd8f03dc67 Mon Sep 17 00:00:00 2001 From: Saptak Manna Date: Sun, 2 Mar 2025 15:27:52 +0530 Subject: [PATCH 09/36] Fix tests --- .../app/topic/info/TopicInfoFragmentTest.kt | 15 ++++++++++----- 1 file changed, 10 insertions(+), 5 deletions(-) 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 e4550bf1fcf..50be3db96a2 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 @@ -117,7 +117,8 @@ import org.oppia.android.util.networking.NetworkConnectionDebugUtilModule import org.oppia.android.util.networking.NetworkConnectionUtilDebugModule import org.oppia.android.util.parser.html.HtmlParserEntityTypeModule import org.oppia.android.util.parser.image.ImageParsingModule -import org.oppia.android.util.platformparameter.EnableExtraTopicTabsUi +import org.oppia.android.util.platformparameter.EnableTopicInfoTab +import org.oppia.android.util.platformparameter.EnableTopicPracticeTab import org.oppia.android.util.platformparameter.PlatformParameterValue import org.oppia.android.util.profile.CurrentUserProfileIdIntentDecorator.extractCurrentUserProfileId import org.robolectric.annotation.Config @@ -163,8 +164,11 @@ class TopicInfoFragmentTest { @Inject lateinit var testCoroutineDispatchers: TestCoroutineDispatchers - @field:[Inject EnableExtraTopicTabsUi] - lateinit var enableExtraTopicTabsUi: PlatformParameterValue + @field:[Inject EnableTopicInfoTab] + lateinit var enableTopicInfoTab: PlatformParameterValue + + @field:[Inject EnableTopicPracticeTab] + lateinit var enableTopicPracticeTab: PlatformParameterValue @get:Rule var activityTestRule: ActivityTestRule = ActivityTestRule( @@ -176,7 +180,7 @@ class TopicInfoFragmentTest { @Before fun setUp() { - TestPlatformParameterModule.forceEnableExtraTopicTabsUi(true) + TestPlatformParameterModule.forceEnableTopicInfoTab(true) setUpTestApplicationComponent() testCoroutineDispatchers.registerIdlingResource() } @@ -506,7 +510,8 @@ class TopicInfoFragmentTest { withText( TopicTab.getTabForPosition( position = 0, - enableExtraTopicTabsUi = enableExtraTopicTabsUi.value + enableTopicInfoTab.value, + enableTopicPracticeTab.value ).name ), ViewMatchers.isDescendantOfA(withId(R.id.topic_tabs_container)) From d7ecb4da37664ab395071951f136c610b88e848e Mon Sep 17 00:00:00 2001 From: Saptak Manna Date: Sun, 2 Mar 2025 15:41:45 +0530 Subject: [PATCH 10/36] Fix tests --- .../testing/TopicTestActivityForStoryTest.kt | 16 +++++++++----- .../android/app/topic/TopicActivityTest.kt | 5 +++-- .../topic/lessons/TopicLessonsFragmentTest.kt | 21 ++++++++++++++----- .../practice/TopicPracticeFragmentTest.kt | 20 +++++++++++++----- .../revision/TopicRevisionFragmentTest.kt | 16 +++++++++----- .../topic/info/TopicInfoFragmentLocalTest.kt | 2 +- 6 files changed, 57 insertions(+), 23 deletions(-) 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 3585996ccf3..05b2c49c804 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 @@ -91,7 +91,8 @@ import org.oppia.android.util.networking.NetworkConnectionUtilDebugModule import org.oppia.android.util.parser.html.HtmlParserEntityTypeModule import org.oppia.android.util.parser.image.GlideImageLoaderModule import org.oppia.android.util.parser.image.ImageParsingModule -import org.oppia.android.util.platformparameter.EnableExtraTopicTabsUi +import org.oppia.android.util.platformparameter.EnableTopicInfoTab +import org.oppia.android.util.platformparameter.EnableTopicPracticeTab import org.oppia.android.util.platformparameter.PlatformParameterValue import org.robolectric.annotation.Config import org.robolectric.annotation.LooperMode @@ -115,12 +116,16 @@ class TopicTestActivityForStoryTest { @Inject lateinit var testCoroutineDispatchers: TestCoroutineDispatchers - @field:[Inject EnableExtraTopicTabsUi] - lateinit var enableExtraTopicTabsUiValue: PlatformParameterValue + @field:[Inject EnableTopicInfoTab] + lateinit var enableTopicInfoTab: PlatformParameterValue + + @field:[Inject EnableTopicPracticeTab] + lateinit var enableTopicPracticeTab: PlatformParameterValue @Before fun setUp() { - TestPlatformParameterModule.forceEnableExtraTopicTabsUi(true) + TestPlatformParameterModule.forceEnableTopicInfoTab(true) + TestPlatformParameterModule.forceEnableTopicPracticeTab(true) setUpTestApplicationComponent() testCoroutineDispatchers.registerIdlingResource() } @@ -143,7 +148,8 @@ class TopicTestActivityForStoryTest { matchCurrentTabTitle( TopicTab.getTabForPosition( position = 1, - enableExtraTopicTabsUiValue.value + enableTopicInfoTab.value, + enableTopicPracticeTab.value ).name ) ) 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 38a5fe20e2f..6c1cbb5afc5 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 @@ -169,7 +169,8 @@ class TopicActivityTest { @Test fun testTopicActivity_hasCorrectActivityLabel() { - TestPlatformParameterModule.forceEnableExtraTopicTabsUi(true) + TestPlatformParameterModule.forceEnableTopicInfoTab(true) + TestPlatformParameterModule.forceEnableTopicPracticeTab(true) launchTopicActivity( profileId, TEST_CLASSROOM_ID_1, FRACTIONS_TOPIC_ID ).use { scenario -> @@ -185,7 +186,7 @@ class TopicActivityTest { @Test @RunOn(TestPlatform.ROBOLECTRIC) // TODO(#3858): Enable for Espresso. fun testTopicActivity_startPracticeSession_questionActivityStartedWithProfileId() { - TestPlatformParameterModule.forceEnableExtraTopicTabsUi(true) + TestPlatformParameterModule.forceEnableTopicPracticeTab(true) launchTopicActivity(profileId, TEST_CLASSROOM_ID_1, FRACTIONS_TOPIC_ID).use { // Open the practice tab and select a skill. onView(withText("Practice")).perform(click()) 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 e54dea276a9..5732eeb3af5 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 @@ -139,7 +139,8 @@ import org.oppia.android.util.networking.NetworkConnectionUtilDebugModule import org.oppia.android.util.parser.html.HtmlParserEntityTypeModule import org.oppia.android.util.parser.image.GlideImageLoaderModule import org.oppia.android.util.parser.image.ImageParsingModule -import org.oppia.android.util.platformparameter.EnableExtraTopicTabsUi +import org.oppia.android.util.platformparameter.EnableTopicInfoTab +import org.oppia.android.util.platformparameter.EnableTopicPracticeTab import org.oppia.android.util.platformparameter.PlatformParameterValue import org.oppia.android.util.profile.CurrentUserProfileIdIntentDecorator.extractCurrentUserProfileId import org.robolectric.annotation.Config @@ -182,14 +183,18 @@ class TopicLessonsFragmentTest { @Inject lateinit var fakeExplorationRetriever: FakeExplorationRetriever - @field:[Inject EnableExtraTopicTabsUi] - lateinit var enableExtraTopicTabsUiValue: PlatformParameterValue + @field:[Inject EnableTopicInfoTab] + lateinit var enableTopicInfoTab: PlatformParameterValue + + @field:[Inject EnableTopicPracticeTab] + lateinit var enableTopicPracticeTab: PlatformParameterValue private lateinit var profileId: ProfileId @Before fun setUp() { - TestPlatformParameterModule.forceEnableExtraTopicTabsUi(true) + TestPlatformParameterModule.forceEnableTopicInfoTab(true) + TestPlatformParameterModule.forceEnableTopicPracticeTab(true) Intents.init() setUpTestApplicationComponent() testCoroutineDispatchers.registerIdlingResource() @@ -1322,7 +1327,13 @@ class TopicLessonsFragmentTest { testCoroutineDispatchers.runCurrent() onView( allOf( - withText(TopicTab.getTabForPosition(position = 1, enableExtraTopicTabsUiValue.value).name), + withText( + TopicTab.getTabForPosition( + position = 1, + enableTopicInfoTab.value, + enableTopicPracticeTab.value + ).name + ), isDescendantOfA(withId(R.id.topic_tabs_container)) ) ).perform(click()) 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 8916ec5acbd..c4fd748d09a 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 @@ -115,7 +115,8 @@ import org.oppia.android.util.networking.NetworkConnectionUtilDebugModule import org.oppia.android.util.parser.html.HtmlParserEntityTypeModule import org.oppia.android.util.parser.image.GlideImageLoaderModule import org.oppia.android.util.parser.image.ImageParsingModule -import org.oppia.android.util.platformparameter.EnableExtraTopicTabsUi +import org.oppia.android.util.platformparameter.EnableTopicInfoTab +import org.oppia.android.util.platformparameter.EnableTopicPracticeTab import org.oppia.android.util.platformparameter.PlatformParameterValue import org.oppia.android.util.profile.CurrentUserProfileIdIntentDecorator.extractCurrentUserProfileId import org.robolectric.annotation.Config @@ -146,13 +147,16 @@ class TopicPracticeFragmentTest { @Inject lateinit var spotlightStateController: SpotlightStateController - @field:[Inject EnableExtraTopicTabsUi] - lateinit var enableExtraTopicTabsUiValue: PlatformParameterValue + @field:[Inject EnableTopicInfoTab] + lateinit var enableTopicInfoTab: PlatformParameterValue + + @field:[Inject EnableTopicPracticeTab] + lateinit var enableTopicPracticeTab: PlatformParameterValue @Before fun setUp() { Intents.init() - TestPlatformParameterModule.forceEnableExtraTopicTabsUi(true) + TestPlatformParameterModule.forceEnableTopicPracticeTab(true) setUpTestApplicationComponent() testCoroutineDispatchers.registerIdlingResource() skillIdList.add("5RM9KPfQxobH") @@ -475,7 +479,13 @@ class TopicPracticeFragmentTest { testCoroutineDispatchers.runCurrent() onView( allOf( - withText(TopicTab.getTabForPosition(position = 2, enableExtraTopicTabsUiValue.value).name), + withText( + TopicTab.getTabForPosition( + position = 2, + enableTopicInfoTab.value, + enableTopicPracticeTab.value + ).name + ), isDescendantOfA(withId(R.id.topic_tabs_container)) ) ).perform(click()) 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 d437b8feb3d..8511a92aee1 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 @@ -116,7 +116,8 @@ import org.oppia.android.util.networking.NetworkConnectionDebugUtilModule import org.oppia.android.util.networking.NetworkConnectionUtilDebugModule import org.oppia.android.util.parser.html.HtmlParserEntityTypeModule import org.oppia.android.util.parser.image.ImageParsingModule -import org.oppia.android.util.platformparameter.EnableExtraTopicTabsUi +import org.oppia.android.util.platformparameter.EnableTopicInfoTab +import org.oppia.android.util.platformparameter.EnableTopicPracticeTab import org.oppia.android.util.platformparameter.PlatformParameterValue import org.oppia.android.util.profile.CurrentUserProfileIdIntentDecorator.extractCurrentUserProfileId import org.robolectric.annotation.Config @@ -147,8 +148,11 @@ class TopicRevisionFragmentTest { @Inject lateinit var spotlightStateController: SpotlightStateController - @field:[Inject EnableExtraTopicTabsUi] - lateinit var enableExtraTopicTabsUi: PlatformParameterValue + @field:[Inject EnableTopicInfoTab] + lateinit var enableTopicInfoTab: PlatformParameterValue + + @field:[Inject EnableTopicPracticeTab] + lateinit var enableTopicPracticeTab: PlatformParameterValue private val subtopicThumbnail = R.drawable.topic_fractions_01 private val profileId = ProfileId.newBuilder().setInternalId(0).build() @@ -156,7 +160,8 @@ class TopicRevisionFragmentTest { @Before fun setUp() { Intents.init() - TestPlatformParameterModule.forceEnableExtraTopicTabsUi(true) + TestPlatformParameterModule.forceEnableTopicInfoTab(true) + TestPlatformParameterModule.forceEnableTopicPracticeTab(true) setUpTestApplicationComponent() testCoroutineDispatchers.registerIdlingResource() markAllSpotlightsSeen() @@ -364,7 +369,8 @@ class TopicRevisionFragmentTest { withText( TopicTab.getTabForPosition( position = 3, - enableExtraTopicTabsUi = enableExtraTopicTabsUi.value + enableTopicInfoTab.value, + enableTopicPracticeTab.value ).name ), isDescendantOfA(withId(R.id.topic_tabs_container)) 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 c93092cb3dc..c7b9f7386e6 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 @@ -110,7 +110,7 @@ class TopicInfoFragmentLocalTest { @Test fun testTopicInfoFragment_onLaunch_logsEvent() { - TestPlatformParameterModule.forceEnableExtraTopicTabsUi(true) + TestPlatformParameterModule.forceEnableTopicInfoTab(true) launchTopicActivityIntent(profileId = profileId, TEST_CLASSROOM_ID, TEST_TOPIC_ID).use { testCoroutineDispatchers.runCurrent() val event = fakeAnalyticsEventLogger.getMostRecentEvent() From f610e9056a7f38de791d692a709d6f692420627d Mon Sep 17 00:00:00 2001 From: Saptak Manna Date: Sun, 2 Mar 2025 16:54:31 +0530 Subject: [PATCH 11/36] Fix tests --- .../org/oppia/android/app/topic/TopicFragmentTest.kt | 10 +++++++++- .../oppialogger/analytics/FeatureFlagsLoggerTest.kt | 2 +- 2 files changed, 10 insertions(+), 2 deletions(-) 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 1f5258fac49..8efa75dfaf0 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 @@ -498,7 +498,15 @@ class TopicFragmentTest { fun testTopicFragment_disableExtraTabs_infoTopicTab_isNotDisplayedInTabLayout() { initializeApplicationComponent(enableTopicInfoTab = false, enableTopicPracticeTab = false) launchTopicActivityIntent(profileId, TEST_CLASSROOM_ID_1, FRACTIONS_TOPIC_ID).use { - onView(withText(TopicTab.getTabForPosition(position = INFO_TAB_POSITION, true).name)) + onView( + withText( + TopicTab.getTabForPosition( + position = INFO_TAB_POSITION, + enableTopicInfoTab = true, + enableTopicPracticeTab = false + ).name + ) + ) .check(doesNotExist()) } } diff --git a/domain/src/test/java/org/oppia/android/domain/oppialogger/analytics/FeatureFlagsLoggerTest.kt b/domain/src/test/java/org/oppia/android/domain/oppialogger/analytics/FeatureFlagsLoggerTest.kt index c7c2ca006b0..7ea3b50c783 100644 --- a/domain/src/test/java/org/oppia/android/domain/oppialogger/analytics/FeatureFlagsLoggerTest.kt +++ b/domain/src/test/java/org/oppia/android/domain/oppialogger/analytics/FeatureFlagsLoggerTest.kt @@ -154,7 +154,7 @@ class FeatureFlagsLoggerTest { @Test fun testLogFeatureFlags_correctNumberOfFeatureFlagsIsLogged() { - val expectedFeatureFlagCount = 13 + val expectedFeatureFlagCount = 14 featureFlagsLogger.logAllFeatureFlags(TEST_SESSION_ID) testCoroutineDispatchers.runCurrent() From 59fc04399aaa1b26ffc68aab86b8654075dc5d9c Mon Sep 17 00:00:00 2001 From: Saptak Manna Date: Sun, 2 Mar 2025 18:15:20 +0530 Subject: [PATCH 12/36] Fix tests --- .../android/app/topic/practice/TopicPracticeFragmentTest.kt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) 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 c4fd748d09a..90684fb9976 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 @@ -481,7 +481,7 @@ class TopicPracticeFragmentTest { allOf( withText( TopicTab.getTabForPosition( - position = 2, + position = 1, enableTopicInfoTab.value, enableTopicPracticeTab.value ).name From c1d994e537355d70d7820914515c3836b4ac527a Mon Sep 17 00:00:00 2001 From: Saptak Manna Date: Wed, 12 Mar 2025 18:29:02 +0530 Subject: [PATCH 13/36] Fix tests --- .../android/app/topic/TopicActivityTest.kt | 1 + .../android/app/topic/TopicFragmentTest.kt | 41 ++++++++++++------- 2 files changed, 28 insertions(+), 14 deletions(-) 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 6c1cbb5afc5..0b9e7a7e536 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 @@ -186,6 +186,7 @@ class TopicActivityTest { @Test @RunOn(TestPlatform.ROBOLECTRIC) // TODO(#3858): Enable for Espresso. fun testTopicActivity_startPracticeSession_questionActivityStartedWithProfileId() { + TestPlatformParameterModule.forceEnableTopicInfoTab(true) TestPlatformParameterModule.forceEnableTopicPracticeTab(true) launchTopicActivity(profileId, TEST_CLASSROOM_ID_1, FRACTIONS_TOPIC_ID).use { // Open the practice tab and select a skill. 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 8efa75dfaf0..463c88ddba0 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 @@ -127,13 +127,26 @@ import org.robolectric.annotation.LooperMode import javax.inject.Inject import javax.inject.Singleton +// When both extra tabs (info and practice) are enabled private const val INFO_TAB_POSITION = 0 private const val LESSON_TAB_POSITION = 1 private const val PRACTICE_TAB_POSITION = 2 private const val REVISION_TAB_POSITION = 3 + +// When both extra tabs (info and practice) are disabled private const val LESSON_TAB_POSITION_EXTRA_TABS_DISABLED = 0 private const val REVISION_TAB_POSITION_EXTRA_TABS_DISABLED = 1 +// When only the info tab is enabled +private const val LESSON_TAB_POSITION_INFO_ENABLED_PRACTICE_DISABLED = 1 +private const val REVISION_TAB_POSITION_INFO_ENABLED_PRACTICE_DISABLED = 2 + +// When only the practice tab is enabled +private const val LESSON_TAB_POSITION_PRACTICE_ENABLED_INFO_DISABLED = 0 +private const val PRACTICE_TAB_POSITION_PRACTICE_ENABLED_INFO_DISABLED = 1 +private const val REVISION_TAB_POSITION_PRACTICE_ENABLED_INFO_DISABLED = 2 + + /** Tests for [TopicFragment]. */ // FunctionName: test names are conventionally named with underscores. @Suppress("FunctionName") @@ -552,7 +565,7 @@ class TopicFragmentTest { markAllSpotlightsSeen() launchTopicActivityIntent(profileId, TEST_CLASSROOM_ID_1, FRACTIONS_TOPIC_ID).use { testCoroutineDispatchers.runCurrent() - clickTabAtPosition(position = LESSON_TAB_POSITION) + clickTabAtPosition(position = LESSON_TAB_POSITION_EXTRA_TABS_DISABLED) testCoroutineDispatchers.runCurrent() matchStringOnListItem( recyclerView = R.id.story_summary_recycler_view, @@ -569,7 +582,7 @@ class TopicFragmentTest { launchTopicActivityIntent(profileId, TEST_CLASSROOM_ID_1, FRACTIONS_TOPIC_ID).use { val practiceTab = TopicTab.getTabForPosition( - position = PRACTICE_TAB_POSITION, + position = PRACTICE_TAB_POSITION_PRACTICE_ENABLED_INFO_DISABLED, enableTopicInfoTab.value, enableTopicPracticeTab.value ) @@ -595,7 +608,7 @@ class TopicFragmentTest { TopicTab.getTabForPosition( position = PRACTICE_TAB_POSITION, enableTopicInfoTab = false, - enableTopicPracticeTab = true + enableTopicPracticeTab = false ) onView(withText(practiceTab.name)).check(doesNotExist()) } @@ -614,7 +627,7 @@ class TopicFragmentTest { TopicTab.getTabForPosition( position = PRACTICE_TAB_POSITION, enableTopicInfoTab = false, - enableTopicPracticeTab = true + enableTopicPracticeTab = false ) // The tab should still not be visible even after a configuration change. onView(withText(practiceTab.name)).check(doesNotExist()) @@ -625,8 +638,8 @@ class TopicFragmentTest { fun testTopicFragment_enableExtraTabs_clickOnPracticeTab_showsPracticeTabSelected() { initializeApplicationComponent(enableTopicInfoTab = false, enableTopicPracticeTab = true) launchTopicActivityIntent(profileId, TEST_CLASSROOM_ID_1, FRACTIONS_TOPIC_ID).use { - clickTabAtPosition(position = PRACTICE_TAB_POSITION) - verifyTabTitleAtPosition(position = PRACTICE_TAB_POSITION) + clickTabAtPosition(position = PRACTICE_TAB_POSITION_PRACTICE_ENABLED_INFO_DISABLED) + verifyTabTitleAtPosition(position = PRACTICE_TAB_POSITION_PRACTICE_ENABLED_INFO_DISABLED) } } @@ -636,7 +649,7 @@ class TopicFragmentTest { markAllSpotlightsSeen() launchTopicActivityIntent(profileId, TEST_CLASSROOM_ID_1, FRACTIONS_TOPIC_ID).use { testCoroutineDispatchers.runCurrent() - clickTabAtPosition(position = PRACTICE_TAB_POSITION) + clickTabAtPosition(position = PRACTICE_TAB_POSITION_PRACTICE_ENABLED_INFO_DISABLED) testCoroutineDispatchers.runCurrent() matchStringOnListItem( recyclerView = R.id.topic_practice_skill_list, @@ -677,7 +690,7 @@ class TopicFragmentTest { fun testTopicFragment_enableExtraTabs_clickOnReviewTab_thenInfoTab_showsInfoTab() { initializeApplicationComponent(enableTopicInfoTab = true, enableTopicPracticeTab = false) launchTopicActivityIntent(profileId, TEST_CLASSROOM_ID_1, FRACTIONS_TOPIC_ID).use { - clickTabAtPosition(position = REVISION_TAB_POSITION) + clickTabAtPosition(position = REVISION_TAB_POSITION_INFO_ENABLED_PRACTICE_DISABLED) clickTabAtPosition(position = INFO_TAB_POSITION) verifyTabTitleAtPosition(position = INFO_TAB_POSITION) } @@ -688,7 +701,7 @@ class TopicFragmentTest { initializeApplicationComponent(enableTopicInfoTab = true, enableTopicPracticeTab = false) launchTopicActivityIntent(profileId, TEST_CLASSROOM_ID_1, FRACTIONS_TOPIC_ID).use { testCoroutineDispatchers.runCurrent() - clickTabAtPosition(position = REVISION_TAB_POSITION) + clickTabAtPosition(position = REVISION_TAB_POSITION_INFO_ENABLED_PRACTICE_DISABLED) testCoroutineDispatchers.runCurrent() clickTabAtPosition(position = INFO_TAB_POSITION) testCoroutineDispatchers.runCurrent() @@ -724,7 +737,7 @@ class TopicFragmentTest { markAllSpotlightsSeen() launchTopicActivityIntent(profileId, TEST_CLASSROOM_ID_1, FRACTIONS_TOPIC_ID).use { testCoroutineDispatchers.runCurrent() - clickTabAtPosition(position = PRACTICE_TAB_POSITION) + clickTabAtPosition(position = PRACTICE_TAB_POSITION_PRACTICE_ENABLED_INFO_DISABLED) testCoroutineDispatchers.runCurrent() matchStringOnListItem( recyclerView = R.id.topic_practice_skill_list, @@ -734,7 +747,7 @@ class TopicFragmentTest { ) onView(isRoot()).perform(orientationLandscape()) testCoroutineDispatchers.runCurrent() - verifyTabTitleAtPosition(position = PRACTICE_TAB_POSITION) + verifyTabTitleAtPosition(position = PRACTICE_TAB_POSITION_PRACTICE_ENABLED_INFO_DISABLED) matchStringOnListItem( recyclerView = R.id.topic_practice_skill_list, itemPosition = 0, @@ -815,7 +828,7 @@ class TopicFragmentTest { FRACTIONS_TOPIC_ID, FRACTIONS_STORY_ID_0 ).use { - clickTabAtPosition(position = PRACTICE_TAB_POSITION) + clickTabAtPosition(position = PRACTICE_TAB_POSITION_PRACTICE_ENABLED_INFO_DISABLED) testCoroutineDispatchers.runCurrent() matchStringOnListItem( recyclerView = R.id.topic_practice_skill_list, @@ -825,7 +838,7 @@ class TopicFragmentTest { ) onView(isRoot()).perform(orientationLandscape()) testCoroutineDispatchers.runCurrent() - verifyTabTitleAtPosition(position = PRACTICE_TAB_POSITION) + verifyTabTitleAtPosition(position = PRACTICE_TAB_POSITION_PRACTICE_ENABLED_INFO_DISABLED) matchStringOnListItem( recyclerView = R.id.topic_practice_skill_list, itemPosition = 0, @@ -924,7 +937,7 @@ class TopicFragmentTest { FRACTIONS_TOPIC_ID, FRACTIONS_STORY_ID_0 ).use { - clickTabAtPosition(position = PRACTICE_TAB_POSITION) + clickTabAtPosition(position = PRACTICE_TAB_POSITION_PRACTICE_ENABLED_INFO_DISABLED) testCoroutineDispatchers.runCurrent() assertThat(fakeAnalyticsEventLogger.getMostRecentEvent()) From b2796b778788eb3106df0e39b7549c28bad5ce07 Mon Sep 17 00:00:00 2001 From: Saptak Manna Date: Wed, 12 Mar 2025 18:30:35 +0530 Subject: [PATCH 14/36] Fix tests --- .../java/org/oppia/android/app/topic/TopicFragmentTest.kt | 1 - 1 file changed, 1 deletion(-) 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 463c88ddba0..f4ed7ccd8ec 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 @@ -146,7 +146,6 @@ private const val LESSON_TAB_POSITION_PRACTICE_ENABLED_INFO_DISABLED = 0 private const val PRACTICE_TAB_POSITION_PRACTICE_ENABLED_INFO_DISABLED = 1 private const val REVISION_TAB_POSITION_PRACTICE_ENABLED_INFO_DISABLED = 2 - /** Tests for [TopicFragment]. */ // FunctionName: test names are conventionally named with underscores. @Suppress("FunctionName") From af8744527b183b402380be392713b43646180637 Mon Sep 17 00:00:00 2001 From: Saptak Manna Date: Wed, 12 Mar 2025 19:59:47 +0530 Subject: [PATCH 15/36] Fix tests --- .../java/org/oppia/android/app/topic/TopicFragmentTest.kt | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) 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 f4ed7ccd8ec..70d3e29b200 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 @@ -606,8 +606,8 @@ class TopicFragmentTest { val practiceTab = TopicTab.getTabForPosition( position = PRACTICE_TAB_POSITION, - enableTopicInfoTab = false, - enableTopicPracticeTab = false + enableTopicInfoTab = true, + enableTopicPracticeTab = true ) onView(withText(practiceTab.name)).check(doesNotExist()) } @@ -625,8 +625,8 @@ class TopicFragmentTest { val practiceTab = TopicTab.getTabForPosition( position = PRACTICE_TAB_POSITION, - enableTopicInfoTab = false, - enableTopicPracticeTab = false + enableTopicInfoTab = true, + enableTopicPracticeTab = true ) // The tab should still not be visible even after a configuration change. onView(withText(practiceTab.name)).check(doesNotExist()) From 176ee96f9a4a39118f04ffbe4e525688b42ce817 Mon Sep 17 00:00:00 2001 From: Saptak Manna Date: Wed, 9 Apr 2025 22:16:17 +0530 Subject: [PATCH 16/36] Address review comments --- .../java/org/oppia/android/app/topic/TopicActivityTest.kt | 1 - 1 file changed, 1 deletion(-) 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 0b9e7a7e536..6c1cbb5afc5 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 @@ -186,7 +186,6 @@ class TopicActivityTest { @Test @RunOn(TestPlatform.ROBOLECTRIC) // TODO(#3858): Enable for Espresso. fun testTopicActivity_startPracticeSession_questionActivityStartedWithProfileId() { - TestPlatformParameterModule.forceEnableTopicInfoTab(true) TestPlatformParameterModule.forceEnableTopicPracticeTab(true) launchTopicActivity(profileId, TEST_CLASSROOM_ID_1, FRACTIONS_TOPIC_ID).use { // Open the practice tab and select a skill. From b09e3f5c8fed5e55db3c665e076dbddd668ee704 Mon Sep 17 00:00:00 2001 From: Saptak Manna Date: Thu, 10 Apr 2025 06:53:19 +0530 Subject: [PATCH 17/36] Fix tests --- .../org/oppia/android/app/topic/TopicFragmentTest.kt | 9 +++++++-- 1 file changed, 7 insertions(+), 2 deletions(-) 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 4e7261b4f32..8d39ad12830 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 @@ -466,8 +466,13 @@ class TopicFragmentTest { runWithLaunchedActivityAndAddedFragment( profileId, TEST_CLASSROOM_ID_1, FRACTIONS_TOPIC_ID, FRACTIONS_STORY_ID_0 ) { - onView(withText(TopicTab.getTabForPosition(position = INFO_TAB_POSITION, true).name)) - .check(doesNotExist()) + val infoTab = + TopicTab.getTabForPosition( + position = INFO_TAB_POSITION, + enableTopicInfoTab.value, + enableTopicPracticeTab.value + ) + onView(withText(infoTab.name)).check(doesNotExist()) } } From 370177adb56780134047e725ddcba719e87631f6 Mon Sep 17 00:00:00 2001 From: Saptak Manna Date: Thu, 10 Apr 2025 07:05:22 +0530 Subject: [PATCH 18/36] Fix tests --- .../org/oppia/android/app/topic/TopicFragmentTest.kt | 12 +++++++----- 1 file changed, 7 insertions(+), 5 deletions(-) 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 8d39ad12830..48cd63bd783 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 @@ -466,11 +466,13 @@ class TopicFragmentTest { runWithLaunchedActivityAndAddedFragment( profileId, TEST_CLASSROOM_ID_1, FRACTIONS_TOPIC_ID, FRACTIONS_STORY_ID_0 ) { + // Unconditionally retrieve the info tab name since this test is verifying that it's not + // enabled. val infoTab = TopicTab.getTabForPosition( position = INFO_TAB_POSITION, - enableTopicInfoTab.value, - enableTopicPracticeTab.value + enableTopicInfoTab = true, + enableTopicPracticeTab = true ) onView(withText(infoTab.name)).check(doesNotExist()) } @@ -658,7 +660,7 @@ class TopicFragmentTest { runWithLaunchedActivityAndAddedFragment( profileId, TEST_CLASSROOM_ID_1, FRACTIONS_TOPIC_ID, FRACTIONS_STORY_ID_0 ) { - clickTabAtPosition(position = REVISION_TAB_POSITION) + clickTabAtPosition(position = REVISION_TAB_POSITION_INFO_ENABLED_PRACTICE_DISABLED) clickTabAtPosition(position = INFO_TAB_POSITION) verifyTabTitleAtPosition(position = INFO_TAB_POSITION) } @@ -798,7 +800,7 @@ class TopicFragmentTest { profileId, TEST_CLASSROOM_ID_1, FRACTIONS_TOPIC_ID, FRACTIONS_STORY_ID_0 ) { testCoroutineDispatchers.runCurrent() - clickTabAtPosition(position = PRACTICE_TAB_POSITION) + clickTabAtPosition(position = PRACTICE_TAB_POSITION_PRACTICE_ENABLED_INFO_DISABLED) testCoroutineDispatchers.runCurrent() matchStringOnListItem( recyclerView = R.id.topic_practice_skill_list, @@ -897,7 +899,7 @@ class TopicFragmentTest { profileId, TEST_CLASSROOM_ID_1, FRACTIONS_TOPIC_ID, FRACTIONS_STORY_ID_0 ) { testCoroutineDispatchers.runCurrent() - clickTabAtPosition(position = PRACTICE_TAB_POSITION) + clickTabAtPosition(position = PRACTICE_TAB_POSITION_PRACTICE_ENABLED_INFO_DISABLED) testCoroutineDispatchers.runCurrent() assertThat(fakeAnalyticsEventLogger.getMostRecentEvent()) From ba5a5fe2b7f949137e13102c7fb80d0651c95a85 Mon Sep 17 00:00:00 2001 From: Saptak Manna Date: Sun, 13 Apr 2025 10:47:48 +0530 Subject: [PATCH 19/36] Fix tests --- .../java/org/oppia/android/app/topic/TopicActivityTest.kt | 1 + 1 file changed, 1 insertion(+) 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 56ed8962c41..f6603120591 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 @@ -186,6 +186,7 @@ class TopicActivityTest { @Test @RunOn(TestPlatform.ROBOLECTRIC) // TODO(#3858): Enable for Espresso. fun testTopicActivity_startPracticeSession_questionActivityStartedWithProfileId() { + TestPlatformParameterModule.forceEnableTopicInfoTab(true) TestPlatformParameterModule.forceEnableTopicPracticeTab(true) launchTopicActivity(profileId, TEST_CLASSROOM_ID_1, FRACTIONS_TOPIC_ID).use { // Open the practice tab and select a skill. From ae940acfecb22aaa1c7e3480c51d8bb9f86da1e8 Mon Sep 17 00:00:00 2001 From: Saptak Manna Date: Sun, 13 Apr 2025 07:48:41 +0000 Subject: [PATCH 20/36] Introduce TabConfig --- .../app/topic/TopicFragmentPresenter.kt | 10 +- .../org/oppia/android/app/topic/TopicTab.kt | 94 +++++++++++-------- 2 files changed, 57 insertions(+), 47 deletions(-) diff --git a/app/src/main/java/org/oppia/android/app/topic/TopicFragmentPresenter.kt b/app/src/main/java/org/oppia/android/app/topic/TopicFragmentPresenter.kt index e5b7238f729..150988ba5bc 100644 --- a/app/src/main/java/org/oppia/android/app/topic/TopicFragmentPresenter.kt +++ b/app/src/main/java/org/oppia/android/app/topic/TopicFragmentPresenter.kt @@ -122,15 +122,7 @@ class TopicFragmentPresenter @Inject constructor( } private fun computeTabPosition(tab: TopicTab): Int { - return if (enableTopicInfoTab.value && enableTopicPracticeTab.value) { - tab.positionWithFourTabs - } else if (enableTopicInfoTab.value) { - tab.positionWithThreeTabsWithInfo - } else if (enableTopicPracticeTab.value) { - tab.positionWithThreeTabsWithPractice - } else { - tab.positionWithTwoTabs - } + return tab.getPosition(enableTopicInfoTab.value, enableTopicPracticeTab.value) } private fun setUpViewPager( diff --git a/app/src/main/java/org/oppia/android/app/topic/TopicTab.kt b/app/src/main/java/org/oppia/android/app/topic/TopicTab.kt index 1b8c89c422d..f2db946e3de 100644 --- a/app/src/main/java/org/oppia/android/app/topic/TopicTab.kt +++ b/app/src/main/java/org/oppia/android/app/topic/TopicTab.kt @@ -6,51 +6,79 @@ import org.oppia.android.app.ui.R /** Enum to store the tabs of [TopicFragment] and get tab by position. */ enum class TopicTab( - val positionWithTwoTabs: Int, - val positionWithThreeTabsWithInfo: Int, - val positionWithThreeTabsWithPractice: Int, - val positionWithFourTabs: Int, @StringRes val tabLabelResId: Int, @DrawableRes val tabIconResId: Int, - @StringRes val contentDescriptionResId: Int + @StringRes val contentDescriptionResId: Int, + val positions: Map ) { INFO( - positionWithTwoTabs = -1, - positionWithThreeTabsWithInfo = 0, - positionWithThreeTabsWithPractice = -1, - positionWithFourTabs = 0, tabLabelResId = R.string.info, tabIconResId = R.drawable.ic_info_icon_24dp, - contentDescriptionResId = R.string.info_tab_content_description + contentDescriptionResId = R.string.info_tab_content_description, + positions = mapOf( + TabConfig.TwoTabs to -1, + TabConfig.ThreeTabsWithInfo to 0, + TabConfig.ThreeTabsWithPractice to -1, + TabConfig.FourTabs to 0 + ) ), LEARN( - positionWithTwoTabs = 0, - positionWithThreeTabsWithInfo = 1, - positionWithThreeTabsWithPractice = 0, - positionWithFourTabs = 1, tabLabelResId = R.string.learn, tabIconResId = R.drawable.ic_lessons_icon_24dp, - contentDescriptionResId = R.string.lessons_tab_content_description + contentDescriptionResId = R.string.lessons_tab_content_description, + positions = mapOf( + TabConfig.TwoTabs to 0, + TabConfig.ThreeTabsWithInfo to 1, + TabConfig.ThreeTabsWithPractice to 0, + TabConfig.FourTabs to 1 + ) ), PRACTICE( - positionWithTwoTabs = -1, - positionWithThreeTabsWithInfo = -1, - positionWithThreeTabsWithPractice = 1, - positionWithFourTabs = 2, tabLabelResId = R.string.practice, tabIconResId = R.drawable.ic_practice_icon_24dp, - contentDescriptionResId = R.string.practice_tab_content_description + contentDescriptionResId = R.string.practice_tab_content_description, + positions = mapOf( + TabConfig.TwoTabs to -1, + TabConfig.ThreeTabsWithInfo to -1, + TabConfig.ThreeTabsWithPractice to 1, + TabConfig.FourTabs to 2 + ) ), STUDY( - positionWithTwoTabs = 1, - positionWithThreeTabsWithInfo = 2, - positionWithThreeTabsWithPractice = 2, - positionWithFourTabs = 3, tabLabelResId = R.string.study, tabIconResId = R.drawable.ic_revision_icon_24dp, - contentDescriptionResId = R.string.revision_tab_content_description + contentDescriptionResId = R.string.revision_tab_content_description, + positions = mapOf( + TabConfig.TwoTabs to 1, + TabConfig.ThreeTabsWithInfo to 2, + TabConfig.ThreeTabsWithPractice to 2, + TabConfig.FourTabs to 3 + ) ); + /** Enum representing different tab configurations. */ + enum class TabConfig { + TwoTabs, + ThreeTabsWithInfo, + ThreeTabsWithPractice, + FourTabs; + + companion object { + fun getConfig(enableInfo: Boolean, enablePractice: Boolean) = when { + enableInfo && enablePractice -> FourTabs + enableInfo -> ThreeTabsWithInfo + enablePractice -> ThreeTabsWithPractice + else -> TwoTabs + } + } + } + + /** Returns the tab position based on enabled tabs. */ + fun getPosition(enableTopicInfoTab: Boolean, enableTopicPracticeTab: Boolean): Int { + val config = TabConfig.getConfig(enableTopicInfoTab, enableTopicPracticeTab) + return positions[config] ?: -1 // -1 indicates that the tab is not available + } + companion object { /** * Returns the [TopicTab] corresponding to the specified tab position, considering whether the @@ -62,19 +90,9 @@ enum class TopicTab( enableTopicInfoTab: Boolean, enableTopicPracticeTab: Boolean ): TopicTab { - return checkNotNull( - values().find { - position == if (enableTopicInfoTab && enableTopicPracticeTab) { - it.positionWithFourTabs - } else if (enableTopicInfoTab) { - it.positionWithThreeTabsWithInfo - } else if (enableTopicPracticeTab) { - it.positionWithThreeTabsWithPractice - } else { - it.positionWithTwoTabs - } - } - ) { "No tab corresponding to position: $position" } + return values().find { + it.getPosition(enableTopicInfoTab, enableTopicPracticeTab) == position + } ?: error("No tab corresponding to position: $position") } /** From de66aa3919e1c7eb7659e1456c2d8435d5eec89e Mon Sep 17 00:00:00 2001 From: "Mr. 17" Date: Sun, 13 Apr 2025 08:12:39 +0000 Subject: [PATCH 21/36] Fix static checks --- .../java/org/oppia/android/app/topic/TopicFragmentPresenter.kt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/src/main/java/org/oppia/android/app/topic/TopicFragmentPresenter.kt b/app/src/main/java/org/oppia/android/app/topic/TopicFragmentPresenter.kt index 150988ba5bc..1bff729aefc 100644 --- a/app/src/main/java/org/oppia/android/app/topic/TopicFragmentPresenter.kt +++ b/app/src/main/java/org/oppia/android/app/topic/TopicFragmentPresenter.kt @@ -122,7 +122,7 @@ class TopicFragmentPresenter @Inject constructor( } private fun computeTabPosition(tab: TopicTab): Int { - return tab.getPosition(enableTopicInfoTab.value, enableTopicPracticeTab.value) + return tab.getPosition(enableTopicInfoTab.value, enableTopicPracticeTab.value) } private fun setUpViewPager( From 52a131cd971695a002d946bbac34fcce13045b4b Mon Sep 17 00:00:00 2001 From: Saptak Manna Date: Sun, 13 Apr 2025 10:22:23 +0000 Subject: [PATCH 22/36] Introduce enable_practice_tab field --- domain/src/main/assets/GJ2rLXRKD5hw.json | 3 ++- domain/src/main/assets/GJ2rLXRKD5hw.textproto | 1 + domain/src/main/assets/omzF4oqgeTXd.json | 3 ++- domain/src/main/assets/omzF4oqgeTXd.textproto | 1 + domain/src/main/assets/test_topic_id_0.json | 3 ++- domain/src/main/assets/test_topic_id_0.textproto | 1 + domain/src/main/assets/test_topic_id_1.json | 3 ++- domain/src/main/assets/test_topic_id_1.textproto | 1 + domain/src/main/assets/test_topic_id_2.json | 1 + domain/src/main/assets/test_topic_id_2.textproto | 1 + .../java/org/oppia/android/domain/topic/TopicController.kt | 1 + model/src/main/proto/topic.proto | 6 ++++++ 12 files changed, 21 insertions(+), 4 deletions(-) diff --git a/domain/src/main/assets/GJ2rLXRKD5hw.json b/domain/src/main/assets/GJ2rLXRKD5hw.json index 39e0269741c..09859d42a00 100644 --- a/domain/src/main/assets/GJ2rLXRKD5hw.json +++ b/domain/src/main/assets/GJ2rLXRKD5hw.json @@ -41,5 +41,6 @@ "thumbnail_filename": "", "title": "Adding Fractions" }], - "published": true + "published": true, + "enable_practice_tab": true } diff --git a/domain/src/main/assets/GJ2rLXRKD5hw.textproto b/domain/src/main/assets/GJ2rLXRKD5hw.textproto index 8891207c36c..0b4d4cbf724 100644 --- a/domain/src/main/assets/GJ2rLXRKD5hw.textproto +++ b/domain/src/main/assets/GJ2rLXRKD5hw.textproto @@ -5,6 +5,7 @@ subtopic_ids: 2 subtopic_ids: 3 subtopic_ids: 4 is_published: true +enable_practice_tab: true topic_thumbnail { } written_translations { diff --git a/domain/src/main/assets/omzF4oqgeTXd.json b/domain/src/main/assets/omzF4oqgeTXd.json index 897eafd56eb..6bb156977d5 100644 --- a/domain/src/main/assets/omzF4oqgeTXd.json +++ b/domain/src/main/assets/omzF4oqgeTXd.json @@ -31,5 +31,6 @@ "thumbnail_filename": "", "title": "What is a Ratio?" }], - "published": true + "published": true, + "enable_practice_tab": true } diff --git a/domain/src/main/assets/omzF4oqgeTXd.textproto b/domain/src/main/assets/omzF4oqgeTXd.textproto index 5701d42636d..50344c7b597 100644 --- a/domain/src/main/assets/omzF4oqgeTXd.textproto +++ b/domain/src/main/assets/omzF4oqgeTXd.textproto @@ -3,6 +3,7 @@ canonical_story_ids: "wAMdg4oOClga" canonical_story_ids: "xBSdg4oOClga" subtopic_ids: 1 is_published: true +enable_practice_tab: true topic_thumbnail { } written_translations { diff --git a/domain/src/main/assets/test_topic_id_0.json b/domain/src/main/assets/test_topic_id_0.json index a9115679060..9752f1b0189 100644 --- a/domain/src/main/assets/test_topic_id_0.json +++ b/domain/src/main/assets/test_topic_id_0.json @@ -23,5 +23,6 @@ "thumbnail_filename": "", "title": "Test subtopic" }], - "published": true + "published": true, + "enable_practice_tab": true } diff --git a/domain/src/main/assets/test_topic_id_0.textproto b/domain/src/main/assets/test_topic_id_0.textproto index ce47f844943..a97a980bca0 100644 --- a/domain/src/main/assets/test_topic_id_0.textproto +++ b/domain/src/main/assets/test_topic_id_0.textproto @@ -2,6 +2,7 @@ id: "test_topic_id_0" canonical_story_ids: "test_story_id_0" subtopic_ids: 1 is_published: true +enable_practice_tab: true topic_thumbnail { } written_translations { diff --git a/domain/src/main/assets/test_topic_id_1.json b/domain/src/main/assets/test_topic_id_1.json index 6b3cc156914..4682850df93 100644 --- a/domain/src/main/assets/test_topic_id_1.json +++ b/domain/src/main/assets/test_topic_id_1.json @@ -17,5 +17,6 @@ "thumbnail_filename": "", "skill_descriptions": {}, "subtopics": [], - "published": true + "published": true, + "enable_practice_tab": false } diff --git a/domain/src/main/assets/test_topic_id_1.textproto b/domain/src/main/assets/test_topic_id_1.textproto index fa4a012e25c..1119f5d87f9 100644 --- a/domain/src/main/assets/test_topic_id_1.textproto +++ b/domain/src/main/assets/test_topic_id_1.textproto @@ -1,6 +1,7 @@ id: "test_topic_id_1" canonical_story_ids: "test_story_id_2" is_published: true +enable_practice_tab: false topic_thumbnail { } written_translations { diff --git a/domain/src/main/assets/test_topic_id_2.json b/domain/src/main/assets/test_topic_id_2.json index 469617b8c56..493fe0490bd 100644 --- a/domain/src/main/assets/test_topic_id_2.json +++ b/domain/src/main/assets/test_topic_id_2.json @@ -7,6 +7,7 @@ "topic_id": "test_topic_id_2", "version": -1, "published": false, + "enable_practice_tab": false, "skill_descriptions": {}, "subtopics": [] } diff --git a/domain/src/main/assets/test_topic_id_2.textproto b/domain/src/main/assets/test_topic_id_2.textproto index 5d9e7360478..777a227d7de 100644 --- a/domain/src/main/assets/test_topic_id_2.textproto +++ b/domain/src/main/assets/test_topic_id_2.textproto @@ -1,4 +1,5 @@ id: "test_topic_id_2" +enable_practice_tab: false translatable_title { html: "Third Test Topic" content_id: "title" diff --git a/domain/src/main/java/org/oppia/android/domain/topic/TopicController.kt b/domain/src/main/java/org/oppia/android/domain/topic/TopicController.kt index d561ccff816..0a6efb0b87d 100755 --- a/domain/src/main/java/org/oppia/android/domain/topic/TopicController.kt +++ b/domain/src/main/java/org/oppia/android/domain/topic/TopicController.kt @@ -485,6 +485,7 @@ class TopicController @Inject constructor( availableToPlayNow = true } else availableToPlayInFuture = true }.build() + enablePracticeTab = topicRecord.enablePracticeTab }.build() } } else createTopicFromJson(topicId) diff --git a/model/src/main/proto/topic.proto b/model/src/main/proto/topic.proto index 3587eb4e6ca..47d49054a85 100755 --- a/model/src/main/proto/topic.proto +++ b/model/src/main/proto/topic.proto @@ -43,6 +43,9 @@ message Topic { // Specifics about whether this topic is playable. TopicPlayAvailability topic_play_availability = 8; + // Whether practice questions are available for this topic. + bool enable_practice_tab = 13; + // The old name of the topic (as a string). reserved 2; @@ -679,6 +682,9 @@ message TopicRecord { // Whether this topic is published/available to be played. bool is_published = 6; + // Whether practice questions are available for this topic. + bool enable_practice_tab = 11; + // The thumbnail corresponding to this topic. LessonThumbnail topic_thumbnail = 7; From e932376516d27b586d8b8eec9b696f83661f505c Mon Sep 17 00:00:00 2001 From: Saptak Manna Date: Sun, 13 Apr 2025 16:22:48 +0000 Subject: [PATCH 23/36] Hide practice tab based on enablePracticeTab --- .../android/app/topic/TopicFragmentPresenter.kt | 14 +++++++++----- .../org/oppia/android/app/topic/TopicViewModel.kt | 6 ++++++ .../oppia/android/domain/topic/TopicController.kt | 2 ++ 3 files changed, 17 insertions(+), 5 deletions(-) diff --git a/app/src/main/java/org/oppia/android/app/topic/TopicFragmentPresenter.kt b/app/src/main/java/org/oppia/android/app/topic/TopicFragmentPresenter.kt index 1bff729aefc..17779696b29 100644 --- a/app/src/main/java/org/oppia/android/app/topic/TopicFragmentPresenter.kt +++ b/app/src/main/java/org/oppia/android/app/topic/TopicFragmentPresenter.kt @@ -78,7 +78,10 @@ class TopicFragmentPresenter @Inject constructor( viewModel.setTopicId(topicId) binding.viewModel = viewModel - setUpViewPager(viewPager, classroomId, topicId, isConfigChanged) + viewModel.enablePracticeTab.observe(fragment) { enablePracticeTab -> + setUpViewPager(viewPager, classroomId, topicId, isConfigChanged, enablePracticeTab) + } + return binding.root } @@ -129,7 +132,8 @@ class TopicFragmentPresenter @Inject constructor( viewPager2: ViewPager2, classroomId: String, topicId: String, - isConfigChanged: Boolean + isConfigChanged: Boolean, + enablePracticeTab: Boolean ) { val adapter = ViewPagerAdapter( @@ -139,14 +143,14 @@ class TopicFragmentPresenter @Inject constructor( topicId, storyId, enableTopicInfoTab.value, - enableTopicPracticeTab.value + enableTopicPracticeTab.value && enablePracticeTab ) viewPager2.adapter = adapter TabLayoutMediator(tabLayout, viewPager2) { tab, position -> val topicTab = TopicTab.getTabForPosition( position, enableTopicInfoTab.value, - enableTopicPracticeTab.value + enableTopicPracticeTab.value && enablePracticeTab ) tab.text = resourceHandler.getStringInLocale(topicTab.tabLabelResId) tab.icon = ContextCompat.getDrawable(activity, topicTab.tabIconResId) @@ -165,7 +169,7 @@ class TopicFragmentPresenter @Inject constructor( TopicTab.getTabForPosition( position, enableTopicInfoTab.value, - enableTopicPracticeTab.value + enableTopicPracticeTab.value && enablePracticeTab ) ) } diff --git a/app/src/main/java/org/oppia/android/app/topic/TopicViewModel.kt b/app/src/main/java/org/oppia/android/app/topic/TopicViewModel.kt index f5111f0d450..438792cbf99 100644 --- a/app/src/main/java/org/oppia/android/app/topic/TopicViewModel.kt +++ b/app/src/main/java/org/oppia/android/app/topic/TopicViewModel.kt @@ -78,6 +78,12 @@ class TopicViewModel @Inject constructor( } } + val enablePracticeTab: LiveData by lazy { + Transformations.map(topicLiveData) { ephemeralTopic -> + ephemeralTopic.topic.enablePracticeTab + } + } + fun setProfileId(profileId: ProfileId) { this.profileId = profileId } diff --git a/domain/src/main/java/org/oppia/android/domain/topic/TopicController.kt b/domain/src/main/java/org/oppia/android/domain/topic/TopicController.kt index 0a6efb0b87d..cae8a83a939 100755 --- a/domain/src/main/java/org/oppia/android/domain/topic/TopicController.kt +++ b/domain/src/main/java/org/oppia/android/domain/topic/TopicController.kt @@ -563,6 +563,7 @@ class TopicController @Inject constructor( html = topicData.getStringFromObject("topic_description") }.build() val classroomId = classroomController.getClassroomIdByTopicId(topicId) + val enablePracticeTab = topicData.getBoolean("enable_practice_tab") // No written translations are included since none are retrieved from JSON. return Topic.newBuilder() .setTopicId(topicId) @@ -574,6 +575,7 @@ class TopicController @Inject constructor( .setDiskSizeBytes(computeTopicSizeBytes(getJsonAssetFileNameList(topicId)).toLong()) .addAllSubtopic(subtopicList) .setTopicPlayAvailability(topicPlayAvailability) + .setEnablePracticeTab(enablePracticeTab) .build() } From 6faf94ae09db39249f7c90447f023201f6590c40 Mon Sep 17 00:00:00 2001 From: Saptak Manna Date: Thu, 8 May 2025 04:20:09 +0000 Subject: [PATCH 24/36] Rename enable_practice_tab to has_practice_questions for non-app level --- .../main/java/org/oppia/android/app/topic/TopicViewModel.kt | 2 +- domain/src/main/assets/GJ2rLXRKD5hw.json | 2 +- domain/src/main/assets/GJ2rLXRKD5hw.textproto | 2 +- domain/src/main/assets/omzF4oqgeTXd.json | 2 +- domain/src/main/assets/omzF4oqgeTXd.textproto | 2 +- domain/src/main/assets/test_topic_id_0.json | 2 +- domain/src/main/assets/test_topic_id_0.textproto | 2 +- domain/src/main/assets/test_topic_id_1.json | 2 +- domain/src/main/assets/test_topic_id_1.textproto | 2 +- domain/src/main/assets/test_topic_id_2.json | 2 +- domain/src/main/assets/test_topic_id_2.textproto | 2 +- .../java/org/oppia/android/domain/topic/TopicController.kt | 6 +++--- model/src/main/proto/topic.proto | 4 ++-- 13 files changed, 16 insertions(+), 16 deletions(-) diff --git a/app/src/main/java/org/oppia/android/app/topic/TopicViewModel.kt b/app/src/main/java/org/oppia/android/app/topic/TopicViewModel.kt index 438792cbf99..8d331ab7ac0 100644 --- a/app/src/main/java/org/oppia/android/app/topic/TopicViewModel.kt +++ b/app/src/main/java/org/oppia/android/app/topic/TopicViewModel.kt @@ -80,7 +80,7 @@ class TopicViewModel @Inject constructor( val enablePracticeTab: LiveData by lazy { Transformations.map(topicLiveData) { ephemeralTopic -> - ephemeralTopic.topic.enablePracticeTab + ephemeralTopic.topic.hasPracticeQuestions } } diff --git a/domain/src/main/assets/GJ2rLXRKD5hw.json b/domain/src/main/assets/GJ2rLXRKD5hw.json index 09859d42a00..6e5b9bc7d44 100644 --- a/domain/src/main/assets/GJ2rLXRKD5hw.json +++ b/domain/src/main/assets/GJ2rLXRKD5hw.json @@ -42,5 +42,5 @@ "title": "Adding Fractions" }], "published": true, - "enable_practice_tab": true + "has_practice_questions": true } diff --git a/domain/src/main/assets/GJ2rLXRKD5hw.textproto b/domain/src/main/assets/GJ2rLXRKD5hw.textproto index 0b4d4cbf724..2a9811d6817 100644 --- a/domain/src/main/assets/GJ2rLXRKD5hw.textproto +++ b/domain/src/main/assets/GJ2rLXRKD5hw.textproto @@ -5,7 +5,7 @@ subtopic_ids: 2 subtopic_ids: 3 subtopic_ids: 4 is_published: true -enable_practice_tab: true +has_practice_questions: true topic_thumbnail { } written_translations { diff --git a/domain/src/main/assets/omzF4oqgeTXd.json b/domain/src/main/assets/omzF4oqgeTXd.json index 6bb156977d5..9a7f7434669 100644 --- a/domain/src/main/assets/omzF4oqgeTXd.json +++ b/domain/src/main/assets/omzF4oqgeTXd.json @@ -32,5 +32,5 @@ "title": "What is a Ratio?" }], "published": true, - "enable_practice_tab": true + "has_practice_questions": true } diff --git a/domain/src/main/assets/omzF4oqgeTXd.textproto b/domain/src/main/assets/omzF4oqgeTXd.textproto index 50344c7b597..5277f63a6b2 100644 --- a/domain/src/main/assets/omzF4oqgeTXd.textproto +++ b/domain/src/main/assets/omzF4oqgeTXd.textproto @@ -3,7 +3,7 @@ canonical_story_ids: "wAMdg4oOClga" canonical_story_ids: "xBSdg4oOClga" subtopic_ids: 1 is_published: true -enable_practice_tab: true +has_practice_questions: true topic_thumbnail { } written_translations { diff --git a/domain/src/main/assets/test_topic_id_0.json b/domain/src/main/assets/test_topic_id_0.json index 9752f1b0189..4d961e0974a 100644 --- a/domain/src/main/assets/test_topic_id_0.json +++ b/domain/src/main/assets/test_topic_id_0.json @@ -24,5 +24,5 @@ "title": "Test subtopic" }], "published": true, - "enable_practice_tab": true + "has_practice_questions": true } diff --git a/domain/src/main/assets/test_topic_id_0.textproto b/domain/src/main/assets/test_topic_id_0.textproto index a97a980bca0..b375b8e67ee 100644 --- a/domain/src/main/assets/test_topic_id_0.textproto +++ b/domain/src/main/assets/test_topic_id_0.textproto @@ -2,7 +2,7 @@ id: "test_topic_id_0" canonical_story_ids: "test_story_id_0" subtopic_ids: 1 is_published: true -enable_practice_tab: true +has_practice_questions: true topic_thumbnail { } written_translations { diff --git a/domain/src/main/assets/test_topic_id_1.json b/domain/src/main/assets/test_topic_id_1.json index 4682850df93..00c5b9df205 100644 --- a/domain/src/main/assets/test_topic_id_1.json +++ b/domain/src/main/assets/test_topic_id_1.json @@ -18,5 +18,5 @@ "skill_descriptions": {}, "subtopics": [], "published": true, - "enable_practice_tab": false + "has_practice_questions": false } diff --git a/domain/src/main/assets/test_topic_id_1.textproto b/domain/src/main/assets/test_topic_id_1.textproto index 1119f5d87f9..af9120f47e1 100644 --- a/domain/src/main/assets/test_topic_id_1.textproto +++ b/domain/src/main/assets/test_topic_id_1.textproto @@ -1,7 +1,7 @@ id: "test_topic_id_1" canonical_story_ids: "test_story_id_2" is_published: true -enable_practice_tab: false +has_practice_questions: false topic_thumbnail { } written_translations { diff --git a/domain/src/main/assets/test_topic_id_2.json b/domain/src/main/assets/test_topic_id_2.json index 493fe0490bd..02f9303c67d 100644 --- a/domain/src/main/assets/test_topic_id_2.json +++ b/domain/src/main/assets/test_topic_id_2.json @@ -7,7 +7,7 @@ "topic_id": "test_topic_id_2", "version": -1, "published": false, - "enable_practice_tab": false, + "has_practice_questions": false, "skill_descriptions": {}, "subtopics": [] } diff --git a/domain/src/main/assets/test_topic_id_2.textproto b/domain/src/main/assets/test_topic_id_2.textproto index 777a227d7de..56c976ef7ec 100644 --- a/domain/src/main/assets/test_topic_id_2.textproto +++ b/domain/src/main/assets/test_topic_id_2.textproto @@ -1,5 +1,5 @@ id: "test_topic_id_2" -enable_practice_tab: false +has_practice_questions: false translatable_title { html: "Third Test Topic" content_id: "title" diff --git a/domain/src/main/java/org/oppia/android/domain/topic/TopicController.kt b/domain/src/main/java/org/oppia/android/domain/topic/TopicController.kt index cae8a83a939..c88b5e6b922 100755 --- a/domain/src/main/java/org/oppia/android/domain/topic/TopicController.kt +++ b/domain/src/main/java/org/oppia/android/domain/topic/TopicController.kt @@ -485,7 +485,7 @@ class TopicController @Inject constructor( availableToPlayNow = true } else availableToPlayInFuture = true }.build() - enablePracticeTab = topicRecord.enablePracticeTab + hasPracticeQuestions = topicRecord.hasPracticeQuestions }.build() } } else createTopicFromJson(topicId) @@ -563,7 +563,7 @@ class TopicController @Inject constructor( html = topicData.getStringFromObject("topic_description") }.build() val classroomId = classroomController.getClassroomIdByTopicId(topicId) - val enablePracticeTab = topicData.getBoolean("enable_practice_tab") + val hasPracticeQuestions = topicData.getBoolean("has_practice_questions") // No written translations are included since none are retrieved from JSON. return Topic.newBuilder() .setTopicId(topicId) @@ -575,7 +575,7 @@ class TopicController @Inject constructor( .setDiskSizeBytes(computeTopicSizeBytes(getJsonAssetFileNameList(topicId)).toLong()) .addAllSubtopic(subtopicList) .setTopicPlayAvailability(topicPlayAvailability) - .setEnablePracticeTab(enablePracticeTab) + .setHasPracticeQuestions(hasPracticeQuestions) .build() } diff --git a/model/src/main/proto/topic.proto b/model/src/main/proto/topic.proto index 47d49054a85..1ef0396d3b1 100755 --- a/model/src/main/proto/topic.proto +++ b/model/src/main/proto/topic.proto @@ -44,7 +44,7 @@ message Topic { TopicPlayAvailability topic_play_availability = 8; // Whether practice questions are available for this topic. - bool enable_practice_tab = 13; + bool has_practice_questions = 13; // The old name of the topic (as a string). reserved 2; @@ -683,7 +683,7 @@ message TopicRecord { bool is_published = 6; // Whether practice questions are available for this topic. - bool enable_practice_tab = 11; + bool has_practice_questions = 11; // The thumbnail corresponding to this topic. LessonThumbnail topic_thumbnail = 7; From 79b4de9830b91783509bb569a960d3b89ed505c6 Mon Sep 17 00:00:00 2001 From: Saptak Manna Date: Sun, 25 May 2025 03:49:27 +0000 Subject: [PATCH 25/36] Refactor getTabCount function --- .../main/java/org/oppia/android/app/topic/TopicTab.kt | 10 ++++------ 1 file changed, 4 insertions(+), 6 deletions(-) diff --git a/app/src/main/java/org/oppia/android/app/topic/TopicTab.kt b/app/src/main/java/org/oppia/android/app/topic/TopicTab.kt index f2db946e3de..f7613fa2238 100644 --- a/app/src/main/java/org/oppia/android/app/topic/TopicTab.kt +++ b/app/src/main/java/org/oppia/android/app/topic/TopicTab.kt @@ -99,11 +99,9 @@ enum class TopicTab( * Returns the number of active tabs considering [enableTopicInfoTab] and * [enableTopicPracticeTab]. */ - fun getTabCount(enableTopicInfoTab: Boolean, enableTopicPracticeTab: Boolean) = - if (enableTopicInfoTab && enableTopicPracticeTab) - values().size - else if (enableTopicInfoTab || enableTopicPracticeTab) - values().size - 1 - else values().size - 2 + fun getTabCount(enableTopicInfoTab: Boolean, enableTopicPracticeTab: Boolean): Int { + val config = TabConfig.getConfig(enableTopicInfoTab, enableTopicPracticeTab) + return values().count { it.positions[config] != -1 } // -1 indicates that the tab is disabled + } } } From 505167eb5b7194784e5ca31ca0f525a935fda5fc Mon Sep 17 00:00:00 2001 From: Saptak Manna Date: Sun, 25 May 2025 11:34:01 +0000 Subject: [PATCH 26/36] Update FeatureFlagNameToNumericIdConverter --- .../logging/FeatureFlagNameToNumericIdConverter.kt | 6 ++++-- .../FeatureFlagNameToNumericIdConverterTest.kt | 13 ++++++++++++- 2 files changed, 16 insertions(+), 3 deletions(-) diff --git a/utility/src/main/java/org/oppia/android/util/logging/FeatureFlagNameToNumericIdConverter.kt b/utility/src/main/java/org/oppia/android/util/logging/FeatureFlagNameToNumericIdConverter.kt index e2dc3d9ea1e..12e5fe82d1f 100644 --- a/utility/src/main/java/org/oppia/android/util/logging/FeatureFlagNameToNumericIdConverter.kt +++ b/utility/src/main/java/org/oppia/android/util/logging/FeatureFlagNameToNumericIdConverter.kt @@ -7,7 +7,8 @@ import org.oppia.android.util.platformparameter.ENABLE_MULTIPLE_CLASSROOMS import org.oppia.android.util.platformparameter.ENABLE_NPS_SURVEY import org.oppia.android.util.platformparameter.ENABLE_ONBOARDING_FLOW_V2 import org.oppia.android.util.platformparameter.ENABLE_PERFORMANCE_METRICS_COLLECTION -import org.oppia.android.util.platformparameter.EXTRA_TOPIC_TABS_UI +import org.oppia.android.util.platformparameter.ENABLE_TOPIC_INFO_TAB +import org.oppia.android.util.platformparameter.ENABLE_TOPIC_PRACTICE_TAB import org.oppia.android.util.platformparameter.FAST_LANGUAGE_SWITCHING_IN_LESSON import org.oppia.android.util.platformparameter.INTERACTION_CONFIG_CHANGE_STATE_RETENTION import org.oppia.android.util.platformparameter.LEARNER_STUDY_ANALYTICS @@ -37,7 +38,6 @@ object FeatureFlagNameToNumericIdConverter { ENABLE_PERFORMANCE_METRICS_COLLECTION -> 3 EDIT_ACCOUNTS_OPTIONS_UI -> 4 SPOTLIGHT_UI -> 5 - EXTRA_TOPIC_TABS_UI -> 6 DOWNLOADS_SUPPORT -> 7 INTERACTION_CONFIG_CHANGE_STATE_RETENTION -> 8 APP_AND_OS_DEPRECATION -> 10 @@ -46,6 +46,8 @@ object FeatureFlagNameToNumericIdConverter { ENABLE_NPS_SURVEY -> 13 ENABLE_ONBOARDING_FLOW_V2 -> 14 ENABLE_MULTIPLE_CLASSROOMS -> 15 + ENABLE_TOPIC_INFO_TAB -> 16 + ENABLE_TOPIC_PRACTICE_TAB -> 17 else -> 0 } } diff --git a/utility/src/test/java/org/oppia/android/util/logging/FeatureFlagNameToNumericIdConverterTest.kt b/utility/src/test/java/org/oppia/android/util/logging/FeatureFlagNameToNumericIdConverterTest.kt index 588258f7b30..f83c1585b4a 100644 --- a/utility/src/test/java/org/oppia/android/util/logging/FeatureFlagNameToNumericIdConverterTest.kt +++ b/utility/src/test/java/org/oppia/android/util/logging/FeatureFlagNameToNumericIdConverterTest.kt @@ -20,7 +20,8 @@ import org.oppia.android.util.platformparameter.ENABLE_MULTIPLE_CLASSROOMS import org.oppia.android.util.platformparameter.ENABLE_NPS_SURVEY import org.oppia.android.util.platformparameter.ENABLE_ONBOARDING_FLOW_V2 import org.oppia.android.util.platformparameter.ENABLE_PERFORMANCE_METRICS_COLLECTION -import org.oppia.android.util.platformparameter.EXTRA_TOPIC_TABS_UI +import org.oppia.android.util.platformparameter.ENABLE_TOPIC_INFO_TAB +import org.oppia.android.util.platformparameter.ENABLE_TOPIC_PRACTICE_TAB import org.oppia.android.util.platformparameter.FAST_LANGUAGE_SWITCHING_IN_LESSON import org.oppia.android.util.platformparameter.INTERACTION_CONFIG_CHANGE_STATE_RETENTION import org.oppia.android.util.platformparameter.LEARNER_STUDY_ANALYTICS @@ -112,6 +113,16 @@ class FeatureFlagNameToNumericIdConverterTest { "flagName=$ENABLE_MULTIPLE_CLASSROOMS", "expectedValue=15" ) + @Iteration( + "enable_topic_info_tab", + "flagName=$ENABLE_TOPIC_INFO_TAB", + "expectedValue=15" + ) + @Iteration( + "enable_topic_practice_tab", + "flagName=$ENABLE_TOPIC_PRACTICE_TAB", + "expectedValue=15" + ) fun testConvertToIntegerName_returnsCorrectIntegerForEach() { val integerName = FeatureFlagNameToNumericIdConverter.convertToNumericId(flagName) From 1c91582740528df4bf5abb7e5d93c6a587a4f572 Mon Sep 17 00:00:00 2001 From: Saptak Manna Date: Fri, 13 Jun 2025 03:31:36 +0000 Subject: [PATCH 27/36] Add global variables for info and practice tab flag to maintain consistency --- .../app/topic/TopicFragmentPresenter.kt | 40 ++++++++++++------- .../oppia/android/app/topic/TopicViewModel.kt | 2 +- 2 files changed, 27 insertions(+), 15 deletions(-) diff --git a/app/src/main/java/org/oppia/android/app/topic/TopicFragmentPresenter.kt b/app/src/main/java/org/oppia/android/app/topic/TopicFragmentPresenter.kt index 17779696b29..f4dfc6107d6 100644 --- a/app/src/main/java/org/oppia/android/app/topic/TopicFragmentPresenter.kt +++ b/app/src/main/java/org/oppia/android/app/topic/TopicFragmentPresenter.kt @@ -34,8 +34,8 @@ class TopicFragmentPresenter @Inject constructor( private val viewModel: TopicViewModel, private val oppiaLogger: OppiaLogger, private val analyticsController: AnalyticsController, - @EnableTopicInfoTab private val enableTopicInfoTab: PlatformParameterValue, - @EnableTopicPracticeTab private val enableTopicPracticeTab: PlatformParameterValue, + @EnableTopicInfoTab private val enableTopicInfoTabFlag: PlatformParameterValue, + @EnableTopicPracticeTab private val enableTopicPracticeTabFlag: PlatformParameterValue, private val resourceHandler: AppLanguageResourceHandler ) { @Inject @@ -47,6 +47,12 @@ class TopicFragmentPresenter @Inject constructor( private lateinit var storyId: String private lateinit var viewPager: ViewPager2 + private var enableTopicInfoTab: Boolean = enableTopicInfoTabFlag.value + private var enableTopicPracticeTab: Boolean = false + set(hasPracticeQuestions) { + field = enableTopicPracticeTabFlag.value && hasPracticeQuestions + } + fun handleCreateView( inflater: LayoutInflater, container: ViewGroup?, @@ -78,8 +84,15 @@ class TopicFragmentPresenter @Inject constructor( viewModel.setTopicId(topicId) binding.viewModel = viewModel - viewModel.enablePracticeTab.observe(fragment) { enablePracticeTab -> - setUpViewPager(viewPager, classroomId, topicId, isConfigChanged, enablePracticeTab) + viewModel.hasPracticeQuestions.observe(fragment) { hasPracticeQuestions -> + enableTopicPracticeTab = hasPracticeQuestions + + setUpViewPager( + viewPager, + classroomId, + topicId, + isConfigChanged + ) } return binding.root @@ -125,15 +138,14 @@ class TopicFragmentPresenter @Inject constructor( } private fun computeTabPosition(tab: TopicTab): Int { - return tab.getPosition(enableTopicInfoTab.value, enableTopicPracticeTab.value) + return tab.getPosition(enableTopicInfoTab, enableTopicPracticeTab) } private fun setUpViewPager( viewPager2: ViewPager2, classroomId: String, topicId: String, - isConfigChanged: Boolean, - enablePracticeTab: Boolean + isConfigChanged: Boolean ) { val adapter = ViewPagerAdapter( @@ -142,22 +154,22 @@ class TopicFragmentPresenter @Inject constructor( classroomId, topicId, storyId, - enableTopicInfoTab.value, - enableTopicPracticeTab.value && enablePracticeTab + enableTopicInfoTab, + enableTopicPracticeTab ) viewPager2.adapter = adapter TabLayoutMediator(tabLayout, viewPager2) { tab, position -> val topicTab = TopicTab.getTabForPosition( position, - enableTopicInfoTab.value, - enableTopicPracticeTab.value && enablePracticeTab + enableTopicInfoTab, + enableTopicPracticeTab ) tab.text = resourceHandler.getStringInLocale(topicTab.tabLabelResId) tab.icon = ContextCompat.getDrawable(activity, topicTab.tabIconResId) tab.contentDescription = resourceHandler.getStringInLocale(topicTab.contentDescriptionResId) }.attach() if (!isConfigChanged && topicId.isNotEmpty()) { - if (enableTopicInfoTab.value) { + if (enableTopicInfoTab) { setCurrentTab(if (storyId.isNotEmpty()) TopicTab.LEARN else TopicTab.INFO) } else { setCurrentTab(TopicTab.LEARN) @@ -168,8 +180,8 @@ class TopicFragmentPresenter @Inject constructor( logTopicEvents( TopicTab.getTabForPosition( position, - enableTopicInfoTab.value, - enableTopicPracticeTab.value && enablePracticeTab + enableTopicInfoTab, + enableTopicPracticeTab ) ) } diff --git a/app/src/main/java/org/oppia/android/app/topic/TopicViewModel.kt b/app/src/main/java/org/oppia/android/app/topic/TopicViewModel.kt index 8d331ab7ac0..432afa357bc 100644 --- a/app/src/main/java/org/oppia/android/app/topic/TopicViewModel.kt +++ b/app/src/main/java/org/oppia/android/app/topic/TopicViewModel.kt @@ -78,7 +78,7 @@ class TopicViewModel @Inject constructor( } } - val enablePracticeTab: LiveData by lazy { + val hasPracticeQuestions: LiveData by lazy { Transformations.map(topicLiveData) { ephemeralTopic -> ephemeralTopic.topic.hasPracticeQuestions } From ca3765fbfd7df7640d3abb56f749f29214d880b0 Mon Sep 17 00:00:00 2001 From: Saptak Manna Date: Fri, 13 Jun 2025 10:03:57 +0530 Subject: [PATCH 28/36] Merge branch 'develop' into support-practice-questions --- .github/CODEOWNERS | 4 + .github/workflows/static_checks.yml | 13 - .../application/AbstractOppiaApplication.kt | 66 +- .../app/application/ApplicationComponent.kt | 3 + .../oppia/android/app/application/BUILD.bazel | 1 + .../alpha/AlphaApplicationComponent.kt | 4 +- .../app/splash/SplashActivityPresenter.kt | 671 ++++++++++-------- .../testing/SplashTestActivityPresenter.kt | 21 +- .../AdministratorControlsActivityTest.kt | 69 +- .../AdministratorControlsFragmentTest.kt | 38 +- .../appversion/AppVersionActivityTest.kt | 4 +- .../learneranalytics/BUILD.bazel | 2 + .../ProfileAndDeviceIdActivityTest.kt | 4 +- .../ProfileAndDeviceIdFragmentTest.kt | 1 + .../classroom/ClassroomListActivityTest.kt | 4 +- .../CompletedStoryListActivityTest.kt | 4 +- .../LessonThumbnailImageViewTest.kt | 4 +- .../app/customview/interaction/BUILD.bazel | 2 + .../MathExpressionInteractionsViewTest.kt | 4 +- .../AppCompatCheckBoxBindingAdaptersTest.kt | 4 +- .../oppia/android/app/databinding/BUILD.bazel | 21 + .../CircularProgressIndicatorAdaptersTest.kt | 4 +- .../databinding/ColorBindingAdaptersTest.kt | 4 +- .../DrawableBindingAdaptersTest.kt | 4 +- .../ImageViewBindingAdaptersTest.kt | 4 +- .../databinding/MarginBindingAdaptersTest.kt | 4 +- ...StateAssemblerMarginBindingAdaptersTest.kt | 4 +- ...tateAssemblerPaddingBindingAdaptersTest.kt | 4 +- .../TextInputLayoutBindingAdaptersTest.kt | 4 +- .../TextViewBindingAdaptersTest.kt | 4 +- .../databinding/ViewBindingAdaptersTest.kt | 4 +- .../DeveloperOptionsActivityTest.kt | 4 +- .../DeveloperOptionsFragmentTest.kt | 4 +- .../ForceNetworkTypeActivityTest.kt | 4 +- .../ForceNetworkTypeFragmentTest.kt | 4 +- .../MarkChaptersCompletedActivityTest.kt | 4 +- .../MarkChaptersCompletedFragmentTest.kt | 4 +- .../MarkStoriesCompletedActivityTest.kt | 4 +- .../MarkStoriesCompletedFragmentTest.kt | 4 +- .../MarkTopicsCompletedActivityTest.kt | 4 +- .../MarkTopicsCompletedFragmentTest.kt | 4 +- .../mathexpressionparser/BUILD.bazel | 4 + .../MathExpressionParserActivityTest.kt | 4 +- .../MathExpressionParserFragmentTest.kt | 4 +- .../ViewEventLogsActivityTest.kt | 4 +- .../ViewEventLogsFragmentTest.kt | 4 +- .../android/app/help/HelpActivityTest.kt | 4 +- .../android/app/help/HelpFragmentTest.kt | 4 +- .../app/help/faq/FAQListActivityTest.kt | 4 +- .../app/help/faq/FAQListFragmentTest.kt | 4 +- .../faq/faqsingle/FAQSingleActivityTest.kt | 4 +- .../thirdparty/LicenseListActivityTest.kt | 4 +- .../thirdparty/LicenseListFragmentTest.kt | 4 +- .../LicenseTextViewerActivityTest.kt | 4 +- .../LicenseTextViewerFragmentTest.kt | 4 +- .../ThirdPartyDependencyListActivityTest.kt | 4 +- .../ThirdPartyDependencyListFragmentTest.kt | 4 +- .../android/app/home/HomeActivityTest.kt | 16 +- .../android/app/home/WelcomeViewModelTest.kt | 4 +- .../PromotedStoryListViewModelTest.kt | 4 +- .../PromotedStoryViewModelTest.kt | 4 +- .../RecentlyPlayedFragmentTest.kt | 48 +- .../topiclist/TopicSummaryViewModelTest.kt | 4 +- .../mydownloads/MyDownloadsFragmentTest.kt | 4 +- .../org/oppia/android/app/notice/BUILD.bazel | 8 + .../notice/BetaNoticeDialogFragmentTest.kt | 4 +- ...dAppDeprecationNoticeDialogFragmentTest.kt | 4 +- ...labilityUpgradeNoticeDialogFragmentTest.kt | 4 +- ...lAppDeprecationNoticeDialogFragmentTest.kt | 4 +- .../OsDeprecationNoticeDialogFragmentTest.kt | 4 +- .../onboarding/CreateProfileActivityTest.kt | 4 +- .../app/onboarding/IntroActivityTest.kt | 4 +- .../app/onboarding/OnboardingActivityTest.kt | 4 +- .../app/onboarding/OnboardingFragmentTest.kt | 1 + .../OnboardingProfileTypeActivityTest.kt | 4 +- .../OngoingTopicListActivityTest.kt | 4 +- .../app/options/AppLanguageActivityTest.kt | 4 +- .../app/options/AppLanguageFragmentTest.kt | 4 +- .../app/options/AudioLanguageActivityTest.kt | 4 +- .../app/options/OptionsActivityTest.kt | 4 +- .../options/ReadingTextSizeActivityTest.kt | 4 +- .../options/ReadingTextSizeFragmentTest.kt | 4 +- .../app/player/audio/AudioFragmentTest.kt | 4 +- .../app/player/exploration/BUILD.bazel | 1 + .../exploration/BottomSheetOptionsMenuTest.kt | 4 +- .../exploration/ExplorationActivityTest.kt | 2 + .../app/player/state/StateFragmentTest.kt | 1 + .../app/policies/PoliciesActivityTest.kt | 4 +- .../app/policies/PoliciesFragmentTest.kt | 4 +- .../app/profile/AdminAuthActivityTest.kt | 4 +- .../app/profile/AdminPinActivityTest.kt | 4 +- .../app/profile/PinPasswordActivityTest.kt | 53 +- .../app/profile/ProfileChooserActivityTest.kt | 4 +- .../app/profile/ProfileChooserFragmentTest.kt | 51 +- .../ProfilePictureActivityTest.kt | 4 +- .../ProfileProgressActivityTest.kt | 4 +- .../ProfileProgressFragmentTest.kt | 4 +- .../app/recyclerview/BindableAdapterTest.kt | 4 +- .../resumelesson/ResumeLessonActivityTest.kt | 4 +- .../resumelesson/ResumeLessonFragmentTest.kt | 4 +- .../profile/ProfileEditActivityTest.kt | 4 +- .../profile/ProfileEditFragmentTest.kt | 32 +- .../profile/ProfileListActivityTest.kt | 4 +- .../profile/ProfileListFragmentTest.kt | 4 +- .../profile/ProfileRenameActivityTest.kt | 4 +- .../profile/ProfileRenameFragmentTest.kt | 4 +- .../profile/ProfileResetPinActivityTest.kt | 4 +- .../profile/ProfileResetPinFragmentTest.kt | 4 +- .../android/app/splash/SplashActivityTest.kt | 5 +- .../app/spotlight/SpotlightFragmentTest.kt | 1 + .../android/app/story/StoryActivityTest.kt | 4 +- .../android/app/story/StoryFragmentTest.kt | 4 +- .../app/testing/DragDropTestActivityTest.kt | 4 +- ...ionInputInteractionViewTestActivityTest.kt | 4 +- .../InputInteractionViewTestActivityTest.kt | 4 +- .../NavigationDrawerActivityDebugTest.kt | 4 +- .../NavigationDrawerActivityProdTest.kt | 4 +- ...tioInputInteractionViewTestActivityTest.kt | 4 +- ...tFontScaleConfigurationUtilActivityTest.kt | 4 +- ...extInputInteractionViewTestActivityTest.kt | 4 +- .../testing/TopicTestActivityForStoryTest.kt | 1 + .../android/app/topic/TopicActivityTest.kt | 1 + .../android/app/topic/TopicFragmentTest.kt | 3 +- .../conceptcard/ConceptCardFragmentTest.kt | 4 +- .../app/topic/info/TopicInfoFragmentTest.kt | 1 + .../topic/lessons/TopicLessonsFragmentTest.kt | 1 + .../practice/TopicPracticeFragmentTest.kt | 1 + .../QuestionPlayerActivityTest.kt | 4 +- .../revision/TopicRevisionFragmentTest.kt | 1 + .../revisioncard/RevisionCardActivityTest.kt | 4 +- .../revisioncard/RevisionCardFragmentTest.kt | 4 +- .../app/utility/RatioExtensionsTest.kt | 4 +- .../walkthrough/WalkthroughActivityTest.kt | 4 +- .../end/WalkthroughFinalFragmentTest.kt | 4 +- .../WalkthroughTopicListFragmentTest.kt | 4 +- .../welcome/WalkthroughWelcomeFragmentTest.kt | 4 +- .../activity/ActivityIntentFactoriesTest.kt | 4 +- .../oppia/android/app/activity/BUILD.bazel | 1 + .../app/activity/route/ActivityRouterTest.kt | 4 +- .../android/app/activity/route/BUILD.bazel | 1 + .../AdministratorControlsFragmentTest.kt | 4 +- .../android/app/home/HomeActivityLocalTest.kt | 3 + .../app/options/OptionsFragmentTest.kt | 1 + .../app/parser/FractionParsingUiErrorTest.kt | 4 +- .../app/parser/StringToRatioParserTest.kt | 4 +- .../ExplorationActivityLocalTest.kt | 1 + .../ProfileChooserFragmentLocalTest.kt | 4 +- .../app/story/StoryActivityLocalTest.kt | 4 +- .../app/testing/CompletedStoryListSpanTest.kt | 4 +- .../oppia/android/app/testing/HomeSpanTest.kt | 4 +- .../app/testing/OngoingTopicListSpanTest.kt | 4 +- .../PlatformParameterIntegrationTest.kt | 139 +--- .../app/testing/ProfileChooserSpanTest.kt | 4 +- .../testing/ProfileProgressSpanCountTest.kt | 4 +- .../app/testing/RecentlyPlayedSpanTest.kt | 4 +- .../app/testing/TopicRevisionSpanTest.kt | 4 +- .../android/app/testing/activity/BUILD.bazel | 1 + .../app/testing/activity/TestActivityTest.kt | 4 +- .../player/split/PlayerSplitScreenTest.kt | 4 +- .../state/StateFragmentAccessibilityTest.kt | 4 +- .../lessons/TopicLessonsFragmentLocalTest.kt | 4 +- .../QuestionPlayerActivityLocalTest.kt | 4 +- .../RevisionCardActivityLocalTest.kt | 4 +- .../ActivityLanguageLocaleHandlerTest.kt | 4 +- .../AppLanguageLocaleHandlerTest.kt | 6 +- .../AppLanguageResourceHandlerTest.kt | 4 +- .../AppLanguageWatcherMixinTest.kt | 4 +- .../oppia/android/app/translation/BUILD.bazel | 4 + .../app/utility/datetime/DateTimeUtilTest.kt | 4 +- .../android/app/utility/math/BUILD.bazel | 1 + .../MathExpressionAccessibilityUtilTest.kt | 4 +- build_flavors.bzl | 3 + .../java/org/oppia/android/config/BUILD.bazel | 96 +++ .../config/platform/feature_flags.textproto | 70 ++ .../alpha/feature_flags_overrides.textproto | 12 + .../beta/feature_flags_overrides.textproto | 0 .../ga/feature_flags_overrides.textproto | 0 .../platform/platform_parameters.textproto | 70 ++ data/BUILD.bazel | 1 - .../data/backends/gae/testing/BUILD.bazel | 2 +- ...latformParameterServiceTestOrchestrator.kt | 73 +- .../gae/api/PlatformParameterServiceTest.kt | 18 +- ...ormParameterServiceTestOrchestratorTest.kt | 20 +- domain/BUILD.bazel | 2 + .../domain/oppialogger/analytics/BUILD.bazel | 1 + .../analytics/FeatureFlagsLogger.kt | 115 +-- .../domain/platformparameter/BUILD.bazel | 99 +++ .../FeatureFlagBindingModule.kt | 108 +++ .../platformparameter/FeatureFlagIdKey.kt | 10 + .../domain/platformparameter/FeatureFlags.kt | 9 + .../FeatureFlagsMapBindingModule.kt | 138 ++++ .../PlatformParameterAlphaModule.kt | 353 --------- .../PlatformParameterBindingModule.kt | 110 +++ .../PlatformParameterConfigRetriever.kt | 16 + ...latformParameterConfigRetrieverProdImpl.kt | 28 + .../PlatformParameterController.kt | 122 ++-- .../PlatformParameterControllerProdImpl.kt | 239 +++++++ .../PlatformParameterModule.kt | 402 ++--------- .../PlatformParameterProcessState.kt | 165 +++++ .../PlatformParameterSingletonImpl.kt | 7 +- .../platformparameter/syncup/BUILD.bazel | 27 + .../syncup/PlatformParameterSyncUpWorker.kt | 84 +-- .../platformparameter/testing/BUILD.bazel | 22 + .../TestPlatformParameterConfigRetriever.kt | 175 +++++ .../domain/audio/AudioPlayerControllerTest.kt | 63 +- .../android/domain/clipboard/BUILD.bazel | 1 + .../clipboard/ClipboardControllerTest.kt | 6 +- .../android/domain/exploration/BUILD.bazel | 3 + .../ExplorationActiveTimeControllerTest.kt | 6 + .../ExplorationDataControllerTest.kt | 4 +- .../ExplorationProgressControllerTest.kt | 43 +- .../ExplorationProgressModuleTest.kt | 2 + .../ExplorationStorageModuleTest.kt | 6 +- .../lightweightcheckpointing/BUILD.bazel | 1 + .../ExplorationCheckpointControllerTest.kt | 4 +- .../domain/exploration/testing/BUILD.bazel | 1 + .../ExplorationStorageTestModuleTest.kt | 6 +- .../oppia/android/domain/locale/BUILD.bazel | 1 + .../domain/locale/LocaleControllerTest.kt | 6 +- .../AppStartupStateControllerTest.kt | 104 +-- .../android/domain/onboarding/BUILD.bazel | 5 + .../onboarding/DeprecationControllerTest.kt | 121 +--- .../LoggingIdentifierControllerTest.kt | 35 +- .../analytics/AnalyticsControllerTest.kt | 6 + .../ApplicationLifecycleObserverTest.kt | 18 +- .../domain/oppialogger/analytics/BUILD.bazel | 2 + .../CpuPerformanceSnapshotterTest.kt | 6 + .../analytics/FeatureFlagsLoggerTest.kt | 82 +-- .../analytics/FirestoreDataControllerTest.kt | 6 +- .../analytics/LearnerAnalyticsLoggerTest.kt | 4 +- .../PerformanceMetricsControllerTest.kt | 6 +- .../analytics/PerformanceMetricsLoggerTest.kt | 2 + .../analytics/testing/FakeLogSchedulerTest.kt | 6 +- .../MetricLogSchedulingWorkerTest.kt | 6 + .../PerformanceMetricsLogSchedulerTest.kt | 6 +- .../oppialogger/loguploader/BUILD.bazel | 1 + .../LogReportWorkManagerInitializerTest.kt | 6 +- .../loguploader/LogUploadWorkerTest.kt | 6 + ...PlatformParameterControllerProdImplTest.kt | 117 +++ .../PlatformParameterControllerTest.kt | 262 ------- .../PlatformParameterModuleTest.kt | 164 +---- ...rameterSyncUpWorkManagerInitializerTest.kt | 6 +- .../PlatformParameterSyncUpWorkerTest.kt | 298 +------- .../ProfileManagementControllerTest.kt | 65 +- .../oppia/android/domain/question/BUILD.bazel | 2 + ...uestionAssessmentProgressControllerTest.kt | 4 +- .../QuestionTrainingControllerTest.kt | 4 +- .../oppia/android/domain/survey/BUILD.bazel | 2 + .../domain/survey/SurveyControllerTest.kt | 20 +- .../survey/SurveyGatingControllerTest.kt | 6 + .../survey/SurveyProgressControllerTest.kt | 20 +- .../topic/StoryProgressControllerTest.kt | 6 +- .../android/domain/translation/BUILD.bazel | 1 + .../translation/TranslationControllerTest.kt | 6 +- model/src/main/proto/BUILD.bazel | 1 + model/src/main/proto/oppia_logger.proto | 10 +- model/src/main/proto/platform_parameter.proto | 226 +++++- scripts/BUILD.bazel | 7 + scripts/assets/test_file_exemptions.textproto | 42 +- scripts/assets/todo_open_exemptions.textproto | 2 +- scripts/feature_flags_check.sh | 149 ---- .../android/scripts/lint/AndroidLintRunner.kt | 71 ++ .../oppia/android/scripts/lint/BUILD.bazel | 17 + .../scripts/lint/AndroidLintRunnerTest.kt | 90 +++ .../oppia/android/scripts/lint/BUILD.bazel | 15 + scripts/static_checks.sh | 4 - testing/BUILD.bazel | 3 +- .../testing/logging/EventLogSubject.kt | 29 +- .../testing/platformparameter/BUILD.bazel | 19 +- .../TestPlatformParameterConstants.kt | 88 --- .../TestPlatformParameterModule.kt | 440 ++---------- .../testing/logging/EventLogSubjectTest.kt | 25 +- .../testing/profile/ProfileTestHelperTest.kt | 6 +- third_party/maven_install.json | 480 ++++++++----- third_party/versions.bzl | 1 + .../oppia/android/util/logging/BUILD.bazel | 12 - .../util/logging/EventBundleCreator.kt | 16 +- .../FeatureFlagNameToNumericIdConverter.kt | 54 -- .../PlatformParameterSingleton.kt | 1 + .../PlatformParameterValue.kt | 18 +- .../oppia/android/util/logging/BUILD.bazel | 26 +- .../util/logging/EventBundleCreatorTest.kt | 150 ++-- ...FeatureFlagNameToNumericIdConverterTest.kt | 162 ----- .../util/logging/SyncStatusManagerImplTest.kt | 35 +- .../android/util/logging/firebase/BUILD.bazel | 2 + .../firebase/LogReportingModuleTest.kt | 40 +- .../util/parser/html/HtmlParserTest.kt | 4 +- .../html/ListItemLeadingMarginSpanTest.kt | 5 +- 288 files changed, 4007 insertions(+), 4218 deletions(-) create mode 100644 config/src/java/org/oppia/android/config/platform/feature_flags.textproto create mode 100644 config/src/java/org/oppia/android/config/platform/featureoverrides/alpha/feature_flags_overrides.textproto create mode 100644 config/src/java/org/oppia/android/config/platform/featureoverrides/beta/feature_flags_overrides.textproto create mode 100644 config/src/java/org/oppia/android/config/platform/featureoverrides/ga/feature_flags_overrides.textproto create mode 100644 config/src/java/org/oppia/android/config/platform/platform_parameters.textproto create mode 100644 domain/src/main/java/org/oppia/android/domain/platformparameter/BUILD.bazel create mode 100644 domain/src/main/java/org/oppia/android/domain/platformparameter/FeatureFlagBindingModule.kt create mode 100644 domain/src/main/java/org/oppia/android/domain/platformparameter/FeatureFlagIdKey.kt create mode 100644 domain/src/main/java/org/oppia/android/domain/platformparameter/FeatureFlags.kt create mode 100644 domain/src/main/java/org/oppia/android/domain/platformparameter/FeatureFlagsMapBindingModule.kt delete mode 100644 domain/src/main/java/org/oppia/android/domain/platformparameter/PlatformParameterAlphaModule.kt create mode 100644 domain/src/main/java/org/oppia/android/domain/platformparameter/PlatformParameterBindingModule.kt create mode 100644 domain/src/main/java/org/oppia/android/domain/platformparameter/PlatformParameterConfigRetriever.kt create mode 100644 domain/src/main/java/org/oppia/android/domain/platformparameter/PlatformParameterConfigRetrieverProdImpl.kt create mode 100644 domain/src/main/java/org/oppia/android/domain/platformparameter/PlatformParameterControllerProdImpl.kt create mode 100644 domain/src/main/java/org/oppia/android/domain/platformparameter/PlatformParameterProcessState.kt create mode 100644 domain/src/main/java/org/oppia/android/domain/platformparameter/syncup/BUILD.bazel create mode 100644 domain/src/main/java/org/oppia/android/domain/platformparameter/testing/BUILD.bazel create mode 100644 domain/src/main/java/org/oppia/android/domain/platformparameter/testing/TestPlatformParameterConfigRetriever.kt create mode 100644 domain/src/test/java/org/oppia/android/domain/platformparameter/PlatformParameterControllerProdImplTest.kt delete mode 100644 domain/src/test/java/org/oppia/android/domain/platformparameter/PlatformParameterControllerTest.kt delete mode 100644 scripts/feature_flags_check.sh create mode 100644 scripts/src/java/org/oppia/android/scripts/lint/AndroidLintRunner.kt create mode 100644 scripts/src/java/org/oppia/android/scripts/lint/BUILD.bazel create mode 100644 scripts/src/javatests/org/oppia/android/scripts/lint/AndroidLintRunnerTest.kt create mode 100644 scripts/src/javatests/org/oppia/android/scripts/lint/BUILD.bazel delete mode 100644 testing/src/main/java/org/oppia/android/testing/platformparameter/TestPlatformParameterConstants.kt delete mode 100644 utility/src/main/java/org/oppia/android/util/logging/FeatureFlagNameToNumericIdConverter.kt delete mode 100644 utility/src/test/java/org/oppia/android/util/logging/FeatureFlagNameToNumericIdConverterTest.kt diff --git a/.github/CODEOWNERS b/.github/CODEOWNERS index 13e53bb5dba..d40482826b2 100644 --- a/.github/CODEOWNERS +++ b/.github/CODEOWNERS @@ -318,6 +318,10 @@ gradle.properties @oppia/android-app-infrastructure-reviewers /config/**/alllanguages/*.textproto @oppia/owners /config/**/productionlanguages/*.textproto @oppia/owners +# Configurations for the lists of feature flags and platform parameters supported by the app. +/config/**/platform/*.textproto @oppia/owners +/config/**/platform/featureoverrides/**/*.textproto @oppia/owners + # Primary app manifest. Eventually, this will be split up so that only the # sensitive portions require owners approval. /app/src/main/AndroidManifest.xml @oppia/owners diff --git a/.github/workflows/static_checks.yml b/.github/workflows/static_checks.yml index b02e4cf7cca..caba987b2de 100644 --- a/.github/workflows/static_checks.yml +++ b/.github/workflows/static_checks.yml @@ -83,10 +83,6 @@ jobs: run: | bash /home/runner/work/oppia-android/oppia-android/scripts/ktlint_lint_check.sh $HOME - - name: Feature flag checks - run: | - bash /home/runner/work/oppia-android/oppia-android/scripts/feature_flags_check.sh $HOME - - name: Protobuf lint check run: | bash /home/runner/work/oppia-android/oppia-android/scripts/buf_lint_check.sh $HOME @@ -209,15 +205,6 @@ jobs: run: | bazel run //scripts:string_resource_validation_check -- $(pwd) - - name: Binary files check - # The expression if: ${{ !cancelled() }} runs a job or step regardless of its success or failure while responding to cancellations, - # serving as a cancellation-compliant alternative to if: ${{ always() }} in concurrent workflows. - if: ${{ !cancelled() }} - run: | - bash /home/runner/work/oppia-android/oppia-android/scripts/pre-commit.sh - echo "No binary files found in commit" - echo "BINARY FILES CHECK PASSED" - # Note that caching is intentionally not enabled for this check since licenses should always be # verified without any potential influence from earlier builds (i.e. always from a clean build to # ensure the results exactly match the current state of the repository). diff --git a/app/src/main/java/org/oppia/android/app/application/AbstractOppiaApplication.kt b/app/src/main/java/org/oppia/android/app/application/AbstractOppiaApplication.kt index 610178c32cd..a86daef88c9 100644 --- a/app/src/main/java/org/oppia/android/app/application/AbstractOppiaApplication.kt +++ b/app/src/main/java/org/oppia/android/app/application/AbstractOppiaApplication.kt @@ -11,6 +11,9 @@ import com.google.firebase.FirebaseApp import com.google.firebase.appcheck.FirebaseAppCheck import com.google.firebase.appcheck.debug.DebugAppCheckProviderFactory import com.google.firebase.appcheck.playintegrity.PlayIntegrityAppCheckProviderFactory +import kotlinx.coroutines.CoroutineScope +import kotlinx.coroutines.Dispatchers +import kotlinx.coroutines.async import org.oppia.android.app.activity.ActivityComponent import org.oppia.android.app.activity.ActivityComponentFactory import org.oppia.android.app.model.BuildFlavor @@ -38,29 +41,50 @@ abstract class AbstractOppiaApplication( @SuppressLint("ObsoleteSdkInt") // Incorrect warning. override fun onCreate() { super.onCreate() - // The current WorkManager version doesn't work in SDK 31+, so disable it. - // TODO(#4751): Re-enable WorkManager for S+. - if (Build.VERSION.SDK_INT < Build.VERSION_CODES.S) { - FirebaseApp.initializeApp(applicationContext) - // FirebaseAppCheck protects our API resources from abuse. It works with Firebase services, - // Google Cloud services, and can also be implemented for our own APIs. - // See https://firebase.google.com/docs/app-check for currently supported Firebase products. - // Note that as of this code being checked in, only the app's Firestore usage is affected by - // App Check (Analytics is NOT affected). - if (component.getCurrentBuildFlavor() == BuildFlavor.DEVELOPER) { - FirebaseAppCheck.getInstance().installAppCheckProviderFactory( - DebugAppCheckProviderFactory.getInstance(), - ) - } else { - FirebaseAppCheck.getInstance().installAppCheckProviderFactory( - PlayIntegrityAppCheckProviderFactory.getInstance(), - ) + + // Platform parameter initialization must happen very early since even workers can use both + // feature flags and platform parameters. + component.getPlatformParameterController().loadParametersAsync().invokeOnCompletion { e -> + if (e != null) { + throw Exception("Failed to initialize platform parameters.", e) + } + + // Continue initializing the startup state. Due to the asynchronous nature of platform + // parameter initialization, this happens after onCreate() finishes at the application level. + // This can introduce some inconsistencies in SplashActivity, though by the time + // SplashActivity completes the following should be fully initialized. + CoroutineScope(Dispatchers.Main).async { + // The current WorkManager version doesn't work in SDK 31+, so disable it. + // TODO(#4751): Re-enable WorkManager for S+. + if (Build.VERSION.SDK_INT < Build.VERSION_CODES.S) { + FirebaseApp.initializeApp(applicationContext) + // FirebaseAppCheck protects our API resources from abuse. It works with Firebase + // services, Google Cloud services, and can also be implemented for our own APIs. See + // https://firebase.google.com/docs/app-check for currently supported Firebase products. + // Note that as of this code being checked in, only the app's Firestore usage is affected + // by App Check (Analytics is NOT affected). + if (component.getCurrentBuildFlavor() == BuildFlavor.DEVELOPER) { + FirebaseAppCheck.getInstance().installAppCheckProviderFactory( + DebugAppCheckProviderFactory.getInstance(), + ) + } else { + FirebaseAppCheck.getInstance().installAppCheckProviderFactory( + PlayIntegrityAppCheckProviderFactory.getInstance(), + ) + } + WorkManager.initialize(applicationContext, workManagerConfiguration) + val workManager = WorkManager.getInstance(applicationContext) + component.getAnalyticsStartupListenerStartupListeners().forEach { + it.onCreate(workManager) + } + } + component.getApplicationStartupListeners().forEach(ApplicationStartupListener::onCreate) + }.invokeOnCompletion { + if (it != null) { + throw Exception("Failed to continue application initialization.", it) + } } - WorkManager.initialize(applicationContext, workManagerConfiguration) - val workManager = WorkManager.getInstance(applicationContext) - component.getAnalyticsStartupListenerStartupListeners().forEach { it.onCreate(workManager) } } - component.getApplicationStartupListeners().forEach(ApplicationStartupListener::onCreate) } override fun getWorkManagerConfiguration(): Configuration { diff --git a/app/src/main/java/org/oppia/android/app/application/ApplicationComponent.kt b/app/src/main/java/org/oppia/android/app/application/ApplicationComponent.kt index 4fc1daefb7d..a97f651617b 100644 --- a/app/src/main/java/org/oppia/android/app/application/ApplicationComponent.kt +++ b/app/src/main/java/org/oppia/android/app/application/ApplicationComponent.kt @@ -7,6 +7,7 @@ import org.oppia.android.app.activity.ActivityComponentImpl import org.oppia.android.app.model.BuildFlavor import org.oppia.android.domain.oppialogger.ApplicationStartupListener import org.oppia.android.domain.oppialogger.analytics.AnalyticsStartupListener +import org.oppia.android.domain.platformparameter.PlatformParameterController import javax.inject.Provider /** @@ -28,6 +29,8 @@ interface ApplicationComponent : ApplicationInjector { fun getApplicationStartupListeners(): Set + fun getPlatformParameterController(): PlatformParameterController + fun getAnalyticsStartupListenerStartupListeners(): Set fun getWorkManagerConfiguration(): Configuration 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 1116f7e7e1b..637ca1c5f5f 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 @@ -118,6 +118,7 @@ android_library( "//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", + "//domain/src/main/java/org/oppia/android/domain/platformparameter:prod_module", "//utility/src/main/java/org/oppia/android/util/accessibility:prod_module", "//utility/src/main/java/org/oppia/android/util/caching:asset_prod_module", "//utility/src/main/java/org/oppia/android/util/caching:caching_prod_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 e5756fff0fd..9bf42f35695 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 @@ -40,7 +40,7 @@ import org.oppia.android.domain.oppialogger.analytics.CpuPerformanceSnapshotterM import org.oppia.android.domain.oppialogger.exceptions.UncaughtExceptionLoggerModule import org.oppia.android.domain.oppialogger.logscheduler.MetricLogSchedulerModule import org.oppia.android.domain.oppialogger.loguploader.LogReportWorkerModule -import org.oppia.android.domain.platformparameter.PlatformParameterAlphaModule +import org.oppia.android.domain.platformparameter.PlatformParameterModule import org.oppia.android.domain.platformparameter.PlatformParameterSingletonModule import org.oppia.android.domain.platformparameter.syncup.PlatformParameterSyncUpWorkerModule import org.oppia.android.domain.question.QuestionModule @@ -86,7 +86,7 @@ import javax.inject.Singleton ApplicationStartupListenerModule::class, LogReportWorkerModule::class, WorkManagerConfigurationModule::class, HintsAndSolutionConfigModule::class, FirebaseLogUploaderModule::class, RetrofitModule::class, RetrofitServiceModule::class, - PlatformParameterAlphaModule::class, PlatformParameterSingletonModule::class, + PlatformParameterModule::class, PlatformParameterSingletonModule::class, ExplorationStorageModule::class, DeveloperOptionsModule::class, PlatformParameterSyncUpWorkerModule::class, NetworkConfigProdModule::class, AssetModule::class, LocaleProdModule::class, ActivityRecreatorProdModule::class, ActivityRouterModule::class, diff --git a/app/src/main/java/org/oppia/android/app/splash/SplashActivityPresenter.kt b/app/src/main/java/org/oppia/android/app/splash/SplashActivityPresenter.kt index 23960b216d3..c3fb93b2f49 100644 --- a/app/src/main/java/org/oppia/android/app/splash/SplashActivityPresenter.kt +++ b/app/src/main/java/org/oppia/android/app/splash/SplashActivityPresenter.kt @@ -40,6 +40,7 @@ import org.oppia.android.domain.locale.LocaleController import org.oppia.android.domain.onboarding.AppStartupStateController import org.oppia.android.domain.onboarding.DeprecationController import org.oppia.android.domain.oppialogger.OppiaLogger +import org.oppia.android.domain.platformparameter.PlatformParameterController import org.oppia.android.domain.profile.ProfileManagementController import org.oppia.android.domain.translation.TranslationController import org.oppia.android.util.data.AsyncResult @@ -54,6 +55,7 @@ import org.oppia.android.util.platformparameter.EnableOnboardingFlowV2 import org.oppia.android.util.platformparameter.PlatformParameterValue import org.oppia.android.util.profile.CurrentUserProfileIdIntentDecorator.decorateWithUserProfileId import javax.inject.Inject +import javax.inject.Provider private const val AUTO_DEPRECATION_NOTICE_DIALOG_FRAGMENT_TAG = "auto_deprecation_notice_dialog" private const val FORCED_DEPRECATION_NOTICE_DIALOG_FRAGMENT_TAG = "forced_deprecation_notice_dialog" @@ -66,22 +68,19 @@ private const val SPLASH_INIT_STATE_DATA_PROVIDER_ID = "splash_init_state_data_p /** The presenter for [SplashActivity]. */ @ActivityScope class SplashActivityPresenter @Inject constructor( + // NOTE TO DEVELOPER: Be careful introducing new dependencies here since many classes may be + // updated to try and use platform parameters or feature flags in the future, and their injections + // may fail if parameters haven't yet finished loading. Most new injections should go within + // PostParameterLoadingSplashActivityPresenter along with corresponding logic since that class is + // guaranteed to be created only after parameter initialization is completed. private val activity: AppCompatActivity, private val oppiaLogger: OppiaLogger, - private val appStartupStateController: AppStartupStateController, - private val translationController: TranslationController, - private val localeController: LocaleController, - private val deprecationController: DeprecationController, - private val appLanguageLocaleHandler: AppLanguageLocaleHandler, - private val lifecycleSafeTimerFactory: LifecycleSafeTimerFactory, private val currentBuildFlavor: BuildFlavor, - @EnableAppAndOsDeprecation - private val enableAppAndOsDeprecation: PlatformParameterValue, - private val profileManagementController: ProfileManagementController, - @EnableOnboardingFlowV2 private val enableOnboardingFlowV2: PlatformParameterValue, - @EnableMultipleClassrooms private val enableMultipleClassrooms: PlatformParameterValue + private val platformParameterController: PlatformParameterController, + private val postParamLoadingPresenterProv: Provider ) { - lateinit var startupMode: StartupMode + // NOTE TO DEVELOPERS: This must only be used after parameters have been guaranteed to be loaded. + private val postParamLoadingPresenter by lazy { postParamLoadingPresenterProv.get() } fun handleOnCreate() { DataBindingUtil.setContentView( @@ -92,369 +91,443 @@ class SplashActivityPresenter @Inject constructor( isOnBetaFlavor = currentBuildFlavor == BuildFlavor.BETA } - subscribeToOnboardingFlow() + // The very first thing that must be done during app initialization is loading platform + // parameters and feature flags (since even the onboarding logic can depend on these). + subscribeToPlatformParameterInitialization() + } + + fun handleOnDeprecationNoticeCloseAppButtonClicked() { + postParamLoadingPresenter.handleOnDeprecationNoticeCloseAppButtonClicked() + } + + fun handleOnBetaNoticeOkayButtonClicked(permanentlyDismiss: Boolean) { + postParamLoadingPresenter.handleOnBetaNoticeOkayButtonClicked(permanentlyDismiss) + } + + fun handleOnGaUpgradeNoticeOkayButtonClicked(permanentlyDismiss: Boolean) { + postParamLoadingPresenter.handleOnGaUpgradeNoticeOkayButtonClicked(permanentlyDismiss) } fun handleOnDeprecationNoticeActionClicked( noticeActionResponse: DeprecationNoticeActionResponse ) { - when (noticeActionResponse) { - is DeprecationNoticeActionResponse.Close -> handleOnDeprecationNoticeCloseAppButtonClicked() - is DeprecationNoticeActionResponse.Dismiss -> handleOnDeprecationNoticeDialogDismissed( - deprecationNoticeType = noticeActionResponse.deprecationNoticeType, - deprecatedVersion = noticeActionResponse.deprecatedVersion - ) - is DeprecationNoticeActionResponse.Update -> handleOnDeprecationNoticeUpdateButtonClicked() - } + postParamLoadingPresenter.handleOnDeprecationNoticeActionClicked(noticeActionResponse) } - /** Handles cases where the user clicks the close app option on a deprecation notice dialog. */ - fun handleOnDeprecationNoticeCloseAppButtonClicked() { - // If the app close button is clicked for the deprecation notice, finish the activity to close - // the app. - activity.finish() + private fun subscribeToPlatformParameterInitialization() { + val liveData = platformParameterController.getParameterInitializationStatus().toLiveData() + liveData.observe( + activity, + object : Observer> { + override fun onChanged(result: AsyncResult) { + if (result !is AsyncResult.Success) { + oppiaLogger.e( + "SplashActivity", + "Encountered non-successful parameter initialization result: $result." + ) + // Attempt to continue. + } else if (!result.value) return // Parameter initialization hasn't completed yet. + liveData.removeObserver(this) + postParamLoadingPresenter.subscribeToOnboardingFlow() + } + } + ) } - /** Handles cases where the user clicks the update button on a deprecation notice dialog. */ - private fun handleOnDeprecationNoticeUpdateButtonClicked() { - // If the Update button is clicked for the deprecation notice, launch the Play Store and open - // the Oppia app's page. - val packageName = activity.packageName + /** + * The parts of [SplashActivityPresenter] that can only run after platform parameters and feature + * flags have fully initialized in the app. + * + * This contains the bulk of splash startup logic and can rely on platform parameters and feature + * flags for functionality gating or configuration. + */ + class PostParameterLoadingSplashActivityPresenter @Inject constructor( + private val activity: AppCompatActivity, + private val oppiaLogger: OppiaLogger, + private val appStartupStateController: AppStartupStateController, + private val translationController: TranslationController, + private val localeController: LocaleController, + private val deprecationController: DeprecationController, + private val appLanguageLocaleHandler: AppLanguageLocaleHandler, + private val lifecycleSafeTimerFactory: LifecycleSafeTimerFactory, + private val currentBuildFlavor: BuildFlavor, + private val profileManagementController: ProfileManagementController, + @EnableAppAndOsDeprecation + private val enableAppAndOsDeprecationProvider: PlatformParameterValue, + @EnableOnboardingFlowV2 + private val enableOnboardingFlowV2Provider: PlatformParameterValue, + @EnableMultipleClassrooms + private val enableMultipleClassroomsProvider: PlatformParameterValue + ) { + private lateinit var startupMode: StartupMode + + fun handleOnDeprecationNoticeActionClicked( + noticeActionResponse: DeprecationNoticeActionResponse + ) { + when (noticeActionResponse) { + is DeprecationNoticeActionResponse.Close -> handleOnDeprecationNoticeCloseAppButtonClicked() + is DeprecationNoticeActionResponse.Dismiss -> handleOnDeprecationNoticeDialogDismissed( + deprecationNoticeType = noticeActionResponse.deprecationNoticeType, + deprecatedVersion = noticeActionResponse.deprecatedVersion + ) + is DeprecationNoticeActionResponse.Update -> handleOnDeprecationNoticeUpdateButtonClicked() + } + } + + /** Handles cases where the user clicks the close app option on a deprecation notice dialog. */ + fun handleOnDeprecationNoticeCloseAppButtonClicked() { + // If the app close button is clicked for the deprecation notice, finish the activity to close + // the app. + activity.finish() + } + + /** Handles cases where the user clicks the update button on a deprecation notice dialog. */ + private fun handleOnDeprecationNoticeUpdateButtonClicked() { + // If the Update button is clicked for the deprecation notice, launch the Play Store and open + // the Oppia app's page. + val packageName = activity.packageName - try { - activity.startActivity( - Intent(Intent.ACTION_VIEW, Uri.parse("market://details?id=$packageName")) - ) - } catch (e: ActivityNotFoundException) { - activity.startActivity( - Intent( - Intent.ACTION_VIEW, - Uri.parse( - "https://play.google.com/store/apps/details?id=$packageName" + try { + activity.startActivity( + Intent(Intent.ACTION_VIEW, Uri.parse("market://details?id=$packageName")) + ) + } catch (e: ActivityNotFoundException) { + activity.startActivity( + Intent( + Intent.ACTION_VIEW, + Uri.parse( + "https://play.google.com/store/apps/details?id=$packageName" + ) ) ) - ) - } + } - // Finish splash activity to close the app in anticipation of an update. - activity.finish() - } + // Finish splash activity to close the app in anticipation of an update. + activity.finish() + } - /** Handles cases where the user dismisses the deprecation notice dialog. */ - private fun handleOnDeprecationNoticeDialogDismissed( - deprecationNoticeType: DeprecationNoticeType, - deprecatedVersion: Int - ) { - val deprecationResponse = DeprecationResponse.newBuilder() - .setDeprecationNoticeType(deprecationNoticeType) - .setDeprecatedVersion(deprecatedVersion) - .build() + /** Handles cases where the user dismisses the deprecation notice dialog. */ + private fun handleOnDeprecationNoticeDialogDismissed( + deprecationNoticeType: DeprecationNoticeType, + deprecatedVersion: Int + ) { + val deprecationResponse = DeprecationResponse.newBuilder() + .setDeprecationNoticeType(deprecationNoticeType) + .setDeprecatedVersion(deprecatedVersion) + .build() - deprecationController.saveDeprecationResponse(deprecationResponse) + deprecationController.saveDeprecationResponse(deprecationResponse) - // If the Dismiss button is clicked for the deprecation notice, the dialog is automatically - // dismissed. Navigate to profile chooser activity. - activity.startActivity(ProfileChooserActivity.createProfileChooserActivity(activity)) - activity.finish() - } + // If the Dismiss button is clicked for the deprecation notice, the dialog is automatically + // dismissed. Navigate to profile chooser activity. + activity.startActivity(ProfileChooserActivity.createProfileChooserActivity(activity)) + activity.finish() + } - /** Handles cases when the user dismisses the beta notice dialog. */ - fun handleOnBetaNoticeOkayButtonClicked(permanentlyDismiss: Boolean) { - if (permanentlyDismiss) { - appStartupStateController.dismissBetaNoticesPermanently() + /** Handles cases when the user dismisses the beta notice dialog. */ + fun handleOnBetaNoticeOkayButtonClicked(permanentlyDismiss: Boolean) { + if (permanentlyDismiss) { + appStartupStateController.dismissBetaNoticesPermanently() + } + processStartupMode() } - processStartupMode() - } - /** Handles cases when the user dismisses the general availability update notice dialog. */ - fun handleOnGaUpgradeNoticeOkayButtonClicked(permanentlyDismiss: Boolean) { - if (permanentlyDismiss) { - appStartupStateController.dismissGaUpgradeNoticesPermanently() + /** Handles cases when the user dismisses the general availability update notice dialog. */ + fun handleOnGaUpgradeNoticeOkayButtonClicked(permanentlyDismiss: Boolean) { + if (permanentlyDismiss) { + appStartupStateController.dismissGaUpgradeNoticesPermanently() + } + processStartupMode() } - processStartupMode() - } - private fun subscribeToOnboardingFlow() { - val liveData = computeInitStateDataProvider().toLiveData() - liveData.observe( - activity, - object : Observer> { - override fun onChanged(initStateResult: AsyncResult) { - when (initStateResult) { - is AsyncResult.Pending -> { - // Ensure that pending states last no longer than 5 seconds. In cases where the app - // enters a bad state, this ensures that the user doesn't become stuck on the splash - // screen. - lifecycleSafeTimerFactory.createTimer(timeoutMillis = 5000).observe(activity) { - processInitState(SplashInitState.computeDefault(localeController)) + fun subscribeToOnboardingFlow() { + val liveData = computeInitStateDataProvider().toLiveData() + liveData.observe( + activity, + object : Observer> { + override fun onChanged(initStateResult: AsyncResult) { + when (initStateResult) { + is AsyncResult.Pending -> { + // Ensure that pending states last no longer than 5 seconds. In cases where the app + // enters a bad state, this ensures that the user doesn't become stuck on the splash + // screen. + lifecycleSafeTimerFactory.createTimer(timeoutMillis = 5000).observe(activity) { + processInitState(SplashInitState.computeDefault(localeController)) + } + } + is AsyncResult.Failure -> { + oppiaLogger.e( + "SplashActivity", "Failed to compute initial state", initStateResult.error + ) + } + is AsyncResult.Success -> { + // It's possible for the observer to still be active & change due to the next + // activity causing a notification to be posted. That's always invalid to process + // here: the splash activity should never do anything after its initial state since + // it always finishes (or in the case of the deprecation dialog, blocks) the + // activity. + liveData.removeObserver(this) + processInitState(initStateResult.value) } - } - is AsyncResult.Failure -> { - oppiaLogger.e( - "SplashActivity", "Failed to compute initial state", initStateResult.error - ) - } - is AsyncResult.Success -> { - // It's possible for the observer to still be active & change due to the next activity - // causing a notification to be posted. That's always invalid to process here: the - // splash activity should never do anything after its initial state since it always - // finishes (or in the case of the deprecation dialog, blocks) the activity. - liveData.removeObserver(this) - processInitState(initStateResult.value) } } } - } - ) - } - - private fun processInitState(initState: SplashInitState) { - // First, initialize the app's initial locale. Note that since the activity can be - // reopened, it's possible for this to be initialized more than once. - if (!appLanguageLocaleHandler.isInitialized()) { - appLanguageLocaleHandler.initializeLocale(initState.displayLocale) + ) } - // Second, prepare to route the user to the correct destination. - startupMode = initState.appStartupState.startupMode - - // Third, show any dismissible notices (if the app isn't deprecated). - if (startupMode != StartupMode.APP_IS_DEPRECATED) { - when (initState.appStartupState.buildFlavorNoticeMode) { - BuildFlavorNoticeMode.FLAVOR_NOTICE_MODE_UNSPECIFIED, BuildFlavorNoticeMode.NO_NOTICE, - BuildFlavorNoticeMode.UNRECOGNIZED, null -> { - // No notice should be shown. However, when a pre-release version of the app is active - // that changes the splash screen have it wait a bit longer so that the build flavor can - // be clearly seen. The developer build isn't part of the wait to ensure fast startup - // times (for development purposes). - when (currentBuildFlavor) { - BuildFlavor.BUILD_FLAVOR_UNSPECIFIED, BuildFlavor.UNRECOGNIZED, - BuildFlavor.TESTING, BuildFlavor.DEVELOPER, BuildFlavor.GENERAL_AVAILABILITY -> - processStartupMode() - BuildFlavor.ALPHA, BuildFlavor.BETA -> { - lifecycleSafeTimerFactory.createTimer(timeoutMillis = 2000).observe(activity) { + private fun processInitState(initState: SplashInitState) { + // First, initialize the app's initial locale. Note that since the activity can be + // reopened, it's possible for this to be initialized more than once. + if (!appLanguageLocaleHandler.isInitialized()) { + appLanguageLocaleHandler.initializeLocale(initState.displayLocale) + } + + // Second, prepare to route the user to the correct destination. + startupMode = initState.appStartupState.startupMode + + // Third, show any dismissible notices (if the app isn't deprecated). + if (startupMode != StartupMode.APP_IS_DEPRECATED) { + when (initState.appStartupState.buildFlavorNoticeMode) { + BuildFlavorNoticeMode.FLAVOR_NOTICE_MODE_UNSPECIFIED, BuildFlavorNoticeMode.NO_NOTICE, + BuildFlavorNoticeMode.UNRECOGNIZED, null -> { + // No notice should be shown. However, when a pre-release version of the app is active + // that changes the splash screen have it wait a bit longer so that the build flavor can + // be clearly seen. The developer build isn't part of the wait to ensure fast startup + // times (for development purposes). + when (currentBuildFlavor) { + BuildFlavor.BUILD_FLAVOR_UNSPECIFIED, BuildFlavor.UNRECOGNIZED, + BuildFlavor.TESTING, BuildFlavor.DEVELOPER, BuildFlavor.GENERAL_AVAILABILITY -> processStartupMode() + BuildFlavor.ALPHA, BuildFlavor.BETA -> { + lifecycleSafeTimerFactory.createTimer(timeoutMillis = 2000).observe(activity) { + processStartupMode() + } } } } + BuildFlavorNoticeMode.SHOW_BETA_NOTICE -> + showDialog(BETA_NOTICE_DIALOG_FRAGMENT_TAG, BetaNoticeDialogFragment::newInstance) + BuildFlavorNoticeMode.SHOW_UPGRADE_TO_GENERAL_AVAILABILITY_NOTICE -> { + showDialog( + GA_UPDATE_NOTICE_DIALOG_FRAGMENT_TAG, + GeneralAvailabilityUpgradeNoticeDialogFragment::newInstance + ) + } } - BuildFlavorNoticeMode.SHOW_BETA_NOTICE -> - showDialog(BETA_NOTICE_DIALOG_FRAGMENT_TAG, BetaNoticeDialogFragment::newInstance) - BuildFlavorNoticeMode.SHOW_UPGRADE_TO_GENERAL_AVAILABILITY_NOTICE -> { - showDialog( - GA_UPDATE_NOTICE_DIALOG_FRAGMENT_TAG, - GeneralAvailabilityUpgradeNoticeDialogFragment::newInstance - ) - } - } - } else processStartupMode() - } - - private fun processStartupMode() { - if (enableAppAndOsDeprecation.value) { - processAppAndOsDeprecationEnabledStartUpMode() - } else { - processLegacyStartupMode() + } else processStartupMode() } - } - private fun processAppAndOsDeprecationEnabledStartUpMode() { - when (startupMode) { - StartupMode.USER_IS_ONBOARDED -> handleUserOnboarded() - StartupMode.APP_IS_DEPRECATED -> { - showDialog( - FORCED_DEPRECATION_NOTICE_DIALOG_FRAGMENT_TAG, - ForcedAppDeprecationNoticeDialogFragment::newInstance - ) - } - StartupMode.OPTIONAL_UPDATE_AVAILABLE -> { - showDialog( - OPTIONAL_UPDATE_NOTICE_DIALOG_FRAGMENT_TAG, - OptionalAppDeprecationNoticeDialogFragment::newInstance - ) - } - StartupMode.OS_IS_DEPRECATED -> { - showDialog( - OS_UPDATE_NOTICE_DIALOG_FRAGMENT_TAG, - OsDeprecationNoticeDialogFragment::newInstance - ) - } - StartupMode.USER_NOT_YET_ONBOARDED -> fetchProfile() - else -> { - // In all other cases (including errors when the startup state fails to load or is - // defaulted), assume the user needs to be onboarded. - launchOnboardingActivity() - activity.finish() + private fun processStartupMode() { + if (enableAppAndOsDeprecationProvider.value) { + processAppAndOsDeprecationEnabledStartUpMode() + } else { + processLegacyStartupMode() } } - } - private fun processLegacyStartupMode() { - when (startupMode) { - StartupMode.USER_IS_ONBOARDED -> handleUserOnboarded() - StartupMode.APP_IS_DEPRECATED -> { - showDialog( - AUTO_DEPRECATION_NOTICE_DIALOG_FRAGMENT_TAG, - AutomaticAppDeprecationNoticeDialogFragment::newInstance - ) - } - StartupMode.USER_NOT_YET_ONBOARDED -> fetchProfile() - else -> { - // In all other cases (including errors when the startup state fails to load or is - // defaulted), assume the user needs to be onboarded. - launchOnboardingActivity() + private fun processAppAndOsDeprecationEnabledStartUpMode() { + when (startupMode) { + StartupMode.USER_IS_ONBOARDED -> handleUserOnboarded() + StartupMode.APP_IS_DEPRECATED -> { + showDialog( + FORCED_DEPRECATION_NOTICE_DIALOG_FRAGMENT_TAG, + ForcedAppDeprecationNoticeDialogFragment::newInstance + ) + } + StartupMode.OPTIONAL_UPDATE_AVAILABLE -> { + showDialog( + OPTIONAL_UPDATE_NOTICE_DIALOG_FRAGMENT_TAG, + OptionalAppDeprecationNoticeDialogFragment::newInstance + ) + } + StartupMode.OS_IS_DEPRECATED -> { + showDialog( + OS_UPDATE_NOTICE_DIALOG_FRAGMENT_TAG, + OsDeprecationNoticeDialogFragment::newInstance + ) + } + StartupMode.USER_NOT_YET_ONBOARDED -> fetchProfile() + else -> { + // In all other cases (including errors when the startup state fails to load or is + // defaulted), assume the user needs to be onboarded. + launchOnboardingActivity() + activity.finish() + } } } - } - - private fun handleUserOnboarded() { - if (enableOnboardingFlowV2.value) { - getProfileOnboardingState() - } else { - activity.startActivity(ProfileChooserActivity.createProfileChooserActivity(activity)) - activity.finish() - } - } - private fun getProfileOnboardingState() { - profileManagementController.getProfileOnboardingMode().toLiveData().observe( - activity, - { result -> - when (result) { - is AsyncResult.Success -> computeLoginRoute(result.value) - is AsyncResult.Failure -> oppiaLogger.e( - "SplashActivity", - "Encountered unexpected non-successful result when fetching onboarding state", - result.error + private fun processLegacyStartupMode() { + when (startupMode) { + StartupMode.USER_IS_ONBOARDED -> handleUserOnboarded() + StartupMode.APP_IS_DEPRECATED -> { + showDialog( + AUTO_DEPRECATION_NOTICE_DIALOG_FRAGMENT_TAG, + AutomaticAppDeprecationNoticeDialogFragment::newInstance ) - is AsyncResult.Pending -> {} + } + StartupMode.USER_NOT_YET_ONBOARDED -> fetchProfile() + else -> { + // In all other cases (including errors when the startup state fails to load or is + // defaulted), assume the user needs to be onboarded. + launchOnboardingActivity() } } - ) - } + } - private fun computeLoginRoute(onboardingMode: ProfileOnboardingMode) { - when (onboardingMode) { - ProfileOnboardingMode.NEW_INSTALL -> { - launchOnboardingActivity() - } - ProfileOnboardingMode.SOLE_LEARNER_PROFILE_ONLY -> fetchProfile() - else -> { + private fun handleUserOnboarded() { + if (enableOnboardingFlowV2Provider.value) { + getProfileOnboardingState() + } else { activity.startActivity(ProfileChooserActivity.createProfileChooserActivity(activity)) activity.finish() } } - } - private fun fetchProfile() { - val liveData = profileManagementController.getProfiles().toLiveData() - liveData.observe( - activity, - object : Observer>> { - override fun onChanged(result: AsyncResult>) { + private fun getProfileOnboardingState() { + profileManagementController.getProfileOnboardingMode().toLiveData().observe( + activity, + { result -> when (result) { - is AsyncResult.Success -> { - handleProfiles(result.value) - // Changes to underlying DataProviders will update the profiles result, - // causing an infinite login loop. At this point we are not interested in further - // updates to the profiles DataProvider. - liveData.removeObserver(this) - } + is AsyncResult.Success -> computeLoginRoute(result.value) is AsyncResult.Failure -> oppiaLogger.e( - "SplashActivity", "Failed to retrieve the list of profiles", result.error + "SplashActivity", + "Encountered unexpected non-successful result when fetching onboarding state", + result.error ) - is AsyncResult.Pending -> {} // no-op + is AsyncResult.Pending -> {} } } + ) + } + + private fun computeLoginRoute(onboardingMode: ProfileOnboardingMode) { + when (onboardingMode) { + ProfileOnboardingMode.NEW_INSTALL -> { + launchOnboardingActivity() + } + ProfileOnboardingMode.SOLE_LEARNER_PROFILE_ONLY -> fetchProfile() + else -> { + activity.startActivity(ProfileChooserActivity.createProfileChooserActivity(activity)) + activity.finish() + } } - ) - } + } - private fun handleProfiles(profiles: List) { - val soleLearnerProfile = profiles.find { it.profileType == ProfileType.SOLE_LEARNER } - if (soleLearnerProfile != null) { - proceedBasedOnProfileState(soleLearnerProfile) - } else { - launchOnboardingActivity() + private fun fetchProfile() { + val liveData = profileManagementController.getProfiles().toLiveData() + liveData.observe( + activity, + object : Observer>> { + override fun onChanged(result: AsyncResult>) { + when (result) { + is AsyncResult.Success -> { + handleProfiles(result.value) + // Changes to underlying DataProviders will update the profiles result, + // causing an infinite login loop. At this point we are not interested in further + // updates to the profiles DataProvider. + liveData.removeObserver(this) + } + is AsyncResult.Failure -> oppiaLogger.e( + "SplashActivity", "Failed to retrieve the list of profiles", result.error + ) + is AsyncResult.Pending -> {} // no-op + } + } + } + ) } - } - private fun proceedBasedOnProfileState(profile: Profile) { - when { - profile.startedProfileOnboarding && !profile.completedProfileOnboarding -> { - resumeOnboarding(profile.id, profile.name) + private fun handleProfiles(profiles: List) { + val soleLearnerProfile = profiles.find { it.profileType == ProfileType.SOLE_LEARNER } + if (soleLearnerProfile != null) { + proceedBasedOnProfileState(soleLearnerProfile) + } else { + launchOnboardingActivity() } - profile.startedProfileOnboarding && profile.completedProfileOnboarding -> { - logInToProfile(profile.id) + } + + private fun proceedBasedOnProfileState(profile: Profile) { + when { + profile.startedProfileOnboarding && !profile.completedProfileOnboarding -> { + resumeOnboarding(profile.id, profile.name) + } + profile.startedProfileOnboarding && profile.completedProfileOnboarding -> { + logInToProfile(profile.id) + } + else -> launchOnboardingActivity() } - else -> launchOnboardingActivity() } - } - private fun resumeOnboarding(profileId: ProfileId, profileName: String) { - val introActivityParams = IntroActivityParams.newBuilder() - .setProfileNickname(profileName) - .build() + private fun resumeOnboarding(profileId: ProfileId, profileName: String) { + val introActivityParams = IntroActivityParams.newBuilder() + .setProfileNickname(profileName) + .build() + + val intent = IntroActivity.createIntroActivity(activity).apply { + putProtoExtra(PARAMS_KEY, introActivityParams) + decorateWithUserProfileId(profileId) + } - val intent = IntroActivity.createIntroActivity(activity).apply { - putProtoExtra(PARAMS_KEY, introActivityParams) - decorateWithUserProfileId(profileId) + activity.startActivity(intent) } - activity.startActivity(intent) - } + private fun logInToProfile(profileId: ProfileId) { + profileManagementController.loginToProfile(profileId) + .toLiveData() + .observe(activity) { result -> + if (result is AsyncResult.Success && !activity.isFinishing) { + launchHomeScreen(profileId) + } + } + } - private fun logInToProfile(profileId: ProfileId) { - profileManagementController.loginToProfile(profileId).toLiveData().observe(activity) { result -> - if (result is AsyncResult.Success && !activity.isFinishing) { - launchHomeScreen(profileId) + private fun launchHomeScreen(profileId: ProfileId) { + val intent = if (enableMultipleClassroomsProvider.value) { + ClassroomListActivity.createClassroomListActivity(activity, profileId) + } else { + HomeActivity.createHomeActivity(activity, profileId) } + activity.startActivity(intent) + activity.finish() } - } - private fun launchHomeScreen(profileId: ProfileId) { - val intent = if (enableMultipleClassrooms.value) { - ClassroomListActivity.createClassroomListActivity(activity, profileId) - } else { - HomeActivity.createHomeActivity(activity, profileId) + private fun launchOnboardingActivity() { + activity.startActivity(OnboardingActivity.createOnboardingActivity(activity)) + activity.finish() } - activity.startActivity(intent) - activity.finish() - } - - private fun launchOnboardingActivity() { - activity.startActivity(OnboardingActivity.createOnboardingActivity(activity)) - activity.finish() - } - private fun computeInitStateDataProvider(): DataProvider { - val startupStateDataProvider = appStartupStateController.getAppStartupState() - val systemAppLanguageLocaleDataProvider = translationController.getSystemLanguageLocale() - return startupStateDataProvider.combineWith( - systemAppLanguageLocaleDataProvider, SPLASH_INIT_STATE_DATA_PROVIDER_ID - ) { startupState, systemAppLanguageLocale -> - SplashInitState(startupState, systemAppLanguageLocale) + private fun computeInitStateDataProvider(): DataProvider { + val startupStateDataProvider = appStartupStateController.getAppStartupState() + val systemAppLanguageLocaleDataProvider = translationController.getSystemLanguageLocale() + return startupStateDataProvider.combineWith( + systemAppLanguageLocaleDataProvider, SPLASH_INIT_STATE_DATA_PROVIDER_ID + ) { startupState, systemAppLanguageLocale -> + SplashInitState(startupState, systemAppLanguageLocale) + } } - } - private inline fun showDialog(tag: String, createFragment: () -> T) { - if (activity.supportFragmentManager.findFragmentByTag(tag) as? T == null) { - activity.supportFragmentManager.beginTransaction().add(createFragment(), tag).commitNow() + private inline fun showDialog( + tag: String, + createFragment: () -> T + ) { + if (activity.supportFragmentManager.findFragmentByTag(tag) as? T == null) { + activity.supportFragmentManager.beginTransaction().add(createFragment(), tag).commitNow() + } } - } - private data class SplashInitState( - val appStartupState: AppStartupState, - val displayLocale: OppiaLocale.DisplayLocale - ) { - companion object { - fun computeDefault(localeController: LocaleController): SplashInitState { - return SplashInitState( - appStartupState = AppStartupState.getDefaultInstance(), - displayLocale = localeController.reconstituteDisplayLocale( - localeController.getLikelyDefaultAppStringLocaleContext() + private data class SplashInitState( + val appStartupState: AppStartupState, + val displayLocale: OppiaLocale.DisplayLocale + ) { + companion object { + fun computeDefault(localeController: LocaleController): SplashInitState { + return SplashInitState( + appStartupState = AppStartupState.getDefaultInstance(), + displayLocale = localeController.reconstituteDisplayLocale( + localeController.getLikelyDefaultAppStringLocaleContext() + ) ) - ) + } } } } diff --git a/app/src/main/java/org/oppia/android/app/testing/SplashTestActivityPresenter.kt b/app/src/main/java/org/oppia/android/app/testing/SplashTestActivityPresenter.kt index 138c70c21c4..7e354824321 100644 --- a/app/src/main/java/org/oppia/android/app/testing/SplashTestActivityPresenter.kt +++ b/app/src/main/java/org/oppia/android/app/testing/SplashTestActivityPresenter.kt @@ -2,9 +2,6 @@ package org.oppia.android.app.testing import android.widget.Toast import androidx.appcompat.app.AppCompatActivity -import androidx.lifecycle.LiveData -import androidx.lifecycle.Observer -import androidx.lifecycle.Transformations import org.oppia.android.app.activity.ActivityScope import org.oppia.android.app.ui.R import org.oppia.android.domain.platformparameter.PlatformParameterController @@ -32,23 +29,11 @@ class SplashTestActivityPresenter @Inject constructor( * parameter singleton. */ fun loadPlatformParameters() { - fetchPlatformParametersFromDatabase().observe( - activity, - Observer { + platformParameterController.getParameterInitializationStatus().toLiveData().observe(activity) { + if (it is AsyncResult.Success && it.value) { showToastIfAllowed() } - ) - } - - private fun fetchPlatformParametersFromDatabase(): LiveData { - return Transformations.map( - platformParameterController.getParameterDatabase().toLiveData(), - ::processPlatformParameters - ) - } - - private fun processPlatformParameters(loadingStatus: AsyncResult): Boolean { - return loadingStatus is AsyncResult.Success + } } private fun showToastIfAllowed() { 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 b24e960716c..f6a888b85ef 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 @@ -154,6 +154,7 @@ class AdministratorControlsActivityTest { @Test fun testAdministratorControls_hasCorrectActivityLabel() { + setUpTestApplicationComponent() launch( createAdministratorControlsActivityIntent(profileId) ).use { @@ -169,25 +170,28 @@ class AdministratorControlsActivityTest { @Before fun setUp() { - TestPlatformParameterModule.forceEnableEditAccountsOptionsUi(true) Intents.init() - setUpTestApplicationComponent() - testCoroutineDispatchers.registerIdlingResource() - profileTestHelper.initializeProfiles() + // TODO(#5835): Call setUpTestApplicationComponent() here once flag overrides init earlier. } @After fun tearDown() { + TestPlatformParameterModule.reset() testCoroutineDispatchers.unregisterIdlingResource() Intents.release() } private fun setUpTestApplicationComponent() { ApplicationProvider.getApplicationContext().inject(this) + testCoroutineDispatchers.registerIdlingResource() + profileTestHelper.initializeProfiles() } @Test fun testAdministratorControlsFragment_clickEditProfile_opensProfileListActivity() { + // TODO(#5835): Make this the default for the test suite & remove it from other tests. + TestPlatformParameterModule.forceEnableEditAccountsOptionsUi(true) + setUpTestApplicationComponent() launch( createAdministratorControlsActivityIntent( profileId = profileId @@ -201,6 +205,8 @@ class AdministratorControlsActivityTest { @Test fun testAdministratorControlsFragment_editAccountOptionsEnabled_generalOptionsIsDisplayed() { + TestPlatformParameterModule.forceEnableEditAccountsOptionsUi(true) + setUpTestApplicationComponent() launch( createAdministratorControlsActivityIntent( profileId = profileId @@ -224,6 +230,7 @@ class AdministratorControlsActivityTest { @Test fun testAdministratorControlsFragment_editAccountOptionsDisabled_generalOptionsIsNotDisplayed() { TestPlatformParameterModule.forceEnableEditAccountsOptionsUi(false) + setUpTestApplicationComponent() launch( createAdministratorControlsActivityIntent( @@ -246,6 +253,8 @@ class AdministratorControlsActivityTest { @Test fun testAdministratorControlsFragment_profileManagementIsDisplayed() { + TestPlatformParameterModule.forceEnableEditAccountsOptionsUi(true) + setUpTestApplicationComponent() launch( createAdministratorControlsActivityIntent( profileId = profileId @@ -268,6 +277,8 @@ class AdministratorControlsActivityTest { @Test fun testAdministratorControlsFragment_clickOkButtonInLogoutDialog_opensProfileChooserActivity() { + TestPlatformParameterModule.forceEnableEditAccountsOptionsUi(true) + setUpTestApplicationComponent() launch( createAdministratorControlsActivityIntent( profileId = profileId @@ -284,6 +295,8 @@ class AdministratorControlsActivityTest { @Test fun testAdministratorControlsFragment_clickAppVersion_opensAppVersionActivity() { + TestPlatformParameterModule.forceEnableEditAccountsOptionsUi(true) + setUpTestApplicationComponent() launch( createAdministratorControlsActivityIntent( profileId = profileId @@ -298,6 +311,8 @@ class AdministratorControlsActivityTest { @Test fun testAdministratorControls_selectAdminNavItem_adminControlsIsDisplayed() { + TestPlatformParameterModule.forceEnableEditAccountsOptionsUi(true) + setUpTestApplicationComponent() launch( createAdministratorControlsActivityIntent( profileId = profileId @@ -313,6 +328,8 @@ class AdministratorControlsActivityTest { @Test fun testAdministratorControlsFragment_clickLogoutButton_logoutDialogIsDisplayed() { + TestPlatformParameterModule.forceEnableEditAccountsOptionsUi(true) + setUpTestApplicationComponent() launch( createAdministratorControlsActivityIntent( profileId = profileId @@ -329,6 +346,8 @@ class AdministratorControlsActivityTest { @Test fun testAdministratorControlsFragment_configChange_clickLogout_logoutDialogIsDisplayed() { + TestPlatformParameterModule.forceEnableEditAccountsOptionsUi(true) + setUpTestApplicationComponent() launch( createAdministratorControlsActivityIntent( profileId = profileId @@ -347,6 +366,8 @@ class AdministratorControlsActivityTest { @Test fun testAdministratorControlsFragment_clickLogout_configChange_logoutDialogIsDisplayed() { + TestPlatformParameterModule.forceEnableEditAccountsOptionsUi(true) + setUpTestApplicationComponent() launch( createAdministratorControlsActivityIntent( profileId = profileId @@ -364,6 +385,8 @@ class AdministratorControlsActivityTest { @Test fun testAdministratorControlsFragment_clickCancelButtonInLogoutDialog_dialogIsDismissed() { + TestPlatformParameterModule.forceEnableEditAccountsOptionsUi(true) + setUpTestApplicationComponent() launch( createAdministratorControlsActivityIntent( profileId = profileId @@ -381,6 +404,8 @@ class AdministratorControlsActivityTest { @Test @Config(qualifiers = "sw600dp") fun testAdministratorControls_defaultTabletConfig_openAppVersion_replacesPreviousFragment() { + TestPlatformParameterModule.forceEnableEditAccountsOptionsUi(true) + setUpTestApplicationComponent() launch( createAdministratorControlsActivityIntent( profileId = profileId @@ -431,6 +456,8 @@ class AdministratorControlsActivityTest { @Test @Config(qualifiers = "sw600dp") fun testAdministratorControls_defaultTabletConfig_multiPaneBackButtonGone() { + TestPlatformParameterModule.forceEnableEditAccountsOptionsUi(true) + setUpTestApplicationComponent() launch( createAdministratorControlsActivityIntent( profileId = profileId @@ -444,6 +471,8 @@ class AdministratorControlsActivityTest { @Test @Config(qualifiers = "sw600dp") fun testAdministratorControls_tabletConfigChange_multiPaneBackButtonGone() { + TestPlatformParameterModule.forceEnableEditAccountsOptionsUi(true) + setUpTestApplicationComponent() launch( createAdministratorControlsActivityIntent( profileId = profileId @@ -458,6 +487,8 @@ class AdministratorControlsActivityTest { @Test @Config(qualifiers = "sw600dp") fun testAdministratorControls_defaultTabletConfig_editProfileVisible() { + TestPlatformParameterModule.forceEnableEditAccountsOptionsUi(true) + setUpTestApplicationComponent() launch( createAdministratorControlsActivityIntent( profileId = profileId @@ -471,6 +502,8 @@ class AdministratorControlsActivityTest { @Test @Config(qualifiers = "sw600dp") fun testAdministratorControls_tabletConfigChange_editProfileVisible() { + TestPlatformParameterModule.forceEnableEditAccountsOptionsUi(true) + setUpTestApplicationComponent() launch( createAdministratorControlsActivityIntent( profileId = profileId @@ -485,6 +518,8 @@ class AdministratorControlsActivityTest { @Test @Config(qualifiers = "sw600dp") fun testAdministratorControls_defaultTabletConfig_profileListIsDisplayed() { + TestPlatformParameterModule.forceEnableEditAccountsOptionsUi(true) + setUpTestApplicationComponent() launch( createAdministratorControlsActivityIntent( profileId = profileId @@ -502,6 +537,8 @@ class AdministratorControlsActivityTest { @Test @Config(qualifiers = "sw600dp") fun testAdministratorControls_tabletConfigChange_profileListIsDisplayed() { + TestPlatformParameterModule.forceEnableEditAccountsOptionsUi(true) + setUpTestApplicationComponent() launch( createAdministratorControlsActivityIntent( profileId = profileId @@ -521,6 +558,8 @@ class AdministratorControlsActivityTest { @Test @Config(qualifiers = "sw600dp") fun testAdministratorControls_selectProfileAdmin_backButton_selectSecondProfileDisplayed() { + TestPlatformParameterModule.forceEnableEditAccountsOptionsUi(true) + setUpTestApplicationComponent() launch( createAdministratorControlsActivityIntent( profileId = profileId @@ -546,6 +585,8 @@ class AdministratorControlsActivityTest { @Test @Config(qualifiers = "sw600dp") fun testAdministratorControls_selectProfileAdmin_backPressed_selectSecondProfileDisplayed() { + TestPlatformParameterModule.forceEnableEditAccountsOptionsUi(true) + setUpTestApplicationComponent() launch( createAdministratorControlsActivityIntent( profileId = profileId @@ -571,6 +612,8 @@ class AdministratorControlsActivityTest { @Test @Config(qualifiers = "sw600dp") fun testAdministratorControls_selectProfileAdmin_tabletConfigChange_displaysProfileEdit() { + TestPlatformParameterModule.forceEnableEditAccountsOptionsUi(true) + setUpTestApplicationComponent() launch( createAdministratorControlsActivityIntent( profileId = profileId @@ -589,6 +632,8 @@ class AdministratorControlsActivityTest { @Test @Config(qualifiers = "sw600dp") fun testAdministratorControls_selectProfileUser_tabletConfigChange_displaysProfileEdit() { + TestPlatformParameterModule.forceEnableEditAccountsOptionsUi(true) + setUpTestApplicationComponent() launch( createAdministratorControlsActivityIntent( profileId = profileId @@ -607,7 +652,9 @@ class AdministratorControlsActivityTest { @Test @Config(qualifiers = "sw600dp") fun testAdminControls_selectAdmin_tabletConfigChange_downloadsEnabled_hasNoDownloadSettings() { + TestPlatformParameterModule.forceEnableEditAccountsOptionsUi(true) TestPlatformParameterModule.forceEnableDownloadsSupport(true) + setUpTestApplicationComponent() launch( createAdministratorControlsActivityIntent( profileId = profileId @@ -626,7 +673,9 @@ class AdministratorControlsActivityTest { @Test @Config(qualifiers = "sw600dp") fun testAdminControls_selectUser_tabletConfigChange_downloadsEnabled_hasDownloadSettings() { + TestPlatformParameterModule.forceEnableEditAccountsOptionsUi(true) TestPlatformParameterModule.forceEnableDownloadsSupport(true) + setUpTestApplicationComponent() launch( createAdministratorControlsActivityIntent( profileId = profileId @@ -646,7 +695,9 @@ class AdministratorControlsActivityTest { @Test @Config(qualifiers = "sw600dp") fun testAdminControls_selectAdmin_tabletConfigChange_downloadsDisabled_hasNoDownloadSettings() { + TestPlatformParameterModule.forceEnableEditAccountsOptionsUi(true) TestPlatformParameterModule.forceEnableDownloadsSupport(false) + setUpTestApplicationComponent() launch( createAdministratorControlsActivityIntent( profileId = profileId @@ -667,7 +718,9 @@ class AdministratorControlsActivityTest { @Test @Config(qualifiers = "sw600dp") fun testAdminControls_selectUser_tabletConfigChange_downloadsDisabled_hasNoDownloadSettings() { + TestPlatformParameterModule.forceEnableEditAccountsOptionsUi(true) TestPlatformParameterModule.forceEnableDownloadsSupport(false) + setUpTestApplicationComponent() launch( createAdministratorControlsActivityIntent( profileId = profileId @@ -687,6 +740,8 @@ class AdministratorControlsActivityTest { @Test @Config(qualifiers = "sw600dp") fun testAdministratorControlsFragment_clickProfileDeletionButton_checkOpensDeletionDialog() { + TestPlatformParameterModule.forceEnableEditAccountsOptionsUi(true) + setUpTestApplicationComponent() val profileId = ProfileId.newBuilder().setInternalId(1).build() launch( @@ -713,6 +768,8 @@ class AdministratorControlsActivityTest { @Test @Config(qualifiers = "sw600dp") fun testAdministratorControlsFragment_configChange_checkOpensDeletionDialog() { + TestPlatformParameterModule.forceEnableEditAccountsOptionsUi(true) + setUpTestApplicationComponent() val profileId = ProfileId.newBuilder().setInternalId(1).build() launch( @@ -740,6 +797,8 @@ class AdministratorControlsActivityTest { @Test @Config(qualifiers = "sw600dp") fun testAdministratorControlsFragment_configChange_checkDeletionDialogIsVisible() { + TestPlatformParameterModule.forceEnableEditAccountsOptionsUi(true) + setUpTestApplicationComponent() val profileId = ProfileId.newBuilder().setInternalId(1).build() launch( @@ -767,6 +826,8 @@ class AdministratorControlsActivityTest { @Test fun testActivity_createIntent_verifyScreenNameInIntent() { + TestPlatformParameterModule.forceEnableEditAccountsOptionsUi(true) + setUpTestApplicationComponent() val profileId = ProfileId.newBuilder().setInternalId(1).build() val screenName = createAdministratorControlsActivityIntent(profileId) 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 3bbab65cd1c..fea820db00d 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 @@ -148,25 +148,28 @@ class AdministratorControlsFragmentTest { @Before fun setUp() { TestPlatformParameterModule.forceEnableEditAccountsOptionsUi(true) - TestPlatformParameterModule.forceEnableDownloadsSupport(true) Intents.init() - setUpTestApplicationComponent() - profileTestHelper.initializeProfiles() - testCoroutineDispatchers.registerIdlingResource() + // TODO(#5835): Call setUpTestApplicationComponent() here once flag overrides init earlier. } @After fun tearDown() { + TestPlatformParameterModule.reset() testCoroutineDispatchers.unregisterIdlingResource() Intents.release() } private fun setUpTestApplicationComponent() { ApplicationProvider.getApplicationContext().inject(this) + profileTestHelper.initializeProfiles() + testCoroutineDispatchers.registerIdlingResource() } @Test fun testAdministratorControlsFragment_generalAndProfileManagementIsDisplayed() { + // TODO(#5835): Make this the default for the test suite & remove it from other tests. + TestPlatformParameterModule.forceEnableDownloadsSupport(true) + setUpTestApplicationComponent() launch( createAdministratorControlsFragmentTestActivityIntent( profileId = internalProfileId @@ -201,6 +204,8 @@ class AdministratorControlsFragmentTest { @Test fun testAdministratorControlsFragment_downloadPermissionsAndSettingsIsDisplayed() { + TestPlatformParameterModule.forceEnableDownloadsSupport(true) + setUpTestApplicationComponent() launch( createAdministratorControlsFragmentTestActivityIntent( profileId = internalProfileId @@ -230,6 +235,7 @@ class AdministratorControlsFragmentTest { @Test fun testAdministratorControlsFragment_downloadPermissionsAndSettings_autoUpdateIsNotDisplayed() { TestPlatformParameterModule.forceEnableDownloadsSupport(false) + setUpTestApplicationComponent() launch( createAdministratorControlsFragmentTestActivityIntent( profileId = internalProfileId @@ -252,6 +258,8 @@ class AdministratorControlsFragmentTest { @Test fun testAdministratorControlsFragment_applicationSettingsIsDisplayed() { + TestPlatformParameterModule.forceEnableDownloadsSupport(true) + setUpTestApplicationComponent() launch( createAdministratorControlsFragmentTestActivityIntent( profileId = internalProfileId @@ -286,6 +294,8 @@ class AdministratorControlsFragmentTest { @Test fun testAdministratorControlsFragment_wifiSwitchIsUnchecked() { + TestPlatformParameterModule.forceEnableDownloadsSupport(true) + setUpTestApplicationComponent() launch( createAdministratorControlsFragmentTestActivityIntent( profileId = internalProfileId @@ -298,6 +308,8 @@ class AdministratorControlsFragmentTest { @Test fun testAdministratorControlsFragment_autoUpdateSwitchIsUnchecked() { + TestPlatformParameterModule.forceEnableDownloadsSupport(true) + setUpTestApplicationComponent() launch( createAdministratorControlsFragmentTestActivityIntent( profileId = internalProfileId @@ -311,6 +323,8 @@ class AdministratorControlsFragmentTest { @Test fun testAdministratorControlsFragment_clickWifiContainer_wifiSwitchIsChecked() { + TestPlatformParameterModule.forceEnableDownloadsSupport(true) + setUpTestApplicationComponent() launch( createAdministratorControlsFragmentTestActivityIntent( profileId = internalProfileId @@ -327,6 +341,8 @@ class AdministratorControlsFragmentTest { @Test fun testAdministratorControlsFragment_clickWifiContainer_orientationLand_wifiSwitchIsChecked() { + TestPlatformParameterModule.forceEnableDownloadsSupport(true) + setUpTestApplicationComponent() launch( createAdministratorControlsFragmentTestActivityIntent( profileId = internalProfileId @@ -345,6 +361,8 @@ class AdministratorControlsFragmentTest { @Test fun testAdministratorControlsFragment_clickWifiContainer_configChange_wifiSwitchIsChecked() { + TestPlatformParameterModule.forceEnableDownloadsSupport(true) + setUpTestApplicationComponent() launch( createAdministratorControlsFragmentTestActivityIntent( profileId = internalProfileId @@ -364,6 +382,8 @@ class AdministratorControlsFragmentTest { @Test fun testAdministratorControls_clickWifiContainer_orientationLand_autoUpdateSwitchIsChecked() { + TestPlatformParameterModule.forceEnableDownloadsSupport(true) + setUpTestApplicationComponent() launch( createAdministratorControlsFragmentTestActivityIntent( profileId = internalProfileId @@ -381,6 +401,8 @@ class AdministratorControlsFragmentTest { @Test fun testAdministratorControls_clickWifiContainer_configChange_autoUpdateSwitchIsChecked() { + TestPlatformParameterModule.forceEnableDownloadsSupport(true) + setUpTestApplicationComponent() launch( createAdministratorControlsFragmentTestActivityIntent( profileId = internalProfileId @@ -399,6 +421,8 @@ class AdministratorControlsFragmentTest { @Test fun testAdministratorControlsFragment_clickAutoUpdateContainer_autoUpdateSwitchIsChecked() { + TestPlatformParameterModule.forceEnableDownloadsSupport(true) + setUpTestApplicationComponent() launch( createAdministratorControlsFragmentTestActivityIntent( profileId = internalProfileId @@ -414,6 +438,8 @@ class AdministratorControlsFragmentTest { @Test fun testAdministratorControlsFragment_nonDownloadPermissionProfile_wifiSwitchIsNonClickable() { + TestPlatformParameterModule.forceEnableDownloadsSupport(true) + setUpTestApplicationComponent() launch( createAdministratorControlsFragmentTestActivityIntent( profileId = internalProfileId @@ -427,6 +453,8 @@ class AdministratorControlsFragmentTest { @Test fun testAdministratorControlsFragment_autoUpdateSwitchIsNonClickable() { + TestPlatformParameterModule.forceEnableDownloadsSupport(true) + setUpTestApplicationComponent() launch( createAdministratorControlsFragmentTestActivityIntent( profileId = internalProfileId @@ -440,6 +468,8 @@ class AdministratorControlsFragmentTest { @Test fun testFragment_argumentsAreCorrect() { + TestPlatformParameterModule.forceEnableDownloadsSupport(true) + setUpTestApplicationComponent() launch( createAdministratorControlsFragmentTestActivityIntent( profileId = internalProfileId diff --git a/app/src/sharedTest/java/org/oppia/android/app/administratorcontrols/appversion/AppVersionActivityTest.kt b/app/src/sharedTest/java/org/oppia/android/app/administratorcontrols/appversion/AppVersionActivityTest.kt index 7485e376a23..c1b9cd6a5a0 100644 --- a/app/src/sharedTest/java/org/oppia/android/app/administratorcontrols/appversion/AppVersionActivityTest.kt +++ b/app/src/sharedTest/java/org/oppia/android/app/administratorcontrols/appversion/AppVersionActivityTest.kt @@ -75,7 +75,6 @@ import org.oppia.android.domain.oppialogger.analytics.ApplicationLifecycleModule import org.oppia.android.domain.oppialogger.analytics.CpuPerformanceSnapshotterModule 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 import org.oppia.android.domain.workmanager.WorkManagerConfigurationModule @@ -83,6 +82,7 @@ import org.oppia.android.testing.OppiaTestRule import org.oppia.android.testing.TestLogReportingModule import org.oppia.android.testing.firebase.TestAuthenticationModule import org.oppia.android.testing.junit.InitializeDefaultLocaleRule +import org.oppia.android.testing.platformparameter.TestPlatformParameterModule import org.oppia.android.testing.robolectric.RobolectricModule import org.oppia.android.testing.threading.TestCoroutineDispatchers import org.oppia.android.testing.threading.TestDispatcherModule @@ -307,7 +307,6 @@ class AppVersionActivityTest { NumberWithUnitsRuleModule::class, NumericExpressionInputModule::class, NumericInputRuleModule::class, - PlatformParameterModule::class, PlatformParameterSingletonModule::class, QuestionModule::class, RatioInputModule::class, @@ -319,6 +318,7 @@ class AppVersionActivityTest { TestAuthenticationModule::class, TestDispatcherModule::class, TestLogReportingModule::class, + TestPlatformParameterModule::class, TestingBuildFlavorModule::class, TextInputRuleModule::class, ViewBindingShimModule::class, diff --git a/app/src/sharedTest/java/org/oppia/android/app/administratorcontrols/learneranalytics/BUILD.bazel b/app/src/sharedTest/java/org/oppia/android/app/administratorcontrols/learneranalytics/BUILD.bazel index 6c5806d5a3c..3fc43638bad 100644 --- a/app/src/sharedTest/java/org/oppia/android/app/administratorcontrols/learneranalytics/BUILD.bazel +++ b/app/src/sharedTest/java/org/oppia/android/app/administratorcontrols/learneranalytics/BUILD.bazel @@ -22,6 +22,7 @@ oppia_android_test( "//app/src/main/java/org/oppia/android/app/translation/testing:test_module", "//testing", "//testing/src/main/java/org/oppia/android/testing/junit:initialize_default_locale_rule", + "//testing/src/main/java/org/oppia/android/testing/platformparameter:test_module", "//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", @@ -31,6 +32,7 @@ oppia_android_test( "//third_party:org_robolectric_robolectric", "//third_party:robolectric_android-all", "//utility/src/main/java/org/oppia/android/util/accessibility:test_module", + "//utility/src/main/java/org/oppia/android/util/caching:asset_prod_module", "//utility/src/main/java/org/oppia/android/util/caching/testing:caching_test_module", "//utility/src/main/java/org/oppia/android/util/logging:prod_module", "//utility/src/main/java/org/oppia/android/util/logging/firebase:debug_module", 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 f56bdad85fe..a2578e44823 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 @@ -67,7 +67,6 @@ import org.oppia.android.domain.oppialogger.analytics.CpuPerformanceSnapshotterM 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.platformparameter.PlatformParameterModule import org.oppia.android.domain.platformparameter.PlatformParameterSingletonModule import org.oppia.android.domain.question.QuestionModule import org.oppia.android.domain.workmanager.WorkManagerConfigurationModule @@ -75,6 +74,7 @@ import org.oppia.android.testing.OppiaTestRule import org.oppia.android.testing.TestLogReportingModule import org.oppia.android.testing.firebase.TestAuthenticationModule import org.oppia.android.testing.junit.InitializeDefaultLocaleRule +import org.oppia.android.testing.platformparameter.TestPlatformParameterModule import org.oppia.android.testing.profile.ProfileTestHelper import org.oppia.android.testing.robolectric.RobolectricModule import org.oppia.android.testing.threading.TestCoroutineDispatchers @@ -246,7 +246,6 @@ class ProfileAndDeviceIdActivityTest { NumberWithUnitsRuleModule::class, NumericExpressionInputModule::class, NumericInputRuleModule::class, - PlatformParameterModule::class, PlatformParameterSingletonModule::class, QuestionModule::class, RatioInputModule::class, @@ -259,6 +258,7 @@ class ProfileAndDeviceIdActivityTest { TestDispatcherModule::class, TestLogReportingModule::class, TestModule::class, + TestPlatformParameterModule::class, TestingBuildFlavorModule::class, TextInputRuleModule::class, ViewBindingShimModule::class, 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 44402d3db1c..af917e2b8fd 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 @@ -191,6 +191,7 @@ class ProfileAndDeviceIdFragmentTest { @After fun tearDown() { + TestPlatformParameterModule.reset() testCoroutineDispatchers.unregisterIdlingResource() Intents.release() } diff --git a/app/src/sharedTest/java/org/oppia/android/app/classroom/ClassroomListActivityTest.kt b/app/src/sharedTest/java/org/oppia/android/app/classroom/ClassroomListActivityTest.kt index 93fc1e5281f..9155a8967dc 100644 --- a/app/src/sharedTest/java/org/oppia/android/app/classroom/ClassroomListActivityTest.kt +++ b/app/src/sharedTest/java/org/oppia/android/app/classroom/ClassroomListActivityTest.kt @@ -59,7 +59,6 @@ import org.oppia.android.domain.oppialogger.analytics.ApplicationLifecycleModule import org.oppia.android.domain.oppialogger.analytics.CpuPerformanceSnapshotterModule 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 import org.oppia.android.domain.workmanager.WorkManagerConfigurationModule @@ -67,6 +66,7 @@ import org.oppia.android.testing.OppiaTestRule import org.oppia.android.testing.TestLogReportingModule import org.oppia.android.testing.firebase.TestAuthenticationModule import org.oppia.android.testing.junit.InitializeDefaultLocaleRule +import org.oppia.android.testing.platformparameter.TestPlatformParameterModule import org.oppia.android.testing.robolectric.RobolectricModule import org.oppia.android.testing.threading.TestCoroutineDispatchers import org.oppia.android.testing.threading.TestDispatcherModule @@ -205,7 +205,6 @@ class ClassroomListActivityTest { NumberWithUnitsRuleModule::class, NumericExpressionInputModule::class, NumericInputRuleModule::class, - PlatformParameterModule::class, PlatformParameterSingletonModule::class, QuestionModule::class, RatioInputModule::class, @@ -217,6 +216,7 @@ class ClassroomListActivityTest { TestAuthenticationModule::class, TestDispatcherModule::class, TestLogReportingModule::class, + TestPlatformParameterModule::class, TestingBuildFlavorModule::class, TextInputRuleModule::class, ViewBindingShimModule::class, 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 d09d346dc3c..8935b7d7f21 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 @@ -78,7 +78,6 @@ import org.oppia.android.domain.oppialogger.analytics.ApplicationLifecycleModule import org.oppia.android.domain.oppialogger.analytics.CpuPerformanceSnapshotterModule 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 import org.oppia.android.domain.topic.FRACTIONS_STORY_ID_0 @@ -88,6 +87,7 @@ import org.oppia.android.testing.OppiaTestRule import org.oppia.android.testing.TestLogReportingModule import org.oppia.android.testing.firebase.TestAuthenticationModule import org.oppia.android.testing.junit.InitializeDefaultLocaleRule +import org.oppia.android.testing.platformparameter.TestPlatformParameterModule import org.oppia.android.testing.robolectric.RobolectricModule import org.oppia.android.testing.story.StoryProgressTestHelper import org.oppia.android.testing.threading.TestCoroutineDispatchers @@ -548,7 +548,6 @@ class CompletedStoryListActivityTest { NumberWithUnitsRuleModule::class, NumericExpressionInputModule::class, NumericInputRuleModule::class, - PlatformParameterModule::class, PlatformParameterSingletonModule::class, QuestionModule::class, RatioInputModule::class, @@ -560,6 +559,7 @@ class CompletedStoryListActivityTest { TestAuthenticationModule::class, TestDispatcherModule::class, TestLogReportingModule::class, + TestPlatformParameterModule::class, TestingBuildFlavorModule::class, TextInputRuleModule::class, ViewBindingShimModule::class, 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 54235ceb829..e4c7c098637 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 @@ -63,7 +63,6 @@ import org.oppia.android.domain.oppialogger.analytics.ApplicationLifecycleModule import org.oppia.android.domain.oppialogger.analytics.CpuPerformanceSnapshotterModule 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 import org.oppia.android.domain.workmanager.WorkManagerConfigurationModule @@ -72,6 +71,7 @@ import org.oppia.android.testing.TestImageLoaderModule import org.oppia.android.testing.TestLogReportingModule import org.oppia.android.testing.firebase.TestAuthenticationModule import org.oppia.android.testing.junit.InitializeDefaultLocaleRule +import org.oppia.android.testing.platformparameter.TestPlatformParameterModule import org.oppia.android.testing.robolectric.RobolectricModule import org.oppia.android.testing.threading.TestCoroutineDispatchers import org.oppia.android.testing.threading.TestDispatcherModule @@ -220,7 +220,6 @@ class LessonThumbnailImageViewTest { NumberWithUnitsRuleModule::class, NumericExpressionInputModule::class, NumericInputRuleModule::class, - PlatformParameterModule::class, PlatformParameterSingletonModule::class, QuestionModule::class, RatioInputModule::class, @@ -233,6 +232,7 @@ class LessonThumbnailImageViewTest { TestDispatcherModule::class, TestImageLoaderModule::class, TestLogReportingModule::class, + TestPlatformParameterModule::class, TestingBuildFlavorModule::class, TextInputRuleModule::class, ViewBindingShimModule::class, diff --git a/app/src/sharedTest/java/org/oppia/android/app/customview/interaction/BUILD.bazel b/app/src/sharedTest/java/org/oppia/android/app/customview/interaction/BUILD.bazel index 65d528e001e..ff13a6e871a 100644 --- a/app/src/sharedTest/java/org/oppia/android/app/customview/interaction/BUILD.bazel +++ b/app/src/sharedTest/java/org/oppia/android/app/customview/interaction/BUILD.bazel @@ -29,6 +29,7 @@ oppia_android_test( "//testing/src/main/java/org/oppia/android/testing/junit:oppia_parameterized_test_runner", "//testing/src/main/java/org/oppia/android/testing/junit:parameterized_auto_android_test_runner", "//testing/src/main/java/org/oppia/android/testing/junit:parameterized_robolectric_test_runner", + "//testing/src/main/java/org/oppia/android/testing/platformparameter:test_module", "//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", @@ -38,6 +39,7 @@ oppia_android_test( "//third_party:org_robolectric_robolectric", "//third_party:robolectric_android-all", "//utility/src/main/java/org/oppia/android/util/accessibility:test_module", + "//utility/src/main/java/org/oppia/android/util/caching:asset_prod_module", "//utility/src/main/java/org/oppia/android/util/caching/testing:caching_test_module", "//utility/src/main/java/org/oppia/android/util/logging/firebase:debug_module", "//utility/src/main/java/org/oppia/android/util/networking:debug_module", 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 d1e347260d2..00a2f408c14 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 @@ -76,7 +76,6 @@ import org.oppia.android.domain.oppialogger.analytics.ApplicationLifecycleModule import org.oppia.android.domain.oppialogger.analytics.CpuPerformanceSnapshotterModule 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 import org.oppia.android.domain.workmanager.WorkManagerConfigurationModule @@ -89,6 +88,7 @@ import org.oppia.android.testing.junit.OppiaParameterizedTestRunner.Iteration import org.oppia.android.testing.junit.OppiaParameterizedTestRunner.Parameter import org.oppia.android.testing.junit.OppiaParameterizedTestRunner.SelectRunnerPlatform import org.oppia.android.testing.junit.ParameterizedAutoAndroidTestRunner +import org.oppia.android.testing.platformparameter.TestPlatformParameterModule import org.oppia.android.testing.robolectric.RobolectricModule import org.oppia.android.testing.threading.TestCoroutineDispatchers import org.oppia.android.testing.threading.TestDispatcherModule @@ -1826,7 +1826,6 @@ class MathExpressionInteractionsViewTest { NumberWithUnitsRuleModule::class, NumericExpressionInputModule::class, NumericInputRuleModule::class, - PlatformParameterModule::class, PlatformParameterSingletonModule::class, QuestionModule::class, RatioInputModule::class, @@ -1838,6 +1837,7 @@ class MathExpressionInteractionsViewTest { TestAuthenticationModule::class, TestDispatcherModule::class, TestLogReportingModule::class, + TestPlatformParameterModule::class, TestingBuildFlavorModule::class, TextInputRuleModule::class, ViewBindingShimModule::class, diff --git a/app/src/sharedTest/java/org/oppia/android/app/databinding/AppCompatCheckBoxBindingAdaptersTest.kt b/app/src/sharedTest/java/org/oppia/android/app/databinding/AppCompatCheckBoxBindingAdaptersTest.kt index 5eb58bb656a..ea13aac023f 100644 --- a/app/src/sharedTest/java/org/oppia/android/app/databinding/AppCompatCheckBoxBindingAdaptersTest.kt +++ b/app/src/sharedTest/java/org/oppia/android/app/databinding/AppCompatCheckBoxBindingAdaptersTest.kt @@ -61,7 +61,6 @@ import org.oppia.android.domain.oppialogger.analytics.ApplicationLifecycleModule import org.oppia.android.domain.oppialogger.analytics.CpuPerformanceSnapshotterModule 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 import org.oppia.android.domain.workmanager.WorkManagerConfigurationModule @@ -69,6 +68,7 @@ import org.oppia.android.testing.TestImageLoaderModule import org.oppia.android.testing.TestLogReportingModule import org.oppia.android.testing.firebase.TestAuthenticationModule import org.oppia.android.testing.junit.InitializeDefaultLocaleRule +import org.oppia.android.testing.platformparameter.TestPlatformParameterModule import org.oppia.android.testing.robolectric.RobolectricModule import org.oppia.android.testing.threading.TestCoroutineDispatchers import org.oppia.android.testing.threading.TestDispatcherModule @@ -188,7 +188,7 @@ class AppCompatCheckBoxBindingAdaptersTest { NumberWithUnitsRuleModule::class, NumericExpressionInputModule::class, NumericInputRuleModule::class, - PlatformParameterModule::class, + TestPlatformParameterModule::class, PlatformParameterSingletonModule::class, QuestionModule::class, RatioInputModule::class, diff --git a/app/src/sharedTest/java/org/oppia/android/app/databinding/BUILD.bazel b/app/src/sharedTest/java/org/oppia/android/app/databinding/BUILD.bazel index 01a2d4cf8f5..7094f91584f 100644 --- a/app/src/sharedTest/java/org/oppia/android/app/databinding/BUILD.bazel +++ b/app/src/sharedTest/java/org/oppia/android/app/databinding/BUILD.bazel @@ -28,6 +28,7 @@ oppia_android_test( "//domain", "//testing", "//testing/src/main/java/org/oppia/android/testing/junit:initialize_default_locale_rule", + "//testing/src/main/java/org/oppia/android/testing/platformparameter:test_module", "//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", @@ -69,6 +70,7 @@ oppia_android_test( "//domain", "//testing", "//testing/src/main/java/org/oppia/android/testing/junit:initialize_default_locale_rule", + "//testing/src/main/java/org/oppia/android/testing/platformparameter:test_module", "//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", @@ -78,6 +80,7 @@ oppia_android_test( "//third_party:org_robolectric_robolectric", "//third_party:robolectric_android-all", "//utility/src/main/java/org/oppia/android/util/accessibility:test_module", + "//utility/src/main/java/org/oppia/android/util/caching:asset_prod_module", "//utility/src/main/java/org/oppia/android/util/caching/testing:caching_test_module", "//utility/src/main/java/org/oppia/android/util/data:data_providers", "//utility/src/main/java/org/oppia/android/util/logging:prod_module", @@ -110,6 +113,7 @@ oppia_android_test( "//domain", "//testing", "//testing/src/main/java/org/oppia/android/testing/junit:initialize_default_locale_rule", + "//testing/src/main/java/org/oppia/android/testing/platformparameter:test_module", "//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", @@ -119,6 +123,7 @@ oppia_android_test( "//third_party:org_robolectric_robolectric", "//third_party:robolectric_android-all", "//utility/src/main/java/org/oppia/android/util/accessibility:test_module", + "//utility/src/main/java/org/oppia/android/util/caching:asset_prod_module", "//utility/src/main/java/org/oppia/android/util/caching/testing:caching_test_module", "//utility/src/main/java/org/oppia/android/util/data:data_providers", "//utility/src/main/java/org/oppia/android/util/logging:prod_module", @@ -151,6 +156,7 @@ oppia_android_test( "//domain", "//testing", "//testing/src/main/java/org/oppia/android/testing/junit:initialize_default_locale_rule", + "//testing/src/main/java/org/oppia/android/testing/platformparameter:test_module", "//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", @@ -160,6 +166,7 @@ oppia_android_test( "//third_party:org_robolectric_robolectric", "//third_party:robolectric_android-all", "//utility/src/main/java/org/oppia/android/util/accessibility:test_module", + "//utility/src/main/java/org/oppia/android/util/caching:asset_prod_module", "//utility/src/main/java/org/oppia/android/util/caching/testing:caching_test_module", "//utility/src/main/java/org/oppia/android/util/data:data_providers", "//utility/src/main/java/org/oppia/android/util/logging:prod_module", @@ -192,6 +199,7 @@ oppia_android_test( "//domain", "//testing", "//testing/src/main/java/org/oppia/android/testing/junit:initialize_default_locale_rule", + "//testing/src/main/java/org/oppia/android/testing/platformparameter:test_module", "//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", @@ -201,6 +209,7 @@ oppia_android_test( "//third_party:org_robolectric_robolectric", "//third_party:robolectric_android-all", "//utility/src/main/java/org/oppia/android/util/accessibility:test_module", + "//utility/src/main/java/org/oppia/android/util/caching:asset_prod_module", "//utility/src/main/java/org/oppia/android/util/caching/testing:caching_test_module", "//utility/src/main/java/org/oppia/android/util/data:data_providers", "//utility/src/main/java/org/oppia/android/util/logging:prod_module", @@ -233,6 +242,7 @@ oppia_android_test( "//domain", "//testing", "//testing/src/main/java/org/oppia/android/testing/junit:initialize_default_locale_rule", + "//testing/src/main/java/org/oppia/android/testing/platformparameter:test_module", "//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", @@ -242,6 +252,7 @@ oppia_android_test( "//third_party:org_robolectric_robolectric", "//third_party:robolectric_android-all", "//utility/src/main/java/org/oppia/android/util/accessibility:test_module", + "//utility/src/main/java/org/oppia/android/util/caching:asset_prod_module", "//utility/src/main/java/org/oppia/android/util/caching/testing:caching_test_module", "//utility/src/main/java/org/oppia/android/util/data:data_providers", "//utility/src/main/java/org/oppia/android/util/logging:prod_module", @@ -274,6 +285,7 @@ oppia_android_test( "//domain", "//testing", "//testing/src/main/java/org/oppia/android/testing/junit:initialize_default_locale_rule", + "//testing/src/main/java/org/oppia/android/testing/platformparameter:test_module", "//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", @@ -283,6 +295,7 @@ oppia_android_test( "//third_party:org_robolectric_robolectric", "//third_party:robolectric_android-all", "//utility/src/main/java/org/oppia/android/util/accessibility:test_module", + "//utility/src/main/java/org/oppia/android/util/caching:asset_prod_module", "//utility/src/main/java/org/oppia/android/util/caching/testing:caching_test_module", "//utility/src/main/java/org/oppia/android/util/data:data_providers", "//utility/src/main/java/org/oppia/android/util/logging:prod_module", @@ -311,6 +324,7 @@ oppia_android_test( "//app/src/main/java/org/oppia/android/app/application/testing:testing_build_flavor_module", "//app/src/main/java/org/oppia/android/app/translation/testing:test_module", "//testing/src/main/java/org/oppia/android/testing/espresso:edit_text_input_action", + "//testing/src/main/java/org/oppia/android/testing/platformparameter:test_module", "//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", @@ -319,6 +333,7 @@ oppia_android_test( "//third_party:org_robolectric_robolectric", "//third_party:robolectric_android-all", "//utility/src/main/java/org/oppia/android/util/accessibility:test_module", + "//utility/src/main/java/org/oppia/android/util/caching:asset_prod_module", "//utility/src/main/java/org/oppia/android/util/caching/testing:caching_test_module", "//utility/src/main/java/org/oppia/android/util/logging:prod_module", "//utility/src/main/java/org/oppia/android/util/logging/firebase:debug_module", @@ -350,6 +365,7 @@ oppia_android_test( "//domain", "//testing", "//testing/src/main/java/org/oppia/android/testing/junit:initialize_default_locale_rule", + "//testing/src/main/java/org/oppia/android/testing/platformparameter:test_module", "//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", @@ -359,6 +375,7 @@ oppia_android_test( "//third_party:org_robolectric_robolectric", "//third_party:robolectric_android-all", "//utility/src/main/java/org/oppia/android/util/accessibility:test_module", + "//utility/src/main/java/org/oppia/android/util/caching:asset_prod_module", "//utility/src/main/java/org/oppia/android/util/caching/testing:caching_test_module", "//utility/src/main/java/org/oppia/android/util/data:data_providers", "//utility/src/main/java/org/oppia/android/util/logging:prod_module", @@ -391,6 +408,7 @@ oppia_android_test( "//domain", "//testing", "//testing/src/main/java/org/oppia/android/testing/junit:initialize_default_locale_rule", + "//testing/src/main/java/org/oppia/android/testing/platformparameter:test_module", "//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", @@ -400,6 +418,7 @@ oppia_android_test( "//third_party:org_robolectric_robolectric", "//third_party:robolectric_android-all", "//utility/src/main/java/org/oppia/android/util/accessibility:test_module", + "//utility/src/main/java/org/oppia/android/util/caching:asset_prod_module", "//utility/src/main/java/org/oppia/android/util/caching/testing:caching_test_module", "//utility/src/main/java/org/oppia/android/util/data:data_providers", "//utility/src/main/java/org/oppia/android/util/logging:prod_module", @@ -432,6 +451,7 @@ oppia_android_test( "//domain", "//testing", "//testing/src/main/java/org/oppia/android/testing/junit:initialize_default_locale_rule", + "//testing/src/main/java/org/oppia/android/testing/platformparameter:test_module", "//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", @@ -441,6 +461,7 @@ oppia_android_test( "//third_party:org_robolectric_robolectric", "//third_party:robolectric_android-all", "//utility/src/main/java/org/oppia/android/util/accessibility:test_module", + "//utility/src/main/java/org/oppia/android/util/caching:asset_prod_module", "//utility/src/main/java/org/oppia/android/util/caching/testing:caching_test_module", "//utility/src/main/java/org/oppia/android/util/data:data_providers", "//utility/src/main/java/org/oppia/android/util/logging:prod_module", diff --git a/app/src/sharedTest/java/org/oppia/android/app/databinding/CircularProgressIndicatorAdaptersTest.kt b/app/src/sharedTest/java/org/oppia/android/app/databinding/CircularProgressIndicatorAdaptersTest.kt index 31e9b07a151..e6aa92a5c40 100644 --- a/app/src/sharedTest/java/org/oppia/android/app/databinding/CircularProgressIndicatorAdaptersTest.kt +++ b/app/src/sharedTest/java/org/oppia/android/app/databinding/CircularProgressIndicatorAdaptersTest.kt @@ -64,7 +64,6 @@ import org.oppia.android.domain.oppialogger.analytics.ApplicationLifecycleModule import org.oppia.android.domain.oppialogger.analytics.CpuPerformanceSnapshotterModule 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 import org.oppia.android.domain.workmanager.WorkManagerConfigurationModule @@ -75,6 +74,7 @@ import org.oppia.android.testing.TestLogReportingModule import org.oppia.android.testing.TestPlatform import org.oppia.android.testing.firebase.TestAuthenticationModule import org.oppia.android.testing.junit.InitializeDefaultLocaleRule +import org.oppia.android.testing.platformparameter.TestPlatformParameterModule import org.oppia.android.testing.robolectric.RobolectricModule import org.oppia.android.testing.threading.TestCoroutineDispatchers import org.oppia.android.testing.threading.TestDispatcherModule @@ -337,7 +337,6 @@ class CircularProgressIndicatorAdaptersTest { NumberWithUnitsRuleModule::class, NumericExpressionInputModule::class, NumericInputRuleModule::class, - PlatformParameterModule::class, PlatformParameterSingletonModule::class, QuestionModule::class, RatioInputModule::class, @@ -350,6 +349,7 @@ class CircularProgressIndicatorAdaptersTest { TestDispatcherModule::class, TestImageLoaderModule::class, TestLogReportingModule::class, + TestPlatformParameterModule::class, TestingBuildFlavorModule::class, TextInputRuleModule::class, ViewBindingShimModule::class, diff --git a/app/src/sharedTest/java/org/oppia/android/app/databinding/ColorBindingAdaptersTest.kt b/app/src/sharedTest/java/org/oppia/android/app/databinding/ColorBindingAdaptersTest.kt index d9b9373035a..53efbc86145 100644 --- a/app/src/sharedTest/java/org/oppia/android/app/databinding/ColorBindingAdaptersTest.kt +++ b/app/src/sharedTest/java/org/oppia/android/app/databinding/ColorBindingAdaptersTest.kt @@ -62,7 +62,6 @@ import org.oppia.android.domain.oppialogger.analytics.ApplicationLifecycleModule import org.oppia.android.domain.oppialogger.analytics.CpuPerformanceSnapshotterModule 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 import org.oppia.android.domain.workmanager.WorkManagerConfigurationModule @@ -70,6 +69,7 @@ import org.oppia.android.testing.OppiaTestRule import org.oppia.android.testing.TestImageLoaderModule import org.oppia.android.testing.TestLogReportingModule import org.oppia.android.testing.firebase.TestAuthenticationModule +import org.oppia.android.testing.platformparameter.TestPlatformParameterModule import org.oppia.android.testing.robolectric.RobolectricModule import org.oppia.android.testing.threading.TestCoroutineDispatchers import org.oppia.android.testing.threading.TestDispatcherModule @@ -202,7 +202,6 @@ class ColorBindingAdaptersTest { NumberWithUnitsRuleModule::class, NumericExpressionInputModule::class, NumericInputRuleModule::class, - PlatformParameterModule::class, PlatformParameterSingletonModule::class, QuestionModule::class, RatioInputModule::class, @@ -215,6 +214,7 @@ class ColorBindingAdaptersTest { TestDispatcherModule::class, TestImageLoaderModule::class, TestLogReportingModule::class, + TestPlatformParameterModule::class, TestingBuildFlavorModule::class, TextInputRuleModule::class, ViewBindingShimModule::class, 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 c6c5461e4c4..348b6fba6d3 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 @@ -65,7 +65,6 @@ import org.oppia.android.domain.oppialogger.analytics.ApplicationLifecycleModule import org.oppia.android.domain.oppialogger.analytics.CpuPerformanceSnapshotterModule 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 import org.oppia.android.domain.workmanager.WorkManagerConfigurationModule @@ -73,6 +72,7 @@ import org.oppia.android.testing.TestImageLoaderModule import org.oppia.android.testing.TestLogReportingModule import org.oppia.android.testing.firebase.TestAuthenticationModule import org.oppia.android.testing.junit.InitializeDefaultLocaleRule +import org.oppia.android.testing.platformparameter.TestPlatformParameterModule import org.oppia.android.testing.robolectric.RobolectricModule import org.oppia.android.testing.threading.TestCoroutineDispatchers import org.oppia.android.testing.threading.TestDispatcherModule @@ -218,7 +218,6 @@ class DrawableBindingAdaptersTest { NumberWithUnitsRuleModule::class, NumericExpressionInputModule::class, NumericInputRuleModule::class, - PlatformParameterModule::class, PlatformParameterSingletonModule::class, QuestionModule::class, RatioInputModule::class, @@ -231,6 +230,7 @@ class DrawableBindingAdaptersTest { TestDispatcherModule::class, TestImageLoaderModule::class, TestLogReportingModule::class, + TestPlatformParameterModule::class, TestingBuildFlavorModule::class, TextInputRuleModule::class, ViewBindingShimModule::class, 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 14a3c831d68..cf13f738651 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 @@ -64,7 +64,6 @@ import org.oppia.android.domain.oppialogger.analytics.ApplicationLifecycleModule import org.oppia.android.domain.oppialogger.analytics.CpuPerformanceSnapshotterModule 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 import org.oppia.android.domain.workmanager.WorkManagerConfigurationModule @@ -73,6 +72,7 @@ import org.oppia.android.testing.TestImageLoaderModule import org.oppia.android.testing.TestLogReportingModule import org.oppia.android.testing.firebase.TestAuthenticationModule import org.oppia.android.testing.junit.InitializeDefaultLocaleRule +import org.oppia.android.testing.platformparameter.TestPlatformParameterModule import org.oppia.android.testing.robolectric.RobolectricModule import org.oppia.android.testing.threading.TestCoroutineDispatchers import org.oppia.android.testing.threading.TestDispatcherModule @@ -240,7 +240,6 @@ class ImageViewBindingAdaptersTest { NumberWithUnitsRuleModule::class, NumericExpressionInputModule::class, NumericInputRuleModule::class, - PlatformParameterModule::class, PlatformParameterSingletonModule::class, QuestionModule::class, RatioInputModule::class, @@ -253,6 +252,7 @@ class ImageViewBindingAdaptersTest { TestDispatcherModule::class, TestImageLoaderModule::class, TestLogReportingModule::class, + TestPlatformParameterModule::class, TestingBuildFlavorModule::class, TextInputRuleModule::class, ViewBindingShimModule::class, 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 f778f263946..23251ded40c 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 @@ -73,7 +73,6 @@ import org.oppia.android.domain.oppialogger.analytics.ApplicationLifecycleModule import org.oppia.android.domain.oppialogger.analytics.CpuPerformanceSnapshotterModule 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 import org.oppia.android.domain.workmanager.WorkManagerConfigurationModule @@ -82,6 +81,7 @@ import org.oppia.android.testing.TestImageLoaderModule import org.oppia.android.testing.TestLogReportingModule import org.oppia.android.testing.firebase.TestAuthenticationModule import org.oppia.android.testing.junit.InitializeDefaultLocaleRule +import org.oppia.android.testing.platformparameter.TestPlatformParameterModule import org.oppia.android.testing.robolectric.RobolectricModule import org.oppia.android.testing.threading.TestCoroutineDispatchers import org.oppia.android.testing.threading.TestDispatcherModule @@ -461,7 +461,6 @@ class MarginBindingAdaptersTest { NumberWithUnitsRuleModule::class, NumericExpressionInputModule::class, NumericInputRuleModule::class, - PlatformParameterModule::class, PlatformParameterSingletonModule::class, QuestionModule::class, RatioInputModule::class, @@ -474,6 +473,7 @@ class MarginBindingAdaptersTest { TestDispatcherModule::class, TestImageLoaderModule::class, TestLogReportingModule::class, + TestPlatformParameterModule::class, TestingBuildFlavorModule::class, TextInputRuleModule::class, ViewBindingShimModule::class, 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 ecf36b1dd1d..13364012cd4 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 @@ -71,7 +71,6 @@ import org.oppia.android.domain.oppialogger.analytics.ApplicationLifecycleModule import org.oppia.android.domain.oppialogger.analytics.CpuPerformanceSnapshotterModule 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 import org.oppia.android.domain.workmanager.WorkManagerConfigurationModule @@ -80,6 +79,7 @@ import org.oppia.android.testing.TestImageLoaderModule import org.oppia.android.testing.TestLogReportingModule import org.oppia.android.testing.firebase.TestAuthenticationModule import org.oppia.android.testing.junit.InitializeDefaultLocaleRule +import org.oppia.android.testing.platformparameter.TestPlatformParameterModule import org.oppia.android.testing.robolectric.RobolectricModule import org.oppia.android.testing.threading.TestCoroutineDispatchers import org.oppia.android.testing.threading.TestDispatcherModule @@ -551,7 +551,6 @@ class StateAssemblerMarginBindingAdaptersTest { NumberWithUnitsRuleModule::class, NumericExpressionInputModule::class, NumericInputRuleModule::class, - PlatformParameterModule::class, PlatformParameterSingletonModule::class, QuestionModule::class, RatioInputModule::class, @@ -564,6 +563,7 @@ class StateAssemblerMarginBindingAdaptersTest { TestDispatcherModule::class, TestImageLoaderModule::class, TestLogReportingModule::class, + TestPlatformParameterModule::class, TestingBuildFlavorModule::class, TextInputRuleModule::class, ViewBindingShimModule::class, 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 0a2eddf9ecb..04252856817 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 @@ -69,7 +69,6 @@ import org.oppia.android.domain.oppialogger.analytics.ApplicationLifecycleModule import org.oppia.android.domain.oppialogger.analytics.CpuPerformanceSnapshotterModule 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 import org.oppia.android.domain.workmanager.WorkManagerConfigurationModule @@ -78,6 +77,7 @@ import org.oppia.android.testing.TestImageLoaderModule import org.oppia.android.testing.TestLogReportingModule import org.oppia.android.testing.firebase.TestAuthenticationModule import org.oppia.android.testing.junit.InitializeDefaultLocaleRule +import org.oppia.android.testing.platformparameter.TestPlatformParameterModule import org.oppia.android.testing.robolectric.RobolectricModule import org.oppia.android.testing.threading.TestCoroutineDispatchers import org.oppia.android.testing.threading.TestDispatcherModule @@ -549,7 +549,6 @@ class StateAssemblerPaddingBindingAdaptersTest { NumberWithUnitsRuleModule::class, NumericExpressionInputModule::class, NumericInputRuleModule::class, - PlatformParameterModule::class, PlatformParameterSingletonModule::class, QuestionModule::class, RatioInputModule::class, @@ -562,6 +561,7 @@ class StateAssemblerPaddingBindingAdaptersTest { TestDispatcherModule::class, TestImageLoaderModule::class, TestLogReportingModule::class, + TestPlatformParameterModule::class, TestingBuildFlavorModule::class, TextInputRuleModule::class, ViewBindingShimModule::class, diff --git a/app/src/sharedTest/java/org/oppia/android/app/databinding/TextInputLayoutBindingAdaptersTest.kt b/app/src/sharedTest/java/org/oppia/android/app/databinding/TextInputLayoutBindingAdaptersTest.kt index 5fcfbb6bb9b..f038ffaff98 100644 --- a/app/src/sharedTest/java/org/oppia/android/app/databinding/TextInputLayoutBindingAdaptersTest.kt +++ b/app/src/sharedTest/java/org/oppia/android/app/databinding/TextInputLayoutBindingAdaptersTest.kt @@ -60,7 +60,6 @@ import org.oppia.android.domain.oppialogger.analytics.ApplicationLifecycleModule import org.oppia.android.domain.oppialogger.analytics.CpuPerformanceSnapshotterModule 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 import org.oppia.android.domain.workmanager.WorkManagerConfigurationModule @@ -68,6 +67,7 @@ import org.oppia.android.testing.TestImageLoaderModule import org.oppia.android.testing.TestLogReportingModule import org.oppia.android.testing.espresso.EditTextInputAction import org.oppia.android.testing.firebase.TestAuthenticationModule +import org.oppia.android.testing.platformparameter.TestPlatformParameterModule import org.oppia.android.testing.robolectric.RobolectricModule import org.oppia.android.testing.threading.TestCoroutineDispatchers import org.oppia.android.testing.threading.TestDispatcherModule @@ -219,7 +219,6 @@ class TextInputLayoutBindingAdaptersTest { NumberWithUnitsRuleModule::class, NumericExpressionInputModule::class, NumericInputRuleModule::class, - PlatformParameterModule::class, PlatformParameterSingletonModule::class, QuestionModule::class, RatioInputModule::class, @@ -232,6 +231,7 @@ class TextInputLayoutBindingAdaptersTest { TestDispatcherModule::class, TestImageLoaderModule::class, TestLogReportingModule::class, + TestPlatformParameterModule::class, TestingBuildFlavorModule::class, TextInputRuleModule::class, ViewBindingShimModule::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 81cac673196..b830ce4b831 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 @@ -63,7 +63,6 @@ import org.oppia.android.domain.oppialogger.analytics.ApplicationLifecycleModule import org.oppia.android.domain.oppialogger.analytics.CpuPerformanceSnapshotterModule 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 import org.oppia.android.domain.workmanager.WorkManagerConfigurationModule @@ -71,6 +70,7 @@ import org.oppia.android.testing.TestImageLoaderModule import org.oppia.android.testing.TestLogReportingModule import org.oppia.android.testing.firebase.TestAuthenticationModule import org.oppia.android.testing.junit.InitializeDefaultLocaleRule +import org.oppia.android.testing.platformparameter.TestPlatformParameterModule import org.oppia.android.testing.robolectric.RobolectricModule import org.oppia.android.testing.threading.TestCoroutineDispatchers import org.oppia.android.testing.threading.TestDispatcherModule @@ -356,7 +356,6 @@ class TextViewBindingAdaptersTest { NumberWithUnitsRuleModule::class, NumericExpressionInputModule::class, NumericInputRuleModule::class, - PlatformParameterModule::class, PlatformParameterSingletonModule::class, QuestionModule::class, RatioInputModule::class, @@ -369,6 +368,7 @@ class TextViewBindingAdaptersTest { TestDispatcherModule::class, TestImageLoaderModule::class, TestLogReportingModule::class, + TestPlatformParameterModule::class, TestingBuildFlavorModule::class, TextInputRuleModule::class, ViewBindingShimModule::class, 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 3aa772bc15f..e4e2bb34b31 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 @@ -66,7 +66,6 @@ import org.oppia.android.domain.oppialogger.analytics.ApplicationLifecycleModule import org.oppia.android.domain.oppialogger.analytics.CpuPerformanceSnapshotterModule 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 import org.oppia.android.domain.workmanager.WorkManagerConfigurationModule @@ -75,6 +74,7 @@ import org.oppia.android.testing.TestImageLoaderModule import org.oppia.android.testing.TestLogReportingModule import org.oppia.android.testing.firebase.TestAuthenticationModule import org.oppia.android.testing.junit.InitializeDefaultLocaleRule +import org.oppia.android.testing.platformparameter.TestPlatformParameterModule import org.oppia.android.testing.robolectric.RobolectricModule import org.oppia.android.testing.threading.TestCoroutineDispatchers import org.oppia.android.testing.threading.TestDispatcherModule @@ -263,7 +263,6 @@ class ViewBindingAdaptersTest { NumberWithUnitsRuleModule::class, NumericExpressionInputModule::class, NumericInputRuleModule::class, - PlatformParameterModule::class, PlatformParameterSingletonModule::class, QuestionModule::class, RatioInputModule::class, @@ -276,6 +275,7 @@ class ViewBindingAdaptersTest { TestDispatcherModule::class, TestImageLoaderModule::class, TestLogReportingModule::class, + TestPlatformParameterModule::class, TestingBuildFlavorModule::class, TextInputRuleModule::class, ViewBindingShimModule::class, 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 0f0a8f27566..4766c067f34 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 @@ -86,7 +86,6 @@ import org.oppia.android.domain.oppialogger.analytics.ApplicationLifecycleModule import org.oppia.android.domain.oppialogger.analytics.CpuPerformanceSnapshotterModule 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 import org.oppia.android.domain.workmanager.WorkManagerConfigurationModule @@ -94,6 +93,7 @@ import org.oppia.android.testing.OppiaTestRule import org.oppia.android.testing.TestLogReportingModule import org.oppia.android.testing.firebase.TestAuthenticationModule import org.oppia.android.testing.junit.InitializeDefaultLocaleRule +import org.oppia.android.testing.platformparameter.TestPlatformParameterModule import org.oppia.android.testing.robolectric.RobolectricModule import org.oppia.android.testing.threading.TestCoroutineDispatchers import org.oppia.android.testing.threading.TestDispatcherModule @@ -353,7 +353,6 @@ class DeveloperOptionsActivityTest { NumberWithUnitsRuleModule::class, NumericExpressionInputModule::class, NumericInputRuleModule::class, - PlatformParameterModule::class, PlatformParameterSingletonModule::class, QuestionModule::class, RatioInputModule::class, @@ -365,6 +364,7 @@ class DeveloperOptionsActivityTest { TestAuthenticationModule::class, TestDispatcherModule::class, TestLogReportingModule::class, + TestPlatformParameterModule::class, TestingBuildFlavorModule::class, TextInputRuleModule::class, ViewBindingShimModule::class, 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 f73fc0234f2..c127655bef2 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 @@ -80,7 +80,6 @@ import org.oppia.android.domain.oppialogger.analytics.ApplicationLifecycleModule import org.oppia.android.domain.oppialogger.analytics.CpuPerformanceSnapshotterModule 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 import org.oppia.android.domain.workmanager.WorkManagerConfigurationModule @@ -89,6 +88,7 @@ import org.oppia.android.testing.TestLogReportingModule import org.oppia.android.testing.assertThrows import org.oppia.android.testing.firebase.TestAuthenticationModule import org.oppia.android.testing.junit.InitializeDefaultLocaleRule +import org.oppia.android.testing.platformparameter.TestPlatformParameterModule import org.oppia.android.testing.robolectric.RobolectricModule import org.oppia.android.testing.threading.TestCoroutineDispatchers import org.oppia.android.testing.threading.TestDispatcherModule @@ -665,7 +665,6 @@ class DeveloperOptionsFragmentTest { NumberWithUnitsRuleModule::class, NumericExpressionInputModule::class, NumericInputRuleModule::class, - PlatformParameterModule::class, PlatformParameterSingletonModule::class, QuestionModule::class, RatioInputModule::class, @@ -677,6 +676,7 @@ class DeveloperOptionsFragmentTest { TestAuthenticationModule::class, TestDispatcherModule::class, TestLogReportingModule::class, + TestPlatformParameterModule::class, TestingBuildFlavorModule::class, TextInputRuleModule::class, ViewBindingShimModule::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 706e29d4a1c..896683ee199 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 @@ -63,7 +63,6 @@ import org.oppia.android.domain.oppialogger.analytics.ApplicationLifecycleModule import org.oppia.android.domain.oppialogger.analytics.CpuPerformanceSnapshotterModule 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 import org.oppia.android.domain.workmanager.WorkManagerConfigurationModule @@ -71,6 +70,7 @@ import org.oppia.android.testing.OppiaTestRule import org.oppia.android.testing.TestLogReportingModule import org.oppia.android.testing.firebase.TestAuthenticationModule import org.oppia.android.testing.junit.InitializeDefaultLocaleRule +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 @@ -204,7 +204,6 @@ class ForceNetworkTypeActivityTest { NumberWithUnitsRuleModule::class, NumericExpressionInputModule::class, NumericInputRuleModule::class, - PlatformParameterModule::class, PlatformParameterSingletonModule::class, QuestionModule::class, RatioInputModule::class, @@ -216,6 +215,7 @@ class ForceNetworkTypeActivityTest { TestAuthenticationModule::class, TestDispatcherModule::class, TestLogReportingModule::class, + TestPlatformParameterModule::class, TestingBuildFlavorModule::class, TextInputRuleModule::class, ViewBindingShimModule::class, 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 9deb2e8c976..59f854b69c3 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 @@ -68,7 +68,6 @@ import org.oppia.android.domain.oppialogger.analytics.ApplicationLifecycleModule import org.oppia.android.domain.oppialogger.analytics.CpuPerformanceSnapshotterModule 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 import org.oppia.android.domain.workmanager.WorkManagerConfigurationModule @@ -76,6 +75,7 @@ import org.oppia.android.testing.OppiaTestRule import org.oppia.android.testing.TestLogReportingModule import org.oppia.android.testing.firebase.TestAuthenticationModule import org.oppia.android.testing.junit.InitializeDefaultLocaleRule +import org.oppia.android.testing.platformparameter.TestPlatformParameterModule import org.oppia.android.testing.robolectric.RobolectricModule import org.oppia.android.testing.threading.TestCoroutineDispatchers import org.oppia.android.testing.threading.TestDispatcherModule @@ -420,7 +420,6 @@ class ForceNetworkTypeFragmentTest { NumberWithUnitsRuleModule::class, NumericExpressionInputModule::class, NumericInputRuleModule::class, - PlatformParameterModule::class, PlatformParameterSingletonModule::class, QuestionModule::class, RatioInputModule::class, @@ -432,6 +431,7 @@ class ForceNetworkTypeFragmentTest { TestAuthenticationModule::class, TestDispatcherModule::class, TestLogReportingModule::class, + TestPlatformParameterModule::class, TestingBuildFlavorModule::class, TextInputRuleModule::class, ViewBindingShimModule::class, diff --git a/app/src/sharedTest/java/org/oppia/android/app/devoptions/markchapterscompleted/MarkChaptersCompletedActivityTest.kt b/app/src/sharedTest/java/org/oppia/android/app/devoptions/markchapterscompleted/MarkChaptersCompletedActivityTest.kt index a62919ecb58..3e1e945f5fe 100644 --- a/app/src/sharedTest/java/org/oppia/android/app/devoptions/markchapterscompleted/MarkChaptersCompletedActivityTest.kt +++ b/app/src/sharedTest/java/org/oppia/android/app/devoptions/markchapterscompleted/MarkChaptersCompletedActivityTest.kt @@ -72,7 +72,6 @@ import org.oppia.android.domain.oppialogger.analytics.ApplicationLifecycleModule import org.oppia.android.domain.oppialogger.analytics.CpuPerformanceSnapshotterModule 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 import org.oppia.android.domain.workmanager.WorkManagerConfigurationModule @@ -80,6 +79,7 @@ import org.oppia.android.testing.OppiaTestRule import org.oppia.android.testing.TestLogReportingModule import org.oppia.android.testing.firebase.TestAuthenticationModule import org.oppia.android.testing.junit.InitializeDefaultLocaleRule +import org.oppia.android.testing.platformparameter.TestPlatformParameterModule import org.oppia.android.testing.robolectric.RobolectricModule import org.oppia.android.testing.threading.TestCoroutineDispatchers import org.oppia.android.testing.threading.TestDispatcherModule @@ -290,7 +290,6 @@ class MarkChaptersCompletedActivityTest { NumberWithUnitsRuleModule::class, NumericExpressionInputModule::class, NumericInputRuleModule::class, - PlatformParameterModule::class, PlatformParameterSingletonModule::class, QuestionModule::class, RatioInputModule::class, @@ -302,6 +301,7 @@ class MarkChaptersCompletedActivityTest { TestAuthenticationModule::class, TestDispatcherModule::class, TestLogReportingModule::class, + TestPlatformParameterModule::class, TestingBuildFlavorModule::class, TextInputRuleModule::class, ViewBindingShimModule::class, diff --git a/app/src/sharedTest/java/org/oppia/android/app/devoptions/markchapterscompleted/MarkChaptersCompletedFragmentTest.kt b/app/src/sharedTest/java/org/oppia/android/app/devoptions/markchapterscompleted/MarkChaptersCompletedFragmentTest.kt index acc37da26f4..592c8b6ee18 100644 --- a/app/src/sharedTest/java/org/oppia/android/app/devoptions/markchapterscompleted/MarkChaptersCompletedFragmentTest.kt +++ b/app/src/sharedTest/java/org/oppia/android/app/devoptions/markchapterscompleted/MarkChaptersCompletedFragmentTest.kt @@ -79,7 +79,6 @@ import org.oppia.android.domain.oppialogger.analytics.ApplicationLifecycleModule import org.oppia.android.domain.oppialogger.analytics.CpuPerformanceSnapshotterModule 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 import org.oppia.android.domain.topic.StoryProgressController @@ -89,6 +88,7 @@ import org.oppia.android.testing.TestLogReportingModule import org.oppia.android.testing.data.DataProviderTestMonitor import org.oppia.android.testing.firebase.TestAuthenticationModule import org.oppia.android.testing.junit.InitializeDefaultLocaleRule +import org.oppia.android.testing.platformparameter.TestPlatformParameterModule import org.oppia.android.testing.robolectric.RobolectricModule import org.oppia.android.testing.story.StoryProgressTestHelper import org.oppia.android.testing.threading.TestCoroutineDispatchers @@ -1110,7 +1110,6 @@ class MarkChaptersCompletedFragmentTest { NumberWithUnitsRuleModule::class, NumericExpressionInputModule::class, NumericInputRuleModule::class, - PlatformParameterModule::class, PlatformParameterSingletonModule::class, QuestionModule::class, RatioInputModule::class, @@ -1122,6 +1121,7 @@ class MarkChaptersCompletedFragmentTest { TestAuthenticationModule::class, TestDispatcherModule::class, TestLogReportingModule::class, + TestPlatformParameterModule::class, TestingBuildFlavorModule::class, TextInputRuleModule::class, ViewBindingShimModule::class, diff --git a/app/src/sharedTest/java/org/oppia/android/app/devoptions/markstoriescompleted/MarkStoriesCompletedActivityTest.kt b/app/src/sharedTest/java/org/oppia/android/app/devoptions/markstoriescompleted/MarkStoriesCompletedActivityTest.kt index 1ac790c93a4..9ecd1d0f57e 100644 --- a/app/src/sharedTest/java/org/oppia/android/app/devoptions/markstoriescompleted/MarkStoriesCompletedActivityTest.kt +++ b/app/src/sharedTest/java/org/oppia/android/app/devoptions/markstoriescompleted/MarkStoriesCompletedActivityTest.kt @@ -63,7 +63,6 @@ import org.oppia.android.domain.oppialogger.analytics.ApplicationLifecycleModule import org.oppia.android.domain.oppialogger.analytics.CpuPerformanceSnapshotterModule 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 import org.oppia.android.domain.workmanager.WorkManagerConfigurationModule @@ -71,6 +70,7 @@ import org.oppia.android.testing.OppiaTestRule import org.oppia.android.testing.TestLogReportingModule import org.oppia.android.testing.firebase.TestAuthenticationModule import org.oppia.android.testing.junit.InitializeDefaultLocaleRule +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 @@ -217,7 +217,6 @@ class MarkStoriesCompletedActivityTest { NumberWithUnitsRuleModule::class, NumericExpressionInputModule::class, NumericInputRuleModule::class, - PlatformParameterModule::class, PlatformParameterSingletonModule::class, QuestionModule::class, RatioInputModule::class, @@ -229,6 +228,7 @@ class MarkStoriesCompletedActivityTest { TestAuthenticationModule::class, TestDispatcherModule::class, TestLogReportingModule::class, + TestPlatformParameterModule::class, TestingBuildFlavorModule::class, TextInputRuleModule::class, ViewBindingShimModule::class, diff --git a/app/src/sharedTest/java/org/oppia/android/app/devoptions/markstoriescompleted/MarkStoriesCompletedFragmentTest.kt b/app/src/sharedTest/java/org/oppia/android/app/devoptions/markstoriescompleted/MarkStoriesCompletedFragmentTest.kt index 7bd8a11e17d..c12c563ade8 100644 --- a/app/src/sharedTest/java/org/oppia/android/app/devoptions/markstoriescompleted/MarkStoriesCompletedFragmentTest.kt +++ b/app/src/sharedTest/java/org/oppia/android/app/devoptions/markstoriescompleted/MarkStoriesCompletedFragmentTest.kt @@ -73,7 +73,6 @@ import org.oppia.android.domain.oppialogger.analytics.ApplicationLifecycleModule import org.oppia.android.domain.oppialogger.analytics.CpuPerformanceSnapshotterModule 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 import org.oppia.android.domain.workmanager.WorkManagerConfigurationModule @@ -81,6 +80,7 @@ import org.oppia.android.testing.OppiaTestRule import org.oppia.android.testing.TestLogReportingModule import org.oppia.android.testing.firebase.TestAuthenticationModule import org.oppia.android.testing.junit.InitializeDefaultLocaleRule +import org.oppia.android.testing.platformparameter.TestPlatformParameterModule import org.oppia.android.testing.robolectric.RobolectricModule import org.oppia.android.testing.story.StoryProgressTestHelper import org.oppia.android.testing.threading.TestCoroutineDispatchers @@ -632,7 +632,6 @@ class MarkStoriesCompletedFragmentTest { NumberWithUnitsRuleModule::class, NumericExpressionInputModule::class, NumericInputRuleModule::class, - PlatformParameterModule::class, PlatformParameterSingletonModule::class, QuestionModule::class, RatioInputModule::class, @@ -644,6 +643,7 @@ class MarkStoriesCompletedFragmentTest { TestAuthenticationModule::class, TestDispatcherModule::class, TestLogReportingModule::class, + TestPlatformParameterModule::class, TestingBuildFlavorModule::class, TextInputRuleModule::class, ViewBindingShimModule::class, diff --git a/app/src/sharedTest/java/org/oppia/android/app/devoptions/marktopicscompleted/MarkTopicsCompletedActivityTest.kt b/app/src/sharedTest/java/org/oppia/android/app/devoptions/marktopicscompleted/MarkTopicsCompletedActivityTest.kt index d8627b71810..5beaad4d8d9 100644 --- a/app/src/sharedTest/java/org/oppia/android/app/devoptions/marktopicscompleted/MarkTopicsCompletedActivityTest.kt +++ b/app/src/sharedTest/java/org/oppia/android/app/devoptions/marktopicscompleted/MarkTopicsCompletedActivityTest.kt @@ -63,7 +63,6 @@ import org.oppia.android.domain.oppialogger.analytics.ApplicationLifecycleModule import org.oppia.android.domain.oppialogger.analytics.CpuPerformanceSnapshotterModule 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 import org.oppia.android.domain.workmanager.WorkManagerConfigurationModule @@ -71,6 +70,7 @@ import org.oppia.android.testing.OppiaTestRule import org.oppia.android.testing.TestLogReportingModule import org.oppia.android.testing.firebase.TestAuthenticationModule import org.oppia.android.testing.junit.InitializeDefaultLocaleRule +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 @@ -217,7 +217,6 @@ class MarkTopicsCompletedActivityTest { NumberWithUnitsRuleModule::class, NumericExpressionInputModule::class, NumericInputRuleModule::class, - PlatformParameterModule::class, PlatformParameterSingletonModule::class, QuestionModule::class, RatioInputModule::class, @@ -229,6 +228,7 @@ class MarkTopicsCompletedActivityTest { TestAuthenticationModule::class, TestDispatcherModule::class, TestLogReportingModule::class, + TestPlatformParameterModule::class, TestingBuildFlavorModule::class, TextInputRuleModule::class, ViewBindingShimModule::class, diff --git a/app/src/sharedTest/java/org/oppia/android/app/devoptions/marktopicscompleted/MarkTopicsCompletedFragmentTest.kt b/app/src/sharedTest/java/org/oppia/android/app/devoptions/marktopicscompleted/MarkTopicsCompletedFragmentTest.kt index 0f17be3f9d6..a64069ea473 100644 --- a/app/src/sharedTest/java/org/oppia/android/app/devoptions/marktopicscompleted/MarkTopicsCompletedFragmentTest.kt +++ b/app/src/sharedTest/java/org/oppia/android/app/devoptions/marktopicscompleted/MarkTopicsCompletedFragmentTest.kt @@ -73,7 +73,6 @@ import org.oppia.android.domain.oppialogger.analytics.ApplicationLifecycleModule import org.oppia.android.domain.oppialogger.analytics.CpuPerformanceSnapshotterModule 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 import org.oppia.android.domain.workmanager.WorkManagerConfigurationModule @@ -81,6 +80,7 @@ import org.oppia.android.testing.OppiaTestRule import org.oppia.android.testing.TestLogReportingModule import org.oppia.android.testing.firebase.TestAuthenticationModule import org.oppia.android.testing.junit.InitializeDefaultLocaleRule +import org.oppia.android.testing.platformparameter.TestPlatformParameterModule import org.oppia.android.testing.robolectric.RobolectricModule import org.oppia.android.testing.story.StoryProgressTestHelper import org.oppia.android.testing.threading.TestCoroutineDispatchers @@ -611,7 +611,6 @@ class MarkTopicsCompletedFragmentTest { NumberWithUnitsRuleModule::class, NumericExpressionInputModule::class, NumericInputRuleModule::class, - PlatformParameterModule::class, PlatformParameterSingletonModule::class, QuestionModule::class, RatioInputModule::class, @@ -623,6 +622,7 @@ class MarkTopicsCompletedFragmentTest { TestAuthenticationModule::class, TestDispatcherModule::class, TestLogReportingModule::class, + TestPlatformParameterModule::class, TestingBuildFlavorModule::class, TextInputRuleModule::class, ViewBindingShimModule::class, diff --git a/app/src/sharedTest/java/org/oppia/android/app/devoptions/mathexpressionparser/BUILD.bazel b/app/src/sharedTest/java/org/oppia/android/app/devoptions/mathexpressionparser/BUILD.bazel index 6b187a38005..4c4c1ed9d28 100644 --- a/app/src/sharedTest/java/org/oppia/android/app/devoptions/mathexpressionparser/BUILD.bazel +++ b/app/src/sharedTest/java/org/oppia/android/app/devoptions/mathexpressionparser/BUILD.bazel @@ -26,6 +26,7 @@ oppia_android_test( "//testing", "//testing/src/main/java/org/oppia/android/testing/espresso:edit_text_input_action", "//testing/src/main/java/org/oppia/android/testing/junit:initialize_default_locale_rule", + "//testing/src/main/java/org/oppia/android/testing/platformparameter:test_module", "//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", @@ -35,6 +36,7 @@ oppia_android_test( "//third_party:org_robolectric_robolectric", "//third_party:robolectric_android-all", "//utility/src/main/java/org/oppia/android/util/accessibility:test_module", + "//utility/src/main/java/org/oppia/android/util/caching:asset_prod_module", "//utility/src/main/java/org/oppia/android/util/caching/testing:caching_test_module", "//utility/src/main/java/org/oppia/android/util/logging/firebase:debug_module", "//utility/src/main/java/org/oppia/android/util/networking:debug_module", @@ -64,6 +66,7 @@ oppia_android_test( "//testing", "//testing/src/main/java/org/oppia/android/testing/espresso:edit_text_input_action", "//testing/src/main/java/org/oppia/android/testing/junit:initialize_default_locale_rule", + "//testing/src/main/java/org/oppia/android/testing/platformparameter:test_module", "//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", @@ -73,6 +76,7 @@ oppia_android_test( "//third_party:org_robolectric_robolectric", "//third_party:robolectric_android-all", "//utility/src/main/java/org/oppia/android/util/accessibility:test_module", + "//utility/src/main/java/org/oppia/android/util/caching:asset_prod_module", "//utility/src/main/java/org/oppia/android/util/caching/testing:caching_test_module", "//utility/src/main/java/org/oppia/android/util/logging/firebase:debug_module", "//utility/src/main/java/org/oppia/android/util/networking:debug_module", 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 bc062dfa114..1dd92d76b16 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 @@ -61,13 +61,13 @@ import org.oppia.android.domain.oppialogger.analytics.ApplicationLifecycleModule import org.oppia.android.domain.oppialogger.analytics.CpuPerformanceSnapshotterModule 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 import org.oppia.android.domain.workmanager.WorkManagerConfigurationModule import org.oppia.android.testing.TestLogReportingModule import org.oppia.android.testing.firebase.TestAuthenticationModule import org.oppia.android.testing.junit.InitializeDefaultLocaleRule +import org.oppia.android.testing.platformparameter.TestPlatformParameterModule import org.oppia.android.testing.robolectric.RobolectricModule import org.oppia.android.testing.threading.TestCoroutineDispatchers import org.oppia.android.testing.threading.TestDispatcherModule @@ -198,7 +198,6 @@ class MathExpressionParserActivityTest { NumberWithUnitsRuleModule::class, NumericExpressionInputModule::class, NumericInputRuleModule::class, - PlatformParameterModule::class, PlatformParameterSingletonModule::class, QuestionModule::class, RatioInputModule::class, @@ -210,6 +209,7 @@ class MathExpressionParserActivityTest { TestAuthenticationModule::class, TestDispatcherModule::class, TestLogReportingModule::class, + TestPlatformParameterModule::class, TestingBuildFlavorModule::class, TextInputRuleModule::class, ViewBindingShimModule::class, 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 b5cbe5d970e..a8442afc7ed 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 @@ -68,7 +68,6 @@ import org.oppia.android.domain.oppialogger.analytics.ApplicationLifecycleModule import org.oppia.android.domain.oppialogger.analytics.CpuPerformanceSnapshotterModule 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 import org.oppia.android.domain.workmanager.WorkManagerConfigurationModule @@ -77,6 +76,7 @@ import org.oppia.android.testing.TestLogReportingModule import org.oppia.android.testing.espresso.EditTextInputAction import org.oppia.android.testing.firebase.TestAuthenticationModule import org.oppia.android.testing.junit.InitializeDefaultLocaleRule +import org.oppia.android.testing.platformparameter.TestPlatformParameterModule import org.oppia.android.testing.robolectric.RobolectricModule import org.oppia.android.testing.threading.TestCoroutineDispatchers import org.oppia.android.testing.threading.TestDispatcherModule @@ -1472,7 +1472,6 @@ class MathExpressionParserFragmentTest { NumberWithUnitsRuleModule::class, NumericExpressionInputModule::class, NumericInputRuleModule::class, - PlatformParameterModule::class, PlatformParameterSingletonModule::class, QuestionModule::class, RatioInputModule::class, @@ -1485,6 +1484,7 @@ class MathExpressionParserFragmentTest { TestDispatcherModule::class, TestImageLoaderModule::class, TestLogReportingModule::class, + TestPlatformParameterModule::class, TestingBuildFlavorModule::class, TextInputRuleModule::class, ViewBindingShimModule::class, diff --git a/app/src/sharedTest/java/org/oppia/android/app/devoptions/vieweventlogs/ViewEventLogsActivityTest.kt b/app/src/sharedTest/java/org/oppia/android/app/devoptions/vieweventlogs/ViewEventLogsActivityTest.kt index fa7680181b5..40949d7e8bf 100644 --- a/app/src/sharedTest/java/org/oppia/android/app/devoptions/vieweventlogs/ViewEventLogsActivityTest.kt +++ b/app/src/sharedTest/java/org/oppia/android/app/devoptions/vieweventlogs/ViewEventLogsActivityTest.kt @@ -64,13 +64,13 @@ import org.oppia.android.domain.oppialogger.analytics.ApplicationLifecycleModule import org.oppia.android.domain.oppialogger.analytics.CpuPerformanceSnapshotterModule 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 import org.oppia.android.domain.workmanager.WorkManagerConfigurationModule import org.oppia.android.testing.OppiaTestRule import org.oppia.android.testing.firebase.TestAuthenticationModule import org.oppia.android.testing.junit.InitializeDefaultLocaleRule +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 @@ -206,7 +206,6 @@ class ViewEventLogsActivityTest { NumericInputRuleModule::class, PerformanceMetricsAssessorModule::class, PerformanceMetricsConfigurationsModule::class, - PlatformParameterModule::class, PlatformParameterSingletonModule::class, QuestionModule::class, RatioInputModule::class, @@ -217,6 +216,7 @@ class ViewEventLogsActivityTest { SyncStatusModule::class, TestAuthenticationModule::class, TestDispatcherModule::class, + TestPlatformParameterModule::class, TestingBuildFlavorModule::class, TextInputRuleModule::class, ViewBindingShimModule::class, diff --git a/app/src/sharedTest/java/org/oppia/android/app/devoptions/vieweventlogs/ViewEventLogsFragmentTest.kt b/app/src/sharedTest/java/org/oppia/android/app/devoptions/vieweventlogs/ViewEventLogsFragmentTest.kt index 543ae586334..1f553344a9f 100644 --- a/app/src/sharedTest/java/org/oppia/android/app/devoptions/vieweventlogs/ViewEventLogsFragmentTest.kt +++ b/app/src/sharedTest/java/org/oppia/android/app/devoptions/vieweventlogs/ViewEventLogsFragmentTest.kt @@ -79,7 +79,6 @@ import org.oppia.android.domain.oppialogger.analytics.ApplicationLifecycleModule import org.oppia.android.domain.oppialogger.analytics.CpuPerformanceSnapshotterModule 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 import org.oppia.android.domain.workmanager.WorkManagerConfigurationModule @@ -87,6 +86,7 @@ import org.oppia.android.testing.FakeFirestoreInstanceWrapperImpl import org.oppia.android.testing.OppiaTestRule import org.oppia.android.testing.firebase.TestAuthenticationModule import org.oppia.android.testing.junit.InitializeDefaultLocaleRule +import org.oppia.android.testing.platformparameter.TestPlatformParameterModule import org.oppia.android.testing.robolectric.RobolectricModule import org.oppia.android.testing.threading.TestCoroutineDispatchers import org.oppia.android.testing.threading.TestDispatcherModule @@ -777,7 +777,6 @@ class ViewEventLogsFragmentTest { NumericInputRuleModule::class, PerformanceMetricsAssessorModule::class, PerformanceMetricsConfigurationsModule::class, - PlatformParameterModule::class, PlatformParameterSingletonModule::class, QuestionModule::class, RatioInputModule::class, @@ -790,6 +789,7 @@ class ViewEventLogsFragmentTest { TestDispatcherModule::class, TestLogReportingModule::class, TestLogStorageModule::class, + TestPlatformParameterModule::class, TestingBuildFlavorModule::class, TextInputRuleModule::class, ViewBindingShimModule::class, 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 09bfd1c891f..7f7df791ae0 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 @@ -57,7 +57,6 @@ import org.oppia.android.domain.oppialogger.analytics.ApplicationLifecycleModule import org.oppia.android.domain.oppialogger.analytics.CpuPerformanceSnapshotterModule 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 import org.oppia.android.domain.workmanager.WorkManagerConfigurationModule @@ -65,6 +64,7 @@ import org.oppia.android.testing.OppiaTestRule import org.oppia.android.testing.TestLogReportingModule import org.oppia.android.testing.firebase.TestAuthenticationModule import org.oppia.android.testing.junit.InitializeDefaultLocaleRule +import org.oppia.android.testing.platformparameter.TestPlatformParameterModule import org.oppia.android.testing.robolectric.RobolectricModule import org.oppia.android.testing.threading.TestCoroutineDispatchers import org.oppia.android.testing.threading.TestDispatcherModule @@ -192,7 +192,6 @@ class HelpActivityTest { NumberWithUnitsRuleModule::class, NumericExpressionInputModule::class, NumericInputRuleModule::class, - PlatformParameterModule::class, PlatformParameterSingletonModule::class, QuestionModule::class, RatioInputModule::class, @@ -204,6 +203,7 @@ class HelpActivityTest { TestAuthenticationModule::class, TestDispatcherModule::class, TestLogReportingModule::class, + TestPlatformParameterModule::class, TestingBuildFlavorModule::class, TextInputRuleModule::class, ViewBindingShimModule::class, 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 6325d2042d7..96d0d94f88c 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 @@ -91,7 +91,6 @@ import org.oppia.android.domain.oppialogger.analytics.ApplicationLifecycleModule import org.oppia.android.domain.oppialogger.analytics.CpuPerformanceSnapshotterModule 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 import org.oppia.android.domain.workmanager.WorkManagerConfigurationModule @@ -101,6 +100,7 @@ import org.oppia.android.testing.TestLogReportingModule import org.oppia.android.testing.TestPlatform import org.oppia.android.testing.firebase.TestAuthenticationModule import org.oppia.android.testing.junit.InitializeDefaultLocaleRule +import org.oppia.android.testing.platformparameter.TestPlatformParameterModule import org.oppia.android.testing.robolectric.RobolectricModule import org.oppia.android.testing.threading.TestCoroutineDispatchers import org.oppia.android.testing.threading.TestDispatcherModule @@ -1501,7 +1501,6 @@ class HelpFragmentTest { NumberWithUnitsRuleModule::class, NumericExpressionInputModule::class, NumericInputRuleModule::class, - PlatformParameterModule::class, PlatformParameterSingletonModule::class, QuestionModule::class, RatioInputModule::class, @@ -1513,6 +1512,7 @@ class HelpFragmentTest { TestAuthenticationModule::class, TestDispatcherModule::class, TestLogReportingModule::class, + TestPlatformParameterModule::class, TestingBuildFlavorModule::class, TextInputRuleModule::class, ViewBindingShimModule::class, diff --git a/app/src/sharedTest/java/org/oppia/android/app/help/faq/FAQListActivityTest.kt b/app/src/sharedTest/java/org/oppia/android/app/help/faq/FAQListActivityTest.kt index c78fae7686f..aecccfde05d 100644 --- a/app/src/sharedTest/java/org/oppia/android/app/help/faq/FAQListActivityTest.kt +++ b/app/src/sharedTest/java/org/oppia/android/app/help/faq/FAQListActivityTest.kt @@ -56,7 +56,6 @@ import org.oppia.android.domain.oppialogger.analytics.ApplicationLifecycleModule import org.oppia.android.domain.oppialogger.analytics.CpuPerformanceSnapshotterModule 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 import org.oppia.android.domain.workmanager.WorkManagerConfigurationModule @@ -64,6 +63,7 @@ import org.oppia.android.testing.OppiaTestRule import org.oppia.android.testing.TestLogReportingModule import org.oppia.android.testing.firebase.TestAuthenticationModule import org.oppia.android.testing.junit.InitializeDefaultLocaleRule +import org.oppia.android.testing.platformparameter.TestPlatformParameterModule import org.oppia.android.testing.robolectric.RobolectricModule import org.oppia.android.testing.threading.TestCoroutineDispatchers import org.oppia.android.testing.threading.TestDispatcherModule @@ -183,7 +183,6 @@ class FAQListActivityTest { NumberWithUnitsRuleModule::class, NumericExpressionInputModule::class, NumericInputRuleModule::class, - PlatformParameterModule::class, PlatformParameterSingletonModule::class, QuestionModule::class, RatioInputModule::class, @@ -195,6 +194,7 @@ class FAQListActivityTest { TestAuthenticationModule::class, TestDispatcherModule::class, TestLogReportingModule::class, + TestPlatformParameterModule::class, TestingBuildFlavorModule::class, TextInputRuleModule::class, ViewBindingShimModule::class, diff --git a/app/src/sharedTest/java/org/oppia/android/app/help/faq/FAQListFragmentTest.kt b/app/src/sharedTest/java/org/oppia/android/app/help/faq/FAQListFragmentTest.kt index 687cbaebfc2..f0f5d33260a 100644 --- a/app/src/sharedTest/java/org/oppia/android/app/help/faq/FAQListFragmentTest.kt +++ b/app/src/sharedTest/java/org/oppia/android/app/help/faq/FAQListFragmentTest.kt @@ -75,7 +75,6 @@ import org.oppia.android.domain.oppialogger.analytics.ApplicationLifecycleModule import org.oppia.android.domain.oppialogger.analytics.CpuPerformanceSnapshotterModule 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 import org.oppia.android.domain.workmanager.WorkManagerConfigurationModule @@ -83,6 +82,7 @@ import org.oppia.android.testing.OppiaTestRule import org.oppia.android.testing.TestLogReportingModule import org.oppia.android.testing.firebase.TestAuthenticationModule import org.oppia.android.testing.junit.InitializeDefaultLocaleRule +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 @@ -279,7 +279,6 @@ class FAQListFragmentTest { NumberWithUnitsRuleModule::class, NumericExpressionInputModule::class, NumericInputRuleModule::class, - PlatformParameterModule::class, PlatformParameterSingletonModule::class, QuestionModule::class, RatioInputModule::class, @@ -291,6 +290,7 @@ class FAQListFragmentTest { TestAuthenticationModule::class, TestDispatcherModule::class, TestLogReportingModule::class, + TestPlatformParameterModule::class, TestingBuildFlavorModule::class, TextInputRuleModule::class, ViewBindingShimModule::class, diff --git a/app/src/sharedTest/java/org/oppia/android/app/help/faq/faqsingle/FAQSingleActivityTest.kt b/app/src/sharedTest/java/org/oppia/android/app/help/faq/faqsingle/FAQSingleActivityTest.kt index 26eb00f86bf..51c5fd35a39 100644 --- a/app/src/sharedTest/java/org/oppia/android/app/help/faq/faqsingle/FAQSingleActivityTest.kt +++ b/app/src/sharedTest/java/org/oppia/android/app/help/faq/faqsingle/FAQSingleActivityTest.kt @@ -67,7 +67,6 @@ import org.oppia.android.domain.oppialogger.analytics.ApplicationLifecycleModule import org.oppia.android.domain.oppialogger.analytics.CpuPerformanceSnapshotterModule 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 import org.oppia.android.domain.workmanager.WorkManagerConfigurationModule @@ -75,6 +74,7 @@ import org.oppia.android.testing.OppiaTestRule import org.oppia.android.testing.TestLogReportingModule import org.oppia.android.testing.firebase.TestAuthenticationModule import org.oppia.android.testing.junit.InitializeDefaultLocaleRule +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 @@ -242,7 +242,7 @@ class FAQSingleActivityTest { NumberWithUnitsRuleModule::class, NumericExpressionInputModule::class, NumericInputRuleModule::class, - PlatformParameterModule::class, + TestPlatformParameterModule::class, PlatformParameterSingletonModule::class, QuestionModule::class, RatioInputModule::class, diff --git a/app/src/sharedTest/java/org/oppia/android/app/help/thirdparty/LicenseListActivityTest.kt b/app/src/sharedTest/java/org/oppia/android/app/help/thirdparty/LicenseListActivityTest.kt index 28bc280f467..3a6f5c362fb 100644 --- a/app/src/sharedTest/java/org/oppia/android/app/help/thirdparty/LicenseListActivityTest.kt +++ b/app/src/sharedTest/java/org/oppia/android/app/help/thirdparty/LicenseListActivityTest.kt @@ -56,7 +56,6 @@ import org.oppia.android.domain.oppialogger.analytics.ApplicationLifecycleModule import org.oppia.android.domain.oppialogger.analytics.CpuPerformanceSnapshotterModule 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 import org.oppia.android.domain.workmanager.WorkManagerConfigurationModule @@ -64,6 +63,7 @@ import org.oppia.android.testing.OppiaTestRule import org.oppia.android.testing.TestLogReportingModule import org.oppia.android.testing.firebase.TestAuthenticationModule import org.oppia.android.testing.junit.InitializeDefaultLocaleRule +import org.oppia.android.testing.platformparameter.TestPlatformParameterModule import org.oppia.android.testing.robolectric.RobolectricModule import org.oppia.android.testing.threading.TestCoroutineDispatchers import org.oppia.android.testing.threading.TestDispatcherModule @@ -187,7 +187,6 @@ class LicenseListActivityTest { NumberWithUnitsRuleModule::class, NumericExpressionInputModule::class, NumericInputRuleModule::class, - PlatformParameterModule::class, PlatformParameterSingletonModule::class, QuestionModule::class, RatioInputModule::class, @@ -199,6 +198,7 @@ class LicenseListActivityTest { TestAuthenticationModule::class, TestDispatcherModule::class, TestLogReportingModule::class, + TestPlatformParameterModule::class, TestingBuildFlavorModule::class, TextInputRuleModule::class, ViewBindingShimModule::class, diff --git a/app/src/sharedTest/java/org/oppia/android/app/help/thirdparty/LicenseListFragmentTest.kt b/app/src/sharedTest/java/org/oppia/android/app/help/thirdparty/LicenseListFragmentTest.kt index 3d2b957e20a..a829ccc8cba 100644 --- a/app/src/sharedTest/java/org/oppia/android/app/help/thirdparty/LicenseListFragmentTest.kt +++ b/app/src/sharedTest/java/org/oppia/android/app/help/thirdparty/LicenseListFragmentTest.kt @@ -73,7 +73,6 @@ import org.oppia.android.domain.oppialogger.analytics.ApplicationLifecycleModule import org.oppia.android.domain.oppialogger.analytics.CpuPerformanceSnapshotterModule 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 import org.oppia.android.domain.workmanager.WorkManagerConfigurationModule @@ -81,6 +80,7 @@ import org.oppia.android.testing.OppiaTestRule import org.oppia.android.testing.TestLogReportingModule import org.oppia.android.testing.firebase.TestAuthenticationModule import org.oppia.android.testing.junit.InitializeDefaultLocaleRule +import org.oppia.android.testing.platformparameter.TestPlatformParameterModule import org.oppia.android.testing.robolectric.RobolectricModule import org.oppia.android.testing.threading.TestCoroutineDispatchers import org.oppia.android.testing.threading.TestDispatcherModule @@ -425,7 +425,6 @@ class LicenseListFragmentTest { NumberWithUnitsRuleModule::class, NumericExpressionInputModule::class, NumericInputRuleModule::class, - PlatformParameterModule::class, PlatformParameterSingletonModule::class, QuestionModule::class, RatioInputModule::class, @@ -437,6 +436,7 @@ class LicenseListFragmentTest { TestAuthenticationModule::class, TestDispatcherModule::class, TestLogReportingModule::class, + TestPlatformParameterModule::class, TestingBuildFlavorModule::class, TextInputRuleModule::class, ViewBindingShimModule::class, diff --git a/app/src/sharedTest/java/org/oppia/android/app/help/thirdparty/LicenseTextViewerActivityTest.kt b/app/src/sharedTest/java/org/oppia/android/app/help/thirdparty/LicenseTextViewerActivityTest.kt index 1ee20a66121..d8b5412a94b 100644 --- a/app/src/sharedTest/java/org/oppia/android/app/help/thirdparty/LicenseTextViewerActivityTest.kt +++ b/app/src/sharedTest/java/org/oppia/android/app/help/thirdparty/LicenseTextViewerActivityTest.kt @@ -63,7 +63,6 @@ import org.oppia.android.domain.oppialogger.analytics.ApplicationLifecycleModule import org.oppia.android.domain.oppialogger.analytics.CpuPerformanceSnapshotterModule 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 import org.oppia.android.domain.workmanager.WorkManagerConfigurationModule @@ -71,6 +70,7 @@ import org.oppia.android.testing.OppiaTestRule import org.oppia.android.testing.TestLogReportingModule import org.oppia.android.testing.firebase.TestAuthenticationModule import org.oppia.android.testing.junit.InitializeDefaultLocaleRule +import org.oppia.android.testing.platformparameter.TestPlatformParameterModule import org.oppia.android.testing.robolectric.RobolectricModule import org.oppia.android.testing.threading.TestCoroutineDispatchers import org.oppia.android.testing.threading.TestDispatcherModule @@ -295,7 +295,6 @@ class LicenseTextViewerActivityTest { NumberWithUnitsRuleModule::class, NumericExpressionInputModule::class, NumericInputRuleModule::class, - PlatformParameterModule::class, PlatformParameterSingletonModule::class, QuestionModule::class, RatioInputModule::class, @@ -307,6 +306,7 @@ class LicenseTextViewerActivityTest { TestAuthenticationModule::class, TestDispatcherModule::class, TestLogReportingModule::class, + TestPlatformParameterModule::class, TestingBuildFlavorModule::class, TextInputRuleModule::class, ViewBindingShimModule::class, diff --git a/app/src/sharedTest/java/org/oppia/android/app/help/thirdparty/LicenseTextViewerFragmentTest.kt b/app/src/sharedTest/java/org/oppia/android/app/help/thirdparty/LicenseTextViewerFragmentTest.kt index 4c0e79f057c..eb39685aa70 100644 --- a/app/src/sharedTest/java/org/oppia/android/app/help/thirdparty/LicenseTextViewerFragmentTest.kt +++ b/app/src/sharedTest/java/org/oppia/android/app/help/thirdparty/LicenseTextViewerFragmentTest.kt @@ -64,7 +64,6 @@ import org.oppia.android.domain.oppialogger.analytics.ApplicationLifecycleModule import org.oppia.android.domain.oppialogger.analytics.CpuPerformanceSnapshotterModule 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 import org.oppia.android.domain.workmanager.WorkManagerConfigurationModule @@ -72,6 +71,7 @@ import org.oppia.android.testing.OppiaTestRule import org.oppia.android.testing.TestLogReportingModule import org.oppia.android.testing.firebase.TestAuthenticationModule import org.oppia.android.testing.junit.InitializeDefaultLocaleRule +import org.oppia.android.testing.platformparameter.TestPlatformParameterModule import org.oppia.android.testing.robolectric.RobolectricModule import org.oppia.android.testing.threading.TestCoroutineDispatchers import org.oppia.android.testing.threading.TestDispatcherModule @@ -408,7 +408,6 @@ class LicenseTextViewerFragmentTest { NumberWithUnitsRuleModule::class, NumericExpressionInputModule::class, NumericInputRuleModule::class, - PlatformParameterModule::class, PlatformParameterSingletonModule::class, QuestionModule::class, RatioInputModule::class, @@ -420,6 +419,7 @@ class LicenseTextViewerFragmentTest { TestAuthenticationModule::class, TestDispatcherModule::class, TestLogReportingModule::class, + TestPlatformParameterModule::class, TestingBuildFlavorModule::class, TextInputRuleModule::class, ViewBindingShimModule::class, diff --git a/app/src/sharedTest/java/org/oppia/android/app/help/thirdparty/ThirdPartyDependencyListActivityTest.kt b/app/src/sharedTest/java/org/oppia/android/app/help/thirdparty/ThirdPartyDependencyListActivityTest.kt index e7b868ca2c8..1f3b2b2aa6d 100644 --- a/app/src/sharedTest/java/org/oppia/android/app/help/thirdparty/ThirdPartyDependencyListActivityTest.kt +++ b/app/src/sharedTest/java/org/oppia/android/app/help/thirdparty/ThirdPartyDependencyListActivityTest.kt @@ -57,7 +57,6 @@ import org.oppia.android.domain.oppialogger.analytics.ApplicationLifecycleModule import org.oppia.android.domain.oppialogger.analytics.CpuPerformanceSnapshotterModule 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 import org.oppia.android.domain.workmanager.WorkManagerConfigurationModule @@ -65,6 +64,7 @@ import org.oppia.android.testing.OppiaTestRule import org.oppia.android.testing.TestLogReportingModule import org.oppia.android.testing.firebase.TestAuthenticationModule import org.oppia.android.testing.junit.InitializeDefaultLocaleRule +import org.oppia.android.testing.platformparameter.TestPlatformParameterModule import org.oppia.android.testing.robolectric.RobolectricModule import org.oppia.android.testing.threading.TestCoroutineDispatchers import org.oppia.android.testing.threading.TestDispatcherModule @@ -190,7 +190,6 @@ class ThirdPartyDependencyListActivityTest { NumberWithUnitsRuleModule::class, NumericExpressionInputModule::class, NumericInputRuleModule::class, - PlatformParameterModule::class, PlatformParameterSingletonModule::class, QuestionModule::class, RatioInputModule::class, @@ -202,6 +201,7 @@ class ThirdPartyDependencyListActivityTest { TestAuthenticationModule::class, TestDispatcherModule::class, TestLogReportingModule::class, + TestPlatformParameterModule::class, TestingBuildFlavorModule::class, TextInputRuleModule::class, ViewBindingShimModule::class, diff --git a/app/src/sharedTest/java/org/oppia/android/app/help/thirdparty/ThirdPartyDependencyListFragmentTest.kt b/app/src/sharedTest/java/org/oppia/android/app/help/thirdparty/ThirdPartyDependencyListFragmentTest.kt index 8805da4df19..c6e57f0af85 100644 --- a/app/src/sharedTest/java/org/oppia/android/app/help/thirdparty/ThirdPartyDependencyListFragmentTest.kt +++ b/app/src/sharedTest/java/org/oppia/android/app/help/thirdparty/ThirdPartyDependencyListFragmentTest.kt @@ -72,7 +72,6 @@ import org.oppia.android.domain.oppialogger.analytics.ApplicationLifecycleModule import org.oppia.android.domain.oppialogger.analytics.CpuPerformanceSnapshotterModule 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 import org.oppia.android.domain.workmanager.WorkManagerConfigurationModule @@ -80,6 +79,7 @@ import org.oppia.android.testing.OppiaTestRule import org.oppia.android.testing.TestLogReportingModule import org.oppia.android.testing.firebase.TestAuthenticationModule import org.oppia.android.testing.junit.InitializeDefaultLocaleRule +import org.oppia.android.testing.platformparameter.TestPlatformParameterModule import org.oppia.android.testing.robolectric.RobolectricModule import org.oppia.android.testing.threading.TestCoroutineDispatchers import org.oppia.android.testing.threading.TestDispatcherModule @@ -533,7 +533,6 @@ class ThirdPartyDependencyListFragmentTest { NumberWithUnitsRuleModule::class, NumericExpressionInputModule::class, NumericInputRuleModule::class, - PlatformParameterModule::class, PlatformParameterSingletonModule::class, QuestionModule::class, RatioInputModule::class, @@ -545,6 +544,7 @@ class ThirdPartyDependencyListFragmentTest { TestAuthenticationModule::class, TestDispatcherModule::class, TestLogReportingModule::class, + TestPlatformParameterModule::class, TestingBuildFlavorModule::class, TextInputRuleModule::class, ViewBindingShimModule::class, 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 cc4757949db..7cb37a282e7 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 @@ -226,25 +226,27 @@ class HomeActivityTest { @Before fun setUp() { + TestPlatformParameterModule.forceEnableSpotlightUi(true) Intents.init() - setUpTestApplicationComponent() - profileId = ProfileId.newBuilder().setInternalId(internalProfileId).build() - profileId1 = ProfileId.newBuilder().setInternalId(internalProfileId1).build() - testCoroutineDispatchers.registerIdlingResource() } @After fun tearDown() { + TestPlatformParameterModule.reset() testCoroutineDispatchers.unregisterIdlingResource() Intents.release() } private fun setUpTestApplicationComponent() { ApplicationProvider.getApplicationContext().inject(this) + profileId = ProfileId.newBuilder().setInternalId(internalProfileId).build() + profileId1 = ProfileId.newBuilder().setInternalId(internalProfileId1).build() + testCoroutineDispatchers.registerIdlingResource() } @Test fun testActivity_createIntent_verifyScreenNameInIntent() { + setUpTestApplicationComponent() val screenName = createHomeActivityIntent(internalProfileId).extractCurrentAppScreenName() assertThat(screenName).isEqualTo(ScreenName.HOME_ACTIVITY) @@ -252,6 +254,7 @@ class HomeActivityTest { @Test fun testHomeActivity_loadingItemsPending_progressbarIsDisplayed() { + setUpTestApplicationComponent() fakeOppiaClock.setFakeTimeMode(FakeOppiaClock.FakeTimeMode.MODE_FIXED_FAKE_TIME) launch(createHomeActivityIntent(internalProfileId)).use { onView(withId(R.id.home_fragment_progress_bar)).check( @@ -280,6 +283,7 @@ class HomeActivityTest { @Test fun testHomeActivity_hasCorrectActivityLabel() { + setUpTestApplicationComponent() launch(HomeActivity::class.java).use { scenario -> scenario.onActivity { activity -> val title = activity.title @@ -355,6 +359,7 @@ class HomeActivityTest { @Test fun testHomeActivity_logUserInFirstTime_checkPromotedStoriesIsNotDisplayed() { + setUpTestApplicationComponent() launch(createHomeActivityIntent(internalProfileId1)).use { testCoroutineDispatchers.runCurrent() onView(withId(R.id.recently_played_stories_text_view)).check(doesNotExist()) @@ -391,6 +396,7 @@ class HomeActivityTest { @Test fun testPromotedStoriesSpotlight_setToShowOnSecondLogin_checkNotShownOnFirstLogin() { + setUpTestApplicationComponent() launch(createHomeActivityIntent(internalProfileId1)).use { testCoroutineDispatchers.runCurrent() onView(withText(R.string.promoted_story_spotlight_hint)).check(doesNotExist()) @@ -2064,7 +2070,7 @@ class HomeActivityTest { } private fun setUpTestWithOnboardingV2Disabled() { - TestPlatformParameterModule.forceEnableOnboardingFlowV2(true) + TestPlatformParameterModule.forceEnableOnboardingFlowV2(false) setUpTestApplicationComponent() profileTestHelper.initializeProfiles() } 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 40ab8980139..3ebbddf4537 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 @@ -58,7 +58,6 @@ import org.oppia.android.domain.oppialogger.analytics.ApplicationLifecycleModule import org.oppia.android.domain.oppialogger.analytics.CpuPerformanceSnapshotterModule 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 import org.oppia.android.domain.workmanager.WorkManagerConfigurationModule @@ -66,6 +65,7 @@ import org.oppia.android.testing.OppiaTestRule import org.oppia.android.testing.TestLogReportingModule import org.oppia.android.testing.firebase.TestAuthenticationModule import org.oppia.android.testing.junit.InitializeDefaultLocaleRule +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.FakeOppiaClock @@ -384,7 +384,7 @@ class WelcomeViewModelTest { NumberWithUnitsRuleModule::class, NumericExpressionInputModule::class, NumericInputRuleModule::class, - PlatformParameterModule::class, + TestPlatformParameterModule::class, PlatformParameterSingletonModule::class, QuestionModule::class, RatioInputModule::class, 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 7b77e47c0c1..e25a7f1fd61 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 @@ -60,7 +60,6 @@ import org.oppia.android.domain.oppialogger.analytics.ApplicationLifecycleModule import org.oppia.android.domain.oppialogger.analytics.CpuPerformanceSnapshotterModule 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 import org.oppia.android.domain.translation.TranslationController @@ -69,6 +68,7 @@ import org.oppia.android.testing.OppiaTestRule import org.oppia.android.testing.TestLogReportingModule import org.oppia.android.testing.firebase.TestAuthenticationModule import org.oppia.android.testing.junit.InitializeDefaultLocaleRule +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 @@ -397,7 +397,7 @@ class PromotedStoryListViewModelTest { NumberWithUnitsRuleModule::class, NumericExpressionInputModule::class, NumericInputRuleModule::class, - PlatformParameterModule::class, + TestPlatformParameterModule::class, PlatformParameterSingletonModule::class, QuestionModule::class, RatioInputModule::class, 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 8e6e57218e2..f8297f8f102 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 @@ -58,7 +58,6 @@ import org.oppia.android.domain.oppialogger.analytics.ApplicationLifecycleModule import org.oppia.android.domain.oppialogger.analytics.CpuPerformanceSnapshotterModule 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 import org.oppia.android.domain.translation.TranslationController @@ -67,6 +66,7 @@ import org.oppia.android.testing.OppiaTestRule import org.oppia.android.testing.TestLogReportingModule import org.oppia.android.testing.firebase.TestAuthenticationModule import org.oppia.android.testing.junit.InitializeDefaultLocaleRule +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 @@ -423,7 +423,7 @@ class PromotedStoryViewModelTest { NumberWithUnitsRuleModule::class, NumericExpressionInputModule::class, NumericInputRuleModule::class, - PlatformParameterModule::class, + TestPlatformParameterModule::class, PlatformParameterSingletonModule::class, QuestionModule::class, RatioInputModule::class, diff --git a/app/src/sharedTest/java/org/oppia/android/app/home/recentlyplayed/RecentlyPlayedFragmentTest.kt b/app/src/sharedTest/java/org/oppia/android/app/home/recentlyplayed/RecentlyPlayedFragmentTest.kt index 9217d0b7888..d1988952beb 100644 --- a/app/src/sharedTest/java/org/oppia/android/app/home/recentlyplayed/RecentlyPlayedFragmentTest.kt +++ b/app/src/sharedTest/java/org/oppia/android/app/home/recentlyplayed/RecentlyPlayedFragmentTest.kt @@ -171,21 +171,19 @@ class RecentlyPlayedFragmentTest { @Before fun setUp() { Intents.init() - setUpTestApplicationComponent() - profileTestHelper.initializeProfiles() - testCoroutineDispatchers.registerIdlingResource() - profileId = ProfileId.newBuilder().setInternalId(internalProfileId).build() - fakeOppiaClock.setFakeTimeMode(FakeOppiaClock.FakeTimeMode.MODE_UPTIME_MILLIS) + // TODO(#5835): Call setUpTestApplicationComponent() here once flag overrides init earlier. } @After fun tearDown() { + TestPlatformParameterModule.reset() testCoroutineDispatchers.unregisterIdlingResource() Intents.release() } @Test fun testFragment_sectionDividerIsNotDisplayed() { + setUpTestApplicationComponent() fakeOppiaClock.setFakeTimeMode(FakeOppiaClock.FakeTimeMode.MODE_UPTIME_MILLIS) storyProgressTestHelper.markInProgressSavedFractionsStory0Exp0( profileId = profileId, @@ -215,6 +213,7 @@ class RecentlyPlayedFragmentTest { @Test fun testFragment_lastWeekSectionTitleIsDisplayed() { + setUpTestApplicationComponent() fakeOppiaClock.setFakeTimeMode(FakeOppiaClock.FakeTimeMode.MODE_UPTIME_MILLIS) storyProgressTestHelper.markInProgressSavedFractionsStory0Exp0( profileId = profileId, @@ -239,6 +238,7 @@ class RecentlyPlayedFragmentTest { @Test fun testFragment_configChange_showsRecommendedSectionTitle() { + setUpTestApplicationComponent() fakeOppiaClock.setFakeTimeMode(FakeOppiaClock.FakeTimeMode.MODE_UPTIME_MILLIS) storyProgressTestHelper.markInProgressSavedFractionsStory0Exp0( profileId = profileId, @@ -264,6 +264,7 @@ class RecentlyPlayedFragmentTest { @Test fun testFragment_showsRecommendedSectionTitle() { + setUpTestApplicationComponent() fakeOppiaClock.setFakeTimeMode(FakeOppiaClock.FakeTimeMode.MODE_UPTIME_MILLIS) storyProgressTestHelper.markInProgressSavedFractionsStory0Exp0( profileId = profileId, @@ -284,6 +285,7 @@ class RecentlyPlayedFragmentTest { @Test fun testFragment_recommendedSection_topicNameIsCorrect() { + setUpTestApplicationComponent() fakeOppiaClock.setFakeTimeMode(FakeOppiaClock.FakeTimeMode.MODE_UPTIME_MILLIS) storyProgressTestHelper.markInProgressSavedFractionsStory0Exp0( profileId = profileId, @@ -310,6 +312,7 @@ class RecentlyPlayedFragmentTest { @Test fun testFragment_disableClassrooms_recommendedSection_classroomNameIsNotDisplayed() { TestPlatformParameterModule.forceEnableMultipleClassrooms(false) + setUpTestApplicationComponent() fakeOppiaClock.setFakeTimeMode(FakeOppiaClock.FakeTimeMode.MODE_UPTIME_MILLIS) storyProgressTestHelper.markInProgressSavedFractionsStory0Exp0( profileId = profileId, @@ -334,6 +337,7 @@ class RecentlyPlayedFragmentTest { @Test fun testFragment_enableClassrooms_recommendedSection_classroomNameIsCorrect() { TestPlatformParameterModule.forceEnableMultipleClassrooms(true) + setUpTestApplicationComponent() fakeOppiaClock.setFakeTimeMode(FakeOppiaClock.FakeTimeMode.MODE_UPTIME_MILLIS) storyProgressTestHelper.markInProgressSavedFractionsStory0Exp0( profileId = profileId, @@ -360,6 +364,7 @@ class RecentlyPlayedFragmentTest { @Config(qualifiers = "port") @Test fun testFragment_recentlyPlayedItemInRtl_rtlMarginIsCorrect() { + setUpTestApplicationComponent() fakeOppiaClock.setFakeTimeMode(FakeOppiaClock.FakeTimeMode.MODE_UPTIME_MILLIS) storyProgressTestHelper.markInProgressSavedFractionsStory0Exp0( profileId = profileId, @@ -397,6 +402,7 @@ class RecentlyPlayedFragmentTest { @Config(qualifiers = "land") @Test fun testFragment_recentlyPlayedItemInRtl_landscape_rtlMarginIsCorrect() { + setUpTestApplicationComponent() fakeOppiaClock.setFakeTimeMode(FakeOppiaClock.FakeTimeMode.MODE_UPTIME_MILLIS) storyProgressTestHelper.markInProgressSavedFractionsStory0Exp0( profileId = profileId, @@ -445,6 +451,7 @@ class RecentlyPlayedFragmentTest { @Config(qualifiers = "sw600dp-port") @Test fun testFragment_recentlyPlayedItemInRtl_tabletPortrait_rtlMarginIsCorrect() { + setUpTestApplicationComponent() fakeOppiaClock.setFakeTimeMode(FakeOppiaClock.FakeTimeMode.MODE_UPTIME_MILLIS) storyProgressTestHelper.markInProgressSavedFractionsStory0Exp0( profileId = profileId, @@ -493,6 +500,7 @@ class RecentlyPlayedFragmentTest { @Config(qualifiers = "sw600dp-land") @Test fun testFragment_recentlyPlayedItemInRtl_tabletLandscape_rtlMarginIsCorrect() { + setUpTestApplicationComponent() fakeOppiaClock.setFakeTimeMode(FakeOppiaClock.FakeTimeMode.MODE_UPTIME_MILLIS) storyProgressTestHelper.markInProgressSavedFractionsStory0Exp0( profileId = profileId, @@ -554,6 +562,7 @@ class RecentlyPlayedFragmentTest { @Config(qualifiers = "port") @Test fun testFragment_recentlyPlayedItemInLtr_ltrMarginIsCorrect() { + setUpTestApplicationComponent() fakeOppiaClock.setFakeTimeMode(FakeOppiaClock.FakeTimeMode.MODE_UPTIME_MILLIS) storyProgressTestHelper.markInProgressSavedFractionsStory0Exp0( profileId = profileId, @@ -580,6 +589,7 @@ class RecentlyPlayedFragmentTest { @Config(qualifiers = "port") @Test fun testFragment_recommendedSectionItemInRtlMode_rtlMarginIsCorrect() { + setUpTestApplicationComponent() fakeOppiaClock.setFakeTimeMode(FakeOppiaClock.FakeTimeMode.MODE_UPTIME_MILLIS) storyProgressTestHelper.markInProgressSavedFractionsStory0Exp0( profileId = profileId, @@ -605,6 +615,7 @@ class RecentlyPlayedFragmentTest { @Test fun testFragment_storyNameIsCorrect() { + setUpTestApplicationComponent() fakeOppiaClock.setFakeTimeMode(FakeOppiaClock.FakeTimeMode.MODE_UPTIME_MILLIS) storyProgressTestHelper.markInProgressSavedFractionsStory0Exp0( profileId = profileId, @@ -634,6 +645,7 @@ class RecentlyPlayedFragmentTest { @Test fun testFragment_topicNameIsCorrect() { + setUpTestApplicationComponent() fakeOppiaClock.setFakeTimeMode(FakeOppiaClock.FakeTimeMode.MODE_UPTIME_MILLIS) storyProgressTestHelper.markInProgressSavedFractionsStory0Exp0( profileId = profileId, @@ -664,6 +676,7 @@ class RecentlyPlayedFragmentTest { @Test fun testFragment_disableClassrooms_classroomNameIsNotDisplayed() { TestPlatformParameterModule.forceEnableMultipleClassrooms(false) + setUpTestApplicationComponent() fakeOppiaClock.setFakeTimeMode(FakeOppiaClock.FakeTimeMode.MODE_UPTIME_MILLIS) storyProgressTestHelper.markInProgressSavedFractionsStory0Exp0( profileId = profileId, @@ -692,6 +705,7 @@ class RecentlyPlayedFragmentTest { @Test fun testFragment_enableClassrooms_classroomNameIsCorrect() { TestPlatformParameterModule.forceEnableMultipleClassrooms(true) + setUpTestApplicationComponent() fakeOppiaClock.setFakeTimeMode(FakeOppiaClock.FakeTimeMode.MODE_UPTIME_MILLIS) storyProgressTestHelper.markInProgressSavedFractionsStory0Exp0( profileId = profileId, @@ -721,6 +735,7 @@ class RecentlyPlayedFragmentTest { @Test fun testFragment_lessonThumbnailIsCorrect() { + setUpTestApplicationComponent() fakeOppiaClock.setFakeTimeMode(FakeOppiaClock.FakeTimeMode.MODE_UPTIME_MILLIS) storyProgressTestHelper.markInProgressSavedFractionsStory0Exp0( profileId = profileId, @@ -750,6 +765,7 @@ class RecentlyPlayedFragmentTest { @Test fun testFragment_clickStory_correctCheckpointSaved_callsRouteToResumeLessonListenerCallback() { + setUpTestApplicationComponent() fakeOppiaClock.setFakeTimeMode(FakeOppiaClock.FakeTimeMode.MODE_UPTIME_MILLIS) storyProgressTestHelper.markInProgressSavedFractionsStory0Exp0( profileId = profileId, @@ -801,6 +817,7 @@ class RecentlyPlayedFragmentTest { @Test fun testFragment_clickStory_incompatibleCheckpointSaved_opensExplorationLessonAct() { + setUpTestApplicationComponent() fakeOppiaClock.setFakeTimeMode(FakeOppiaClock.FakeTimeMode.MODE_UPTIME_MILLIS) fakeExplorationRetriever.setExplorationProxy( expIdToLoad = FRACTIONS_EXPLORATION_ID_0, @@ -850,6 +867,7 @@ class RecentlyPlayedFragmentTest { @Test fun testFragment_clickStory_chapterAsNotStarted_opensExplorationLessonActivity() { + setUpTestApplicationComponent() runWithLaunchedActivityAndAddedFragment(internalProfileId) { onView(withId(R.id.ongoing_story_recycler_view)).perform( scrollToPosition( @@ -886,6 +904,7 @@ class RecentlyPlayedFragmentTest { @Test fun testFragment_clickStory_chapterMarkedAsInProgNotSaved_opensExplorationLessAct() { + setUpTestApplicationComponent() fakeOppiaClock.setFakeTimeMode(FakeOppiaClock.FakeTimeMode.MODE_UPTIME_MILLIS) storyProgressTestHelper.markInProgressNotSavedFractionsStory0Exp0( profileId = profileId, @@ -927,6 +946,7 @@ class RecentlyPlayedFragmentTest { @Test fun testFragment_lastMonthSectionTitleIsDisplayed() { + setUpTestApplicationComponent() fakeOppiaClock.setFakeTimeMode(FakeOppiaClock.FakeTimeMode.MODE_UPTIME_MILLIS) storyProgressTestHelper.markInProgressSavedFractionsStory0Exp0( profileId = profileId, @@ -956,6 +976,7 @@ class RecentlyPlayedFragmentTest { @Test fun testFragment_sectionDividerIsDisplayed() { + setUpTestApplicationComponent() fakeOppiaClock.setFakeTimeMode(FakeOppiaClock.FakeTimeMode.MODE_UPTIME_MILLIS) storyProgressTestHelper.markInProgressSavedFractionsStory0Exp0( profileId = profileId, @@ -983,6 +1004,7 @@ class RecentlyPlayedFragmentTest { @Test fun testFragment_configChange_sectionDividerIsNotDisplayed() { + setUpTestApplicationComponent() fakeOppiaClock.setFakeTimeMode(FakeOppiaClock.FakeTimeMode.MODE_UPTIME_MILLIS) storyProgressTestHelper.markInProgressSavedFractionsStory0Exp0( profileId = profileId, @@ -1011,6 +1033,7 @@ class RecentlyPlayedFragmentTest { @Test fun testFragment_configChange_lastWeekSectionTitleIsDisplayed() { + setUpTestApplicationComponent() fakeOppiaClock.setFakeTimeMode(FakeOppiaClock.FakeTimeMode.MODE_UPTIME_MILLIS) storyProgressTestHelper.markInProgressSavedFractionsStory0Exp0( profileId = profileId, @@ -1041,6 +1064,7 @@ class RecentlyPlayedFragmentTest { @Test fun testFragment_configChange_storyNameIsCorrect() { + setUpTestApplicationComponent() fakeOppiaClock.setFakeTimeMode(FakeOppiaClock.FakeTimeMode.MODE_UPTIME_MILLIS) storyProgressTestHelper.markInProgressSavedFractionsStory0Exp0( profileId = profileId, @@ -1071,6 +1095,7 @@ class RecentlyPlayedFragmentTest { @Test fun testFragment_configChange_topicNameIsCorrect() { + setUpTestApplicationComponent() fakeOppiaClock.setFakeTimeMode(FakeOppiaClock.FakeTimeMode.MODE_UPTIME_MILLIS) storyProgressTestHelper.markInProgressSavedFractionsStory0Exp0( profileId = profileId, @@ -1102,6 +1127,7 @@ class RecentlyPlayedFragmentTest { @Test fun testFragment_disableClassrooms_configChange_classroomNameIsNotDisplayed() { TestPlatformParameterModule.forceEnableMultipleClassrooms(false) + setUpTestApplicationComponent() fakeOppiaClock.setFakeTimeMode(FakeOppiaClock.FakeTimeMode.MODE_UPTIME_MILLIS) storyProgressTestHelper.markInProgressSavedFractionsStory0Exp0( profileId = profileId, @@ -1131,6 +1157,7 @@ class RecentlyPlayedFragmentTest { @Test fun testFragment_enableClassrooms_configChange_classroomNameIsCorrect() { TestPlatformParameterModule.forceEnableMultipleClassrooms(true) + setUpTestApplicationComponent() fakeOppiaClock.setFakeTimeMode(FakeOppiaClock.FakeTimeMode.MODE_UPTIME_MILLIS) storyProgressTestHelper.markInProgressSavedFractionsStory0Exp0( profileId = profileId, @@ -1161,6 +1188,7 @@ class RecentlyPlayedFragmentTest { @Test fun testFragment_configChange_lessonThumbnailIsCorrect() { + setUpTestApplicationComponent() fakeOppiaClock.setFakeTimeMode(FakeOppiaClock.FakeTimeMode.MODE_UPTIME_MILLIS) storyProgressTestHelper.markInProgressSavedFractionsStory0Exp0( profileId = profileId, @@ -1192,6 +1220,7 @@ class RecentlyPlayedFragmentTest { @Test fun testFragment_configChange_lastMonthSectionTitleIsDisplayed() { + setUpTestApplicationComponent() fakeOppiaClock.setFakeTimeMode(FakeOppiaClock.FakeTimeMode.MODE_UPTIME_MILLIS) storyProgressTestHelper.markInProgressSavedFractionsStory0Exp0( profileId = profileId, @@ -1222,6 +1251,7 @@ class RecentlyPlayedFragmentTest { @Test fun testFragment_checkSpanForItem1_spanSizeIsOne() { + setUpTestApplicationComponent() fakeOppiaClock.setFakeTimeMode(FakeOppiaClock.FakeTimeMode.MODE_UPTIME_MILLIS) storyProgressTestHelper.markInProgressSavedFractionsStory0Exp0( profileId = profileId, @@ -1248,6 +1278,7 @@ class RecentlyPlayedFragmentTest { @Test fun testFragment_checkSpanForItem3_spanSizeIsOne() { + setUpTestApplicationComponent() fakeOppiaClock.setFakeTimeMode(FakeOppiaClock.FakeTimeMode.MODE_UPTIME_MILLIS) storyProgressTestHelper.markInProgressSavedFractionsStory0Exp0( profileId = profileId, @@ -1274,6 +1305,7 @@ class RecentlyPlayedFragmentTest { @Test fun testFragment_configChange_checkSpanForItem1_spanSizeIsOne() { + setUpTestApplicationComponent() fakeOppiaClock.setFakeTimeMode(FakeOppiaClock.FakeTimeMode.MODE_UPTIME_MILLIS) storyProgressTestHelper.markInProgressSavedFractionsStory0Exp0( profileId = profileId, @@ -1301,6 +1333,7 @@ class RecentlyPlayedFragmentTest { @Test fun testFragment_configChange_checkSpanForItem3_spanSizeIsOne() { + setUpTestApplicationComponent() fakeOppiaClock.setFakeTimeMode(FakeOppiaClock.FakeTimeMode.MODE_UPTIME_MILLIS) storyProgressTestHelper.markInProgressSavedFractionsStory0Exp0( profileId = profileId, @@ -1328,6 +1361,7 @@ class RecentlyPlayedFragmentTest { @Test fun testFragment_argumentsAreCorrect() { + setUpTestApplicationComponent() runWithLaunchedActivityAndAddedFragment(internalProfileId) { onActivity { activity -> val recentlyPlayedFragment = activity.supportFragmentManager @@ -1346,6 +1380,10 @@ class RecentlyPlayedFragmentTest { private fun setUpTestApplicationComponent() { ApplicationProvider.getApplicationContext().inject(this) + profileTestHelper.initializeProfiles() + testCoroutineDispatchers.registerIdlingResource() + profileId = ProfileId.newBuilder().setInternalId(internalProfileId).build() + fakeOppiaClock.setFakeTimeMode(FakeOppiaClock.FakeTimeMode.MODE_UPTIME_MILLIS) } private fun runWithLaunchedActivityAndAddedFragment( diff --git a/app/src/sharedTest/java/org/oppia/android/app/home/topiclist/TopicSummaryViewModelTest.kt b/app/src/sharedTest/java/org/oppia/android/app/home/topiclist/TopicSummaryViewModelTest.kt index 62d2b5bc7c1..e2db4b8eed8 100644 --- a/app/src/sharedTest/java/org/oppia/android/app/home/topiclist/TopicSummaryViewModelTest.kt +++ b/app/src/sharedTest/java/org/oppia/android/app/home/topiclist/TopicSummaryViewModelTest.kt @@ -60,7 +60,6 @@ import org.oppia.android.domain.oppialogger.analytics.ApplicationLifecycleModule import org.oppia.android.domain.oppialogger.analytics.CpuPerformanceSnapshotterModule 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 import org.oppia.android.domain.translation.TranslationController @@ -69,6 +68,7 @@ import org.oppia.android.testing.OppiaTestRule import org.oppia.android.testing.TestLogReportingModule import org.oppia.android.testing.firebase.TestAuthenticationModule import org.oppia.android.testing.junit.InitializeDefaultLocaleRule +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 @@ -411,7 +411,7 @@ class TopicSummaryViewModelTest { NumberWithUnitsRuleModule::class, NumericExpressionInputModule::class, NumericInputRuleModule::class, - PlatformParameterModule::class, + TestPlatformParameterModule::class, PlatformParameterSingletonModule::class, QuestionModule::class, RatioInputModule::class, 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 882549ee15d..8d4570bf5e9 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 @@ -66,7 +66,6 @@ import org.oppia.android.domain.oppialogger.analytics.ApplicationLifecycleModule import org.oppia.android.domain.oppialogger.analytics.CpuPerformanceSnapshotterModule 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 import org.oppia.android.domain.workmanager.WorkManagerConfigurationModule @@ -74,6 +73,7 @@ import org.oppia.android.testing.OppiaTestRule import org.oppia.android.testing.TestLogReportingModule import org.oppia.android.testing.firebase.TestAuthenticationModule import org.oppia.android.testing.junit.InitializeDefaultLocaleRule +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 @@ -258,7 +258,6 @@ class MyDownloadsFragmentTest { NumberWithUnitsRuleModule::class, NumericExpressionInputModule::class, NumericInputRuleModule::class, - PlatformParameterModule::class, PlatformParameterSingletonModule::class, QuestionModule::class, RatioInputModule::class, @@ -270,6 +269,7 @@ class MyDownloadsFragmentTest { TestAuthenticationModule::class, TestDispatcherModule::class, TestLogReportingModule::class, + TestPlatformParameterModule::class, TestingBuildFlavorModule::class, TextInputRuleModule::class, ViewBindingShimModule::class, diff --git a/app/src/sharedTest/java/org/oppia/android/app/notice/BUILD.bazel b/app/src/sharedTest/java/org/oppia/android/app/notice/BUILD.bazel index 00f53990856..73209c70438 100644 --- a/app/src/sharedTest/java/org/oppia/android/app/notice/BUILD.bazel +++ b/app/src/sharedTest/java/org/oppia/android/app/notice/BUILD.bazel @@ -28,6 +28,7 @@ oppia_android_test( "//domain/src/main/java/org/oppia/android/domain/onboarding/testing:retriever_test_module", "//testing", "//testing/src/main/java/org/oppia/android/testing/junit:initialize_default_locale_rule", + "//testing/src/main/java/org/oppia/android/testing/platformparameter:test_module", "//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", @@ -70,6 +71,7 @@ oppia_android_test( "//domain/src/main/java/org/oppia/android/domain/onboarding/testing:retriever_test_module", "//testing", "//testing/src/main/java/org/oppia/android/testing/junit:initialize_default_locale_rule", + "//testing/src/main/java/org/oppia/android/testing/platformparameter:test_module", "//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", @@ -110,12 +112,14 @@ oppia_android_test( "//app/src/main/java/org/oppia/android/app/translation/testing:test_module", "//testing", "//testing/src/main/java/org/oppia/android/testing/junit:initialize_default_locale_rule", + "//testing/src/main/java/org/oppia/android/testing/platformparameter:test_module", "//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", "//third_party:androidx_test_espresso_espresso-core", "//third_party:robolectric_android-all", "//utility/src/main/java/org/oppia/android/util/accessibility:test_module", + "//utility/src/main/java/org/oppia/android/util/caching:asset_prod_module", "//utility/src/main/java/org/oppia/android/util/caching/testing:caching_test_module", "//utility/src/main/java/org/oppia/android/util/extensions:context_extensions", "//utility/src/main/java/org/oppia/android/util/networking:debug_module", @@ -144,12 +148,14 @@ oppia_android_test( "//app/src/main/java/org/oppia/android/app/translation/testing:test_module", "//testing", "//testing/src/main/java/org/oppia/android/testing/junit:initialize_default_locale_rule", + "//testing/src/main/java/org/oppia/android/testing/platformparameter:test_module", "//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", "//third_party:androidx_test_espresso_espresso-core", "//third_party:robolectric_android-all", "//utility/src/main/java/org/oppia/android/util/accessibility:test_module", + "//utility/src/main/java/org/oppia/android/util/caching:asset_prod_module", "//utility/src/main/java/org/oppia/android/util/caching/testing:caching_test_module", "//utility/src/main/java/org/oppia/android/util/extensions:context_extensions", "//utility/src/main/java/org/oppia/android/util/networking:debug_module", @@ -178,12 +184,14 @@ oppia_android_test( "//app/src/main/java/org/oppia/android/app/translation/testing:test_module", "//testing", "//testing/src/main/java/org/oppia/android/testing/junit:initialize_default_locale_rule", + "//testing/src/main/java/org/oppia/android/testing/platformparameter:test_module", "//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", "//third_party:androidx_test_espresso_espresso-core", "//third_party:robolectric_android-all", "//utility/src/main/java/org/oppia/android/util/accessibility:test_module", + "//utility/src/main/java/org/oppia/android/util/caching:asset_prod_module", "//utility/src/main/java/org/oppia/android/util/caching/testing:caching_test_module", "//utility/src/main/java/org/oppia/android/util/extensions:context_extensions", "//utility/src/main/java/org/oppia/android/util/networking:debug_module", diff --git a/app/src/sharedTest/java/org/oppia/android/app/notice/BetaNoticeDialogFragmentTest.kt b/app/src/sharedTest/java/org/oppia/android/app/notice/BetaNoticeDialogFragmentTest.kt index 832b2ed75e0..b02448d967e 100644 --- a/app/src/sharedTest/java/org/oppia/android/app/notice/BetaNoticeDialogFragmentTest.kt +++ b/app/src/sharedTest/java/org/oppia/android/app/notice/BetaNoticeDialogFragmentTest.kt @@ -69,7 +69,6 @@ import org.oppia.android.domain.oppialogger.analytics.ApplicationLifecycleModule import org.oppia.android.domain.oppialogger.analytics.CpuPerformanceSnapshotterModule 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 import org.oppia.android.domain.workmanager.WorkManagerConfigurationModule @@ -78,6 +77,7 @@ import org.oppia.android.testing.TestImageLoaderModule import org.oppia.android.testing.TestLogReportingModule import org.oppia.android.testing.firebase.TestAuthenticationModule import org.oppia.android.testing.junit.InitializeDefaultLocaleRule +import org.oppia.android.testing.platformparameter.TestPlatformParameterModule import org.oppia.android.testing.robolectric.RobolectricModule import org.oppia.android.testing.threading.TestCoroutineDispatchers import org.oppia.android.testing.threading.TestDispatcherModule @@ -268,7 +268,6 @@ class BetaNoticeDialogFragmentTest { NumberWithUnitsRuleModule::class, NumericExpressionInputModule::class, NumericInputRuleModule::class, - PlatformParameterModule::class, PlatformParameterSingletonModule::class, QuestionModule::class, RatioInputModule::class, @@ -281,6 +280,7 @@ class BetaNoticeDialogFragmentTest { TestDispatcherModule::class, TestImageLoaderModule::class, TestLogReportingModule::class, + TestPlatformParameterModule::class, TestingBuildFlavorModule::class, TextInputRuleModule::class, ViewBindingShimModule::class, diff --git a/app/src/sharedTest/java/org/oppia/android/app/notice/ForcedAppDeprecationNoticeDialogFragmentTest.kt b/app/src/sharedTest/java/org/oppia/android/app/notice/ForcedAppDeprecationNoticeDialogFragmentTest.kt index ad9849b6e59..adb6c2a451e 100644 --- a/app/src/sharedTest/java/org/oppia/android/app/notice/ForcedAppDeprecationNoticeDialogFragmentTest.kt +++ b/app/src/sharedTest/java/org/oppia/android/app/notice/ForcedAppDeprecationNoticeDialogFragmentTest.kt @@ -68,7 +68,6 @@ import org.oppia.android.domain.oppialogger.analytics.ApplicationLifecycleModule import org.oppia.android.domain.oppialogger.analytics.CpuPerformanceSnapshotterModule 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 import org.oppia.android.domain.workmanager.WorkManagerConfigurationModule @@ -77,6 +76,7 @@ import org.oppia.android.testing.TestImageLoaderModule import org.oppia.android.testing.TestLogReportingModule import org.oppia.android.testing.firebase.TestAuthenticationModule import org.oppia.android.testing.junit.InitializeDefaultLocaleRule +import org.oppia.android.testing.platformparameter.TestPlatformParameterModule import org.oppia.android.testing.robolectric.RobolectricModule import org.oppia.android.testing.threading.TestCoroutineDispatchers import org.oppia.android.testing.threading.TestDispatcherModule @@ -257,7 +257,6 @@ class ForcedAppDeprecationNoticeDialogFragmentTest { NumberWithUnitsRuleModule::class, NumericExpressionInputModule::class, NumericInputRuleModule::class, - PlatformParameterModule::class, PlatformParameterSingletonModule::class, QuestionModule::class, RatioInputModule::class, @@ -270,6 +269,7 @@ class ForcedAppDeprecationNoticeDialogFragmentTest { TestDispatcherModule::class, TestImageLoaderModule::class, TestLogReportingModule::class, + TestPlatformParameterModule::class, TestingBuildFlavorModule::class, TextInputRuleModule::class, ViewBindingShimModule::class, diff --git a/app/src/sharedTest/java/org/oppia/android/app/notice/GeneralAvailabilityUpgradeNoticeDialogFragmentTest.kt b/app/src/sharedTest/java/org/oppia/android/app/notice/GeneralAvailabilityUpgradeNoticeDialogFragmentTest.kt index 2c6417b3a05..b19641778cd 100644 --- a/app/src/sharedTest/java/org/oppia/android/app/notice/GeneralAvailabilityUpgradeNoticeDialogFragmentTest.kt +++ b/app/src/sharedTest/java/org/oppia/android/app/notice/GeneralAvailabilityUpgradeNoticeDialogFragmentTest.kt @@ -69,7 +69,6 @@ import org.oppia.android.domain.oppialogger.analytics.ApplicationLifecycleModule import org.oppia.android.domain.oppialogger.analytics.CpuPerformanceSnapshotterModule 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 import org.oppia.android.domain.workmanager.WorkManagerConfigurationModule @@ -78,6 +77,7 @@ import org.oppia.android.testing.TestImageLoaderModule import org.oppia.android.testing.TestLogReportingModule import org.oppia.android.testing.firebase.TestAuthenticationModule import org.oppia.android.testing.junit.InitializeDefaultLocaleRule +import org.oppia.android.testing.platformparameter.TestPlatformParameterModule import org.oppia.android.testing.robolectric.RobolectricModule import org.oppia.android.testing.threading.TestCoroutineDispatchers import org.oppia.android.testing.threading.TestDispatcherModule @@ -275,7 +275,6 @@ class GeneralAvailabilityUpgradeNoticeDialogFragmentTest { NumberWithUnitsRuleModule::class, NumericExpressionInputModule::class, NumericInputRuleModule::class, - PlatformParameterModule::class, PlatformParameterSingletonModule::class, QuestionModule::class, RatioInputModule::class, @@ -288,6 +287,7 @@ class GeneralAvailabilityUpgradeNoticeDialogFragmentTest { TestDispatcherModule::class, TestImageLoaderModule::class, TestLogReportingModule::class, + TestPlatformParameterModule::class, TestingBuildFlavorModule::class, TextInputRuleModule::class, ViewBindingShimModule::class, diff --git a/app/src/sharedTest/java/org/oppia/android/app/notice/OptionalAppDeprecationNoticeDialogFragmentTest.kt b/app/src/sharedTest/java/org/oppia/android/app/notice/OptionalAppDeprecationNoticeDialogFragmentTest.kt index 89b9aa06573..6b35b453df0 100644 --- a/app/src/sharedTest/java/org/oppia/android/app/notice/OptionalAppDeprecationNoticeDialogFragmentTest.kt +++ b/app/src/sharedTest/java/org/oppia/android/app/notice/OptionalAppDeprecationNoticeDialogFragmentTest.kt @@ -69,7 +69,6 @@ import org.oppia.android.domain.oppialogger.analytics.ApplicationLifecycleModule import org.oppia.android.domain.oppialogger.analytics.CpuPerformanceSnapshotterModule 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 import org.oppia.android.domain.workmanager.WorkManagerConfigurationModule @@ -78,6 +77,7 @@ import org.oppia.android.testing.TestImageLoaderModule import org.oppia.android.testing.TestLogReportingModule import org.oppia.android.testing.firebase.TestAuthenticationModule import org.oppia.android.testing.junit.InitializeDefaultLocaleRule +import org.oppia.android.testing.platformparameter.TestPlatformParameterModule import org.oppia.android.testing.robolectric.RobolectricModule import org.oppia.android.testing.threading.TestCoroutineDispatchers import org.oppia.android.testing.threading.TestDispatcherModule @@ -266,7 +266,6 @@ class OptionalAppDeprecationNoticeDialogFragmentTest { NumberWithUnitsRuleModule::class, NumericExpressionInputModule::class, NumericInputRuleModule::class, - PlatformParameterModule::class, PlatformParameterSingletonModule::class, QuestionModule::class, RatioInputModule::class, @@ -279,6 +278,7 @@ class OptionalAppDeprecationNoticeDialogFragmentTest { TestDispatcherModule::class, TestImageLoaderModule::class, TestLogReportingModule::class, + TestPlatformParameterModule::class, TestingBuildFlavorModule::class, TextInputRuleModule::class, ViewBindingShimModule::class, diff --git a/app/src/sharedTest/java/org/oppia/android/app/notice/OsDeprecationNoticeDialogFragmentTest.kt b/app/src/sharedTest/java/org/oppia/android/app/notice/OsDeprecationNoticeDialogFragmentTest.kt index b37d5c5a3a9..ecc88a6e6c7 100644 --- a/app/src/sharedTest/java/org/oppia/android/app/notice/OsDeprecationNoticeDialogFragmentTest.kt +++ b/app/src/sharedTest/java/org/oppia/android/app/notice/OsDeprecationNoticeDialogFragmentTest.kt @@ -69,7 +69,6 @@ import org.oppia.android.domain.oppialogger.analytics.ApplicationLifecycleModule import org.oppia.android.domain.oppialogger.analytics.CpuPerformanceSnapshotterModule 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 import org.oppia.android.domain.workmanager.WorkManagerConfigurationModule @@ -78,6 +77,7 @@ import org.oppia.android.testing.TestImageLoaderModule import org.oppia.android.testing.TestLogReportingModule import org.oppia.android.testing.firebase.TestAuthenticationModule import org.oppia.android.testing.junit.InitializeDefaultLocaleRule +import org.oppia.android.testing.platformparameter.TestPlatformParameterModule import org.oppia.android.testing.robolectric.RobolectricModule import org.oppia.android.testing.threading.TestCoroutineDispatchers import org.oppia.android.testing.threading.TestDispatcherModule @@ -248,7 +248,6 @@ class OsDeprecationNoticeDialogFragmentTest { NumberWithUnitsRuleModule::class, NumericExpressionInputModule::class, NumericInputRuleModule::class, - PlatformParameterModule::class, PlatformParameterSingletonModule::class, QuestionModule::class, RatioInputModule::class, @@ -261,6 +260,7 @@ class OsDeprecationNoticeDialogFragmentTest { TestDispatcherModule::class, TestImageLoaderModule::class, TestLogReportingModule::class, + TestPlatformParameterModule::class, TestingBuildFlavorModule::class, TextInputRuleModule::class, ViewBindingShimModule::class, diff --git a/app/src/sharedTest/java/org/oppia/android/app/onboarding/CreateProfileActivityTest.kt b/app/src/sharedTest/java/org/oppia/android/app/onboarding/CreateProfileActivityTest.kt index fa94d5d6e8a..ba102d436dd 100644 --- a/app/src/sharedTest/java/org/oppia/android/app/onboarding/CreateProfileActivityTest.kt +++ b/app/src/sharedTest/java/org/oppia/android/app/onboarding/CreateProfileActivityTest.kt @@ -58,7 +58,6 @@ import org.oppia.android.domain.oppialogger.analytics.ApplicationLifecycleModule import org.oppia.android.domain.oppialogger.analytics.CpuPerformanceSnapshotterModule 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 import org.oppia.android.domain.workmanager.WorkManagerConfigurationModule @@ -66,6 +65,7 @@ import org.oppia.android.testing.OppiaTestRule import org.oppia.android.testing.TestLogReportingModule import org.oppia.android.testing.firebase.TestAuthenticationModule import org.oppia.android.testing.junit.InitializeDefaultLocaleRule +import org.oppia.android.testing.platformparameter.TestPlatformParameterModule import org.oppia.android.testing.robolectric.RobolectricModule import org.oppia.android.testing.threading.TestCoroutineDispatchers import org.oppia.android.testing.threading.TestDispatcherModule @@ -201,7 +201,6 @@ class CreateProfileActivityTest { NumberWithUnitsRuleModule::class, NumericExpressionInputModule::class, NumericInputRuleModule::class, - PlatformParameterModule::class, PlatformParameterSingletonModule::class, QuestionModule::class, RatioInputModule::class, @@ -213,6 +212,7 @@ class CreateProfileActivityTest { TestAuthenticationModule::class, TestDispatcherModule::class, TestLogReportingModule::class, + TestPlatformParameterModule::class, TestingBuildFlavorModule::class, TextInputRuleModule::class, ViewBindingShimModule::class, diff --git a/app/src/sharedTest/java/org/oppia/android/app/onboarding/IntroActivityTest.kt b/app/src/sharedTest/java/org/oppia/android/app/onboarding/IntroActivityTest.kt index c20e6f1e70b..72e20a513e3 100644 --- a/app/src/sharedTest/java/org/oppia/android/app/onboarding/IntroActivityTest.kt +++ b/app/src/sharedTest/java/org/oppia/android/app/onboarding/IntroActivityTest.kt @@ -58,7 +58,6 @@ import org.oppia.android.domain.oppialogger.analytics.ApplicationLifecycleModule import org.oppia.android.domain.oppialogger.analytics.CpuPerformanceSnapshotterModule 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 import org.oppia.android.domain.workmanager.WorkManagerConfigurationModule @@ -66,6 +65,7 @@ import org.oppia.android.testing.OppiaTestRule import org.oppia.android.testing.TestLogReportingModule import org.oppia.android.testing.firebase.TestAuthenticationModule import org.oppia.android.testing.junit.InitializeDefaultLocaleRule +import org.oppia.android.testing.platformparameter.TestPlatformParameterModule import org.oppia.android.testing.robolectric.RobolectricModule import org.oppia.android.testing.threading.TestCoroutineDispatchers import org.oppia.android.testing.threading.TestDispatcherModule @@ -203,7 +203,6 @@ class IntroActivityTest { NumberWithUnitsRuleModule::class, NumericExpressionInputModule::class, NumericInputRuleModule::class, - PlatformParameterModule::class, PlatformParameterSingletonModule::class, QuestionModule::class, RatioInputModule::class, @@ -215,6 +214,7 @@ class IntroActivityTest { TestAuthenticationModule::class, TestDispatcherModule::class, TestLogReportingModule::class, + TestPlatformParameterModule::class, TestingBuildFlavorModule::class, TextInputRuleModule::class, ViewBindingShimModule::class, 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 739fe5dcfda..fd87c316498 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 @@ -56,7 +56,6 @@ import org.oppia.android.domain.oppialogger.analytics.ApplicationLifecycleModule import org.oppia.android.domain.oppialogger.analytics.CpuPerformanceSnapshotterModule 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 import org.oppia.android.domain.workmanager.WorkManagerConfigurationModule @@ -64,6 +63,7 @@ import org.oppia.android.testing.OppiaTestRule import org.oppia.android.testing.TestLogReportingModule import org.oppia.android.testing.firebase.TestAuthenticationModule import org.oppia.android.testing.junit.InitializeDefaultLocaleRule +import org.oppia.android.testing.platformparameter.TestPlatformParameterModule import org.oppia.android.testing.robolectric.RobolectricModule import org.oppia.android.testing.threading.TestCoroutineDispatchers import org.oppia.android.testing.threading.TestDispatcherModule @@ -183,7 +183,6 @@ class OnboardingActivityTest { NumberWithUnitsRuleModule::class, NumericExpressionInputModule::class, NumericInputRuleModule::class, - PlatformParameterModule::class, PlatformParameterSingletonModule::class, QuestionModule::class, RatioInputModule::class, @@ -195,6 +194,7 @@ class OnboardingActivityTest { TestAuthenticationModule::class, TestDispatcherModule::class, TestLogReportingModule::class, + TestPlatformParameterModule::class, TestingBuildFlavorModule::class, TextInputRuleModule::class, ViewBindingShimModule::class, 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 16eead1d57d..c622a021910 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 @@ -152,6 +152,7 @@ class OnboardingFragmentTest { @After fun tearDown() { + TestPlatformParameterModule.reset() testCoroutineDispatchers.unregisterIdlingResource() Intents.release() } diff --git a/app/src/sharedTest/java/org/oppia/android/app/onboarding/OnboardingProfileTypeActivityTest.kt b/app/src/sharedTest/java/org/oppia/android/app/onboarding/OnboardingProfileTypeActivityTest.kt index 5298ea46b9d..1fa9ac0e3a8 100644 --- a/app/src/sharedTest/java/org/oppia/android/app/onboarding/OnboardingProfileTypeActivityTest.kt +++ b/app/src/sharedTest/java/org/oppia/android/app/onboarding/OnboardingProfileTypeActivityTest.kt @@ -58,7 +58,6 @@ import org.oppia.android.domain.oppialogger.analytics.ApplicationLifecycleModule import org.oppia.android.domain.oppialogger.analytics.CpuPerformanceSnapshotterModule 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 import org.oppia.android.domain.workmanager.WorkManagerConfigurationModule @@ -66,6 +65,7 @@ import org.oppia.android.testing.OppiaTestRule import org.oppia.android.testing.TestLogReportingModule import org.oppia.android.testing.firebase.TestAuthenticationModule import org.oppia.android.testing.junit.InitializeDefaultLocaleRule +import org.oppia.android.testing.platformparameter.TestPlatformParameterModule import org.oppia.android.testing.robolectric.RobolectricModule import org.oppia.android.testing.threading.TestCoroutineDispatchers import org.oppia.android.testing.threading.TestDispatcherModule @@ -202,7 +202,6 @@ class OnboardingProfileTypeActivityTest { NumberWithUnitsRuleModule::class, NumericExpressionInputModule::class, NumericInputRuleModule::class, - PlatformParameterModule::class, PlatformParameterSingletonModule::class, QuestionModule::class, RatioInputModule::class, @@ -214,6 +213,7 @@ class OnboardingProfileTypeActivityTest { TestAuthenticationModule::class, TestDispatcherModule::class, TestLogReportingModule::class, + TestPlatformParameterModule::class, TestingBuildFlavorModule::class, TextInputRuleModule::class, ViewBindingShimModule::class, 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 f1452441c9b..5ff1d5dc7f3 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 @@ -77,7 +77,6 @@ import org.oppia.android.domain.oppialogger.analytics.ApplicationLifecycleModule import org.oppia.android.domain.oppialogger.analytics.CpuPerformanceSnapshotterModule 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 import org.oppia.android.domain.topic.RATIOS_TOPIC_ID @@ -86,6 +85,7 @@ import org.oppia.android.testing.OppiaTestRule import org.oppia.android.testing.TestLogReportingModule import org.oppia.android.testing.firebase.TestAuthenticationModule import org.oppia.android.testing.junit.InitializeDefaultLocaleRule +import org.oppia.android.testing.platformparameter.TestPlatformParameterModule import org.oppia.android.testing.robolectric.RobolectricModule import org.oppia.android.testing.story.StoryProgressTestHelper import org.oppia.android.testing.threading.TestCoroutineDispatchers @@ -495,7 +495,6 @@ class OngoingTopicListActivityTest { NumberWithUnitsRuleModule::class, NumericExpressionInputModule::class, NumericInputRuleModule::class, - PlatformParameterModule::class, PlatformParameterSingletonModule::class, QuestionModule::class, RatioInputModule::class, @@ -507,6 +506,7 @@ class OngoingTopicListActivityTest { TestAuthenticationModule::class, TestDispatcherModule::class, TestLogReportingModule::class, + TestPlatformParameterModule::class, TestingBuildFlavorModule::class, TextInputRuleModule::class, ViewBindingShimModule::class, 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 ee57fd279bb..0a3d561327b 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 @@ -57,7 +57,6 @@ import org.oppia.android.domain.oppialogger.analytics.ApplicationLifecycleModule import org.oppia.android.domain.oppialogger.analytics.CpuPerformanceSnapshotterModule 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 import org.oppia.android.domain.workmanager.WorkManagerConfigurationModule @@ -65,6 +64,7 @@ import org.oppia.android.testing.OppiaTestRule import org.oppia.android.testing.TestLogReportingModule import org.oppia.android.testing.firebase.TestAuthenticationModule import org.oppia.android.testing.junit.InitializeDefaultLocaleRule +import org.oppia.android.testing.platformparameter.TestPlatformParameterModule import org.oppia.android.testing.robolectric.RobolectricModule import org.oppia.android.testing.threading.TestCoroutineDispatchers import org.oppia.android.testing.threading.TestDispatcherModule @@ -196,7 +196,7 @@ class AppLanguageActivityTest { NumberWithUnitsRuleModule::class, NumericExpressionInputModule::class, NumericInputRuleModule::class, - PlatformParameterModule::class, + TestPlatformParameterModule::class, PlatformParameterSingletonModule::class, QuestionModule::class, RatioInputModule::class, 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 60147521f38..c07e86ffde9 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 @@ -67,7 +67,6 @@ import org.oppia.android.domain.oppialogger.analytics.ApplicationLifecycleModule import org.oppia.android.domain.oppialogger.analytics.CpuPerformanceSnapshotterModule 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 import org.oppia.android.domain.workmanager.WorkManagerConfigurationModule @@ -78,6 +77,7 @@ import org.oppia.android.testing.TestLogReportingModule import org.oppia.android.testing.TestPlatform import org.oppia.android.testing.firebase.TestAuthenticationModule import org.oppia.android.testing.junit.InitializeDefaultLocaleRule +import org.oppia.android.testing.platformparameter.TestPlatformParameterModule import org.oppia.android.testing.profile.ProfileTestHelper import org.oppia.android.testing.robolectric.RobolectricModule import org.oppia.android.testing.threading.TestCoroutineDispatchers @@ -377,7 +377,7 @@ class AppLanguageFragmentTest { NumberWithUnitsRuleModule::class, NumericExpressionInputModule::class, NumericInputRuleModule::class, - PlatformParameterModule::class, + TestPlatformParameterModule::class, PlatformParameterSingletonModule::class, QuestionModule::class, RatioInputModule::class, 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 c3436eb8a3d..0ec731eb75d 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 @@ -58,7 +58,6 @@ import org.oppia.android.domain.oppialogger.analytics.ApplicationLifecycleModule import org.oppia.android.domain.oppialogger.analytics.CpuPerformanceSnapshotterModule 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 import org.oppia.android.domain.workmanager.WorkManagerConfigurationModule @@ -66,6 +65,7 @@ import org.oppia.android.testing.OppiaTestRule import org.oppia.android.testing.TestLogReportingModule import org.oppia.android.testing.firebase.TestAuthenticationModule import org.oppia.android.testing.junit.InitializeDefaultLocaleRule +import org.oppia.android.testing.platformparameter.TestPlatformParameterModule import org.oppia.android.testing.robolectric.RobolectricModule import org.oppia.android.testing.threading.TestCoroutineDispatchers import org.oppia.android.testing.threading.TestDispatcherModule @@ -193,7 +193,6 @@ class AudioLanguageActivityTest { NumberWithUnitsRuleModule::class, NumericExpressionInputModule::class, NumericInputRuleModule::class, - PlatformParameterModule::class, PlatformParameterSingletonModule::class, QuestionModule::class, RatioInputModule::class, @@ -205,6 +204,7 @@ class AudioLanguageActivityTest { TestAuthenticationModule::class, TestDispatcherModule::class, TestLogReportingModule::class, + TestPlatformParameterModule::class, TestingBuildFlavorModule::class, TextInputRuleModule::class, ViewBindingShimModule::class, 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 8d38f8fbae2..65eb3fb39f7 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 @@ -57,7 +57,6 @@ import org.oppia.android.domain.oppialogger.analytics.ApplicationLifecycleModule import org.oppia.android.domain.oppialogger.analytics.CpuPerformanceSnapshotterModule 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 import org.oppia.android.domain.workmanager.WorkManagerConfigurationModule @@ -65,6 +64,7 @@ import org.oppia.android.testing.OppiaTestRule import org.oppia.android.testing.TestLogReportingModule import org.oppia.android.testing.firebase.TestAuthenticationModule import org.oppia.android.testing.junit.InitializeDefaultLocaleRule +import org.oppia.android.testing.platformparameter.TestPlatformParameterModule import org.oppia.android.testing.robolectric.RobolectricModule import org.oppia.android.testing.threading.TestCoroutineDispatchers import org.oppia.android.testing.threading.TestDispatcherModule @@ -192,7 +192,6 @@ class OptionsActivityTest { NumberWithUnitsRuleModule::class, NumericExpressionInputModule::class, NumericInputRuleModule::class, - PlatformParameterModule::class, PlatformParameterSingletonModule::class, QuestionModule::class, RatioInputModule::class, @@ -204,6 +203,7 @@ class OptionsActivityTest { TestAuthenticationModule::class, TestDispatcherModule::class, TestLogReportingModule::class, + TestPlatformParameterModule::class, TestingBuildFlavorModule::class, TextInputRuleModule::class, ViewBindingShimModule::class, 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 19d37dbb4c7..1f61771f14c 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 @@ -57,7 +57,6 @@ import org.oppia.android.domain.oppialogger.analytics.ApplicationLifecycleModule import org.oppia.android.domain.oppialogger.analytics.CpuPerformanceSnapshotterModule 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 import org.oppia.android.domain.workmanager.WorkManagerConfigurationModule @@ -65,6 +64,7 @@ import org.oppia.android.testing.OppiaTestRule import org.oppia.android.testing.TestLogReportingModule import org.oppia.android.testing.firebase.TestAuthenticationModule import org.oppia.android.testing.junit.InitializeDefaultLocaleRule +import org.oppia.android.testing.platformparameter.TestPlatformParameterModule import org.oppia.android.testing.robolectric.RobolectricModule import org.oppia.android.testing.threading.TestCoroutineDispatchers import org.oppia.android.testing.threading.TestDispatcherModule @@ -191,7 +191,6 @@ class ReadingTextSizeActivityTest { NumberWithUnitsRuleModule::class, NumericExpressionInputModule::class, NumericInputRuleModule::class, - PlatformParameterModule::class, PlatformParameterSingletonModule::class, QuestionModule::class, RatioInputModule::class, @@ -203,6 +202,7 @@ class ReadingTextSizeActivityTest { TestAuthenticationModule::class, TestDispatcherModule::class, TestLogReportingModule::class, + TestPlatformParameterModule::class, TestingBuildFlavorModule::class, TextInputRuleModule::class, ViewBindingShimModule::class, 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 3d5f70f1d5f..731bbd2ca4d 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 @@ -73,7 +73,6 @@ import org.oppia.android.domain.oppialogger.analytics.ApplicationLifecycleModule import org.oppia.android.domain.oppialogger.analytics.CpuPerformanceSnapshotterModule 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 import org.oppia.android.domain.workmanager.WorkManagerConfigurationModule @@ -83,6 +82,7 @@ import org.oppia.android.testing.RunOn import org.oppia.android.testing.TestLogReportingModule import org.oppia.android.testing.firebase.TestAuthenticationModule import org.oppia.android.testing.junit.InitializeDefaultLocaleRule +import org.oppia.android.testing.platformparameter.TestPlatformParameterModule import org.oppia.android.testing.profile.ProfileTestHelper import org.oppia.android.testing.robolectric.RobolectricModule import org.oppia.android.testing.threading.TestCoroutineDispatchers @@ -375,7 +375,6 @@ class ReadingTextSizeFragmentTest { NumberWithUnitsRuleModule::class, NumericExpressionInputModule::class, NumericInputRuleModule::class, - PlatformParameterModule::class, PlatformParameterSingletonModule::class, QuestionModule::class, RatioInputModule::class, @@ -387,6 +386,7 @@ class ReadingTextSizeFragmentTest { TestAuthenticationModule::class, TestDispatcherModule::class, TestLogReportingModule::class, + TestPlatformParameterModule::class, TestingBuildFlavorModule::class, TextInputRuleModule::class, ViewBindingShimModule::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 87f97fa4f26..99acbb190b5 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 @@ -86,7 +86,6 @@ import org.oppia.android.domain.oppialogger.analytics.ApplicationLifecycleModule import org.oppia.android.domain.oppialogger.analytics.CpuPerformanceSnapshotterModule 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 import org.oppia.android.domain.question.QuestionModule @@ -97,6 +96,7 @@ import org.oppia.android.testing.TestLogReportingModule import org.oppia.android.testing.TestPlatform import org.oppia.android.testing.firebase.TestAuthenticationModule import org.oppia.android.testing.junit.InitializeDefaultLocaleRule +import org.oppia.android.testing.platformparameter.TestPlatformParameterModule import org.oppia.android.testing.profile.ProfileTestHelper import org.oppia.android.testing.robolectric.IsOnRobolectric import org.oppia.android.testing.robolectric.RobolectricModule @@ -601,7 +601,6 @@ class AudioFragmentTest { NumberWithUnitsRuleModule::class, NumericExpressionInputModule::class, NumericInputRuleModule::class, - PlatformParameterModule::class, PlatformParameterSingletonModule::class, QuestionModule::class, RatioInputModule::class, @@ -613,6 +612,7 @@ class AudioFragmentTest { TestAuthenticationModule::class, TestDispatcherModule::class, TestLogReportingModule::class, + TestPlatformParameterModule::class, TestingBuildFlavorModule::class, TextInputRuleModule::class, ViewBindingShimModule::class, diff --git a/app/src/sharedTest/java/org/oppia/android/app/player/exploration/BUILD.bazel b/app/src/sharedTest/java/org/oppia/android/app/player/exploration/BUILD.bazel index c7d73c26385..58c2462df1b 100644 --- a/app/src/sharedTest/java/org/oppia/android/app/player/exploration/BUILD.bazel +++ b/app/src/sharedTest/java/org/oppia/android/app/player/exploration/BUILD.bazel @@ -28,6 +28,7 @@ oppia_android_test( "//domain/src/main/java/org/oppia/android/domain/onboarding/testing:retriever_test_module", "//testing", "//testing/src/main/java/org/oppia/android/testing/junit:initialize_default_locale_rule", + "//testing/src/main/java/org/oppia/android/testing/platformparameter:test_module", "//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", diff --git a/app/src/sharedTest/java/org/oppia/android/app/player/exploration/BottomSheetOptionsMenuTest.kt b/app/src/sharedTest/java/org/oppia/android/app/player/exploration/BottomSheetOptionsMenuTest.kt index 3be0022c9fb..20341167cb9 100644 --- a/app/src/sharedTest/java/org/oppia/android/app/player/exploration/BottomSheetOptionsMenuTest.kt +++ b/app/src/sharedTest/java/org/oppia/android/app/player/exploration/BottomSheetOptionsMenuTest.kt @@ -65,7 +65,6 @@ import org.oppia.android.domain.oppialogger.analytics.ApplicationLifecycleModule import org.oppia.android.domain.oppialogger.analytics.CpuPerformanceSnapshotterModule 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 import org.oppia.android.domain.workmanager.WorkManagerConfigurationModule @@ -74,6 +73,7 @@ import org.oppia.android.testing.TestImageLoaderModule import org.oppia.android.testing.TestLogReportingModule import org.oppia.android.testing.firebase.TestAuthenticationModule import org.oppia.android.testing.junit.InitializeDefaultLocaleRule +import org.oppia.android.testing.platformparameter.TestPlatformParameterModule import org.oppia.android.testing.robolectric.RobolectricModule import org.oppia.android.testing.threading.TestCoroutineDispatchers import org.oppia.android.testing.threading.TestDispatcherModule @@ -211,7 +211,6 @@ class BottomSheetOptionsMenuTest { NumberWithUnitsRuleModule::class, NumericExpressionInputModule::class, NumericInputRuleModule::class, - PlatformParameterModule::class, PlatformParameterSingletonModule::class, QuestionModule::class, RatioInputModule::class, @@ -224,6 +223,7 @@ class BottomSheetOptionsMenuTest { TestDispatcherModule::class, TestImageLoaderModule::class, TestLogReportingModule::class, + TestPlatformParameterModule::class, TestingBuildFlavorModule::class, TextInputRuleModule::class, ViewBindingShimModule::class, 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 521598cd01d..3f07b3982c8 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 @@ -207,6 +207,7 @@ class ExplorationActivityTest { @Before fun setUp() { Intents.init() + TestPlatformParameterModule.forceEnableSpotlightUi(true) setUpTestApplicationComponent() testCoroutineDispatchers.registerIdlingResource() profileTestHelper.initializeProfiles() @@ -215,6 +216,7 @@ class ExplorationActivityTest { @After fun tearDown() { + TestPlatformParameterModule.reset() testCoroutineDispatchers.unregisterIdlingResource() Intents.release() } 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 8cb8ef50302..5a20304fd72 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 @@ -227,6 +227,7 @@ class StateFragmentTest { @After fun tearDown() { + TestPlatformParameterModule.reset() testCoroutineDispatchers.unregisterIdlingResource() Intents.release() } 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 3311b84bb25..5ffc91b2d04 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 @@ -75,7 +75,6 @@ import org.oppia.android.domain.oppialogger.analytics.ApplicationLifecycleModule import org.oppia.android.domain.oppialogger.analytics.CpuPerformanceSnapshotterModule 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 import org.oppia.android.domain.workmanager.WorkManagerConfigurationModule @@ -83,6 +82,7 @@ import org.oppia.android.testing.TestImageLoaderModule import org.oppia.android.testing.TestLogReportingModule import org.oppia.android.testing.firebase.TestAuthenticationModule import org.oppia.android.testing.junit.InitializeDefaultLocaleRule +import org.oppia.android.testing.platformparameter.TestPlatformParameterModule import org.oppia.android.testing.robolectric.RobolectricModule import org.oppia.android.testing.threading.TestCoroutineDispatchers import org.oppia.android.testing.threading.TestDispatcherModule @@ -298,7 +298,7 @@ class PoliciesActivityTest { NumberWithUnitsRuleModule::class, NumericExpressionInputModule::class, NumericInputRuleModule::class, - PlatformParameterModule::class, + TestPlatformParameterModule::class, PlatformParameterSingletonModule::class, QuestionModule::class, RatioInputModule::class, 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 ce0a033a4d2..ac08dc1b0c9 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 @@ -86,7 +86,6 @@ import org.oppia.android.domain.oppialogger.analytics.ApplicationLifecycleModule import org.oppia.android.domain.oppialogger.analytics.CpuPerformanceSnapshotterModule 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 import org.oppia.android.domain.workmanager.WorkManagerConfigurationModule @@ -94,6 +93,7 @@ import org.oppia.android.testing.TestImageLoaderModule import org.oppia.android.testing.TestLogReportingModule import org.oppia.android.testing.firebase.TestAuthenticationModule import org.oppia.android.testing.junit.InitializeDefaultLocaleRule +import org.oppia.android.testing.platformparameter.TestPlatformParameterModule import org.oppia.android.testing.robolectric.RobolectricModule import org.oppia.android.testing.threading.TestCoroutineDispatchers import org.oppia.android.testing.threading.TestDispatcherModule @@ -372,7 +372,7 @@ class PoliciesFragmentTest { NumberWithUnitsRuleModule::class, NumericExpressionInputModule::class, NumericInputRuleModule::class, - PlatformParameterModule::class, + TestPlatformParameterModule::class, PlatformParameterSingletonModule::class, QuestionModule::class, RatioInputModule::class, 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 5856fb1f0d8..dc9c1e78bc5 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 @@ -76,7 +76,6 @@ import org.oppia.android.domain.oppialogger.analytics.ApplicationLifecycleModule import org.oppia.android.domain.oppialogger.analytics.CpuPerformanceSnapshotterModule 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 import org.oppia.android.domain.workmanager.WorkManagerConfigurationModule @@ -86,6 +85,7 @@ import org.oppia.android.testing.espresso.EditTextInputAction import org.oppia.android.testing.espresso.TextInputAction.Companion.hasErrorText import org.oppia.android.testing.firebase.TestAuthenticationModule import org.oppia.android.testing.junit.InitializeDefaultLocaleRule +import org.oppia.android.testing.platformparameter.TestPlatformParameterModule import org.oppia.android.testing.robolectric.RobolectricModule import org.oppia.android.testing.threading.TestCoroutineDispatchers import org.oppia.android.testing.threading.TestDispatcherModule @@ -706,7 +706,7 @@ class AdminAuthActivityTest { NumberWithUnitsRuleModule::class, NumericExpressionInputModule::class, NumericInputRuleModule::class, - PlatformParameterModule::class, + TestPlatformParameterModule::class, PlatformParameterSingletonModule::class, QuestionModule::class, RatioInputModule::class, 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 3d21e64f4e9..5ce1cf1a453 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 @@ -85,7 +85,6 @@ import org.oppia.android.domain.oppialogger.analytics.ApplicationLifecycleModule import org.oppia.android.domain.oppialogger.analytics.CpuPerformanceSnapshotterModule 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 import org.oppia.android.domain.workmanager.WorkManagerConfigurationModule @@ -96,6 +95,7 @@ import org.oppia.android.testing.espresso.TextInputAction.Companion.hasErrorText import org.oppia.android.testing.espresso.TextInputAction.Companion.hasNoErrorText import org.oppia.android.testing.firebase.TestAuthenticationModule import org.oppia.android.testing.junit.InitializeDefaultLocaleRule +import org.oppia.android.testing.platformparameter.TestPlatformParameterModule import org.oppia.android.testing.profile.ProfileTestHelper import org.oppia.android.testing.robolectric.RobolectricModule import org.oppia.android.testing.threading.TestCoroutineDispatchers @@ -1116,7 +1116,7 @@ class AdminPinActivityTest { NumberWithUnitsRuleModule::class, NumericExpressionInputModule::class, NumericInputRuleModule::class, - PlatformParameterModule::class, + TestPlatformParameterModule::class, PlatformParameterSingletonModule::class, QuestionModule::class, RatioInputModule::class, 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 5bfee2b4a4a..cd04a720509 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 @@ -143,23 +143,25 @@ class PinPasswordActivityTest { @Before fun setUp() { Intents.init() - setUpTestApplicationComponent() - profileTestHelper.initializeProfiles() - testCoroutineDispatchers.registerIdlingResource() + // TODO(#5835): Call setUpTestApplicationComponent() here once flag overrides init earlier. } @After fun tearDown() { + TestPlatformParameterModule.reset() testCoroutineDispatchers.unregisterIdlingResource() Intents.release() } private fun setUpTestApplicationComponent() { ApplicationProvider.getApplicationContext().inject(this) + profileTestHelper.initializeProfiles() + testCoroutineDispatchers.registerIdlingResource() } @Test fun testActivity_createIntent_verifyScreenNameInIntent() { + setUpTestApplicationComponent() val currentScreenName = PinPasswordActivity.createPinPasswordActivityIntent( context = context, adminPin = adminPin, @@ -171,6 +173,7 @@ class PinPasswordActivityTest { @Test fun testPinPassword_withAdmin_screenReaderOff_keyboardIsVisible() { + setUpTestApplicationComponent() fakeAccessibilityService.setScreenReaderEnabled(false) launch( PinPasswordActivity.createPinPasswordActivityIntent( @@ -185,6 +188,7 @@ class PinPasswordActivityTest { @Test fun testPinPassword_withAdmin_screenReaderOn_keyboardIsNotVisible() { + setUpTestApplicationComponent() fakeAccessibilityService.setScreenReaderEnabled(true) launch( PinPasswordActivity.createPinPasswordActivityIntent( @@ -200,6 +204,7 @@ class PinPasswordActivityTest { @Test fun testPinPassword_withAdmin_inputCorrectPin_opensHomeActivity() { TestPlatformParameterModule.forceEnableMultipleClassrooms(false) + setUpTestApplicationComponent() launch( PinPasswordActivity.createPinPasswordActivityIntent( context = context, @@ -218,6 +223,7 @@ class PinPasswordActivityTest { @Test fun testPinPassword_enableClassrooms_withAdmin_inputCorrectPin_opensClassroomListActivity() { TestPlatformParameterModule.forceEnableMultipleClassrooms(true) + setUpTestApplicationComponent() launch( PinPasswordActivity.createPinPasswordActivityIntent( context = context, @@ -237,6 +243,7 @@ class PinPasswordActivityTest { @Test fun testPinPassword_withUser_inputCorrectPin_opensHomeActivity() { TestPlatformParameterModule.forceEnableMultipleClassrooms(false) + setUpTestApplicationComponent() launch( PinPasswordActivity.createPinPasswordActivityIntent( context = context, @@ -255,6 +262,7 @@ class PinPasswordActivityTest { @Test fun testPinPassword_enableClassrooms_withUser_inputCorrectPin_opensClassroomListActivity() { TestPlatformParameterModule.forceEnableMultipleClassrooms(true) + setUpTestApplicationComponent() launch( PinPasswordActivity.createPinPasswordActivityIntent( context = context, @@ -273,6 +281,7 @@ class PinPasswordActivityTest { @Test fun testPinPassword_withAdmin_inputWrongPin_incorrectPinShows() { + setUpTestApplicationComponent() launch( PinPasswordActivity.createPinPasswordActivityIntent( context = context, @@ -294,6 +303,7 @@ class PinPasswordActivityTest { @Test fun testPinPasswordActivity_hasCorrectActivityLabel() { + setUpTestApplicationComponent() launch( PinPasswordActivity.createPinPasswordActivityIntent( context = context, @@ -313,6 +323,7 @@ class PinPasswordActivityTest { @Test fun testPinPassword_withUser_inputWrongPin_incorrectPinShows() { + setUpTestApplicationComponent() launch( PinPasswordActivity.createPinPasswordActivityIntent( context = context, @@ -334,6 +345,7 @@ class PinPasswordActivityTest { @Test fun testPinPassword_withUser_inputCorrectPin_doesNotShowIncorrectPin() { + setUpTestApplicationComponent() launch( PinPasswordActivity.createPinPasswordActivityIntent( context = context, @@ -356,6 +368,7 @@ class PinPasswordActivityTest { @Test fun testPinPassword_withAdmin_forgot_opensAdminForgotDialog() { + setUpTestApplicationComponent() launch( PinPasswordActivity.createPinPasswordActivityIntent( context = context, @@ -377,6 +390,7 @@ class PinPasswordActivityTest { @Test fun testPinPassword_withUser_forgot_inputWrongAdminPin_wrongAdminPinError() { + setUpTestApplicationComponent() launch( PinPasswordActivity.createPinPasswordActivityIntent( context = context, @@ -421,6 +435,7 @@ class PinPasswordActivityTest { @Test fun testPinPassword_withUser_forgot_inputAdminPinAndShortPin_pinLengthError() { + setUpTestApplicationComponent() launch( PinPasswordActivity.createPinPasswordActivityIntent( context = context, @@ -479,6 +494,7 @@ class PinPasswordActivityTest { @Test fun testPinPassword_withUser_forgot_inputAdminPinAndNewPinAndOldPin_wrongPinError() { + setUpTestApplicationComponent() launch( PinPasswordActivity.createPinPasswordActivityIntent( context = context, @@ -528,6 +544,7 @@ class PinPasswordActivityTest { @Test fun testPinPassword_withUser_forgot_inputAdminPinAndNewPin_opensHomeActivity() { TestPlatformParameterModule.forceEnableMultipleClassrooms(false) + setUpTestApplicationComponent() launch( PinPasswordActivity.createPinPasswordActivityIntent( context = context, @@ -574,6 +591,7 @@ class PinPasswordActivityTest { @Test fun testPinPassword_withUser_forgot_inputAdminPin_configChange_inputPinIsPresent() { + setUpTestApplicationComponent() launch( PinPasswordActivity.createPinPasswordActivityIntent( context = context, @@ -604,6 +622,7 @@ class PinPasswordActivityTest { @Test fun testPinPassword_withUser_forgot_inputAdminPin_submit_configChange_resetPinDisplayed() { + setUpTestApplicationComponent() launch( PinPasswordActivity.createPinPasswordActivityIntent( context = context, @@ -633,6 +652,7 @@ class PinPasswordActivityTest { @Test fun testPinPassword_withUser_forgot_inputAdminPin_submit_inputNewPin_pinChanged() { + setUpTestApplicationComponent() launch( PinPasswordActivity.createPinPasswordActivityIntent( context = context, @@ -675,6 +695,7 @@ class PinPasswordActivityTest { @Test fun testPinPassword_withAdmin_forgot_configChange_opensAdminForgotDialog() { + setUpTestApplicationComponent() launch( PinPasswordActivity.createPinPasswordActivityIntent( context = context, @@ -694,6 +715,7 @@ class PinPasswordActivityTest { @Test fun testPinPassword_withUser_forgot_inputWrongAdminPin_configChange_wrongAdminPinError() { + setUpTestApplicationComponent() launch( PinPasswordActivity.createPinPasswordActivityIntent( context = context, @@ -737,6 +759,7 @@ class PinPasswordActivityTest { @Test fun testPinPassword_withUser_forgot_inputAdminPinAndIncorrectPin_errorIsDisplayed() { + setUpTestApplicationComponent() launch( PinPasswordActivity.createPinPasswordActivityIntent( context = context, @@ -779,6 +802,7 @@ class PinPasswordActivityTest { @Test fun testPinPassword_withUser_forgot_inputAdminPinAndNullPin_errorIsDisplayed() { + setUpTestApplicationComponent() launch( PinPasswordActivity.createPinPasswordActivityIntent( context = context, @@ -812,6 +836,7 @@ class PinPasswordActivityTest { @Test fun testPinPassword_withUser_forgot_inputAdminPinAndNullPin_configChange_errorIsDisplayed() { + setUpTestApplicationComponent() launch( PinPasswordActivity.createPinPasswordActivityIntent( context = context, @@ -847,6 +872,7 @@ class PinPasswordActivityTest { // TODO(#4209): Error -> Expected error text doesn't match the selected view @Test fun testPinPassword_withUser_forgot_inputAdminPinAndNullPin_imeAction_errorIsDisplayed() { + setUpTestApplicationComponent() launch( PinPasswordActivity.createPinPasswordActivityIntent( context = context, @@ -877,6 +903,7 @@ class PinPasswordActivityTest { @Test fun testPinPassword_user_forgot_adminPinAndNullPin_configChange_imeAction_errorIsDisplayed() { + setUpTestApplicationComponent() launch( PinPasswordActivity.createPinPasswordActivityIntent( context = context, @@ -908,6 +935,7 @@ class PinPasswordActivityTest { @Test fun testPinPassword_withUser_forgot_inputNullAdminPin_configChange_wrongAdminPinError() { + setUpTestApplicationComponent() launch( PinPasswordActivity.createPinPasswordActivityIntent( context = context, @@ -951,6 +979,7 @@ class PinPasswordActivityTest { @Test fun testPinPassword_withUser_forgot_inputAdminPinAndInvalidPin_errorIsDisplayed() { + setUpTestApplicationComponent() launch( PinPasswordActivity.createPinPasswordActivityIntent( context = context, @@ -996,6 +1025,7 @@ class PinPasswordActivityTest { @Test fun testPinPassword_withAdmin_inputWrongPin_configChange_incorrectPinIsDisplayed() { + setUpTestApplicationComponent() launch( PinPasswordActivity.createPinPasswordActivityIntent( context = context, @@ -1020,6 +1050,7 @@ class PinPasswordActivityTest { @Test fun testPinPassword_withAdmin_checkShowHidePassword_defaultText() { + setUpTestApplicationComponent() launch( PinPasswordActivity.createPinPasswordActivityIntent( context = context, @@ -1035,6 +1066,7 @@ class PinPasswordActivityTest { @Test fun testPinPassword_withAdmin_checkShowHidePassword_defaultImage() { + setUpTestApplicationComponent() launch( PinPasswordActivity.createPinPasswordActivityIntent( context = context, @@ -1055,6 +1087,7 @@ class PinPasswordActivityTest { @Test fun testPinPassword_withAdmin_showHideIcon_hasPasswordHiddenContentDescription() { + setUpTestApplicationComponent() launch( PinPasswordActivity.createPinPasswordActivityIntent( context = context, @@ -1075,6 +1108,7 @@ class PinPasswordActivityTest { @Test fun testPinPassword_withAdmin_showHidePassword_textChangesToHide() { + setUpTestApplicationComponent() launch( PinPasswordActivity.createPinPasswordActivityIntent( context = context, @@ -1090,6 +1124,7 @@ class PinPasswordActivityTest { @Test fun testPinPassword_withAdmin_clickShowHideIcon_hasPasswordShownContentDescription() { + setUpTestApplicationComponent() launch( PinPasswordActivity.createPinPasswordActivityIntent( context = context, @@ -1113,6 +1148,7 @@ class PinPasswordActivityTest { @Test fun testPinPassword_withAdmin_showHidePassword_imageChangesToShow() { + setUpTestApplicationComponent() launch( PinPasswordActivity.createPinPasswordActivityIntent( context = context, @@ -1136,6 +1172,7 @@ class PinPasswordActivityTest { @Test fun testPinPassword_withAdmin_showHidePassword_configChange_showViewIsShown() { + setUpTestApplicationComponent() launch( PinPasswordActivity.createPinPasswordActivityIntent( context = context, @@ -1161,6 +1198,7 @@ class PinPasswordActivityTest { @Test fun testPinPassword_checkInputType_showHidePassword_inputTypeIsSame() { + setUpTestApplicationComponent() launch( PinPasswordActivity.createPinPasswordActivityIntent( context = context, @@ -1185,6 +1223,7 @@ class PinPasswordActivityTest { @Test fun testPinPassword_clickForgotPin_enterAdminPin_clickSubmit_dialogMessageIsCorrect() { + setUpTestApplicationComponent() launch( PinPasswordActivity.createPinPasswordActivityIntent( context = context, @@ -1216,6 +1255,7 @@ class PinPasswordActivityTest { @Test fun testPinPassword_adminUser_inputFiveDigitPin_configChange_inputIsPersisted() { + setUpTestApplicationComponent() launch( PinPasswordActivity.createPinPasswordActivityIntent( context = context, @@ -1234,6 +1274,7 @@ class PinPasswordActivityTest { @Test fun testPinPassword_nonAdminUser_inputThreeDigitPin_configChange_inputIsPersisted() { + setUpTestApplicationComponent() launch( PinPasswordActivity.createPinPasswordActivityIntent( context = context, @@ -1252,6 +1293,7 @@ class PinPasswordActivityTest { @Test fun testPinPassword_adminUser_inputPinExceedsFive_textIsTrimmedToFive() { + setUpTestApplicationComponent() launch( PinPasswordActivity.createPinPasswordActivityIntent( context = context, @@ -1269,6 +1311,7 @@ class PinPasswordActivityTest { @Test fun testPinPassword_nonAdminUser_inputPinExceedsThree_textIsTrimmedToThree() { + setUpTestApplicationComponent() launch( PinPasswordActivity.createPinPasswordActivityIntent( context = context, @@ -1287,6 +1330,7 @@ class PinPasswordActivityTest { @Test fun testActivity_multipleClassroomsDisabled_adminUser_inputPin_changeConfig_opensHomeActivity() { TestPlatformParameterModule.forceEnableMultipleClassrooms(false) + setUpTestApplicationComponent() launch( PinPasswordActivity.createPinPasswordActivityIntent( context = context, @@ -1308,6 +1352,7 @@ class PinPasswordActivityTest { @Test fun testActivity_enablesClassroom_adminUser_inputPin_changeConfig_opensClassroomListActivity() { TestPlatformParameterModule.forceEnableMultipleClassrooms(true) + setUpTestApplicationComponent() launch( PinPasswordActivity.createPinPasswordActivityIntent( context = context, @@ -1329,6 +1374,7 @@ class PinPasswordActivityTest { @Test fun testActivity_disableMultipleClassroom_nonAdminUser_inputPin_changeConfig_opensHomeActivity() { TestPlatformParameterModule.forceEnableMultipleClassrooms(false) + setUpTestApplicationComponent() launch( PinPasswordActivity.createPinPasswordActivityIntent( context = context, @@ -1350,6 +1396,7 @@ class PinPasswordActivityTest { @Test fun testActivity_enableClassroom_nonAdminUser_inputPin_changeConfig_opensClassroomListActivity() { TestPlatformParameterModule.forceEnableMultipleClassrooms(true) + setUpTestApplicationComponent() launch( PinPasswordActivity.createPinPasswordActivityIntent( context = context, diff --git a/app/src/sharedTest/java/org/oppia/android/app/profile/ProfileChooserActivityTest.kt b/app/src/sharedTest/java/org/oppia/android/app/profile/ProfileChooserActivityTest.kt index 09daffa11a0..600e094ddfd 100644 --- a/app/src/sharedTest/java/org/oppia/android/app/profile/ProfileChooserActivityTest.kt +++ b/app/src/sharedTest/java/org/oppia/android/app/profile/ProfileChooserActivityTest.kt @@ -58,7 +58,6 @@ import org.oppia.android.domain.oppialogger.analytics.ApplicationLifecycleModule import org.oppia.android.domain.oppialogger.analytics.CpuPerformanceSnapshotterModule 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 import org.oppia.android.domain.workmanager.WorkManagerConfigurationModule @@ -66,6 +65,7 @@ import org.oppia.android.testing.OppiaTestRule import org.oppia.android.testing.TestLogReportingModule import org.oppia.android.testing.firebase.TestAuthenticationModule import org.oppia.android.testing.junit.InitializeDefaultLocaleRule +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 @@ -185,7 +185,6 @@ class ProfileChooserActivityTest { NumberWithUnitsRuleModule::class, NumericExpressionInputModule::class, NumericInputRuleModule::class, - PlatformParameterModule::class, PlatformParameterSingletonModule::class, QuestionModule::class, RatioInputModule::class, @@ -197,6 +196,7 @@ class ProfileChooserActivityTest { TestAuthenticationModule::class, TestDispatcherModule::class, TestLogReportingModule::class, + TestPlatformParameterModule::class, TestingBuildFlavorModule::class, TextInputRuleModule::class, ViewBindingShimModule::class, 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 2031af2a031..427676a6ecd 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 @@ -153,8 +153,7 @@ class ProfileChooserFragmentTest { @Before fun setUp() { Intents.init() - setUpTestApplicationComponent() - testCoroutineDispatchers.registerIdlingResource() + // TODO(#5835): Call setUpTestApplicationComponent() here once flag overrides init earlier. } @After @@ -166,10 +165,12 @@ class ProfileChooserFragmentTest { private fun setUpTestApplicationComponent() { ApplicationProvider.getApplicationContext().inject(this) + testCoroutineDispatchers.registerIdlingResource() } @Test fun testProfileChooserActivity_hasCorrectLabel() { + setUpTestApplicationComponent() launch(ProfileChooserActivity::class.java).use { scenario -> scenario.onActivity { activity -> val title = activity.title @@ -184,6 +185,7 @@ class ProfileChooserFragmentTest { @Test fun testProfileChooserFragment_initializeProfiles_checkProfilesAreShown() { TestPlatformParameterModule.forceEnableOnboardingFlowV2(false) + setUpTestApplicationComponent() profileTestHelper.initializeProfiles(autoLogIn = false) launch(ProfileChooserActivity::class.java).use { testCoroutineDispatchers.runCurrent() @@ -227,6 +229,7 @@ class ProfileChooserFragmentTest { @Test fun testProfileChooserFragment_afterVisitingHomeActivity_showsJustNowText() { TestPlatformParameterModule.forceEnableOnboardingFlowV2(false) + setUpTestApplicationComponent() // Note that the auto-log in here is simulating HomeActivity having been visited before (i.e. // that a profile was previously logged in). profileTestHelper.initializeProfiles(autoLogIn = true) @@ -251,6 +254,7 @@ class ProfileChooserFragmentTest { @Test fun testProfileChooserFragment_afterVisitingHomeActivity_changeConfiguration_showsJustNowText() { TestPlatformParameterModule.forceEnableOnboardingFlowV2(false) + setUpTestApplicationComponent() // Note that the auto-log in here is simulating HomeActivity having been visited before (i.e. // that a profile was previously logged in). profileTestHelper.initializeProfiles(autoLogIn = true) @@ -276,6 +280,7 @@ class ProfileChooserFragmentTest { @Test fun testProfileChooserFragment_addManyProfiles_checkProfilesSortedAndNoAddProfile() { TestPlatformParameterModule.forceEnableOnboardingFlowV2(false) + setUpTestApplicationComponent() profileTestHelper.initializeProfiles(autoLogIn = false) profileTestHelper.addMoreProfiles(8) launch(ProfileChooserActivity::class.java).use { @@ -356,6 +361,7 @@ class ProfileChooserFragmentTest { @Test fun testProfileChooserFragment_onboardingV1_clickAdminProfile_checkOpensPinPasswordActivity() { TestPlatformParameterModule.forceEnableOnboardingFlowV2(false) + setUpTestApplicationComponent() profileTestHelper.initializeProfiles(autoLogIn = false) launch(ProfileChooserActivity::class.java).use { testCoroutineDispatchers.runCurrent() @@ -372,6 +378,7 @@ class ProfileChooserFragmentTest { @Test fun testMigrateProfiles_onboardingV2_clickAdminProfile_checkOpensPinPasswordActivity() { TestPlatformParameterModule.forceEnableOnboardingFlowV2(true) + setUpTestApplicationComponent() profileTestHelper.initializeProfiles(autoLogIn = true) profileTestHelper.updateProfileType(testProfileId, ProfileType.SUPERVISOR) @@ -389,8 +396,9 @@ class ProfileChooserFragmentTest { @Test fun testMigrateProfiles_onboardingV2_clickLearnerWithPin_checkOpensIntroActivity() { - profileTestHelper.initializeProfiles(autoLogIn = true) TestPlatformParameterModule.forceEnableOnboardingFlowV2(true) + setUpTestApplicationComponent() + profileTestHelper.initializeProfiles(autoLogIn = true) launch(ProfileChooserActivity::class.java).use { testCoroutineDispatchers.runCurrent() @@ -406,8 +414,9 @@ class ProfileChooserFragmentTest { @Test fun testMigrateProfiles_onboardingV2_clickAdminWithoutPin_checkOpensIntroActivity() { - profileTestHelper.addOnlyAdminProfileWithoutPin() TestPlatformParameterModule.forceEnableOnboardingFlowV2(true) + setUpTestApplicationComponent() + profileTestHelper.addOnlyAdminProfileWithoutPin() launch(ProfileChooserActivity::class.java).use { testCoroutineDispatchers.runCurrent() @@ -423,6 +432,8 @@ class ProfileChooserFragmentTest { @Test fun testMigrateProfiles_onboardingV2_clickLearnerWithoutPin_checkOpensIntroActivity() { + TestPlatformParameterModule.forceEnableOnboardingFlowV2(true) + setUpTestApplicationComponent() profileTestHelper.addOnlyAdminProfile() profileManagementController.addProfile( name = "Learner", @@ -432,7 +443,6 @@ class ProfileChooserFragmentTest { colorRgb = -10710042, isAdmin = false ) - TestPlatformParameterModule.forceEnableOnboardingFlowV2(true) launch(ProfileChooserActivity::class.java).use { testCoroutineDispatchers.runCurrent() @@ -449,6 +459,7 @@ class ProfileChooserFragmentTest { @Test fun testMigrateProfiles_onboardingV2_clickLearnerWithoutPin_checkIntroActivityHasNoStepCount() { TestPlatformParameterModule.forceEnableOnboardingFlowV2(true) + setUpTestApplicationComponent() profileTestHelper.addOnlyAdminProfile() profileManagementController.addProfile( name = "Learner", @@ -477,6 +488,7 @@ class ProfileChooserFragmentTest { @Test fun testProfileChooserFragment_clickAdminProfileWithNoPin_checkOpensAdminPinActivity() { TestPlatformParameterModule.forceEnableOnboardingFlowV2(false) + setUpTestApplicationComponent() profileTestHelper.addOnlyAdminProfileWithoutPin() launch(createProfileChooserActivityIntent()).use { testCoroutineDispatchers.runCurrent() @@ -495,6 +507,7 @@ class ProfileChooserFragmentTest { @Test fun testProfileChooserFragment_clickAdminControlsWithNoPin_checkOpensAdminControlsActivity() { TestPlatformParameterModule.forceEnableOnboardingFlowV2(false) + setUpTestApplicationComponent() profileTestHelper.addOnlyAdminProfileWithoutPin() launch(createProfileChooserActivityIntent()).use { testCoroutineDispatchers.runCurrent() @@ -511,6 +524,7 @@ class ProfileChooserFragmentTest { @Test fun testProfileChooserFragment_checkLayoutManager_isLinearLayoutManager() { TestPlatformParameterModule.forceEnableOnboardingFlowV2(false) + setUpTestApplicationComponent() profileTestHelper.addOnlyAdminProfile() launch(createProfileChooserActivityIntent()).use { testCoroutineDispatchers.runCurrent() @@ -528,6 +542,7 @@ class ProfileChooserFragmentTest { @Test fun testProfileChooserFragment_onlyAdminProfile_checkText_setUpMultipleProfilesIsVisible() { TestPlatformParameterModule.forceEnableOnboardingFlowV2(false) + setUpTestApplicationComponent() profileTestHelper.addOnlyAdminProfile() launch(createProfileChooserActivityIntent()).use { testCoroutineDispatchers.runCurrent() @@ -543,6 +558,7 @@ class ProfileChooserFragmentTest { @Test fun testProfileChooserFragment_onlyAdminProfile_checkDescriptionText_isDisplayed() { TestPlatformParameterModule.forceEnableOnboardingFlowV2(false) + setUpTestApplicationComponent() profileTestHelper.addOnlyAdminProfile() launch(createProfileChooserActivityIntent()).use { testCoroutineDispatchers.runCurrent() @@ -559,6 +575,7 @@ class ProfileChooserFragmentTest { @Test fun testProfileChooserFragment_multipleProfiles_checkText_addProfileIsVisible() { TestPlatformParameterModule.forceEnableOnboardingFlowV2(false) + setUpTestApplicationComponent() profileTestHelper.initializeProfiles(autoLogIn = false) launch(createProfileChooserActivityIntent()).use { testCoroutineDispatchers.runCurrent() @@ -574,6 +591,7 @@ class ProfileChooserFragmentTest { @Test fun testProfileChooserFragment_multipleProfiles_checkDescriptionText_isDisplayed() { TestPlatformParameterModule.forceEnableOnboardingFlowV2(false) + setUpTestApplicationComponent() profileTestHelper.initializeProfiles(autoLogIn = false) launch(createProfileChooserActivityIntent()).use { testCoroutineDispatchers.runCurrent() @@ -590,6 +608,7 @@ class ProfileChooserFragmentTest { @Test fun testProfileChooserFragment_clickAdminControls_opensAdminAuthActivity() { TestPlatformParameterModule.forceEnableOnboardingFlowV2(false) + setUpTestApplicationComponent() profileTestHelper.initializeProfiles(autoLogIn = false) launch(createProfileChooserActivityIntent()).use { testCoroutineDispatchers.runCurrent() @@ -602,6 +621,7 @@ class ProfileChooserFragmentTest { @Test fun testProfileChooserFragment_clickAddProfile_opensAdminAuthActivity() { TestPlatformParameterModule.forceEnableOnboardingFlowV2(false) + setUpTestApplicationComponent() profileTestHelper.initializeProfiles(autoLogIn = false) launch(createProfileChooserActivityIntent()).use { testCoroutineDispatchers.runCurrent() @@ -619,7 +639,7 @@ class ProfileChooserFragmentTest { @Test fun testProfileChooserFragment_clickProfile_opensHomeActivity() { TestPlatformParameterModule.forceEnableMultipleClassrooms(false) - TestPlatformParameterModule.forceEnableOnboardingFlowV2(false) + setUpTestApplicationComponent() profileTestHelper.addOnlyAdminProfileWithoutPin() launch(createProfileChooserActivityIntent()).use { testCoroutineDispatchers.runCurrent() @@ -641,6 +661,7 @@ class ProfileChooserFragmentTest { fun testProfileChooserFragment_enableClassrooms_clickProfile_opensClassroomListActivity() { TestPlatformParameterModule.forceEnableOnboardingFlowV2(false) TestPlatformParameterModule.forceEnableMultipleClassrooms(true) + setUpTestApplicationComponent() profileTestHelper.addOnlyAdminProfileWithoutPin() launch(createProfileChooserActivityIntent()).use { testCoroutineDispatchers.runCurrent() @@ -661,6 +682,7 @@ class ProfileChooserFragmentTest { @Test fun testFragment_enableOnboardingV2_checkAddProfileTextIsDisplayed() { TestPlatformParameterModule.forceEnableOnboardingFlowV2(true) + setUpTestApplicationComponent() profileTestHelper.initializeProfiles() launch(ProfileChooserActivity::class.java).use { testCoroutineDispatchers.runCurrent() @@ -671,6 +693,7 @@ class ProfileChooserFragmentTest { @Test fun testFragment_enableOnboardingV2_configChange_checkAddProfileTextIsDisplayed() { TestPlatformParameterModule.forceEnableOnboardingFlowV2(true) + setUpTestApplicationComponent() profileTestHelper.initializeProfiles() launch(ProfileChooserActivity::class.java).use { testCoroutineDispatchers.runCurrent() @@ -684,6 +707,7 @@ class ProfileChooserFragmentTest { @Config(qualifiers = "land") fun testFragment_enableOnboardingV2_landscapeMode_checkScrollArrowsAreDisplayed() { TestPlatformParameterModule.forceEnableOnboardingFlowV2(true) + setUpTestApplicationComponent() profileTestHelper.addOnlyAdminProfile() profileTestHelper.addMoreProfiles(8) launch(ProfileChooserActivity::class.java).use { @@ -697,6 +721,7 @@ class ProfileChooserFragmentTest { @Config(qualifiers = "land") fun testFragment_enableOnboardingV2_landscape_shortList_checkScrollArrowsAreNotDisplayed() { TestPlatformParameterModule.forceEnableOnboardingFlowV2(true) + setUpTestApplicationComponent() profileTestHelper.addOnlyAdminProfile() launch(ProfileChooserActivity::class.java).use { testCoroutineDispatchers.runCurrent() @@ -713,6 +738,7 @@ class ProfileChooserFragmentTest { @Config(qualifiers = "land") fun testFragment_enableOnboardingV2_ltr_checkListIsSortedAlphabetically() { TestPlatformParameterModule.forceEnableOnboardingFlowV2(true) + setUpTestApplicationComponent() profileTestHelper.addOnlyAdminProfile() profileTestHelper.addMoreProfiles(9) launch(ProfileChooserActivity::class.java).use { @@ -797,6 +823,7 @@ class ProfileChooserFragmentTest { @Config(qualifiers = "land") fun testFragment_enableOnboardingV2_ltr_checkRightArrowScrollsListToTheRight() { TestPlatformParameterModule.forceEnableOnboardingFlowV2(true) + setUpTestApplicationComponent() profileTestHelper.addOnlyAdminProfile() profileTestHelper.addMoreProfiles(9) launch(ProfileChooserActivity::class.java).use { @@ -835,6 +862,7 @@ class ProfileChooserFragmentTest { @Config(qualifiers = "land") fun testFragment_enableOnboardingV2_ltr_checkLeftArrowScrollsListToTheLeft() { TestPlatformParameterModule.forceEnableOnboardingFlowV2(true) + setUpTestApplicationComponent() profileTestHelper.addOnlyAdminProfile() profileTestHelper.addMoreProfiles(9) launch(ProfileChooserActivity::class.java).use { @@ -894,6 +922,7 @@ class ProfileChooserFragmentTest { ) fun testFragment_enableOnboardingV2_rtl_checkListIsSortedAlphabetically() { TestPlatformParameterModule.forceEnableOnboardingFlowV2(true) + setUpTestApplicationComponent() forceDefaultLocale(EGYPT_ARABIC_LOCALE) profileTestHelper.addOnlyAdminProfile() profileTestHelper.addMoreProfiles(9) @@ -991,6 +1020,7 @@ class ProfileChooserFragmentTest { ) fun testFragment_enableOnboardingV2_rtl_checkLeftArrowScrollsListToTheRight() { TestPlatformParameterModule.forceEnableOnboardingFlowV2(true) + setUpTestApplicationComponent() forceDefaultLocale(EGYPT_ARABIC_LOCALE) profileTestHelper.addOnlyAdminProfile() profileTestHelper.addMoreProfiles(9) @@ -1051,6 +1081,7 @@ class ProfileChooserFragmentTest { ) fun testFragment_enableOnboardingV2_rtl_checkRightArrowScrollsListToTheLeft() { TestPlatformParameterModule.forceEnableOnboardingFlowV2(true) + setUpTestApplicationComponent() forceDefaultLocale(EGYPT_ARABIC_LOCALE) profileTestHelper.addOnlyAdminProfile() profileTestHelper.addMoreProfiles(9) @@ -1111,6 +1142,7 @@ class ProfileChooserFragmentTest { @Test fun testProfileChooserFragment_enableOnboardingV2_clickAddProfileButton_opensAdminAuthActivity() { TestPlatformParameterModule.forceEnableOnboardingFlowV2(true) + setUpTestApplicationComponent() profileTestHelper.addOnlyAdminProfile() launch(createProfileChooserActivityIntent()).use { testCoroutineDispatchers.runCurrent() @@ -1122,6 +1154,7 @@ class ProfileChooserFragmentTest { @Test fun testProfileChooserFragment_enableOnboardingV2_clickAddProfilePrompt_opensAdminAuthActivity() { TestPlatformParameterModule.forceEnableOnboardingFlowV2(true) + setUpTestApplicationComponent() profileTestHelper.addOnlyAdminProfile() launch(createProfileChooserActivityIntent()).use { testCoroutineDispatchers.runCurrent() @@ -1133,6 +1166,7 @@ class ProfileChooserFragmentTest { @Test fun testProfileChooserFragment_enableOnboardingV2_initializeProfiles_checkProfilesAreShown() { TestPlatformParameterModule.forceEnableOnboardingFlowV2(true) + setUpTestApplicationComponent() profileTestHelper.initializeProfiles(autoLogIn = false) launch(ProfileChooserActivity::class.java).use { testCoroutineDispatchers.runCurrent() @@ -1159,6 +1193,7 @@ class ProfileChooserFragmentTest { @Test fun testProfileChooserFragment_enableOnboardingV2_afterVisitingHomeActivity_showsJustNowText() { TestPlatformParameterModule.forceEnableOnboardingFlowV2(true) + setUpTestApplicationComponent() // Note that the auto-log in here is simulating HomeActivity having been visited before (i.e. // that a profile was previously logged in). profileTestHelper.initializeProfiles(autoLogIn = true) @@ -1183,6 +1218,7 @@ class ProfileChooserFragmentTest { @Config(qualifiers = "land") fun testFragment_enableOnboardingV2_landscapeMode_afterVisitingHome_showsJustNowText() { TestPlatformParameterModule.forceEnableOnboardingFlowV2(true) + setUpTestApplicationComponent() // Note that the auto-log in here is simulating HomeActivity having been visited before (i.e. // that a profile was previously logged in). profileTestHelper.addOnlyAdminProfile() @@ -1208,6 +1244,7 @@ class ProfileChooserFragmentTest { @Test fun testFragment_enableOnboardingV2_addManyProfiles_checkNoAddProfile() { TestPlatformParameterModule.forceEnableOnboardingFlowV2(true) + setUpTestApplicationComponent() profileTestHelper.addOnlyAdminProfile() profileTestHelper.addMoreProfiles(9) launch(ProfileChooserActivity::class.java).use { @@ -1280,6 +1317,7 @@ class ProfileChooserFragmentTest { @Test fun testFragment_enableOnboardingV2_addManyProfiles_checkProfilesSortedAlphabetically() { TestPlatformParameterModule.forceEnableOnboardingFlowV2(true) + setUpTestApplicationComponent() profileTestHelper.initializeProfiles(autoLogIn = false) profileTestHelper.addMoreProfiles(8) launch(ProfileChooserActivity::class.java).use { @@ -1350,6 +1388,7 @@ class ProfileChooserFragmentTest { @Test fun testFragment_enableOnboardingV2_clickProfileWithPin_checkOpensPinPasswordActivity() { TestPlatformParameterModule.forceEnableOnboardingFlowV2(true) + setUpTestApplicationComponent() profileTestHelper.addOnlyAdminProfile() profileTestHelper.updateProfileType(testProfileId, ProfileType.SUPERVISOR) launch(ProfileChooserActivity::class.java).use { 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 f586fc901cc..3eb2c21fdee 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 @@ -65,7 +65,6 @@ import org.oppia.android.domain.oppialogger.analytics.ApplicationLifecycleModule import org.oppia.android.domain.oppialogger.analytics.CpuPerformanceSnapshotterModule 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 import org.oppia.android.domain.workmanager.WorkManagerConfigurationModule @@ -73,6 +72,7 @@ import org.oppia.android.testing.OppiaTestRule import org.oppia.android.testing.TestLogReportingModule import org.oppia.android.testing.firebase.TestAuthenticationModule import org.oppia.android.testing.junit.InitializeDefaultLocaleRule +import org.oppia.android.testing.platformparameter.TestPlatformParameterModule import org.oppia.android.testing.profile.ProfileTestHelper import org.oppia.android.testing.robolectric.RobolectricModule import org.oppia.android.testing.threading.TestDispatcherModule @@ -239,7 +239,6 @@ class ProfilePictureActivityTest { NumberWithUnitsRuleModule::class, NumericExpressionInputModule::class, NumericInputRuleModule::class, - PlatformParameterModule::class, PlatformParameterSingletonModule::class, QuestionModule::class, RatioInputModule::class, @@ -251,6 +250,7 @@ class ProfilePictureActivityTest { TestAuthenticationModule::class, TestDispatcherModule::class, TestLogReportingModule::class, + TestPlatformParameterModule::class, TestingBuildFlavorModule::class, TextInputRuleModule::class, ViewBindingShimModule::class, 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 11463275d8f..1c60de8bea6 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 @@ -56,7 +56,6 @@ import org.oppia.android.domain.oppialogger.analytics.ApplicationLifecycleModule import org.oppia.android.domain.oppialogger.analytics.CpuPerformanceSnapshotterModule 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 import org.oppia.android.domain.workmanager.WorkManagerConfigurationModule @@ -64,6 +63,7 @@ import org.oppia.android.testing.OppiaTestRule import org.oppia.android.testing.TestLogReportingModule import org.oppia.android.testing.firebase.TestAuthenticationModule import org.oppia.android.testing.junit.InitializeDefaultLocaleRule +import org.oppia.android.testing.platformparameter.TestPlatformParameterModule import org.oppia.android.testing.robolectric.RobolectricModule import org.oppia.android.testing.threading.TestCoroutineDispatchers import org.oppia.android.testing.threading.TestDispatcherModule @@ -190,7 +190,6 @@ class ProfileProgressActivityTest { NumberWithUnitsRuleModule::class, NumericExpressionInputModule::class, NumericInputRuleModule::class, - PlatformParameterModule::class, PlatformParameterSingletonModule::class, QuestionModule::class, RatioInputModule::class, @@ -202,6 +201,7 @@ class ProfileProgressActivityTest { TestAuthenticationModule::class, TestDispatcherModule::class, TestLogReportingModule::class, + TestPlatformParameterModule::class, TestingBuildFlavorModule::class, TextInputRuleModule::class, ViewBindingShimModule::class, 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 95b257b1061..201847999d1 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 @@ -101,7 +101,6 @@ import org.oppia.android.domain.oppialogger.analytics.ApplicationLifecycleModule import org.oppia.android.domain.oppialogger.analytics.CpuPerformanceSnapshotterModule 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 import org.oppia.android.domain.topic.FRACTIONS_STORY_ID_0 @@ -111,6 +110,7 @@ import org.oppia.android.testing.OppiaTestRule import org.oppia.android.testing.TestLogReportingModule import org.oppia.android.testing.firebase.TestAuthenticationModule import org.oppia.android.testing.junit.InitializeDefaultLocaleRule +import org.oppia.android.testing.platformparameter.TestPlatformParameterModule import org.oppia.android.testing.profile.ProfileTestHelper import org.oppia.android.testing.robolectric.RobolectricModule import org.oppia.android.testing.story.StoryProgressTestHelper @@ -955,7 +955,6 @@ class ProfileProgressFragmentTest { NumberWithUnitsRuleModule::class, NumericExpressionInputModule::class, NumericInputRuleModule::class, - PlatformParameterModule::class, PlatformParameterSingletonModule::class, QuestionModule::class, RatioInputModule::class, @@ -968,6 +967,7 @@ class ProfileProgressFragmentTest { TestDispatcherModule::class, TestLogReportingModule::class, TestModule::class, + TestPlatformParameterModule::class, TestingBuildFlavorModule::class, TextInputRuleModule::class, ViewBindingShimModule::class, 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 1cf6e4266c6..cd8e10f2270 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 @@ -93,7 +93,6 @@ import org.oppia.android.domain.oppialogger.analytics.ApplicationLifecycleModule import org.oppia.android.domain.oppialogger.analytics.CpuPerformanceSnapshotterModule 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 import org.oppia.android.domain.workmanager.WorkManagerConfigurationModule @@ -101,6 +100,7 @@ import org.oppia.android.testing.OppiaTestRule import org.oppia.android.testing.TestLogReportingModule import org.oppia.android.testing.firebase.TestAuthenticationModule import org.oppia.android.testing.junit.InitializeDefaultLocaleRule +import org.oppia.android.testing.platformparameter.TestPlatformParameterModule import org.oppia.android.testing.robolectric.RobolectricModule import org.oppia.android.testing.threading.TestCoroutineDispatchers import org.oppia.android.testing.threading.TestDispatcherModule @@ -701,7 +701,6 @@ class BindableAdapterTest { NumberWithUnitsRuleModule::class, NumericExpressionInputModule::class, NumericInputRuleModule::class, - PlatformParameterModule::class, PlatformParameterSingletonModule::class, QuestionModule::class, RatioInputModule::class, @@ -715,6 +714,7 @@ class BindableAdapterTest { TestDispatcherModule::class, TestLogReportingModule::class, TestModule::class, + TestPlatformParameterModule::class, TestingBuildFlavorModule::class, TextInputRuleModule::class, ViewBindingShimModule::class, 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 d5f6a76f788..cad1361be32 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 @@ -74,7 +74,6 @@ import org.oppia.android.domain.oppialogger.analytics.ApplicationLifecycleModule import org.oppia.android.domain.oppialogger.analytics.CpuPerformanceSnapshotterModule 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 import org.oppia.android.domain.topic.FRACTIONS_EXPLORATION_ID_0 @@ -86,6 +85,7 @@ import org.oppia.android.testing.TestImageLoaderModule import org.oppia.android.testing.TestLogReportingModule import org.oppia.android.testing.firebase.TestAuthenticationModule import org.oppia.android.testing.junit.InitializeDefaultLocaleRule +import org.oppia.android.testing.platformparameter.TestPlatformParameterModule import org.oppia.android.testing.robolectric.RobolectricModule import org.oppia.android.testing.threading.TestCoroutineDispatchers import org.oppia.android.testing.threading.TestDispatcherModule @@ -253,7 +253,6 @@ class ResumeLessonActivityTest { NumberWithUnitsRuleModule::class, NumericExpressionInputModule::class, NumericInputRuleModule::class, - PlatformParameterModule::class, PlatformParameterSingletonModule::class, QuestionModule::class, RatioInputModule::class, @@ -266,6 +265,7 @@ class ResumeLessonActivityTest { TestDispatcherModule::class, TestImageLoaderModule::class, TestLogReportingModule::class, + TestPlatformParameterModule::class, TestingBuildFlavorModule::class, TextInputRuleModule::class, ViewBindingShimModule::class, 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 625b52a181f..d4493f0aaf2 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 @@ -76,7 +76,6 @@ import org.oppia.android.domain.oppialogger.analytics.ApplicationLifecycleModule import org.oppia.android.domain.oppialogger.analytics.CpuPerformanceSnapshotterModule 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 import org.oppia.android.domain.topic.FRACTIONS_EXPLORATION_ID_0 @@ -93,6 +92,7 @@ import org.oppia.android.testing.TestLogReportingModule import org.oppia.android.testing.TestPlatform import org.oppia.android.testing.firebase.TestAuthenticationModule import org.oppia.android.testing.junit.InitializeDefaultLocaleRule +import org.oppia.android.testing.platformparameter.TestPlatformParameterModule import org.oppia.android.testing.robolectric.RobolectricModule import org.oppia.android.testing.threading.TestCoroutineDispatchers import org.oppia.android.testing.threading.TestDispatcherModule @@ -424,7 +424,6 @@ class ResumeLessonFragmentTest { NumberWithUnitsRuleModule::class, NumericExpressionInputModule::class, NumericInputRuleModule::class, - PlatformParameterModule::class, PlatformParameterSingletonModule::class, QuestionModule::class, RatioInputModule::class, @@ -437,6 +436,7 @@ class ResumeLessonFragmentTest { TestDispatcherModule::class, TestImageLoaderModule::class, TestLogReportingModule::class, + TestPlatformParameterModule::class, TestingBuildFlavorModule::class, TextInputRuleModule::class, ViewBindingShimModule::class, 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 76d30f50d4c..f6ad66f41dd 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 @@ -73,7 +73,6 @@ import org.oppia.android.domain.oppialogger.analytics.ApplicationLifecycleModule import org.oppia.android.domain.oppialogger.analytics.CpuPerformanceSnapshotterModule 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 import org.oppia.android.domain.question.QuestionModule @@ -82,6 +81,7 @@ import org.oppia.android.testing.OppiaTestRule import org.oppia.android.testing.TestLogReportingModule import org.oppia.android.testing.firebase.TestAuthenticationModule import org.oppia.android.testing.junit.InitializeDefaultLocaleRule +import org.oppia.android.testing.platformparameter.TestPlatformParameterModule import org.oppia.android.testing.profile.ProfileTestHelper import org.oppia.android.testing.robolectric.RobolectricModule import org.oppia.android.testing.threading.TestCoroutineDispatchers @@ -399,7 +399,6 @@ class ProfileEditActivityTest { NumberWithUnitsRuleModule::class, NumericExpressionInputModule::class, NumericInputRuleModule::class, - PlatformParameterModule::class, PlatformParameterSingletonModule::class, QuestionModule::class, RatioInputModule::class, @@ -411,6 +410,7 @@ class ProfileEditActivityTest { TestAuthenticationModule::class, TestDispatcherModule::class, TestLogReportingModule::class, + TestPlatformParameterModule::class, TestingBuildFlavorModule::class, TextInputRuleModule::class, ViewBindingShimModule::class, 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 5cd49517711..db374bd6ce1 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 @@ -150,24 +150,25 @@ class ProfileEditFragmentTest { @Before fun setUp() { Intents.init() - setUpTestApplicationComponent() - testCoroutineDispatchers.registerIdlingResource() - profileTestHelper.initializeProfiles() - TestPlatformParameterModule.reset() + // TODO(#5835): Call setUpTestApplicationComponent() here once flag overrides init earlier. } @After fun tearDown() { + TestPlatformParameterModule.reset() testCoroutineDispatchers.unregisterIdlingResource() Intents.release() } private fun setUpTestApplicationComponent() { ApplicationProvider.getApplicationContext().inject(this) + testCoroutineDispatchers.registerIdlingResource() + profileTestHelper.initializeProfiles() } @Test fun testProfileEdit_clickProfileDeletion_checkOpensDeletionDialog_checkOpensSuccessDialog() { + setUpTestApplicationComponent() launchFragmentTestActivity(internalProfileId = 1).use { onView(withId(R.id.profile_delete_button)).perform(click()) onView(withText(R.string.profile_edit_delete_dialog_message)) @@ -184,6 +185,7 @@ class ProfileEditFragmentTest { @Test @Config(qualifiers = "land") fun testProfileEdit_configChange_clickDelete_checkOpensDeletionDialog_checkOpensSuccessDialog() { + setUpTestApplicationComponent() launchFragmentTestActivity(internalProfileId = 1).use { onView(isRoot()).perform(orientationLandscape()) onView(withId(R.id.profile_delete_button)).perform(scrollTo()).perform(click()) @@ -202,6 +204,7 @@ class ProfileEditFragmentTest { @Test @Config(qualifiers = "land") fun testProfileEdit_clickDelete_landscapeMode_checkOpensDeletionDialog() { + setUpTestApplicationComponent() launchFragmentTestActivity(internalProfileId = 1).use { onView(withId(R.id.profile_delete_button)).perform(scrollTo()).perform(click()) onView(isRoot()).perform(orientationLandscape()) @@ -220,6 +223,7 @@ class ProfileEditFragmentTest { @Test fun testProfileEdit_startWithUserHasDownloadAccess_downloadsDisabled_switchIsNotDisplayed() { TestPlatformParameterModule.forceEnableDownloadsSupport(false) + setUpTestApplicationComponent() profileManagementController .addProfile( name = "James", @@ -237,6 +241,7 @@ class ProfileEditFragmentTest { @Test fun testProfileEdit_userDoesNotHaveDownloadAccess_downloadDisabled_switchIsNotDisplayed() { TestPlatformParameterModule.forceEnableDownloadsSupport(false) + setUpTestApplicationComponent() launchFragmentTestActivity(internalProfileId = 0).use { onView(withId(R.id.profile_edit_allow_download_container)).check(matches(not(isDisplayed()))) } @@ -245,6 +250,7 @@ class ProfileEditFragmentTest { @Test fun testProfileEdit_startWithUserHasDownloadAccess_downloadsEnabled_checkSwitchIsChecked() { TestPlatformParameterModule.forceEnableDownloadsSupport(true) + setUpTestApplicationComponent() profileManagementController .addProfile( name = "James", @@ -263,6 +269,7 @@ class ProfileEditFragmentTest { @Config(qualifiers = "land") fun testProfileEdit_configChange_userHasDownloadAccess_downloadsEnabled_checkSwitchIsChecked() { TestPlatformParameterModule.forceEnableDownloadsSupport(true) + setUpTestApplicationComponent() val addProfileProvider = profileManagementController.addProfile( name = "James", @@ -282,6 +289,7 @@ class ProfileEditFragmentTest { @Test fun testProfileEdit_userHasDownloadAccess_downloadsEnabled_clickAllowDownloads_checkChanged() { TestPlatformParameterModule.forceEnableDownloadsSupport(true) + setUpTestApplicationComponent() profileManagementController .addProfile( name = "James", @@ -301,6 +309,7 @@ class ProfileEditFragmentTest { @Test fun testProfileEdit_userDoesNotHaveDownloadAccess_downloadsEnabled_switchIsNotClickable() { TestPlatformParameterModule.forceEnableDownloadsSupport(true) + setUpTestApplicationComponent() profileManagementController .addProfile( name = "James", @@ -318,6 +327,7 @@ class ProfileEditFragmentTest { @Test fun testProfileEdit_userHasDownloadAccess_downloadsEnabled_switchContainerIsFocusable() { TestPlatformParameterModule.forceEnableDownloadsSupport(true) + setUpTestApplicationComponent() profileManagementController .addProfile( name = "James", @@ -335,6 +345,7 @@ class ProfileEditFragmentTest { @Test fun testProfileEdit_startWithUserHasDownloadAccess_downloadsEnabled_switchContainerIsDisplayed() { TestPlatformParameterModule.forceEnableDownloadsSupport(true) + setUpTestApplicationComponent() profileManagementController .addProfile( name = "James", @@ -352,6 +363,7 @@ class ProfileEditFragmentTest { @Test fun testProfileEdit_userDoesNotHaveDownloadAccess_downloadsEnabled_switchIsNotDisplayed() { TestPlatformParameterModule.forceEnableDownloadsSupport(true) + setUpTestApplicationComponent() launchFragmentTestActivity(internalProfileId = 0).use { onView(withId(R.id.profile_edit_allow_download_container)).check(matches(not(isDisplayed()))) } @@ -360,6 +372,7 @@ class ProfileEditFragmentTest { @Test fun testProfileEdit_studyOff_doesNotHaveMarkChaptersCompletedButton() { TestPlatformParameterModule.forceEnableLearnerStudyAnalytics(false) + setUpTestApplicationComponent() launchFragmentTestActivity(internalProfileId = 0).use { onView(withId(R.id.profile_mark_chapters_for_completion_button)) .check(matches(not(isDisplayed()))) @@ -369,6 +382,7 @@ class ProfileEditFragmentTest { @Test fun testProfileEdit_studyOn_hasMarkChaptersCompletedButton() { TestPlatformParameterModule.forceEnableLearnerStudyAnalytics(true) + setUpTestApplicationComponent() launchFragmentTestActivity(internalProfileId = 0).use { onView(withId(R.id.profile_mark_chapters_for_completion_button)).check(matches(isDisplayed())) } @@ -378,6 +392,7 @@ class ProfileEditFragmentTest { @Config(qualifiers = "land") fun testProfileEdit_studyOn_landscape_hasMarkChaptersCompletedButton() { TestPlatformParameterModule.forceEnableLearnerStudyAnalytics(true) + setUpTestApplicationComponent() launchFragmentTestActivity(internalProfileId = 0).use { onView(isRoot()).perform(orientationLandscape()) onView(withId(R.id.profile_mark_chapters_for_completion_button)).check(matches(isDisplayed())) @@ -387,6 +402,7 @@ class ProfileEditFragmentTest { @Test fun testProfileEdit_studyOn_clickMarkChapsCompleted_opensMarkCompleteActivityForProfile() { TestPlatformParameterModule.forceEnableLearnerStudyAnalytics(true) + setUpTestApplicationComponent() launchFragmentTestActivity(internalProfileId = 0).use { onView(withId(R.id.profile_mark_chapters_for_completion_button)).perform(click()) @@ -405,6 +421,7 @@ class ProfileEditFragmentTest { @Test fun testProfileEdit_featureOff_doesNotHaveEnableQuickSwitchingSwitch() { TestPlatformParameterModule.forceEnableFastLanguageSwitchingInLesson(false) + setUpTestApplicationComponent() // Without the study feature enabled, the switch should not be visible. launchFragmentTestActivity(internalProfileId = 0).use { @@ -416,6 +433,7 @@ class ProfileEditFragmentTest { @Test fun testProfileEdit_featureOn_hasEnableQuickSwitchingSwitch() { TestPlatformParameterModule.forceEnableFastLanguageSwitchingInLesson(true) + setUpTestApplicationComponent() launchFragmentTestActivity(internalProfileId = 0).use { onView(withId(R.id.profile_edit_enable_in_lesson_language_switching_container)) @@ -427,6 +445,7 @@ class ProfileEditFragmentTest { @Config(qualifiers = "land") fun testProfileEdit_featureOn_landscape_hasEnableQuickSwitchingSwitch() { TestPlatformParameterModule.forceEnableFastLanguageSwitchingInLesson(true) + setUpTestApplicationComponent() launchFragmentTestActivity(internalProfileId = 0).use { onView(isRoot()).perform(orientationLandscape()) @@ -443,6 +462,7 @@ class ProfileEditFragmentTest { @Test fun testProfileEdit_featureOn_doNotHaveSwitchingPermission_enableLanguageSwitchingIsOff() { TestPlatformParameterModule.forceEnableFastLanguageSwitchingInLesson(true) + setUpTestApplicationComponent() // Without the permission to switch languages, the setting should be off by default. launchFragmentTestActivity(internalProfileId = 0).use { @@ -454,6 +474,7 @@ class ProfileEditFragmentTest { @Test fun testProfileEdit_featureOn_hasSwitchingPermission_enableLanguageSwitchingIsOn() { TestPlatformParameterModule.forceEnableFastLanguageSwitchingInLesson(true) + setUpTestApplicationComponent() val updateLangProvider = profileManagementController.updateEnableInLessonQuickLanguageSwitching( @@ -472,6 +493,7 @@ class ProfileEditFragmentTest { @Test fun testProfileEdit_featureOn_doNotClickEnableLanguageSwitching_doesNotHaveSwitchingPermission() { TestPlatformParameterModule.forceEnableFastLanguageSwitchingInLesson(true) + setUpTestApplicationComponent() // Open the UI, but don't interact with it. launchFragmentTestActivity(internalProfileId = 0).use {} @@ -488,6 +510,7 @@ class ProfileEditFragmentTest { @Test fun testProfileEdit_studyOn_clickEnableLanguageSwitching_hasSwitchingPermission() { TestPlatformParameterModule.forceEnableFastLanguageSwitchingInLesson(true) + setUpTestApplicationComponent() // Enable language switching in the UI. launchFragmentTestActivity(internalProfileId = 0).use { @@ -506,6 +529,7 @@ class ProfileEditFragmentTest { @Test fun testFragment_fragmentLoaded_verifyCorrectArgumentsPassed() { + setUpTestApplicationComponent() launchFragmentTestActivity(internalProfileId = 1).use { scenario -> scenario.onActivity { activity -> 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 83494c73eca..3790762dbf1 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 @@ -56,7 +56,6 @@ import org.oppia.android.domain.oppialogger.analytics.ApplicationLifecycleModule import org.oppia.android.domain.oppialogger.analytics.CpuPerformanceSnapshotterModule 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 import org.oppia.android.domain.workmanager.WorkManagerConfigurationModule @@ -64,6 +63,7 @@ import org.oppia.android.testing.OppiaTestRule import org.oppia.android.testing.TestLogReportingModule import org.oppia.android.testing.firebase.TestAuthenticationModule import org.oppia.android.testing.junit.InitializeDefaultLocaleRule +import org.oppia.android.testing.platformparameter.TestPlatformParameterModule import org.oppia.android.testing.robolectric.RobolectricModule import org.oppia.android.testing.threading.TestCoroutineDispatchers import org.oppia.android.testing.threading.TestDispatcherModule @@ -183,7 +183,6 @@ class ProfileListActivityTest { NumberWithUnitsRuleModule::class, NumericExpressionInputModule::class, NumericInputRuleModule::class, - PlatformParameterModule::class, PlatformParameterSingletonModule::class, QuestionModule::class, RatioInputModule::class, @@ -195,6 +194,7 @@ class ProfileListActivityTest { TestAuthenticationModule::class, TestDispatcherModule::class, TestLogReportingModule::class, + TestPlatformParameterModule::class, TestingBuildFlavorModule::class, TextInputRuleModule::class, ViewBindingShimModule::class, 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 c0127e24989..18fc46599c9 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 @@ -73,7 +73,6 @@ import org.oppia.android.domain.oppialogger.analytics.ApplicationLifecycleModule import org.oppia.android.domain.oppialogger.analytics.CpuPerformanceSnapshotterModule 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 import org.oppia.android.domain.workmanager.WorkManagerConfigurationModule @@ -81,6 +80,7 @@ import org.oppia.android.testing.OppiaTestRule import org.oppia.android.testing.TestLogReportingModule import org.oppia.android.testing.firebase.TestAuthenticationModule import org.oppia.android.testing.junit.InitializeDefaultLocaleRule +import org.oppia.android.testing.platformparameter.TestPlatformParameterModule import org.oppia.android.testing.profile.ProfileTestHelper import org.oppia.android.testing.robolectric.RobolectricModule import org.oppia.android.testing.threading.TestCoroutineDispatchers @@ -441,7 +441,6 @@ class ProfileListFragmentTest { NumberWithUnitsRuleModule::class, NumericExpressionInputModule::class, NumericInputRuleModule::class, - PlatformParameterModule::class, PlatformParameterSingletonModule::class, QuestionModule::class, RatioInputModule::class, @@ -453,6 +452,7 @@ class ProfileListFragmentTest { TestAuthenticationModule::class, TestDispatcherModule::class, TestLogReportingModule::class, + TestPlatformParameterModule::class, TestingBuildFlavorModule::class, TextInputRuleModule::class, ViewBindingShimModule::class, 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 7d613a3cf65..df162f5b5ea 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 @@ -58,7 +58,6 @@ import org.oppia.android.domain.oppialogger.analytics.ApplicationLifecycleModule import org.oppia.android.domain.oppialogger.analytics.CpuPerformanceSnapshotterModule 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 import org.oppia.android.domain.workmanager.WorkManagerConfigurationModule @@ -66,6 +65,7 @@ import org.oppia.android.testing.OppiaTestRule import org.oppia.android.testing.TestLogReportingModule import org.oppia.android.testing.firebase.TestAuthenticationModule import org.oppia.android.testing.junit.InitializeDefaultLocaleRule +import org.oppia.android.testing.platformparameter.TestPlatformParameterModule import org.oppia.android.testing.profile.ProfileTestHelper import org.oppia.android.testing.robolectric.RobolectricModule import org.oppia.android.testing.threading.TestCoroutineDispatchers @@ -199,7 +199,6 @@ class ProfileRenameActivityTest { NumberWithUnitsRuleModule::class, NumericExpressionInputModule::class, NumericInputRuleModule::class, - PlatformParameterModule::class, PlatformParameterSingletonModule::class, QuestionModule::class, RatioInputModule::class, @@ -211,6 +210,7 @@ class ProfileRenameActivityTest { TestAuthenticationModule::class, TestDispatcherModule::class, TestLogReportingModule::class, + TestPlatformParameterModule::class, TestingBuildFlavorModule::class, TextInputRuleModule::class, ViewBindingShimModule::class, 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 f2be0f77bf6..1a1e76d187a 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 @@ -73,7 +73,6 @@ import org.oppia.android.domain.oppialogger.analytics.ApplicationLifecycleModule import org.oppia.android.domain.oppialogger.analytics.CpuPerformanceSnapshotterModule 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 import org.oppia.android.domain.workmanager.WorkManagerConfigurationModule @@ -84,6 +83,7 @@ import org.oppia.android.testing.espresso.TextInputAction.Companion.hasErrorText import org.oppia.android.testing.espresso.TextInputAction.Companion.hasNoErrorText import org.oppia.android.testing.firebase.TestAuthenticationModule import org.oppia.android.testing.junit.InitializeDefaultLocaleRule +import org.oppia.android.testing.platformparameter.TestPlatformParameterModule import org.oppia.android.testing.profile.ProfileTestHelper import org.oppia.android.testing.robolectric.RobolectricModule import org.oppia.android.testing.threading.TestCoroutineDispatchers @@ -495,7 +495,6 @@ class ProfileRenameFragmentTest { NumberWithUnitsRuleModule::class, NumericExpressionInputModule::class, NumericInputRuleModule::class, - PlatformParameterModule::class, PlatformParameterSingletonModule::class, QuestionModule::class, RatioInputModule::class, @@ -507,6 +506,7 @@ class ProfileRenameFragmentTest { TestAuthenticationModule::class, TestDispatcherModule::class, TestLogReportingModule::class, + TestPlatformParameterModule::class, TestingBuildFlavorModule::class, TextInputRuleModule::class, ViewBindingShimModule::class, 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 e0faab15f34..4b1b819df78 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 @@ -58,7 +58,6 @@ import org.oppia.android.domain.oppialogger.analytics.ApplicationLifecycleModule import org.oppia.android.domain.oppialogger.analytics.CpuPerformanceSnapshotterModule 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 import org.oppia.android.domain.workmanager.WorkManagerConfigurationModule @@ -66,6 +65,7 @@ import org.oppia.android.testing.OppiaTestRule import org.oppia.android.testing.TestLogReportingModule import org.oppia.android.testing.firebase.TestAuthenticationModule import org.oppia.android.testing.junit.InitializeDefaultLocaleRule +import org.oppia.android.testing.platformparameter.TestPlatformParameterModule import org.oppia.android.testing.profile.ProfileTestHelper import org.oppia.android.testing.robolectric.RobolectricModule import org.oppia.android.testing.threading.TestCoroutineDispatchers @@ -207,7 +207,6 @@ class ProfileResetPinActivityTest { NumberWithUnitsRuleModule::class, NumericExpressionInputModule::class, NumericInputRuleModule::class, - PlatformParameterModule::class, PlatformParameterSingletonModule::class, QuestionModule::class, RatioInputModule::class, @@ -219,6 +218,7 @@ class ProfileResetPinActivityTest { TestAuthenticationModule::class, TestDispatcherModule::class, TestLogReportingModule::class, + TestPlatformParameterModule::class, TestingBuildFlavorModule::class, TextInputRuleModule::class, ViewBindingShimModule::class, 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 ae29732acb7..3f09fc33cfd 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 @@ -77,7 +77,6 @@ import org.oppia.android.domain.oppialogger.analytics.ApplicationLifecycleModule import org.oppia.android.domain.oppialogger.analytics.CpuPerformanceSnapshotterModule 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 import org.oppia.android.domain.workmanager.WorkManagerConfigurationModule @@ -88,6 +87,7 @@ import org.oppia.android.testing.espresso.TextInputAction.Companion.hasErrorText import org.oppia.android.testing.espresso.TextInputAction.Companion.hasNoErrorText import org.oppia.android.testing.firebase.TestAuthenticationModule import org.oppia.android.testing.junit.InitializeDefaultLocaleRule +import org.oppia.android.testing.platformparameter.TestPlatformParameterModule import org.oppia.android.testing.profile.ProfileTestHelper import org.oppia.android.testing.robolectric.RobolectricModule import org.oppia.android.testing.threading.TestCoroutineDispatchers @@ -946,7 +946,6 @@ class ProfileResetPinFragmentTest { NumberWithUnitsRuleModule::class, NumericExpressionInputModule::class, NumericInputRuleModule::class, - PlatformParameterModule::class, PlatformParameterSingletonModule::class, QuestionModule::class, RatioInputModule::class, @@ -958,6 +957,7 @@ class ProfileResetPinFragmentTest { TestAuthenticationModule::class, TestDispatcherModule::class, TestLogReportingModule::class, + TestPlatformParameterModule::class, TestingBuildFlavorModule::class, TextInputRuleModule::class, ViewBindingShimModule::class, 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 53196cb243d..1f5bc7adb31 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 @@ -1046,6 +1046,7 @@ class SplashActivityTest { val monitor = monitorFactory.createMonitor(appStartupStateController.getAppStartupState()) testCoroutineDispatchers.advanceUntilIdle() monitor.ensureNextResultIsSuccess() + TestPlatformParameterModule.reset() } } @@ -1172,6 +1173,7 @@ class SplashActivityTest { runInNewTestApplication { appStartupStateController.markOnboardingFlowCompleted() testCoroutineDispatchers.advanceUntilIdle() + TestPlatformParameterModule.reset() } } @@ -1197,6 +1199,7 @@ class SplashActivityTest { private fun recreateExistingApplication() { testCoroutineDispatchers.unregisterIdlingResource() ApplicationProvider.getApplicationContext().recreateDaggerGraph() + TestPlatformParameterModule.reset() initializeTestApplication() // Reset any intents previously recorded. @@ -1229,8 +1232,8 @@ class SplashActivityTest { } private fun initializeTestApplication(onboardingV2Enabled: Boolean = false) { - ApplicationProvider.getApplicationContext().inject(this) TestPlatformParameterModule.forceEnableOnboardingFlowV2(onboardingV2Enabled) + ApplicationProvider.getApplicationContext().inject(this) testCoroutineDispatchers.registerIdlingResource() setAutoAppExpirationEnabled(enabled = false) // Default to disabled. } diff --git a/app/src/sharedTest/java/org/oppia/android/app/spotlight/SpotlightFragmentTest.kt b/app/src/sharedTest/java/org/oppia/android/app/spotlight/SpotlightFragmentTest.kt index 8501929a388..f800c432ca9 100644 --- a/app/src/sharedTest/java/org/oppia/android/app/spotlight/SpotlightFragmentTest.kt +++ b/app/src/sharedTest/java/org/oppia/android/app/spotlight/SpotlightFragmentTest.kt @@ -136,6 +136,7 @@ class SpotlightFragmentTest { @After fun tearDown() { + TestPlatformParameterModule.reset() Intents.release() testCoroutineDispatchers.unregisterIdlingResource() } 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 3f89411429f..0a70b4b52d4 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 @@ -73,7 +73,6 @@ import org.oppia.android.domain.oppialogger.analytics.ApplicationLifecycleModule import org.oppia.android.domain.oppialogger.analytics.CpuPerformanceSnapshotterModule 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 import org.oppia.android.domain.topic.TEST_EXPLORATION_ID_2 @@ -86,6 +85,7 @@ import org.oppia.android.testing.TestImageLoaderModule import org.oppia.android.testing.TestLogReportingModule import org.oppia.android.testing.firebase.TestAuthenticationModule import org.oppia.android.testing.junit.InitializeDefaultLocaleRule +import org.oppia.android.testing.platformparameter.TestPlatformParameterModule import org.oppia.android.testing.robolectric.RobolectricModule import org.oppia.android.testing.threading.TestCoroutineDispatchers import org.oppia.android.testing.threading.TestDispatcherModule @@ -275,7 +275,6 @@ class StoryActivityTest { NumberWithUnitsRuleModule::class, NumericExpressionInputModule::class, NumericInputRuleModule::class, - PlatformParameterModule::class, PlatformParameterSingletonModule::class, QuestionModule::class, RatioInputModule::class, @@ -288,6 +287,7 @@ class StoryActivityTest { TestDispatcherModule::class, TestImageLoaderModule::class, TestLogReportingModule::class, + TestPlatformParameterModule::class, TestingBuildFlavorModule::class, TextInputRuleModule::class, ViewBindingShimModule::class, 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 67244d3d95f..49331e21031 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 @@ -110,7 +110,6 @@ import org.oppia.android.domain.oppialogger.analytics.ApplicationLifecycleModule import org.oppia.android.domain.oppialogger.analytics.CpuPerformanceSnapshotterModule 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 import org.oppia.android.domain.topic.FRACTIONS_STORY_ID_0 @@ -127,6 +126,7 @@ import org.oppia.android.testing.firebase.TestAuthenticationModule import org.oppia.android.testing.junit.InitializeDefaultLocaleRule import org.oppia.android.testing.mockito.anyOrNull import org.oppia.android.testing.mockito.capture +import org.oppia.android.testing.platformparameter.TestPlatformParameterModule import org.oppia.android.testing.profile.ProfileTestHelper import org.oppia.android.testing.robolectric.RobolectricModule import org.oppia.android.testing.story.StoryProgressTestHelper @@ -1221,7 +1221,6 @@ class StoryFragmentTest { NumberWithUnitsRuleModule::class, NumericExpressionInputModule::class, NumericInputRuleModule::class, - PlatformParameterModule::class, PlatformParameterSingletonModule::class, QuestionModule::class, RatioInputModule::class, @@ -1234,6 +1233,7 @@ class StoryFragmentTest { TestDispatcherModule::class, TestLogReportingModule::class, TestModule::class, + TestPlatformParameterModule::class, TestingBuildFlavorModule::class, TextInputRuleModule::class, ViewBindingShimModule::class, 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 aa108b2a872..4a31eaf5f63 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 @@ -70,7 +70,6 @@ import org.oppia.android.domain.oppialogger.analytics.ApplicationLifecycleModule import org.oppia.android.domain.oppialogger.analytics.CpuPerformanceSnapshotterModule 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 import org.oppia.android.domain.workmanager.WorkManagerConfigurationModule @@ -78,6 +77,7 @@ import org.oppia.android.testing.OppiaTestRule import org.oppia.android.testing.TestLogReportingModule import org.oppia.android.testing.firebase.TestAuthenticationModule import org.oppia.android.testing.junit.InitializeDefaultLocaleRule +import org.oppia.android.testing.platformparameter.TestPlatformParameterModule import org.oppia.android.testing.robolectric.RobolectricModule import org.oppia.android.testing.threading.TestCoroutineDispatchers import org.oppia.android.testing.threading.TestDispatcherModule @@ -284,7 +284,6 @@ class DragDropTestActivityTest { NumberWithUnitsRuleModule::class, NumericExpressionInputModule::class, NumericInputRuleModule::class, - PlatformParameterModule::class, PlatformParameterSingletonModule::class, QuestionModule::class, RatioInputModule::class, @@ -296,6 +295,7 @@ class DragDropTestActivityTest { TestAuthenticationModule::class, TestDispatcherModule::class, TestLogReportingModule::class, + TestPlatformParameterModule::class, TestingBuildFlavorModule::class, TextInputRuleModule::class, ViewBindingShimModule::class, diff --git a/app/src/sharedTest/java/org/oppia/android/app/testing/FractionInputInteractionViewTestActivityTest.kt b/app/src/sharedTest/java/org/oppia/android/app/testing/FractionInputInteractionViewTestActivityTest.kt index a0bcad451a7..0bb5de555f8 100644 --- a/app/src/sharedTest/java/org/oppia/android/app/testing/FractionInputInteractionViewTestActivityTest.kt +++ b/app/src/sharedTest/java/org/oppia/android/app/testing/FractionInputInteractionViewTestActivityTest.kt @@ -66,7 +66,6 @@ import org.oppia.android.domain.oppialogger.analytics.ApplicationLifecycleModule import org.oppia.android.domain.oppialogger.analytics.CpuPerformanceSnapshotterModule 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 import org.oppia.android.domain.workmanager.WorkManagerConfigurationModule @@ -76,6 +75,7 @@ import org.oppia.android.testing.TestLogReportingModule import org.oppia.android.testing.espresso.EditTextInputAction import org.oppia.android.testing.firebase.TestAuthenticationModule import org.oppia.android.testing.junit.InitializeDefaultLocaleRule +import org.oppia.android.testing.platformparameter.TestPlatformParameterModule import org.oppia.android.testing.robolectric.RobolectricModule import org.oppia.android.testing.threading.TestCoroutineDispatchers import org.oppia.android.testing.threading.TestDispatcherModule @@ -597,7 +597,6 @@ class FractionInputInteractionViewTestActivityTest { NumberWithUnitsRuleModule::class, NumericExpressionInputModule::class, NumericInputRuleModule::class, - PlatformParameterModule::class, PlatformParameterSingletonModule::class, QuestionModule::class, RatioInputModule::class, @@ -609,6 +608,7 @@ class FractionInputInteractionViewTestActivityTest { TestAuthenticationModule::class, TestDispatcherModule::class, TestLogReportingModule::class, + TestPlatformParameterModule::class, TestingBuildFlavorModule::class, TextInputRuleModule::class, ViewBindingShimModule::class, 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 05d2d324db6..36f442d9dae 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 @@ -66,7 +66,6 @@ import org.oppia.android.domain.oppialogger.analytics.ApplicationLifecycleModule import org.oppia.android.domain.oppialogger.analytics.CpuPerformanceSnapshotterModule 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 import org.oppia.android.domain.workmanager.WorkManagerConfigurationModule @@ -76,6 +75,7 @@ import org.oppia.android.testing.TestLogReportingModule import org.oppia.android.testing.espresso.EditTextInputAction import org.oppia.android.testing.firebase.TestAuthenticationModule import org.oppia.android.testing.junit.InitializeDefaultLocaleRule +import org.oppia.android.testing.platformparameter.TestPlatformParameterModule import org.oppia.android.testing.robolectric.RobolectricModule import org.oppia.android.testing.threading.TestCoroutineDispatchers import org.oppia.android.testing.threading.TestDispatcherModule @@ -471,7 +471,6 @@ class InputInteractionViewTestActivityTest { NumberWithUnitsRuleModule::class, NumericExpressionInputModule::class, NumericInputRuleModule::class, - PlatformParameterModule::class, PlatformParameterSingletonModule::class, QuestionModule::class, RatioInputModule::class, @@ -483,6 +482,7 @@ class InputInteractionViewTestActivityTest { TestAuthenticationModule::class, TestDispatcherModule::class, TestLogReportingModule::class, + TestPlatformParameterModule::class, TestingBuildFlavorModule::class, TextInputRuleModule::class, ViewBindingShimModule::class, 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 b74ee4df812..59b8773bbce 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 @@ -95,7 +95,6 @@ import org.oppia.android.domain.oppialogger.analytics.ApplicationLifecycleModule import org.oppia.android.domain.oppialogger.analytics.CpuPerformanceSnapshotterModule 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 import org.oppia.android.domain.workmanager.WorkManagerConfigurationModule @@ -105,6 +104,7 @@ import org.oppia.android.testing.TestLogReportingModule import org.oppia.android.testing.TestPlatform import org.oppia.android.testing.firebase.TestAuthenticationModule import org.oppia.android.testing.junit.InitializeDefaultLocaleRule +import org.oppia.android.testing.platformparameter.TestPlatformParameterModule import org.oppia.android.testing.profile.ProfileTestHelper import org.oppia.android.testing.robolectric.RobolectricModule import org.oppia.android.testing.threading.TestCoroutineDispatchers @@ -477,7 +477,6 @@ class NavigationDrawerActivityDebugTest { NumberWithUnitsRuleModule::class, NumericExpressionInputModule::class, NumericInputRuleModule::class, - PlatformParameterModule::class, PlatformParameterSingletonModule::class, QuestionModule::class, RatioInputModule::class, @@ -489,6 +488,7 @@ class NavigationDrawerActivityDebugTest { TestAuthenticationModule::class, TestDispatcherModule::class, TestLogReportingModule::class, + TestPlatformParameterModule::class, TestingBuildFlavorModule::class, TextInputRuleModule::class, ViewBindingShimModule::class, 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 6b8d77d503a..d8bfb12b045 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 @@ -102,7 +102,6 @@ import org.oppia.android.domain.oppialogger.analytics.ApplicationLifecycleModule import org.oppia.android.domain.oppialogger.analytics.CpuPerformanceSnapshotterModule 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 import org.oppia.android.domain.workmanager.WorkManagerConfigurationModule @@ -112,6 +111,7 @@ import org.oppia.android.testing.TestLogReportingModule import org.oppia.android.testing.TestPlatform import org.oppia.android.testing.firebase.TestAuthenticationModule import org.oppia.android.testing.junit.InitializeDefaultLocaleRule +import org.oppia.android.testing.platformparameter.TestPlatformParameterModule import org.oppia.android.testing.profile.ProfileTestHelper import org.oppia.android.testing.robolectric.RobolectricModule import org.oppia.android.testing.story.StoryProgressTestHelper @@ -1038,7 +1038,6 @@ class NavigationDrawerActivityProdTest { NumberWithUnitsRuleModule::class, NumericExpressionInputModule::class, NumericInputRuleModule::class, - PlatformParameterModule::class, PlatformParameterSingletonModule::class, QuestionModule::class, RatioInputModule::class, @@ -1050,6 +1049,7 @@ class NavigationDrawerActivityProdTest { TestAuthenticationModule::class, TestDispatcherModule::class, TestLogReportingModule::class, + TestPlatformParameterModule::class, TestingBuildFlavorModule::class, TextInputRuleModule::class, ViewBindingShimModule::class, diff --git a/app/src/sharedTest/java/org/oppia/android/app/testing/RatioInputInteractionViewTestActivityTest.kt b/app/src/sharedTest/java/org/oppia/android/app/testing/RatioInputInteractionViewTestActivityTest.kt index 8da8f3021d4..8d887d3b419 100644 --- a/app/src/sharedTest/java/org/oppia/android/app/testing/RatioInputInteractionViewTestActivityTest.kt +++ b/app/src/sharedTest/java/org/oppia/android/app/testing/RatioInputInteractionViewTestActivityTest.kt @@ -73,7 +73,6 @@ import org.oppia.android.domain.oppialogger.analytics.ApplicationLifecycleModule import org.oppia.android.domain.oppialogger.analytics.CpuPerformanceSnapshotterModule 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 import org.oppia.android.domain.workmanager.WorkManagerConfigurationModule @@ -83,6 +82,7 @@ import org.oppia.android.testing.TestLogReportingModule import org.oppia.android.testing.espresso.EditTextInputAction import org.oppia.android.testing.firebase.TestAuthenticationModule import org.oppia.android.testing.junit.InitializeDefaultLocaleRule +import org.oppia.android.testing.platformparameter.TestPlatformParameterModule import org.oppia.android.testing.robolectric.RobolectricModule import org.oppia.android.testing.threading.TestCoroutineDispatchers import org.oppia.android.testing.threading.TestDispatcherModule @@ -465,7 +465,6 @@ class RatioInputInteractionViewTestActivityTest { NumberWithUnitsRuleModule::class, NumericExpressionInputModule::class, NumericInputRuleModule::class, - PlatformParameterModule::class, PlatformParameterSingletonModule::class, QuestionModule::class, RatioInputModule::class, @@ -477,6 +476,7 @@ class RatioInputInteractionViewTestActivityTest { TestAuthenticationModule::class, TestDispatcherModule::class, TestLogReportingModule::class, + TestPlatformParameterModule::class, TestingBuildFlavorModule::class, TextInputRuleModule::class, ViewBindingShimModule::class, 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 c3a59137987..b21caa36f17 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 @@ -62,7 +62,6 @@ import org.oppia.android.domain.oppialogger.analytics.ApplicationLifecycleModule import org.oppia.android.domain.oppialogger.analytics.CpuPerformanceSnapshotterModule 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 import org.oppia.android.domain.workmanager.WorkManagerConfigurationModule @@ -70,6 +69,7 @@ import org.oppia.android.testing.OppiaTestRule import org.oppia.android.testing.TestLogReportingModule import org.oppia.android.testing.firebase.TestAuthenticationModule import org.oppia.android.testing.junit.InitializeDefaultLocaleRule +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 @@ -231,7 +231,6 @@ class TestFontScaleConfigurationUtilActivityTest { NumberWithUnitsRuleModule::class, NumericExpressionInputModule::class, NumericInputRuleModule::class, - PlatformParameterModule::class, PlatformParameterSingletonModule::class, QuestionModule::class, RatioInputModule::class, @@ -243,6 +242,7 @@ class TestFontScaleConfigurationUtilActivityTest { TestAuthenticationModule::class, TestDispatcherModule::class, TestLogReportingModule::class, + TestPlatformParameterModule::class, TestingBuildFlavorModule::class, TextInputRuleModule::class, ViewBindingShimModule::class, diff --git a/app/src/sharedTest/java/org/oppia/android/app/testing/TextInputInteractionViewTestActivityTest.kt b/app/src/sharedTest/java/org/oppia/android/app/testing/TextInputInteractionViewTestActivityTest.kt index 5cb3a478156..4aec1e6bb79 100644 --- a/app/src/sharedTest/java/org/oppia/android/app/testing/TextInputInteractionViewTestActivityTest.kt +++ b/app/src/sharedTest/java/org/oppia/android/app/testing/TextInputInteractionViewTestActivityTest.kt @@ -65,7 +65,6 @@ import org.oppia.android.domain.oppialogger.analytics.ApplicationLifecycleModule import org.oppia.android.domain.oppialogger.analytics.CpuPerformanceSnapshotterModule 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 import org.oppia.android.domain.workmanager.WorkManagerConfigurationModule @@ -75,6 +74,7 @@ import org.oppia.android.testing.TestLogReportingModule import org.oppia.android.testing.espresso.EditTextInputAction import org.oppia.android.testing.firebase.TestAuthenticationModule import org.oppia.android.testing.junit.InitializeDefaultLocaleRule +import org.oppia.android.testing.platformparameter.TestPlatformParameterModule import org.oppia.android.testing.robolectric.RobolectricModule import org.oppia.android.testing.threading.TestCoroutineDispatchers import org.oppia.android.testing.threading.TestDispatcherModule @@ -264,7 +264,6 @@ class TextInputInteractionViewTestActivityTest { NumberWithUnitsRuleModule::class, NumericExpressionInputModule::class, NumericInputRuleModule::class, - PlatformParameterModule::class, PlatformParameterSingletonModule::class, QuestionModule::class, RatioInputModule::class, @@ -276,6 +275,7 @@ class TextInputInteractionViewTestActivityTest { TestAuthenticationModule::class, TestDispatcherModule::class, TestLogReportingModule::class, + TestPlatformParameterModule::class, TestingBuildFlavorModule::class, TextInputRuleModule::class, ViewBindingShimModule::class, 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 fbb95549cfb..0b0e80e89c7 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 @@ -133,6 +133,7 @@ class TopicTestActivityForStoryTest { @After fun tearDown() { + TestPlatformParameterModule.reset() testCoroutineDispatchers.unregisterIdlingResource() } 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 148051f362b..72c026cb30b 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 @@ -146,6 +146,7 @@ class TopicActivityTest { @After fun tearDown() { + TestPlatformParameterModule.reset() Intents.release() } 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 a10d6810ffc..de9e018d09c 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 @@ -188,12 +188,13 @@ class TopicFragmentTest { @Before fun setUp() { + TestPlatformParameterModule.forceEnableSpotlightUi(true) Intents.init() - TestPlatformParameterModule.reset() } @After fun tearDown() { + TestPlatformParameterModule.reset() testCoroutineDispatchers.unregisterIdlingResource() Intents.release() } 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 5eb5880cd5b..f510069f5ad 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 @@ -93,7 +93,6 @@ import org.oppia.android.domain.oppialogger.analytics.ApplicationLifecycleModule import org.oppia.android.domain.oppialogger.analytics.CpuPerformanceSnapshotterModule 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 import org.oppia.android.domain.topic.TEST_SKILL_ID_0 @@ -110,6 +109,7 @@ import org.oppia.android.testing.data.DataProviderTestMonitor import org.oppia.android.testing.environment.TestEnvironmentConfig import org.oppia.android.testing.firebase.TestAuthenticationModule import org.oppia.android.testing.junit.InitializeDefaultLocaleRule +import org.oppia.android.testing.platformparameter.TestPlatformParameterModule import org.oppia.android.testing.robolectric.RobolectricModule import org.oppia.android.testing.threading.TestCoroutineDispatchers import org.oppia.android.testing.threading.TestDispatcherModule @@ -640,7 +640,6 @@ class ConceptCardFragmentTest { NumberWithUnitsRuleModule::class, NumericExpressionInputModule::class, NumericInputRuleModule::class, - PlatformParameterModule::class, PlatformParameterSingletonModule::class, QuestionModule::class, RatioInputModule::class, @@ -653,6 +652,7 @@ class ConceptCardFragmentTest { TestDispatcherModule::class, TestLogReportingModule::class, TestModule::class, + TestPlatformParameterModule::class, TestingBuildFlavorModule::class, TextInputRuleModule::class, ViewBindingShimModule::class, 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 5f8ac60e382..c02507a44cf 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 @@ -176,6 +176,7 @@ class TopicInfoFragmentTest { @After fun tearDown() { + TestPlatformParameterModule.reset() testCoroutineDispatchers.unregisterIdlingResource() } 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 13052688bd9..d9d116852ae 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 @@ -206,6 +206,7 @@ class TopicLessonsFragmentTest { @After fun tearDown() { + TestPlatformParameterModule.reset() testCoroutineDispatchers.unregisterIdlingResource() Intents.release() } 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 03a3629f34d..5eb88c4cf17 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 @@ -167,6 +167,7 @@ class TopicPracticeFragmentTest { @After fun tearDown() { + TestPlatformParameterModule.reset() testCoroutineDispatchers.unregisterIdlingResource() Intents.release() } 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 d9927c22ce4..53e584a5ff1 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 @@ -107,7 +107,6 @@ import org.oppia.android.domain.oppialogger.analytics.ApplicationLifecycleModule import org.oppia.android.domain.oppialogger.analytics.CpuPerformanceSnapshotterModule 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 import org.oppia.android.domain.question.InternalScoreMultiplyFactor @@ -132,6 +131,7 @@ import org.oppia.android.testing.data.DataProviderTestMonitor import org.oppia.android.testing.espresso.EditTextInputAction import org.oppia.android.testing.firebase.TestAuthenticationModule import org.oppia.android.testing.junit.InitializeDefaultLocaleRule +import org.oppia.android.testing.platformparameter.TestPlatformParameterModule import org.oppia.android.testing.profile.ProfileTestHelper import org.oppia.android.testing.robolectric.RobolectricModule import org.oppia.android.testing.threading.CoroutineExecutorService @@ -874,7 +874,6 @@ class QuestionPlayerActivityTest { NumberWithUnitsRuleModule::class, NumericExpressionInputModule::class, NumericInputRuleModule::class, - PlatformParameterModule::class, PlatformParameterSingletonModule::class, RatioInputModule::class, RetrofitModule::class, @@ -886,6 +885,7 @@ class QuestionPlayerActivityTest { TestDispatcherModule::class, TestLogReportingModule::class, TestModule::class, + TestPlatformParameterModule::class, TestingBuildFlavorModule::class, TextInputRuleModule::class, ViewBindingShimModule::class, 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 1f05ff08569..18df6bfdc37 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 @@ -170,6 +170,7 @@ class TopicRevisionFragmentTest { @After fun tearDown() { + TestPlatformParameterModule.reset() testCoroutineDispatchers.unregisterIdlingResource() Intents.release() } 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 66099f5add1..8b6a0db6101 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 @@ -72,7 +72,6 @@ import org.oppia.android.domain.oppialogger.analytics.ApplicationLifecycleModule import org.oppia.android.domain.oppialogger.analytics.CpuPerformanceSnapshotterModule 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 import org.oppia.android.domain.topic.FRACTIONS_TOPIC_ID @@ -88,6 +87,7 @@ import org.oppia.android.testing.data.DataProviderTestMonitor import org.oppia.android.testing.firebase.TestAuthenticationModule import org.oppia.android.testing.junit.InitializeDefaultLocaleRule import org.oppia.android.testing.logging.EventLogSubject.Companion.assertThat +import org.oppia.android.testing.platformparameter.TestPlatformParameterModule import org.oppia.android.testing.robolectric.RobolectricModule import org.oppia.android.testing.threading.TestCoroutineDispatchers import org.oppia.android.testing.threading.TestDispatcherModule @@ -501,7 +501,6 @@ class RevisionCardActivityTest { NumberWithUnitsRuleModule::class, NumericExpressionInputModule::class, NumericInputRuleModule::class, - PlatformParameterModule::class, PlatformParameterSingletonModule::class, QuestionModule::class, RatioInputModule::class, @@ -513,6 +512,7 @@ class RevisionCardActivityTest { TestAuthenticationModule::class, TestDispatcherModule::class, TestLogReportingModule::class, + TestPlatformParameterModule::class, TestingBuildFlavorModule::class, TextInputRuleModule::class, ViewBindingShimModule::class, 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 f875a4e1d76..0342360e2fa 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 @@ -98,7 +98,6 @@ import org.oppia.android.domain.oppialogger.analytics.ApplicationLifecycleModule import org.oppia.android.domain.oppialogger.analytics.CpuPerformanceSnapshotterModule 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 import org.oppia.android.domain.topic.FRACTIONS_TOPIC_ID @@ -117,6 +116,7 @@ import org.oppia.android.testing.data.DataProviderTestMonitor import org.oppia.android.testing.environment.TestEnvironmentConfig import org.oppia.android.testing.firebase.TestAuthenticationModule import org.oppia.android.testing.junit.InitializeDefaultLocaleRule +import org.oppia.android.testing.platformparameter.TestPlatformParameterModule import org.oppia.android.testing.robolectric.RobolectricModule import org.oppia.android.testing.threading.TestCoroutineDispatchers import org.oppia.android.testing.threading.TestDispatcherModule @@ -962,7 +962,6 @@ class RevisionCardFragmentTest { NumberWithUnitsRuleModule::class, NumericExpressionInputModule::class, NumericInputRuleModule::class, - PlatformParameterModule::class, PlatformParameterSingletonModule::class, QuestionModule::class, RatioInputModule::class, @@ -975,6 +974,7 @@ class RevisionCardFragmentTest { TestDispatcherModule::class, TestLogReportingModule::class, TestModule::class, + TestPlatformParameterModule::class, TestingBuildFlavorModule::class, TextInputRuleModule::class, ViewBindingShimModule::class, 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 5657d77f3b5..753fd55c266 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 @@ -56,7 +56,6 @@ import org.oppia.android.domain.oppialogger.analytics.ApplicationLifecycleModule import org.oppia.android.domain.oppialogger.analytics.CpuPerformanceSnapshotterModule 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 import org.oppia.android.domain.workmanager.WorkManagerConfigurationModule @@ -64,6 +63,7 @@ import org.oppia.android.testing.OppiaTestRule import org.oppia.android.testing.TestLogReportingModule import org.oppia.android.testing.firebase.TestAuthenticationModule import org.oppia.android.testing.junit.InitializeDefaultLocaleRule +import org.oppia.android.testing.platformparameter.TestPlatformParameterModule import org.oppia.android.testing.robolectric.RobolectricModule import org.oppia.android.testing.threading.TestCoroutineDispatchers import org.oppia.android.testing.threading.TestDispatcherModule @@ -192,7 +192,6 @@ class RatioExtensionsTest { NumberWithUnitsRuleModule::class, NumericExpressionInputModule::class, NumericInputRuleModule::class, - PlatformParameterModule::class, PlatformParameterSingletonModule::class, QuestionModule::class, RatioInputModule::class, @@ -204,6 +203,7 @@ class RatioExtensionsTest { TestAuthenticationModule::class, TestDispatcherModule::class, TestLogReportingModule::class, + TestPlatformParameterModule::class, TestingBuildFlavorModule::class, TextInputRuleModule::class, ViewBindingShimModule::class, 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 0c859963ca2..89b1188f087 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 @@ -70,7 +70,6 @@ import org.oppia.android.domain.oppialogger.analytics.ApplicationLifecycleModule import org.oppia.android.domain.oppialogger.analytics.CpuPerformanceSnapshotterModule 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 import org.oppia.android.domain.workmanager.WorkManagerConfigurationModule @@ -78,6 +77,7 @@ import org.oppia.android.testing.OppiaTestRule import org.oppia.android.testing.TestLogReportingModule import org.oppia.android.testing.firebase.TestAuthenticationModule import org.oppia.android.testing.junit.InitializeDefaultLocaleRule +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 @@ -276,7 +276,6 @@ class WalkthroughActivityTest { NumberWithUnitsRuleModule::class, NumericExpressionInputModule::class, NumericInputRuleModule::class, - PlatformParameterModule::class, PlatformParameterSingletonModule::class, QuestionModule::class, RatioInputModule::class, @@ -288,6 +287,7 @@ class WalkthroughActivityTest { TestAuthenticationModule::class, TestDispatcherModule::class, TestLogReportingModule::class, + TestPlatformParameterModule::class, TestingBuildFlavorModule::class, TextInputRuleModule::class, ViewBindingShimModule::class, diff --git a/app/src/sharedTest/java/org/oppia/android/app/walkthrough/end/WalkthroughFinalFragmentTest.kt b/app/src/sharedTest/java/org/oppia/android/app/walkthrough/end/WalkthroughFinalFragmentTest.kt index 6509e6aed3f..589781498de 100644 --- a/app/src/sharedTest/java/org/oppia/android/app/walkthrough/end/WalkthroughFinalFragmentTest.kt +++ b/app/src/sharedTest/java/org/oppia/android/app/walkthrough/end/WalkthroughFinalFragmentTest.kt @@ -76,7 +76,6 @@ import org.oppia.android.domain.oppialogger.analytics.ApplicationLifecycleModule import org.oppia.android.domain.oppialogger.analytics.CpuPerformanceSnapshotterModule 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 import org.oppia.android.domain.topic.FRACTIONS_TOPIC_ID @@ -85,6 +84,7 @@ import org.oppia.android.testing.OppiaTestRule import org.oppia.android.testing.TestLogReportingModule import org.oppia.android.testing.firebase.TestAuthenticationModule import org.oppia.android.testing.junit.InitializeDefaultLocaleRule +import org.oppia.android.testing.platformparameter.TestPlatformParameterModule import org.oppia.android.testing.robolectric.RobolectricModule import org.oppia.android.testing.threading.TestCoroutineDispatchers import org.oppia.android.testing.threading.TestDispatcherModule @@ -355,7 +355,6 @@ class WalkthroughFinalFragmentTest { NumberWithUnitsRuleModule::class, NumericExpressionInputModule::class, NumericInputRuleModule::class, - PlatformParameterModule::class, PlatformParameterSingletonModule::class, QuestionModule::class, RatioInputModule::class, @@ -367,6 +366,7 @@ class WalkthroughFinalFragmentTest { TestAuthenticationModule::class, TestDispatcherModule::class, TestLogReportingModule::class, + TestPlatformParameterModule::class, TestingBuildFlavorModule::class, TextInputRuleModule::class, ViewBindingShimModule::class, diff --git a/app/src/sharedTest/java/org/oppia/android/app/walkthrough/topiclist/WalkthroughTopicListFragmentTest.kt b/app/src/sharedTest/java/org/oppia/android/app/walkthrough/topiclist/WalkthroughTopicListFragmentTest.kt index cb0252806a4..f3a87cf2874 100644 --- a/app/src/sharedTest/java/org/oppia/android/app/walkthrough/topiclist/WalkthroughTopicListFragmentTest.kt +++ b/app/src/sharedTest/java/org/oppia/android/app/walkthrough/topiclist/WalkthroughTopicListFragmentTest.kt @@ -74,7 +74,6 @@ import org.oppia.android.domain.oppialogger.analytics.ApplicationLifecycleModule import org.oppia.android.domain.oppialogger.analytics.CpuPerformanceSnapshotterModule 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 import org.oppia.android.domain.workmanager.WorkManagerConfigurationModule @@ -85,6 +84,7 @@ import org.oppia.android.testing.environment.TestEnvironmentConfig import org.oppia.android.testing.espresso.GenericViewMatchers.Companion.withOpaqueBackground import org.oppia.android.testing.firebase.TestAuthenticationModule import org.oppia.android.testing.junit.InitializeDefaultLocaleRule +import org.oppia.android.testing.platformparameter.TestPlatformParameterModule import org.oppia.android.testing.robolectric.RobolectricModule import org.oppia.android.testing.threading.TestCoroutineDispatchers import org.oppia.android.testing.threading.TestDispatcherModule @@ -336,7 +336,6 @@ class WalkthroughTopicListFragmentTest { NumberWithUnitsRuleModule::class, NumericExpressionInputModule::class, NumericInputRuleModule::class, - PlatformParameterModule::class, PlatformParameterSingletonModule::class, QuestionModule::class, RatioInputModule::class, @@ -350,6 +349,7 @@ class WalkthroughTopicListFragmentTest { TestImageLoaderModule::class, TestLogReportingModule::class, TestModule::class, + TestPlatformParameterModule::class, TestingBuildFlavorModule::class, TextInputRuleModule::class, ViewBindingShimModule::class, diff --git a/app/src/sharedTest/java/org/oppia/android/app/walkthrough/welcome/WalkthroughWelcomeFragmentTest.kt b/app/src/sharedTest/java/org/oppia/android/app/walkthrough/welcome/WalkthroughWelcomeFragmentTest.kt index 2e579ee7aa4..d8837ffc8b9 100644 --- a/app/src/sharedTest/java/org/oppia/android/app/walkthrough/welcome/WalkthroughWelcomeFragmentTest.kt +++ b/app/src/sharedTest/java/org/oppia/android/app/walkthrough/welcome/WalkthroughWelcomeFragmentTest.kt @@ -68,7 +68,6 @@ import org.oppia.android.domain.oppialogger.analytics.ApplicationLifecycleModule import org.oppia.android.domain.oppialogger.analytics.CpuPerformanceSnapshotterModule 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 import org.oppia.android.domain.workmanager.WorkManagerConfigurationModule @@ -76,6 +75,7 @@ import org.oppia.android.testing.OppiaTestRule import org.oppia.android.testing.TestLogReportingModule import org.oppia.android.testing.firebase.TestAuthenticationModule import org.oppia.android.testing.junit.InitializeDefaultLocaleRule +import org.oppia.android.testing.platformparameter.TestPlatformParameterModule import org.oppia.android.testing.profile.ProfileTestHelper import org.oppia.android.testing.robolectric.RobolectricModule import org.oppia.android.testing.threading.TestCoroutineDispatchers @@ -244,7 +244,6 @@ class WalkthroughWelcomeFragmentTest { NumberWithUnitsRuleModule::class, NumericExpressionInputModule::class, NumericInputRuleModule::class, - PlatformParameterModule::class, PlatformParameterSingletonModule::class, QuestionModule::class, RatioInputModule::class, @@ -256,6 +255,7 @@ class WalkthroughWelcomeFragmentTest { TestAuthenticationModule::class, TestDispatcherModule::class, TestLogReportingModule::class, + TestPlatformParameterModule::class, TestingBuildFlavorModule::class, TextInputRuleModule::class, ViewBindingShimModule::class, 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 78eed7feb33..c79c79eb6dc 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 @@ -60,13 +60,13 @@ import org.oppia.android.domain.oppialogger.analytics.ApplicationLifecycleModule import org.oppia.android.domain.oppialogger.analytics.CpuPerformanceSnapshotterModule 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 import org.oppia.android.domain.workmanager.WorkManagerConfigurationModule import org.oppia.android.testing.TestLogReportingModule import org.oppia.android.testing.firebase.TestAuthenticationModule import org.oppia.android.testing.junit.InitializeDefaultLocaleRule +import org.oppia.android.testing.platformparameter.TestPlatformParameterModule import org.oppia.android.testing.robolectric.RobolectricModule import org.oppia.android.testing.threading.TestCoroutineDispatchers import org.oppia.android.testing.threading.TestDispatcherModule @@ -228,7 +228,7 @@ class ActivityIntentFactoriesTest { NumberWithUnitsRuleModule::class, NumericExpressionInputModule::class, NumericInputRuleModule::class, - PlatformParameterModule::class, + TestPlatformParameterModule::class, PlatformParameterSingletonModule::class, QuestionModule::class, RatioInputModule::class, diff --git a/app/src/test/java/org/oppia/android/app/activity/BUILD.bazel b/app/src/test/java/org/oppia/android/app/activity/BUILD.bazel index 9c2f2586933..0030324728d 100644 --- a/app/src/test/java/org/oppia/android/app/activity/BUILD.bazel +++ b/app/src/test/java/org/oppia/android/app/activity/BUILD.bazel @@ -25,6 +25,7 @@ oppia_android_test( "//domain/src/main/java/org/oppia/android/domain/onboarding/testing:retriever_test_module", "//testing", "//testing/src/main/java/org/oppia/android/testing/junit:initialize_default_locale_rule", + "//testing/src/main/java/org/oppia/android/testing/platformparameter:test_module", "//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", diff --git a/app/src/test/java/org/oppia/android/app/activity/route/ActivityRouterTest.kt b/app/src/test/java/org/oppia/android/app/activity/route/ActivityRouterTest.kt index b18c520c6cd..278467c09d6 100644 --- a/app/src/test/java/org/oppia/android/app/activity/route/ActivityRouterTest.kt +++ b/app/src/test/java/org/oppia/android/app/activity/route/ActivityRouterTest.kt @@ -67,13 +67,13 @@ import org.oppia.android.domain.oppialogger.analytics.ApplicationLifecycleModule import org.oppia.android.domain.oppialogger.analytics.CpuPerformanceSnapshotterModule 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 import org.oppia.android.domain.workmanager.WorkManagerConfigurationModule import org.oppia.android.testing.TestLogReportingModule import org.oppia.android.testing.firebase.TestAuthenticationModule import org.oppia.android.testing.junit.InitializeDefaultLocaleRule +import org.oppia.android.testing.platformparameter.TestPlatformParameterModule import org.oppia.android.testing.robolectric.RobolectricModule import org.oppia.android.testing.threading.TestCoroutineDispatchers import org.oppia.android.testing.threading.TestDispatcherModule @@ -223,7 +223,7 @@ class ActivityRouterTest { NumberWithUnitsRuleModule::class, NumericExpressionInputModule::class, NumericInputRuleModule::class, - PlatformParameterModule::class, + TestPlatformParameterModule::class, PlatformParameterSingletonModule::class, QuestionModule::class, RatioInputModule::class, diff --git a/app/src/test/java/org/oppia/android/app/activity/route/BUILD.bazel b/app/src/test/java/org/oppia/android/app/activity/route/BUILD.bazel index e44430238fc..d1ea1881fee 100644 --- a/app/src/test/java/org/oppia/android/app/activity/route/BUILD.bazel +++ b/app/src/test/java/org/oppia/android/app/activity/route/BUILD.bazel @@ -27,6 +27,7 @@ oppia_android_test( "//model/src/main/proto:arguments_java_proto_lite", "//testing", "//testing/src/main/java/org/oppia/android/testing/junit:initialize_default_locale_rule", + "//testing/src/main/java/org/oppia/android/testing/platformparameter:test_module", "//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", diff --git a/app/src/test/java/org/oppia/android/app/administratorcontrols/AdministratorControlsFragmentTest.kt b/app/src/test/java/org/oppia/android/app/administratorcontrols/AdministratorControlsFragmentTest.kt index ad34f5f929d..2f88e83c04e 100644 --- a/app/src/test/java/org/oppia/android/app/administratorcontrols/AdministratorControlsFragmentTest.kt +++ b/app/src/test/java/org/oppia/android/app/administratorcontrols/AdministratorControlsFragmentTest.kt @@ -66,13 +66,13 @@ import org.oppia.android.domain.oppialogger.analytics.ApplicationLifecycleModule import org.oppia.android.domain.oppialogger.analytics.CpuPerformanceSnapshotterModule 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 import org.oppia.android.domain.workmanager.WorkManagerConfigurationModule import org.oppia.android.testing.TestLogReportingModule import org.oppia.android.testing.firebase.TestAuthenticationModule import org.oppia.android.testing.junit.InitializeDefaultLocaleRule +import org.oppia.android.testing.platformparameter.TestPlatformParameterModule import org.oppia.android.testing.robolectric.RobolectricModule import org.oppia.android.testing.threading.TestCoroutineDispatchers import org.oppia.android.testing.threading.TestDispatcherModule @@ -225,7 +225,7 @@ class AdministratorControlsFragmentTest { NumberWithUnitsRuleModule::class, NumericExpressionInputModule::class, NumericInputRuleModule::class, - PlatformParameterModule::class, + TestPlatformParameterModule::class, PlatformParameterSingletonModule::class, QuestionModule::class, RatioInputModule::class, 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 e06abd6beaa..3d81a2aa9aa 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 @@ -217,6 +217,7 @@ class HomeActivityLocalTest { testComponent.getProfileTestHelper().markProfileOnboardingEnded(profileId) testComponent.getAppStartupStateController().markOnboardingFlowCompleted() testComponent.getTestCoroutineDispatchers().runCurrent() + TestPlatformParameterModule.reset() } setUpTestWithOnboardingV2Enabled(false) @@ -236,6 +237,7 @@ class HomeActivityLocalTest { executeInPreviousAppInstance { testComponent -> testComponent.getAppStartupStateController().markOnboardingFlowCompleted() testComponent.getTestCoroutineDispatchers().runCurrent() + TestPlatformParameterModule.reset() } setUpTestWithOnboardingV2Enabled(false) @@ -270,6 +272,7 @@ class HomeActivityLocalTest { testComponent.getAppStartupStateController().markOnboardingFlowCompleted() testComponent.getProfileTestHelper().markProfileOnboardingEnded(profileId) testComponent.getTestCoroutineDispatchers().runCurrent() + TestPlatformParameterModule.reset() } setUpTestWithOnboardingV2Enabled(true) diff --git a/app/src/test/java/org/oppia/android/app/options/OptionsFragmentTest.kt b/app/src/test/java/org/oppia/android/app/options/OptionsFragmentTest.kt index dd72fc40dd6..30a42941786 100644 --- a/app/src/test/java/org/oppia/android/app/options/OptionsFragmentTest.kt +++ b/app/src/test/java/org/oppia/android/app/options/OptionsFragmentTest.kt @@ -119,6 +119,7 @@ class OptionsFragmentTest { @After fun tearDown() { + TestPlatformParameterModule.reset() testCoroutineDispatchers.unregisterIdlingResource() } 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 ce041391c56..da342a61488 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 @@ -55,13 +55,13 @@ import org.oppia.android.domain.oppialogger.analytics.ApplicationLifecycleModule import org.oppia.android.domain.oppialogger.analytics.CpuPerformanceSnapshotterModule 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 import org.oppia.android.domain.workmanager.WorkManagerConfigurationModule import org.oppia.android.testing.TestLogReportingModule import org.oppia.android.testing.firebase.TestAuthenticationModule import org.oppia.android.testing.junit.InitializeDefaultLocaleRule +import org.oppia.android.testing.platformparameter.TestPlatformParameterModule import org.oppia.android.testing.robolectric.RobolectricModule import org.oppia.android.testing.threading.TestCoroutineDispatchers import org.oppia.android.testing.threading.TestDispatcherModule @@ -320,7 +320,6 @@ class FractionParsingUiErrorTest { NumberWithUnitsRuleModule::class, NumericExpressionInputModule::class, NumericInputRuleModule::class, - PlatformParameterModule::class, PlatformParameterSingletonModule::class, QuestionModule::class, RatioInputModule::class, @@ -332,6 +331,7 @@ class FractionParsingUiErrorTest { TestAuthenticationModule::class, TestDispatcherModule::class, TestLogReportingModule::class, + TestPlatformParameterModule::class, TestingBuildFlavorModule::class, TextInputRuleModule::class, ViewBindingShimModule::class, 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 108776cd44e..bb15da74414 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 @@ -56,7 +56,6 @@ import org.oppia.android.domain.oppialogger.analytics.ApplicationLifecycleModule import org.oppia.android.domain.oppialogger.analytics.CpuPerformanceSnapshotterModule 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 import org.oppia.android.domain.workmanager.WorkManagerConfigurationModule @@ -64,6 +63,7 @@ import org.oppia.android.testing.TestLogReportingModule import org.oppia.android.testing.assertThrows import org.oppia.android.testing.firebase.TestAuthenticationModule import org.oppia.android.testing.junit.InitializeDefaultLocaleRule +import org.oppia.android.testing.platformparameter.TestPlatformParameterModule import org.oppia.android.testing.robolectric.RobolectricModule import org.oppia.android.testing.threading.TestCoroutineDispatchers import org.oppia.android.testing.threading.TestDispatcherModule @@ -322,7 +322,7 @@ class StringToRatioParserTest { NumberWithUnitsRuleModule::class, NumericExpressionInputModule::class, NumericInputRuleModule::class, - PlatformParameterModule::class, + TestPlatformParameterModule::class, PlatformParameterSingletonModule::class, QuestionModule::class, RatioInputModule::class, 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 ed1b2e77af5..cfbf0317175 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 @@ -141,6 +141,7 @@ class ExplorationActivityLocalTest { @After fun tearDown() { + TestPlatformParameterModule.reset() testCoroutineDispatchers.unregisterIdlingResource() } 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 3fd51fdcc96..dacd33e740b 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 @@ -56,7 +56,6 @@ import org.oppia.android.domain.oppialogger.analytics.ApplicationLifecycleModule import org.oppia.android.domain.oppialogger.analytics.CpuPerformanceSnapshotterModule 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 import org.oppia.android.domain.workmanager.WorkManagerConfigurationModule @@ -64,6 +63,7 @@ import org.oppia.android.testing.FakeAnalyticsEventLogger import org.oppia.android.testing.TestLogReportingModule import org.oppia.android.testing.firebase.TestAuthenticationModule import org.oppia.android.testing.junit.InitializeDefaultLocaleRule +import org.oppia.android.testing.platformparameter.TestPlatformParameterModule import org.oppia.android.testing.robolectric.RobolectricModule import org.oppia.android.testing.threading.TestCoroutineDispatchers import org.oppia.android.testing.threading.TestDispatcherModule @@ -170,7 +170,6 @@ class ProfileChooserFragmentLocalTest { NumberWithUnitsRuleModule::class, NumericExpressionInputModule::class, NumericInputRuleModule::class, - PlatformParameterModule::class, PlatformParameterSingletonModule::class, QuestionModule::class, RatioInputModule::class, @@ -182,6 +181,7 @@ class ProfileChooserFragmentLocalTest { TestAuthenticationModule::class, TestDispatcherModule::class, TestLogReportingModule::class, + TestPlatformParameterModule::class, TestingBuildFlavorModule::class, TextInputRuleModule::class, ViewBindingShimModule::class, 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 eabe4e6d5d3..aff631b9047 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 @@ -58,7 +58,6 @@ import org.oppia.android.domain.oppialogger.analytics.ApplicationLifecycleModule import org.oppia.android.domain.oppialogger.analytics.CpuPerformanceSnapshotterModule 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 import org.oppia.android.domain.workmanager.WorkManagerConfigurationModule @@ -66,6 +65,7 @@ import org.oppia.android.testing.FakeAnalyticsEventLogger import org.oppia.android.testing.TestLogReportingModule import org.oppia.android.testing.firebase.TestAuthenticationModule import org.oppia.android.testing.junit.InitializeDefaultLocaleRule +import org.oppia.android.testing.platformparameter.TestPlatformParameterModule import org.oppia.android.testing.robolectric.RobolectricModule import org.oppia.android.testing.threading.TestCoroutineDispatchers import org.oppia.android.testing.threading.TestDispatcherModule @@ -198,7 +198,6 @@ class StoryActivityLocalTest { NumberWithUnitsRuleModule::class, NumericExpressionInputModule::class, NumericInputRuleModule::class, - PlatformParameterModule::class, PlatformParameterSingletonModule::class, QuestionModule::class, RatioInputModule::class, @@ -210,6 +209,7 @@ class StoryActivityLocalTest { TestAuthenticationModule::class, TestDispatcherModule::class, TestLogReportingModule::class, + TestPlatformParameterModule::class, TestingBuildFlavorModule::class, TextInputRuleModule::class, ViewBindingShimModule::class, 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 d958ce2bd9c..d1bba286b78 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 @@ -60,13 +60,13 @@ import org.oppia.android.domain.oppialogger.analytics.ApplicationLifecycleModule import org.oppia.android.domain.oppialogger.analytics.CpuPerformanceSnapshotterModule 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 import org.oppia.android.domain.workmanager.WorkManagerConfigurationModule import org.oppia.android.testing.TestLogReportingModule import org.oppia.android.testing.firebase.TestAuthenticationModule import org.oppia.android.testing.junit.InitializeDefaultLocaleRule +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 @@ -203,7 +203,6 @@ class CompletedStoryListSpanTest { NumberWithUnitsRuleModule::class, NumericExpressionInputModule::class, NumericInputRuleModule::class, - PlatformParameterModule::class, PlatformParameterSingletonModule::class, QuestionModule::class, RatioInputModule::class, @@ -215,6 +214,7 @@ class CompletedStoryListSpanTest { TestAuthenticationModule::class, TestDispatcherModule::class, TestLogReportingModule::class, + TestPlatformParameterModule::class, TestingBuildFlavorModule::class, TextInputRuleModule::class, ViewBindingShimModule::class, 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 7844013ec40..e306aaea43e 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 @@ -61,13 +61,13 @@ import org.oppia.android.domain.oppialogger.analytics.ApplicationLifecycleModule import org.oppia.android.domain.oppialogger.analytics.CpuPerformanceSnapshotterModule 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 import org.oppia.android.domain.workmanager.WorkManagerConfigurationModule import org.oppia.android.testing.TestLogReportingModule import org.oppia.android.testing.firebase.TestAuthenticationModule import org.oppia.android.testing.junit.InitializeDefaultLocaleRule +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 @@ -219,7 +219,6 @@ class HomeSpanTest { NumberWithUnitsRuleModule::class, NumericExpressionInputModule::class, NumericInputRuleModule::class, - PlatformParameterModule::class, PlatformParameterSingletonModule::class, QuestionModule::class, RatioInputModule::class, @@ -231,6 +230,7 @@ class HomeSpanTest { TestAuthenticationModule::class, TestDispatcherModule::class, TestLogReportingModule::class, + TestPlatformParameterModule::class, TestingBuildFlavorModule::class, TextInputRuleModule::class, ViewBindingShimModule::class, 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 f70574375da..76eed12b19a 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 @@ -61,13 +61,13 @@ import org.oppia.android.domain.oppialogger.analytics.ApplicationLifecycleModule import org.oppia.android.domain.oppialogger.analytics.CpuPerformanceSnapshotterModule 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 import org.oppia.android.domain.workmanager.WorkManagerConfigurationModule import org.oppia.android.testing.TestLogReportingModule import org.oppia.android.testing.firebase.TestAuthenticationModule import org.oppia.android.testing.junit.InitializeDefaultLocaleRule +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 @@ -214,7 +214,6 @@ class OngoingTopicListSpanTest { NumberWithUnitsRuleModule::class, NumericExpressionInputModule::class, NumericInputRuleModule::class, - PlatformParameterModule::class, PlatformParameterSingletonModule::class, QuestionModule::class, RatioInputModule::class, @@ -226,6 +225,7 @@ class OngoingTopicListSpanTest { TestAuthenticationModule::class, TestDispatcherModule::class, TestLogReportingModule::class, + TestPlatformParameterModule::class, TestingBuildFlavorModule::class, TextInputRuleModule::class, ViewBindingShimModule::class, 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 6c0fc6970a3..e6646e60f03 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 @@ -7,10 +7,6 @@ import androidx.test.core.app.ActivityScenario.launch import androidx.test.core.app.ApplicationProvider import androidx.test.ext.junit.runners.AndroidJUnit4 import androidx.work.Configuration -import androidx.work.Data -import androidx.work.OneTimeWorkRequestBuilder -import androidx.work.WorkInfo -import androidx.work.WorkManager import androidx.work.impl.utils.SynchronousExecutor import androidx.work.testing.WorkManagerTestInitHelper import com.google.common.truth.Truth.assertThat @@ -31,7 +27,6 @@ import org.oppia.android.app.application.ApplicationStartupListenerModule import org.oppia.android.app.application.testing.TestingBuildFlavorModule import org.oppia.android.app.devoptions.DeveloperOptionsModule import org.oppia.android.app.devoptions.DeveloperOptionsStarterModule -import org.oppia.android.app.model.PlatformParameter import org.oppia.android.app.player.state.itemviewmodel.SplitScreenInteractionModule import org.oppia.android.app.shim.ViewBindingShimModule import org.oppia.android.app.testing.activity.TestActivity @@ -39,8 +34,6 @@ import org.oppia.android.app.translation.testing.ActivityRecreatorTestModule import org.oppia.android.data.backends.gae.RetrofitModule import org.oppia.android.data.backends.gae.RetrofitServiceModule import org.oppia.android.data.backends.gae.testing.NetworkConfigTestModule -import org.oppia.android.data.backends.gae.testing.PlatformParameterServiceTestOrchestrator -import org.oppia.android.data.backends.gae.testing.PlatformParameterServiceTestOrchestrator.Companion.REMOTE_PLATFORM_PARAMETERS_WITH_UNSUPPORTED_TYPE import org.oppia.android.domain.classify.InteractionsModule import org.oppia.android.domain.classify.rules.algebraicexpressioninput.AlgebraicExpressionInputModule import org.oppia.android.domain.classify.rules.continueinteraction.ContinueModule @@ -66,16 +59,14 @@ import org.oppia.android.domain.oppialogger.analytics.ApplicationLifecycleModule import org.oppia.android.domain.oppialogger.analytics.CpuPerformanceSnapshotterModule 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 -import org.oppia.android.domain.platformparameter.syncup.PlatformParameterSyncUpWorker import org.oppia.android.domain.platformparameter.syncup.PlatformParameterSyncUpWorkerFactory import org.oppia.android.domain.question.QuestionModule import org.oppia.android.domain.workmanager.WorkManagerConfigurationModule import org.oppia.android.testing.TestLogReportingModule import org.oppia.android.testing.firebase.TestAuthenticationModule import org.oppia.android.testing.junit.InitializeDefaultLocaleRule +import org.oppia.android.testing.platformparameter.TestPlatformParameterModule import org.oppia.android.testing.robolectric.RobolectricModule import org.oppia.android.testing.threading.TestCoroutineDispatchers import org.oppia.android.testing.threading.TestDispatcherModule @@ -93,13 +84,9 @@ import org.oppia.android.util.networking.NetworkConnectionUtilDebugModule import org.oppia.android.util.parser.html.HtmlParserEntityTypeModule import org.oppia.android.util.parser.image.GlideImageLoaderModule import org.oppia.android.util.parser.image.ImageParsingModule -import org.oppia.android.util.platformparameter.SPLASH_SCREEN_WELCOME_MSG -import org.oppia.android.util.platformparameter.SPLASH_SCREEN_WELCOME_MSG_DEFAULT_VALUE -import org.oppia.android.util.platformparameter.SPLASH_SCREEN_WELCOME_MSG_SERVER_VALUE import org.robolectric.annotation.Config import org.robolectric.annotation.LooperMode import org.robolectric.shadows.ShadowToast -import java.util.UUID import javax.inject.Inject import javax.inject.Singleton @@ -112,27 +99,7 @@ class PlatformParameterIntegrationTest { @Inject lateinit var context: Context @Inject lateinit var testCoroutineDispatchers: TestCoroutineDispatchers - @Inject lateinit var platformParameterController: PlatformParameterController @Inject lateinit var platformParameterSyncUpWorkerFactory: PlatformParameterSyncUpWorkerFactory - @Inject lateinit var serviceOrchestrator: PlatformParameterServiceTestOrchestrator - - private val mockPlatformParameterListWithToastEnabled by lazy { - val mockSplashScreenWelcomeMsgParam = PlatformParameter.newBuilder() - .setName(SPLASH_SCREEN_WELCOME_MSG) - .setBoolean(SPLASH_SCREEN_WELCOME_MSG_SERVER_VALUE) - .build() - - listOf(mockSplashScreenWelcomeMsgParam) - } - - private val mockPlatformParameterListWithToastDisabled by lazy { - val mockSplashScreenWelcomeMsgParam = PlatformParameter.newBuilder() - .setName(SPLASH_SCREEN_WELCOME_MSG) - .setBoolean(SPLASH_SCREEN_WELCOME_MSG_DEFAULT_VALUE) - .build() - - listOf(mockSplashScreenWelcomeMsgParam) - } @Before fun setUp() { @@ -146,6 +113,8 @@ class PlatformParameterIntegrationTest { TestActivity.registerWithPackageManager(context) } + // TODO(#5835): Finish implementing this test suite. + @After fun tearDown() { testCoroutineDispatchers.unregisterIdlingResource() @@ -165,106 +134,6 @@ class PlatformParameterIntegrationTest { } } - @Test - fun testIntegration_updateEmptyDatabase_readDatabase_checkWelcomeMsgIsVisible() { - platformParameterController.updatePlatformParameterDatabase( - mockPlatformParameterListWithToastEnabled - ) - testCoroutineDispatchers.runCurrent() - - launch(SplashTestActivity::class.java).use { scenario -> - // Fetch the latest platform parameter from cache store after execution of work request to - // imitate the loading process at the start of splash test activity. - scenario.onActivity { activity -> - activity.splashTestActivityPresenter.loadPlatformParameters() - } - testCoroutineDispatchers.runCurrent() - - assertThat(ShadowToast.getLatestToast()).isNotNull() - assertThat(ShadowToast.getTextOfLatestToast()).isEqualTo(SplashTestActivity.WELCOME_MSG) - } - } - - @Test - fun testIntegration_executeSyncUpWorkerCorrectly_readDatabase_checkWelcomeMsgIsVisible() { - serviceOrchestrator.setNextResponseAsSuccess( - parameterValues = mapOf(SPLASH_SCREEN_WELCOME_MSG to SPLASH_SCREEN_WELCOME_MSG_SERVER_VALUE) - ) - - launch(SplashTestActivity::class.java).use { scenario -> - // Set up versionName to get correct network response from mock platform parameter service. - platformParameterController.updatePlatformParameterDatabase( - mockPlatformParameterListWithToastDisabled - ) - - val workManager = WorkManager.getInstance(context) - val requestId = setUpAndEnqueueSyncUpWorkerRequest(workManager) - testCoroutineDispatchers.runCurrent() - - val workInfo = workManager.getWorkInfoById(requestId) - // Check the work request succeeded which means the local database was updated with new values. - assertThat(workInfo.get().state).isEqualTo(WorkInfo.State.SUCCEEDED) - - // Fetch the latest platform parameter from cache store after execution of work request to - // imitate the loading process at the start of splash test activity. - scenario.onActivity { activity -> - activity.splashTestActivityPresenter.loadPlatformParameters() - } - testCoroutineDispatchers.runCurrent() - - // As the local database was updated correctly the app will use the server values, and the - // server value for the splash screen welcome msg param is true. - assertThat(ShadowToast.getLatestToast()).isNotNull() - assertThat(ShadowToast.getTextOfLatestToast()).isEqualTo(SplashTestActivity.WELCOME_MSG) - } - } - - @Test - fun testIntegration_executeSyncUpWorkerIncorrectly_readDatabase_checkWelcomeMsgIsInvisible() { - serviceOrchestrator.setNextResponseAsSuccess(REMOTE_PLATFORM_PARAMETERS_WITH_UNSUPPORTED_TYPE) - - launch(SplashTestActivity::class.java).use { scenario -> - platformParameterController.updatePlatformParameterDatabase( - mockPlatformParameterListWithToastDisabled - ) - - val workManager = WorkManager.getInstance(context) - val requestId = setUpAndEnqueueSyncUpWorkerRequest(workManager) - testCoroutineDispatchers.runCurrent() - - val workInfo = workManager.getWorkInfoById(requestId) - // Check the work request fails because of incorrect network response. This means that the - // local database is not updated with new values. - assertThat(workInfo.get().state).isEqualTo(WorkInfo.State.FAILED) - - // Fetch the latest platform parameter from cache store after execution of work request to - // imitate the loading process at the start of splash test activity. - scenario.onActivity { activity -> - activity.splashTestActivityPresenter.loadPlatformParameters() - } - testCoroutineDispatchers.runCurrent() - - // As the local database was not updated due to work request failure the app will use default - // values, and the default value for the splash screen welcome msg param is false. - assertThat(ShadowToast.getLatestToast()).isNull() - } - } - - private fun setUpAndEnqueueSyncUpWorkerRequest(workManager: WorkManager): UUID { - val inputData = Data.Builder().putString( - PlatformParameterSyncUpWorker.WORKER_TYPE_KEY, - PlatformParameterSyncUpWorker.PLATFORM_PARAMETER_WORKER - ).build() - - val request = OneTimeWorkRequestBuilder() - .setInputData(inputData) - .build() - - // Enqueue the work request to fetch and cache the platform parameters from backend service. - workManager.enqueue(request) - return request.id - } - private fun setUpTestApplicationComponent() { ApplicationProvider.getApplicationContext().inject(this) } @@ -316,7 +185,6 @@ class PlatformParameterIntegrationTest { NumberWithUnitsRuleModule::class, NumericExpressionInputModule::class, NumericInputRuleModule::class, - PlatformParameterModule::class, PlatformParameterSingletonModule::class, QuestionModule::class, RatioInputModule::class, @@ -328,6 +196,7 @@ class PlatformParameterIntegrationTest { TestAuthenticationModule::class, TestDispatcherModule::class, TestLogReportingModule::class, + TestPlatformParameterModule::class, TestingBuildFlavorModule::class, TextInputRuleModule::class, ViewBindingShimModule::class, 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 fe2e14ae646..d4f88045ebe 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 @@ -59,13 +59,13 @@ import org.oppia.android.domain.oppialogger.analytics.ApplicationLifecycleModule import org.oppia.android.domain.oppialogger.analytics.CpuPerformanceSnapshotterModule 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 import org.oppia.android.domain.workmanager.WorkManagerConfigurationModule import org.oppia.android.testing.TestLogReportingModule import org.oppia.android.testing.firebase.TestAuthenticationModule import org.oppia.android.testing.junit.InitializeDefaultLocaleRule +import org.oppia.android.testing.platformparameter.TestPlatformParameterModule import org.oppia.android.testing.robolectric.RobolectricModule import org.oppia.android.testing.threading.TestCoroutineDispatchers import org.oppia.android.testing.threading.TestDispatcherModule @@ -416,7 +416,6 @@ class ProfileChooserSpanTest { NumberWithUnitsRuleModule::class, NumericExpressionInputModule::class, NumericInputRuleModule::class, - PlatformParameterModule::class, PlatformParameterSingletonModule::class, QuestionModule::class, RatioInputModule::class, @@ -428,6 +427,7 @@ class ProfileChooserSpanTest { TestAuthenticationModule::class, TestDispatcherModule::class, TestLogReportingModule::class, + TestPlatformParameterModule::class, TestingBuildFlavorModule::class, TextInputRuleModule::class, ViewBindingShimModule::class, 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 10ca38518fe..4aac2a2ea12 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 @@ -60,13 +60,13 @@ import org.oppia.android.domain.oppialogger.analytics.ApplicationLifecycleModule import org.oppia.android.domain.oppialogger.analytics.CpuPerformanceSnapshotterModule 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 import org.oppia.android.domain.workmanager.WorkManagerConfigurationModule import org.oppia.android.testing.TestLogReportingModule import org.oppia.android.testing.firebase.TestAuthenticationModule import org.oppia.android.testing.junit.InitializeDefaultLocaleRule +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 @@ -200,7 +200,6 @@ class ProfileProgressSpanCountTest { NumberWithUnitsRuleModule::class, NumericExpressionInputModule::class, NumericInputRuleModule::class, - PlatformParameterModule::class, PlatformParameterSingletonModule::class, QuestionModule::class, RatioInputModule::class, @@ -212,6 +211,7 @@ class ProfileProgressSpanCountTest { TestAuthenticationModule::class, TestDispatcherModule::class, TestLogReportingModule::class, + TestPlatformParameterModule::class, TestingBuildFlavorModule::class, TextInputRuleModule::class, ViewBindingShimModule::class, 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 e5810609046..3e506917cc2 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 @@ -63,13 +63,13 @@ import org.oppia.android.domain.oppialogger.analytics.ApplicationLifecycleModule import org.oppia.android.domain.oppialogger.analytics.CpuPerformanceSnapshotterModule 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 import org.oppia.android.domain.workmanager.WorkManagerConfigurationModule import org.oppia.android.testing.TestLogReportingModule import org.oppia.android.testing.firebase.TestAuthenticationModule import org.oppia.android.testing.junit.InitializeDefaultLocaleRule +import org.oppia.android.testing.platformparameter.TestPlatformParameterModule import org.oppia.android.testing.robolectric.RobolectricModule import org.oppia.android.testing.story.StoryProgressTestHelper import org.oppia.android.testing.threading.TestCoroutineDispatchers @@ -341,7 +341,6 @@ class RecentlyPlayedSpanTest { NumberWithUnitsRuleModule::class, NumericExpressionInputModule::class, NumericInputRuleModule::class, - PlatformParameterModule::class, PlatformParameterSingletonModule::class, QuestionModule::class, RatioInputModule::class, @@ -353,6 +352,7 @@ class RecentlyPlayedSpanTest { TestAuthenticationModule::class, TestDispatcherModule::class, TestLogReportingModule::class, + TestPlatformParameterModule::class, TestingBuildFlavorModule::class, TextInputRuleModule::class, ViewBindingShimModule::class, 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 832062ccfa4..6db759defbf 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 @@ -59,13 +59,13 @@ import org.oppia.android.domain.oppialogger.analytics.ApplicationLifecycleModule import org.oppia.android.domain.oppialogger.analytics.CpuPerformanceSnapshotterModule 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 import org.oppia.android.domain.workmanager.WorkManagerConfigurationModule import org.oppia.android.testing.TestLogReportingModule import org.oppia.android.testing.firebase.TestAuthenticationModule import org.oppia.android.testing.junit.InitializeDefaultLocaleRule +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 @@ -200,7 +200,6 @@ class TopicRevisionSpanTest { NumberWithUnitsRuleModule::class, NumericExpressionInputModule::class, NumericInputRuleModule::class, - PlatformParameterModule::class, PlatformParameterSingletonModule::class, QuestionModule::class, RatioInputModule::class, @@ -212,6 +211,7 @@ class TopicRevisionSpanTest { TestAuthenticationModule::class, TestDispatcherModule::class, TestLogReportingModule::class, + TestPlatformParameterModule::class, TestingBuildFlavorModule::class, TextInputRuleModule::class, ViewBindingShimModule::class, diff --git a/app/src/test/java/org/oppia/android/app/testing/activity/BUILD.bazel b/app/src/test/java/org/oppia/android/app/testing/activity/BUILD.bazel index 4adaac2d311..e2131c7ddf2 100644 --- a/app/src/test/java/org/oppia/android/app/testing/activity/BUILD.bazel +++ b/app/src/test/java/org/oppia/android/app/testing/activity/BUILD.bazel @@ -24,6 +24,7 @@ oppia_android_test( "//domain/src/main/java/org/oppia/android/domain/onboarding/testing:retriever_test_module", "//testing", "//testing/src/main/java/org/oppia/android/testing/junit:initialize_default_locale_rule", + "//testing/src/main/java/org/oppia/android/testing/platformparameter:test_module", "//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", 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 4a662318fc5..08dea89e0cc 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 @@ -58,7 +58,6 @@ import org.oppia.android.domain.oppialogger.analytics.ApplicationLifecycleModule import org.oppia.android.domain.oppialogger.analytics.CpuPerformanceSnapshotterModule 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 import org.oppia.android.domain.workmanager.WorkManagerConfigurationModule @@ -66,6 +65,7 @@ import org.oppia.android.testing.TestLogReportingModule import org.oppia.android.testing.assertThrows import org.oppia.android.testing.firebase.TestAuthenticationModule import org.oppia.android.testing.junit.InitializeDefaultLocaleRule +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 @@ -278,7 +278,6 @@ class TestActivityTest { NumberWithUnitsRuleModule::class, NumericExpressionInputModule::class, NumericInputRuleModule::class, - PlatformParameterModule::class, PlatformParameterSingletonModule::class, QuestionModule::class, RatioInputModule::class, @@ -290,6 +289,7 @@ class TestActivityTest { TestAuthenticationModule::class, TestDispatcherModule::class, TestLogReportingModule::class, + TestPlatformParameterModule::class, TestingBuildFlavorModule::class, TextInputRuleModule::class, ViewBindingShimModule::class, 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 3a4e7c9d45e..c85e4b6d63c 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 @@ -57,13 +57,13 @@ import org.oppia.android.domain.oppialogger.analytics.ApplicationLifecycleModule import org.oppia.android.domain.oppialogger.analytics.CpuPerformanceSnapshotterModule 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 import org.oppia.android.domain.workmanager.WorkManagerConfigurationModule import org.oppia.android.testing.TestLogReportingModule import org.oppia.android.testing.firebase.TestAuthenticationModule import org.oppia.android.testing.junit.InitializeDefaultLocaleRule +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 @@ -233,7 +233,6 @@ class PlayerSplitScreenTest { NumberWithUnitsRuleModule::class, NumericExpressionInputModule::class, NumericInputRuleModule::class, - PlatformParameterModule::class, PlatformParameterSingletonModule::class, QuestionModule::class, RatioInputModule::class, @@ -245,6 +244,7 @@ class PlayerSplitScreenTest { TestAuthenticationModule::class, TestDispatcherModule::class, TestLogReportingModule::class, + TestPlatformParameterModule::class, TestingBuildFlavorModule::class, TextInputRuleModule::class, ViewBindingShimModule::class, 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 a3e7b42f2aa..e21a2cf2f2d 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 @@ -64,7 +64,6 @@ import org.oppia.android.domain.oppialogger.analytics.ApplicationLifecycleModule import org.oppia.android.domain.oppialogger.analytics.CpuPerformanceSnapshotterModule 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 import org.oppia.android.domain.topic.TEST_EXPLORATION_ID_4 @@ -74,6 +73,7 @@ import org.oppia.android.domain.workmanager.WorkManagerConfigurationModule import org.oppia.android.testing.TestLogReportingModule import org.oppia.android.testing.firebase.TestAuthenticationModule import org.oppia.android.testing.junit.InitializeDefaultLocaleRule +import org.oppia.android.testing.platformparameter.TestPlatformParameterModule import org.oppia.android.testing.profile.ProfileTestHelper import org.oppia.android.testing.robolectric.RobolectricModule import org.oppia.android.testing.threading.TestCoroutineDispatchers @@ -242,7 +242,6 @@ class StateFragmentAccessibilityTest { NumberWithUnitsRuleModule::class, NumericExpressionInputModule::class, NumericInputRuleModule::class, - PlatformParameterModule::class, PlatformParameterSingletonModule::class, QuestionModule::class, RatioInputModule::class, @@ -254,6 +253,7 @@ class StateFragmentAccessibilityTest { TestAuthenticationModule::class, TestDispatcherModule::class, TestLogReportingModule::class, + TestPlatformParameterModule::class, TestingBuildFlavorModule::class, TextInputRuleModule::class, ViewBindingShimModule::class, 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 623c1bfd8c1..6ba37c78d80 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 @@ -56,7 +56,6 @@ import org.oppia.android.domain.oppialogger.analytics.ApplicationLifecycleModule import org.oppia.android.domain.oppialogger.analytics.CpuPerformanceSnapshotterModule 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 import org.oppia.android.domain.workmanager.WorkManagerConfigurationModule @@ -64,6 +63,7 @@ import org.oppia.android.testing.FakeAnalyticsEventLogger import org.oppia.android.testing.TestLogReportingModule import org.oppia.android.testing.firebase.TestAuthenticationModule import org.oppia.android.testing.junit.InitializeDefaultLocaleRule +import org.oppia.android.testing.platformparameter.TestPlatformParameterModule import org.oppia.android.testing.robolectric.RobolectricModule import org.oppia.android.testing.threading.TestCoroutineDispatchers import org.oppia.android.testing.threading.TestDispatcherModule @@ -192,7 +192,6 @@ class TopicLessonsFragmentLocalTest { NumberWithUnitsRuleModule::class, NumericExpressionInputModule::class, NumericInputRuleModule::class, - PlatformParameterModule::class, PlatformParameterSingletonModule::class, QuestionModule::class, RatioInputModule::class, @@ -204,6 +203,7 @@ class TopicLessonsFragmentLocalTest { TestAuthenticationModule::class, TestDispatcherModule::class, TestLogReportingModule::class, + TestPlatformParameterModule::class, TestingBuildFlavorModule::class, TextInputRuleModule::class, ViewBindingShimModule::class, 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 97952e4f575..2b811b82f31 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 @@ -72,7 +72,6 @@ import org.oppia.android.domain.oppialogger.analytics.ApplicationLifecycleModule import org.oppia.android.domain.oppialogger.analytics.CpuPerformanceSnapshotterModule 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 import org.oppia.android.domain.question.InternalScoreMultiplyFactor @@ -92,6 +91,7 @@ import org.oppia.android.testing.espresso.EditTextInputAction import org.oppia.android.testing.espresso.KonfettiViewMatcher.Companion.hasActiveConfetti import org.oppia.android.testing.firebase.TestAuthenticationModule import org.oppia.android.testing.junit.InitializeDefaultLocaleRule +import org.oppia.android.testing.platformparameter.TestPlatformParameterModule import org.oppia.android.testing.profile.ProfileTestHelper import org.oppia.android.testing.robolectric.RobolectricModule import org.oppia.android.testing.threading.TestCoroutineDispatchers @@ -532,7 +532,6 @@ class QuestionPlayerActivityLocalTest { NumberWithUnitsRuleModule::class, NumericExpressionInputModule::class, NumericInputRuleModule::class, - PlatformParameterModule::class, PlatformParameterSingletonModule::class, QuestionPlayerActivityLocalTestModule::class, RatioInputModule::class, @@ -544,6 +543,7 @@ class QuestionPlayerActivityLocalTest { TestAuthenticationModule::class, TestDispatcherModule::class, TestLogReportingModule::class, + TestPlatformParameterModule::class, TestingBuildFlavorModule::class, TextInputRuleModule::class, ViewBindingShimModule::class, 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 337f2659c01..df46b7bd0d0 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 @@ -56,7 +56,6 @@ import org.oppia.android.domain.oppialogger.analytics.ApplicationLifecycleModule import org.oppia.android.domain.oppialogger.analytics.CpuPerformanceSnapshotterModule 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 import org.oppia.android.domain.topic.FRACTIONS_TOPIC_ID @@ -66,6 +65,7 @@ import org.oppia.android.testing.FakeAnalyticsEventLogger import org.oppia.android.testing.TestLogReportingModule import org.oppia.android.testing.firebase.TestAuthenticationModule import org.oppia.android.testing.junit.InitializeDefaultLocaleRule +import org.oppia.android.testing.platformparameter.TestPlatformParameterModule import org.oppia.android.testing.robolectric.RobolectricModule import org.oppia.android.testing.threading.TestCoroutineDispatchers import org.oppia.android.testing.threading.TestDispatcherModule @@ -178,7 +178,6 @@ class RevisionCardActivityLocalTest { NumberWithUnitsRuleModule::class, NumericExpressionInputModule::class, NumericInputRuleModule::class, - PlatformParameterModule::class, PlatformParameterSingletonModule::class, QuestionModule::class, RatioInputModule::class, @@ -190,6 +189,7 @@ class RevisionCardActivityLocalTest { TestAuthenticationModule::class, TestDispatcherModule::class, TestLogReportingModule::class, + TestPlatformParameterModule::class, TestingBuildFlavorModule::class, TextInputRuleModule::class, ViewBindingShimModule::class, diff --git a/app/src/test/java/org/oppia/android/app/translation/ActivityLanguageLocaleHandlerTest.kt b/app/src/test/java/org/oppia/android/app/translation/ActivityLanguageLocaleHandlerTest.kt index ac2230ca359..5bcc1880fb0 100644 --- a/app/src/test/java/org/oppia/android/app/translation/ActivityLanguageLocaleHandlerTest.kt +++ b/app/src/test/java/org/oppia/android/app/translation/ActivityLanguageLocaleHandlerTest.kt @@ -68,7 +68,6 @@ import org.oppia.android.domain.oppialogger.analytics.ApplicationLifecycleModule import org.oppia.android.domain.oppialogger.analytics.CpuPerformanceSnapshotterModule 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 import org.oppia.android.domain.translation.TranslationController @@ -78,6 +77,7 @@ import org.oppia.android.testing.data.DataProviderTestMonitor import org.oppia.android.testing.firebase.TestAuthenticationModule import org.oppia.android.testing.junit.DefineAppLanguageLocaleContext import org.oppia.android.testing.junit.InitializeDefaultLocaleRule +import org.oppia.android.testing.platformparameter.TestPlatformParameterModule import org.oppia.android.testing.robolectric.RobolectricModule import org.oppia.android.testing.threading.TestCoroutineDispatchers import org.oppia.android.testing.threading.TestDispatcherModule @@ -372,7 +372,7 @@ class ActivityLanguageLocaleHandlerTest { NumberWithUnitsRuleModule::class, NumericExpressionInputModule::class, NumericInputRuleModule::class, - PlatformParameterModule::class, + TestPlatformParameterModule::class, PlatformParameterSingletonModule::class, QuestionModule::class, RatioInputModule::class, diff --git a/app/src/test/java/org/oppia/android/app/translation/AppLanguageLocaleHandlerTest.kt b/app/src/test/java/org/oppia/android/app/translation/AppLanguageLocaleHandlerTest.kt index 8e67c8ec0de..0a871598365 100644 --- a/app/src/test/java/org/oppia/android/app/translation/AppLanguageLocaleHandlerTest.kt +++ b/app/src/test/java/org/oppia/android/app/translation/AppLanguageLocaleHandlerTest.kt @@ -23,12 +23,12 @@ 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.CpuPerformanceSnapshotterModule -import org.oppia.android.domain.platformparameter.PlatformParameterModule import org.oppia.android.domain.platformparameter.PlatformParameterSingletonModule import org.oppia.android.domain.translation.TranslationController import org.oppia.android.testing.TestLogReportingModule import org.oppia.android.testing.assertThrows import org.oppia.android.testing.data.DataProviderTestMonitor +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 @@ -337,13 +337,13 @@ class AppLanguageLocaleHandlerTest { LoggingIdentifierModule::class, NetworkConnectionDebugUtilModule::class, NetworkConnectionUtilDebugModule::class, - PlatformParameterModule::class, PlatformParameterSingletonModule::class, RobolectricModule::class, SyncStatusModule::class, TestDispatcherModule::class, TestLogReportingModule::class, - TestModule::class + TestModule::class, + TestPlatformParameterModule::class ] ) interface TestApplicationComponent : DataProvidersInjector { 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 d999621cdb8..a2b8f9a14b6 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 @@ -61,7 +61,6 @@ import org.oppia.android.domain.oppialogger.analytics.ApplicationLifecycleModule import org.oppia.android.domain.oppialogger.analytics.CpuPerformanceSnapshotterModule 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 import org.oppia.android.domain.translation.TranslationController @@ -76,6 +75,7 @@ import org.oppia.android.testing.junit.OppiaParameterizedTestRunner.Iteration import org.oppia.android.testing.junit.OppiaParameterizedTestRunner.Parameter 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.RobolectricModule import org.oppia.android.testing.threading.TestCoroutineDispatchers import org.oppia.android.testing.threading.TestDispatcherModule @@ -774,7 +774,7 @@ class AppLanguageResourceHandlerTest { NumberWithUnitsRuleModule::class, NumericExpressionInputModule::class, NumericInputRuleModule::class, - PlatformParameterModule::class, + TestPlatformParameterModule::class, PlatformParameterSingletonModule::class, QuestionModule::class, RatioInputModule::class, 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 8d7e228f471..2a101a48600 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 @@ -66,7 +66,6 @@ import org.oppia.android.domain.oppialogger.analytics.ApplicationLifecycleModule import org.oppia.android.domain.oppialogger.analytics.CpuPerformanceSnapshotterModule 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 import org.oppia.android.domain.translation.TranslationController @@ -76,6 +75,7 @@ import org.oppia.android.testing.data.DataProviderTestMonitor import org.oppia.android.testing.firebase.TestAuthenticationModule import org.oppia.android.testing.junit.DefineAppLanguageLocaleContext import org.oppia.android.testing.junit.InitializeDefaultLocaleRule +import org.oppia.android.testing.platformparameter.TestPlatformParameterModule import org.oppia.android.testing.profile.ProfileTestHelper import org.oppia.android.testing.robolectric.RobolectricModule import org.oppia.android.testing.threading.TestCoroutineDispatchers @@ -333,7 +333,6 @@ class AppLanguageWatcherMixinTest { NumberWithUnitsRuleModule::class, NumericExpressionInputModule::class, NumericInputRuleModule::class, - PlatformParameterModule::class, PlatformParameterSingletonModule::class, QuestionModule::class, RatioInputModule::class, @@ -345,6 +344,7 @@ class AppLanguageWatcherMixinTest { TestAuthenticationModule::class, TestDispatcherModule::class, TestLogReportingModule::class, + TestPlatformParameterModule::class, TestingBuildFlavorModule::class, TextInputRuleModule::class, ViewBindingShimModule::class, diff --git a/app/src/test/java/org/oppia/android/app/translation/BUILD.bazel b/app/src/test/java/org/oppia/android/app/translation/BUILD.bazel index 730f56bf8b7..da23e52fd91 100644 --- a/app/src/test/java/org/oppia/android/app/translation/BUILD.bazel +++ b/app/src/test/java/org/oppia/android/app/translation/BUILD.bazel @@ -22,6 +22,7 @@ oppia_android_test( "//domain/src/main/java/org/oppia/android/domain/translation:translation_controller", "//testing", "//testing/src/main/java/org/oppia/android/testing/data:data_provider_test_monitor", + "//testing/src/main/java/org/oppia/android/testing/platformparameter:test_module", "//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", @@ -67,6 +68,7 @@ oppia_android_test( "//testing", "//testing/src/main/java/org/oppia/android/testing/data:data_provider_test_monitor", "//testing/src/main/java/org/oppia/android/testing/junit:initialize_default_locale_rule", + "//testing/src/main/java/org/oppia/android/testing/platformparameter:test_module", "//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", @@ -115,6 +117,7 @@ oppia_android_test( "//testing/src/main/java/org/oppia/android/testing/junit:initialize_default_locale_rule", "//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/platformparameter:test_module", "//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", @@ -162,6 +165,7 @@ oppia_android_test( "//testing", "//testing/src/main/java/org/oppia/android/testing/data:data_provider_test_monitor", "//testing/src/main/java/org/oppia/android/testing/junit:initialize_default_locale_rule", + "//testing/src/main/java/org/oppia/android/testing/platformparameter:test_module", "//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", diff --git a/app/src/test/java/org/oppia/android/app/utility/datetime/DateTimeUtilTest.kt b/app/src/test/java/org/oppia/android/app/utility/datetime/DateTimeUtilTest.kt index 2701991c9d0..3722431d16d 100644 --- a/app/src/test/java/org/oppia/android/app/utility/datetime/DateTimeUtilTest.kt +++ b/app/src/test/java/org/oppia/android/app/utility/datetime/DateTimeUtilTest.kt @@ -57,13 +57,13 @@ import org.oppia.android.domain.oppialogger.LoggingIdentifierModule import org.oppia.android.domain.oppialogger.analytics.AnalyticsStartupListener import org.oppia.android.domain.oppialogger.analytics.ApplicationLifecycleModule import org.oppia.android.domain.oppialogger.analytics.CpuPerformanceSnapshotterModule -import org.oppia.android.domain.platformparameter.PlatformParameterModule import org.oppia.android.domain.platformparameter.PlatformParameterSingletonModule import org.oppia.android.domain.question.QuestionModule import org.oppia.android.domain.workmanager.WorkManagerConfigurationModule import org.oppia.android.testing.TestLogReportingModule import org.oppia.android.testing.firebase.TestAuthenticationModule import org.oppia.android.testing.junit.InitializeDefaultLocaleRule +import org.oppia.android.testing.platformparameter.TestPlatformParameterModule import org.oppia.android.testing.robolectric.RobolectricModule import org.oppia.android.testing.threading.TestCoroutineDispatchers import org.oppia.android.testing.threading.TestDispatcherModule @@ -255,7 +255,6 @@ class DateTimeUtilTest { NumberWithUnitsRuleModule::class, NumericExpressionInputModule::class, NumericInputRuleModule::class, - PlatformParameterModule::class, PlatformParameterSingletonModule::class, QuestionModule::class, RatioInputModule::class, @@ -268,6 +267,7 @@ class DateTimeUtilTest { TestDispatcherModule::class, TestLogReportingModule::class, TestModule::class, + TestPlatformParameterModule::class, TestingBuildFlavorModule::class, TextInputRuleModule::class, WorkManagerConfigurationModule::class diff --git a/app/src/test/java/org/oppia/android/app/utility/math/BUILD.bazel b/app/src/test/java/org/oppia/android/app/utility/math/BUILD.bazel index a7caa3b0995..6d800244ee7 100644 --- a/app/src/test/java/org/oppia/android/app/utility/math/BUILD.bazel +++ b/app/src/test/java/org/oppia/android/app/utility/math/BUILD.bazel @@ -30,6 +30,7 @@ oppia_android_test( "//testing/src/main/java/org/oppia/android/testing/junit:parameterized_robolectric_test_runner", "//testing/src/main/java/org/oppia/android/testing/math:math_equation_subject", "//testing/src/main/java/org/oppia/android/testing/math:math_expression_subject", + "//testing/src/main/java/org/oppia/android/testing/platformparameter:test_module", "//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", 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 f14953f5eaf..2e4b20b5629 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 @@ -75,7 +75,6 @@ import org.oppia.android.domain.oppialogger.analytics.ApplicationLifecycleModule import org.oppia.android.domain.oppialogger.analytics.CpuPerformanceSnapshotterModule 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 import org.oppia.android.domain.workmanager.WorkManagerConfigurationModule @@ -87,6 +86,7 @@ import org.oppia.android.testing.junit.OppiaParameterizedTestRunner.Iteration import org.oppia.android.testing.junit.OppiaParameterizedTestRunner.Parameter 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.RobolectricModule import org.oppia.android.testing.threading.TestCoroutineDispatchers import org.oppia.android.testing.threading.TestDispatcherModule @@ -1437,7 +1437,6 @@ class MathExpressionAccessibilityUtilTest { NumberWithUnitsRuleModule::class, NumericExpressionInputModule::class, NumericInputRuleModule::class, - PlatformParameterModule::class, PlatformParameterSingletonModule::class, QuestionModule::class, RatioInputModule::class, @@ -1449,6 +1448,7 @@ class MathExpressionAccessibilityUtilTest { TestAuthenticationModule::class, TestDispatcherModule::class, TestLogReportingModule::class, + TestPlatformParameterModule::class, TestingBuildFlavorModule::class, TextInputRuleModule::class, ViewBindingShimModule::class, diff --git a/build_flavors.bzl b/build_flavors.bzl index 19b9939c3fa..3e92e73b4e0 100644 --- a/build_flavors.bzl +++ b/build_flavors.bzl @@ -58,6 +58,7 @@ _FLAVOR_METADATA = { "deps": [ "//app/src/main/java/org/oppia/android/app/application/alpha:alpha_application", "//config/src/java/org/oppia/android/config:all_languages_config", + "//config/src/java/org/oppia/android/config:alpha_feature_flags_override_config", ], "version_code": OPPIA_ALPHA_VERSION_CODE, "application_class": ".app.application.alpha.AlphaOppiaApplication", @@ -71,6 +72,7 @@ _FLAVOR_METADATA = { "production_release": True, "deps": [ "//app/src/main/java/org/oppia/android/app/application/beta:beta_application", + "//config/src/java/org/oppia/android/config:beta_feature_flags_override_config", "//config/src/java/org/oppia/android/config:production_languages_config", ], "version_code": OPPIA_BETA_VERSION_CODE, @@ -85,6 +87,7 @@ _FLAVOR_METADATA = { "production_release": True, "deps": [ "//app/src/main/java/org/oppia/android/app/application/ga:general_availability_application", + "//config/src/java/org/oppia/android/config:ga_feature_flags_override_config", "//config/src/java/org/oppia/android/config:production_languages_config", ], "version_code": OPPIA_GA_VERSION_CODE, diff --git a/config/src/java/org/oppia/android/config/BUILD.bazel b/config/src/java/org/oppia/android/config/BUILD.bazel index cc24ce5240c..8b604614fae 100644 --- a/config/src/java/org/oppia/android/config/BUILD.bazel +++ b/config/src/java/org/oppia/android/config/BUILD.bazel @@ -15,6 +15,12 @@ _LANGUAGE_SUPPORT_LEVELS = [ "production", ] +_FEATURE_FLAG_OVERRIDE_TYPES = [ + "alpha", + "beta", + "ga", +] + _SUPPORTED_LANGUAGES_CONFIG_ASSETS = { support_level: generate_proto_binary_assets( name = "%s_supported_languages_config_assets" % support_level, @@ -43,6 +49,60 @@ _SUPPORTED_REGIONS_CONFIG_ASSETS = { for support_level in _LANGUAGE_SUPPORT_LEVELS } +_PLATFORM_PARAMETERS_CONFIG_ASSETS = generate_proto_binary_assets( + name = "platform_parameters_config_assets", + asset_dir = "platform", + name_prefix = "platform_parameters_config_assets", + names = ["platform_parameters"], + proto_dep_bazel_target_prefix = "//model/src/main/proto", + proto_dep_name = "platform_parameter", + proto_package = "model", + proto_type_name = "SupportedPlatformParameters", +) + +_FEATURE_FLAG_CONFIG_ASSETS = generate_proto_binary_assets( + name = "feature_flag_config_assets", + asset_dir = "platform", + name_prefix = "feature_flag_config_assets", + names = ["feature_flags"], + proto_dep_bazel_target_prefix = "//model/src/main/proto", + proto_dep_name = "platform_parameter", + proto_package = "model", + proto_type_name = "SupportedFeatureFlags", +) + +_FEATURE_FLAG_OVERRIDE_CONFIG_ASSETS = { + override_type: generate_proto_binary_assets( + name = "%s_feature_flag_override_config_assets" % override_type, + asset_dir = "platform/featureoverrides/%s" % override_type, + name_prefix = "%s_feature_flag_override_config_assets" % override_type, + names = ["feature_flags_overrides"], + proto_dep_bazel_target_prefix = "//model/src/main/proto", + proto_dep_name = "platform_parameter", + proto_package = "model", + proto_type_name = "SupportedFeatureFlags", + ) + for override_type in _FEATURE_FLAG_OVERRIDE_TYPES +} + +filegroup( + name = "platform_parameter_definitions", + srcs = _PLATFORM_PARAMETERS_CONFIG_ASSETS, + visibility = [ + "//domain/src/main/java/org/oppia/android/domain/platformparameter:__subpackages__", + "//scripts:oppia_script_binary_visibility", + ], +) + +filegroup( + name = "feature_flag_definitions", + srcs = _FEATURE_FLAG_CONFIG_ASSETS, + visibility = [ + "//domain/src/main/java/org/oppia/android/domain/platformparameter:__subpackages__", + "//scripts:oppia_script_binary_visibility", + ], +) + [ android_library( name = "%s_languages_config" % support_level, @@ -57,3 +117,39 @@ _SUPPORTED_REGIONS_CONFIG_ASSETS = { ) for support_level in _LANGUAGE_SUPPORT_LEVELS ] + +android_library( + name = "platform_parameters_config", + assets = [":platform_parameter_definitions"], + assets_dir = "platform", + manifest = "AndroidManifest.xml", + visibility = [ + "//:oppia_binary_visibility", + "//:oppia_testing_visibility", + ], +) + +android_library( + name = "feature_flags_config", + assets = [":feature_flag_definitions"], + assets_dir = "platform", + manifest = "AndroidManifest.xml", + visibility = [ + "//:oppia_binary_visibility", + "//:oppia_testing_visibility", + ], +) + +[ + android_library( + name = "%s_feature_flags_override_config" % override_type, + assets = _FEATURE_FLAG_OVERRIDE_CONFIG_ASSETS[override_type], + assets_dir = "platform/featureoverrides/%s" % override_type, + manifest = "AndroidManifest.xml", + visibility = [ + "//:oppia_binary_visibility", + "//:oppia_testing_visibility", + ], + ) + for override_type in _FEATURE_FLAG_OVERRIDE_TYPES +] diff --git a/config/src/java/org/oppia/android/config/platform/feature_flags.textproto b/config/src/java/org/oppia/android/config/platform/feature_flags.textproto new file mode 100644 index 00000000000..659977cdeaa --- /dev/null +++ b/config/src/java/org/oppia/android/config/platform/feature_flags.textproto @@ -0,0 +1,70 @@ +feature_flag_definition { + id: DOWNLOADS_SUPPORT + remote_server_name: "android_enable_downloads_support" + default_is_enabled: false +} +feature_flag_definition { + id: LEARNER_STUDY_ANALYTICS + remote_server_name: "android_enable_learner_study_analytics" + default_is_enabled: false +} +feature_flag_definition { + id: FAST_LANGUAGE_SWITCHING_IN_LESSON + remote_server_name: "android_enable_fast_language_switching_in_lesson" + default_is_enabled: false +} +feature_flag_definition { + id: LOGGING_LEARNER_STUDY_IDS + remote_server_name: "android_enable_logging_learner_study_ids" + default_is_enabled: false +} +feature_flag_definition { + id: EDIT_ACCOUNTS_OPTIONS_UI + remote_server_name: "android_enable_edit_accounts_options_ui" + default_is_enabled: false +} +feature_flag_definition { + id: PERFORMANCE_METRICS_COLLECTION + remote_server_name: "android_enable_performance_metrics_collection" + default_is_enabled: false +} +feature_flag_definition { + id: SPOTLIGHT_UI + remote_server_name: "android_enable_spotlight_ui" + default_is_enabled: false +} +feature_flag_definition { + id: INTERACTION_CONFIG_CHANGE_STATE_RETENTION + remote_server_name: "android_enable_interaction_config_change_state_retention" + default_is_enabled: false +} +feature_flag_definition { + id: APP_AND_OS_DEPRECATION + remote_server_name: "android_enable_app_and_os_deprecation" + default_is_enabled: false +} +feature_flag_definition { + id: NPS_SURVEY + remote_server_name: "android_enable_nps_survey" + default_is_enabled: true +} +feature_flag_definition { + id: ONBOARDING_FLOW_V2 + remote_server_name: "android_enable_onboarding_flow_v2" + default_is_enabled: false +} +feature_flag_definition { + id: MULTIPLE_CLASSROOMS + remote_server_name: "enable_multiple_classrooms" + default_is_enabled: false +} +feature_flag_definition { + id: TOPIC_INFO_TAB + remote_server_name: "enable_topic_info_tab" + default_is_enabled: false +} +feature_flag_definition { + id: TOPIC_PRACTICE_TAB + remote_server_name: "enable_topic_practice_tab" + default_is_enabled: false +} diff --git a/config/src/java/org/oppia/android/config/platform/featureoverrides/alpha/feature_flags_overrides.textproto b/config/src/java/org/oppia/android/config/platform/featureoverrides/alpha/feature_flags_overrides.textproto new file mode 100644 index 00000000000..1f1175aaea5 --- /dev/null +++ b/config/src/java/org/oppia/android/config/platform/featureoverrides/alpha/feature_flags_overrides.textproto @@ -0,0 +1,12 @@ +feature_flag_definition { + id: LEARNER_STUDY_ANALYTICS + default_is_enabled: true +} +feature_flag_definition { + id: SPOTLIGHT_UI + default_is_enabled: true +} +feature_flag_definition { + id: MULTIPLE_CLASSROOMS + default_is_enabled: true +} diff --git a/config/src/java/org/oppia/android/config/platform/featureoverrides/beta/feature_flags_overrides.textproto b/config/src/java/org/oppia/android/config/platform/featureoverrides/beta/feature_flags_overrides.textproto new file mode 100644 index 00000000000..e69de29bb2d diff --git a/config/src/java/org/oppia/android/config/platform/featureoverrides/ga/feature_flags_overrides.textproto b/config/src/java/org/oppia/android/config/platform/featureoverrides/ga/feature_flags_overrides.textproto new file mode 100644 index 00000000000..e69de29bb2d diff --git a/config/src/java/org/oppia/android/config/platform/platform_parameters.textproto b/config/src/java/org/oppia/android/config/platform/platform_parameters.textproto new file mode 100644 index 00000000000..d22bb27097e --- /dev/null +++ b/config/src/java/org/oppia/android/config/platform/platform_parameters.textproto @@ -0,0 +1,70 @@ +platform_parameter_definition { + id: SPLASH_SCREEN_WELCOME_MESSAGE + default_value: { + boolean: false + } +} +platform_parameter_definition { + id: SYNC_UP_WORKER_TIME_PERIOD_IN_HOURS + default_value: { + integer: 12 + } +} +platform_parameter_definition { + id: CACHE_LATEX_RENDERING + default_value: { + boolean: true + } +} +platform_parameter_definition { + id: PERFORMANCE_METRICS_COLLECTION_UPLOAD_TIME_INTERVAL_IN_MINUTES + default_value: { + integer: 15 + } +} +platform_parameter_definition { + id: PERFORMANCE_METRICS_COLLECTION_HIGH_FREQUENCY_TIME_INTERVAL_IN_MINUTES + default_value: { + integer: 15 + } +} +platform_parameter_definition { + id: PERFORMANCE_METRICS_COLLECTION_LOW_FREQUENCY_TIME_INTERVAL_IN_MINUTES + default_value: { + integer: 1440 + } +} +platform_parameter_definition { + id: OPTIONAL_APP_UPDATE_VERSION_CODE + remote_server_name: "android_optional_app_update_version_code" + default_value: { + integer: 0 + } +} +platform_parameter_definition { + id: FORCED_APP_UPDATE_VERSION_CODE + remote_server_name: "android_forced_app_update_version_code" + default_value: { + integer: 0 + } +} +platform_parameter_definition { + id: LOWEST_SUPPORTED_API_LEVEL + remote_server_name: "lowest_supported_api_level" + default_value: { + # The lowest supported version of the app is currently Lollipop. + integer: 21 + } +} +platform_parameter_definition { + id: NPS_SURVEY_GRACE_PERIOD_IN_DAYS + default_value: { + integer: 30 + } +} +platform_parameter_definition { + id: NPS_SURVEY_MINIMUM_AGGREGATE_LEARNING_TIME_IN_A_TOPIC_IN_MINUTES + default_value: { + integer: 5 + } +} diff --git a/data/BUILD.bazel b/data/BUILD.bazel index 42e280e0b69..b40d1068c0a 100644 --- a/data/BUILD.bazel +++ b/data/BUILD.bazel @@ -36,7 +36,6 @@ TEST_DEPS = [ "//testing", "//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/platformparameter:test_constants", "//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", diff --git a/data/src/main/java/org/oppia/android/data/backends/gae/testing/BUILD.bazel b/data/src/main/java/org/oppia/android/data/backends/gae/testing/BUILD.bazel index f12ccb0a603..927660af0e5 100644 --- a/data/src/main/java/org/oppia/android/data/backends/gae/testing/BUILD.bazel +++ b/data/src/main/java/org/oppia/android/data/backends/gae/testing/BUILD.bazel @@ -38,7 +38,7 @@ kt_android_library( visibility = ["//:oppia_testing_visibility"], deps = [ "//data/src/main/java/org/oppia/android/data/backends/gae:network_config_annotations", - "//testing/src/main/java/org/oppia/android/testing/platformparameter:test_constants", + "//data/src/main/java/org/oppia/android/data/backends/gae/model", "//third_party:com_squareup_okhttp3_mockwebserver", "//third_party:javax_inject_javax_inject", "//third_party:moshi", diff --git a/data/src/main/java/org/oppia/android/data/backends/gae/testing/PlatformParameterServiceTestOrchestrator.kt b/data/src/main/java/org/oppia/android/data/backends/gae/testing/PlatformParameterServiceTestOrchestrator.kt index e33fc23e437..7edf14de542 100644 --- a/data/src/main/java/org/oppia/android/data/backends/gae/testing/PlatformParameterServiceTestOrchestrator.kt +++ b/data/src/main/java/org/oppia/android/data/backends/gae/testing/PlatformParameterServiceTestOrchestrator.kt @@ -1,15 +1,12 @@ package org.oppia.android.data.backends.gae.testing +import com.squareup.moshi.JsonAdapter import com.squareup.moshi.Moshi +import com.squareup.moshi.Types import okhttp3.mockwebserver.MockResponse import okhttp3.mockwebserver.MockWebServer import org.oppia.android.data.backends.gae.XssiPrefix -import org.oppia.android.testing.platformparameter.TEST_BOOLEAN_PARAM_NAME -import org.oppia.android.testing.platformparameter.TEST_BOOLEAN_PARAM_SERVER_VALUE -import org.oppia.android.testing.platformparameter.TEST_INTEGER_PARAM_NAME -import org.oppia.android.testing.platformparameter.TEST_INTEGER_PARAM_SERVER_VALUE -import org.oppia.android.testing.platformparameter.TEST_STRING_PARAM_NAME -import org.oppia.android.testing.platformparameter.TEST_STRING_PARAM_SERVER_VALUE +import org.oppia.android.data.backends.gae.model.GaePlatformParameterValue import javax.inject.Inject /** @@ -21,7 +18,14 @@ class PlatformParameterServiceTestOrchestrator @Inject constructor( private val moshi: Moshi, @XssiPrefix private val xssiPrefix: String ) { - private val mapAdapter by lazy { moshi.adapter(Map::class.java) } + private val parameterMapAdapter: JsonAdapter> by lazy { + moshi.adapter( + Types.newParameterizedType( + Map::class.java, String::class.java, GaePlatformParameterValue::class.java + ) + ) + } + private val genericMapAdapter by lazy { moshi.adapter(Map::class.java) } /** * Sets the next web response to be a success. @@ -29,10 +33,26 @@ class PlatformParameterServiceTestOrchestrator @Inject constructor( * @param parameterValues the name-to-value mapping that should be returned (representing the * latest remote parameter values being sent from the server) */ + @JvmName("setNextResponseAsSuccessForGaePlatformParameterValues") fun setNextResponseAsSuccess( - parameterValues: Map = DEFAULT_REMOTE_PLATFORM_PARAMETERS + parameterValues: Map = DEFAULT_REMOTE_PLATFORM_PARAMETERS ) { - val paramValuesJson = mapAdapter.toJson(parameterValues) + val paramValuesJson = parameterMapAdapter.toJson(parameterValues) + mockWebServer.enqueue(MockResponse().setBody("$xssiPrefix\n$paramValuesJson")) + } + + /** + * Sets the next web response to be a success, but for a set of parameters that can include + * non-[GaePlatformParameterValue]s. + * + * Note that this method will fail if the provided map includes any [GaePlatformParameterValue]s. + * + * @param parameterValues the name-to-value mapping that should be returned (representing the + * latest remote parameter values being sent from the server) + */ + @JvmName("setNextResponseAsSuccessForNonGaePlatformParameterValues") + fun setNextResponseAsSuccess(parameterValues: Map) { + val paramValuesJson = genericMapAdapter.toJson(parameterValues) mockWebServer.enqueue(MockResponse().setBody("$xssiPrefix\n$paramValuesJson")) } @@ -42,6 +62,35 @@ class PlatformParameterServiceTestOrchestrator @Inject constructor( } companion object { + /** + * The parameter name for [TEST_STRING_PARAM_SERVER_VALUE] included in + * [DEFAULT_REMOTE_PLATFORM_PARAMETERS]. + */ + const val TEST_STRING_PARAM_NAME = "test_string_param_name" + + /** + * The parameter name for [TEST_INTEGER_PARAM_SERVER_VALUE] included in + * [DEFAULT_REMOTE_PLATFORM_PARAMETERS]. + */ + const val TEST_INTEGER_PARAM_NAME = "test_integer_param_name" + + /** + * The parameter name for [TEST_BOOLEAN_PARAM_SERVER_VALUE] included in + * [DEFAULT_REMOTE_PLATFORM_PARAMETERS]. + */ + const val TEST_BOOLEAN_PARAM_NAME = "test_boolean_param_name" + + /** + * The parameter name for the unknown parameter included in + * [REMOTE_PLATFORM_PARAMETERS_WITH_UNSUPPORTED_TYPE]. + */ + const val TEST_UNKNOWN_PARAM_NAME = "test_unknown_param_name" + + private val TEST_STRING_PARAM_SERVER_VALUE = + GaePlatformParameterValue.StringValue("test_string_param_value") + private val TEST_INTEGER_PARAM_SERVER_VALUE = GaePlatformParameterValue.IntValue(1) + private val TEST_BOOLEAN_PARAM_SERVER_VALUE = GaePlatformParameterValue.BooleanValue(true) + /** A default map of parameters that can be orchestrated using [setNextResponseAsSuccess]. */ val DEFAULT_REMOTE_PLATFORM_PARAMETERS = mapOf( TEST_STRING_PARAM_NAME to TEST_STRING_PARAM_SERVER_VALUE, @@ -49,11 +98,9 @@ class PlatformParameterServiceTestOrchestrator @Inject constructor( TEST_BOOLEAN_PARAM_NAME to TEST_BOOLEAN_PARAM_SERVER_VALUE ) - /** A version of [DEFAULT_REMOTE_PLATFORM_PARAMETERS] with unsupported parameter types. */ + /** A map of parameters that contains an unsupported parameter type. */ val REMOTE_PLATFORM_PARAMETERS_WITH_UNSUPPORTED_TYPE = mapOf( - TEST_STRING_PARAM_NAME to TEST_STRING_PARAM_SERVER_VALUE, - TEST_INTEGER_PARAM_NAME to TEST_INTEGER_PARAM_SERVER_VALUE, - TEST_BOOLEAN_PARAM_NAME to emptyList() + TEST_UNKNOWN_PARAM_NAME to emptyList() ) } } diff --git a/data/src/test/java/org/oppia/android/data/backends/gae/api/PlatformParameterServiceTest.kt b/data/src/test/java/org/oppia/android/data/backends/gae/api/PlatformParameterServiceTest.kt index 055aac039ac..ef6dc5f61d3 100644 --- a/data/src/test/java/org/oppia/android/data/backends/gae/api/PlatformParameterServiceTest.kt +++ b/data/src/test/java/org/oppia/android/data/backends/gae/api/PlatformParameterServiceTest.kt @@ -22,12 +22,10 @@ import org.oppia.android.data.backends.gae.model.GaePlatformParameterValue.Strin import org.oppia.android.data.backends.gae.testing.NetworkConfigTestModule import org.oppia.android.data.backends.gae.testing.PlatformParameterServiceTestOrchestrator import org.oppia.android.data.backends.gae.testing.PlatformParameterServiceTestOrchestrator.Companion.REMOTE_PLATFORM_PARAMETERS_WITH_UNSUPPORTED_TYPE -import org.oppia.android.testing.platformparameter.TEST_BOOLEAN_PARAM_NAME -import org.oppia.android.testing.platformparameter.TEST_BOOLEAN_PARAM_SERVER_VALUE -import org.oppia.android.testing.platformparameter.TEST_INTEGER_PARAM_NAME -import org.oppia.android.testing.platformparameter.TEST_INTEGER_PARAM_SERVER_VALUE -import org.oppia.android.testing.platformparameter.TEST_STRING_PARAM_NAME -import org.oppia.android.testing.platformparameter.TEST_STRING_PARAM_SERVER_VALUE +import org.oppia.android.data.backends.gae.testing.PlatformParameterServiceTestOrchestrator.Companion.TEST_BOOLEAN_PARAM_NAME +import org.oppia.android.data.backends.gae.testing.PlatformParameterServiceTestOrchestrator.Companion.TEST_INTEGER_PARAM_NAME +import org.oppia.android.data.backends.gae.testing.PlatformParameterServiceTestOrchestrator.Companion.TEST_STRING_PARAM_NAME +import org.oppia.android.data.backends.gae.testing.PlatformParameterServiceTestOrchestrator.Companion.TEST_UNKNOWN_PARAM_NAME import org.oppia.android.testing.robolectric.RobolectricModule import org.oppia.android.testing.threading.TestDispatcherModule import org.robolectric.annotation.Config @@ -94,7 +92,7 @@ class PlatformParameterServiceTest { val response = parameterService.getPlatformParametersByVersion(version = "1.0").execute() val param = response.body()?.get(TEST_STRING_PARAM_NAME) as? StringValue - assertThat(param?.value).isEqualTo(TEST_STRING_PARAM_SERVER_VALUE) + assertThat(param?.value).isEqualTo("test_string_param_value") } @Test @@ -104,7 +102,7 @@ class PlatformParameterServiceTest { val response = parameterService.getPlatformParametersByVersion(version = "1.0").execute() val param = response.body()?.get(TEST_INTEGER_PARAM_NAME) as? IntValue - assertThat(param?.value).isEqualTo(TEST_INTEGER_PARAM_SERVER_VALUE) + assertThat(param?.value).isEqualTo(1) } @Test @@ -114,7 +112,7 @@ class PlatformParameterServiceTest { val response = parameterService.getPlatformParametersByVersion(version = "1.0").execute() val param = response.body()?.get(TEST_BOOLEAN_PARAM_NAME) as? BooleanValue - assertThat(param?.value).isEqualTo(TEST_BOOLEAN_PARAM_SERVER_VALUE) + assertThat(param?.value).isTrue() } @Test @@ -124,7 +122,7 @@ class PlatformParameterServiceTest { val response = parameterService.getPlatformParametersByVersion(version = "1.0").execute() // Invalid/unsupported parameter types should be correctly processed. - val param = response.body()?.get(TEST_BOOLEAN_PARAM_NAME) + val param = response.body()?.get(TEST_UNKNOWN_PARAM_NAME) assertThat(param).isEqualTo(GaePlatformParameterValue.UnsupportedValue) } diff --git a/data/src/test/java/org/oppia/android/data/backends/gae/testing/PlatformParameterServiceTestOrchestratorTest.kt b/data/src/test/java/org/oppia/android/data/backends/gae/testing/PlatformParameterServiceTestOrchestratorTest.kt index e81379a64bc..c50da3fa597 100644 --- a/data/src/test/java/org/oppia/android/data/backends/gae/testing/PlatformParameterServiceTestOrchestratorTest.kt +++ b/data/src/test/java/org/oppia/android/data/backends/gae/testing/PlatformParameterServiceTestOrchestratorTest.kt @@ -23,13 +23,11 @@ import org.junit.runner.RunWith import org.oppia.android.data.backends.gae.OppiaRetrofit import org.oppia.android.data.backends.gae.RetrofitModule import org.oppia.android.data.backends.gae.testing.PlatformParameterServiceTestOrchestrator.Companion.REMOTE_PLATFORM_PARAMETERS_WITH_UNSUPPORTED_TYPE +import org.oppia.android.data.backends.gae.testing.PlatformParameterServiceTestOrchestrator.Companion.TEST_BOOLEAN_PARAM_NAME +import org.oppia.android.data.backends.gae.testing.PlatformParameterServiceTestOrchestrator.Companion.TEST_INTEGER_PARAM_NAME +import org.oppia.android.data.backends.gae.testing.PlatformParameterServiceTestOrchestrator.Companion.TEST_STRING_PARAM_NAME +import org.oppia.android.data.backends.gae.testing.PlatformParameterServiceTestOrchestrator.Companion.TEST_UNKNOWN_PARAM_NAME import org.oppia.android.testing.assertThrows -import org.oppia.android.testing.platformparameter.TEST_BOOLEAN_PARAM_NAME -import org.oppia.android.testing.platformparameter.TEST_BOOLEAN_PARAM_SERVER_VALUE -import org.oppia.android.testing.platformparameter.TEST_INTEGER_PARAM_NAME -import org.oppia.android.testing.platformparameter.TEST_INTEGER_PARAM_SERVER_VALUE -import org.oppia.android.testing.platformparameter.TEST_STRING_PARAM_NAME -import org.oppia.android.testing.platformparameter.TEST_STRING_PARAM_SERVER_VALUE import org.oppia.android.testing.robolectric.RobolectricModule import org.oppia.android.testing.threading.TestDispatcherModule import org.robolectric.annotation.Config @@ -119,9 +117,9 @@ class PlatformParameterServiceTestOrchestratorTest { val paramVals = result.body?.source()?.let { mapAdapter.fromJson(it) } assertThat(paramVals).hasSize(3) - assertThat(paramVals?.get(TEST_STRING_PARAM_NAME)).isEqualTo(TEST_STRING_PARAM_SERVER_VALUE) - assertThat(paramVals?.get(TEST_INTEGER_PARAM_NAME)).isEqualTo(TEST_INTEGER_PARAM_SERVER_VALUE) - assertThat(paramVals?.get(TEST_BOOLEAN_PARAM_NAME)).isEqualTo(TEST_BOOLEAN_PARAM_SERVER_VALUE) + assertThat(paramVals?.get(TEST_STRING_PARAM_NAME)).isEqualTo("test_string_param_value") + assertThat(paramVals?.get(TEST_INTEGER_PARAM_NAME)).isEqualTo(1) + assertThat(paramVals?.get(TEST_BOOLEAN_PARAM_NAME)).isEqualTo(true) } @Test @@ -131,8 +129,8 @@ class PlatformParameterServiceTestOrchestratorTest { val result = retrofit.sendRawOkHttpRequestWithShortTimeout(createRequest()) val paramVals = result.body?.source()?.let { mapAdapter.fromJson(it) } - assertThat(paramVals).hasSize(3) - assertThat(paramVals?.get(TEST_BOOLEAN_PARAM_NAME)).isEqualTo(emptyList()) + assertThat(paramVals).hasSize(1) + assertThat(paramVals?.get(TEST_UNKNOWN_PARAM_NAME)).isEqualTo(emptyList()) } @Test diff --git a/domain/BUILD.bazel b/domain/BUILD.bazel index a7ad523ef77..36275b15456 100755 --- a/domain/BUILD.bazel +++ b/domain/BUILD.bazel @@ -132,6 +132,7 @@ kt_android_library( "//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/platformparameter/syncup", "//domain/src/main/java/org/oppia/android/domain/profile:profile_management_controller", "//domain/src/main/java/org/oppia/android/domain/state:state_deck", "//domain/src/main/java/org/oppia/android/domain/state:state_graph", @@ -246,6 +247,7 @@ TEST_DEPS = [ "//utility/src/main/java/org/oppia/android/util/caching/testing:fake_asset_repository", "//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/locale/testing:test_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", 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 b5c7b54bf0b..733d6558259 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 @@ -203,6 +203,7 @@ kt_android_library( "//:dagger", "//domain/src/main/java/org/oppia/android/domain/oppialogger:oppia_logger", "//domain/src/main/java/org/oppia/android/domain/oppialogger/analytics:controller", + "//domain/src/main/java/org/oppia/android/domain/platformparameter:annotations", "//third_party:javax_inject_javax_inject", ], ) diff --git a/domain/src/main/java/org/oppia/android/domain/oppialogger/analytics/FeatureFlagsLogger.kt b/domain/src/main/java/org/oppia/android/domain/oppialogger/analytics/FeatureFlagsLogger.kt index 567798abb71..f5320bcf1b1 100644 --- a/domain/src/main/java/org/oppia/android/domain/oppialogger/analytics/FeatureFlagsLogger.kt +++ b/domain/src/main/java/org/oppia/android/domain/oppialogger/analytics/FeatureFlagsLogger.kt @@ -3,36 +3,11 @@ package org.oppia.android.domain.oppialogger.analytics import org.oppia.android.app.model.EventLog import org.oppia.android.app.model.EventLog.FeatureFlagItemContext import org.oppia.android.app.model.EventLog.FeatureFlagListContext -import org.oppia.android.util.platformparameter.APP_AND_OS_DEPRECATION -import org.oppia.android.util.platformparameter.DOWNLOADS_SUPPORT -import org.oppia.android.util.platformparameter.EDIT_ACCOUNTS_OPTIONS_UI -import org.oppia.android.util.platformparameter.ENABLE_MULTIPLE_CLASSROOMS -import org.oppia.android.util.platformparameter.ENABLE_NPS_SURVEY -import org.oppia.android.util.platformparameter.ENABLE_ONBOARDING_FLOW_V2 -import org.oppia.android.util.platformparameter.ENABLE_PERFORMANCE_METRICS_COLLECTION -import org.oppia.android.util.platformparameter.ENABLE_TOPIC_INFO_TAB -import org.oppia.android.util.platformparameter.ENABLE_TOPIC_PRACTICE_TAB -import org.oppia.android.util.platformparameter.EnableAppAndOsDeprecation -import org.oppia.android.util.platformparameter.EnableDownloadsSupport -import org.oppia.android.util.platformparameter.EnableEditAccountsOptionsUi -import org.oppia.android.util.platformparameter.EnableFastLanguageSwitchingInLesson -import org.oppia.android.util.platformparameter.EnableInteractionConfigChangeStateRetention -import org.oppia.android.util.platformparameter.EnableLearnerStudyAnalytics -import org.oppia.android.util.platformparameter.EnableLoggingLearnerStudyIds -import org.oppia.android.util.platformparameter.EnableMultipleClassrooms -import org.oppia.android.util.platformparameter.EnableNpsSurvey -import org.oppia.android.util.platformparameter.EnableOnboardingFlowV2 -import org.oppia.android.util.platformparameter.EnablePerformanceMetricsCollection -import org.oppia.android.util.platformparameter.EnableSpotlightUi -import org.oppia.android.util.platformparameter.EnableTopicInfoTab -import org.oppia.android.util.platformparameter.EnableTopicPracticeTab -import org.oppia.android.util.platformparameter.FAST_LANGUAGE_SWITCHING_IN_LESSON -import org.oppia.android.util.platformparameter.INTERACTION_CONFIG_CHANGE_STATE_RETENTION -import org.oppia.android.util.platformparameter.LEARNER_STUDY_ANALYTICS -import org.oppia.android.util.platformparameter.LOGGING_LEARNER_STUDY_IDS +import org.oppia.android.app.model.FeatureFlagId +import org.oppia.android.domain.platformparameter.FeatureFlags import org.oppia.android.util.platformparameter.PlatformParameterValue -import org.oppia.android.util.platformparameter.SPOTLIGHT_UI import javax.inject.Inject +import javax.inject.Provider import javax.inject.Singleton /** @@ -45,56 +20,12 @@ import javax.inject.Singleton @Singleton class FeatureFlagsLogger @Inject constructor( private val analyticsController: AnalyticsController, - @EnableDownloadsSupport - private val enableDownloadsSupport: PlatformParameterValue, - @EnableLearnerStudyAnalytics - private val enableLearnerStudyAnalytics: PlatformParameterValue, - @EnableFastLanguageSwitchingInLesson - private val enableFastLanguageSwitchingInLesson: PlatformParameterValue, - @EnableLoggingLearnerStudyIds - private val enableLoggingLearnerStudyIds: PlatformParameterValue, - @EnableEditAccountsOptionsUi - private val enableEditAccountsOptionsUi: PlatformParameterValue, - @EnablePerformanceMetricsCollection - private val enablePerformanceMetricsCollection: PlatformParameterValue, - @EnableSpotlightUi - private val enableSpotlightUi: PlatformParameterValue, - @EnableInteractionConfigChangeStateRetention - private val enableInteractionConfigChangeStateRetention: PlatformParameterValue, - @EnableAppAndOsDeprecation - private val enableAppAndOsDeprecation: PlatformParameterValue, - @EnableNpsSurvey - private val enableNpsSurvey: PlatformParameterValue, - @EnableOnboardingFlowV2 - private val enableOnboardingFlowV2: PlatformParameterValue, - @EnableMultipleClassrooms - private val enableMultipleClassrooms: PlatformParameterValue, - @EnableTopicInfoTab - private val enableTopicInfoTab: PlatformParameterValue, - @EnableTopicPracticeTab - private val enableTopicPracticeTab: PlatformParameterValue, + @FeatureFlags + private val featureFlagsProvider: Provider>> ) { - /** - * A variable containing a list of all the feature flags in the app. - * - * @return a list of key-value pairs of [String] and [PlatformParameterValue] - */ - private var featureFlagItemMap: Map> = mapOf( - DOWNLOADS_SUPPORT to enableDownloadsSupport, - LEARNER_STUDY_ANALYTICS to enableLearnerStudyAnalytics, - FAST_LANGUAGE_SWITCHING_IN_LESSON to enableFastLanguageSwitchingInLesson, - LOGGING_LEARNER_STUDY_IDS to enableLoggingLearnerStudyIds, - EDIT_ACCOUNTS_OPTIONS_UI to enableEditAccountsOptionsUi, - ENABLE_PERFORMANCE_METRICS_COLLECTION to enablePerformanceMetricsCollection, - SPOTLIGHT_UI to enableSpotlightUi, - INTERACTION_CONFIG_CHANGE_STATE_RETENTION to enableInteractionConfigChangeStateRetention, - APP_AND_OS_DEPRECATION to enableAppAndOsDeprecation, - ENABLE_NPS_SURVEY to enableNpsSurvey, - ENABLE_ONBOARDING_FLOW_V2 to enableOnboardingFlowV2, - ENABLE_MULTIPLE_CLASSROOMS to enableMultipleClassrooms, - ENABLE_TOPIC_INFO_TAB to enableTopicInfoTab, - ENABLE_TOPIC_PRACTICE_TAB to enableTopicPracticeTab, - ) + private var featureFlagOverride: Map>? = null + private val featureFlagItemMap: Map> + get() = featureFlagOverride ?: featureFlagsProvider.get() /** * This method can be used to override the featureFlagItemMap and sets its value to the given map. @@ -102,27 +33,25 @@ class FeatureFlagsLogger @Inject constructor( * @param featureFlagItemMap denotes the map of feature flag names to their corresponding * [PlatformParameterValue]s */ - fun setFeatureFlagItemMap(featureFlagItemMap: Map>) { - this.featureFlagItemMap = featureFlagItemMap + fun setFeatureFlagItemMap( + featureFlagItemMap: Map> + ) { + featureFlagOverride = featureFlagItemMap } /** * This method logs the name, enabled status and sync status of all feature flags to Firebase. * + * This method should not be called until platform parameters and feature flags have been fully + * loaded (i.e. not too early in the application lifecycle). + * * @param appSessionId denotes the id of the current appInForeground session */ fun logAllFeatureFlags(appSessionId: String) { - val featureFlagItemList = mutableListOf() - for (flag in featureFlagItemMap) { - featureFlagItemList.add( - createFeatureFlagItemContext(flag) - ) - } - // TODO(#5341): Set the UUID value for this context val featureFlagContext = FeatureFlagListContext.newBuilder() .setAppSessionId(appSessionId) - .addAllFeatureFlags(featureFlagItemList) + .addAllFeatureFlags(featureFlagItemMap.map(::createFeatureFlagItemContext).sortedBy { it.id }) .build() analyticsController.logLowPriorityEvent( @@ -141,12 +70,12 @@ class FeatureFlagsLogger @Inject constructor( * @return an [EventLog.Context] for the feature flags to be logged */ private fun createFeatureFlagItemContext( - flagDetails: Map.Entry>, + flagDetails: Map.Entry>, ): FeatureFlagItemContext { - return FeatureFlagItemContext.newBuilder() - .setFlagName(flagDetails.key) - .setFlagEnabledState(flagDetails.value.value) - .setFlagSyncStatus(flagDetails.value.syncStatus) - .build() + return FeatureFlagItemContext.newBuilder().apply { + id = flagDetails.key + isEnabled = flagDetails.value.value + this.syncStatus = flagDetails.value.syncStatus + }.build() } } diff --git a/domain/src/main/java/org/oppia/android/domain/platformparameter/BUILD.bazel b/domain/src/main/java/org/oppia/android/domain/platformparameter/BUILD.bazel new file mode 100644 index 00000000000..fbb89228f88 --- /dev/null +++ b/domain/src/main/java/org/oppia/android/domain/platformparameter/BUILD.bazel @@ -0,0 +1,99 @@ +""" +Package for providing support for platform parameters and feature flags. +""" + +load("@io_bazel_rules_kotlin//kotlin:android.bzl", "kt_android_library") + +kt_android_library( + name = "annotations", + srcs = [ + "FeatureFlagIdKey.kt", + "FeatureFlags.kt", + ], + visibility = ["//:oppia_api_visibility"], + deps = [ + "//:dagger", + "//model/src/main/proto:platform_parameter_java_proto_lite", + "//third_party:javax_inject_javax_inject", + ], +) + +kt_android_library( + name = "controller", + srcs = ["PlatformParameterController.kt"], + visibility = ["//:oppia_api_visibility"], + deps = [ + "//model/src/main/proto:platform_parameter_java_proto_lite", + "//third_party:org_jetbrains_kotlinx_kotlinx-coroutines-core", + "//utility/src/main/java/org/oppia/android/util/data:data_provider", + ], +) + +kt_android_library( + name = "config_retriever", + srcs = ["PlatformParameterConfigRetriever.kt"], + visibility = ["//domain/src/main/java/org/oppia/android/domain/platformparameter/testing:__pkg__"], + deps = ["//model/src/main/proto:platform_parameter_java_proto_lite"], +) + +kt_android_library( + name = "process_state", + srcs = ["PlatformParameterProcessState.kt"], + deps = [ + "//model/src/main/proto:platform_parameter_java_proto_lite", + "//third_party:javax_inject_javax_inject", + ], +) + +# TODO(#5835): Remove the extra visibility exposure needed here once the test platform parameter +# module can be moved to part of the platform parameter testing package. +kt_android_library( + name = "prod_impl", + srcs = [ + "PlatformParameterConfigRetrieverProdImpl.kt", + "PlatformParameterControllerProdImpl.kt", + "PlatformParameterSingletonImpl.kt", + ], + visibility = [ + "//domain/src/main/java/org/oppia/android/domain/platformparameter/testing:__pkg__", + "//testing/src/main/java/org/oppia/android/testing/platformparameter:__pkg__", + ], + deps = [ + ":config_retriever", + ":controller", + ":process_state", + "//config/src/java/org/oppia/android/config:feature_flags_config", + "//config/src/java/org/oppia/android/config:platform_parameters_config", + "//data/src/main/java/org/oppia/android/data/persistence:cache_store", + "//domain/src/main/java/org/oppia/android/domain/oppialogger:oppia_logger", + "//model/src/main/proto:platform_parameter_java_proto_lite", + "//third_party:com_squareup_retrofit2_retrofit", + "//third_party:javax_inject_javax_inject", + "//third_party:org_jetbrains_kotlinx_kotlinx-coroutines-core", + "//utility", + "//utility/src/main/java/org/oppia/android/util/caching:asset_repository", + "//utility/src/main/java/org/oppia/android/util/data:data_provider", + "//utility/src/main/java/org/oppia/android/util/data:data_providers", + "//utility/src/main/java/org/oppia/android/util/extensions:context_extensions", + ], +) + +kt_android_library( + name = "prod_module", + srcs = [ + "FeatureFlagBindingModule.kt", + "FeatureFlagsMapBindingModule.kt", + "PlatformParameterBindingModule.kt", + "PlatformParameterModule.kt", + "PlatformParameterSingletonModule.kt", + ], + visibility = ["//:oppia_prod_module_visibility"], + deps = [ + ":annotations", + ":process_state", + ":prod_impl", + "//:dagger", + "//model/src/main/proto:platform_parameter_java_proto_lite", + "//utility", + ], +) diff --git a/domain/src/main/java/org/oppia/android/domain/platformparameter/FeatureFlagBindingModule.kt b/domain/src/main/java/org/oppia/android/domain/platformparameter/FeatureFlagBindingModule.kt new file mode 100644 index 00000000000..0366885afb9 --- /dev/null +++ b/domain/src/main/java/org/oppia/android/domain/platformparameter/FeatureFlagBindingModule.kt @@ -0,0 +1,108 @@ +package org.oppia.android.domain.platformparameter + +import dagger.Module +import dagger.Provides +import org.oppia.android.app.model.FeatureFlagId +import org.oppia.android.util.platformparameter.EnableAppAndOsDeprecation +import org.oppia.android.util.platformparameter.EnableDownloadsSupport +import org.oppia.android.util.platformparameter.EnableEditAccountsOptionsUi +import org.oppia.android.util.platformparameter.EnableFastLanguageSwitchingInLesson +import org.oppia.android.util.platformparameter.EnableInteractionConfigChangeStateRetention +import org.oppia.android.util.platformparameter.EnableLearnerStudyAnalytics +import org.oppia.android.util.platformparameter.EnableLoggingLearnerStudyIds +import org.oppia.android.util.platformparameter.EnableMultipleClassrooms +import org.oppia.android.util.platformparameter.EnableNpsSurvey +import org.oppia.android.util.platformparameter.EnableOnboardingFlowV2 +import org.oppia.android.util.platformparameter.EnablePerformanceMetricsCollection +import org.oppia.android.util.platformparameter.EnableSpotlightUi +import org.oppia.android.util.platformparameter.EnableTopicInfoTab +import org.oppia.android.util.platformparameter.EnableTopicPracticeTab +import org.oppia.android.util.platformparameter.PlatformParameterValue + +// TODO(#5835): Remove this module. +/** Dagger module for providing injectable bindings for feature flags. */ +@Module +class FeatureFlagBindingModule { + @Provides + @EnableDownloadsSupport + fun provideEnableDownloadsSupport(processState: PlatformParameterProcessState) = + processState.retrieveFeatureFlag(FeatureFlagId.DOWNLOADS_SUPPORT) + + @Provides + @EnableEditAccountsOptionsUi + fun provideEnableEditAccountsOptionsUi(processState: PlatformParameterProcessState) = + processState.retrieveFeatureFlag(FeatureFlagId.EDIT_ACCOUNTS_OPTIONS_UI) + + @Provides + @EnableLearnerStudyAnalytics + fun provideLearnerStudyAnalytics(processState: PlatformParameterProcessState) = + processState.retrieveFeatureFlag(FeatureFlagId.LEARNER_STUDY_ANALYTICS) + + @Provides + @EnableFastLanguageSwitchingInLesson + fun provideFastInLessonLanguageSwitching(processState: PlatformParameterProcessState) = + processState.retrieveFeatureFlag(FeatureFlagId.FAST_LANGUAGE_SWITCHING_IN_LESSON) + + @Provides + @EnableLoggingLearnerStudyIds + fun provideLoggingLearnerStudyIds(processState: PlatformParameterProcessState) = + processState.retrieveFeatureFlag(FeatureFlagId.LOGGING_LEARNER_STUDY_IDS) + + @Provides + @EnablePerformanceMetricsCollection + fun provideEnablePerformanceMetricCollection(processState: PlatformParameterProcessState) = + processState.retrieveFeatureFlag(FeatureFlagId.PERFORMANCE_METRICS_COLLECTION) + + @Provides + @EnableSpotlightUi + fun provideEnableSpotlightUi(processState: PlatformParameterProcessState) = + processState.retrieveFeatureFlag(FeatureFlagId.SPOTLIGHT_UI) + + @Provides + @EnableInteractionConfigChangeStateRetention + fun provideEnableInteractionConfigChangeStateRetention( + processState: PlatformParameterProcessState + ) = + processState.retrieveFeatureFlag(FeatureFlagId.INTERACTION_CONFIG_CHANGE_STATE_RETENTION) + + @Provides + @EnableAppAndOsDeprecation + fun provideEnableAppAndOsDeprecation(processState: PlatformParameterProcessState) = + processState.retrieveFeatureFlag(FeatureFlagId.APP_AND_OS_DEPRECATION) + + @Provides + @EnableNpsSurvey + fun provideEnableNpsSurvey(processState: PlatformParameterProcessState) = + processState.retrieveFeatureFlag(FeatureFlagId.NPS_SURVEY) + + @Provides + @EnableOnboardingFlowV2 + fun provideEnableOnboardingFlowV2(processState: PlatformParameterProcessState) = + processState.retrieveFeatureFlag(FeatureFlagId.ONBOARDING_FLOW_V2) + + @Provides + @EnableMultipleClassrooms + fun provideEnableMultipleClassrooms(processState: PlatformParameterProcessState) = + processState.retrieveFeatureFlag(FeatureFlagId.MULTIPLE_CLASSROOMS) + + @Provides + @EnableTopicInfoTab + fun provideEnableTopicInfoTab(processState: PlatformParameterProcessState) = + processState.retrieveFeatureFlag(FeatureFlagId.TOPIC_INFO_TAB) + + @Provides + @EnableTopicPracticeTab + fun provideEnableTopicPracticeTab(processState: PlatformParameterProcessState) = + processState.retrieveFeatureFlag(FeatureFlagId.TOPIC_PRACTICE_TAB) + + private companion object { + private fun PlatformParameterProcessState.retrieveFeatureFlag( + featureFlagId: FeatureFlagId + ): PlatformParameterValue { + return object : PlatformParameterValue { + override val value = retrieveFeatureFlagState(featureFlagId) + override val syncStatus = retrieveFeatureFlagSyncStatus(featureFlagId) + } + } + } +} diff --git a/domain/src/main/java/org/oppia/android/domain/platformparameter/FeatureFlagIdKey.kt b/domain/src/main/java/org/oppia/android/domain/platformparameter/FeatureFlagIdKey.kt new file mode 100644 index 00000000000..0ed2356d020 --- /dev/null +++ b/domain/src/main/java/org/oppia/android/domain/platformparameter/FeatureFlagIdKey.kt @@ -0,0 +1,10 @@ +package org.oppia.android.domain.platformparameter + +import dagger.MapKey +import org.oppia.android.app.model.FeatureFlagId + +/** + * Key for [FeatureFlags] to enable keying on [FeatureFlagId] for an injectable map of feature + * flags. + */ +@MapKey annotation class FeatureFlagIdKey(val id: FeatureFlagId) diff --git a/domain/src/main/java/org/oppia/android/domain/platformparameter/FeatureFlags.kt b/domain/src/main/java/org/oppia/android/domain/platformparameter/FeatureFlags.kt new file mode 100644 index 00000000000..c7b1336d9b3 --- /dev/null +++ b/domain/src/main/java/org/oppia/android/domain/platformparameter/FeatureFlags.kt @@ -0,0 +1,9 @@ +package org.oppia.android.domain.platformparameter + +import javax.inject.Qualifier + +/** + * Qualifier for an application-injectable map of feature flags keyed on + * [org.oppia.android.app.model.FeatureFlagId]. + */ +@Qualifier annotation class FeatureFlags diff --git a/domain/src/main/java/org/oppia/android/domain/platformparameter/FeatureFlagsMapBindingModule.kt b/domain/src/main/java/org/oppia/android/domain/platformparameter/FeatureFlagsMapBindingModule.kt new file mode 100644 index 00000000000..92f87134b05 --- /dev/null +++ b/domain/src/main/java/org/oppia/android/domain/platformparameter/FeatureFlagsMapBindingModule.kt @@ -0,0 +1,138 @@ +package org.oppia.android.domain.platformparameter + +import dagger.Binds +import dagger.Module +import dagger.multibindings.IntoMap +import org.oppia.android.app.model.FeatureFlagId +import org.oppia.android.util.platformparameter.EnableAppAndOsDeprecation +import org.oppia.android.util.platformparameter.EnableDownloadsSupport +import org.oppia.android.util.platformparameter.EnableEditAccountsOptionsUi +import org.oppia.android.util.platformparameter.EnableFastLanguageSwitchingInLesson +import org.oppia.android.util.platformparameter.EnableInteractionConfigChangeStateRetention +import org.oppia.android.util.platformparameter.EnableLearnerStudyAnalytics +import org.oppia.android.util.platformparameter.EnableLoggingLearnerStudyIds +import org.oppia.android.util.platformparameter.EnableMultipleClassrooms +import org.oppia.android.util.platformparameter.EnableNpsSurvey +import org.oppia.android.util.platformparameter.EnableOnboardingFlowV2 +import org.oppia.android.util.platformparameter.EnablePerformanceMetricsCollection +import org.oppia.android.util.platformparameter.EnableSpotlightUi +import org.oppia.android.util.platformparameter.EnableTopicInfoTab +import org.oppia.android.util.platformparameter.EnableTopicPracticeTab +import org.oppia.android.util.platformparameter.PlatformParameterValue + +// TODO(#5835): Remove this module. +/** Dagger module for providing a map of feature flags, per [FeatureFlags]. */ +@Module +interface FeatureFlagsMapBindingModule { + @Binds + @IntoMap + @FeatureFlags + @FeatureFlagIdKey(FeatureFlagId.DOWNLOADS_SUPPORT) + fun bindDownloadsSupport( + @EnableDownloadsSupport param: PlatformParameterValue + ): PlatformParameterValue + + @Binds + @IntoMap + @FeatureFlags + @FeatureFlagIdKey(FeatureFlagId.EDIT_ACCOUNTS_OPTIONS_UI) + fun bindEditAccountsOptionsUi( + @EnableEditAccountsOptionsUi param: PlatformParameterValue + ): PlatformParameterValue + + @Binds + @IntoMap + @FeatureFlags + @FeatureFlagIdKey(FeatureFlagId.LEARNER_STUDY_ANALYTICS) + fun bindLearnerStudyAnalytics( + @EnableLearnerStudyAnalytics param: PlatformParameterValue + ): PlatformParameterValue + + @Binds + @IntoMap + @FeatureFlags + @FeatureFlagIdKey(FeatureFlagId.FAST_LANGUAGE_SWITCHING_IN_LESSON) + fun bindFastLanguageSwitchingInLesson( + @EnableFastLanguageSwitchingInLesson param: PlatformParameterValue + ): PlatformParameterValue + + @Binds + @IntoMap + @FeatureFlags + @FeatureFlagIdKey(FeatureFlagId.LOGGING_LEARNER_STUDY_IDS) + fun bindLoggingLearnerStudyIds( + @EnableLoggingLearnerStudyIds param: PlatformParameterValue + ): PlatformParameterValue + + @Binds + @IntoMap + @FeatureFlags + @FeatureFlagIdKey(FeatureFlagId.PERFORMANCE_METRICS_COLLECTION) + fun bindPerformanceMetricsCollection( + @EnablePerformanceMetricsCollection param: PlatformParameterValue + ): PlatformParameterValue + + @Binds + @IntoMap + @FeatureFlags + @FeatureFlagIdKey(FeatureFlagId.SPOTLIGHT_UI) + fun bindSpotlightUi( + @EnableSpotlightUi param: PlatformParameterValue + ): PlatformParameterValue + + @Binds + @IntoMap + @FeatureFlags + @FeatureFlagIdKey(FeatureFlagId.INTERACTION_CONFIG_CHANGE_STATE_RETENTION) + fun bindInteractionConfigChangeStateRetention( + @EnableInteractionConfigChangeStateRetention param: PlatformParameterValue + ): PlatformParameterValue + + @Binds + @IntoMap + @FeatureFlags + @FeatureFlagIdKey(FeatureFlagId.APP_AND_OS_DEPRECATION) + fun bindAppAndOsDeprecation( + @EnableAppAndOsDeprecation param: PlatformParameterValue + ): PlatformParameterValue + + @Binds + @IntoMap + @FeatureFlags + @FeatureFlagIdKey(FeatureFlagId.NPS_SURVEY) + fun bindNpsSurvey( + @EnableNpsSurvey param: PlatformParameterValue + ): PlatformParameterValue + + @Binds + @IntoMap + @FeatureFlags + @FeatureFlagIdKey(FeatureFlagId.ONBOARDING_FLOW_V2) + fun bindOnboardingFlowV2( + @EnableOnboardingFlowV2 param: PlatformParameterValue + ): PlatformParameterValue + + @Binds + @IntoMap + @FeatureFlags + @FeatureFlagIdKey(FeatureFlagId.MULTIPLE_CLASSROOMS) + fun bindMultipleClassrooms( + @EnableMultipleClassrooms param: PlatformParameterValue + ): PlatformParameterValue + + @Binds + @IntoMap + @FeatureFlags + @FeatureFlagIdKey(FeatureFlagId.TOPIC_INFO_TAB) + fun bindTopicInfoTab( + @EnableTopicInfoTab param: PlatformParameterValue + ): PlatformParameterValue + + @Binds + @IntoMap + @FeatureFlags + @FeatureFlagIdKey(FeatureFlagId.TOPIC_PRACTICE_TAB) + fun bindTopicPracticeTab( + @EnableTopicPracticeTab param: PlatformParameterValue + ): PlatformParameterValue +} diff --git a/domain/src/main/java/org/oppia/android/domain/platformparameter/PlatformParameterAlphaModule.kt b/domain/src/main/java/org/oppia/android/domain/platformparameter/PlatformParameterAlphaModule.kt deleted file mode 100644 index 2a0d5e53c65..00000000000 --- a/domain/src/main/java/org/oppia/android/domain/platformparameter/PlatformParameterAlphaModule.kt +++ /dev/null @@ -1,353 +0,0 @@ -package org.oppia.android.domain.platformparameter - -import android.content.Context -import dagger.Module -import dagger.Provides -import org.oppia.android.util.extensions.getVersionCode -import org.oppia.android.util.platformparameter.APP_AND_OS_DEPRECATION -import org.oppia.android.util.platformparameter.CACHE_LATEX_RENDERING -import org.oppia.android.util.platformparameter.CACHE_LATEX_RENDERING_DEFAULT_VALUE -import org.oppia.android.util.platformparameter.CacheLatexRendering -import org.oppia.android.util.platformparameter.DOWNLOADS_SUPPORT -import org.oppia.android.util.platformparameter.EDIT_ACCOUNTS_OPTIONS_UI -import org.oppia.android.util.platformparameter.ENABLE_APP_AND_OS_DEPRECATION_DEFAULT_VALUE -import org.oppia.android.util.platformparameter.ENABLE_DOWNLOADS_SUPPORT_DEFAULT_VALUE -import org.oppia.android.util.platformparameter.ENABLE_EDIT_ACCOUNTS_OPTIONS_UI_DEFAULT_VALUE -import org.oppia.android.util.platformparameter.ENABLE_INTERACTION_CONFIG_CHANGE_STATE_RETENTION_DEFAULT_VALUE -import org.oppia.android.util.platformparameter.ENABLE_MULTIPLE_CLASSROOMS -import org.oppia.android.util.platformparameter.ENABLE_MULTIPLE_CLASSROOMS_DEFAULT_VALUE -import org.oppia.android.util.platformparameter.ENABLE_NPS_SURVEY -import org.oppia.android.util.platformparameter.ENABLE_NPS_SURVEY_DEFAULT_VALUE -import org.oppia.android.util.platformparameter.ENABLE_ONBOARDING_FLOW_V2 -import org.oppia.android.util.platformparameter.ENABLE_ONBOARDING_FLOW_V2_DEFAULT_VALUE -import org.oppia.android.util.platformparameter.ENABLE_PERFORMANCE_METRICS_COLLECTION -import org.oppia.android.util.platformparameter.ENABLE_PERFORMANCE_METRICS_COLLECTION_DEFAULT_VALUE -import org.oppia.android.util.platformparameter.ENABLE_TOPIC_INFO_TAB -import org.oppia.android.util.platformparameter.ENABLE_TOPIC_INFO_TAB_DEFAULT_VALUE -import org.oppia.android.util.platformparameter.EnableAppAndOsDeprecation -import org.oppia.android.util.platformparameter.EnableDownloadsSupport -import org.oppia.android.util.platformparameter.EnableEditAccountsOptionsUi -import org.oppia.android.util.platformparameter.EnableFastLanguageSwitchingInLesson -import org.oppia.android.util.platformparameter.EnableInteractionConfigChangeStateRetention -import org.oppia.android.util.platformparameter.EnableLearnerStudyAnalytics -import org.oppia.android.util.platformparameter.EnableLoggingLearnerStudyIds -import org.oppia.android.util.platformparameter.EnableMultipleClassrooms -import org.oppia.android.util.platformparameter.EnableNpsSurvey -import org.oppia.android.util.platformparameter.EnableOnboardingFlowV2 -import org.oppia.android.util.platformparameter.EnablePerformanceMetricsCollection -import org.oppia.android.util.platformparameter.EnableSpotlightUi -import org.oppia.android.util.platformparameter.EnableTopicInfoTab -import org.oppia.android.util.platformparameter.EnableTopicPracticeTab -import org.oppia.android.util.platformparameter.FAST_LANGUAGE_SWITCHING_IN_LESSON -import org.oppia.android.util.platformparameter.FAST_LANGUAGE_SWITCHING_IN_LESSON_DEFAULT_VALUE -import org.oppia.android.util.platformparameter.FORCED_APP_UPDATE_VERSION_CODE -import org.oppia.android.util.platformparameter.ForcedAppUpdateVersionCode -import org.oppia.android.util.platformparameter.INTERACTION_CONFIG_CHANGE_STATE_RETENTION -import org.oppia.android.util.platformparameter.LEARNER_STUDY_ANALYTICS -import org.oppia.android.util.platformparameter.LOGGING_LEARNER_STUDY_IDS -import org.oppia.android.util.platformparameter.LOGGING_LEARNER_STUDY_IDS_DEFAULT_VALUE -import org.oppia.android.util.platformparameter.LOWEST_SUPPORTED_API_LEVEL -import org.oppia.android.util.platformparameter.LOWEST_SUPPORTED_API_LEVEL_DEFAULT_VALUE -import org.oppia.android.util.platformparameter.LowestSupportedApiLevel -import org.oppia.android.util.platformparameter.NPS_SURVEY_GRACE_PERIOD_IN_DAYS -import org.oppia.android.util.platformparameter.NPS_SURVEY_GRACE_PERIOD_IN_DAYS_DEFAULT_VALUE -import org.oppia.android.util.platformparameter.NPS_SURVEY_MINIMUM_AGGREGATE_LEARNING_TIME_IN_A_TOPIC_IN_MINUTES -import org.oppia.android.util.platformparameter.NPS_SURVEY_MINIMUM_AGGREGATE_LEARNING_TIME_IN_A_TOPIC_IN_MINUTES_DEFAULT_VALUE -import org.oppia.android.util.platformparameter.NpsSurveyGracePeriodInDays -import org.oppia.android.util.platformparameter.NpsSurveyMinimumAggregateLearningTimeInATopicInMinutes -import org.oppia.android.util.platformparameter.OPTIONAL_APP_UPDATE_VERSION_CODE -import org.oppia.android.util.platformparameter.OptionalAppUpdateVersionCode -import org.oppia.android.util.platformparameter.PERFORMANCE_METRICS_COLLECTION_HIGH_FREQUENCY_TIME_INTERVAL_IN_MINUTES -import org.oppia.android.util.platformparameter.PERFORMANCE_METRICS_COLLECTION_HIGH_FREQUENCY_TIME_INTERVAL_IN_MINUTES_DEFAULT_VAL -import org.oppia.android.util.platformparameter.PERFORMANCE_METRICS_COLLECTION_LOW_FREQUENCY_TIME_INTERVAL_IN_MINUTES -import org.oppia.android.util.platformparameter.PERFORMANCE_METRICS_COLLECTION_LOW_FREQUENCY_TIME_INTERVAL_IN_MINUTES_DEFAULT_VAL -import org.oppia.android.util.platformparameter.PERFORMANCE_METRICS_COLLECTION_UPLOAD_TIME_INTERVAL_IN_MINUTES -import org.oppia.android.util.platformparameter.PERFORMANCE_METRICS_COLLECTION_UPLOAD_TIME_INTERVAL_IN_MINUTES_DEFAULT_VAL -import org.oppia.android.util.platformparameter.PerformanceMetricsCollectionHighFrequencyTimeIntervalInMinutes -import org.oppia.android.util.platformparameter.PerformanceMetricsCollectionLowFrequencyTimeIntervalInMinutes -import org.oppia.android.util.platformparameter.PerformanceMetricsCollectionUploadTimeIntervalInMinutes -import org.oppia.android.util.platformparameter.PlatformParameterSingleton -import org.oppia.android.util.platformparameter.PlatformParameterValue -import org.oppia.android.util.platformparameter.SPLASH_SCREEN_WELCOME_MSG -import org.oppia.android.util.platformparameter.SPLASH_SCREEN_WELCOME_MSG_DEFAULT_VALUE -import org.oppia.android.util.platformparameter.SPOTLIGHT_UI -import org.oppia.android.util.platformparameter.SYNC_UP_WORKER_TIME_PERIOD_IN_HOURS -import org.oppia.android.util.platformparameter.SYNC_UP_WORKER_TIME_PERIOD_IN_HOURS_DEFAULT_VALUE -import org.oppia.android.util.platformparameter.SplashScreenWelcomeMsg -import org.oppia.android.util.platformparameter.SyncUpWorkerTimePeriodHours - -/** Dagger module that provides bindings for platform parameters for the alpha app builds. */ -@Module -class PlatformParameterAlphaModule { - @Provides - @EnableDownloadsSupport - fun provideEnableDownloadsSupport( - platformParameterSingleton: PlatformParameterSingleton - ): PlatformParameterValue { - return platformParameterSingleton.getBooleanPlatformParameter(DOWNLOADS_SUPPORT) - ?: PlatformParameterValue.createDefaultParameter(ENABLE_DOWNLOADS_SUPPORT_DEFAULT_VALUE) - } - - @Provides - @SplashScreenWelcomeMsg - fun provideSplashScreenWelcomeMsgParam( - platformParameterSingleton: PlatformParameterSingleton - ): PlatformParameterValue { - return platformParameterSingleton.getBooleanPlatformParameter(SPLASH_SCREEN_WELCOME_MSG) - ?: PlatformParameterValue.createDefaultParameter(SPLASH_SCREEN_WELCOME_MSG_DEFAULT_VALUE) - } - - @Provides - @SyncUpWorkerTimePeriodHours - fun provideSyncUpWorkerTimePeriod( - platformParameterSingleton: PlatformParameterSingleton - ): PlatformParameterValue { - return platformParameterSingleton.getIntegerPlatformParameter( - SYNC_UP_WORKER_TIME_PERIOD_IN_HOURS - ) ?: PlatformParameterValue.createDefaultParameter( - SYNC_UP_WORKER_TIME_PERIOD_IN_HOURS_DEFAULT_VALUE - ) - } - - @Provides - @EnableEditAccountsOptionsUi - fun provideEnableEditAccountsOptionsUi( - platformParameterSingleton: PlatformParameterSingleton - ): PlatformParameterValue { - return platformParameterSingleton.getBooleanPlatformParameter( - EDIT_ACCOUNTS_OPTIONS_UI - ) ?: PlatformParameterValue.createDefaultParameter( - ENABLE_EDIT_ACCOUNTS_OPTIONS_UI_DEFAULT_VALUE - ) - } - - @Provides - @EnableLearnerStudyAnalytics - fun provideLearnerStudyAnalytics( - platformParameterSingleton: PlatformParameterSingleton - ): PlatformParameterValue { - return platformParameterSingleton.getBooleanPlatformParameter(LEARNER_STUDY_ANALYTICS) - ?: PlatformParameterValue.createDefaultParameter(true) - } - - @Provides - @EnableFastLanguageSwitchingInLesson - fun provideFastInLessonLanguageSwitching( - platformParameterSingleton: PlatformParameterSingleton - ): PlatformParameterValue { - return platformParameterSingleton.getBooleanPlatformParameter(FAST_LANGUAGE_SWITCHING_IN_LESSON) - ?: PlatformParameterValue.createDefaultParameter( - FAST_LANGUAGE_SWITCHING_IN_LESSON_DEFAULT_VALUE - ) - } - - @Provides - @EnableLoggingLearnerStudyIds - fun provideLoggingLearnerStudyIds( - platformParameterSingleton: PlatformParameterSingleton - ): PlatformParameterValue { - return platformParameterSingleton.getBooleanPlatformParameter(LOGGING_LEARNER_STUDY_IDS) - ?: PlatformParameterValue.createDefaultParameter(LOGGING_LEARNER_STUDY_IDS_DEFAULT_VALUE) - } - - @Provides - @CacheLatexRendering - fun provideCacheLatexRendering( - platformParameterSingleton: PlatformParameterSingleton - ): PlatformParameterValue { - return platformParameterSingleton.getBooleanPlatformParameter(CACHE_LATEX_RENDERING) - ?: PlatformParameterValue.createDefaultParameter(CACHE_LATEX_RENDERING_DEFAULT_VALUE) - } - - @Provides - @EnablePerformanceMetricsCollection - fun provideEnablePerformanceMetricCollection( - platformParameterSingleton: PlatformParameterSingleton - ): PlatformParameterValue { - return platformParameterSingleton.getBooleanPlatformParameter( - ENABLE_PERFORMANCE_METRICS_COLLECTION - ) ?: PlatformParameterValue.createDefaultParameter( - ENABLE_PERFORMANCE_METRICS_COLLECTION_DEFAULT_VALUE - ) - } - - @Provides - @PerformanceMetricsCollectionUploadTimeIntervalInMinutes - fun providePerformanceMetricsCollectionUploadTimeIntervalInMinutes( - platformParameterSingleton: PlatformParameterSingleton - ): PlatformParameterValue { - return platformParameterSingleton.getIntegerPlatformParameter( - PERFORMANCE_METRICS_COLLECTION_UPLOAD_TIME_INTERVAL_IN_MINUTES - ) ?: PlatformParameterValue.createDefaultParameter( - PERFORMANCE_METRICS_COLLECTION_UPLOAD_TIME_INTERVAL_IN_MINUTES_DEFAULT_VAL - ) - } - - @Provides - @PerformanceMetricsCollectionHighFrequencyTimeIntervalInMinutes - fun providePerformanceMetricsCollectionHighFrequencyTimeIntervalInMinutes( - platformParameterSingleton: PlatformParameterSingleton - ): PlatformParameterValue { - return platformParameterSingleton.getIntegerPlatformParameter( - PERFORMANCE_METRICS_COLLECTION_HIGH_FREQUENCY_TIME_INTERVAL_IN_MINUTES - ) ?: PlatformParameterValue.createDefaultParameter( - PERFORMANCE_METRICS_COLLECTION_HIGH_FREQUENCY_TIME_INTERVAL_IN_MINUTES_DEFAULT_VAL - ) - } - - @Provides - @PerformanceMetricsCollectionLowFrequencyTimeIntervalInMinutes - fun providePerformanceMetricsCollectionLowFrequencyTimeIntervalInMinutes( - platformParameterSingleton: PlatformParameterSingleton - ): PlatformParameterValue { - return platformParameterSingleton.getIntegerPlatformParameter( - PERFORMANCE_METRICS_COLLECTION_LOW_FREQUENCY_TIME_INTERVAL_IN_MINUTES - ) ?: PlatformParameterValue.createDefaultParameter( - PERFORMANCE_METRICS_COLLECTION_LOW_FREQUENCY_TIME_INTERVAL_IN_MINUTES_DEFAULT_VAL - ) - } - - @Provides - @EnableSpotlightUi - fun provideEnableSpotlightUi( - platformParameterSingleton: PlatformParameterSingleton - ): PlatformParameterValue { - return platformParameterSingleton.getBooleanPlatformParameter(SPOTLIGHT_UI) - ?: PlatformParameterValue.createDefaultParameter(true) // Enable spotlights for alpha users. - } - - @Provides - @EnableInteractionConfigChangeStateRetention - fun provideEnableInteractionConfigChangeStateRetention( - platformParameterSingleton: PlatformParameterSingleton - ): PlatformParameterValue { - return platformParameterSingleton.getBooleanPlatformParameter( - INTERACTION_CONFIG_CHANGE_STATE_RETENTION - ) ?: PlatformParameterValue.createDefaultParameter( - ENABLE_INTERACTION_CONFIG_CHANGE_STATE_RETENTION_DEFAULT_VALUE - ) - } - - @Provides - @EnableAppAndOsDeprecation - fun provideEnableAppAndOsDeprecation( - platformParameterSingleton: PlatformParameterSingleton - ): PlatformParameterValue { - return platformParameterSingleton.getBooleanPlatformParameter(APP_AND_OS_DEPRECATION) - ?: PlatformParameterValue.createDefaultParameter( - ENABLE_APP_AND_OS_DEPRECATION_DEFAULT_VALUE - ) - } - - @Provides - @OptionalAppUpdateVersionCode - fun provideOptionalAppUpdateVersionCode( - platformParameterSingleton: PlatformParameterSingleton, - context: Context - ): PlatformParameterValue { - return platformParameterSingleton.getIntegerPlatformParameter( - OPTIONAL_APP_UPDATE_VERSION_CODE - ) ?: PlatformParameterValue.createDefaultParameter( - context.getVersionCode() - ) - } - - @Provides - @ForcedAppUpdateVersionCode - fun provideForcedAppUpdateVersionCode( - platformParameterSingleton: PlatformParameterSingleton, - context: Context - ): PlatformParameterValue { - return platformParameterSingleton.getIntegerPlatformParameter( - FORCED_APP_UPDATE_VERSION_CODE - ) ?: PlatformParameterValue.createDefaultParameter( - context.getVersionCode() - ) - } - - @Provides - @LowestSupportedApiLevel - fun provideLowestSupportedApiLevel( - platformParameterSingleton: PlatformParameterSingleton - ): PlatformParameterValue { - return platformParameterSingleton.getIntegerPlatformParameter( - LOWEST_SUPPORTED_API_LEVEL - ) ?: PlatformParameterValue.createDefaultParameter( - LOWEST_SUPPORTED_API_LEVEL_DEFAULT_VALUE - ) - } - - @Provides - @NpsSurveyGracePeriodInDays - fun provideNpsSurveyGracePeriodInDays( - platformParameterSingleton: PlatformParameterSingleton - ): PlatformParameterValue { - return platformParameterSingleton.getIntegerPlatformParameter( - NPS_SURVEY_GRACE_PERIOD_IN_DAYS - ) ?: PlatformParameterValue.createDefaultParameter( - NPS_SURVEY_GRACE_PERIOD_IN_DAYS_DEFAULT_VALUE - ) - } - - @Provides - @NpsSurveyMinimumAggregateLearningTimeInATopicInMinutes - fun provideNpsSurveyMinimumAggregateLearningTimeInATopicInMinutes( - platformParameterSingleton: PlatformParameterSingleton - ): PlatformParameterValue { - return platformParameterSingleton.getIntegerPlatformParameter( - NPS_SURVEY_MINIMUM_AGGREGATE_LEARNING_TIME_IN_A_TOPIC_IN_MINUTES - ) ?: PlatformParameterValue.createDefaultParameter( - NPS_SURVEY_MINIMUM_AGGREGATE_LEARNING_TIME_IN_A_TOPIC_IN_MINUTES_DEFAULT_VALUE - ) - } - - @Provides - @EnableNpsSurvey - fun provideEnableNpsSurvey( - platformParameterSingleton: PlatformParameterSingleton - ): PlatformParameterValue { - return platformParameterSingleton.getBooleanPlatformParameter(ENABLE_NPS_SURVEY) - ?: PlatformParameterValue.createDefaultParameter( - ENABLE_NPS_SURVEY_DEFAULT_VALUE - ) - } - - @Provides - @EnableOnboardingFlowV2 - fun provideEnableOnboardingFlowV2( - platformParameterSingleton: PlatformParameterSingleton - ): PlatformParameterValue { - return platformParameterSingleton.getBooleanPlatformParameter(ENABLE_ONBOARDING_FLOW_V2) - ?: PlatformParameterValue.createDefaultParameter( - ENABLE_ONBOARDING_FLOW_V2_DEFAULT_VALUE - ) - } - - @Provides - @EnableMultipleClassrooms - fun provideEnableMultipleClassrooms( - platformParameterSingleton: PlatformParameterSingleton - ): PlatformParameterValue { - return platformParameterSingleton.getBooleanPlatformParameter(ENABLE_MULTIPLE_CLASSROOMS) - ?: PlatformParameterValue.createDefaultParameter( - ENABLE_MULTIPLE_CLASSROOMS_DEFAULT_VALUE - ) - } - - @Provides - @EnableTopicInfoTab - fun provideEnableTopicInfoTab( - platformParameterSingleton: PlatformParameterSingleton - ): PlatformParameterValue { - return platformParameterSingleton.getBooleanPlatformParameter(ENABLE_TOPIC_INFO_TAB) - ?: PlatformParameterValue.createDefaultParameter( - ENABLE_TOPIC_INFO_TAB_DEFAULT_VALUE - ) - } - - @Provides - @EnableTopicPracticeTab - fun provideEnableTopicPracticeTab(): PlatformParameterValue { - return PlatformParameterValue.createDefaultParameter(true) - } -} diff --git a/domain/src/main/java/org/oppia/android/domain/platformparameter/PlatformParameterBindingModule.kt b/domain/src/main/java/org/oppia/android/domain/platformparameter/PlatformParameterBindingModule.kt new file mode 100644 index 00000000000..77ebd06ebaf --- /dev/null +++ b/domain/src/main/java/org/oppia/android/domain/platformparameter/PlatformParameterBindingModule.kt @@ -0,0 +1,110 @@ +package org.oppia.android.domain.platformparameter + +import dagger.Module +import dagger.Provides +import org.oppia.android.app.model.PlatformParameterId +import org.oppia.android.app.model.SyncStatus +import org.oppia.android.util.platformparameter.CacheLatexRendering +import org.oppia.android.util.platformparameter.ForcedAppUpdateVersionCode +import org.oppia.android.util.platformparameter.LowestSupportedApiLevel +import org.oppia.android.util.platformparameter.NpsSurveyGracePeriodInDays +import org.oppia.android.util.platformparameter.NpsSurveyMinimumAggregateLearningTimeInATopicInMinutes +import org.oppia.android.util.platformparameter.OptionalAppUpdateVersionCode +import org.oppia.android.util.platformparameter.PerformanceMetricsCollectionHighFrequencyTimeIntervalInMinutes +import org.oppia.android.util.platformparameter.PerformanceMetricsCollectionLowFrequencyTimeIntervalInMinutes +import org.oppia.android.util.platformparameter.PerformanceMetricsCollectionUploadTimeIntervalInMinutes +import org.oppia.android.util.platformparameter.PlatformParameterValue +import org.oppia.android.util.platformparameter.SplashScreenWelcomeMsg +import org.oppia.android.util.platformparameter.SyncUpWorkerTimePeriodHours + +// TODO(#5835): Remove this module. +/** Dagger module for providing injectable bindings for platform parameters. */ +@Module +class PlatformParameterBindingModule { + @Provides + @SplashScreenWelcomeMsg + fun provideSplashScreenWelcomeMsgParam(processState: PlatformParameterProcessState) = + processState.retrieveBooleanParameter(PlatformParameterId.SPLASH_SCREEN_WELCOME_MESSAGE) + + @Provides + @SyncUpWorkerTimePeriodHours + fun provideSyncUpWorkerTimePeriod(processState: PlatformParameterProcessState) = + processState.retrieveIntParameter(PlatformParameterId.SYNC_UP_WORKER_TIME_PERIOD_IN_HOURS) + + @Provides + @CacheLatexRendering + fun provideCacheLatexRendering(processState: PlatformParameterProcessState) = + processState.retrieveBooleanParameter(PlatformParameterId.CACHE_LATEX_RENDERING) + + @Provides + @PerformanceMetricsCollectionUploadTimeIntervalInMinutes + fun providePerformanceMetricsCollectionUploadTimeIntervalInMinutes( + processState: PlatformParameterProcessState + ) = processState.retrieveIntParameter( + PlatformParameterId.PERFORMANCE_METRICS_COLLECTION_UPLOAD_TIME_INTERVAL_IN_MINUTES + ) + + @Provides + @PerformanceMetricsCollectionHighFrequencyTimeIntervalInMinutes + fun providePerformanceMetricsCollectionHighFrequencyTimeIntervalInMinutes( + processState: PlatformParameterProcessState + ) = processState.retrieveIntParameter( + PlatformParameterId.PERFORMANCE_METRICS_COLLECTION_HIGH_FREQUENCY_TIME_INTERVAL_IN_MINUTES + ) + + @Provides + @PerformanceMetricsCollectionLowFrequencyTimeIntervalInMinutes + fun providePerformanceMetricsCollectionLowFrequencyTimeIntervalInMinutes( + processState: PlatformParameterProcessState + ) = processState.retrieveIntParameter( + PlatformParameterId.PERFORMANCE_METRICS_COLLECTION_LOW_FREQUENCY_TIME_INTERVAL_IN_MINUTES + ) + + @Provides + @OptionalAppUpdateVersionCode + fun provideOptionalAppUpdateVersionCode(processState: PlatformParameterProcessState) = + processState.retrieveIntParameter(PlatformParameterId.OPTIONAL_APP_UPDATE_VERSION_CODE) + + @Provides + @ForcedAppUpdateVersionCode + fun provideForcedAppUpdateVersionCode(processState: PlatformParameterProcessState) = + processState.retrieveIntParameter(PlatformParameterId.FORCED_APP_UPDATE_VERSION_CODE) + + @Provides + @LowestSupportedApiLevel + fun provideLowestSupportedApiLevel(processState: PlatformParameterProcessState) = + processState.retrieveIntParameter(PlatformParameterId.LOWEST_SUPPORTED_API_LEVEL) + + @Provides + @NpsSurveyGracePeriodInDays + fun provideNpsSurveyGracePeriodInDays(processState: PlatformParameterProcessState) = + processState.retrieveIntParameter(PlatformParameterId.NPS_SURVEY_GRACE_PERIOD_IN_DAYS) + + @Provides + @NpsSurveyMinimumAggregateLearningTimeInATopicInMinutes + fun provideNpsSurveyMinimumAggregateLearningTimeInATopicInMinutes( + processState: PlatformParameterProcessState + ) = processState.retrieveIntParameter( + PlatformParameterId.NPS_SURVEY_MINIMUM_AGGREGATE_LEARNING_TIME_IN_A_TOPIC_IN_MINUTES + ) + + private companion object { + private fun PlatformParameterProcessState.retrieveIntParameter( + platformParameterId: PlatformParameterId + ): PlatformParameterValue { + return object : PlatformParameterValue { + override val value = retrievePlatformParameterIntegerState(platformParameterId) + override val syncStatus = SyncStatus.SYNC_STATUS_UNSPECIFIED + } + } + + private fun PlatformParameterProcessState.retrieveBooleanParameter( + platformParameterId: PlatformParameterId + ): PlatformParameterValue { + return object : PlatformParameterValue { + override val value = retrievePlatformParameterBooleanState(platformParameterId) + override val syncStatus = SyncStatus.SYNC_STATUS_UNSPECIFIED + } + } + } +} diff --git a/domain/src/main/java/org/oppia/android/domain/platformparameter/PlatformParameterConfigRetriever.kt b/domain/src/main/java/org/oppia/android/domain/platformparameter/PlatformParameterConfigRetriever.kt new file mode 100644 index 00000000000..bf49dda57bf --- /dev/null +++ b/domain/src/main/java/org/oppia/android/domain/platformparameter/PlatformParameterConfigRetriever.kt @@ -0,0 +1,16 @@ +package org.oppia.android.domain.platformparameter + +import org.oppia.android.app.model.SupportedFeatureFlags +import org.oppia.android.app.model.SupportedPlatformParameters + +/** Retriever for platform parameter and feature flag definitions from the app's embedded assets. */ +interface PlatformParameterConfigRetriever { + /** + * Returns the [SupportedPlatformParameters] configuration for the app, or default instance if + * none. + */ + fun loadSupportedPlatformParameters(): SupportedPlatformParameters + + /** Returns the [SupportedFeatureFlags] configuration for the app, or default instance if none. */ + fun loadSupportedFeatureFlags(): SupportedFeatureFlags +} diff --git a/domain/src/main/java/org/oppia/android/domain/platformparameter/PlatformParameterConfigRetrieverProdImpl.kt b/domain/src/main/java/org/oppia/android/domain/platformparameter/PlatformParameterConfigRetrieverProdImpl.kt new file mode 100644 index 00000000000..ac298bf5c80 --- /dev/null +++ b/domain/src/main/java/org/oppia/android/domain/platformparameter/PlatformParameterConfigRetrieverProdImpl.kt @@ -0,0 +1,28 @@ +package org.oppia.android.domain.platformparameter + +import org.oppia.android.app.model.SupportedFeatureFlags +import org.oppia.android.app.model.SupportedPlatformParameters +import org.oppia.android.util.caching.AssetRepository +import javax.inject.Inject + +/** Production implementation of [PlatformParameterConfigRetriever]. */ +class PlatformParameterConfigRetrieverProdImpl @Inject constructor( + private val assetRepository: AssetRepository +) : PlatformParameterConfigRetriever { + // TODO(#5835): Add tests for this class. + + override fun loadSupportedPlatformParameters(): SupportedPlatformParameters { + return assetRepository.tryLoadProtoFromLocalAssets( + "platform_parameters", SupportedPlatformParameters.getDefaultInstance() + ) + } + + override fun loadSupportedFeatureFlags(): SupportedFeatureFlags { + val featureFlagOverrides = assetRepository.tryLoadProtoFromLocalAssets( + "feature_flags_overrides", SupportedFeatureFlags.getDefaultInstance() + ) + return assetRepository.tryLoadProtoFromLocalAssets( + "feature_flags", SupportedFeatureFlags.getDefaultInstance() + ).toBuilder().mergeFrom(featureFlagOverrides).build() + } +} diff --git a/domain/src/main/java/org/oppia/android/domain/platformparameter/PlatformParameterController.kt b/domain/src/main/java/org/oppia/android/domain/platformparameter/PlatformParameterController.kt index 7298fe27e61..44fc0bd5f2d 100644 --- a/domain/src/main/java/org/oppia/android/domain/platformparameter/PlatformParameterController.kt +++ b/domain/src/main/java/org/oppia/android/domain/platformparameter/PlatformParameterController.kt @@ -1,96 +1,58 @@ package org.oppia.android.domain.platformparameter import kotlinx.coroutines.Deferred -import org.oppia.android.app.model.PlatformParameter -import org.oppia.android.app.model.RemotePlatformParameterDatabase -import org.oppia.android.data.persistence.PersistentCacheStore -import org.oppia.android.util.data.AsyncResult import org.oppia.android.util.data.DataProvider -import org.oppia.android.util.data.DataProviders -import org.oppia.android.util.data.DataProviders.Companion.transform -import org.oppia.android.util.platformparameter.PlatformParameterSingleton -import javax.inject.Inject -import javax.inject.Singleton - -/** Controller for fetching and updating platform parameters in the database. */ -@Singleton -class PlatformParameterController @Inject constructor( - cacheStoreFactory: PersistentCacheStore.Factory, - private val dataProviders: DataProviders, - platformParameterSingleton: PlatformParameterSingleton -) { - private val platformParameterDatabaseStore = cacheStoreFactory.create( - PLATFORM_PARAMETER_DATABASE_NAME, - RemotePlatformParameterDatabase.getDefaultInstance() - ) - - /** The state of the platform parameter caching process. */ - private enum class PlatformParameterCachingStatus { - /** Whether the caching operation corresponding to this status was successful. */ - SUCCESS - } - - companion object { - /** ID for all the data providers used in [PlatformParameterController]. */ - private const val PLATFORM_PARAMETER_DATA_PROVIDER_ID = "platform_parameter_data_provider_id" - /** Name of the platform parameter database in cache store. */ - private const val PLATFORM_PARAMETER_DATABASE_NAME = "platform_parameter_database" - } - - private val platformParameterDataProvider by lazy { - // After this transformation the cached List of Platform Parameters gets converted into a simple - // map where the keys corresponds to the name of Platform Parameter and value will correspond to - // the PlatformParameter object itself - platformParameterDatabaseStore.transform(PLATFORM_PARAMETER_DATA_PROVIDER_ID) { - platformParameterDatabase -> - val platformParameterMap = mutableMapOf() - platformParameterDatabase.platformParameterList.forEach { - platformParameterMap[it.name] = it - } - platformParameterSingleton.setPlatformParameterMap(platformParameterMap) - return@transform - } - } +/** Controller for managing and synchronizing platform parameters and feature flags. */ +interface PlatformParameterController { /** - * Updates the platform parameter database in cache store. + * Ensures platform parameter and feature flag states are properly loaded and able to be directly + * injected through Dagger. + * + * This method *must* be called before attempting to inject any platform parameters or feature + * flags. Note that platform parameters and feature flags will not have state changes after this + * method is called for the lifetime of the process. + * + * It's safe to call this method more than once, even after loading, as the returned [Deferred] + * will be the same across calls and complete when parameters have finished loading. For UI-bound + * observers of this state, use [getParameterInitializationStatus]. * - * @param platformParameterList list of [PlatformParameter] objects which needs to be cached - * @return a [DataProvider] that indicates the success/failure of this update operation + * @return a [Deferred] that indicates the completion of loading parameters. Note that the + * [Deferred] will fail if something went wrong. Also, the actual value returned does not have + * any significant meaning. */ - fun updatePlatformParameterDatabase( - platformParameterList: List - ): DataProvider { - val deferredTask = platformParameterDatabaseStore.storeDataWithCustomChannelAsync( - updateInMemoryCache = false - ) { - Pair( - it.toBuilder().addAllPlatformParameter(platformParameterList).build(), - PlatformParameterCachingStatus.SUCCESS - ) - } - return dataProviders.createInMemoryDataProviderAsync(PLATFORM_PARAMETER_DATA_PROVIDER_ID) { - return@createInMemoryDataProviderAsync getDeferredResult(deferredTask) - } - } + fun loadParametersAsync(): Deferred /** - * Executes and transforms the [Deferred] task into an [AsyncResult]. + * Returns a [DataProvider] that will switch from a value of 'false' to 'true' when parameters + * have finished loading. * - * @param deferred task which needs to be executed - * @return async result for success or failure after the execution of deferred task + * This method and the returned [DataProvider] are safe to use for the lifetime of the process, + * even before [loadParametersAsync] is called. Calling this method will not initiate any actual + * initialization--[loadParametersAsync] must be used for that, instead. + * + * The returned [DataProvider] will never return a pending state, nor will it represent the + * failure state if parameter loading via [loadParametersAsync] fails. */ - private suspend fun getDeferredResult( - deferred: Deferred - ): AsyncResult { - return when (deferred.await()) { - PlatformParameterCachingStatus.SUCCESS -> AsyncResult.Success(null) - } - } + fun getParameterInitializationStatus(): DataProvider /** - * Returns a [DataProvider] which can be used to confirm that PlatformParameterDatabase read - * process has been completed. + * Downloads all Android app-specific platform parameters and feature flag states from the remote + * Oppia web server. + * + * This method must be called after [loadParametersAsync] and, specifically, after parameters + * have finished loading. + * + * Note that the parameter and flag states downloaded from Oppia web will be saved locally but + * will not affect parameter or flag state in the currently running app process. These changes do + * not take effect until the next time [loadParametersAsync] is called (that is, upon the next app + * start). + * + * Note that the returned [DataProvider] will never have a pending state and will never have more + * than one success/fail result. + * + * @return a [DataProvider] that indicates the success/failure of downloading parameters. Note + * that the actual value returned does not have any significant meaning. */ - fun getParameterDatabase(): DataProvider = platformParameterDataProvider + fun downloadRemoteParameters(): DataProvider } diff --git a/domain/src/main/java/org/oppia/android/domain/platformparameter/PlatformParameterControllerProdImpl.kt b/domain/src/main/java/org/oppia/android/domain/platformparameter/PlatformParameterControllerProdImpl.kt new file mode 100644 index 00000000000..c0cc08ddbba --- /dev/null +++ b/domain/src/main/java/org/oppia/android/domain/platformparameter/PlatformParameterControllerProdImpl.kt @@ -0,0 +1,239 @@ +package org.oppia.android.domain.platformparameter + +import kotlinx.coroutines.CoroutineDispatcher +import kotlinx.coroutines.CoroutineScope +import kotlinx.coroutines.Deferred +import kotlinx.coroutines.async +import kotlinx.coroutines.flow.MutableStateFlow +import org.oppia.android.app.model.FeatureFlagDefinition +import org.oppia.android.app.model.PlatformParameterDefinition +import org.oppia.android.app.model.PlatformParameterValue +import org.oppia.android.app.model.RemoteFeatureFlag +import org.oppia.android.app.model.RemotePlatformParameter +import org.oppia.android.app.model.RemotePlatformParameterAndFeatureFlagDatabase +import org.oppia.android.app.model.SyncStatus +import org.oppia.android.data.persistence.PersistentCacheStore +import org.oppia.android.domain.oppialogger.OppiaLogger +import org.oppia.android.util.data.AsyncResult +import org.oppia.android.util.data.DataProvider +import org.oppia.android.util.data.DataProviders +import org.oppia.android.util.threading.BackgroundDispatcher +import javax.inject.Inject + +/** + * Production implementation for the controller to manage and synchronize platform parameters and + * feature flags. + */ +class PlatformParameterControllerProdImpl( + cacheStoreFactory: PersistentCacheStore.Factory, + private val dataProviders: DataProviders, + private val configRetriever: PlatformParameterConfigRetriever, + private val processState: PlatformParameterProcessState, + private val oppiaLogger: OppiaLogger, + private val backgroundCoroutineDispatcher: CoroutineDispatcher, +) : PlatformParameterController { + private val databaseStore by lazy { + cacheStoreFactory.create( + DATABASE_NAME, RemotePlatformParameterAndFeatureFlagDatabase.getDefaultInstance() + ) + } + // Note that the 'by lazy' here guarantees thread-safe and singleton initialization. + private val initializationDeferred by lazy { loadParametersInternalAsync() } + private val parametersAreLoadedFlow by lazy { MutableStateFlow(false) } + + init { + // Ensure that parameters and flags are fully loaded ahead of a call to retrieveData() since + // loadRemotePlatformParameters() needs to guarantee that the existing parameters are loaded + // despite any later calls to downloadRemoteParameters(). Note that this will also guarantee + // that the file is created on-disk (which is fine--it will just initially be empty). + databaseStore.primeInMemoryAndDiskCacheAsync( + updateMode = PersistentCacheStore.UpdateMode.UPDATE_IF_NEW_CACHE, + publishMode = PersistentCacheStore.PublishMode.PUBLISH_TO_IN_MEMORY_CACHE + ).invokeOnCompletion { failure -> + if (failure != null) { + oppiaLogger.e( + "PlatformParameterController", "Failed to load platform params/feature flags.", failure + ) + } + } + } + + override fun loadParametersAsync() = initializationDeferred + + override fun getParameterInitializationStatus(): DataProvider { + return dataProviders.run { + parametersAreLoadedFlow.convertToAutomaticDataProvider( + GET_PARAMETER_INITIALIZATION_STATUS_PROVIDER_ID + ) + } + } + + override fun downloadRemoteParameters(): DataProvider { + check(parametersAreLoadedFlow.value) { + "Can only remotely download parameters after they have been loaded." + } + return dataProviders.createInMemoryDataProviderAsync(DOWNLOAD_REMOTE_PARAMETERS_PROVIDER_ID) { + // TODO(#5835): Finish implementing forcing remote parameter downloads. + + // Erase the data provider's value so that callers cannot inadvertently depend on the actual + // list of parameters available. + return@createInMemoryDataProviderAsync AsyncResult.Success(Unit) + } + } + + /** + * Synchronously loads and returns the known remotely downloaded platform parameters. + * + * The returned value should be fixed even if [downloadRemoteParameters] is called. + * + * This should only ever be called by package-specific implementations of + * [PlatformParameterController]. + */ + suspend fun loadRemotePlatformParameters(): List { + return databaseStore.readDataAsync().await().remotePlatformParameterList + } + + /** + * Synchronously loads and returns the known remotely downloaded feature flags. + * + * The returned value should be fixed even if [downloadRemoteParameters] is called. + * + * This should only ever be called by package-specific implementations of + * [PlatformParameterController]. + */ + suspend fun loadRemoteFeatureFlags(): List { + return databaseStore.readDataAsync().await().remoteFeatureFlagList + } + + /** + * Returns the list of [PlatformParameterDefinition]s configured for this build of the app. + * + * This should only ever be called by package-specific implementations of + * [PlatformParameterController]. + */ + fun loadSupportedPlatformParameters(): List { + return configRetriever.loadSupportedPlatformParameters().platformParameterDefinitionList + } + + /** + * Returns the list of [FeatureFlagDefinition]s configured for this build of the app. + * + * This should only ever be called by package-specific implementations of + * [PlatformParameterController]. + */ + fun loadSupportedFeatureFlags(): List { + return configRetriever.loadSupportedFeatureFlags().featureFlagDefinitionList + } + + private fun loadParametersInternalAsync(): Deferred { + return CoroutineScope(backgroundCoroutineDispatcher).async { + val params = loadAllParameterStates() + + // Synchronize injectable parameter and flag state. + val platformParams = params.filterIsInstance() + val featureFlags = params.filterIsInstance() + val platStatesById = platformParams.associate { it.definition.id to it.computeCurrentState() } + val flagStatesById = featureFlags.associate { it.definition.id to it.computeCurrentState() } + val statusesById = featureFlags.associate { it.definition.id to it.computeCurrentStatus() } + processState.initializePlatformParameters(platStatesById) + processState.initializeFeatureFlags(flagStatesById) + processState.initializeFeatureFlagSyncStatuses(statusesById) + + // Let observers know that parameters have been initialized. + parametersAreLoadedFlow.value = true + + // Erase the data provider's value so that callers cannot inadvertently depend on the actual + // list of parameters available. + } + } + + private suspend fun loadAllParameterStates(): List { + val remoteParamById = loadRemotePlatformParameters().associateBy { it.id } + val remoteFlagById = loadRemoteFeatureFlags().associateBy { it.id } + return loadSupportedPlatformParameters().map { paramDefinition -> + ParameterState.PlatformParameter(paramDefinition, remoteParamById[paramDefinition.id]) + } + loadSupportedFeatureFlags().map { flagDefinition -> + ParameterState.FeatureFlag(flagDefinition, remoteFlagById[flagDefinition.id]) + } + } + + /** An application-scoped factory for building new [PlatformParameterControllerProdImpl]s. */ + // TODO(#5835): Remove this factory once the hack for initializing parameters in tests is gone. + class Factory @Inject constructor( + private val cacheStoreFactory: PersistentCacheStore.Factory, + private val dataProviders: DataProviders, + private val configRetriever: PlatformParameterConfigRetriever, + private val oppiaLogger: OppiaLogger, + @BackgroundDispatcher private val backgroundCoroutineDispatcher: CoroutineDispatcher, + ) { + /** + * Returns a new [PlatformParameterControllerProdImpl] for the specified [processState]. + * + * This method should only ever be called once since there should only ever be one instance of + * [PlatformParameterController] for the lifetime of an Oppia Android application process. + */ + fun create(processState: PlatformParameterProcessState): PlatformParameterControllerProdImpl { + return PlatformParameterControllerProdImpl( + cacheStoreFactory, dataProviders, configRetriever, processState, oppiaLogger, + backgroundCoroutineDispatcher + ) + } + } + + /** + * An abstract representation of either a platform parameter or feature flag, incorporating both + * the default and remote versions. + */ + private sealed class ParameterState { + /** + * A representation of a single platform parameter incorporating both its local definition state + * and its remotely downloaded state, if any. + * + * @property definition the definition of the parameter + * @property remote the remotely downloaded version of the parameter, or null if none + */ + data class PlatformParameter( + val definition: PlatformParameterDefinition, + val remote: RemotePlatformParameter? + ) : ParameterState() { + /** + * Returns the current value of the parameter, first prioritizing its remotely downloaded + * value (if any) and falling back to its default value. + */ + fun computeCurrentState(): PlatformParameterValue = + remote?.remoteValue ?: definition.defaultValue + } + + /** + * A representation of a single feature flag incorporating both its local definition state and + * its remotely downloaded state, if any. + * + * @property definition the definition of the flag + * @property remote the remotely downloaded version of the flag, or null if none + */ + data class FeatureFlag( + val definition: FeatureFlagDefinition, + val remote: RemoteFeatureFlag? + ) : ParameterState() { + /** + * Returns the current enabled state of the flag, first prioritizing its remotely downloaded + * value (if any) and falling back to its default value. + */ + fun computeCurrentState(): Boolean = remote?.remoteIsEnabled ?: definition.defaultIsEnabled + + /** + * Returns the [SyncStatus] of this flag depending on whether it has been successfully synced + * remotely from the Oppia web server. + */ + fun computeCurrentStatus(): SyncStatus = + remote?.syncStatus ?: SyncStatus.NOT_SYNCED_FROM_SERVER + } + } + + private companion object { + private const val GET_PARAMETER_INITIALIZATION_STATUS_PROVIDER_ID = + "get_parameter_initialization_status" + private const val DOWNLOAD_REMOTE_PARAMETERS_PROVIDER_ID = "download_remote_parameters" + private const val DATABASE_NAME = "platform_parameter_and_feature_flag_database" + } +} diff --git a/domain/src/main/java/org/oppia/android/domain/platformparameter/PlatformParameterModule.kt b/domain/src/main/java/org/oppia/android/domain/platformparameter/PlatformParameterModule.kt index 344e819c078..ff641105fbc 100644 --- a/domain/src/main/java/org/oppia/android/domain/platformparameter/PlatformParameterModule.kt +++ b/domain/src/main/java/org/oppia/android/domain/platformparameter/PlatformParameterModule.kt @@ -1,362 +1,56 @@ package org.oppia.android.domain.platformparameter -import android.content.Context +import dagger.Binds import dagger.Module import dagger.Provides -import org.oppia.android.util.extensions.getVersionCode -import org.oppia.android.util.platformparameter.APP_AND_OS_DEPRECATION -import org.oppia.android.util.platformparameter.CACHE_LATEX_RENDERING -import org.oppia.android.util.platformparameter.CACHE_LATEX_RENDERING_DEFAULT_VALUE -import org.oppia.android.util.platformparameter.CacheLatexRendering -import org.oppia.android.util.platformparameter.DOWNLOADS_SUPPORT -import org.oppia.android.util.platformparameter.EDIT_ACCOUNTS_OPTIONS_UI -import org.oppia.android.util.platformparameter.ENABLE_APP_AND_OS_DEPRECATION_DEFAULT_VALUE -import org.oppia.android.util.platformparameter.ENABLE_DOWNLOADS_SUPPORT_DEFAULT_VALUE -import org.oppia.android.util.platformparameter.ENABLE_EDIT_ACCOUNTS_OPTIONS_UI_DEFAULT_VALUE -import org.oppia.android.util.platformparameter.ENABLE_INTERACTION_CONFIG_CHANGE_STATE_RETENTION_DEFAULT_VALUE -import org.oppia.android.util.platformparameter.ENABLE_MULTIPLE_CLASSROOMS -import org.oppia.android.util.platformparameter.ENABLE_MULTIPLE_CLASSROOMS_DEFAULT_VALUE -import org.oppia.android.util.platformparameter.ENABLE_NPS_SURVEY -import org.oppia.android.util.platformparameter.ENABLE_NPS_SURVEY_DEFAULT_VALUE -import org.oppia.android.util.platformparameter.ENABLE_ONBOARDING_FLOW_V2 -import org.oppia.android.util.platformparameter.ENABLE_ONBOARDING_FLOW_V2_DEFAULT_VALUE -import org.oppia.android.util.platformparameter.ENABLE_PERFORMANCE_METRICS_COLLECTION -import org.oppia.android.util.platformparameter.ENABLE_PERFORMANCE_METRICS_COLLECTION_DEFAULT_VALUE -import org.oppia.android.util.platformparameter.ENABLE_SPOTLIGHT_UI_DEFAULT_VALUE -import org.oppia.android.util.platformparameter.ENABLE_TOPIC_INFO_TAB -import org.oppia.android.util.platformparameter.ENABLE_TOPIC_INFO_TAB_DEFAULT_VALUE -import org.oppia.android.util.platformparameter.ENABLE_TOPIC_PRACTICE_TAB -import org.oppia.android.util.platformparameter.ENABLE_TOPIC_PRACTICE_TAB_DEFAULT_VALUE -import org.oppia.android.util.platformparameter.EnableAppAndOsDeprecation -import org.oppia.android.util.platformparameter.EnableDownloadsSupport -import org.oppia.android.util.platformparameter.EnableEditAccountsOptionsUi -import org.oppia.android.util.platformparameter.EnableFastLanguageSwitchingInLesson -import org.oppia.android.util.platformparameter.EnableInteractionConfigChangeStateRetention -import org.oppia.android.util.platformparameter.EnableLearnerStudyAnalytics -import org.oppia.android.util.platformparameter.EnableLoggingLearnerStudyIds -import org.oppia.android.util.platformparameter.EnableMultipleClassrooms -import org.oppia.android.util.platformparameter.EnableNpsSurvey -import org.oppia.android.util.platformparameter.EnableOnboardingFlowV2 -import org.oppia.android.util.platformparameter.EnablePerformanceMetricsCollection -import org.oppia.android.util.platformparameter.EnableSpotlightUi -import org.oppia.android.util.platformparameter.EnableTopicInfoTab -import org.oppia.android.util.platformparameter.EnableTopicPracticeTab -import org.oppia.android.util.platformparameter.FAST_LANGUAGE_SWITCHING_IN_LESSON -import org.oppia.android.util.platformparameter.FAST_LANGUAGE_SWITCHING_IN_LESSON_DEFAULT_VALUE -import org.oppia.android.util.platformparameter.FORCED_APP_UPDATE_VERSION_CODE -import org.oppia.android.util.platformparameter.ForcedAppUpdateVersionCode -import org.oppia.android.util.platformparameter.INTERACTION_CONFIG_CHANGE_STATE_RETENTION -import org.oppia.android.util.platformparameter.LEARNER_STUDY_ANALYTICS -import org.oppia.android.util.platformparameter.LEARNER_STUDY_ANALYTICS_DEFAULT_VALUE -import org.oppia.android.util.platformparameter.LOGGING_LEARNER_STUDY_IDS -import org.oppia.android.util.platformparameter.LOGGING_LEARNER_STUDY_IDS_DEFAULT_VALUE -import org.oppia.android.util.platformparameter.LOWEST_SUPPORTED_API_LEVEL -import org.oppia.android.util.platformparameter.LOWEST_SUPPORTED_API_LEVEL_DEFAULT_VALUE -import org.oppia.android.util.platformparameter.LowestSupportedApiLevel -import org.oppia.android.util.platformparameter.NPS_SURVEY_GRACE_PERIOD_IN_DAYS -import org.oppia.android.util.platformparameter.NPS_SURVEY_GRACE_PERIOD_IN_DAYS_DEFAULT_VALUE -import org.oppia.android.util.platformparameter.NPS_SURVEY_MINIMUM_AGGREGATE_LEARNING_TIME_IN_A_TOPIC_IN_MINUTES -import org.oppia.android.util.platformparameter.NPS_SURVEY_MINIMUM_AGGREGATE_LEARNING_TIME_IN_A_TOPIC_IN_MINUTES_DEFAULT_VALUE -import org.oppia.android.util.platformparameter.NpsSurveyGracePeriodInDays -import org.oppia.android.util.platformparameter.NpsSurveyMinimumAggregateLearningTimeInATopicInMinutes -import org.oppia.android.util.platformparameter.OPTIONAL_APP_UPDATE_VERSION_CODE -import org.oppia.android.util.platformparameter.OptionalAppUpdateVersionCode -import org.oppia.android.util.platformparameter.PERFORMANCE_METRICS_COLLECTION_HIGH_FREQUENCY_TIME_INTERVAL_IN_MINUTES -import org.oppia.android.util.platformparameter.PERFORMANCE_METRICS_COLLECTION_HIGH_FREQUENCY_TIME_INTERVAL_IN_MINUTES_DEFAULT_VAL -import org.oppia.android.util.platformparameter.PERFORMANCE_METRICS_COLLECTION_LOW_FREQUENCY_TIME_INTERVAL_IN_MINUTES -import org.oppia.android.util.platformparameter.PERFORMANCE_METRICS_COLLECTION_LOW_FREQUENCY_TIME_INTERVAL_IN_MINUTES_DEFAULT_VAL -import org.oppia.android.util.platformparameter.PERFORMANCE_METRICS_COLLECTION_UPLOAD_TIME_INTERVAL_IN_MINUTES -import org.oppia.android.util.platformparameter.PERFORMANCE_METRICS_COLLECTION_UPLOAD_TIME_INTERVAL_IN_MINUTES_DEFAULT_VAL -import org.oppia.android.util.platformparameter.PerformanceMetricsCollectionHighFrequencyTimeIntervalInMinutes -import org.oppia.android.util.platformparameter.PerformanceMetricsCollectionLowFrequencyTimeIntervalInMinutes -import org.oppia.android.util.platformparameter.PerformanceMetricsCollectionUploadTimeIntervalInMinutes -import org.oppia.android.util.platformparameter.PlatformParameterSingleton -import org.oppia.android.util.platformparameter.PlatformParameterValue -import org.oppia.android.util.platformparameter.SPLASH_SCREEN_WELCOME_MSG -import org.oppia.android.util.platformparameter.SPLASH_SCREEN_WELCOME_MSG_DEFAULT_VALUE -import org.oppia.android.util.platformparameter.SPOTLIGHT_UI -import org.oppia.android.util.platformparameter.SYNC_UP_WORKER_TIME_PERIOD_IN_HOURS -import org.oppia.android.util.platformparameter.SYNC_UP_WORKER_TIME_PERIOD_IN_HOURS_DEFAULT_VALUE -import org.oppia.android.util.platformparameter.SplashScreenWelcomeMsg -import org.oppia.android.util.platformparameter.SyncUpWorkerTimePeriodHours +import javax.inject.Singleton /** Dagger module that provides bindings for platform parameters. */ -@Module -class PlatformParameterModule { - @Provides - @EnableDownloadsSupport - fun provideEnableDownloadsSupport( - platformParameterSingleton: PlatformParameterSingleton - ): PlatformParameterValue { - return platformParameterSingleton.getBooleanPlatformParameter(DOWNLOADS_SUPPORT) - ?: PlatformParameterValue.createDefaultParameter(ENABLE_DOWNLOADS_SUPPORT_DEFAULT_VALUE) - } - - @Provides - @SplashScreenWelcomeMsg - fun provideSplashScreenWelcomeMsgParam( - platformParameterSingleton: PlatformParameterSingleton - ): PlatformParameterValue { - return platformParameterSingleton.getBooleanPlatformParameter(SPLASH_SCREEN_WELCOME_MSG) - ?: PlatformParameterValue.createDefaultParameter(SPLASH_SCREEN_WELCOME_MSG_DEFAULT_VALUE) - } - - @Provides - @SyncUpWorkerTimePeriodHours - fun provideSyncUpWorkerTimePeriod( - platformParameterSingleton: PlatformParameterSingleton - ): PlatformParameterValue { - return platformParameterSingleton.getIntegerPlatformParameter( - SYNC_UP_WORKER_TIME_PERIOD_IN_HOURS - ) ?: PlatformParameterValue.createDefaultParameter( - SYNC_UP_WORKER_TIME_PERIOD_IN_HOURS_DEFAULT_VALUE - ) - } - - @Provides - @EnableEditAccountsOptionsUi - fun provideEnableEditAccountsOptionsUi( - platformParameterSingleton: PlatformParameterSingleton - ): PlatformParameterValue { - return platformParameterSingleton.getBooleanPlatformParameter( - EDIT_ACCOUNTS_OPTIONS_UI - ) ?: PlatformParameterValue.createDefaultParameter( - ENABLE_EDIT_ACCOUNTS_OPTIONS_UI_DEFAULT_VALUE - ) - } - - @Provides - @EnableLearnerStudyAnalytics - fun provideLearnerStudyAnalytics( - platformParameterSingleton: PlatformParameterSingleton - ): PlatformParameterValue { - return platformParameterSingleton.getBooleanPlatformParameter(LEARNER_STUDY_ANALYTICS) - ?: PlatformParameterValue.createDefaultParameter(LEARNER_STUDY_ANALYTICS_DEFAULT_VALUE) - } - - @Provides - @EnableFastLanguageSwitchingInLesson - fun provideFastInLessonLanguageSwitching( - platformParameterSingleton: PlatformParameterSingleton - ): PlatformParameterValue { - return platformParameterSingleton.getBooleanPlatformParameter(FAST_LANGUAGE_SWITCHING_IN_LESSON) - ?: PlatformParameterValue.createDefaultParameter( - FAST_LANGUAGE_SWITCHING_IN_LESSON_DEFAULT_VALUE - ) - } - - @Provides - @EnableLoggingLearnerStudyIds - fun provideLoggingLearnerStudyIds( - platformParameterSingleton: PlatformParameterSingleton - ): PlatformParameterValue { - return platformParameterSingleton.getBooleanPlatformParameter(LOGGING_LEARNER_STUDY_IDS) - ?: PlatformParameterValue.createDefaultParameter(LOGGING_LEARNER_STUDY_IDS_DEFAULT_VALUE) - } - - @Provides - @CacheLatexRendering - fun provideCacheLatexRendering( - platformParameterSingleton: PlatformParameterSingleton - ): PlatformParameterValue { - return platformParameterSingleton.getBooleanPlatformParameter(CACHE_LATEX_RENDERING) - ?: PlatformParameterValue.createDefaultParameter(CACHE_LATEX_RENDERING_DEFAULT_VALUE) - } - - @Provides - @EnablePerformanceMetricsCollection - fun provideEnablePerformanceMetricCollection( - platformParameterSingleton: PlatformParameterSingleton - ): PlatformParameterValue { - return platformParameterSingleton.getBooleanPlatformParameter( - ENABLE_PERFORMANCE_METRICS_COLLECTION - ) ?: PlatformParameterValue.createDefaultParameter( - ENABLE_PERFORMANCE_METRICS_COLLECTION_DEFAULT_VALUE - ) - } - - @Provides - @PerformanceMetricsCollectionUploadTimeIntervalInMinutes - fun providePerformanceMetricsCollectionUploadTimeIntervalInMinutes( - platformParameterSingleton: PlatformParameterSingleton - ): PlatformParameterValue { - return platformParameterSingleton.getIntegerPlatformParameter( - PERFORMANCE_METRICS_COLLECTION_UPLOAD_TIME_INTERVAL_IN_MINUTES - ) ?: PlatformParameterValue.createDefaultParameter( - PERFORMANCE_METRICS_COLLECTION_UPLOAD_TIME_INTERVAL_IN_MINUTES_DEFAULT_VAL - ) - } - - @Provides - @PerformanceMetricsCollectionHighFrequencyTimeIntervalInMinutes - fun providePerformanceMetricsCollectionHighFrequencyTimeIntervalInMinutes( - platformParameterSingleton: PlatformParameterSingleton - ): PlatformParameterValue { - return platformParameterSingleton.getIntegerPlatformParameter( - PERFORMANCE_METRICS_COLLECTION_HIGH_FREQUENCY_TIME_INTERVAL_IN_MINUTES - ) ?: PlatformParameterValue.createDefaultParameter( - PERFORMANCE_METRICS_COLLECTION_HIGH_FREQUENCY_TIME_INTERVAL_IN_MINUTES_DEFAULT_VAL - ) - } - - @Provides - @PerformanceMetricsCollectionLowFrequencyTimeIntervalInMinutes - fun providePerformanceMetricsCollectionLowFrequencyTimeIntervalInMinutes( - platformParameterSingleton: PlatformParameterSingleton - ): PlatformParameterValue { - return platformParameterSingleton.getIntegerPlatformParameter( - PERFORMANCE_METRICS_COLLECTION_LOW_FREQUENCY_TIME_INTERVAL_IN_MINUTES - ) ?: PlatformParameterValue.createDefaultParameter( - PERFORMANCE_METRICS_COLLECTION_LOW_FREQUENCY_TIME_INTERVAL_IN_MINUTES_DEFAULT_VAL - ) - } - - @Provides - @EnableSpotlightUi - fun provideEnableSpotlightUi( - platformParameterSingleton: PlatformParameterSingleton - ): PlatformParameterValue { - return platformParameterSingleton.getBooleanPlatformParameter(SPOTLIGHT_UI) - ?: PlatformParameterValue.createDefaultParameter(ENABLE_SPOTLIGHT_UI_DEFAULT_VALUE) - } - - @Provides - @EnableInteractionConfigChangeStateRetention - fun provideEnableInteractionConfigChangeStateRetention( - platformParameterSingleton: PlatformParameterSingleton - ): PlatformParameterValue { - return platformParameterSingleton.getBooleanPlatformParameter( - INTERACTION_CONFIG_CHANGE_STATE_RETENTION - ) ?: PlatformParameterValue.createDefaultParameter( - ENABLE_INTERACTION_CONFIG_CHANGE_STATE_RETENTION_DEFAULT_VALUE - ) - } - - @Provides - @EnableAppAndOsDeprecation - fun provideEnableAppAndOsDeprecation( - platformParameterSingleton: PlatformParameterSingleton - ): PlatformParameterValue { - return platformParameterSingleton.getBooleanPlatformParameter(APP_AND_OS_DEPRECATION) - ?: PlatformParameterValue.createDefaultParameter( - ENABLE_APP_AND_OS_DEPRECATION_DEFAULT_VALUE - ) - } - - @Provides - @OptionalAppUpdateVersionCode - fun provideOptionalAppUpdateVersionCode( - platformParameterSingleton: PlatformParameterSingleton, - context: Context - ): PlatformParameterValue { - return platformParameterSingleton.getIntegerPlatformParameter( - OPTIONAL_APP_UPDATE_VERSION_CODE - ) ?: PlatformParameterValue.createDefaultParameter( - context.getVersionCode() - ) - } - - @Provides - @ForcedAppUpdateVersionCode - fun provideForcedAppUpdateVersionCode( - platformParameterSingleton: PlatformParameterSingleton, - context: Context - ): PlatformParameterValue { - return platformParameterSingleton.getIntegerPlatformParameter( - FORCED_APP_UPDATE_VERSION_CODE - ) ?: PlatformParameterValue.createDefaultParameter( - context.getVersionCode() - ) - } - - @Provides - @LowestSupportedApiLevel - fun provideLowestSupportedApiLevel( - platformParameterSingleton: PlatformParameterSingleton - ): PlatformParameterValue { - return platformParameterSingleton.getIntegerPlatformParameter( - LOWEST_SUPPORTED_API_LEVEL - ) ?: PlatformParameterValue.createDefaultParameter( - LOWEST_SUPPORTED_API_LEVEL_DEFAULT_VALUE - ) - } - - @Provides - @NpsSurveyGracePeriodInDays - fun provideNpsSurveyGracePeriodInDays( - platformParameterSingleton: PlatformParameterSingleton - ): PlatformParameterValue { - return platformParameterSingleton.getIntegerPlatformParameter( - NPS_SURVEY_GRACE_PERIOD_IN_DAYS - ) ?: PlatformParameterValue.createDefaultParameter( - NPS_SURVEY_GRACE_PERIOD_IN_DAYS_DEFAULT_VALUE - ) - } - - @Provides - @NpsSurveyMinimumAggregateLearningTimeInATopicInMinutes - fun provideNpsSurveyMinimumAggregateLearningTimeInATopicInMinutes( - platformParameterSingleton: PlatformParameterSingleton - ): PlatformParameterValue { - return platformParameterSingleton.getIntegerPlatformParameter( - NPS_SURVEY_MINIMUM_AGGREGATE_LEARNING_TIME_IN_A_TOPIC_IN_MINUTES - ) ?: PlatformParameterValue.createDefaultParameter( - NPS_SURVEY_MINIMUM_AGGREGATE_LEARNING_TIME_IN_A_TOPIC_IN_MINUTES_DEFAULT_VALUE - ) - } - - @Provides - @EnableNpsSurvey - fun provideEnableNpsSurvey( - platformParameterSingleton: PlatformParameterSingleton - ): PlatformParameterValue { - return platformParameterSingleton.getBooleanPlatformParameter(ENABLE_NPS_SURVEY) - ?: PlatformParameterValue.createDefaultParameter( - ENABLE_NPS_SURVEY_DEFAULT_VALUE - ) - } - - @Provides - @EnableOnboardingFlowV2 - fun provideEnableOnboardingFlowV2( - platformParameterSingleton: PlatformParameterSingleton - ): PlatformParameterValue { - return platformParameterSingleton.getBooleanPlatformParameter(ENABLE_ONBOARDING_FLOW_V2) - ?: PlatformParameterValue.createDefaultParameter( - ENABLE_ONBOARDING_FLOW_V2_DEFAULT_VALUE - ) - } - - @Provides - @EnableMultipleClassrooms - fun provideEnableMultipleClassrooms( - platformParameterSingleton: PlatformParameterSingleton - ): PlatformParameterValue { - return platformParameterSingleton.getBooleanPlatformParameter(ENABLE_MULTIPLE_CLASSROOMS) - ?: PlatformParameterValue.createDefaultParameter( - ENABLE_MULTIPLE_CLASSROOMS_DEFAULT_VALUE - ) - } - - @Provides - @EnableTopicInfoTab - fun provideEnableTopicInfoTab( - platformParameterSingleton: PlatformParameterSingleton - ): PlatformParameterValue { - return platformParameterSingleton.getBooleanPlatformParameter(ENABLE_TOPIC_INFO_TAB) - ?: PlatformParameterValue.createDefaultParameter( - ENABLE_TOPIC_INFO_TAB_DEFAULT_VALUE - ) - } - - @Provides - @EnableTopicPracticeTab - fun provideEnableTopicPracticeTab( - platformParameterSingleton: PlatformParameterSingleton - ): PlatformParameterValue { - return platformParameterSingleton.getBooleanPlatformParameter(ENABLE_TOPIC_PRACTICE_TAB) - ?: PlatformParameterValue.createDefaultParameter( - ENABLE_TOPIC_PRACTICE_TAB_DEFAULT_VALUE - ) +@Module( + includes = [ + FeatureFlagsMapBindingModule::class, + FeatureFlagBindingModule::class, + PlatformParameterBindingModule::class, + PlatformParameterModule.PlatformParameterProcessStateModule::class, + PlatformParameterModule.PlatformParameterControllerProdImplModule::class + ] +) +interface PlatformParameterModule { + @Binds + fun bindPlatformParameterController( + impl: PlatformParameterControllerProdImpl + ): PlatformParameterController + + @Binds + fun bindPlatformParameterConfigRetriever( + impl: PlatformParameterConfigRetrieverProdImpl + ): PlatformParameterConfigRetriever + + // TODO(#5835): Remove this and make PlatformParameterProcessState injectable once the hack for + // initializing platform parameters in tests is no longer needed. + /** + * Dagger module for providing the application-wide instance of [PlatformParameterProcessState]. + */ + @Module + class PlatformParameterProcessStateModule { + @Provides + @Singleton + fun providePlatformParameterProcessState() = PlatformParameterProcessState() + } + + // TODO(#5835): Remove this and make PlatformParameterControllerProdImpl injectable once the hack + // for initializing platform parameters in tests is no longer needed. + /** + * Dagger module for providing the application-wide instance of + * [PlatformParameterControllerProdImpl]. + */ + @Module + class PlatformParameterControllerProdImplModule { + @Provides + @Singleton + fun providePlatformParameterControllerProdImpl( + platformParameterProcessState: PlatformParameterProcessState, + factory: PlatformParameterControllerProdImpl.Factory + ) = factory.create(platformParameterProcessState) } } diff --git a/domain/src/main/java/org/oppia/android/domain/platformparameter/PlatformParameterProcessState.kt b/domain/src/main/java/org/oppia/android/domain/platformparameter/PlatformParameterProcessState.kt new file mode 100644 index 00000000000..9c4415d1a1f --- /dev/null +++ b/domain/src/main/java/org/oppia/android/domain/platformparameter/PlatformParameterProcessState.kt @@ -0,0 +1,165 @@ +package org.oppia.android.domain.platformparameter + +import org.oppia.android.app.model.FeatureFlagId +import org.oppia.android.app.model.PlatformParameterId +import org.oppia.android.app.model.PlatformParameterValue +import org.oppia.android.app.model.SyncStatus + +/** + * The represented state of all platform parameters and feature flags for the lifetime of the + * current Oppia Android application process. + * + * This class is ultimately managed by implementations of [PlatformParameterController] and + * leveraged by bridge Dagger modules for providing actual injectable values for production and test + * code. It is never expected to be used outside of the platform parameter package. + * + * Only one instance of this class should exist and be used for the lifetime of the application. It + * also enforces strong guarantees that a flag and parameter cannot change its value for the + * lifetime of the application. It also guarantees that in configurable environments (such as tests) + * that flags and parameters cannot be used before they're properly initialized (to avoid test state + * synchronization race conditions). + */ +class PlatformParameterProcessState { + // TODO(#5835): Add tests for this class. + + private lateinit var platformParameters: Map + private lateinit var featureFlags: Map + private lateinit var featureFlagSyncStatuses: Map + + /** + * Initializes platform parameter states for the lifetime of the application. + * + * The provided values should already consider remote values, if any are present. + * + * This method can only be called once and must be called before attempting to retrieve any + * parameter values. + */ + fun initializePlatformParameters(states: Map) { + check(!::platformParameters.isInitialized) { + "Attempting to initialize platform parameter states twice." + } + platformParameters = states + } + + /** + * Initializes feature flag states for the lifetime of the application. + * + * The provided values should already consider remote values, if any are present. + * + * This method can only be called once and must be called before attempting to retrieve any + * feature flag enabled states. + */ + fun initializeFeatureFlags(states: Map) { + check(!::featureFlags.isInitialized) { "Attempting to initialize feature flag states twice." } + featureFlags = states + } + + /** + * Initializes feature flag sync statuses for the lifetime of the application. + * + * This method can only be called once and must be called before attempting to retrieve any + * feature flag sync statuses. + */ + fun initializeFeatureFlagSyncStatuses(syncStatuses: Map) { + check(!::featureFlagSyncStatuses.isInitialized) { + "Attempting to initialize feature flag sync statuses twice." + } + featureFlagSyncStatuses = syncStatuses + } + + /** + * Returns the boolean value for the specified platform parameter given by [id]. + * + * The value returned by this method is guaranteed to be constant for the lifetime of the + * application. Also, an exception will be thrown if any of the following occur: + * - This method is called before [initializePlatformParameters]. + * - If the specified [id] is invalid. + * - If the specified [id] was missing during initialization (which would indicate an + * initialization issue). + * - If the specified [id] does not correspond to a boolean platform parameter. + */ + fun retrievePlatformParameterBooleanState(id: PlatformParameterId): Boolean { + // TODO(#5835): Update this & the other init error messages below to reference OppiaTestRule. + check(::platformParameters.isInitialized) { + "Attempting to access platform parameter $id before initialization." + + " If this is a test, is it using TestPlatformParameterModule?" + } + val value = platformParameters.getValue(id) + check(value.valueTypeCase == PlatformParameterValue.ValueTypeCase.BOOLEAN) { + "Expected a value of type boolean for parameter $id, but found: $value." + } + return value.boolean + } + + /** + * Returns the integer value for the specified platform parameter given by [id]. + * + * This method provides the same guarantees as [retrievePlatformParameterBooleanState] except it + * enforces that the platform parameter corresponding to [id] must be an integer parameter type. + */ + fun retrievePlatformParameterIntegerState(id: PlatformParameterId): Int { + check(::platformParameters.isInitialized) { + "Attempting to access platform parameter $id before initialization." + + " If this is a test, is it using TestPlatformParameterModule?" + } + val value = platformParameters.getValue(id) + check(value.valueTypeCase == PlatformParameterValue.ValueTypeCase.INTEGER) { + "Expected a value of type integer for parameter $id, but found: $value." + } + return value.integer + } + + /** + * Returns the string value for the specified platform parameter given by [id]. + * + * This method provides the same guarantees as [retrievePlatformParameterBooleanState] except it + * enforces that the platform parameter corresponding to [id] must be an string parameter type. + */ + fun retrievePlatformParameterStringState(id: PlatformParameterId): String { + check(::platformParameters.isInitialized) { + "Attempting to access platform parameter $id before initialization." + + " If this is a test, is it using TestPlatformParameterModule?" + } + val value = platformParameters.getValue(id) + check(value.valueTypeCase == PlatformParameterValue.ValueTypeCase.STRING) { + "Expected a value of type string for parameter $id, but found: $value." + } + return value.string + } + + /** + * Returns whether the feature flag given by [id] is currently enabled. + * + * The value returned by this method is guaranteed to be constant for the lifetime of the + * application. Also, an exception will be thrown if any of the following occur: + * - This method is called before [initializeFeatureFlags]. + * - If the specified [id] is invalid. + * - If the specified [id] was missing during initialization (which would indicate an + * initialization issue). + */ + fun retrieveFeatureFlagState(id: FeatureFlagId): Boolean { + check(::featureFlags.isInitialized) { + "Attempting to access feature flag $id before initialization." + + " If this is a test, is it using TestPlatformParameterModule?" + } + return featureFlags.getValue(id) + } + + /** + * Returns the [SyncStatus] corresponding to the feature flag given by [id]. + * + * The value returned by this method is guaranteed to be constant for the lifetime of the + * application. Also, an exception will be thrown if any of the following occur: + * - This method is called before [initializeFeatureFlagSyncStatuses]. + * - If the specified [id] is invalid. + * - If the specified [id] was missing during initialization (which would indicate an + * initialization issue). + */ + fun retrieveFeatureFlagSyncStatus(id: FeatureFlagId): SyncStatus { + check(::featureFlagSyncStatuses.isInitialized) { + "Attempting to access feature flag $id sync status before initialization." + + " If this is a test, is it using TestPlatformParameterModule?" + } + return featureFlagSyncStatuses.getValue(id) + } +} diff --git a/domain/src/main/java/org/oppia/android/domain/platformparameter/PlatformParameterSingletonImpl.kt b/domain/src/main/java/org/oppia/android/domain/platformparameter/PlatformParameterSingletonImpl.kt index 0a72d4b6b44..39acc742179 100644 --- a/domain/src/main/java/org/oppia/android/domain/platformparameter/PlatformParameterSingletonImpl.kt +++ b/domain/src/main/java/org/oppia/android/domain/platformparameter/PlatformParameterSingletonImpl.kt @@ -1,6 +1,7 @@ package org.oppia.android.domain.platformparameter import org.oppia.android.app.model.PlatformParameter +import org.oppia.android.app.model.SyncStatus import org.oppia.android.util.platformparameter.PlatformParameterSingleton import org.oppia.android.util.platformparameter.PlatformParameterValue import javax.inject.Inject @@ -25,7 +26,7 @@ class PlatformParameterSingletonImpl @Inject constructor() : PlatformParameterSi if (!parameter.valueTypeCase.equals(PlatformParameter.ValueTypeCase.STRING)) return null return object : PlatformParameterValue { override val value = parameter.string - override val syncStatus = parameter.syncStatus + override val syncStatus = SyncStatus.NOT_SYNCED_FROM_SERVER } } @@ -37,7 +38,7 @@ class PlatformParameterSingletonImpl @Inject constructor() : PlatformParameterSi if (!parameter.valueTypeCase.equals(PlatformParameter.ValueTypeCase.INTEGER)) return null return object : PlatformParameterValue { override val value = parameter.integer - override val syncStatus = parameter.syncStatus + override val syncStatus = SyncStatus.NOT_SYNCED_FROM_SERVER } } @@ -49,7 +50,7 @@ class PlatformParameterSingletonImpl @Inject constructor() : PlatformParameterSi if (!parameter.valueTypeCase.equals(PlatformParameter.ValueTypeCase.BOOLEAN)) return null return object : PlatformParameterValue { override val value = parameter.boolean - override val syncStatus = parameter.syncStatus + override val syncStatus = SyncStatus.NOT_SYNCED_FROM_SERVER } } } diff --git a/domain/src/main/java/org/oppia/android/domain/platformparameter/syncup/BUILD.bazel b/domain/src/main/java/org/oppia/android/domain/platformparameter/syncup/BUILD.bazel new file mode 100644 index 00000000000..195399bd015 --- /dev/null +++ b/domain/src/main/java/org/oppia/android/domain/platformparameter/syncup/BUILD.bazel @@ -0,0 +1,27 @@ +""" +Package for providing support for downloading platform parameter states from Oppia web. +""" + +load("@io_bazel_rules_kotlin//kotlin:android.bzl", "kt_android_library") + +kt_android_library( + name = "syncup", + srcs = [ + "PlatformParameterSyncUpWorkManagerInitializer.kt", + "PlatformParameterSyncUpWorker.kt", + "PlatformParameterSyncUpWorkerFactory.kt", + "PlatformParameterSyncUpWorkerModule.kt", + ], + visibility = ["//:oppia_api_visibility"], + deps = [ + "//:dagger", + "//domain/src/main/java/org/oppia/android/domain/oppialogger:oppia_logger", + "//domain/src/main/java/org/oppia/android/domain/oppialogger/analytics:analytics_startup_listener", + "//domain/src/main/java/org/oppia/android/domain/oppialogger/exceptions:controller", + "//domain/src/main/java/org/oppia/android/domain/platformparameter:controller", + "//domain/src/main/java/org/oppia/android/domain/util:extensions", + "//third_party:org_jetbrains_kotlinx_kotlinx-coroutines-guava", + "//utility", + "//utility/src/main/java/org/oppia/android/util/threading:annotations", + ], +) diff --git a/domain/src/main/java/org/oppia/android/domain/platformparameter/syncup/PlatformParameterSyncUpWorker.kt b/domain/src/main/java/org/oppia/android/domain/platformparameter/syncup/PlatformParameterSyncUpWorker.kt index d3f1ec384c4..1a0a35e38b4 100644 --- a/domain/src/main/java/org/oppia/android/domain/platformparameter/syncup/PlatformParameterSyncUpWorker.kt +++ b/domain/src/main/java/org/oppia/android/domain/platformparameter/syncup/PlatformParameterSyncUpWorker.kt @@ -8,20 +8,12 @@ import kotlinx.coroutines.CoroutineDispatcher import kotlinx.coroutines.CoroutineScope import kotlinx.coroutines.async import kotlinx.coroutines.guava.asListenableFuture -import org.oppia.android.app.model.PlatformParameter -import org.oppia.android.app.model.PlatformParameter.SyncStatus -import org.oppia.android.data.backends.gae.api.PlatformParameterService -import org.oppia.android.data.backends.gae.model.GaePlatformParameterValue import org.oppia.android.domain.oppialogger.OppiaLogger import org.oppia.android.domain.oppialogger.exceptions.ExceptionsController import org.oppia.android.domain.platformparameter.PlatformParameterController import org.oppia.android.domain.util.getStringFromData import org.oppia.android.util.data.AsyncResult -import org.oppia.android.util.extensions.getVersionName import org.oppia.android.util.threading.BackgroundDispatcher -import retrofit2.Response -import java.lang.IllegalArgumentException -import java.lang.IllegalStateException import javax.inject.Inject /** Worker class that fetches and caches the latest platform parameters from the remote service. */ @@ -29,20 +21,12 @@ class PlatformParameterSyncUpWorker private constructor( context: Context, params: WorkerParameters, private val platformParameterController: PlatformParameterController, - private val platformParameterService: PlatformParameterService, private val oppiaLogger: OppiaLogger, private val exceptionsController: ExceptionsController, @BackgroundDispatcher private val backgroundDispatcher: CoroutineDispatcher ) : ListenableWorker(context, params) { companion object { - /** Exception message when the type of values received in the network response are not valid. */ - const val INCORRECT_TYPE_EXCEPTION_MSG = - "Platform parameter value has incorrect data type, ie. other than String/Int/Boolean" - - /** Exception message when there are no values received in the network response. */ - const val EMPTY_RESPONSE_EXCEPTION_MSG = "Received an empty map in the network response" - /** A Tag for the logs that are associated with PlatformParameterSyncUpWorker. */ const val TAG = "PlatformParameterWorker.tag" @@ -64,69 +48,30 @@ class PlatformParameterSyncUpWorker private constructor( }.asListenableFuture() } - /** - * Parses a map of platform parameter values into a [List]. Parameters must be - * of type String, Int or Boolean. - */ - private fun parseNetworkResponse( - response: Map - ): List { - return response.map { - val platformParameter = PlatformParameter.newBuilder().setName(it.key) - .setSyncStatus(SyncStatus.SYNCED_FROM_SERVER) - when (val value = it.value) { - is GaePlatformParameterValue.StringValue -> platformParameter.string = value.value - is GaePlatformParameterValue.IntValue -> platformParameter.integer = value.value - is GaePlatformParameterValue.BooleanValue -> platformParameter.boolean = value.value - GaePlatformParameterValue.UnsupportedValue -> - throw IllegalArgumentException(INCORRECT_TYPE_EXCEPTION_MSG) - } - platformParameter.build() - } - } - - /** - * Synchronously executes the network request to get platform parameters from the Oppia backend. - */ - private fun fetchPlatformParameters(): Response>? { - return platformParameterService.getPlatformParametersByVersion( - applicationContext.getVersionName() - ).execute() - } - /** Extracts platform parameters from the remote service and stores them in the cache store. */ private suspend fun refreshPlatformParameters(): Result { - return try { - val response = fetchPlatformParameters() - if (response != null) { - val responseBody = checkNotNull(response.body()) - val platformParameterList = parseNetworkResponse(responseBody) - - if (platformParameterList.isEmpty()) { - throw IllegalArgumentException(EMPTY_RESPONSE_EXCEPTION_MSG) - } - val cachingResult = platformParameterController - .updatePlatformParameterDatabase(platformParameterList) - .retrieveData() - if (cachingResult is AsyncResult.Failure) { - throw IllegalStateException(cachingResult.error) - } - Result.success() - } else { - oppiaLogger.e(TAG, "Failed to fetch platform parameters (no network stack available)") + // This is valid to do per the contract of the returned DataProvider (there will only ever be + // one result from the provider). + val result = platformParameterController.downloadRemoteParameters().retrieveData() + return when (result) { + is AsyncResult.Pending -> { + oppiaLogger.e(TAG, "Unexpected pending state when downloading remote parameters.") + Result.failure() + } + is AsyncResult.Failure -> { + oppiaLogger.e(TAG, "Failed to fetch platform parameters", result.error) + exceptionsController.logNonFatalException( + IllegalStateException("Failed to fetch platform parameters", result.error) + ) Result.failure() } - } catch (e: Exception) { - oppiaLogger.e(TAG, "Failed to fetch platform parameters", e) - exceptionsController.logNonFatalException(e) - Result.failure() + is AsyncResult.Success -> Result.Success() } } /** Creates an instance of [PlatformParameterSyncUpWorker] by properly injecting dependencies. */ class Factory @Inject constructor( private val platformParameterController: PlatformParameterController, - private val platformParameterService: PlatformParameterService, private val oppiaLogger: OppiaLogger, private val exceptionsController: ExceptionsController, @BackgroundDispatcher private val backgroundDispatcher: CoroutineDispatcher @@ -137,7 +82,6 @@ class PlatformParameterSyncUpWorker private constructor( context, params, platformParameterController, - platformParameterService, oppiaLogger, exceptionsController, backgroundDispatcher diff --git a/domain/src/main/java/org/oppia/android/domain/platformparameter/testing/BUILD.bazel b/domain/src/main/java/org/oppia/android/domain/platformparameter/testing/BUILD.bazel new file mode 100644 index 00000000000..7f30e4416c2 --- /dev/null +++ b/domain/src/main/java/org/oppia/android/domain/platformparameter/testing/BUILD.bazel @@ -0,0 +1,22 @@ +""" +Package for providing platform parameter and feature flag test-only functionality. +""" + +load("@io_bazel_rules_kotlin//kotlin:android.bzl", "kt_android_library") + +# TODO(#5835): Remove the extra visibility exposure needed here once the test platform parameter +# module can be moved to part of this package. +kt_android_library( + name = "test_platform_parameter_config_retriever", + testonly = True, + srcs = ["TestPlatformParameterConfigRetriever.kt"], + visibility = [ + "//:oppia_testing_visibility", + "//testing/src/main/java/org/oppia/android/testing/platformparameter:__pkg__", + ], + deps = [ + "//domain/src/main/java/org/oppia/android/domain/platformparameter:config_retriever", + "//domain/src/main/java/org/oppia/android/domain/platformparameter:prod_impl", + "//model/src/main/proto:platform_parameter_java_proto_lite", + ], +) diff --git a/domain/src/main/java/org/oppia/android/domain/platformparameter/testing/TestPlatformParameterConfigRetriever.kt b/domain/src/main/java/org/oppia/android/domain/platformparameter/testing/TestPlatformParameterConfigRetriever.kt new file mode 100644 index 00000000000..086f3cd815c --- /dev/null +++ b/domain/src/main/java/org/oppia/android/domain/platformparameter/testing/TestPlatformParameterConfigRetriever.kt @@ -0,0 +1,175 @@ +package org.oppia.android.domain.platformparameter.testing + +import org.oppia.android.app.model.FeatureFlagDefinition +import org.oppia.android.app.model.FeatureFlagId +import org.oppia.android.app.model.PlatformParameterDefinition +import org.oppia.android.app.model.PlatformParameterId +import org.oppia.android.app.model.PlatformParameterValue +import org.oppia.android.app.model.SupportedFeatureFlags +import org.oppia.android.app.model.SupportedPlatformParameters +import org.oppia.android.domain.platformparameter.PlatformParameterConfigRetriever +import org.oppia.android.domain.platformparameter.PlatformParameterConfigRetrieverProdImpl +import java.util.concurrent.CopyOnWriteArrayList +import java.util.concurrent.atomic.AtomicBoolean +import javax.inject.Inject +import javax.inject.Singleton + +/** + * A test-only variant of [PlatformParameterConfigRetriever] that can be used to orchestrate + * platform parameter and feature flag overrides in tests. + * + * Platform parameter and feature flag overrides must happen statically, e.g.: + * + * ```kotlin + * TestPlatformParameterConfigRetriever.setParameterOverride(LOWEST_SUPPORTED_API_LEVEL, 23) + * TestPlatformParameterConfigRetriever.setFlagOverride(DOWNLOADS_SUPPORT, true) + * ``` + * + * After overriding, parameters can be properly synchronized ahead of attempting parameter or flag + * injection to ensure that the overridden values are properly prepared for production code use. + * + * This class requires the presence of + * [org.oppia.android.testing.platformparameter.TestPlatformParameterModule] in order to function + * correctly. + */ +@Singleton +class TestPlatformParameterConfigRetriever @Inject constructor( + private val prodImpl: PlatformParameterConfigRetrieverProdImpl +) : PlatformParameterConfigRetriever { + // TODO(#5835): Add tests for this class. + + override fun loadSupportedPlatformParameters(): SupportedPlatformParameters { + isFrozen.set(true) + val baseParams = prodImpl.loadSupportedPlatformParameters() + val overrides = computeParameterOverrideProto(baseParams) + return baseParams.toBuilder().mergeFrom(overrides).build() + } + + override fun loadSupportedFeatureFlags(): SupportedFeatureFlags { + isFrozen.set(true) + val baseFlags = prodImpl.loadSupportedFeatureFlags() + val overrides = computeFlagOverrideProto(baseFlags) + return baseFlags.toBuilder().mergeFrom(overrides).build() + } + + companion object { + private val paramOverrides = + CopyOnWriteArrayList>() + private val flagOverrides = CopyOnWriteArrayList>() + private val isFrozen = AtomicBoolean() + + /** + * Sets an override value of [value] for the platform parameter corresponding to [id]. + * + * This method throws an exception if it's called more than once for the same parameter until + * [reset] is called. + * + * This cannot be called after platform parameters have been loaded. + */ + fun setParameterOverride(id: PlatformParameterId, value: Boolean) { + check(!isFrozen.get()) { "Cannot override a platform parameter after values are loaded." } + paramOverrides += id to PlatformParameterValue.newBuilder().setBoolean(value).build() + } + + /** + * Sets an override value of [value] for the platform parameter corresponding to [id]. + * + * This method throws an exception if it's called more than once for the same parameter until + * [reset] is called. + * + * This cannot be called after platform parameters have been loaded. + */ + fun setParameterOverride(id: PlatformParameterId, value: Int) { + check(!isFrozen.get()) { "Cannot override a platform parameter after values are loaded." } + paramOverrides += id to PlatformParameterValue.newBuilder().setInteger(value).build() + } + + /** + * Sets an override value of [value] for the platform parameter corresponding to [id]. + * + * This method throws an exception if it's called more than once for the same parameter until + * [reset] is called. + * + * This cannot be called after platform parameters have been loaded. + */ + fun setParameterOverride(id: PlatformParameterId, value: String) { + check(!isFrozen.get()) { "Cannot override a platform parameter after values are loaded." } + paramOverrides += id to PlatformParameterValue.newBuilder().setString(value).build() + } + + /** + * Sets an override state of [isEnabled] for the feature flag corresponding to [id]. + * + * This method throws an exception if it's called more than once for the same flag until [reset] + * is called. + * + * This cannot be called after feature flags have been loaded. + */ + fun setFlagOverride(id: FeatureFlagId, isEnabled: Boolean) { + check(!isFrozen.get()) { "Cannot override a feature flag after values are loaded." } + flagOverrides += id to isEnabled + } + + /** + * Clears all platform parameter and feature flag overrides, reenabling more overrides to happen + * again. + * + * Note that it's possible to call this after parameters and flags have been loaded. Doing so + * may have unpredictable effects in tests, and thus should only be done carefully and when + * necessary (such as when testing code in a 'previous' application instance). + */ + fun reset() { + paramOverrides.clear() + flagOverrides.clear() + isFrozen.set(false) + } + + private fun computeParameterOverrideProto( + baseParams: SupportedPlatformParameters + ): SupportedPlatformParameters { + val paramsById = baseParams.platformParameterDefinitionList.associateBy { it.id } + val overridesById = paramOverrides.groupBy { (id, _) -> id }.mapValues { (id, pairs) -> + val (_, value) = checkNotNull(pairs.singleOrNull()) { + "Expected exactly one override for parameter: $id." + } + return@mapValues value + } + return SupportedPlatformParameters.newBuilder().apply { + val definitions = overridesById.map { (id, value) -> + val baseParam = paramsById[id] + checkNotNull(baseParam) { "Attempting to override unknown parameter: $id." } + val expectedType = baseParam.defaultValue.valueTypeCase + check(expectedType == value.valueTypeCase) { + "Using type ${value.valueTypeCase} for parameter $id but expected type: $expectedType." + } + PlatformParameterDefinition.newBuilder().apply { + this.id = id + this.defaultValue = value + }.build() + } + addAllPlatformParameterDefinition(definitions) + }.build() + } + + private fun computeFlagOverrideProto(baseFlags: SupportedFeatureFlags): SupportedFeatureFlags { + val flagsById = baseFlags.featureFlagDefinitionList.associateBy { it.id } + val overridesById = flagOverrides.groupBy { (id, _) -> id }.mapValues { (id, pairs) -> + val (_, value) = checkNotNull(pairs.singleOrNull()) { + "Expected exactly one override for flag: $id." + } + return@mapValues value + } + return SupportedFeatureFlags.newBuilder().apply { + val definitions = overridesById.map { (id, value) -> + val baseFlag = flagsById[id] + checkNotNull(baseFlag) { "Attempting to override unknown flag: $id." } + FeatureFlagDefinition.newBuilder().apply { + this.id = id + this.defaultIsEnabled = value + }.build() + } + addAllFeatureFlagDefinition(definitions) + }.build() + } + } +} diff --git a/domain/src/test/java/org/oppia/android/domain/audio/AudioPlayerControllerTest.kt b/domain/src/test/java/org/oppia/android/domain/audio/AudioPlayerControllerTest.kt index f0fa00fbc45..4f2d3168b7e 100644 --- a/domain/src/test/java/org/oppia/android/domain/audio/AudioPlayerControllerTest.kt +++ b/domain/src/test/java/org/oppia/android/domain/audio/AudioPlayerControllerTest.kt @@ -11,7 +11,9 @@ import dagger.BindsInstance import dagger.Component import dagger.Module import dagger.Provides +import org.junit.After import org.junit.Assert.fail +import org.junit.Before import org.junit.Rule import org.junit.Test import org.junit.runner.RunWith @@ -60,6 +62,7 @@ import org.oppia.android.testing.data.AsyncResultSubject.Companion.assertThat import org.oppia.android.testing.data.DataProviderTestMonitor import org.oppia.android.testing.firebase.TestAuthenticationModule import org.oppia.android.testing.logging.EventLogSubject.Companion.assertThat +import org.oppia.android.testing.platformparameter.TestPlatformParameterModule import org.oppia.android.testing.robolectric.RobolectricModule import org.oppia.android.testing.threading.TestCoroutineDispatchers import org.oppia.android.testing.threading.TestDispatcherModule @@ -73,11 +76,6 @@ 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.oppia.android.util.platformparameter.EnableLearnerStudyAnalytics -import org.oppia.android.util.platformparameter.EnableLoggingLearnerStudyIds -import org.oppia.android.util.platformparameter.EnableNpsSurvey -import org.oppia.android.util.platformparameter.EnableOnboardingFlowV2 -import org.oppia.android.util.platformparameter.PlatformParameterValue import org.robolectric.Shadows import org.robolectric.annotation.Config import org.robolectric.annotation.LooperMode @@ -117,6 +115,17 @@ class AudioPlayerControllerTest { private val profileId by lazy { ProfileId.newBuilder().apply { internalId = 0 }.build() } + @Before + fun setUp() { + TestPlatformParameterModule.forceEnableNpsSurvey(true) + TestPlatformParameterModule.forceEnableOnboardingFlowV2(true) + } + + @After + fun tearDown() { + TestPlatformParameterModule.reset() + } + @Test fun testController_initializePlayer_invokePrepared_reportsSuccessfulInit() { setUpMediaReadyApplication() @@ -870,7 +879,8 @@ class AudioPlayerControllerTest { } private fun setUpMediaReadyApplicationWithLearnerStudy() { - TestModule.enableLearnerStudyAnalytics = true + TestPlatformParameterModule.forceEnableLearnerStudyAnalytics(true) + TestPlatformParameterModule.forceEnableLoggingLearnerStudyIds(true) setUpMediaReadyApplication() } @@ -896,51 +906,11 @@ class AudioPlayerControllerTest { // TODO(#89): Move this to a common test application component. @Module class TestModule { - companion object { - var enableLearnerStudyAnalytics: Boolean = false - } - @Provides @Singleton fun provideContext(application: Application): Context { return application } - - // The scoping here is to ensure changes to the module value above don't change the parameter - // within the same application instance. - @Provides - @Singleton - @EnableLearnerStudyAnalytics - fun provideLearnerStudyAnalytics(): PlatformParameterValue { - // Snapshot the value so that it doesn't change between injection and use. - val enableFeature = enableLearnerStudyAnalytics - return PlatformParameterValue.createDefaultParameter( - defaultValue = enableFeature - ) - } - - @Provides - @Singleton - @EnableLoggingLearnerStudyIds - fun provideLoggingLearnerStudyIds(): PlatformParameterValue { - // Snapshot the value so that it doesn't change between injection and use. - val enableFeature = enableLearnerStudyAnalytics - return PlatformParameterValue.createDefaultParameter( - defaultValue = enableFeature - ) - } - - @Provides - @EnableNpsSurvey - fun provideEnableNpsSurvey(): PlatformParameterValue { - return PlatformParameterValue.createDefaultParameter(defaultValue = true) - } - - @Provides - @EnableOnboardingFlowV2 - fun provideEnableOnboardingFlowV2(): PlatformParameterValue { - return PlatformParameterValue.createDefaultParameter(defaultValue = true) - } } // TODO(#89): Move this to a common test application component. @@ -980,6 +950,7 @@ class AudioPlayerControllerTest { TestDispatcherModule::class, TestLogReportingModule::class, TestModule::class, + TestPlatformParameterModule::class, TextInputRuleModule::class ] ) diff --git a/domain/src/test/java/org/oppia/android/domain/clipboard/BUILD.bazel b/domain/src/test/java/org/oppia/android/domain/clipboard/BUILD.bazel index 2a9d2c82b26..17a4bb6bf64 100644 --- a/domain/src/test/java/org/oppia/android/domain/clipboard/BUILD.bazel +++ b/domain/src/test/java/org/oppia/android/domain/clipboard/BUILD.bazel @@ -18,6 +18,7 @@ oppia_android_test( "//testing/src/main/java/org/oppia/android/testing/data:data_provider_test_monitor", "//testing/src/main/java/org/oppia/android/testing/logging:sync_status_test_module", "//testing/src/main/java/org/oppia/android/testing/logging:test_sync_status_manager", + "//testing/src/main/java/org/oppia/android/testing/platformparameter:test_module", "//testing/src/main/java/org/oppia/android/testing/robolectric:test_module", "//testing/src/main/java/org/oppia/android/testing/threading:test_coroutine_dispatchers", "//testing/src/main/java/org/oppia/android/testing/threading:test_module", diff --git a/domain/src/test/java/org/oppia/android/domain/clipboard/ClipboardControllerTest.kt b/domain/src/test/java/org/oppia/android/domain/clipboard/ClipboardControllerTest.kt index 1dd3fdb859c..e499331070c 100644 --- a/domain/src/test/java/org/oppia/android/domain/clipboard/ClipboardControllerTest.kt +++ b/domain/src/test/java/org/oppia/android/domain/clipboard/ClipboardControllerTest.kt @@ -16,11 +16,11 @@ import org.junit.Test import org.junit.runner.RunWith import org.oppia.android.domain.clipboard.ClipboardController.CurrentClip import org.oppia.android.domain.oppialogger.LoggingIdentifierModule -import org.oppia.android.domain.platformparameter.PlatformParameterModule import org.oppia.android.domain.platformparameter.PlatformParameterSingletonModule 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.platformparameter.TestPlatformParameterModule import org.oppia.android.testing.robolectric.RobolectricModule import org.oppia.android.testing.threading.TestDispatcherModule import org.oppia.android.testing.time.FakeOppiaClockModule @@ -267,13 +267,13 @@ class ClipboardControllerTest { FakeOppiaClockModule::class, LoggingIdentifierModule::class, NetworkConnectionUtilDebugModule::class, - PlatformParameterModule::class, PlatformParameterSingletonModule::class, RobolectricModule::class, SyncStatusTestModule::class, TestDispatcherModule::class, TestLogReportingModule::class, - TestModule::class + TestModule::class, + TestPlatformParameterModule::class ] ) interface TestApplicationComponent : DataProvidersInjector { diff --git a/domain/src/test/java/org/oppia/android/domain/exploration/BUILD.bazel b/domain/src/test/java/org/oppia/android/domain/exploration/BUILD.bazel index c292a5d8c1f..dde9c3a0a35 100644 --- a/domain/src/test/java/org/oppia/android/domain/exploration/BUILD.bazel +++ b/domain/src/test/java/org/oppia/android/domain/exploration/BUILD.bazel @@ -32,6 +32,7 @@ oppia_android_test( "//domain/src/main/java/org/oppia/android/domain/oppialogger/analytics:prod_module", "//testing", "//testing/src/main/java/org/oppia/android/testing/data:data_provider_test_monitor", + "//testing/src/main/java/org/oppia/android/testing/platformparameter:test_module", "//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", @@ -78,6 +79,7 @@ oppia_android_test( "//testing", "//testing/src/main/java/org/oppia/android/testing/data:data_provider_test_monitor", "//testing/src/main/java/org/oppia/android/testing/logging:event_log_subject", + "//testing/src/main/java/org/oppia/android/testing/platformparameter:test_module", "//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", @@ -107,6 +109,7 @@ oppia_android_test( "//domain/src/main/java/org/oppia/android/domain/oppialogger:prod_module", "//domain/src/main/java/org/oppia/android/domain/oppialogger/analytics:prod_module", "//testing", + "//testing/src/main/java/org/oppia/android/testing/platformparameter:test_module", "//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", diff --git a/domain/src/test/java/org/oppia/android/domain/exploration/ExplorationActiveTimeControllerTest.kt b/domain/src/test/java/org/oppia/android/domain/exploration/ExplorationActiveTimeControllerTest.kt index 97a14058659..d9a60243344 100644 --- a/domain/src/test/java/org/oppia/android/domain/exploration/ExplorationActiveTimeControllerTest.kt +++ b/domain/src/test/java/org/oppia/android/domain/exploration/ExplorationActiveTimeControllerTest.kt @@ -9,6 +9,7 @@ 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 @@ -103,6 +104,11 @@ class ExplorationActiveTimeControllerTest { TestPlatformParameterModule.forceEnableNpsSurvey(true) } + @After + fun tearDown() { + TestPlatformParameterModule.reset() + } + @Test fun testSessionTimer_explorationStartedCallbackReceived_startsSessionTimer() { setUpTestApplicationComponent() diff --git a/domain/src/test/java/org/oppia/android/domain/exploration/ExplorationDataControllerTest.kt b/domain/src/test/java/org/oppia/android/domain/exploration/ExplorationDataControllerTest.kt index 2d63e64599a..a9988636a3a 100644 --- a/domain/src/test/java/org/oppia/android/domain/exploration/ExplorationDataControllerTest.kt +++ b/domain/src/test/java/org/oppia/android/domain/exploration/ExplorationDataControllerTest.kt @@ -36,7 +36,6 @@ import org.oppia.android.domain.hintsandsolution.HintsAndSolutionProdModule 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.platformparameter.PlatformParameterModule import org.oppia.android.domain.platformparameter.PlatformParameterSingletonModule import org.oppia.android.domain.topic.FRACTIONS_EXPLORATION_ID_0 import org.oppia.android.domain.topic.FRACTIONS_EXPLORATION_ID_1 @@ -55,6 +54,7 @@ import org.oppia.android.testing.TestLogReportingModule import org.oppia.android.testing.data.DataProviderTestMonitor import org.oppia.android.testing.environment.TestEnvironmentConfig import org.oppia.android.testing.firebase.TestAuthenticationModule +import org.oppia.android.testing.platformparameter.TestPlatformParameterModule import org.oppia.android.testing.robolectric.RobolectricModule import org.oppia.android.testing.threading.TestCoroutineDispatchers import org.oppia.android.testing.threading.TestDispatcherModule @@ -486,7 +486,6 @@ class ExplorationDataControllerTest { NumberWithUnitsRuleModule::class, NumericExpressionInputModule::class, NumericInputRuleModule::class, - PlatformParameterModule::class, PlatformParameterSingletonModule::class, RatioInputModule::class, RobolectricModule::class, @@ -495,6 +494,7 @@ class ExplorationDataControllerTest { TestDispatcherModule::class, TestLogReportingModule::class, TestModule::class, + TestPlatformParameterModule::class, TextInputRuleModule::class ] ) diff --git a/domain/src/test/java/org/oppia/android/domain/exploration/ExplorationProgressControllerTest.kt b/domain/src/test/java/org/oppia/android/domain/exploration/ExplorationProgressControllerTest.kt index 6e8d4f91881..85c48f44753 100644 --- a/domain/src/test/java/org/oppia/android/domain/exploration/ExplorationProgressControllerTest.kt +++ b/domain/src/test/java/org/oppia/android/domain/exploration/ExplorationProgressControllerTest.kt @@ -10,6 +10,7 @@ import dagger.BindsInstance import dagger.Component import dagger.Module import dagger.Provides +import org.junit.After import org.junit.Before import org.junit.Rule import org.junit.Test @@ -97,6 +98,7 @@ import org.oppia.android.testing.environment.TestEnvironmentConfig import org.oppia.android.testing.firebase.TestAuthenticationModule import org.oppia.android.testing.logging.EventLogSubject import org.oppia.android.testing.logging.EventLogSubject.Companion.assertThat +import org.oppia.android.testing.platformparameter.TestPlatformParameterModule import org.oppia.android.testing.robolectric.RobolectricModule import org.oppia.android.testing.threading.TestCoroutineDispatchers import org.oppia.android.testing.threading.TestDispatcherModule @@ -113,11 +115,6 @@ 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.oppia.android.util.platformparameter.EnableLearnerStudyAnalytics -import org.oppia.android.util.platformparameter.EnableLoggingLearnerStudyIds -import org.oppia.android.util.platformparameter.EnableNpsSurvey -import org.oppia.android.util.platformparameter.EnableOnboardingFlowV2 -import org.oppia.android.util.platformparameter.PlatformParameterValue import org.robolectric.annotation.Config import org.robolectric.annotation.LooperMode import java.util.Locale @@ -168,9 +165,18 @@ class ExplorationProgressControllerTest { @Before fun setUp() { + TestPlatformParameterModule.forceEnableLearnerStudyAnalytics(true) + TestPlatformParameterModule.forceEnableLoggingLearnerStudyIds(true) + TestPlatformParameterModule.forceEnableNpsSurvey(true) + TestPlatformParameterModule.forceEnableOnboardingFlowV2(true) setUpTestApplicationComponent() } + @After + fun tearDown() { + TestPlatformParameterModule.reset() + } + @Test fun testGetCurrentState_noExploration_throwsException() { // Can't retrieve the current state until the play session is started. @@ -3849,32 +3855,6 @@ class ExplorationProgressControllerTest { @LoadLessonProtosFromAssets fun provideLoadLessonProtosFromAssets(testEnvironmentConfig: TestEnvironmentConfig): Boolean = testEnvironmentConfig.isUsingBazel() - - @Provides - @EnableLearnerStudyAnalytics - fun provideLearnerStudyAnalytics(): PlatformParameterValue { - // Enable the study by default in tests. - return PlatformParameterValue.createDefaultParameter(defaultValue = true) - } - - @Provides - @EnableLoggingLearnerStudyIds - fun provideLoggingLearnerStudyIds(): PlatformParameterValue { - // Enable study IDs by default in tests. - return PlatformParameterValue.createDefaultParameter(defaultValue = true) - } - - @Provides - @EnableNpsSurvey - fun provideEnableNpsSurvey(): PlatformParameterValue { - return PlatformParameterValue.createDefaultParameter(defaultValue = true) - } - - @Provides - @EnableOnboardingFlowV2 - fun provideEnableOnboardingFlowV2(): PlatformParameterValue { - return PlatformParameterValue.createDefaultParameter(defaultValue = true) - } } // TODO(#89): Move this to a common test application component. @@ -3912,6 +3892,7 @@ class ExplorationProgressControllerTest { TestDispatcherModule::class, TestLogReportingModule::class, TestModule::class, + TestPlatformParameterModule::class, TextInputRuleModule::class ] ) diff --git a/domain/src/test/java/org/oppia/android/domain/exploration/ExplorationProgressModuleTest.kt b/domain/src/test/java/org/oppia/android/domain/exploration/ExplorationProgressModuleTest.kt index 4e804fd69f7..81502bac46a 100644 --- a/domain/src/test/java/org/oppia/android/domain/exploration/ExplorationProgressModuleTest.kt +++ b/domain/src/test/java/org/oppia/android/domain/exploration/ExplorationProgressModuleTest.kt @@ -20,6 +20,7 @@ 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.caching.AssetModule import org.oppia.android.util.data.DataProvidersInjector import org.oppia.android.util.data.DataProvidersInjectorProvider import org.oppia.android.util.locale.LocaleProdModule @@ -83,6 +84,7 @@ class ExplorationProgressModuleTest { @Singleton @Component( modules = [ + AssetModule::class, ExplorationProgressModule::class, ExplorationStorageTestModule::class, FakeOppiaClockModule::class, diff --git a/domain/src/test/java/org/oppia/android/domain/exploration/ExplorationStorageModuleTest.kt b/domain/src/test/java/org/oppia/android/domain/exploration/ExplorationStorageModuleTest.kt index 7da5d971eb6..71434d2b632 100644 --- a/domain/src/test/java/org/oppia/android/domain/exploration/ExplorationStorageModuleTest.kt +++ b/domain/src/test/java/org/oppia/android/domain/exploration/ExplorationStorageModuleTest.kt @@ -19,10 +19,10 @@ import org.oppia.android.domain.exploration.lightweightcheckpointing.Exploration 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.platformparameter.PlatformParameterModule import org.oppia.android.domain.platformparameter.PlatformParameterSingletonModule import org.oppia.android.testing.TestLogReportingModule import org.oppia.android.testing.environment.TestEnvironmentConfig +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 @@ -114,13 +114,13 @@ class ExplorationStorageModuleTest { LogStorageModule::class, LoggingIdentifierModule::class, NetworkConnectionUtilDebugModule::class, - PlatformParameterModule::class, PlatformParameterSingletonModule::class, RobolectricModule::class, SyncStatusModule::class, TestDispatcherModule::class, TestLogReportingModule::class, - TestModule::class + TestModule::class, + TestPlatformParameterModule::class ] ) interface TestApplicationComponent : DataProvidersInjector { diff --git a/domain/src/test/java/org/oppia/android/domain/exploration/lightweightcheckpointing/BUILD.bazel b/domain/src/test/java/org/oppia/android/domain/exploration/lightweightcheckpointing/BUILD.bazel index 49c83ca1450..dbb2810f3e8 100644 --- a/domain/src/test/java/org/oppia/android/domain/exploration/lightweightcheckpointing/BUILD.bazel +++ b/domain/src/test/java/org/oppia/android/domain/exploration/lightweightcheckpointing/BUILD.bazel @@ -31,6 +31,7 @@ oppia_android_test( "//domain/src/main/java/org/oppia/android/domain/oppialogger/analytics:prod_module", "//testing", "//testing/src/main/java/org/oppia/android/testing/data:data_provider_test_monitor", + "//testing/src/main/java/org/oppia/android/testing/platformparameter:test_module", "//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", diff --git a/domain/src/test/java/org/oppia/android/domain/exploration/lightweightcheckpointing/ExplorationCheckpointControllerTest.kt b/domain/src/test/java/org/oppia/android/domain/exploration/lightweightcheckpointing/ExplorationCheckpointControllerTest.kt index 9f1645a47d9..624e5f7877c 100644 --- a/domain/src/test/java/org/oppia/android/domain/exploration/lightweightcheckpointing/ExplorationCheckpointControllerTest.kt +++ b/domain/src/test/java/org/oppia/android/domain/exploration/lightweightcheckpointing/ExplorationCheckpointControllerTest.kt @@ -45,7 +45,6 @@ import org.oppia.android.domain.hintsandsolution.HintsAndSolutionProdModule 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.platformparameter.PlatformParameterModule import org.oppia.android.domain.platformparameter.PlatformParameterSingletonModule import org.oppia.android.domain.topic.FRACTIONS_EXPLORATION_ID_0 import org.oppia.android.domain.topic.FRACTIONS_EXPLORATION_ID_1 @@ -58,6 +57,7 @@ import org.oppia.android.testing.lightweightcheckpointing.FRACTIONS_EXPLORATION_ import org.oppia.android.testing.lightweightcheckpointing.FRACTIONS_STORY_0_EXPLORATION_0_CURRENT_VERSION import org.oppia.android.testing.lightweightcheckpointing.FRACTIONS_STORY_0_EXPLORATION_0_SECOND_STATE_NAME import org.oppia.android.testing.lightweightcheckpointing.FRACTIONS_STORY_0_EXPLORATION_1_CURRENT_VERSION +import org.oppia.android.testing.platformparameter.TestPlatformParameterModule import org.oppia.android.testing.robolectric.RobolectricModule import org.oppia.android.testing.threading.TestCoroutineDispatchers import org.oppia.android.testing.threading.TestDispatcherModule @@ -1002,7 +1002,6 @@ class ExplorationCheckpointControllerTest { NumberWithUnitsRuleModule::class, NumericExpressionInputModule::class, NumericInputRuleModule::class, - PlatformParameterModule::class, PlatformParameterSingletonModule::class, RatioInputModule::class, RobolectricModule::class, @@ -1011,6 +1010,7 @@ class ExplorationCheckpointControllerTest { TestDispatcherModule::class, TestLogReportingModule::class, TestModule::class, + TestPlatformParameterModule::class, TextInputRuleModule::class ] ) diff --git a/domain/src/test/java/org/oppia/android/domain/exploration/testing/BUILD.bazel b/domain/src/test/java/org/oppia/android/domain/exploration/testing/BUILD.bazel index 858cfe267a1..cc610811c89 100644 --- a/domain/src/test/java/org/oppia/android/domain/exploration/testing/BUILD.bazel +++ b/domain/src/test/java/org/oppia/android/domain/exploration/testing/BUILD.bazel @@ -16,6 +16,7 @@ oppia_android_test( "//domain/src/main/java/org/oppia/android/domain/exploration/testing:test_module", "//domain/src/main/java/org/oppia/android/domain/oppialogger/analytics:prod_module", "//testing", + "//testing/src/main/java/org/oppia/android/testing/platformparameter:test_module", "//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", diff --git a/domain/src/test/java/org/oppia/android/domain/exploration/testing/ExplorationStorageTestModuleTest.kt b/domain/src/test/java/org/oppia/android/domain/exploration/testing/ExplorationStorageTestModuleTest.kt index dbe99af0b91..cb6cb11e64f 100644 --- a/domain/src/test/java/org/oppia/android/domain/exploration/testing/ExplorationStorageTestModuleTest.kt +++ b/domain/src/test/java/org/oppia/android/domain/exploration/testing/ExplorationStorageTestModuleTest.kt @@ -20,10 +20,10 @@ import org.oppia.android.domain.exploration.lightweightcheckpointing.Exploration 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.platformparameter.PlatformParameterModule import org.oppia.android.domain.platformparameter.PlatformParameterSingletonModule import org.oppia.android.testing.TestLogReportingModule import org.oppia.android.testing.environment.TestEnvironmentConfig +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 @@ -115,13 +115,13 @@ class ExplorationStorageTestModuleTest { LogStorageModule::class, LoggingIdentifierModule::class, NetworkConnectionUtilDebugModule::class, - PlatformParameterModule::class, PlatformParameterSingletonModule::class, RobolectricModule::class, SyncStatusModule::class, TestDispatcherModule::class, TestLogReportingModule::class, - TestModule::class + TestModule::class, + TestPlatformParameterModule::class ] ) interface TestApplicationComponent : DataProvidersInjector { diff --git a/domain/src/test/java/org/oppia/android/domain/locale/BUILD.bazel b/domain/src/test/java/org/oppia/android/domain/locale/BUILD.bazel index 7b02bf08e9c..b158b9687b5 100644 --- a/domain/src/test/java/org/oppia/android/domain/locale/BUILD.bazel +++ b/domain/src/test/java/org/oppia/android/domain/locale/BUILD.bazel @@ -111,6 +111,7 @@ oppia_android_test( "//model/src/main/proto:languages_java_proto_lite", "//testing", "//testing/src/main/java/org/oppia/android/testing/data:data_provider_test_monitor", + "//testing/src/main/java/org/oppia/android/testing/platformparameter:test_module", "//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", diff --git a/domain/src/test/java/org/oppia/android/domain/locale/LocaleControllerTest.kt b/domain/src/test/java/org/oppia/android/domain/locale/LocaleControllerTest.kt index 076c380fb9d..e32f5e0c79f 100644 --- a/domain/src/test/java/org/oppia/android/domain/locale/LocaleControllerTest.kt +++ b/domain/src/test/java/org/oppia/android/domain/locale/LocaleControllerTest.kt @@ -33,11 +33,11 @@ import org.oppia.android.app.model.OppiaRegion.UNITED_STATES 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.platformparameter.PlatformParameterModule import org.oppia.android.domain.platformparameter.PlatformParameterSingletonModule import org.oppia.android.testing.TestLogReportingModule import org.oppia.android.testing.assertThrows import org.oppia.android.testing.data.DataProviderTestMonitor +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 @@ -901,13 +901,13 @@ class LocaleControllerTest { LoggerModule::class, LoggingIdentifierModule::class, NetworkConnectionUtilDebugModule::class, - PlatformParameterModule::class, PlatformParameterSingletonModule::class, RobolectricModule::class, SyncStatusModule::class, TestDispatcherModule::class, TestLogReportingModule::class, - TestModule::class + TestModule::class, + TestPlatformParameterModule::class ] ) interface TestApplicationComponent : DataProvidersInjector { diff --git a/domain/src/test/java/org/oppia/android/domain/onboarding/AppStartupStateControllerTest.kt b/domain/src/test/java/org/oppia/android/domain/onboarding/AppStartupStateControllerTest.kt index 14793f5d6d8..568e618d98f 100644 --- a/domain/src/test/java/org/oppia/android/domain/onboarding/AppStartupStateControllerTest.kt +++ b/domain/src/test/java/org/oppia/android/domain/onboarding/AppStartupStateControllerTest.kt @@ -11,6 +11,7 @@ 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 @@ -28,20 +29,17 @@ import org.oppia.android.app.model.DeprecationNoticeType import org.oppia.android.app.model.DeprecationResponse import org.oppia.android.app.model.EventLog import org.oppia.android.app.model.OnboardingState -import org.oppia.android.app.model.PlatformParameter +import org.oppia.android.app.model.PlatformParameterId.FORCED_APP_UPDATE_VERSION_CODE +import org.oppia.android.app.model.PlatformParameterId.LOWEST_SUPPORTED_API_LEVEL +import org.oppia.android.app.model.PlatformParameterId.OPTIONAL_APP_UPDATE_VERSION_CODE import org.oppia.android.data.persistence.PersistentCacheStore import org.oppia.android.domain.onboarding.AppStartupStateControllerTest.TestModule.Companion.appDeprecationResponse -import org.oppia.android.domain.onboarding.AppStartupStateControllerTest.TestModule.Companion.enableAppAndOsDeprecation -import org.oppia.android.domain.onboarding.AppStartupStateControllerTest.TestModule.Companion.forcedAppUpdateVersion -import org.oppia.android.domain.onboarding.AppStartupStateControllerTest.TestModule.Companion.lowestApiLevel -import org.oppia.android.domain.onboarding.AppStartupStateControllerTest.TestModule.Companion.optionalAppUpdateVersion import org.oppia.android.domain.onboarding.AppStartupStateControllerTest.TestModule.Companion.osDeprecationResponse 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.platformparameter.PlatformParameterController -import org.oppia.android.domain.platformparameter.PlatformParameterModule import org.oppia.android.domain.platformparameter.PlatformParameterSingletonModule +import org.oppia.android.domain.platformparameter.testing.TestPlatformParameterConfigRetriever.Companion.setParameterOverride import org.oppia.android.testing.FakeAnalyticsEventLogger import org.oppia.android.testing.TestLogReportingModule import org.oppia.android.testing.data.DataProviderTestMonitor @@ -50,23 +48,20 @@ import org.oppia.android.testing.junit.OppiaParameterizedTestRunner.Iteration import org.oppia.android.testing.junit.OppiaParameterizedTestRunner.Parameter 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.RobolectricModule import org.oppia.android.testing.threading.TestCoroutineDispatchers import org.oppia.android.testing.threading.TestDispatcherModule 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.locale.testing.LocaleTestModule 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.oppia.android.util.platformparameter.APP_AND_OS_DEPRECATION -import org.oppia.android.util.platformparameter.FORCED_APP_UPDATE_VERSION_CODE -import org.oppia.android.util.platformparameter.LOWEST_SUPPORTED_API_LEVEL -import org.oppia.android.util.platformparameter.OPTIONAL_APP_UPDATE_VERSION_CODE import org.oppia.android.util.system.OppiaClockModule import org.robolectric.Shadows.shadowOf import org.robolectric.annotation.Config @@ -87,7 +82,6 @@ import javax.inject.Singleton class AppStartupStateControllerTest { @Inject lateinit var context: Context @Inject lateinit var appStartupStateController: AppStartupStateController - @Inject lateinit var platformParameterController: PlatformParameterController @Inject lateinit var testCoroutineDispatchers: TestCoroutineDispatchers @Inject lateinit var monitorFactory: DataProviderTestMonitor.Factory @Inject lateinit var fakeAnalyticsEventLogger: FakeAnalyticsEventLogger @@ -102,6 +96,11 @@ class AppStartupStateControllerTest { TestModule.buildFlavor = BuildFlavor.BUILD_FLAVOR_UNSPECIFIED } + @After + fun tearDown() { + TestPlatformParameterModule.reset() + } + @Test fun testController_providesInitialState_indicatesUserHasNotOnboardedTheApp() { setUpDefaultTestApplicationComponent() @@ -793,17 +792,12 @@ class AppStartupStateControllerTest { @Test fun testController_appAndOsDeprecationEnabled_initialLaunch_startupModeIsUserNotOnboarded() { + TestPlatformParameterModule.forceEnableAppAndOsDeprecation(true) executeInPreviousAppInstance { testComponent -> - testComponent.getPlatformParameterController().updatePlatformParameterDatabase( - listOf(enableAppAndOsDeprecation) - ) testComponent.getTestCoroutineDispatchers().runCurrent() } setUpDefaultTestApplicationComponent() - monitorFactory.ensureDataProviderExecutes(platformParameterController.getParameterDatabase()) - testCoroutineDispatchers.runCurrent() - val appStartupState = appStartupStateController.getAppStartupState() val startupMode = monitorFactory.waitForNextSuccessfulResult(appStartupState) @@ -822,9 +816,8 @@ class AppStartupStateControllerTest { @Test fun testController_osIsDeprecated_returnsOsDeprecatedStartupMode() { - setUpTestApplicationWithAppAndOSDeprecationEnabled( - platformParameterToEnable = lowestApiLevel - ) + setParameterOverride(LOWEST_SUPPORTED_API_LEVEL, Int.MAX_VALUE) + setUpTestApplicationWithAppAndOSDeprecationEnabled() val appStartupState = appStartupStateController.getAppStartupState() @@ -834,9 +827,9 @@ class AppStartupStateControllerTest { @Test fun testController_osIsDeprecated_previousResponseExists_returnsUserOnboardedStartupMode() { + setParameterOverride(LOWEST_SUPPORTED_API_LEVEL, Int.MAX_VALUE) setUpTestApplicationWithAppAndOSDeprecationEnabled( - previousResponses = listOf(osDeprecationResponse), - platformParameterToEnable = lowestApiLevel + previousResponses = listOf(osDeprecationResponse) ) val appStartupState = appStartupStateController.getAppStartupState() @@ -847,9 +840,8 @@ class AppStartupStateControllerTest { @Test fun testController_optionalUpdateAvailable_returnsOptionalUpdateStartupMode() { - setUpTestApplicationWithAppAndOSDeprecationEnabled( - platformParameterToEnable = optionalAppUpdateVersion - ) + setParameterOverride(OPTIONAL_APP_UPDATE_VERSION_CODE, Int.MAX_VALUE) + setUpTestApplicationWithAppAndOSDeprecationEnabled() val appStartupState = appStartupStateController.getAppStartupState() @@ -860,9 +852,9 @@ class AppStartupStateControllerTest { @Test fun testController_optionalUpdateAvailable_previousResponseExists_returnsUserOnboardedStartupMode () { + setParameterOverride(OPTIONAL_APP_UPDATE_VERSION_CODE, Int.MAX_VALUE) setUpTestApplicationWithAppAndOSDeprecationEnabled( - previousResponses = listOf(appDeprecationResponse), - platformParameterToEnable = optionalAppUpdateVersion + previousResponses = listOf(appDeprecationResponse) ) val appStartupState = appStartupStateController.getAppStartupState() @@ -873,9 +865,8 @@ class AppStartupStateControllerTest { @Test fun testController_forcedUpdateAvailable_returnsAppDeprecatedStartupMode() { - setUpTestApplicationWithAppAndOSDeprecationEnabled( - platformParameterToEnable = forcedAppUpdateVersion - ) + setParameterOverride(FORCED_APP_UPDATE_VERSION_CODE, Int.MAX_VALUE) + setUpTestApplicationWithAppAndOSDeprecationEnabled() val appStartupState = appStartupStateController.getAppStartupState() @@ -886,9 +877,9 @@ class AppStartupStateControllerTest { @Test fun testController_forcedUpdateAvailable_previousResponseExists_returnsUserOnboardedStartupMode () { + setParameterOverride(FORCED_APP_UPDATE_VERSION_CODE, Int.MAX_VALUE) setUpTestApplicationWithAppAndOSDeprecationEnabled( - previousResponses = listOf(appDeprecationResponse), - platformParameterToEnable = forcedAppUpdateVersion + previousResponses = listOf(appDeprecationResponse) ) val appStartupState = appStartupStateController.getAppStartupState() @@ -909,9 +900,9 @@ class AppStartupStateControllerTest { } private fun setUpTestApplicationWithAppAndOSDeprecationEnabled( - previousResponses: List = emptyList(), - platformParameterToEnable: PlatformParameter? = null + previousResponses: List = emptyList() ) { + TestPlatformParameterModule.forceEnableAppAndOsDeprecation(true) executeInPreviousAppInstance { testComponent -> testComponent.getAppStartupStateController().markOnboardingFlowCompleted() testComponent.getTestCoroutineDispatchers().runCurrent() @@ -920,18 +911,9 @@ class AppStartupStateControllerTest { testComponent.getDeprecationController().saveDeprecationResponse(it) testComponent.getTestCoroutineDispatchers().runCurrent() } - - testComponent.getPlatformParameterController().updatePlatformParameterDatabase( - platformParameterToEnable?.let { listOf(it, enableAppAndOsDeprecation) } - ?: listOf(enableAppAndOsDeprecation) - ) - testComponent.getTestCoroutineDispatchers().runCurrent() } setUpTestApplicationComponent() - - monitorFactory.ensureDataProviderExecutes(platformParameterController.getParameterDatabase()) - testCoroutineDispatchers.runCurrent() } /** @@ -1009,30 +991,6 @@ class AppStartupStateControllerTest { companion object { var buildFlavor = BuildFlavor.BUILD_FLAVOR_UNSPECIFIED - val lowestApiLevel: PlatformParameter = PlatformParameter.newBuilder() - .setName(LOWEST_SUPPORTED_API_LEVEL) - .setInteger(Int.MAX_VALUE) - .setSyncStatus(PlatformParameter.SyncStatus.SYNCED_FROM_SERVER) - .build() - - val optionalAppUpdateVersion: PlatformParameter = PlatformParameter.newBuilder() - .setName(OPTIONAL_APP_UPDATE_VERSION_CODE) - .setInteger(Int.MAX_VALUE) - .setSyncStatus(PlatformParameter.SyncStatus.SYNCED_FROM_SERVER) - .build() - - val forcedAppUpdateVersion: PlatformParameter = PlatformParameter.newBuilder() - .setName(FORCED_APP_UPDATE_VERSION_CODE) - .setInteger(Int.MAX_VALUE) - .setSyncStatus(PlatformParameter.SyncStatus.SYNCED_FROM_SERVER) - .build() - - val enableAppAndOsDeprecation: PlatformParameter = PlatformParameter.newBuilder() - .setName(APP_AND_OS_DEPRECATION) - .setBoolean(true) - .setSyncStatus(PlatformParameter.SyncStatus.SYNCED_FROM_SERVER) - .build() - val osDeprecationResponse: DeprecationResponse = DeprecationResponse.newBuilder() .setDeprecationNoticeType(DeprecationNoticeType.OS_DEPRECATION) .setDeprecatedVersion(Int.MAX_VALUE) @@ -1074,13 +1032,13 @@ class AppStartupStateControllerTest { modules = [ ApplicationLifecycleModule::class, AssetModule::class, - ExpirationMetaDataRetrieverModule::class, // Use real implementation to test closer to prod. - LocaleProdModule::class, + ExpirationMetaDataRetrieverModule::class, LogStorageModule::class, LoggingIdentifierModule::class, NetworkConnectionUtilDebugModule::class, + LocaleTestModule::class, OppiaClockModule::class, - PlatformParameterModule::class, + TestPlatformParameterModule::class, PlatformParameterSingletonModule::class, RobolectricModule::class, SyncStatusModule::class, @@ -1106,8 +1064,6 @@ class AppStartupStateControllerTest { fun getContext(): Context - fun getPlatformParameterController(): PlatformParameterController - fun getDeprecationController(): DeprecationController fun inject(appStartupStateControllerTest: AppStartupStateControllerTest) diff --git a/domain/src/test/java/org/oppia/android/domain/onboarding/BUILD.bazel b/domain/src/test/java/org/oppia/android/domain/onboarding/BUILD.bazel index 7d59aa2021f..ec184fb1227 100644 --- a/domain/src/test/java/org/oppia/android/domain/onboarding/BUILD.bazel +++ b/domain/src/test/java/org/oppia/android/domain/onboarding/BUILD.bazel @@ -21,6 +21,7 @@ oppia_android_test( "//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/platformparameter:test_module", "//testing/src/main/java/org/oppia/android/testing/robolectric:test_module", "//testing/src/main/java/org/oppia/android/testing/threading:test_module", "//third_party:com_google_truth_truth", @@ -30,6 +31,7 @@ oppia_android_test( "//third_party:robolectric_android-all", "//utility/src/main/java/org/oppia/android/util/caching:asset_prod_module", "//utility/src/main/java/org/oppia/android/util/locale:prod_module", + "//utility/src/main/java/org/oppia/android/util/locale/testing:test_module", "//utility/src/main/java/org/oppia/android/util/logging:prod_module", "//utility/src/main/java/org/oppia/android/util/networking:debug_module", "//utility/src/main/java/org/oppia/android/util/system:prod_module", @@ -53,6 +55,7 @@ oppia_android_test( "//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/platformparameter:test_module", "//testing/src/main/java/org/oppia/android/testing/robolectric:test_module", "//testing/src/main/java/org/oppia/android/testing/threading:test_module", "//third_party:com_google_truth_truth", @@ -60,7 +63,9 @@ oppia_android_test( "//third_party:org_mockito_mockito-core", "//third_party:org_robolectric_robolectric", "//third_party:robolectric_android-all", + "//utility/src/main/java/org/oppia/android/util/caching:asset_prod_module", "//utility/src/main/java/org/oppia/android/util/locale:prod_module", + "//utility/src/main/java/org/oppia/android/util/locale/testing:test_module", "//utility/src/main/java/org/oppia/android/util/logging:prod_module", "//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/domain/src/test/java/org/oppia/android/domain/onboarding/DeprecationControllerTest.kt b/domain/src/test/java/org/oppia/android/domain/onboarding/DeprecationControllerTest.kt index 6aa548c8af8..dcb69c005f6 100644 --- a/domain/src/test/java/org/oppia/android/domain/onboarding/DeprecationControllerTest.kt +++ b/domain/src/test/java/org/oppia/android/domain/onboarding/DeprecationControllerTest.kt @@ -11,6 +11,7 @@ import dagger.BindsInstance import dagger.Component import dagger.Module import dagger.Provides +import org.junit.After import org.junit.Test import org.junit.runner.RunWith import org.oppia.android.app.model.AppStartupState.StartupMode @@ -19,45 +20,37 @@ import org.oppia.android.app.model.DeprecationNoticeType import org.oppia.android.app.model.DeprecationResponse import org.oppia.android.app.model.DeprecationResponseDatabase import org.oppia.android.app.model.OnboardingState -import org.oppia.android.app.model.PlatformParameter -import org.oppia.android.app.model.PlatformParameter.SyncStatus -import org.oppia.android.data.persistence.PersistentCacheStore +import org.oppia.android.app.model.PlatformParameterId.FORCED_APP_UPDATE_VERSION_CODE +import org.oppia.android.app.model.PlatformParameterId.LOWEST_SUPPORTED_API_LEVEL +import org.oppia.android.app.model.PlatformParameterId.OPTIONAL_APP_UPDATE_VERSION_CODE 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.platformparameter.PlatformParameterController -import org.oppia.android.domain.platformparameter.PlatformParameterModule import org.oppia.android.domain.platformparameter.PlatformParameterSingletonModule +import org.oppia.android.domain.platformparameter.testing.TestPlatformParameterConfigRetriever.Companion.setParameterOverride import org.oppia.android.testing.TestLogReportingModule import org.oppia.android.testing.data.DataProviderTestMonitor import org.oppia.android.testing.junit.OppiaParameterizedTestRunner 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.RobolectricModule import org.oppia.android.testing.threading.TestCoroutineDispatchers import org.oppia.android.testing.threading.TestDispatcherModule +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.locale.testing.LocaleTestModule 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.oppia.android.util.platformparameter.FORCED_APP_UPDATE_VERSION_CODE -import org.oppia.android.util.platformparameter.ForcedAppUpdateVersionCode -import org.oppia.android.util.platformparameter.LOWEST_SUPPORTED_API_LEVEL -import org.oppia.android.util.platformparameter.LowestSupportedApiLevel -import org.oppia.android.util.platformparameter.OPTIONAL_APP_UPDATE_VERSION_CODE -import org.oppia.android.util.platformparameter.OptionalAppUpdateVersionCode -import org.oppia.android.util.platformparameter.PlatformParameterSingleton -import org.oppia.android.util.platformparameter.PlatformParameterValue import org.oppia.android.util.system.OppiaClockModule import org.robolectric.Shadows import org.robolectric.annotation.Config import javax.inject.Inject -import javax.inject.Provider import javax.inject.Singleton /** Tests for [DeprecationController]. */ @@ -71,17 +64,11 @@ class DeprecationControllerTest { @Inject lateinit var deprecationController: DeprecationController @Inject lateinit var testCoroutineDispatchers: TestCoroutineDispatchers @Inject lateinit var monitorFactory: DataProviderTestMonitor.Factory - @Inject lateinit var platformParameterSingleton: PlatformParameterSingleton - @Inject lateinit var platformParameterController: PlatformParameterController - @field:[Inject LowestSupportedApiLevel] - lateinit var lowestSupportedApiLevelProvider: Provider> - - @field:[Inject OptionalAppUpdateVersionCode] - lateinit var optionalAppUpdateVersionProvider: Provider> - - @field:[Inject ForcedAppUpdateVersionCode] - lateinit var forcedAppUpdateVersionProvider: Provider> + @After + fun tearDown() { + TestPlatformParameterModule.reset() + } @Test fun testController_initialAppLaunch_returnsDefaultDeprecationResponseDatabase() { @@ -155,9 +142,8 @@ class DeprecationControllerTest { @Test fun testController_osIsDeprecated_returnsOsIsDeprecatedStartUpMode() { - setUpTestApplicationComponentWithParameters( - platformParameters = listOf(lowestApiLevel) - ) + setParameterOverride(LOWEST_SUPPORTED_API_LEVEL, Int.MAX_VALUE) + setUpDefaultTestApplicationComponent() val startupMode = deprecationController.processStartUpMode( alreadyOnboardedOnboardingState, defaultDeprecationResponseDatabase @@ -168,9 +154,8 @@ class DeprecationControllerTest { @Test fun testController_osIsDeprecated_previousResponseExists_returnsUserIsOnboardedStartUpMode() { - setUpTestApplicationComponentWithParameters( - platformParameters = listOf(lowestApiLevel) - ) + setParameterOverride(LOWEST_SUPPORTED_API_LEVEL, Int.MAX_VALUE) + setUpDefaultTestApplicationComponent() val startupMode = deprecationController.processStartUpMode( alreadyOnboardedOnboardingState, deprecationResponseDatabaseWithPreviousResponses @@ -180,9 +165,8 @@ class DeprecationControllerTest { @Test fun testController_hasOptionalUpdate_returnsOptionalUpdateAvailableStartupMode() { - setUpTestApplicationComponentWithParameters( - platformParameters = listOf(optionalAppUpdateVersion) - ) + setParameterOverride(OPTIONAL_APP_UPDATE_VERSION_CODE, Int.MAX_VALUE) + setUpDefaultTestApplicationComponent() val startupMode = deprecationController.processStartUpMode( alreadyOnboardedOnboardingState, defaultDeprecationResponseDatabase @@ -192,9 +176,8 @@ class DeprecationControllerTest { @Test fun testController_hasOptionalUpdate_previousResponseExists_returnsUserIsOnboardedStartupMode() { - setUpTestApplicationComponentWithParameters( - platformParameters = listOf(optionalAppUpdateVersion) - ) + setParameterOverride(OPTIONAL_APP_UPDATE_VERSION_CODE, Int.MAX_VALUE) + setUpDefaultTestApplicationComponent() val startupMode = deprecationController.processStartUpMode( alreadyOnboardedOnboardingState, deprecationResponseDatabaseWithPreviousResponses @@ -204,28 +187,25 @@ class DeprecationControllerTest { @Test fun testController_hasForcedUpdate_returnsAppIsDeprecatedStartupMode() { - setUpTestApplicationComponentWithParameters( - platformParameters = listOf(forcedAppUpdateVersion) - ) - - monitorFactory.ensureDataProviderExecutes(platformParameterController.getParameterDatabase()) - testCoroutineDispatchers.runCurrent() + setParameterOverride(FORCED_APP_UPDATE_VERSION_CODE, Int.MAX_VALUE) + setUpDefaultTestApplicationComponent() val startupMode = deprecationController.processStartUpMode( alreadyOnboardedOnboardingState, defaultDeprecationResponseDatabase ) + assertThat(startupMode).isEqualTo(StartupMode.APP_IS_DEPRECATED) } @Test fun testController_hasForcedUpdate_previousResponseExists_returnsUserIsOnboardedStartupMode() { - setUpTestApplicationComponentWithParameters( - platformParameters = listOf(forcedAppUpdateVersion) - ) + setParameterOverride(FORCED_APP_UPDATE_VERSION_CODE, Int.MAX_VALUE) + setUpDefaultTestApplicationComponent() val startupMode = deprecationController.processStartUpMode( alreadyOnboardedOnboardingState, deprecationResponseDatabaseWithPreviousResponses ) + assertThat(startupMode).isEqualTo(StartupMode.USER_IS_ONBOARDED) } @@ -237,22 +217,6 @@ class DeprecationControllerTest { setUpOppiaApplicationForContext(context, expirationEnabled, expDate) } - private fun setUpTestApplicationComponentWithParameters( - platformParameters: List - ) { - executeInPreviousAppInstance { testComponent -> - testComponent.getPlatformParameterController().updatePlatformParameterDatabase( - platformParameters - ) - testComponent.getTestCoroutineDispatchers().runCurrent() - } - - setUpDefaultTestApplicationComponent() - - monitorFactory.ensureDataProviderExecutes(platformParameterController.getParameterDatabase()) - testCoroutineDispatchers.runCurrent() - } - /** * Creates a separate test application component and executes the specified block. This should be * called before [setUpTestApplicationComponent] to avoid undefined behavior in production code. @@ -336,14 +300,15 @@ class DeprecationControllerTest { @Singleton @Component( modules = [ + AssetModule::class, ApplicationLifecycleModule::class, - ExpirationMetaDataRetrieverModule::class, // Use real implementation to test closer to prod. - LocaleProdModule::class, + ExpirationMetaDataRetrieverModule::class, LogStorageModule::class, LoggingIdentifierModule::class, NetworkConnectionUtilDebugModule::class, OppiaClockModule::class, - PlatformParameterModule::class, + LocaleTestModule::class, + TestPlatformParameterModule::class, PlatformParameterSingletonModule::class, RobolectricModule::class, SyncStatusModule::class, @@ -363,14 +328,6 @@ class DeprecationControllerTest { fun getDeprecationController(): DeprecationController - fun getDataProviderTestMonitor(): DataProviderTestMonitor.Factory - - fun getPlatformParameterSingleton(): PlatformParameterSingleton - - fun getPlatformParameterController(): PlatformParameterController - - fun getCacheFactory(): PersistentCacheStore.Factory - fun getTestCoroutineDispatchers(): TestCoroutineDispatchers fun getContext(): Context @@ -401,24 +358,6 @@ class DeprecationControllerTest { .setAlreadyOnboardedApp(true) .build() - val lowestApiLevel: PlatformParameter = PlatformParameter.newBuilder() - .setName(LOWEST_SUPPORTED_API_LEVEL) - .setInteger(Int.MAX_VALUE) - .setSyncStatus(SyncStatus.SYNCED_FROM_SERVER) - .build() - - val optionalAppUpdateVersion: PlatformParameter = PlatformParameter.newBuilder() - .setName(OPTIONAL_APP_UPDATE_VERSION_CODE) - .setInteger(Int.MAX_VALUE) - .setSyncStatus(SyncStatus.SYNCED_FROM_SERVER) - .build() - - val forcedAppUpdateVersion: PlatformParameter = PlatformParameter.newBuilder() - .setName(FORCED_APP_UPDATE_VERSION_CODE) - .setInteger(Int.MAX_VALUE) - .setSyncStatus(SyncStatus.SYNCED_FROM_SERVER) - .build() - val osDeprecationResponse: DeprecationResponse = DeprecationResponse.newBuilder() .setDeprecationNoticeType(DeprecationNoticeType.OS_DEPRECATION) .setDeprecatedVersion(Int.MAX_VALUE) diff --git a/domain/src/test/java/org/oppia/android/domain/oppialogger/LoggingIdentifierControllerTest.kt b/domain/src/test/java/org/oppia/android/domain/oppialogger/LoggingIdentifierControllerTest.kt index 29035aac8a8..213367e3c66 100644 --- a/domain/src/test/java/org/oppia/android/domain/oppialogger/LoggingIdentifierControllerTest.kt +++ b/domain/src/test/java/org/oppia/android/domain/oppialogger/LoggingIdentifierControllerTest.kt @@ -26,6 +26,7 @@ import org.oppia.android.domain.oppialogger.analytics.ApplicationLifecycleModule import org.oppia.android.domain.platformparameter.PlatformParameterSingletonModule import org.oppia.android.testing.TestLogReportingModule import org.oppia.android.testing.data.DataProviderTestMonitor +import org.oppia.android.testing.platformparameter.TestPlatformParameterModule import org.oppia.android.testing.robolectric.RobolectricModule import org.oppia.android.testing.threading.TestCoroutineDispatchers import org.oppia.android.testing.threading.TestDispatcherModule @@ -42,12 +43,6 @@ 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.oppia.android.util.platformparameter.EnableLearnerStudyAnalytics -import org.oppia.android.util.platformparameter.PlatformParameterValue -import org.oppia.android.util.platformparameter.SPLASH_SCREEN_WELCOME_MSG_DEFAULT_VALUE -import org.oppia.android.util.platformparameter.SYNC_UP_WORKER_TIME_PERIOD_IN_HOURS_DEFAULT_VALUE -import org.oppia.android.util.platformparameter.SplashScreenWelcomeMsg -import org.oppia.android.util.platformparameter.SyncUpWorkerTimePeriodHours import org.oppia.android.util.threading.BackgroundDispatcher import org.robolectric.annotation.Config import org.robolectric.annotation.LooperMode @@ -460,34 +455,6 @@ class LoggingIdentifierControllerTest { fun provideApplicationIdSeed(): Long = applicationIdSeed!! // Fail if not initialized. } - @Module - class TestPlatformParameterModule { - - companion object { - var forceLearnerAnalyticsStudy: Boolean = false - } - - @Provides - @SplashScreenWelcomeMsg - fun provideSplashScreenWelcomeMsgParam(): PlatformParameterValue { - return PlatformParameterValue.createDefaultParameter(SPLASH_SCREEN_WELCOME_MSG_DEFAULT_VALUE) - } - - @Provides - @SyncUpWorkerTimePeriodHours - fun provideSyncUpWorkerTimePeriod(): PlatformParameterValue { - return PlatformParameterValue.createDefaultParameter( - SYNC_UP_WORKER_TIME_PERIOD_IN_HOURS_DEFAULT_VALUE - ) - } - - @Provides - @EnableLearnerStudyAnalytics - fun provideLearnerStudyAnalytics(): PlatformParameterValue { - return PlatformParameterValue.createDefaultParameter(forceLearnerAnalyticsStudy) - } - } - // TODO(#89): Move this to a common test application component. @Singleton @Component( diff --git a/domain/src/test/java/org/oppia/android/domain/oppialogger/analytics/AnalyticsControllerTest.kt b/domain/src/test/java/org/oppia/android/domain/oppialogger/analytics/AnalyticsControllerTest.kt index 3475acf01ea..70ade8a2187 100644 --- a/domain/src/test/java/org/oppia/android/domain/oppialogger/analytics/AnalyticsControllerTest.kt +++ b/domain/src/test/java/org/oppia/android/domain/oppialogger/analytics/AnalyticsControllerTest.kt @@ -15,6 +15,7 @@ import kotlinx.coroutines.Deferred import kotlinx.coroutines.async import kotlinx.coroutines.flow.MutableStateFlow import kotlinx.coroutines.flow.StateFlow +import org.junit.After import org.junit.Assert.fail import org.junit.Test import org.junit.runner.RunWith @@ -113,6 +114,11 @@ class AnalyticsControllerTest { private val profileManagementController by lazy { profileManagementControllerProvider.get() } private val analyticsController by lazy { analyticsControllerProvider.get() } + @After + fun tearDown() { + TestPlatformParameterModule.reset() + } + @Test fun testController_logImportantEvent_withQuestionContext_checkLogsEvent() { setUpTestApplicationComponent() 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 e4d8dc7ba2f..954e19a1c9b 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 @@ -32,10 +32,11 @@ import org.oppia.android.app.devoptions.DeveloperOptionsStarterModule import org.oppia.android.app.model.EventLog import org.oppia.android.app.model.EventLog.Context.ActivityContextCase import org.oppia.android.app.model.EventLog.Context.ActivityContextCase.APP_IN_FOREGROUND_TIME +import org.oppia.android.app.model.FeatureFlagId import org.oppia.android.app.model.OppiaMetricLog -import org.oppia.android.app.model.PlatformParameter import org.oppia.android.app.model.ProfileId import org.oppia.android.app.model.ScreenName +import org.oppia.android.app.model.SyncStatus import org.oppia.android.app.player.state.itemviewmodel.SplitScreenInteractionModule import org.oppia.android.app.testing.activity.TestActivity import org.oppia.android.app.translation.testing.ActivityRecreatorTestModule @@ -78,9 +79,6 @@ import org.oppia.android.testing.TestLogReportingModule import org.oppia.android.testing.data.DataProviderTestMonitor import org.oppia.android.testing.firebase.TestAuthenticationModule import org.oppia.android.testing.logging.EventLogSubject.Companion.assertThat -import org.oppia.android.testing.platformparameter.EnableTestFeatureFlag -import org.oppia.android.testing.platformparameter.EnableTestFeatureFlagWithEnabledDefault -import org.oppia.android.testing.platformparameter.TEST_FEATURE_FLAG import org.oppia.android.testing.platformparameter.TestPlatformParameterModule import org.oppia.android.testing.robolectric.RobolectricModule import org.oppia.android.testing.threading.TestCoroutineDispatchers @@ -106,6 +104,7 @@ import org.oppia.android.util.networking.NetworkConnectionDebugUtilModule import org.oppia.android.util.networking.NetworkConnectionUtilDebugModule import org.oppia.android.util.parser.html.HtmlParserEntityTypeModule import org.oppia.android.util.parser.image.ImageParsingModule +import org.oppia.android.util.platformparameter.EnableDownloadsSupport import org.oppia.android.util.platformparameter.PlatformParameterValue import org.robolectric.annotation.Config import org.robolectric.annotation.LooperMode @@ -156,12 +155,9 @@ class ApplicationLifecycleObserverTest { @field:[JvmField Inject BackgroundCpuLoggingTimePeriodMillis] var backgroundCpuLoggingTimePeriodMillis: Long = Long.MIN_VALUE - @field:[Inject EnableTestFeatureFlag] + @field:[Inject EnableDownloadsSupport] lateinit var testFeatureFlag: PlatformParameterValue - @field:[Inject EnableTestFeatureFlagWithEnabledDefault] - lateinit var testFeatureFlagWithEnabledDefault: PlatformParameterValue - private lateinit var retrofit: Retrofit private lateinit var client: OkHttpClient private lateinit var mockWebServerUrl: HttpUrl @@ -446,7 +442,7 @@ class ApplicationLifecycleObserverTest { setUpTestApplicationComponent() featureFlagsLogger.setFeatureFlagItemMap( - mapOf(TEST_FEATURE_FLAG to testFeatureFlag) + mapOf(FeatureFlagId.DOWNLOADS_SUPPORT to testFeatureFlag) ) // TODO(#5341): Replace appSessionId generation to the modified Twitter snowflake algorithm. @@ -462,9 +458,9 @@ class ApplicationLifecycleObserverTest { assertThat(eventLog).hasFeatureFlagContextThat { hasSessionIdThat().isEqualTo(sessionId) hasFeatureFlagItemContextThatAtIndex(0) { - hasFeatureFlagNameThat().isEqualTo(TEST_FEATURE_FLAG) + hasFeatureFlagIdThat().isEqualTo(FeatureFlagId.DOWNLOADS_SUPPORT) hasFeatureFlagEnabledStateThat().isEqualTo(false) - hasFeatureFlagSyncStateThat().isEqualTo(PlatformParameter.SyncStatus.NOT_SYNCED_FROM_SERVER) + hasFeatureFlagSyncStateThat().isEqualTo(SyncStatus.NOT_SYNCED_FROM_SERVER) } } } diff --git a/domain/src/test/java/org/oppia/android/domain/oppialogger/analytics/BUILD.bazel b/domain/src/test/java/org/oppia/android/domain/oppialogger/analytics/BUILD.bazel index 90901278fd4..4894ab5b6fa 100644 --- a/domain/src/test/java/org/oppia/android/domain/oppialogger/analytics/BUILD.bazel +++ b/domain/src/test/java/org/oppia/android/domain/oppialogger/analytics/BUILD.bazel @@ -197,6 +197,7 @@ oppia_android_test( "//testing/src/main/java/org/oppia/android/testing/junit:parameterized_robolectric_test_runner", "//testing/src/main/java/org/oppia/android/testing/logging:event_log_subject", "//testing/src/main/java/org/oppia/android/testing/logging:sync_status_test_module", + "//testing/src/main/java/org/oppia/android/testing/platformparameter:test_module", "//testing/src/main/java/org/oppia/android/testing/robolectric:test_module", "//testing/src/main/java/org/oppia/android/testing/threading:test_coroutine_dispatchers", "//testing/src/main/java/org/oppia/android/testing/threading:test_module", @@ -319,6 +320,7 @@ oppia_android_test( "//testing", "//testing/src/main/java/org/oppia/android/testing/data:data_provider_test_monitor", "//testing/src/main/java/org/oppia/android/testing/logging:event_log_subject", + "//testing/src/main/java/org/oppia/android/testing/platformparameter:test_module", "//testing/src/main/java/org/oppia/android/testing/robolectric:test_module", "//testing/src/main/java/org/oppia/android/testing/threading:test_coroutine_dispatchers", "//testing/src/main/java/org/oppia/android/testing/threading:test_module", diff --git a/domain/src/test/java/org/oppia/android/domain/oppialogger/analytics/CpuPerformanceSnapshotterTest.kt b/domain/src/test/java/org/oppia/android/domain/oppialogger/analytics/CpuPerformanceSnapshotterTest.kt index 4deba9bb943..c5679986c08 100644 --- a/domain/src/test/java/org/oppia/android/domain/oppialogger/analytics/CpuPerformanceSnapshotterTest.kt +++ b/domain/src/test/java/org/oppia/android/domain/oppialogger/analytics/CpuPerformanceSnapshotterTest.kt @@ -9,6 +9,7 @@ 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 @@ -87,6 +88,11 @@ class CpuPerformanceSnapshotterTest { setUpTestApplicationComponent() } + @After + fun tearDown() { + TestPlatformParameterModule.reset() + } + @Test fun testSnapshotter_updateIconificationToBackground_logsCpuUsageInBackgroundState() { cpuPerformanceSnapshotter.initialiseSnapshotter() diff --git a/domain/src/test/java/org/oppia/android/domain/oppialogger/analytics/FeatureFlagsLoggerTest.kt b/domain/src/test/java/org/oppia/android/domain/oppialogger/analytics/FeatureFlagsLoggerTest.kt index fc4425c0dbe..888ccb729d3 100644 --- a/domain/src/test/java/org/oppia/android/domain/oppialogger/analytics/FeatureFlagsLoggerTest.kt +++ b/domain/src/test/java/org/oppia/android/domain/oppialogger/analytics/FeatureFlagsLoggerTest.kt @@ -11,7 +11,8 @@ import dagger.Provides import org.junit.Before import org.junit.Test import org.junit.runner.RunWith -import org.oppia.android.app.model.PlatformParameter.SyncStatus +import org.oppia.android.app.model.FeatureFlagId +import org.oppia.android.app.model.SyncStatus import org.oppia.android.domain.oppialogger.EventLogStorageCacheSize import org.oppia.android.domain.oppialogger.ExceptionLogStorageCacheSize import org.oppia.android.domain.oppialogger.LoggingIdentifierModule @@ -25,10 +26,6 @@ import org.oppia.android.testing.junit.OppiaParameterizedTestRunner.SelectRunner import org.oppia.android.testing.junit.ParameterizedRobolectricTestRunner import org.oppia.android.testing.logging.EventLogSubject.Companion.assertThat import org.oppia.android.testing.logging.SyncStatusTestModule -import org.oppia.android.testing.platformparameter.EnableTestFeatureFlag -import org.oppia.android.testing.platformparameter.EnableTestFeatureFlagWithEnabledDefault -import org.oppia.android.testing.platformparameter.TEST_FEATURE_FLAG -import org.oppia.android.testing.platformparameter.TEST_FEATURE_FLAG_WITH_ENABLED_DEFAULTS import org.oppia.android.testing.platformparameter.TestPlatformParameterModule import org.oppia.android.testing.robolectric.RobolectricModule import org.oppia.android.testing.threading.TestCoroutineDispatchers @@ -43,21 +40,9 @@ 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.NetworkConnectionUtilDebugModule -import org.oppia.android.util.platformparameter.APP_AND_OS_DEPRECATION -import org.oppia.android.util.platformparameter.DOWNLOADS_SUPPORT -import org.oppia.android.util.platformparameter.EDIT_ACCOUNTS_OPTIONS_UI -import org.oppia.android.util.platformparameter.ENABLE_MULTIPLE_CLASSROOMS -import org.oppia.android.util.platformparameter.ENABLE_NPS_SURVEY -import org.oppia.android.util.platformparameter.ENABLE_ONBOARDING_FLOW_V2 -import org.oppia.android.util.platformparameter.ENABLE_PERFORMANCE_METRICS_COLLECTION -import org.oppia.android.util.platformparameter.ENABLE_TOPIC_INFO_TAB -import org.oppia.android.util.platformparameter.ENABLE_TOPIC_PRACTICE_TAB -import org.oppia.android.util.platformparameter.FAST_LANGUAGE_SWITCHING_IN_LESSON -import org.oppia.android.util.platformparameter.INTERACTION_CONFIG_CHANGE_STATE_RETENTION -import org.oppia.android.util.platformparameter.LEARNER_STUDY_ANALYTICS -import org.oppia.android.util.platformparameter.LOGGING_LEARNER_STUDY_IDS +import org.oppia.android.util.platformparameter.EnableDownloadsSupport +import org.oppia.android.util.platformparameter.EnableNpsSurvey import org.oppia.android.util.platformparameter.PlatformParameterValue -import org.oppia.android.util.platformparameter.SPOTLIGHT_UI import org.robolectric.annotation.Config import org.robolectric.annotation.LooperMode import javax.inject.Inject @@ -78,13 +63,15 @@ class FeatureFlagsLoggerTest { @Inject lateinit var featureFlagsLogger: FeatureFlagsLogger @Inject lateinit var fakeAnalyticsEventLogger: FakeAnalyticsEventLogger - @field:[Inject EnableTestFeatureFlag] + @field:[Inject EnableDownloadsSupport] lateinit var testFeatureFlag: PlatformParameterValue - @field:[Inject EnableTestFeatureFlagWithEnabledDefault] + @field:[Inject EnableNpsSurvey] lateinit var testFeatureFlagWithEnabledDefault: PlatformParameterValue @Parameter var index: Int = Int.MIN_VALUE - @Parameter lateinit var flagName: String + @Parameter lateinit var flagId: String + + private val flagIdEnum get() = FeatureFlagId.valueOf(flagId) @Before fun setUp() { @@ -117,7 +104,7 @@ class FeatureFlagsLoggerTest { @Test fun testLogFeatureFlags_logsTestFeatureFlag_hasCorrectDefaultValues() { featureFlagsLogger.setFeatureFlagItemMap( - mapOf(TEST_FEATURE_FLAG to testFeatureFlag) + mapOf(FeatureFlagId.DOWNLOADS_SUPPORT to testFeatureFlag) ) featureFlagsLogger.logAllFeatureFlags(TEST_SESSION_ID) @@ -126,7 +113,7 @@ class FeatureFlagsLoggerTest { val eventLog = fakeAnalyticsEventLogger.getMostRecentEvent() assertThat(eventLog).hasFeatureFlagContextThat { hasFeatureFlagItemContextThatAtIndex(0) { - hasFeatureFlagNameThat().isEqualTo(TEST_FEATURE_FLAG) + hasFeatureFlagIdThat().isEqualTo(FeatureFlagId.DOWNLOADS_SUPPORT) hasFeatureFlagEnabledStateThat().isEqualTo(false) hasFeatureFlagSyncStateThat().isEqualTo(SyncStatus.NOT_SYNCED_FROM_SERVER) } @@ -136,7 +123,7 @@ class FeatureFlagsLoggerTest { @Test fun testLogFeatureFlags_logsTestFeatureFlagWithEnabledDefaults_hasCorrectDefaultValues() { featureFlagsLogger.setFeatureFlagItemMap( - mapOf(TEST_FEATURE_FLAG_WITH_ENABLED_DEFAULTS to testFeatureFlagWithEnabledDefault) + mapOf(FeatureFlagId.NPS_SURVEY to testFeatureFlagWithEnabledDefault) ) featureFlagsLogger.logAllFeatureFlags(TEST_SESSION_ID) @@ -145,9 +132,9 @@ class FeatureFlagsLoggerTest { val eventLog = fakeAnalyticsEventLogger.getMostRecentEvent() assertThat(eventLog).hasFeatureFlagContextThat { hasFeatureFlagItemContextThatAtIndex(0) { - hasFeatureFlagNameThat().isEqualTo(TEST_FEATURE_FLAG_WITH_ENABLED_DEFAULTS) + hasFeatureFlagIdThat().isEqualTo(FeatureFlagId.NPS_SURVEY) hasFeatureFlagEnabledStateThat().isEqualTo(true) - hasFeatureFlagSyncStateThat().isEqualTo(SyncStatus.SYNCED_FROM_SERVER) + hasFeatureFlagSyncStateThat().isEqualTo(SyncStatus.NOT_SYNCED_FROM_SERVER) } } } @@ -166,30 +153,21 @@ class FeatureFlagsLoggerTest { } @Test - @Iteration("downloads_support", "index=0", "flagName=$DOWNLOADS_SUPPORT") - @Iteration("learner_study_analytics", "index=1", "flagName=$LEARNER_STUDY_ANALYTICS") - @Iteration( - "fast_language_switching_in_lesson", "index=2", - "flagName=$FAST_LANGUAGE_SWITCHING_IN_LESSON" - ) - @Iteration("logging_learner_study_ids", "index=3", "flagName=$LOGGING_LEARNER_STUDY_IDS") - @Iteration("edit_accounts_options_ui", "index=4", "flagName=$EDIT_ACCOUNTS_OPTIONS_UI") - @Iteration( - "enable_performance_metrics_collection", "index=5", - "flagName=$ENABLE_PERFORMANCE_METRICS_COLLECTION" - ) - @Iteration("spotlight_ui", "index=6", "flagName=$SPOTLIGHT_UI") - @Iteration( - "interaction_config_change_state_retention", "index=7", - "flagName=$INTERACTION_CONFIG_CHANGE_STATE_RETENTION" - ) - @Iteration("app_and_os_deprecation", "index=8", "flagName=$APP_AND_OS_DEPRECATION") - @Iteration("enable_nps_survey", "index=9", "flagName=$ENABLE_NPS_SURVEY") - @Iteration("enable_onboarding_flow_v2", "index=10", "flagName=$ENABLE_ONBOARDING_FLOW_V2") - @Iteration("enable_multiple_classrooms", "index=11", "flagName=$ENABLE_MULTIPLE_CLASSROOMS") - @Iteration("extra_topic_info_tab", "index=12", "flagName=$ENABLE_TOPIC_INFO_TAB") - @Iteration("enable_topic_practice_tab", "index=13", "flagName=$ENABLE_TOPIC_PRACTICE_TAB") - fun testLogFeatureFlags_allFeatureFlagNamesAreLogged() { + @Iteration("learner_study_analytics", "index=0", "flagId=LEARNER_STUDY_ANALYTICS") + @Iteration("performance_metrics_collection", "index=1", "flagId=PERFORMANCE_METRICS_COLLECTION") + @Iteration("edit_accounts_options_ui", "index=2", "flagId=EDIT_ACCOUNTS_OPTIONS_UI") + @Iteration("spotlight_ui", "index=3", "flagId=SPOTLIGHT_UI") + @Iteration("downloads_support", "index=4", "flagId=DOWNLOADS_SUPPORT") + @Iteration("config_change_state", "index=5", "flagId=INTERACTION_CONFIG_CHANGE_STATE_RETENTION") + @Iteration("app_and_os_deprecation", "index=6", "flagId=APP_AND_OS_DEPRECATION") + @Iteration("fast_lang_switching_in_lesson", "index=7", "flagId=FAST_LANGUAGE_SWITCHING_IN_LESSON") + @Iteration("logging_learner_study_ids", "index=8", "flagId=LOGGING_LEARNER_STUDY_IDS") + @Iteration("nps_survey", "index=9", "flagId=NPS_SURVEY") + @Iteration("onboarding_flow_v2", "index=10", "flagId=ONBOARDING_FLOW_V2") + @Iteration("multiple_classrooms", "index=11", "flagId=MULTIPLE_CLASSROOMS") + @Iteration("topic_info_tab", "index=12", "flagId=TOPIC_INFO_TAB") + @Iteration("topic_practice_tab", "index=13", "flagId=TOPIC_PRACTICE_TAB") + fun testLogFeatureFlags_allFeatureFlagIdsAreLogged() { featureFlagsLogger.logAllFeatureFlags(TEST_SESSION_ID) testCoroutineDispatchers.runCurrent() @@ -197,7 +175,7 @@ class FeatureFlagsLoggerTest { val eventLog = fakeAnalyticsEventLogger.getMostRecentEvent() assertThat(eventLog).hasFeatureFlagContextThat { hasFeatureFlagItemContextThatAtIndex(index) { - hasFeatureFlagNameThat().isEqualTo(flagName) + hasFeatureFlagIdThat().isEqualTo(flagIdEnum) } } } diff --git a/domain/src/test/java/org/oppia/android/domain/oppialogger/analytics/FirestoreDataControllerTest.kt b/domain/src/test/java/org/oppia/android/domain/oppialogger/analytics/FirestoreDataControllerTest.kt index d275bc81c07..f8bbd75d873 100644 --- a/domain/src/test/java/org/oppia/android/domain/oppialogger/analytics/FirestoreDataControllerTest.kt +++ b/domain/src/test/java/org/oppia/android/domain/oppialogger/analytics/FirestoreDataControllerTest.kt @@ -24,13 +24,13 @@ import org.oppia.android.app.model.ProfileId import org.oppia.android.app.model.SurveyQuestionName import org.oppia.android.data.persistence.PersistentCacheStore import org.oppia.android.domain.oppialogger.FirestoreLogStorageCacheSize -import org.oppia.android.domain.platformparameter.PlatformParameterModule import org.oppia.android.domain.platformparameter.PlatformParameterSingletonModule import org.oppia.android.testing.FakeFirestoreEventLogger import org.oppia.android.testing.TestLogReportingModule import org.oppia.android.testing.data.DataProviderTestMonitor import org.oppia.android.testing.firebase.TestAuthenticationModule import org.oppia.android.testing.logging.EventLogSubject.Companion.assertThat +import org.oppia.android.testing.platformparameter.TestPlatformParameterModule import org.oppia.android.testing.robolectric.RobolectricModule import org.oppia.android.testing.threading.TestCoroutineDispatchers import org.oppia.android.testing.threading.TestDispatcherModule @@ -456,7 +456,6 @@ class FirestoreDataControllerTest { FakeOppiaClockModule::class, LocaleProdModule::class, NetworkConnectionUtilDebugModule::class, - PlatformParameterModule::class, PlatformParameterSingletonModule::class, RobolectricModule::class, SyncStatusModule::class, @@ -464,7 +463,8 @@ class FirestoreDataControllerTest { TestDispatcherModule::class, TestLogReportingModule::class, TestLogStorageModule::class, - TestModule::class + TestModule::class, + TestPlatformParameterModule::class ] ) interface TestApplicationComponent : DataProvidersInjector { diff --git a/domain/src/test/java/org/oppia/android/domain/oppialogger/analytics/LearnerAnalyticsLoggerTest.kt b/domain/src/test/java/org/oppia/android/domain/oppialogger/analytics/LearnerAnalyticsLoggerTest.kt index 75cf3ee4157..aadbd78e832 100644 --- a/domain/src/test/java/org/oppia/android/domain/oppialogger/analytics/LearnerAnalyticsLoggerTest.kt +++ b/domain/src/test/java/org/oppia/android/domain/oppialogger/analytics/LearnerAnalyticsLoggerTest.kt @@ -38,7 +38,6 @@ import org.oppia.android.domain.hintsandsolution.HintsAndSolutionConfigModule import org.oppia.android.domain.hintsandsolution.HintsAndSolutionProdModule import org.oppia.android.domain.oppialogger.ApplicationIdSeed import org.oppia.android.domain.oppialogger.LogStorageModule -import org.oppia.android.domain.platformparameter.PlatformParameterModule import org.oppia.android.domain.platformparameter.PlatformParameterSingletonModule import org.oppia.android.domain.topic.TEST_EXPLORATION_ID_2 import org.oppia.android.domain.topic.TEST_EXPLORATION_ID_5 @@ -53,6 +52,7 @@ import org.oppia.android.testing.junit.OppiaParameterizedTestRunner.SelectRunner import org.oppia.android.testing.junit.ParameterizedRobolectricTestRunner import org.oppia.android.testing.logging.EventLogSubject.Companion.assertThat import org.oppia.android.testing.logging.SyncStatusTestModule +import org.oppia.android.testing.platformparameter.TestPlatformParameterModule import org.oppia.android.testing.robolectric.RobolectricModule import org.oppia.android.testing.threading.TestCoroutineDispatchers import org.oppia.android.testing.threading.TestDispatcherModule @@ -2115,7 +2115,6 @@ class LearnerAnalyticsLoggerTest { NumberWithUnitsRuleModule::class, NumericExpressionInputModule::class, NumericInputRuleModule::class, - PlatformParameterModule::class, PlatformParameterSingletonModule::class, RatioInputModule::class, RobolectricModule::class, @@ -2124,6 +2123,7 @@ class LearnerAnalyticsLoggerTest { TestDispatcherModule::class, TestLogReportingModule::class, TestModule::class, + TestPlatformParameterModule::class, TextInputRuleModule::class ] ) 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 index 03cbcf3af4b..9958aca6601 100644 --- 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 @@ -28,12 +28,12 @@ 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.platformparameter.TestPlatformParameterModule import org.oppia.android.testing.robolectric.RobolectricModule import org.oppia.android.testing.threading.TestDispatcherModule import org.oppia.android.testing.time.FakeOppiaClock @@ -575,14 +575,14 @@ class PerformanceMetricsControllerTest { LoggingIdentifierModule::class, MetricLogSchedulerModule::class, NetworkConnectionUtilDebugModule::class, - PlatformParameterModule::class, PlatformParameterSingletonModule::class, RobolectricModule::class, SyncStatusTestModule::class, TestDispatcherModule::class, TestLogReportingModule::class, TestLogStorageModule::class, - TestModule::class + TestModule::class, + TestPlatformParameterModule::class ] ) interface TestApplicationComponent : DataProvidersInjector { 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 index a233e08ee73..8b67112ec69 100644 --- 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 @@ -39,6 +39,7 @@ 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.caching.AssetModule import org.oppia.android.util.data.DataProvidersInjector import org.oppia.android.util.data.DataProvidersInjectorProvider import org.oppia.android.util.locale.LocaleProdModule @@ -333,6 +334,7 @@ class PerformanceMetricsLoggerTest { @Singleton @Component( modules = [ + AssetModule::class, ApplicationLifecycleModule::class, FakeOppiaClockModule::class, LocaleProdModule::class, 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 index 427306107dc..216221a986a 100644 --- 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 @@ -28,9 +28,9 @@ import org.oppia.android.domain.oppialogger.analytics.CpuPerformanceSnapshotterM 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.domain.platformparameter.PlatformParameterModule 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.util.caching.AssetModule @@ -185,14 +185,14 @@ class FakeLogSchedulerTest { NetworkConnectionUtilProdModule::class, OppiaClockModule::class, PerformanceMetricsConfigurationsModule::class, - PlatformParameterModule::class, PlatformParameterSingletonModule::class, RobolectricModule::class, SyncStatusModule::class, TestDispatcherModule::class, TestLogReportingModule::class, TestLogStorageModule::class, - TestModule::class + TestModule::class, + TestPlatformParameterModule::class ] ) interface TestApplicationComponent : DataProvidersInjector { 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 index a2e2491656b..2c1a4a02c21 100644 --- 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 @@ -19,6 +19,7 @@ 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 @@ -109,6 +110,11 @@ class MetricLogSchedulingWorkerTest { WorkManagerTestInitHelper.initializeTestWorkManager(context, config) } + @After + fun tearDown() { + TestPlatformParameterModule.reset() + } + @Test fun testWorker_enqueueRequest_verifyStorageUsagePerformanceMetricLogging() { val workManager = WorkManager.getInstance(ApplicationProvider.getApplicationContext()) 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 index bf433691f3c..96815794e31 100644 --- 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 @@ -24,10 +24,10 @@ import org.oppia.android.domain.oppialogger.LoggingIdentifierModule import org.oppia.android.domain.oppialogger.analytics.ApplicationLifecycleModule import org.oppia.android.domain.oppialogger.analytics.CpuPerformanceSnapshotterModule 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.TestLogReportingModule import org.oppia.android.testing.logging.SyncStatusTestModule +import org.oppia.android.testing.platformparameter.TestPlatformParameterModule import org.oppia.android.testing.robolectric.RobolectricModule import org.oppia.android.testing.threading.TestCoroutineDispatchers import org.oppia.android.testing.threading.TestDispatcherModule @@ -184,13 +184,13 @@ class PerformanceMetricsLogSchedulerTest { MetricLogSchedulerModule::class, NetworkConnectionUtilDebugModule::class, PerformanceMetricsConfigurationsModule::class, - PlatformParameterModule::class, PlatformParameterSingletonModule::class, RobolectricModule::class, SyncStatusTestModule::class, TestDispatcherModule::class, TestLogReportingModule::class, - TestModule::class + TestModule::class, + TestPlatformParameterModule::class ] ) interface TestApplicationComponent : DataProvidersInjector { diff --git a/domain/src/test/java/org/oppia/android/domain/oppialogger/loguploader/BUILD.bazel b/domain/src/test/java/org/oppia/android/domain/oppialogger/loguploader/BUILD.bazel index a6e4f4d9620..23ec337da67 100644 --- a/domain/src/test/java/org/oppia/android/domain/oppialogger/loguploader/BUILD.bazel +++ b/domain/src/test/java/org/oppia/android/domain/oppialogger/loguploader/BUILD.bazel @@ -21,6 +21,7 @@ oppia_android_test( "//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", "//testing", + "//testing/src/main/java/org/oppia/android/testing/platformparameter:test_module", "//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", diff --git a/domain/src/test/java/org/oppia/android/domain/oppialogger/loguploader/LogReportWorkManagerInitializerTest.kt b/domain/src/test/java/org/oppia/android/domain/oppialogger/loguploader/LogReportWorkManagerInitializerTest.kt index 2e53a0f35d6..ef92acaf13c 100644 --- a/domain/src/test/java/org/oppia/android/domain/oppialogger/loguploader/LogReportWorkManagerInitializerTest.kt +++ b/domain/src/test/java/org/oppia/android/domain/oppialogger/loguploader/LogReportWorkManagerInitializerTest.kt @@ -34,12 +34,12 @@ 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 import org.oppia.android.testing.FakeExceptionLogger import org.oppia.android.testing.TestLogReportingModule import org.oppia.android.testing.firebase.TestAuthenticationModule +import org.oppia.android.testing.platformparameter.TestPlatformParameterModule import org.oppia.android.testing.robolectric.RobolectricModule import org.oppia.android.testing.threading.TestCoroutineDispatchers import org.oppia.android.testing.threading.TestDispatcherModule @@ -326,7 +326,6 @@ class LogReportWorkManagerInitializerTest { LoggerModule::class, LoggingIdentifierModule::class, NetworkConnectionUtilDebugModule::class, - PlatformParameterModule::class, PlatformParameterSingletonModule::class, RobolectricModule::class, SyncStatusModule::class, @@ -335,7 +334,8 @@ class LogReportWorkManagerInitializerTest { TestFirebaseLogUploaderModule::class, TestLogReportingModule::class, TestLogStorageModule::class, - TestModule::class + TestModule::class, + TestPlatformParameterModule::class ] ) interface TestApplicationComponent : DataProvidersInjector { 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 5139298d9dd..cad34cf8422 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 @@ -19,6 +19,7 @@ import dagger.BindsInstance import dagger.Component import dagger.Module import dagger.Provides +import org.junit.After import org.junit.Test import org.junit.runner.RunWith import org.mockito.Mockito.`when` @@ -137,6 +138,11 @@ class LogUploadWorkerTest { private val exception = Exception("TEST") + @After + fun tearDown() { + TestPlatformParameterModule.reset() + } + @Test fun testWorker_logEvent_withoutNetwork_enqueueRequest_verifyFailed() { setUpTestApplicationComponent() diff --git a/domain/src/test/java/org/oppia/android/domain/platformparameter/PlatformParameterControllerProdImplTest.kt b/domain/src/test/java/org/oppia/android/domain/platformparameter/PlatformParameterControllerProdImplTest.kt new file mode 100644 index 00000000000..b8fdb46ae04 --- /dev/null +++ b/domain/src/test/java/org/oppia/android/domain/platformparameter/PlatformParameterControllerProdImplTest.kt @@ -0,0 +1,117 @@ +package org.oppia.android.domain.platformparameter + +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.Test +import org.junit.runner.RunWith +import org.oppia.android.domain.oppialogger.LogStorageModule +import org.oppia.android.testing.TestLogReportingModule +import org.oppia.android.testing.data.DataProviderTestMonitor +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.caching.AssetModule +import org.oppia.android.util.data.DataProvidersInjector +import org.oppia.android.util.data.DataProvidersInjectorProvider +import org.oppia.android.util.locale.testing.LocaleTestModule +import org.oppia.android.util.logging.LoggerModule +import org.oppia.android.util.networking.NetworkConnectionUtilDebugModule +import org.robolectric.annotation.Config +import org.robolectric.annotation.LooperMode +import javax.inject.Inject +import javax.inject.Provider +import javax.inject.Singleton + +/** Tests for [PlatformParameterController]. */ +// FunctionName: test names are conventionally named with underscores. +@Suppress("FunctionName") +@RunWith(AndroidJUnit4::class) +@LooperMode(LooperMode.Mode.PAUSED) +@Config(application = PlatformParameterControllerProdImplTest.TestApplication::class) +class PlatformParameterControllerProdImplTest { + @Inject lateinit var platformParameterController: PlatformParameterController + @Inject lateinit var monitorFactory: DataProviderTestMonitor.Factory + @Inject lateinit var platformParamProcessStateProvider: Provider + + // TODO(#5835): Finish these tests. + + @Test + fun testGetParameterInitializationStatus_initialState_isTrue() { + setUpTestApplicationComponent() + // TODO(#5835): Remove this. It's needed to force parameters to load via the test param module. + platformParamProcessStateProvider.get() + + val initStatusProvider = platformParameterController.getParameterInitializationStatus() + + val isInited = monitorFactory.waitForNextSuccessfulResult(initStatusProvider) + assertThat(isInited).isTrue() + } + + 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(#89): Move this to a common test application component. + @Singleton + @Component( + modules = [ + AssetModule::class, + FakeOppiaClockModule::class, + LocaleTestModule::class, + LogStorageModule::class, + LoggerModule::class, + NetworkConnectionUtilDebugModule::class, + RobolectricModule::class, + TestDispatcherModule::class, + TestLogReportingModule::class, + TestModule::class, + TestPlatformParameterModule::class + ] + ) + interface TestApplicationComponent : DataProvidersInjector { + @Component.Builder + interface Builder { + @BindsInstance + fun setApplication(application: Application): Builder + fun build(): TestApplicationComponent + } + + fun inject(platformParameterControllerTest: PlatformParameterControllerProdImplTest) + } + + class TestApplication : Application(), DataProvidersInjectorProvider { + private val component: TestApplicationComponent by lazy { + DaggerPlatformParameterControllerProdImplTest_TestApplicationComponent.builder() + .setApplication(this) + .build() + } + + fun inject(platformParameterControllerTest: PlatformParameterControllerProdImplTest) { + component.inject(platformParameterControllerTest) + } + + public override fun attachBaseContext(base: Context?) { + super.attachBaseContext(base) + } + + override fun getDataProvidersInjector(): DataProvidersInjector = component + } +} diff --git a/domain/src/test/java/org/oppia/android/domain/platformparameter/PlatformParameterControllerTest.kt b/domain/src/test/java/org/oppia/android/domain/platformparameter/PlatformParameterControllerTest.kt deleted file mode 100644 index fcf78470ba3..00000000000 --- a/domain/src/test/java/org/oppia/android/domain/platformparameter/PlatformParameterControllerTest.kt +++ /dev/null @@ -1,262 +0,0 @@ -package org.oppia.android.domain.platformparameter - -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.Test -import org.junit.runner.RunWith -import org.oppia.android.app.model.PlatformParameter -import org.oppia.android.domain.oppialogger.LogStorageModule -import org.oppia.android.testing.TestLogReportingModule -import org.oppia.android.testing.data.DataProviderTestMonitor -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.util.data.DataProvidersInjector -import org.oppia.android.util.data.DataProvidersInjectorProvider -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.NetworkConnectionUtilDebugModule -import org.oppia.android.util.platformparameter.PlatformParameterSingleton -import org.robolectric.annotation.Config -import org.robolectric.annotation.LooperMode -import javax.inject.Inject -import javax.inject.Singleton - -private const val STRING_PLATFORM_PARAMETER_NAME = "string_platform_parameter_name" -private const val STRING_PLATFORM_PARAMETER_VALUE = "string_platform_parameter_value" - -private const val INTEGER_PLATFORM_PARAMETER_NAME = "integer_platform_parameter_name" -private const val INTEGER_PLATFORM_PARAMETER_VALUE = 1 - -private const val BOOLEAN_PLATFORM_PARAMETER_NAME = "boolean_platform_parameter_name" -private const val BOOLEAN_PLATFORM_PARAMETER_VALUE = true - -/** Tests for [PlatformParameterController]. */ -// FunctionName: test names are conventionally named with underscores. -@Suppress("FunctionName") -@RunWith(AndroidJUnit4::class) -@LooperMode(LooperMode.Mode.PAUSED) -@Config(application = PlatformParameterControllerTest.TestApplication::class) -class PlatformParameterControllerTest { - @Inject lateinit var platformParameterController: PlatformParameterController - @Inject lateinit var platformParameterSingleton: PlatformParameterSingleton - @Inject lateinit var testCoroutineDispatchers: TestCoroutineDispatchers - @Inject lateinit var monitorFactory: DataProviderTestMonitor.Factory - - private val mockPlatformParameterList by lazy { - listOf( - PlatformParameter.newBuilder().setName(STRING_PLATFORM_PARAMETER_NAME) - .setString(STRING_PLATFORM_PARAMETER_VALUE).build(), - PlatformParameter.newBuilder().setName(INTEGER_PLATFORM_PARAMETER_NAME) - .setInteger(INTEGER_PLATFORM_PARAMETER_VALUE).build(), - PlatformParameter.newBuilder().setName(BOOLEAN_PLATFORM_PARAMETER_NAME) - .setBoolean(BOOLEAN_PLATFORM_PARAMETER_VALUE).build() - ) - } - - @Test - fun testController_noPreviousDatabase_readPlatformParameters_platformParameterMapIsEmpty() { - setUpTestApplicationComponent() - val databaseProvider = platformParameterController.getParameterDatabase() - - // The platformParameterMap must be empty as there was no previously cached data. - monitorFactory.waitForNextSuccessfulResult(databaseProvider) - assertThat(platformParameterSingleton.getPlatformParameterMap()).isEmpty() - } - - @Test - fun testController_existingDatabase_readPlatformParameters_platformParameterMapHasValues() { - // Simulate that previous app already has cached platform parameter values in cache store. - executeInPrevious { testComponent -> - testComponent.getPlatformParameterController().updatePlatformParameterDatabase( - mockPlatformParameterList - ) - testComponent.getTestCoroutineDispatchers().runCurrent() - } - - // Create the application after previous arrangement to simulate a re-creation. - setUpTestApplicationComponent() - val databaseProvider = platformParameterController.getParameterDatabase() - - // The platformParameterMap must have values as application had cached platform parameter data. - monitorFactory.waitForNextSuccessfulResult(databaseProvider) - assertThat(platformParameterSingleton.getPlatformParameterMap()).isNotEmpty() - verifyEntriesInsidePlatformParameterMap(platformParameterSingleton.getPlatformParameterMap()) - } - - @Test - fun testController_updateEmptyDatabase_readPlatformParameters_platformParameterMapHasValues() { - setUpTestApplicationComponent() - platformParameterController.updatePlatformParameterDatabase(mockPlatformParameterList) - testCoroutineDispatchers.runCurrent() - val databaseProvider = platformParameterController.getParameterDatabase() - - // The platformParameterMap must have values as we updated the database with dummy list. - monitorFactory.waitForNextSuccessfulResult(databaseProvider) - assertThat(platformParameterSingleton.getPlatformParameterMap()).isNotEmpty() - verifyEntriesInsidePlatformParameterMap(platformParameterSingleton.getPlatformParameterMap()) - } - - @Test - fun testController_updateExistingDatabase_readPlatformParameters_platformParameterMapHasNewValues() { // ktlint-disable max-line-length - // Simulate that previous app already has cached platform parameter values in cache store. - executeInPrevious { testComponent -> - testComponent.getPlatformParameterController().updatePlatformParameterDatabase( - mockPlatformParameterList - ) - testComponent.getTestCoroutineDispatchers().runCurrent() - } - - // Create the application after previous arrangement to simulate a re-creation. - setUpTestApplicationComponent() - platformParameterController.updatePlatformParameterDatabase(listOf()) - testCoroutineDispatchers.runCurrent() - val databaseProvider = platformParameterController.getParameterDatabase() - - // The new set of values must be empty as we updated the database with an empty list. - monitorFactory.waitForNextSuccessfulResult(databaseProvider) - assertThat(platformParameterSingleton.getPlatformParameterMap()).isEmpty() - } - - @Test - fun testController_noPreviousDatabase_performUpdateOperation_returnsSuccess() { - setUpTestApplicationComponent() - val updateProvider = - platformParameterController.updatePlatformParameterDatabase(mockPlatformParameterList) - - // After a successful update operation we should receive a success result. - monitorFactory.waitForNextSuccessfulResult(updateProvider) - } - - @Test - fun testController_existingDatabase_performUpdateOperation_returnsSuccess() { - // Simulate that previous app already has cached platform parameter values in cache store. - executeInPrevious { testComponent -> - testComponent.getPlatformParameterController().updatePlatformParameterDatabase( - mockPlatformParameterList - ) - testComponent.getTestCoroutineDispatchers().runCurrent() - } - - // Create the application after previous arrangement to simulate a re-creation. - setUpTestApplicationComponent() - val updateProvider = - platformParameterController.updatePlatformParameterDatabase(mockPlatformParameterList) - - // After a successful update operation we should receive a success result. - monitorFactory.waitForNextSuccessfulResult(updateProvider) - } - - /** - * This function checks does all the entries inside the [mockPlatformParameterList] exist inside - * [platformParameterMap] that was retrieved from cache store. - * @param platformParameterMap Map map of cached values - */ - private fun verifyEntriesInsidePlatformParameterMap( - platformParameterMap: Map - ) { - assertThat(platformParameterMap.size).isEqualTo(mockPlatformParameterList.size) - mockPlatformParameterList.forEach { - assertThat(platformParameterMap[it.name]).isEqualTo(it) - } - } - - private fun setUpTestApplicationComponent() { - ApplicationProvider.getApplicationContext().inject(this) - } - - private fun executeInPrevious(block: (TestApplicationComponent) -> Unit) { - val testApplication = TestApplication() - testApplication.attachBaseContext(ApplicationProvider.getApplicationContext()) - - block( - DaggerPlatformParameterControllerTest_TestApplicationComponent.builder() - .setApplication(testApplication) - .build() - ) - } - - // TODO(#89): Move this to a common test application component. - @Module - class TestModule { - @Provides - @Singleton - fun provideContext(application: Application): Context { - return application - } - - @Provides - @Singleton - fun providePlatformParameterSingleton( - platformParameterSingletonImpl: PlatformParameterSingletonImpl - ): PlatformParameterSingleton = platformParameterSingletonImpl - - // 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 - } - - // TODO(#89): Move this to a common test application component. - @Singleton - @Component( - modules = [ - LogStorageModule::class, - NetworkConnectionUtilDebugModule::class, - RobolectricModule::class, - TestDispatcherModule::class, - TestLogReportingModule::class, - TestModule::class - ] - ) - interface TestApplicationComponent : DataProvidersInjector { - @Component.Builder - interface Builder { - @BindsInstance - fun setApplication(application: Application): Builder - fun build(): TestApplicationComponent - } - - fun inject(platformParameterControllerTest: PlatformParameterControllerTest) - - fun getPlatformParameterController(): PlatformParameterController - - fun getTestCoroutineDispatchers(): TestCoroutineDispatchers - } - - class TestApplication : Application(), DataProvidersInjectorProvider { - private val component: TestApplicationComponent by lazy { - DaggerPlatformParameterControllerTest_TestApplicationComponent.builder() - .setApplication(this) - .build() - } - - fun inject(platformParameterControllerTest: PlatformParameterControllerTest) { - component.inject(platformParameterControllerTest) - } - - public override fun attachBaseContext(base: Context?) { - super.attachBaseContext(base) - } - - override fun getDataProvidersInjector(): DataProvidersInjector = component - } -} diff --git a/domain/src/test/java/org/oppia/android/domain/platformparameter/PlatformParameterModuleTest.kt b/domain/src/test/java/org/oppia/android/domain/platformparameter/PlatformParameterModuleTest.kt index 8165a11f2a1..c33c122e757 100644 --- a/domain/src/test/java/org/oppia/android/domain/platformparameter/PlatformParameterModuleTest.kt +++ b/domain/src/test/java/org/oppia/android/domain/platformparameter/PlatformParameterModuleTest.kt @@ -13,26 +13,18 @@ import dagger.Module import dagger.Provides import org.junit.Test import org.junit.runner.RunWith -import org.oppia.android.app.model.PlatformParameter -import org.oppia.android.testing.platformparameter.TEST_BOOLEAN_PARAM_DEFAULT_VALUE -import org.oppia.android.testing.platformparameter.TEST_BOOLEAN_PARAM_NAME -import org.oppia.android.testing.platformparameter.TEST_BOOLEAN_PARAM_SERVER_VALUE -import org.oppia.android.testing.platformparameter.TEST_INTEGER_PARAM_DEFAULT_VALUE -import org.oppia.android.testing.platformparameter.TEST_INTEGER_PARAM_NAME -import org.oppia.android.testing.platformparameter.TEST_INTEGER_PARAM_SERVER_VALUE -import org.oppia.android.testing.platformparameter.TEST_STRING_PARAM_DEFAULT_VALUE -import org.oppia.android.testing.platformparameter.TEST_STRING_PARAM_NAME -import org.oppia.android.testing.platformparameter.TEST_STRING_PARAM_SERVER_VALUE -import org.oppia.android.testing.platformparameter.TestBooleanParam -import org.oppia.android.testing.platformparameter.TestIntegerParam -import org.oppia.android.testing.platformparameter.TestPlatformParameterModule -import org.oppia.android.testing.platformparameter.TestStringParam -import org.oppia.android.util.extensions.getVersionCode +import org.oppia.android.testing.TestLogReportingModule +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.locale.testing.LocaleTestModule +import org.oppia.android.util.logging.LoggerModule import org.oppia.android.util.platformparameter.EnableAppAndOsDeprecation import org.oppia.android.util.platformparameter.ForcedAppUpdateVersionCode import org.oppia.android.util.platformparameter.LowestSupportedApiLevel import org.oppia.android.util.platformparameter.OptionalAppUpdateVersionCode -import org.oppia.android.util.platformparameter.PlatformParameterSingleton import org.oppia.android.util.platformparameter.PlatformParameterValue import org.robolectric.Shadows import org.robolectric.annotation.Config @@ -49,21 +41,9 @@ import javax.inject.Singleton @LooperMode(LooperMode.Mode.PAUSED) @Config(application = PlatformParameterModuleTest.TestApplication::class) class PlatformParameterModuleTest { - - @Inject - lateinit var platformParameterSingleton: PlatformParameterSingleton - - @Inject - lateinit var context: Context - - @field:[Inject TestStringParam] - lateinit var stringPlatformParameterProvider: Provider> - - @field:[Inject TestIntegerParam] - lateinit var integerPlatformParameterProvider: Provider> - - @field:[Inject TestBooleanParam] - lateinit var booleanPlatformParameterProvider: Provider> + @Inject lateinit var platformParameterController: PlatformParameterController + @Inject lateinit var testCoroutineDispatchers: TestCoroutineDispatchers + @Inject lateinit var context: Context @field:[Inject EnableAppAndOsDeprecation] lateinit var enableAppAndOsDeprecationProvider: Provider> @@ -77,118 +57,30 @@ class PlatformParameterModuleTest { @field:[Inject LowestSupportedApiLevel] lateinit var lowestSupportedApiLevelProvider: Provider> - private val platformParameterMapWithValues by lazy { - val mockStringPlatformParameter = PlatformParameter.newBuilder() - .setString(TEST_STRING_PARAM_SERVER_VALUE).build() - val mockIntegerPlatformParameter = PlatformParameter.newBuilder() - .setInteger(TEST_INTEGER_PARAM_SERVER_VALUE).build() - val mockBooleanPlatformParameter = PlatformParameter.newBuilder() - .setBoolean(TEST_BOOLEAN_PARAM_SERVER_VALUE).build() - - mapOf( - TEST_STRING_PARAM_NAME to mockStringPlatformParameter, - TEST_INTEGER_PARAM_NAME to mockIntegerPlatformParameter, - TEST_BOOLEAN_PARAM_NAME to mockBooleanPlatformParameter - ) - } - - private val partialPlatformParameterMapWithValues by lazy { - val mockIntegerPlatformParameter = PlatformParameter.newBuilder() - .setInteger(TEST_INTEGER_PARAM_SERVER_VALUE).build() - val mockBooleanPlatformParameter = PlatformParameter.newBuilder() - .setBoolean(TEST_BOOLEAN_PARAM_SERVER_VALUE).build() - - mapOf( - TEST_INTEGER_PARAM_NAME to mockIntegerPlatformParameter, - TEST_BOOLEAN_PARAM_NAME to mockBooleanPlatformParameter - ) - } - - @Test - fun testModule_initPlatformParameterMap_retrieveTestStringParameter_returnsParamValue() { - setUpTestApplicationComponent(platformParameterMapWithValues) - assertThat(stringPlatformParameterProvider.get().value) - .isEqualTo(TEST_STRING_PARAM_SERVER_VALUE) - } - - @Test - fun testModule_doNotInitPlatformParameterMap_retrieveTestStringParameter_returnsDefaultValue() { - setUpTestApplicationComponent(mapOf()) - assertThat(stringPlatformParameterProvider.get().value) - .isEqualTo(TEST_STRING_PARAM_DEFAULT_VALUE) - } - - @Test - fun testModule_initPlatformParameterMap_retrieveTestIntegerParameter_returnsParamValue() { - setUpTestApplicationComponent(platformParameterMapWithValues) - assertThat(integerPlatformParameterProvider.get().value) - .isEqualTo(TEST_INTEGER_PARAM_SERVER_VALUE) - } - - @Test - fun testModule_doNotInitPlatformParameterMap_retrieveTestIntegerParameter_returnsDefaultValue() { - setUpTestApplicationComponent(mapOf()) - assertThat(integerPlatformParameterProvider.get().value) - .isEqualTo(TEST_INTEGER_PARAM_DEFAULT_VALUE) - } - - @Test - fun testModule_initPlatformParameterMap_retrieveTestBooleanParameter_returnsParamValue() { - setUpTestApplicationComponent(platformParameterMapWithValues) - assertThat(booleanPlatformParameterProvider.get().value) - .isEqualTo(TEST_BOOLEAN_PARAM_SERVER_VALUE) - } - - @Test - fun testModule_doNotInitPlatformParameterMap_retrieveTestBooleanParameter_returnsDefaultValue() { - setUpTestApplicationComponent(mapOf()) - assertThat(booleanPlatformParameterProvider.get().value) - .isEqualTo(TEST_BOOLEAN_PARAM_DEFAULT_VALUE) - } - - @Test - fun testModule_initPlatformParameterMapPartially_returnsExpectedDefaultsAndValues() { - setUpTestApplicationComponent(partialPlatformParameterMapWithValues) - - // As the partial map didn't had String Parameter therefore default parameter value was injected - assertThat(stringPlatformParameterProvider.get().value) - .isEqualTo(TEST_STRING_PARAM_DEFAULT_VALUE) - - // As the partial map had Integer and Boolean Parameter therefore true parameter value was injected - assertThat(integerPlatformParameterProvider.get().value) - .isEqualTo(TEST_INTEGER_PARAM_SERVER_VALUE) - assertThat(booleanPlatformParameterProvider.get().value) - .isEqualTo(TEST_BOOLEAN_PARAM_SERVER_VALUE) - } + // TODO(#5835): Finish the tests for this suite & the test module version. @Test fun testModule_injectEnableAppAndOsDeprecation_hasCorrectDefaultValue() { - setUpTestApplicationComponent(platformParameterMapWithValues) + setUpTestApplicationComponent() assertThat(enableAppAndOsDeprecationProvider.get().value) .isEqualTo(TEST_ENABLE_APP_AND_OS_DEPRECATION_DEFAULT_VALUE) } @Test fun testModule_injectOptionalAppUpdateVersionCode_hasCorrectAppVersionCode() { - setUpTestApplicationComponent(platformParameterMapWithValues) - assertThat(optionalAppUpdateVersionCodeProvider.get().value) - .isEqualTo(context.getVersionCode()) - assertThat(optionalAppUpdateVersionCodeProvider.get().value) - .isEqualTo(TEST_APP_VERSION_CODE) + setUpTestApplicationComponent() + assertThat(optionalAppUpdateVersionCodeProvider.get().value).isEqualTo(0) } @Test fun testModule_injectForcedAppUpdateVersionCode_hasCorrectAppVersionCode() { - setUpTestApplicationComponent(platformParameterMapWithValues) - assertThat(forcedAppUpdateVersionCodeProvider.get().value) - .isEqualTo(context.getVersionCode()) - assertThat(forcedAppUpdateVersionCodeProvider.get().value) - .isEqualTo(TEST_APP_VERSION_CODE) + setUpTestApplicationComponent() + assertThat(forcedAppUpdateVersionCodeProvider.get().value).isEqualTo(0) } @Test fun testModule_injectLowestSupportedApiLevel_hasCorrectMinimumApiLevel() { - setUpTestApplicationComponent(platformParameterMapWithValues) + setUpTestApplicationComponent() assertThat(lowestSupportedApiLevelProvider.get().value) .isEqualTo(TEST_LOWEST_SUPPORTED_API_LEVEL) } @@ -209,19 +101,16 @@ class PlatformParameterModuleTest { packageManager.installPackage(packageInfo) } - private fun setUpTestApplicationComponent(platformParameterMap: Map) { + private fun setUpTestApplicationComponent() { ApplicationProvider.getApplicationContext().inject(this) - platformParameterSingleton.setPlatformParameterMap(platformParameterMap) + val loadDeferred = platformParameterController.loadParametersAsync() + testCoroutineDispatchers.runCurrent() + check(loadDeferred.isCompleted) { "Expected parameter loading to have finished." } registerTestApplication() } @Module class TestModule { - @Provides - fun providePlatformParameterSingleton( - platformParameterSingletonImpl: PlatformParameterSingletonImpl - ): PlatformParameterSingleton = platformParameterSingletonImpl - @Provides fun provideContext(application: Application): Context { return application @@ -232,8 +121,15 @@ class PlatformParameterModuleTest { @Singleton @Component( modules = [ + AssetModule::class, + FakeOppiaClockModule::class, + LocaleTestModule::class, + LoggerModule::class, + RobolectricModule::class, + TestDispatcherModule::class, + TestLogReportingModule::class, TestModule::class, - TestPlatformParameterModule::class + PlatformParameterModule::class ] ) interface TestApplicationComponent { diff --git a/domain/src/test/java/org/oppia/android/domain/platformparameter/syncup/PlatformParameterSyncUpWorkManagerInitializerTest.kt b/domain/src/test/java/org/oppia/android/domain/platformparameter/syncup/PlatformParameterSyncUpWorkManagerInitializerTest.kt index e17012bb42d..b9598206c8f 100644 --- a/domain/src/test/java/org/oppia/android/domain/platformparameter/syncup/PlatformParameterSyncUpWorkManagerInitializerTest.kt +++ b/domain/src/test/java/org/oppia/android/domain/platformparameter/syncup/PlatformParameterSyncUpWorkManagerInitializerTest.kt @@ -25,13 +25,14 @@ import org.oppia.android.data.backends.gae.testing.NetworkConfigTestModule 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.platformparameter.PlatformParameterModule 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.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.locale.LocaleProdModule import org.oppia.android.util.logging.EnableConsoleLog import org.oppia.android.util.logging.EnableFileLog @@ -164,6 +165,7 @@ class PlatformParameterSyncUpWorkManagerInitializerTest { @Component( modules = [ ApplicationLifecycleModule::class, + AssetModule::class, FakeOppiaClockModule::class, LocaleProdModule::class, LogStorageModule::class, @@ -171,7 +173,7 @@ class PlatformParameterSyncUpWorkManagerInitializerTest { NetworkConfigTestModule::class, NetworkConnectionDebugUtilModule::class, NetworkConnectionUtilDebugModule::class, - PlatformParameterModule::class, + TestPlatformParameterModule::class, PlatformParameterSingletonModule::class, RetrofitModule::class, RetrofitServiceModule::class, diff --git a/domain/src/test/java/org/oppia/android/domain/platformparameter/syncup/PlatformParameterSyncUpWorkerTest.kt b/domain/src/test/java/org/oppia/android/domain/platformparameter/syncup/PlatformParameterSyncUpWorkerTest.kt index 0abc02d22dd..8e6fd6ecf0c 100644 --- a/domain/src/test/java/org/oppia/android/domain/platformparameter/syncup/PlatformParameterSyncUpWorkerTest.kt +++ b/domain/src/test/java/org/oppia/android/domain/platformparameter/syncup/PlatformParameterSyncUpWorkerTest.kt @@ -20,33 +20,22 @@ import dagger.Provides import org.junit.Before import org.junit.Test import org.junit.runner.RunWith -import org.oppia.android.app.model.PlatformParameter -import org.oppia.android.app.model.PlatformParameter.SyncStatus import org.oppia.android.data.backends.gae.RetrofitModule import org.oppia.android.data.backends.gae.RetrofitServiceModule import org.oppia.android.data.backends.gae.testing.NetworkConfigTestModule import org.oppia.android.data.backends.gae.testing.PlatformParameterServiceTestOrchestrator -import org.oppia.android.data.backends.gae.testing.PlatformParameterServiceTestOrchestrator.Companion.REMOTE_PLATFORM_PARAMETERS_WITH_UNSUPPORTED_TYPE 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.platformparameter.PlatformParameterController import org.oppia.android.domain.platformparameter.PlatformParameterModule -import org.oppia.android.domain.platformparameter.PlatformParameterSingletonImpl import org.oppia.android.testing.FakeExceptionLogger import org.oppia.android.testing.TestLogReportingModule import org.oppia.android.testing.data.DataProviderTestMonitor -import org.oppia.android.testing.platformparameter.TEST_BOOLEAN_PARAM_NAME -import org.oppia.android.testing.platformparameter.TEST_BOOLEAN_PARAM_SERVER_VALUE -import org.oppia.android.testing.platformparameter.TEST_INTEGER_PARAM_DEFAULT_VALUE -import org.oppia.android.testing.platformparameter.TEST_INTEGER_PARAM_NAME -import org.oppia.android.testing.platformparameter.TEST_INTEGER_PARAM_SERVER_VALUE -import org.oppia.android.testing.platformparameter.TEST_STRING_PARAM_NAME -import org.oppia.android.testing.platformparameter.TEST_STRING_PARAM_SERVER_VALUE 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 @@ -57,7 +46,6 @@ import org.oppia.android.util.logging.LogLevel import org.oppia.android.util.logging.SyncStatusModule import org.oppia.android.util.networking.NetworkConnectionDebugUtilModule import org.oppia.android.util.networking.NetworkConnectionUtilDebugModule -import org.oppia.android.util.platformparameter.PlatformParameterSingleton import org.robolectric.annotation.Config import org.robolectric.annotation.LooperMode import javax.inject.Inject @@ -73,8 +61,6 @@ import javax.inject.Singleton manifest = Config.NONE ) class PlatformParameterSyncUpWorkerTest { - @Inject lateinit var platformParameterSingleton: PlatformParameterSingleton - @Inject lateinit var platformParameterController: PlatformParameterController @Inject lateinit var platformParameterSyncUpWorkerFactory: PlatformParameterSyncUpWorkerFactory @Inject lateinit var testCoroutineDispatchers: TestCoroutineDispatchers @Inject lateinit var context: Context @@ -82,36 +68,6 @@ class PlatformParameterSyncUpWorkerTest { @Inject lateinit var monitorFactory: DataProviderTestMonitor.Factory @Inject lateinit var serviceOrchestrator: PlatformParameterServiceTestOrchestrator - private val expectedTestStringParameter = PlatformParameter.newBuilder() - .setName(TEST_STRING_PARAM_NAME) - .setString(TEST_STRING_PARAM_SERVER_VALUE) - .setSyncStatus(SyncStatus.SYNCED_FROM_SERVER) - .build() - - private val expectedTestIntegerParameter = PlatformParameter.newBuilder() - .setName(TEST_INTEGER_PARAM_NAME) - .setInteger(TEST_INTEGER_PARAM_SERVER_VALUE) - .setSyncStatus(SyncStatus.SYNCED_FROM_SERVER) - .build() - - private val defaultTestIntegerParameter = PlatformParameter.newBuilder() - .setName(TEST_INTEGER_PARAM_NAME) - .setInteger(TEST_INTEGER_PARAM_DEFAULT_VALUE) - .setSyncStatus(SyncStatus.NOT_SYNCED_FROM_SERVER) - .build() - - private val expectedTestBooleanParameter = PlatformParameter.newBuilder() - .setName(TEST_BOOLEAN_PARAM_NAME) - .setBoolean(TEST_BOOLEAN_PARAM_SERVER_VALUE) - .setSyncStatus(SyncStatus.SYNCED_FROM_SERVER) - .build() - - // Not including "expectedTestBooleanParameter" in this list to prove that a refresh took place - private val mockPlatformParameterList = listOf( - expectedTestStringParameter, - defaultTestIntegerParameter // using default value here just to prove refresh took place - ) - @Before fun setup() { setUpTestApplicationComponent() @@ -122,126 +78,12 @@ class PlatformParameterSyncUpWorkerTest { WorkManagerTestInitHelper.initializeTestWorkManager(context, config) } - @Test - fun testSyncUpWorker_databaseIsEmpty_getCorrectPlatformParameters_verifyValuesAreCached() { - serviceOrchestrator.setNextResponseAsSuccess() - - // Empty the Platform Parameter Database to simulate the execution of first SyncUp Work request. - platformParameterController.updatePlatformParameterDatabase(listOf()) - - val workManager = WorkManager.getInstance(context) - - val inputData = Data.Builder().putString( - PlatformParameterSyncUpWorker.WORKER_TYPE_KEY, - PlatformParameterSyncUpWorker.PLATFORM_PARAMETER_WORKER - ).build() - - val request: OneTimeWorkRequest = OneTimeWorkRequestBuilder() - .setInputData(inputData) - .build() - - // Enqueue the Work Request to fetch and cache the Platform Parameters from Remote Service. - workManager.enqueue(request) - testCoroutineDispatchers.runCurrent() - - val workInfo = workManager.getWorkInfoById(request.id) - assertThat(workInfo.get().state).isEqualTo(WorkInfo.State.SUCCEEDED) - - // Retrieve the previously cached Platform Parameters from Cache Store. - monitorFactory.ensureDataProviderExecutes(platformParameterController.getParameterDatabase()) - - // Values retrieved from Cache store will be sent to Platform Parameter Singleton by the - // Controller in the form of a Map, therefore verify the retrieved values from that Map. - val platformParameterMap = platformParameterSingleton.getPlatformParameterMap() - assertThat(platformParameterMap) - .containsEntry(TEST_STRING_PARAM_NAME, expectedTestStringParameter) - } - - @Test - fun testSyncUpWorker_databaseIsEmpty_getWrongPlatformParameters_verifyWorkerCrashes() { - serviceOrchestrator.setNextResponseAsSuccess(REMOTE_PLATFORM_PARAMETERS_WITH_UNSUPPORTED_TYPE) - - // Empty the Platform Parameter Database to simulate the execution of first SyncUp Work request. - platformParameterController.updatePlatformParameterDatabase(listOf()) - - val workManager = WorkManager.getInstance(context) - - val inputData = Data.Builder().putString( - PlatformParameterSyncUpWorker.WORKER_TYPE_KEY, - PlatformParameterSyncUpWorker.PLATFORM_PARAMETER_WORKER - ).build() - - val request: OneTimeWorkRequest = OneTimeWorkRequestBuilder() - .setInputData(inputData) - .build() - - // Enqueue the Work Request to fetch and cache the Platform Parameters from Remote Service. - workManager.enqueue(request) - testCoroutineDispatchers.runCurrent() - - val workInfo = workManager.getWorkInfoById(request.id) - assertThat(workInfo.get().state).isEqualTo(WorkInfo.State.FAILED) - - val exceptionMessage = fakeExceptionLogger.getMostRecentException().message - assertThat(exceptionMessage) - .isEqualTo(PlatformParameterSyncUpWorker.INCORRECT_TYPE_EXCEPTION_MSG) - } + // TODO(#5835): Fix and finish the tests for this suite. @Test - fun testSyncUpWorker_databaseIsNotEmpty_getCorrectPlatformParameters_verifyValuesAreUpdated() { + fun testSyncUpWorker_databaseIsEmpty_failsToLoadParameters() { serviceOrchestrator.setNextResponseAsSuccess() - // Fill the Platform Parameter Database with mock values to simulate the execution of a SyncUp - // Work request that is not first. - platformParameterController.updatePlatformParameterDatabase(mockPlatformParameterList) - - val workManager = WorkManager.getInstance(context) - - val inputData = Data.Builder().putString( - PlatformParameterSyncUpWorker.WORKER_TYPE_KEY, - PlatformParameterSyncUpWorker.PLATFORM_PARAMETER_WORKER - ).build() - - val request: OneTimeWorkRequest = OneTimeWorkRequestBuilder() - .setInputData(inputData) - .build() - - // Enqueue the Work Request to fetch and cache the Platform Parameters from Remote Service. - workManager.enqueue(request) - testCoroutineDispatchers.runCurrent() - - val workInfo = workManager.getWorkInfoById(request.id) - assertThat(workInfo.get().state).isEqualTo(WorkInfo.State.SUCCEEDED) - - // Retrieve the previously cached Platform Parameters from Cache Store. - monitorFactory.ensureDataProviderExecutes(platformParameterController.getParameterDatabase()) - - // Values retrieved from Cache store will be sent to Platform Parameter Singleton by the - // Controller in the form of a Map, therefore verify the retrieved values from that Map. - val platformParameterMap = platformParameterSingleton.getPlatformParameterMap() - assertThat(platformParameterMap).isNotEmpty() - - // New Boolean Platform Parameter is now present in the Database. - assertThat(platformParameterMap) - .containsEntry(TEST_BOOLEAN_PARAM_NAME, expectedTestBooleanParameter) - - // Previous String Platform Parameter is still same in the Database. - assertThat(platformParameterMap) - .containsEntry(TEST_STRING_PARAM_NAME, expectedTestStringParameter) - - // Previous Integer Platform Parameter updated to new value in the Database. - assertThat(platformParameterMap) - .containsEntry(TEST_INTEGER_PARAM_NAME, expectedTestIntegerParameter) - } - - @Test - fun testSyncUpWorker_databaseIsNotEmpty_getWrongPlatformParameters_verifyWorkerCrashes() { - serviceOrchestrator.setNextResponseAsSuccess(REMOTE_PLATFORM_PARAMETERS_WITH_UNSUPPORTED_TYPE) - - // Fill the Platform Parameter Database with mock values to simulate the execution of a SyncUp - // Work request that is not first. - platformParameterController.updatePlatformParameterDatabase(mockPlatformParameterList) - val workManager = WorkManager.getInstance(context) val inputData = Data.Builder().putString( @@ -257,135 +99,9 @@ class PlatformParameterSyncUpWorkerTest { workManager.enqueue(request) testCoroutineDispatchers.runCurrent() + // Note that this fails because the test isn't yet set up correctly. val workInfo = workManager.getWorkInfoById(request.id) assertThat(workInfo.get().state).isEqualTo(WorkInfo.State.FAILED) - - val exceptionMessage = fakeExceptionLogger.getMostRecentException().message - assertThat(exceptionMessage) - .isEqualTo(PlatformParameterSyncUpWorker.INCORRECT_TYPE_EXCEPTION_MSG) - } - - @Test - fun testSyncUpWorker_databaseIsNotEmpty_getEmptyResponseForWrongVersion_verifyValuesNotUpdated() { - serviceOrchestrator.setNextResponseAsSuccess(parameterValues = emptyMap()) - - // Fill the Platform Parameter Database with mock values to simulate the execution of a SyncUp - // Work request that is not first. - platformParameterController.updatePlatformParameterDatabase(mockPlatformParameterList) - - val workManager = WorkManager.getInstance(context) - - val inputData = Data.Builder().putString( - PlatformParameterSyncUpWorker.WORKER_TYPE_KEY, - PlatformParameterSyncUpWorker.PLATFORM_PARAMETER_WORKER - ).build() - - val request: OneTimeWorkRequest = OneTimeWorkRequestBuilder() - .setInputData(inputData) - .build() - - // Enqueue the Work Request to fetch and cache the Platform Parameters from Remote Service. - workManager.enqueue(request) - testCoroutineDispatchers.runCurrent() - - val workInfo = workManager.getWorkInfoById(request.id) - assertThat(workInfo.get().state).isEqualTo(WorkInfo.State.FAILED) - - val exceptionMessage = fakeExceptionLogger.getMostRecentException().message - assertThat(exceptionMessage) - .isEqualTo(PlatformParameterSyncUpWorker.EMPTY_RESPONSE_EXCEPTION_MSG) - - // Retrieve the previously cached Platform Parameters from Cache Store. - monitorFactory.ensureDataProviderExecutes(platformParameterController.getParameterDatabase()) - - // Values retrieved from Cache store will be sent to Platform Parameter Singleton by the - // Controller in the form of a Map, therefore verify the retrieved values from that Map. - val platformParameterMap = platformParameterSingleton.getPlatformParameterMap() - - // Previous String Platform Parameter is still same in the Database. - assertThat(platformParameterMap) - .containsEntry(TEST_STRING_PARAM_NAME, expectedTestStringParameter) - - // Previous Integer Platform Parameter is still same in the Database. - assertThat(platformParameterMap) - .containsEntry(TEST_INTEGER_PARAM_NAME, defaultTestIntegerParameter) - } - - @Test - fun testSyncUpWorker_getFeatureFlags_addSyncStatusFlags_verifyCorrectStatusReturned() { - serviceOrchestrator.setNextResponseAsSuccess() - - // Empty the Platform Parameter Database to simulate the execution of first SyncUp Work request. - platformParameterController.updatePlatformParameterDatabase(listOf()) - - val workManager = WorkManager.getInstance(context) - - val inputData = Data.Builder().putString( - PlatformParameterSyncUpWorker.WORKER_TYPE_KEY, - PlatformParameterSyncUpWorker.PLATFORM_PARAMETER_WORKER - ).build() - - val request: OneTimeWorkRequest = OneTimeWorkRequestBuilder() - .setInputData(inputData) - .build() - - // Enqueue the Work Request to fetch and cache the Platform Parameters from Remote Service. - workManager.enqueue(request) - testCoroutineDispatchers.runCurrent() - - // Retrieve the previously cached Platform Parameters from Cache Store. - monitorFactory.ensureDataProviderExecutes(platformParameterController.getParameterDatabase()) - - // Values retrieved from Cache store will be sent to Platform Parameter Singleton by the - // Controller in the form of a Map, therefore verify the retrieved values from that Map. - val platformParameterMap = platformParameterSingleton.getPlatformParameterMap() - - // Previous String Platform Parameter is still same in the Database. - assertThat(platformParameterMap) - .containsEntry(TEST_STRING_PARAM_NAME, expectedTestStringParameter) - - // SyncStatus of the platform parameter is SYNCED_FROM_SERVER - assertThat(platformParameterMap[TEST_STRING_PARAM_NAME]?.syncStatus) - .isEqualTo(SyncStatus.SYNCED_FROM_SERVER) - } - - @Test - fun testSyncUpWorker_databaseNotEmpty_getEmptyResponse_verifySyncStatusNotUpdated() { - serviceOrchestrator.setNextResponseAsSuccess(parameterValues = emptyMap()) - - // Fill the Platform Parameter Database with mock values to simulate the execution of a SyncUp - // Work request that is not first. - platformParameterController.updatePlatformParameterDatabase(mockPlatformParameterList) - - val workManager = WorkManager.getInstance(context) - - val inputData = Data.Builder().putString( - PlatformParameterSyncUpWorker.WORKER_TYPE_KEY, - PlatformParameterSyncUpWorker.PLATFORM_PARAMETER_WORKER - ).build() - - val request: OneTimeWorkRequest = OneTimeWorkRequestBuilder() - .setInputData(inputData) - .build() - - // Enqueue the Work Request to fetch and cache the Platform Parameters from Remote Service. - workManager.enqueue(request) - testCoroutineDispatchers.runCurrent() - - // Retrieve the previously cached Platform Parameters from Cache Store. - monitorFactory.ensureDataProviderExecutes(platformParameterController.getParameterDatabase()) - - // Values retrieved from Cache store will be sent to Platform Parameter Singleton by the - // Controller in the form of a Map, therefore verify the retrieved values from that Map. - val platformParameterMap = platformParameterSingleton.getPlatformParameterMap() - - // Previous Integer Platform Parameter is still same in the Database. - assertThat(platformParameterMap) - .containsEntry(TEST_INTEGER_PARAM_NAME, defaultTestIntegerParameter) - - // SyncStatus of the platform parameter is still the same in the database - assertThat(platformParameterMap[TEST_INTEGER_PARAM_NAME]?.syncStatus) - .isEqualTo(SyncStatus.NOT_SYNCED_FROM_SERVER) } private fun setUpTestApplicationComponent() { @@ -401,11 +117,6 @@ class PlatformParameterSyncUpWorkerTest { return application } - @Provides - fun providePlatformParameterSingleton( - platformParameterSingletonImpl: PlatformParameterSingletonImpl - ): PlatformParameterSingleton = platformParameterSingletonImpl - // 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 @@ -426,6 +137,7 @@ class PlatformParameterSyncUpWorkerTest { @Component( modules = [ ApplicationLifecycleModule::class, + AssetModule::class, FakeOppiaClockModule::class, LocaleProdModule::class, LogStorageModule::class, diff --git a/domain/src/test/java/org/oppia/android/domain/profile/ProfileManagementControllerTest.kt b/domain/src/test/java/org/oppia/android/domain/profile/ProfileManagementControllerTest.kt index 254fec67c4c..f3798a1c015 100644 --- a/domain/src/test/java/org/oppia/android/domain/profile/ProfileManagementControllerTest.kt +++ b/domain/src/test/java/org/oppia/android/domain/profile/ProfileManagementControllerTest.kt @@ -44,6 +44,7 @@ import org.oppia.android.testing.RunOn import org.oppia.android.testing.TestLogReportingModule import org.oppia.android.testing.data.DataProviderTestMonitor import org.oppia.android.testing.logging.EventLogSubject.Companion.assertThat +import org.oppia.android.testing.platformparameter.TestPlatformParameterModule import org.oppia.android.testing.profile.ProfileTestHelper import org.oppia.android.testing.robolectric.RobolectricModule import org.oppia.android.testing.threading.TestCoroutineDispatchers @@ -63,12 +64,6 @@ 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.oppia.android.util.platformparameter.ENABLE_ONBOARDING_FLOW_V2_DEFAULT_VALUE -import org.oppia.android.util.platformparameter.EnableLearnerStudyAnalytics -import org.oppia.android.util.platformparameter.EnableLoggingLearnerStudyIds -import org.oppia.android.util.platformparameter.EnableOnboardingFlowV2 -import org.oppia.android.util.platformparameter.LEARNER_STUDY_ANALYTICS_DEFAULT_VALUE -import org.oppia.android.util.platformparameter.PlatformParameterValue import org.oppia.android.util.threading.BackgroundDispatcher import org.robolectric.annotation.Config import org.robolectric.annotation.LooperMode @@ -125,8 +120,7 @@ class ProfileManagementControllerTest { @After fun tearDown() { - TestModule.enableLearnerStudyAnalytics = false - TestModule.enableOnboardingFlowV2 = false + TestPlatformParameterModule.reset() } @Test @@ -1747,6 +1741,7 @@ class ProfileManagementControllerTest { avatarImagePath = null ) testComponent.getTestCoroutineDispatchers().runCurrent() + TestPlatformParameterModule.reset() } setUpTestWithOnboardingV2Enabled(true) @@ -1776,6 +1771,7 @@ class ProfileManagementControllerTest { avatarImagePath = null ) testComponent.getTestCoroutineDispatchers().runCurrent() + TestPlatformParameterModule.reset() } setUpTestWithOnboardingV2Enabled(true) @@ -1797,6 +1793,7 @@ class ProfileManagementControllerTest { avatarImagePath = null ) testComponent.getTestCoroutineDispatchers().runCurrent() + TestPlatformParameterModule.reset() } setUpTestWithOnboardingV2Enabled(true) @@ -2063,17 +2060,19 @@ class ProfileManagementControllerTest { private fun DataProvider.ensureExecutes() = monitorFactory.ensureDataProviderExecutes(this) private fun setUpTestApplicationComponentWithoutLearnerAnalyticsStudy() { - TestModule.enableLearnerStudyAnalytics = false + TestPlatformParameterModule.forceEnableLearnerStudyAnalytics(false) + TestPlatformParameterModule.forceEnableLoggingLearnerStudyIds(false) setUpTestApplicationComponent() } private fun setUpTestApplicationComponentWithLearnerAnalyticsStudy() { - TestModule.enableLearnerStudyAnalytics = true + TestPlatformParameterModule.forceEnableLearnerStudyAnalytics(true) + TestPlatformParameterModule.forceEnableLoggingLearnerStudyIds(true) setUpTestApplicationComponent() } private fun setUpTestWithOnboardingV2Enabled(enableOnboardingV2: Boolean) { - TestModule.enableOnboardingFlowV2 = enableOnboardingV2 + TestPlatformParameterModule.forceEnableOnboardingFlowV2(enableOnboardingV2) setUpTestApplicationComponent() } @@ -2097,13 +2096,6 @@ class ProfileManagementControllerTest { // TODO(#89): Move this to a common test application component. @Module class TestModule { - internal companion object { - // This is expected to be off by default, so this helps the tests above confirm that the - // feature's default value is, indeed, off. - var enableLearnerStudyAnalytics = LEARNER_STUDY_ANALYTICS_DEFAULT_VALUE - var enableOnboardingFlowV2 = ENABLE_ONBOARDING_FLOW_V2_DEFAULT_VALUE - } - @Provides @Singleton fun provideContext(application: Application): Context { @@ -2123,40 +2115,6 @@ class ProfileManagementControllerTest { @GlobalLogLevel @Provides fun provideGlobalLogLevel(): LogLevel = LogLevel.VERBOSE - - // The scoping here is to ensure changes to the module value above don't change the parameter - // within the same application instance. - @Provides - @Singleton - @EnableLearnerStudyAnalytics - fun provideLearnerStudyAnalytics(): PlatformParameterValue { - // Snapshot the value so that it doesn't change between injection and use. - val enableFeature = enableLearnerStudyAnalytics - return PlatformParameterValue.createDefaultParameter( - defaultValue = enableFeature - ) - } - - @Provides - @Singleton - @EnableLoggingLearnerStudyIds - fun provideLoggingLearnerStudyIds(): PlatformParameterValue { - // Snapshot the value so that it doesn't change between injection and use. - val enableFeature = enableLearnerStudyAnalytics - return PlatformParameterValue.createDefaultParameter( - defaultValue = enableFeature - ) - } - - @Provides - @EnableOnboardingFlowV2 - fun provideEnableOnboardingFlowV2(): PlatformParameterValue { - // Snapshot the value so that it doesn't change between injection and use. - val enableFeature = enableOnboardingFlowV2 - return PlatformParameterValue.createDefaultParameter( - defaultValue = enableFeature - ) - } } @Module @@ -2185,7 +2143,8 @@ class ProfileManagementControllerTest { TestDispatcherModule::class, TestLogReportingModule::class, TestLoggingIdentifierModule::class, - TestModule::class + TestModule::class, + TestPlatformParameterModule::class ] ) interface TestApplicationComponent : DataProvidersInjector { diff --git a/domain/src/test/java/org/oppia/android/domain/question/BUILD.bazel b/domain/src/test/java/org/oppia/android/domain/question/BUILD.bazel index db85b223c11..250d8895f60 100644 --- a/domain/src/test/java/org/oppia/android/domain/question/BUILD.bazel +++ b/domain/src/test/java/org/oppia/android/domain/question/BUILD.bazel @@ -32,6 +32,7 @@ oppia_android_test( "//domain/src/main/java/org/oppia/android/domain/oppialogger/analytics:prod_module", "//testing", "//testing/src/main/java/org/oppia/android/testing/data:data_provider_test_monitor", + "//testing/src/main/java/org/oppia/android/testing/platformparameter:test_module", "//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", @@ -77,6 +78,7 @@ oppia_android_test( "//domain/src/main/java/org/oppia/android/domain/oppialogger/analytics:prod_module", "//testing", "//testing/src/main/java/org/oppia/android/testing/data:data_provider_test_monitor", + "//testing/src/main/java/org/oppia/android/testing/platformparameter:test_module", "//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", diff --git a/domain/src/test/java/org/oppia/android/domain/question/QuestionAssessmentProgressControllerTest.kt b/domain/src/test/java/org/oppia/android/domain/question/QuestionAssessmentProgressControllerTest.kt index 359056bad5b..cff82775773 100644 --- a/domain/src/test/java/org/oppia/android/domain/question/QuestionAssessmentProgressControllerTest.kt +++ b/domain/src/test/java/org/oppia/android/domain/question/QuestionAssessmentProgressControllerTest.kt @@ -48,7 +48,6 @@ import org.oppia.android.domain.hintsandsolution.isSolutionRevealed 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.platformparameter.PlatformParameterModule import org.oppia.android.domain.platformparameter.PlatformParameterSingletonModule import org.oppia.android.domain.topic.TEST_SKILL_ID_0 import org.oppia.android.domain.topic.TEST_SKILL_ID_1 @@ -61,6 +60,7 @@ import org.oppia.android.testing.RunOn import org.oppia.android.testing.TestLogReportingModule import org.oppia.android.testing.assertThrows import org.oppia.android.testing.data.DataProviderTestMonitor +import org.oppia.android.testing.platformparameter.TestPlatformParameterModule import org.oppia.android.testing.robolectric.RobolectricModule import org.oppia.android.testing.threading.TestCoroutineDispatchers import org.oppia.android.testing.threading.TestDispatcherModule @@ -1677,7 +1677,6 @@ class QuestionAssessmentProgressControllerTest { NumberWithUnitsRuleModule::class, NumericExpressionInputModule::class, NumericInputRuleModule::class, - PlatformParameterModule::class, PlatformParameterSingletonModule::class, RatioInputModule::class, RobolectricModule::class, @@ -1685,6 +1684,7 @@ class QuestionAssessmentProgressControllerTest { TestDispatcherModule::class, TestLogReportingModule::class, TestModule::class, + TestPlatformParameterModule::class, TestQuestionModule::class, TextInputRuleModule::class ] diff --git a/domain/src/test/java/org/oppia/android/domain/question/QuestionTrainingControllerTest.kt b/domain/src/test/java/org/oppia/android/domain/question/QuestionTrainingControllerTest.kt index 0bec7fb121e..5f543a4735f 100644 --- a/domain/src/test/java/org/oppia/android/domain/question/QuestionTrainingControllerTest.kt +++ b/domain/src/test/java/org/oppia/android/domain/question/QuestionTrainingControllerTest.kt @@ -32,7 +32,6 @@ import org.oppia.android.domain.hintsandsolution.HintsAndSolutionProdModule 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.platformparameter.PlatformParameterModule import org.oppia.android.domain.platformparameter.PlatformParameterSingletonModule import org.oppia.android.domain.topic.TEST_QUESTION_ID_0 import org.oppia.android.domain.topic.TEST_QUESTION_ID_1 @@ -43,6 +42,7 @@ import org.oppia.android.domain.topic.TEST_SKILL_ID_2 import org.oppia.android.testing.FakeExceptionLogger import org.oppia.android.testing.TestLogReportingModule import org.oppia.android.testing.data.DataProviderTestMonitor +import org.oppia.android.testing.platformparameter.TestPlatformParameterModule import org.oppia.android.testing.robolectric.RobolectricModule import org.oppia.android.testing.threading.TestCoroutineDispatchers import org.oppia.android.testing.threading.TestDispatcherModule @@ -288,7 +288,6 @@ class QuestionTrainingControllerTest { NumberWithUnitsRuleModule::class, NumericExpressionInputModule::class, NumericInputRuleModule::class, - PlatformParameterModule::class, PlatformParameterSingletonModule::class, RatioInputModule::class, RobolectricModule::class, @@ -296,6 +295,7 @@ class QuestionTrainingControllerTest { TestDispatcherModule::class, TestLogReportingModule::class, TestModule::class, + TestPlatformParameterModule::class, TestQuestionModule::class, TextInputRuleModule::class ] diff --git a/domain/src/test/java/org/oppia/android/domain/survey/BUILD.bazel b/domain/src/test/java/org/oppia/android/domain/survey/BUILD.bazel index a3fbfdef517..e944b374462 100644 --- a/domain/src/test/java/org/oppia/android/domain/survey/BUILD.bazel +++ b/domain/src/test/java/org/oppia/android/domain/survey/BUILD.bazel @@ -44,6 +44,7 @@ oppia_android_test( "//domain/src/main/java/org/oppia/android/domain/oppialogger/analytics:prod_module", "//domain/src/main/java/org/oppia/android/domain/survey:survey_controller", "//testing", + "//testing/src/main/java/org/oppia/android/testing/platformparameter:test_module", "//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", @@ -72,6 +73,7 @@ oppia_android_test( "//domain/src/main/java/org/oppia/android/domain/survey:survey_controller", "//testing", "//testing/src/main/java/org/oppia/android/testing/logging:event_log_subject", + "//testing/src/main/java/org/oppia/android/testing/platformparameter:test_module", "//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", diff --git a/domain/src/test/java/org/oppia/android/domain/survey/SurveyControllerTest.kt b/domain/src/test/java/org/oppia/android/domain/survey/SurveyControllerTest.kt index 205457e4134..7a2534b0127 100644 --- a/domain/src/test/java/org/oppia/android/domain/survey/SurveyControllerTest.kt +++ b/domain/src/test/java/org/oppia/android/domain/survey/SurveyControllerTest.kt @@ -9,6 +9,7 @@ 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 @@ -22,6 +23,7 @@ import org.oppia.android.testing.FakeExceptionLogger import org.oppia.android.testing.TestLogReportingModule import org.oppia.android.testing.data.DataProviderTestMonitor import org.oppia.android.testing.firebase.TestAuthenticationModule +import org.oppia.android.testing.platformparameter.TestPlatformParameterModule import org.oppia.android.testing.robolectric.RobolectricModule import org.oppia.android.testing.threading.TestCoroutineDispatchers import org.oppia.android.testing.threading.TestDispatcherModule @@ -36,8 +38,6 @@ 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.oppia.android.util.platformparameter.EnableLearnerStudyAnalytics -import org.oppia.android.util.platformparameter.PlatformParameterValue import org.robolectric.annotation.Config import org.robolectric.annotation.LooperMode import javax.inject.Inject @@ -72,9 +72,15 @@ class SurveyControllerTest { @Before fun setUp() { + TestPlatformParameterModule.forceEnableLearnerStudyAnalytics(true) setUpTestApplicationComponent() } + @After + fun tearDown() { + TestPlatformParameterModule.reset() + } + @Test fun testController_startSurveySession_succeeds() { val surveyDataProvider = @@ -184,13 +190,6 @@ class SurveyControllerTest { @GlobalLogLevel @Provides fun provideGlobalLogLevel(): LogLevel = LogLevel.VERBOSE - - @Provides - @EnableLearnerStudyAnalytics - fun provideLearnerStudyAnalytics(): PlatformParameterValue { - // Enable the study by default in tests. - return PlatformParameterValue.createDefaultParameter(defaultValue = true) - } } @Module @@ -221,7 +220,8 @@ class SurveyControllerTest { TestDispatcherModule::class, TestLogReportingModule::class, TestLoggingIdentifierModule::class, - TestModule::class + TestModule::class, + TestPlatformParameterModule::class ] ) interface TestApplicationComponent : DataProvidersInjector { diff --git a/domain/src/test/java/org/oppia/android/domain/survey/SurveyGatingControllerTest.kt b/domain/src/test/java/org/oppia/android/domain/survey/SurveyGatingControllerTest.kt index e99875cfac5..1e4dad92b51 100644 --- a/domain/src/test/java/org/oppia/android/domain/survey/SurveyGatingControllerTest.kt +++ b/domain/src/test/java/org/oppia/android/domain/survey/SurveyGatingControllerTest.kt @@ -9,6 +9,7 @@ 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 @@ -87,6 +88,11 @@ class SurveyGatingControllerTest { profileTestHelper.initializeProfiles() } + @After + fun tearDown() { + TestPlatformParameterModule.reset() + } + @Test fun testGating_lateNight_stillWithinGracePeriod_minimumAggregateTimeNotMet_returnsFalse() { oppiaClock.setFakeTimeMode(FakeOppiaClock.FakeTimeMode.MODE_FIXED_FAKE_TIME) diff --git a/domain/src/test/java/org/oppia/android/domain/survey/SurveyProgressControllerTest.kt b/domain/src/test/java/org/oppia/android/domain/survey/SurveyProgressControllerTest.kt index 0e803f49cad..1b2b05471b3 100644 --- a/domain/src/test/java/org/oppia/android/domain/survey/SurveyProgressControllerTest.kt +++ b/domain/src/test/java/org/oppia/android/domain/survey/SurveyProgressControllerTest.kt @@ -9,6 +9,7 @@ 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 @@ -29,6 +30,7 @@ import org.oppia.android.testing.TestLogReportingModule import org.oppia.android.testing.data.DataProviderTestMonitor import org.oppia.android.testing.firebase.TestAuthenticationModule import org.oppia.android.testing.logging.EventLogSubject +import org.oppia.android.testing.platformparameter.TestPlatformParameterModule import org.oppia.android.testing.robolectric.RobolectricModule import org.oppia.android.testing.threading.TestCoroutineDispatchers import org.oppia.android.testing.threading.TestDispatcherModule @@ -43,9 +45,7 @@ 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.oppia.android.util.platformparameter.EnableLearnerStudyAnalytics import org.oppia.android.util.platformparameter.LEARNER_STUDY_ANALYTICS_DEFAULT_VALUE -import org.oppia.android.util.platformparameter.PlatformParameterValue import org.robolectric.annotation.Config import org.robolectric.annotation.LooperMode import javax.inject.Inject @@ -81,9 +81,15 @@ class SurveyProgressControllerTest { @Before fun setUp() { + TestPlatformParameterModule.forceEnableLearnerStudyAnalytics(true) setUpTestApplicationComponent() } + @After + fun tearDown() { + TestPlatformParameterModule.reset() + } + @Test fun testStartSurveySession_succeeds() { val surveyDataProvider = @@ -538,13 +544,6 @@ class SurveyProgressControllerTest { @GlobalLogLevel @Provides fun provideGlobalLogLevel(): LogLevel = LogLevel.VERBOSE - - @Provides - @EnableLearnerStudyAnalytics - fun provideLearnerStudyAnalytics(): PlatformParameterValue { - // Enable the study by default in tests. - return PlatformParameterValue.createDefaultParameter(defaultValue = true) - } } @Module @@ -575,7 +574,8 @@ class SurveyProgressControllerTest { TestDispatcherModule::class, TestLogReportingModule::class, TestLoggingIdentifierModule::class, - TestModule::class + TestModule::class, + TestPlatformParameterModule::class ] ) diff --git a/domain/src/test/java/org/oppia/android/domain/topic/StoryProgressControllerTest.kt b/domain/src/test/java/org/oppia/android/domain/topic/StoryProgressControllerTest.kt index 93035992226..0e6ac16b36e 100644 --- a/domain/src/test/java/org/oppia/android/domain/topic/StoryProgressControllerTest.kt +++ b/domain/src/test/java/org/oppia/android/domain/topic/StoryProgressControllerTest.kt @@ -17,10 +17,10 @@ import org.oppia.android.app.model.ProfileId 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.platformparameter.PlatformParameterModule import org.oppia.android.domain.platformparameter.PlatformParameterSingletonModule import org.oppia.android.testing.TestLogReportingModule import org.oppia.android.testing.data.DataProviderTestMonitor +import org.oppia.android.testing.platformparameter.TestPlatformParameterModule import org.oppia.android.testing.profile.ProfileTestHelper import org.oppia.android.testing.robolectric.RobolectricModule import org.oppia.android.testing.threading.TestDispatcherModule @@ -328,13 +328,13 @@ class StoryProgressControllerTest { LogStorageModule::class, LoggingIdentifierModule::class, NetworkConnectionUtilDebugModule::class, - PlatformParameterModule::class, PlatformParameterSingletonModule::class, RobolectricModule::class, SyncStatusModule::class, TestDispatcherModule::class, TestLogReportingModule::class, - TestModule::class + TestModule::class, + TestPlatformParameterModule::class ] ) interface TestApplicationComponent : DataProvidersInjector { diff --git a/domain/src/test/java/org/oppia/android/domain/translation/BUILD.bazel b/domain/src/test/java/org/oppia/android/domain/translation/BUILD.bazel index 8c5617bb171..5e93e73242f 100644 --- a/domain/src/test/java/org/oppia/android/domain/translation/BUILD.bazel +++ b/domain/src/test/java/org/oppia/android/domain/translation/BUILD.bazel @@ -20,6 +20,7 @@ oppia_android_test( "//model/src/main/proto:languages_java_proto_lite", "//testing", "//testing/src/main/java/org/oppia/android/testing/data:data_provider_test_monitor", + "//testing/src/main/java/org/oppia/android/testing/platformparameter:test_module", "//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", diff --git a/domain/src/test/java/org/oppia/android/domain/translation/TranslationControllerTest.kt b/domain/src/test/java/org/oppia/android/domain/translation/TranslationControllerTest.kt index 573ce1473fe..47e6ccc2d24 100644 --- a/domain/src/test/java/org/oppia/android/domain/translation/TranslationControllerTest.kt +++ b/domain/src/test/java/org/oppia/android/domain/translation/TranslationControllerTest.kt @@ -49,10 +49,10 @@ import org.oppia.android.domain.locale.LocaleController 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.platformparameter.PlatformParameterModule import org.oppia.android.domain.platformparameter.PlatformParameterSingletonModule import org.oppia.android.testing.TestLogReportingModule import org.oppia.android.testing.data.DataProviderTestMonitor +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 @@ -1924,13 +1924,13 @@ class TranslationControllerTest { LoggerModule::class, LoggingIdentifierModule::class, NetworkConnectionUtilDebugModule::class, - PlatformParameterModule::class, PlatformParameterSingletonModule::class, RobolectricModule::class, SyncStatusModule::class, TestDispatcherModule::class, TestLogReportingModule::class, - TestModule::class + TestModule::class, + TestPlatformParameterModule::class ] ) interface TestApplicationComponent : DataProvidersInjector { diff --git a/model/src/main/proto/BUILD.bazel b/model/src/main/proto/BUILD.bazel index 8a917b4108d..f69710f2a87 100644 --- a/model/src/main/proto/BUILD.bazel +++ b/model/src/main/proto/BUILD.bazel @@ -396,6 +396,7 @@ java_proto_library( oppia_proto_library( name = "platform_parameter_proto", srcs = ["platform_parameter.proto"], + visibility = ["//:oppia_api_visibility"], ) java_lite_proto_library( diff --git a/model/src/main/proto/oppia_logger.proto b/model/src/main/proto/oppia_logger.proto index 3cab9be1cd6..0d1278a32cb 100644 --- a/model/src/main/proto/oppia_logger.proto +++ b/model/src/main/proto/oppia_logger.proto @@ -520,14 +520,16 @@ message EventLog { // Structure for an individual feature flag log context. message FeatureFlagItemContext { - // The name of the feature flag or sync status flag. - string flag_name = 1; + reserved 1; // Old flag_name property. + + // The ID of the feature flag. + FeatureFlagId id = 4; // The enabled state of the feature flag. - bool flag_enabled_state = 2; + bool is_enabled = 2; // The sync status of the feature flag or sync status flag. - PlatformParameter.SyncStatus flag_sync_status = 3; + SyncStatus sync_status = 3; } // Structure for the profile onboarding context. diff --git a/model/src/main/proto/platform_parameter.proto b/model/src/main/proto/platform_parameter.proto index 58e45f8325c..8f2ee476430 100644 --- a/model/src/main/proto/platform_parameter.proto +++ b/model/src/main/proto/platform_parameter.proto @@ -33,8 +33,226 @@ message PlatformParameter { } } -// Format of platform parameters stored on disk. It closely resembles the JSON response in cache. -message RemotePlatformParameterDatabase { - // Platform parameters cached from the backend. - repeated PlatformParameter platform_parameter = 1; +// Represents a forever-unique reference to a specific platform parameter. +enum PlatformParameterId { + // Corresponds to a platform parameter whose ID is not known (e.g. invalid or undefined). + PLATFORM_PARAMETER_ID_UNSPECIFIED = 0; + + // Corresponds to a test-only splash screen welcome message used when testing platform parameters. + SPLASH_SCREEN_WELCOME_MESSAGE = 1; + + // Corresponds to the time, in hours, between attempts to remotely download platform parameters. + SYNC_UP_WORKER_TIME_PERIOD_IN_HOURS = 2; + + // Corresponds to whether LaTeX rendering should be cached via Glide. + CACHE_LATEX_RENDERING = 3; + + // Corresponds to the interval, in minutes, at which performance metrics should be uploaded. + PERFORMANCE_METRICS_COLLECTION_UPLOAD_TIME_INTERVAL_IN_MINUTES = 4; + + // Corresponds to the period, in minutes, at which 'high frequency' performance metrics should be + // collected. + PERFORMANCE_METRICS_COLLECTION_HIGH_FREQUENCY_TIME_INTERVAL_IN_MINUTES = 5; + + // Corresponds to the period, in minutes, at which 'low frequency' performance metrics should be + // collected. + PERFORMANCE_METRICS_COLLECTION_LOW_FREQUENCY_TIME_INTERVAL_IN_MINUTES = 6; + + // Corresponds to the version code below which a user should be prompted with a suggestion to + // update their version of the app. + OPTIONAL_APP_UPDATE_VERSION_CODE = 7; + + // Corresponds to the version code below which a user should be required to update their version + // of the app. + FORCED_APP_UPDATE_VERSION_CODE = 8; + + // Corresponds to the minimum Android SDK version supported, enabling a flow for suggesting that + // the user upgrade their device to a newer version of Android. + LOWEST_SUPPORTED_API_LEVEL = 9; + + // Corresponds to the period, in days, between attempts to request the user to fill out the NPS + // survey. + NPS_SURVEY_GRACE_PERIOD_IN_DAYS = 10; + + // Corresponds to the time, in minutes, that a user must have accumulated performing learning + // activities before they qualify for seeing the NPS survey. + NPS_SURVEY_MINIMUM_AGGREGATE_LEARNING_TIME_IN_A_TOPIC_IN_MINUTES = 11; +} + +// Represents a forever-unique reference to a specific feature flag. +enum FeatureFlagId { + // Corresponds to a feature flag whose ID is not known (e.g. invalid or undefined). + FEATURE_FLAG_ID_UNSPECIFIED = 0; + + // Previously used for a feature that enabled a UI for changing the user's app language. + reserved 1; + + // Corresponds to a feature for enabling logging special usage analytics for learner user studies. + LEARNER_STUDY_ANALYTICS = 2; + + // Corresponds to a feature for enabling collection of app performance metrics. + PERFORMANCE_METRICS_COLLECTION = 3; + + // Corresponds to a feature that enables the 'edit accounts' section of the administrator controls + // screen. See #4006. + EDIT_ACCOUNTS_OPTIONS_UI = 4; + + // Corresponds to an app-wide feature for enabling spotlights. + SPOTLIGHT_UI = 5; + + // Previously used for a feature that enabled the info and practice tabs simultaneously. + reserved 6; + + // Corresponds to a feature enabling the ability to remotely download lessons. + DOWNLOADS_SUPPORT = 7; + + // Corresponds to a series of functionality improvements that ensure configuration changes + // correctly retain state for interactions so that unsubmitted answers are kept across device + // rotations and other configuration changes. + INTERACTION_CONFIG_CHANGE_STATE_RETENTION = 8; + + // Previously used for a feature that animated to continue button in a lesson. + reserved 9; + + // Corresponds to UIs that show in select scenarios where the app or the user's OS are no longer + // supported or recommended for use by the Oppia Android team. + APP_AND_OS_DEPRECATION = 10; + + // Corresponds to a user study-specific feature that enables a special button in the lesson player + // for quickly switching between different content and app languages mid-lesson. + FAST_LANGUAGE_SWITCHING_IN_LESSON = 11; + + // Corresponds to a feature for whether learner study IDs should be included in analytics logs for + // the purpose of analyzing logs for study results. + LOGGING_LEARNER_STUDY_IDS = 12; + + // Corresponds to a feature enabling an in-app survey for requesting feedback from learners their + // overall opinion of the app and their current learning experience (as part of understanding + // Oppia Android's product market fit). + NPS_SURVEY = 13; + + // Corresponds to a new onboarding flow that completely replaces the first onboarding flow + // introduced in the app. The new flow includes earlier language selections, and distinct + // onboarding pathways for different types of users (including learners added later on). + ONBOARDING_FLOW_V2 = 14; + + // Corresponds to a new version of the home screen that supports multiple classrooms (such as + // mathematics and science). + MULTIPLE_CLASSROOMS = 15; + + // Corresponds to a topic activity feature that enables the info tab. + TOPIC_INFO_TAB = 16; + + // Corresponds to a topic activity feature that enables the practice tab. + TOPIC_PRACTICE_TAB = 17; +} + +// Corresponds to a compile-time definition of a platform parameter which is a mechanism by which to +// configure application behavior. +message PlatformParameterDefinition { + // The unique ID of this platform parameter. + PlatformParameterId id = 1; + + // The textual name used to identify the parameter in Oppia web. Note that this must be a forever + // unique representation among all platform parameters and feature flags. If absent then the + // parameter will never be remotely synced. + string remote_server_name = 2; + + // The default value of the parameter that should be used if there's no remotely synced version. + PlatformParameterValue default_value = 3; +} + +// Corresponds to a remotely synced platform parameter. +message RemotePlatformParameter { + // The unique ID of this platform parameter which corresponds to a PlatformParameterDefinition. + PlatformParameterId id = 1; + + // The remotely synced value of this parameter, or absent/default if never yet synced. + PlatformParameterValue remote_value = 2; + + // Indicates the sync status of the platform parameter. + SyncStatus sync_status = 3; +} + +// Corresponds to an actual platform parameter value that directly tweaks particular app behavior. +message PlatformParameterValue { + // The specific value type of the parameter. + oneof value_type { + // The boolean-typed value of the parameter. + bool boolean = 1; + + // The integer-typed value of the parameter. + int32 integer = 2; + + // The string-typed value of the parameter. + string string = 3; + } +} + +// Corresponds to a compile-time definition of a feature flag which is a mechanism by which to gate +// whether a specific feature is enabled. +message FeatureFlagDefinition { + // The unique ID of this feature flag. + FeatureFlagId id = 1; + + // The textual name used to identify the flag in Oppia web. Note that this must be a forever + // unique representation among all platform parameters and feature flags. If absent then the flag + // will never be remotely synced. + string remote_server_name = 2; + + // Whether or not the feature is enabled by default if there's no remotely synced record. + bool default_is_enabled = 3; +} + +message RemoteFeatureFlag { + // The unique ID of this feature flag which corresponds to a FeatureFlagDefinition. + FeatureFlagId id = 1; + + // Whether or not the feature flag should be enabled as indicated by the remote server. Note that + // this value only has meaning if SyncStatus indicates that there's been at least one successful + // remote sync for this feature flag. + bool remote_is_enabled = 2; + + // Indicates the sync status of the feature flag. + SyncStatus sync_status = 3; +} + +// Corresponds to the latest sync status for platform parameters and feature flags. +enum SyncStatus { + // Indicates that the sync status isn't yet known. + SYNC_STATUS_UNSPECIFIED = 0; + + // Indicates that the parameter/flag isn't yet synced with the remote server. + NOT_SYNCED_FROM_SERVER = 1; + + // Indicates the parameter/flag's value has been successfully synced with the remote server. + SYNCED_FROM_SERVER = 2; +} + +// Defines the list of supported platform parameters in the app. +message SupportedPlatformParameters { + // The list of platform parameter definitions, one for each supported parameter. If any parameters + // are not represented in this list then it's assumed that they are not supported (even if there + // are corresponding definitions in Oppia web). Duplicate references to the same + // PlatformParameterId will result in a runtime test failure. + repeated PlatformParameterDefinition platform_parameter_definition = 1; +} + +// Defines the list of supported feature flags in the app. +message SupportedFeatureFlags { + // The list of feature flag definitions, one for each supported flag. If any flags are not + // represented in this list then it's assumed that they are not supported (even if there are + // corresponding definitions in Oppia web). Duplicate references to the same FeatureFlagId will + // result in a runtime test failure. + repeated FeatureFlagDefinition feature_flag_definition = 1; +} + +// The database for storing results from remotely syncing platform parameters and feature flags with +// the Oppia web server. +message RemotePlatformParameterAndFeatureFlagDatabase { + // The remotely synced platform parameters. + repeated RemotePlatformParameter remote_platform_parameter = 1; + + // The remotely synced feature flags. + repeated RemoteFeatureFlag remote_feature_flag = 2; } diff --git a/scripts/BUILD.bazel b/scripts/BUILD.bazel index ee4fb13c930..b66a8da9b69 100644 --- a/scripts/BUILD.bazel +++ b/scripts/BUILD.bazel @@ -319,3 +319,10 @@ kt_jvm_binary( main_class = "org.oppia.android.scripts.xml.TextViewStyleCheckKt", runtime_deps = ["//scripts/src/java/org/oppia/android/scripts/xml:check_textview_styles"], ) + +kt_jvm_binary( + name = "android_lint_check", + testonly = True, + main_class = "org.oppia.android.scripts.lint.AndroidLintRunnerKt", + runtime_deps = ["//scripts/src/java/org/oppia/android/scripts/lint:android_lint_runner"], +) diff --git a/scripts/assets/test_file_exemptions.textproto b/scripts/assets/test_file_exemptions.textproto index 99c6cea9185..46c77feba43 100644 --- a/scripts/assets/test_file_exemptions.textproto +++ b/scripts/assets/test_file_exemptions.textproto @@ -3747,17 +3747,49 @@ test_file_exemption { source_file_is_incompatible_with_code_coverage: true } test_file_exemption { - exempted_file_path: "domain/src/main/java/org/oppia/android/domain/platformparameter/PlatformParameterAlphaModule.kt" + exempted_file_path: "domain/src/main/java/org/oppia/android/domain/platformparameter/FeatureFlagBindingModule.kt" + test_file_not_required: true +} +test_file_exemption { + exempted_file_path: "domain/src/main/java/org/oppia/android/domain/platformparameter/FeatureFlagIdKey.kt" + test_file_not_required: true +} +test_file_exemption { + exempted_file_path: "domain/src/main/java/org/oppia/android/domain/platformparameter/FeatureFlags.kt" + test_file_not_required: true +} +test_file_exemption { + exempted_file_path: "domain/src/main/java/org/oppia/android/domain/platformparameter/FeatureFlagsMapBindingModule.kt" + test_file_not_required: true +} +test_file_exemption { + exempted_file_path: "domain/src/main/java/org/oppia/android/domain/platformparameter/PlatformParameterBindingModule.kt" + test_file_not_required: true +} +test_file_exemption { + exempted_file_path: "domain/src/main/java/org/oppia/android/domain/platformparameter/PlatformParameterConfigRetriever.kt" + test_file_not_required: true +} +test_file_exemption { + exempted_file_path: "domain/src/main/java/org/oppia/android/domain/platformparameter/PlatformParameterConfigRetrieverProdImpl.kt" test_file_not_required: true } test_file_exemption { exempted_file_path: "domain/src/main/java/org/oppia/android/domain/platformparameter/PlatformParameterController.kt" + test_file_not_required: true +} +test_file_exemption { + exempted_file_path: "domain/src/main/java/org/oppia/android/domain/platformparameter/PlatformParameterControllerProdImpl.kt" source_file_is_incompatible_with_code_coverage: true } test_file_exemption { exempted_file_path: "domain/src/main/java/org/oppia/android/domain/platformparameter/PlatformParameterModule.kt" source_file_is_incompatible_with_code_coverage: true } +test_file_exemption { + exempted_file_path: "domain/src/main/java/org/oppia/android/domain/platformparameter/PlatformParameterProcessState.kt" + test_file_not_required: true +} test_file_exemption { exempted_file_path: "domain/src/main/java/org/oppia/android/domain/platformparameter/PlatformParameterSingletonImpl.kt" test_file_not_required: true @@ -3766,6 +3798,10 @@ test_file_exemption { exempted_file_path: "domain/src/main/java/org/oppia/android/domain/platformparameter/PlatformParameterSingletonModule.kt" test_file_not_required: true } +test_file_exemption { + exempted_file_path: "domain/src/main/java/org/oppia/android/domain/platformparameter/testing/TestPlatformParameterConfigRetriever.kt" + test_file_not_required: true +} test_file_exemption { exempted_file_path: "domain/src/main/java/org/oppia/android/domain/platformparameter/syncup/PlatformParameterSyncUpWorkManagerInitializer.kt" source_file_is_incompatible_with_code_coverage: true @@ -4142,10 +4178,6 @@ test_file_exemption { exempted_file_path: "testing/src/main/java/org/oppia/android/testing/mockito/MockitoKotlinHelper.kt" test_file_not_required: true } -test_file_exemption { - exempted_file_path: "testing/src/main/java/org/oppia/android/testing/platformparameter/TestPlatformParameterConstants.kt" - test_file_not_required: true -} test_file_exemption { exempted_file_path: "testing/src/main/java/org/oppia/android/testing/platformparameter/TestPlatformParameterModule.kt" test_file_not_required: true diff --git a/scripts/assets/todo_open_exemptions.textproto b/scripts/assets/todo_open_exemptions.textproto index daf4b253c58..58773b5ac08 100644 --- a/scripts/assets/todo_open_exemptions.textproto +++ b/scripts/assets/todo_open_exemptions.textproto @@ -341,7 +341,7 @@ todo_open_exemption { } todo_open_exemption { exempted_file_path: "scripts/static_checks.sh" - line_number: 121 + line_number: 117 } todo_open_exemption { exempted_file_path: "wiki/Coding-style-guide.md" diff --git a/scripts/feature_flags_check.sh b/scripts/feature_flags_check.sh deleted file mode 100644 index 92b0e07a10e..00000000000 --- a/scripts/feature_flags_check.sh +++ /dev/null @@ -1,149 +0,0 @@ -#!/bin/bash - -source scripts/formatting.sh - -echo "********************************" -echo "Running feature flag checks" -echo "********************************" - -failed_checks=0 - -function item_in_array() { - local item="$1" - shift - local array=("$@") - - for element in "${array[@]}"; do - if [[ "$element" == "$item" ]]; then - echo 1 - return - fi - done - - echo 0 -} - -function get_classes_from_constants_file() { - # Get the file path of the FeatureFlagConstants File - file_path=$(find . -name FeatureFlagConstants.kt) - - # Get a list of feature flag annotation classes - annotation_classes=$(grep -E '[\s\w]*annotation\s*class' "$file_path") - - # Convert the string into an array, splitting by newline - IFS=$'\n' read -rd '' -a array <<<"$annotation_classes" - - # Create an empty array to hold individual class names - class_names=() - - # Iterate through each line and take the last word of the list - for line in "${array[@]}"; do - # Convert each line into an array of words, splitting by space - IFS=' ' read -ra words <<<"$line" - - # Get last element of the list - last_element="${words[${#words[@]}-1]}" - - # Add the element into class_names - class_names+=("$last_element") - done - - echo "${class_names[@]}" -} - -function get_imported_classes_in_logger() { - # File path containing the block of text - file_path=$(find . -name FeatureFlagsLogger.kt) - - # Use sed to extract the block based on a starting pattern and an ending pattern - extracted_block=$(sed -n '/class FeatureFlagsLogger @Inject constructor(/,/^)/p' "$file_path") - - # Get annotation classes - logged_classes=$(grep -E '@Enable[A-Za-z0-9_]+' "$file_path") - - # Replace the @ symbol and spaces within each element of the list - for i in "${!logged_classes[@]}"; do - logged_classes[$i]=$(echo "${logged_classes[$i]}" | tr -d '@' | tr -d ' ') - done - - # Print the logged classes - echo "$logged_classes" -} - -function get_flags_added_into_the_logging_map() { - # File path containing the block of text - file_path=$(find . -name FeatureFlagsLogger.kt) - - # Use sed to extract the block based on a starting pattern and an ending pattern - extracted_block=$(sed -n '/Map> = mapOf(/,/)$/p' "$file_path") - - # Get any word beginning with enable from the extracted block - enable_flags=$(grep -E 'enable[A-Za-z0-9_]+' <<<"$extracted_block") - - added_flags=() - - # Convert the string into an array, splitting by newline - IFS=$'\n' read -rd '' -a added_flags <<<"$enable_flags" - - # Create an empty array to hold individual class names - class_names=() - - # Iterate through each line and take the last word of the list - for line in "${added_flags[@]}"; do - # Remove the comma at the end of the line - line=$(echo "$line" | awk '{sub(/,$/, ""); print}') - - # Convert each line into an array of words, splitting by space - IFS=' ' read -ra words <<<"$line" - - # Get last element of the list - last_element="${words[${#words[@]}-1]}" - - # Capitalize last element using sed - last_element=$(echo "$last_element" | awk '{for(i=1;i<=NF;i++) $i=toupper(substr($i,1,1)) substr($i,2)}1') - - # Add the element into class_names - class_names+=("$last_element") - done - - echo "${class_names[@]}" -} - -function perform_checks_on_feature_flags() { - feature_flags=($(get_classes_from_constants_file)) - imported_classes=($(get_imported_classes_in_logger)) - flags_added_to_map=($(get_flags_added_into_the_logging_map)) - - file_path=$(find . -name FeatureFlagsLogger.kt) - imports_line_number=$(grep -n 'class FeatureFlagsLogger @Inject constructor(' "$file_path" | head -n 1 | awk -F: '{print $1}') - flags_map_line_number=$(grep -n 'Map> = mapOf(' "$file_path" | head -n 1 | awk -F: '{print $1}') - - for element in "${feature_flags[@]}"; do - in_array=$(item_in_array "$element" "${imported_classes[@]}") - if [[ $in_array -ne 1 ]]; then - failed_checks=$((failed_checks + 1)) - echo_error "$element is not imported in the constructor argument in $file_path at line $imports_line_number" - fi - done - - for element in "${feature_flags[@]}"; do - in_array=$(item_in_array "$element" "${flags_added_to_map[@]}") - if [[ $in_array -ne 1 ]]; then - failed_checks=$((failed_checks + 1)) - echo_error "$element is not added to the logging map in $file_path at line $flags_map_line_number" - fi - done - - if [[ $failed_checks -eq 0 ]]; then - echo_success "Feature flag checks completed successfully" - exit 0 - else - echo "********************************" - echo_error "Feature flag issues found." - echo "Please fix the above issues." - echo "********************************" - exit 1 - fi -} - -perform_checks_on_feature_flags diff --git a/scripts/src/java/org/oppia/android/scripts/lint/AndroidLintRunner.kt b/scripts/src/java/org/oppia/android/scripts/lint/AndroidLintRunner.kt new file mode 100644 index 00000000000..9d9a1e441a2 --- /dev/null +++ b/scripts/src/java/org/oppia/android/scripts/lint/AndroidLintRunner.kt @@ -0,0 +1,71 @@ +package org.oppia.android.scripts.lint + +import java.io.File +import java.nio.file.Files +import com.android.tools.lint.Main as LintCli + +/** + * The main entrypoint to analyse the codebase for Android Lint issues. + * + * Usage: + * bazel run //scripts:android_lint_check -- + * + * Arguments: + * - path_to_repository_root: The root path of the repository. + * + * Example: + * bazel run //scripts:android_lint_check -- $(pwd) + */ +fun main(vararg args: String) { + require(args.isNotEmpty()) { + "Expected: bazel run //scripts:android_lint_check -- " + } + + val repoRoot = File(args[0]) + require(repoRoot.exists()) { "Repository root path does not exist: ${args[0]}" } + + val lintRunner = AndroidLintRunner() + lintRunner.runLint() +} + +/** Runs the Android lint tool to generate reports. */ +class AndroidLintRunner { + + /** Invokes the tool to run Lint analysis. */ + fun runLint() { + + val parentDestDir = Files.createTempDirectory("lint_analysis_").toFile() + println("Using ${parentDestDir.absolutePath} as an intermediary working directory") + val reportFile = File(parentDestDir, "lint-report.xml") + val projectDescriptionFile = File(parentDestDir, "lint-project-description.xml") + val cliArgs = prepareLintArguments(reportFile.absolutePath, projectDescriptionFile.absolutePath) + + // TODO(#5734): Implement the project description for Lint execution and handle exit codes. + + LintCli().run(cliArgs) // Currently returns error code due to missing project description + } + + /** + * Prepares the command line arguments for the Android Lint tool. + * + * @param reportPath path to the XML report file + * @param projectDescriptionPath path to the XML project description file + * @return array of command line arguments + */ + private fun prepareLintArguments( + reportPath: String, + projectDescriptionPath: String + ): Array { + + return arrayOf( + "-Wall", + "--quiet", + "--fullpath", + "--showall", + "--exitcode", + "--offline", + "--project", projectDescriptionPath, + "--xml", reportPath, + ) + } +} diff --git a/scripts/src/java/org/oppia/android/scripts/lint/BUILD.bazel b/scripts/src/java/org/oppia/android/scripts/lint/BUILD.bazel new file mode 100644 index 00000000000..46bff52e9b5 --- /dev/null +++ b/scripts/src/java/org/oppia/android/scripts/lint/BUILD.bazel @@ -0,0 +1,17 @@ +""" +Libraries corresponding to developer script that help with Android Lint analysis. +""" + +load("@io_bazel_rules_kotlin//kotlin:jvm.bzl", "kt_jvm_library") + +kt_jvm_library( + name = "android_lint_runner", + testonly = True, + srcs = [ + "AndroidLintRunner.kt", + ], + visibility = ["//scripts:oppia_script_binary_visibility"], + deps = [ + "//third_party:com_android_tools_lint_lint", + ], +) diff --git a/scripts/src/javatests/org/oppia/android/scripts/lint/AndroidLintRunnerTest.kt b/scripts/src/javatests/org/oppia/android/scripts/lint/AndroidLintRunnerTest.kt new file mode 100644 index 00000000000..d7345ec32ef --- /dev/null +++ b/scripts/src/javatests/org/oppia/android/scripts/lint/AndroidLintRunnerTest.kt @@ -0,0 +1,90 @@ +package org.oppia.android.scripts.lint + +import com.google.common.truth.Truth.assertThat +import org.junit.Before +import org.junit.Rule +import org.junit.Test +import org.junit.rules.TemporaryFolder +import org.oppia.android.testing.assertThrows +import java.io.ByteArrayOutputStream +import java.io.File +import java.io.PrintStream + +/** Tests for [AndroidLintRunner]. */ +// Same parameter value: helpers reduce test context, even if they are used by 1 test. +// Function name: test names are conventionally named with underscores. +@Suppress("SameParameterValue", "FunctionName") +class AndroidLintRunnerTest { + @field:[Rule JvmField] var tempFolder = TemporaryFolder() + + private lateinit var mockRepoRoot: File + private lateinit var outputStream: ByteArrayOutputStream + + @Before + fun setUp() { + mockRepoRoot = tempFolder.root + outputStream = ByteArrayOutputStream() + System.setOut(PrintStream(outputStream)) + } + + @Test + fun testMain_noArguments_throwsException() { + val exception = assertThrows { + main() + } + + assertThat(exception).hasMessageThat().contains( + "Expected: bazel run //scripts:android_lint_check -- " + ) + } + + @Test + fun testMain_nonExistentPath_throwsException() { + val nonExistentPath = File(tempFolder.root, "nonexistent").absolutePath + + val exception = assertThrows { + main(nonExistentPath) + } + + assertThat(exception).hasMessageThat().contains("Repository root path does not exist") + } + + @Test + fun testMain_multipleArguments_usesFirstArgument() { + val validPath = mockRepoRoot.absolutePath + val invalidPath = "invalid_path" + + try { + main(validPath, invalidPath, "extra_arg") + } catch (e: Exception) { + assertThat(e).isNotInstanceOf(IllegalArgumentException::class.java) + } + } + + @Test + fun testPrepareLintArguments_includesRequiredFlags() { + val lintRunner = AndroidLintRunner() + val reportPath = "/path/to/report.xml" + val projectPath = "/path/to/project.xml" + + val method = AndroidLintRunner::class.java.getDeclaredMethod( + "prepareLintArguments", + String::class.java, + String::class.java + ) + method.isAccessible = true + + val result = method.invoke(lintRunner, reportPath, projectPath) as Array<*> + + assertThat(result).asList().containsAtLeast( + "-Wall", + "--quiet", + "--fullpath", + "--showall", + "--exitcode", + "--offline", + "--project", projectPath, + "--xml", reportPath + ) + } +} diff --git a/scripts/src/javatests/org/oppia/android/scripts/lint/BUILD.bazel b/scripts/src/javatests/org/oppia/android/scripts/lint/BUILD.bazel new file mode 100644 index 00000000000..79cb7af133b --- /dev/null +++ b/scripts/src/javatests/org/oppia/android/scripts/lint/BUILD.bazel @@ -0,0 +1,15 @@ +""" +Tests corresponding to libraries that help with Android Lint analysis. +""" + +load("@io_bazel_rules_kotlin//kotlin:jvm.bzl", "kt_jvm_test") + +kt_jvm_test( + name = "AndroidLintRunnerTest", + srcs = ["AndroidLintRunnerTest.kt"], + deps = [ + "//scripts/src/java/org/oppia/android/scripts/lint:android_lint_runner", + "//testing:assertion_helpers", + "//third_party:com_google_truth_truth", + ], +) diff --git a/scripts/static_checks.sh b/scripts/static_checks.sh index 3d83fdd6593..927019d69b5 100644 --- a/scripts/static_checks.sh +++ b/scripts/static_checks.sh @@ -19,10 +19,6 @@ echo "" bash scripts/ktlint_lint_check.sh echo "" -# Run feature flag checks -bash scripts/feature_flags_check.sh -echo "" - # Run protobuf lint checks bash scripts/buf_lint_check.sh echo "" diff --git a/testing/BUILD.bazel b/testing/BUILD.bazel index 1800d1abf45..a679da50ea7 100644 --- a/testing/BUILD.bazel +++ b/testing/BUILD.bazel @@ -96,12 +96,13 @@ TEST_DEPS = [ "//domain/src/main/java/org/oppia/android/domain/onboarding/testing:retriever_test_module", "//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/platformparameter: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", - "//testing/src/main/java/org/oppia/android/testing/platformparameter:test_constants", + "//testing/src/main/java/org/oppia/android/testing/platformparameter:test_module", "//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", diff --git a/testing/src/main/java/org/oppia/android/testing/logging/EventLogSubject.kt b/testing/src/main/java/org/oppia/android/testing/logging/EventLogSubject.kt index 488b8380f3a..b0d6859a69c 100644 --- a/testing/src/main/java/org/oppia/android/testing/logging/EventLogSubject.kt +++ b/testing/src/main/java/org/oppia/android/testing/logging/EventLogSubject.kt @@ -62,10 +62,11 @@ import org.oppia.android.app.model.EventLog.Context.ActivityContextCase.SWITCH_I import org.oppia.android.app.model.EventLog.Context.ActivityContextCase.VIEW_EXISTING_HINT_CONTEXT import org.oppia.android.app.model.EventLog.Context.ActivityContextCase.VIEW_EXISTING_SOLUTION_CONTEXT import org.oppia.android.app.model.EventLog.FeatureFlagItemContext +import org.oppia.android.app.model.FeatureFlagId import org.oppia.android.app.model.MarketFitAnswer import org.oppia.android.app.model.OppiaLanguage -import org.oppia.android.app.model.PlatformParameter.SyncStatus import org.oppia.android.app.model.SurveyQuestionName +import org.oppia.android.app.model.SyncStatus import org.oppia.android.app.model.UserTypeAnswer import org.oppia.android.app.model.WrittenTranslationLanguageSelection import org.oppia.android.testing.logging.EventLogSubject.Companion.assertThat @@ -2334,7 +2335,7 @@ class EventLogSubject private constructor( * Truth subject for verifying properties of [EventLog.FeatureFlagListContext]s. * * Note that this class is also a [LiteProtoSubject] so other aspects of the underlying - * [EventLog.FeatureFlagContext] proto can be verified through inherited methods. + * [EventLog.FeatureFlagListContext] proto can be verified through inherited methods. * * Call [FeatureFlagListContextSubject.assertThat] to create the subject. */ @@ -2413,32 +2414,28 @@ class EventLogSubject private constructor( private val actual: FeatureFlagItemContext ) : LiteProtoSubject(metadata, actual) { /** - * Returns a [StringSubject] to test - * [EventLog.FeatureFlagItemContext.getFlagName]. + * Returns a [ComparableSubject] to test [EventLog.FeatureFlagItemContext.getId]. * - * This method never fails since the underlying property defaults to empty string if it's not - * defined in the context. + * This method never fails since the underlying property defaults to the unspecified enum value + * if it's not defined in the context. */ - fun hasFeatureFlagNameThat(): StringSubject = assertThat(actual.flagName) + fun hasFeatureFlagIdThat(): ComparableSubject = assertThat(actual.id) /** - * Returns a [BooleanSubject] to test - * [EventLog.FeatureFlagItemContext.getFlagEnabledState]. + * Returns a [BooleanSubject] to test [EventLog.FeatureFlagItemContext.getIsEnabled]. * - * This method never fails since the underlying property defaults to false if it's not - * defined in the context. + * This method never fails since the underlying property defaults to false if it's not defined + * in the context. */ - fun hasFeatureFlagEnabledStateThat(): BooleanSubject = assertThat(actual.flagEnabledState) + fun hasFeatureFlagEnabledStateThat(): BooleanSubject = assertThat(actual.isEnabled) /** - * Returns a [ComparableSubject] to test - * [EventLog.FeatureFlagItemContext.getFlagSyncStatus]. + * Returns a [ComparableSubject] to test [EventLog.FeatureFlagItemContext.getSyncStatus]. * * This method never fails since the underlying property defaults to the unspecified enum value * if it's not defined in the context. */ - fun hasFeatureFlagSyncStateThat(): ComparableSubject = - assertThat(actual.flagSyncStatus) + fun hasFeatureFlagSyncStateThat(): ComparableSubject = assertThat(actual.syncStatus) companion object { /** diff --git a/testing/src/main/java/org/oppia/android/testing/platformparameter/BUILD.bazel b/testing/src/main/java/org/oppia/android/testing/platformparameter/BUILD.bazel index 1ff35e43281..522551b0ece 100644 --- a/testing/src/main/java/org/oppia/android/testing/platformparameter/BUILD.bazel +++ b/testing/src/main/java/org/oppia/android/testing/platformparameter/BUILD.bazel @@ -5,20 +5,6 @@ Package for test-specific platform parameter utilities and helpers. load("@io_bazel_rules_kotlin//kotlin:android.bzl", "kt_android_library") -kt_android_library( - name = "test_constants", - testonly = True, - srcs = [ - "TestPlatformParameterConstants.kt", - ], - visibility = [ - "//:oppia_testing_visibility", - ], - deps = [ - "//third_party:javax_inject_javax_inject", - ], -) - kt_android_library( name = "test_module", testonly = True, @@ -29,8 +15,11 @@ kt_android_library( "//:oppia_testing_visibility", ], deps = [ - ":test_constants", "//:dagger", + "//domain/src/main/java/org/oppia/android/domain/platformparameter:prod_impl", + "//domain/src/main/java/org/oppia/android/domain/platformparameter:prod_module", + "//domain/src/main/java/org/oppia/android/domain/platformparameter/testing:test_platform_parameter_config_retriever", + "//testing/src/main/java/org/oppia/android/testing/threading:test_coroutine_dispatchers", "//utility", "//utility/src/main/java/org/oppia/android/util/extensions:context_extensions", ], diff --git a/testing/src/main/java/org/oppia/android/testing/platformparameter/TestPlatformParameterConstants.kt b/testing/src/main/java/org/oppia/android/testing/platformparameter/TestPlatformParameterConstants.kt deleted file mode 100644 index 4e3156be33f..00000000000 --- a/testing/src/main/java/org/oppia/android/testing/platformparameter/TestPlatformParameterConstants.kt +++ /dev/null @@ -1,88 +0,0 @@ -package org.oppia.android.testing.platformparameter - -import javax.inject.Qualifier - -/** - * Qualifier for test string platform parameter. Only used in tests related to platform parameter. - */ -@Qualifier -annotation class TestStringParam - -/** - * Name for the test string platform parameter. Only used in tests related to platform parameter. - */ -const val TEST_STRING_PARAM_NAME = "test_string_param_name" - -/** - * Default value for the test string platform parameter. Only used in tests related to platform - * parameter. - */ -const val TEST_STRING_PARAM_DEFAULT_VALUE = "test_string_param_default_value" - -/** - * Server value for the test string platform parameter. Only used in tests related to platform - * parameter. - */ -const val TEST_STRING_PARAM_SERVER_VALUE = "test_string_param_value" - -/** - * Qualifier for test boolean platform parameter. Only used in tests related to platform parameter. - */ -@Qualifier -annotation class TestBooleanParam - -/** - * Name for the test boolean platform parameter. Only used in tests related to platform parameter. - */ -const val TEST_BOOLEAN_PARAM_NAME = "test_boolean_param_name" - -/** - * Default value for the test boolean platform parameter. Only used in tests related to platform parameter. - */ -const val TEST_BOOLEAN_PARAM_DEFAULT_VALUE = false - -/** - * Server value for the test boolean platform parameter. Only used in tests related to platform parameter. - */ -const val TEST_BOOLEAN_PARAM_SERVER_VALUE = true - -/** - * Qualifier for test integer platform parameter. Only used in tests related to platform parameter. - */ -@Qualifier -annotation class TestIntegerParam - -/** - * Name for the test integer platform parameter. Only used in tests related to platform parameter. - */ -const val TEST_INTEGER_PARAM_NAME = "test_integer_param_name" - -/** - * Default value for the test integer platform parameter. Only used in tests related to platform parameter. - */ -const val TEST_INTEGER_PARAM_DEFAULT_VALUE = 0 - -/** - * Server value for the test integer platform parameter. Only used in tests related to platform parameter. - */ -const val TEST_INTEGER_PARAM_SERVER_VALUE = 1 - -/** - * Qualifier for a test feature flag - */ -@Qualifier annotation class EnableTestFeatureFlag - -/** Name of the test feature flag. */ -const val TEST_FEATURE_FLAG = "android_test_feature_flag" - -/** Default value of the test feature flag. */ -const val TEST_FEATURE_FLAG_DEFAULT_VALUE = false - -/** Qualifier for a test feature flag with an enabled default value. */ -@Qualifier annotation class EnableTestFeatureFlagWithEnabledDefault - -/** Name of the test feature flag with an enabled default value. */ -const val TEST_FEATURE_FLAG_WITH_ENABLED_DEFAULTS = "android_test_feature_flag_with_enabled_default" - -/** Default value of the test feature flag with an enabled default value. */ -const val TEST_FEATURE_FLAG_WITH_ENABLED_DEFAULT_VALUE = true diff --git a/testing/src/main/java/org/oppia/android/testing/platformparameter/TestPlatformParameterModule.kt b/testing/src/main/java/org/oppia/android/testing/platformparameter/TestPlatformParameterModule.kt index 6d41eea5a4f..9c6c2cf8779 100644 --- a/testing/src/main/java/org/oppia/android/testing/platformparameter/TestPlatformParameterModule.kt +++ b/testing/src/main/java/org/oppia/android/testing/platformparameter/TestPlatformParameterModule.kt @@ -1,117 +1,41 @@ package org.oppia.android.testing.platformparameter -import android.content.Context -import androidx.annotation.VisibleForTesting import dagger.Module import dagger.Provides -import org.oppia.android.app.model.PlatformParameter -import org.oppia.android.util.extensions.getVersionCode -import org.oppia.android.util.platformparameter.APP_AND_OS_DEPRECATION -import org.oppia.android.util.platformparameter.CACHE_LATEX_RENDERING -import org.oppia.android.util.platformparameter.CACHE_LATEX_RENDERING_DEFAULT_VALUE -import org.oppia.android.util.platformparameter.CacheLatexRendering -import org.oppia.android.util.platformparameter.DOWNLOADS_SUPPORT -import org.oppia.android.util.platformparameter.ENABLE_APP_AND_OS_DEPRECATION_DEFAULT_VALUE -import org.oppia.android.util.platformparameter.ENABLE_DOWNLOADS_SUPPORT_DEFAULT_VALUE -import org.oppia.android.util.platformparameter.ENABLE_EDIT_ACCOUNTS_OPTIONS_UI_DEFAULT_VALUE -import org.oppia.android.util.platformparameter.ENABLE_INTERACTION_CONFIG_CHANGE_STATE_RETENTION_DEFAULT_VALUE -import org.oppia.android.util.platformparameter.ENABLE_MULTIPLE_CLASSROOMS_DEFAULT_VALUE -import org.oppia.android.util.platformparameter.ENABLE_NPS_SURVEY_DEFAULT_VALUE -import org.oppia.android.util.platformparameter.ENABLE_ONBOARDING_FLOW_V2_DEFAULT_VALUE -import org.oppia.android.util.platformparameter.ENABLE_PERFORMANCE_METRICS_COLLECTION_DEFAULT_VALUE -import org.oppia.android.util.platformparameter.ENABLE_TOPIC_INFO_TAB_DEFAULT_VALUE -import org.oppia.android.util.platformparameter.ENABLE_TOPIC_PRACTICE_TAB_DEFAULT_VALUE -import org.oppia.android.util.platformparameter.EnableAppAndOsDeprecation -import org.oppia.android.util.platformparameter.EnableDownloadsSupport -import org.oppia.android.util.platformparameter.EnableEditAccountsOptionsUi -import org.oppia.android.util.platformparameter.EnableFastLanguageSwitchingInLesson -import org.oppia.android.util.platformparameter.EnableInteractionConfigChangeStateRetention -import org.oppia.android.util.platformparameter.EnableLearnerStudyAnalytics -import org.oppia.android.util.platformparameter.EnableLoggingLearnerStudyIds -import org.oppia.android.util.platformparameter.EnableMultipleClassrooms -import org.oppia.android.util.platformparameter.EnableNpsSurvey -import org.oppia.android.util.platformparameter.EnableOnboardingFlowV2 -import org.oppia.android.util.platformparameter.EnablePerformanceMetricsCollection -import org.oppia.android.util.platformparameter.EnableSpotlightUi -import org.oppia.android.util.platformparameter.EnableTopicInfoTab -import org.oppia.android.util.platformparameter.EnableTopicPracticeTab -import org.oppia.android.util.platformparameter.FAST_LANGUAGE_SWITCHING_IN_LESSON_DEFAULT_VALUE -import org.oppia.android.util.platformparameter.FORCED_APP_UPDATE_VERSION_CODE -import org.oppia.android.util.platformparameter.ForcedAppUpdateVersionCode -import org.oppia.android.util.platformparameter.LEARNER_STUDY_ANALYTICS_DEFAULT_VALUE -import org.oppia.android.util.platformparameter.LOGGING_LEARNER_STUDY_IDS_DEFAULT_VALUE -import org.oppia.android.util.platformparameter.LOWEST_SUPPORTED_API_LEVEL -import org.oppia.android.util.platformparameter.LOWEST_SUPPORTED_API_LEVEL_DEFAULT_VALUE -import org.oppia.android.util.platformparameter.LowestSupportedApiLevel -import org.oppia.android.util.platformparameter.NPS_SURVEY_GRACE_PERIOD_IN_DAYS_DEFAULT_VALUE -import org.oppia.android.util.platformparameter.NPS_SURVEY_MINIMUM_AGGREGATE_LEARNING_TIME_IN_A_TOPIC_IN_MINUTES_DEFAULT_VALUE -import org.oppia.android.util.platformparameter.NpsSurveyGracePeriodInDays -import org.oppia.android.util.platformparameter.NpsSurveyMinimumAggregateLearningTimeInATopicInMinutes -import org.oppia.android.util.platformparameter.OPTIONAL_APP_UPDATE_VERSION_CODE -import org.oppia.android.util.platformparameter.OptionalAppUpdateVersionCode -import org.oppia.android.util.platformparameter.PERFORMANCE_METRICS_COLLECTION_HIGH_FREQUENCY_TIME_INTERVAL_IN_MINUTES -import org.oppia.android.util.platformparameter.PERFORMANCE_METRICS_COLLECTION_HIGH_FREQUENCY_TIME_INTERVAL_IN_MINUTES_DEFAULT_VAL -import org.oppia.android.util.platformparameter.PERFORMANCE_METRICS_COLLECTION_LOW_FREQUENCY_TIME_INTERVAL_IN_MINUTES -import org.oppia.android.util.platformparameter.PERFORMANCE_METRICS_COLLECTION_LOW_FREQUENCY_TIME_INTERVAL_IN_MINUTES_DEFAULT_VAL -import org.oppia.android.util.platformparameter.PERFORMANCE_METRICS_COLLECTION_UPLOAD_TIME_INTERVAL_IN_MINUTES -import org.oppia.android.util.platformparameter.PERFORMANCE_METRICS_COLLECTION_UPLOAD_TIME_INTERVAL_IN_MINUTES_DEFAULT_VAL -import org.oppia.android.util.platformparameter.PerformanceMetricsCollectionHighFrequencyTimeIntervalInMinutes -import org.oppia.android.util.platformparameter.PerformanceMetricsCollectionLowFrequencyTimeIntervalInMinutes -import org.oppia.android.util.platformparameter.PerformanceMetricsCollectionUploadTimeIntervalInMinutes -import org.oppia.android.util.platformparameter.PlatformParameterSingleton -import org.oppia.android.util.platformparameter.PlatformParameterValue -import org.oppia.android.util.platformparameter.SPLASH_SCREEN_WELCOME_MSG -import org.oppia.android.util.platformparameter.SPLASH_SCREEN_WELCOME_MSG_DEFAULT_VALUE -import org.oppia.android.util.platformparameter.SYNC_UP_WORKER_TIME_PERIOD_IN_HOURS -import org.oppia.android.util.platformparameter.SYNC_UP_WORKER_TIME_PERIOD_IN_HOURS_DEFAULT_VALUE -import org.oppia.android.util.platformparameter.SplashScreenWelcomeMsg -import org.oppia.android.util.platformparameter.SyncUpWorkerTimePeriodHours +import org.oppia.android.app.model.FeatureFlagId.APP_AND_OS_DEPRECATION +import org.oppia.android.app.model.FeatureFlagId.DOWNLOADS_SUPPORT +import org.oppia.android.app.model.FeatureFlagId.EDIT_ACCOUNTS_OPTIONS_UI +import org.oppia.android.app.model.FeatureFlagId.FAST_LANGUAGE_SWITCHING_IN_LESSON +import org.oppia.android.app.model.FeatureFlagId.LEARNER_STUDY_ANALYTICS +import org.oppia.android.app.model.FeatureFlagId.LOGGING_LEARNER_STUDY_IDS +import org.oppia.android.app.model.FeatureFlagId.MULTIPLE_CLASSROOMS +import org.oppia.android.app.model.FeatureFlagId.NPS_SURVEY +import org.oppia.android.app.model.FeatureFlagId.ONBOARDING_FLOW_V2 +import org.oppia.android.app.model.FeatureFlagId.PERFORMANCE_METRICS_COLLECTION +import org.oppia.android.app.model.FeatureFlagId.SPOTLIGHT_UI +import org.oppia.android.app.model.FeatureFlagId.TOPIC_INFO_TAB +import org.oppia.android.app.model.FeatureFlagId.TOPIC_PRACTICE_TAB +import org.oppia.android.domain.platformparameter.FeatureFlagBindingModule +import org.oppia.android.domain.platformparameter.FeatureFlagsMapBindingModule +import org.oppia.android.domain.platformparameter.PlatformParameterBindingModule +import org.oppia.android.domain.platformparameter.PlatformParameterConfigRetriever +import org.oppia.android.domain.platformparameter.PlatformParameterController +import org.oppia.android.domain.platformparameter.PlatformParameterControllerProdImpl +import org.oppia.android.domain.platformparameter.PlatformParameterProcessState +import org.oppia.android.domain.platformparameter.testing.TestPlatformParameterConfigRetriever +import org.oppia.android.testing.threading.TestCoroutineDispatchers import javax.inject.Singleton /* Fake Platform Parameter Module that provides individual Platform Parameters for testing. */ -@Module +@Module( + includes = [ + FeatureFlagsMapBindingModule::class, + FeatureFlagBindingModule::class, + PlatformParameterBindingModule::class + ] +) class TestPlatformParameterModule { - @Provides - @EnableTestFeatureFlag - fun provideEnableTestFeatureFlag( - platformParameterSingleton: PlatformParameterSingleton - ): PlatformParameterValue { - return platformParameterSingleton.getBooleanPlatformParameter(TEST_FEATURE_FLAG) - ?: PlatformParameterValue.createDefaultParameter(TEST_FEATURE_FLAG_DEFAULT_VALUE) - } - - @Provides - @EnableTestFeatureFlagWithEnabledDefault - fun provideEnableTestFeatureFlagWithEnabledDefault( - platformParameterSingleton: PlatformParameterSingleton - ): PlatformParameterValue { - return platformParameterSingleton.getBooleanPlatformParameter( - TEST_FEATURE_FLAG_WITH_ENABLED_DEFAULTS - ) - ?: PlatformParameterValue.createDefaultParameter( - defaultValue = TEST_FEATURE_FLAG_WITH_ENABLED_DEFAULT_VALUE, - defaultSyncStatus = PlatformParameter.SyncStatus.SYNCED_FROM_SERVER - ) - } - - @Provides - @EnableDownloadsSupport - fun provideEnableDownloadsSupport( - platformParameterSingleton: PlatformParameterSingleton - ): PlatformParameterValue { - return platformParameterSingleton.getBooleanPlatformParameter(DOWNLOADS_SUPPORT) - ?: PlatformParameterValue.createDefaultParameter(enableDownloadsSupport) - } - - @TestStringParam - @Provides - @Singleton - fun provideTestStringParam( - platformParameterSingleton: PlatformParameterSingleton - ): PlatformParameterValue { - return platformParameterSingleton.getStringPlatformParameter(TEST_STRING_PARAM_NAME) - ?: PlatformParameterValue.createDefaultParameter(TEST_STRING_PARAM_DEFAULT_VALUE) - } + private val processState by lazy { PlatformParameterProcessState() } @TestIntegerParam @Provides @@ -126,329 +50,83 @@ class TestPlatformParameterModule { @TestBooleanParam @Provides @Singleton - fun provideTestBooleanParam( - platformParameterSingleton: PlatformParameterSingleton - ): PlatformParameterValue { - return platformParameterSingleton.getBooleanPlatformParameter(TEST_BOOLEAN_PARAM_NAME) - ?: PlatformParameterValue.createDefaultParameter(TEST_BOOLEAN_PARAM_DEFAULT_VALUE) - } - - @Provides - @SplashScreenWelcomeMsg - fun provideSplashScreenWelcomeMsgParam( - platformParameterSingleton: PlatformParameterSingleton - ): PlatformParameterValue { - return platformParameterSingleton.getBooleanPlatformParameter(SPLASH_SCREEN_WELCOME_MSG) - ?: PlatformParameterValue.createDefaultParameter(SPLASH_SCREEN_WELCOME_MSG_DEFAULT_VALUE) - } - - @Provides - @SyncUpWorkerTimePeriodHours - fun provideSyncUpWorkerTimePeriod( - platformParameterSingleton: PlatformParameterSingleton - ): PlatformParameterValue { - return platformParameterSingleton.getIntegerPlatformParameter( - SYNC_UP_WORKER_TIME_PERIOD_IN_HOURS - ) ?: PlatformParameterValue.createDefaultParameter( - SYNC_UP_WORKER_TIME_PERIOD_IN_HOURS_DEFAULT_VALUE - ) - } - - @Provides - @EnableEditAccountsOptionsUi - fun provideEnableEditAccountsOptionsUi(): PlatformParameterValue = - PlatformParameterValue.createDefaultParameter(enableEditAccountsOptionsUi) - - @Provides - @EnableLearnerStudyAnalytics - fun provideLearnerStudyAnalytics(): PlatformParameterValue = - PlatformParameterValue.createDefaultParameter(enableLearnerStudyAnalytics) - - @Provides - @EnableFastLanguageSwitchingInLesson - fun provideFastInLessonLanguageSwitching(): PlatformParameterValue = - PlatformParameterValue.createDefaultParameter(enableFastLanguageSwitchingInLesson) - - @Provides - @EnableLoggingLearnerStudyIds - fun provideLoggingLearnerStudyIds(): PlatformParameterValue = - PlatformParameterValue.createDefaultParameter(enableLoggingLearnerStudyIds) - - @Provides - @CacheLatexRendering - fun provideCacheLatexRendering( - platformParameterSingleton: PlatformParameterSingleton - ): PlatformParameterValue { - return platformParameterSingleton.getBooleanPlatformParameter(CACHE_LATEX_RENDERING) - ?: PlatformParameterValue.createDefaultParameter(CACHE_LATEX_RENDERING_DEFAULT_VALUE) - } - - @Provides - @EnablePerformanceMetricsCollection - fun provideEnablePerformanceMetricCollection(): PlatformParameterValue { - return PlatformParameterValue.createDefaultParameter(enablePerformanceMetricsCollection) - } - - @Provides - @PerformanceMetricsCollectionUploadTimeIntervalInMinutes - fun providePerformanceMetricsCollectionUploadTimeIntervalInMinutes( - platformParameterSingleton: PlatformParameterSingleton - ): PlatformParameterValue { - return platformParameterSingleton.getIntegerPlatformParameter( - PERFORMANCE_METRICS_COLLECTION_UPLOAD_TIME_INTERVAL_IN_MINUTES - ) ?: PlatformParameterValue.createDefaultParameter( - PERFORMANCE_METRICS_COLLECTION_UPLOAD_TIME_INTERVAL_IN_MINUTES_DEFAULT_VAL - ) - } - - @Provides - @PerformanceMetricsCollectionHighFrequencyTimeIntervalInMinutes - fun providePerformanceMetricsCollectionHighFrequencyTimeIntervalInMinutes( - platformParameterSingleton: PlatformParameterSingleton - ): PlatformParameterValue { - return platformParameterSingleton.getIntegerPlatformParameter( - PERFORMANCE_METRICS_COLLECTION_HIGH_FREQUENCY_TIME_INTERVAL_IN_MINUTES - ) ?: PlatformParameterValue.createDefaultParameter( - PERFORMANCE_METRICS_COLLECTION_HIGH_FREQUENCY_TIME_INTERVAL_IN_MINUTES_DEFAULT_VAL - ) - } + fun providePlatformParameterController( + factory: PlatformParameterControllerProdImpl.Factory + ): PlatformParameterController = factory.create(processState) @Provides - @PerformanceMetricsCollectionLowFrequencyTimeIntervalInMinutes - fun providePerformanceMetricsCollectionLowFrequencyTimeIntervalInMinutes( - platformParameterSingleton: PlatformParameterSingleton - ): PlatformParameterValue { - return platformParameterSingleton.getIntegerPlatformParameter( - PERFORMANCE_METRICS_COLLECTION_LOW_FREQUENCY_TIME_INTERVAL_IN_MINUTES - ) ?: PlatformParameterValue.createDefaultParameter( - PERFORMANCE_METRICS_COLLECTION_LOW_FREQUENCY_TIME_INTERVAL_IN_MINUTES_DEFAULT_VAL - ) - } - - @Provides - @EnableInteractionConfigChangeStateRetention - fun provideEnableInteractionConfigChangeStateRetention(): PlatformParameterValue = - PlatformParameterValue.createDefaultParameter(enableInteractionConfigChangeStateRetention) - - @Provides - @EnableSpotlightUi - fun provideEnableSpotlightUi(): PlatformParameterValue { - return PlatformParameterValue.createDefaultParameter( - enableSpotlightUi - ) - } - - @Provides - @EnableAppAndOsDeprecation - fun provideEnableAppAndOsDeprecation( - platformParameterSingleton: PlatformParameterSingleton - ): PlatformParameterValue { - return platformParameterSingleton.getBooleanPlatformParameter(APP_AND_OS_DEPRECATION) - ?: PlatformParameterValue.createDefaultParameter(ENABLE_APP_AND_OS_DEPRECATION_DEFAULT_VALUE) - } + fun providePlatformParameterConfigRetriever( + impl: TestPlatformParameterConfigRetriever + ): PlatformParameterConfigRetriever = impl @Provides @Singleton - @OptionalAppUpdateVersionCode - fun provideOptionalAppUpdateVersionCode( - platformParameterSingleton: PlatformParameterSingleton, - context: Context - ): PlatformParameterValue { - return platformParameterSingleton.getIntegerPlatformParameter( - OPTIONAL_APP_UPDATE_VERSION_CODE - ) ?: PlatformParameterValue.createDefaultParameter( - context.getVersionCode() - ) - } - - @Provides - @ForcedAppUpdateVersionCode - fun provideForcedAppUpdateVersionCode( - platformParameterSingleton: PlatformParameterSingleton, - context: Context - ): PlatformParameterValue { - return platformParameterSingleton.getIntegerPlatformParameter( - FORCED_APP_UPDATE_VERSION_CODE - ) ?: PlatformParameterValue.createDefaultParameter( - context.getVersionCode() - ) - } - - @Provides - @LowestSupportedApiLevel - fun provideLowestSupportedApiLevel( - platformParameterSingleton: PlatformParameterSingleton - ): PlatformParameterValue { - return platformParameterSingleton.getIntegerPlatformParameter( - LOWEST_SUPPORTED_API_LEVEL - ) ?: PlatformParameterValue.createDefaultParameter( - LOWEST_SUPPORTED_API_LEVEL_DEFAULT_VALUE - ) - } - - @Provides - @NpsSurveyGracePeriodInDays - fun provideNpsSurveyGracePeriodInDays(): PlatformParameterValue { - return PlatformParameterValue.createDefaultParameter(gracePeriodInDays) - } - - @Provides - @NpsSurveyMinimumAggregateLearningTimeInATopicInMinutes - fun provideNpsSurveyMinimumAggregateLearningTimeInATopicInMinutes(): - PlatformParameterValue { - return PlatformParameterValue.createDefaultParameter(minimumLearningTime) - } - - @Provides - @EnableNpsSurvey - fun provideEnableNpsSurvey(): PlatformParameterValue { - return PlatformParameterValue.createDefaultParameter(enableNpsSurvey) - } - - @Provides - @EnableOnboardingFlowV2 - fun provideEnableOnboardingFlowV2(): PlatformParameterValue { - return PlatformParameterValue.createDefaultParameter(enableOnboardingFlowV2) - } - - @Provides - @EnableMultipleClassrooms - fun provideEnableMultipleClassrooms(): PlatformParameterValue { - return PlatformParameterValue.createDefaultParameter(enableMultipleClassrooms) - } - - @Provides - @EnableTopicInfoTab - fun provideEnableTopicInfoTab(): PlatformParameterValue { - return PlatformParameterValue.createDefaultParameter(enableTopicInfoTab) - } - - @Provides - @EnableTopicPracticeTab - fun provideEnableTopicPracticeTab(): PlatformParameterValue { - return PlatformParameterValue.createDefaultParameter(enableTopicPracticeTab) + fun providePlatformParameterProcessState( + platformParameterController: PlatformParameterController, + testCoroutineDispatchers: TestCoroutineDispatchers + ): PlatformParameterProcessState { + // TODO(#5835): Remove this blocking hack to ensure tests are properly initialized for params. + val loadDeferred = platformParameterController.loadParametersAsync() + testCoroutineDispatchers.runCurrent() + check(loadDeferred.isCompleted) { "Expected parameter loading to have finished." } + return processState } companion object { - private var enableDownloadsSupport = ENABLE_DOWNLOADS_SUPPORT_DEFAULT_VALUE - private var enableEditAccountsOptionsUi = ENABLE_EDIT_ACCOUNTS_OPTIONS_UI_DEFAULT_VALUE - private var enableLearnerStudyAnalytics = LEARNER_STUDY_ANALYTICS_DEFAULT_VALUE - private var enableFastLanguageSwitchingInLesson = - FAST_LANGUAGE_SWITCHING_IN_LESSON_DEFAULT_VALUE - private var enableLoggingLearnerStudyIds = LOGGING_LEARNER_STUDY_IDS_DEFAULT_VALUE - private var enableInteractionConfigChangeStateRetention = - ENABLE_INTERACTION_CONFIG_CHANGE_STATE_RETENTION_DEFAULT_VALUE - private var enablePerformanceMetricsCollection = - ENABLE_PERFORMANCE_METRICS_COLLECTION_DEFAULT_VALUE - private var enableSpotlightUi = true - private var enableAppAndOsDeprecation = ENABLE_APP_AND_OS_DEPRECATION_DEFAULT_VALUE - private var minimumLearningTime = - NPS_SURVEY_MINIMUM_AGGREGATE_LEARNING_TIME_IN_A_TOPIC_IN_MINUTES_DEFAULT_VALUE - private var gracePeriodInDays = NPS_SURVEY_GRACE_PERIOD_IN_DAYS_DEFAULT_VALUE - private var enableNpsSurvey = ENABLE_NPS_SURVEY_DEFAULT_VALUE - private var enableOnboardingFlowV2 = ENABLE_ONBOARDING_FLOW_V2_DEFAULT_VALUE - private var enableMultipleClassrooms = ENABLE_MULTIPLE_CLASSROOMS_DEFAULT_VALUE - private var enableTopicInfoTab = ENABLE_TOPIC_INFO_TAB_DEFAULT_VALUE - private var enableTopicPracticeTab = ENABLE_TOPIC_PRACTICE_TAB_DEFAULT_VALUE - - @VisibleForTesting(otherwise = VisibleForTesting.NONE) fun forceEnableDownloadsSupport(value: Boolean) { - enableDownloadsSupport = value + TestPlatformParameterConfigRetriever.setFlagOverride(DOWNLOADS_SUPPORT, value) } - /** Enables forcing [EnableEditAccountsOptionsUI] platform parameter flag from tests. */ - @VisibleForTesting(otherwise = VisibleForTesting.NONE) fun forceEnableEditAccountsOptionsUi(value: Boolean) { - enableEditAccountsOptionsUi = value + TestPlatformParameterConfigRetriever.setFlagOverride(EDIT_ACCOUNTS_OPTIONS_UI, value) } - /** Enables forcing [EnableLearnerStudyAnalytics] platform parameter flag from tests. */ - @VisibleForTesting(otherwise = VisibleForTesting.NONE) fun forceEnableLearnerStudyAnalytics(value: Boolean) { - enableLearnerStudyAnalytics = value + TestPlatformParameterConfigRetriever.setFlagOverride(LEARNER_STUDY_ANALYTICS, value) } - /** Enables forcing [EnableFastLanguageSwitchingInLesson] platform parameter flag from tests. */ - @VisibleForTesting(otherwise = VisibleForTesting.NONE) fun forceEnableFastLanguageSwitchingInLesson(value: Boolean) { - enableFastLanguageSwitchingInLesson = value + TestPlatformParameterConfigRetriever.setFlagOverride(FAST_LANGUAGE_SWITCHING_IN_LESSON, value) } - /** Enables forcing [EnableLoggingLearnerStudyIds] platform parameter flag from tests. */ - @VisibleForTesting(otherwise = VisibleForTesting.NONE) fun forceEnableLoggingLearnerStudyIds(value: Boolean) { - enableLoggingLearnerStudyIds = value - } - - /** Enables forcing [EnableInteractionConfigChangeStateRetention] platform parameter flag from tests. */ - @VisibleForTesting(otherwise = VisibleForTesting.NONE) - fun forceEnableInteractionConfigChangeStateRetention(value: Boolean) { - enableInteractionConfigChangeStateRetention = value + TestPlatformParameterConfigRetriever.setFlagOverride(LOGGING_LEARNER_STUDY_IDS, value) } - /** Enables forcing [EnablePerformanceMetricsCollection] platform parameter flag from tests. */ - @VisibleForTesting(otherwise = VisibleForTesting.NONE) fun forceEnablePerformanceMetricsCollection(value: Boolean) { - enablePerformanceMetricsCollection = value + TestPlatformParameterConfigRetriever.setFlagOverride(PERFORMANCE_METRICS_COLLECTION, value) } - /** Enables forcing [EnableSpotlightUi] platform parameter flag from tests. */ - @VisibleForTesting(otherwise = VisibleForTesting.NONE) fun forceEnableSpotlightUi(value: Boolean) { - enableSpotlightUi = value + TestPlatformParameterConfigRetriever.setFlagOverride(SPOTLIGHT_UI, value) } - /** Enables forcing [EnableNpsSurvey] feature flag from tests. */ - @VisibleForTesting(otherwise = VisibleForTesting.NONE) fun forceEnableNpsSurvey(value: Boolean) { - enableNpsSurvey = value + TestPlatformParameterConfigRetriever.setFlagOverride(NPS_SURVEY, value) } - /** Enables forcing [EnableOnboardingFlowV2] platform parameter flag from tests. */ - @VisibleForTesting(otherwise = VisibleForTesting.NONE) fun forceEnableOnboardingFlowV2(value: Boolean) { - enableOnboardingFlowV2 = value + TestPlatformParameterConfigRetriever.setFlagOverride(ONBOARDING_FLOW_V2, value) } - /** Enables forcing [EnableMultipleClassrooms] platform parameter flag from tests. */ - @VisibleForTesting(otherwise = VisibleForTesting.NONE) fun forceEnableMultipleClassrooms(value: Boolean) { - enableMultipleClassrooms = value + TestPlatformParameterConfigRetriever.setFlagOverride(MULTIPLE_CLASSROOMS, value) } - /** Enables forcing [EnableAppAndOsDeprecation] feature flag from tests. */ - @VisibleForTesting(otherwise = VisibleForTesting.NONE) fun forceEnableAppAndOsDeprecation(value: Boolean) { - enableAppAndOsDeprecation = value + TestPlatformParameterConfigRetriever.setFlagOverride(APP_AND_OS_DEPRECATION, value) } - /** Enables forcing [EnableTopicInfoTab] platform parameter flag from tests. */ - @VisibleForTesting(otherwise = VisibleForTesting.NONE) fun forceEnableTopicInfoTab(value: Boolean) { - enableTopicInfoTab = value + TestPlatformParameterConfigRetriever.setFlagOverride(TOPIC_INFO_TAB, value) } - /** Enables forcing [EnableTopicPracticeTab] platform parameter flag from tests. */ - @VisibleForTesting(otherwise = VisibleForTesting.NONE) fun forceEnableTopicPracticeTab(value: Boolean) { - enableTopicPracticeTab = value + TestPlatformParameterConfigRetriever.setFlagOverride(TOPIC_PRACTICE_TAB, value) } - @VisibleForTesting(otherwise = VisibleForTesting.NONE) fun reset() { - enableDownloadsSupport = ENABLE_DOWNLOADS_SUPPORT_DEFAULT_VALUE - enableEditAccountsOptionsUi = ENABLE_EDIT_ACCOUNTS_OPTIONS_UI_DEFAULT_VALUE - enableLearnerStudyAnalytics = LEARNER_STUDY_ANALYTICS_DEFAULT_VALUE - enableFastLanguageSwitchingInLesson = FAST_LANGUAGE_SWITCHING_IN_LESSON_DEFAULT_VALUE - enableLoggingLearnerStudyIds = LOGGING_LEARNER_STUDY_IDS_DEFAULT_VALUE - enableInteractionConfigChangeStateRetention = - ENABLE_INTERACTION_CONFIG_CHANGE_STATE_RETENTION_DEFAULT_VALUE - enablePerformanceMetricsCollection = ENABLE_PERFORMANCE_METRICS_COLLECTION_DEFAULT_VALUE - enableAppAndOsDeprecation = ENABLE_APP_AND_OS_DEPRECATION_DEFAULT_VALUE - enableOnboardingFlowV2 = ENABLE_ONBOARDING_FLOW_V2_DEFAULT_VALUE - enableMultipleClassrooms = ENABLE_MULTIPLE_CLASSROOMS_DEFAULT_VALUE - enableTopicInfoTab = ENABLE_TOPIC_INFO_TAB_DEFAULT_VALUE - enableTopicPracticeTab = ENABLE_TOPIC_PRACTICE_TAB_DEFAULT_VALUE + TestPlatformParameterConfigRetriever.reset() } } } diff --git a/testing/src/test/java/org/oppia/android/testing/logging/EventLogSubjectTest.kt b/testing/src/test/java/org/oppia/android/testing/logging/EventLogSubjectTest.kt index 721a13cf28d..3ecc9b73f45 100644 --- a/testing/src/test/java/org/oppia/android/testing/logging/EventLogSubjectTest.kt +++ b/testing/src/test/java/org/oppia/android/testing/logging/EventLogSubjectTest.kt @@ -23,11 +23,12 @@ import org.oppia.android.app.model.EventLog.SurveyContext import org.oppia.android.app.model.EventLog.SwitchInLessonLanguageEventContext import org.oppia.android.app.model.EventLog.TopicContext import org.oppia.android.app.model.EventLog.VoiceoverActionContext +import org.oppia.android.app.model.FeatureFlagId import org.oppia.android.app.model.MarketFitAnswer import org.oppia.android.app.model.OppiaLanguage -import org.oppia.android.app.model.PlatformParameter.SyncStatus import org.oppia.android.app.model.ProfileId import org.oppia.android.app.model.SurveyQuestionName +import org.oppia.android.app.model.SyncStatus import org.oppia.android.app.model.UserTypeAnswer import org.oppia.android.app.model.WrittenTranslationLanguageSelection import org.oppia.android.testing.logging.EventLogSubject.AbandonSurveyContextSubject @@ -4901,8 +4902,8 @@ class EventLogSubjectTest { @Test fun testFeatureFlagListContext_hasFeatureFlagItemContextThatAtIndex_returnsCorrectItem() { val featureFlagItem = EventLog.FeatureFlagItemContext.newBuilder() - .setFlagName("enable_multiple_classrooms") - .setFlagEnabledState(true) + .setId(FeatureFlagId.MULTIPLE_CLASSROOMS) + .setIsEnabled(true) .build() val context = FeatureFlagListContext.newBuilder() @@ -4911,16 +4912,16 @@ class EventLogSubjectTest { FeatureFlagListContextSubject.assertThat(context) .hasFeatureFlagItemContextThatAtIndex(0) - .hasFeatureFlagNameThat() - .isEqualTo("enable_multiple_classrooms") + .hasFeatureFlagIdThat() + .isEqualTo(FeatureFlagId.MULTIPLE_CLASSROOMS) } @Test fun testFeatureFlagListContext_hasFeatureFlagItemContextThatAtIndex_executesBlockCorrectly() { val featureFlagItem = EventLog.FeatureFlagItemContext.newBuilder() - .setFlagName("new_dashboard") - .setFlagEnabledState(true) - .setFlagSyncStatus(SyncStatus.SYNCED_FROM_SERVER) + .setId(FeatureFlagId.DOWNLOADS_SUPPORT) + .setIsEnabled(true) + .setSyncStatus(SyncStatus.SYNCED_FROM_SERVER) .build() val context = FeatureFlagListContext.newBuilder() @@ -4929,11 +4930,9 @@ class EventLogSubjectTest { FeatureFlagListContextSubject.assertThat(context) .hasFeatureFlagItemContextThatAtIndex(0) { - hasFeatureFlagNameThat().isEqualTo("new_dashboard") - hasFeatureFlagEnabledStateThat().isEqualTo(true) - hasFeatureFlagSyncStateThat().isEqualTo( - SyncStatus.SYNCED_FROM_SERVER - ) + hasFeatureFlagIdThat().isEqualTo(FeatureFlagId.DOWNLOADS_SUPPORT) + hasFeatureFlagEnabledStateThat().isTrue() + hasFeatureFlagSyncStateThat().isEqualTo(SyncStatus.SYNCED_FROM_SERVER) } } } diff --git a/testing/src/test/java/org/oppia/android/testing/profile/ProfileTestHelperTest.kt b/testing/src/test/java/org/oppia/android/testing/profile/ProfileTestHelperTest.kt index 902f9e91b59..ebe094faa10 100644 --- a/testing/src/test/java/org/oppia/android/testing/profile/ProfileTestHelperTest.kt +++ b/testing/src/test/java/org/oppia/android/testing/profile/ProfileTestHelperTest.kt @@ -16,12 +16,12 @@ import org.oppia.android.app.model.ProfileType 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.platformparameter.PlatformParameterModule import org.oppia.android.domain.platformparameter.PlatformParameterSingletonModule import org.oppia.android.domain.profile.ProfileManagementController import org.oppia.android.testing.TestLogReportingModule import org.oppia.android.testing.data.AsyncResultSubject.Companion.assertThat import org.oppia.android.testing.data.DataProviderTestMonitor +import org.oppia.android.testing.platformparameter.TestPlatformParameterModule import org.oppia.android.testing.robolectric.RobolectricModule import org.oppia.android.testing.threading.TestCoroutineDispatchers import org.oppia.android.testing.threading.TestDispatcherModule @@ -215,13 +215,13 @@ class ProfileTestHelperTest { LogStorageModule::class, LoggingIdentifierModule::class, NetworkConnectionUtilDebugModule::class, - PlatformParameterModule::class, PlatformParameterSingletonModule::class, RobolectricModule::class, SyncStatusModule::class, TestDispatcherModule::class, TestLogReportingModule::class, - TestModule::class + TestModule::class, + TestPlatformParameterModule::class ] ) interface TestApplicationComponent : DataProvidersInjector { diff --git a/third_party/maven_install.json b/third_party/maven_install.json index b033d30df3c..70c125b3234 100644 --- a/third_party/maven_install.json +++ b/third_party/maven_install.json @@ -1,7 +1,7 @@ { "__AUTOGENERATED_FILE_DO_NOT_MODIFY_THIS_FILE_MANUALLY": "THERE_IS_NO_DATA_ONLY_ZUUL", - "__INPUT_ARTIFACTS_HASH": 1952776840, - "__RESOLVED_ARTIFACTS_HASH": -1450223812, + "__INPUT_ARTIFACTS_HASH": 1862820852, + "__RESOLVED_ARTIFACTS_HASH": 642375257, "conflict_resolution": { "androidx.annotation:annotation:1.1.0": "androidx.annotation:annotation:1.2.0", "androidx.constraintlayout:constraintlayout:1.1.3": "androidx.constraintlayout:constraintlayout:2.0.1", @@ -703,15 +703,21 @@ }, "com.android.tools.analytics-library:protos": { "shasums": { - "jar": "c1f0270c758f61db311d1365af2eaab46318c0ecde1d15aed6c20d5b32ed3ade" + "jar": "6695fe4be8c58274efbf0fa0ab9e465ceaf4f21792970d68d37591287ee7bed1" }, - "version": "30.0.4" + "version": "30.3.1" }, "com.android.tools.analytics-library:shared": { "shasums": { - "jar": "91cada37f5035b5d313cce64fde2a3c3a3f58b267edb80b0e3e94372e3bcf2d1" + "jar": "4a7ee8aad5796e058a2f414993424155172689ac332cd1a999db861949e2e1de" }, - "version": "30.0.4" + "version": "30.3.1" + }, + "com.android.tools.analytics-library:tracker": { + "shasums": { + "jar": "ec43dbc6cf1e93f5999262b483cb6ec93b372010c06c3800c50d9fca903dd1c2" + }, + "version": "30.3.1" }, "com.android.tools.apkparser:apkanalyzer": { "shasums": { @@ -739,105 +745,105 @@ }, "com.android.tools.build:builder-model": { "shasums": { - "jar": "6ab2f2371f2bcd48a3a623613d0bc00838b5bfb4e6c4e49e324ebcf88f7feb0e" - }, - "version": "7.0.4" - }, - "com.android.tools.build:builder-test-api": { - "shasums": { - "jar": "cfcf933229e368231a96b79b1ec394d7cbcf822eaf8a3ba44c92ba52d959c90e" + "jar": "9737e0b1873180027f58e9902b2fc832e0ce22d36dd9d78fc93a5ca32b6ca5b1" }, - "version": "7.0.4" + "version": "7.3.1" }, "com.android.tools.build:manifest-merger": { "shasums": { - "jar": "44339ed30995742f96147891356135210599c96a0a00a62d81465ce2b8ec1f98" + "jar": "534ac50d45d1bbc80f4122c7fa221402442835029ef05ec056f4edf2776c8c9f" }, - "version": "30.0.4" + "version": "30.3.1" }, "com.android.tools.ddms:ddmlib": { "shasums": { - "jar": "7f706a995f5b3047d80e28b4edb584b2338b7b47b9629ed1607011f39c17e14c" + "jar": "58c4db5a94a5f8c933409335f6657a92ff9c87488a271b260315fbd020c07fe0" }, - "version": "30.0.4" + "version": "30.3.1" }, "com.android.tools.external.com-intellij:intellij-core": { "shasums": { - "jar": "e5577bfe5be2937212012cda8ead120fc2dd96a3427533b4b4aed2c60fe3e8c4" + "jar": "8bb2aecfb8dd2208fe341a731ac44a9ec83f989c12449b82dff1eab493de0408" }, - "version": "30.0.4" + "version": "30.3.1" }, "com.android.tools.external.com-intellij:kotlin-compiler": { "shasums": { - "jar": "5e2456b33e7879442d10c666c2eae756c3e711d087f7b346b1f2035f0c3fc18d" + "jar": "ccdc9e1abfafdec71f4f93a3a2ad6230a1384925b06fc277d4ed921de5bb6fd8" }, - "version": "30.0.4" + "version": "30.3.1" }, "com.android.tools.external.org-jetbrains:uast": { "shasums": { - "jar": "72be32fa6463c307ce52abef1317b73bb515e7ff68475ad555cad37b84c1563d" + "jar": "47bf3fc2a6a9aa09f728788e869033341abd9d8cdb9fc61087dfb7cd576076d8" }, - "version": "30.0.4" + "version": "30.3.1" }, "com.android.tools.layoutlib:layoutlib-api": { "shasums": { - "jar": "9ba23153dd4aa795313d8b908cd0acd553ec5e2d7b4a5c5944609b6a47a768d4" + "jar": "7ffb2c13ac92e2d2d454c617ec537ad3b8868a987118c4d3c62018125d656707" }, - "version": "30.0.4" + "version": "30.3.1" + }, + "com.android.tools.lint:lint": { + "shasums": { + "jar": "685080782f6368cc68ac74db065b4c5c59d9c82599dc34be2ec39e425251b864" + }, + "version": "30.3.1" }, "com.android.tools.lint:lint-api": { "shasums": { - "jar": "ebbdcbed4149b8a781262473feaa113166750ca3042735fd9fcd79f8e9103037" + "jar": "cc6ebd7a146226363aa38bbb4a10d3e329079ac3201dbfeb562605be691d482c" }, - "version": "30.0.4" + "version": "30.3.1" }, "com.android.tools.lint:lint-checks": { "shasums": { - "jar": "7bd817ff4060fdb13750c5a45daccd768b47a1363607da3ee9eceba46c99d569" + "jar": "a6a728be66b4e1cb61333f77f519f8213450989be0fbe125ff77e6241d07be8e" }, - "version": "30.0.4" + "version": "30.3.1" }, "com.android.tools.lint:lint-model": { "shasums": { - "jar": "fb7561562b7d3d3edf015c12367f267804a9824083a9e10944daf71473ce9bc5" + "jar": "4b6fc00a29c8dc716fb3a53b200af711318d2a8db5fa6c3d874b6d6d65e44541" }, - "version": "30.0.4" + "version": "30.3.1" }, "com.android.tools:annotations": { "shasums": { - "jar": "df132b4daa2bb73770cd459c4c6b9b927695dd8a89592ab149ecdb7e0d8506ed" + "jar": "77e5196bcafc283c5e987f0944f049eee0e68b532ebeb530d855f6f196db4f2a" }, - "version": "30.0.4" + "version": "30.3.1" }, "com.android.tools:common": { "shasums": { - "jar": "d1aa2b6a43843c385ddd246fb0118acf45afad5317edb3c508a4604a288fa9c9" + "jar": "559f1484222d8947ecf4d18538295be6d12ff2b74dc22c3c85922c7ba33678e9" }, - "version": "30.0.4" + "version": "30.3.1" }, "com.android.tools:dvlib": { "shasums": { - "jar": "61edccccecc1ffca47f442326bd7c1d73f7256ef9adaac834c1d639a142e49b9" + "jar": "d4b141bd617afaf292dbd7c4f48b6b3a0b4244ded12b0e241e7bdf755db1597c" }, - "version": "30.0.4" + "version": "30.3.1" }, "com.android.tools:repository": { "shasums": { - "jar": "ff77dda7a094a6b2ae5d631ecaca59c26c0673f59b1e5f874352c17e92eb9a1f" + "jar": "a3bd11b434ccde5df90de77fd853361d99c150778cce5638d1ce25f820b9e243" }, - "version": "30.0.4" + "version": "30.3.1" }, "com.android.tools:sdk-common": { "shasums": { - "jar": "b4617630f9c9cc8ad80f1aab980cc560d8f76bd26e84421ea54f38e036b3be48" + "jar": "fbe6b7dfb30b38ab1d17c5c6b660a8446ac2023fb0cfca3231126facedac2b7c" }, - "version": "30.0.4" + "version": "30.3.1" }, "com.android.tools:sdklib": { "shasums": { - "jar": "bcfe68d2ec02569f40978c9380a3302d60f67772c0dea95838f817f5cf3505a8" + "jar": "57e147e5c3add5bfa1c53eb81aa24edbe2056fbd2210a00c9a71409ae498356b" }, - "version": "30.0.4" + "version": "30.3.1" }, "com.beust:jcommander": { "shasums": { @@ -1585,9 +1591,9 @@ }, "org.apache.httpcomponents:httpcore": { "shasums": { - "jar": "78ba1096561957db1b55200a159b648876430342d15d461277e62360da19f6fd" + "jar": "e06e89d40943245fcfa39ec537cdbfce3762aecde8f9c597780d2b00c2b43424" }, - "version": "4.4.10" + "version": "4.4.13" }, "org.apache.httpcomponents:httpmime": { "shasums": { @@ -1597,9 +1603,9 @@ }, "org.bouncycastle:bcpkix-jdk15on": { "shasums": { - "jar": "7043dee4e9e7175e93e0b36f45b1ec1ecb893c5f755667e8b916eb8dd201c6ca" + "jar": "efbca754880ce3922ca47a43c1f0b72c45731450a0ef193b9db33bf4bb38ce5f" }, - "version": "1.56" + "version": "1.67" }, "org.bouncycastle:bcprov-jdk15on": { "shasums": { @@ -2594,6 +2600,15 @@ "net.java.dev.jna:jna-platform", "org.jetbrains.kotlin:kotlin-stdlib-jdk8" ], + "com.android.tools.analytics-library:tracker": [ + "com.android.tools.analytics-library:protos", + "com.android.tools.analytics-library:shared", + "com.android.tools:annotations", + "com.android.tools:common", + "com.google.guava:guava", + "com.google.protobuf:protobuf-java", + "org.jetbrains.kotlin:kotlin-stdlib-jdk8" + ], "com.android.tools.apkparser:apkanalyzer": [ "com.android.tools.apkparser:binary-resources", "com.android.tools.lint:lint-api", @@ -2621,12 +2636,6 @@ "com.android.tools:annotations", "org.jetbrains.kotlin:kotlin-stdlib-jdk8" ], - "com.android.tools.build:builder-test-api": [ - "com.android.tools.ddms:ddmlib", - "com.android.tools:annotations", - "com.android.tools:common", - "com.google.guava:guava" - ], "com.android.tools.build:manifest-merger": [ "com.android.tools:common", "com.android.tools:sdk-common", @@ -2638,7 +2647,8 @@ "com.android.tools.ddms:ddmlib": [ "com.android.tools:common", "com.google.protobuf:protobuf-java", - "net.sf.kxml:kxml2" + "net.sf.kxml:kxml2", + "org.jetbrains.kotlin:kotlin-stdlib-jdk8" ], "com.android.tools.external.com-intellij:intellij-core": [ "org.jetbrains.intellij.deps:trove4j" @@ -2649,6 +2659,25 @@ "net.sf.kxml:kxml2", "org.jetbrains:annotations" ], + "com.android.tools.lint:lint": [ + "com.android.tools.analytics-library:protos", + "com.android.tools.analytics-library:shared", + "com.android.tools.analytics-library:tracker", + "com.android.tools.build:manifest-merger", + "com.android.tools.external.com-intellij:intellij-core", + "com.android.tools.external.com-intellij:kotlin-compiler", + "com.android.tools.external.org-jetbrains:uast", + "com.android.tools.layoutlib:layoutlib-api", + "com.android.tools.lint:lint-api", + "com.android.tools.lint:lint-checks", + "com.android.tools:common", + "com.android.tools:sdk-common", + "com.android.tools:sdklib", + "com.google.guava:guava", + "net.sf.kxml:kxml2", + "org.jetbrains.kotlin:kotlin-reflect", + "org.jetbrains.kotlin:kotlin-stdlib-jdk8" + ], "com.android.tools.lint:lint-api": [ "com.android.tools.build:builder-model", "com.android.tools.build:manifest-merger", @@ -2694,6 +2723,7 @@ "com.android.tools:common": [ "com.android.tools:annotations", "com.google.guava:guava", + "net.java.dev.jna:jna-platform", "org.jetbrains.kotlin:kotlin-stdlib-jdk8" ], "com.android.tools:dvlib": [ @@ -2711,8 +2741,6 @@ "com.android.tools:sdk-common": [ "com.android.tools.analytics-library:shared", "com.android.tools.build:aapt2-proto", - "com.android.tools.build:builder-model", - "com.android.tools.build:builder-test-api", "com.android.tools.ddms:ddmlib", "com.android.tools.layoutlib:layoutlib-api", "com.android.tools:common", @@ -3508,6 +3536,9 @@ "com.android.tools.analytics-library:shared": [ "com.android.tools.analytics" ], + "com.android.tools.analytics-library:tracker": [ + "com.android.tools.analytics" + ], "com.android.tools.apkparser:apkanalyzer": [ "com.android.tools.apk.analyzer", "com.android.tools.apk.analyzer.dex", @@ -3541,9 +3572,6 @@ "com.android.builder.model.v2.models", "com.android.builder.model.v2.models.ndk" ], - "com.android.tools.build:builder-test-api": [ - "com.android.builder.testing.api" - ], "com.android.tools.build:manifest-merger": [ "com.android.manifmerger" ], @@ -3551,6 +3579,7 @@ "com.android.commands.am", "com.android.ddmlib", "com.android.ddmlib.internal", + "com.android.ddmlib.internal.commands", "com.android.ddmlib.internal.jdwp", "com.android.ddmlib.internal.jdwp.chunkhandler", "com.android.ddmlib.internal.jdwp.interceptor", @@ -3565,7 +3594,17 @@ "com.android.server.adb.protos" ], "com.android.tools.external.com-intellij:intellij-core": [ - "com.android.tools.external.intellij.core", + "com.fasterxml.aalto", + "com.fasterxml.aalto.async", + "com.fasterxml.aalto.dom", + "com.fasterxml.aalto.evt", + "com.fasterxml.aalto.impl", + "com.fasterxml.aalto.in", + "com.fasterxml.aalto.io", + "com.fasterxml.aalto.out", + "com.fasterxml.aalto.sax", + "com.fasterxml.aalto.stax", + "com.fasterxml.aalto.util", "com.intellij", "com.intellij.codeInsight", "com.intellij.codeInsight.completion", @@ -3590,6 +3629,7 @@ "com.intellij.diagnostic.tracing", "com.intellij.execution", "com.intellij.execution.configurations", + "com.intellij.execution.filters", "com.intellij.execution.process", "com.intellij.execution.rmi", "com.intellij.execution.rmi.ssl", @@ -3612,6 +3652,7 @@ "com.intellij.lang.folding", "com.intellij.lang.impl", "com.intellij.lang.injection", + "com.intellij.lang.injection.general", "com.intellij.lang.java", "com.intellij.lang.java.beans", "com.intellij.lang.java.lexer", @@ -3699,6 +3740,8 @@ "com.intellij.openapi.wm.ex", "com.intellij.patterns", "com.intellij.patterns.compiler", + "com.intellij.platform.util", + "com.intellij.platform.util.plugins", "com.intellij.pom", "com.intellij.pom.core.impl", "com.intellij.pom.event", @@ -3753,6 +3796,7 @@ "com.intellij.psi.scope.processor", "com.intellij.psi.scope.util", "com.intellij.psi.search", + "com.intellij.psi.search.impl", "com.intellij.psi.search.searches", "com.intellij.psi.stub", "com.intellij.psi.stubs", @@ -3781,9 +3825,11 @@ "com.intellij.util.containers", "com.intellij.util.containers.hash", "com.intellij.util.diff", + "com.intellij.util.download", + "com.intellij.util.download.impl", "com.intellij.util.enumeration", - "com.intellij.util.exception", "com.intellij.util.execution", + "com.intellij.util.fmap", "com.intellij.util.graph", "com.intellij.util.graph.impl", "com.intellij.util.indexing", @@ -3838,25 +3884,65 @@ "it.unimi.dsi.fastutil.doubles", "it.unimi.dsi.fastutil.floats", "it.unimi.dsi.fastutil.ints", + "it.unimi.dsi.fastutil.io", "it.unimi.dsi.fastutil.longs", "it.unimi.dsi.fastutil.objects", "it.unimi.dsi.fastutil.shorts", - "javaslang", - "javaslang.collection", - "javaslang.concurrent", - "javaslang.control", - "javaslang.match", - "javaslang.match.annotation", - "javaslang.match.generator", - "javaslang.match.model", - "javax.annotation", - "javax.annotation.concurrent", - "javax.annotation.meta", - "javax.inject", + "kotlinx.coroutines", + "kotlinx.coroutines.channels", + "kotlinx.coroutines.debug", + "kotlinx.coroutines.debug.internal", + "kotlinx.coroutines.flow", + "kotlinx.coroutines.flow.internal", + "kotlinx.coroutines.future", + "kotlinx.coroutines.internal", + "kotlinx.coroutines.intrinsics", + "kotlinx.coroutines.scheduling", + "kotlinx.coroutines.selects", + "kotlinx.coroutines.stream", + "kotlinx.coroutines.sync", + "kotlinx.coroutines.test", + "kotlinx.coroutines.time", "net.jpountz.lz4", "net.jpountz.util", "net.jpountz.xxhash", + "net.n3.nanoxml", "one.util.streamex", + "org.apache.commons.compress", + "org.apache.commons.compress.archivers", + "org.apache.commons.compress.archivers.ar", + "org.apache.commons.compress.archivers.arj", + "org.apache.commons.compress.archivers.cpio", + "org.apache.commons.compress.archivers.dump", + "org.apache.commons.compress.archivers.examples", + "org.apache.commons.compress.archivers.jar", + "org.apache.commons.compress.archivers.sevenz", + "org.apache.commons.compress.archivers.tar", + "org.apache.commons.compress.archivers.zip", + "org.apache.commons.compress.changes", + "org.apache.commons.compress.compressors", + "org.apache.commons.compress.compressors.brotli", + "org.apache.commons.compress.compressors.bzip2", + "org.apache.commons.compress.compressors.deflate", + "org.apache.commons.compress.compressors.deflate64", + "org.apache.commons.compress.compressors.gzip", + "org.apache.commons.compress.compressors.lz4", + "org.apache.commons.compress.compressors.lz77support", + "org.apache.commons.compress.compressors.lzma", + "org.apache.commons.compress.compressors.lzw", + "org.apache.commons.compress.compressors.pack200", + "org.apache.commons.compress.compressors.snappy", + "org.apache.commons.compress.compressors.xz", + "org.apache.commons.compress.compressors.z", + "org.apache.commons.compress.compressors.zstandard", + "org.apache.commons.compress.harmony.archive.internal.nls", + "org.apache.commons.compress.harmony.pack200", + "org.apache.commons.compress.harmony.unpack200", + "org.apache.commons.compress.harmony.unpack200.bytecode", + "org.apache.commons.compress.harmony.unpack200.bytecode.forms", + "org.apache.commons.compress.java.util.jar", + "org.apache.commons.compress.parallel", + "org.apache.commons.compress.utils", "org.apache.log4j", "org.apache.log4j.chainsaw", "org.apache.log4j.config", @@ -3868,7 +3954,6 @@ "org.apache.log4j.lf5.viewer", "org.apache.log4j.lf5.viewer.categoryexplorer", "org.apache.log4j.lf5.viewer.configure", - "org.apache.log4j.net", "org.apache.log4j.nt", "org.apache.log4j.or", "org.apache.log4j.or.jms", @@ -3884,9 +3969,17 @@ "org.apache.oro.text.perl", "org.apache.oro.text.regex", "org.apache.oro.util", - "org.fusesource.hawtjni.runtime", - "org.fusesource.jansi", - "org.fusesource.jansi.internal", + "org.codehaus.stax2", + "org.codehaus.stax2.evt", + "org.codehaus.stax2.io", + "org.codehaus.stax2.osgi", + "org.codehaus.stax2.ri", + "org.codehaus.stax2.ri.dom", + "org.codehaus.stax2.ri.evt", + "org.codehaus.stax2.ri.typed", + "org.codehaus.stax2.typed", + "org.codehaus.stax2.util", + "org.codehaus.stax2.validation", "org.intellij.lang.annotations", "org.jdom", "org.jdom.adapters", @@ -3907,7 +4000,33 @@ "org.jetbrains.annotations", "org.jetbrains.concurrency", "org.jetbrains.ide", - "org.jetbrains.jps", + "org.jetbrains.jps.model", + "org.jetbrains.jps.model.artifact", + "org.jetbrains.jps.model.artifact.elements", + "org.jetbrains.jps.model.artifact.elements.ex", + "org.jetbrains.jps.model.artifact.impl", + "org.jetbrains.jps.model.artifact.impl.elements", + "org.jetbrains.jps.model.ex", + "org.jetbrains.jps.model.fileTypes", + "org.jetbrains.jps.model.fileTypes.impl", + "org.jetbrains.jps.model.impl", + "org.jetbrains.jps.model.impl.runConfiguration", + "org.jetbrains.jps.model.jarRepository", + "org.jetbrains.jps.model.jarRepository.impl", + "org.jetbrains.jps.model.java", + "org.jetbrains.jps.model.java.compiler", + "org.jetbrains.jps.model.java.impl", + "org.jetbrains.jps.model.java.impl.compiler", + "org.jetbrains.jps.model.java.impl.runConfiguration", + "org.jetbrains.jps.model.java.runConfiguration", + "org.jetbrains.jps.model.library", + "org.jetbrains.jps.model.library.impl", + "org.jetbrains.jps.model.library.impl.sdk", + "org.jetbrains.jps.model.library.sdk", + "org.jetbrains.jps.model.module", + "org.jetbrains.jps.model.module.impl", + "org.jetbrains.jps.model.runConfiguration", + "org.jetbrains.jps.model.serialization", "org.jetbrains.jps.plugin", "org.jetbrains.jps.service", "org.jetbrains.jps.service.impl", @@ -3918,40 +4037,28 @@ "org.jetbrains.org.objectweb.asm.tree", "org.jetbrains.org.objectweb.asm.tree.analysis", "org.jetbrains.org.objectweb.asm.util", - "org.jline.builtins", - "org.jline.builtins.ssh", - "org.jline.builtins.telnet", - "org.jline.keymap", - "org.jline.reader", - "org.jline.reader.impl", - "org.jline.reader.impl.completer", - "org.jline.reader.impl.history", - "org.jline.terminal", - "org.jline.terminal.impl", - "org.jline.terminal.impl.jansi", - "org.jline.terminal.impl.jansi.freebsd", - "org.jline.terminal.impl.jansi.linux", - "org.jline.terminal.impl.jansi.osx", - "org.jline.terminal.impl.jansi.solaris", - "org.jline.terminal.impl.jansi.win", - "org.jline.terminal.impl.jna", - "org.jline.terminal.impl.jna.freebsd", - "org.jline.terminal.impl.jna.linux", - "org.jline.terminal.impl.jna.osx", - "org.jline.terminal.impl.jna.solaris", - "org.jline.terminal.impl.jna.win", - "org.jline.terminal.spi", - "org.jline.utils", "org.picocontainer", "org.picocontainer.defaults" ], "com.android.tools.external.com-intellij:kotlin-compiler": [ - "com.android.tools.external.kotlin.compiler", + "com.google.gwt.dev.js", + "com.google.gwt.dev.js.parserExceptions", + "com.google.gwt.dev.js.rhino", + "com.intellij.util.io", + "javaslang", + "javaslang.collection", + "javaslang.concurrent", + "javaslang.control", + "javaslang.match", + "javaslang.match.annotation", + "javaslang.match.generator", + "javaslang.match.model", "kotlin.script.dependencies", "kotlin.script.experimental.annotations", "kotlin.script.experimental.api", "kotlin.script.experimental.dependencies", "kotlin.script.experimental.host", + "kotlin.script.experimental.impl", "kotlin.script.experimental.jvm", "kotlin.script.experimental.jvm.compat", "kotlin.script.experimental.jvm.impl", @@ -3961,50 +4068,10 @@ "kotlin.script.extensions", "kotlin.script.templates", "kotlin.script.templates.standard", - "kotlinx.collections.immutable", - "kotlinx.collections.immutable.adapters", - "kotlinx.collections.immutable.implementations.immutableList", - "kotlinx.collections.immutable.implementations.immutableMap", - "kotlinx.collections.immutable.implementations.immutableSet", - "kotlinx.collections.immutable.implementations.persistentOrderedMap", - "kotlinx.collections.immutable.implementations.persistentOrderedSet", - "kotlinx.collections.immutable.internal", - "org.jetbrains.jps.model", - "org.jetbrains.jps.model.artifact", - "org.jetbrains.jps.model.artifact.elements", - "org.jetbrains.jps.model.artifact.elements.ex", - "org.jetbrains.jps.model.artifact.impl", - "org.jetbrains.jps.model.artifact.impl.elements", - "org.jetbrains.jps.model.ex", - "org.jetbrains.jps.model.fileTypes", - "org.jetbrains.jps.model.fileTypes.impl", - "org.jetbrains.jps.model.impl", - "org.jetbrains.jps.model.impl.runConfiguration", - "org.jetbrains.jps.model.jarRepository", - "org.jetbrains.jps.model.jarRepository.impl", - "org.jetbrains.jps.model.java", - "org.jetbrains.jps.model.java.compiler", - "org.jetbrains.jps.model.java.impl", - "org.jetbrains.jps.model.java.impl.compiler", - "org.jetbrains.jps.model.java.impl.runConfiguration", - "org.jetbrains.jps.model.java.runConfiguration", - "org.jetbrains.jps.model.library", - "org.jetbrains.jps.model.library.impl", - "org.jetbrains.jps.model.library.impl.sdk", - "org.jetbrains.jps.model.library.sdk", - "org.jetbrains.jps.model.module", - "org.jetbrains.jps.model.module.impl", - "org.jetbrains.jps.model.runConfiguration", - "org.jetbrains.jps.model.serialization", - "org.jetbrains.jps.model.serialization.artifact", - "org.jetbrains.jps.model.serialization.facet", - "org.jetbrains.jps.model.serialization.impl", - "org.jetbrains.jps.model.serialization.jarRepository", - "org.jetbrains.jps.model.serialization.java", - "org.jetbrains.jps.model.serialization.java.compiler", - "org.jetbrains.jps.model.serialization.library", - "org.jetbrains.jps.model.serialization.module", - "org.jetbrains.jps.model.serialization.runConfigurations", + "net.rubygrapefruit.platform", + "net.rubygrapefruit.platform.internal", + "net.rubygrapefruit.platform.internal.jni", + "org.jetbrains.annotations", "org.jetbrains.kotlin", "org.jetbrains.kotlin.analyzer", "org.jetbrains.kotlin.analyzer.common", @@ -4027,8 +4094,10 @@ "org.jetbrains.kotlin.backend.common.output", "org.jetbrains.kotlin.backend.common.overrides", "org.jetbrains.kotlin.backend.common.phaser", + "org.jetbrains.kotlin.backend.common.psi", "org.jetbrains.kotlin.backend.common.serialization", "org.jetbrains.kotlin.backend.common.serialization.encodings", + "org.jetbrains.kotlin.backend.common.serialization.linkerissues", "org.jetbrains.kotlin.backend.common.serialization.mangle", "org.jetbrains.kotlin.backend.common.serialization.mangle.descriptor", "org.jetbrains.kotlin.backend.common.serialization.mangle.ir", @@ -4037,18 +4106,16 @@ "org.jetbrains.kotlin.backend.common.serialization.proto", "org.jetbrains.kotlin.backend.common.serialization.signature", "org.jetbrains.kotlin.backend.jvm", + "org.jetbrains.kotlin.backend.jvm.caches", "org.jetbrains.kotlin.backend.jvm.codegen", - "org.jetbrains.kotlin.backend.jvm.descriptors", "org.jetbrains.kotlin.backend.jvm.intrinsics", "org.jetbrains.kotlin.backend.jvm.ir", "org.jetbrains.kotlin.backend.jvm.lower", "org.jetbrains.kotlin.backend.jvm.lower.indy", - "org.jetbrains.kotlin.backend.jvm.lower.inlineclasses", + "org.jetbrains.kotlin.backend.jvm.mapping", + "org.jetbrains.kotlin.backend.jvm.metadata", "org.jetbrains.kotlin.backend.jvm.serialization", - "org.jetbrains.kotlin.backend.wasm", - "org.jetbrains.kotlin.backend.wasm.ir2wasm", - "org.jetbrains.kotlin.backend.wasm.lower", - "org.jetbrains.kotlin.backend.wasm.utils", + "org.jetbrains.kotlin.backend.jvm.serialization.proto", "org.jetbrains.kotlin.build", "org.jetbrains.kotlin.build.report", "org.jetbrains.kotlin.build.report.metrics", @@ -4073,6 +4140,7 @@ "org.jetbrains.kotlin.cli.common.config", "org.jetbrains.kotlin.cli.common.environment", "org.jetbrains.kotlin.cli.common.extensions", + "org.jetbrains.kotlin.cli.common.fir", "org.jetbrains.kotlin.cli.common.messages", "org.jetbrains.kotlin.cli.common.modules", "org.jetbrains.kotlin.cli.common.output", @@ -4083,6 +4151,7 @@ "org.jetbrains.kotlin.cli.js.internal", "org.jetbrains.kotlin.cli.jvm", "org.jetbrains.kotlin.cli.jvm.compiler", + "org.jetbrains.kotlin.cli.jvm.compiler.jarfs", "org.jetbrains.kotlin.cli.jvm.config", "org.jetbrains.kotlin.cli.jvm.index", "org.jetbrains.kotlin.cli.jvm.javac", @@ -4102,6 +4171,7 @@ "org.jetbrains.kotlin.codegen.optimization.common", "org.jetbrains.kotlin.codegen.optimization.fixStack", "org.jetbrains.kotlin.codegen.optimization.nullCheck", + "org.jetbrains.kotlin.codegen.optimization.temporaryVals", "org.jetbrains.kotlin.codegen.optimization.transformer", "org.jetbrains.kotlin.codegen.pseudoInsns", "org.jetbrains.kotlin.codegen.range", @@ -4128,6 +4198,9 @@ "org.jetbrains.kotlin.contracts.parsing", "org.jetbrains.kotlin.contracts.parsing.effects", "org.jetbrains.kotlin.coroutines", + "org.jetbrains.kotlin.daemon.client", + "org.jetbrains.kotlin.daemon.client.impls", + "org.jetbrains.kotlin.daemon.common", "org.jetbrains.kotlin.descriptors", "org.jetbrains.kotlin.descriptors.annotations", "org.jetbrains.kotlin.descriptors.deserialization", @@ -4139,6 +4212,7 @@ "org.jetbrains.kotlin.descriptors.runtime.structure", "org.jetbrains.kotlin.descriptors.synthetic", "org.jetbrains.kotlin.diagnostics", + "org.jetbrains.kotlin.diagnostics.impl", "org.jetbrains.kotlin.diagnostics.rendering", "org.jetbrains.kotlin.extensions", "org.jetbrains.kotlin.extensions.internal", @@ -4146,16 +4220,24 @@ "org.jetbrains.kotlin.fir", "org.jetbrains.kotlin.fir.analysis", "org.jetbrains.kotlin.fir.analysis.cfa", + "org.jetbrains.kotlin.fir.analysis.cfa.util", "org.jetbrains.kotlin.fir.analysis.checkers", "org.jetbrains.kotlin.fir.analysis.checkers.cfa", "org.jetbrains.kotlin.fir.analysis.checkers.context", "org.jetbrains.kotlin.fir.analysis.checkers.declaration", "org.jetbrains.kotlin.fir.analysis.checkers.expression", "org.jetbrains.kotlin.fir.analysis.checkers.extended", + "org.jetbrains.kotlin.fir.analysis.checkers.syntax", + "org.jetbrains.kotlin.fir.analysis.checkers.type", "org.jetbrains.kotlin.fir.analysis.collectors", "org.jetbrains.kotlin.fir.analysis.collectors.components", "org.jetbrains.kotlin.fir.analysis.diagnostics", + "org.jetbrains.kotlin.fir.analysis.diagnostics.jvm", "org.jetbrains.kotlin.fir.analysis.extensions", + "org.jetbrains.kotlin.fir.analysis.jvm", + "org.jetbrains.kotlin.fir.analysis.jvm.checkers", + "org.jetbrains.kotlin.fir.analysis.jvm.checkers.declaration", + "org.jetbrains.kotlin.fir.analysis.jvm.checkers.expression", "org.jetbrains.kotlin.fir.backend", "org.jetbrains.kotlin.fir.backend.evaluate", "org.jetbrains.kotlin.fir.backend.generators", @@ -4169,8 +4251,10 @@ "org.jetbrains.kotlin.fir.contracts.impl", "org.jetbrains.kotlin.fir.declarations", "org.jetbrains.kotlin.fir.declarations.builder", + "org.jetbrains.kotlin.fir.declarations.comparators", "org.jetbrains.kotlin.fir.declarations.impl", "org.jetbrains.kotlin.fir.declarations.synthetic", + "org.jetbrains.kotlin.fir.declarations.utils", "org.jetbrains.kotlin.fir.descriptors", "org.jetbrains.kotlin.fir.deserialization", "org.jetbrains.kotlin.fir.diagnostics", @@ -4185,11 +4269,9 @@ "org.jetbrains.kotlin.fir.java.deserialization", "org.jetbrains.kotlin.fir.java.enhancement", "org.jetbrains.kotlin.fir.java.scopes", + "org.jetbrains.kotlin.fir.java.symbols", "org.jetbrains.kotlin.fir.lazy", - "org.jetbrains.kotlin.fir.lightTree", - "org.jetbrains.kotlin.fir.lightTree.converter", - "org.jetbrains.kotlin.fir.lightTree.fir", - "org.jetbrains.kotlin.fir.lightTree.fir.modifier", + "org.jetbrains.kotlin.fir.pipeline", "org.jetbrains.kotlin.fir.references", "org.jetbrains.kotlin.fir.references.builder", "org.jetbrains.kotlin.fir.references.impl", @@ -4217,6 +4299,7 @@ "org.jetbrains.kotlin.fir.serialization", "org.jetbrains.kotlin.fir.serialization.constant", "org.jetbrains.kotlin.fir.session", + "org.jetbrains.kotlin.fir.session.environment", "org.jetbrains.kotlin.fir.signaturer", "org.jetbrains.kotlin.fir.symbols", "org.jetbrains.kotlin.fir.symbols.impl", @@ -4224,33 +4307,20 @@ "org.jetbrains.kotlin.fir.types.builder", "org.jetbrains.kotlin.fir.types.impl", "org.jetbrains.kotlin.fir.types.jvm", + "org.jetbrains.kotlin.fir.util", "org.jetbrains.kotlin.fir.utils", "org.jetbrains.kotlin.fir.visitors", "org.jetbrains.kotlin.frontend.di", "org.jetbrains.kotlin.frontend.java.di", "org.jetbrains.kotlin.frontend.js.di", "org.jetbrains.kotlin.idea", + "org.jetbrains.kotlin.idea.references", "org.jetbrains.kotlin.incremental", "org.jetbrains.kotlin.incremental.components", "org.jetbrains.kotlin.incremental.js", - "org.jetbrains.kotlin.incremental.multiproject", - "org.jetbrains.kotlin.incremental.parsing", - "org.jetbrains.kotlin.incremental.snapshots", "org.jetbrains.kotlin.incremental.storage", - "org.jetbrains.kotlin.incremental.util", "org.jetbrains.kotlin.inline", "org.jetbrains.kotlin.ir", - "org.jetbrains.kotlin.ir.backend.js", - "org.jetbrains.kotlin.ir.backend.js.export", - "org.jetbrains.kotlin.ir.backend.js.ir", - "org.jetbrains.kotlin.ir.backend.js.lower", - "org.jetbrains.kotlin.ir.backend.js.lower.calls", - "org.jetbrains.kotlin.ir.backend.js.lower.cleanup", - "org.jetbrains.kotlin.ir.backend.js.lower.coroutines", - "org.jetbrains.kotlin.ir.backend.js.lower.inline", - "org.jetbrains.kotlin.ir.backend.js.lower.serialization.ir", - "org.jetbrains.kotlin.ir.backend.js.transformers.irToJs", - "org.jetbrains.kotlin.ir.backend.js.utils", "org.jetbrains.kotlin.ir.backend.jvm", "org.jetbrains.kotlin.ir.backend.jvm.serialization", "org.jetbrains.kotlin.ir.builders", @@ -4266,23 +4336,23 @@ "org.jetbrains.kotlin.ir.expressions.persistent", "org.jetbrains.kotlin.ir.interpreter", "org.jetbrains.kotlin.ir.interpreter.builtins", + "org.jetbrains.kotlin.ir.interpreter.checker", "org.jetbrains.kotlin.ir.interpreter.exceptions", "org.jetbrains.kotlin.ir.interpreter.intrinsics", + "org.jetbrains.kotlin.ir.interpreter.proxy", + "org.jetbrains.kotlin.ir.interpreter.proxy.reflection", "org.jetbrains.kotlin.ir.interpreter.stack", "org.jetbrains.kotlin.ir.interpreter.state", + "org.jetbrains.kotlin.ir.interpreter.state.reflection", "org.jetbrains.kotlin.ir.linkage", "org.jetbrains.kotlin.ir.overrides", + "org.jetbrains.kotlin.ir.serialization", "org.jetbrains.kotlin.ir.symbols", "org.jetbrains.kotlin.ir.symbols.impl", "org.jetbrains.kotlin.ir.types", "org.jetbrains.kotlin.ir.types.impl", "org.jetbrains.kotlin.ir.util", "org.jetbrains.kotlin.ir.visitors", - "org.jetbrains.kotlin.javac", - "org.jetbrains.kotlin.javac.components", - "org.jetbrains.kotlin.javac.resolve", - "org.jetbrains.kotlin.javac.wrappers.symbols", - "org.jetbrains.kotlin.javac.wrappers.trees", "org.jetbrains.kotlin.js", "org.jetbrains.kotlin.js.analyze", "org.jetbrains.kotlin.js.analyzer", @@ -4292,7 +4362,6 @@ "org.jetbrains.kotlin.js.common", "org.jetbrains.kotlin.js.config", "org.jetbrains.kotlin.js.coroutine", - "org.jetbrains.kotlin.js.dce", "org.jetbrains.kotlin.js.descriptorUtils", "org.jetbrains.kotlin.js.facade", "org.jetbrains.kotlin.js.facade.exceptions", @@ -4344,6 +4413,7 @@ "org.jetbrains.kotlin.konan.util", "org.jetbrains.kotlin.lexer", "org.jetbrains.kotlin.library", + "org.jetbrains.kotlin.library.encodings", "org.jetbrains.kotlin.library.impl", "org.jetbrains.kotlin.library.metadata", "org.jetbrains.kotlin.library.resolver", @@ -4380,6 +4450,9 @@ "org.jetbrains.kotlin.platform.js", "org.jetbrains.kotlin.platform.jvm", "org.jetbrains.kotlin.platform.konan", + "org.jetbrains.kotlin.preloading", + "org.jetbrains.kotlin.preloading.instrumentation", + "org.jetbrains.kotlin.preloading.instrumentation.annotations", "org.jetbrains.kotlin.progress", "org.jetbrains.kotlin.progress.experimental", "org.jetbrains.kotlin.protobuf", @@ -4396,24 +4469,25 @@ "org.jetbrains.kotlin.psi.typeRefHelpers", "org.jetbrains.kotlin.psi2ir", "org.jetbrains.kotlin.psi2ir.generators", + "org.jetbrains.kotlin.psi2ir.generators.fragments", "org.jetbrains.kotlin.psi2ir.intermediate", + "org.jetbrains.kotlin.psi2ir.preprocessing", "org.jetbrains.kotlin.psi2ir.transformations", "org.jetbrains.kotlin.renderer", "org.jetbrains.kotlin.resolve", "org.jetbrains.kotlin.resolve.annotations", "org.jetbrains.kotlin.resolve.bindingContextUtil", "org.jetbrains.kotlin.resolve.calls", - "org.jetbrains.kotlin.resolve.calls.callResolverUtil", "org.jetbrains.kotlin.resolve.calls.callUtil", "org.jetbrains.kotlin.resolve.calls.checkers", "org.jetbrains.kotlin.resolve.calls.components", + "org.jetbrains.kotlin.resolve.calls.components.candidate", "org.jetbrains.kotlin.resolve.calls.context", "org.jetbrains.kotlin.resolve.calls.inference", "org.jetbrains.kotlin.resolve.calls.inference.components", "org.jetbrains.kotlin.resolve.calls.inference.constraintPosition", "org.jetbrains.kotlin.resolve.calls.inference.model", "org.jetbrains.kotlin.resolve.calls.model", - "org.jetbrains.kotlin.resolve.calls.resolvedCallUtil", "org.jetbrains.kotlin.resolve.calls.results", "org.jetbrains.kotlin.resolve.calls.smartcasts", "org.jetbrains.kotlin.resolve.calls.tasks", @@ -4444,6 +4518,7 @@ "org.jetbrains.kotlin.resolve.lazy.declarations", "org.jetbrains.kotlin.resolve.lazy.descriptors", "org.jetbrains.kotlin.resolve.multiplatform", + "org.jetbrains.kotlin.resolve.references", "org.jetbrains.kotlin.resolve.repl", "org.jetbrains.kotlin.resolve.sam", "org.jetbrains.kotlin.resolve.scopes", @@ -4466,7 +4541,6 @@ "org.jetbrains.kotlin.scripting.configuration", "org.jetbrains.kotlin.scripting.definitions", "org.jetbrains.kotlin.scripting.extensions", - "org.jetbrains.kotlin.scripting.repl.js", "org.jetbrains.kotlin.scripting.resolve", "org.jetbrains.kotlin.serialization", "org.jetbrains.kotlin.serialization.builtins", @@ -4487,7 +4561,6 @@ "org.jetbrains.kotlin.types.expressions.typeInfoFactory", "org.jetbrains.kotlin.types.expressions.unqualifiedSuper", "org.jetbrains.kotlin.types.model", - "org.jetbrains.kotlin.types.refinement", "org.jetbrains.kotlin.types.typeUtil", "org.jetbrains.kotlin.types.typesApproximation", "org.jetbrains.kotlin.util", @@ -4507,7 +4580,8 @@ "org.jetbrains.kotlin.wasm.ir.convertors" ], "com.android.tools.external.org-jetbrains:uast": [ - "com.android.tools.external.org.jetbrains.uast", + "com.intellij.patterns.uast", + "com.intellij.psi", "org.jetbrains.uast", "org.jetbrains.uast.analysis", "org.jetbrains.uast.evaluation", @@ -4522,22 +4596,24 @@ "org.jetbrains.uast.java.internal", "org.jetbrains.uast.java.kinds", "org.jetbrains.uast.kotlin", - "org.jetbrains.uast.kotlin.declarations", + "org.jetbrains.uast.kotlin.analysis", "org.jetbrains.uast.kotlin.evaluation", - "org.jetbrains.uast.kotlin.expressions", "org.jetbrains.uast.kotlin.internal", "org.jetbrains.uast.kotlin.kinds", "org.jetbrains.uast.kotlin.psi", "org.jetbrains.uast.psi", "org.jetbrains.uast.util", "org.jetbrains.uast.values", - "org.jetbrains.uast.visitor", - "test.pkg" + "org.jetbrains.uast.visitor" ], "com.android.tools.layoutlib:layoutlib-api": [ "com.android.ide.common.rendering.api", "com.android.resources" ], + "com.android.tools.lint:lint": [ + "com.android.tools.lint", + "com.android.tools.lint.gradle" + ], "com.android.tools.lint:lint-api": [ "com.android.tools.lint.client.api", "com.android.tools.lint.detector.api", @@ -4562,6 +4638,7 @@ "com.android.resources", "com.android.sdklib", "com.android.support", + "com.android.testing.utils", "com.android.tools.proguard", "com.android.utils", "com.android.utils.concurrency", @@ -4586,7 +4663,6 @@ "com.android.repository.impl.sources", "com.android.repository.impl.sources.generated.v1", "com.android.repository.io", - "com.android.repository.io.impl", "com.android.repository.util" ], "com.android.tools:sdk-common": [ @@ -4596,6 +4672,8 @@ "com.android.ide.common.blame.parser.aapt", "com.android.ide.common.blame.parser.util", "com.android.ide.common.build", + "com.android.ide.common.build.filebasedproperties.module", + "com.android.ide.common.build.filebasedproperties.variant", "com.android.ide.common.caching", "com.android.ide.common.fonts", "com.android.ide.common.internal", @@ -4629,15 +4707,20 @@ "com.android.sdklib.repository", "com.android.sdklib.repository.generated.addon.v1", "com.android.sdklib.repository.generated.addon.v2", + "com.android.sdklib.repository.generated.addon.v3", "com.android.sdklib.repository.generated.common.v1", "com.android.sdklib.repository.generated.common.v2", + "com.android.sdklib.repository.generated.common.v3", "com.android.sdklib.repository.generated.repository.v1", "com.android.sdklib.repository.generated.repository.v2", + "com.android.sdklib.repository.generated.repository.v3", "com.android.sdklib.repository.generated.sysimg.v1", "com.android.sdklib.repository.generated.sysimg.v2", + "com.android.sdklib.repository.generated.sysimg.v3", "com.android.sdklib.repository.installer", "com.android.sdklib.repository.legacy", "com.android.sdklib.repository.legacy.descriptors", + "com.android.sdklib.repository.legacy.io", "com.android.sdklib.repository.legacy.local", "com.android.sdklib.repository.legacy.remote", "com.android.sdklib.repository.legacy.remote.internal", @@ -4650,6 +4733,7 @@ "com.android.sdklib.repository.sources.generated.v2", "com.android.sdklib.repository.sources.generated.v3", "com.android.sdklib.repository.sources.generated.v4", + "com.android.sdklib.repository.sources.generated.v5", "com.android.sdklib.repository.targets", "com.android.sdklib.tool", "com.android.sdklib.tool.sdkmanager", @@ -5311,6 +5395,7 @@ "org.bouncycastle.cert.path.validations", "org.bouncycastle.cert.selector", "org.bouncycastle.cert.selector.jcajce", + "org.bouncycastle.cmc", "org.bouncycastle.cms", "org.bouncycastle.cms.bc", "org.bouncycastle.cms.jcajce", @@ -5319,6 +5404,11 @@ "org.bouncycastle.eac.jcajce", "org.bouncycastle.eac.operator", "org.bouncycastle.eac.operator.jcajce", + "org.bouncycastle.est", + "org.bouncycastle.est.jcajce", + "org.bouncycastle.mime", + "org.bouncycastle.mime.encoding", + "org.bouncycastle.mime.smime", "org.bouncycastle.mozilla", "org.bouncycastle.mozilla.jcajce", "org.bouncycastle.openssl", @@ -6952,18 +7042,19 @@ "com.android.databinding:baseLibrary", "com.android.tools.analytics-library:protos", "com.android.tools.analytics-library:shared", + "com.android.tools.analytics-library:tracker", "com.android.tools.apkparser:apkanalyzer", "com.android.tools.apkparser:binary-resources", "com.android.tools.build.jetifier:jetifier-core", "com.android.tools.build:aapt2-proto", "com.android.tools.build:builder-model", - "com.android.tools.build:builder-test-api", "com.android.tools.build:manifest-merger", "com.android.tools.ddms:ddmlib", "com.android.tools.external.com-intellij:intellij-core", "com.android.tools.external.com-intellij:kotlin-compiler", "com.android.tools.external.org-jetbrains:uast", "com.android.tools.layoutlib:layoutlib-api", + "com.android.tools.lint:lint", "com.android.tools.lint:lint-api", "com.android.tools.lint:lint-checks", "com.android.tools.lint:lint-model", @@ -7275,18 +7366,19 @@ "com.android.databinding:baseLibrary", "com.android.tools.analytics-library:protos", "com.android.tools.analytics-library:shared", + "com.android.tools.analytics-library:tracker", "com.android.tools.apkparser:apkanalyzer", "com.android.tools.apkparser:binary-resources", "com.android.tools.build.jetifier:jetifier-core", "com.android.tools.build:aapt2-proto", "com.android.tools.build:builder-model", - "com.android.tools.build:builder-test-api", "com.android.tools.build:manifest-merger", "com.android.tools.ddms:ddmlib", "com.android.tools.external.com-intellij:intellij-core", "com.android.tools.external.com-intellij:kotlin-compiler", "com.android.tools.external.org-jetbrains:uast", "com.android.tools.layoutlib:layoutlib-api", + "com.android.tools.lint:lint", "com.android.tools.lint:lint-api", "com.android.tools.lint:lint-checks", "com.android.tools.lint:lint-model", @@ -7598,18 +7690,19 @@ "com.android.databinding:baseLibrary", "com.android.tools.analytics-library:protos", "com.android.tools.analytics-library:shared", + "com.android.tools.analytics-library:tracker", "com.android.tools.apkparser:apkanalyzer", "com.android.tools.apkparser:binary-resources", "com.android.tools.build.jetifier:jetifier-core", "com.android.tools.build:aapt2-proto", "com.android.tools.build:builder-model", - "com.android.tools.build:builder-test-api", "com.android.tools.build:manifest-merger", "com.android.tools.ddms:ddmlib", "com.android.tools.external.com-intellij:intellij-core", "com.android.tools.external.com-intellij:kotlin-compiler", "com.android.tools.external.org-jetbrains:uast", "com.android.tools.layoutlib:layoutlib-api", + "com.android.tools.lint:lint", "com.android.tools.lint:lint-api", "com.android.tools.lint:lint-checks", "com.android.tools.lint:lint-model", @@ -7921,18 +8014,19 @@ "com.android.databinding:baseLibrary", "com.android.tools.analytics-library:protos", "com.android.tools.analytics-library:shared", + "com.android.tools.analytics-library:tracker", "com.android.tools.apkparser:apkanalyzer", "com.android.tools.apkparser:binary-resources", "com.android.tools.build.jetifier:jetifier-core", "com.android.tools.build:aapt2-proto", "com.android.tools.build:builder-model", - "com.android.tools.build:builder-test-api", "com.android.tools.build:manifest-merger", "com.android.tools.ddms:ddmlib", "com.android.tools.external.com-intellij:intellij-core", "com.android.tools.external.com-intellij:kotlin-compiler", "com.android.tools.external.org-jetbrains:uast", "com.android.tools.layoutlib:layoutlib-api", + "com.android.tools.lint:lint", "com.android.tools.lint:lint-api", "com.android.tools.lint:lint-checks", "com.android.tools.lint:lint-model", diff --git a/third_party/versions.bzl b/third_party/versions.bzl index c2a8fa71e89..f0833a182a8 100644 --- a/third_party/versions.bzl +++ b/third_party/versions.bzl @@ -110,6 +110,7 @@ MAVEN_TEST_DEPENDENCY_VERSIONS = { "androidx.test:runner": "1.2.0", "androidx.work:work-testing": "2.4.0", "com.android.tools.apkparser:apkanalyzer": "30.0.4", + "com.android.tools.lint:lint": "30.3.1", "com.github.bumptech.glide:mocks": "4.11.0", "com.google.protobuf:protobuf-java": "3.17.3", "com.google.protobuf:protobuf-java-util": "3.17.3", 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 3c2261bc506..de80cc82f38 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 @@ -75,7 +75,6 @@ kt_android_library( visibility = ["//:oppia_api_visibility"], deps = [ ":event_type_to_human_readable_name_converter", - ":feature_flag_name_to_numeric_id_converter", "//model/src/main/proto:event_logger_java_proto_lite", "//model/src/main/proto:performance_metrics_event_logger_java_proto_lite", "//third_party:javax_inject_javax_inject", @@ -188,14 +187,3 @@ kt_android_library( "//utility/src/main/java/org/oppia/android/util/networking:network_connection_util", ], ) - -kt_android_library( - name = "feature_flag_name_to_numeric_id_converter", - srcs = [ - "FeatureFlagNameToNumericIdConverter.kt", - ], - deps = [ - "//domain/src/main/java/org/oppia/android/domain/oppialogger/analytics:controller", - "//third_party:javax_inject_javax_inject", - ], -) diff --git a/utility/src/main/java/org/oppia/android/util/logging/EventBundleCreator.kt b/utility/src/main/java/org/oppia/android/util/logging/EventBundleCreator.kt index 8455cebe7c7..27dd8f07c63 100644 --- a/utility/src/main/java/org/oppia/android/util/logging/EventBundleCreator.kt +++ b/utility/src/main/java/org/oppia/android/util/logging/EventBundleCreator.kt @@ -688,17 +688,17 @@ class EventBundleCreator @Inject constructor( value: FeatureFlagListEventContext ) : EventActivityContext(activityName, value) { override fun EventLog.FeatureFlagListContext.storeValue(store: PropertyStore) { + // Note that flag IDs are used instead of names for more compact logging to address Google + // Analytics character limits. GA4 limits the characters permitted in a log event parameter + // value to a maximum of 100 characters as of March 2025. See: + // https://firebase.google.com/docs/reference/android/com/google/firebase/analytics/FirebaseAnalytics.html#logEvent(java.lang.String,android.os.Bundle) + val featureFlagIds = featureFlagsList.map { it.id.number } + val featureFlagSyncStatuses = featureFlagsList.map { it.syncStatus.number } + val featureFlagEnabledStates = featureFlagsList.map { if (it.isEnabled) 1 else 0 } - val featureFlagNames = featureFlagsList.map { - FeatureFlagNameToNumericIdConverter.convertToNumericId(it.flagName) - } - - val featureFlagSyncStatuses = featureFlagsList.map { it.flagSyncStatus.number } - val featureFlagEnabledStates = featureFlagsList.map { if (it.flagEnabledState) 1 else 0 } - - store.putNonSensitiveValue("feature_flag_names", featureFlagNames) store.putNonSensitiveValue("feature_flag_enabled_states", featureFlagEnabledStates) store.putNonSensitiveValue("feature_flag_sync_statuses", featureFlagSyncStatuses) + store.putNonSensitiveValue("feature_flag_names", featureFlagIds) } } diff --git a/utility/src/main/java/org/oppia/android/util/logging/FeatureFlagNameToNumericIdConverter.kt b/utility/src/main/java/org/oppia/android/util/logging/FeatureFlagNameToNumericIdConverter.kt deleted file mode 100644 index 12e5fe82d1f..00000000000 --- a/utility/src/main/java/org/oppia/android/util/logging/FeatureFlagNameToNumericIdConverter.kt +++ /dev/null @@ -1,54 +0,0 @@ -package org.oppia.android.util.logging - -import org.oppia.android.util.platformparameter.APP_AND_OS_DEPRECATION -import org.oppia.android.util.platformparameter.DOWNLOADS_SUPPORT -import org.oppia.android.util.platformparameter.EDIT_ACCOUNTS_OPTIONS_UI -import org.oppia.android.util.platformparameter.ENABLE_MULTIPLE_CLASSROOMS -import org.oppia.android.util.platformparameter.ENABLE_NPS_SURVEY -import org.oppia.android.util.platformparameter.ENABLE_ONBOARDING_FLOW_V2 -import org.oppia.android.util.platformparameter.ENABLE_PERFORMANCE_METRICS_COLLECTION -import org.oppia.android.util.platformparameter.ENABLE_TOPIC_INFO_TAB -import org.oppia.android.util.platformparameter.ENABLE_TOPIC_PRACTICE_TAB -import org.oppia.android.util.platformparameter.FAST_LANGUAGE_SWITCHING_IN_LESSON -import org.oppia.android.util.platformparameter.INTERACTION_CONFIG_CHANGE_STATE_RETENTION -import org.oppia.android.util.platformparameter.LEARNER_STUDY_ANALYTICS -import org.oppia.android.util.platformparameter.LOGGING_LEARNER_STUDY_IDS -import org.oppia.android.util.platformparameter.SPOTLIGHT_UI - -/** - * Converter for feature flag names to numeric IDs for more compact logging to address Google - * Analytics character limits. GA4 limits the characters permitted in a log event parameter value to - * a maximum of 100 characters as of March 2025. - * - * See https://firebase.google.com/docs/reference/android/com/google/firebase/analytics/FirebaseAnalytics.html#logEvent(java.lang.String,android.os.Bundle) - */ -object FeatureFlagNameToNumericIdConverter { - /** - * Converts a feature flag name to a numeric ID. - * - * These numbers are supposed to be incremented indefinitely and the numeric representation of - * each feature flag name should not be reused even after the feature flag is no longer in use. - * - * @param flagName the string constant flag name to convert - * @return a numeric representation of the flag name - */ - fun convertToNumericId(flagName: String): Int { - return when (flagName) { - LEARNER_STUDY_ANALYTICS -> 2 - ENABLE_PERFORMANCE_METRICS_COLLECTION -> 3 - EDIT_ACCOUNTS_OPTIONS_UI -> 4 - SPOTLIGHT_UI -> 5 - DOWNLOADS_SUPPORT -> 7 - INTERACTION_CONFIG_CHANGE_STATE_RETENTION -> 8 - APP_AND_OS_DEPRECATION -> 10 - FAST_LANGUAGE_SWITCHING_IN_LESSON -> 11 - LOGGING_LEARNER_STUDY_IDS -> 12 - ENABLE_NPS_SURVEY -> 13 - ENABLE_ONBOARDING_FLOW_V2 -> 14 - ENABLE_MULTIPLE_CLASSROOMS -> 15 - ENABLE_TOPIC_INFO_TAB -> 16 - ENABLE_TOPIC_PRACTICE_TAB -> 17 - else -> 0 - } - } -} diff --git a/utility/src/main/java/org/oppia/android/util/platformparameter/PlatformParameterSingleton.kt b/utility/src/main/java/org/oppia/android/util/platformparameter/PlatformParameterSingleton.kt index 2129fff6850..f07d08a6ee8 100644 --- a/utility/src/main/java/org/oppia/android/util/platformparameter/PlatformParameterSingleton.kt +++ b/utility/src/main/java/org/oppia/android/util/platformparameter/PlatformParameterSingleton.kt @@ -2,6 +2,7 @@ package org.oppia.android.util.platformparameter import org.oppia.android.app.model.PlatformParameter +// TODO(#5835): Remove this singleton, its implementation, and corresponding modules. /** Singleton which helps in storing and providing Platform Parameters at runtime. */ interface PlatformParameterSingleton { diff --git a/utility/src/main/java/org/oppia/android/util/platformparameter/PlatformParameterValue.kt b/utility/src/main/java/org/oppia/android/util/platformparameter/PlatformParameterValue.kt index beefdee92bb..dba45e85c51 100644 --- a/utility/src/main/java/org/oppia/android/util/platformparameter/PlatformParameterValue.kt +++ b/utility/src/main/java/org/oppia/android/util/platformparameter/PlatformParameterValue.kt @@ -1,7 +1,7 @@ package org.oppia.android.util.platformparameter import org.oppia.android.app.model.PlatformParameter -import org.oppia.android.app.model.PlatformParameter.SyncStatus +import org.oppia.android.app.model.SyncStatus /** * Generic interface that is used to provide platform parameter values corresponding to the @@ -11,20 +11,4 @@ import org.oppia.android.app.model.PlatformParameter.SyncStatus interface PlatformParameterValue { val value: T val syncStatus: SyncStatus - - companion object { - /** - * Creates a Platform Parameter Implementation containing the default value for a particular - * Platform Parameter - */ - fun createDefaultParameter( - defaultValue: T, - defaultSyncStatus: SyncStatus = SyncStatus.NOT_SYNCED_FROM_SERVER - ): PlatformParameterValue { - return object : PlatformParameterValue { - override val value = defaultValue - override val syncStatus = defaultSyncStatus - } - } - } } diff --git a/utility/src/test/java/org/oppia/android/util/logging/BUILD.bazel b/utility/src/test/java/org/oppia/android/util/logging/BUILD.bazel index 548cdf06431..d58bc28f9da 100644 --- a/utility/src/test/java/org/oppia/android/util/logging/BUILD.bazel +++ b/utility/src/test/java/org/oppia/android/util/logging/BUILD.bazel @@ -50,11 +50,17 @@ oppia_android_test( "//testing", "//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/platformparameter:test_module", + "//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", "//third_party:androidx_test_ext_junit", "//third_party:androidx_test_ext_truth", "//third_party:com_google_truth_truth", "//third_party:org_robolectric_robolectric", "//third_party:robolectric_android-all", + "//utility/src/main/java/org/oppia/android/util/caching:asset_prod_module", + "//utility/src/main/java/org/oppia/android/util/locale/testing:test_module", "//utility/src/main/java/org/oppia/android/util/logging:event_bundle_creator", ], ) @@ -70,6 +76,7 @@ oppia_android_test( "//:dagger", "//testing", "//testing/src/main/java/org/oppia/android/testing/data:data_provider_test_monitor", + "//testing/src/main/java/org/oppia/android/testing/platformparameter:test_module", "//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,22 +135,3 @@ oppia_android_test( "//third_party:robolectric_android-all", ], ) - -oppia_android_test( - name = "FeatureFlagNameToNumericIdConverterTest", - srcs = ["FeatureFlagNameToNumericIdConverterTest.kt"], - custom_package = "org.oppia.android.util.logging", - test_class = "org.oppia.android.util.logging.FeatureFlagNameToNumericIdConverterTest", - test_manifest = "//utility:test_manifest", - deps = [ - "//:dagger", - "//testing", - "//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/platformparameter:test_module", - "//testing/src/main/java/org/oppia/android/testing/robolectric:test_module", - "//third_party:com_google_truth_truth", - "//third_party:org_robolectric_robolectric", - "//third_party:robolectric_android-all", - ], -) diff --git a/utility/src/test/java/org/oppia/android/util/logging/EventBundleCreatorTest.kt b/utility/src/test/java/org/oppia/android/util/logging/EventBundleCreatorTest.kt index 3124964baea..0e42b16b51d 100644 --- a/utility/src/test/java/org/oppia/android/util/logging/EventBundleCreatorTest.kt +++ b/utility/src/test/java/org/oppia/android/util/logging/EventBundleCreatorTest.kt @@ -68,6 +68,7 @@ import org.oppia.android.app.model.EventLog.SubmitAnswerContext import org.oppia.android.app.model.EventLog.SwitchInLessonLanguageEventContext import org.oppia.android.app.model.EventLog.TopicContext import org.oppia.android.app.model.EventLog.VoiceoverActionContext +import org.oppia.android.app.model.FeatureFlagId import org.oppia.android.app.model.OppiaLanguage import org.oppia.android.app.model.OppiaMetricLog import org.oppia.android.app.model.OppiaMetricLog.LoggableMetric @@ -83,31 +84,22 @@ import org.oppia.android.app.model.OppiaMetricLog.Priority.MEDIUM_PRIORITY import org.oppia.android.app.model.OppiaMetricLog.StorageTier import org.oppia.android.app.model.OppiaMetricLog.StorageTier.HIGH_STORAGE import org.oppia.android.app.model.OppiaMetricLog.StorageTier.MEDIUM_STORAGE -import org.oppia.android.app.model.PlatformParameter.SyncStatus import org.oppia.android.app.model.ScreenName import org.oppia.android.app.model.ScreenName.SCREEN_NAME_UNSPECIFIED +import org.oppia.android.app.model.SyncStatus import org.oppia.android.app.model.WrittenTranslationLanguageSelection +import org.oppia.android.testing.TestLogReportingModule import org.oppia.android.testing.junit.OppiaParameterizedTestRunner import org.oppia.android.testing.junit.OppiaParameterizedTestRunner.Iteration import org.oppia.android.testing.junit.OppiaParameterizedTestRunner.Parameter import org.oppia.android.testing.junit.OppiaParameterizedTestRunner.SelectRunnerPlatform import org.oppia.android.testing.junit.ParameterizedRobolectricTestRunner -import org.oppia.android.util.platformparameter.APP_AND_OS_DEPRECATION -import org.oppia.android.util.platformparameter.DOWNLOADS_SUPPORT -import org.oppia.android.util.platformparameter.EDIT_ACCOUNTS_OPTIONS_UI -import org.oppia.android.util.platformparameter.ENABLE_MULTIPLE_CLASSROOMS -import org.oppia.android.util.platformparameter.ENABLE_NPS_SURVEY -import org.oppia.android.util.platformparameter.ENABLE_ONBOARDING_FLOW_V2 -import org.oppia.android.util.platformparameter.ENABLE_PERFORMANCE_METRICS_COLLECTION -import org.oppia.android.util.platformparameter.EXTRA_TOPIC_TABS_UI -import org.oppia.android.util.platformparameter.EnableLoggingLearnerStudyIds -import org.oppia.android.util.platformparameter.FAST_LANGUAGE_SWITCHING_IN_LESSON -import org.oppia.android.util.platformparameter.INTERACTION_CONFIG_CHANGE_STATE_RETENTION -import org.oppia.android.util.platformparameter.LEARNER_STUDY_ANALYTICS -import org.oppia.android.util.platformparameter.LOGGING_LEARNER_STUDY_IDS -import org.oppia.android.util.platformparameter.LOGGING_LEARNER_STUDY_IDS_DEFAULT_VALUE -import org.oppia.android.util.platformparameter.PlatformParameterValue -import org.oppia.android.util.platformparameter.SPOTLIGHT_UI +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.caching.AssetModule +import org.oppia.android.util.locale.testing.LocaleTestModule import org.robolectric.Shadows import org.robolectric.annotation.Config import org.robolectric.annotation.LooperMode @@ -183,7 +175,7 @@ class EventBundleCreatorTest { @After fun tearDown() { - TestModule.enableLoggingLearnerStudyIds = LOGGING_LEARNER_STUDY_IDS_DEFAULT_VALUE + TestPlatformParameterModule.reset() } @Test @@ -2404,74 +2396,79 @@ class EventBundleCreatorTest { .addAllFeatureFlags( listOf( EventLog.FeatureFlagItemContext.newBuilder().apply { - this.flagName = LEARNER_STUDY_ANALYTICS - this.flagSyncStatus = SyncStatus.SYNC_STATUS_UNSPECIFIED - this.flagEnabledState = false + this.id = FeatureFlagId.LEARNER_STUDY_ANALYTICS + this.syncStatus = SyncStatus.SYNC_STATUS_UNSPECIFIED + this.isEnabled = false }.build(), EventLog.FeatureFlagItemContext.newBuilder().apply { - this.flagName = ENABLE_PERFORMANCE_METRICS_COLLECTION - this.flagSyncStatus = SyncStatus.NOT_SYNCED_FROM_SERVER - this.flagEnabledState = true + this.id = FeatureFlagId.PERFORMANCE_METRICS_COLLECTION + this.syncStatus = SyncStatus.NOT_SYNCED_FROM_SERVER + this.isEnabled = true }.build(), EventLog.FeatureFlagItemContext.newBuilder().apply { - this.flagName = EDIT_ACCOUNTS_OPTIONS_UI - this.flagSyncStatus = SyncStatus.SYNCED_FROM_SERVER - this.flagEnabledState = false + this.id = FeatureFlagId.EDIT_ACCOUNTS_OPTIONS_UI + this.syncStatus = SyncStatus.SYNCED_FROM_SERVER + this.isEnabled = false }.build(), EventLog.FeatureFlagItemContext.newBuilder().apply { - this.flagName = SPOTLIGHT_UI - this.flagSyncStatus = SyncStatus.SYNC_STATUS_UNSPECIFIED - this.flagEnabledState = true + this.id = FeatureFlagId.SPOTLIGHT_UI + this.syncStatus = SyncStatus.SYNC_STATUS_UNSPECIFIED + this.isEnabled = true }.build(), EventLog.FeatureFlagItemContext.newBuilder().apply { - this.flagName = EXTRA_TOPIC_TABS_UI - this.flagSyncStatus = SyncStatus.NOT_SYNCED_FROM_SERVER - this.flagEnabledState = false + this.id = FeatureFlagId.DOWNLOADS_SUPPORT + this.syncStatus = SyncStatus.SYNCED_FROM_SERVER + this.isEnabled = true }.build(), EventLog.FeatureFlagItemContext.newBuilder().apply { - this.flagName = DOWNLOADS_SUPPORT - this.flagSyncStatus = SyncStatus.SYNCED_FROM_SERVER - this.flagEnabledState = true + this.id = FeatureFlagId.INTERACTION_CONFIG_CHANGE_STATE_RETENTION + this.syncStatus = SyncStatus.SYNC_STATUS_UNSPECIFIED + this.isEnabled = false }.build(), EventLog.FeatureFlagItemContext.newBuilder().apply { - this.flagName = INTERACTION_CONFIG_CHANGE_STATE_RETENTION - this.flagSyncStatus = SyncStatus.SYNC_STATUS_UNSPECIFIED - this.flagEnabledState = false + this.id = FeatureFlagId.APP_AND_OS_DEPRECATION + this.syncStatus = SyncStatus.NOT_SYNCED_FROM_SERVER + this.isEnabled = true }.build(), EventLog.FeatureFlagItemContext.newBuilder().apply { - this.flagName = APP_AND_OS_DEPRECATION - this.flagSyncStatus = SyncStatus.NOT_SYNCED_FROM_SERVER - this.flagEnabledState = true + this.id = FeatureFlagId.FAST_LANGUAGE_SWITCHING_IN_LESSON + this.syncStatus = SyncStatus.SYNCED_FROM_SERVER + this.isEnabled = false }.build(), EventLog.FeatureFlagItemContext.newBuilder().apply { - this.flagName = FAST_LANGUAGE_SWITCHING_IN_LESSON - this.flagSyncStatus = SyncStatus.SYNCED_FROM_SERVER - this.flagEnabledState = false + this.id = FeatureFlagId.LOGGING_LEARNER_STUDY_IDS + this.syncStatus = SyncStatus.SYNC_STATUS_UNSPECIFIED + this.isEnabled = true }.build(), EventLog.FeatureFlagItemContext.newBuilder().apply { - this.flagName = LOGGING_LEARNER_STUDY_IDS - this.flagSyncStatus = SyncStatus.SYNC_STATUS_UNSPECIFIED - this.flagEnabledState = true + this.id = FeatureFlagId.NPS_SURVEY + this.syncStatus = SyncStatus.NOT_SYNCED_FROM_SERVER + this.isEnabled = false }.build(), EventLog.FeatureFlagItemContext.newBuilder().apply { - this.flagName = ENABLE_NPS_SURVEY - this.flagSyncStatus = SyncStatus.NOT_SYNCED_FROM_SERVER - this.flagEnabledState = false + this.id = FeatureFlagId.ONBOARDING_FLOW_V2 + this.syncStatus = SyncStatus.SYNCED_FROM_SERVER + this.isEnabled = true }.build(), EventLog.FeatureFlagItemContext.newBuilder().apply { - this.flagName = ENABLE_ONBOARDING_FLOW_V2 - this.flagSyncStatus = SyncStatus.SYNCED_FROM_SERVER - this.flagEnabledState = true + this.id = FeatureFlagId.MULTIPLE_CLASSROOMS + this.syncStatus = SyncStatus.SYNC_STATUS_UNSPECIFIED + this.isEnabled = false }.build(), EventLog.FeatureFlagItemContext.newBuilder().apply { - this.flagName = ENABLE_MULTIPLE_CLASSROOMS - this.flagSyncStatus = SyncStatus.SYNC_STATUS_UNSPECIFIED - this.flagEnabledState = false + this.id = FeatureFlagId.TOPIC_INFO_TAB + this.syncStatus = SyncStatus.NOT_SYNCED_FROM_SERVER + this.isEnabled = false }.build(), EventLog.FeatureFlagItemContext.newBuilder().apply { - this.flagName = "non-existent name" - this.flagSyncStatus = SyncStatus.SYNC_STATUS_UNSPECIFIED - this.flagEnabledState = false + this.id = FeatureFlagId.TOPIC_PRACTICE_TAB + this.syncStatus = SyncStatus.NOT_SYNCED_FROM_SERVER + this.isEnabled = false + }.build(), + EventLog.FeatureFlagItemContext.newBuilder().apply { + this.id = FeatureFlagId.FEATURE_FLAG_ID_UNSPECIFIED + this.syncStatus = SyncStatus.SYNC_STATUS_UNSPECIFIED + this.isEnabled = false }.build(), ) ).build() @@ -2617,12 +2614,12 @@ class EventBundleCreatorTest { ).build() private fun setUpTestApplicationComponentWithoutLearnerAnalyticsStudy() { - TestModule.enableLoggingLearnerStudyIds = false + TestPlatformParameterModule.forceEnableLoggingLearnerStudyIds(false) setUpTestApplicationComponent() } private fun setUpTestApplicationComponentWithLearnerAnalyticsStudy() { - TestModule.enableLoggingLearnerStudyIds = true + TestPlatformParameterModule.forceEnableLoggingLearnerStudyIds(true) setUpTestApplicationComponent() } @@ -2648,37 +2645,26 @@ class EventBundleCreatorTest { // TODO(#89): Move this to a common test application component. @Module class TestModule { - internal companion object { - // This is expected to be off by default, so this helps the tests above confirm that the - // feature's default value is, indeed, off. - var enableLoggingLearnerStudyIds = LOGGING_LEARNER_STUDY_IDS_DEFAULT_VALUE - } - @Provides @Singleton fun provideContext(application: Application): Context { return application } - - // The scoping here is to ensure changes to the module value above don't change the parameter - // within the same application instance. - @Provides - @Singleton - @EnableLoggingLearnerStudyIds - fun provideLoggingLearnerStudyIds(): PlatformParameterValue { - // Snapshot the value so that it doesn't change between injection and use. - val enableFeature = enableLoggingLearnerStudyIds - return PlatformParameterValue.createDefaultParameter( - defaultValue = enableFeature - ) - } } // TODO(#89): Move this to a common test application component. @Singleton @Component( modules = [ - TestModule::class + AssetModule::class, + FakeOppiaClockModule::class, + LocaleTestModule::class, + LoggerModule::class, + RobolectricModule::class, + TestDispatcherModule::class, + TestLogReportingModule::class, + TestModule::class, + TestPlatformParameterModule::class ] ) interface TestApplicationComponent { diff --git a/utility/src/test/java/org/oppia/android/util/logging/FeatureFlagNameToNumericIdConverterTest.kt b/utility/src/test/java/org/oppia/android/util/logging/FeatureFlagNameToNumericIdConverterTest.kt deleted file mode 100644 index f83c1585b4a..00000000000 --- a/utility/src/test/java/org/oppia/android/util/logging/FeatureFlagNameToNumericIdConverterTest.kt +++ /dev/null @@ -1,162 +0,0 @@ -package org.oppia.android.util.logging - -import android.app.Application -import androidx.test.core.app.ApplicationProvider -import com.google.common.truth.Truth.assertThat -import dagger.BindsInstance -import dagger.Component -import org.junit.Before -import org.junit.Test -import org.junit.runner.RunWith -import org.oppia.android.testing.junit.OppiaParameterizedTestRunner -import org.oppia.android.testing.junit.OppiaParameterizedTestRunner.Iteration -import org.oppia.android.testing.junit.OppiaParameterizedTestRunner.Parameter -import org.oppia.android.testing.junit.OppiaParameterizedTestRunner.SelectRunnerPlatform -import org.oppia.android.testing.junit.ParameterizedRobolectricTestRunner -import org.oppia.android.util.platformparameter.APP_AND_OS_DEPRECATION -import org.oppia.android.util.platformparameter.DOWNLOADS_SUPPORT -import org.oppia.android.util.platformparameter.EDIT_ACCOUNTS_OPTIONS_UI -import org.oppia.android.util.platformparameter.ENABLE_MULTIPLE_CLASSROOMS -import org.oppia.android.util.platformparameter.ENABLE_NPS_SURVEY -import org.oppia.android.util.platformparameter.ENABLE_ONBOARDING_FLOW_V2 -import org.oppia.android.util.platformparameter.ENABLE_PERFORMANCE_METRICS_COLLECTION -import org.oppia.android.util.platformparameter.ENABLE_TOPIC_INFO_TAB -import org.oppia.android.util.platformparameter.ENABLE_TOPIC_PRACTICE_TAB -import org.oppia.android.util.platformparameter.FAST_LANGUAGE_SWITCHING_IN_LESSON -import org.oppia.android.util.platformparameter.INTERACTION_CONFIG_CHANGE_STATE_RETENTION -import org.oppia.android.util.platformparameter.LEARNER_STUDY_ANALYTICS -import org.oppia.android.util.platformparameter.LOGGING_LEARNER_STUDY_IDS -import org.oppia.android.util.platformparameter.SPOTLIGHT_UI -import org.robolectric.annotation.Config -import org.robolectric.annotation.LooperMode -import javax.inject.Singleton - -/** Tests for [FeatureFlagNameToNumericIdConverter]. */ -// FunctionName: test names are conventionally named with underscores. -@Suppress("FunctionName") -@LooperMode(LooperMode.Mode.PAUSED) -@RunWith(OppiaParameterizedTestRunner::class) -@SelectRunnerPlatform(ParameterizedRobolectricTestRunner::class) -@Config(application = FeatureFlagNameToNumericIdConverterTest.TestApplication::class) -class FeatureFlagNameToNumericIdConverterTest { - @Parameter lateinit var flagName: String - @Parameter var expectedValue: Int = 0 - - @Before - fun setUp() { - setUpTestApplicationComponent() - } - - @Test - @Iteration( - "learner_study_analytics", - "flagName=$LEARNER_STUDY_ANALYTICS", - "expectedValue=2" - ) - @Iteration( - "enable_performance_metrics_collection", - "flagName=$ENABLE_PERFORMANCE_METRICS_COLLECTION", - "expectedValue=3" - ) - @Iteration( - "edit_accounts_options_ui", - "flagName=$EDIT_ACCOUNTS_OPTIONS_UI", - "expectedValue=4" - ) - @Iteration( - "spotlight_ui", - "flagName=$SPOTLIGHT_UI", - "expectedValue=5" - ) - @Iteration( - "extra_topic_tabs_ui", - "flagName=$EXTRA_TOPIC_TABS_UI", - "expectedValue=6" - ) - @Iteration( - "interaction_config_change_state_retention", - "flagName=$INTERACTION_CONFIG_CHANGE_STATE_RETENTION", - "expectedValue=8" - ) - @Iteration( - "downloads_support", - "flagName=$DOWNLOADS_SUPPORT", - "expectedValue=7" - ) - @Iteration( - "app_and_os_deprecation", - "flagName=$APP_AND_OS_DEPRECATION", - "expectedValue=10" - ) - @Iteration( - "fast_language_switching_in_lesson", - "flagName=$FAST_LANGUAGE_SWITCHING_IN_LESSON", - "expectedValue=11" - ) - @Iteration( - "logging_learner_study_ids", - "flagName=$LOGGING_LEARNER_STUDY_IDS", - "expectedValue=12" - ) - @Iteration( - "enable_nps_survey", - "flagName=$ENABLE_NPS_SURVEY", - "expectedValue=13" - ) - @Iteration( - "enable_onboarding_flow_v2", - "flagName=$ENABLE_ONBOARDING_FLOW_V2", - "expectedValue=14" - ) - @Iteration( - "enable_multiple_classrooms", - "flagName=$ENABLE_MULTIPLE_CLASSROOMS", - "expectedValue=15" - ) - @Iteration( - "enable_topic_info_tab", - "flagName=$ENABLE_TOPIC_INFO_TAB", - "expectedValue=15" - ) - @Iteration( - "enable_topic_practice_tab", - "flagName=$ENABLE_TOPIC_PRACTICE_TAB", - "expectedValue=15" - ) - fun testConvertToIntegerName_returnsCorrectIntegerForEach() { - val integerName = FeatureFlagNameToNumericIdConverter.convertToNumericId(flagName) - - assertThat(integerName).isEqualTo(expectedValue) - } - - private fun setUpTestApplicationComponent() { - ApplicationProvider.getApplicationContext().inject(this) - } - - // TODO(#89): Move this to a common test application component. - @Singleton - @Component(modules = []) - interface TestApplicationComponent { - @Component.Builder - interface Builder { - @BindsInstance - fun setApplication(application: Application): Builder - - fun build(): TestApplicationComponent - } - - fun inject(test: FeatureFlagNameToNumericIdConverterTest) - } - - class TestApplication : Application() { - private val component: TestApplicationComponent by lazy { - DaggerFeatureFlagNameToNumericIdConverterTest_TestApplicationComponent.builder() - .setApplication(this) - .build() - } - - fun inject(test: FeatureFlagNameToNumericIdConverterTest) { - component.inject(test) - } - } -} diff --git a/utility/src/test/java/org/oppia/android/util/logging/SyncStatusManagerImplTest.kt b/utility/src/test/java/org/oppia/android/util/logging/SyncStatusManagerImplTest.kt index 98d3bd3462d..99c68451f59 100644 --- a/utility/src/test/java/org/oppia/android/util/logging/SyncStatusManagerImplTest.kt +++ b/utility/src/test/java/org/oppia/android/util/logging/SyncStatusManagerImplTest.kt @@ -15,6 +15,7 @@ import org.oppia.android.data.persistence.PersistentCacheStore import org.oppia.android.testing.TestLogReportingModule import org.oppia.android.testing.data.DataProviderTestMonitor import org.oppia.android.testing.networking.NetworkConnectionTestUtil +import org.oppia.android.testing.platformparameter.TestPlatformParameterModule import org.oppia.android.testing.robolectric.RobolectricModule import org.oppia.android.testing.threading.TestCoroutineDispatchers import org.oppia.android.testing.threading.TestDispatcherModule @@ -23,12 +24,6 @@ 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.networking.NetworkConnectionUtilDebugModule -import org.oppia.android.util.platformparameter.EnableLearnerStudyAnalytics -import org.oppia.android.util.platformparameter.PlatformParameterValue -import org.oppia.android.util.platformparameter.SPLASH_SCREEN_WELCOME_MSG_DEFAULT_VALUE -import org.oppia.android.util.platformparameter.SYNC_UP_WORKER_TIME_PERIOD_IN_HOURS_DEFAULT_VALUE -import org.oppia.android.util.platformparameter.SplashScreenWelcomeMsg -import org.oppia.android.util.platformparameter.SyncUpWorkerTimePeriodHours import org.oppia.android.util.threading.BackgroundDispatcher import org.robolectric.annotation.Config import org.robolectric.annotation.LooperMode @@ -86,34 +81,6 @@ class SyncStatusManagerImplTest : SyncStatusManagerTestBase() { fun provideGlobalLogLevel(): LogLevel = LogLevel.VERBOSE } - @Module - class TestPlatformParameterModule { - - companion object { - var forceLearnerAnalyticsStudy: Boolean = false - } - - @Provides - @SplashScreenWelcomeMsg - fun provideSplashScreenWelcomeMsgParam(): PlatformParameterValue { - return PlatformParameterValue.createDefaultParameter(SPLASH_SCREEN_WELCOME_MSG_DEFAULT_VALUE) - } - - @Provides - @SyncUpWorkerTimePeriodHours - fun provideSyncUpWorkerTimePeriod(): PlatformParameterValue { - return PlatformParameterValue.createDefaultParameter( - SYNC_UP_WORKER_TIME_PERIOD_IN_HOURS_DEFAULT_VALUE - ) - } - - @Provides - @EnableLearnerStudyAnalytics - fun provideLearnerStudyAnalytics(): PlatformParameterValue { - return PlatformParameterValue.createDefaultParameter(forceLearnerAnalyticsStudy) - } - } - // TODO(#89): Move this to a common test application component. @Singleton @Component( diff --git a/utility/src/test/java/org/oppia/android/util/logging/firebase/BUILD.bazel b/utility/src/test/java/org/oppia/android/util/logging/firebase/BUILD.bazel index 841f115ae69..8d5e7923289 100644 --- a/utility/src/test/java/org/oppia/android/util/logging/firebase/BUILD.bazel +++ b/utility/src/test/java/org/oppia/android/util/logging/firebase/BUILD.bazel @@ -13,6 +13,7 @@ oppia_android_test( deps = [ "//:dagger", "//testing", + "//testing/src/main/java/org/oppia/android/testing/platformparameter:test_module", "//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", @@ -21,6 +22,7 @@ oppia_android_test( "//third_party:com_google_truth_truth", "//third_party:org_robolectric_robolectric", "//third_party:robolectric_android-all", + "//utility/src/main/java/org/oppia/android/util/caching:asset_prod_module", "//utility/src/main/java/org/oppia/android/util/locale:prod_module", "//utility/src/main/java/org/oppia/android/util/logging/firebase:prod_module", "//utility/src/main/java/org/oppia/android/util/networking:debug_module", diff --git a/utility/src/test/java/org/oppia/android/util/logging/firebase/LogReportingModuleTest.kt b/utility/src/test/java/org/oppia/android/util/logging/firebase/LogReportingModuleTest.kt index b105b8cb7a7..ef87c6f750c 100644 --- a/utility/src/test/java/org/oppia/android/util/logging/firebase/LogReportingModuleTest.kt +++ b/utility/src/test/java/org/oppia/android/util/logging/firebase/LogReportingModuleTest.kt @@ -5,17 +5,19 @@ 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 com.google.firebase.FirebaseApp 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.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.caching.AssetModule import org.oppia.android.util.data.DataProvidersInjector import org.oppia.android.util.data.DataProvidersInjectorProvider import org.oppia.android.util.locale.LocaleProdModule @@ -24,12 +26,6 @@ import org.oppia.android.util.logging.LoggerModule import org.oppia.android.util.logging.SyncStatusModule import org.oppia.android.util.logging.performancemetrics.PerformanceMetricsEventLogger import org.oppia.android.util.networking.NetworkConnectionUtilDebugModule -import org.oppia.android.util.platformparameter.EnableLoggingLearnerStudyIds -import org.oppia.android.util.platformparameter.PlatformParameterValue -import org.oppia.android.util.platformparameter.SPLASH_SCREEN_WELCOME_MSG_DEFAULT_VALUE -import org.oppia.android.util.platformparameter.SYNC_UP_WORKER_TIME_PERIOD_IN_HOURS_DEFAULT_VALUE -import org.oppia.android.util.platformparameter.SplashScreenWelcomeMsg -import org.oppia.android.util.platformparameter.SyncUpWorkerTimePeriodHours import org.robolectric.annotation.Config import org.robolectric.annotation.LooperMode import javax.inject.Inject @@ -51,6 +47,7 @@ class LogReportingModuleTest { @Before fun setUp() { + FirebaseApp.initializeApp(ApplicationProvider.getApplicationContext()) setUpTestApplicationComponent() } @@ -75,38 +72,11 @@ class LogReportingModuleTest { fun provideContext(application: Application): Context } - @Module - class TestPlatformParameterModule { - - companion object { - var forceLoggingLearnerStudyIds: Boolean = false - } - - @Provides - @SplashScreenWelcomeMsg - fun provideSplashScreenWelcomeMsgParam(): PlatformParameterValue { - return PlatformParameterValue.createDefaultParameter(SPLASH_SCREEN_WELCOME_MSG_DEFAULT_VALUE) - } - - @Provides - @SyncUpWorkerTimePeriodHours - fun provideSyncUpWorkerTimePeriod(): PlatformParameterValue { - return PlatformParameterValue.createDefaultParameter( - SYNC_UP_WORKER_TIME_PERIOD_IN_HOURS_DEFAULT_VALUE - ) - } - - @Provides - @EnableLoggingLearnerStudyIds - fun provideLoggingLearnerStudyIds(): PlatformParameterValue { - return PlatformParameterValue.createDefaultParameter(forceLoggingLearnerStudyIds) - } - } - // TODO(#89): Move this to a common test application component. @Singleton @Component( modules = [ + AssetModule::class, FakeOppiaClockModule::class, LocaleProdModule::class, LogReportingModule::class, diff --git a/utility/src/test/java/org/oppia/android/util/parser/html/HtmlParserTest.kt b/utility/src/test/java/org/oppia/android/util/parser/html/HtmlParserTest.kt index 55a83f518f7..fdb1e2076e3 100644 --- a/utility/src/test/java/org/oppia/android/util/parser/html/HtmlParserTest.kt +++ b/utility/src/test/java/org/oppia/android/util/parser/html/HtmlParserTest.kt @@ -91,7 +91,6 @@ import org.oppia.android.domain.oppialogger.analytics.ApplicationLifecycleModule import org.oppia.android.domain.oppialogger.analytics.CpuPerformanceSnapshotterModule 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 import org.oppia.android.domain.workmanager.WorkManagerConfigurationModule @@ -104,6 +103,7 @@ import org.oppia.android.testing.firebase.TestAuthenticationModule import org.oppia.android.testing.junit.DefineAppLanguageLocaleContext import org.oppia.android.testing.junit.InitializeDefaultLocaleRule import org.oppia.android.testing.mockito.capture +import org.oppia.android.testing.platformparameter.TestPlatformParameterModule import org.oppia.android.testing.robolectric.RobolectricModule import org.oppia.android.testing.threading.TestCoroutineDispatchers import org.oppia.android.testing.threading.TestDispatcherModule @@ -1176,7 +1176,7 @@ class HtmlParserTest { NumberWithUnitsRuleModule::class, NumericExpressionInputModule::class, NumericInputRuleModule::class, - PlatformParameterModule::class, + TestPlatformParameterModule::class, PlatformParameterSingletonModule::class, QuestionModule::class, RatioInputModule::class, diff --git a/utility/src/test/java/org/oppia/android/util/parser/html/ListItemLeadingMarginSpanTest.kt b/utility/src/test/java/org/oppia/android/util/parser/html/ListItemLeadingMarginSpanTest.kt index 72acfe06ea7..dc4299821f4 100644 --- a/utility/src/test/java/org/oppia/android/util/parser/html/ListItemLeadingMarginSpanTest.kt +++ b/utility/src/test/java/org/oppia/android/util/parser/html/ListItemLeadingMarginSpanTest.kt @@ -73,7 +73,6 @@ import org.oppia.android.domain.oppialogger.analytics.ApplicationLifecycleModule import org.oppia.android.domain.oppialogger.analytics.CpuPerformanceSnapshotterModule 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 import org.oppia.android.domain.workmanager.WorkManagerConfigurationModule @@ -85,6 +84,7 @@ import org.oppia.android.testing.TestPlatform import org.oppia.android.testing.firebase.TestAuthenticationModule import org.oppia.android.testing.junit.DefineAppLanguageLocaleContext import org.oppia.android.testing.junit.InitializeDefaultLocaleRule +import org.oppia.android.testing.platformparameter.TestPlatformParameterModule import org.oppia.android.testing.robolectric.RobolectricModule import org.oppia.android.testing.threading.TestCoroutineDispatchers import org.oppia.android.testing.threading.TestDispatcherModule @@ -1102,7 +1102,7 @@ class ListItemLeadingMarginSpanTest { NumberWithUnitsRuleModule::class, NumericExpressionInputModule::class, NumericInputRuleModule::class, - PlatformParameterModule::class, + TestPlatformParameterModule::class, PlatformParameterSingletonModule::class, QuestionModule::class, RatioInputModule::class, @@ -1121,7 +1121,6 @@ class ListItemLeadingMarginSpanTest { WorkManagerConfigurationModule::class ] ) - interface TestApplicationComponent : ApplicationComponent { @Component.Builder interface Builder : ApplicationComponent.Builder { From ee9e2b98c484a21f65ac05efc617e1d9d1bb572b Mon Sep 17 00:00:00 2001 From: Saptak Manna Date: Mon, 8 Sep 2025 20:55:43 +0530 Subject: [PATCH 29/36] Address review comments --- .../java/org/oppia/android/app/topic/TopicFragmentTest.kt | 8 ++++---- .../domain/platformparameter/FeatureFlagBindingModule.kt | 1 - 2 files changed, 4 insertions(+), 5 deletions(-) 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 de9e018d09c..7f1580a90b6 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 @@ -137,21 +137,21 @@ import org.robolectric.annotation.LooperMode import javax.inject.Inject import javax.inject.Singleton -// When both extra tabs (info and practice) are enabled +// When both extra tabs (info and practice) are enabled. private const val INFO_TAB_POSITION = 0 private const val LESSON_TAB_POSITION = 1 private const val PRACTICE_TAB_POSITION = 2 private const val REVISION_TAB_POSITION = 3 -// When both extra tabs (info and practice) are disabled +// When both extra tabs (info and practice) are disabled. private const val LESSON_TAB_POSITION_EXTRA_TABS_DISABLED = 0 private const val REVISION_TAB_POSITION_EXTRA_TABS_DISABLED = 1 -// When only the info tab is enabled +// When only the info tab is enabled. private const val LESSON_TAB_POSITION_INFO_ENABLED_PRACTICE_DISABLED = 1 private const val REVISION_TAB_POSITION_INFO_ENABLED_PRACTICE_DISABLED = 2 -// When only the practice tab is enabled +// When only the practice tab is enabled. private const val LESSON_TAB_POSITION_PRACTICE_ENABLED_INFO_DISABLED = 0 private const val PRACTICE_TAB_POSITION_PRACTICE_ENABLED_INFO_DISABLED = 1 private const val REVISION_TAB_POSITION_PRACTICE_ENABLED_INFO_DISABLED = 2 diff --git a/domain/src/main/java/org/oppia/android/domain/platformparameter/FeatureFlagBindingModule.kt b/domain/src/main/java/org/oppia/android/domain/platformparameter/FeatureFlagBindingModule.kt index 047048ce9e7..56137e6f915 100644 --- a/domain/src/main/java/org/oppia/android/domain/platformparameter/FeatureFlagBindingModule.kt +++ b/domain/src/main/java/org/oppia/android/domain/platformparameter/FeatureFlagBindingModule.kt @@ -101,7 +101,6 @@ class FeatureFlagBindingModule { fun provideEnableTopicPracticeTab(processState: PlatformParameterProcessState) = processState.retrieveFeatureFlag(FeatureFlagId.TOPIC_PRACTICE_TAB) - private companion object { private fun PlatformParameterProcessState.retrieveFeatureFlag( featureFlagId: FeatureFlagId From d43197c08b1ef6b450b79e0381fa4be29ce58e5f Mon Sep 17 00:00:00 2001 From: Saptak Manna Date: Mon, 8 Sep 2025 21:16:09 +0530 Subject: [PATCH 30/36] Enable practice tab on alpha builds --- .../featureoverrides/alpha/feature_flags_overrides.textproto | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/config/src/java/org/oppia/android/config/platform/featureoverrides/alpha/feature_flags_overrides.textproto b/config/src/java/org/oppia/android/config/platform/featureoverrides/alpha/feature_flags_overrides.textproto index 1f1175aaea5..1198b1931ed 100644 --- a/config/src/java/org/oppia/android/config/platform/featureoverrides/alpha/feature_flags_overrides.textproto +++ b/config/src/java/org/oppia/android/config/platform/featureoverrides/alpha/feature_flags_overrides.textproto @@ -10,3 +10,7 @@ feature_flag_definition { id: MULTIPLE_CLASSROOMS default_is_enabled: true } +feature_flag_definition { + id: TOPIC_PRACTICE_TAB + default_is_enabled: true +} From 4206099131cac34a182ef90ee3dc92ec5ba062b3 Mon Sep 17 00:00:00 2001 From: Saptak Manna Date: Tue, 9 Sep 2025 21:57:57 +0530 Subject: [PATCH 31/36] Fix a few tests --- .../app/devoptions/featureflags/FeatureFlagsFragmentTest.kt | 2 +- .../java/org/oppia/android/app/topic/TopicFragmentTest.kt | 4 ++-- .../domain/oppialogger/analytics/FeatureFlagsLoggerTest.kt | 2 +- .../org/oppia/android/util/logging/EventBundleCreatorTest.kt | 2 +- 4 files changed, 5 insertions(+), 5 deletions(-) diff --git a/app/src/sharedTest/java/org/oppia/android/app/devoptions/featureflags/FeatureFlagsFragmentTest.kt b/app/src/sharedTest/java/org/oppia/android/app/devoptions/featureflags/FeatureFlagsFragmentTest.kt index 98312dd5586..7ffca968e61 100644 --- a/app/src/sharedTest/java/org/oppia/android/app/devoptions/featureflags/FeatureFlagsFragmentTest.kt +++ b/app/src/sharedTest/java/org/oppia/android/app/devoptions/featureflags/FeatureFlagsFragmentTest.kt @@ -167,7 +167,7 @@ class FeatureFlagsFragmentTest { // Note to developers: if you add/remove a feature flag, please update the expected count. onView(withId(R.id.feature_flags_recycler_view)) - .check(RecyclerViewMatcher.hasItemCount(count = 14)) + .check(RecyclerViewMatcher.hasItemCount(count = 15)) } } 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 7f1580a90b6..ff8298a8bb9 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 @@ -602,8 +602,8 @@ class TopicFragmentTest { runWithLaunchedActivityAndAddedFragment( profileId, TEST_CLASSROOM_ID_1, FRACTIONS_TOPIC_ID, FRACTIONS_STORY_ID_0 ) { - clickTabAtPosition(position = PRACTICE_TAB_POSITION) - verifyTabTitleAtPosition(position = PRACTICE_TAB_POSITION) + clickTabAtPosition(position = PRACTICE_TAB_POSITION_PRACTICE_ENABLED_INFO_DISABLED) + verifyTabTitleAtPosition(position = PRACTICE_TAB_POSITION_PRACTICE_ENABLED_INFO_DISABLED) } } diff --git a/domain/src/test/java/org/oppia/android/domain/oppialogger/analytics/FeatureFlagsLoggerTest.kt b/domain/src/test/java/org/oppia/android/domain/oppialogger/analytics/FeatureFlagsLoggerTest.kt index 55a41c1f455..3bac46f37f0 100644 --- a/domain/src/test/java/org/oppia/android/domain/oppialogger/analytics/FeatureFlagsLoggerTest.kt +++ b/domain/src/test/java/org/oppia/android/domain/oppialogger/analytics/FeatureFlagsLoggerTest.kt @@ -141,7 +141,7 @@ class FeatureFlagsLoggerTest { @Test fun testLogFeatureFlags_correctNumberOfFeatureFlagsIsLogged() { - val expectedFeatureFlagCount = 14 + val expectedFeatureFlagCount = 15 featureFlagsLogger.logAllFeatureFlags(TEST_SESSION_ID) testCoroutineDispatchers.runCurrent() diff --git a/utility/src/test/java/org/oppia/android/util/logging/EventBundleCreatorTest.kt b/utility/src/test/java/org/oppia/android/util/logging/EventBundleCreatorTest.kt index 0e42b16b51d..acace1c575f 100644 --- a/utility/src/test/java/org/oppia/android/util/logging/EventBundleCreatorTest.kt +++ b/utility/src/test/java/org/oppia/android/util/logging/EventBundleCreatorTest.kt @@ -872,7 +872,7 @@ class EventBundleCreatorTest { assertThat(bundle).integer("android_sdk").isEqualTo(TEST_ANDROID_SDK_VERSION) assertThat(bundle).string("app_version_name").isEqualTo(TEST_APP_VERSION_NAME) assertThat(bundle).integer("app_version_code").isEqualTo(TEST_APP_VERSION_CODE) - assertThat(bundle).string("feature_flag_names").isEqualTo("2,3,4,5,6,7,8,10,11,12,13,14,15,0") + assertThat(bundle).string("feature_flag_names").isEqualTo("2,3,4,5,7,8,10,11,12,13,14,15,17,18,0") assertThat(bundle).string("feature_flag_enabled_states") .isEqualTo("0,1,0,1,0,1,0,1,0,1,0,1,0,0") assertThat(bundle).string("feature_flag_sync_statuses").isEqualTo("0,1,2,0,1,2,0,1,2,0,1,2,0,0") From b3b792ad3553c463997f9edfba61da8fbfb489c2 Mon Sep 17 00:00:00 2001 From: Saptak Manna Date: Tue, 9 Sep 2025 21:58:32 +0530 Subject: [PATCH 32/36] Fix ktlint issue --- .../org/oppia/android/util/logging/EventBundleCreatorTest.kt | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/utility/src/test/java/org/oppia/android/util/logging/EventBundleCreatorTest.kt b/utility/src/test/java/org/oppia/android/util/logging/EventBundleCreatorTest.kt index acace1c575f..30cbc3a9dc9 100644 --- a/utility/src/test/java/org/oppia/android/util/logging/EventBundleCreatorTest.kt +++ b/utility/src/test/java/org/oppia/android/util/logging/EventBundleCreatorTest.kt @@ -872,7 +872,8 @@ class EventBundleCreatorTest { assertThat(bundle).integer("android_sdk").isEqualTo(TEST_ANDROID_SDK_VERSION) assertThat(bundle).string("app_version_name").isEqualTo(TEST_APP_VERSION_NAME) assertThat(bundle).integer("app_version_code").isEqualTo(TEST_APP_VERSION_CODE) - assertThat(bundle).string("feature_flag_names").isEqualTo("2,3,4,5,7,8,10,11,12,13,14,15,17,18,0") + assertThat(bundle).string("feature_flag_names") + .isEqualTo("2,3,4,5,7,8,10,11,12,13,14,15,17,18,0") assertThat(bundle).string("feature_flag_enabled_states") .isEqualTo("0,1,0,1,0,1,0,1,0,1,0,1,0,0") assertThat(bundle).string("feature_flag_sync_statuses").isEqualTo("0,1,2,0,1,2,0,1,2,0,1,2,0,0") From 183908c4e511dd04b06657d8d297f20537419830 Mon Sep 17 00:00:00 2001 From: Saptak Manna Date: Wed, 10 Sep 2025 12:31:46 +0530 Subject: [PATCH 33/36] Fix tests --- .../org/oppia/android/util/logging/EventBundleCreatorTest.kt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/utility/src/test/java/org/oppia/android/util/logging/EventBundleCreatorTest.kt b/utility/src/test/java/org/oppia/android/util/logging/EventBundleCreatorTest.kt index 30cbc3a9dc9..df6ef1c169a 100644 --- a/utility/src/test/java/org/oppia/android/util/logging/EventBundleCreatorTest.kt +++ b/utility/src/test/java/org/oppia/android/util/logging/EventBundleCreatorTest.kt @@ -875,7 +875,7 @@ class EventBundleCreatorTest { assertThat(bundle).string("feature_flag_names") .isEqualTo("2,3,4,5,7,8,10,11,12,13,14,15,17,18,0") assertThat(bundle).string("feature_flag_enabled_states") - .isEqualTo("0,1,0,1,0,1,0,1,0,1,0,1,0,0") + .isEqualTo("0,1,0,1,1,0,1,0,1,0,1,0,0,0,0") assertThat(bundle).string("feature_flag_sync_statuses").isEqualTo("0,1,2,0,1,2,0,1,2,0,1,2,0,0") } From 7ef3a68d94a83fae7c6f3f09f27bbb0e7ac26ff9 Mon Sep 17 00:00:00 2001 From: Saptak Manna Date: Tue, 7 Oct 2025 20:06:26 +0530 Subject: [PATCH 34/36] Trigger tests --- .../oppia/android/app/topic/lessons/TopicLessonsFragmentTest.kt | 1 + 1 file changed, 1 insertion(+) 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 d9d116852ae..538d84c3a80 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 @@ -140,6 +140,7 @@ import org.oppia.android.util.networking.NetworkConnectionUtilDebugModule import org.oppia.android.util.parser.html.HtmlParserEntityTypeModule import org.oppia.android.util.parser.image.GlideImageLoaderModule import org.oppia.android.util.parser.image.ImageParsingModule + import org.oppia.android.util.platformparameter.EnableTopicInfoTab import org.oppia.android.util.platformparameter.EnableTopicPracticeTab import org.oppia.android.util.platformparameter.PlatformParameterValue From 482ff9fa9742b127039e3f96b7fb6c7cb10788e6 Mon Sep 17 00:00:00 2001 From: Saptak Manna Date: Tue, 7 Oct 2025 20:07:54 +0530 Subject: [PATCH 35/36] Revert "Trigger tests" This reverts commit 7ef3a68d94a83fae7c6f3f09f27bbb0e7ac26ff9. --- .../oppia/android/app/topic/lessons/TopicLessonsFragmentTest.kt | 1 - 1 file changed, 1 deletion(-) 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 538d84c3a80..d9d116852ae 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 @@ -140,7 +140,6 @@ import org.oppia.android.util.networking.NetworkConnectionUtilDebugModule import org.oppia.android.util.parser.html.HtmlParserEntityTypeModule import org.oppia.android.util.parser.image.GlideImageLoaderModule import org.oppia.android.util.parser.image.ImageParsingModule - import org.oppia.android.util.platformparameter.EnableTopicInfoTab import org.oppia.android.util.platformparameter.EnableTopicPracticeTab import org.oppia.android.util.platformparameter.PlatformParameterValue From e8e2fd655dd12a6e5cda1b1065118ee21345a41b Mon Sep 17 00:00:00 2001 From: Saptak Manna Date: Fri, 10 Oct 2025 11:58:54 +0530 Subject: [PATCH 36/36] fix flag statuses on test --- .../org/oppia/android/util/logging/EventBundleCreatorTest.kt | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/utility/src/test/java/org/oppia/android/util/logging/EventBundleCreatorTest.kt b/utility/src/test/java/org/oppia/android/util/logging/EventBundleCreatorTest.kt index df6ef1c169a..74ba710af83 100644 --- a/utility/src/test/java/org/oppia/android/util/logging/EventBundleCreatorTest.kt +++ b/utility/src/test/java/org/oppia/android/util/logging/EventBundleCreatorTest.kt @@ -876,7 +876,8 @@ class EventBundleCreatorTest { .isEqualTo("2,3,4,5,7,8,10,11,12,13,14,15,17,18,0") assertThat(bundle).string("feature_flag_enabled_states") .isEqualTo("0,1,0,1,1,0,1,0,1,0,1,0,0,0,0") - assertThat(bundle).string("feature_flag_sync_statuses").isEqualTo("0,1,2,0,1,2,0,1,2,0,1,2,0,0") + assertThat(bundle).string("feature_flag_sync_statuses") + .isEqualTo("0,1,2,0,2,0,1,2,0,1,2,0,1,1,0") } @Test