Skip to content

Commit

Permalink
First calendar addition doesn't refresh the list (#75)
Browse files Browse the repository at this point in the history
* Reinitializing `CalendarModel` listeners on resume

Signed-off-by: Arnau Mora <arnyminer.z@gmail.com>

* CalendarListActivity: Start watching calendars as soon as permissions are granted

Signed-off-by: Arnau Mora <arnyminer.z@gmail.com>
Co-authored-by: Ricki Hirner <hirner@bitfire.at>
  • Loading branch information
ArnyminerZ and rfc2822 committed Dec 1, 2022
1 parent a9497f9 commit 508bc64
Show file tree
Hide file tree
Showing 3 changed files with 55 additions and 22 deletions.
32 changes: 30 additions & 2 deletions app/src/main/java/at/bitfire/icsdroid/PermissionUtils.kt
Original file line number Diff line number Diff line change
Expand Up @@ -5,15 +5,41 @@
package at.bitfire.icsdroid

import android.Manifest
import android.content.Context
import android.content.pm.PackageManager
import android.widget.Toast
import androidx.activity.result.contract.ActivityResultContracts
import androidx.appcompat.app.AppCompatActivity
import androidx.core.app.NotificationManagerCompat
import androidx.core.content.ContextCompat
import at.bitfire.icsdroid.ui.NotificationUtils

