android - fix crash when no user is available at launch

This commit is contained in:
Emmanuel Hansen 2023-10-27 07:55:12 +00:00
parent 5b1a928e1b
commit 2240d87902
5 changed files with 62 additions and 16 deletions

View File

@ -37,6 +37,7 @@ class MainViewModel(val activity: MainActivity) {
private var progress: MutableState<String>? = null private var progress: MutableState<String>? = null
private var progressValue: MutableState<Float>? = null private var progressValue: MutableState<Float>? = null
private var showLoading: MutableState<Boolean>? = null private var showLoading: MutableState<Boolean>? = null
private var refreshUser: MutableState<Boolean>? = null
var gameHost: GameHost? = null var gameHost: GameHost? = null
set(value) { set(value) {
field = value field = value
@ -213,4 +214,15 @@ class MainViewModel(val activity: MainActivity) {
this.progress = progress this.progress = progress
gameHost?.setProgressStates(showLoading, progressValue, progress) gameHost?.setProgressStates(showLoading, progressValue, progress)
} }
fun setRefreshUserState(refreshUser: MutableState<Boolean>)
{
this.refreshUser = refreshUser
}
fun requestUserRefresh(){
refreshUser?.apply {
value = true
}
}
} }

View File

@ -23,6 +23,7 @@ import androidx.compose.foundation.shape.CircleShape
import androidx.compose.material.icons.Icons import androidx.compose.material.icons.Icons
import androidx.compose.material.icons.filled.Add import androidx.compose.material.icons.filled.Add
import androidx.compose.material.icons.filled.Menu import androidx.compose.material.icons.filled.Menu
import androidx.compose.material.icons.filled.Person
import androidx.compose.material.icons.filled.Search import androidx.compose.material.icons.filled.Search
import androidx.compose.material.icons.filled.Settings import androidx.compose.material.icons.filled.Settings
import androidx.compose.material3.AlertDialog import androidx.compose.material3.AlertDialog
@ -79,6 +80,7 @@ class HomeViews {
viewModel: HomeViewModel = HomeViewModel(), viewModel: HomeViewModel = HomeViewModel(),
navController: NavHostController? = null navController: NavHostController? = null
) { ) {
val native = RyujinxNative()
val showAppActions = remember { mutableStateOf(false) } val showAppActions = remember { mutableStateOf(false) }
val showLoading = remember { mutableStateOf(false) } val showLoading = remember { mutableStateOf(false) }
val openTitleUpdateDialog = remember { mutableStateOf(false) } val openTitleUpdateDialog = remember { mutableStateOf(false) }
@ -89,10 +91,27 @@ class HomeViews {
val refresh = remember { val refresh = remember {
mutableStateOf(true) mutableStateOf(true)
} }
val native = RyujinxNative() val refreshUser = remember {
val user = native.userGetOpenedUser() mutableStateOf(true)
val decoder = Base64.getDecoder() }
val pic = decoder.decode(native.userGetUserPicture(user))
viewModel.mainViewModel?.setRefreshUserState(refreshUser)
val user = remember {
mutableStateOf("")
}
val pic = remember {
mutableStateOf(ByteArray(0))
}
if(refreshUser.value){
user.value = native.userGetOpenedUser()
if(user.value.isNotEmpty()) {
val decoder = Base64.getDecoder()
pic.value = decoder.decode(native.userGetUserPicture(user.value))
}
refreshUser.value = false;
}
Scaffold( Scaffold(
modifier = Modifier.fillMaxSize(), modifier = Modifier.fillMaxSize(),
topBar = { topBar = {
@ -126,16 +145,28 @@ class HomeViews {
IconButton(onClick = { IconButton(onClick = {
navController?.navigate("user") navController?.navigate("user")
}) { }) {
Image( if(pic.value.isNotEmpty()) {
bitmap = BitmapFactory.decodeByteArray(pic, 0, pic.size) Image(
.asImageBitmap(), bitmap = BitmapFactory.decodeByteArray(
contentDescription = "user image", pic.value,
contentScale = ContentScale.Crop, 0,
modifier = Modifier pic.value.size
.padding(4.dp) )
.size(52.dp) .asImageBitmap(),
.clip(CircleShape) contentDescription = "user image",
) contentScale = ContentScale.Crop,
modifier = Modifier
.padding(4.dp)
.size(52.dp)
.clip(CircleShape)
)
}
else{
Icon(
Icons.Filled.Person,
contentDescription = "user"
)
}
} }
IconButton( IconButton(
onClick = { onClick = {

View File

@ -22,7 +22,7 @@ class MainView {
SettingsViewModel( SettingsViewModel(
navController, navController,
mainViewModel.activity mainViewModel.activity
) ), mainViewModel
) )
} }
} }

View File

@ -54,6 +54,7 @@ import androidx.documentfile.provider.DocumentFile
import com.anggrayudi.storage.file.extension import com.anggrayudi.storage.file.extension
import org.ryujinx.android.Helpers import org.ryujinx.android.Helpers
import org.ryujinx.android.MainActivity import org.ryujinx.android.MainActivity
import org.ryujinx.android.viewmodels.MainViewModel
import org.ryujinx.android.viewmodels.SettingsViewModel import org.ryujinx.android.viewmodels.SettingsViewModel
import org.ryujinx.android.viewmodels.VulkanDriverViewModel import org.ryujinx.android.viewmodels.VulkanDriverViewModel
import kotlin.concurrent.thread import kotlin.concurrent.thread
@ -65,7 +66,7 @@ class SettingViews {
@OptIn(ExperimentalMaterial3Api::class) @OptIn(ExperimentalMaterial3Api::class)
@Composable @Composable
fun Main(settingsViewModel: SettingsViewModel) { fun Main(settingsViewModel: SettingsViewModel, mainViewModel: MainViewModel) {
val loaded = remember { val loaded = remember {
mutableStateOf(false) mutableStateOf(false)
} }
@ -301,6 +302,7 @@ class SettingViews {
thread { thread {
Helpers.importAppData(this, isImporting) Helpers.importAppData(this, isImporting)
showImportCompletion.value = true showImportCompletion.value = true
mainViewModel.requestUserRefresh()
} }
} }
}, modifier = Modifier.padding(horizontal = 8.dp)) { }, modifier = Modifier.padding(horizontal = 8.dp)) {

View File

@ -162,6 +162,7 @@ class UserViews {
openedUser.value = user openedUser.value = user
openedUserPic.value = pic openedUserPic.value = pic
openedUserName.value = name openedUserName.value = name
viewModel?.requestUserRefresh()
}) })
) )
} }