Handle navigation with VectorSharedAction

This commit is contained in:
Benoit Marty 2019-11-13 19:00:59 +01:00
parent 4485d1c685
commit 6ab7209e4d
8 changed files with 70 additions and 28 deletions

View file

@ -31,6 +31,7 @@ import im.vector.riotx.features.home.HomeSharedActionViewModel
import im.vector.riotx.features.home.createdirect.CreateDirectRoomSharedActionViewModel
import im.vector.riotx.features.home.room.detail.timeline.action.MessageSharedActionViewModel
import im.vector.riotx.features.home.room.list.actions.RoomListQuickActionsSharedActionViewModel
import im.vector.riotx.features.login.LoginSharedActionViewModel
import im.vector.riotx.features.reactions.EmojiChooserViewModel
import im.vector.riotx.features.roomdirectory.RoomDirectorySharedActionViewModel
import im.vector.riotx.features.workers.signout.SignOutViewModel
@ -112,4 +113,9 @@ interface ViewModelModule {
@IntoMap
@ViewModelKey(RoomDirectorySharedActionViewModel::class)
fun bindRoomDirectorySharedActionViewModel(viewModel: RoomDirectorySharedActionViewModel): ViewModel
@Binds
@IntoMap
@ViewModelKey(LoginSharedActionViewModel::class)
fun bindLoginSharedActionViewModel(viewModel: LoginSharedActionViewModel): ViewModel
}

View file

@ -23,6 +23,5 @@ sealed class LoginAction : VectorViewModelAction {
data class UpdateHomeServer(val homeServerUrl: String) : LoginAction()
data class Login(val login: String, val password: String) : LoginAction()
data class SsoLoginSuccess(val credentials: Credentials) : LoginAction()
data class NavigateTo(val target: LoginActivity.Navigation) : LoginAction()
data class InitWith(val loginConfig: LoginConfig) : LoginAction()
}

View file

