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

View file

@ -1,6 +1,8 @@
package eu.m724.pojavbackup.home package eu.m724.pojavbackup.home
import android.Manifest
import android.content.Intent import android.content.Intent
import android.content.pm.PackageManager
import android.os.Bundle import android.os.Bundle
import androidx.activity.ComponentActivity import androidx.activity.ComponentActivity
import androidx.activity.compose.setContent import androidx.activity.compose.setContent
@ -30,9 +32,9 @@ import androidx.compose.runtime.getValue
import androidx.compose.ui.Alignment import androidx.compose.ui.Alignment
import androidx.compose.ui.Modifier import androidx.compose.ui.Modifier
import androidx.compose.ui.res.painterResource 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.compose.collectAsStateWithLifecycle
import androidx.lifecycle.lifecycleScope
import androidx.navigation.NavController import androidx.navigation.NavController
import androidx.navigation.NavDestination.Companion.hierarchy import androidx.navigation.NavDestination.Companion.hierarchy
import androidx.navigation.compose.NavHost 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.home.screen.history.HistoryScreen
import eu.m724.pojavbackup.settings.SettingsActivity import eu.m724.pojavbackup.settings.SettingsActivity
import eu.m724.pojavbackup.ui.theme.PojavBackupTheme import eu.m724.pojavbackup.ui.theme.PojavBackupTheme
import kotlinx.coroutines.launch
@AndroidEntryPoint @AndroidEntryPoint
class HomeActivity : ComponentActivity() { class HomeActivity : ComponentActivity() {
@ -64,6 +65,8 @@ class HomeActivity : ComponentActivity() {
super.onCreate(savedInstanceState) super.onCreate(savedInstanceState)
viewModel.load( viewModel.load(
notificationPermissionGranted = checkForNotificationPermission(),
notificationPermissionRejected = checkIfNotificationPermissionRejected(),
onSetupRequired = { onSetupRequired = {
setupResult.launch(it) setupResult.launch(it)
} }
@ -94,6 +97,14 @@ class HomeActivity : ComponentActivity() {
fun onSettingsOpen(page: String) { fun onSettingsOpen(page: String) {
startActivity(Intent(applicationContext, SettingsActivity::class.java).putExtra("settingsPage", page)) 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) @OptIn(ExperimentalMaterial3Api::class)

View file

@ -1,13 +1,10 @@
package eu.m724.pojavbackup.home package eu.m724.pojavbackup.home
import android.Manifest
import android.app.NotificationManager import android.app.NotificationManager
import android.content.Context import android.content.Context
import android.content.Intent import android.content.Intent
import android.content.pm.PackageManager
import android.net.Uri import android.net.Uri
import android.util.Log import android.util.Log
import androidx.core.content.ContextCompat
import androidx.documentfile.provider.DocumentFile import androidx.documentfile.provider.DocumentFile
import androidx.lifecycle.ViewModel import androidx.lifecycle.ViewModel
import androidx.lifecycle.viewModelScope import androidx.lifecycle.viewModelScope
@ -43,18 +40,20 @@ class HomeViewModel @Inject constructor(
} }
fun load( fun load(
notificationPermissionGranted: Boolean,
notificationPermissionRejected: Boolean,
onSetupRequired: (Intent) -> Unit onSetupRequired: (Intent) -> Unit
) { ) {
viewModelScope.launch { viewModelScope.launch {
val uri = settingsRepository.getSource() val uri = settingsRepository.getSource()
val storagePermission = uri?.let { checkForStoragePermission(uri) } == true val storagePermission = uri?.let { checkForStoragePermission(uri) } == true
val notificationPermission = checkForNotificationPermission()
if (!storagePermission || !notificationPermission) { if (!storagePermission || (!notificationPermissionGranted && !notificationPermissionRejected)) {
val intent = Intent(appContext, SetupActivity::class.java) val intent = Intent(appContext, SetupActivity::class.java)
.putExtra("storagePermissionGranted", storagePermission) .putExtra("storagePermissionGranted", storagePermission)
.putExtra("notificationPermissionGranted", notificationPermission) .putExtra("notificationPermissionGranted", notificationPermissionGranted)
.putExtra("notificationPermissionRejected", notificationPermissionRejected)
onSetupRequired(intent) onSetupRequired(intent)
} else { } else {
@ -86,9 +85,4 @@ class HomeViewModel @Inject constructor(
return true 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()) { private val notificationGrant = registerForActivityResult(ActivityResultContracts.RequestPermission()) {
viewModel.onNotificationGrant(it) { success -> viewModel.onNotificationGrant(it) { success ->
if (success) { onComplete()
onComplete()
} else {
// TODO instead red text?
Toast.makeText(
applicationContext,
"This is not a PojavLauncher directory.",
Toast.LENGTH_SHORT
).show()
}
} }
} }
@ -81,8 +72,9 @@ class SetupActivity : ComponentActivity() {
val storagePermissionGranted = intent.getBooleanExtra("storagePermissionGranted", false) val storagePermissionGranted = intent.getBooleanExtra("storagePermissionGranted", false)
val notificationPermissionGranted = intent.getBooleanExtra("notificationPermissionGranted", 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(", ")}") // println("Found pojav launchers: ${packages.joinToString(", ")}")
@ -137,8 +129,9 @@ fun SetupScreen(
GrantCard( GrantCard(
title = "Notification permission", title = "Notification permission",
description = "It's needed to notify you about backup status.", description = "It's needed to notify you about backup status.",
granted = uiState.notificationPermissionGranted, granted = uiState.notificationPermissionGranted || uiState.notificationPermissionRejected,
onClick = onNotificationPermissionGrantClick onClick = onNotificationPermissionGrantClick,
customButtonText = if (uiState.notificationPermissionRejected) "Rejected" else null
) )
} }
} }
@ -149,7 +142,8 @@ fun GrantCard(
title: String, title: String,
description: String, description: String,
granted: Boolean, granted: Boolean,
onClick: () -> Unit onClick: () -> Unit,
customButtonText: String? = null
) { ) {
Card( Card(
modifier = modifier, modifier = modifier,
@ -182,10 +176,14 @@ fun GrantCard(
modifier = Modifier.align(Alignment.CenterHorizontally), modifier = Modifier.align(Alignment.CenterHorizontally),
enabled = !granted enabled = !granted
) { ) {
if (granted) { if (customButtonText == null) {
Text("Already granted") if (granted) {
Text("Already granted")
} else {
Text("Grant")
}
} else { } else {
Text("Grant") Text(customButtonText)
} }
} }
} }

View file

@ -2,5 +2,6 @@ package eu.m724.pojavbackup.setup
data class SetupUiState( data class SetupUiState(
val storagePermissionGranted: Boolean = false, 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( fun init(
storagePermissionGranted: Boolean, storagePermissionGranted: Boolean,
notificationPermissionGranted: Boolean notificationPermissionGranted: Boolean,
notificationPermissionRejected: Boolean
) { ) {
_uiState.update { _uiState.update {
it.copy( it.copy(
storagePermissionGranted = storagePermissionGranted, storagePermissionGranted = storagePermissionGranted,
notificationPermissionGranted = notificationPermissionGranted notificationPermissionGranted = notificationPermissionGranted,
notificationPermissionRejected = notificationPermissionRejected
) )
} }
} }
@ -48,7 +50,7 @@ class SetupViewModel @Inject constructor(
fun checkIfCanProceed(): Boolean { fun checkIfCanProceed(): Boolean {
val state = _uiState.value 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 // TODO we could make the check call separate and not pass context here
@ -78,6 +80,10 @@ class SetupViewModel @Inject constructor(
_uiState.update { _uiState.update {
it.copy(notificationPermissionGranted = true) it.copy(notificationPermissionGranted = true)
} }
} else {
_uiState.update {
it.copy(notificationPermissionRejected = true)
}
} }
result(isGranted) result(isGranted)