conventionschedule-android/app/src/main/java/com/adlerosn/brasilfurfest/notification/NotificationFirer.kt

127 lines
6.0 KiB
Kotlin

package com.adlerosn.brasilfurfest.notification
import android.app.Notification
import android.app.PendingIntent
import android.content.Context
import android.content.Intent
import android.net.Uri
import androidx.core.app.NotificationCompat
import androidx.core.app.NotificationManagerCompat
import android.util.Log
import com.adlerosn.brasilfurfest.R
import com.adlerosn.brasilfurfest.helper.notificationBuilderCompat
import com.adlerosn.brasilfurfest.helper.runtimeLanguage
import com.adlerosn.brasilfurfest.schedule.EventActivity
import com.adlerosn.brasilfurfest.schedule.managers.ScheduleManagerGetter
import java.io.PrintWriter
import java.io.StringWriter
import java.util.*
class NotificationFirer {
fun fire(context: Context){
try {
val scheduleManager = ScheduleManagerGetter[context]
val timeForNotification = scheduleManager.convention.notificationFireMinutesBefore*60*1000.toLong() + scheduleManager.conventionTime.timeInMillis
val dateForNotification = GregorianCalendar().apply { timeInMillis=timeForNotification }
val toNotify =
scheduleManager.attendeeFavorites
.toList()
.filter { dateForNotification in it.timeRange }
.filterNot { it.notified }
.sortedBy { -it.timeRange.start.timeInMillis }
val notificationManager = NotificationManagerCompat.from(context)
toNotify.withIndex().forEach {
val builder = context.notificationBuilderCompat(R.string.defaultNotificationChannel, true)
.setDefaults(Notification.DEFAULT_ALL)
.setSmallIcon(R.drawable.ic_notificacao)
.setContentTitle(it.value.getString())
.setContentText(it.value.getSecondaryString())
.setPriority(NotificationCompat.PRIORITY_DEFAULT)
.setTimeoutAfter(
it.value.timeRange.let { cal ->
cal.finish.timeInMillis - cal.start.timeInMillis
}
)
.setWhen(it.value.timeRange.start.timeInMillis)
.setShowWhen(true)
.setContentIntent(
PendingIntent.getActivity(
context,
it.value.getString().hashCode(),
Intent(context, EventActivity::class.java).apply {
flags = Intent.FLAG_ACTIVITY_NEW_TASK or Intent.FLAG_ACTIVITY_TASK_ON_HOME
putExtra("favorite", it.value)
putExtra("fromNotification", true)
},
0
)
)
notificationManager.notify(
((timeForNotification+it.index)%Int.MAX_VALUE).toInt(),
builder.build()
)
}
toNotify.forEach {
it.notified = true
}
} catch (e: Throwable) {
val writer = StringWriter()
e.printStackTrace(PrintWriter(writer))
val s = writer.toString()
Log.e(NotificationFirer::class.java.simpleName, s)
}
///////////////////////
try {
val notificationManager = NotificationManagerCompat.from(context)
val scheduleManager = ScheduleManagerGetter[context]
val announcements = scheduleManager.unreadAnnouncements
scheduleManager.setAnnouncementsRead()
announcements.forEach { announcement ->
val title = announcement.title[context.runtimeLanguage]
val body = announcement.body[context.runtimeLanguage]
val link = announcement.link?.get(context.runtimeLanguage)
val nt = context.notificationBuilderCompat(R.string.announcementsNotificationChannel, true)
.setDefaults(Notification.DEFAULT_ALL)
.setSmallIcon(R.drawable.ic_notificacao)
.setContentTitle(title)
.setContentText(body)
.let { builder ->
if(link==null)
builder
else
builder.setContentIntent(
PendingIntent.getActivity(
context,
announcement.uuid.hashCode(),
Intent(Intent.ACTION_VIEW, Uri.parse(link)),
0
)
)
}
.setPriority(NotificationCompat.PRIORITY_HIGH)
notificationManager.notify(
1, nt.build()
)
}
} catch (e: Throwable) {
val writer = StringWriter()
e.printStackTrace(PrintWriter(writer))
val s = writer.toString()
Log.e(NotificationFirer::class.java.simpleName, s)
}
}
// fun firePing(context: Context){
// val notificationManager = NotificationManagerCompat.from(context)
// val nt = context.notificationBuilderCompat(R.string.defaultNotificationChannel, true)
// .setDefaults(Notification.DEFAULT_ALL)
// .setSmallIcon(R.drawable.ic_notificacao)
// .setContentTitle("Ping")
// .setContentText("It works!")
// .setPriority(NotificationCompat.PRIORITY_DEFAULT)
// notificationManager.notify(
// 1, nt.build()
// )
// }
}