forked from MeloNX/MeloNX
android - fix crash when no user is available at launch
This commit is contained in:
parent
5b1a928e1b
commit
2240d87902
@ -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
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
@ -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 = {
|
||||||
|
@ -22,7 +22,7 @@ class MainView {
|
|||||||
SettingsViewModel(
|
SettingsViewModel(
|
||||||
navController,
|
navController,
|
||||||
mainViewModel.activity
|
mainViewModel.activity
|
||||||
)
|
), mainViewModel
|
||||||
)
|
)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -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)) {
|
||||||
|
@ -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()
|
||||||
})
|
})
|
||||||
)
|
)
|
||||||
}
|
}
|
||||||
|
Loading…
x
Reference in New Issue
Block a user