mirror of
				https://github.com/mihonapp/mihon.git
				synced 2025-11-04 08:08:55 +01:00 
			
		
		
		
	Add notification action to open GitHub release page
Co-authored-by: Jays2Kings <Jays2Kings@users.noreply.github.com>
This commit is contained in:
		@@ -1,5 +1,6 @@
 | 
			
		||||
package eu.kanade.tachiyomi.data.updater
 | 
			
		||||
 | 
			
		||||
import android.content.Context
 | 
			
		||||
import eu.kanade.tachiyomi.BuildConfig
 | 
			
		||||
import eu.kanade.tachiyomi.data.preference.PreferencesHelper
 | 
			
		||||
import eu.kanade.tachiyomi.network.GET
 | 
			
		||||
@@ -23,9 +24,9 @@ class AppUpdateChecker {
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    suspend fun checkForUpdate(): AppUpdateResult {
 | 
			
		||||
    suspend fun checkForUpdate(context: Context): AppUpdateResult {
 | 
			
		||||
        return withIOContext {
 | 
			
		||||
            networkService.client
 | 
			
		||||
            val result = networkService.client
 | 
			
		||||
                .newCall(GET("https://api.github.com/repos/$repo/releases/latest"))
 | 
			
		||||
                .await()
 | 
			
		||||
                .parseAs<GithubRelease>()
 | 
			
		||||
@@ -39,6 +40,12 @@ class AppUpdateChecker {
 | 
			
		||||
                        AppUpdateResult.NoNewUpdate
 | 
			
		||||
                    }
 | 
			
		||||
                }
 | 
			
		||||
 | 
			
		||||
            if (result is AppUpdateResult.NewUpdate) {
 | 
			
		||||
                AppUpdateNotifier(context).promptUpdate(result.release)
 | 
			
		||||
            }
 | 
			
		||||
 | 
			
		||||
            result
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
 
 | 
			
		||||
@@ -17,10 +17,7 @@ class AppUpdateJob(private val context: Context, workerParams: WorkerParameters)
 | 
			
		||||
 | 
			
		||||
    override suspend fun doWork() = coroutineScope {
 | 
			
		||||
        try {
 | 
			
		||||
            val result = AppUpdateChecker().checkForUpdate()
 | 
			
		||||
            if (result is AppUpdateResult.NewUpdate) {
 | 
			
		||||
                AppUpdateNotifier(context).promptUpdate(result.release.getDownloadLink())
 | 
			
		||||
            }
 | 
			
		||||
            AppUpdateChecker().checkForUpdate(context)
 | 
			
		||||
            Result.success()
 | 
			
		||||
        } catch (e: Exception) {
 | 
			
		||||
            Result.failure()
 | 
			
		||||
 
 | 
			
		||||
@@ -5,6 +5,7 @@ import android.content.Context
 | 
			
		||||
import android.content.Intent
 | 
			
		||||
import android.net.Uri
 | 
			
		||||
import androidx.core.app.NotificationCompat
 | 
			
		||||
import androidx.core.net.toUri
 | 
			
		||||
import eu.kanade.tachiyomi.R
 | 
			
		||||
import eu.kanade.tachiyomi.data.notification.NotificationHandler
 | 
			
		||||
import eu.kanade.tachiyomi.data.notification.NotificationReceiver
 | 
			
		||||
@@ -25,22 +26,32 @@ internal class AppUpdateNotifier(private val context: Context) {
 | 
			
		||||
        context.notificationManager.notify(id, build())
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    fun promptUpdate(url: String) {
 | 
			
		||||
    fun promptUpdate(release: GithubRelease) {
 | 
			
		||||
        val intent = Intent(context, AppUpdateService::class.java).apply {
 | 
			
		||||
            putExtra(AppUpdateService.EXTRA_DOWNLOAD_URL, url)
 | 
			
		||||
            putExtra(AppUpdateService.EXTRA_DOWNLOAD_URL, release.getDownloadLink())
 | 
			
		||||
        }
 | 
			
		||||
        val pendingIntent = PendingIntent.getService(context, 0, intent, PendingIntent.FLAG_UPDATE_CURRENT)
 | 
			
		||||
        val updateIntent = PendingIntent.getService(context, 0, intent, PendingIntent.FLAG_UPDATE_CURRENT)
 | 
			
		||||
 | 
			
		||||
        val releaseIntent = Intent(Intent.ACTION_VIEW, release.releaseLink.toUri()).apply {
 | 
			
		||||
            flags = Intent.FLAG_ACTIVITY_NEW_TASK or Intent.FLAG_ACTIVITY_CLEAR_TOP
 | 
			
		||||
        }
 | 
			
		||||
        val releaseInfoIntent = PendingIntent.getActivity(context, release.hashCode(), releaseIntent, PendingIntent.FLAG_UPDATE_CURRENT or PendingIntent.FLAG_IMMUTABLE)
 | 
			
		||||
 | 
			
		||||
        with(notificationBuilder) {
 | 
			
		||||
            setContentTitle(context.getString(R.string.app_name))
 | 
			
		||||
            setContentText(context.getString(R.string.update_check_notification_update_available))
 | 
			
		||||
            setContentTitle(context.getString(R.string.update_check_notification_update_available))
 | 
			
		||||
            setSmallIcon(android.R.drawable.stat_sys_download_done)
 | 
			
		||||
            setContentIntent(pendingIntent)
 | 
			
		||||
            setContentIntent(updateIntent)
 | 
			
		||||
 | 
			
		||||
            clearActions()
 | 
			
		||||
            addAction(
 | 
			
		||||
                android.R.drawable.stat_sys_download_done,
 | 
			
		||||
                context.getString(R.string.action_download),
 | 
			
		||||
                pendingIntent
 | 
			
		||||
                updateIntent,
 | 
			
		||||
            )
 | 
			
		||||
            addAction(
 | 
			
		||||
                R.drawable.ic_info_24dp,
 | 
			
		||||
                context.getString(R.string.whats_new),
 | 
			
		||||
                releaseInfoIntent,
 | 
			
		||||
            )
 | 
			
		||||
        }
 | 
			
		||||
        notificationBuilder.show()
 | 
			
		||||
 
 | 
			
		||||
@@ -5,17 +5,13 @@ import kotlinx.serialization.SerialName
 | 
			
		||||
import kotlinx.serialization.Serializable
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * Release object.
 | 
			
		||||
 * Contains information about the latest release from GitHub.
 | 
			
		||||
 *
 | 
			
		||||
 * @param version version of latest release.
 | 
			
		||||
 * @param info log of latest release.
 | 
			
		||||
 * @param assets assets of latest release.
 | 
			
		||||
 */
 | 
			
		||||
@Serializable
 | 
			
		||||
data class GithubRelease(
 | 
			
		||||
    @SerialName("tag_name") val version: String,
 | 
			
		||||
    @SerialName("body") val info: String,
 | 
			
		||||
    @SerialName("html_url") val releaseLink: String,
 | 
			
		||||
    @SerialName("assets") private val assets: List<Assets>
 | 
			
		||||
) {
 | 
			
		||||
 | 
			
		||||
@@ -37,7 +33,6 @@ data class GithubRelease(
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
     * Assets class containing download url.
 | 
			
		||||
     * @param downloadLink download url.
 | 
			
		||||
     */
 | 
			
		||||
    @Serializable
 | 
			
		||||
    data class Assets(@SerialName("browser_download_url") val downloadLink: String)
 | 
			
		||||
 
 | 
			
		||||
@@ -336,7 +336,7 @@ class MainActivity : BaseViewBindingActivity<MainActivityBinding>() {
 | 
			
		||||
 | 
			
		||||
        lifecycleScope.launchIO {
 | 
			
		||||
            try {
 | 
			
		||||
                val result = AppUpdateChecker().checkForUpdate()
 | 
			
		||||
                val result = AppUpdateChecker().checkForUpdate(this@MainActivity)
 | 
			
		||||
                if (result is AppUpdateResult.NewUpdate) {
 | 
			
		||||
                    NewUpdateDialogController(result).showDialog(router)
 | 
			
		||||
                }
 | 
			
		||||
 
 | 
			
		||||
@@ -107,11 +107,11 @@ class AboutController : SettingsController(), NoAppBarElevationController {
 | 
			
		||||
    private fun checkVersion() {
 | 
			
		||||
        if (activity == null) return
 | 
			
		||||
 | 
			
		||||
        activity?.toast(R.string.update_check_look_for_updates)
 | 
			
		||||
        activity!!.toast(R.string.update_check_look_for_updates)
 | 
			
		||||
 | 
			
		||||
        launchNow {
 | 
			
		||||
            try {
 | 
			
		||||
                when (val result = updateChecker.checkForUpdate()) {
 | 
			
		||||
                when (val result = updateChecker.checkForUpdate(activity!!)) {
 | 
			
		||||
                    is AppUpdateResult.NewUpdate -> {
 | 
			
		||||
                        NewUpdateDialogController(result).showDialog(router)
 | 
			
		||||
                    }
 | 
			
		||||
 
 | 
			
		||||
		Reference in New Issue
	
	Block a user