Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

First calendar addition doesn't refresh the list #75

Merged
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
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