diff --git a/app/src/main/java/eu/m724/pojavbackup/home/HomeActivity.kt b/app/src/main/java/eu/m724/pojavbackup/home/HomeActivity.kt index a05bd5d..f38fa4d 100644 --- a/app/src/main/java/eu/m724/pojavbackup/home/HomeActivity.kt +++ b/app/src/main/java/eu/m724/pojavbackup/home/HomeActivity.kt @@ -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) diff --git a/app/src/main/java/eu/m724/pojavbackup/home/HomeViewModel.kt b/app/src/main/java/eu/m724/pojavbackup/home/HomeViewModel.kt index 47b2445..21e8621 100644 --- a/app/src/main/java/eu/m724/pojavbackup/home/HomeViewModel.kt +++ b/app/src/main/java/eu/m724/pojavbackup/home/HomeViewModel.kt @@ -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 - } } \ No newline at end of file diff --git a/app/src/main/java/eu/m724/pojavbackup/setup/SetupActivity.kt b/app/src/main/java/eu/m724/pojavbackup/setup/SetupActivity.kt index bbb352c..aee669c 100644 --- a/app/src/main/java/eu/m724/pojavbackup/setup/SetupActivity.kt +++ b/app/src/main/java/eu/m724/pojavbackup/setup/SetupActivity.kt @@ -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) } } } diff --git a/app/src/main/java/eu/m724/pojavbackup/setup/SetupUiState.kt b/app/src/main/java/eu/m724/pojavbackup/setup/SetupUiState.kt index 00b36e2..4f7d97e 100644 --- a/app/src/main/java/eu/m724/pojavbackup/setup/SetupUiState.kt +++ b/app/src/main/java/eu/m724/pojavbackup/setup/SetupUiState.kt @@ -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 ) \ No newline at end of file diff --git a/app/src/main/java/eu/m724/pojavbackup/setup/SetupViewModel.kt b/app/src/main/java/eu/m724/pojavbackup/setup/SetupViewModel.kt index c363596..bd325eb 100644 --- a/app/src/main/java/eu/m724/pojavbackup/setup/SetupViewModel.kt +++ b/app/src/main/java/eu/m724/pojavbackup/setup/SetupViewModel.kt @@ -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)