Skip to content

Commit ff3595b

Browse files
committed
fix: guard subscription notification for Android 13+
Skip posting the subscription-update notification when POST_NOTIFICATIONS is not granted (Android 13+), instead of relying on the notify call to succeed without the runtime permission.
1 parent 7160007 commit ff3595b

1 file changed

Lines changed: 20 additions & 9 deletions

File tree

app/src/main/java/top/uwu/mikubox/profile/MihomoSubscriptionUpdater.kt

Lines changed: 20 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -1,11 +1,14 @@
11
package top.uwu.mikubox.profile
22

3+
import android.Manifest
34
import android.app.NotificationChannel
45
import android.app.NotificationManager
56
import android.content.Context
7+
import android.content.pm.PackageManager
68
import android.os.Build
79
import androidx.core.app.NotificationCompat
810
import androidx.core.app.NotificationManagerCompat
11+
import androidx.core.content.ContextCompat
912
import androidx.work.CoroutineWorker
1013
import androidx.work.ExistingPeriodicWorkPolicy
1114
import androidx.work.PeriodicWorkRequestBuilder
@@ -78,6 +81,12 @@ object MihomoSubscriptionUpdater {
7881
error(context.getString(R.string.error_subscription_http, 310))
7982
}
8083

84+
/** POST_NOTIFICATIONS is runtime-granted on Android 13+; skip posting if denied. */
85+
private fun canPostNotifications(context: Context): Boolean =
86+
Build.VERSION.SDK_INT < Build.VERSION_CODES.TIRAMISU ||
87+
ContextCompat.checkSelfPermission(context, Manifest.permission.POST_NOTIFICATIONS) ==
88+
PackageManager.PERMISSION_GRANTED
89+
8190
private fun subscriptionUserAgent(context: Context): String {
8291
val appVersion = context.packageManager
8392
.getPackageInfo(context.packageName, 0)
@@ -99,15 +108,17 @@ object MihomoSubscriptionUpdater {
99108
if (profile.updateWhenConnectedOnly && !VpnController.isRunning) return@forEach
100109
val age = System.currentTimeMillis() - profile.updatedAtMillis
101110
if (age < profile.updateIntervalMinutes.coerceAtLeast(15) * 60_000L) return@forEach
102-
NotificationManagerCompat.from(applicationContext).notify(
103-
NOTIFICATION_ID,
104-
NotificationCompat.Builder(applicationContext, CHANNEL_ID)
105-
.setSmallIcon(R.mipmap.ic_launcher)
106-
.setContentTitle(applicationContext.getString(R.string.subscription_update_title))
107-
.setContentText(profile.name)
108-
.setOngoing(true)
109-
.build(),
110-
)
111+
if (canPostNotifications(applicationContext)) {
112+
NotificationManagerCompat.from(applicationContext).notify(
113+
NOTIFICATION_ID,
114+
NotificationCompat.Builder(applicationContext, CHANNEL_ID)
115+
.setSmallIcon(R.mipmap.ic_launcher)
116+
.setContentTitle(applicationContext.getString(R.string.subscription_update_title))
117+
.setContentText(profile.name)
118+
.setOngoing(true)
119+
.build(),
120+
)
121+
}
111122
update(applicationContext, profile)
112123
}
113124
NotificationManagerCompat.from(applicationContext).cancel(NOTIFICATION_ID)

0 commit comments

Comments
 (0)