Skip to content

Commit 8c81c98

Browse files
Fix #52: Finalize release 0.11 (#5010)
## Explanation Fixes #52 This PR finishes up a bunch of separate tasks relating to the 0.11 release of the Oppia Android app. ### Release plans Note that a lot of the tasks addressed were completed out-of-band (hence the lack of tracking issues). These are needed to prepare for the following release changes: - A new version of the alpha app will be launched to provide a basis of testing spotlights - A new version of the Kenya alpha app will be launched (since those users are still in transitionary state to the beta version of the app until later this year) - A new version of the beta version of the app to include dark mode, the new language selector, and more ### Overview #### Language support changes - Arabic and Nigerian Pidgin (Naija) languages were added to production builds (Naija was added generally as it wasn't supported previously). Both languages were also added as possible audio languages. - Some basic tests were added to cover Arabic and Naija now being available, though some tests ended up being omitted due to the inherent complexity of testing these particular languages in certain cases (Arabic because it's RTL and Naija because Android doesn't actually support it natively--see below explanation). - Also added Nigeria as a language region. We don't yet have a strong grasp on the regions in which Arabic will be used, so that's being kept as a broad language for now. We may refine this in the future. - The translations for Nigerian Pidgin are added here as a replacement to #5009 since the original translations had some formatting issues that were identified by @adhiamboperes and subsequently fixed by our translation volunteers. Since we can't wait for another push to #5009, this PR is just introducing the strings directly. - ``AndroidLocaleFactory`` was largely rebuilt to make better use of code sharing, but its actual functionality needed to change due to the Naija support problems mentioned below. #### New feature: spotlights (alpha-only) - A new alpha module was added to allow the team to stage features specific to alpha builds, and spotlights were added as an initial use case for this new capability. - As part of testing spotlights I noticed that the background overlay was too dark (it was fully occluding the background), so I changed it to something that's dark but still semi-translucent. See the UI part of the description below for a before-and-after. #### New feature: in-app language selector (all users) - This PR enables the new language selector introduced by #4762 by default as part of addressing #52. - Some small fast-follow nits from #4762 were addressed (see #4762 (comment) and #4762 (comment)). #### Event system changes - Introduced a new script for decoding the compressed base 64 event strings that can be generated during user studies (see explanation below for details). This has some basic fault tolerance built into it so that truncated event strings can still be partially decoded. - A debug event property was added which essentially amounts to an event count since app startup that's attached to each event. While this won't help us identify events outright missing, it will help us identify events missing between received events. This is aimed to help an ongoing investigation that has found the high probability that events are being lost between user action and Firebase's storage layer. #### Infrastructure changes - The minor version of the app is being bumped (since this is a major beta release of the app). - Version codes were bumped for 2 releases (since one re-release of the beta version of the app was needed a few weeks back due to it expiring). - This PR also quiets the output when creating AABs since currently ~5k lines are outputted during the final bundle assembly steps and this output is never useful to the user unless there's a build pipeline failure. - This PR fixes an error in the resource filtering output that is provided at the very end of the AAB creation process (previously it was outputting the number of configurations being filtered not the number of actual resources being removed). #### Improved support for future user studies - The EnableLearnerStudyAnalytics has been split into 3 flags (2 new ones): one that controls just whether to attach the sensitive profile IDs to events, one that controls the fast in-lesson language switcher (and corresponding admin-controlled profile setting for it), and one that controls access to the analytics screen + admins being able to mark lessons as completed for profiles (this is gated on the existing flag). - The analytics screen flag has been default enabled for regular alpha builds of the app so that this channel can be better utilized for user studies. The user ID and in-lesson language switcher aspects of the old learner study analytics feature are being kept off in alpha builds, only the analytics screen & related behavior is being made available. ### Nigerian Pidgin support issues The Android system does not formally support Nigerian Pidgin (Naija) despite the fact that it has a recognized ISO 639-3 language code. Naija is a creole language which means it's mostly a derivative of English with vernacular adaptations (such as recreated words and grammar alterations). I think that because it's mostly a derivative language and is mainly used for casual speaking (vs. formal communications), there isn't as much of a desire on the Android side to formally support it as a UI language. Fortunately, the Oppia Android app's localization system already supports forcing the system to rendering app strings that are not natively supported. However, this results in several considerations and has turned up one new issue that needed addressing: - Custom language overriding only works by matching _both_ language and region, so the language strings needed to be moved to ``values-pcm-rNG`` (for Nigeria locking). This doesn't stop the language from being used outside Nigeria, it's just a limitation in Android's resource qualifier system when working with custom languages. - It's not yet clear how the change in the values structure will affect Translatewiki--some additional work might be needed there (which will become clear once this PR is merged & Translatewiki attempts another branch sync). - Custom languages don't have the benefit of guaranteeing rendering support, so the language's script largely comes to mind. Fortunately, as a derivative of English Naija uses Latin-based script so there are no concerns with language rendering compatibility. - An issue was found in the localization system when handling fallbacks. Since Naija is English-based, this PR has configured its fallback language to be English. This led to the system actually prioritizing English app string translations rather than forcing the Naija strings. This required the changes that can be seen in ``AndroidLocaleFactory``. ### ``DecodeUserStudyEventString`` utility A new utility was introduced to decode the compressed Base64 string of events logs that can be exported from devices being used for user studies (i.e. whose admins have access to the learner analytics screen). These logs represent the entirety of both pending and uploaded logs since the introduction of the feature (but only for devices that have the learner study enabled). The utility reads an input file containing a single instance of the string (and automatically strips newline and horizontal space formatting since the output from the app includes line-wrapping) and outputs it to one of three indicated formats: textproto, JSON, or Yaml. The script can be run in a local terminal from this branch (or ``develop`` once it's checked in) at the repository root by running: ```sh bazel run //scripts:decode_user_study_event_string -- $(pwd)/input.log $(pwd)/output.json ``` (where 'input.log' exists in the local repository root, and 'output.json' will be written to the local repository root). For use outside of Bazel, one can use a pre-built deployment Jar file by running: ```sh java -jar decode_user_study_event_string_deploy.jar input.log output.json ``` (Note that the error output for this command will be assuming Bazel is being used, so some adjustment may be needed to interpret CLI errors when using the deploy Jar). ### Third-party dependency updates Some new dependencies were needed for the new ``DecodeUserStudyEventString`` utility to make the implementation much simpler: - Protobuf's Java util (https://cloud.google.com/java/docs/reference/protobuf/latest/com.google.protobuf.util) for conversion from proto to json. - A converter from JSON to Yaml (since there's no direct proto-to-yaml conversion): https://github.com/xlate/yaml-json. - The Jakarta JSON API (required by the converter): https://jakarta.ee/specifications/platform/9/apidocs/jakarta/json/json. - The Jakarta JSON Parsson implementation (runtime dependency required by the converter): https://github.com/eclipse-ee4j/parsson. - Snakeyaml implementation (runtime dependency required by the converter): https://github.com/snakeyaml/snakeyaml. This required an update to maven_install.json, but no changes are needed in tracked Maven dependency licenses since these are not dependencies that are deployed with the app to end users. The above do result in an incidental update to Gson 2.8.6 (from the current 2.8.5 used). I don't expect that this actually will affect the release much since Gson isn't used broadly, and this is a minor update to Gson. ### Exemptions & test notes Two new files were exempted for tests: - ``PlatformParameterAlphaModule``: while we can test modules, I'm not actually keen on testing the platform parameter modules at this time because staging is generally messy at the moment with a lot of duplication across multiple modules, so the test complexity isn't small. A lot of the platform parameter system needs to be streamlined, but that's largely dependent on #1720 being finished. - ``DecodeUserStudyEventString`` while not particularly difficult to test, this is a special local analytics tool that will rarely be used and is very unlikely to break. Since I'm strapped for time on this PR, I'm forgoing adding tests for this utility. Regarding broad testing coverage, everything has had corresponding testing additions or changes where applicable. This PR might not have quite as much testing thoroughness as other PRs, but it does largely cover the core scenarios. ## Essential Checklist - [x] The PR title and explanation each start with "Fix #bugnum: " (If this PR fixes part of an issue, prefix the title with "Fix part of #bugnum: ...".) - [x] Any changes to [scripts/assets](https://github.com/oppia/oppia-android/tree/develop/scripts/assets) files have their rationale included in the PR explanation. - [x] The PR follows the [style guide](https://github.com/oppia/oppia-android/wiki/Coding-style-guide). - [x] The PR does not contain any unnecessary code changes from Android Studio ([reference](https://github.com/oppia/oppia-android/wiki/Guidance-on-submitting-a-PR#undo-unnecessary-changes)). - [x] The PR is made from a branch that's **not** called "develop" and is up-to-date with "develop". - [x] The PR is **assigned** to the appropriate reviewers ([reference](https://github.com/oppia/oppia-android/wiki/Guidance-on-submitting-a-PR#clarification-regarding-assignees-and-reviewers-section)). ## For UI-specific PRs only Spotlights changes before/after: | Old spotlights background | New spotlights background | |--------|--------| | https://github.com/oppia/oppia-android/assets/12983742/a8df7807-1bb6-45be-b53a-6d057f4a5931 | https://github.com/oppia/oppia-android/assets/12983742/e499f4b6-4609-4e58-871f-a09ebd09a80d | Video demonstrating the new functionality in the app, including alpha access to the learner analytics screen and support for both Nigerian Pidgin and Arabic (and via the in-app language selector): https://github.com/oppia/oppia-android/assets/12983742/c0a92393-a8a3-4634-af5b-2e7fc35ecd97 --------- Co-authored-by: translatewiki.net <l10n-bot@translatewiki.net>
1 parent f727c06 commit 8c81c98

