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" } 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..24b2ca6a0 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 { @@ -142,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 { @@ -170,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 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