SyncAlertStore.kt

3.2 KB · raw

1package com.peachpasswords.sync23import android.app.Notification4import android.app.NotificationChannel5import android.app.NotificationManager6import android.app.PendingIntent7import android.content.Context8import android.content.Intent9import androidx.core.app.NotificationCompat10import com.peachpasswords.MainActivity11import com.peachpasswords.R12import dagger.hilt.android.qualifiers.ApplicationContext13import javax.inject.Inject14import javax.inject.Singleton1516@Singleton17class SyncAlertStore @Inject constructor(18    @ApplicationContext private val context: Context,19) : SyncAlertRecorder {20    init {21        // v2.7.4 and earlier persisted security banners for the vault list.22        // They are intentionally not migrated into surprise notifications.23        context.deleteSharedPreferences(LEGACY_PREFS_FILE)24    }2526    override fun record(alerts: List<SyncAlert>) {27        val content = syncSecurityNotificationContent(alerts) ?: return28        val manager =29            context.getSystemService(Context.NOTIFICATION_SERVICE) as NotificationManager30        runCatching {31            manager.notify(32                SYNC_SECURITY_NOTIFICATION_ID,33                buildSyncSecurityNotification(context, content),34            )35        }36    }3738    fun clear() {39        val manager =40            context.getSystemService(Context.NOTIFICATION_SERVICE) as NotificationManager41        manager.cancel(SYNC_SECURITY_NOTIFICATION_ID)42    }43}4445internal const val SYNC_SECURITY_NOTIFICATION_CHANNEL_ID = "peach_sync_security"46internal const val SYNC_SECURITY_NOTIFICATION_ID = 420247private const val LEGACY_PREFS_FILE = "peach_sync_alerts"4849internal fun buildSyncSecurityNotification(50    context: Context,51    content: SyncSecurityNotificationContent,52): Notification {53    val manager = context.getSystemService(Context.NOTIFICATION_SERVICE) as NotificationManager54    manager.createNotificationChannel(55        NotificationChannel(56            SYNC_SECURITY_NOTIFICATION_CHANNEL_ID,57            "Peach Sync security",58            NotificationManager.IMPORTANCE_DEFAULT,59        ).apply {60            description = "Device removals and unexpected Peach Sync key changes."61        },62    )63    val open = PendingIntent.getActivity(64        context,65        0,66        Intent(context, MainActivity::class.java),67        PendingIntent.FLAG_IMMUTABLE or PendingIntent.FLAG_UPDATE_CURRENT,68    )69    val builder = NotificationCompat.Builder(context, SYNC_SECURITY_NOTIFICATION_CHANNEL_ID)70        .setContentTitle(content.title)71        .setContentText(content.summary)72        .setSmallIcon(R.drawable.ic_launcher_monochrome)73        .setPriority(NotificationCompat.PRIORITY_DEFAULT)74        .setCategory(NotificationCompat.CATEGORY_STATUS)75        .setVisibility(NotificationCompat.VISIBILITY_PRIVATE)76        .setAutoCancel(true)77        .setContentIntent(open)7879    if (content.lines.size == 1) {80        builder.setStyle(NotificationCompat.BigTextStyle().bigText(content.summary))81    } else {82        builder.setStyle(83            NotificationCompat.InboxStyle()84                .also { style -> content.lines.takeLast(5).forEach(style::addLine) }85                .setSummaryText("${content.lines.size} device security updates"),86        )87    }8889    return builder.build()90}