diff --git a/app/src/main/java/eu/kanade/tachiyomi/data/download/DownloadNotifier.kt b/app/src/main/java/eu/kanade/tachiyomi/data/download/DownloadNotifier.kt index ac63e7032..83badcefd 100644 --- a/app/src/main/java/eu/kanade/tachiyomi/data/download/DownloadNotifier.kt +++ b/app/src/main/java/eu/kanade/tachiyomi/data/download/DownloadNotifier.kt @@ -10,6 +10,7 @@ import eu.kanade.tachiyomi.data.notification.NotificationHandler import eu.kanade.tachiyomi.data.notification.NotificationReceiver import eu.kanade.tachiyomi.data.notification.Notifications import eu.kanade.tachiyomi.util.lang.chop +import eu.kanade.tachiyomi.util.system.notificationBuilder import eu.kanade.tachiyomi.util.system.notificationManager import java.util.regex.Pattern @@ -19,12 +20,9 @@ import java.util.regex.Pattern * @param context context of application */ internal class DownloadNotifier(private val context: Context) { - /** - * Notification builder. - */ - private val notification by lazy { - NotificationCompat.Builder(context, Notifications.CHANNEL_DOWNLOADER) - .setLargeIcon(BitmapFactory.decodeResource(context.resources, R.mipmap.ic_launcher)) + + private val notificationBuilder = context.notificationBuilder(Notifications.CHANNEL_DOWNLOADER) { + setLargeIcon(BitmapFactory.decodeResource(context.resources, R.mipmap.ic_launcher)) } /** @@ -70,9 +68,10 @@ internal class DownloadNotifier(private val context: Context) { /** * Clear old actions if they exist. */ - private fun clearActions() = with(notification) { - if (!mActions.isEmpty()) + private fun clearActions() = with(notificationBuilder) { + if (mActions.isNotEmpty()) { mActions.clear() + } } /** @@ -90,7 +89,7 @@ internal class DownloadNotifier(private val context: Context) { */ fun onProgressChange(download: Download) { // Create notification - with(notification) { + with(notificationBuilder) { // Check if first call. if (!isDownloading) { setSmallIcon(android.R.drawable.stat_sys_download) @@ -114,14 +113,14 @@ internal class DownloadNotifier(private val context: Context) { setProgress(download.pages!!.size, download.downloadedImages, false) } // Displays the progress bar on notification - notification.show() + notificationBuilder.show() } /** * Show notification when download is paused. */ fun onDownloadPaused() { - with(notification) { + with(notificationBuilder) { setContentTitle(context.getString(R.string.chapter_paused)) setContentText(context.getString(R.string.download_notifier_download_paused)) setSmallIcon(R.drawable.ic_pause_white_24dp) @@ -141,7 +140,7 @@ internal class DownloadNotifier(private val context: Context) { } // Show notification. - notification.show() + notificationBuilder.show() // Reset initial values isDownloading = false @@ -159,7 +158,7 @@ internal class DownloadNotifier(private val context: Context) { return } // Create notification. - with(notification) { + with(notificationBuilder) { val title = download.manga.title.chop(15) val quotedTitle = Pattern.quote(title) val chapter = download.chapter.name.replaceFirst("$quotedTitle[\\s]*[-]*[\\s]*".toRegex(RegexOption.IGNORE_CASE), "") @@ -173,7 +172,7 @@ internal class DownloadNotifier(private val context: Context) { } // Show notification. - notification.show() + notificationBuilder.show() // Reset initial values isDownloading = false @@ -186,7 +185,7 @@ internal class DownloadNotifier(private val context: Context) { * @param reason the text to show. */ fun onWarning(reason: String) { - with(notification) { + with(notificationBuilder) { setContentTitle(context.getString(R.string.download_notifier_downloader_title)) setContentText(reason) setSmallIcon(android.R.drawable.stat_sys_warning) @@ -195,7 +194,7 @@ internal class DownloadNotifier(private val context: Context) { setContentIntent(NotificationHandler.openDownloadManagerPendingActivity(context)) setProgress(0, 0, false) } - notification.show() + notificationBuilder.show() // Reset download information isDownloading = false @@ -210,7 +209,7 @@ internal class DownloadNotifier(private val context: Context) { */ fun onError(error: String? = null, chapter: String? = null) { // Create notification - with(notification) { + with(notificationBuilder) { setContentTitle(chapter ?: context.getString(R.string.download_notifier_downloader_title)) setContentText(error ?: context.getString(R.string.download_notifier_unkown_error)) setSmallIcon(android.R.drawable.stat_sys_warning) @@ -219,7 +218,7 @@ internal class DownloadNotifier(private val context: Context) { setContentIntent(NotificationHandler.openDownloadManagerPendingActivity(context)) setProgress(0, 0, false) } - notification.show(Notifications.ID_DOWNLOAD_CHAPTER_ERROR) + notificationBuilder.show(Notifications.ID_DOWNLOAD_CHAPTER_ERROR) // Reset download information errorThrown = true diff --git a/app/src/main/java/eu/kanade/tachiyomi/data/download/DownloadService.kt b/app/src/main/java/eu/kanade/tachiyomi/data/download/DownloadService.kt index 04a53f88c..7cd47fcea 100644 --- a/app/src/main/java/eu/kanade/tachiyomi/data/download/DownloadService.kt +++ b/app/src/main/java/eu/kanade/tachiyomi/data/download/DownloadService.kt @@ -9,7 +9,6 @@ import android.net.NetworkInfo.State.DISCONNECTED import android.os.Build import android.os.IBinder import android.os.PowerManager -import androidx.core.app.NotificationCompat import com.github.pwittchen.reactivenetwork.library.Connectivity import com.github.pwittchen.reactivenetwork.library.ReactiveNetwork import com.jakewharton.rxrelay.BehaviorRelay @@ -18,6 +17,7 @@ import eu.kanade.tachiyomi.data.notification.Notifications import eu.kanade.tachiyomi.data.preference.PreferencesHelper import eu.kanade.tachiyomi.util.lang.plusAssign import eu.kanade.tachiyomi.util.system.connectivityManager +import eu.kanade.tachiyomi.util.system.notification import eu.kanade.tachiyomi.util.system.powerManager import eu.kanade.tachiyomi.util.system.toast import rx.android.schedulers.AndroidSchedulers @@ -187,9 +187,9 @@ class DownloadService : Service() { } private fun getPlaceholderNotification(): Notification { - return NotificationCompat.Builder(this, Notifications.CHANNEL_DOWNLOADER) - .setContentTitle(getString(R.string.download_notifier_downloader_title)) - .build() + return notification(Notifications.CHANNEL_DOWNLOADER) { + setContentTitle(getString(R.string.download_notifier_downloader_title)) + } } } diff --git a/app/src/main/java/eu/kanade/tachiyomi/data/library/LibraryUpdateService.kt b/app/src/main/java/eu/kanade/tachiyomi/data/library/LibraryUpdateService.kt index d9fd9c3ae..ec3354c26 100644 --- a/app/src/main/java/eu/kanade/tachiyomi/data/library/LibraryUpdateService.kt +++ b/app/src/main/java/eu/kanade/tachiyomi/data/library/LibraryUpdateService.kt @@ -33,6 +33,7 @@ import eu.kanade.tachiyomi.util.chapter.syncChaptersWithSource import eu.kanade.tachiyomi.util.lang.chop import eu.kanade.tachiyomi.util.system.isServiceRunning import eu.kanade.tachiyomi.util.system.notification +import eu.kanade.tachiyomi.util.system.notificationBuilder import eu.kanade.tachiyomi.util.system.notificationManager import rx.Observable import rx.Subscription @@ -86,13 +87,15 @@ class LibraryUpdateService( /** * Cached progress notification to avoid creating a lot. */ - private val progressNotification by lazy { NotificationCompat.Builder(this, Notifications.CHANNEL_LIBRARY) - .setContentTitle(getString(R.string.app_name)) - .setSmallIcon(R.drawable.ic_refresh_white_24dp) - .setLargeIcon(notificationBitmap) - .setOngoing(true) - .setOnlyAlertOnce(true) - .addAction(R.drawable.ic_close_white_24dp, getString(android.R.string.cancel), cancelIntent) + private val progressNotificationBuilder by lazy { + notificationBuilder(Notifications.CHANNEL_LIBRARY) { + setContentTitle(getString(R.string.app_name)) + setSmallIcon(R.drawable.ic_refresh_white_24dp) + setLargeIcon(notificationBitmap) + setOngoing(true) + setOnlyAlertOnce(true) + addAction(R.drawable.ic_close_white_24dp, getString(android.R.string.cancel), cancelIntent) + } } /** @@ -165,7 +168,7 @@ class LibraryUpdateService( */ override fun onCreate() { super.onCreate() - startForeground(Notifications.ID_LIBRARY_PROGRESS, progressNotification.build()) + startForeground(Notifications.ID_LIBRARY_PROGRESS, progressNotificationBuilder.build()) wakeLock = (getSystemService(Context.POWER_SERVICE) as PowerManager).newWakeLock( PowerManager.PARTIAL_WAKE_LOCK, "LibraryUpdateService:WakeLock") wakeLock.acquire() @@ -430,7 +433,7 @@ class LibraryUpdateService( * @param total the total progress. */ private fun showProgressNotification(manga: Manga, current: Int, total: Int) { - notificationManager.notify(Notifications.ID_LIBRARY_PROGRESS, progressNotification + notificationManager.notify(Notifications.ID_LIBRARY_PROGRESS, progressNotificationBuilder .setContentTitle(manga.title) .setProgress(total, current, false) .build()) diff --git a/app/src/main/java/eu/kanade/tachiyomi/data/updater/UpdaterNotifier.kt b/app/src/main/java/eu/kanade/tachiyomi/data/updater/UpdaterNotifier.kt index 50e580a82..5af444614 100644 --- a/app/src/main/java/eu/kanade/tachiyomi/data/updater/UpdaterNotifier.kt +++ b/app/src/main/java/eu/kanade/tachiyomi/data/updater/UpdaterNotifier.kt @@ -7,6 +7,7 @@ import eu.kanade.tachiyomi.R import eu.kanade.tachiyomi.data.notification.NotificationHandler import eu.kanade.tachiyomi.data.notification.NotificationReceiver import eu.kanade.tachiyomi.data.notification.Notifications +import eu.kanade.tachiyomi.util.system.notificationBuilder import eu.kanade.tachiyomi.util.system.notificationManager /** @@ -16,12 +17,7 @@ import eu.kanade.tachiyomi.util.system.notificationManager */ internal class UpdaterNotifier(private val context: Context) { - /** - * Builder to manage notifications. - */ - private val notification by lazy { - NotificationCompat.Builder(context, Notifications.CHANNEL_COMMON) - } + private val notificationBuilder = context.notificationBuilder(Notifications.CHANNEL_COMMON) /** * Call to show notification. @@ -38,13 +34,13 @@ internal class UpdaterNotifier(private val context: Context) { * @param title tile of notification. */ fun onDownloadStarted(title: String) { - with(notification) { + with(notificationBuilder) { setContentTitle(title) setContentText(context.getString(R.string.update_check_notification_download_in_progress)) setSmallIcon(android.R.drawable.stat_sys_download) setOngoing(true) } - notification.show() + notificationBuilder.show() } /** @@ -53,11 +49,11 @@ internal class UpdaterNotifier(private val context: Context) { * @param progress progress of download (xx%/100). */ fun onProgressChange(progress: Int) { - with(notification) { + with(notificationBuilder) { setProgress(100, progress, false) setOnlyAlertOnce(true) } - notification.show() + notificationBuilder.show() } /** @@ -66,7 +62,7 @@ internal class UpdaterNotifier(private val context: Context) { * @param uri path location of apk. */ fun onDownloadFinished(uri: Uri) { - with(notification) { + with(notificationBuilder) { setContentText(context.getString(R.string.update_check_notification_download_complete)) setSmallIcon(android.R.drawable.stat_sys_download_done) setOnlyAlertOnce(false) @@ -81,7 +77,7 @@ internal class UpdaterNotifier(private val context: Context) { context.getString(R.string.action_cancel), NotificationReceiver.dismissNotificationPendingBroadcast(context, Notifications.ID_UPDATER)) } - notification.show() + notificationBuilder.show() } /** @@ -90,7 +86,7 @@ internal class UpdaterNotifier(private val context: Context) { * @param url web location of apk to download. */ fun onDownloadError(url: String) { - with(notification) { + with(notificationBuilder) { setContentText(context.getString(R.string.update_check_notification_download_error)) setSmallIcon(android.R.drawable.stat_sys_warning) setOnlyAlertOnce(false) @@ -104,6 +100,6 @@ internal class UpdaterNotifier(private val context: Context) { context.getString(R.string.action_cancel), NotificationReceiver.dismissNotificationPendingBroadcast(context, Notifications.ID_UPDATER)) } - notification.show(Notifications.ID_UPDATER) + notificationBuilder.show(Notifications.ID_UPDATER) } } diff --git a/app/src/main/java/eu/kanade/tachiyomi/ui/reader/SaveImageNotifier.kt b/app/src/main/java/eu/kanade/tachiyomi/ui/reader/SaveImageNotifier.kt index 37bfdc663..69f397892 100644 --- a/app/src/main/java/eu/kanade/tachiyomi/ui/reader/SaveImageNotifier.kt +++ b/app/src/main/java/eu/kanade/tachiyomi/ui/reader/SaveImageNotifier.kt @@ -9,6 +9,7 @@ import eu.kanade.tachiyomi.data.glide.GlideApp import eu.kanade.tachiyomi.data.notification.NotificationHandler import eu.kanade.tachiyomi.data.notification.NotificationReceiver import eu.kanade.tachiyomi.data.notification.Notifications +import eu.kanade.tachiyomi.util.system.notificationBuilder import eu.kanade.tachiyomi.util.system.notificationManager import java.io.File @@ -20,7 +21,7 @@ class SaveImageNotifier(private val context: Context) { /** * Notification builder. */ - private val notificationBuilder = NotificationCompat.Builder(context, Notifications.CHANNEL_COMMON) + private val notificationBuilder = context.notificationBuilder(Notifications.CHANNEL_COMMON) /** * Id of the notification. @@ -59,8 +60,9 @@ class SaveImageNotifier(private val context: Context) { setAutoCancel(true) // Clear old actions if they exist - if (mActions.isNotEmpty()) + if (mActions.isNotEmpty()) { mActions.clear() + } setContentIntent(NotificationHandler.openImagePendingActivity(context, file)) // Share action diff --git a/app/src/main/java/eu/kanade/tachiyomi/util/system/ContextExtensions.kt b/app/src/main/java/eu/kanade/tachiyomi/util/system/ContextExtensions.kt index 5f2accea2..99e2d35c6 100644 --- a/app/src/main/java/eu/kanade/tachiyomi/util/system/ContextExtensions.kt +++ b/app/src/main/java/eu/kanade/tachiyomi/util/system/ContextExtensions.kt @@ -43,16 +43,31 @@ fun Context.toast(text: String?, duration: Int = Toast.LENGTH_SHORT) { Toast.makeText(this, text.orEmpty(), duration).show() } +/** + * Helper method to create a notification builder. + * + * @param id the channel id. + * @param block the function that will execute inside the builder. + * @return a notification to be displayed or updated. + */ +fun Context.notificationBuilder(channelId: String, block: (NotificationCompat.Builder.() -> Unit)? = null): NotificationCompat.Builder { + val builder = NotificationCompat.Builder(this, channelId) + .setColor(ContextCompat.getColor(this, R.color.colorPrimary)) + if (block != null) { + builder.block() + } + return builder +} + /** * Helper method to create a notification. * * @param id the channel id. - * @param func the function that will execute inside the builder. + * @param block the function that will execute inside the builder. * @return a notification to be displayed or updated. */ -inline fun Context.notification(channelId: String, func: NotificationCompat.Builder.() -> Unit): Notification { - val builder = NotificationCompat.Builder(this, channelId) - builder.func() +fun Context.notification(channelId: String, block: (NotificationCompat.Builder.() -> Unit)?): Notification { + val builder = notificationBuilder(channelId, block) return builder.build() }