diff --git a/app/src/main/java/com/hippo/ehviewer/EhApplication.kt b/app/src/main/java/com/hippo/ehviewer/EhApplication.kt index 3a3c1ce93..6e29c8357 100644 --- a/app/src/main/java/com/hippo/ehviewer/EhApplication.kt +++ b/app/src/main/java/com/hippo/ehviewer/EhApplication.kt @@ -34,6 +34,7 @@ import com.hippo.ehviewer.client.EhSSLSocketFactory import com.hippo.ehviewer.client.EhTagDatabase import com.hippo.ehviewer.client.data.GalleryDetail import com.hippo.ehviewer.coil.MergeInterceptor +import com.hippo.ehviewer.dailycheck.checkDawn import com.hippo.ehviewer.dao.buildMainDB import com.hippo.ehviewer.download.DownloadManager import com.hippo.ehviewer.ui.CommonOperations @@ -100,6 +101,11 @@ class EhApplication : Application(), DefaultLifecycleObserver, ImageLoaderFactor launchIO { cleanupDownload() } + if (Settings.requestNews) { + launchIO { + checkDawn() + } + } } mIdGenerator.setNextId(Settings.getInt(KEY_GLOBAL_STUFF_NEXT_ID, 0)) } diff --git a/app/src/main/java/com/hippo/ehviewer/Settings.kt b/app/src/main/java/com/hippo/ehviewer/Settings.kt index ab7564a05..c7915148b 100755 --- a/app/src/main/java/com/hippo/ehviewer/Settings.kt +++ b/app/src/main/java/com/hippo/ehviewer/Settings.kt @@ -95,6 +95,7 @@ object Settings { const val KEY_DOMAIN_FRONTING = "domain_fronting" const val KEY_BYPASS_VPN = "bypass_vpn" const val KEY_LIST_THUMB_SIZE = "list_tile_size" + private const val KEY_LAST_DAWN_DAY = "last_dawn_day" private const val DEFAULT_HIDE_HV_EVENTS = false private const val KEY_SHOW_COMMENTS = "show_gallery_comments" private const val DEFAULT_SHOW_COMMENTS = true @@ -293,6 +294,9 @@ object Settings { sSettingsPre.edit().putString(key, value.toString()).apply() } + var lastDawnDay: Long + get() = sSettingsPre.getLong(KEY_LAST_DAWN_DAY, 0) + set(value) = sSettingsPre.edit().putLong(KEY_LAST_DAWN_DAY, value).apply() val displayName: String? get() = getString(KEY_DISPLAY_NAME, DEFAULT_DISPLAY_NAME) diff --git a/app/src/main/java/com/hippo/ehviewer/client/EhEngine.kt b/app/src/main/java/com/hippo/ehviewer/client/EhEngine.kt index d8d90198f..14279f492 100644 --- a/app/src/main/java/com/hippo/ehviewer/client/EhEngine.kt +++ b/app/src/main/java/com/hippo/ehviewer/client/EhEngine.kt @@ -47,6 +47,8 @@ import com.hippo.ehviewer.client.parser.SignInParser import com.hippo.ehviewer.client.parser.TorrentParser import com.hippo.ehviewer.client.parser.VoteCommentParser import com.hippo.ehviewer.client.parser.VoteTagParser +import com.hippo.ehviewer.dailycheck.showEventNotification +import com.hippo.ehviewer.dailycheck.today import com.hippo.network.StatusCodeException import com.hippo.util.ExceptionUtils import kotlinx.coroutines.async @@ -320,6 +322,10 @@ object EhEngine { code = response.code headers = response.headers body = response.body.string() + EventPaneParser.parse(body!!)?.let { + Settings.lastDawnDay = today + showEventNotification(it) + } return GalleryDetailParser.parse(body!!) } } catch (e: Throwable) { diff --git a/app/src/main/java/com/hippo/ehviewer/dailycheck/DailyCheckWork.kt b/app/src/main/java/com/hippo/ehviewer/dailycheck/DailyCheckWork.kt index 123a23ecf..0dea8eba6 100644 --- a/app/src/main/java/com/hippo/ehviewer/dailycheck/DailyCheckWork.kt +++ b/app/src/main/java/com/hippo/ehviewer/dailycheck/DailyCheckWork.kt @@ -20,49 +20,23 @@ import com.hippo.ehviewer.Settings import com.hippo.ehviewer.client.EhEngine import eu.kanade.tachiyomi.util.lang.withIOContext import java.time.Duration +import java.time.Instant import java.time.LocalDateTime +import java.time.temporal.ChronoUnit private val signedIn get() = EhApplication.ehCookieStore.hasSignedIn() private const val CHANNEL_ID = "DailyCheckNotification" -class DailyCheckWork(val context: Context, workerParams: WorkerParameters) : +class DailyCheckWork(context: Context, workerParams: WorkerParameters) : CoroutineWorker(context, workerParams) { override suspend fun doWork(): Result = withIOContext { - runCatching { - if (signedIn) { - EhEngine.getNews(true)?.let { showEventPane(it) } - } - }.onFailure { - it.printStackTrace() + checkDawn().onFailure { return@withIOContext Result.retry() } Result.success() } - - @SuppressLint("MissingPermission") - private fun showEventPane(html: String) { - if (Settings.hideHvEvents && html.contains("You have encountered a monster!")) { - return - } - val notificationManager = NotificationManagerCompat.from(context) - val chan = NotificationChannelCompat - .Builder(CHANNEL_ID, NotificationManagerCompat.IMPORTANCE_LOW) - .setName(CHANNEL_ID) - .build() - notificationManager.createNotificationChannel(chan) - val msg = NotificationCompat.Builder(context, CHANNEL_ID) - .setSmallIcon(R.drawable.ic_launcher_monochrome) - .setContentText(Html.fromHtml(html, Html.FROM_HTML_MODE_LEGACY)) - .setStyle(NotificationCompat.BigTextStyle()) - .build() - runCatching { - notificationManager.notify(1, msg) - }.onFailure { - it.printStackTrace() - } - } } val schedHour @@ -103,3 +77,42 @@ fun updateDailyCheckWork(context: Context) { WorkManager.getInstance(context).cancelUniqueWork(workName) } } + +val today + get() = Instant.now().truncatedTo(ChronoUnit.DAYS).epochSecond + +suspend fun checkDawn() = runCatching { + if (signedIn && Settings.lastDawnDay != today) { + EhEngine.getNews(true)?.let { + Settings.lastDawnDay = today + showEventNotification(it) + } + } +}.onFailure { + it.printStackTrace() +} + + +@SuppressLint("MissingPermission") +fun showEventNotification(html: String) { + if (Settings.hideHvEvents && html.contains("You have encountered a monster!")) { + return + } + val context = EhApplication.application + val notificationManager = NotificationManagerCompat.from(context) + val chan = NotificationChannelCompat + .Builder(CHANNEL_ID, NotificationManagerCompat.IMPORTANCE_LOW) + .setName(CHANNEL_ID) + .build() + notificationManager.createNotificationChannel(chan) + val msg = NotificationCompat.Builder(context, CHANNEL_ID) + .setSmallIcon(R.drawable.ic_launcher_monochrome) + .setContentText(Html.fromHtml(html, Html.FROM_HTML_MODE_LEGACY)) + .setStyle(NotificationCompat.BigTextStyle()) + .build() + runCatching { + notificationManager.notify(1, msg) + }.onFailure { + it.printStackTrace() + } +}