package ani.dantotsu.aniyomi.data import android.content.Context import androidx.core.app.NotificationManagerCompat import androidx.core.app.NotificationManagerCompat.IMPORTANCE_DEFAULT import androidx.core.app.NotificationManagerCompat.IMPORTANCE_HIGH import androidx.core.app.NotificationManagerCompat.IMPORTANCE_LOW import ani.dantotsu.aniyomi.util.system.buildNotificationChannel import ani.dantotsu.aniyomi.util.system.buildNotificationChannelGroup /** * Class to manage the basic information of all the notifications used in the app. */ object Notifications { /** * Common notification channel and ids used anywhere. */ const val CHANNEL_COMMON = "common_channel" const val ID_DOWNLOAD_IMAGE = 2 /** * Notification channel and ids used by the library updater. */ private const val GROUP_LIBRARY = "group_library" const val CHANNEL_LIBRARY_PROGRESS = "library_progress_channel" const val ID_LIBRARY_PROGRESS = -101 const val ID_LIBRARY_SIZE_WARNING = -103 const val CHANNEL_LIBRARY_ERROR = "library_errors_channel" const val ID_LIBRARY_ERROR = -102 const val CHANNEL_LIBRARY_SKIPPED = "library_skipped_channel" const val ID_LIBRARY_SKIPPED = -104 /** * Notification channel and ids used by the downloader. */ private const val GROUP_DOWNLOADER = "group_downloader" const val CHANNEL_DOWNLOADER_PROGRESS = "downloader_progress_channel" const val ID_DOWNLOAD_CHAPTER_PROGRESS = -201 const val ID_DOWNLOAD_EPISODE_PROGRESS = -203 const val CHANNEL_DOWNLOADER_ERROR = "downloader_error_channel" const val ID_DOWNLOAD_CHAPTER_ERROR = -202 const val ID_DOWNLOAD_EPISODE_ERROR = -204 /** * Notification channel and ids used by the library updater. */ const val CHANNEL_NEW_CHAPTERS_EPISODES = "new_chapters_episodes_channel" const val ID_NEW_CHAPTERS = -301 const val ID_NEW_EPISODES = -1301 const val GROUP_NEW_CHAPTERS = "eu.kanade.tachiyomi.NEW_CHAPTERS" const val GROUP_NEW_EPISODES = "eu.kanade.tachiyomi.NEW_EPISODES" /** * Notification channel and ids used by the backup/restore system. */ private const val GROUP_BACKUP_RESTORE = "group_backup_restore" const val CHANNEL_BACKUP_RESTORE_PROGRESS = "backup_restore_progress_channel" const val ID_BACKUP_PROGRESS = -501 const val ID_RESTORE_PROGRESS = -503 const val CHANNEL_BACKUP_RESTORE_COMPLETE = "backup_restore_complete_channel_v2" const val ID_BACKUP_COMPLETE = -502 const val ID_RESTORE_COMPLETE = -504 /** * Notification channel used for Incognito Mode */ const val CHANNEL_INCOGNITO_MODE = "incognito_mode_channel" const val ID_INCOGNITO_MODE = -701 /** * Notification channel and ids used for app and extension updates. */ private const val GROUP_APK_UPDATES = "group_apk_updates" const val CHANNEL_APP_UPDATE = "app_apk_update_channel" const val ID_APP_UPDATER = 1 const val ID_APP_UPDATE_PROMPT = 2 const val CHANNEL_EXTENSIONS_UPDATE = "ext_apk_update_channel" const val ID_UPDATES_TO_EXTS = -401 const val ID_EXTENSION_INSTALLER = -402 private val deprecatedChannels = listOf( "downloader_channel", "downloader_complete_channel", "backup_restore_complete_channel", "library_channel", "library_progress_channel", "updates_ext_channel", "downloader_cache_renewal", "crash_logs_channel", ) /** * Creates the notification channels introduced in Android Oreo. * This won't do anything on Android versions that don't support notification channels. * * @param context The application context. */ fun createChannels(context: Context) { val notificationManager = NotificationManagerCompat.from(context) // Delete old notification channels deprecatedChannels.forEach(notificationManager::deleteNotificationChannel) notificationManager.createNotificationChannelGroupsCompat( listOf( buildNotificationChannelGroup(GROUP_BACKUP_RESTORE) { setName("Backup & Restore") }, buildNotificationChannelGroup(GROUP_DOWNLOADER) { setName("Downloader") }, buildNotificationChannelGroup(GROUP_LIBRARY) { setName("Library") }, buildNotificationChannelGroup(GROUP_APK_UPDATES) { setName("App & Extension Updates") }, ), ) notificationManager.createNotificationChannelsCompat( listOf( buildNotificationChannel(CHANNEL_COMMON, IMPORTANCE_LOW) { setName("Common") }, buildNotificationChannel(CHANNEL_LIBRARY_PROGRESS, IMPORTANCE_LOW) { setName("Library Progress") setGroup(GROUP_LIBRARY) setShowBadge(false) }, buildNotificationChannel(CHANNEL_LIBRARY_ERROR, IMPORTANCE_LOW) { setName("Library Errors") setGroup(GROUP_LIBRARY) setShowBadge(false) }, buildNotificationChannel(CHANNEL_LIBRARY_SKIPPED, IMPORTANCE_LOW) { setName("Library Skipped") setGroup(GROUP_LIBRARY) setShowBadge(false) }, buildNotificationChannel(CHANNEL_NEW_CHAPTERS_EPISODES, IMPORTANCE_DEFAULT) { setName("New Chapters & Episodes") }, buildNotificationChannel(CHANNEL_DOWNLOADER_PROGRESS, IMPORTANCE_LOW) { setName("Downloader Progress") setGroup(GROUP_DOWNLOADER) setShowBadge(false) }, buildNotificationChannel(CHANNEL_DOWNLOADER_ERROR, IMPORTANCE_LOW) { setName("Downloader Errors") setGroup(GROUP_DOWNLOADER) setShowBadge(false) }, buildNotificationChannel(CHANNEL_BACKUP_RESTORE_PROGRESS, IMPORTANCE_LOW) { setName("Backup & Restore Progress") setGroup(GROUP_BACKUP_RESTORE) setShowBadge(false) }, buildNotificationChannel(CHANNEL_BACKUP_RESTORE_COMPLETE, IMPORTANCE_HIGH) { setName("Backup & Restore Complete") setGroup(GROUP_BACKUP_RESTORE) setShowBadge(false) setSound(null, null) }, buildNotificationChannel(CHANNEL_INCOGNITO_MODE, IMPORTANCE_LOW) { setName("Incognito Mode") }, buildNotificationChannel(CHANNEL_APP_UPDATE, IMPORTANCE_DEFAULT) { setGroup(GROUP_APK_UPDATES) setName("App Updates") }, buildNotificationChannel(CHANNEL_EXTENSIONS_UPDATE, IMPORTANCE_DEFAULT) { setGroup(GROUP_APK_UPDATES) setName("Extension Updates") }, ), ) } }