Skip to content

Commit 6237fbb

Browse files
committed
Plug in new onboarding and profile configuration logic
1 parent 9192df2 commit 6237fbb

File tree

7 files changed

+113
-9
lines changed

7 files changed

+113
-9
lines changed

app/src/main/java/org/oppia/android/app/splash/SplashActivityPresenter.kt

Lines changed: 73 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
package org.oppia.android.app.splash
22

3+
import android.annotation.SuppressLint
34
import android.content.ActivityNotFoundException
45
import android.content.Intent
56
import android.net.Uri
@@ -13,6 +14,8 @@ import org.oppia.android.app.model.AppStartupState
1314
import org.oppia.android.app.model.AppStartupState.BuildFlavorNoticeMode
1415
import org.oppia.android.app.model.AppStartupState.StartupMode
1516
import org.oppia.android.app.model.BuildFlavor
17+
import org.oppia.android.app.model.Profile
18+
import org.oppia.android.app.model.ProfileOnboardingState
1619
import org.oppia.android.app.notice.AutomaticAppDeprecationNoticeDialogFragment
1720
import org.oppia.android.app.notice.BetaNoticeDialogFragment
1821
import org.oppia.android.app.notice.GeneralAvailabilityUpgradeNoticeDialogFragment
@@ -24,13 +27,16 @@ import org.oppia.android.databinding.SplashActivityBinding
2427
import org.oppia.android.domain.locale.LocaleController
2528
import org.oppia.android.domain.onboarding.AppStartupStateController
2629
import org.oppia.android.domain.oppialogger.OppiaLogger
30+
import org.oppia.android.domain.profile.ProfileManagementController
2731
import org.oppia.android.domain.topic.PrimeTopicAssetsController
2832
import org.oppia.android.domain.translation.TranslationController
2933
import org.oppia.android.util.data.AsyncResult
3034
import org.oppia.android.util.data.DataProvider
3135
import org.oppia.android.util.data.DataProviders.Companion.combineWith
3236
import org.oppia.android.util.data.DataProviders.Companion.toLiveData
3337
import org.oppia.android.util.locale.OppiaLocale
38+
import org.oppia.android.util.platformparameter.EnableOnboardingFlowV2
39+
import org.oppia.android.util.platformparameter.PlatformParameterValue
3440
import javax.inject.Inject
3541

3642
private const val AUTO_DEPRECATION_NOTICE_DIALOG_FRAGMENT_TAG = "auto_deprecation_notice_dialog"
@@ -39,6 +45,7 @@ private const val GA_UPDATE_NOTICE_DIALOG_FRAGMENT_TAG = "general_availability_u
3945
private const val SPLASH_INIT_STATE_DATA_PROVIDER_ID = "splash_init_state_data_provider"
4046

