diff --git a/app/src/main/java/eu/kanade/tachiyomi/data/notification/Notifications.kt b/app/src/main/java/eu/kanade/tachiyomi/data/notification/Notifications.kt
index 5f37ee6d78..70293dd6aa 100644
--- a/app/src/main/java/eu/kanade/tachiyomi/data/notification/Notifications.kt
+++ b/app/src/main/java/eu/kanade/tachiyomi/data/notification/Notifications.kt
@@ -1,5 +1,6 @@
package eu.kanade.tachiyomi.data.notification
+import android.app.Notification
import android.app.NotificationChannel
import android.app.NotificationChannelGroup
import android.app.NotificationManager
@@ -21,8 +22,10 @@ object Notifications {
const val ID_UPDATER = 1
const val ID_DOWNLOAD_IMAGE = 2
const val ID_INSTALL = 3
+ const val CHANNEL_INSTALLING = "installing_channel"
const val CHANNEL_UPDATED = "updated_channel"
const val ID_INSTALLED = -6
+ const val GROUP_APP_UPDATES = "eu.kanade.tachiyomi.APP_UPDATES"
/**
* Notification channel and ids used by the downloader.
@@ -108,6 +111,7 @@ object Notifications {
GROUP_EXTENSION_UPDATES,
context.getString(R.string.extension_updates),
),
+ NotificationChannelGroup(GROUP_APP_UPDATES, context.getString(R.string.app_updates)),
NotificationChannelGroup(GROUP_LIBRARY, context.getString(R.string.library)),
).forEach(context.notificationManager::createNotificationChannelGroup)
@@ -188,7 +192,9 @@ object Notifications {
CHANNEL_INCOGNITO_MODE,
context.getString(R.string.incognito_mode),
NotificationManager.IMPORTANCE_LOW,
- ),
+ ).apply {
+ lockscreenVisibility = Notification.VISIBILITY_SECRET
+ },
NotificationChannel(
CHANNEL_EXT_PROGRESS,
context.getString(R.string.updating_extensions),
@@ -205,12 +211,23 @@ object Notifications {
).apply {
group = GROUP_EXTENSION_UPDATES
},
+ NotificationChannel(
+ CHANNEL_INSTALLING,
+ context.getString(R.string.installing),
+ NotificationManager.IMPORTANCE_HIGH,
+ ).apply {
+ setShowBadge(false)
+ setSound(null, null)
+ enableVibration(false)
+ group = GROUP_APP_UPDATES
+ },
NotificationChannel(
CHANNEL_UPDATED,
context.getString(R.string.update_completed),
NotificationManager.IMPORTANCE_HIGH,
).apply {
setShowBadge(false)
+ group = GROUP_APP_UPDATES
},
)
context.notificationManager.createNotificationChannels(channels)
diff --git a/app/src/main/java/eu/kanade/tachiyomi/data/updater/AppUpdateBroadcast.kt b/app/src/main/java/eu/kanade/tachiyomi/data/updater/AppUpdateBroadcast.kt
index a9849358a3..236e4711bc 100644
--- a/app/src/main/java/eu/kanade/tachiyomi/data/updater/AppUpdateBroadcast.kt
+++ b/app/src/main/java/eu/kanade/tachiyomi/data/updater/AppUpdateBroadcast.kt
@@ -38,7 +38,9 @@ class AppUpdateBroadcast : BroadcastReceiver() {
if (status != PackageInstaller.STATUS_FAILURE_ABORTED) {
context.toast(R.string.could_not_install_update)
val uri = intent.getStringExtra(AppUpdateService.EXTRA_FILE_URI) ?: return
- AppUpdateNotifier(context.localeContext).onInstallError(uri.toUri())
+ val appUpdateNotifier = AppUpdateNotifier(context.localeContext)
+ appUpdateNotifier.cancelInstallNotification()
+ appUpdateNotifier.onInstallError(uri.toUri())
}
}
}
diff --git a/app/src/main/java/eu/kanade/tachiyomi/data/updater/AppUpdateNotifier.kt b/app/src/main/java/eu/kanade/tachiyomi/data/updater/AppUpdateNotifier.kt
index 5d6153da67..f731ca12cb 100644
--- a/app/src/main/java/eu/kanade/tachiyomi/data/updater/AppUpdateNotifier.kt
+++ b/app/src/main/java/eu/kanade/tachiyomi/data/updater/AppUpdateNotifier.kt
@@ -141,6 +141,17 @@ internal class AppUpdateNotifier(private val context: Context) {
notificationBuilder.show()
}
+ fun onInstalling() {
+ with(NotificationCompat.Builder(context, Notifications.CHANNEL_INSTALLING)) {
+ setContentTitle(context.getString(R.string.installing))
+ setSmallIcon(android.R.drawable.stat_sys_download)
+ setProgress(0, 0, true)
+ setOnlyAlertOnce(true)
+ clearActions()
+ show(Notifications.ID_INSTALL)
+ }
+ }
+
/**
* Call when apk download is finished.
*
@@ -179,7 +190,8 @@ internal class AppUpdateNotifier(private val context: Context) {
*/
fun onInstallFinished() {
with(NotificationCompat.Builder(context, Notifications.CHANNEL_UPDATED)) {
- setContentTitle(context.getString(R.string.updated_to_, BuildConfig.VERSION_NAME))
+ setContentTitle(context.getString(R.string.update_completed))
+ setContentText(context.getString(R.string.updated_to_, BuildConfig.VERSION_NAME))
setSmallIcon(R.drawable.ic_tachij2k_notification)
setAutoCancel(true)
setOngoing(false)
@@ -192,6 +204,11 @@ internal class AppUpdateNotifier(private val context: Context) {
)
setContentIntent(pendingIntent)
clearActions()
+ addAction(
+ R.drawable.ic_system_update_24dp,
+ context.getString(R.string.open),
+ pendingIntent,
+ )
addReleasePageAction()
show(Notifications.ID_INSTALLED)
}
@@ -258,4 +275,8 @@ internal class AppUpdateNotifier(private val context: Context) {
fun cancel() {
NotificationReceiver.dismissNotification(context, Notifications.ID_UPDATER)
}
+
+ fun cancelInstallNotification() {
+ NotificationReceiver.dismissNotification(context, Notifications.ID_INSTALL)
+ }
}
diff --git a/app/src/main/java/eu/kanade/tachiyomi/data/updater/AppUpdateService.kt b/app/src/main/java/eu/kanade/tachiyomi/data/updater/AppUpdateService.kt
index 2748d98200..db8eb349b6 100644
--- a/app/src/main/java/eu/kanade/tachiyomi/data/updater/AppUpdateService.kt
+++ b/app/src/main/java/eu/kanade/tachiyomi/data/updater/AppUpdateService.kt
@@ -200,6 +200,7 @@ class AppUpdateService : Service() {
val pendingIntent = PendingIntent.getBroadcast(this, -10053, newIntent, PendingIntent.FLAG_UPDATE_CURRENT or PendingIntent.FLAG_MUTABLE)
val statusReceiver = pendingIntent.intentSender
session.commit(statusReceiver)
+ notifier.onInstalling()
data.close()
val hasNotification by lazy {
@@ -210,6 +211,7 @@ class AppUpdateService : Service() {
// If the package manager crashes for whatever reason (china phone) set a timeout
// and let the user manually install
if (packageInstaller.getSessionInfo(sessionId) == null && !hasNotification) {
+ notifier.cancelInstallNotification()
notifier.onDownloadFinished(file.getUriCompat(this@AppUpdateService))
PreferenceManager.getDefaultSharedPreferences(this@AppUpdateService).edit {
remove(NOTIFY_ON_INSTALL_KEY)
@@ -220,6 +222,7 @@ class AppUpdateService : Service() {
// Either install package can't be found (probably bots) or there's a security exception
// with the download manager. Nothing we can workaround.
toast(error.message)
+ notifier.cancelInstallNotification()
notifier.onDownloadFinished(file.getUriCompat(this))
PreferenceManager.getDefaultSharedPreferences(this).edit {
remove(NOTIFY_ON_INSTALL_KEY)
diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml
index b7eec781d6..6ab4a15c77 100644
--- a/app/src/main/res/values/strings.xml
+++ b/app/src/main/res/values/strings.xml
@@ -727,6 +727,7 @@
System default
Date format
Check for updates
+ App updates
Updated to v%1$s
Secure screen
Secure screen hides app contents when switching apps and block screenshots
@@ -1131,6 +1132,7 @@
No animation
Normal
Oldest
+ Open
Open in app
Open in browser
Open log