@ -25,7 +25,6 @@ import im.vector.riotx.R
import im.vector.riotx.core.di.ScreenComponent
import im.vector.riotx.core.extensions.addFragment
import im.vector.riotx.core.extensions.addFragmentToBackstack
import im.vector.riotx.core.extensions.observeEvent
import im.vector.riotx.core.platform.VectorBaseActivity
import im.vector.riotx.features.disclaimer.showDisclaimerDialog
import im.vector.riotx.features.home.HomeActivity
@ -33,13 +32,8 @@ import javax.inject.Inject
class LoginActivity : VectorBaseActivity() {
// Supported navigation actions for this Activity
sealed class Navigation {
object OpenSsoLoginFallback : Navigation()
object GoBack : Navigation()
}
private val loginViewModel: LoginViewModel by viewModel()
private lateinit var loginSharedActionViewModel: LoginSharedActionViewModel
@Inject lateinit var loginViewModelFactory: LoginViewModel.Factory
@ -60,12 +54,15 @@ class LoginActivity : VectorBaseActivity() {
loginViewModel.handle(LoginAction.InitWith(loginConfig))
}
loginViewModel.navigationLiveData.observeEvent(this) {
when (it) {
is Navigation.OpenSsoLoginFallback -> addFragmentToBackstack(R.id.simpleFragmentContainer, LoginSsoFallbackFragment::class.java)
is Navigation.GoBack -> supportFragmentManager.popBackStack(null, FragmentManager.POP_BACK_STACK_INCLUSIVE)
}
}
loginSharedActionViewModel = viewModelProvider.get(LoginSharedActionViewModel::class.java)
loginSharedActionViewModel.observe()
.subscribe {
when (it) {
is LoginNavigation.OpenSsoLoginFallback -> addFragmentToBackstack(R.id.simpleFragmentContainer, LoginSsoFallbackFragment::class.java)
is LoginNavigation.GoBack -> supportFragmentManager.popBackStack(null, FragmentManager.POP_BACK_STACK_INCLUSIVE)
}
}
.disposeOnDestroy()
loginViewModel.selectSubscribe(this, LoginViewState::asyncLoginAction) {
if (it is Success) {

View file

@ -44,6 +44,7 @@ import javax.inject.Inject
class LoginFragment @Inject constructor() : VectorBaseFragment() {
private val viewModel: LoginViewModel by activityViewModel()
private lateinit var loginSharedActionViewModel: LoginSharedActionViewModel
private var passwordShown = false
@ -52,6 +53,8 @@ class LoginFragment @Inject constructor() : VectorBaseFragment() {
override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
super.onViewCreated(view, savedInstanceState)
loginSharedActionViewModel = activityViewModelProvider.get(LoginSharedActionViewModel::class.java)
setupNotice()
setupAuthButton()
setupPasswordReveal()
@ -114,7 +117,7 @@ class LoginFragment @Inject constructor() : VectorBaseFragment() {
}
private fun openSso() {
viewModel.handle(LoginAction.NavigateTo(LoginActivity.Navigation.OpenSsoLoginFallback))
loginSharedActionViewModel.post(LoginNavigation.OpenSsoLoginFallback)
}
private fun setupPasswordReveal() {

View file

@ -0,0 +1,25 @@
/*
* Copyright 2019 New Vector Ltd
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package im.vector.riotx.features.login
import im.vector.riotx.core.platform.VectorSharedAction
// Supported navigation actions for this Activity
sealed class LoginNavigation : VectorSharedAction {
object OpenSsoLoginFallback : LoginNavigation()
object GoBack : LoginNavigation()
}

View file

@ -0,0 +1,22 @@
/*
* Copyright 2019 New Vector Ltd
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package im.vector.riotx.features.login
import im.vector.riotx.core.platform.VectorSharedActionViewModel
import javax.inject.Inject
class LoginSharedActionViewModel @Inject constructor() : VectorSharedActionViewModel<LoginNavigation>()

View file

@ -47,6 +47,7 @@ import javax.inject.Inject
*/
class LoginSsoFallbackFragment @Inject constructor() : VectorBaseFragment(), OnBackPressed {
private lateinit var loginSharedActionViewModel: LoginSharedActionViewModel
private val viewModel: LoginViewModel by activityViewModel()
var homeServerUrl: String = ""
@ -69,6 +70,7 @@ class LoginSsoFallbackFragment @Inject constructor() : VectorBaseFragment(), OnB
login_sso_fallback_toolbar.title = getString(R.string.login)
setupWebview()
loginSharedActionViewModel = activityViewModelProvider.get(LoginSharedActionViewModel::class.java)
}
@SuppressLint("SetJavaScriptEnabled")
@ -143,7 +145,7 @@ class LoginSsoFallbackFragment @Inject constructor() : VectorBaseFragment(), OnB
super.onReceivedError(view, errorCode, description, failingUrl)
// on error case, close this fragment
viewModel.handle(LoginAction.NavigateTo(LoginActivity.Navigation.GoBack))
loginSharedActionViewModel.post(LoginNavigation.GoBack)
}
override fun onPageStarted(view: WebView?, url: String?, favicon: Bitmap?) {

View file

@ -16,8 +16,6 @@
package im.vector.riotx.features.login
import androidx.lifecycle.LiveData
import androidx.lifecycle.MutableLiveData
import arrow.core.Try
import com.airbnb.mvrx.*
import com.squareup.inject.assisted.Assisted
@ -32,7 +30,6 @@ import im.vector.matrix.android.internal.auth.data.LoginFlowResponse
import im.vector.riotx.core.di.ActiveSessionHolder
import im.vector.riotx.core.extensions.configureAndStart
import im.vector.riotx.core.platform.VectorViewModel
import im.vector.riotx.core.utils.LiveEvent
import im.vector.riotx.features.notifications.PushRuleTriggerListener
import im.vector.riotx.features.session.SessionListener
import timber.log.Timber
@ -60,10 +57,6 @@ class LoginViewModel @AssistedInject constructor(@Assisted initialState: LoginVi
private var loginConfig: LoginConfig? = null
private val _navigationLiveData = MutableLiveData<LiveEvent<LoginActivity.Navigation>>()
val navigationLiveData: LiveData<LiveEvent<LoginActivity.Navigation>>
get() = _navigationLiveData
private var homeServerConnectionConfig: HomeServerConnectionConfig? = null
private var currentTask: Cancelable? = null
@ -73,7 +66,6 @@ class LoginViewModel @AssistedInject constructor(@Assisted initialState: LoginVi
is LoginAction.UpdateHomeServer -> handleUpdateHomeserver(action)
is LoginAction.Login -> handleLogin(action)
is LoginAction.SsoLoginSuccess -> handleSsoLoginSuccess(action)
is LoginAction.NavigateTo -> handleNavigation(action)
}
}
@ -202,10 +194,6 @@ class LoginViewModel @AssistedInject constructor(@Assisted initialState: LoginVi
}
}
private fun handleNavigation(action: LoginAction.NavigateTo) {
_navigationLiveData.postValue(LiveEvent(action.target))
}
override fun onCleared() {
super.onCleared()