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.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<Login>()
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,
)
}
},
)