File tree

70 files changed

+2800
-627
lines changed

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

70 files changed

+2800
-627
lines changed

app/src/main/java/org/oppia/android/app/administratorcontrols/learneranalytics/ControlButtonsViewModel.kt

Lines changed: 22 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -14,9 +14,11 @@ import org.oppia.android.domain.oppialogger.OppiaLogger
1414
import org.oppia.android.domain.oppialogger.analytics.AnalyticsController
1515
import org.oppia.android.util.data.AsyncResult
1616
import org.oppia.android.util.data.DataProviders.Companion.toLiveData
17+
import org.oppia.android.util.locale.OppiaLocale
1718
import org.oppia.android.util.logging.SyncStatusManager
1819
import org.oppia.android.util.logging.SyncStatusManager.SyncStatus
1920
import java.io.ByteArrayOutputStream
21+
import java.security.MessageDigest
2022
import java.util.Base64
2123
import java.util.zip.GZIPOutputStream
2224
import javax.inject.Inject
@@ -31,6 +33,7 @@ class ControlButtonsViewModel private constructor(
3133
private val activity: AppCompatActivity,
3234
private val analyticsController: AnalyticsController,
3335
private val syncStatusManager: SyncStatusManager,
36+
private val machineLocale: OppiaLocale.MachineLocale,
3437
private val viewModels: List<ProfileListItemViewModel>
3538
) : ProfileListItemViewModel(ProfileListViewModel.ProfileListItemViewType.SHARE_IDS) {
3639
private var monitoredUploadProgress: LiveData<ForceSyncProgress> =
@@ -73,10 +76,17 @@ class ControlButtonsViewModel private constructor(
7376
)
7477
}
7578
is SyncStatusItemViewModel -> {
79+
val halfLineCount = BASE64_LINE_WRAP_LIMIT / 2
80+
val logsStr = logs?.toCompressedBase64()
7681
listOf(
7782
"Current sync status: ${viewModel.syncStatus.value}.",
83+
"Event log encoding integrity checks:",
84+
"- First $halfLineCount chars of encoded string: ${logsStr?.take(halfLineCount)}",
85+
"- Last $halfLineCount chars of encoded string: ${logsStr?.takeLast(halfLineCount)}",
86+
"- SHA-1 hash (unwrapped event string): ${logsStr?.computeSha1Hash(machineLocale)}",
87+
"- Total event string length (unwrapped): ${logsStr?.length}",
7888
"Encoded event logs:"
79-
) + (logs?.toCompressedBase64()?.chunked(BASE64_LINE_WRAP_LIMIT) ?: listOf("Missing"))
89+
) + (logsStr?.chunked(BASE64_LINE_WRAP_LIMIT) ?: listOf("Missing"))
8090
}
8191
else -> null
8292
}
@@ -198,12 +208,13 @@ class ControlButtonsViewModel private constructor(
198208
private val oppiaLogger: OppiaLogger,
199209
private val activity: AppCompatActivity,
200210
private val analyticsController: AnalyticsController,
201-
private val syncStatusManager: SyncStatusManager
211+
private val syncStatusManager: SyncStatusManager,
212+
private val machineLocale: OppiaLocale.MachineLocale
202213
) {
203214
/** Returns a new [ControlButtonsViewModel]. */
204215
fun create(viewModels: List<ProfileListItemViewModel>): ControlButtonsViewModel {
205216
return ControlButtonsViewModel(
206-
oppiaLogger, activity, analyticsController, syncStatusManager, viewModels
217+
oppiaLogger, activity, analyticsController, syncStatusManager, machineLocale, viewModels
207218
)
208219
}
209220
}
@@ -219,5 +230,13 @@ class ControlButtonsViewModel private constructor(
219230
}.toByteArray()
220231
return Base64.getEncoder().encodeToString(compressedMessage)
221232
}
233+
234+
private fun String.computeSha1Hash(machineLocale: OppiaLocale.MachineLocale): String {
235+
return machineLocale.run {
236+
MessageDigest.getInstance("SHA-1")
237+
.digest(this@computeSha1Hash.toByteArray())
238+
.joinToString("") { "%02x".formatForMachines(it) }
239+
}
240+
}
222241
}
223242
}

