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 22 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}