Catch SecurityException of notifications

This commit is contained in:
Ricki Hirner 2023-01-20 10:52:55 +01:00
parent 5156ff1380
commit 29b2b2372f
No known key found for this signature in database
GPG key ID: 79A019FCAAEDD3AA
11 changed files with 40 additions and 14 deletions

View file

@ -16,6 +16,7 @@ import at.bitfire.davdroid.settings.Settings
import at.bitfire.davdroid.settings.SettingsManager
import at.bitfire.davdroid.ui.AppSettingsActivity
import at.bitfire.davdroid.ui.NotificationUtils
import at.bitfire.davdroid.ui.NotificationUtils.notifyIfPossible
import dagger.hilt.EntryPoint
import dagger.hilt.InstallIn
import dagger.hilt.android.EntryPointAccessors
@ -88,7 +89,7 @@ class ForegroundService : Service() {
.setCategory(NotificationCompat.CATEGORY_ERROR)
val nm = NotificationManagerCompat.from(context)
nm.notify(NotificationUtils.NOTIFY_BATTERY_OPTIMIZATION, builder.build())
nm.notifyIfPossible(NotificationUtils.NOTIFY_BATTERY_OPTIMIZATION, builder.build())
}
}

View file

@ -15,6 +15,7 @@ import androidx.core.app.NotificationManagerCompat
import androidx.lifecycle.MutableLiveData
import at.bitfire.davdroid.log.Logger
import at.bitfire.davdroid.ui.NotificationUtils
import at.bitfire.davdroid.ui.NotificationUtils.notifyIfPossible
import dagger.Module
import dagger.Provides
import dagger.hilt.InstallIn
@ -74,7 +75,7 @@ class StorageLowReceiver private constructor(
notify.setContentIntent(PendingIntent.getActivity(context, 0, settingsIntent, PendingIntent.FLAG_CANCEL_CURRENT or PendingIntent.FLAG_IMMUTABLE))
val nm = NotificationManagerCompat.from(context)
nm.notify(NotificationUtils.NOTIFY_LOW_STORAGE, notify.build())
nm.notifyIfPossible(NotificationUtils.NOTIFY_LOW_STORAGE, notify.build())
}
fun onStorageOk() {

View file

@ -20,6 +20,7 @@ import at.bitfire.davdroid.TextTable
import at.bitfire.davdroid.log.Logger
import at.bitfire.davdroid.ui.AccountsActivity
import at.bitfire.davdroid.ui.NotificationUtils
import at.bitfire.davdroid.ui.NotificationUtils.notifyIfPossible
import dagger.Module
import dagger.Provides
import dagger.hilt.InstallIn
@ -64,7 +65,7 @@ abstract class AppDatabase: RoomDatabase() {
.setContentIntent(PendingIntent.getActivity(context, 0, launcherIntent, PendingIntent.FLAG_UPDATE_CURRENT or PendingIntent.FLAG_IMMUTABLE))
.setAutoCancel(true)
.build()
nm.notify(NotificationUtils.NOTIFY_DATABASE_CORRUPTED, notify)
nm.notifyIfPossible(NotificationUtils.NOTIFY_DATABASE_CORRUPTED, notify)
// remove all accounts because they're unfortunately useless without database
val am = AccountManager.get(context)

View file

@ -19,6 +19,7 @@ import at.bitfire.davdroid.R
import at.bitfire.davdroid.ui.AppSettingsActivity
import at.bitfire.davdroid.ui.DebugInfoActivity
import at.bitfire.davdroid.ui.NotificationUtils
import at.bitfire.davdroid.ui.NotificationUtils.notifyIfPossible
import java.io.File
import java.io.IOException
import java.util.*
@ -115,7 +116,7 @@ object Logger : SharedPreferences.OnSharedPreferenceChangeListener {
pendingPref
).build())
nm.notify(NotificationUtils.NOTIFY_VERBOSE_LOGGING, builder.build())
nm.notifyIfPossible(NotificationUtils.NOTIFY_VERBOSE_LOGGING, builder.build())
} catch(e: IOException) {
log.log(Level.SEVERE, "Couldn't create log file", e)
Toast.makeText(context, context.getString(R.string.logging_couldnt_create_file), Toast.LENGTH_LONG).show()

View file

@ -29,6 +29,7 @@ import at.bitfire.davdroid.settings.Settings
import at.bitfire.davdroid.settings.SettingsManager
import at.bitfire.davdroid.ui.DebugInfoActivity
import at.bitfire.davdroid.ui.NotificationUtils
import at.bitfire.davdroid.ui.NotificationUtils.notifyIfPossible
import com.google.common.util.concurrent.ListenableFuture
import dagger.assisted.Assisted
import dagger.assisted.AssistedInject
@ -180,7 +181,7 @@ class RefreshCollectionsWorker @AssistedInject constructor(
.setCategory(NotificationCompat.CATEGORY_ERROR)
.build()
NotificationManagerCompat.from(applicationContext)
.notify(serviceId.toString(), NotificationUtils.NOTIFY_REFRESH_COLLECTIONS, notify)
.notifyIfPossible(serviceId.toString(), NotificationUtils.NOTIFY_REFRESH_COLLECTIONS, notify)
return Result.failure()
}

View file

@ -32,6 +32,7 @@ import at.bitfire.davdroid.resource.*
import at.bitfire.davdroid.settings.AccountSettings
import at.bitfire.davdroid.ui.DebugInfoActivity
import at.bitfire.davdroid.ui.NotificationUtils
import at.bitfire.davdroid.ui.NotificationUtils.notifyIfPossible
import at.bitfire.davdroid.ui.account.SettingsActivity
import at.bitfire.ical4android.CalendarStorageException
import at.bitfire.ical4android.Ical4Android
@ -776,7 +777,7 @@ abstract class SyncManager<ResourceType: LocalResource<*>, out CollectionType: L
.setCategory(NotificationCompat.CATEGORY_ERROR)
viewItemAction?.let { builder.addAction(it) }
notificationManager.notify(notificationTag, NotificationUtils.NOTIFY_SYNC_ERROR, builder.build())
notificationManager.notifyIfPossible(notificationTag, NotificationUtils.NOTIFY_SYNC_ERROR, builder.build())
}
private fun buildDebugInfoIntent(e: Throwable, local: ResourceType?, remote: HttpUrl?) =
@ -828,7 +829,7 @@ abstract class SyncManager<ResourceType: LocalResource<*>, out CollectionType: L
.setAutoCancel(true)
.setOnlyAlertOnce(true)
.priority = NotificationCompat.PRIORITY_LOW
notificationManager.notify(notificationTag, NotificationUtils.NOTIFY_INVALID_RESOURCE, builder.build())
notificationManager.notifyIfPossible(notificationTag, NotificationUtils.NOTIFY_INVALID_RESOURCE, builder.build())
}
protected abstract fun notifyInvalidResourceTitle(): String

