diff --git a/app/src/main/java/io/element/android/x/MainActivity.kt b/app/src/main/java/io/element/android/x/MainActivity.kt index 0ad2576d26..6f3b51cded 100644 --- a/app/src/main/java/io/element/android/x/MainActivity.kt +++ b/app/src/main/java/io/element/android/x/MainActivity.kt @@ -7,7 +7,7 @@ import androidx.activity.result.contract.ActivityResultContracts import androidx.activity.viewModels import androidx.lifecycle.lifecycleScope 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 class MainActivity : ComponentActivity() { diff --git a/libraries/ui/screens/roomlist/src/main/java/io/element/android/x/ui/screen/login/RoomListActions.kt b/libraries/ui/screens/roomlist/src/main/java/io/element/android/x/ui/screen/login/RoomListActions.kt deleted file mode 100644 index 6655529cf3..0000000000 --- a/libraries/ui/screens/roomlist/src/main/java/io/element/android/x/ui/screen/login/RoomListActions.kt +++ /dev/null @@ -1,5 +0,0 @@ -package io.element.android.x.ui.screen.login - -sealed interface RoomListActions { - object LoadMore : RoomListActions -} diff --git a/libraries/ui/screens/roomlist/src/main/java/io/element/android/x/ui/screen/login/RoomListViewModel.kt b/libraries/ui/screens/roomlist/src/main/java/io/element/android/x/ui/screen/login/RoomListViewModel.kt deleted file mode 100644 index aa3634b94c..0000000000 --- a/libraries/ui/screens/roomlist/src/main/java/io/element/android/x/ui/screen/login/RoomListViewModel.kt +++ /dev/null @@ -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() - } - } -} \ No newline at end of file diff --git a/libraries/ui/screens/roomlist/src/main/java/io/element/android/x/ui/screen/login/RoomListViewState.kt b/libraries/ui/screens/roomlist/src/main/java/io/element/android/x/ui/screen/login/RoomListViewState.kt deleted file mode 100644 index 7ed1906b89..0000000000 --- a/libraries/ui/screens/roomlist/src/main/java/io/element/android/x/ui/screen/login/RoomListViewState.kt +++ /dev/null @@ -1,6 +0,0 @@ -package io.element.android.x.ui.screen.login - -data class RoomListViewState( - val list: List = emptyList(), - val canLoadMore: Boolean = false, -) diff --git a/libraries/ui/screens/roomlist/src/main/java/io/element/android/x/ui/screen/roomlist/RoomListActions.kt b/libraries/ui/screens/roomlist/src/main/java/io/element/android/x/ui/screen/roomlist/RoomListActions.kt new file mode 100644 index 0000000000..e5bf667814 --- /dev/null +++ b/libraries/ui/screens/roomlist/src/main/java/io/element/android/x/ui/screen/roomlist/RoomListActions.kt @@ -0,0 +1,6 @@ +package io.element.android.x.ui.screen.roomlist + +sealed interface RoomListActions { + object Logout : RoomListActions + object LoadMore : RoomListActions +} diff --git a/libraries/ui/screens/roomlist/src/main/java/io/element/android/x/ui/screen/login/RoomListActivity.kt b/libraries/ui/screens/roomlist/src/main/java/io/element/android/x/ui/screen/roomlist/RoomListActivity.kt similarity index 64% rename from libraries/ui/screens/roomlist/src/main/java/io/element/android/x/ui/screen/login/RoomListActivity.kt rename to libraries/ui/screens/roomlist/src/main/java/io/element/android/x/ui/screen/roomlist/RoomListActivity.kt index 12146e32b1..f4ddd494be 100644 --- a/libraries/ui/screens/roomlist/src/main/java/io/element/android/x/ui/screen/login/RoomListActivity.kt +++ b/libraries/ui/screens/roomlist/src/main/java/io/element/android/x/ui/screen/roomlist/RoomListActivity.kt @@ -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 androidx.activity.ComponentActivity import androidx.activity.compose.setContent -import androidx.activity.viewModels import androidx.compose.foundation.layout.Column import androidx.compose.foundation.layout.fillMaxSize import androidx.compose.foundation.layout.padding -import androidx.compose.material3.MaterialTheme -import androidx.compose.material3.Surface -import androidx.compose.runtime.collectAsState +import androidx.compose.material3.* +import androidx.compose.runtime.Composable import androidx.compose.ui.Modifier import androidx.compose.ui.unit.dp +import com.airbnb.mvrx.compose.mavericksViewModel import io.element.android.x.ui.theme.ElementXTheme class RoomListActivity : ComponentActivity() { - private val viewModel: RoomListViewModel by viewModels() - override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) setContent { ElementXTheme { + val viewModel: RoomListViewModel = mavericksViewModel() // A surface container using the 'background' color from the theme Surface( modifier = Modifier @@ -33,6 +31,7 @@ class RoomListActivity : ComponentActivity() { Column( modifier = Modifier.fillMaxSize() ) { + OptionMenu(viewModel) /* TODO val state = viewModel.state.collectAsState().value 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") + } + } + ) + } } diff --git a/libraries/ui/screens/roomlist/src/main/java/io/element/android/x/ui/screen/roomlist/RoomListViewModel.kt b/libraries/ui/screens/roomlist/src/main/java/io/element/android/x/ui/screen/roomlist/RoomListViewModel.kt new file mode 100644 index 0000000000..278502f0a7 --- /dev/null +++ b/libraries/ui/screens/roomlist/src/main/java/io/element/android/x/ui/screen/roomlist/RoomListViewModel.kt @@ -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(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()!! + } +} \ No newline at end of file diff --git a/libraries/ui/screens/roomlist/src/main/java/io/element/android/x/ui/screen/roomlist/RoomListViewState.kt b/libraries/ui/screens/roomlist/src/main/java/io/element/android/x/ui/screen/roomlist/RoomListViewState.kt new file mode 100644 index 0000000000..903e7d9b6f --- /dev/null +++ b/libraries/ui/screens/roomlist/src/main/java/io/element/android/x/ui/screen/roomlist/RoomListViewState.kt @@ -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 = emptyList(), + val canLoadMore: Boolean = false, + val logoutAction: Async = Uninitialized, +) : MavericksState