mirror of
https://github.com/element-hq/element-android
synced 2024-10-27 05:06:59 +03:00
Handle navigation with VectorSharedAction
This commit is contained in:
parent
4485d1c685
commit
6ab7209e4d
8 changed files with 70 additions and 28 deletions
|
@ -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.createdirect.CreateDirectRoomSharedActionViewModel
|
||||||
import im.vector.riotx.features.home.room.detail.timeline.action.MessageSharedActionViewModel
|
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.home.room.list.actions.RoomListQuickActionsSharedActionViewModel
|
||||||
|
import im.vector.riotx.features.login.LoginSharedActionViewModel
|
||||||
import im.vector.riotx.features.reactions.EmojiChooserViewModel
|
import im.vector.riotx.features.reactions.EmojiChooserViewModel
|
||||||
import im.vector.riotx.features.roomdirectory.RoomDirectorySharedActionViewModel
|
import im.vector.riotx.features.roomdirectory.RoomDirectorySharedActionViewModel
|
||||||
import im.vector.riotx.features.workers.signout.SignOutViewModel
|
import im.vector.riotx.features.workers.signout.SignOutViewModel
|
||||||
|
@ -112,4 +113,9 @@ interface ViewModelModule {
|
||||||
@IntoMap
|
@IntoMap
|
||||||
@ViewModelKey(RoomDirectorySharedActionViewModel::class)
|
@ViewModelKey(RoomDirectorySharedActionViewModel::class)
|
||||||
fun bindRoomDirectorySharedActionViewModel(viewModel: RoomDirectorySharedActionViewModel): ViewModel
|
fun bindRoomDirectorySharedActionViewModel(viewModel: RoomDirectorySharedActionViewModel): ViewModel
|
||||||
|
|
||||||
|
@Binds
|
||||||
|
@IntoMap
|
||||||
|
@ViewModelKey(LoginSharedActionViewModel::class)
|
||||||
|
fun bindLoginSharedActionViewModel(viewModel: LoginSharedActionViewModel): ViewModel
|
||||||
}
|
}
|
||||||
|
|
|
@ -23,6 +23,5 @@ sealed class LoginAction : VectorViewModelAction {
|
||||||
data class UpdateHomeServer(val homeServerUrl: String) : LoginAction()
|
data class UpdateHomeServer(val homeServerUrl: String) : LoginAction()
|
||||||
data class Login(val login: String, val password: String) : LoginAction()
|
data class Login(val login: String, val password: String) : LoginAction()
|
||||||
data class SsoLoginSuccess(val credentials: Credentials) : LoginAction()
|
data class SsoLoginSuccess(val credentials: Credentials) : LoginAction()
|
||||||
data class NavigateTo(val target: LoginActivity.Navigation) : LoginAction()
|
|
||||||
data class InitWith(val loginConfig: LoginConfig) : LoginAction()
|
data class InitWith(val loginConfig: LoginConfig) : LoginAction()
|
||||||
}
|
}
|
||||||
|
|
|
@ -25,7 +25,6 @@ import im.vector.riotx.R
|
||||||
import im.vector.riotx.core.di.ScreenComponent
|
import im.vector.riotx.core.di.ScreenComponent
|
||||||
import im.vector.riotx.core.extensions.addFragment
|
import im.vector.riotx.core.extensions.addFragment
|
||||||
import im.vector.riotx.core.extensions.addFragmentToBackstack
|
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.core.platform.VectorBaseActivity
|
||||||
import im.vector.riotx.features.disclaimer.showDisclaimerDialog
|
import im.vector.riotx.features.disclaimer.showDisclaimerDialog
|
||||||
import im.vector.riotx.features.home.HomeActivity
|
import im.vector.riotx.features.home.HomeActivity
|
||||||
|
@ -33,13 +32,8 @@ import javax.inject.Inject
|
||||||
|
|
||||||
class LoginActivity : VectorBaseActivity() {
|
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 val loginViewModel: LoginViewModel by viewModel()
|
||||||
|
private lateinit var loginSharedActionViewModel: LoginSharedActionViewModel
|
||||||
|
|
||||||
@Inject lateinit var loginViewModelFactory: LoginViewModel.Factory
|
@Inject lateinit var loginViewModelFactory: LoginViewModel.Factory
|
||||||
|
|
||||||
|
@ -60,12 +54,15 @@ class LoginActivity : VectorBaseActivity() {
|
||||||
loginViewModel.handle(LoginAction.InitWith(loginConfig))
|
loginViewModel.handle(LoginAction.InitWith(loginConfig))
|
||||||
}
|
}
|
||||||
|
|
||||||
loginViewModel.navigationLiveData.observeEvent(this) {
|
loginSharedActionViewModel = viewModelProvider.get(LoginSharedActionViewModel::class.java)
|
||||||
when (it) {
|
loginSharedActionViewModel.observe()
|
||||||
is Navigation.OpenSsoLoginFallback -> addFragmentToBackstack(R.id.simpleFragmentContainer, LoginSsoFallbackFragment::class.java)
|
.subscribe {
|
||||||
is Navigation.GoBack -> supportFragmentManager.popBackStack(null, FragmentManager.POP_BACK_STACK_INCLUSIVE)
|
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) {
|
loginViewModel.selectSubscribe(this, LoginViewState::asyncLoginAction) {
|
||||||
if (it is Success) {
|
if (it is Success) {
|
||||||
|
|
|
@ -44,6 +44,7 @@ import javax.inject.Inject
|
||||||
class LoginFragment @Inject constructor() : VectorBaseFragment() {
|
class LoginFragment @Inject constructor() : VectorBaseFragment() {
|
||||||
|
|
||||||
private val viewModel: LoginViewModel by activityViewModel()
|
private val viewModel: LoginViewModel by activityViewModel()
|
||||||
|
private lateinit var loginSharedActionViewModel: LoginSharedActionViewModel
|
||||||
|
|
||||||
private var passwordShown = false
|
private var passwordShown = false
|
||||||
|
|
||||||
|
@ -52,6 +53,8 @@ class LoginFragment @Inject constructor() : VectorBaseFragment() {
|
||||||
override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
|
override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
|
||||||
super.onViewCreated(view, savedInstanceState)
|
super.onViewCreated(view, savedInstanceState)
|
||||||
|
|
||||||
|
loginSharedActionViewModel = activityViewModelProvider.get(LoginSharedActionViewModel::class.java)
|
||||||
|
|
||||||
setupNotice()
|
setupNotice()
|
||||||
setupAuthButton()
|
setupAuthButton()
|
||||||
setupPasswordReveal()
|
setupPasswordReveal()
|
||||||
|
@ -114,7 +117,7 @@ class LoginFragment @Inject constructor() : VectorBaseFragment() {
|
||||||
}
|
}
|
||||||
|
|
||||||
private fun openSso() {
|
private fun openSso() {
|
||||||
viewModel.handle(LoginAction.NavigateTo(LoginActivity.Navigation.OpenSsoLoginFallback))
|
loginSharedActionViewModel.post(LoginNavigation.OpenSsoLoginFallback)
|
||||||
}
|
}
|
||||||
|
|
||||||
private fun setupPasswordReveal() {
|
private fun setupPasswordReveal() {
|
||||||
|
|
|
@ -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()
|
||||||
|
}
|
|
@ -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>()
|
|
@ -47,6 +47,7 @@ import javax.inject.Inject
|
||||||
*/
|
*/
|
||||||
class LoginSsoFallbackFragment @Inject constructor() : VectorBaseFragment(), OnBackPressed {
|
class LoginSsoFallbackFragment @Inject constructor() : VectorBaseFragment(), OnBackPressed {
|
||||||
|
|
||||||
|
private lateinit var loginSharedActionViewModel: LoginSharedActionViewModel
|
||||||
private val viewModel: LoginViewModel by activityViewModel()
|
private val viewModel: LoginViewModel by activityViewModel()
|
||||||
|
|
||||||
var homeServerUrl: String = ""
|
var homeServerUrl: String = ""
|
||||||
|
@ -69,6 +70,7 @@ class LoginSsoFallbackFragment @Inject constructor() : VectorBaseFragment(), OnB
|
||||||
login_sso_fallback_toolbar.title = getString(R.string.login)
|
login_sso_fallback_toolbar.title = getString(R.string.login)
|
||||||
|
|
||||||
setupWebview()
|
setupWebview()
|
||||||
|
loginSharedActionViewModel = activityViewModelProvider.get(LoginSharedActionViewModel::class.java)
|
||||||
}
|
}
|
||||||
|
|
||||||
@SuppressLint("SetJavaScriptEnabled")
|
@SuppressLint("SetJavaScriptEnabled")
|
||||||
|
@ -143,7 +145,7 @@ class LoginSsoFallbackFragment @Inject constructor() : VectorBaseFragment(), OnB
|
||||||
super.onReceivedError(view, errorCode, description, failingUrl)
|
super.onReceivedError(view, errorCode, description, failingUrl)
|
||||||
|
|
||||||
// on error case, close this fragment
|
// 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?) {
|
override fun onPageStarted(view: WebView?, url: String?, favicon: Bitmap?) {
|
||||||
|
|
|
@ -16,8 +16,6 @@
|
||||||
|
|
||||||
package im.vector.riotx.features.login
|
package im.vector.riotx.features.login
|
||||||
|
|
||||||
import androidx.lifecycle.LiveData
|
|
||||||
import androidx.lifecycle.MutableLiveData
|
|
||||||
import arrow.core.Try
|
import arrow.core.Try
|
||||||
import com.airbnb.mvrx.*
|
import com.airbnb.mvrx.*
|
||||||
import com.squareup.inject.assisted.Assisted
|
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.di.ActiveSessionHolder
|
||||||
import im.vector.riotx.core.extensions.configureAndStart
|
import im.vector.riotx.core.extensions.configureAndStart
|
||||||
import im.vector.riotx.core.platform.VectorViewModel
|
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.notifications.PushRuleTriggerListener
|
||||||
import im.vector.riotx.features.session.SessionListener
|
import im.vector.riotx.features.session.SessionListener
|
||||||
import timber.log.Timber
|
import timber.log.Timber
|
||||||
|
@ -60,10 +57,6 @@ class LoginViewModel @AssistedInject constructor(@Assisted initialState: LoginVi
|
||||||
|
|
||||||
private var loginConfig: LoginConfig? = null
|
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 homeServerConnectionConfig: HomeServerConnectionConfig? = null
|
||||||
private var currentTask: Cancelable? = null
|
private var currentTask: Cancelable? = null
|
||||||
|
|
||||||
|
@ -73,7 +66,6 @@ class LoginViewModel @AssistedInject constructor(@Assisted initialState: LoginVi
|
||||||
is LoginAction.UpdateHomeServer -> handleUpdateHomeserver(action)
|
is LoginAction.UpdateHomeServer -> handleUpdateHomeserver(action)
|
||||||
is LoginAction.Login -> handleLogin(action)
|
is LoginAction.Login -> handleLogin(action)
|
||||||
is LoginAction.SsoLoginSuccess -> handleSsoLoginSuccess(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() {
|
override fun onCleared() {
|
||||||
super.onCleared()
|
super.onCleared()
|
||||||
|
|
||||||
|
|
Loading…
Reference in a new issue