11package top.uwu.mikubox.profile
22
3+ import android.Manifest
34import android.app.NotificationChannel
45import android.app.NotificationManager
56import android.content.Context
7+ import android.content.pm.PackageManager
68import android.os.Build
79import androidx.core.app.NotificationCompat
810import androidx.core.app.NotificationManagerCompat
11+ import androidx.core.content.ContextCompat
912import androidx.work.CoroutineWorker
1013import androidx.work.ExistingPeriodicWorkPolicy
1114import 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