Skip to content

Commit 5dced8b

Browse files
authored
Merge pull request #5258 from vector-im/feature/mna/5218-crash-at-registration
#5218: Fix crash at registration when redirecting to Web View
2 parents 79b511b + 21fa026 commit 5dced8b

File tree

7 files changed

+31
-46
lines changed

7 files changed

+31
-46
lines changed

changelog.d/5218.bugfix

+1
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
Fix crash during account registration when redirecting to Web View

vector/src/main/java/im/vector/app/features/login/LoginWebFragment.kt

+1-1
Original file line numberDiff line numberDiff line change
@@ -51,7 +51,7 @@ class LoginWebFragment @Inject constructor(
5151
private val assetReader: AssetReader
5252
) : AbstractLoginFragment<FragmentLoginWebBinding>() {
5353

54-
val softLogoutViewModel: SoftLogoutViewModel by activityViewModel()
54+
private val softLogoutViewModel: SoftLogoutViewModel by activityViewModel()
5555

5656
override fun getBinding(inflater: LayoutInflater, container: ViewGroup?): FragmentLoginWebBinding {
5757
return FragmentLoginWebBinding.inflate(inflater, container, false)

vector/src/main/java/im/vector/app/features/login2/LoginWebFragment2.kt

+2-2
Original file line numberDiff line numberDiff line change
@@ -56,7 +56,7 @@ class LoginWebFragment2 @Inject constructor(
5656
return FragmentLoginWebBinding.inflate(inflater, container, false)
5757
}
5858

59-
val softLogoutViewModel: SoftLogoutViewModel by activityViewModel()
59+
private val softLogoutViewModel: SoftLogoutViewModel by activityViewModel()
6060

6161
private var isWebViewLoaded = false
6262
private var isForSessionRecovery = false
@@ -82,7 +82,7 @@ class LoginWebFragment2 @Inject constructor(
8282
private fun setupTitle(state: LoginViewState2) {
8383
toolbar?.title = when (state.signMode) {
8484
SignMode2.SignIn -> getString(R.string.login_signin)
85-
else -> getString(R.string.login_signup)
85+
else -> getString(R.string.login_signup)
8686
}
8787
}
8888

vector/src/main/java/im/vector/app/features/onboarding/OnboardingAction.kt

-6
Original file line numberDiff line numberDiff line change
@@ -21,7 +21,6 @@ import im.vector.app.features.login.LoginConfig
2121
import im.vector.app.features.login.ServerType
2222
import im.vector.app.features.login.SignMode
2323
import org.matrix.android.sdk.api.auth.data.Credentials
24-
import org.matrix.android.sdk.api.auth.data.SsoIdentityProvider
2524
import org.matrix.android.sdk.api.auth.registration.RegisterThreePid
2625
import org.matrix.android.sdk.internal.network.ssl.Fingerprint
2726

@@ -71,11 +70,6 @@ sealed class OnboardingAction : VectorViewModelAction {
7170
// Homeserver history
7271
object ClearHomeServerHistory : OnboardingAction()
7372

74-
// For the soft logout case
75-
data class SetupSsoForSessionRecovery(val homeServerUrl: String,
76-
val deviceId: String,
77-
val ssoIdentityProviders: List<SsoIdentityProvider>?) : OnboardingAction()
78-
7973
data class PostViewEvent(val viewEvent: OnboardingViewEvents) : OnboardingAction()
8074

8175
data class UserAcceptCertificate(val fingerprint: Fingerprint) : OnboardingAction()

vector/src/main/java/im/vector/app/features/onboarding/OnboardingViewModel.kt

-13
Original file line numberDiff line numberDiff line change
@@ -143,7 +143,6 @@ class OnboardingViewModel @AssistedInject constructor(
143143
is OnboardingAction.ResetPasswordMailConfirmed -> handleResetPasswordMailConfirmed()
144144
is OnboardingAction.RegisterAction -> handleRegisterAction(action)
145145
is OnboardingAction.ResetAction -> handleResetAction(action)
146-
is OnboardingAction.SetupSsoForSessionRecovery -> handleSetupSsoForSessionRecovery(action)
147146
is OnboardingAction.UserAcceptCertificate -> handleUserAcceptCertificate(action)
148147
OnboardingAction.ClearHomeServerHistory -> handleClearHomeServerHistory()
149148
is OnboardingAction.PostViewEvent -> _viewEvents.post(action.viewEvent)
@@ -249,18 +248,6 @@ class OnboardingViewModel @AssistedInject constructor(
249248
}
250249
}
251250

252-
private fun handleSetupSsoForSessionRecovery(action: OnboardingAction.SetupSsoForSessionRecovery) {
253-
setState {
254-
copy(
255-
signMode = SignMode.SignIn,
256-
loginMode = LoginMode.Sso(action.ssoIdentityProviders),
257-
homeServerUrlFromUser = action.homeServerUrl,
258-
homeServerUrl = action.homeServerUrl,
259-
deviceId = action.deviceId
260-
)
261-
}
262-
}
263-
264251
private fun handleRegisterAction(action: OnboardingAction.RegisterAction) {
265252
when (action) {
266253
is OnboardingAction.CaptchaDone -> handleCaptchaDone(action)

vector/src/main/java/im/vector/app/features/onboarding/ftueauth/FtueAuthWebFragment.kt

+1-13
Original file line numberDiff line numberDiff line change
@@ -30,7 +30,6 @@ import android.view.ViewGroup
3030
import android.webkit.SslErrorHandler
3131
import android.webkit.WebView
3232
import android.webkit.WebViewClient
33-
import com.airbnb.mvrx.activityViewModel
3433
import com.google.android.material.dialog.MaterialAlertDialogBuilder
3534
import im.vector.app.R
3635
import im.vector.app.core.utils.AssetReader
@@ -40,8 +39,6 @@ import im.vector.app.features.login.SignMode
4039
import im.vector.app.features.onboarding.OnboardingAction
4140
import im.vector.app.features.onboarding.OnboardingViewEvents
4241
import im.vector.app.features.onboarding.OnboardingViewState
43-
import im.vector.app.features.signout.soft.SoftLogoutAction
44-
import im.vector.app.features.signout.soft.SoftLogoutViewModel
4542
import org.matrix.android.sdk.api.auth.data.Credentials
4643
import org.matrix.android.sdk.internal.di.MoshiProvider
4744
import timber.log.Timber
@@ -56,14 +53,11 @@ class FtueAuthWebFragment @Inject constructor(
5653
private val assetReader: AssetReader
5754
) : AbstractFtueAuthFragment<FragmentLoginWebBinding>() {
5855

59-
val softLogoutViewModel: SoftLogoutViewModel by activityViewModel()
60-
6156
override fun getBinding(inflater: LayoutInflater, container: ViewGroup?): FragmentLoginWebBinding {
6257
return FragmentLoginWebBinding.inflate(inflater, container, false)
6358
}
6459

6560
private var isWebViewLoaded = false
66-
private var isForSessionRecovery = false
6761

6862
override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
6963
super.onViewCreated(view, savedInstanceState)
@@ -75,8 +69,6 @@ class FtueAuthWebFragment @Inject constructor(
7569
override fun updateWithState(state: OnboardingViewState) {
7670
setupTitle(state)
7771

78-
isForSessionRecovery = state.deviceId?.isNotBlank() == true
79-
8072
if (!isWebViewLoaded) {
8173
setupWebView(state)
8274
isWebViewLoaded = true
@@ -239,11 +231,7 @@ class FtueAuthWebFragment @Inject constructor(
239231
}
240232

241233
private fun notifyViewModel(credentials: Credentials) {
242-
if (isForSessionRecovery) {
243-
softLogoutViewModel.handle(SoftLogoutAction.WebLoginSuccess(credentials))
244-
} else {
245-
viewModel.handle(OnboardingAction.WebLoginSuccess(credentials))
246-
}
234+
viewModel.handle(OnboardingAction.WebLoginSuccess(credentials))
247235
}
248236

249237
override fun resetViewModel() {

vector/src/main/java/im/vector/app/features/signout/soft/SoftLogoutViewModel.kt

+26-11
Original file line numberDiff line numberDiff line change
@@ -16,7 +16,6 @@
1616

1717
package im.vector.app.features.signout.soft
1818

19-
import com.airbnb.mvrx.ActivityViewModelContext
2019
import com.airbnb.mvrx.Fail
2120
import com.airbnb.mvrx.Loading
2221
import com.airbnb.mvrx.MavericksViewModelFactory
@@ -26,8 +25,10 @@ import com.airbnb.mvrx.ViewModelContext
2625
import dagger.assisted.Assisted
2726
import dagger.assisted.AssistedFactory
2827
import dagger.assisted.AssistedInject
28+
import dagger.hilt.EntryPoints
2929
import im.vector.app.core.di.ActiveSessionHolder
3030
import im.vector.app.core.di.MavericksAssistedViewModelFactory
31+
import im.vector.app.core.di.SingletonEntryPoint
3132
import im.vector.app.core.di.hiltMavericksViewModelFactory
3233
import im.vector.app.core.extensions.hasUnsavedKeys
3334
import im.vector.app.core.platform.VectorViewModel
@@ -55,16 +56,30 @@ class SoftLogoutViewModel @AssistedInject constructor(
5556

5657
companion object : MavericksViewModelFactory<SoftLogoutViewModel, SoftLogoutViewState> by hiltMavericksViewModelFactory() {
5758

58-
override fun initialState(viewModelContext: ViewModelContext): SoftLogoutViewState? {
59-
val activity: SoftLogoutActivity = (viewModelContext as ActivityViewModelContext).activity()
60-
val userId = activity.session.myUserId
61-
return SoftLogoutViewState(
62-
homeServerUrl = activity.session.sessionParams.homeServerUrl,
63-
userId = userId,
64-
deviceId = activity.session.sessionParams.deviceId ?: "",
65-
userDisplayName = activity.session.getUser(userId)?.displayName ?: userId,
66-
hasUnsavedKeys = activity.session.hasUnsavedKeys()
67-
)
59+
override fun initialState(viewModelContext: ViewModelContext): SoftLogoutViewState {
60+
val sessionHolder = EntryPoints.get(viewModelContext.app(), SingletonEntryPoint::class.java)
61+
.activeSessionHolder()
62+
63+
return if (sessionHolder.hasActiveSession()) {
64+
val session = sessionHolder.getActiveSession()
65+
val userId = session.myUserId
66+
67+
SoftLogoutViewState(
68+
homeServerUrl = session.sessionParams.homeServerUrl,
69+
userId = userId,
70+
deviceId = session.sessionParams.deviceId.orEmpty(),
71+
userDisplayName = session.getUser(userId)?.displayName ?: userId,
72+
hasUnsavedKeys = session.hasUnsavedKeys()
73+
)
74+
} else {
75+
SoftLogoutViewState(
76+
homeServerUrl = "",
77+
userId = "",
78+
deviceId = "",
79+
userDisplayName = "",
80+
hasUnsavedKeys = false
81+
)
82+
}
6883
}
6984
}
7085

0 commit comments

Comments
 (0)