class PermissionUtils(val activity: AppCompatActivity) {
object PermissionUtils {

fun registerCalendarPermissionRequestLauncher() =
val CALENDAR_PERMISSIONS = arrayOf(
Manifest.permission.READ_CALENDAR,
Manifest.permission.WRITE_CALENDAR
)

/**
* Checks whether the calling app has all [CALENDAR_PERMISSIONS].
*
* @param context context to check permissions within
* @return *true* if all calendar permissions are granted; *false* otherwise
*/
fun haveCalendarPermissions(context: Context) = CALENDAR_PERMISSIONS.all { permission ->
ContextCompat.checkSelfPermission(context, permission) == PackageManager.PERMISSION_GRANTED
}

/**
* Registers a calendar permission request launcher.
*
* @param activity activity to register permission request launcher
* @param onGranted called when calendar permissions have been granted
*
* @return permission request launcher; has to be called with `launch(PermissionUtils.CALENDAR_PERMISSIONS)`
*/
fun registerCalendarPermissionRequest(activity: AppCompatActivity, onGranted: () -> Unit = {}) =
activity.registerForActivityResult(
ActivityResultContracts.RequestMultiplePermissions()
) { permissions ->
Expand All @@ -28,6 +54,8 @@ class PermissionUtils(val activity: AppCompatActivity) {
// we have calendar permissions, cancel possible notification
val nm = NotificationManagerCompat.from(activity)
nm.cancel(NotificationUtils.NOTIFY_PERMISSION)

onGranted()
}
}

Expand Down
12 changes: 5 additions & 7 deletions app/src/main/java/at/bitfire/icsdroid/ui/AddCalendarActivity.kt
Original file line number Diff line number Diff line change
Expand Up @@ -4,12 +4,9 @@

package at.bitfire.icsdroid.ui

import android.Manifest
import android.content.pm.PackageManager
import android.os.Bundle
import androidx.activity.viewModels
import androidx.appcompat.app.AppCompatActivity
import androidx.core.app.ActivityCompat
import at.bitfire.icsdroid.PermissionUtils
import at.bitfire.icsdroid.db.LocalCalendar

Expand All @@ -28,10 +25,11 @@ class AddCalendarActivity: AppCompatActivity() {

supportActionBar?.setDisplayHomeAsUpEnabled(true)

val calendarPermissionRequestLauncher = PermissionUtils(this).registerCalendarPermissionRequestLauncher()
if (ActivityCompat.checkSelfPermission(this, Manifest.permission.READ_CALENDAR) != PackageManager.PERMISSION_GRANTED ||
ActivityCompat.checkSelfPermission(this, Manifest.permission.WRITE_CALENDAR) != PackageManager.PERMISSION_GRANTED)
calendarPermissionRequestLauncher.launch(arrayOf(Manifest.permission.READ_CALENDAR, Manifest.permission.WRITE_CALENDAR))
if (!PermissionUtils.haveCalendarPermissions(this)) {
PermissionUtils
.registerCalendarPermissionRequest(this)
.launch(PermissionUtils.CALENDAR_PERMISSIONS)
}

if (inState == null) {
supportFragmentManager
Expand Down
33 changes: 20 additions & 13 deletions app/src/main/java/at/bitfire/icsdroid/ui/CalendarListActivity.kt
Original file line number Diff line number Diff line change
Expand Up @@ -4,13 +4,11 @@

package at.bitfire.icsdroid.ui

import android.Manifest
import android.annotation.SuppressLint
import android.app.Application
import android.content.ContentUris
import android.content.Context
import android.content.Intent
import android.content.pm.PackageManager
import android.database.ContentObserver
import android.os.Build
import android.os.Bundle
Expand All @@ -22,7 +20,6 @@ import android.view.*
import androidx.activity.viewModels
import androidx.appcompat.app.AppCompatActivity
import androidx.appcompat.app.AppCompatDelegate
import androidx.core.app.ActivityCompat
import androidx.databinding.DataBindingUtil
import androidx.fragment.app.Fragment
import androidx.fragment.app.FragmentManager
Expand Down Expand Up @@ -64,10 +61,13 @@ class CalendarListActivity: AppCompatActivity(), SwipeRefreshLayout.OnRefreshLis
binding.refresh.setOnRefreshListener(this)
binding.refresh.setSize(SwipeRefreshLayout.LARGE)

val calendarPermissionsRequestLauncher = PermissionUtils(this).registerCalendarPermissionRequestLauncher()
val calendarPermissionsRequestLauncher = PermissionUtils.registerCalendarPermissionRequest(this) {
// re-initialize model if calendar permissions are granted
model.reinit()
}
model.askForPermissions.observe(this) { ask ->
if (ask)
calendarPermissionsRequestLauncher.launch(CalendarModel.PERMISSIONS)
calendarPermissionsRequestLauncher.launch(PermissionUtils.CALENDAR_PERMISSIONS)
}

model.isRefreshing.observe(this) { isRefreshing ->
Expand Down Expand Up @@ -259,16 +259,17 @@ class CalendarListActivity: AppCompatActivity(), SwipeRefreshLayout.OnRefreshLis


/**
* Data model for this view. Must only be created when the app has calendar permissions!
* Data model for this view. Updates calendar subscriptions in real-time.
*
* Must be initialized with [reinit] after it's created.
*
* Requires calendar permissions. If it doesn't have calendar permissions, it does nothing.
* As soon as calendar permissions are granted, you have to call [reinit] again.
*/
class CalendarModel(
application: Application
): AndroidViewModel(application) {

companion object {
val PERMISSIONS = arrayOf(Manifest.permission.READ_CALENDAR, Manifest.permission.WRITE_CALENDAR)
}

private val resolver = application.contentResolver

val askForPermissions = MutableLiveData(false)
Expand All @@ -283,11 +284,17 @@ class CalendarListActivity: AppCompatActivity(), SwipeRefreshLayout.OnRefreshLis


fun reinit() {
val havePermissions = PERMISSIONS.all { ActivityCompat.checkSelfPermission(getApplication(), it) == PackageManager.PERMISSION_GRANTED }
val havePermissions = PermissionUtils.haveCalendarPermissions(getApplication())
askForPermissions.value = !havePermissions

if (havePermissions && observer == null)
startWatchingCalendars()
if (observer == null) {
// we're not watching the calendars yet
if (havePermissions) {
Log.d(Constants.TAG, "Watching calendars")
startWatchingCalendars()
} else
Log.w(Constants.TAG,"Can't watch calendars (permission denied)")
}
}

override fun onCleared() {
Expand Down

0 comments on commit 508bc64

Please sign in to comment.