From 6006277f33af2e981964fc4ab58e366c7f39e21a Mon Sep 17 00:00:00 2001
From: Deon Olarewaju
Date: Thu, 16 Nov 2023 23:19:21 +0100
Subject: [PATCH 1/7] Fix #5226: EnableContinueButtonAnimation Feature Flag
(#5228)
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
## Explanation
Fix #5226
Remove declarations and usages of the enableContinueButtonAnimation
PlatformParameter.
### Description of changes introduced to pass the failing tests.
(A) Removed declaration of
TestPlatformParameterModule.forceEnableContinueButtonAnimation() from
all test functions namely:
testContinueInteractionAnim_openPrototypeExp_checkContinueButtonAnimatesAfter45Seconds(),
testConIntAnim_openProtExp_orientLandscapeAfter30Sec_checkAnimHasNotStarted(),
testConIntAnim_openProtExp_orientLandAfter30Sec_checkAnimStartsIn15SecAfterOrientChange(),
testContNavBtnAnim_openMathExp_checkContNavBtnAnimatesAfter45Seconds(),
testContNavBtnAnim_openMathExp_playThroughSecondState_checkContBtnDoesNotAnimateAfter45Sec(),
testConIntAnim_openFractions_expId1_checkButtonDoesNotAnimate()
in StateFragmentLocalTest.kt file
(B) Removed function declaration
TestPlatformParameterModule.forceEnableContinueButtonAnimation(false)
from setup() function
in StateFragmentTest.kt
(C) Removed function declaration
TestPlatformParameterModule.forceEnableContinueButtonAnimation(false)
from setup() function
in ExploreActivityTest.kt
## Essential Checklist
- [x] The PR title and explanation each start with "Fix #bugnum: " (If
this PR fixes part of an issue, prefix the title with "Fix part of
#bugnum: ...".)
- [x] Any changes to
[scripts/assets](https://github.com/oppia/oppia-android/tree/develop/scripts/assets)
files have their rationale included in the PR explanation.
- [x] The PR follows the [style
guide](https://github.com/oppia/oppia-android/wiki/Coding-style-guide).
- [x] The PR does not contain any unnecessary code changes from Android
Studio
([reference](https://github.com/oppia/oppia-android/wiki/Guidance-on-submitting-a-PR#undo-unnecessary-changes)).
- [x] The PR is made from a branch that's **not** called "develop" and
is up-to-date with "develop".
- [x] The PR is **assigned** to the appropriate reviewers
([reference](https://github.com/oppia/oppia-android/wiki/Guidance-on-submitting-a-PR#clarification-regarding-assignees-and-reviewers-section)).
---
.../app/customview/ContinueButtonView.kt | 30 +++++++++----------
.../exploration/ExplorationActivityTest.kt | 1 -
.../app/player/state/StateFragmentTest.kt | 1 -
.../player/state/StateFragmentLocalTest.kt | 6 ----
.../PlatformParameterAlphaKenyaModule.kt | 10 -------
.../PlatformParameterAlphaModule.kt | 10 -------
.../PlatformParameterModule.kt | 10 -------
.../TestPlatformParameterModule.kt | 17 -----------
.../PlatformParameterConstants.kt | 11 -------
9 files changed, 14 insertions(+), 82 deletions(-)
diff --git a/app/src/main/java/org/oppia/android/app/customview/ContinueButtonView.kt b/app/src/main/java/org/oppia/android/app/customview/ContinueButtonView.kt
index bd3e44d8865..dd599820187 100644
--- a/app/src/main/java/org/oppia/android/app/customview/ContinueButtonView.kt
+++ b/app/src/main/java/org/oppia/android/app/customview/ContinueButtonView.kt
@@ -11,8 +11,6 @@ import org.oppia.android.app.utility.lifecycle.LifecycleSafeTimerFactory
import org.oppia.android.app.view.ViewComponentFactory
import org.oppia.android.app.view.ViewComponentImpl
import org.oppia.android.domain.oppialogger.OppiaLogger
-import org.oppia.android.util.platformparameter.EnableContinueButtonAnimation
-import org.oppia.android.util.platformparameter.PlatformParameterValue
import org.oppia.android.util.system.OppiaClock
import javax.inject.Inject
@@ -25,12 +23,14 @@ class ContinueButtonView @JvmOverloads constructor(
defStyleAttr: Int = R.style.StateButtonActive
) : androidx.appcompat.widget.AppCompatButton(context, attrs, defStyleAttr) {
- @field:[Inject EnableContinueButtonAnimation]
- lateinit var enableContinueButtonAnimation: PlatformParameterValue
- @Inject lateinit var fragment: Fragment
- @Inject lateinit var oppiaClock: OppiaClock
- @Inject lateinit var lifecycleSafeTimerFactory: LifecycleSafeTimerFactory
- @Inject lateinit var oppiaLogger: OppiaLogger
+ @Inject
+ lateinit var fragment: Fragment
+ @Inject
+ lateinit var oppiaClock: OppiaClock
+ @Inject
+ lateinit var lifecycleSafeTimerFactory: LifecycleSafeTimerFactory
+ @Inject
+ lateinit var oppiaLogger: OppiaLogger
private var shouldAnimateContinueButtonLateinit: Boolean? = null
private val shouldAnimateContinueButton: Boolean
@@ -119,13 +119,11 @@ class ContinueButtonView @JvmOverloads constructor(
private fun startAnimating() {
val animation = AnimationUtils.loadAnimation(context, R.anim.wobble_button_animation)
- if (enableContinueButtonAnimation.value) {
- startAnimation(animation)
- // Repeat the animation after a fixed interval.
- lifecycleSafeTimerFactory.createTimer(INTERVAL_BETWEEN_CONTINUE_BUTTON_ANIM_MS)
- .observe(fragment) {
- startAnimating()
- }
- }
+ startAnimation(animation)
+ // Repeat the animation after a fixed interval.
+ lifecycleSafeTimerFactory.createTimer(INTERVAL_BETWEEN_CONTINUE_BUTTON_ANIM_MS)
+ .observe(fragment) {
+ startAnimating()
+ }
}
}
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 165f250bde4..e1cce42d8f3 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
@@ -226,7 +226,6 @@ class ExplorationActivityTest {
@Before
fun setUp() {
Intents.init()
- TestPlatformParameterModule.forceEnableContinueButtonAnimation(false)
setUpTestApplicationComponent()
testCoroutineDispatchers.registerIdlingResource()
profileTestHelper.initializeProfiles()
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 02dfe4b1731..24ac673be8d 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
@@ -4749,7 +4749,6 @@ class StateFragmentTest {
}
private fun setUpTest() {
- TestPlatformParameterModule.forceEnableContinueButtonAnimation(false)
Intents.init()
setUpTestApplicationComponent()
testCoroutineDispatchers.registerIdlingResource()
diff --git a/app/src/test/java/org/oppia/android/app/player/state/StateFragmentLocalTest.kt b/app/src/test/java/org/oppia/android/app/player/state/StateFragmentLocalTest.kt
index 1153c881562..a90c507ad4b 100644
--- a/app/src/test/java/org/oppia/android/app/player/state/StateFragmentLocalTest.kt
+++ b/app/src/test/java/org/oppia/android/app/player/state/StateFragmentLocalTest.kt
@@ -269,7 +269,6 @@ class StateFragmentLocalTest {
@Test
fun testContinueInteractionAnim_openPrototypeExp_checkContinueButtonAnimatesAfter45Seconds() {
- TestPlatformParameterModule.forceEnableContinueButtonAnimation(true)
launchForExploration(TEST_EXPLORATION_ID_2).use {
startPlayingExploration()
testCoroutineDispatchers.runCurrent()
@@ -339,7 +338,6 @@ class StateFragmentLocalTest {
@Test
fun testConIntAnim_openProtExp_orientLandscapeAfter30Sec_checkAnimHasNotStarted() {
- TestPlatformParameterModule.forceEnableContinueButtonAnimation(true)
launchForExploration(TEST_EXPLORATION_ID_2).use {
startPlayingExploration()
@@ -353,7 +351,6 @@ class StateFragmentLocalTest {
@Test
fun testConIntAnim_openProtExp_orientLandAfter30Sec_checkAnimStartsIn15SecAfterOrientChange() {
- TestPlatformParameterModule.forceEnableContinueButtonAnimation(true)
launchForExploration(TEST_EXPLORATION_ID_2).use {
startPlayingExploration()
@@ -368,7 +365,6 @@ class StateFragmentLocalTest {
@Test
fun testContNavBtnAnim_openMathExp_checkContNavBtnAnimatesAfter45Seconds() {
- TestPlatformParameterModule.forceEnableContinueButtonAnimation(true)
launchForExploration(TEST_EXPLORATION_ID_5).use {
startPlayingExploration()
onView(withId(R.id.state_recycler_view)).perform(
@@ -391,7 +387,6 @@ class StateFragmentLocalTest {
@Ignore("Continue navigation animation behavior fails during testing")
@Test
fun testContNavBtnAnim_openMathExp_playThroughSecondState_checkContBtnDoesNotAnimateAfter45Sec() {
- TestPlatformParameterModule.forceEnableContinueButtonAnimation(true)
launchForExploration(TEST_EXPLORATION_ID_5).use {
startPlayingExploration()
onView(withId(R.id.state_recycler_view)).perform(
@@ -424,7 +419,6 @@ class StateFragmentLocalTest {
@Ignore("Continue navigation animation behavior fails during testing")
@Test
fun testConIntAnim_openFractions_expId1_checkButtonDoesNotAnimate() {
- TestPlatformParameterModule.forceEnableContinueButtonAnimation(true)
launchForExploration(TEST_EXPLORATION_ID_2).use {
startPlayingExploration()
playThroughTestState1()
diff --git a/domain/src/main/java/org/oppia/android/domain/platformparameter/PlatformParameterAlphaKenyaModule.kt b/domain/src/main/java/org/oppia/android/domain/platformparameter/PlatformParameterAlphaKenyaModule.kt
index 1b3293d56f5..6adc922bc11 100644
--- a/domain/src/main/java/org/oppia/android/domain/platformparameter/PlatformParameterAlphaKenyaModule.kt
+++ b/domain/src/main/java/org/oppia/android/domain/platformparameter/PlatformParameterAlphaKenyaModule.kt
@@ -8,7 +8,6 @@ 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.ENABLE_APP_AND_OS_DEPRECATION_DEFAULT_VALUE
-import org.oppia.android.util.platformparameter.ENABLE_CONTINUE_BUTTON_ANIMATION_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
@@ -18,7 +17,6 @@ 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_SPOTLIGHT_UI_DEFAULT_VALUE
import org.oppia.android.util.platformparameter.EnableAppAndOsDeprecation
-import org.oppia.android.util.platformparameter.EnableContinueButtonAnimation
import org.oppia.android.util.platformparameter.EnableDownloadsSupport
import org.oppia.android.util.platformparameter.EnableEditAccountsOptionsUi
import org.oppia.android.util.platformparameter.EnableExtraTopicTabsUi
@@ -215,14 +213,6 @@ class PlatformParameterAlphaKenyaModule {
)
}
- @Provides
- @EnableContinueButtonAnimation
- fun provideEnableContinueButtonAnimation(): PlatformParameterValue {
- return PlatformParameterValue.createDefaultParameter(
- ENABLE_CONTINUE_BUTTON_ANIMATION_DEFAULT_VALUE
- )
- }
-
@Provides
@EnableSpotlightUi
fun enableSpotlightUi(): 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
index 8addae7b9fd..7ca4dcc66b0 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
@@ -8,7 +8,6 @@ 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.ENABLE_APP_AND_OS_DEPRECATION_DEFAULT_VALUE
-import org.oppia.android.util.platformparameter.ENABLE_CONTINUE_BUTTON_ANIMATION_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
@@ -17,7 +16,6 @@ import org.oppia.android.util.platformparameter.ENABLE_LANGUAGE_SELECTION_UI_DEF
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.EnableAppAndOsDeprecation
-import org.oppia.android.util.platformparameter.EnableContinueButtonAnimation
import org.oppia.android.util.platformparameter.EnableDownloadsSupport
import org.oppia.android.util.platformparameter.EnableEditAccountsOptionsUi
import org.oppia.android.util.platformparameter.EnableExtraTopicTabsUi
@@ -216,14 +214,6 @@ class PlatformParameterAlphaModule {
)
}
- @Provides
- @EnableContinueButtonAnimation
- fun provideEnableContinueButtonAnimation(): PlatformParameterValue {
- return PlatformParameterValue.createDefaultParameter(
- ENABLE_CONTINUE_BUTTON_ANIMATION_DEFAULT_VALUE
- )
- }
-
@Provides
@EnableAppAndOsDeprecation
fun provideEnableAppAndOsDeprecation(): PlatformParameterValue {
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 c2a211472fc..26e25bd3590 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
@@ -8,7 +8,6 @@ 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.ENABLE_APP_AND_OS_DEPRECATION_DEFAULT_VALUE
-import org.oppia.android.util.platformparameter.ENABLE_CONTINUE_BUTTON_ANIMATION_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
@@ -18,7 +17,6 @@ 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_SPOTLIGHT_UI_DEFAULT_VALUE
import org.oppia.android.util.platformparameter.EnableAppAndOsDeprecation
-import org.oppia.android.util.platformparameter.EnableContinueButtonAnimation
import org.oppia.android.util.platformparameter.EnableDownloadsSupport
import org.oppia.android.util.platformparameter.EnableEditAccountsOptionsUi
import org.oppia.android.util.platformparameter.EnableExtraTopicTabsUi
@@ -221,14 +219,6 @@ class PlatformParameterModule {
)
}
- @Provides
- @EnableContinueButtonAnimation
- fun provideEnableContinueButtonAnimation(): PlatformParameterValue {
- return PlatformParameterValue.createDefaultParameter(
- ENABLE_CONTINUE_BUTTON_ANIMATION_DEFAULT_VALUE
- )
- }
-
@Provides
@EnableAppAndOsDeprecation
fun provideEnableAppAndOsDeprecation(): PlatformParameterValue {
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 7ff02772a65..9341414bfd8 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
@@ -9,7 +9,6 @@ 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.ENABLE_APP_AND_OS_DEPRECATION_DEFAULT_VALUE
-import org.oppia.android.util.platformparameter.ENABLE_CONTINUE_BUTTON_ANIMATION_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
@@ -17,7 +16,6 @@ import org.oppia.android.util.platformparameter.ENABLE_INTERACTION_CONFIG_CHANGE
import org.oppia.android.util.platformparameter.ENABLE_LANGUAGE_SELECTION_UI_DEFAULT_VALUE
import org.oppia.android.util.platformparameter.ENABLE_PERFORMANCE_METRICS_COLLECTION_DEFAULT_VALUE
import org.oppia.android.util.platformparameter.EnableAppAndOsDeprecation
-import org.oppia.android.util.platformparameter.EnableContinueButtonAnimation
import org.oppia.android.util.platformparameter.EnableDownloadsSupport
import org.oppia.android.util.platformparameter.EnableEditAccountsOptionsUi
import org.oppia.android.util.platformparameter.EnableExtraTopicTabsUi
@@ -206,14 +204,6 @@ class TestPlatformParameterModule {
fun provideEnableInteractionConfigChangeStateRetention(): PlatformParameterValue =
PlatformParameterValue.createDefaultParameter(enableInteractionConfigChangeStateRetention)
- @Provides
- @EnableContinueButtonAnimation
- fun provideEnableContinueButtonAnimation(): PlatformParameterValue {
- return PlatformParameterValue.createDefaultParameter(
- enableContinueButtonAnimation
- )
- }
-
@Provides
@EnableSpotlightUi
fun provideEnableSpotlightUi(): PlatformParameterValue {
@@ -304,7 +294,6 @@ class TestPlatformParameterModule {
fun forceEnableDownloadsSupport(value: Boolean) {
enableDownloadsSupport = value
}
- private var enableContinueButtonAnimation = ENABLE_CONTINUE_BUTTON_ANIMATION_DEFAULT_VALUE
/** Enables forcing [EnableLanguageSelectionUi] platform parameter flag from tests. */
@VisibleForTesting(otherwise = VisibleForTesting.NONE)
@@ -354,12 +343,6 @@ class TestPlatformParameterModule {
enablePerformanceMetricsCollection = value
}
- /** Enables forcing [EnableContinueButtonAnimation] platform parameter flag from tests. */
- @VisibleForTesting(otherwise = VisibleForTesting.NONE)
- fun forceEnableContinueButtonAnimation(value: Boolean) {
- enableContinueButtonAnimation = value
- }
-
/** Enables forcing [EnableSpotlightUi] platform parameter flag from tests. */
@VisibleForTesting(otherwise = VisibleForTesting.NONE)
fun forceEnableSpotlightUi(value: Boolean) {
diff --git a/utility/src/main/java/org/oppia/android/util/platformparameter/PlatformParameterConstants.kt b/utility/src/main/java/org/oppia/android/util/platformparameter/PlatformParameterConstants.kt
index 8cb1e1b4297..fa0deba044c 100644
--- a/utility/src/main/java/org/oppia/android/util/platformparameter/PlatformParameterConstants.kt
+++ b/utility/src/main/java/org/oppia/android/util/platformparameter/PlatformParameterConstants.kt
@@ -170,17 +170,6 @@ const val ENABLE_PERFORMANCE_METRICS_COLLECTION = "enable_performance_metrics_co
/** Default value for whether to record performance metrics. */
const val ENABLE_PERFORMANCE_METRICS_COLLECTION_DEFAULT_VALUE = false
-/**
- * Qualifier for the platform parameter that controls whether to animate the continue button
- * interaction and navigation items. This is used to disable the animation during testing because
- * Espresso has known problems while testing views that contain animations.
- */
-@Qualifier
-annotation class EnableContinueButtonAnimation
-
-/** Default value for whether to enable continue button animation. */
-const val ENABLE_CONTINUE_BUTTON_ANIMATION_DEFAULT_VALUE = true
-
/**
* Qualifier for the platform parameter that controls the time interval in minutes of uploading
* previously recorded performance metrics to the remote service.
From 2e2f9175e13fbc9a9c3577f798d46fe90e3a3079 Mon Sep 17 00:00:00 2001
From: Deon Olarewaju
Date: Tue, 21 Nov 2023 03:16:35 +0100
Subject: [PATCH 2/7] Fix #5230: VectorDrawableCompat error lint (#5237)
## Explanation
Fix #5230: VectorDrawableCompat Lint error
Warning: VectorDrawableCompat
Fix: opened the app's build.gradle file.
Inside the android block, added the vectorDrawables section under
defaultConfig with the code below:
android { ... defaultConfig { ... vectorDrawables { useSupportLibrary
true } } }
## Essential Checklist
- [x] The PR title and explanation each start with "Fix #bugnum: " (If
this PR fixes part of an issue, prefix the title with "Fix part of
#bugnum: ...".)
- [x] Any changes to
[scripts/assets](https://github.com/oppia/oppia-android/tree/develop/scripts/assets)
files have their rationale included in the PR explanation.
- [x] The PR follows the [style
guide](https://github.com/oppia/oppia-android/wiki/Coding-style-guide).
- [x] The PR does not contain any unnecessary code changes from Android
Studio
([reference](https://github.com/oppia/oppia-android/wiki/Guidance-on-submitting-a-PR#undo-unnecessary-changes)).
- [x] The PR is made from a branch that's **not** called "develop" and
is up-to-date with "develop".
- [x] The PR is **assigned** to the appropriate reviewers
([reference](https://github.com/oppia/oppia-android/wiki/Guidance-on-submitting-a-PR#clarification-regarding-assignees-and-reviewers-section)).
---
app/build.gradle | 1 +
1 file changed, 1 insertion(+)
diff --git a/app/build.gradle b/app/build.gradle
index 71b759c6475..72dbb1d3cff 100644
--- a/app/build.gradle
+++ b/app/build.gradle
@@ -23,6 +23,7 @@ android {
includeCompileClasspath true
}
}
+ vectorDrawables { useSupportLibrary true }
}
compileOptions {
sourceCompatibility JavaVersion.VERSION_1_8
From 54e0ba5c40f00c1d3fcb119dff1b35da4e42f15c Mon Sep 17 00:00:00 2001
From: Vishwajith Shettigar
<76042077+Vishwajith-Shettigar@users.noreply.github.com>
Date: Wed, 22 Nov 2023 17:29:00 +0530
Subject: [PATCH 3/7] Fix #3345 Images are not fully displayed (#5234)
## Explanation
Fixes #3345, substracting drawableWidth from maxContentItemPadding only
if drawableWidth >= (maxcontentWidth -
maxContentItemPadding) would solve the issue.
## Essential Checklist
- [x] The PR title and explanation each start with "Fix #bugnum: " (If
this PR fixes part of an issue, prefix the title with "Fix part of
#bugnum: ...".)
- [x] Any changes to
[scripts/assets](https://github.com/oppia/oppia-android/tree/develop/scripts/assets)
files have their rationale included in the PR explanation.
- [x] The PR follows the [style
guide](https://github.com/oppia/oppia-android/wiki/Coding-style-guide).
- [x] The PR does not contain any unnecessary code changes from Android
Studio
([reference](https://github.com/oppia/oppia-android/wiki/Guidance-on-submitting-a-PR#undo-unnecessary-changes)).
- [x] The PR is made from a branch that's **not** called "develop" and
is up-to-date with "develop".
- [x] The PR is **assigned** to the appropriate reviewers
([reference](https://github.com/oppia/oppia-android/wiki/Guidance-on-submitting-a-PR#clarification-regarding-assignees-and-reviewers-section)).
## For UI-specific PRs only
### Before
https://user-images.githubusercontent.com/82181327/122643554-54f1ac00-d108-11eb-906f-6748d2facf2f.jpg
https://user-images.githubusercontent.com/101634267/245153650-cd8335df-01ec-47e6-97b2-7f7244d95efb.jpg
https://user-images.githubusercontent.com/101634267/245153665-cb9506d2-6d0d-4231-8a42-5f8ab15cf4d4.jpg
### After
![after_image_cut](https://github.com/oppia/oppia-android/assets/76042077/babacf98-1ef6-4f29-98a4-cc46c5f53303)
![after_imagecut](https://github.com/oppia/oppia-android/assets/76042077/e08cf8d0-5f25-46bb-afbe-124952d19bfc)
![after_image_cut2](https://github.com/oppia/oppia-android/assets/76042077/85e950df-1ae9-48f2-b46c-c610b838593a)
### After RTL
![After_RTL](https://github.com/oppia/oppia-android/assets/76042077/586ade28-a45e-4f0a-9ac8-51457ccf8b5a)
![after_no_effect_RTL](https://github.com/oppia/oppia-android/assets/76042077/75820a6d-cc76-4ec0-b90e-ede7e5a72643)
If your PR includes UI-related changes, then:
- Add screenshots for portrait/landscape for both a tablet & phone of
the before & after UI changes
- For the screenshots above, include both English and pseudo-localized
(RTL) screenshots (see [RTL
guide](https://github.com/oppia/oppia-android/wiki/RTL-Guidelines))
- Add a video showing the full UX flow with a screen reader enabled (see
[accessibility
guide](https://github.com/oppia/oppia-android/wiki/Accessibility-A11y-Guide))
- For PRs introducing new UI elements or color changes, both light and
dark mode screenshots must be included
- Add a screenshot demonstrating that you ran affected Espresso tests
locally & that they're passing
---
.../oppia/android/util/parser/image/UrlImageParser.kt | 9 +++++++--
1 file changed, 7 insertions(+), 2 deletions(-)
diff --git a/utility/src/main/java/org/oppia/android/util/parser/image/UrlImageParser.kt b/utility/src/main/java/org/oppia/android/util/parser/image/UrlImageParser.kt
index b18934a1897..137652bd013 100644
--- a/utility/src/main/java/org/oppia/android/util/parser/image/UrlImageParser.kt
+++ b/utility/src/main/java/org/oppia/android/util/parser/image/UrlImageParser.kt
@@ -268,6 +268,8 @@ class UrlImageParser private constructor(
var drawableWidth = drawable.intrinsicWidth.toFloat()
var drawableHeight = drawable.intrinsicHeight.toFloat()
+ val maxContentItemPadding =
+ context.resources.getDimensionPixelSize(R.dimen.maximum_content_item_padding)
if (autoResizeImage) {
// Treat the drawable's dimensions as dp so that the image scales for higher density
// displays.
@@ -291,8 +293,7 @@ class UrlImageParser private constructor(
drawableHeight *= multipleFactor
drawableWidth *= multipleFactor
}
- val maxContentItemPadding =
- context.resources.getDimensionPixelSize(R.dimen.maximum_content_item_padding)
+
val maximumImageSize = maxAvailableWidth - maxContentItemPadding
if (drawableWidth >= maximumImageSize) {
// The multipleFactor value is used to make sure that the aspect ratio of the image
@@ -311,6 +312,10 @@ class UrlImageParser private constructor(
}
}
+ if (drawableWidth >= (maxAvailableWidth - maxContentItemPadding)) {
+ drawableWidth -= maxContentItemPadding
+ }
+
val drawableLeft = if (imageCenterAlign && !isRTLMode()) {
calculateInitialMargin(maxAvailableWidth, drawableWidth)
} else {
From 6fec2e27244274e5e23a93f5051f5862218bc21c Mon Sep 17 00:00:00 2001
From: "translatewiki.net"
Date: Tue, 28 Nov 2023 02:21:51 +0530
Subject: [PATCH 4/7] Localisation updates from https://translatewiki.net.
(#5242)
Translation updates
---
app/src/main/res/values-pcm-rNG/strings.xml | 118 ++++++++++++++++----
1 file changed, 99 insertions(+), 19 deletions(-)
diff --git a/app/src/main/res/values-pcm-rNG/strings.xml b/app/src/main/res/values-pcm-rNG/strings.xml
index 85133c883a0..b79f8985c41 100644
--- a/app/src/main/res/values-pcm-rNG/strings.xml
+++ b/app/src/main/res/values-pcm-rNG/strings.xml
@@ -3,6 +3,7 @@
* Busayo
* Confidence
* Osetiemoria
+* Yigakpoa
-->
Navigation header
@@ -34,6 +35,7 @@
No show this message again
Concept Card
Concept Card 1
+ Concept Card 2
Revision Card
Comot go the topic page?
Wetin you don do before no go save
@@ -67,6 +69,7 @@
Go di former card
Go di next card
Submit
+ Submit
Replay
Return To Di Topic
Former reply (%s)
@@ -74,6 +77,7 @@
Learn Am Again
See More
See Less
+ This na sample text view
FAQs
Featured Questions
Frequently Asked Questions
@@ -94,6 +98,7 @@
Chapter %s with title %s don complete
Chapter %s with title %s dey in progress
Complete Chapter %s: %s to unlock dis chapter.
+ Chapter %s: %s dey locked currently. Abeg complete chapter %s: %s to fit unlock dis chapter.
Finish the chapter wey dey before to fit open dis chapter
Enter text.
Enter fraction wey dey in di form x/x, or mixed nomba wey dey in di form x x/x.
@@ -167,11 +172,11 @@
Abeg start your ansa with nomba (e.g.,”0” for 0.5).
Abeg put correct nomba.
Di ansa fit get at most 15 digits (0–9) or sign (. or -).
- Abeg write a ratio wey get nomba separated by colons (e.g. 1:2 or 1:2:3).
- Abeg enter a valid ratio (e.g. 1:2 or 1:2:3).
- Your ansa get two colons (:) next to each other.
- Nomba of terms no dey equal to di required terms.
- Ratios no suppose get 0 as an element.
+ Abeg write a ratio wey get nomba separated by colons (e.g. 1:2 or 1:2:3).
+ Abeg enter a valid ratio (e.g. 1:2 or 1:2:3).
+ Your ansa get two colons (:) next to each other.
+ Nomba of terms no dey equal to di required terms.
+ Ratios no suppose get 0 as an element.
Size wey dey no know
%s Bytes
%s KB
@@ -179,11 +184,11 @@
%s GB
You get am!
Topic: %s
-
+
- 1 Chapter
- %s Chapters
-
+
- 1 Story
- %s Stories
@@ -191,16 +196,16 @@
- %s of %s Chapter Completed
- %s of %s Chapters Completed
-
+
- 1 Lesson
- %s Lessons
-
+
- 1 Story Completed
- %s Stories Completed
- %s Stories Completed
-
+
- 1 Topic in Progress
- %s Topics in Progress
- %s Topics in Progress
@@ -327,7 +332,7 @@
Choose From Library
Rename Profile
New Name
- save
+ Save
Reset PIN
Put new PIN for di user to put wan dey wan enter deir profile.
3-Digit PIN
@@ -340,6 +345,7 @@
Required
Back Button
Next
+ Learner Study Analytics
General
Edit account
Profile Management
@@ -360,12 +366,12 @@
Di last update install on %s. Use di version nomba for up to send feedback about bugs.
App Version
App Language
- Default Audio Language
+ Preferred Audio Language
Reading Text Size
Reading Text Size
Story text go look like dis.
A
- Default Audio
+ Preferred Audio Language
App Language
Reading Text Size
Small
@@ -395,7 +401,7 @@
No new hint dey
Show hints and solution
Hint %s
- Go up
+ Close
Hints
Show solution
Show Solution
@@ -421,12 +427,36 @@
Up
Down
%s %s
+
+ - 0 minutes ago
+ - a minute ago
+ - %s minutes ago
+
+
+ - an hour ago
+ - %s hours ago
+
+
+ - a day ago
+ - %s days ago
+
topic_revision_recyclerview_tag
ongoing_recycler_view_tag
Abeg select all di correct choices.
- Unsupported app version
- Dis version of di app no longer dey supported. Abeg update am from di Play Store.
- Close app
+ Unsupported app version
+ Dis version of di app no longer dey supported. Abeg update am from di Play Store.
+ Close app
+ App update required
+ A new version of %s don dey available. The new version dey more secure, and dey make your learning sweet.\n\nThis version no dey supported again. To continue to use the app, abeg update am to the latest version.
+ Update
+ Close app
+ New update available
+ A new version of %s don dey available. We go advise sey you update the app for bug fixes so that you go fit learn well.
+ Dismiss
+ Update
+ Update your Android OS
+ We go advise make you update your Android OS to fit enjoy %s\'s new features and lessons.\n\nGo your phone\'s Settings app to update your OS.
+ Dismiss
Developer Build
Alpha
Beta
@@ -438,9 +468,11 @@
Hello! Your app don dey update to di General Availability version. If you experience any problems while you dey use di app, or get any questions, abeg contact us at android-feedback@oppia.org.
No show dis message again
OK
- to
- Enter a ratio in di form x:y.
+ to
+ Enter a ratio in di form x:y.
Tap here to put text.
+ Write the digit for here.
+ Write here.
Smallest text size
Largest text size
Coming Soon
@@ -498,4 +530,52 @@
Abeg select all di correct choices.
You fit select more choices.
No more dan %s choices go dey selected.
+ Survey
+ Previous
+ Submit
+ Leave your feedback for here
+ Continue Survey
+ Exit
+ Exit Survey
+ You sure sey you wan exit the survey?
+ Your feedback go help us serve learners like you well-well. You go like complete a short survey about your experience?
+ Begin Survey
+ Maybe Later
+ Thank you for completing the survey. We hope sey you don enjoy using %s!
+ Exit survey
+ We go like hear how you feel!
+ Thank you
+ 0 - Not at all likely
+ 10 - Extremely likely
+ Abeg select one of the following:
+ I be learner
+ I be teacher
+ I be parent
+ Other
+ How you go feel if you no fit use %s again?
+ Very disappointed
+ Somewhat disappointed
+ Not disappointed
+ N/A - I no dey use %s again
+ We dey happy sey you don enjoy your experience with %s. Abeg share wetin help you the most:
+ Thanks for responding! How we go fit provide better experience for you?
+ Abeg help us improve your experience! Tell us the primary reason for your score:
+ On a scale from 0–10, how likely you dey to recommend %s to a friend or colleague?
+ The previous subtopic na %s
+ The next subtopic na %s
+ App Info
+ Spotlight Overlay Arrow
+ Close Spotlight Button
+ Previous State Navigation Button
+ Developer Options Icon
+ Administrator Controls Icon
+ Options Menu
+ Previous Button
+ Next Button
+ Language Icon
+ Setting Icon
+ Profile Picture Image View
+ Lock Icon
+ Download Status
+ html Content
From 1181ca29caa9b8824eb625a775d69b9d8ddf8b0c Mon Sep 17 00:00:00 2001
From: Ben Henning
Date: Tue, 28 Nov 2023 17:52:50 -0800
Subject: [PATCH 5/7] Fix #5137: Upgrade builds to target SDK 33 (#5222)
## Explanation
Fixes #5137
Partially mitigates #5233
This updates all build & target SDKs for Gradle & Bazel builds to now
target SDK 33, per the new Play Store mandate (see
https://support.google.com/googleplay/android-developer/answer/11926878?hl=en).
The analysis of SDK 33 features, potential issues, and potential
mitigations are described in #5137. It was determined that there are no
obvious code changes needed beyond the minimum to target SDK 33. We'll
be relying on some platform-level regression testing plus the Play
Console's pre-submit app analysis report for finalizing the go/no-go
decision for SDK 33 support.
Testing consisted of manually playing through the app and seeing if
there were any issues using emulators both with SDK 33 and lower
versions. #5137 documents the issues found and their ultimate causes.
Since no functionality changes were needed for SDK 33, no tests needed
updating. Separately, tests are still running on SDK 30 due to being
stuck (see #4748).
One issue unrelated to SDK 33 was observed: when playing through the
prototype lesson, I once again brought the app into a broken state
wherein I couldn't leave the lesson via navigation. We've hit this issue
a few times, but still don't know the root cause. #5233 was filed and a
mitigation was introduced in this PR (+ a test for it): if the
exploration player observes a failure when trying to stop the player
session (for whatever reason), it still proceeds with its "end of
activity" flow (e.g. finishing the activity). This provides at least an
escape hatch for users who somehow hit this state. Note that this isn't
a proper fix for #5233 given the lack of a known root cause, so this is
only considered a mitigation.
The new test was verified as failing if the mitigation is omitted:
![image](https://github.com/oppia/oppia-android/assets/12983742/10ddbf85-332c-4469-8efa-483a967170f9)
Note that ``ExplorationActivityTest``'s setup was tweaked to change the
parent screen since this affects back navigation routing. I opted to
using lessons tab as the parent screen since it's the most common route
for users to hit, so it makes sense for our tests to default to that if
they don't specifically need to use a different route (and none of the
existing tests seemed to have an issue with this change).
## Essential Checklist
- [x] The PR title and explanation each start with "Fix #bugnum: " (If
this PR fixes part of an issue, prefix the title with "Fix part of
#bugnum: ...".)
- [x] Any changes to
[scripts/assets](https://github.com/oppia/oppia-android/tree/develop/scripts/assets)
files have their rationale included in the PR explanation.
- [x] The PR follows the [style
guide](https://github.com/oppia/oppia-android/wiki/Coding-style-guide).
- [x] The PR does not contain any unnecessary code changes from Android
Studio
([reference](https://github.com/oppia/oppia-android/wiki/Guidance-on-submitting-a-PR#undo-unnecessary-changes)).
- [x] The PR is made from a branch that's **not** called "develop" and
is up-to-date with "develop".
- [x] The PR is **assigned** to the appropriate reviewers
([reference](https://github.com/oppia/oppia-android/wiki/Guidance-on-submitting-a-PR#clarification-regarding-assignees-and-reviewers-section)).
## For UI-specific PRs only
N/A -- This isn't changing any UIs directly, and per the analysis in
#5137 it doesn't seem that there are any relevant new UIs enabled in SDK
33 that would affect Oppia.
---
.../action.yml | 4 +--
BUILD.bazel | 4 +--
WORKSPACE | 2 +-
app/build.gradle | 4 +--
app/src/main/AppAndroidManifest.xml | 2 +-
app/src/main/DatabindingAdaptersManifest.xml | 2 +-
app/src/main/DatabindingResourcesManifest.xml | 2 +-
app/src/main/RecyclerviewAdaptersManifest.xml | 2 +-
app/src/main/ViewModelManifest.xml | 2 +-
app/src/main/ViewModelsManifest.xml | 2 +-
app/src/main/ViewsManifest.xml | 2 +-
.../ExplorationActivityPresenter.kt | 34 +++++++++---------
.../exploration/ExplorationActivityTest.kt | 36 ++++++++++++++++++-
app/src/test/resources/robolectric.properties | 2 +-
build_flavors.bzl | 14 ++++----
.../oppia/android/config/AndroidManifest.xml | 2 +-
data/build.gradle | 4 +--
.../src/test/resources/robolectric.properties | 2 +-
domain/build.gradle | 4 +--
domain/src/main/AndroidManifest.xml | 2 +-
.../src/test/resources/robolectric.properties | 2 +-
instrumentation/BUILD.bazel | 2 +-
testing/build.gradle | 4 +--
.../src/test/resources/robolectric.properties | 2 +-
utility/build.gradle | 4 +--
utility/src/main/AndroidManifest.xml | 2 +-
.../src/test/resources/robolectric.properties | 2 +-
27 files changed, 90 insertions(+), 56 deletions(-)
diff --git a/.github/actions/set-up-android-bazel-build-environment/action.yml b/.github/actions/set-up-android-bazel-build-environment/action.yml
index 6b3f5cf1155..6afe9f398a8 100644
--- a/.github/actions/set-up-android-bazel-build-environment/action.yml
+++ b/.github/actions/set-up-android-bazel-build-environment/action.yml
@@ -72,9 +72,9 @@ runs:
$ANDROID_HOME/cmdline-tools/tools/bin/sdkmanager --install "platform-tools"
shell: bash
- - name: Install SDK 31
+ - name: Install SDK 33
run: |
- $ANDROID_HOME/cmdline-tools/tools/bin/sdkmanager --install "platforms;android-31"
+ $ANDROID_HOME/cmdline-tools/tools/bin/sdkmanager --install "platforms;android-33"
shell: bash
- name: Install build tools 29.0.2
diff --git a/BUILD.bazel b/BUILD.bazel
index 28daa546184..cbd6507132e 100644
--- a/BUILD.bazel
+++ b/BUILD.bazel
@@ -118,14 +118,14 @@ package_group(
"flavor": "oppia",
"min_sdk_version": 21,
"multidex": "native",
- "target_sdk_version": 31,
+ "target_sdk_version": 33,
},
{
"flavor": "oppia_kitkat",
"main_dex_list": "//:config/kitkat_main_dex_class_list.txt",
"min_sdk_version": 19,
"multidex": "manual_main_dex",
- "target_sdk_version": 31,
+ "target_sdk_version": 33,
},
]
]
diff --git a/WORKSPACE b/WORKSPACE
index 231078d0d6e..d1d218526cf 100644
--- a/WORKSPACE
+++ b/WORKSPACE
@@ -11,7 +11,7 @@ load("//third_party:versions.bzl", "HTTP_DEPENDENCY_VERSIONS", "get_maven_depend
# TODO(#1542): Sync Android SDK version with the manifest.
android_sdk_repository(
name = "androidsdk",
- api_level = 31,
+ api_level = 33,
build_tools_version = "29.0.2",
)
diff --git a/app/build.gradle b/app/build.gradle
index 72dbb1d3cff..6de6e2c4757 100644
--- a/app/build.gradle
+++ b/app/build.gradle
@@ -6,12 +6,12 @@ apply plugin: 'kotlin-android-extensions'
apply plugin: 'kotlin-kapt'
android {
- compileSdkVersion 31
+ compileSdkVersion 33
buildToolsVersion "29.0.2"
defaultConfig {
applicationId "org.oppia.android"
minSdkVersion 19
- targetSdkVersion 31
+ targetSdkVersion 33
versionCode 1
versionName "1.0"
multiDexEnabled true
diff --git a/app/src/main/AppAndroidManifest.xml b/app/src/main/AppAndroidManifest.xml
index 9a5789e1872..211884a0158 100644
--- a/app/src/main/AppAndroidManifest.xml
+++ b/app/src/main/AppAndroidManifest.xml
@@ -1,5 +1,5 @@
+ android:targetSdkVersion="33" />
diff --git a/app/src/main/DatabindingAdaptersManifest.xml b/app/src/main/DatabindingAdaptersManifest.xml
index 0974b6b3aa6..d3e60f6d5f4 100644
--- a/app/src/main/DatabindingAdaptersManifest.xml
+++ b/app/src/main/DatabindingAdaptersManifest.xml
@@ -1,5 +1,5 @@
+ android:targetSdkVersion="33" />
diff --git a/app/src/main/DatabindingResourcesManifest.xml b/app/src/main/DatabindingResourcesManifest.xml
index 0c3dd8fa35a..c9f98dbf248 100644
--- a/app/src/main/DatabindingResourcesManifest.xml
+++ b/app/src/main/DatabindingResourcesManifest.xml
@@ -1,5 +1,5 @@
+ android:targetSdkVersion="33" />
diff --git a/app/src/main/RecyclerviewAdaptersManifest.xml b/app/src/main/RecyclerviewAdaptersManifest.xml
index f2a3273e765..6585b5ea24c 100644
--- a/app/src/main/RecyclerviewAdaptersManifest.xml
+++ b/app/src/main/RecyclerviewAdaptersManifest.xml
@@ -1,5 +1,5 @@
+ android:targetSdkVersion="33" />
diff --git a/app/src/main/ViewModelManifest.xml b/app/src/main/ViewModelManifest.xml
index 07603e895d8..c6c3e62e26b 100644
--- a/app/src/main/ViewModelManifest.xml
+++ b/app/src/main/ViewModelManifest.xml
@@ -3,5 +3,5 @@
+ android:targetSdkVersion="33" />
diff --git a/app/src/main/ViewModelsManifest.xml b/app/src/main/ViewModelsManifest.xml
index 84693784fd8..e210893ecd0 100644
--- a/app/src/main/ViewModelsManifest.xml
+++ b/app/src/main/ViewModelsManifest.xml
@@ -3,5 +3,5 @@
+ android:targetSdkVersion="33" />
diff --git a/app/src/main/ViewsManifest.xml b/app/src/main/ViewsManifest.xml
index 340e35afe29..b77df4edb19 100644
--- a/app/src/main/ViewsManifest.xml
+++ b/app/src/main/ViewsManifest.xml
@@ -3,5 +3,5 @@
+ android:targetSdkVersion="33" />
diff --git a/app/src/main/java/org/oppia/android/app/player/exploration/ExplorationActivityPresenter.kt b/app/src/main/java/org/oppia/android/app/player/exploration/ExplorationActivityPresenter.kt
index 3efadb513de..cd4a33b2d24 100644
--- a/app/src/main/java/org/oppia/android/app/player/exploration/ExplorationActivityPresenter.kt
+++ b/app/src/main/java/org/oppia/android/app/player/exploration/ExplorationActivityPresenter.kt
@@ -286,25 +286,25 @@ class ExplorationActivityPresenter @Inject constructor(
fun stopExploration(isCompletion: Boolean) {
fontScaleConfigurationUtil.adjustFontScale(activity, ReadingTextSize.MEDIUM_TEXT_SIZE)
- explorationDataController.stopPlayingExploration(isCompletion).toLiveData()
- .observe(
- activity,
- {
- when (it) {
- is AsyncResult.Pending -> oppiaLogger.d("ExplorationActivity", "Stopping exploration")
- is AsyncResult.Failure ->
- oppiaLogger.e("ExplorationActivity", "Failed to stop exploration", it.error)
- is AsyncResult.Success -> {
- oppiaLogger.d("ExplorationActivity", "Successfully stopped exploration")
- if (isCompletion) {
- maybeShowSurveyDialog(profileId, topicId)
- } else {
- backPressActivitySelector()
- }
- }
+ explorationDataController.stopPlayingExploration(isCompletion).toLiveData().observe(activity) {
+ when (it) {
+ is AsyncResult.Pending ->
+ oppiaLogger.d("ExplorationActivity", "Stopping exploration")
+ is AsyncResult.Failure -> {
+ oppiaLogger.e("ExplorationActivity", "Failed to stop exploration", it.error)
+ // Allow the user to always exit if they get into a broken state.
+ backPressActivitySelector()
+ }
+ is AsyncResult.Success -> {
+ oppiaLogger.d("ExplorationActivity", "Successfully stopped exploration")
+ if (isCompletion) {
+ maybeShowSurveyDialog(profileId, topicId)
+ } else {
+ backPressActivitySelector()
}
}
- )
+ }
+ }
}
fun onKeyboardAction(actionCode: Int) {
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 e1cce42d8f3..9e33f7d9948 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
@@ -1897,6 +1897,38 @@ class ExplorationActivityTest {
explorationDataController.stopPlayingExploration(isCompletion = false)
}
+ @Test
+ fun testExpActivity_pressBack_whenProgressControllerBroken_stillEndsActivity() {
+ setUpAudioForFractionLesson()
+ explorationActivityTestRule.launchActivity(
+ createExplorationActivityIntent(
+ internalProfileId,
+ FRACTIONS_TOPIC_ID,
+ FRACTIONS_STORY_ID_0,
+ FRACTIONS_EXPLORATION_ID_0,
+ shouldSavePartialProgress = true
+ )
+ )
+ explorationDataController.startPlayingNewExploration(
+ internalProfileId,
+ FRACTIONS_TOPIC_ID,
+ FRACTIONS_STORY_ID_0,
+ FRACTIONS_EXPLORATION_ID_0
+ )
+ testCoroutineDispatchers.runCurrent()
+
+ // Simulate cases when the data controller enters a bad state by pre-finishing the exploration
+ // prior to trying to exit. While this seems impossible, it's been observed in real situations
+ // without a known cause. If it does happen, the user needs to have an escape hatch to actually
+ // leave. See #5233.
+ explorationDataController.stopPlayingExploration(isCompletion = false)
+ testCoroutineDispatchers.runCurrent()
+ pressBack()
+ testCoroutineDispatchers.runCurrent()
+
+ assertThat(explorationActivityTestRule.activity.isFinishing).isTrue()
+ }
+
@Test
@RunOn(TestPlatform.ROBOLECTRIC) // TODO(#3858): Enable for Espresso.
fun testExpActivity_englishContentLang_contentIsInEnglish() {
@@ -2303,13 +2335,15 @@ class ExplorationActivityTest {
explorationId: String,
shouldSavePartialProgress: Boolean
): Intent {
+ // Note that the parent screen is defaulted to TOPIC_SCREEN_LESSONS_TAB since that's the most
+ // typical route to playing an exploration.
return ExplorationActivity.createExplorationActivityIntent(
ApplicationProvider.getApplicationContext(),
ProfileId.newBuilder().apply { internalId = internalProfileId }.build(),
topicId,
storyId,
explorationId,
- parentScreen = ExplorationActivityParams.ParentScreen.PARENT_SCREEN_UNSPECIFIED,
+ parentScreen = ExplorationActivityParams.ParentScreen.TOPIC_SCREEN_LESSONS_TAB,
shouldSavePartialProgress
)
}
diff --git a/app/src/test/resources/robolectric.properties b/app/src/test/resources/robolectric.properties
index 563d60ad14b..1aafcf8ea7d 100644
--- a/app/src/test/resources/robolectric.properties
+++ b/app/src/test/resources/robolectric.properties
@@ -1,3 +1,3 @@
# app/src/test/resources/robolectric.properties
-# TODO(#4748): Remove the need for this file after upgrading Robolectric tests to API 31
+# TODO(#4748): Remove the need for this file after upgrading Robolectric tests to API 33
sdk=30
diff --git a/build_flavors.bzl b/build_flavors.bzl
index 9052490bf85..0440b171a55 100644
--- a/build_flavors.bzl
+++ b/build_flavors.bzl
@@ -46,7 +46,7 @@ _FLAVOR_METADATA = {
"dev": {
"manifest": "//app:src/main/AndroidManifest.xml",
"min_sdk_version": 21,
- "target_sdk_version": 31,
+ "target_sdk_version": 33,
"multidex": "native",
"proguard_specs": [], # Developer builds are not optimized.
"production_release": False,
@@ -60,7 +60,7 @@ _FLAVOR_METADATA = {
"dev_kitkat": {
"manifest": "//app:src/main/AndroidManifest.xml",
"min_sdk_version": 19,
- "target_sdk_version": 31,
+ "target_sdk_version": 33,
"multidex": "manual_main_dex",
"main_dex_list": _MAIN_DEX_LIST_TARGET_KITKAT,
"proguard_specs": [], # Developer builds are not optimized.
@@ -75,7 +75,7 @@ _FLAVOR_METADATA = {
"alpha": {
"manifest": "//app:src/main/AndroidManifest.xml",
"min_sdk_version": 21,
- "target_sdk_version": 31,
+ "target_sdk_version": 33,
"multidex": "native",
"proguard_specs": _PRODUCTION_PROGUARD_SPECS,
"production_release": True,
@@ -89,7 +89,7 @@ _FLAVOR_METADATA = {
"alpha_kitkat": {
"manifest": "//app:src/main/AndroidManifest.xml",
"min_sdk_version": 19,
- "target_sdk_version": 31,
+ "target_sdk_version": 33,
"multidex": "manual_main_dex",
"main_dex_list": _MAIN_DEX_LIST_TARGET_KITKAT,
"proguard_specs": [],
@@ -104,7 +104,7 @@ _FLAVOR_METADATA = {
"alpha_kenya": {
"manifest": "//app:src/main/AndroidManifest.xml",
"min_sdk_version": 21,
- "target_sdk_version": 31,
+ "target_sdk_version": 33,
"multidex": "native",
"proguard_specs": _PRODUCTION_PROGUARD_SPECS,
"production_release": True,
@@ -118,7 +118,7 @@ _FLAVOR_METADATA = {
"beta": {
"manifest": "//app:src/main/AndroidManifest.xml",
"min_sdk_version": 21,
- "target_sdk_version": 31,
+ "target_sdk_version": 33,
"multidex": "native",
"proguard_specs": _PRODUCTION_PROGUARD_SPECS,
"production_release": True,
@@ -132,7 +132,7 @@ _FLAVOR_METADATA = {
"ga": {
"manifest": "//app:src/main/AndroidManifest.xml",
"min_sdk_version": 21,
- "target_sdk_version": 31,
+ "target_sdk_version": 33,
"multidex": "native",
"proguard_specs": _PRODUCTION_PROGUARD_SPECS,
"production_release": True,
diff --git a/config/src/java/org/oppia/android/config/AndroidManifest.xml b/config/src/java/org/oppia/android/config/AndroidManifest.xml
index 1d3f57544f1..123ff9bc501 100644
--- a/config/src/java/org/oppia/android/config/AndroidManifest.xml
+++ b/config/src/java/org/oppia/android/config/AndroidManifest.xml
@@ -1,5 +1,5 @@
-
+
diff --git a/data/build.gradle b/data/build.gradle
index d51015b8c24..3f02df5e6d0 100644
--- a/data/build.gradle
+++ b/data/build.gradle
@@ -4,12 +4,12 @@ apply plugin: 'kotlin-android-extensions'
apply plugin: 'kotlin-kapt'
android {
- compileSdkVersion 31
+ compileSdkVersion 33
buildToolsVersion "29.0.2"
defaultConfig {
minSdkVersion 19
- targetSdkVersion 31
+ targetSdkVersion 33
versionCode 1
versionName "1.0"
testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner"
diff --git a/data/src/test/resources/robolectric.properties b/data/src/test/resources/robolectric.properties
index e16d090bdb2..19419ffe423 100644
--- a/data/src/test/resources/robolectric.properties
+++ b/data/src/test/resources/robolectric.properties
@@ -1,3 +1,3 @@
# data/src/test/resources/robolectric.properties
-# TODO(#4748): Remove the need for this file after upgrading Robolectric tests to API 31
+# TODO(#4748): Remove the need for this file after upgrading Robolectric tests to API 33
sdk=30
diff --git a/domain/build.gradle b/domain/build.gradle
index b0e246d6e27..f119c351808 100644
--- a/domain/build.gradle
+++ b/domain/build.gradle
@@ -4,12 +4,12 @@ apply plugin: 'kotlin-android-extensions'
apply plugin: 'kotlin-kapt'
android {
- compileSdkVersion 31
+ compileSdkVersion 33
buildToolsVersion "29.0.2"
defaultConfig {
minSdkVersion 19
- targetSdkVersion 31
+ targetSdkVersion 33
versionCode 1
versionName "1.0"
javaCompileOptions {
diff --git a/domain/src/main/AndroidManifest.xml b/domain/src/main/AndroidManifest.xml
index 483a96cc057..ea5a0a7a495 100644
--- a/domain/src/main/AndroidManifest.xml
+++ b/domain/src/main/AndroidManifest.xml
@@ -1,5 +1,5 @@
-
+
diff --git a/domain/src/test/resources/robolectric.properties b/domain/src/test/resources/robolectric.properties
index eb1a9bb98c2..cedb3da0a90 100644
--- a/domain/src/test/resources/robolectric.properties
+++ b/domain/src/test/resources/robolectric.properties
@@ -1,3 +1,3 @@
# domain/src/test/resources/robolectric.properties
-# TODO(#4748): Remove the need for this file after upgrading Robolectric tests to API 31
+# TODO(#4748): Remove the need for this file after upgrading Robolectric tests to API 33
sdk=30
diff --git a/instrumentation/BUILD.bazel b/instrumentation/BUILD.bazel
index 22a68271e54..03c56337516 100644
--- a/instrumentation/BUILD.bazel
+++ b/instrumentation/BUILD.bazel
@@ -18,7 +18,7 @@ android_binary(
manifest_values = {
"applicationId": "org.oppia.android",
"minSdkVersion": "19",
- "targetSdkVersion": "31",
+ "targetSdkVersion": "33",
"versionCode": "0",
"versionName": "0.1-test",
},
diff --git a/testing/build.gradle b/testing/build.gradle
index 65e7a17590e..3116f0df05c 100644
--- a/testing/build.gradle
+++ b/testing/build.gradle
@@ -4,12 +4,12 @@ apply plugin: 'kotlin-android-extensions'
apply plugin: 'kotlin-kapt'
android {
- compileSdkVersion 31
+ compileSdkVersion 33
buildToolsVersion "29.0.2"
defaultConfig {
minSdkVersion 19
- targetSdkVersion 31
+ targetSdkVersion 33
versionCode 1
versionName "1.0"
}
diff --git a/testing/src/test/resources/robolectric.properties b/testing/src/test/resources/robolectric.properties
index df7e21b43c0..12d726938f8 100644
--- a/testing/src/test/resources/robolectric.properties
+++ b/testing/src/test/resources/robolectric.properties
@@ -1,3 +1,3 @@
# testing/src/test/resources/robolectric.properties
-# TODO(#4748): Remove the need for this file after upgrading Robolectric tests to API 31
+# TODO(#4748): Remove the need for this file after upgrading Robolectric tests to API 33
sdk=30
diff --git a/utility/build.gradle b/utility/build.gradle
index 5039f921dd3..39589a8692b 100644
--- a/utility/build.gradle
+++ b/utility/build.gradle
@@ -4,12 +4,12 @@ apply plugin: 'kotlin-android-extensions'
apply plugin: 'kotlin-kapt'
android {
- compileSdkVersion 31
+ compileSdkVersion 33
buildToolsVersion "29.0.2"
defaultConfig {
minSdkVersion 19
- targetSdkVersion 31
+ targetSdkVersion 33
versionCode 1
versionName "1.0"
javaCompileOptions {
diff --git a/utility/src/main/AndroidManifest.xml b/utility/src/main/AndroidManifest.xml
index 5a8bce58b67..d06626d50ac 100644
--- a/utility/src/main/AndroidManifest.xml
+++ b/utility/src/main/AndroidManifest.xml
@@ -1,4 +1,4 @@
-
+
diff --git a/utility/src/test/resources/robolectric.properties b/utility/src/test/resources/robolectric.properties
index 467b28a73b9..7b9532ffcbf 100644
--- a/utility/src/test/resources/robolectric.properties
+++ b/utility/src/test/resources/robolectric.properties
@@ -1,3 +1,3 @@
# utility/src/test/resources/robolectric.properties
-# TODO(#4748): Remove the need for this file after upgrading Robolectric tests to API 31
+# TODO(#4748): Remove the need for this file after upgrading Robolectric tests to API 33
sdk=30
From 87a7676b5019dd33e0a78c83f85be721b1944134 Mon Sep 17 00:00:00 2001
From: Kenneth Murerwa
Date: Wed, 29 Nov 2023 23:10:49 +0300
Subject: [PATCH 6/7] Technical Analytics: Milestone 1 - Add Feature Flag
Statuses and Ability To Sync Them to Cache Store (#5203)
## Explanation
When merged, this PR will:
- Create a new `FeatureFlagConstants.kt` file to contain all feature
flags.
- Create feature flag sync status trackers for each existing feature
flag.
- Modify the `PlatformParameterSyncUpWorker` to allow status trackers of
all feature flags to be synced and cached in the PersistentCacheStore.
- Merge the `TestBooleanPlatformParameter`,
`TestStringPlatformParameter` and the `TestIntegerPlatformParameter`
files into the `TestPlatformParameterConstants` file.
- Add syncing with the web for the `EnableDownloadsSupport`,
`EnableEditAccountsOptionsUi`, `EnableSpotlightUi`,
`EnableExtraTopicTabsUi`, `EnableInteractionConfigChangeStateRetention`,
and `EnableAppAndOsDeprecation` feature flags.
- Write tests for the changes made.
## Essential Checklist
- [x] The PR title and explanation each start with "Fix #bugnum: " (If
this PR fixes part of an issue, prefix the title with "Fix part of
#bugnum: ...".)
- [x] Any changes to
[scripts/assets](https://github.com/oppia/oppia-android/tree/develop/scripts/assets)
files have their rationale included in the PR explanation.
- [x] The PR follows the [style
guide](https://github.com/oppia/oppia-android/wiki/Coding-style-guide).
- [x] The PR does not contain any unnecessary code changes from Android
Studio
([reference](https://github.com/oppia/oppia-android/wiki/Guidance-on-submitting-a-PR#undo-unnecessary-changes)).
- [x] The PR is made from a branch that's **not** called "develop" and
is up-to-date with "develop".
- [x] The PR is **assigned** to the appropriate reviewers
([reference](https://github.com/oppia/oppia-android/wiki/Guidance-on-submitting-a-PR#clarification-regarding-assignees-and-reviewers-section)).
## For UI-specific PRs only
If your PR includes UI-related changes, then:
- Add screenshots for portrait/landscape for both a tablet & phone of
the before & after UI changes
- For the screenshots above, include both English and pseudo-localized
(RTL) screenshots (see [RTL
guide](https://github.com/oppia/oppia-android/wiki/RTL-Guidelines))
- Add a video showing the full UX flow with a screen reader enabled (see
[accessibility
guide](https://github.com/oppia/oppia-android/wiki/Accessibility-A11y-Guide))
- For PRs introducing new UI elements or color changes, both light and
dark mode screenshots must be included
- Add a screenshot demonstrating that you ran affected Espresso tests
locally & that they're passing
---------
Co-authored-by: Adhiambo Peres <59600948+adhiamboperes@users.noreply.github.com>
Co-authored-by: Ben Henning
---
.../PlatformParameterAlphaKenyaModule.kt | 55 ++++--
.../PlatformParameterAlphaModule.kt | 57 +++++--
.../PlatformParameterModule.kt | 58 +++++--
.../PlatformParameterSingletonImpl.kt | 12 +-
.../syncup/PlatformParameterSyncUpWorker.kt | 3 +
.../domain/audio/AudioPlayerControllerTest.kt | 12 +-
.../PlatformParameterSyncUpWorkerTest.kt | 84 ++++++++++
.../ProfileManagementControllerTest.kt | 12 +-
model/src/main/proto/platform_parameter.proto | 13 ++
scripts/assets/test_file_exemptions.textproto | 5 +-
.../testing/platformparameter/BUILD.bazel | 4 +-
.../TestBooleanPlatformParameter.kt | 24 ---
.../TestIntegerPlatformParameter.kt | 24 ---
.../TestPlatformParameterConstants.kt | 68 ++++++++
.../TestStringPlatformParameter.kt | 24 ---
.../platformparameter/FeatureFlagConstants.kt | 157 ++++++++++++++++++
.../PlatformParameterConstants.kt | 123 --------------
.../PlatformParameterValue.kt | 11 +-
.../util/logging/EventBundleCreatorTest.kt | 6 +-
.../KenyaAlphaEventBundleCreatorTest.kt | 6 +-
20 files changed, 486 insertions(+), 272 deletions(-)
delete mode 100644 testing/src/main/java/org/oppia/android/testing/platformparameter/TestBooleanPlatformParameter.kt
delete mode 100644 testing/src/main/java/org/oppia/android/testing/platformparameter/TestIntegerPlatformParameter.kt
create mode 100644 testing/src/main/java/org/oppia/android/testing/platformparameter/TestPlatformParameterConstants.kt
delete mode 100644 testing/src/main/java/org/oppia/android/testing/platformparameter/TestStringPlatformParameter.kt
create mode 100644 utility/src/main/java/org/oppia/android/util/platformparameter/FeatureFlagConstants.kt
diff --git a/domain/src/main/java/org/oppia/android/domain/platformparameter/PlatformParameterAlphaKenyaModule.kt b/domain/src/main/java/org/oppia/android/domain/platformparameter/PlatformParameterAlphaKenyaModule.kt
index 6adc922bc11..376f5abf36e 100644
--- a/domain/src/main/java/org/oppia/android/domain/platformparameter/PlatformParameterAlphaKenyaModule.kt
+++ b/domain/src/main/java/org/oppia/android/domain/platformparameter/PlatformParameterAlphaKenyaModule.kt
@@ -4,9 +4,12 @@ import android.content.Context
import dagger.Module
import dagger.Provides
import org.oppia.android.app.utility.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
@@ -16,6 +19,7 @@ import org.oppia.android.util.platformparameter.ENABLE_LANGUAGE_SELECTION_UI_DEF
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.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
@@ -30,6 +34,7 @@ import org.oppia.android.util.platformparameter.EnableSpotlightUi
import org.oppia.android.util.platformparameter.FAST_LANGUAGE_SWITCHING_IN_LESSON
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.LOWEST_SUPPORTED_API_LEVEL
@@ -56,6 +61,7 @@ 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
@@ -70,8 +76,12 @@ import org.oppia.android.util.platformparameter.SyncUpWorkerTimePeriodHours
class PlatformParameterAlphaKenyaModule {
@Provides
@EnableDownloadsSupport
- fun provideEnableDownloadsSupport(): PlatformParameterValue =
- PlatformParameterValue.createDefaultParameter(ENABLE_DOWNLOADS_SUPPORT_DEFAULT_VALUE)
+ fun provideEnableDownloadsSupport(
+ platformParameterSingleton: PlatformParameterSingleton
+ ): PlatformParameterValue {
+ return platformParameterSingleton.getBooleanPlatformParameter(DOWNLOADS_SUPPORT)
+ ?: PlatformParameterValue.createDefaultParameter(ENABLE_DOWNLOADS_SUPPORT_DEFAULT_VALUE)
+ }
@Provides
@SplashScreenWelcomeMsg
@@ -104,8 +114,12 @@ class PlatformParameterAlphaKenyaModule {
@Provides
@EnableEditAccountsOptionsUi
- fun provideEnableEditAccountsOptionsUi(): PlatformParameterValue {
- return PlatformParameterValue.createDefaultParameter(
+ fun provideEnableEditAccountsOptionsUi(
+ platformParameterSingleton: PlatformParameterSingleton
+ ): PlatformParameterValue {
+ return platformParameterSingleton.getBooleanPlatformParameter(
+ EDIT_ACCOUNTS_OPTIONS_UI
+ ) ?: PlatformParameterValue.createDefaultParameter(
ENABLE_EDIT_ACCOUNTS_OPTIONS_UI_DEFAULT_VALUE
)
}
@@ -199,32 +213,45 @@ class PlatformParameterAlphaKenyaModule {
@Provides
@EnableExtraTopicTabsUi
- fun provideEnableExtraTopicTabsUi(): PlatformParameterValue {
- return PlatformParameterValue.createDefaultParameter(
+ 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(): PlatformParameterValue {
- return PlatformParameterValue.createDefaultParameter(
+ fun provideEnableInteractionConfigChangeStateRetention(
+ platformParameterSingleton: PlatformParameterSingleton
+ ): PlatformParameterValue {
+ return platformParameterSingleton.getBooleanPlatformParameter(
+ INTERACTION_CONFIG_CHANGE_STATE_RETENTION
+ ) ?: PlatformParameterValue.createDefaultParameter(
ENABLE_INTERACTION_CONFIG_CHANGE_STATE_RETENTION_DEFAULT_VALUE
)
}
@Provides
@EnableSpotlightUi
- fun enableSpotlightUi(): PlatformParameterValue {
- return PlatformParameterValue.createDefaultParameter(
- ENABLE_SPOTLIGHT_UI_DEFAULT_VALUE
- )
+ fun provideEnableSpotlightUi(
+ platformParameterSingleton: PlatformParameterSingleton
+ ): PlatformParameterValue {
+ return platformParameterSingleton.getBooleanPlatformParameter(SPOTLIGHT_UI)
+ ?: PlatformParameterValue.createDefaultParameter(ENABLE_SPOTLIGHT_UI_DEFAULT_VALUE)
}
@Provides
@EnableAppAndOsDeprecation
- fun provideEnableAppAndOsDeprecation(): PlatformParameterValue {
- return PlatformParameterValue.createDefaultParameter(
+ fun provideEnableAppAndOsDeprecation(
+ platformParameterSingleton: PlatformParameterSingleton
+ ): PlatformParameterValue {
+ return platformParameterSingleton.getBooleanPlatformParameter(
+ APP_AND_OS_DEPRECATION
+ ) ?: PlatformParameterValue.createDefaultParameter(
ENABLE_APP_AND_OS_DEPRECATION_DEFAULT_VALUE
)
}
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 7ca4dcc66b0..6574762dae5 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
@@ -4,9 +4,12 @@ import android.content.Context
import dagger.Module
import dagger.Provides
import org.oppia.android.app.utility.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
@@ -15,6 +18,7 @@ import org.oppia.android.util.platformparameter.ENABLE_INTERACTION_CONFIG_CHANGE
import org.oppia.android.util.platformparameter.ENABLE_LANGUAGE_SELECTION_UI_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.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
@@ -30,6 +34,7 @@ import org.oppia.android.util.platformparameter.FAST_LANGUAGE_SWITCHING_IN_LESSO
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
@@ -57,6 +62,7 @@ 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
@@ -67,8 +73,12 @@ import org.oppia.android.util.platformparameter.SyncUpWorkerTimePeriodHours
class PlatformParameterAlphaModule {
@Provides
@EnableDownloadsSupport
- fun provideEnableDownloadsSupport(): PlatformParameterValue =
- PlatformParameterValue.createDefaultParameter(ENABLE_DOWNLOADS_SUPPORT_DEFAULT_VALUE)
+ fun provideEnableDownloadsSupport(
+ platformParameterSingleton: PlatformParameterSingleton
+ ): PlatformParameterValue {
+ return platformParameterSingleton.getBooleanPlatformParameter(DOWNLOADS_SUPPORT)
+ ?: PlatformParameterValue.createDefaultParameter(ENABLE_DOWNLOADS_SUPPORT_DEFAULT_VALUE)
+ }
@Provides
@SplashScreenWelcomeMsg
@@ -101,8 +111,12 @@ class PlatformParameterAlphaModule {
@Provides
@EnableEditAccountsOptionsUi
- fun provideEnableEditAccountsOptionsUi(): PlatformParameterValue {
- return PlatformParameterValue.createDefaultParameter(
+ fun provideEnableEditAccountsOptionsUi(
+ platformParameterSingleton: PlatformParameterSingleton
+ ): PlatformParameterValue {
+ return platformParameterSingleton.getBooleanPlatformParameter(
+ EDIT_ACCOUNTS_OPTIONS_UI
+ ) ?: PlatformParameterValue.createDefaultParameter(
ENABLE_EDIT_ACCOUNTS_OPTIONS_UI_DEFAULT_VALUE
)
}
@@ -195,31 +209,46 @@ class PlatformParameterAlphaModule {
@Provides
@EnableSpotlightUi
- fun provideEnableSpotlightUi(): PlatformParameterValue =
- PlatformParameterValue.createDefaultParameter(true) // Enable spotlights for alpha users.
+ fun provideEnableSpotlightUi(
+ platformParameterSingleton: PlatformParameterSingleton
+ ): PlatformParameterValue {
+ return platformParameterSingleton.getBooleanPlatformParameter(SPOTLIGHT_UI)
+ ?: PlatformParameterValue.createDefaultParameter(true) // Enable spotlights for alpha users.
+ }
@Provides
@EnableExtraTopicTabsUi
- fun provideEnableExtraTopicTabsUi(): PlatformParameterValue {
- return PlatformParameterValue.createDefaultParameter(
+ 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(): PlatformParameterValue {
- return PlatformParameterValue.createDefaultParameter(
+ 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(): PlatformParameterValue {
- return PlatformParameterValue.createDefaultParameter(
- ENABLE_APP_AND_OS_DEPRECATION_DEFAULT_VALUE
- )
+ fun provideEnableAppAndOsDeprecation(
+ platformParameterSingleton: PlatformParameterSingleton
+ ): PlatformParameterValue {
+ return platformParameterSingleton.getBooleanPlatformParameter(APP_AND_OS_DEPRECATION)
+ ?: PlatformParameterValue.createDefaultParameter(
+ ENABLE_APP_AND_OS_DEPRECATION_DEFAULT_VALUE
+ )
}
@Provides
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 26e25bd3590..4acd5804929 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
@@ -4,9 +4,12 @@ import android.content.Context
import dagger.Module
import dagger.Provides
import org.oppia.android.app.utility.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
@@ -16,6 +19,7 @@ import org.oppia.android.util.platformparameter.ENABLE_LANGUAGE_SELECTION_UI_DEF
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.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
@@ -31,6 +35,7 @@ import org.oppia.android.util.platformparameter.FAST_LANGUAGE_SWITCHING_IN_LESSO
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
@@ -59,6 +64,7 @@ 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
@@ -69,8 +75,12 @@ import org.oppia.android.util.platformparameter.SyncUpWorkerTimePeriodHours
class PlatformParameterModule {
@Provides
@EnableDownloadsSupport
- fun provideEnableDownloadsSupport(): PlatformParameterValue =
- PlatformParameterValue.createDefaultParameter(ENABLE_DOWNLOADS_SUPPORT_DEFAULT_VALUE)
+ fun provideEnableDownloadsSupport(
+ platformParameterSingleton: PlatformParameterSingleton
+ ): PlatformParameterValue {
+ return platformParameterSingleton.getBooleanPlatformParameter(DOWNLOADS_SUPPORT)
+ ?: PlatformParameterValue.createDefaultParameter(ENABLE_DOWNLOADS_SUPPORT_DEFAULT_VALUE)
+ }
@Provides
@SplashScreenWelcomeMsg
@@ -103,8 +113,12 @@ class PlatformParameterModule {
@Provides
@EnableEditAccountsOptionsUi
- fun provideEnableEditAccountsOptionsUi(): PlatformParameterValue {
- return PlatformParameterValue.createDefaultParameter(
+ fun provideEnableEditAccountsOptionsUi(
+ platformParameterSingleton: PlatformParameterSingleton
+ ): PlatformParameterValue {
+ return platformParameterSingleton.getBooleanPlatformParameter(
+ EDIT_ACCOUNTS_OPTIONS_UI
+ ) ?: PlatformParameterValue.createDefaultParameter(
ENABLE_EDIT_ACCOUNTS_OPTIONS_UI_DEFAULT_VALUE
)
}
@@ -197,34 +211,46 @@ class PlatformParameterModule {
@Provides
@EnableSpotlightUi
- fun provideEnableSpotlightUi(): PlatformParameterValue {
- return PlatformParameterValue.createDefaultParameter(
- ENABLE_SPOTLIGHT_UI_DEFAULT_VALUE
- )
+ fun provideEnableSpotlightUi(
+ platformParameterSingleton: PlatformParameterSingleton
+ ): PlatformParameterValue {
+ return platformParameterSingleton.getBooleanPlatformParameter(SPOTLIGHT_UI)
+ ?: PlatformParameterValue.createDefaultParameter(ENABLE_SPOTLIGHT_UI_DEFAULT_VALUE)
}
@Provides
@EnableExtraTopicTabsUi
- fun provideEnableExtraTopicTabsUi(): PlatformParameterValue {
- return PlatformParameterValue.createDefaultParameter(
+ 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(): PlatformParameterValue {
- return PlatformParameterValue.createDefaultParameter(
+ 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(): PlatformParameterValue {
- return PlatformParameterValue.createDefaultParameter(
- ENABLE_APP_AND_OS_DEPRECATION_DEFAULT_VALUE
- )
+ fun provideEnableAppAndOsDeprecation(
+ platformParameterSingleton: PlatformParameterSingleton
+ ): PlatformParameterValue {
+ return platformParameterSingleton.getBooleanPlatformParameter(APP_AND_OS_DEPRECATION)
+ ?: PlatformParameterValue.createDefaultParameter(
+ ENABLE_APP_AND_OS_DEPRECATION_DEFAULT_VALUE
+ )
}
@Provides
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 b672ad6cdf9..0a72d4b6b44 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
@@ -24,8 +24,8 @@ class PlatformParameterSingletonImpl @Inject constructor() : PlatformParameterSi
val parameter = platformParameterMap[platformParameterName] ?: return null
if (!parameter.valueTypeCase.equals(PlatformParameter.ValueTypeCase.STRING)) return null
return object : PlatformParameterValue {
- override val value: String
- get() = parameter.string
+ override val value = parameter.string
+ override val syncStatus = parameter.syncStatus
}
}
@@ -36,8 +36,8 @@ class PlatformParameterSingletonImpl @Inject constructor() : PlatformParameterSi
val parameter = platformParameterMap[platformParameterName] ?: return null
if (!parameter.valueTypeCase.equals(PlatformParameter.ValueTypeCase.INTEGER)) return null
return object : PlatformParameterValue {
- override val value: Int
- get() = parameter.integer
+ override val value = parameter.integer
+ override val syncStatus = parameter.syncStatus
}
}
@@ -48,8 +48,8 @@ class PlatformParameterSingletonImpl @Inject constructor() : PlatformParameterSi
val parameter = platformParameterMap[platformParameterName] ?: return null
if (!parameter.valueTypeCase.equals(PlatformParameter.ValueTypeCase.BOOLEAN)) return null
return object : PlatformParameterValue {
- override val value: Boolean
- get() = parameter.boolean
+ override val value = parameter.boolean
+ override val syncStatus = parameter.syncStatus
}
}
}
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 aaf5aad0a0d..164f7fea914 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
@@ -11,6 +11,7 @@ import kotlinx.coroutines.CoroutineScope
import kotlinx.coroutines.ExperimentalCoroutinesApi
import kotlinx.coroutines.async
import org.oppia.android.app.model.PlatformParameter
+import org.oppia.android.app.model.PlatformParameter.SyncStatus
import org.oppia.android.app.utility.getVersionName
import org.oppia.android.data.backends.gae.api.PlatformParameterService
import org.oppia.android.domain.oppialogger.OppiaLogger
@@ -82,6 +83,7 @@ class PlatformParameterSyncUpWorker private constructor(
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 String -> platformParameter.string = value
is Int -> platformParameter.integer = value
@@ -111,6 +113,7 @@ class PlatformParameterSyncUpWorker private constructor(
if (response != null) {
val responseBody = checkNotNull(response.body())
val platformParameterList = parseNetworkResponse(responseBody)
+
if (platformParameterList.isEmpty()) {
throw IllegalArgumentException(EMPTY_RESPONSE_EXCEPTION_MSG)
}
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 1730f091d1b..1854ec26330 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
@@ -841,9 +841,9 @@ class AudioPlayerControllerTest {
fun provideLearnerStudyAnalytics(): PlatformParameterValue {
// Snapshot the value so that it doesn't change between injection and use.
val enableFeature = enableLearnerStudyAnalytics
- return object : PlatformParameterValue {
- override val value: Boolean = enableFeature
- }
+ return PlatformParameterValue.createDefaultParameter(
+ defaultValue = enableFeature
+ )
}
@Provides
@@ -852,9 +852,9 @@ class AudioPlayerControllerTest {
fun provideLoggingLearnerStudyIds(): PlatformParameterValue {
// Snapshot the value so that it doesn't change between injection and use.
val enableFeature = enableLearnerStudyAnalytics
- return object : PlatformParameterValue {
- override val value: Boolean = enableFeature
- }
+ return PlatformParameterValue.createDefaultParameter(
+ defaultValue = enableFeature
+ )
}
}
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 ad16b301201..82e756c79e6 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
@@ -25,6 +25,7 @@ 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.BaseUrl
import org.oppia.android.data.backends.gae.JsonPrefixNetworkInterceptor
import org.oppia.android.data.backends.gae.NetworkApiKey
@@ -95,21 +96,25 @@ class PlatformParameterSyncUpWorkerTest {
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
@@ -322,6 +327,85 @@ class PlatformParameterSyncUpWorkerTest {
.containsEntry(TEST_INTEGER_PARAM_NAME, defaultTestIntegerParameter)
}
+ @Test
+ fun testSyncUpWorker_getFeatureFlags_addSyncStatusFlags_verifyCorrectStatusReturned() {
+ // Set up versionName to get correct network response from mock platform parameter service.
+ setUpApplicationForContext(MockPlatformParameterService.appVersionForCorrectResponse)
+
+ // 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() {
+ // Set up versionName to get incorrect network response from mock platform parameter service.
+ setUpApplicationForContext(MockPlatformParameterService.appVersionForEmptyResponse)
+
+ // 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() {
ApplicationProvider.getApplicationContext().inject(this)
}
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 62733f8119c..e95142771be 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
@@ -1356,9 +1356,9 @@ class ProfileManagementControllerTest {
fun provideLearnerStudyAnalytics(): PlatformParameterValue {
// Snapshot the value so that it doesn't change between injection and use.
val enableFeature = enableLearnerStudyAnalytics
- return object : PlatformParameterValue {
- override val value: Boolean = enableFeature
- }
+ return PlatformParameterValue.createDefaultParameter(
+ defaultValue = enableFeature
+ )
}
@Provides
@@ -1367,9 +1367,9 @@ class ProfileManagementControllerTest {
fun provideLoggingLearnerStudyIds(): PlatformParameterValue {
// Snapshot the value so that it doesn't change between injection and use.
val enableFeature = enableLearnerStudyAnalytics
- return object : PlatformParameterValue {
- override val value: Boolean = enableFeature
- }
+ return PlatformParameterValue.createDefaultParameter(
+ defaultValue = enableFeature
+ )
}
}
diff --git a/model/src/main/proto/platform_parameter.proto b/model/src/main/proto/platform_parameter.proto
index 67f9fd6d772..58e45f8325c 100644
--- a/model/src/main/proto/platform_parameter.proto
+++ b/model/src/main/proto/platform_parameter.proto
@@ -18,6 +18,19 @@ message PlatformParameter {
// Indicates a string-typed platform parameter.
string string = 4;
}
+ // Indicates the sync status of the platform parameter.
+ SyncStatus sync_status = 5;
+
+ enum SyncStatus {
+ // Indicates that the sync status isn't yet known.
+ SYNC_STATUS_UNSPECIFIED = 0;
+
+ // Indicates that the parameter isn't yet synced with the remote server.
+ NOT_SYNCED_FROM_SERVER = 1;
+
+ // Indicates the parameter's value has been synced with the remote server.
+ SYNCED_FROM_SERVER = 2;
+ }
}
// Format of platform parameters stored on disk. It closely resembles the JSON response in cache.
diff --git a/scripts/assets/test_file_exemptions.textproto b/scripts/assets/test_file_exemptions.textproto
index 382bd7c1efa..dac453e5d9b 100644
--- a/scripts/assets/test_file_exemptions.textproto
+++ b/scripts/assets/test_file_exemptions.textproto
@@ -798,10 +798,8 @@ exempted_file_path: "testing/src/main/java/org/oppia/android/testing/network/Moc
exempted_file_path: "testing/src/main/java/org/oppia/android/testing/network/MockSubtopicService.kt"
exempted_file_path: "testing/src/main/java/org/oppia/android/testing/network/MockTopicService.kt"
exempted_file_path: "testing/src/main/java/org/oppia/android/testing/network/RetrofitTestModule.kt"
-exempted_file_path: "testing/src/main/java/org/oppia/android/testing/platformparameter/TestBooleanPlatformParameter.kt"
-exempted_file_path: "testing/src/main/java/org/oppia/android/testing/platformparameter/TestIntegerPlatformParameter.kt"
+exempted_file_path: "testing/src/main/java/org/oppia/android/testing/platformparameter/TestPlatformParameterConstants.kt"
exempted_file_path: "testing/src/main/java/org/oppia/android/testing/platformparameter/TestPlatformParameterModule.kt"
-exempted_file_path: "testing/src/main/java/org/oppia/android/testing/platformparameter/TestStringPlatformParameter.kt"
exempted_file_path: "testing/src/main/java/org/oppia/android/testing/robolectric/IsOnRobolectric.kt"
exempted_file_path: "testing/src/main/java/org/oppia/android/testing/robolectric/RobolectricModule.kt"
exempted_file_path: "testing/src/main/java/org/oppia/android/testing/threading/BackgroundTestDispatcher.kt"
@@ -887,6 +885,7 @@ exempted_file_path: "utility/src/main/java/org/oppia/android/util/parser/svg/Svg
exempted_file_path: "utility/src/main/java/org/oppia/android/util/parser/svg/SvgDecoder.kt"
exempted_file_path: "utility/src/main/java/org/oppia/android/util/parser/svg/SvgPictureDrawable.kt"
exempted_file_path: "utility/src/main/java/org/oppia/android/util/parser/svg/TextSvgDrawableTranscoder.kt"
+exempted_file_path: "utility/src/main/java/org/oppia/android/util/platformparameter/FeatureFlagConstants.kt"
exempted_file_path: "utility/src/main/java/org/oppia/android/util/platformparameter/PlatformParameterConstants.kt"
exempted_file_path: "utility/src/main/java/org/oppia/android/util/platformparameter/PlatformParameterValue.kt"
exempted_file_path: "utility/src/main/java/org/oppia/android/util/statusbar/StatusBarColor.kt"
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 a724de2135e..2ef5618b8fc 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
@@ -10,9 +10,7 @@ kt_android_library(
name = "test_constants",
testonly = True,
srcs = [
- "TestBooleanPlatformParameter.kt",
- "TestIntegerPlatformParameter.kt",
- "TestStringPlatformParameter.kt",
+ "TestPlatformParameterConstants.kt",
],
visibility = [
"//:oppia_testing_visibility",
diff --git a/testing/src/main/java/org/oppia/android/testing/platformparameter/TestBooleanPlatformParameter.kt b/testing/src/main/java/org/oppia/android/testing/platformparameter/TestBooleanPlatformParameter.kt
deleted file mode 100644
index de74d381739..00000000000
--- a/testing/src/main/java/org/oppia/android/testing/platformparameter/TestBooleanPlatformParameter.kt
+++ /dev/null
@@ -1,24 +0,0 @@
-package org.oppia.android.testing.platformparameter
-
-import javax.inject.Qualifier
-
-/**
- * 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
diff --git a/testing/src/main/java/org/oppia/android/testing/platformparameter/TestIntegerPlatformParameter.kt b/testing/src/main/java/org/oppia/android/testing/platformparameter/TestIntegerPlatformParameter.kt
deleted file mode 100644
index 956d3f1d4e0..00000000000
--- a/testing/src/main/java/org/oppia/android/testing/platformparameter/TestIntegerPlatformParameter.kt
+++ /dev/null
@@ -1,24 +0,0 @@
-package org.oppia.android.testing.platformparameter
-
-import javax.inject.Qualifier
-
-/**
- * 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
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
new file mode 100644
index 00000000000..a904314f795
--- /dev/null
+++ b/testing/src/main/java/org/oppia/android/testing/platformparameter/TestPlatformParameterConstants.kt
@@ -0,0 +1,68 @@
+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
diff --git a/testing/src/main/java/org/oppia/android/testing/platformparameter/TestStringPlatformParameter.kt b/testing/src/main/java/org/oppia/android/testing/platformparameter/TestStringPlatformParameter.kt
deleted file mode 100644
index 330623e1ba4..00000000000
--- a/testing/src/main/java/org/oppia/android/testing/platformparameter/TestStringPlatformParameter.kt
+++ /dev/null
@@ -1,24 +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"
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
new file mode 100644
index 00000000000..dd45a5a3ae2
--- /dev/null
+++ b/utility/src/main/java/org/oppia/android/util/platformparameter/FeatureFlagConstants.kt
@@ -0,0 +1,157 @@
+package org.oppia.android.util.platformparameter
+
+import javax.inject.Qualifier
+
+/**
+ * This file contains all the constants that are associated with individual Feature Flags.
+ * These constants are:
+ * - Qualifier Annotation
+ * - Feature Flag Name - The name begins with Enable_
+ * - Feature Flag Default Value
+ * - Feature Flag Status - A boolean that keeps track of whether the feature flag
+ * has been synced with Oppia Web.
+ */
+
+/**
+ * Qualifier for the feature flag that controls whether the user has support for manually
+ * downloading topics.
+ */
+@Qualifier annotation class EnableDownloadsSupport
+
+/** Name of the feature flag that controls whether to enable downloads support. */
+const val DOWNLOADS_SUPPORT = "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 language selection UI. */
+@Qualifier
+annotation class EnableLanguageSelectionUi
+
+/** Default value for the feature flag corresponding to [EnableLanguageSelectionUi]. */
+const val ENABLE_LANGUAGE_SELECTION_UI_DEFAULT_VALUE = true
+
+/**
+ * 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 = "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.
+ */
+@Qualifier
+annotation class EnableLearnerStudyAnalytics
+
+/**
+ * Name of the feature flag that controls the visibility of [ProfileAndDeviceIdActivity]
+ * and working of learner study related analytics logging.
+ */
+const val LEARNER_STUDY_ANALYTICS = "learner_study_analytics"
+
+/**
+ * Default value of the feature flag that controls the visibility of [ProfileAndDeviceIdActivity]
+ * and working of learner study related analytics logging.
+ */
+const val LEARNER_STUDY_ANALYTICS_DEFAULT_VALUE = false
+
+/**
+ * Qualifier for a feature flag that controls whether learners may be allowed (via an
+ * admin-controlled setting) to use a special in-lesson button for quickly switching between content
+ * languages.
+ *
+ * This is generally expected to only be used in tandem with [EnableLearnerStudyAnalytics].
+ */
+@Qualifier annotation class EnableFastLanguageSwitchingInLesson
+
+/** The feature flag name corresponding to [EnableFastLanguageSwitchingInLesson]. */
+const val FAST_LANGUAGE_SWITCHING_IN_LESSON = "fast_language_switching_in_lesson"
+
+/**
+ * The default enabled state for the feature corresponding to [EnableFastLanguageSwitchingInLesson].
+ */
+const val FAST_LANGUAGE_SWITCHING_IN_LESSON_DEFAULT_VALUE = false
+
+/**
+ * Qualifier for a feature flag that controls whether learner study IDs should be generated and
+ * logged with outgoing events.
+ *
+ * This is generally expected to only be used in tandem with [EnableLearnerStudyAnalytics].
+ */
+@Qualifier annotation class EnableLoggingLearnerStudyIds
+
+/** The feature flag name corresponding to [EnableLoggingLearnerStudyIds]. */
+const val LOGGING_LEARNER_STUDY_IDS = "logging_learner_study_ids"
+
+/** The default enabled state for the feature corresponding to [EnableLoggingLearnerStudyIds]. */
+const val LOGGING_LEARNER_STUDY_IDS_DEFAULT_VALUE = false
+
+/** Qualifier for the feature flag corresponding to enabling the edit accounts options. */
+@Qualifier
+annotation class EnableEditAccountsOptionsUi
+
+/** Name of the feature flag that controls whether to enable the edit account options UI. */
+const val EDIT_ACCOUNTS_OPTIONS_UI = "edit_accounts_options_ui"
+
+/** Default value for the feature flag corresponding to [EnableEditAccountsOptionsUi]. */
+const val ENABLE_EDIT_ACCOUNTS_OPTIONS_UI_DEFAULT_VALUE = false
+
+/** Qualifier for the feature flag that controls whether to record performance metrics. */
+@Qualifier
+annotation class EnablePerformanceMetricsCollection
+
+/** Name of the feature flag that controls whether to record performance metrics. */
+const val ENABLE_PERFORMANCE_METRICS_COLLECTION = "enable_performance_metrics_collection"
+
+/** Default value for whether to record performance metrics. */
+const val ENABLE_PERFORMANCE_METRICS_COLLECTION_DEFAULT_VALUE = false
+
+/** Qualifier for the feature flag corresponding to enabling the spotlight UI. */
+@Qualifier
+annotation class EnableSpotlightUi
+
+/** Name of the feature flag that controls whether to enable the spotlight UI. */
+const val SPOTLIGHT_UI = "spotlight_ui"
+
+/** Default value for the feature flag corresponding to [EnableSpotlightUi]. */
+const val ENABLE_SPOTLIGHT_UI_DEFAULT_VALUE = false
+
+/**
+ * Qualifier for the feature flag that controls whether input interaction state is correctly
+ * retained across configuration changes.
+ */
+@Qualifier
+annotation class EnableInteractionConfigChangeStateRetention
+
+/**
+ * Name of the feature flag that controls whether input interaction state is correctly retained
+ * across configuration changes.
+ */
+const val INTERACTION_CONFIG_CHANGE_STATE_RETENTION = "interaction_config_change_state_retention"
+
+/**
+ * Default value for feature flag corresponding to [EnableInteractionConfigChangeStateRetention].
+ */
+const val ENABLE_INTERACTION_CONFIG_CHANGE_STATE_RETENTION_DEFAULT_VALUE = false
+
+/**
+ * Qualifier for the [EnableAppAndOsDeprecation] feature flag that controls whether to enable
+ * app and OS deprecation or not.
+ */
+@Qualifier
+annotation class EnableAppAndOsDeprecation
+
+/** Name of the feature flag that controls whether to enable app and os deprecation. */
+const val APP_AND_OS_DEPRECATION = "app_and_os_deprecation"
+
+/**
+ * Default value for the feature flag corresponding to [EnableAppAndOsDeprecation].
+ */
+const val ENABLE_APP_AND_OS_DEPRECATION_DEFAULT_VALUE = false
diff --git a/utility/src/main/java/org/oppia/android/util/platformparameter/PlatformParameterConstants.kt b/utility/src/main/java/org/oppia/android/util/platformparameter/PlatformParameterConstants.kt
index fa0deba044c..46121ebf7d9 100644
--- a/utility/src/main/java/org/oppia/android/util/platformparameter/PlatformParameterConstants.kt
+++ b/utility/src/main/java/org/oppia/android/util/platformparameter/PlatformParameterConstants.kt
@@ -10,15 +10,6 @@ import javax.inject.Qualifier
* - Platform Parameter Default Value
*/
-/**
- * Qualifier for the platform parameter that controls whether the user has support for manually
- * downloading topics.
- */
-@Qualifier annotation class EnableDownloadsSupport
-
-/** Default value for feature flag corresponding to [EnableDownloadsSupport]. */
-const val ENABLE_DOWNLOADS_SUPPORT_DEFAULT_VALUE = false
-
/**
* Name of the platform parameter that automatically updates topics when a user toggles the
* switch in the [AdministratorControlsFragmentPresenter].
@@ -75,72 +66,6 @@ const val SYNC_UP_WORKER_TIME_PERIOD_IN_HOURS = "sync_up_worker_time_period"
*/
const val SYNC_UP_WORKER_TIME_PERIOD_IN_HOURS_DEFAULT_VALUE = 12
-/** Qualifier for the feature flag corresponding to enabling the language selection UI. */
-@Qualifier
-annotation class EnableLanguageSelectionUi
-
-/** Default value for the feature flag corresponding to [EnableLanguageSelectionUi]. */
-const val ENABLE_LANGUAGE_SELECTION_UI_DEFAULT_VALUE = true
-
-/**
- * Qualifier for the feature flag corresponding to enabling the extra topic tabs: practice and info.
- */
-@Qualifier
-annotation class EnableExtraTopicTabsUi
-
-/** Default value for the feature flag corresponding to [EnableExtraTopicTabsUi]. */
-const val ENABLE_EXTRA_TOPIC_TABS_UI_DEFAULT_VALUE = false
-
-/**
- * Qualifier for the platform parameter that controls the visibility of [ProfileAndDeviceIdActivity]
- * and working of learner study related analytics logging.
- */
-@Qualifier
-annotation class EnableLearnerStudyAnalytics
-
-/**
- * Name of the platform parameter that controls the visibility of [ProfileAndDeviceIdActivity]
- * and working of learner study related analytics logging.
- */
-const val LEARNER_STUDY_ANALYTICS = "learner_study_analytics"
-
-/**
- * Default value of the platform parameter that controls the visibility of [ProfileAndDeviceIdActivity]
- * and working of learner study related analytics logging.
- */
-const val LEARNER_STUDY_ANALYTICS_DEFAULT_VALUE = false
-
-/**
- * Qualifier for a feature flag that controls whether learners may be allowed (via an
- * admin-controlled setting) to use a special in-lesson button for quickly switching between content
- * languages.
- *
- * This is generally expected to only be used in tandem with [EnableLearnerStudyAnalytics].
- */
-@Qualifier annotation class EnableFastLanguageSwitchingInLesson
-
-/** The platform parameter name corresponding to [EnableFastLanguageSwitchingInLesson]. */
-const val FAST_LANGUAGE_SWITCHING_IN_LESSON = "fast_language_switching_in_lesson"
-
-/**
- * The default enabled state for the feature corresponding to [EnableFastLanguageSwitchingInLesson].
- */
-const val FAST_LANGUAGE_SWITCHING_IN_LESSON_DEFAULT_VALUE = false
-
-/**
- * Qualifier for a feature flag that controls whether learner study IDs should be generated and
- * logged with outgoing events.
- *
- * This is generally expected to only be used in tandem with [EnableLearnerStudyAnalytics].
- */
-@Qualifier annotation class EnableLoggingLearnerStudyIds
-
-/** The platform parameter name corresponding to [EnableLoggingLearnerStudyIds]. */
-const val LOGGING_LEARNER_STUDY_IDS = "logging_learner_study_ids"
-
-/** The default enabled state for the feature corresponding to [EnableLoggingLearnerStudyIds]. */
-const val LOGGING_LEARNER_STUDY_IDS_DEFAULT_VALUE = false
-
/**
* Qualifier for the platform parameter that controls whether to cache LaTeX rendering using Glide.
*/
@@ -153,23 +78,6 @@ const val CACHE_LATEX_RENDERING = "cache_latex_rendering"
/** Default value for whether to cache LaTeX rendering using Glide. */
const val CACHE_LATEX_RENDERING_DEFAULT_VALUE = true
-/** Qualifier for the feature flag corresponding to enabling the edit accounts options. */
-@Qualifier
-annotation class EnableEditAccountsOptionsUi
-
-/** Default value for the feature flag corresponding to [EnableEditAccountsOptionsUi]. */
-const val ENABLE_EDIT_ACCOUNTS_OPTIONS_UI_DEFAULT_VALUE = false
-
-/** Qualifier for the platform parameter that controls whether to record performance metrics. */
-@Qualifier
-annotation class EnablePerformanceMetricsCollection
-
-/** Name of the platform parameter that controls whether to record performance metrics. */
-const val ENABLE_PERFORMANCE_METRICS_COLLECTION = "enable_performance_metrics_collection"
-
-/** Default value for whether to record performance metrics. */
-const val ENABLE_PERFORMANCE_METRICS_COLLECTION_DEFAULT_VALUE = false
-
/**
* Qualifier for the platform parameter that controls the time interval in minutes of uploading
* previously recorded performance metrics to the remote service.
@@ -232,37 +140,6 @@ const val PERFORMANCE_METRICS_COLLECTION_LOW_FREQUENCY_TIME_INTERVAL_IN_MINUTES
const val PERFORMANCE_METRICS_COLLECTION_LOW_FREQUENCY_TIME_INTERVAL_IN_MINUTES_DEFAULT_VAL =
1440
-/** Qualifier for the feature flag corresponding to enabling the spotlight UI. */
-@Qualifier
-annotation class EnableSpotlightUi
-
-/** Default value for the feature flag corresponding to [EnableSpotlightUi]. */
-const val ENABLE_SPOTLIGHT_UI_DEFAULT_VALUE = false
-
-/**
- * Qualifier for the platform parameter that controls whether input interaction state is correctly
- * retained across configuration changes.
- */
-@Qualifier
-annotation class EnableInteractionConfigChangeStateRetention
-
-/**
- * Default value for feature flag corresponding to [EnableInteractionConfigChangeStateRetention].
- */
-const val ENABLE_INTERACTION_CONFIG_CHANGE_STATE_RETENTION_DEFAULT_VALUE = false
-
-/**
- * Qualifier for the [EnableAppAndOsDeprecation] feature flag that controls whether to enable
- * app and OS deprecation or not.
- */
-@Qualifier
-annotation class EnableAppAndOsDeprecation
-
-/**
- * Default value for the feature flag corresponding to [EnableAppAndOsDeprecation].
- */
-const val ENABLE_APP_AND_OS_DEPRECATION_DEFAULT_VALUE = false
-
/**
* Qualifier for the platform parameter that contains the version code of the latest available
* optional app update, which is used to notify the app that a soft update is available.
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 309574d9660..beefdee92bb 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,6 +1,7 @@
package org.oppia.android.util.platformparameter
import org.oppia.android.app.model.PlatformParameter
+import org.oppia.android.app.model.PlatformParameter.SyncStatus
/**
* Generic interface that is used to provide platform parameter values corresponding to the
@@ -9,16 +10,20 @@ import org.oppia.android.app.model.PlatformParameter
*/
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): PlatformParameterValue {
+ fun createDefaultParameter(
+ defaultValue: T,
+ defaultSyncStatus: SyncStatus = SyncStatus.NOT_SYNCED_FROM_SERVER
+ ): PlatformParameterValue {
return object : PlatformParameterValue {
- override val value: T
- get() = defaultValue
+ override val value = defaultValue
+ override val syncStatus = defaultSyncStatus
}
}
}
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 d2062e9097f..db424118e1f 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
@@ -2414,9 +2414,9 @@ class EventBundleCreatorTest {
fun provideLoggingLearnerStudyIds(): PlatformParameterValue {
// Snapshot the value so that it doesn't change between injection and use.
val enableFeature = enableLoggingLearnerStudyIds
- return object : PlatformParameterValue {
- override val value: Boolean = enableFeature
- }
+ return PlatformParameterValue.createDefaultParameter(
+ defaultValue = enableFeature
+ )
}
}
diff --git a/utility/src/test/java/org/oppia/android/util/logging/KenyaAlphaEventBundleCreatorTest.kt b/utility/src/test/java/org/oppia/android/util/logging/KenyaAlphaEventBundleCreatorTest.kt
index 562f16b4337..3ec4c2f5169 100644
--- a/utility/src/test/java/org/oppia/android/util/logging/KenyaAlphaEventBundleCreatorTest.kt
+++ b/utility/src/test/java/org/oppia/android/util/logging/KenyaAlphaEventBundleCreatorTest.kt
@@ -1581,9 +1581,9 @@ class KenyaAlphaEventBundleCreatorTest {
fun provideLoggingLearnerStudyIds(): PlatformParameterValue {
// Snapshot the value so that it doesn't change between injection and use.
val enableFeature = enableLoggingLearnerStudyIds
- return object : PlatformParameterValue {
- override val value: Boolean = enableFeature
- }
+ return PlatformParameterValue.createDefaultParameter(
+ defaultValue = enableFeature
+ )
}
}
From 176b268191baea9772db081d53ad9bb13f2916a7 Mon Sep 17 00:00:00 2001
From: Deon Olarewaju
Date: Fri, 1 Dec 2023 11:32:38 +0100
Subject: [PATCH 7/7] Fix #5246: "Update the Android FAQ" (#5247)
## Explanation
Fixes #5246: "Update the Android FAQ"
1. Changed the order in which the FAQ questions where arranged by
refactoring the property name of each string to the appropriate one
based on requirements from #5246.
2. Added new questions based on requirements from #5246.
3. Refactored the faq question property names in the tests written in
FAQListFragmentTest.kt according to the new order in which the questions
where arranged.
4. Created a string extension file in string extensions to check if
string resource contains a placeholder, to be able to dynamically
replace the placeholders with the appropriate string values.
5. Used the string extension to check if any string resource file from
the FAQ questions and answers contains a placeholder, then call function
to replace placeholder with appropriate string value.
https://github.com/oppia/oppia-android/assets/54560535/d2c0b6cb-251b-4591-9221-1d95a308cc74
https://github.com/oppia/oppia-android/assets/54560535/7b409e30-e9f6-4b4b-80ed-5449678a184f
## Essential Checklist
- [x] The PR title and explanation each start with "Fix #bugnum: " (If
this PR fixes part of an issue, prefix the title with "Fix part of
#bugnum: ...".)
- [x] Any changes to
[scripts/assets](https://github.com/oppia/oppia-android/tree/develop/scripts/assets)
files have their rationale included in the PR explanation.
- [x] The PR follows the [style
guide](https://github.com/oppia/oppia-android/wiki/Coding-style-guide).
- [x] The PR does not contain any unnecessary code changes from Android
Studio
([reference](https://github.com/oppia/oppia-android/wiki/Guidance-on-submitting-a-PR#undo-unnecessary-changes)).
- [x] The PR is made from a branch that's **not** called "develop" and
is up-to-date with "develop".
- [x] The PR is **assigned** to the appropriate reviewers
([reference](https://github.com/oppia/oppia-android/wiki/Guidance-on-submitting-a-PR#clarification-regarding-assignees-and-reviewers-section)).
---
.../android/app/help/faq/FAQListViewModel.kt | 14 +++---
app/src/main/res/values-ar/strings.xml | 32 ++++++-------
app/src/main/res/values-pcm-rNG/strings.xml | 32 ++++++-------
app/src/main/res/values-pt-rBR/strings.xml | 32 ++++++-------
app/src/main/res/values-sw/strings.xml | 32 ++++++-------
app/src/main/res/values/faqs.xml | 10 ++++
app/src/main/res/values/strings.xml | 47 ++++++++++++-------
.../android/app/faq/FAQListFragmentTest.kt | 18 +++----
.../util/extensions/StringExtensions.kt | 11 +++++
9 files changed, 131 insertions(+), 97 deletions(-)
diff --git a/app/src/main/java/org/oppia/android/app/help/faq/FAQListViewModel.kt b/app/src/main/java/org/oppia/android/app/help/faq/FAQListViewModel.kt
index c2b2ca975ec..3bc22a714a9 100644
--- a/app/src/main/java/org/oppia/android/app/help/faq/FAQListViewModel.kt
+++ b/app/src/main/java/org/oppia/android/app/help/faq/FAQListViewModel.kt
@@ -7,6 +7,7 @@ import org.oppia.android.app.help.faq.faqItemViewModel.FAQHeaderViewModel
import org.oppia.android.app.help.faq.faqItemViewModel.FAQItemViewModel
import org.oppia.android.app.translation.AppLanguageResourceHandler
import org.oppia.android.app.viewmodel.ObservableViewModel
+import org.oppia.android.util.extensions.containsPlaceholderRegex
import javax.inject.Inject
/** View model in [FAQListFragment]. */
@@ -28,10 +29,11 @@ class FAQListViewModel @Inject constructor(
private fun retrieveQuestionsOrAnswers(questionsOrAnswers: List): List {
val appName = resourceHandler.getStringInLocale(R.string.app_name)
- return questionsOrAnswers.mapIndexed { index, questionOrAnswer ->
- if (index == QUESTION_INDEX_WITH_OPPIA_REFERENCE) {
- resourceHandler.formatInLocaleWithWrapping(questionOrAnswer, appName)
- } else questionOrAnswer
+
+ return questionsOrAnswers.map {
+ if (it.containsPlaceholderRegex())
+ resourceHandler.formatInLocaleWithWrapping(it, appName)
+ else it
}
}
@@ -40,8 +42,4 @@ class FAQListViewModel @Inject constructor(
private fun retrieveAnswers(): List =
retrieveQuestionsOrAnswers(resourceHandler.getStringArrayInLocale(R.array.faq_answers))
-
- private companion object {
- private const val QUESTION_INDEX_WITH_OPPIA_REFERENCE = 3
- }
}
diff --git a/app/src/main/res/values-ar/strings.xml b/app/src/main/res/values-ar/strings.xml
index 5cf88b6abee..0f4af6a8622 100644
--- a/app/src/main/res/values-ar/strings.xml
+++ b/app/src/main/res/values-ar/strings.xml
@@ -498,22 +498,22 @@
شروط الخدمة
باستخدام %s ، فإنك توافق على<br><oppia-noninteractive-policy link=\"tos\"> شروط الخدمة</oppia-noninteractive-policy> و<oppia-noninteractive-policy link=\"privacy\"> سياسة الخصوصية</oppia-noninteractive-policy> .
يرجى زيارة <a href=\"https://www.oppia.org/terms\">هذه الصفحة</a> للحصول على أحدث نسخة من هذه الشروط.
- كيف يمكنني إنشاء ملف تعريف(حساب) جديد؟
- كيف يمكنني حذف ملف التعريف(حساب)؟
- كيف يمكنني تغيير بريدي الإلكتروني / رقم هاتفي؟
- ما هي %s؟
- من هو المشرف؟
- لماذا لا يتم تحميل مشغل الاستكشاف؟
- لماذا لا يتم تشغيل الصوت الخاص بي؟
- لا أجد سؤالي هنا. ماذا الان؟
- <p>إذا كانت هذه هي المرة الأولى التي تنشئ فيها ملفًا شخصيًا وليس لديك رقم تعريف شخصي: <ol><li> من منتقي الملف الشخصي ، اضغط على<strong> قم بإعداد ملفات تعريف متعددة</strong></li><li> قم بإنشاء رقم تعريف شخصي و<strong>احفظ</strong></li><li> املأ جميع البيانات للملف الشخصي.<ol><li>(اختياري) قم بتحميل صورة.</li> <li>إدخال اسم.</li> <li>(اختياري) قم بتعيين رقم تعريف شخصي مكون من 3 أرقام.</li></ol></li><li> اضغط<strong>إنشاء</strong> . تمت إضافة هذا الملف الشخصي إلى منتقي ملف التعريف الخاص بك!</li></ol></p><p> إذا قمت بإنشاء ملف تعريف من قبل ولديك رقم تعريف شخصي:<ol><li> من منتقي الملف الشخصي ، اضغط على<strong>إضافة الملف الشخصي</strong></li> <li> أدخل رقم التعريف الشخصي الخاص بك وانقر فوق<strong>إرسال</strong></li><li> املأ جميع الحقول للملف الشخصي. <ol> <li>(اختياري) قم بتحميل صورة.</li> <li>إدخال اسم.</li> <li>(اختياري) قم بتعيين رقم تعريف شخصي مكون من 3 أرقام. </li></ol></li><li> اضغط<strong>إنشاء</strong> . تمت إضافة هذا الملف الشخصي إلى منتقي ملف التعريف الخاص بك!</li></ol></p><br><p> ملاحظة: فقط ال<u>مدير</u> قادر على إدارة الملفات الشخصية.</p>
- <p>بمجرد حذف ملف التعريف:</p><ol><li>لا يمكن استعادة ملف التعريف.</li><li>سيتم حذف معلومات الملف الشخصي مثل الاسم والصور والتقدم بشكل دائم.</li></ol><p>لحذف ملف تعريف (باستثناء<u>المسؤول</u>):</p><ol><li> من الصفحة الرئيسية للمسؤول ، اضغط على زر القائمة أعلى اليسار.</li><li> اضغط على<strong>ضوابط المسؤول</strong>. </li><li> اضغط على<strong>تحرير ملفات التعريف</strong>.</li><li> اضغط على الملف الشخصي الذي ترغب في حذفه.</li><li> في الجزء السفلي من الشاشة ، انقر فوق<strong>حذف الملف الشخصي</strong>. </li><li> اضغط<strong>حذف</strong>لتأكيد الحذف. </li></ol><p><br></p><p> ملاحظة:<u>المسؤول</u>فقط هو القادر على إدارة الملفات الشخصية.</p>
- <p>لتغيير بريدك الإلكتروني / رقم هاتفك:</p><ol><li> من الصفحة الرئيسية للمشرف ، اضغط على زر القائمة أعلى اليسار.</li><li> اضغط على <strong> عناصر تحكم المسؤول </strong>.</li><li> اضغط على <strong> تعديل الحساب </strong>.</li></ol><p><br></p> <p>إذا كنت تريد تغيير بريدك الإلكتروني:</p><ol><li>أدخل بريدك الإلكتروني الجديد وانقر على <strong> حفظ </strong>.</li><li> يتم إرسال رابط التأكيد لتأكيد بريدك الإلكتروني الجديد. ستنتهي صلاحية الرابط بعد 24 ساعة ويجب النقر عليه لربطه بحسابك.</li></ol><p><br></p> <p>في حالة تغيير رقم هاتفك: </p><ol><li> أدخل رقم هاتفك الجديد وانقر على <strong> تحقق </strong>.</li><li> يتم إرسال رمز لتأكيد رقمك الجديد. ستنتهي صلاحية الرمز بعد 5 دقائق ويجب إدخاله في الشاشة الجديدة لربطه بحسابك.</li></ol>
- <p>%1$s <i>\"أو-بي-يا\"</i>(فنلندية) - \"للتعلم\"</p><p><br></p><p>%1$sمهمتنا هي مساعدة أي شخص على تعلم أي شيء يريده بطريقة فعالة وممتعة.</p><p><br></p><p>من خلال إنشاء مجموعة من الدروس المجانية عالية الجودة والفعالة بشكل واضح بمساعدة معلمين من جميع أنحاء العالم ، تهدف %1$s إلى تزويد الطلاب بتعليم جيد - بغض النظر عن مكان وجودهم أو الموارد التقليدية التي يمكنهم الوصول إليها.</p><p><br></p><p>كطالب ، يمكنك أن تبدأ مغامرتك التعليمية من خلال تصفح الموضوعات المدرجة في الصفحة الرئيسية!</p>
- <p>المشرف هو المستخدم الرئيسي الذي يدير ملفات التعريف والإعدادات لكل ملف تعريف على حسابه. هم على الأرجح والدك أو معلمك أو وصي عليك الذي أنشأ هذا الملف الشخصي لك.</p><p><br></p><p>يمكن للمسؤولين إدارة الملفات الشخصية وتعيين أرقام التعريف الشخصية وتغيير الإعدادات الأخرى ضمن حساباتهم. بناءً على ملف التعريف الخاص بك ، قد تكون أذونات المسؤول مطلوبة لبعض الميزات مثل تنزيل الموضوعات وتغيير رقم التعريف الشخصي وغير ذلك.</p><p><br></p><p>لمعرفة من هو المسؤول لديك ، انتقل إلى منتقي الملف الشخصي. الملف الشخصي الأول المدرج ولديه \"المسؤول\" مكتوب باسمه هو المسؤول.</p>
- <p>إذا لم يتم تحميل مشغل الاستكشاف</p><p><br></p><p>تحقق لمعرفة ما إذا كان التطبيق محدثًا أم لا:</p><p> <ul> <li> انتقل إلى متجر Play وتأكد من تحديث التطبيق إلى أحدث إصدار </li></ul><p><br></p><p>تحقق من اتصالك بالإنترنت:</p><ul><li> إذا كان اتصالك بالإنترنت بطيئًا ، فحاول إعادة الاتصال بشبكة Wi-Fi أو الاتصال بشبكة أخرى. </li></ul><p>اطلب من المشرف التحقق من أجهزتهم واتصال الإنترنت:</p><ul><li> اطلب من المشرف استكشاف الأخطاء وإصلاحها باستخدام الخطوات المذكورة أعلاه </li></ul><p>أخبرنا إذا كنت لا تزال تواجه مشكلات في التحميل:</p><ul><li> أبلغ عن مشكلة عن طريق الاتصال بنا على admin@oppia.org. </li></ul>
- <p>إذا لم يتم تشغيل الصوت الخاص بك</p><p><br></p><p>تحقق لمعرفة ما إذا كان التطبيق محدثًا أم لا:</p><ul><li>انتقل إلى متجر Play وتأكد من تحديث التطبيق إلى أحدث إصدار</li></ul><p><br></p><p>تحقق من اتصالك بالإنترنت:</p><ul><li>إذا كان اتصالك بالإنترنت بطيئًا ، فحاول إعادة الاتصال بشبكة Wi-Fi أو الاتصال بشبكة أخرى. قد يتسبب الإنترنت البطيء في تحميل الصوت بشكل غير منتظم ، مما يجعل من الصعب تشغيله.</li></ul><p><br></p><p>اطلب من المسؤول التحقق من أجهزتهم واتصال الإنترنت:</p><ul><li>اطلب من المسؤول استكشاف الأخطاء وإصلاحها باستخدام الخطوات المذكورة أعلاه</li></ul><p><br></p><p>أخبرنا إذا كنت لا تزال تواجه مشكلات في التحميل:</p><ul><li>أبلغ عن مشكلة عن طريق الاتصال بنا على admin@oppia.org.</li></ul>
- <p> إذا لم تتمكن من العثور على سؤالك أو كنت ترغب في الإبلاغ عن خطأ ، فاتصل بنا على admin@oppia.org. </p>
+ كيف يمكنني إنشاء ملف تعريف(حساب) جديد؟
+ كيف يمكنني حذف ملف التعريف(حساب)؟
+ كيف يمكنني تغيير بريدي الإلكتروني / رقم هاتفي؟
+ ما هي %s؟
+ من هو المشرف؟
+ لماذا لا يتم تحميل مشغل الاستكشاف؟
+ لماذا لا يتم تشغيل الصوت الخاص بي؟
+ لا أجد سؤالي هنا. ماذا الان؟
+ <p>إذا كانت هذه هي المرة الأولى التي تنشئ فيها ملفًا شخصيًا وليس لديك رقم تعريف شخصي: <ol><li> من منتقي الملف الشخصي ، اضغط على<strong> قم بإعداد ملفات تعريف متعددة</strong></li><li> قم بإنشاء رقم تعريف شخصي و<strong>احفظ</strong></li><li> املأ جميع البيانات للملف الشخصي.<ol><li>(اختياري) قم بتحميل صورة.</li> <li>إدخال اسم.</li> <li>(اختياري) قم بتعيين رقم تعريف شخصي مكون من 3 أرقام.</li></ol></li><li> اضغط<strong>إنشاء</strong> . تمت إضافة هذا الملف الشخصي إلى منتقي ملف التعريف الخاص بك!</li></ol></p><p> إذا قمت بإنشاء ملف تعريف من قبل ولديك رقم تعريف شخصي:<ol><li> من منتقي الملف الشخصي ، اضغط على<strong>إضافة الملف الشخصي</strong></li> <li> أدخل رقم التعريف الشخصي الخاص بك وانقر فوق<strong>إرسال</strong></li><li> املأ جميع الحقول للملف الشخصي. <ol> <li>(اختياري) قم بتحميل صورة.</li> <li>إدخال اسم.</li> <li>(اختياري) قم بتعيين رقم تعريف شخصي مكون من 3 أرقام. </li></ol></li><li> اضغط<strong>إنشاء</strong> . تمت إضافة هذا الملف الشخصي إلى منتقي ملف التعريف الخاص بك!</li></ol></p><br><p> ملاحظة: فقط ال<u>مدير</u> قادر على إدارة الملفات الشخصية.</p>
+ <p>بمجرد حذف ملف التعريف:</p><ol><li>لا يمكن استعادة ملف التعريف.</li><li>سيتم حذف معلومات الملف الشخصي مثل الاسم والصور والتقدم بشكل دائم.</li></ol><p>لحذف ملف تعريف (باستثناء<u>المسؤول</u>):</p><ol><li> من الصفحة الرئيسية للمسؤول ، اضغط على زر القائمة أعلى اليسار.</li><li> اضغط على<strong>ضوابط المسؤول</strong>. </li><li> اضغط على<strong>تحرير ملفات التعريف</strong>.</li><li> اضغط على الملف الشخصي الذي ترغب في حذفه.</li><li> في الجزء السفلي من الشاشة ، انقر فوق<strong>حذف الملف الشخصي</strong>. </li><li> اضغط<strong>حذف</strong>لتأكيد الحذف. </li></ol><p><br></p><p> ملاحظة:<u>المسؤول</u>فقط هو القادر على إدارة الملفات الشخصية.</p>
+ <p>لتغيير بريدك الإلكتروني / رقم هاتفك:</p><ol><li> من الصفحة الرئيسية للمشرف ، اضغط على زر القائمة أعلى اليسار.</li><li> اضغط على <strong> عناصر تحكم المسؤول </strong>.</li><li> اضغط على <strong> تعديل الحساب </strong>.</li></ol><p><br></p> <p>إذا كنت تريد تغيير بريدك الإلكتروني:</p><ol><li>أدخل بريدك الإلكتروني الجديد وانقر على <strong> حفظ </strong>.</li><li> يتم إرسال رابط التأكيد لتأكيد بريدك الإلكتروني الجديد. ستنتهي صلاحية الرابط بعد 24 ساعة ويجب النقر عليه لربطه بحسابك.</li></ol><p><br></p> <p>في حالة تغيير رقم هاتفك: </p><ol><li> أدخل رقم هاتفك الجديد وانقر على <strong> تحقق </strong>.</li><li> يتم إرسال رمز لتأكيد رقمك الجديد. ستنتهي صلاحية الرمز بعد 5 دقائق ويجب إدخاله في الشاشة الجديدة لربطه بحسابك.</li></ol>
+ <p>%1$s <i>\"أو-بي-يا\"</i>(فنلندية) - \"للتعلم\"</p><p><br></p><p>%1$sمهمتنا هي مساعدة أي شخص على تعلم أي شيء يريده بطريقة فعالة وممتعة.</p><p><br></p><p>من خلال إنشاء مجموعة من الدروس المجانية عالية الجودة والفعالة بشكل واضح بمساعدة معلمين من جميع أنحاء العالم ، تهدف %1$s إلى تزويد الطلاب بتعليم جيد - بغض النظر عن مكان وجودهم أو الموارد التقليدية التي يمكنهم الوصول إليها.</p><p><br></p><p>كطالب ، يمكنك أن تبدأ مغامرتك التعليمية من خلال تصفح الموضوعات المدرجة في الصفحة الرئيسية!</p>
+ <p>المشرف هو المستخدم الرئيسي الذي يدير ملفات التعريف والإعدادات لكل ملف تعريف على حسابه. هم على الأرجح والدك أو معلمك أو وصي عليك الذي أنشأ هذا الملف الشخصي لك.</p><p><br></p><p>يمكن للمسؤولين إدارة الملفات الشخصية وتعيين أرقام التعريف الشخصية وتغيير الإعدادات الأخرى ضمن حساباتهم. بناءً على ملف التعريف الخاص بك ، قد تكون أذونات المسؤول مطلوبة لبعض الميزات مثل تنزيل الموضوعات وتغيير رقم التعريف الشخصي وغير ذلك.</p><p><br></p><p>لمعرفة من هو المسؤول لديك ، انتقل إلى منتقي الملف الشخصي. الملف الشخصي الأول المدرج ولديه \"المسؤول\" مكتوب باسمه هو المسؤول.</p>
+ <p>إذا لم يتم تحميل مشغل الاستكشاف</p><p><br></p><p>تحقق لمعرفة ما إذا كان التطبيق محدثًا أم لا:</p><p> <ul> <li> انتقل إلى متجر Play وتأكد من تحديث التطبيق إلى أحدث إصدار </li></ul><p><br></p><p>تحقق من اتصالك بالإنترنت:</p><ul><li> إذا كان اتصالك بالإنترنت بطيئًا ، فحاول إعادة الاتصال بشبكة Wi-Fi أو الاتصال بشبكة أخرى. </li></ul><p>اطلب من المشرف التحقق من أجهزتهم واتصال الإنترنت:</p><ul><li> اطلب من المشرف استكشاف الأخطاء وإصلاحها باستخدام الخطوات المذكورة أعلاه </li></ul><p>أخبرنا إذا كنت لا تزال تواجه مشكلات في التحميل:</p><ul><li> أبلغ عن مشكلة عن طريق الاتصال بنا على admin@oppia.org. </li></ul>
+ <p>إذا لم يتم تشغيل الصوت الخاص بك</p><p><br></p><p>تحقق لمعرفة ما إذا كان التطبيق محدثًا أم لا:</p><ul><li>انتقل إلى متجر Play وتأكد من تحديث التطبيق إلى أحدث إصدار</li></ul><p><br></p><p>تحقق من اتصالك بالإنترنت:</p><ul><li>إذا كان اتصالك بالإنترنت بطيئًا ، فحاول إعادة الاتصال بشبكة Wi-Fi أو الاتصال بشبكة أخرى. قد يتسبب الإنترنت البطيء في تحميل الصوت بشكل غير منتظم ، مما يجعل من الصعب تشغيله.</li></ul><p><br></p><p>اطلب من المسؤول التحقق من أجهزتهم واتصال الإنترنت:</p><ul><li>اطلب من المسؤول استكشاف الأخطاء وإصلاحها باستخدام الخطوات المذكورة أعلاه</li></ul><p><br></p><p>أخبرنا إذا كنت لا تزال تواجه مشكلات في التحميل:</p><ul><li>أبلغ عن مشكلة عن طريق الاتصال بنا على admin@oppia.org.</li></ul>
+ <p> إذا لم تتمكن من العثور على سؤالك أو كنت ترغب في الإبلاغ عن خطأ ، فاتصل بنا على admin@oppia.org. </p>
نشاط اختبار جزء تحرير ملف التعريف
يتحكم المسؤول في نشاط اختبار التجزئة
أكمل دراستك
diff --git a/app/src/main/res/values-pcm-rNG/strings.xml b/app/src/main/res/values-pcm-rNG/strings.xml
index b79f8985c41..e5c5defae96 100644
--- a/app/src/main/res/values-pcm-rNG/strings.xml
+++ b/app/src/main/res/values-pcm-rNG/strings.xml
@@ -507,22 +507,22 @@
Terms of Service
By using %s, you dey agree to our <br> <oppia-noninteractive-policy link=\"tos\">Terms of Service</oppia-noninteractive-policy> and <oppia-noninteractive-policy link=\"privacy\">Privacy Policy</oppia-noninteractive-policy>.
Abeg visit <a href=\"https://www.oppia.org/terms\">dis page</a> for di latest version of dese terms.
- How I go fit create a new profile?
- How I go delete a profile?
- How I go take change my email/phone nomba?
- Wetin be %s?
- Who be Administrator?
- Why di Exploration player no dey load?
- Why my audio no dey play?
- I no dey find my question here. What now?
- <p>If na your first time creating a profile and not have a PIN:<ol><li>From di Profile Chooser, tap on <strong>Set up Multiple Profiles</strong>.</li><li>Create a PIN and <strong>Save</strong>.</li><li>Fill in all boxes for di profile.<ol><li>(Optional) Upload a photo.</li><li>Enter a name.</li><li>(Optional) Assign a 3-digit PIN.</li></ol></li><li>Tap <strong>Create</strong>. Dis profile go add to your Profile Chooser!</li></ol></p><p> If you don create a profile before and you get a PIN:<ol><li>From di Profile Chooser, tap on <strong>Add Profile</strong>. </li><li>Enter your PIN and tap <strong>Submit</strong>. </li><li>Fill in all boxes for di profile.<ol><li> (Optional) Upload a photo. </li><li> Enter a name. </li><li> (Optional) Assign a 3-digit PIN. </li></ol></li><li>Tap <strong>Create</strong>. Dis profile go add to your Profile Chooser!</li></ol></p><br><p>Note: Only di <u>Administrator</u> go dey able to manage profiles.</p>
- <p>Once profile don delete:</p><ol><li>Di profile no fit dey recovered. </li><li> Profile information such as name, photos, and progress go permanently delete. </li></ol><p>To delete a profile (excluding the <u>Administrator\'s</u>):</p><ol><li> From di Administrator\'s Home Page, tap on di menu button on di top left. </li><li>Tap on <strong>Administrator Controls</strong>. </li><li>Tap on <strong>Edit Profiles</strong>. </li><li>Tap on di Profile wey you wan delete. </li><li>For di bottom of di screen, tap <strong>Profile Deletion</strong>. </li><li>Tap <strong>Delete</strong> to confirm deletion. </li></ol><p><br></p><p>Note: Only di <u>Administrator</u> go dey able to manage profiles.</p>
- <p>To change your email/phone nomba:</p><ol><li>From di Administrator\'s Home Page, tap on di menu button for di top left.</li><li>Tap on <strong>Administrator Controls</strong>.</li><li>Tap on <strong>Edit Account</strong>.</li></ol><p><br></p> <p>If you wan change your email:</p><ol><li>Enter your new email and tap <strong>Save</strong>.</li><li>A confirmation link go send to confirm your new email. Di link go expire after 24 hours and you must click on am to be associated with your account.</li></ol><p><br></p> <p>If you dey change your phone nomba:</p><ol><li> Enter your new phone nomba and tap <strong>Verify</strong>.</li><li> A code go send to confirm your new nomba. Di code go expire after 5 minutes and you must be enter am in for di new screen to be associated with your account.</li></ol>
- <p>%1$s <i>\"O-pee-yah\"</i> (Finnish) - \"to learn\"</p><p><br></p><p>%1$s\'s mission na to help anyone learn anything dey want in an effective and enjoyable way.</p><p><br></p><p>By creating a set of free, high-quality, demonstrably effective lessons with di help of educators from around di world, %1$s dey aim to provide students with quality education — regardless of where dem dey or di traditional resources wey dem get access to.</p><p><br></p><p>As a student, you fit start your learning adventure by browsing di topics listed on di Home Page!</p>
- <p>An Administrator na di main user wey dey manage profiles and settings for every profile on top their account. They fit be your parent, teacher, or guardian wey don create dis profile for you. </p><p><br></p><p>Administrators get di ability to manage profiles, assign PINs, and change other settings under their account. Depending on your profile, Administrator permissions fit dey required for some features such as changing your PIN, and more. </p><p><br></p><p>To see who your Administrator be, go di Profile Chooser. Di first profile fot di list and get \"Administrator\" written under their name na di Administrator. </p>
- <p>If di Exploration Player no dey load</p><p><br></p><p>Check to see if di app dey up to date:</p><p><ul><li> Go to di Play Store and make sure sey di app dey updated to di latest version </li></ul><p><br></p><p>Check your internet connection:</p><ul><li> If your internet connection dey slow, try re-connecting to your Wi-Fi network or connecting to a different network. </li></ul><p>Ask di Administrator to check their device and internet connection:</p><ul><li> Get di Administrator to troubleshoot using di steps above </li></ul><p>Let us know if you still dey get issues with loading:</p><ul><li> Report a problem by contacting us at admin@oppia.org. </li></ul>
- <p>If your audio no dey play</p><p><br></p><p>Check to see if di app dey up to date:</p><ul><li> Go to di Play Store and make sure sey di app dey updated to di latest version </li></ul><p><br></p><p>Check your internet connection:</p><ul><li> If your internet connection dey slow, try re-connecting to your Wi-Fi network or connecting to a different network. Slow internet fit cause di audio to load irregularly, and go make am difficult to play. </li></ul><p><br></p><p>Ask di Administrator to check their device and internet connection:</p><ul><li> Get di Administrator to troubleshoot using di steps for up</li></ul><p><br></p><p>Let us know if you still dey get issues with loading:</p><ul><li> Report a problem by contacting us at admin@oppia.org. </li></ul>
- <p>If you no fit find your question or you go like to report a bug, contact us for admin@oppia.org.</p>
+ How I go fit create a new profile?
+ How I go delete a profile?
+ How I go take change my email/phone nomba?
+ Wetin be %s?
+ Who be Administrator?
+ Why di Exploration player no dey load?
+ Why my audio no dey play?
+ I no dey find my question here. What now?
+ <p>If na your first time creating a profile and not have a PIN:<ol><li>From di Profile Chooser, tap on <strong>Set up Multiple Profiles</strong>.</li><li>Create a PIN and <strong>Save</strong>.</li><li>Fill in all boxes for di profile.<ol><li>(Optional) Upload a photo.</li><li>Enter a name.</li><li>(Optional) Assign a 3-digit PIN.</li></ol></li><li>Tap <strong>Create</strong>. Dis profile go add to your Profile Chooser!</li></ol></p><p> If you don create a profile before and you get a PIN:<ol><li>From di Profile Chooser, tap on <strong>Add Profile</strong>. </li><li>Enter your PIN and tap <strong>Submit</strong>. </li><li>Fill in all boxes for di profile.<ol><li> (Optional) Upload a photo. </li><li> Enter a name. </li><li> (Optional) Assign a 3-digit PIN. </li></ol></li><li>Tap <strong>Create</strong>. Dis profile go add to your Profile Chooser!</li></ol></p><br><p>Note: Only di <u>Administrator</u> go dey able to manage profiles.</p>
+ <p>Once profile don delete:</p><ol><li>Di profile no fit dey recovered. </li><li> Profile information such as name, photos, and progress go permanently delete. </li></ol><p>To delete a profile (excluding the <u>Administrator\'s</u>):</p><ol><li> From di Administrator\'s Home Page, tap on di menu button on di top left. </li><li>Tap on <strong>Administrator Controls</strong>. </li><li>Tap on <strong>Edit Profiles</strong>. </li><li>Tap on di Profile wey you wan delete. </li><li>For di bottom of di screen, tap <strong>Profile Deletion</strong>. </li><li>Tap <strong>Delete</strong> to confirm deletion. </li></ol><p><br></p><p>Note: Only di <u>Administrator</u> go dey able to manage profiles.</p>
+ <p>To change your email/phone nomba:</p><ol><li>From di Administrator\'s Home Page, tap on di menu button for di top left.</li><li>Tap on <strong>Administrator Controls</strong>.</li><li>Tap on <strong>Edit Account</strong>.</li></ol><p><br></p> <p>If you wan change your email:</p><ol><li>Enter your new email and tap <strong>Save</strong>.</li><li>A confirmation link go send to confirm your new email. Di link go expire after 24 hours and you must click on am to be associated with your account.</li></ol><p><br></p> <p>If you dey change your phone nomba:</p><ol><li> Enter your new phone nomba and tap <strong>Verify</strong>.</li><li> A code go send to confirm your new nomba. Di code go expire after 5 minutes and you must be enter am in for di new screen to be associated with your account.</li></ol>
+ <p>%1$s <i>\"O-pee-yah\"</i> (Finnish) - \"to learn\"</p><p><br></p><p>%1$s\'s mission na to help anyone learn anything dey want in an effective and enjoyable way.</p><p><br></p><p>By creating a set of free, high-quality, demonstrably effective lessons with di help of educators from around di world, %1$s dey aim to provide students with quality education — regardless of where dem dey or di traditional resources wey dem get access to.</p><p><br></p><p>As a student, you fit start your learning adventure by browsing di topics listed on di Home Page!</p>
+ <p>An Administrator na di main user wey dey manage profiles and settings for every profile on top their account. They fit be your parent, teacher, or guardian wey don create dis profile for you. </p><p><br></p><p>Administrators get di ability to manage profiles, assign PINs, and change other settings under their account. Depending on your profile, Administrator permissions fit dey required for some features such as changing your PIN, and more. </p><p><br></p><p>To see who your Administrator be, go di Profile Chooser. Di first profile fot di list and get \"Administrator\" written under their name na di Administrator. </p>
+ <p>If di Exploration Player no dey load</p><p><br></p><p>Check to see if di app dey up to date:</p><p><ul><li> Go to di Play Store and make sure sey di app dey updated to di latest version </li></ul><p><br></p><p>Check your internet connection:</p><ul><li> If your internet connection dey slow, try re-connecting to your Wi-Fi network or connecting to a different network. </li></ul><p>Ask di Administrator to check their device and internet connection:</p><ul><li> Get di Administrator to troubleshoot using di steps above </li></ul><p>Let us know if you still dey get issues with loading:</p><ul><li> Report a problem by contacting us at admin@oppia.org. </li></ul>
+ <p>If your audio no dey play</p><p><br></p><p>Check to see if di app dey up to date:</p><ul><li> Go to di Play Store and make sure sey di app dey updated to di latest version </li></ul><p><br></p><p>Check your internet connection:</p><ul><li> If your internet connection dey slow, try re-connecting to your Wi-Fi network or connecting to a different network. Slow internet fit cause di audio to load irregularly, and go make am difficult to play. </li></ul><p><br></p><p>Ask di Administrator to check their device and internet connection:</p><ul><li> Get di Administrator to troubleshoot using di steps for up</li></ul><p><br></p><p>Let us know if you still dey get issues with loading:</p><ul><li> Report a problem by contacting us at admin@oppia.org. </li></ul>
+ <p>If you no fit find your question or you go like to report a bug, contact us for admin@oppia.org.</p>
Profile Edit Fragment Test Activity
Administrator Controls Fragment Test Activity
Continue Studying
diff --git a/app/src/main/res/values-pt-rBR/strings.xml b/app/src/main/res/values-pt-rBR/strings.xml
index 03ef6e1b366..f67bc1b4878 100644
--- a/app/src/main/res/values-pt-rBR/strings.xml
+++ b/app/src/main/res/values-pt-rBR/strings.xml
@@ -480,22 +480,22 @@
Termos de Serviço
Ao usar %s, você concorda com nossos <br> <oppia-noninteractive-policy link=\"tos\">Termos de Serviço</oppia-noninteractive-policy> e <oppia-noninteractive-policy link=\"privacy\">Política de Privacidade</oppia-noninteractive-policy>.
Por favor visite <a href=\"https://www.oppia.org/terms\">esta página</a> para acessar a última versão destes termos.
- Como posso criar um novo perfil?
- Como posso deletar um perfil?
- Como posso alterar meu e-mail/número de telefone?
- O que é %s?
- Quem é um administrador?
- Por que a exploração não está carregando?
- Por que meu áudio não está tocando?
- Não consigo encontrar minha pergunta aqui. E agora?
- <p>Se é a sua primeira vez criando um perfil e você não tem um PIN:<ol> <li> No Seletor de Perfil, toque em <strong>Configurar Múltiplos Perfis</strong>. </li> <li> Crie um PIN e <strong>Salvar</strong>. </li> <li> Preencha todos os campos do perfil. <ol> <li> (Opcional) Carregue uma foto. </li> <li> Insira um nome. </li> <li> (Opcional) Atribua um PIN de 3 dígitos. </li></ol></li><li> 4. Toque em <strong>Criar</strong>. Este perfil está adicionado ao seu Seletor de Perfil! </li></ol></p><p> Se você já criou um perfil antes e tem um PIN: <ol> <li>No Seletor de Perfil, toque em <strong>Adicionar Perfil</strong>. </li> <li> 2. Digite seu PIN e toque em <strong>Enviar</strong>. </li> <li> Preencha todos os campos do perfil. <ol> <li> (Opcional) Carregue uma foto. </li> <li> Insira um nome. </li> <li> (Opcional) Atribua um PIN de 3 dígitos. </li> </ol> </li> <li> 4. Toque em <strong>Criar</strong>. Este perfil está adicionado ao seu Seletor de Perfil! </li></ol></p><br><p> Nota: Apenas o <u>Administrador</u> pode gerenciar perfis.</p>
- <p>Depois que um perfil é deletado:</p> <ol><li>O perfil não pode ser recuperado. </li> <li> As informações do perfil, como nome, fotos e progresso, serão excluídas permanentemente. </li></ol><p>Para deletar um perfil(excluindo o do <u>Administrador</u>):</p> <ol><li>Na página inicial do administrador, toque no botão de menu no canto superior esquerdo.</li> <li>Toque em <strong>Controles do Administrador</strong>.</li> <li>3. Toque em <strong>Editar Perfis</strong>.</li> <li>4. Toque no perfil que deseja excluir.</li> <li>5. Na parte inferior da tela, toque em <strong>Exclusão de Perfil</strong>.</li> <li>6. Toque em <strong>Deletar</strong> para confirmar a exclusão.</li></ol><p><br></p><p>Nota: Apenas o <u>Administrador</u> pode gerenciar perfis.</p>
- <p>Para alterar seu e-mail/número de telefone:</p><ol><li>Na página inicial do administrador, toque no botão de menu no canto superior esquerdo.</li><li>Toque em <strong>Controles do Administrador</strong>.</li><li>Toque em <strong>Editar Conta</strong>.</li></ol><p><br></p> <p>Se você deseja alterar seu e-mail:</p><ol><li>Digite seu novo e-mail e toque em <strong>Salvar</strong>.</li><li>Um link de confirmação será enviado para confirmar seu novo e-mail. O link irá expirar após 24 horas e deve ser clicado para ser associado à sua conta. </li></ol><p><br></p> <p>Se mudar seu número de telefone:</p><ol><li>Digite seu novo número de telefone e toque em <strong>Verificar</strong>.</li><li>Um código será enviado para confirmar seu novo número. O código expira após 5 minutos e deve ser inserido na nova tela para ser associado à sua conta.</li></ol>
- <p>%1$s <i>\"O-pee-yah\"</i> (Finnish) - \"aprender\"</p><p><br></p><p>%1$s tem a missão de ajudar qualquer pessoa a aprender o que quiser de uma forma eficaz e agradável.</p><p><br></p><p>Ao criar um conjunto de aulas gratuitas, de alta qualidade e comprovadamente eficazes com a ajuda de educadores de todo o mundo, %1$s visa proporcionar aos alunos uma educação de qualidade - independentemente de onde estejam ou a quais recursos tradicionais tenham acesso.</p><p><br></p><p>Como estudante, você pode começar sua aventura de aprendizado navegando pelos tópicos listados na página inicial!</p>
- <p>Um administrador é o usuário principal que gerencia perfis e configurações para cada perfil em sua conta. Provavelmente, eles são seus pais, professores ou responsáveis que criaram este perfil para você.</p><p><br></p><p>Os administradores podem gerenciar perfis, atribuir PINs e alterar outras configurações em suas contas. Dependendo do seu perfil, as permissões de administrador podem ser necessárias para determinados recursos, como download de tópicos, alteração do PIN e mais. </p><p><br></p><p>Para ver quem é o seu administrador, vá para o Seletor de perfil. O primeiro perfil listado e com \"Administrador\" escrito em seu nome é o Administrador. </p>
- <p>Se a exploração não estiver carregando</p><p><br></p><p>Verifique se o aplicativo está atualizado:</p><p> <ul> <li> Acesse a Play Store e certifique-se de que o aplicativo esteja atualizado com a versão mais recente </li></ul><p><br></p><p>Verifique sua conexão com a internet:</p><ul><li> Se sua conexão com a Internet estiver lenta, tente se reconectar à rede Wi-Fi ou conectar-se a uma rede diferente. </li></ul><p>Peça ao administrador para verificar o dispositivo e a conexão com a Internet:</p><ul><li> Peça ao administrador para solucionar o problema usando as etapas acima </li></ul><p>Informe-nos se você ainda tiver problemas com o carregamento::</p><ul><li> Relate um problema entrando em contato conosco em admin@oppia.org. </li> </ul>
- <p>Se o seu áudio não estiver tocando</p><p><br></p><p>Verifique se o aplicativo está atualizado:</p><ul><li> Acesse a Play Store e certifique-se de que o aplicativo esteja atualizado com a versão mais recente </li></ul><p><br></p><p>Verifique sua conexão com a internet:</p><ul><li> Se sua conexão com a Internet estiver lenta, tente se reconectar à rede Wi-Fi ou conectar-se a uma rede diferente. A Internet lenta pode fazer com que o áudio carregue irregularmente, dificultando a reprodução. </li></ul><p><br></p><p>Peça ao administrador para verificar o dispositivo e a conexão com a Internet:</p><ul><li> Peça ao administrador para solucionar o problema usando as etapas acima</li></ul><p><br></p><p>Informe-nos se você ainda tiver problemas com o carregamento:</p><ul><li> Relate um problema entrando em contato conosco em admin@oppia.org. </li></ul>
- <p>Se você não consegue encontrar sua pergunta ou gostaria de relatar um problema, entre em contato conosco em admin@oppia.org.</p>
+ Como posso criar um novo perfil?
+ Como posso deletar um perfil?
+ Como posso alterar meu e-mail/número de telefone?
+ O que é %s?
+ Quem é um administrador?
+ Por que a exploração não está carregando?
+ Por que meu áudio não está tocando?
+ Não consigo encontrar minha pergunta aqui. E agora?
+ <p>Se é a sua primeira vez criando um perfil e você não tem um PIN:<ol> <li> No Seletor de Perfil, toque em <strong>Configurar Múltiplos Perfis</strong>. </li> <li> Crie um PIN e <strong>Salvar</strong>. </li> <li> Preencha todos os campos do perfil. <ol> <li> (Opcional) Carregue uma foto. </li> <li> Insira um nome. </li> <li> (Opcional) Atribua um PIN de 3 dígitos. </li></ol></li><li> 4. Toque em <strong>Criar</strong>. Este perfil está adicionado ao seu Seletor de Perfil! </li></ol></p><p> Se você já criou um perfil antes e tem um PIN: <ol> <li>No Seletor de Perfil, toque em <strong>Adicionar Perfil</strong>. </li> <li> 2. Digite seu PIN e toque em <strong>Enviar</strong>. </li> <li> Preencha todos os campos do perfil. <ol> <li> (Opcional) Carregue uma foto. </li> <li> Insira um nome. </li> <li> (Opcional) Atribua um PIN de 3 dígitos. </li> </ol> </li> <li> 4. Toque em <strong>Criar</strong>. Este perfil está adicionado ao seu Seletor de Perfil! </li></ol></p><br><p> Nota: Apenas o <u>Administrador</u> pode gerenciar perfis.</p>
+ <p>Depois que um perfil é deletado:</p> <ol><li>O perfil não pode ser recuperado. </li> <li> As informações do perfil, como nome, fotos e progresso, serão excluídas permanentemente. </li></ol><p>Para deletar um perfil(excluindo o do <u>Administrador</u>):</p> <ol><li>Na página inicial do administrador, toque no botão de menu no canto superior esquerdo.</li> <li>Toque em <strong>Controles do Administrador</strong>.</li> <li>3. Toque em <strong>Editar Perfis</strong>.</li> <li>4. Toque no perfil que deseja excluir.</li> <li>5. Na parte inferior da tela, toque em <strong>Exclusão de Perfil</strong>.</li> <li>6. Toque em <strong>Deletar</strong> para confirmar a exclusão.</li></ol><p><br></p><p>Nota: Apenas o <u>Administrador</u> pode gerenciar perfis.</p>
+ <p>Para alterar seu e-mail/número de telefone:</p><ol><li>Na página inicial do administrador, toque no botão de menu no canto superior esquerdo.</li><li>Toque em <strong>Controles do Administrador</strong>.</li><li>Toque em <strong>Editar Conta</strong>.</li></ol><p><br></p> <p>Se você deseja alterar seu e-mail:</p><ol><li>Digite seu novo e-mail e toque em <strong>Salvar</strong>.</li><li>Um link de confirmação será enviado para confirmar seu novo e-mail. O link irá expirar após 24 horas e deve ser clicado para ser associado à sua conta. </li></ol><p><br></p> <p>Se mudar seu número de telefone:</p><ol><li>Digite seu novo número de telefone e toque em <strong>Verificar</strong>.</li><li>Um código será enviado para confirmar seu novo número. O código expira após 5 minutos e deve ser inserido na nova tela para ser associado à sua conta.</li></ol>
+ <p>%1$s <i>\"O-pee-yah\"</i> (Finnish) - \"aprender\"</p><p><br></p><p>%1$s tem a missão de ajudar qualquer pessoa a aprender o que quiser de uma forma eficaz e agradável.</p><p><br></p><p>Ao criar um conjunto de aulas gratuitas, de alta qualidade e comprovadamente eficazes com a ajuda de educadores de todo o mundo, %1$s visa proporcionar aos alunos uma educação de qualidade - independentemente de onde estejam ou a quais recursos tradicionais tenham acesso.</p><p><br></p><p>Como estudante, você pode começar sua aventura de aprendizado navegando pelos tópicos listados na página inicial!</p>
+ <p>Um administrador é o usuário principal que gerencia perfis e configurações para cada perfil em sua conta. Provavelmente, eles são seus pais, professores ou responsáveis que criaram este perfil para você.</p><p><br></p><p>Os administradores podem gerenciar perfis, atribuir PINs e alterar outras configurações em suas contas. Dependendo do seu perfil, as permissões de administrador podem ser necessárias para determinados recursos, como download de tópicos, alteração do PIN e mais. </p><p><br></p><p>Para ver quem é o seu administrador, vá para o Seletor de perfil. O primeiro perfil listado e com \"Administrador\" escrito em seu nome é o Administrador. </p>
+ <p>Se a exploração não estiver carregando</p><p><br></p><p>Verifique se o aplicativo está atualizado:</p><p> <ul> <li> Acesse a Play Store e certifique-se de que o aplicativo esteja atualizado com a versão mais recente </li></ul><p><br></p><p>Verifique sua conexão com a internet:</p><ul><li> Se sua conexão com a Internet estiver lenta, tente se reconectar à rede Wi-Fi ou conectar-se a uma rede diferente. </li></ul><p>Peça ao administrador para verificar o dispositivo e a conexão com a Internet:</p><ul><li> Peça ao administrador para solucionar o problema usando as etapas acima </li></ul><p>Informe-nos se você ainda tiver problemas com o carregamento::</p><ul><li> Relate um problema entrando em contato conosco em admin@oppia.org. </li> </ul>
+ <p>Se o seu áudio não estiver tocando</p><p><br></p><p>Verifique se o aplicativo está atualizado:</p><ul><li> Acesse a Play Store e certifique-se de que o aplicativo esteja atualizado com a versão mais recente </li></ul><p><br></p><p>Verifique sua conexão com a internet:</p><ul><li> Se sua conexão com a Internet estiver lenta, tente se reconectar à rede Wi-Fi ou conectar-se a uma rede diferente. A Internet lenta pode fazer com que o áudio carregue irregularmente, dificultando a reprodução. </li></ul><p><br></p><p>Peça ao administrador para verificar o dispositivo e a conexão com a Internet:</p><ul><li> Peça ao administrador para solucionar o problema usando as etapas acima</li></ul><p><br></p><p>Informe-nos se você ainda tiver problemas com o carregamento:</p><ul><li> Relate um problema entrando em contato conosco em admin@oppia.org. </li></ul>
+ <p>Se você não consegue encontrar sua pergunta ou gostaria de relatar um problema, entre em contato conosco em admin@oppia.org.</p>
Atividade de Teste de Fragmento de Edição de Perfil
Controle Administrativo da Atividade de Teste de Fragmento
Continuar estudando
diff --git a/app/src/main/res/values-sw/strings.xml b/app/src/main/res/values-sw/strings.xml
index 758c513d8e0..75740434b12 100644
--- a/app/src/main/res/values-sw/strings.xml
+++ b/app/src/main/res/values-sw/strings.xml
@@ -411,20 +411,20 @@
Habari ya asubuhi,
Habari ya mchana,
Habari ya jioni,
- Ninawezaje kuunda wasifu mpya?
- Ninawezaje kufuta wasifu?
- Nitabadilisha aje barua pepe/nambari yangu ya simu?
- %s ni nini?
- Msimamizi ni nani?
- Kwa nini kicheza Uchunguzi hakipakii?
- Kwa nini sauti yangu haichezwi?
- Sijapata swali langu hapa. Nini sasa?
- <p>Ikiwa ni mara yako ya kwanza kuunda wasifu na huna Nambari ya Siri: <ol> <li> Kutoka kwa Kichagua Wasifu, gusa <strong>Weka Wasifu Nyingi</strong>. </li> <li> Unda Nambari ya Siri na <strong>Hifadhi</strong>. </li> <li> Jaza sehemu zote za wasifu. <ol><li> (Si lazima) Pakia picha. </li> <li> Weka jina. </li> <li> (Si lazima) Weka Nambari ya Siri yenye tarakimu 3.</li></ol></li><li>Gusa <strong>Unda</strong>. Wasifu huu umeongezwa kwa Kichagua Wasifu wako! </li></ol></p><p> Ikiwa umeunda wasifu hapo awali na una Nambari ya Siri: <ol><li> Kutoka kwa Kichagua Wasifu, gusa <strong>Ongeza Wasifu</strong>. </li><li>Weka Nambari yako ya Siri na uguse <strong>Wasilisha</strong>. </li><li> Jaza sehemu zote za wasifu. <ol><li> (Si lazima) Pakia picha. </li> <li> Weka jina. </li> <li> (Si lazima) Weka Nambari ya Siri yenye tarakimu 3. </li></ol></li><li> Gusa <strong>Unda</strong>. Wasifu huu umeongezwa kwa Kichagua Wasifu wako! </li></ol></p><br><p> Kumbuka: <u>Msimamizi pekee</u> ndiye anayeweza kudhibiti wasifu.</p>
- <p>Wasifu unapofutwa:</p><ol><li> Wasifu hauwezi kurejeshwa. </li><li> Taarifa ya wasifu kama vile jina, picha na maendeleo yatafutwa kabisa. </li></ol><p>Ili kufuta wasifu (bila kujumuisha <u>Msimamizi</u>):</p> <ol><li> Kutoka kwa Ukurasa wa Mwanzo wa Msimamizi, gusa kitufe cha menyu kilicho upande wa juu kushoto. </li><li> Gusa <strong>Vidhibiti vya Msimamizi</strong>. </li><li> Gusa <strong>Hariri Wasifu</strong>. </li><li> Gonga Wasifu ambao ungependa kufuta. </li><li> Katika sehemu ya chini ya skrini, gusa <strong>Ufutaji wa Wasifu</strong>. </li><li> Gusa <strong>Futa</strong> ili kuthibitisha kufuta.</li></ol><p><br></p><p>Kumbuka: <u>Msimamizi</u> pekee ndiye anayeweza kudhibiti wasifu.</p>
- <p>Ili kubadilisha barua pepe/nambari yako ya simu:</p> <ol><li>Kutoka kwa Ukurasa wa Mwanzo wa Msimamizi, gusa kitufe cha menyu kilicho upande wa juu kushoto.</li> <li>Gusa <strong>Vidhibiti vya Msimamizi</strong>.</li><li> Gusa <strong>Hariri Akaunti</strong>.</li></ol><p><br></p> <p>Ikiwa ungependa kubadilisha barua pepe yako:</p><ol><li> Weka barua pepe yako mpya na uguse <strong>Hifadhi</strong>.</li><li> Kiungo cha uthibitishaji kinatumwa ili kuthibitisha barua pepe yako mpya. Muda wa kiungo utaisha baada ya saa 24 na lazima ubofye ili kuhusishwa na akaunti yako. </li></ol><p><br></p> <p>Ikiwa unabadilisha nambari yako ya simu:</p><ol><li> Weka nambari yako mpya ya simu na uguse <strong>Thibitisha</strong>.</li><li> Nambari ya kuthibitisha inatumwa ili kuthibitisha nambari yako mpya. Nambari ya kuthibitisha itaisha baada ya dakika 5 na lazima iwekwe kwenye skrini mpya ili kuhusishwa na akaunti yako.</li></ol>
- <p>%1$s <i>\"O-pee-yah\"</i> (Kifini) - \"kujifunza\"</p><p><br></p><p>%1$s\'s dhamira ni kumsaidia mtu yeyote kujifunza chochote anachotaka kwa njia bora na ya kufurahisha.</p><p><br></p><p>Kwa kuunda seti ya masomo yasiyolipishwa, ya ubora wa juu, na yenye matokeo kwa usaidizi. ya waelimishaji kutoka duniani kote, %1$s inalenga kuwapa wanafunzi elimu bora — bila kujali walipo au ni nyenzo gani za jadi wanazoweza kufikia.</p><p><br></p><p> Kama mwanafunzi, unaweza kuanza safari yako ya kujifunza kwa kuvinjari mada zilizoorodheshwa kwenye Ukurasa wa Mwanzo!</p>
- <p>Msimamizi ndiye mtumiaji mkuu anayedhibiti wasifu na mipangilio ya kila wasifu kwenye akaunti yake.Uwezekano mkubwa ni mzazi, mwalimu au mlezi wako aliyekuundia wasifu huu. </p><p><br></p><p>Wasimamizi wana uwezo wa kudhibiti wasifu, kugawa Nambari ya Siri, na kubadilisha mipangilio mingine chini ya akaunti yao. Kulingana na wasifu wako, ruhusa za Msimamizi zinaweza kuhitajika kwa vipengele fulani kama vile kupakua Mada, kubadilisha Nambari yako ya Siri na zaidi. </p><p><br></p><p>Ili kujua Msimamizi wako ni nani, nenda kwa Kichagua Wasifu. Wasifu wa kwanza ulioorodheshwa na una \"Msimamizi\" iliyoandikwa chini ya jina lake ni Msimamizi. </p>
- <p>Ikiwa Kicheza Ugunduzi hakipakii</p><p><br></p><p>Angalia kama programu imesasishwa:</p><p> <ul> <li> Nenda kwenye Hifadhi ya Michezo na uhakikishe kuwa programu imesasishwa hadi toleo lake jipya zaidi </li> </ul> <p><br></p><p>Angalia muunganisho wako wa mtandao:</p><ul><li> Ikiwa muunganisho wako wa mtandao ni wa polepole, jaribu kuunganisha tena kwenye mtandao wako wa Wi-Fi au unganisha kwenye mtandao tofauti. </li></ul><p>Uliza Msimamizi aangalie kifaa chake na muunganisho wa mtandao:</p><ul><li> Pata Msimamizi kusuluhisha kwa kutumia hatua hapo juu </li></ul><p>Tujulishe ikiwa bado una matatizo ya upakiaji:</p><ul><li> Ripoti tatizo kwa kuwasiliana nasi kwa admin@oppia.org. </li></ul>
- <p>Ikiwa sauti yako haichezi</p><p><br></p><p>Angalia ili kuona kama programu imesasishwa:</p><ul><li> Nenda kwenye Hifadhi ya Michezo na uhakikishe kuwa programu imesasishwa hadi toleo lake jipya zaidi </li></ul><p><br></p><p>Angalia muunganisho wako wa mtandao:</p><ul><li> Iwapo muunganisho wako wa mtandao ni wa polepole, jaribu kuunganisha tena kwenye mtandao wako wa Wi-Fi au unganisha kwenye mtandao tofauti. Mtandao wa polepole unaweza kusababisha sauti kupakia kwa njia isiyo ya kawaida, na kuifanya iwe vigumu kucheza. </li></ul><p><br></p><p>Uliza Msimamizi aangalie kifaa chake na muunganisho wa mtandao:</p><ul><li> Wasiliana na Msimamizi ili asuluhishe kwa kutumia hatua hapo juu</li></ul><p><br></p><p>Tujulishe ikiwa bado una matatizo ya upakiaji:</p><ul><li> Ripoti tatizo kwa kuwasiliana nasi kwa admin@oppia.org. </li></ul>
- <p>Ikiwa huwezi kupata swali lako au ungependa kuripoti hitilafu, wasiliana nasi kwa admin@oppia.org.</p>
+ Ninawezaje kuunda wasifu mpya?
+ Ninawezaje kufuta wasifu?
+ Nitabadilisha aje barua pepe/nambari yangu ya simu?
+ %s ni nini?
+ Msimamizi ni nani?
+ Kwa nini kicheza Uchunguzi hakipakii?
+ Kwa nini sauti yangu haichezwi?
+ Sijapata swali langu hapa. Nini sasa?
+ <p>Ikiwa ni mara yako ya kwanza kuunda wasifu na huna Nambari ya Siri: <ol> <li> Kutoka kwa Kichagua Wasifu, gusa <strong>Weka Wasifu Nyingi</strong>. </li> <li> Unda Nambari ya Siri na <strong>Hifadhi</strong>. </li> <li> Jaza sehemu zote za wasifu. <ol><li> (Si lazima) Pakia picha. </li> <li> Weka jina. </li> <li> (Si lazima) Weka Nambari ya Siri yenye tarakimu 3.</li></ol></li><li>Gusa <strong>Unda</strong>. Wasifu huu umeongezwa kwa Kichagua Wasifu wako! </li></ol></p><p> Ikiwa umeunda wasifu hapo awali na una Nambari ya Siri: <ol><li> Kutoka kwa Kichagua Wasifu, gusa <strong>Ongeza Wasifu</strong>. </li><li>Weka Nambari yako ya Siri na uguse <strong>Wasilisha</strong>. </li><li> Jaza sehemu zote za wasifu. <ol><li> (Si lazima) Pakia picha. </li> <li> Weka jina. </li> <li> (Si lazima) Weka Nambari ya Siri yenye tarakimu 3. </li></ol></li><li> Gusa <strong>Unda</strong>. Wasifu huu umeongezwa kwa Kichagua Wasifu wako! </li></ol></p><br><p> Kumbuka: <u>Msimamizi pekee</u> ndiye anayeweza kudhibiti wasifu.</p>
+ <p>Wasifu unapofutwa:</p><ol><li> Wasifu hauwezi kurejeshwa. </li><li> Taarifa ya wasifu kama vile jina, picha na maendeleo yatafutwa kabisa. </li></ol><p>Ili kufuta wasifu (bila kujumuisha <u>Msimamizi</u>):</p> <ol><li> Kutoka kwa Ukurasa wa Mwanzo wa Msimamizi, gusa kitufe cha menyu kilicho upande wa juu kushoto. </li><li> Gusa <strong>Vidhibiti vya Msimamizi</strong>. </li><li> Gusa <strong>Hariri Wasifu</strong>. </li><li> Gonga Wasifu ambao ungependa kufuta. </li><li> Katika sehemu ya chini ya skrini, gusa <strong>Ufutaji wa Wasifu</strong>. </li><li> Gusa <strong>Futa</strong> ili kuthibitisha kufuta.</li></ol><p><br></p><p>Kumbuka: <u>Msimamizi</u> pekee ndiye anayeweza kudhibiti wasifu.</p>
+ <p>Ili kubadilisha barua pepe/nambari yako ya simu:</p> <ol><li>Kutoka kwa Ukurasa wa Mwanzo wa Msimamizi, gusa kitufe cha menyu kilicho upande wa juu kushoto.</li> <li>Gusa <strong>Vidhibiti vya Msimamizi</strong>.</li><li> Gusa <strong>Hariri Akaunti</strong>.</li></ol><p><br></p> <p>Ikiwa ungependa kubadilisha barua pepe yako:</p><ol><li> Weka barua pepe yako mpya na uguse <strong>Hifadhi</strong>.</li><li> Kiungo cha uthibitishaji kinatumwa ili kuthibitisha barua pepe yako mpya. Muda wa kiungo utaisha baada ya saa 24 na lazima ubofye ili kuhusishwa na akaunti yako. </li></ol><p><br></p> <p>Ikiwa unabadilisha nambari yako ya simu:</p><ol><li> Weka nambari yako mpya ya simu na uguse <strong>Thibitisha</strong>.</li><li> Nambari ya kuthibitisha inatumwa ili kuthibitisha nambari yako mpya. Nambari ya kuthibitisha itaisha baada ya dakika 5 na lazima iwekwe kwenye skrini mpya ili kuhusishwa na akaunti yako.</li></ol>
+ <p>%1$s <i>\"O-pee-yah\"</i> (Kifini) - \"kujifunza\"</p><p><br></p><p>%1$s\'s dhamira ni kumsaidia mtu yeyote kujifunza chochote anachotaka kwa njia bora na ya kufurahisha.</p><p><br></p><p>Kwa kuunda seti ya masomo yasiyolipishwa, ya ubora wa juu, na yenye matokeo kwa usaidizi. ya waelimishaji kutoka duniani kote, %1$s inalenga kuwapa wanafunzi elimu bora — bila kujali walipo au ni nyenzo gani za jadi wanazoweza kufikia.</p><p><br></p><p> Kama mwanafunzi, unaweza kuanza safari yako ya kujifunza kwa kuvinjari mada zilizoorodheshwa kwenye Ukurasa wa Mwanzo!</p>
+ <p>Msimamizi ndiye mtumiaji mkuu anayedhibiti wasifu na mipangilio ya kila wasifu kwenye akaunti yake.Uwezekano mkubwa ni mzazi, mwalimu au mlezi wako aliyekuundia wasifu huu. </p><p><br></p><p>Wasimamizi wana uwezo wa kudhibiti wasifu, kugawa Nambari ya Siri, na kubadilisha mipangilio mingine chini ya akaunti yao. Kulingana na wasifu wako, ruhusa za Msimamizi zinaweza kuhitajika kwa vipengele fulani kama vile kupakua Mada, kubadilisha Nambari yako ya Siri na zaidi. </p><p><br></p><p>Ili kujua Msimamizi wako ni nani, nenda kwa Kichagua Wasifu. Wasifu wa kwanza ulioorodheshwa na una \"Msimamizi\" iliyoandikwa chini ya jina lake ni Msimamizi. </p>
+ <p>Ikiwa Kicheza Ugunduzi hakipakii</p><p><br></p><p>Angalia kama programu imesasishwa:</p><p> <ul> <li> Nenda kwenye Hifadhi ya Michezo na uhakikishe kuwa programu imesasishwa hadi toleo lake jipya zaidi </li> </ul> <p><br></p><p>Angalia muunganisho wako wa mtandao:</p><ul><li> Ikiwa muunganisho wako wa mtandao ni wa polepole, jaribu kuunganisha tena kwenye mtandao wako wa Wi-Fi au unganisha kwenye mtandao tofauti. </li></ul><p>Uliza Msimamizi aangalie kifaa chake na muunganisho wa mtandao:</p><ul><li> Pata Msimamizi kusuluhisha kwa kutumia hatua hapo juu </li></ul><p>Tujulishe ikiwa bado una matatizo ya upakiaji:</p><ul><li> Ripoti tatizo kwa kuwasiliana nasi kwa admin@oppia.org. </li></ul>
+ <p>Ikiwa sauti yako haichezi</p><p><br></p><p>Angalia ili kuona kama programu imesasishwa:</p><ul><li> Nenda kwenye Hifadhi ya Michezo na uhakikishe kuwa programu imesasishwa hadi toleo lake jipya zaidi </li></ul><p><br></p><p>Angalia muunganisho wako wa mtandao:</p><ul><li> Iwapo muunganisho wako wa mtandao ni wa polepole, jaribu kuunganisha tena kwenye mtandao wako wa Wi-Fi au unganisha kwenye mtandao tofauti. Mtandao wa polepole unaweza kusababisha sauti kupakia kwa njia isiyo ya kawaida, na kuifanya iwe vigumu kucheza. </li></ul><p><br></p><p>Uliza Msimamizi aangalie kifaa chake na muunganisho wa mtandao:</p><ul><li> Wasiliana na Msimamizi ili asuluhishe kwa kutumia hatua hapo juu</li></ul><p><br></p><p>Tujulishe ikiwa bado una matatizo ya upakiaji:</p><ul><li> Ripoti tatizo kwa kuwasiliana nasi kwa admin@oppia.org. </li></ul>
+ <p>Ikiwa huwezi kupata swali lako au ungependa kuripoti hitilafu, wasiliana nasi kwa admin@oppia.org.</p>
diff --git a/app/src/main/res/values/faqs.xml b/app/src/main/res/values/faqs.xml
index ab53047b8fe..e58bc3eef82 100644
--- a/app/src/main/res/values/faqs.xml
+++ b/app/src/main/res/values/faqs.xml
@@ -9,6 +9,11 @@
- @string/faq_question_6
- @string/faq_question_7
- @string/faq_question_9
+ - @string/faq_question_10
+ - @string/faq_question_11
+ - @string/faq_question_12
+ - @string/faq_question_13
+ - @string/faq_question_14
@@ -20,5 +25,10 @@
- @string/faq_answer_6
- @string/faq_answer_7
- @string/faq_answer_9
+ - @string/faq_answer_10
+ - @string/faq_answer_11
+ - @string/faq_answer_12
+ - @string/faq_answer_13
+ - @string/faq_answer_14
diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml
index 9b924f81a97..809bf854214 100755
--- a/app/src/main/res/values/strings.xml
+++ b/app/src/main/res/values/strings.xml
@@ -545,22 +545,37 @@
Terms of Service and Privacy Policy.]]>
this page for the latest version of these terms.]]>
- How can I create a new profile?
- How can I delete a profile?
- How can I change my email/phone number?
- What is %s?
- Who is an Administrator?
- Why is the Exploration player not loading?
- Why is my audio not playing?
- I can\'t find my question here. What now?
- If it is your first time creating a profile and not have a PIN:- From the Profile Chooser, tap on Set up Multiple Profiles.
- Create a PIN and Save.
- Fill in all fields for the profile.
- (Optional) Upload a photo.
- Enter a name.
- (Optional) Assign a 3-digit PIN.
- Tap Create. This profile is added to your Profile Chooser!
If you have created a profile before and have a PIN:
- From the Profile Chooser, tap on Add Profile.
- Enter your PIN and tap Submit.
- Fill in all fields for the profile.
- (Optional) Upload a photo.
- Enter a name.
- (Optional) Assign a 3-digit PIN.
- Tap Create. This profile is added to your Profile Chooser!
Note: Only the Administrator is able to manage profiles.
]]>
- Once a profile is deleted:- The profile cannot be recovered.
- Profile information such as name, photos, and progress will be permanently deleted.
To delete a profile (excluding the Administrator\'s):
- From the Administrator\'s Home Page, tap on the menu button on the top left.
- Tap on Administrator Controls.
- Tap on Edit Profiles.
- Tap on the Profile you would like to delete.
- At the bottom of the screen, tap Profile Deletion.
- Tap Delete to confirm deletion.
Note: Only the Administrator is able to manage profiles.
]]>
- To change your email/phone number:- From the Administrator\'s Home Page, tap on the menu button on the top left.
- Tap on Administrator Controls.
- Tap on Edit Account.
If you want to change your email:
- Enter your new email and tap Save.
- A confirmation link is sent to confirm your new email. The link will expire after 24 hours and must be clicked on to be associated with your account.
If changing your phone number:
- Enter your new phone number and tap Verify.
- A code is sent to confirm your new number. The code will expire after 5 minutes and must be entered in the new screen to be associated with your account.
]]>
- %1$s "O-pee-yah" (Finnish) - "to learn"
%1$s\'s mission is to help anyone learn anything they want in an effective and enjoyable way.
By creating a set of free, high-quality, demonstrably effective lessons with the help of educators from around the world, %1$s aims to provide students with quality education — regardless of where they are or what traditional resources they have access to.
As a student, you can begin your learning adventure by browsing the topics listed on the Home Page!
]]>
- An Administrator is the main user that manages profiles and settings for every profile on their account. They are most likely your parent, teacher, or guardian that created this profile for you.
Administrators have the ability to manage profiles, assign PINs, and change other settings under their account. Depending on your profile, Administrator permissions may be required for certain features such as changing your PIN, and more.
To see who your Administrator is, go to the Profile Chooser. The first profile listed and has "Administrator" written under their name is the Administrator.
]]>
- If the Exploration Player is not loading
Check to see if the app is up to date:
- Go to the Play Store and make sure the app is updated to its latest version
Check your internet connection:
- If your internet connection is slow, try re-connecting to your Wi-Fi network or connecting to a different network.
Ask the Administrator to check their device and internet connection:
- Get the Administrator to troubleshoot using the steps above
Let us know if you still have issues with loading:
- Report a problem by contacting us at admin@oppia.org.
]]>
- If your audio is not playing
Check to see if the app is up to date:
- Go to the Play Store and make sure the app is updated to its latest version
Check your internet connection:
- If your internet connection is slow, try re-connecting to your Wi-Fi network or connecting to a different network. Slow internet may cause the audio to load irregularly, making it difficult to play.
Ask the Administrator to check their device and internet connection:
- Get the Administrator to troubleshoot using the steps above
Let us know if you still have issues with loading:
- Report a problem by contacting us at admin@oppia.org.
]]>
- If you cannot find your question or would like to report a bug, contact us at admin@oppia.org.]]>
+
+ What is %s?
+ Who is an Administrator?
+ How can I create a new profile?
+ How do I get the app in my language?
+ I found a bug. How can I report it?
+ Why are there only math lessons?
+ Will you be making more lessons?
+ Why is the Exploration player not loading?
+ Why is my audio not playing?
+ How can I delete a profile?
+ How can I change my email/phone number?
+ How do I update the app?
+ How do I update my Android OS?
+ I can\'t find my question here. What now?
+
+ %1$s "O-pee-yah" (Finnish) - "to learn"
%1$s\'s mission is to help anyone learn anything they want in an effective and enjoyable way.
By creating a set of free, high-quality, demonstrably effective lessons with the help of educators from around the world, %1$s aims to provide students with quality education — regardless of where they are or what traditional resources they have access to.
As a student, you can begin your learning adventure by browsing the topics listed on the Home Page!
]]>
+ An Administrator is the main user that manages profiles and settings for every profile on their account. They are most likely your parent, teacher, or guardian that created this profile for you.
Administrators have the ability to manage profiles, assign PINs, and change other settings under their account. Depending on your profile, Administrator permissions may be required for certain features such as changing your PIN, and more.
To see who your Administrator is, go to the Profile Chooser. The first profile listed and has "Administrator" written under their name is the Administrator.
]]>
+ If it is your first time creating a profile and you do not have a PIN:- From the Profile Chooser, tap on Set up Multiple Profiles.
- Create a PIN and Save.
- Fill in all fields for the profile.
- (Optional) Upload a photo.
- Enter a name.
- (Optional) Assign a 3-digit PIN.
- Tap Create. This profile is added to your Profile Chooser!
If you have created a profile before and have a PIN:
- From the Profile Chooser, tap on Add Profile.
- Enter your PIN and tap Submit.
- Fill in all fields for the profile.
- (Optional) Upload a photo.
- Enter a name.
- (Optional) Assign a 3-digit PIN.
- Tap Create. This profile is added to your Profile Chooser!
Note: Only the Administrator is able to manage profiles.
]]>
+ The %s app currently supports English, Brazilian Portuguese, Arabic, and Nigerian Pidgin. Choose one of these languages in the menu, under Options. To request the app in your language, please contact us at email address.]]>
+ - From your %s app home screen, tap the menu in the top left corner.
- Tap Share feedback.
- Follow the instructions to report the bug or share feedback.]]>
+ %1$s’s mission is to help learners gain necessary life skills. Math is an essential skill in everyday life. %1$s will be offering new lessons on science and other subjects soon!]]>
+ Yes, %s will be offering new lessons on science and other subjects soon. Please check back for updates!]]>
+ If the Exploration Player is not loading
Check to see if the app is up to date:
- Go to the Play Store and make sure the app is updated to its latest version
Check your internet connection:
- If your internet connection is slow, try re-connecting to your Wi-Fi network or connecting to a different network.
Ask the Administrator to check their device and internet connection:
- Get the Administrator to troubleshoot using the steps above
Let us know if you still have issues with loading:
- Report a problem by contacting us at admin@oppia.org.
]]>
+ If your audio is not playing
Check to see if the app is up to date:
- Go to the Play Store and make sure the app is updated to its latest version
Check your internet connection:
- If your internet connection is slow, try re-connecting to your Wi-Fi network or connecting to a different network. Slow internet may cause the audio to load irregularly, making it difficult to play.
Ask the Administrator to check their device and internet connection:
- Get the Administrator to troubleshoot using the steps above
Let us know if you still have issues with loading:
- Report a problem by contacting us at admin@oppia.org.
]]>
+ Once a profile is deleted:- The profile cannot be recovered.
- Profile information such as name, photos, and progress will be permanently deleted.
To delete a profile (excluding the Administrator\'s):
- From the Administrator\'s Home Page, tap on the menu button on the top left.
- Tap on Administrator Controls.
- Tap on Edit Profiles.
- Tap on the Profile you would like to delete.
- At the bottom of the screen, tap Profile Deletion.
- Tap Delete to confirm deletion.
Note: Only the Administrator is able to manage profiles.
]]>
+ To change your email/phone number:- From the Administrator\'s Home Page, tap on the menu button on the top left.
- Tap on Administrator Controls.
- Tap on Edit Account.
If you want to change your email:
- Enter your new email and tap Save.
- A confirmation link is sent to confirm your new email. The link will expire after 24 hours and must be clicked on to be associated with your account.
If changing your phone number:
- Enter your new phone number and tap Verify.
- A code is sent to confirm your new number. The code will expire after 5 minutes and must be entered in the new screen to be associated with your account.
]]>
+ - Open the Google Play Store app.
- Search for the %s app.
- Tap Update.]]>
+ - Tap your phone\'s Settings app.
- Tap System updates.
- Tap System updates and follow the instructions to update your Android operating system.]]>
+ If you cannot find your question or would like to report a bug, contact us at admin@oppia.org.]]>
+
Profile Edit Fragment Test Activity
Administrator Controls Fragment Test Activity
Continue Studying
diff --git a/app/src/sharedTest/java/org/oppia/android/app/faq/FAQListFragmentTest.kt b/app/src/sharedTest/java/org/oppia/android/app/faq/FAQListFragmentTest.kt
index 32d89e32dd8..b32169576f9 100644
--- a/app/src/sharedTest/java/org/oppia/android/app/faq/FAQListFragmentTest.kt
+++ b/app/src/sharedTest/java/org/oppia/android/app/faq/FAQListFragmentTest.kt
@@ -146,18 +146,18 @@ class FAQListFragmentTest {
onView(
atPosition(
recyclerViewId = R.id.faq_fragment_recycler_view,
- position = 1
+ position = 3
)
).perform(click())
intended(
allOf(
hasExtra(
FAQSingleActivity.FAQ_SINGLE_ACTIVITY_QUESTION,
- getResources().getString(R.string.faq_question_1)
+ getResources().getString(R.string.faq_question_3)
),
hasExtra(
FAQSingleActivity.FAQ_SINGLE_ACTIVITY_ANSWER,
- getResources().getString(R.string.faq_answer_1)
+ getResources().getString(R.string.faq_answer_3)
),
hasComponent(FAQSingleActivity::class.java.name)
)
@@ -172,18 +172,18 @@ class FAQListFragmentTest {
onView(
atPosition(
recyclerViewId = R.id.faq_fragment_recycler_view,
- position = 1
+ position = 3
)
).perform(click())
intended(
allOf(
hasExtra(
FAQSingleActivity.FAQ_SINGLE_ACTIVITY_QUESTION,
- getResources().getString(R.string.faq_question_1)
+ getResources().getString(R.string.faq_question_3)
),
hasExtra(
FAQSingleActivity.FAQ_SINGLE_ACTIVITY_ANSWER,
- getResources().getString(R.string.faq_answer_1)
+ getResources().getString(R.string.faq_answer_3)
),
hasComponent(FAQSingleActivity::class.java.name)
)
@@ -197,18 +197,18 @@ class FAQListFragmentTest {
onView(
atPosition(
recyclerViewId = R.id.faq_fragment_recycler_view,
- position = 4
+ position = 1
)
).perform(click())
intended(
allOf(
hasExtra(
FAQSingleActivity.FAQ_SINGLE_ACTIVITY_QUESTION,
- getResources().getString(R.string.faq_question_4, getAppName())
+ getResources().getString(R.string.faq_question_1, getAppName())
),
hasExtra(
FAQSingleActivity.FAQ_SINGLE_ACTIVITY_ANSWER,
- getResources().getString(R.string.faq_answer_4, getAppName())
+ getResources().getString(R.string.faq_answer_1, getAppName())
),
hasComponent(FAQSingleActivity::class.java.name)
)
diff --git a/utility/src/main/java/org/oppia/android/util/extensions/StringExtensions.kt b/utility/src/main/java/org/oppia/android/util/extensions/StringExtensions.kt
index 5e48805739d..4a7fa858acf 100644
--- a/utility/src/main/java/org/oppia/android/util/extensions/StringExtensions.kt
+++ b/utility/src/main/java/org/oppia/android/util/extensions/StringExtensions.kt
@@ -7,6 +7,7 @@ package org.oppia.android.util.extensions
fun String.normalizeWhitespace(): String {
return trim().replace("\\s{2,}".toRegex(), " ")
}
+
/**
* Removes whitespace in the specified string after [nomralizeWhitespace] has removed extra spaces
* from the string.
@@ -14,3 +15,13 @@ fun String.normalizeWhitespace(): String {
fun String.removeWhitespace(): String {
return this.normalizeWhitespace().replace(" ", "")
}
+
+/**
+ *Checks if the string contains a placeholder in the form of "%s" or "%1$s".
+ * The placeholder may include an optional number followed by a '$' symbol.
+ * @return `true` if the string contains a placeholder, `false` otherwise.
+ */
+fun String.containsPlaceholderRegex(): Boolean {
+ val placeholderRegex = Regex("""%([0-9]+\$)?[a-zA-Z]""")
+ return placeholderRegex.containsMatchIn(this)
+}