diff --git a/app/src/main/java/ru/risdeveau/pixeldragon/ui/activity/MainActivity.kt b/app/src/main/java/ru/risdeveau/pixeldragon/ui/activity/MainActivity.kt index ac6f3ee..05acde1 100755 --- a/app/src/main/java/ru/risdeveau/pixeldragon/ui/activity/MainActivity.kt +++ b/app/src/main/java/ru/risdeveau/pixeldragon/ui/activity/MainActivity.kt @@ -24,6 +24,8 @@ import androidx.compose.foundation.shape.RoundedCornerShape import androidx.compose.material3.CenterAlignedTopAppBar import androidx.compose.material3.CircularProgressIndicator import androidx.compose.material3.ExperimentalMaterial3Api +import androidx.compose.material3.Icon +import androidx.compose.material3.IconButton import androidx.compose.material3.MaterialTheme import androidx.compose.material3.Scaffold import androidx.compose.material3.Text @@ -39,6 +41,7 @@ import androidx.compose.ui.Alignment import androidx.compose.ui.Modifier import androidx.compose.ui.draw.clip import androidx.compose.ui.layout.ContentScale +import androidx.compose.ui.res.stringResource import androidx.compose.ui.text.style.TextOverflow import androidx.compose.ui.unit.dp import androidx.navigation.NavHostController @@ -57,6 +60,8 @@ import de.connect2x.trixnity.client.room import de.connect2x.trixnity.client.store.type import de.connect2x.trixnity.clientserverapi.client.SyncState import de.connect2x.trixnity.core.model.events.m.room.CreateEventContent +import io.github.rabehx.iconsax.Iconsax +import io.github.rabehx.iconsax.automirrored.outline.ArrowLeft2 import kotlinx.coroutines.CoroutineScope import kotlinx.coroutines.Dispatchers import kotlinx.coroutines.flow.map @@ -71,9 +76,9 @@ import ru.risdeveau.pixeldragon.util.getMediaStore import ru.risdeveau.pixeldragon.util.getRoomStore import splitties.activities.start import splitties.init.appCtx -import splitties.resources.str import de.connect2x.trixnity.client.store.Room as TrixnityRoom + class MainActivity : ComponentActivity() { override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) @@ -81,10 +86,9 @@ class MainActivity : ComponentActivity() { enableEdgeToEdge() setContent { PixelDragonTheme { - var matrixClient by remember { mutableStateOf(client) } - val currentClient = matrixClient + var isClientReady by remember { mutableStateOf(false) } - if (currentClient == null) { + if (!isClientReady || client == null) { Box( modifier = Modifier.fillMaxSize(), contentAlignment = Alignment.Center, @@ -93,16 +97,14 @@ class MainActivity : ComponentActivity() { } } else { val navController = rememberNavController() + val syncState by client!!.api.sync.currentSyncState + .collectAsState(initial = SyncState.STOPPED) Scaffold( modifier = Modifier.fillMaxSize(), topBar = { - val syncState by currentClient.api.sync.currentSyncState - .collectAsState(initial = SyncState.STOPPED) - PixelDragonTopBar( navController = navController, - matrixClient = currentClient, syncState = syncState, ) }, @@ -115,12 +117,9 @@ class MainActivity : ComponentActivity() { "room/{rid}", arguments = listOf(navArgument("rid") { type = NavType.StringType }) ) { navBackStackEntry -> - Room( - Modifier - .padding(innerPadding) - .fillMaxSize(), - navBackStackEntry.arguments!!.getString("rid")!!, - ) + Room(Modifier + .padding(innerPadding) + .fillMaxSize(), navBackStackEntry.arguments!!.getString("rid")!!) } composable( "space/{rid}", @@ -150,15 +149,9 @@ class MainActivity : ComponentActivity() { } } - val readyClient = client ?: run { - start() - finish() - return@LaunchedEffect - } - - matrixClient = readyClient - Log.i("MainActivity", "Log in as ${readyClient.userId}") - readyClient.startSync() + Log.i("MainActivity", "Log in as ${client!!.userId}") + client!!.startSync() + isClientReady = true } } } @@ -177,37 +170,82 @@ class MainActivity : ComponentActivity() { @Composable private fun PixelDragonTopBar( navController: NavHostController, - matrixClient: MatrixClient, syncState: SyncState, ) { val backStackEntry by navController.currentBackStackEntryAsState() val route = backStackEntry?.destination?.route val rid = backStackEntry?.arguments?.getString("rid") + val isRoomLikeScreen = route == "room/{rid}" || route == "space/{rid}" - val roomsFlow = remember(matrixClient) { - matrixClient.room.getAll().flattenValues().map { it.toList() } + val roomsFlow = remember(client) { + client!!.room.getAll().flattenValues().map { it.toList() } } val rooms by roomsFlow.collectAsState(initial = emptyList()) - val currentRoom = remember(route, rid, rooms) { - if ((route == "room/{rid}" || route == "space/{rid}") && rid != null) { + val currentRoom = remember(isRoomLikeScreen, rid, rooms) { + if (isRoomLikeScreen && rid != null) { rooms.firstOrNull { it.roomId.toString() == rid } } else { null } } + if (isRoomLikeScreen) { + RoomTopBar( + room = currentRoom, + fallbackTitle = rid ?: stringResource(R.string.app_name), + onBack = { navController.popBackStack() }, + ) + } else { + HomeTopBar(syncState = syncState) + } +} + +@OptIn(ExperimentalMaterial3Api::class) +@Composable +private fun HomeTopBar(syncState: SyncState) { CenterAlignedTopAppBar( colors = topAppBarColors( - containerColor = MaterialTheme.colorScheme.surfaceContainer, + containerColor = MaterialTheme.colorScheme.primaryContainer, titleContentColor = MaterialTheme.colorScheme.primary, ), title = { - val statusTitle = syncState.toStatusTitle() - when { - statusTitle != null -> Text(statusTitle) - currentRoom != null -> RoomTopBarTitle(currentRoom) - else -> Text(appCtx.str(R.string.app_name)) + Text(syncState.toStatusTitle() ?: stringResource(R.string.app_name)) + }, + ) +} + +@OptIn(ExperimentalMaterial3Api::class) +@Composable +private fun RoomTopBar( + room: TrixnityRoom?, + fallbackTitle: String, + onBack: () -> Unit, +) { + CenterAlignedTopAppBar( + colors = topAppBarColors( + containerColor = MaterialTheme.colorScheme.surface.copy(.5f), + titleContentColor = MaterialTheme.colorScheme.onSurface, + navigationIconContentColor = MaterialTheme.colorScheme.primary, + ), + navigationIcon = { + IconButton(onClick = onBack) { + Icon( + Iconsax.AutoMirrored.Outline.ArrowLeft2, + "To home", + ) + } + }, + title = { + if (room != null) { + RoomTopBarTitle(room) + } else { + Text( + text = fallbackTitle, + maxLines = 1, + overflow = TextOverflow.Ellipsis, + style = MaterialTheme.typography.titleMedium, + ) } }, )