aboutsummaryrefslogtreecommitdiff
path: root/app/src/main/kotlin/com/pitchedapps/frost/services/FrostNotifications.kt
diff options
context:
space:
mode:
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.kt121
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