nordiccalendar

A simple Material 3 native calendar app fitting my personal requirements
git clone git://archive.git.mtrnord.blog/MTRNord/nordiccalendar.git
Log | Files | Refs | README | LICENSE

commit 83aea35e6110655d42e7bb57670d9e9aedef5a69
parent 554039f55ad7f844d041bbb4b45739ec6f168459
Author: MTRNord <MTRNord@users.noreply.github.com>
Date:   Fri,  1 Aug 2025 21:12:45 +0200

Ensure things are translatable

Diffstat:
Mapp/src/main/java/space/midnightthoughts/nordiccalendar/MainActivity.kt | 4+++-
Mapp/src/main/java/space/midnightthoughts/nordiccalendar/notifications/NotificationHelper.kt | 101+++++++++++++++++++++++++++++++++++++------------------------------------------
Mapp/src/main/java/space/midnightthoughts/nordiccalendar/notifications/NotificationReceiver.kt | 4+++-
Mapp/src/main/res/values-en/strings.xml | 8+++++++-
Mapp/src/main/res/values/strings.xml | 8+++++++-
5 files changed, 67 insertions(+), 58 deletions(-)

diff --git a/app/src/main/java/space/midnightthoughts/nordiccalendar/MainActivity.kt b/app/src/main/java/space/midnightthoughts/nordiccalendar/MainActivity.kt @@ -294,7 +294,9 @@ fun IntroScreen(navController: NavHostController, onFinish: (() -> Unit)? = null if (pagerState.currentPage < pagerState.pageCount - 1 || (pagerState.currentPage == pagerState.pageCount - 1 && hasPermissions.value)) Text( - text = if (pagerState.currentPage == pagerState.pageCount - 1) "Finish" else "Next", + text = if (pagerState.currentPage == pagerState.pageCount - 1) stringResource( + R.string.onboarding_finish + ) else stringResource(R.string.onboarding_next), style = TextStyle( fontSize = 14.sp, fontWeight = FontWeight.Normal, diff --git a/app/src/main/java/space/midnightthoughts/nordiccalendar/notifications/NotificationHelper.kt b/app/src/main/java/space/midnightthoughts/nordiccalendar/notifications/NotificationHelper.kt @@ -27,16 +27,6 @@ object NotificationHelper { private const val CHANNEL_ID = "calendar_event_reminders" /** - * Notification channel name (displayed to the user). - */ - private const val CHANNEL_NAME = "Calendar Reminders" - - /** - * Notification channel description (displayed to the user). - */ - private const val CHANNEL_DESC = "Notifications for calendar events with reminders" - - /** * Shows a notification for a calendar event reminder. * * @param context The application context. @@ -94,51 +84,55 @@ object NotificationHelper { startCal.get(java.util.Calendar.DAY_OF_YEAR) == endCal.get(java.util.Calendar.DAY_OF_YEAR) val timeFormat = android.text.format.DateFormat.getTimeFormat(context) val dateFormat = android.text.format.DateFormat.getDateFormat(context) - val timeText = if (sameDay) { - "${timeFormat.format(startCal.time)} — ${timeFormat.format(endCal.time)} $eventDescription" - } else { - "${dateFormat.format(startCal.time)} ${timeFormat.format(startCal.time)} — ${ - dateFormat.format( - endCal.time - ) - } ${timeFormat.format(endCal.time)} $eventDescription" - } val builder = NotificationCompat.Builder(context, CHANNEL_ID) .setSmallIcon(R.drawable.outline_calendar_clock_24) - .setContentTitle(eventTitle) - .setContentText(timeText) - .setPriority(NotificationCompat.PRIORITY_HIGH) + .setContentTitle(eventTitle.ifEmpty { context.getString(R.string.notification_default_title) }) + .setContentText( + if (sameDay) { + "${timeFormat.format(startCal.time)} — ${timeFormat.format(endCal.time)} $eventDescription" + } else { + "${dateFormat.format(startCal.time)} ${timeFormat.format(startCal.time)} — ${ + dateFormat.format(endCal.time) + } ${timeFormat.format(endCal.time)} $eventDescription" + } + ) .setContentIntent(pendingIntent) - .setCategory(CATEGORY_EVENT) .setAutoCancel(true) - .setVisibility(NotificationCompat.VISIBILITY_PUBLIC) - .setColor(ContextCompat.getColor(context, R.color.teal_700)) - // Action for link or address - val location = eventLocation - if (android.util.Patterns.WEB_URL.matcher(location).matches()) { - val linkIntent = Intent(Intent.ACTION_VIEW, location.toUri()) - val linkPendingIntent = PendingIntent.getActivity( - context, - (eventId + 1000).toInt(), - linkIntent, - PendingIntent.FLAG_UPDATE_CURRENT or PendingIntent.FLAG_IMMUTABLE - ) - builder.addAction(0, "Open", linkPendingIntent) - } else if (location.isNotBlank()) { - val mapsIntent = Intent( - Intent.ACTION_VIEW, - ("geo:0,0?q=" + java.net.URLEncoder.encode( - location, - "UTF-8" - )).toUri() - ) - val mapsPendingIntent = PendingIntent.getActivity( - context, - (eventId + 2000).toInt(), - mapsIntent, - PendingIntent.FLAG_UPDATE_CURRENT or PendingIntent.FLAG_IMMUTABLE + .setCategory(CATEGORY_EVENT) + .setPriority(NotificationCompat.PRIORITY_DEFAULT) + + if (eventLocation.isNotBlank()) { + try { + val mapsIntent = Intent(Intent.ACTION_VIEW, "geo:0,0?q=${eventLocation}".toUri()) + val mapsPendingIntent = PendingIntent.getActivity( + context, + (eventId + 1000).toInt(), + mapsIntent, + PendingIntent.FLAG_UPDATE_CURRENT or PendingIntent.FLAG_IMMUTABLE + ) + builder.addAction( + 0, + context.getString(R.string.notification_action_open), + pendingIntent + ) + builder.addAction( + 0, + context.getString(R.string.notification_action_show_route), + mapsPendingIntent + ) + } catch (e: Exception) { + builder.addAction( + 0, + context.getString(R.string.notification_action_open), + pendingIntent + ) + } + } else { + builder.addAction( + 0, + context.getString(R.string.notification_action_open), + pendingIntent ) - builder.addAction(0, "Show route", mapsPendingIntent) } try { @@ -148,7 +142,6 @@ object NotificationHelper { } } catch (e: SecurityException) { Log.e("NotificationHelper", "SecurityException: ${e.message}") - e.printStackTrace() } } @@ -156,10 +149,10 @@ object NotificationHelper { Log.d("NotificationHelper", "Creating notification channel: $CHANNEL_ID") val channel = NotificationChannel( CHANNEL_ID, - CHANNEL_NAME, - NotificationManager.IMPORTANCE_HIGH + context.getString(R.string.notification_channel_name), + NotificationManager.IMPORTANCE_DEFAULT ).apply { - description = CHANNEL_DESC + description = context.getString(R.string.notification_channel_desc) } val notificationManager: NotificationManager = context.getSystemService(Context.NOTIFICATION_SERVICE) as NotificationManager diff --git a/app/src/main/java/space/midnightthoughts/nordiccalendar/notifications/NotificationReceiver.kt b/app/src/main/java/space/midnightthoughts/nordiccalendar/notifications/NotificationReceiver.kt @@ -4,6 +4,7 @@ import android.content.BroadcastReceiver import android.content.Context import android.content.Intent import android.util.Log +import space.midnightthoughts.nordiccalendar.R /** * NotificationReceiver is a BroadcastReceiver that receives alarm broadcasts for calendar event reminders @@ -19,7 +20,8 @@ class NotificationReceiver : BroadcastReceiver() { */ override fun onReceive(context: Context, intent: Intent) { val eventId = intent.getLongExtra("eventId", -1) - val eventTitle = intent.getStringExtra("eventTitle") ?: "Calendar event" + val eventTitle = intent.getStringExtra("eventTitle") + ?: context.getString(R.string.notification_default_title) val eventDescription = intent.getStringExtra("eventDescription") val eventTime = intent.getLongExtra("eventTime", 0L) val eventEndTime = intent.getLongExtra("eventEndTime", 0L) diff --git a/app/src/main/res/values-en/strings.xml b/app/src/main/res/values-en/strings.xml @@ -42,5 +42,11 @@ <string name="nominatim_url_label">OpenStreetMap Nominatim URL</string> <string name="save">Save</string> <string name="event_duration">Duration: %1$s</string> -</resources> + <!-- Notification strings --> + <string name="notification_channel_name">Calendar Reminders</string> + <string name="notification_channel_desc">Notifications for calendar events with reminders</string> + <string name="notification_default_title">Calendar event</string> + <string name="notification_action_open">Open</string> + <string name="notification_action_show_route">Show route</string> +</resources> diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml @@ -42,5 +42,11 @@ <string name="nominatim_url_label">OpenStreetMap Nominatim URL</string> <string name="save">Speichern</string> <string name="event_duration">Dauer: %1$s</string> -</resources> + <!-- Notification strings --> + <string name="notification_channel_name">Kalender-Erinnerungen</string> + <string name="notification_channel_desc">Benachrichtigungen für Kalender-Events mit Erinnerungen</string> + <string name="notification_default_title">Kalender-Event</string> + <string name="notification_action_open">Öffnen</string> + <string name="notification_action_show_route">Route anzeigen</string> +</resources>