Update
This commit is contained in:
parent
e88efe5f2d
commit
ed17587bf8
5 changed files with 45 additions and 35 deletions
|
|
@ -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)
|
||||||
|
|
|
||||||
|
|
@ -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
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
@ -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)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -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
|
||||||
)
|
)
|
||||||
|
|
@ -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)
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue