package com.adlerosn.brasilfurfest.notification import android.app.* import android.content.Intent import android.os.Build import android.support.v4.app.NotificationCompat import android.support.v4.app.NotificationManagerCompat import android.util.Log import com.adlerosn.brasilfurfest.R import com.adlerosn.brasilfurfest.schedule.EventActivity import com.adlerosn.brasilfurfest.schedule.ScheduleManager import com.adlerosn.brasilfurfest.schedule.abstractDataTypes.managed.AttendeeConFavorite import java.io.PrintWriter import java.io.StringWriter import java.util.* class NotificationIntentService : IntentService(NotificationIntentService::class.java.simpleName) { private val SIMPLE_ID = NotificationIntentService::class.java.simpleName override fun onHandleIntent(intent: Intent) { try { val scheduleManager = ScheduleManager(this) NextNotificationScheduler(this, scheduleManager) 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(this) toNotify.withIndex().forEach { val builder = getChannelBuilder() .setDefaults(Notification.DEFAULT_ALL) .setSmallIcon(R.drawable.ic_notificacao) .setContentTitle(it.value.getString(this)) .setContentText(it.value.getSecondaryString(this)) .setPriority(NotificationCompat.PRIORITY_DEFAULT) .setTimeoutAfter( it.value.timeRange.let { it.finish.timeInMillis - it.start.timeInMillis } ) .setWhen(it.value.timeRange.start.timeInMillis) .setShowWhen(true) .setContentIntent( PendingIntent.getActivity( this, 0, Intent(this, EventActivity::class.java).apply { putExtra("favorite", it.value) }, 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("Notification", s) } } private fun getChannelBuilder() = if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) { createDefaultNotificationChannel() NotificationCompat.Builder(this, SIMPLE_ID) } else { @Suppress("DEPRECATION") //older API will have this NotificationCompat.Builder(this) } private fun createDefaultNotificationChannel() { if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) { val notificationManager = getSystemService(NotificationManager::class.java) as NotificationManager if (notificationManager.getNotificationChannel(SIMPLE_ID) == null) { val channelName = getString(R.string.defaultNotificationChannel) val channel = NotificationChannel(SIMPLE_ID, channelName, NotificationManager.IMPORTANCE_HIGH) notificationManager.createNotificationChannel(channel) } } } }