diff --git a/app/src/main/java/com/droiddeck/launcher/SessionActivity.kt b/app/src/main/java/com/droiddeck/launcher/SessionActivity.kt index a1a2be2a9..58132bc1a 100644 --- a/app/src/main/java/com/droiddeck/launcher/SessionActivity.kt +++ b/app/src/main/java/com/droiddeck/launcher/SessionActivity.kt @@ -301,6 +301,16 @@ class SessionActivity : ComponentActivity(), SurfaceHolder.Callback { onHardwareKeyboard = { drawerOpen = false; pcKeyboardOpen = !pcKeyboardOpen }, onSteamMenu = if (SessionState.mode == SessionService.MODE_STEAM) ({ sendSteamGuide() }) else null, onQam = if (SessionState.mode == SessionService.MODE_STEAM) ({ triggerSteamQam() }) else null, + // The desktop with Steam's desktop client in it, in this session's place: the + // session ends with status 0 and onSessionEnded starts the relaunch (Stop's + // finish() would skip it). + onSwitchToDesktop = if (SessionState.mode == SessionService.MODE_STEAM) ({ + drawerOpen = false + SessionState.relaunch = Intent(this@SessionActivity, SessionActivity::class.java) + .putExtra(SessionService.EXTRA_MODE, SessionService.MODE_DESKTOP) + .putExtra(SessionService.EXTRA_STEAM_UI, "desktop") + SessionService.stop(this@SessionActivity) + }) else null, backActionsInverted = backActionsInverted, onBackActionsInverted = { inverted -> SessionPrefs.setBackActionsInverted(this@SessionActivity, inverted) diff --git a/app/src/main/java/com/droiddeck/launcher/ui/SessionOverlay.kt b/app/src/main/java/com/droiddeck/launcher/ui/SessionOverlay.kt index fc949bda6..afbc86ef6 100644 --- a/app/src/main/java/com/droiddeck/launcher/ui/SessionOverlay.kt +++ b/app/src/main/java/com/droiddeck/launcher/ui/SessionOverlay.kt @@ -213,6 +213,8 @@ class DrawerActions( val onHardwareKeyboard: () -> Unit, val onSteamMenu: (() -> Unit)?, val onQam: (() -> Unit)?, + /** Steam sessions: end Big Picture and open the desktop with Steam's desktop client in it. */ + val onSwitchToDesktop: (() -> Unit)? = null, val onOsc: (String) -> Unit, val onSuspendPolicy: (String) -> Unit, val onBackActionsInverted: (Boolean) -> Unit, @@ -346,6 +348,26 @@ fun SessionDrawer(open: Boolean, page: Int, controllerActive: Boolean, onPageCha ) { Text("QAM", fontSize = 13.sp, fontWeight = FontWeight.SemiBold, letterSpacing = 0.5.sp) } + // Big Picture's own "Switch to Desktop" waits on SteamOS Manager for ever + // here; this does the switch without the client. + if (a.onSwitchToDesktop != null) { + val deskSrc = remember { MutableInteractionSource() } + val deskHot = deskSrc.collectIsFocusedAsState().value || deskSrc.collectIsHoveredAsState().value + OutlinedButton( + onClick = { host.open = null; a.onSwitchToDesktop.invoke() }, + interactionSource = deskSrc, + modifier = Modifier.weight(1f).height(48.dp).then(focus.track(page, "desktop")) + .semantics { contentDescription = "Switch to Desktop" }.controllerConfirm { + host.open = null + a.onSwitchToDesktop.invoke() + }, + shape = RoundedCornerShape(12.dp), + border = BorderStroke(if (deskHot) 2.dp else 1.dp, if (deskHot) pal.signal else colors.outline), + colors = ButtonDefaults.outlinedButtonColors(containerColor = if (deskHot) pal.signal.copy(alpha = 0.16f) else Color.Transparent), + ) { + Text("DESKTOP", fontSize = 13.sp, fontWeight = FontWeight.SemiBold, letterSpacing = 0.5.sp) + } + } } }