app/src/main/java/org/oppia/android/app/application/alpha/AlphaApplicationComponent.kt

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -37,7 +37,7 @@ import org.oppia.android.domain.oppialogger.analytics.CpuPerformanceSnapshotterM
3737
import org.oppia.android.domain.oppialogger.exceptions.UncaughtExceptionLoggerModule
3838
import org.oppia.android.domain.oppialogger.logscheduler.MetricLogSchedulerModule
3939
import org.oppia.android.domain.oppialogger.loguploader.LogReportWorkerModule
40-
import org.oppia.android.domain.platformparameter.PlatformParameterModule
40+
import org.oppia.android.domain.platformparameter.PlatformParameterAlphaModule
4141
import org.oppia.android.domain.platformparameter.PlatformParameterSingletonModule
4242
import org.oppia.android.domain.platformparameter.syncup.PlatformParameterSyncUpWorkerModule
4343
import org.oppia.android.domain.question.QuestionModule
@@ -85,7 +85,7 @@ import javax.inject.Singleton
8585
ApplicationStartupListenerModule::class, LogReportWorkerModule::class,
8686
WorkManagerConfigurationModule::class, HintsAndSolutionConfigModule::class,
8787
FirebaseLogUploaderModule::class, NetworkModule::class,
88-
PlatformParameterModule::class, PlatformParameterSingletonModule::class,
88+
PlatformParameterAlphaModule::class, PlatformParameterSingletonModule::class,
8989
ExplorationStorageModule::class, DeveloperOptionsModule::class,
9090
PlatformParameterSyncUpWorkerModule::class, NetworkConfigProdModule::class, AssetModule::class,
9191
LocaleProdModule::class, ActivityRecreatorProdModule::class, ActivityRouterModule::class,

