Skip to content

Commit

Permalink
Merge pull request #210 from SuhasDissa/main
Browse files Browse the repository at this point in the history
feat: add notification buttons to snooze and dismiss alarm
  • Loading branch information
SuhasDissa authored Nov 18, 2023
2 parents 56d37ef + e4e58a0 commit 0e51ced
Showing 1 changed file with 74 additions and 11 deletions.
85 changes: 74 additions & 11 deletions app/src/main/java/com/bnyro/clock/services/AlarmService.kt
Original file line number Diff line number Diff line change
Expand Up @@ -3,17 +3,20 @@ package com.bnyro.clock.services
import android.app.Notification
import android.app.PendingIntent
import android.app.Service
import android.content.BroadcastReceiver
import android.content.Context
import android.content.Intent
import android.content.IntentFilter
import android.media.MediaPlayer
import android.media.RingtoneManager
import android.net.Uri
import android.os.Handler
import android.os.Build
import android.os.IBinder
import android.os.Looper
import android.os.Vibrator
import android.util.Log
import androidx.core.app.NotificationCompat
import androidx.core.app.NotificationCompat.FOREGROUND_SERVICE_IMMEDIATE
import androidx.core.app.ServiceCompat
import androidx.core.net.toUri
import com.bnyro.clock.R
import com.bnyro.clock.db.DatabaseHolder
Expand All @@ -24,21 +27,45 @@ import com.bnyro.clock.util.NotificationHelper
import kotlinx.coroutines.runBlocking

class AlarmService : Service() {
private val notificationId = 5
private var isPlaying = false
private var vibrator: Vibrator? = null
private var mediaPlayer: MediaPlayer? = null
private var currentAlarm: Alarm? = null

private val handler: Handler = Handler(Looper.getMainLooper())
private val recorderReceiver = object : BroadcastReceiver() {
override fun onReceive(context: Context?, intent: Intent?) {
when (intent?.getStringExtra(ACTION_EXTRA_KEY)) {
DISMISS_ACTION -> onDestroy()
SNOOZE_ACTION -> {
AlarmHelper.snooze(this@AlarmService, currentAlarm!!)
onDestroy()
}
}
}
}

override fun onCreate() {
vibrator = getSystemService(Context.VIBRATOR_SERVICE) as Vibrator
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.TIRAMISU) {
registerReceiver(
recorderReceiver,
IntentFilter(ALARM_INTENT_ACTION),
RECEIVER_EXPORTED
)
} else {
registerReceiver(
recorderReceiver,
IntentFilter(ALARM_INTENT_ACTION)
)
}
super.onCreate()
}

override fun onDestroy() {
stop()
Log.d("Alarm Service", "Destroying service")
ServiceCompat.stopForeground(this, ServiceCompat.STOP_FOREGROUND_REMOVE)
super.onDestroy()
}

Expand All @@ -52,7 +79,7 @@ class AlarmService : Service() {
val alarm = runBlocking {
DatabaseHolder.instance.alarmsDao().findById(id)
}
startForeground(1, createNotification(this, alarm))
startForeground(notificationId, createNotification(this, alarm))
play(alarm)
currentAlarm = alarm
return START_STICKY
Expand Down Expand Up @@ -127,14 +154,50 @@ class AlarmService : Service() {
PendingIntent.FLAG_UPDATE_CURRENT or PendingIntent.FLAG_IMMUTABLE
)

val dismissIntent = Intent(ALARM_INTENT_ACTION).putExtra(ACTION_EXTRA_KEY, DISMISS_ACTION)
val dismissAction = NotificationCompat.Action.Builder(
null,
getString(R.string.dismiss),
getPendingIntent(dismissIntent, 1)
)

val snoozeIntent = Intent(ALARM_INTENT_ACTION).putExtra(ACTION_EXTRA_KEY, SNOOZE_ACTION)
val snoozeAction = NotificationCompat.Action.Builder(
null,
getString(R.string.snooze),
getPendingIntent(snoozeIntent, 2)
)

val builder = NotificationCompat.Builder(context, NotificationHelper.ALARM_CHANNEL)
.setSmallIcon(R.drawable.ic_notification)
.setContentTitle(alarm.label ?: context.getString(R.string.alarm))
.setSilent(true)
.setAutoCancel(true)
.setPriority(NotificationCompat.PRIORITY_MAX)
.setCategory(NotificationCompat.CATEGORY_ALARM)
.setFullScreenIntent(pendingIntent, true)
.apply {
setSmallIcon(R.drawable.ic_notification)
setContentTitle(alarm.label ?: context.getString(R.string.alarm))
// setSilent(true) // This setting causes the full screen intent to not work properly
setAutoCancel(true)
priority = NotificationCompat.PRIORITY_MAX
foregroundServiceBehavior = FOREGROUND_SERVICE_IMMEDIATE
setCategory(NotificationCompat.CATEGORY_ALARM)
setFullScreenIntent(pendingIntent, true)
addAction(snoozeAction.build())
addAction(dismissAction.build())
setOngoing(true)
}

return builder.build()
}

private fun getPendingIntent(intent: Intent, requestCode: Int): PendingIntent =
PendingIntent.getBroadcast(
this,
requestCode,
intent,
PendingIntent.FLAG_UPDATE_CURRENT or PendingIntent.FLAG_IMMUTABLE
)

companion object {
const val ALARM_INTENT_ACTION = "com.bnyro.clock.ALARM_ACTION"
const val ACTION_EXTRA_KEY = "action"
const val DISMISS_ACTION = "DISMISS"
const val SNOOZE_ACTION = "SNOOZE"
}
}

0 comments on commit 0e51ced

Please sign in to comment.