From 93f2405d7dded19cd3c9add76ae58a472281548f Mon Sep 17 00:00:00 2001 From: sameerasw Date: Fri, 20 Feb 2026 09:58:05 +0530 Subject: [PATCH 1/3] fix: App crash due to no devices connected for battery notification --- .../services/BatteryNotificationService.kt | 45 +++++++++++++------ app/src/main/res/values/strings.xml | 1 + 2 files changed, 33 insertions(+), 13 deletions(-) diff --git a/app/src/main/java/com/sameerasw/essentials/services/BatteryNotificationService.kt b/app/src/main/java/com/sameerasw/essentials/services/BatteryNotificationService.kt index f2741798b..0b1d0bbfe 100644 --- a/app/src/main/java/com/sameerasw/essentials/services/BatteryNotificationService.kt +++ b/app/src/main/java/com/sameerasw/essentials/services/BatteryNotificationService.kt @@ -43,10 +43,16 @@ class BatteryNotificationService : Service() { settingsRepository = SettingsRepository(this) createNotificationChannel() settingsRepository.registerOnSharedPreferenceChangeListener(preferenceChangeListener) + + startForeground(NOTIF_ID, buildBaseNotification(getString(R.string.feat_batteries_title), "")) + updateNotification() } override fun onStartCommand(intent: Intent?, flags: Int, startId: Int): Int { + if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) { + startForeground(NOTIF_ID, buildBaseNotification(getString(R.string.feat_batteries_title), "")) + } updateNotification() return START_STICKY } @@ -77,26 +83,39 @@ class BatteryNotificationService : Service() { private fun updateNotification() { val batteryItems = fetchBatteryData() - if (batteryItems.isEmpty()) { - stopForeground(true) - stopSelf() - return + + val notification = if (batteryItems.isEmpty()) { + buildBaseNotification( + getString(R.string.feat_batteries_title), + getString(R.string.battery_notification_no_devices) + ) + } else { + val bitmap = createCompositeBitmap(batteryItems) + NotificationCompat.Builder(this, CHANNEL_ID) + .setSmallIcon(R.drawable.rounded_battery_charging_60_24) + .setLargeIcon(bitmap) + .setStyle(NotificationCompat.BigPictureStyle() + .bigPicture(bitmap) + .bigLargeIcon(null as Bitmap?)) + .setContentTitle(getString(R.string.feat_batteries_title)) + .setPriority(NotificationCompat.PRIORITY_LOW) + .setOngoing(true) + .setSilent(true) + .build() } - val bitmap = createCompositeBitmap(batteryItems) - val notification = NotificationCompat.Builder(this, CHANNEL_ID) + startForeground(NOTIF_ID, notification) + } + + private fun buildBaseNotification(title: String, content: String): Notification { + return NotificationCompat.Builder(this, CHANNEL_ID) .setSmallIcon(R.drawable.rounded_battery_charging_60_24) - .setLargeIcon(bitmap) - .setStyle(NotificationCompat.BigPictureStyle() - .bigPicture(bitmap) - .bigLargeIcon(null as Bitmap?)) - .setContentTitle(getString(R.string.feat_batteries_title)) + .setContentTitle(title) + .setContentText(content) .setPriority(NotificationCompat.PRIORITY_LOW) .setOngoing(true) .setSilent(true) .build() - - startForeground(NOTIF_ID, notification) } private fun fetchBatteryData(): List { diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index 68b0255cb..97b6fe024 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -690,6 +690,7 @@ App Updates Notifications for new app updates Update available + No devices connected Unknown 5G From 344562b73a7b715f40efa885b7425c6dae756415 Mon Sep 17 00:00:00 2001 From: sameerasw Date: Fri, 20 Feb 2026 09:58:32 +0530 Subject: [PATCH 2/3] version: Upgrade --- app/build.gradle.kts | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/app/build.gradle.kts b/app/build.gradle.kts index 223c3fc50..bea3f4cca 100644 --- a/app/build.gradle.kts +++ b/app/build.gradle.kts @@ -21,8 +21,8 @@ android { applicationId = "com.sameerasw.essentials" minSdk = 26 targetSdk = 36 - versionCode = 27 - versionName = "11.3" + versionCode = 28 + versionName = "11.4" testInstrumentationRunner = "androidx.test.runner.AndroidJUnitRunner" } From 1c50d4a198eb504f2ccac9827e3272d1264badb3 Mon Sep 17 00:00:00 2001 From: sameerasw Date: Fri, 20 Feb 2026 10:32:54 +0530 Subject: [PATCH 3/3] fix: #225 Oversized single battery notification icon --- .../essentials/services/BatteryNotificationService.kt | 11 +++++++++-- 1 file changed, 9 insertions(+), 2 deletions(-) diff --git a/app/src/main/java/com/sameerasw/essentials/services/BatteryNotificationService.kt b/app/src/main/java/com/sameerasw/essentials/services/BatteryNotificationService.kt index 0b1d0bbfe..24b2ca6a0 100644 --- a/app/src/main/java/com/sameerasw/essentials/services/BatteryNotificationService.kt +++ b/app/src/main/java/com/sameerasw/essentials/services/BatteryNotificationService.kt @@ -161,12 +161,19 @@ class BatteryNotificationService : Service() { private fun createCompositeBitmap(items: List): Bitmap { val itemSize = 256 val spacing = 48 - val totalWidth = items.size * itemSize + (items.size - 1) * spacing + + val actualContentWidth = items.size * itemSize + (items.size - 1).coerceAtLeast(0) * spacing + + val minWideItems = 3 + val minWideWidth = minWideItems * itemSize + (minWideItems - 1) * spacing + val totalWidth = actualContentWidth.coerceAtLeast(minWideWidth) val totalHeight = itemSize val composite = Bitmap.createBitmap(totalWidth, totalHeight, Bitmap.Config.ARGB_8888) val canvas = Canvas(composite) + val startX = (totalWidth - actualContentWidth) / 2f + val accentColor = if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.S) { getColor(android.R.color.system_accent1_100) } else { @@ -189,7 +196,7 @@ class BatteryNotificationService : Service() { item.statusIconRes?.let { ContextCompat.getDrawable(this, it) }, itemSize, itemSize ) - canvas.drawBitmap(itemBitmap, (index * (itemSize + spacing)).toFloat(), 0f, null) + canvas.drawBitmap(itemBitmap, startX + (index * (itemSize + spacing)).toFloat(), 0f, null) } return composite