fixup! fixup! New TopBar

This commit is contained in:
2026-04-23 03:36:29 +03:00
parent a35f5196b1
commit 8b8926f931
@@ -24,6 +24,8 @@ import androidx.compose.foundation.shape.RoundedCornerShape
import androidx.compose.material3.CenterAlignedTopAppBar import androidx.compose.material3.CenterAlignedTopAppBar
import androidx.compose.material3.CircularProgressIndicator import androidx.compose.material3.CircularProgressIndicator
import androidx.compose.material3.ExperimentalMaterial3Api import androidx.compose.material3.ExperimentalMaterial3Api
import androidx.compose.material3.Icon
import androidx.compose.material3.IconButton
import androidx.compose.material3.MaterialTheme import androidx.compose.material3.MaterialTheme
import androidx.compose.material3.Scaffold import androidx.compose.material3.Scaffold
import androidx.compose.material3.Text import androidx.compose.material3.Text
@@ -39,6 +41,7 @@ import androidx.compose.ui.Alignment
import androidx.compose.ui.Modifier import androidx.compose.ui.Modifier
import androidx.compose.ui.draw.clip import androidx.compose.ui.draw.clip
import androidx.compose.ui.layout.ContentScale import androidx.compose.ui.layout.ContentScale
import androidx.compose.ui.res.stringResource
import androidx.compose.ui.text.style.TextOverflow import androidx.compose.ui.text.style.TextOverflow
import androidx.compose.ui.unit.dp import androidx.compose.ui.unit.dp
import androidx.navigation.NavHostController 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.client.store.type
import de.connect2x.trixnity.clientserverapi.client.SyncState import de.connect2x.trixnity.clientserverapi.client.SyncState
import de.connect2x.trixnity.core.model.events.m.room.CreateEventContent 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.CoroutineScope
import kotlinx.coroutines.Dispatchers import kotlinx.coroutines.Dispatchers
import kotlinx.coroutines.flow.map import kotlinx.coroutines.flow.map
@@ -71,9 +76,9 @@ import ru.risdeveau.pixeldragon.util.getMediaStore
import ru.risdeveau.pixeldragon.util.getRoomStore import ru.risdeveau.pixeldragon.util.getRoomStore
import splitties.activities.start import splitties.activities.start
import splitties.init.appCtx import splitties.init.appCtx
import splitties.resources.str
import de.connect2x.trixnity.client.store.Room as TrixnityRoom import de.connect2x.trixnity.client.store.Room as TrixnityRoom
class MainActivity : ComponentActivity() { class MainActivity : ComponentActivity() {
override fun onCreate(savedInstanceState: Bundle?) { override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState) super.onCreate(savedInstanceState)
@@ -81,10 +86,9 @@ class MainActivity : ComponentActivity() {
enableEdgeToEdge() enableEdgeToEdge()
setContent { setContent {
PixelDragonTheme { PixelDragonTheme {
var matrixClient by remember { mutableStateOf(client) } var isClientReady by remember { mutableStateOf(false) }
val currentClient = matrixClient
if (currentClient == null) { if (!isClientReady || client == null) {
Box( Box(
modifier = Modifier.fillMaxSize(), modifier = Modifier.fillMaxSize(),
contentAlignment = Alignment.Center, contentAlignment = Alignment.Center,
@@ -93,16 +97,14 @@ class MainActivity : ComponentActivity() {
} }
} else { } else {
val navController = rememberNavController() val navController = rememberNavController()
val syncState by client!!.api.sync.currentSyncState
.collectAsState(initial = SyncState.STOPPED)
Scaffold( Scaffold(
modifier = Modifier.fillMaxSize(), modifier = Modifier.fillMaxSize(),
topBar = { topBar = {
val syncState by currentClient.api.sync.currentSyncState
.collectAsState(initial = SyncState.STOPPED)
PixelDragonTopBar( PixelDragonTopBar(
navController = navController, navController = navController,
matrixClient = currentClient,
syncState = syncState, syncState = syncState,
) )
}, },
@@ -115,12 +117,9 @@ class MainActivity : ComponentActivity() {
"room/{rid}", "room/{rid}",
arguments = listOf(navArgument("rid") { type = NavType.StringType }) arguments = listOf(navArgument("rid") { type = NavType.StringType })
) { navBackStackEntry -> ) { navBackStackEntry ->
Room( Room(Modifier
Modifier .padding(innerPadding)
.padding(innerPadding) .fillMaxSize(), navBackStackEntry.arguments!!.getString("rid")!!)
.fillMaxSize(),
navBackStackEntry.arguments!!.getString("rid")!!,
)
} }
composable( composable(
"space/{rid}", "space/{rid}",
@@ -150,15 +149,9 @@ class MainActivity : ComponentActivity() {
} }
} }
val readyClient = client ?: run { Log.i("MainActivity", "Log in as ${client!!.userId}")
start<Login>() client!!.startSync()
finish() isClientReady = true
return@LaunchedEffect
}
matrixClient = readyClient
Log.i("MainActivity", "Log in as ${readyClient.userId}")
readyClient.startSync()
} }
} }
} }
@@ -177,37 +170,82 @@ class MainActivity : ComponentActivity() {
@Composable @Composable
private fun PixelDragonTopBar( private fun PixelDragonTopBar(
navController: NavHostController, navController: NavHostController,
matrixClient: MatrixClient,
syncState: SyncState, syncState: SyncState,
) { ) {
val backStackEntry by navController.currentBackStackEntryAsState() val backStackEntry by navController.currentBackStackEntryAsState()
val route = backStackEntry?.destination?.route val route = backStackEntry?.destination?.route
val rid = backStackEntry?.arguments?.getString("rid") val rid = backStackEntry?.arguments?.getString("rid")
val isRoomLikeScreen = route == "room/{rid}" || route == "space/{rid}"
val roomsFlow = remember(matrixClient) { val roomsFlow = remember(client) {
matrixClient.room.getAll().flattenValues().map { it.toList() } client!!.room.getAll().flattenValues().map { it.toList() }
} }
val rooms by roomsFlow.collectAsState(initial = emptyList()) val rooms by roomsFlow.collectAsState(initial = emptyList())
val currentRoom = remember(route, rid, rooms) { val currentRoom = remember(isRoomLikeScreen, rid, rooms) {
if ((route == "room/{rid}" || route == "space/{rid}") && rid != null) { if (isRoomLikeScreen && rid != null) {
rooms.firstOrNull { it.roomId.toString() == rid } rooms.firstOrNull { it.roomId.toString() == rid }
} else { } else {
null 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( CenterAlignedTopAppBar(
colors = topAppBarColors( colors = topAppBarColors(
containerColor = MaterialTheme.colorScheme.surfaceContainer, containerColor = MaterialTheme.colorScheme.primaryContainer,
titleContentColor = MaterialTheme.colorScheme.primary, titleContentColor = MaterialTheme.colorScheme.primary,
), ),
title = { title = {
val statusTitle = syncState.toStatusTitle() Text(syncState.toStatusTitle() ?: stringResource(R.string.app_name))
when { },
statusTitle != null -> Text(statusTitle) )
currentRoom != null -> RoomTopBarTitle(currentRoom) }
else -> Text(appCtx.str(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,
)
} }
}, },
) )