mirror of
				https://github.com/mihonapp/mihon.git
				synced 2025-11-03 23:58:55 +01:00 
			
		
		
		
	More notification code cleanup
This commit is contained in:
		@@ -327,7 +327,7 @@ class LibraryUpdateService(
 | 
			
		||||
                // Notify result of the overall update.
 | 
			
		||||
                .doOnCompleted {
 | 
			
		||||
                    if (newUpdates.isNotEmpty()) {
 | 
			
		||||
                        showResultNotification(newUpdates)
 | 
			
		||||
                        showUpdateNotifications(newUpdates)
 | 
			
		||||
                        if (downloadNew && hasDownloads) {
 | 
			
		||||
                            DownloadService.start(this)
 | 
			
		||||
                        }
 | 
			
		||||
@@ -453,50 +453,10 @@ class LibraryUpdateService(
 | 
			
		||||
     *
 | 
			
		||||
     * @param updates a list of manga with new updates.
 | 
			
		||||
     */
 | 
			
		||||
    private fun showResultNotification(updates: List<Pair<Manga, Array<Chapter>>>) {
 | 
			
		||||
        val notifications = ArrayList<Pair<Notification, Int>>()
 | 
			
		||||
        updates.forEach {
 | 
			
		||||
            val manga = it.first
 | 
			
		||||
            val chapters = it.second
 | 
			
		||||
            val chapterNames = chapters.map { chapter -> chapter.name }.toSet()
 | 
			
		||||
            notifications.add(Pair(notification(Notifications.CHANNEL_NEW_CHAPTERS) {
 | 
			
		||||
                setSmallIcon(R.drawable.ic_tachi)
 | 
			
		||||
                try {
 | 
			
		||||
                    val icon = Glide.with(this@LibraryUpdateService)
 | 
			
		||||
                        .asBitmap().load(manga).dontTransform().centerCrop().circleCrop()
 | 
			
		||||
                        .override(256, 256).submit().get()
 | 
			
		||||
                    setLargeIcon(icon)
 | 
			
		||||
                }
 | 
			
		||||
                catch (e: Exception) { }
 | 
			
		||||
                setGroupAlertBehavior(GROUP_ALERT_SUMMARY)
 | 
			
		||||
                setContentTitle(manga.title)
 | 
			
		||||
                val chaptersNames = if (chapterNames.size > 5) {
 | 
			
		||||
                    "${chapterNames.take(4).joinToString(", ")}, " +
 | 
			
		||||
                        resources.getString(R.string.notification_and_n_more, (chapterNames.size - 4))
 | 
			
		||||
                } else chapterNames.joinToString(", ")
 | 
			
		||||
                setContentText(chaptersNames)
 | 
			
		||||
                setStyle(NotificationCompat.BigTextStyle().bigText(chaptersNames))
 | 
			
		||||
                priority = NotificationCompat.PRIORITY_HIGH
 | 
			
		||||
                setGroup(Notifications.GROUP_NEW_CHAPTERS)
 | 
			
		||||
                setContentIntent(
 | 
			
		||||
                    NotificationReceiver.openChapterPendingActivity(
 | 
			
		||||
                        this@LibraryUpdateService, manga, chapters.first()
 | 
			
		||||
                    )
 | 
			
		||||
                )
 | 
			
		||||
                addAction(R.drawable.ic_glasses_black_24dp, getString(R.string.action_mark_as_read),
 | 
			
		||||
                    NotificationReceiver.markAsReadPendingBroadcast(this@LibraryUpdateService,
 | 
			
		||||
                        manga, chapters, Notifications.ID_NEW_CHAPTERS))
 | 
			
		||||
                addAction(R.drawable.ic_book_white_24dp, getString(R.string.action_view_chapters),
 | 
			
		||||
                    NotificationReceiver.openChapterPendingActivity(this@LibraryUpdateService,
 | 
			
		||||
                        manga, Notifications.ID_NEW_CHAPTERS))
 | 
			
		||||
                setAutoCancel(true)
 | 
			
		||||
            }, manga.id.hashCode()))
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
    private fun showUpdateNotifications(updates: List<Pair<Manga, Array<Chapter>>>) {
 | 
			
		||||
        NotificationManagerCompat.from(this).apply {
 | 
			
		||||
            // Group notification
 | 
			
		||||
            notify(Notifications.ID_NEW_CHAPTERS, notification(Notifications.CHANNEL_NEW_CHAPTERS) {
 | 
			
		||||
                setSmallIcon(R.drawable.ic_tachi)
 | 
			
		||||
                setLargeIcon(notificationBitmap)
 | 
			
		||||
                setContentTitle(getString(R.string.notification_new_chapters))
 | 
			
		||||
                if (updates.size > 1) {
 | 
			
		||||
                    setContentText(resources.getQuantityString(R.plurals
 | 
			
		||||
@@ -509,20 +469,67 @@ class LibraryUpdateService(
 | 
			
		||||
                else {
 | 
			
		||||
                    setContentText(updates.first().first.title.chop(45))
 | 
			
		||||
                }
 | 
			
		||||
                priority = NotificationCompat.PRIORITY_HIGH
 | 
			
		||||
 | 
			
		||||
                setSmallIcon(R.drawable.ic_tachi)
 | 
			
		||||
                setLargeIcon(notificationBitmap)
 | 
			
		||||
 | 
			
		||||
                setGroup(Notifications.GROUP_NEW_CHAPTERS)
 | 
			
		||||
                setGroupAlertBehavior(GROUP_ALERT_SUMMARY)
 | 
			
		||||
                setGroupSummary(true)
 | 
			
		||||
                priority = NotificationCompat.PRIORITY_HIGH
 | 
			
		||||
 | 
			
		||||
                setContentIntent(getNotificationIntent())
 | 
			
		||||
                setAutoCancel(true)
 | 
			
		||||
            })
 | 
			
		||||
 | 
			
		||||
            notifications.forEach {
 | 
			
		||||
                notify(it.second, it.first)
 | 
			
		||||
            // Per-manga notification
 | 
			
		||||
            updates.forEach {
 | 
			
		||||
                val (manga, chapters) = it
 | 
			
		||||
                notify(manga.id.hashCode(), createNewChaptersNotification(manga, chapters))
 | 
			
		||||
            }
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    private fun createNewChaptersNotification(manga: Manga, chapters: Array<Chapter>): Notification {
 | 
			
		||||
        val chapterNames = chapters.map { chapter -> chapter.name }.toSet()
 | 
			
		||||
 | 
			
		||||
        return notification(Notifications.CHANNEL_NEW_CHAPTERS) {
 | 
			
		||||
            setContentTitle(manga.title)
 | 
			
		||||
            val chaptersNames = if (chapterNames.size > 5) {
 | 
			
		||||
                "${chapterNames.take(4).joinToString(", ")}, " +
 | 
			
		||||
                        resources.getString(R.string.notification_and_n_more, (chapterNames.size - 4))
 | 
			
		||||
            } else chapterNames.joinToString(", ")
 | 
			
		||||
            setContentText(chaptersNames)
 | 
			
		||||
            setStyle(NotificationCompat.BigTextStyle().bigText(chaptersNames))
 | 
			
		||||
 | 
			
		||||
            setSmallIcon(R.drawable.ic_tachi)
 | 
			
		||||
            try {
 | 
			
		||||
                val icon = Glide.with(this@LibraryUpdateService)
 | 
			
		||||
                        .asBitmap().load(manga).dontTransform().centerCrop().circleCrop()
 | 
			
		||||
                        .override(256, 256).submit().get()
 | 
			
		||||
                setLargeIcon(icon)
 | 
			
		||||
            } catch (e: Exception) {
 | 
			
		||||
            }
 | 
			
		||||
 | 
			
		||||
            setGroup(Notifications.GROUP_NEW_CHAPTERS)
 | 
			
		||||
            setGroupAlertBehavior(GROUP_ALERT_SUMMARY)
 | 
			
		||||
            priority = NotificationCompat.PRIORITY_HIGH
 | 
			
		||||
 | 
			
		||||
            // Open first chapter on tap
 | 
			
		||||
            setContentIntent(NotificationReceiver.openChapterPendingActivity(this@LibraryUpdateService, manga, chapters.first()))
 | 
			
		||||
            setAutoCancel(true)
 | 
			
		||||
 | 
			
		||||
            // Mark chapters as read action
 | 
			
		||||
            addAction(R.drawable.ic_glasses_black_24dp, getString(R.string.action_mark_as_read),
 | 
			
		||||
                    NotificationReceiver.markAsReadPendingBroadcast(this@LibraryUpdateService,
 | 
			
		||||
                            manga, chapters, Notifications.ID_NEW_CHAPTERS))
 | 
			
		||||
            // View chapters action
 | 
			
		||||
            addAction(R.drawable.ic_book_white_24dp, getString(R.string.action_view_chapters),
 | 
			
		||||
                    NotificationReceiver.openChapterPendingActivity(this@LibraryUpdateService,
 | 
			
		||||
                            manga, Notifications.ID_NEW_CHAPTERS))
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
     * Cancels the progress notification.
 | 
			
		||||
     */
 | 
			
		||||
 
 | 
			
		||||
@@ -167,18 +167,19 @@ class NotificationReceiver : BroadcastReceiver() {
 | 
			
		||||
     */
 | 
			
		||||
    private fun markAsRead(chapterUrls: Array<String>, mangaId: Long) {
 | 
			
		||||
        val db: DatabaseHelper = Injekt.get()
 | 
			
		||||
        chapterUrls.forEach {
 | 
			
		||||
            val chapter = db.getChapter(it, mangaId).executeAsBlocking() ?: return
 | 
			
		||||
            chapter.read = true
 | 
			
		||||
            db.updateChapterProgress(chapter).executeAsBlocking()
 | 
			
		||||
            val preferences: PreferencesHelper = Injekt.get()
 | 
			
		||||
            if (preferences.removeAfterMarkedAsRead()) {
 | 
			
		||||
                val manga = db.getManga(mangaId).executeAsBlocking() ?: return
 | 
			
		||||
                val sourceManager: SourceManager = Injekt.get()
 | 
			
		||||
                val source = sourceManager.get(manga.source) ?: return
 | 
			
		||||
                downloadManager.deleteChapters(listOf(chapter), manga, source)
 | 
			
		||||
            }
 | 
			
		||||
        }
 | 
			
		||||
        val preferences: PreferencesHelper = Injekt.get()
 | 
			
		||||
        val sourceManager: SourceManager = Injekt.get()
 | 
			
		||||
 | 
			
		||||
        chapterUrls.mapNotNull { db.getChapter(it, mangaId).executeAsBlocking() }
 | 
			
		||||
                .forEach {
 | 
			
		||||
                    it.read = true
 | 
			
		||||
                    db.updateChapterProgress(it).executeAsBlocking()
 | 
			
		||||
                    if (preferences.removeAfterMarkedAsRead()) {
 | 
			
		||||
                        val manga = db.getManga(mangaId).executeAsBlocking() ?: return
 | 
			
		||||
                        val source = sourceManager.get(manga.source) ?: return
 | 
			
		||||
                        downloadManager.deleteChapters(listOf(it), manga, source)
 | 
			
		||||
                    }
 | 
			
		||||
                }
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    companion object {
 | 
			
		||||
@@ -301,6 +302,16 @@ class NotificationReceiver : BroadcastReceiver() {
 | 
			
		||||
         * @return [PendingIntent]
 | 
			
		||||
         */
 | 
			
		||||
        internal fun dismissNotification(context: Context, notificationId: Int, groupId: Int? = null) {
 | 
			
		||||
            /*
 | 
			
		||||
            Group notifications always have at least 2 notifications:
 | 
			
		||||
            - Group summary notification
 | 
			
		||||
            - Single manga notification
 | 
			
		||||
 | 
			
		||||
            If the single notification is dismissed by the system, ie by a user swipe or tapping on the notification,
 | 
			
		||||
            it will auto dismiss the group notification if there's no other single updates.
 | 
			
		||||
 | 
			
		||||
            When programmatically dismissing this notification, the group notification is not automatically dismissed.
 | 
			
		||||
             */
 | 
			
		||||
            if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N) {
 | 
			
		||||
                val groupKey = context.notificationManager.activeNotifications.find {
 | 
			
		||||
                    it.id == notificationId
 | 
			
		||||
 
 | 
			
		||||
		Reference in New Issue
	
	Block a user