View file

@ -28,6 +28,7 @@ import at.bitfire.davdroid.settings.AccountSettings
import at.bitfire.davdroid.settings.Settings
import at.bitfire.davdroid.settings.SettingsManager
import at.bitfire.davdroid.ui.NotificationUtils
import at.bitfire.davdroid.ui.NotificationUtils.notifyIfPossible
import at.bitfire.ical4android.TaskProvider
import dagger.hilt.EntryPoint
import dagger.hilt.InstallIn
@ -80,7 +81,7 @@ object SyncUtils {
if (intent.resolveActivity(pm) != null)
notify.setContentIntent(PendingIntent.getActivity(context, 0, intent, flags))
nm.notify(NotificationUtils.NOTIFY_TASKS_PROVIDER_TOO_OLD, notify.build())
nm.notifyIfPossible(NotificationUtils.NOTIFY_TASKS_PROVIDER_TOO_OLD, notify.build())
}
fun removePeriodicSyncs(account: Account, authority: String) {

View file

@ -5,16 +5,20 @@
package at.bitfire.davdroid.ui
import android.annotation.TargetApi
import android.app.Notification
import android.app.NotificationChannel
import android.app.NotificationChannelGroup
import android.app.NotificationManager
import android.content.Context
import android.os.Build
import androidx.core.app.NotificationCompat
import androidx.core.app.NotificationManagerCompat
import androidx.core.content.getSystemService
import androidx.core.content.res.ResourcesCompat
import at.bitfire.davdroid.App
import at.bitfire.davdroid.R
import at.bitfire.davdroid.log.Logger
import java.util.logging.Level
object NotificationUtils {
@ -83,4 +87,16 @@ object NotificationUtils {
return builder
}
fun NotificationManagerCompat.notifyIfPossible(tag: String?, id: Int, notification: Notification) {
try {
notify(tag, id, notification)
} catch (e: SecurityException) {
Logger.log.log(Level.WARNING, "Couldn't post notification (SecurityException)", notification)
}
}
fun NotificationManagerCompat.notifyIfPossible(id: Int, notification: Notification) =
notifyIfPossible(null, id, notification)
}

View file

@ -20,6 +20,7 @@ import at.bitfire.davdroid.BuildConfig
import at.bitfire.davdroid.R
import at.bitfire.davdroid.log.Logger
import at.bitfire.davdroid.ui.NotificationUtils
import at.bitfire.davdroid.ui.NotificationUtils.notifyIfPossible
import at.bitfire.davdroid.ui.PermissionsActivity
object PermissionUtils {
@ -119,7 +120,7 @@ object PermissionUtils {
.setAutoCancel(true)
.build()
NotificationManagerCompat.from(context)
.notify(NotificationUtils.NOTIFY_PERMISSIONS, notify)
.notifyIfPossible(NotificationUtils.NOTIFY_PERMISSIONS, notify)
}
fun showAppSettings(context: Context) {

View file

@ -23,6 +23,7 @@ import at.bitfire.dav4jvm.exception.HttpException
import at.bitfire.davdroid.*
import at.bitfire.davdroid.log.Logger
import at.bitfire.davdroid.ui.NotificationUtils
import at.bitfire.davdroid.ui.NotificationUtils.notifyIfPossible
import at.bitfire.davdroid.util.DavUtils
import at.bitfire.davdroid.webdav.cache.MemoryCache
import at.bitfire.davdroid.webdav.cache.SegmentedCache
@ -114,7 +115,7 @@ class RandomAccessCallback private constructor(
100
else
(offset*100/fileSize).toInt()
notificationManager.notify(
notificationManager.notifyIfPossible(
notificationTag,
NotificationUtils.NOTIFY_WEBDAV_ACCESS,
notification.setProgress(100, progress, false).build()

View file

@ -12,11 +12,12 @@ import androidx.core.app.NotificationCompat
import androidx.core.app.NotificationManagerCompat
import at.bitfire.dav4jvm.DavResource
import at.bitfire.dav4jvm.exception.HttpException
import at.bitfire.davdroid.util.DavUtils
import at.bitfire.davdroid.HttpClient
import at.bitfire.davdroid.R
import at.bitfire.davdroid.log.Logger
import at.bitfire.davdroid.ui.NotificationUtils
import at.bitfire.davdroid.ui.NotificationUtils.notifyIfPossible
import at.bitfire.davdroid.util.DavUtils
import okhttp3.HttpUrl
import okhttp3.MediaType
import okhttp3.RequestBody
@ -105,7 +106,7 @@ class StreamingFileDescriptor(
notification.setContentTitle(context.getString(R.string.webdav_notification_download))
if (length == -1L)
// unknown file size, show notification now (no updates on progress)
notificationManager.notify(
notificationManager.notifyIfPossible(
notificationTag,
NotificationUtils.NOTIFY_WEBDAV_ACCESS,
notification
@ -124,7 +125,7 @@ class StreamingFileDescriptor(
while (bytes != -1) {
// update notification (if file size is known)
if (length != -1L)
notificationManager.notify(
notificationManager.notifyIfPossible(
notificationTag,
NotificationUtils.NOTIFY_WEBDAV_ACCESS,
notification
@ -155,7 +156,7 @@ class StreamingFileDescriptor(
override fun contentType(): MediaType? = mimeType
override fun isOneShot() = true
override fun writeTo(sink: BufferedSink) {
notificationManager.notify(
notificationManager.notifyIfPossible(
notificationTag,
NotificationUtils.NOTIFY_WEBDAV_ACCESS,
notification