package exh.eh import android.content.Context import android.graphics.BitmapFactory import android.net.Uri import androidx.core.app.NotificationCompat import androidx.core.content.ContextCompat import eu.kanade.tachiyomi.R import eu.kanade.tachiyomi.core.security.SecurityPreferences 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.cancelNotification import eu.kanade.tachiyomi.util.system.notificationBuilder import eu.kanade.tachiyomi.util.system.notify import tachiyomi.core.common.i18n.stringResource import tachiyomi.domain.manga.model.Manga import tachiyomi.i18n.MR import uy.kohesive.injekt.injectLazy import java.math.RoundingMode import java.text.NumberFormat class EHentaiUpdateNotifier(private val context: Context) { private val securityPreferences: SecurityPreferences by injectLazy() private val percentFormatter = NumberFormat.getPercentInstance().apply { roundingMode = RoundingMode.DOWN maximumFractionDigits = 0 } /** * Bitmap of the app for notifications. */ private val notificationBitmap by lazy { BitmapFactory.decodeResource(context.resources, R.drawable.komikku) } /** * Cached progress notification to avoid creating a lot. */ val progressNotificationBuilder by lazy { context.notificationBuilder(Notifications.CHANNEL_LIBRARY_EHENTAI) { setContentTitle(context.stringResource(MR.strings.app_name)) setSmallIcon(R.drawable.ic_refresh_24dp) setColor(ContextCompat.getColor(context, R.color.ic_launcher)) setLargeIcon(notificationBitmap) setOngoing(true) setOnlyAlertOnce(true) } } /** * Shows the notification containing the currently updating manga and the progress. * * @param manga the manga that are being updated. * @param current the current progress. * @param total the total progress. */ fun showProgressNotification(manga: Manga, current: Int, total: Int) { progressNotificationBuilder .setContentTitle( context.stringResource( MR.strings.notification_updating_progress, percentFormatter.format(current.toFloat() / total), ), ) if (!securityPreferences.hideNotificationContent().get()) { val updatingText = manga.title.chop(40) progressNotificationBuilder.setStyle(NotificationCompat.BigTextStyle().bigText(updatingText)) } context.notify( Notifications.ID_EHENTAI_PROGRESS, progressNotificationBuilder .setProgress(total, current, false) .build(), ) } /** * Shows notification containing update entries that failed with action to open full log. * * @param failed Number of entries that failed to update. * @param uri Uri for error log file containing all titles that failed. */ fun showUpdateErrorNotification(failed: Int, uri: Uri) { if (failed == 0) { return } context.notify( Notifications.ID_EHENTAI_ERROR, Notifications.CHANNEL_LIBRARY_EHENTAI, ) { setContentTitle(context.stringResource(MR.strings.notification_update_error, failed)) setContentText(context.stringResource(MR.strings.action_show_errors)) setSmallIcon(R.drawable.ic_komikku) setColor(ContextCompat.getColor(context, R.color.ic_launcher)) setLargeIcon(notificationBitmap) setContentIntent(NotificationReceiver.openErrorLogPendingActivity(context, uri)) } } /** * Cancels the progress notification. */ fun cancelProgressNotification() { context.cancelNotification(Notifications.ID_EHENTAI_PROGRESS) } }