From eea6c96e8e4222f3b15eb404cb28bb7bc2a93199 Mon Sep 17 00:00:00 2001 From: Brandon Presley Date: Sat, 17 Feb 2024 19:01:43 +1300 Subject: [PATCH] Make separate channel for finished notifications Still aren't showing on lock screen, or waking the device sadly. Ive got to finish reading https://github.com/giorgosneokleous93/fullscreenintentexample/tree/main/app/src/main/java/com/giorgosneokleous/fullscreenintentexample --- .../src/main/java/com/massive/TimerDone.kt | 3 +- .../src/main/java/com/massive/TimerService.kt | 64 +++++++++++++------ 2 files changed, 48 insertions(+), 19 deletions(-) diff --git a/android/app/src/main/java/com/massive/TimerDone.kt b/android/app/src/main/java/com/massive/TimerDone.kt index e0cbe1b..dc735b7 100644 --- a/android/app/src/main/java/com/massive/TimerDone.kt +++ b/android/app/src/main/java/com/massive/TimerDone.kt @@ -13,6 +13,7 @@ class TimerDone : AppCompatActivity() { override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) setContentView(R.layout.activity_timer_done) + Log.d("TimerDone", "Rendered.") } @RequiresApi(Build.VERSION_CODES.O) @@ -21,7 +22,7 @@ class TimerDone : AppCompatActivity() { Log.d("TimerDone", "Stopping...") applicationContext.stopService(Intent(applicationContext, TimerService::class.java)) val manager = NotificationManagerCompat.from(this) - manager.cancel(TimerService.CHANNEL_ID) + manager.cancel(TimerService.ONGOING_ID) val intent = Intent(applicationContext, MainActivity::class.java) intent.flags = Intent.FLAG_ACTIVITY_NEW_TASK applicationContext.startActivity(intent) diff --git a/android/app/src/main/java/com/massive/TimerService.kt b/android/app/src/main/java/com/massive/TimerService.kt index 44ace93..246f778 100644 --- a/android/app/src/main/java/com/massive/TimerService.kt +++ b/android/app/src/main/java/com/massive/TimerService.kt @@ -74,7 +74,8 @@ class TimerService : Service() { secondsLeft = (intent?.getIntExtra("milliseconds", 0) ?: 0) / 1000 currentDescription = intent?.getStringExtra("description").toString() secondsTotal = secondsLeft - startForeground(CHANNEL_ID, getProgress(secondsLeft).build()) + startForeground(ONGOING_ID, getProgress(secondsLeft).build()) + battery() Log.d("TimerService", "onStartCommand seconds=$secondsLeft") timerRunnable = object : Runnable { @@ -173,8 +174,8 @@ class TimerService : Service() { private fun getProgress(timeLeftInSeconds: Int): NotificationCompat.Builder { val notificationText = formatTime(timeLeftInSeconds) val notificationChannelId = "timer_channel" - val notificationIntent = Intent(this, TimerService::class.java) - val pendingIntent = PendingIntent.getActivity( + val notificationIntent = Intent(this, MainActivity::class.java) + val contentPending = PendingIntent.getActivity( this, 0, notificationIntent, @@ -182,7 +183,7 @@ class TimerService : Service() { ) val stopBroadcast = Intent(STOP_BROADCAST) stopBroadcast.setPackage(applicationContext.packageName) - val pendingStop = + val stopPending = PendingIntent.getBroadcast( applicationContext, 0, @@ -191,7 +192,7 @@ class TimerService : Service() { ) val addBroadcast = Intent(ADD_BROADCAST).apply { setPackage(applicationContext.packageName) } - val pendingAdd = + val addPending = PendingIntent.getBroadcast( applicationContext, 0, @@ -204,15 +205,15 @@ class TimerService : Service() { .setContentText(notificationText) .setSmallIcon(R.drawable.ic_baseline_timer_24) .setProgress(secondsTotal, timeLeftInSeconds, false) - .setContentIntent(pendingIntent) + .setContentIntent(contentPending) .setCategory(NotificationCompat.CATEGORY_PROGRESS) .setAutoCancel(false) .setVisibility(NotificationCompat.VISIBILITY_PUBLIC) .setPriority(NotificationCompat.PRIORITY_LOW) .setOngoing(true) - .setDeleteIntent(pendingStop) - .addAction(R.drawable.ic_baseline_stop_24, "Stop", pendingStop) - .addAction(R.drawable.ic_baseline_stop_24, "Add 1 min", pendingAdd) + .setDeleteIntent(stopPending) + .addAction(R.drawable.ic_baseline_stop_24, "Stop", stopPending) + .addAction(R.drawable.ic_baseline_stop_24, "Add 1 min", addPending) val notificationManager = NotificationManagerCompat.from(this) if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) { @@ -246,23 +247,49 @@ class TimerService : Service() { } private fun notifyFinished() { - val builder = getProgress(0) + val channelId = "finished_channel" + val notificationManager = NotificationManagerCompat.from(this) + if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) { + val channel = + NotificationChannel(channelId, "Timer Finished Channel", NotificationManager.IMPORTANCE_HIGH) + channel.setSound(null, null) + channel.setBypassDnd(true) + channel.enableVibration(false) + channel.description = "Plays an alarm when a rest timer completes." + channel.lockscreenVisibility = Notification.VISIBILITY_PUBLIC + notificationManager.createNotificationChannel(channel) + } + val fullIntent = Intent(applicationContext, TimerDone::class.java) val fullPending = PendingIntent.getActivity( - applicationContext, 0, fullIntent, PendingIntent.FLAG_IMMUTABLE + applicationContext, 0, fullIntent, PendingIntent.FLAG_MUTABLE ) val finishIntent = Intent(applicationContext, StopAlarm::class.java) val finishPending = PendingIntent.getActivity( applicationContext, 0, finishIntent, PendingIntent.FLAG_IMMUTABLE ) - builder.setPriority(NotificationCompat.PRIORITY_HIGH) + val stopBroadcast = Intent(STOP_BROADCAST) + stopBroadcast.setPackage(applicationContext.packageName) + val pendingStop = + PendingIntent.getBroadcast( + applicationContext, + 0, + stopBroadcast, + PendingIntent.FLAG_IMMUTABLE + ) + + val builder = NotificationCompat.Builder(this, channelId) + .setContentTitle("Timer finished") + .setContentText(currentDescription) + .setSmallIcon(R.drawable.ic_baseline_timer_24) + .setPriority(NotificationCompat.PRIORITY_HIGH) .setCategory(NotificationCompat.CATEGORY_ALARM) .setVisibility(NotificationCompat.VISIBILITY_PUBLIC) .setContentIntent(finishPending) .setFullScreenIntent(fullPending, true) - .setOngoing(false) - .setProgress(0, 0, false) - val notificationManager = NotificationManagerCompat.from(this) + .setAutoCancel(true) + .setDeleteIntent(pendingStop) + if (ActivityCompat.checkSelfPermission( this, Manifest.permission.POST_NOTIFICATIONS @@ -270,7 +297,7 @@ class TimerService : Service() { ) { return } - notificationManager.notify(CHANNEL_ID, builder.build()) + notificationManager.notify(FINISHED_ID, builder.build()) } private fun updateNotification(seconds: Int) { @@ -283,7 +310,7 @@ class TimerService : Service() { ) { return } - notificationManager.notify(CHANNEL_ID, notification.build()) + notificationManager.notify(ONGOING_ID, notification.build()) } private fun formatTime(timeInSeconds: Int): String { @@ -295,6 +322,7 @@ class TimerService : Service() { companion object { const val STOP_BROADCAST = "stop-timer-event" const val ADD_BROADCAST = "add-timer-event" - const val CHANNEL_ID = 1 + const val ONGOING_ID = 1 + const val FINISHED_ID = 1 } }