diff options
Diffstat (limited to 'app/src/main/kotlin/com/pitchedapps/frost/services/FrostNotifications.kt')
-rw-r--r-- | app/src/main/kotlin/com/pitchedapps/frost/services/FrostNotifications.kt | 121 |
1 files changed, 4 insertions, 117 deletions
diff --git a/app/src/main/kotlin/com/pitchedapps/frost/services/FrostNotifications.kt b/app/src/main/kotlin/com/pitchedapps/frost/services/FrostNotifications.kt index ab61b37d..0af76b31 100644 --- a/app/src/main/kotlin/com/pitchedapps/frost/services/FrostNotifications.kt +++ b/app/src/main/kotlin/com/pitchedapps/frost/services/FrostNotifications.kt @@ -1,23 +1,15 @@ package com.pitchedapps.frost.services import android.app.Notification -import android.app.NotificationChannel -import android.app.NotificationManager import android.app.PendingIntent -import android.app.job.JobInfo -import android.app.job.JobScheduler -import android.content.ComponentName import android.content.Context import android.content.Intent import android.net.Uri import android.os.BaseBundle import android.os.Build import android.os.Bundle -import android.os.PersistableBundle -import android.support.annotation.RequiresApi import android.support.v4.app.NotificationCompat import android.support.v4.app.NotificationManagerCompat -import ca.allanwang.kau.utils.color import ca.allanwang.kau.utils.dpToPx import ca.allanwang.kau.utils.string import com.pitchedapps.frost.R @@ -44,68 +36,6 @@ import java.util.* * * Logic for build notifications, scheduling notifications, and showing notifications */ -const val NOTIF_CHANNEL_GENERAL = "general" -const val NOTIF_CHANNEL_MESSAGES = "messages" - -fun setupNotificationChannels(c: Context) { - if (Build.VERSION.SDK_INT < Build.VERSION_CODES.O) return - val manager = c.getSystemService(Context.NOTIFICATION_SERVICE) as NotificationManager - val appName = c.string(R.string.frost_name) - val msg = c.string(R.string.messages) - manager.notificationChannels - .filter { it.id != NOTIF_CHANNEL_GENERAL && it.id != NOTIF_CHANNEL_MESSAGES } - .forEach { manager.deleteNotificationChannel(it.id) } - manager.createNotificationChannel(NOTIF_CHANNEL_GENERAL, appName) - manager.createNotificationChannel(NOTIF_CHANNEL_MESSAGES, "$appName: $msg") - L.d { "Created notification channels: ${manager.notificationChannels.size} channels, ${manager.notificationChannelGroups.size} groups" } -} - -@RequiresApi(Build.VERSION_CODES.O) -private fun NotificationManager.createNotificationChannel(id: String, name: String): NotificationChannel { - val channel = NotificationChannel(id, - name, NotificationManager.IMPORTANCE_DEFAULT) - channel.enableLights(true) - channel.lightColor = Prefs.accentColor - channel.lockscreenVisibility = Notification.VISIBILITY_PUBLIC - createNotificationChannel(channel) - return channel -} - -fun Context.frostNotification(id: String) = - NotificationCompat.Builder(this, id) - .apply { - setSmallIcon(R.drawable.frost_f_24) - setAutoCancel(true) - setOnlyAlertOnce(true) - setStyle(NotificationCompat.BigTextStyle()) - color = color(R.color.frost_notification_accent) - } - -/** - * Dictates whether a notification should have sound/vibration/lights or not - * Delegates to channels if Android O and up - * Otherwise uses our provided preferences - */ -fun NotificationCompat.Builder.setFrostAlert(enable: Boolean, ringtone: String): NotificationCompat.Builder { - if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) { - setGroupAlertBehavior( - if (enable) Notification.GROUP_ALERT_CHILDREN - else Notification.GROUP_ALERT_SUMMARY) - } else if (!enable) { - setDefaults(0) - } else { - var defaults = 0 - if (Prefs.notificationVibrate) defaults = defaults or Notification.DEFAULT_VIBRATE - if (Prefs.notificationSound) { - if (ringtone.isNotBlank()) setSound(Uri.parse(ringtone)) - else defaults = defaults or Notification.DEFAULT_SOUND - } - if (Prefs.notificationLights) defaults = defaults or Notification.DEFAULT_LIGHTS - setDefaults(defaults) - } - return this -} - private val _40_DP = 40.dpToPx /** @@ -314,55 +244,12 @@ data class FrostNotification(private val tag: String, NotificationManagerCompat.from(context).notify(tag, id, notif.build()) } -const val NOTIFICATION_PARAM_ID = "notif_param_id" - -private fun JobInfo.Builder.setExtras(id: Int): JobInfo.Builder { - val bundle = PersistableBundle() - bundle.putInt(NOTIFICATION_PARAM_ID, id) - return setExtras(bundle) -} - const val NOTIFICATION_PERIODIC_JOB = 7 -/** - * [interval] is # of min, which must be at least 15 - * returns false if an error occurs; true otherwise - */ -fun Context.scheduleNotifications(minutes: Long): Boolean { - val scheduler = getSystemService(Context.JOB_SCHEDULER_SERVICE) as JobScheduler - scheduler.cancel(NOTIFICATION_PERIODIC_JOB) - if (minutes < 0L) return true - val serviceComponent = ComponentName(this, NotificationService::class.java) - val builder = JobInfo.Builder(NOTIFICATION_PERIODIC_JOB, serviceComponent) - .setPeriodic(minutes * 60000) - .setExtras(NOTIFICATION_PERIODIC_JOB) - .setPersisted(true) - .setRequiredNetworkType(JobInfo.NETWORK_TYPE_ANY) //TODO add options - val result = scheduler.schedule(builder.build()) - if (result <= 0) { - L.eThrow("Notification scheduler failed") - return false - } - return true -} +fun Context.scheduleNotifications(minutes: Long): Boolean = + scheduleJob<NotificationService>(NOTIFICATION_PERIODIC_JOB, minutes) const val NOTIFICATION_JOB_NOW = 6 -/** - * Run notification job right now - */ -fun Context.fetchNotifications(): Boolean { - val scheduler = getSystemService(Context.JOB_SCHEDULER_SERVICE) as JobScheduler - val serviceComponent = ComponentName(this, NotificationService::class.java) - val builder = JobInfo.Builder(NOTIFICATION_JOB_NOW, serviceComponent) - .setMinimumLatency(0L) - .setExtras(NOTIFICATION_JOB_NOW) - .setOverrideDeadline(2000L) - .setRequiredNetworkType(JobInfo.NETWORK_TYPE_ANY) - val result = scheduler.schedule(builder.build()) - if (result <= 0) { - L.eThrow("Notification scheduler failed") - return false - } - return true -}
\ No newline at end of file +fun Context.fetchNotifications(): Boolean = + fetchJob<NotificationService>(NOTIFICATION_JOB_NOW)
\ No newline at end of file |