@@ -75,6 +75,8 @@ class FtueAuthVariant(
75
75
private val popEnterAnim = R .anim.no_anim
76
76
private val popExitAnim = R .anim.exit_fade_out
77
77
78
+ private var isForceLoginFallbackEnabled = false
79
+
78
80
private val topFragment: Fragment ?
79
81
get() = supportFragmentManager.findFragmentById(views.loginFragmentContainer.id)
80
82
@@ -109,10 +111,6 @@ class FtueAuthVariant(
109
111
}
110
112
}
111
113
112
- override fun setIsLoading (isLoading : Boolean ) {
113
- // do nothing
114
- }
115
-
116
114
private fun addFirstFragment () {
117
115
val splashFragment = when (vectorFeatures.isOnboardingSplashCarouselEnabled()) {
118
116
true -> FtueAuthSplashCarouselFragment ::class .java
@@ -121,11 +119,25 @@ class FtueAuthVariant(
121
119
activity.addFragment(views.loginFragmentContainer, splashFragment)
122
120
}
123
121
122
+ private fun updateWithState (viewState : OnboardingViewState ) {
123
+ isForceLoginFallbackEnabled = viewState.isForceLoginFallbackEnabled
124
+ views.loginLoading.isVisible = shouldShowLoading(viewState)
125
+ }
126
+
127
+ private fun shouldShowLoading (viewState : OnboardingViewState ) =
128
+ if (vectorFeatures.isOnboardingPersonalizeEnabled()) {
129
+ viewState.isLoading()
130
+ } else {
131
+ // Keep loading when during success because of the delay when switching to the next Activity
132
+ viewState.isLoading() || viewState.isAuthTaskCompleted()
133
+ }
134
+
135
+ override fun setIsLoading (isLoading : Boolean ) = Unit
136
+
124
137
private fun handleOnboardingViewEvents (viewEvents : OnboardingViewEvents ) {
125
138
when (viewEvents) {
126
139
is OnboardingViewEvents .RegistrationFlowResult -> {
127
- // Check that all flows are supported by the application
128
- if (viewEvents.flowResult.missingStages.any { ! it.isSupported() }) {
140
+ if (registrationShouldFallback(viewEvents)) {
129
141
// Display a popup to propose use web fallback
130
142
onRegistrationStageNotSupported()
131
143
} else {
@@ -136,11 +148,7 @@ class FtueAuthVariant(
136
148
// First ask for login and password
137
149
// I add a tag to indicate that this fragment is a registration stage.
138
150
// This way it will be automatically popped in when starting the next registration stage
139
- activity.addFragmentToBackstack(views.loginFragmentContainer,
140
- FtueAuthLoginFragment ::class .java,
141
- tag = FRAGMENT_REGISTRATION_STAGE_TAG ,
142
- option = commonOption
143
- )
151
+ openAuthLoginFragmentWithTag(FRAGMENT_REGISTRATION_STAGE_TAG )
144
152
}
145
153
}
146
154
}
@@ -228,13 +236,23 @@ class FtueAuthVariant(
228
236
}.exhaustive
229
237
}
230
238
231
- private fun updateWithState (viewState : OnboardingViewState ) {
232
- views.loginLoading.isVisible = if (vectorFeatures.isOnboardingPersonalizeEnabled()) {
233
- viewState.isLoading()
234
- } else {
235
- // Keep loading when during success because of the delay when switching to the next Activity
236
- viewState.isLoading() || viewState.isAuthTaskCompleted()
237
- }
239
+ private fun registrationShouldFallback (registrationFlowResult : OnboardingViewEvents .RegistrationFlowResult ) =
240
+ isForceLoginFallbackEnabled || registrationFlowResult.containsUnsupportedRegistrationFlow()
241
+
242
+ private fun OnboardingViewEvents.RegistrationFlowResult.containsUnsupportedRegistrationFlow () =
243
+ flowResult.missingStages.any { ! it.isSupported() }
244
+
245
+ private fun onRegistrationStageNotSupported () {
246
+ MaterialAlertDialogBuilder (activity)
247
+ .setTitle(R .string.app_name)
248
+ .setMessage(activity.getString(R .string.login_registration_not_supported))
249
+ .setPositiveButton(R .string.yes) { _, _ ->
250
+ activity.addFragmentToBackstack(views.loginFragmentContainer,
251
+ FtueAuthWebFragment ::class .java,
252
+ option = commonOption)
253
+ }
254
+ .setNegativeButton(R .string.no, null )
255
+ .show()
238
256
}
239
257
240
258
private fun onWebLoginError (onWebLoginError : OnboardingViewEvents .OnWebLoginError ) {
@@ -264,64 +282,67 @@ class FtueAuthVariant(
264
282
// state.signMode could not be ready yet. So use value from the ViewEvent
265
283
when (OnboardingViewEvents .signMode) {
266
284
SignMode .Unknown -> error(" Sign mode has to be set before calling this method" )
267
- SignMode .SignUp -> {
268
- // This is managed by the OnboardingViewEvents
269
- }
270
- SignMode .SignIn -> {
271
- // It depends on the LoginMode
272
- when (state.loginMode) {
273
- LoginMode .Unknown ,
274
- is LoginMode .Sso -> error(" Developer error" )
275
- is LoginMode .SsoAndPassword ,
276
- LoginMode .Password -> activity.addFragmentToBackstack(views.loginFragmentContainer,
277
- FtueAuthLoginFragment ::class .java,
278
- tag = FRAGMENT_LOGIN_TAG ,
279
- option = commonOption)
280
- LoginMode .Unsupported -> onLoginModeNotSupported(state.loginModeSupportedTypes)
281
- }.exhaustive
282
- }
283
- SignMode .SignInWithMatrixId -> activity.addFragmentToBackstack(views.loginFragmentContainer,
284
- FtueAuthLoginFragment ::class .java,
285
- tag = FRAGMENT_LOGIN_TAG ,
286
- option = commonOption)
285
+ SignMode .SignUp -> Unit // This case is processed in handleOnboardingViewEvents
286
+ SignMode .SignIn -> handleSignInSelected(state)
287
+ SignMode .SignInWithMatrixId -> handleSignInWithMatrixId(state)
287
288
}.exhaustive
288
289
}
289
290
290
- /* *
291
- * Handle the SSO redirection here
292
- */
293
- override fun onNewIntent (intent : Intent ? ) {
294
- intent?.data
295
- ?.let { tryOrNull { it.getQueryParameter(" loginToken" ) } }
296
- ?.let { onboardingViewModel.handle(OnboardingAction .LoginWithToken (it)) }
291
+ private fun handleSignInSelected (state : OnboardingViewState ) {
292
+ if (isForceLoginFallbackEnabled) {
293
+ onLoginModeNotSupported(state.loginModeSupportedTypes)
294
+ } else {
295
+ disambiguateLoginMode(state)
296
+ }
297
297
}
298
298
299
- private fun onRegistrationStageNotSupported () {
300
- MaterialAlertDialogBuilder (activity)
301
- .setTitle(R .string.app_name)
302
- .setMessage(activity.getString(R .string.login_registration_not_supported))
303
- .setPositiveButton(R .string.yes) { _, _ ->
304
- activity.addFragmentToBackstack(views.loginFragmentContainer,
305
- FtueAuthWebFragment ::class .java,
306
- option = commonOption)
307
- }
308
- .setNegativeButton(R .string.no, null )
309
- .show()
299
+ private fun disambiguateLoginMode (state : OnboardingViewState ) = when (state.loginMode) {
300
+ LoginMode .Unknown ,
301
+ is LoginMode .Sso -> error(" Developer error" )
302
+ is LoginMode .SsoAndPassword ,
303
+ LoginMode .Password -> openAuthLoginFragmentWithTag(FRAGMENT_LOGIN_TAG )
304
+ LoginMode .Unsupported -> onLoginModeNotSupported(state.loginModeSupportedTypes)
305
+ }
306
+
307
+ private fun openAuthLoginFragmentWithTag (tag : String ) {
308
+ activity.addFragmentToBackstack(views.loginFragmentContainer,
309
+ FtueAuthLoginFragment ::class .java,
310
+ tag = tag,
311
+ option = commonOption)
310
312
}
311
313
312
314
private fun onLoginModeNotSupported (supportedTypes : List <String >) {
313
315
MaterialAlertDialogBuilder (activity)
314
316
.setTitle(R .string.app_name)
315
317
.setMessage(activity.getString(R .string.login_mode_not_supported, supportedTypes.joinToString { " '$it '" }))
316
- .setPositiveButton(R .string.yes) { _, _ ->
317
- activity.addFragmentToBackstack(views.loginFragmentContainer,
318
- FtueAuthWebFragment ::class .java,
319
- option = commonOption)
320
- }
318
+ .setPositiveButton(R .string.yes) { _, _ -> openAuthWebFragment() }
321
319
.setNegativeButton(R .string.no, null )
322
320
.show()
323
321
}
324
322
323
+ private fun handleSignInWithMatrixId (state : OnboardingViewState ) {
324
+ if (isForceLoginFallbackEnabled) {
325
+ onLoginModeNotSupported(state.loginModeSupportedTypes)
326
+ } else {
327
+ openAuthLoginFragmentWithTag(FRAGMENT_LOGIN_TAG )
328
+ }
329
+ }
330
+
331
+ private fun openAuthWebFragment () {
332
+ activity.addFragmentToBackstack(views.loginFragmentContainer,
333
+ FtueAuthWebFragment ::class .java,
334
+ option = commonOption)
335
+ }
336
+
337
+ /* *
338
+ * Handle the SSO redirection here
339
+ */
340
+ override fun onNewIntent (intent : Intent ? ) {
341
+ intent?.data
342
+ ?.let { tryOrNull { it.getQueryParameter(" loginToken" ) } }
343
+ ?.let { onboardingViewModel.handle(OnboardingAction .LoginWithToken (it)) }
344
+ }
345
+
325
346
private fun handleRegistrationNavigation (flowResult : FlowResult ) {
326
347
// Complete all mandatory stages first
327
348
val mandatoryStage = flowResult.missingStages.firstOrNull { it.mandatory }
0 commit comments