app/src/main/java/org/oppia/android/app/drawer/NavigationDrawerFragmentPresenter.kt

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -427,7 +427,9 @@ class NavigationDrawerFragmentPresenter @Inject constructor(
427427

428428
override fun onDrawerClosed(drawerView: View) {
429429
super.onDrawerClosed(drawerView)
430-
fragment.activity!!.invalidateOptionsMenu()
430+
// It's possible in some rare cases for the activity to be gone while the drawer is
431+
// closing (possibly an out-of-lifecycle call from the AndroidX component).
432+
fragment.activity?.invalidateOptionsMenu()
431433
StatusBarColor.statusBarColorUpdate(
432434
R.color.component_color_shared_activity_status_bar_color,
433435
activity,

app/src/main/java/org/oppia/android/app/home/recentlyplayed/PromotedStoryViewModel.kt

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -41,7 +41,8 @@ class PromotedStoryViewModel(
4141

4242
/**
4343
* Starts [ResumeLessonActivity] if a saved exploration is selected or [ExplorationActivity] if an
44-
* un-started recommended story is selected. */
44+
* un-started recommended story is selected.
45+
*/
4546
fun clickOnPromotedStoryTile(@Suppress("UNUSED_PARAMETER") v: View) {
4647
promotedStoryClickListener.promotedStoryClicked(promotedStory)
4748
}

app/src/main/java/org/oppia/android/app/options/OptionControlsViewModel.kt

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -29,7 +29,7 @@ private const val OPTIONS_ITEM_VIEW_MODEL_LIST_PROVIDER_ID =
2929
/** Options settings view model for the recycler view in [OptionsFragment]. */
3030
@FragmentScope
3131
class OptionControlsViewModel @Inject constructor(
32-
val activity: AppCompatActivity,
32+
activity: AppCompatActivity,
3333
private val profileManagementController: ProfileManagementController,
3434
private val oppiaLogger: OppiaLogger,
3535
@EnableLanguageSelectionUi private val enableLanguageSelectionUi: PlatformParameterValue<Boolean>,

app/src/main/java/org/oppia/android/app/player/audio/AudioFragmentPresenter.kt

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -175,6 +175,8 @@ class AudioFragmentPresenter @Inject constructor(
175175
AudioLanguage.FRENCH_AUDIO_LANGUAGE -> "fr"
176176
AudioLanguage.CHINESE_AUDIO_LANGUAGE -> "zh"
177177
AudioLanguage.BRAZILIAN_PORTUGUESE_LANGUAGE -> "pt"
178+
AudioLanguage.ARABIC_LANGUAGE -> "ar"
179+
AudioLanguage.NIGERIAN_PIDGIN_LANGUAGE -> "pcm"
178180
AudioLanguage.NO_AUDIO, AudioLanguage.UNRECOGNIZED, AudioLanguage.AUDIO_LANGUAGE_UNSPECIFIED,
179181
AudioLanguage.ENGLISH_AUDIO_LANGUAGE -> "en"
180182
}

app/src/main/java/org/oppia/android/app/player/audio/LanguageDialogFragment.kt

Lines changed: 19 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,10 @@ import androidx.appcompat.view.ContextThemeWrapper
88
import org.oppia.android.R
99
import org.oppia.android.app.fragment.FragmentComponentImpl
1010
import org.oppia.android.app.fragment.InjectableDialogFragment
11-
import java.util.Locale
11+
import org.oppia.android.app.model.AudioLanguage
12+
import org.oppia.android.app.translation.AppLanguageResourceHandler
13+
import org.oppia.android.util.locale.OppiaLocale
14+
import javax.inject.Inject
1215
import kotlin.collections.ArrayList
1316

1417
private const val LANGUAGE_LIST_ARGUMENT_KEY = "LanguageDialogFragment.language_list"
@@ -18,6 +21,9 @@ private const val SELECTED_INDEX_ARGUMENT_KEY = "LanguageDialogFragment.selected
1821
* DialogFragment that controls language selection in audio and written translations.
1922
*/
2023
class LanguageDialogFragment : InjectableDialogFragment() {
24+
@Inject lateinit var appLanguageResourceHandler: AppLanguageResourceHandler
25+
@Inject lateinit var machineLocale: OppiaLocale.MachineLocale
26+
2127
companion object {
2228
/**
2329
* This function is responsible for displaying content in DialogFragment.
@@ -55,13 +61,21 @@ class LanguageDialogFragment : InjectableDialogFragment() {
5561
val languageNameArrayList = ArrayList<String>()
5662

5763
for (languageCode in languageCodeArrayList) {
64+
val audioLanguage = when (machineLocale.run { languageCode.toMachineLowerCase() }) {
65+
"hi" -> AudioLanguage.HINDI_AUDIO_LANGUAGE
66+
"fr" -> AudioLanguage.FRENCH_AUDIO_LANGUAGE
67+
"zh" -> AudioLanguage.CHINESE_AUDIO_LANGUAGE
68+
"pt", "pt-br" -> AudioLanguage.BRAZILIAN_PORTUGUESE_LANGUAGE
69+
"ar" -> AudioLanguage.ARABIC_LANGUAGE
70+
"pcm" -> AudioLanguage.NIGERIAN_PIDGIN_LANGUAGE
71+
else -> AudioLanguage.ENGLISH_AUDIO_LANGUAGE
72+
}
5873
if (languageCode == "hi-en") {
5974
languageNameArrayList.add("Hinglish")
6075
} else {
61-
// TODO(#3791): Remove this dependency.
62-
val locale = Locale(languageCode)
63-
val name = locale.getDisplayLanguage(locale)
64-
languageNameArrayList.add(name)
76+
languageNameArrayList.add(
77+
appLanguageResourceHandler.computeLocalizedDisplayName(audioLanguage)
78+
)
6579
}
6680
}
6781

app/src/main/java/org/oppia/android/app/player/state/StateViewModel.kt

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -26,7 +26,7 @@ import org.oppia.android.domain.translation.TranslationController
2626
import org.oppia.android.util.data.AsyncResult
2727
import org.oppia.android.util.data.DataProviders.Companion.toLiveData
2828
import org.oppia.android.util.locale.OppiaLocale
29-
import org.oppia.android.util.platformparameter.EnableLearnerStudyAnalytics
29+
import org.oppia.android.util.platformparameter.EnableFastLanguageSwitchingInLesson
3030
import org.oppia.android.util.platformparameter.PlatformParameterValue
3131
import javax.inject.Inject
3232

@@ -39,7 +39,8 @@ class StateViewModel @Inject constructor(
3939
private val oppiaLogger: OppiaLogger,
4040
private val fragment: Fragment,
4141
private val profileManagementController: ProfileManagementController,
42-
@EnableLearnerStudyAnalytics private val enableLearnerStudy: PlatformParameterValue<Boolean>
42+
@EnableFastLanguageSwitchingInLesson
43+
private val enableFastLanguageSwitchingInLesson: PlatformParameterValue<Boolean>
4344
) : ObservableViewModel() {
4445
val itemList: ObservableList<StateItemViewModel> = ObservableArrayList()
4546
val rightItemList: ObservableList<StateItemViewModel> = ObservableArrayList()
@@ -52,7 +53,7 @@ class StateViewModel @Inject constructor(
5253
val isHintBulbVisible = ObservableField(false)
5354
val isHintOpenedAndUnRevealed = ObservableField(false)
5455

55-
val hasSupportForSwitchingToSwahili: Boolean = enableLearnerStudy.value
56+
val hasSupportForSwitchingToSwahili: Boolean = enableFastLanguageSwitchingInLesson.value
5657
val hasSwahiliTranslations: LiveData<Boolean> by lazy {
5758
Transformations.map(
5859
explorationProgressController.getCurrentState().toLiveData(),

app/src/main/java/org/oppia/android/app/settings/profile/ProfileEditViewModel.kt

Lines changed: 6 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,7 @@ import org.oppia.android.domain.profile.ProfileManagementController
1111
import org.oppia.android.util.data.AsyncResult
1212
import org.oppia.android.util.data.DataProviders.Companion.toLiveData
1313
import org.oppia.android.util.platformparameter.EnableDownloadsSupport
14+
import org.oppia.android.util.platformparameter.EnableFastLanguageSwitchingInLesson
1415
import org.oppia.android.util.platformparameter.EnableLearnerStudyAnalytics
1516
import org.oppia.android.util.platformparameter.PlatformParameterValue
1617
import javax.inject.Inject
@@ -21,15 +22,18 @@ class ProfileEditViewModel @Inject constructor(
2122
private val oppiaLogger: OppiaLogger,
2223
private val profileManagementController: ProfileManagementController,
2324
@EnableDownloadsSupport private val enableDownloadsSupport: PlatformParameterValue<Boolean>,
24-
@EnableLearnerStudyAnalytics private val enableLearnerStudy: PlatformParameterValue<Boolean>
25+
@EnableLearnerStudyAnalytics private val enableLearnerStudy: PlatformParameterValue<Boolean>,
26+
@EnableFastLanguageSwitchingInLesson
27+
private val enableFastLanguageSwitchingInLesson: PlatformParameterValue<Boolean>
2528
) : ObservableViewModel() {
2629
private lateinit var profileId: ProfileId
2730

2831
/** Whether the admin is allowed to mark chapters as finished. */
2932
val isAllowedToMarkFinishedChapters: Boolean = enableLearnerStudy.value
3033

3134
/** Whether the admin can allow learners to quickly switch content languages within a lesson. */
32-
val isAllowedToEnableQuickLessonLanguageSwitching: Boolean = enableLearnerStudy.value
35+
val isAllowedToEnableQuickLessonLanguageSwitching: Boolean =
36+
enableFastLanguageSwitchingInLesson.value
3337

3438
/** List of all the current profiles registered in the app [ProfileListFragment]. */
3539
val profile: LiveData<Profile> by lazy {

app/src/main/java/org/oppia/android/app/spotlight/SpotlightFragment.kt

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -154,7 +154,7 @@ class SpotlightFragment : InjectableFragment(), SpotlightNavigationListener, Spo
154154
if (targetList.isNullOrEmpty()) return
155155
spotlight = Spotlight.Builder(activity)
156156
.setTargets(targetList)
157-
.setBackgroundColorRes(R.color.component_color_shared_close_spotlight_button_color)
157+
.setBackgroundColorRes(R.color.component_color_shared_spotlight_overlay_background_color)
158158
.setDuration(500L)
159159
.setAnimation(AccelerateInterpolator(0.5f))
160160
.setOnSpotlightListener(object : OnSpotlightListener {

0 commit comments

Comments
 (0)