From c90bdfbe428b02f9afd747b1bab63e6b12fb852e Mon Sep 17 00:00:00 2001 From: Miguel Palhas Date: Sun, 13 Sep 2026 01:07:32 +0100 Subject: [PATCH] feat(maestro): open terminal pane from a tapped sidebar session Tapping a session in the sidebar now opens TerminalScreen full-screen instead of just closing the drawer. windowSoftInputMode=adjustResize lets WindowInsets.isImeVisible drive the key bar's visibility. --- android/app/src/main/AndroidManifest.xml | 1 + .../main/java/pt/naps/maestro/MainActivity.kt | 69 ++++++++++++------- 2 files changed, 46 insertions(+), 24 deletions(-) diff --git a/android/app/src/main/AndroidManifest.xml b/android/app/src/main/AndroidManifest.xml index 7c98bd3..fde8b64 100644 --- a/android/app/src/main/AndroidManifest.xml +++ b/android/app/src/main/AndroidManifest.xml @@ -15,6 +15,7 @@ diff --git a/android/app/src/main/java/pt/naps/maestro/MainActivity.kt b/android/app/src/main/java/pt/naps/maestro/MainActivity.kt index aad2d3a..d13fe27 100644 --- a/android/app/src/main/java/pt/naps/maestro/MainActivity.kt +++ b/android/app/src/main/java/pt/naps/maestro/MainActivity.kt @@ -22,7 +22,10 @@ import androidx.compose.material3.rememberDrawerState import androidx.compose.runtime.Composable import androidx.compose.runtime.collectAsState import androidx.compose.runtime.getValue +import androidx.compose.runtime.mutableStateOf +import androidx.compose.runtime.remember import androidx.compose.runtime.rememberCoroutineScope +import androidx.compose.runtime.setValue import androidx.compose.ui.Alignment import androidx.compose.ui.Modifier import androidx.compose.ui.res.stringResource @@ -32,7 +35,10 @@ import kotlinx.coroutines.launch import pt.naps.maestro.connection.DaemonLink import pt.naps.maestro.connection.DaemonPrefs import pt.naps.maestro.connection.LinkState +import pt.naps.maestro.data.Session import pt.naps.maestro.ui.sidebar.SidebarContent +import pt.naps.maestro.ui.sidebar.sessionName +import pt.naps.maestro.ui.terminal.TerminalScreen import pt.naps.maestro.ui.theme.MaestroTheme class MainActivity : ComponentActivity() { @@ -50,34 +56,49 @@ class MainActivity : ComponentActivity() { setContent { MaestroTheme { val linkState by daemonLink.state.collectAsState() + val baseUrl by prefs.baseUrl.collectAsState() val drawerState = rememberDrawerState(DrawerValue.Closed) val scope = rememberCoroutineScope() + var openSession by remember { mutableStateOf(null) } - ModalNavigationDrawer( - drawerState = drawerState, - drawerContent = { - ModalDrawerSheet(modifier = Modifier.width(320.dp)) { - SidebarContent( - catalogStore = daemonLink.catalog, - onOpenSession = { scope.launch { drawerState.close() } }, - ) - } - }, - ) { - Scaffold( - modifier = Modifier.fillMaxSize(), - topBar = { - TopAppBar( - title = { Text("Maestro") }, - navigationIcon = { - IconButton(onClick = { scope.launch { drawerState.open() } }) { - Text("☰") - } - }, - ) + val session = openSession + if (session != null) { + TerminalScreen( + daemonBaseUrl = baseUrl, + sessionId = session.id, + sessionTitle = sessionName(session), + onBack = { openSession = null }, + ) + } else { + ModalNavigationDrawer( + drawerState = drawerState, + drawerContent = { + ModalDrawerSheet(modifier = Modifier.width(320.dp)) { + SidebarContent( + catalogStore = daemonLink.catalog, + onOpenSession = { s -> + openSession = s + scope.launch { drawerState.close() } + }, + ) + } }, - ) { innerPadding -> - PlaceholderScreen(modifier = Modifier.padding(innerPadding), linkState = linkState) + ) { + Scaffold( + modifier = Modifier.fillMaxSize(), + topBar = { + TopAppBar( + title = { Text("Maestro") }, + navigationIcon = { + IconButton(onClick = { scope.launch { drawerState.open() } }) { + Text("☰") + } + }, + ) + }, + ) { innerPadding -> + PlaceholderScreen(modifier = Modifier.padding(innerPadding), linkState = linkState) + } } } }