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 71b759c6475..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 @@ -23,6 +23,7 @@ android { includeCompileClasspath true } } + vectorDrawables { useSupportLibrary true } } compileOptions { sourceCompatibility JavaVersion.VERSION_1_8 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/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/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/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/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 85133c883a0..e5c5defae96 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 @@ -475,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 @@ -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 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:
  1. From the Profile Chooser, tap on Set up Multiple Profiles.
  2. Create a PIN and Save.
  3. Fill in all fields for the profile.
    1. (Optional) Upload a photo.
    2. Enter a name.
    3. (Optional) Assign a 3-digit PIN.
  4. Tap Create. This profile is added to your Profile Chooser!

If you have created a profile before and have a PIN:

  1. From the Profile Chooser, tap on Add Profile.
  2. Enter your PIN and tap Submit.
  3. Fill in all fields for the profile.
    1. (Optional) Upload a photo.
    2. Enter a name.
    3. (Optional) Assign a 3-digit PIN.
  4. Tap Create. This profile is added to your Profile Chooser!


Note: Only the Administrator is able to manage profiles.

]]>
- Once a profile is deleted:

  1. The profile cannot be recovered.
  2. Profile information such as name, photos, and progress will be permanently deleted.

To delete a profile (excluding the Administrator\'s):

  1. From the Administrator\'s Home Page, tap on the menu button on the top left.
  2. Tap on Administrator Controls.
  3. Tap on Edit Profiles.
  4. Tap on the Profile you would like to delete.
  5. At the bottom of the screen, tap Profile Deletion.
  6. Tap Delete to confirm deletion.


Note: Only the Administrator is able to manage profiles.

]]>
- To change your email/phone number:

  1. From the Administrator\'s Home Page, tap on the menu button on the top left.
  2. Tap on Administrator Controls.
  3. Tap on Edit Account.


If you want to change your email:

  1. Enter your new email and tap Save.
  2. 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:

  1. Enter your new phone number and tap Verify.
  2. 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:
  1. From the Profile Chooser, tap on Set up Multiple Profiles.
  2. Create a PIN and Save.
  3. Fill in all fields for the profile.
    1. (Optional) Upload a photo.
    2. Enter a name.
    3. (Optional) Assign a 3-digit PIN.
  4. Tap Create. This profile is added to your Profile Chooser!

If you have created a profile before and have a PIN:

  1. From the Profile Chooser, tap on Add Profile.
  2. Enter your PIN and tap Submit.
  3. Fill in all fields for the profile.
    1. (Optional) Upload a photo.
    2. Enter a name.
    3. (Optional) Assign a 3-digit PIN.
  4. 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.

]]>
+
  1. From your %s app home screen, tap the menu in the top left corner.
  2. Tap Share feedback.
  3. 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:

    1. The profile cannot be recovered.
    2. Profile information such as name, photos, and progress will be permanently deleted.

    To delete a profile (excluding the Administrator\'s):

    1. From the Administrator\'s Home Page, tap on the menu button on the top left.
    2. Tap on Administrator Controls.
    3. Tap on Edit Profiles.
    4. Tap on the Profile you would like to delete.
    5. At the bottom of the screen, tap Profile Deletion.
    6. Tap Delete to confirm deletion.


    Note: Only the Administrator is able to manage profiles.

    ]]>
    + To change your email/phone number:

    1. From the Administrator\'s Home Page, tap on the menu button on the top left.
    2. Tap on Administrator Controls.
    3. Tap on Edit Account.


    If you want to change your email:

    1. Enter your new email and tap Save.
    2. 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:

    1. Enter your new phone number and tap Verify.
    2. 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. Open the Google Play Store app.
    2. Search for the %s app.
    3. Tap Update.

      ]]> +
      1. Tap your phone\'s Settings app.
      2. Tap System updates.
      3. 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/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..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 @@ -226,7 +226,6 @@ class ExplorationActivityTest { @Before fun setUp() { Intents.init() - TestPlatformParameterModule.forceEnableContinueButtonAnimation(false) setUpTestApplicationComponent() testCoroutineDispatchers.registerIdlingResource() profileTestHelper.initializeProfiles() @@ -1898,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() { @@ -2304,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/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/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/main/java/org/oppia/android/domain/platformparameter/PlatformParameterAlphaKenyaModule.kt b/domain/src/main/java/org/oppia/android/domain/platformparameter/PlatformParameterAlphaKenyaModule.kt index 1b3293d56f5..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,11 +4,13 @@ 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_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,8 +19,8 @@ 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.EnableContinueButtonAnimation import org.oppia.android.util.platformparameter.EnableDownloadsSupport import org.oppia.android.util.platformparameter.EnableEditAccountsOptionsUi import org.oppia.android.util.platformparameter.EnableExtraTopicTabsUi @@ -32,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 @@ -58,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 @@ -72,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 @@ -106,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 ) } @@ -201,40 +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 - @EnableContinueButtonAnimation - fun provideEnableContinueButtonAnimation(): PlatformParameterValue { - return PlatformParameterValue.createDefaultParameter( - ENABLE_CONTINUE_BUTTON_ANIMATION_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 8addae7b9fd..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,11 +4,13 @@ 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_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 @@ -16,8 +18,8 @@ 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.EnableContinueButtonAnimation import org.oppia.android.util.platformparameter.EnableDownloadsSupport import org.oppia.android.util.platformparameter.EnableEditAccountsOptionsUi import org.oppia.android.util.platformparameter.EnableExtraTopicTabsUi @@ -32,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 @@ -59,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 @@ -69,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 @@ -103,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 ) } @@ -197,39 +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 - @EnableContinueButtonAnimation - fun provideEnableContinueButtonAnimation(): PlatformParameterValue { - return PlatformParameterValue.createDefaultParameter( - ENABLE_CONTINUE_BUTTON_ANIMATION_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 c2a211472fc..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,11 +4,13 @@ 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_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,8 +19,8 @@ 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.EnableContinueButtonAnimation import org.oppia.android.util.platformparameter.EnableDownloadsSupport import org.oppia.android.util.platformparameter.EnableEditAccountsOptionsUi import org.oppia.android.util.platformparameter.EnableExtraTopicTabsUi @@ -33,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 @@ -61,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 @@ -71,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 @@ -105,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 ) } @@ -199,42 +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 - @EnableContinueButtonAnimation - fun provideEnableContinueButtonAnimation(): PlatformParameterValue { - return PlatformParameterValue.createDefaultParameter( - ENABLE_CONTINUE_BUTTON_ANIMATION_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/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/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/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/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/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/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/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/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) +} 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 { 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 8cb1e1b4297..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,34 +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 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. @@ -243,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 + ) } } 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