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.kt60
1 files changed, 45 insertions, 15 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 afa30a91..2d9e0803 100644
--- a/app/src/main/kotlin/com/pitchedapps/frost/services/FrostNotifications.kt
+++ b/app/src/main/kotlin/com/pitchedapps/frost/services/FrostNotifications.kt
@@ -11,7 +11,9 @@ import android.content.Context
import android.content.Intent
import android.graphics.Bitmap
import android.net.Uri
+import android.os.BaseBundle
import android.os.Build
+import android.os.Bundle
import android.support.v4.app.NotificationCompat
import android.support.v4.app.NotificationManagerCompat
import ca.allanwang.kau.utils.color
@@ -28,11 +30,16 @@ import com.pitchedapps.frost.dbflow.NotificationModel
import com.pitchedapps.frost.dbflow.lastNotificationTime
import com.pitchedapps.frost.enums.OverlayContext
import com.pitchedapps.frost.facebook.FbItem
+import com.pitchedapps.frost.glide.FrostGlide
+import com.pitchedapps.frost.glide.transform
import com.pitchedapps.frost.parsers.FrostParser
import com.pitchedapps.frost.parsers.MessageParser
import com.pitchedapps.frost.parsers.NotifParser
import com.pitchedapps.frost.parsers.ParseNotification
-import com.pitchedapps.frost.utils.*
+import com.pitchedapps.frost.utils.ARG_USER_ID
+import com.pitchedapps.frost.utils.L
+import com.pitchedapps.frost.utils.Prefs
+import com.pitchedapps.frost.utils.frostAnswersCustom
import org.jetbrains.anko.runOnUiThread
import java.util.*
@@ -54,6 +61,7 @@ inline val Context.frostNotification: NotificationCompat.Builder
get() = NotificationCompat.Builder(this, BuildConfig.APPLICATION_ID).apply {
setSmallIcon(R.drawable.frost_f_24)
setAutoCancel(true)
+ setStyle(NotificationCompat.BigTextStyle())
color = color(R.color.frost_notification_accent)
}
@@ -68,9 +76,6 @@ fun NotificationCompat.Builder.withDefaults(ringtone: String = Prefs.notificatio
setDefaults(defaults)
}
-inline val NotificationCompat.Builder.withBigText: NotificationCompat.BigTextStyle
- get() = NotificationCompat.BigTextStyle(this)
-
/**
* Created by Allan Wang on 2017-07-08.
*
@@ -85,7 +90,7 @@ class FrostNotificationTarget(val context: Context,
override fun onResourceReady(resource: Bitmap, transition: Transition<in Bitmap>) {
builder.setLargeIcon(resource)
- NotificationManagerCompat.from(context).notify(notifTag, notifId, builder.withBigText.build())
+ NotificationManagerCompat.from(context).notify(notifTag, notifId, builder.build())
}
}
@@ -99,12 +104,18 @@ enum class NotificationType(
private val getTime: (notif: NotificationModel) -> Long,
private val putTime: (notif: NotificationModel, time: Long) -> NotificationModel,
private val ringtone: () -> String) {
+
GENERAL(OverlayContext.NOTIFICATION,
FbItem.NOTIFICATIONS,
NotifParser,
NotificationModel::epoch,
{ notif, time -> notif.copy(epoch = time) },
- Prefs::notificationRingtone),
+ Prefs::notificationRingtone) {
+
+ override fun bindRequest(content: NotificationContent, cookie: String) =
+ FrostRunnable.prepareMarkNotificationRead(content.id, cookie)
+ },
+
MESSAGE(OverlayContext.MESSAGE,
FbItem.MESSAGES,
MessageParser,
@@ -115,6 +126,19 @@ enum class NotificationType(
private val groupPrefix = "frost_${name.toLowerCase(Locale.CANADA)}"
/**
+ * Optional binder to return the request bundle builder
+ */
+ internal open fun bindRequest(content: NotificationContent, cookie: String): (BaseBundle.() -> Unit)? = null
+
+ private fun bindRequest(intent: Intent, content: NotificationContent, cookie: String?) {
+ cookie ?: return
+ val binder = bindRequest(content, cookie) ?: return
+ val bundle = Bundle()
+ bundle.binder()
+ intent.putExtras(bundle)
+ }
+
+ /**
* Get unread data from designated parser
* Display notifications for those after old epoch
* Save new epoch
@@ -138,7 +162,7 @@ enum class NotificationType(
newLatestEpoch = notif.timestamp
notifCount++
}
- if (newLatestEpoch != prevLatestEpoch)
+ if (newLatestEpoch > prevLatestEpoch)
putTime(prevNotifTime, newLatestEpoch).save()
L.d("Notif $name new epoch ${getTime(lastNotificationTime(userId))}")
summaryNotification(context, userId, notifCount)
@@ -154,9 +178,11 @@ enum class NotificationType(
val intent = Intent(context, FrostWebActivity::class.java)
intent.data = Uri.parse(href)
intent.putExtra(ARG_USER_ID, data.id)
- intent.putExtra(ARG_OVERLAY_CONTEXT, overlayContext)
+ overlayContext.put(intent)
+ bindRequest(intent, content, data.cookie)
+
val group = "${groupPrefix}_${data.id}"
- val pendingIntent = PendingIntent.getActivity(context, 0, intent, 0)
+ val pendingIntent = PendingIntent.getActivity(context, 0, intent, PendingIntent.FLAG_UPDATE_CURRENT)
val notifBuilder = context.frostNotification
.setContentTitle(title ?: context.string(R.string.frost_name))
.setContentText(text)
@@ -170,15 +196,15 @@ enum class NotificationType(
if (timestamp != -1L) notifBuilder.setWhen(timestamp * 1000)
L.v("Notif load", context.toString())
- NotificationManagerCompat.from(context).notify(group, notifId, notifBuilder.withBigText.build())
+ NotificationManagerCompat.from(context).notify(group, notifId, notifBuilder.build())
- if (profileUrl.isNotBlank()) {
+ if (profileUrl != null) {
context.runOnUiThread {
//todo verify if context is valid?
Glide.with(context)
.asBitmap()
.load(profileUrl)
- .withRoundIcon()
+ .transform(FrostGlide.circleCrop)
.into(FrostNotificationTarget(context, notifId, group, notifBuilder))
}
}
@@ -196,7 +222,7 @@ enum class NotificationType(
val intent = Intent(context, FrostWebActivity::class.java)
intent.data = Uri.parse(fbItem.url)
intent.putExtra(ARG_USER_ID, userId)
- val pendingIntent = PendingIntent.getActivity(context, 0, intent, 0)
+ val pendingIntent = PendingIntent.getActivity(context, 0, intent, PendingIntent.FLAG_UPDATE_CURRENT)
val notifBuilder = context.frostNotification.withDefaults(ringtone())
.setContentTitle(context.string(R.string.frost_name))
.setContentText("$count ${context.string(fbItem.titleId)}")
@@ -213,12 +239,16 @@ enum class NotificationType(
* Notification data holder
*/
data class NotificationContent(val data: CookieModel,
- val notifId: Int,
+ val id: Long,
val href: String,
val title: String? = null, // defaults to frost title
val text: String,
val timestamp: Long,
- val profileUrl: String)
+ val profileUrl: String?) {
+
+ val notifId = Math.abs(id.toInt())
+
+}
const val NOTIFICATION_PERIODIC_JOB = 7