From 6ab7209e4d8327d2505eab5d1dac668f7cc78460 Mon Sep 17 00:00:00 2001 From: Benoit Marty Date: Wed, 13 Nov 2019 19:00:59 +0100 Subject: [PATCH] Handle navigation with VectorSharedAction --- .../vector/riotx/core/di/ViewModelModule.kt | 6 +++++ .../riotx/features/login/LoginAction.kt | 1 - .../riotx/features/login/LoginActivity.kt | 23 ++++++++--------- .../riotx/features/login/LoginFragment.kt | 5 +++- .../riotx/features/login/LoginNavigation.kt | 25 +++++++++++++++++++ .../login/LoginSharedActionViewModel.kt | 22 ++++++++++++++++ .../login/LoginSsoFallbackFragment.kt | 4 ++- .../riotx/features/login/LoginViewModel.kt | 12 --------- 8 files changed, 70 insertions(+), 28 deletions(-) create mode 100644 vector/src/main/java/im/vector/riotx/features/login/LoginNavigation.kt create mode 100644 vector/src/main/java/im/vector/riotx/features/login/LoginSharedActionViewModel.kt diff --git a/vector/src/main/java/im/vector/riotx/core/di/ViewModelModule.kt b/vector/src/main/java/im/vector/riotx/core/di/ViewModelModule.kt index cc1e4dabc7..0876701504 100644 --- a/vector/src/main/java/im/vector/riotx/core/di/ViewModelModule.kt +++ b/vector/src/main/java/im/vector/riotx/core/di/ViewModelModule.kt @@ -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 } diff --git a/vector/src/main/java/im/vector/riotx/features/login/LoginAction.kt b/vector/src/main/java/im/vector/riotx/features/login/LoginAction.kt index bb42bc8e0c..63d19ea148 100644 --- a/vector/src/main/java/im/vector/riotx/features/login/LoginAction.kt +++ b/vector/src/main/java/im/vector/riotx/features/login/LoginAction.kt @@ -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() } diff --git a/vector/src/main/java/im/vector/riotx/features/login/LoginActivity.kt b/vector/src/main/java/im/vector/riotx/features/login/LoginActivity.kt index abed22cb5e..4e5b5621ce 100644 --- a/vector/src/main/java/im/vector/riotx/features/login/LoginActivity.kt +++ b/vector/src/main/java/im/vector/riotx/features/login/LoginActivity.kt @@ -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) { diff --git a/vector/src/main/java/im/vector/riotx/features/login/LoginFragment.kt b/vector/src/main/java/im/vector/riotx/features/login/LoginFragment.kt index 456e4b2bb3..aa9aabe5dd 100644 --- a/vector/src/main/java/im/vector/riotx/features/login/LoginFragment.kt +++ b/vector/src/main/java/im/vector/riotx/features/login/LoginFragment.kt @@ -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() { diff --git a/vector/src/main/java/im/vector/riotx/features/login/LoginNavigation.kt b/vector/src/main/java/im/vector/riotx/features/login/LoginNavigation.kt new file mode 100644 index 0000000000..c9de4695f9 --- /dev/null +++ b/vector/src/main/java/im/vector/riotx/features/login/LoginNavigation.kt @@ -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() +} diff --git a/vector/src/main/java/im/vector/riotx/features/login/LoginSharedActionViewModel.kt b/vector/src/main/java/im/vector/riotx/features/login/LoginSharedActionViewModel.kt new file mode 100644 index 0000000000..625208b682 --- /dev/null +++ b/vector/src/main/java/im/vector/riotx/features/login/LoginSharedActionViewModel.kt @@ -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() diff --git a/vector/src/main/java/im/vector/riotx/features/login/LoginSsoFallbackFragment.kt b/vector/src/main/java/im/vector/riotx/features/login/LoginSsoFallbackFragment.kt index 38deccccaf..f77b36b1d9 100644 --- a/vector/src/main/java/im/vector/riotx/features/login/LoginSsoFallbackFragment.kt +++ b/vector/src/main/java/im/vector/riotx/features/login/LoginSsoFallbackFragment.kt @@ -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?) { diff --git a/vector/src/main/java/im/vector/riotx/features/login/LoginViewModel.kt b/vector/src/main/java/im/vector/riotx/features/login/LoginViewModel.kt index a0a7258e2a..b3d7e56029 100644 --- a/vector/src/main/java/im/vector/riotx/features/login/LoginViewModel.kt +++ b/vector/src/main/java/im/vector/riotx/features/login/LoginViewModel.kt @@ -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>() - val navigationLiveData: LiveData> - 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()