Skip to content
Open
49 changes: 35 additions & 14 deletions app/src/main/java/app/gamenative/ui/PluviaMain.kt
Original file line number Diff line number Diff line change
Expand Up @@ -58,6 +58,7 @@ import app.gamenative.ui.enums.Orientation
import app.gamenative.ui.model.MainViewModel
import app.gamenative.ui.screen.HomeScreen
import app.gamenative.ui.screen.PluviaScreen
import app.gamenative.ui.screen.accounts.AccountManagementScreen
import app.gamenative.ui.screen.chat.ChatScreen
import app.gamenative.ui.screen.login.UserLoginScreen
import app.gamenative.ui.screen.settings.SettingsScreen
Expand All @@ -79,6 +80,8 @@ import timber.log.Timber
import java.util.Date
import java.util.EnumSet
import kotlin.reflect.KFunction2
import app.gamenative.ui.screen.accounts.AccountManagementScreen
import app.gamenative.ui.screen.welcome.WelcomeScreen

@Composable
fun PluviaMain(
Expand Down Expand Up @@ -192,20 +195,16 @@ fun PluviaMain(
}

MainViewModel.MainUiEvent.OnLoggedOut -> {
// Pop stack and go back to login.
navController.popBackStack(
route = PluviaScreen.LoginUser.route,
inclusive = false,
saveState = false,
)
// Do nothing - let users stay on current page after logout
}

is MainViewModel.MainUiEvent.OnLogonEnded -> {
when (event.result) {
LoginResult.Success -> {
if (PluviaApp.xEnvironment == null) {
Timber.i("Navigating to library")
navController.navigate(PluviaScreen.Home.route)
navController.navigate(PluviaScreen.AccountManagement.route) {
popUpTo(PluviaScreen.LoginUser.route) { inclusive = true }
}

// If a crash happen, lets not ask for a tip yet.
// Instead, ask the user to contribute their issues to be addressed.
Expand Down Expand Up @@ -312,7 +311,9 @@ fun PluviaMain(
isConnecting = true
context.startForegroundService(Intent(context, SteamService::class.java))
}
if (SteamService.isLoggedIn && state.currentScreen == PluviaScreen.LoginUser) {
// Only auto-navigate to home if user is logged in, on login screen, AND it's not first launch
if (SteamService.isLoggedIn && state.currentScreen == PluviaScreen.LoginUser && !state.isFirstLaunch) {
Timber.i("DEBUG: Auto-navigation triggered - SteamService.isLoggedIn=${SteamService.isLoggedIn}, currentScreen=${state.currentScreen}, isFirstLaunch=${state.isFirstLaunch}")
navController.navigate(PluviaScreen.Home.route)
}
}
Expand Down Expand Up @@ -694,9 +695,20 @@ fun PluviaMain(

NavHost(
navController = navController,
startDestination = PluviaScreen.LoginUser.route,
startDestination = PluviaScreen.Welcome.route,
) {
/** Login **/
/** Welcome **/
composable(route = PluviaScreen.Welcome.route) {
WelcomeScreen(
onSetupAccounts = {
navController.navigate(PluviaScreen.AccountManagement.route)
},
onSkipSignIn = {
navController.navigate(PluviaScreen.Home.route + "?offline=true")
},
)
}

/** Login **/
composable(route = PluviaScreen.LoginUser.route) {
UserLoginScreen(
Expand All @@ -705,6 +717,18 @@ fun PluviaMain(
},
)
}

/** Account Management **/
composable(route = PluviaScreen.AccountManagement.route) {
AccountManagementScreen(
onNavigateRoute = {
navController.navigate(it)
},
onBack = {
navController.navigateUp()
},
)
}
/** Library, Downloads, Friends **/
/** Library, Downloads, Friends **/
composable(
Expand Down Expand Up @@ -743,9 +767,6 @@ fun PluviaMain(
onNavigateRoute = {
navController.navigate(it)
},
onLogout = {
SteamService.logOut()
},
onGoOnline = {
navController.navigate(PluviaScreen.LoginUser.route)
},
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -9,6 +9,7 @@ import androidx.compose.foundation.layout.size
import androidx.compose.material.icons.Icons
import androidx.compose.material.icons.automirrored.filled.Login
import androidx.compose.material.icons.automirrored.filled.Logout
import androidx.compose.material.icons.filled.AccountCircle
import androidx.compose.material.icons.filled.Help
import androidx.compose.material.icons.filled.Settings
import androidx.compose.material3.AlertDialog
Expand Down Expand Up @@ -49,7 +50,6 @@ fun ProfileDialog(
state: EPersonaState,
onStatusChange: (EPersonaState) -> Unit,
onNavigateRoute: (String) -> Unit,
onLogout: () -> Unit,
onDismiss: () -> Unit,
onGoOnline: () -> Unit,
isOffline: Boolean = false,
Expand Down Expand Up @@ -109,6 +109,13 @@ fun ProfileDialog(

/* Action Buttons */
Spacer(modifier = Modifier.height(16.dp))

FilledTonalButton(modifier = Modifier.fillMaxWidth(), onClick = { onNavigateRoute(PluviaScreen.AccountManagement.route) }) {
Icon(imageVector = Icons.Default.AccountCircle, contentDescription = null)
Spacer(modifier = Modifier.size(ButtonDefaults.IconSize))
Text(text = "Manage Accounts")
}

FilledTonalButton(modifier = Modifier.fillMaxWidth(), onClick = { onNavigateRoute(PluviaScreen.Settings.route) }) {
Icon(imageVector = Icons.Default.Settings, contentDescription = null)
Spacer(modifier = Modifier.size(ButtonDefaults.IconSize))
Expand All @@ -127,12 +134,6 @@ fun ProfileDialog(
Spacer(modifier = Modifier.size(ButtonDefaults.IconSize))
Text(text = "Go Online")
}
} else {
FilledTonalButton(modifier = Modifier.fillMaxWidth(), onClick = onLogout) {
Icon(imageVector = Icons.AutoMirrored.Filled.Logout, contentDescription = null)
Spacer(modifier = Modifier.size(ButtonDefaults.IconSize))
Text(text = "Log Out")
}
}
}
},
Expand All @@ -155,7 +156,6 @@ private fun Preview_ProfileDialog() {
state = EPersonaState.Online,
onStatusChange = {},
onNavigateRoute = {},
onLogout = {},
onDismiss = {},
onGoOnline = {},
)
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -29,7 +29,6 @@ import timber.log.Timber
@Composable
fun AccountButton(
onNavigateRoute: (String) -> Unit,
onLogout: () -> Unit,
onGoOnline: () -> Unit,
isOffline: Boolean = false,
) {
Expand Down Expand Up @@ -70,10 +69,6 @@ fun AccountButton(
onNavigateRoute(it)
showDialog = false
},
onLogout = {
onLogout()
showDialog = false
},
onGoOnline = {
onGoOnline()
showDialog = false
Expand Down Expand Up @@ -105,7 +100,6 @@ private fun Preview_AccountButton() {
actions = {
AccountButton(
onNavigateRoute = {},
onLogout = {},
onGoOnline = {},
)
},
Expand Down
1 change: 1 addition & 0 deletions app/src/main/java/app/gamenative/ui/data/MainState.kt
Original file line number Diff line number Diff line change
Expand Up @@ -18,4 +18,5 @@ data class MainState(
val launchedAppId: String = "",
val bootToContainer: Boolean = false,
val showBootingSplash: Boolean = false,
val isFirstLaunch: Boolean = true,
)
16 changes: 8 additions & 8 deletions app/src/main/java/app/gamenative/ui/model/LibraryViewModel.kt
Original file line number Diff line number Diff line change
Expand Up @@ -18,15 +18,15 @@ import app.gamenative.ui.enums.AppFilter
import dagger.hilt.android.lifecycle.HiltViewModel
import java.util.EnumSet
import javax.inject.Inject
import kotlin.math.max
import kotlin.math.min
import kotlinx.coroutines.Dispatchers
import kotlinx.coroutines.flow.MutableStateFlow
import kotlinx.coroutines.flow.StateFlow
import kotlinx.coroutines.flow.asStateFlow
import kotlinx.coroutines.flow.update
import kotlinx.coroutines.launch
import timber.log.Timber
import kotlin.math.max
import kotlin.math.min

@HiltViewModel
class LibraryViewModel @Inject constructor(
Expand All @@ -40,8 +40,8 @@ class LibraryViewModel @Inject constructor(
var listState: LazyListState by mutableStateOf(LazyListState(0, 0))

// How many items loaded on one page of results
private var paginationCurrentPage: Int = 0;
private var lastPageInCurrentFilter: Int = 0;
private var paginationCurrentPage: Int = 0
private var lastPageInCurrentFilter: Int = 0

// Complete and unfiltered app list
private var appList: List<SteamApp> = emptyList()
Expand Down Expand Up @@ -156,8 +156,8 @@ class LibraryViewModel @Inject constructor(
}
.sortedWith(
// Comes from DAO in alphabetical order
compareByDescending<SteamApp> { downloadDirectoryApps.contains(SteamService.getAppDirName(it)) }
);
compareByDescending<SteamApp> { downloadDirectoryApps.contains(SteamService.getAppDirName(it)) },
)

// Total count for the current filter
val totalFound = filteredList.count()
Expand All @@ -183,14 +183,14 @@ class LibraryViewModel @Inject constructor(
}
.toList()

Timber.tag("LibraryViewModel").d("Filtered list size: ${totalFound}")
Timber.tag("LibraryViewModel").d("Filtered list size: $totalFound")
_state.update {
it.copy(
appInfoList = filteredListPage,
currentPaginationPage = paginationPage + 1, // visual display is not 0 indexed
lastPaginationPage = lastPageInCurrentFilter + 1,
totalAppsInFilter = totalFound,
)
)
}
}
}
Expand Down
19 changes: 9 additions & 10 deletions app/src/main/java/app/gamenative/ui/model/MainViewModel.kt
Original file line number Diff line number Diff line change
Expand Up @@ -131,6 +131,15 @@ class MainViewModel @Inject constructor(
_state.update { it.copy(paletteStyle = value) }
}
}

_state.update {
it.copy(
isFirstLaunch = true, // Temporarily always true for debugging
isSteamConnected = SteamService.isConnected,
hasCrashedLastStart = PrefManager.recentlyCrashed,
launchedAppId = "",
)
}
}

override fun onCleared() {
Expand All @@ -142,16 +151,6 @@ class MainViewModel @Inject constructor(
PluviaApp.events.off<SteamEvent.LoggedOut, Unit>(onLoggedOut)
}

init {
_state.update {
it.copy(
isSteamConnected = SteamService.isConnected,
hasCrashedLastStart = PrefManager.recentlyCrashed,
launchedAppId = "",
)
}
}

fun setTheme(value: AppTheme) {
appTheme.currentTheme = value
}
Expand Down
3 changes: 0 additions & 3 deletions app/src/main/java/app/gamenative/ui/screen/HomeScreen.kt
Original file line number Diff line number Diff line change
Expand Up @@ -21,7 +21,6 @@ fun HomeScreen(
onChat: (Long) -> Unit,
onClickExit: () -> Unit,
onClickPlay: (Int, Boolean) -> Unit,
onLogout: () -> Unit,
onNavigateRoute: (String) -> Unit,
onGoOnline: () -> Unit,
isOffline: Boolean = false
Expand All @@ -37,7 +36,6 @@ fun HomeScreen(
HomeLibraryScreen(
onClickPlay = onClickPlay,
onNavigateRoute = onNavigateRoute,
onLogout = onLogout,
onGoOnline = onGoOnline,
isOffline = isOffline,
)
Expand All @@ -57,7 +55,6 @@ private fun Preview_HomeScreenContent() {
HomeScreen(
onChat = {},
onClickPlay = { _, _ -> },
onLogout = {},
onNavigateRoute = {},
onClickExit = {},
onGoOnline = {},
Expand Down
2 changes: 2 additions & 0 deletions app/src/main/java/app/gamenative/ui/screen/PluviaScreen.kt
Original file line number Diff line number Diff line change
Expand Up @@ -4,10 +4,12 @@ package app.gamenative.ui.screen
* Destinations for top level screens, excluding home screen destinations.
*/
sealed class PluviaScreen(val route: String) {
data object Welcome : PluviaScreen("welcome")
data object LoginUser : PluviaScreen("login")
data object Home : PluviaScreen("home")
data object XServer : PluviaScreen("xserver")
data object Settings : PluviaScreen("settings")
data object AccountManagement : PluviaScreen("accounts")
data object Chat : PluviaScreen("chat/{id}") {
fun route(id: Long) = "chat/$id"
const val ARG_ID = "id"
Expand Down
Loading