Signout - WIP

This commit is contained in:
Benoit Marty 2022-10-11 17:36:02 +02:00
parent fba10a0340
commit 2d402c6847
8 changed files with 77 additions and 47 deletions

View file

@ -7,7 +7,7 @@ import androidx.activity.result.contract.ActivityResultContracts
import androidx.activity.viewModels import androidx.activity.viewModels
import androidx.lifecycle.lifecycleScope import androidx.lifecycle.lifecycleScope
import io.element.android.x.ui.screen.login.LoginActivity import io.element.android.x.ui.screen.login.LoginActivity
import io.element.android.x.ui.screen.login.RoomListActivity import io.element.android.x.ui.screen.roomlist.RoomListActivity
import kotlinx.coroutines.launch import kotlinx.coroutines.launch
class MainActivity : ComponentActivity() { class MainActivity : ComponentActivity() {

View file

@ -1,5 +0,0 @@
package io.element.android.x.ui.screen.login
sealed interface RoomListActions {
object LoadMore : RoomListActions
}

View file

@ -1,28 +0,0 @@
package io.element.android.x.ui.screen.login
import androidx.lifecycle.ViewModel
import io.element.android.x.sdk.matrix.MatrixInstance
import kotlinx.coroutines.flow.MutableStateFlow
import kotlinx.coroutines.flow.asStateFlow
class RoomListViewModel : ViewModel() {
private val matrix = MatrixInstance.getInstance()
private val _state = MutableStateFlow(RoomListViewState())
val state = _state.asStateFlow()
init {
observeState()
}
private fun observeState() {
// TODO Update submitEnabled when other state members are updated.
}
fun handle(action: RoomListActions) {
when (action) {
RoomListActions.LoadMore -> TODO()
}
}
}

View file

@ -1,6 +0,0 @@
package io.element.android.x.ui.screen.login
data class RoomListViewState(
val list: List<String> = emptyList(),
val canLoadMore: Boolean = false,
)

View file

@ -0,0 +1,6 @@
package io.element.android.x.ui.screen.roomlist
sealed interface RoomListActions {
object Logout : RoomListActions
object LoadMore : RoomListActions
}

View file

@ -1,28 +1,26 @@
package io.element.android.x.ui.screen.login package io.element.android.x.ui.screen.roomlist
import android.os.Bundle import android.os.Bundle
import androidx.activity.ComponentActivity import androidx.activity.ComponentActivity
import androidx.activity.compose.setContent import androidx.activity.compose.setContent
import androidx.activity.viewModels
import androidx.compose.foundation.layout.Column import androidx.compose.foundation.layout.Column
import androidx.compose.foundation.layout.fillMaxSize import androidx.compose.foundation.layout.fillMaxSize
import androidx.compose.foundation.layout.padding import androidx.compose.foundation.layout.padding
import androidx.compose.material3.MaterialTheme import androidx.compose.material3.*
import androidx.compose.material3.Surface import androidx.compose.runtime.Composable
import androidx.compose.runtime.collectAsState
import androidx.compose.ui.Modifier import androidx.compose.ui.Modifier
import androidx.compose.ui.unit.dp import androidx.compose.ui.unit.dp
import com.airbnb.mvrx.compose.mavericksViewModel
import io.element.android.x.ui.theme.ElementXTheme import io.element.android.x.ui.theme.ElementXTheme
class RoomListActivity : ComponentActivity() { class RoomListActivity : ComponentActivity() {
private val viewModel: RoomListViewModel by viewModels()
override fun onCreate(savedInstanceState: Bundle?) { override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState) super.onCreate(savedInstanceState)
setContent { setContent {
ElementXTheme { ElementXTheme {
val viewModel: RoomListViewModel = mavericksViewModel()
// A surface container using the 'background' color from the theme // A surface container using the 'background' color from the theme
Surface( Surface(
modifier = Modifier modifier = Modifier
@ -33,6 +31,7 @@ class RoomListActivity : ComponentActivity() {
Column( Column(
modifier = Modifier.fillMaxSize() modifier = Modifier.fillMaxSize()
) { ) {
OptionMenu(viewModel)
/* TODO /* TODO
val state = viewModel.state.collectAsState().value val state = viewModel.state.collectAsState().value
RoomListHeader() RoomListHeader()
@ -44,4 +43,19 @@ class RoomListActivity : ComponentActivity() {
} }
} }
} }
@OptIn(ExperimentalMaterial3Api::class)
@Composable
private fun OptionMenu(viewModel: RoomListViewModel) {
TopAppBar(
title = { Text("Room List") },
actions = {
Button(
onClick = { viewModel.handle(RoomListActions.Logout) }
) {
Text(text = "logout")
}
}
)
}
} }

View file

@ -0,0 +1,38 @@
package io.element.android.x.ui.screen.roomlist
import com.airbnb.mvrx.Fail
import com.airbnb.mvrx.Loading
import com.airbnb.mvrx.MavericksViewModel
import com.airbnb.mvrx.Success
import io.element.android.x.sdk.matrix.MatrixClient
import io.element.android.x.sdk.matrix.MatrixInstance
import kotlinx.coroutines.launch
class RoomListViewModel(initialState: RoomListViewState) :
MavericksViewModel<RoomListViewState>(initialState) {
private val matrix = MatrixInstance.getInstance()
fun handle(action: RoomListActions) {
when (action) {
RoomListActions.LoadMore -> TODO()
RoomListActions.Logout -> handleLogout()
}
}
private fun handleLogout() {
viewModelScope.launch {
setState { copy(logoutAction = Loading()) }
try {
getClient().logout()
setState { copy(logoutAction = Success(Unit)) }
} catch (throwable: Throwable) {
setState { copy(logoutAction = Fail(throwable)) }
}
}
}
private suspend fun getClient(): MatrixClient {
return matrix.restoreSession()!!
}
}

View file

@ -0,0 +1,11 @@
package io.element.android.x.ui.screen.roomlist
import com.airbnb.mvrx.Async
import com.airbnb.mvrx.MavericksState
import com.airbnb.mvrx.Uninitialized
data class RoomListViewState(
val list: List<String> = emptyList(),
val canLoadMore: Boolean = false,
val logoutAction: Async<Unit> = Uninitialized,
) : MavericksState