From 191a04a68b289b7e9228a733ee84d4fecfe73756 Mon Sep 17 00:00:00 2001 From: Song <168455@qq.com> Date: Fri, 10 Jul 2026 13:23:05 +0800 Subject: [PATCH] feat: brand logos for Bark/ntfy channel marks + icons for email/SMS MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - Bark: official logo from Finb/Bark repo (ic_bark_logo.png) - ntfy: official logo from binwiederhier/ntfy repo (ic_ntfy_logo.png) - Meow: Material Pets icon (paw) — no official logo found - Email: Material Email icon - SMS: Material Sms icon - ChannelMark now supports both ImageVector and Painter (PNG logo) - SectionCard gains optional titleIcon parameter - version 1.8.9 -> 1.8.10 (code 26 -> 27) Co-Authored-By: Claude Opus 4.8 (1M context) --- app/build.gradle.kts | 4 +- .../java/com/a2i/forwarder/ui/Components.kt | 39 ++++++++++++------ .../forwarder/ui/screens/SettingsScreen.kt | 34 +++++++++++---- app/src/main/res/drawable/ic_bark_logo.png | Bin 0 -> 7260 bytes app/src/main/res/drawable/ic_ntfy_logo.png | Bin 0 -> 6633 bytes 5 files changed, 54 insertions(+), 23 deletions(-) create mode 100644 app/src/main/res/drawable/ic_bark_logo.png create mode 100644 app/src/main/res/drawable/ic_ntfy_logo.png diff --git a/app/build.gradle.kts b/app/build.gradle.kts index 27caee4..5b16a55 100644 --- a/app/build.gradle.kts +++ b/app/build.gradle.kts @@ -13,8 +13,8 @@ android { applicationId = "com.a2i.forwarder" minSdk = 34 targetSdk = 36 - versionCode = 26 - versionName = "1.8.9" + versionCode = 27 + versionName = "1.8.10" } signingConfigs { diff --git a/app/src/main/java/com/a2i/forwarder/ui/Components.kt b/app/src/main/java/com/a2i/forwarder/ui/Components.kt index 941267f..9b47f7c 100644 --- a/app/src/main/java/com/a2i/forwarder/ui/Components.kt +++ b/app/src/main/java/com/a2i/forwarder/ui/Components.kt @@ -7,6 +7,7 @@ import android.graphics.drawable.BitmapDrawable import android.graphics.drawable.Drawable import androidx.compose.foundation.BorderStroke import androidx.compose.foundation.background +import androidx.compose.foundation.Image import androidx.compose.foundation.clickable import androidx.compose.foundation.layout.Box import androidx.compose.foundation.layout.Column @@ -68,6 +69,8 @@ fun SectionCard( title: String? = null, modifier: Modifier = Modifier, subtitle: String? = null, + titleIcon: ImageVector? = null, + titleIconTint: Color = MaterialTheme.colorScheme.primary, headerAction: (@Composable () -> Unit)? = null, content: @Composable ColumnScope.() -> Unit, ) { @@ -81,12 +84,18 @@ fun SectionCard( Column(Modifier.padding(16.dp)) { if (title != null) { if (headerAction == null) { - Text( - title, - style = MaterialTheme.typography.titleMedium, - fontWeight = FontWeight.SemiBold, - modifier = Modifier.padding(bottom = if (subtitle == null) 10.dp else 2.dp), - ) + Row(verticalAlignment = Alignment.CenterVertically) { + if (titleIcon != null) { + Icon(titleIcon, null, tint = titleIconTint, modifier = Modifier.size(22.dp)) + Spacer(Modifier.width(8.dp)) + } + Text( + title, + style = MaterialTheme.typography.titleMedium, + fontWeight = FontWeight.SemiBold, + modifier = Modifier.padding(bottom = if (subtitle == null) 10.dp else 2.dp), + ) + } if (subtitle != null) { Text( subtitle, @@ -103,12 +112,18 @@ fun SectionCard( verticalAlignment = Alignment.Top, ) { Column(Modifier.weight(1f)) { - Text( - title, - style = MaterialTheme.typography.titleMedium, - fontWeight = FontWeight.SemiBold, - modifier = Modifier.padding(bottom = if (subtitle == null) 0.dp else 2.dp), - ) + Row(verticalAlignment = Alignment.CenterVertically) { + if (titleIcon != null) { + Icon(titleIcon, null, tint = titleIconTint, modifier = Modifier.size(22.dp)) + Spacer(Modifier.width(8.dp)) + } + Text( + title, + style = MaterialTheme.typography.titleMedium, + fontWeight = FontWeight.SemiBold, + modifier = Modifier.padding(bottom = if (subtitle == null) 0.dp else 2.dp), + ) + } if (subtitle != null) { Text( subtitle, diff --git a/app/src/main/java/com/a2i/forwarder/ui/screens/SettingsScreen.kt b/app/src/main/java/com/a2i/forwarder/ui/screens/SettingsScreen.kt index 9369f7f..e6dc1ba 100644 --- a/app/src/main/java/com/a2i/forwarder/ui/screens/SettingsScreen.kt +++ b/app/src/main/java/com/a2i/forwarder/ui/screens/SettingsScreen.kt @@ -6,6 +6,7 @@ import android.net.Uri import androidx.activity.compose.rememberLauncherForActivityResult import androidx.activity.result.contract.ActivityResultContracts import androidx.compose.foundation.BorderStroke +import androidx.compose.foundation.Image import androidx.compose.foundation.clickable import androidx.compose.foundation.rememberScrollState import androidx.compose.foundation.verticalScroll @@ -26,11 +27,15 @@ import androidx.compose.material.icons.automirrored.filled.Send import androidx.compose.material.icons.filled.Add import androidx.compose.material.icons.filled.Delete import androidx.compose.material.icons.filled.Edit +import androidx.compose.material.icons.filled.Email import androidx.compose.material.icons.filled.History import androidx.compose.material.icons.filled.Info import androidx.compose.material.icons.filled.KeyboardArrowDown import androidx.compose.material.icons.filled.KeyboardArrowUp +import androidx.compose.material.icons.filled.Notifications +import androidx.compose.material.icons.filled.Pets import androidx.compose.material.icons.filled.RestartAlt +import androidx.compose.material.icons.filled.Sms import androidx.compose.material.icons.filled.Settings import androidx.compose.material.icons.filled.SystemUpdateAlt import androidx.compose.material.icons.filled.Update @@ -57,12 +62,16 @@ import androidx.compose.ui.Alignment import androidx.compose.ui.Modifier import androidx.compose.ui.platform.LocalContext import androidx.compose.ui.graphics.Color +import androidx.compose.ui.graphics.painter.Painter +import androidx.compose.ui.graphics.vector.ImageVector import androidx.compose.ui.platform.LocalUriHandler +import androidx.compose.ui.res.painterResource import androidx.compose.ui.text.font.FontWeight import androidx.compose.ui.text.style.TextOverflow import androidx.compose.ui.unit.dp import androidx.documentfile.provider.DocumentFile import com.a2i.forwarder.A2iApp +import com.a2i.forwarder.R import com.a2i.forwarder.core.BarkClient import com.a2i.forwarder.core.EmailSender import com.a2i.forwarder.core.IconExporter @@ -167,6 +176,7 @@ fun SettingsScreen(onOpenLog: () -> Unit) { summary = "iPhone / iPad 推送目标", mark = "B", markColor = Color(0xFFFF9800), + markLogo = painterResource(R.drawable.ic_bark_logo), platforms = listOf("iOS"), stopFirst = barkStopFirst, onStopFirstChange = { v -> app.appScope.launch { app.settings.setBarkStopOnFirst(v) } }, @@ -199,6 +209,7 @@ fun SettingsScreen(onOpenLog: () -> Unit) { summary = "Android / iOS topic 推送", mark = "n", markColor = Color(0xFF43A047), + markLogo = painterResource(R.drawable.ic_ntfy_logo), platforms = listOf("Android", "iOS"), stopFirst = ntfyStopFirst, onStopFirstChange = { v -> app.appScope.launch { app.settings.setNtfyStopOnFirst(v) } }, @@ -234,6 +245,7 @@ fun SettingsScreen(onOpenLog: () -> Unit) { summary = "鸿蒙手机推送目标", mark = "M", markColor = Color(0xFF7E57C2), + markIcon = Icons.Filled.Pets, platforms = listOf("HarmonyOS"), stopFirst = meowStopFirst, onStopFirstChange = { v -> app.appScope.launch { app.settings.setMeowStopOnFirst(v) } }, @@ -269,6 +281,7 @@ fun SettingsScreen(onOpenLog: () -> Unit) { summary = "SMTP 邮箱推送目标", mark = "@", markColor = Color(0xFF1976D2), + markIcon = Icons.Filled.Email, platforms = listOf("Email"), stopFirst = emailStopFirst, onStopFirstChange = { v -> app.appScope.launch { app.settings.setEmailStopOnFirst(v) } }, @@ -302,6 +315,7 @@ fun SettingsScreen(onOpenLog: () -> Unit) { summary = "无网络时发送关键通知", mark = "S", markColor = Color(0xFF00897B), + markIcon = Icons.Filled.Sms, platforms = listOf("SMS"), stopFirst = smsStopFirst, onStopFirstChange = { v -> app.appScope.launch { app.settings.setSmsStopOnFirst(v) } }, @@ -421,6 +435,8 @@ private fun ChannelSectionHeader( summary: String, mark: String, markColor: Color, + markIcon: ImageVector? = null, + markLogo: Painter? = null, platforms: List, stopFirst: Boolean, onStopFirstChange: (Boolean) -> Unit, @@ -435,7 +451,7 @@ private fun ChannelSectionHeader( modifier = Modifier.fillMaxWidth(), verticalAlignment = Alignment.CenterVertically, ) { - ChannelMark(mark = mark, tint = markColor) + ChannelMark(mark = mark, tint = markColor, icon = markIcon, logoPainter = markLogo) Spacer(Modifier.width(10.dp)) Row( modifier = Modifier.weight(1f), @@ -492,7 +508,7 @@ private fun ChannelSectionHeader( } @Composable -private fun ChannelMark(mark: String, tint: Color) { +private fun ChannelMark(mark: String, tint: Color, icon: ImageVector? = null, logoPainter: Painter? = null) { Surface( modifier = Modifier.size(36.dp), shape = RoundedCornerShape(10.dp), @@ -504,13 +520,13 @@ private fun ChannelMark(mark: String, tint: Color) { horizontalArrangement = Arrangement.Center, verticalAlignment = Alignment.CenterVertically, ) { - Text( - mark, - style = MaterialTheme.typography.titleSmall, - fontWeight = FontWeight.Bold, - color = tint, - maxLines = 1, - ) + if (logoPainter != null) { + Image(logoPainter, null, modifier = Modifier.size(24.dp)) + } else if (icon != null) { + Icon(icon, null, tint = tint, modifier = Modifier.size(20.dp)) + } else { + Text(mark, style = MaterialTheme.typography.titleSmall, fontWeight = FontWeight.Bold, color = tint, maxLines = 1) + } } } } diff --git a/app/src/main/res/drawable/ic_bark_logo.png b/app/src/main/res/drawable/ic_bark_logo.png new file mode 100644 index 0000000000000000000000000000000000000000..eba752a83d60091f600d90812fb4801b88620149 GIT binary patch literal 7260 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 HyRrWRHTY%v literal 0 HcmV?d00001 diff --git a/app/src/main/res/drawable/ic_ntfy_logo.png b/app/src/main/res/drawable/ic_ntfy_logo.png new file mode 100644 index 0000000000000000000000000000000000000000..05c6fd88532ae8ccad3a94f064349141d826f1f2 GIT binary patch literal 6633 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 literal 0 HcmV?d00001