Merge pull request #3556 from Isira-Seneviratne/Notification_improvements

Improve stream notifications
This commit is contained in:
Isira Seneviratne 2023-04-15 05:17:08 +05:30 committed by GitHub
commit c83761e5ca
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23

View File

@ -137,68 +137,78 @@ class NotificationWorker(appContext: Context, parameters: WorkerParameters) :
* For more information, see https://developer.android.com/develop/ui/views/notifications/group * For more information, see https://developer.android.com/develop/ui/views/notifications/group
*/ */
private suspend fun createNotificationsForChannel(group: String, streams: List<StreamItem>) { private suspend fun createNotificationsForChannel(group: String, streams: List<StreamItem>) {
val intentFlags = Intent.FLAG_ACTIVITY_CLEAR_TOP or Intent.FLAG_ACTIVITY_NEW_TASK or
Intent.FLAG_ACTIVITY_CLEAR_TASK
// Create stream notifications. These are automatically grouped on Android 7.0 and later. // Create stream notifications. These are automatically grouped on Android 7.0 and later.
streams.forEach { if (streams.size == 1) {
val intent = Intent(applicationContext, MainActivity::class.java) showStreamNotification(group, streams[0], true)
.setFlags(intentFlags) } else {
.putExtra(IntentData.videoId, it.url!!.toID()) streams.forEach {
val code = ++notificationId showStreamNotification(group, it, false)
val pendingIntent = PendingIntentCompat
.getActivity(applicationContext, code, intent, FLAG_UPDATE_CURRENT, false)
val notificationBuilder = createNotificationBuilder(group)
.setContentTitle(it.title)
.setContentText(it.uploaderName)
// The intent that will fire when the user taps the notification
.setContentIntent(pendingIntent)
// Load stream thumbnails if the relevant toggle is enabled.
if (PreferenceHelper.getBoolean(PreferenceKeys.SHOW_STREAM_THUMBNAILS, false)) {
val thumbnail = withContext(Dispatchers.IO) {
ImageHelper.getImage(applicationContext, it.thumbnail).drawable?.toBitmap()
}
notificationBuilder
.setLargeIcon(thumbnail)
.setStyle(
NotificationCompat.BigPictureStyle()
.bigPicture(thumbnail)
.bigLargeIcon(null as Bitmap?) // Hides the icon when expanding
)
} }
notificationManager.notify(code, notificationBuilder.build()) val summaryId = ++notificationId
val intent = Intent(applicationContext, MainActivity::class.java)
.setFlags(INTENT_FLAGS)
.putExtra(IntentData.channelId, group.toID())
val pendingIntent = PendingIntentCompat
.getActivity(applicationContext, summaryId, intent, FLAG_UPDATE_CURRENT, false)
// Create summary notification containing new streams for Android versions below 7.0.
val newStreams = applicationContext.resources
.getQuantityString(R.plurals.channel_new_streams, streams.size, streams.size)
val summary = NotificationCompat.InboxStyle()
streams.forEach {
summary.addLine(it.title)
}
val summaryNotification = createNotificationBuilder(group)
.setContentTitle(streams[0].uploaderName)
.setContentText(newStreams)
// The intent that will fire when the user taps the notification
.setContentIntent(pendingIntent)
.setGroupSummary(true)
.setStyle(summary)
.setGroupAlertBehavior(NotificationCompat.GROUP_ALERT_SUMMARY)
.build()
notificationManager.notify(summaryId, summaryNotification)
} }
}
val summaryId = ++notificationId private suspend fun showStreamNotification(
group: String,
stream: StreamItem,
isSingleNotification: Boolean
) {
val intent = Intent(applicationContext, MainActivity::class.java) val intent = Intent(applicationContext, MainActivity::class.java)
.setFlags(intentFlags) .setFlags(INTENT_FLAGS)
.putExtra(IntentData.channelId, group.toID()) .putExtra(IntentData.videoId, stream.url!!.toID())
val code = ++notificationId
val pendingIntent = PendingIntentCompat val pendingIntent = PendingIntentCompat
.getActivity(applicationContext, summaryId, intent, FLAG_UPDATE_CURRENT, false) .getActivity(applicationContext, code, intent, FLAG_UPDATE_CURRENT, false)
// Create summary notification containing new streams for Android versions below 7.0. val notificationBuilder = createNotificationBuilder(group)
val newStreams = applicationContext.resources .setContentTitle(stream.title)
.getQuantityString(R.plurals.channel_new_streams, streams.size, streams.size) .setContentText(stream.uploaderName)
val summary = NotificationCompat.InboxStyle()
streams.forEach {
summary.addLine(it.title)
}
val summaryNotification = createNotificationBuilder(group)
.setContentTitle(streams[0].uploaderName)
.setContentText(newStreams)
// The intent that will fire when the user taps the notification // The intent that will fire when the user taps the notification
.setContentIntent(pendingIntent) .setContentIntent(pendingIntent)
.setGroupSummary(true) .setSilent(!isSingleNotification)
.setStyle(summary)
.build()
notificationManager.notify(summaryId, summaryNotification) // Load stream thumbnails if the relevant toggle is enabled.
if (PreferenceHelper.getBoolean(PreferenceKeys.SHOW_STREAM_THUMBNAILS, false)) {
val thumbnail = withContext(Dispatchers.IO) {
ImageHelper.getImage(applicationContext, stream.thumbnail).drawable?.toBitmap()
}
notificationBuilder
.setLargeIcon(thumbnail)
.setStyle(
NotificationCompat.BigPictureStyle()
.bigPicture(thumbnail)
.bigLargeIcon(null as Bitmap?) // Hides the icon when expanding
)
}
notificationManager.notify(code, notificationBuilder.build())
} }
private fun createNotificationBuilder(group: String): NotificationCompat.Builder { private fun createNotificationBuilder(group: String): NotificationCompat.Builder {
@ -208,4 +218,9 @@ class NotificationWorker(appContext: Context, parameters: WorkerParameters) :
.setAutoCancel(true) .setAutoCancel(true)
.setGroup(group) .setGroup(group)
} }
companion object {
private const val INTENT_FLAGS = Intent.FLAG_ACTIVITY_CLEAR_TOP or
Intent.FLAG_ACTIVITY_NEW_TASK or Intent.FLAG_ACTIVITY_CLEAR_TASK
}
} }