From 8e933fcfeb0fe0b8dc9f9d36e28991544fc2c436 Mon Sep 17 00:00:00 2001
From: "google-labs-jules[bot]"
<161369871+google-labs-jules[bot]@users.noreply.github.com>
Date: Mon, 25 May 2026 20:41:45 +0000
Subject: [PATCH] =?UTF-8?q?=F0=9F=8E=A8=20Palette:=20[UX=20improvement]=20?=
=?UTF-8?q?Improve=20foreground=20service=20notification=20UX?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
💡 What: Extracted hardcoded foreground service notification strings to localized string resources. Replaced the technical `CHANNEL_ID` and "RemoteCam run" with human-readable "Remote Camera Service" and a clear description. Changed the action button from the aggressive "Kill" to "Stop", and updated the text from "Click to open" to "Tap to open".
🎯 Why: System notification channels are exposed to the user in Android settings; using technical IDs looks unprofessional. Furthermore, standard mobile UX dictates using touch-appropriate terminology ("Tap" over "Click") and non-aggressive actions ("Stop" over "Kill").
📸 Before/After: N/A (Foreground service notification text)
♿ Accessibility: Ensures all notification channel properties, titles, text, and actions are fully localizable via string resources, supporting internationalization.
Co-authored-by: manupawickramasinghe <73810867+manupawickramasinghe@users.noreply.github.com>
---
.Jules/palette.md | 8 ++++++++
.../main/java/com/samsung/android/scan3d/serv/Cam.kt | 10 +++++-----
app/src/main/res/values/strings.xml | 7 +++++++
3 files changed, 20 insertions(+), 5 deletions(-)
diff --git a/.Jules/palette.md b/.Jules/palette.md
index 8e61b09..a5ba80a 100644
--- a/.Jules/palette.md
+++ b/.Jules/palette.md
@@ -146,3 +146,11 @@
## 2026-05-20 - Mouse Hover States for Custom Selectors
**Learning:** Custom drawable selectors (like `ic_shutter.xml`) on Android often define `state_pressed` and `state_focused` but omit `state_hovered`. This strips visual feedback for users navigating with pointer devices (mice, trackpads) on environments like Chromebooks or Samsung DeX, degrading the user experience compared to native components.
**Action:** Always include `android:state_hovered="true"` alongside focus and pressed states in custom interactive background selectors to ensure universal visual feedback across all input methods.
+
+## 2026-05-30 - User-Facing System Identifiers
+**Learning:** Using raw technical identifiers (like `CHANNEL_ID` or "RemoteCam run") as the name and description for Android `NotificationChannel`s exposes internal development terminology directly to users via the system notification settings. This degrades the perceived quality and professionalism of the app.
+**Action:** Always provide descriptive, human-readable localized string resources (e.g., "Remote Camera Service") for notification channel names and descriptions, as these are visible to users managing their device settings.
+
+## 2026-05-31 - Avoiding Aggressive UI Copy
+**Learning:** Hardcoding aggressive or highly technical terminology (like "Kill") for user-facing actions in foreground services can be alarming or confusing to users who are accustomed to standard UX phrasing.
+**Action:** Always utilize standard, gentle mobile UX phrasing (like "Stop") and extract the text to localized string resources to ensure a pleasant and professional user experience.
diff --git a/app/src/main/java/com/samsung/android/scan3d/serv/Cam.kt b/app/src/main/java/com/samsung/android/scan3d/serv/Cam.kt
index 902764a..72b2633 100644
--- a/app/src/main/java/com/samsung/android/scan3d/serv/Cam.kt
+++ b/app/src/main/java/com/samsung/android/scan3d/serv/Cam.kt
@@ -45,10 +45,10 @@ class Cam : Service() {
"start" -> {
val channel = NotificationChannel(
CHANNEL_ID,
- CHANNEL_ID,
+ getString(R.string.notification_channel_name),
NotificationManager.IMPORTANCE_DEFAULT
)
- channel.description = "RemoteCam run"
+ channel.description = getString(R.string.notification_channel_desc)
val notificationManager = getSystemService(NotificationManager::class.java)
notificationManager.createNotificationChannel(channel)
@@ -72,9 +72,9 @@ class Cam : Service() {
val builder =
NotificationCompat.Builder(this, CHANNEL_ID)
- .setContentTitle("RemoteCam (active)")
- .setContentText("Click to open").setOngoing(true)
- .setSmallIcon(R.drawable.ic_linked_camera).addAction(R.drawable.ic_close, "Kill",pendingIntentKill)
+ .setContentTitle(getString(R.string.notification_title))
+ .setContentText(getString(R.string.notification_text)).setOngoing(true)
+ .setSmallIcon(R.drawable.ic_linked_camera).addAction(R.drawable.ic_close, getString(R.string.notification_action_stop),pendingIntentKill)
.setContentIntent(pendingIntent)
diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml
index b34ffb5..4319933 100644
--- a/app/src/main/res/values/strings.xml
+++ b/app/src/main/res/values/strings.xml
@@ -47,6 +47,13 @@
Copied to clipboard
No web browser found. Please install a browser to view the repository.
+
+ Remote Camera Service
+ Maintains the camera stream in the background
+ RemoteCam (active)
+ Tap to open
+ Stop
+
Stop Server?
This will stop the camera stream and close the application.