4147
/** The presenter for [SplashActivity]. */
48+
@SuppressLint("CustomSplashScreen")
4249
@ActivityScope
4350
class SplashActivityPresenter @Inject constructor(
4451
private val activity: AppCompatActivity,
@@ -49,7 +56,10 @@ class SplashActivityPresenter @Inject constructor(
4956
private val localeController: LocaleController,
5057
private val appLanguageLocaleHandler: AppLanguageLocaleHandler,
5158
private val lifecycleSafeTimerFactory: LifecycleSafeTimerFactory,
52-
private val currentBuildFlavor: BuildFlavor
59+
private val currentBuildFlavor: BuildFlavor,
60+
@EnableOnboardingFlowV2
61+
private val enableOnboardingFlowV2: PlatformParameterValue<Boolean>,
62+
private val profileManagementController: ProfileManagementController
5363
) {
5464
lateinit var startupMode: StartupMode
5565

@@ -211,6 +221,9 @@ class SplashActivityPresenter @Inject constructor(
211221
AutomaticAppDeprecationNoticeDialogFragment::newInstance
212222
)
213223
}
224+
StartupMode.ONBOARDING_FLOW_V2 -> {
225+
computeRoute()
226+
}
214227
else -> {
215228
// In all other cases (including errors when the startup state fails to load or is
216229
// defaulted), assume the user needs to be onboarded.
@@ -220,6 +233,65 @@ class SplashActivityPresenter @Inject constructor(
220233
}
221234
}
222235

236+
private fun computeRoute() {
237+
// Use SplashActivityViewModel to retrieve the profile type and onboarding status
238+
// Based on the returned profile information, compute route as follows:
239+
when (getProfileOnboardingState()) {
240+
ProfileOnboardingState.NEW_INSTALL -> {
241+
// route to new app language selection screen
242+
}
243+
ProfileOnboardingState.SOLE_LEARNER_PROFILE -> {
244+
// route = home screen
245+
}
246+
else -> {
247+
// route = profile selection screen
248+
if (enableOnboardingFlowV2.value) {
249+
// new vs old profile chooser
250+
}
251+
activity.startActivity(ProfileChooserActivity.createProfileChooserActivity(activity))
252+
}
253+
}
254+
}
255+
256+
/** Returns the state of the app based on the number of existing profiles. */
257+
private fun getProfileOnboardingState(): ProfileOnboardingState {
258+
var profileList = listOf<Profile>()
259+
profileManagementController.getProfiles().toLiveData().observe(
260+
activity,
261+
{ result ->
262+
when (result) {
263+
is AsyncResult.Success -> {
264+
profileList = result.value
265+
}
266+
is AsyncResult.Failure -> {
267+
oppiaLogger.e(
268+
"SplashActivityViewModel",
269+
"Encountered unexpected non-successful result when fetching profiles",
270+
result.error
271+
)
272+
}
273+
else -> {} // no-op
274+
}
275+
}
276+
)
277+
278+
return when {
279+
profileList.size > 1 -> {
280+
ProfileOnboardingState.MULTIPLE_PROFILES
281+
}
282+
profileList.size == 1 -> {
283+
if (profileList.first().isAdmin && profileList.first().hasPin) {
284+
ProfileOnboardingState.ADMIN_PROFILE_ONLY
285+
} else {
286+
ProfileOnboardingState.SOLE_LEARNER_PROFILE
287+
}
288+
}
289+
else -> {
290+
ProfileOnboardingState.NEW_INSTALL
291+
}
292+
}
293+
}
294+
223295
private fun computeInitStateDataProvider(): DataProvider<SplashInitState> {
224296
val startupStateDataProvider = appStartupStateController.getAppStartupState()
225297
val systemAppLanguageLocaleDataProvider = translationController.getSystemLanguageLocale()

domain/src/main/java/org/oppia/android/domain/onboarding/AppStartupStateController.kt

Lines changed: 8 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,8 @@ import org.oppia.android.util.data.DataProvider
1111
import org.oppia.android.util.data.DataProviders.Companion.transform
1212
import org.oppia.android.util.extensions.getStringFromBundle
1313
import org.oppia.android.util.locale.OppiaLocale
14+
import org.oppia.android.util.platformparameter.EnableOnboardingFlowV2
15+
import org.oppia.android.util.platformparameter.PlatformParameterValue
1416
import javax.inject.Inject
1517
import javax.inject.Singleton
1618

@@ -23,7 +25,9 @@ class AppStartupStateController @Inject constructor(
2325
private val oppiaLogger: OppiaLogger,
2426
private val expirationMetaDataRetriever: ExpirationMetaDataRetriever,
2527
private val machineLocale: OppiaLocale.MachineLocale,
26-
private val currentBuildFlavor: BuildFlavor
28+
private val currentBuildFlavor: BuildFlavor,
29+
@EnableOnboardingFlowV2
30+
private val enableOnboardingFlowV2: PlatformParameterValue<Boolean>
2731
) {
2832
private val onboardingFlowStore by lazy {
2933
cacheStoreFactory.create("on_boarding_flow", OnboardingState.getDefaultInstance())
@@ -119,6 +123,9 @@ class AppStartupStateController @Inject constructor(
119123
return when {
120124
hasAppExpired() -> StartupMode.APP_IS_DEPRECATED
121125
onboardingState.alreadyOnboardedApp -> StartupMode.USER_IS_ONBOARDED
126+
enableOnboardingFlowV2.value -> {
127+
StartupMode.ONBOARDING_FLOW_V2
128+
}
122129
else -> StartupMode.USER_NOT_YET_ONBOARDED
123130
}
124131
}

domain/src/main/java/org/oppia/android/domain/platformparameter/PlatformParameterAlphaKenyaModule.kt

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -17,7 +17,6 @@ import org.oppia.android.util.platformparameter.ENABLE_EXTRA_TOPIC_TABS_UI_DEFAU
1717
import org.oppia.android.util.platformparameter.ENABLE_INTERACTION_CONFIG_CHANGE_STATE_RETENTION_DEFAULT_VALUE
1818
import org.oppia.android.util.platformparameter.ENABLE_NPS_SURVEY
1919
import org.oppia.android.util.platformparameter.ENABLE_NPS_SURVEY_DEFAULT_VALUE
20-
import org.oppia.android.util.platformparameter.ENABLE_LANGUAGE_SELECTION_UI_DEFAULT_VALUE
2120
import org.oppia.android.util.platformparameter.ENABLE_ONBOARDING_FLOW_V2_DEFAULT_VALUE
2221
import org.oppia.android.util.platformparameter.ENABLE_PERFORMANCE_METRICS_COLLECTION
2322
import org.oppia.android.util.platformparameter.ENABLE_PERFORMANCE_METRICS_COLLECTION_DEFAULT_VALUE

domain/src/main/java/org/oppia/android/domain/platformparameter/PlatformParameterAlphaModule.kt

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -17,7 +17,6 @@ import org.oppia.android.util.platformparameter.ENABLE_EXTRA_TOPIC_TABS_UI_DEFAU
1717
import org.oppia.android.util.platformparameter.ENABLE_INTERACTION_CONFIG_CHANGE_STATE_RETENTION_DEFAULT_VALUE
1818
import org.oppia.android.util.platformparameter.ENABLE_NPS_SURVEY
1919
import org.oppia.android.util.platformparameter.ENABLE_NPS_SURVEY_DEFAULT_VALUE
20-
import org.oppia.android.util.platformparameter.ENABLE_LANGUAGE_SELECTION_UI_DEFAULT_VALUE
2120
import org.oppia.android.util.platformparameter.ENABLE_ONBOARDING_FLOW_V2_DEFAULT_VALUE
2221
import org.oppia.android.util.platformparameter.ENABLE_PERFORMANCE_METRICS_COLLECTION
2322
import org.oppia.android.util.platformparameter.ENABLE_PERFORMANCE_METRICS_COLLECTION_DEFAULT_VALUE

domain/src/main/java/org/oppia/android/domain/platformparameter/PlatformParameterModule.kt

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -17,7 +17,6 @@ import org.oppia.android.util.platformparameter.ENABLE_EXTRA_TOPIC_TABS_UI_DEFAU
1717
import org.oppia.android.util.platformparameter.ENABLE_INTERACTION_CONFIG_CHANGE_STATE_RETENTION_DEFAULT_VALUE
1818
import org.oppia.android.util.platformparameter.ENABLE_NPS_SURVEY
1919
import org.oppia.android.util.platformparameter.ENABLE_NPS_SURVEY_DEFAULT_VALUE
20-
import org.oppia.android.util.platformparameter.ENABLE_LANGUAGE_SELECTION_UI_DEFAULT_VALUE
2120
import org.oppia.android.util.platformparameter.ENABLE_ONBOARDING_FLOW_V2_DEFAULT_VALUE
2221
import org.oppia.android.util.platformparameter.ENABLE_PERFORMANCE_METRICS_COLLECTION
2322
import org.oppia.android.util.platformparameter.ENABLE_PERFORMANCE_METRICS_COLLECTION_DEFAULT_VALUE
@@ -31,8 +30,8 @@ import org.oppia.android.util.platformparameter.EnableFastLanguageSwitchingInLes
3130
import org.oppia.android.util.platformparameter.EnableInteractionConfigChangeStateRetention
3231
import org.oppia.android.util.platformparameter.EnableLearnerStudyAnalytics
3332
import org.oppia.android.util.platformparameter.EnableLoggingLearnerStudyIds
34-
import org.oppia.android.util.platformparameter.EnableOnboardingFlowV2
3533
import org.oppia.android.util.platformparameter.EnableNpsSurvey
34+
import org.oppia.android.util.platformparameter.EnableOnboardingFlowV2
3635
import org.oppia.android.util.platformparameter.EnablePerformanceMetricsCollection
3736
import org.oppia.android.util.platformparameter.EnableSpotlightUi
3837
import org.oppia.android.util.platformparameter.FAST_LANGUAGE_SWITCHING_IN_LESSON

domain/src/main/java/org/oppia/android/domain/profile/ProfileManagementController.kt

Lines changed: 31 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -14,6 +14,7 @@ import org.oppia.android.app.model.Profile
1414
import org.oppia.android.app.model.ProfileAvatar
1515
import org.oppia.android.app.model.ProfileDatabase
1616
import org.oppia.android.app.model.ProfileId
17+
import org.oppia.android.app.model.ProfileType
1718
import org.oppia.android.app.model.ReadingTextSize
1819
import org.oppia.android.data.persistence.PersistentCacheStore
1920
import org.oppia.android.data.persistence.PersistentCacheStore.PublishMode
@@ -30,6 +31,7 @@ import org.oppia.android.util.data.DataProviders.Companion.transformAsync
3031
import org.oppia.android.util.locale.OppiaLocale
3132
import org.oppia.android.util.platformparameter.EnableLearnerStudyAnalytics
3233
import org.oppia.android.util.platformparameter.EnableLoggingLearnerStudyIds
34+
import org.oppia.android.util.platformparameter.EnableOnboardingFlowV2
3335
import org.oppia.android.util.platformparameter.PlatformParameterValue
3436
import org.oppia.android.util.profile.DirectoryManagementUtil
3537
import org.oppia.android.util.profile.ProfileNameValidator
@@ -89,7 +91,9 @@ class ProfileManagementController @Inject constructor(
8991
private val enableLearnerStudyAnalytics: PlatformParameterValue<Boolean>,
9092
@EnableLoggingLearnerStudyIds
9193
private val enableLoggingLearnerStudyIds: PlatformParameterValue<Boolean>,
92-
private val profileNameValidator: ProfileNameValidator
94+
private val profileNameValidator: ProfileNameValidator,
95+
@EnableOnboardingFlowV2
96+
private val enableOnboardingFlowV2: PlatformParameterValue<Boolean>
9397
) {
9498
private var currentProfileId: Int = DEFAULT_LOGGED_OUT_INTERNAL_PROFILE_ID
9599
private val profileDataStore =
@@ -290,6 +294,10 @@ class ProfileManagementController @Inject constructor(
290294
avatarImageUri = imageUri
291295
} else avatarColorRgb = colorRgb
292296
}.build()
297+
298+
if (enableOnboardingFlowV2.value) {
299+
this.profileType = computeProfileType(it)
300+
}
293301
}.build()
294302

295303
val wasProfileEverAdded = it.profilesCount > 0
@@ -306,6 +314,27 @@ class ProfileManagementController @Inject constructor(
306314
}
307315
}
308316

317+
private fun computeProfileType(profileDatabase: ProfileDatabase): ProfileType {
318+
return if (isAdminWithPin(profileDatabase)) {
319+
ProfileType.SUPERVISOR
320+
} else {
321+
if (profileDatabase.profilesCount == 1) {
322+
ProfileType.SOLE_LEARNER
323+
} else {
324+
ProfileType.ADDITIONAL_LEARNER
325+
}
326+
}
327+
}
328+
329+
private fun isAdminWithPin(profileDatabase: ProfileDatabase): Boolean {
330+
profileDatabase.profilesMap.values.forEach {
331+
if (it.isAdmin && it.hasPin) {
332+
return true
333+
}
334+
}
335+
return false
336+
}
337+
309338
/**
310339
* Updates the profile avatar of an existing profile.
311340
*
@@ -684,7 +713,7 @@ class ProfileManagementController @Inject constructor(
684713
return@createInMemoryDataProviderAsync AsyncResult.Success(0)
685714
}
686715
AsyncResult.Failure(
687-
ProfileNotFoundException(
716+
ProfileManagementController.ProfileNotFoundException(
688717
"ProfileId ${profileId.internalId} is" +
689718
" not associated with an existing profile"
690719
)

testing/src/main/java/org/oppia/android/testing/platformparameter/TestPlatformParameterModule.kt

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -14,7 +14,6 @@ import org.oppia.android.util.platformparameter.ENABLE_EDIT_ACCOUNTS_OPTIONS_UI_
1414
import org.oppia.android.util.platformparameter.ENABLE_EXTRA_TOPIC_TABS_UI_DEFAULT_VALUE
1515
import org.oppia.android.util.platformparameter.ENABLE_INTERACTION_CONFIG_CHANGE_STATE_RETENTION_DEFAULT_VALUE
1616
import org.oppia.android.util.platformparameter.ENABLE_NPS_SURVEY_DEFAULT_VALUE
17-
import org.oppia.android.util.platformparameter.ENABLE_LANGUAGE_SELECTION_UI_DEFAULT_VALUE
1817
import org.oppia.android.util.platformparameter.ENABLE_ONBOARDING_FLOW_V2_DEFAULT_VALUE
1918
import org.oppia.android.util.platformparameter.ENABLE_PERFORMANCE_METRICS_COLLECTION_DEFAULT_VALUE
2019
import org.oppia.android.util.platformparameter.EnableAppAndOsDeprecation

0 commit comments

Comments
 (0)