This commit is contained in:
Minecon724 2025-04-27 09:32:34 +02:00
commit ed17587bf8
Signed by: Minecon724
GPG key ID: A02E6E67AB961189
5 changed files with 45 additions and 35 deletions

View file

@ -1,6 +1,8 @@
package eu.m724.pojavbackup.home
import android.Manifest
import android.content.Intent
import android.content.pm.PackageManager
import android.os.Bundle
import androidx.activity.ComponentActivity
import androidx.activity.compose.setContent
@ -30,9 +32,9 @@ import androidx.compose.runtime.getValue
import androidx.compose.ui.Alignment
import androidx.compose.ui.Modifier
import androidx.compose.ui.res.painterResource
import androidx.core.content.ContextCompat.startActivity
import androidx.core.app.ActivityCompat
import androidx.core.content.ContextCompat
import androidx.lifecycle.compose.collectAsStateWithLifecycle
import androidx.lifecycle.lifecycleScope
import androidx.navigation.NavController
import androidx.navigation.NavDestination.Companion.hierarchy
import androidx.navigation.compose.NavHost
@ -46,7 +48,6 @@ import eu.m724.pojavbackup.home.screen.dashboard.DashboardScreen
import eu.m724.pojavbackup.home.screen.history.HistoryScreen
import eu.m724.pojavbackup.settings.SettingsActivity
import eu.m724.pojavbackup.ui.theme.PojavBackupTheme
import kotlinx.coroutines.launch
@AndroidEntryPoint
class HomeActivity : ComponentActivity() {
@ -64,6 +65,8 @@ class HomeActivity : ComponentActivity() {
super.onCreate(savedInstanceState)
viewModel.load(
notificationPermissionGranted = checkForNotificationPermission(),
notificationPermissionRejected = checkIfNotificationPermissionRejected(),
onSetupRequired = {
setupResult.launch(it)
}
@ -94,6 +97,14 @@ class HomeActivity : ComponentActivity() {
fun onSettingsOpen(page: String) {
startActivity(Intent(applicationContext, SettingsActivity::class.java).putExtra("settingsPage", page))
}
private fun checkForNotificationPermission(): Boolean {
return ContextCompat.checkSelfPermission(applicationContext, Manifest.permission.POST_NOTIFICATIONS) == PackageManager.PERMISSION_GRANTED
}
private fun checkIfNotificationPermissionRejected(): Boolean {
return !ActivityCompat.shouldShowRequestPermissionRationale(this, Manifest.permission.POST_NOTIFICATIONS)
}
}
@OptIn(ExperimentalMaterial3Api::class)

View file

@ -1,13 +1,10 @@
package eu.m724.pojavbackup.home
import android.Manifest
import android.app.NotificationManager
import android.content.Context
import android.content.Intent
import android.content.pm.PackageManager
import android.net.Uri
import android.util.Log
import androidx.core.content.ContextCompat
import androidx.documentfile.provider.DocumentFile
import androidx.lifecycle.ViewModel
import androidx.lifecycle.viewModelScope
@ -43,18 +40,20 @@ class HomeViewModel @Inject constructor(
}
fun load(
notificationPermissionGranted: Boolean,
notificationPermissionRejected: Boolean,
onSetupRequired: (Intent) -> Unit
) {
viewModelScope.launch {
val uri = settingsRepository.getSource()
val storagePermission = uri?.let { checkForStoragePermission(uri) } == true
val notificationPermission = checkForNotificationPermission()
if (!storagePermission || !notificationPermission) {
if (!storagePermission || (!notificationPermissionGranted && !notificationPermissionRejected)) {
val intent = Intent(appContext, SetupActivity::class.java)
.putExtra("storagePermissionGranted", storagePermission)
.putExtra("notificationPermissionGranted", notificationPermission)
.putExtra("notificationPermissionGranted", notificationPermissionGranted)
.putExtra("notificationPermissionRejected", notificationPermissionRejected)
onSetupRequired(intent)
} else {
@ -86,9 +85,4 @@ class HomeViewModel @Inject constructor(
return true
}
private fun checkForNotificationPermission(): Boolean {
// TODO check if rejected
return ContextCompat.checkSelfPermission(appContext, Manifest.permission.POST_NOTIFICATIONS) == PackageManager.PERMISSION_GRANTED
}
}

View file

@ -54,16 +54,7 @@ class SetupActivity : ComponentActivity() {
private val notificationGrant = registerForActivityResult(ActivityResultContracts.RequestPermission()) {
viewModel.onNotificationGrant(it) { success ->
if (success) {
onComplete()
} else {
// TODO instead red text?
Toast.makeText(
applicationContext,
"This is not a PojavLauncher directory.",
Toast.LENGTH_SHORT
).show()
}
onComplete()
}
}
@ -81,8 +72,9 @@ class SetupActivity : ComponentActivity() {
val storagePermissionGranted = intent.getBooleanExtra("storagePermissionGranted", false)
val notificationPermissionGranted = intent.getBooleanExtra("notificationPermissionGranted", false)
val notificationPermissionRejected = intent.getBooleanExtra("notificationPermissionRejected", false)
viewModel.init(storagePermissionGranted, notificationPermissionGranted)
viewModel.init(storagePermissionGranted, notificationPermissionGranted, notificationPermissionRejected)
// println("Found pojav launchers: ${packages.joinToString(", ")}")
@ -137,8 +129,9 @@ fun SetupScreen(
GrantCard(
title = "Notification permission",
description = "It's needed to notify you about backup status.",
granted = uiState.notificationPermissionGranted,
onClick = onNotificationPermissionGrantClick
granted = uiState.notificationPermissionGranted || uiState.notificationPermissionRejected,
onClick = onNotificationPermissionGrantClick,
customButtonText = if (uiState.notificationPermissionRejected) "Rejected" else null
)
}
}
@ -149,7 +142,8 @@ fun GrantCard(
title: String,
description: String,
granted: Boolean,
onClick: () -> Unit
onClick: () -> Unit,
customButtonText: String? = null
) {
Card(
modifier = modifier,
@ -182,10 +176,14 @@ fun GrantCard(
modifier = Modifier.align(Alignment.CenterHorizontally),
enabled = !granted
) {
if (granted) {
Text("Already granted")
if (customButtonText == null) {
if (granted) {
Text("Already granted")
} else {
Text("Grant")
}
} else {
Text("Grant")
Text(customButtonText)
}
}
}

View file

@ -2,5 +2,6 @@ package eu.m724.pojavbackup.setup
data class SetupUiState(
val storagePermissionGranted: Boolean = false,
val notificationPermissionGranted: Boolean = false
val notificationPermissionGranted: Boolean = false,
val notificationPermissionRejected: Boolean = false
)

View file

@ -35,12 +35,14 @@ class SetupViewModel @Inject constructor(
fun init(
storagePermissionGranted: Boolean,
notificationPermissionGranted: Boolean
notificationPermissionGranted: Boolean,
notificationPermissionRejected: Boolean
) {
_uiState.update {
it.copy(
storagePermissionGranted = storagePermissionGranted,
notificationPermissionGranted = notificationPermissionGranted
notificationPermissionGranted = notificationPermissionGranted,
notificationPermissionRejected = notificationPermissionRejected
)
}
}
@ -48,7 +50,7 @@ class SetupViewModel @Inject constructor(
fun checkIfCanProceed(): Boolean {
val state = _uiState.value
return state.storagePermissionGranted && state.notificationPermissionGranted
return state.storagePermissionGranted && (state.notificationPermissionGranted || state.notificationPermissionRejected)
}
// TODO we could make the check call separate and not pass context here
@ -78,6 +80,10 @@ class SetupViewModel @Inject constructor(
_uiState.update {
it.copy(notificationPermissionGranted = true)
}
} else {
_uiState.update {
it.copy(notificationPermissionRejected = true)
}
}
result(isGranted)