Check if keep-permissions changed when user comes back from settings app (#715)

* Check if keep-permissions changed when user comes back from settings app

* Use one model only

* Use mutable state flows

* Use compose mutable state

* [CI] Improve caching behavior

* Freshly created model can never be null

---------

Co-authored-by: Ricki Hirner <hirner@bitfire.at>
This commit is contained in:
Sunik Kupfer 2024-04-10 14:06:48 +02:00 committed by GitHub
parent dd08415c84
commit 72320b30f7
No known key found for this signature in database
GPG key ID: B5690EEEBB952194
4 changed files with 39 additions and 24 deletions

View file

@ -26,7 +26,8 @@ import androidx.compose.material.Scaffold
import androidx.compose.material.Text
import androidx.compose.runtime.Composable
import androidx.compose.runtime.getValue
import androidx.compose.runtime.livedata.observeAsState
import androidx.compose.runtime.mutableStateOf
import androidx.compose.runtime.setValue
import androidx.compose.ui.Modifier
import androidx.compose.ui.platform.LocalContext
import androidx.compose.ui.res.painterResource
@ -34,8 +35,6 @@ import androidx.compose.ui.res.stringResource
import androidx.compose.ui.text.font.FontWeight
import androidx.compose.ui.unit.dp
import androidx.lifecycle.AndroidViewModel
import androidx.lifecycle.MutableLiveData
import androidx.lifecycle.viewmodel.compose.viewModel
import at.bitfire.davdroid.BuildConfig
import at.bitfire.davdroid.PackageChangedReceiver
import at.bitfire.davdroid.R
@ -77,11 +76,10 @@ class PermissionsActivity: AppCompatActivity() {
class Model(app: Application): AndroidViewModel(app) {
val needKeepPermissions = MutableLiveData<Boolean>()
val openTasksAvailable = MutableLiveData<Boolean>()
val tasksOrgAvailable = MutableLiveData<Boolean>()
val jtxAvailable = MutableLiveData<Boolean>()
var needKeepPermissions by mutableStateOf(false)
var openTasksAvailable by mutableStateOf(false)
var tasksOrgAvailable by mutableStateOf(false)
var jtxAvailable by mutableStateOf(false)
private val tasksWatcher = object: PackageChangedReceiver(app) {
override fun onPackageChanged() {
@ -104,12 +102,12 @@ class PermissionsActivity: AppCompatActivity() {
// auto-reset permissions
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.R) {
needKeepPermissions.value = pm.isAutoRevokeWhitelisted
needKeepPermissions = pm.isAutoRevokeWhitelisted
}
openTasksAvailable.value = pm.resolveContentProvider(TaskProvider.ProviderName.OpenTasks.authority, 0) != null
tasksOrgAvailable.value = pm.resolveContentProvider(TaskProvider.ProviderName.TasksOrg.authority, 0) != null
jtxAvailable.value = pm.resolveContentProvider(TaskProvider.ProviderName.JtxBoard.authority, 0) != null
openTasksAvailable = pm.resolveContentProvider(TaskProvider.ProviderName.OpenTasks.authority, 0) != null
tasksOrgAvailable = pm.resolveContentProvider(TaskProvider.ProviderName.TasksOrg.authority, 0) != null
jtxAvailable = pm.resolveContentProvider(TaskProvider.ProviderName.JtxBoard.authority, 0) != null
}
}
@ -119,22 +117,17 @@ class PermissionsActivity: AppCompatActivity() {
@Composable
fun PermissionsContent(
modifier: Modifier = Modifier,
model: PermissionsActivity.Model = viewModel()
model: PermissionsActivity.Model
) {
val context = LocalContext.current
val keepPermissions by model.needKeepPermissions.observeAsState()
val openTasksAvailable by model.openTasksAvailable.observeAsState()
val tasksOrgAvailable by model.tasksOrgAvailable.observeAsState()
val jtxAvailable by model.jtxAvailable.observeAsState()
Column(
modifier = modifier
.fillMaxSize()
.verticalScroll(rememberScrollState())
) {
PermissionsCard(
keepPermissions,
model.needKeepPermissions,
onKeepPermissionsRequested = {
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.R) {
val intent = Intent(
@ -149,9 +142,9 @@ fun PermissionsContent(
}
}
},
openTasksAvailable,
tasksOrgAvailable,
jtxAvailable
model.openTasksAvailable,
model.tasksOrgAvailable,
model.jtxAvailable
)
}
}

View file

@ -120,6 +120,12 @@ class IntroActivity : AppIntro2() {
}
}
// For on resume actions of intro pages
override fun onResume() {
super.onResume()
activity?.application?.let { page.onResume(it) }
}
}

View file

@ -35,4 +35,9 @@ interface IntroPage {
@Composable
fun ComposePage()
/**
* Called when the user leaves and re-enters the app intro
*/
fun onResume(application: Application) {}
}

View file

@ -6,14 +6,17 @@ package at.bitfire.davdroid.ui.intro
import android.app.Application
import androidx.compose.runtime.Composable
import androidx.lifecycle.viewmodel.compose.viewModel
import at.bitfire.davdroid.ui.PermissionsActivity
import at.bitfire.davdroid.ui.PermissionsContent
import at.bitfire.davdroid.util.PermissionUtils
import at.bitfire.davdroid.util.PermissionUtils.CALENDAR_PERMISSIONS
import at.bitfire.davdroid.util.PermissionUtils.CONTACT_PERMISSIONS
import at.bitfire.ical4android.TaskProvider
class PermissionsIntroPage: IntroPage {
var model: PermissionsActivity.Model? = null
override fun getShowPolicy(application: Application): IntroPage.ShowPolicy {
// show PermissionsFragment as intro fragment when no permissions are granted
val permissions = CONTACT_PERMISSIONS + CALENDAR_PERMISSIONS +
@ -28,7 +31,15 @@ class PermissionsIntroPage: IntroPage {
@Composable
override fun ComposePage() {
PermissionsContent()
val newModel: PermissionsActivity.Model = viewModel()
model = newModel
PermissionsContent(model = newModel)
}
// Check whether permissions have changed after user comes back from settings app
override fun onResume(application: Application) {
model?.checkPermissions()
}
}