Run timer in TimerService instead of Broadcast

This commit is contained in:
Brandon Presley 2022-07-16 16:12:28 +12:00
parent e9948a291a
commit c387ee7e61

View File

@ -1,33 +1,55 @@
package com.massive package com.massive
import android.app.NotificationChannel
import android.app.NotificationManager
import android.app.PendingIntent
import android.app.Service import android.app.Service
import android.content.Context
import android.content.Intent import android.content.Intent
import android.os.Build import android.os.Build
import android.os.CountDownTimer import android.os.CountDownTimer
import android.os.IBinder import android.os.IBinder
import android.util.Log import android.util.Log
import androidx.annotation.RequiresApi import androidx.annotation.RequiresApi
import androidx.core.app.NotificationCompat
import kotlin.math.floor
class TimerService : Service() { class TimerService : Service() {
private var countdownTimer: CountDownTimer? = null private var countdownTimer: CountDownTimer? = null
@RequiresApi(Build.VERSION_CODES.M) @RequiresApi(Build.VERSION_CODES.O)
override fun onStartCommand(intent: Intent?, flags: Int, startId: Int): Int { override fun onStartCommand(intent: Intent?, flags: Int, startId: Int): Int {
Log.d("TimerService", "Started timer service.") Log.d("TimerService", "Started timer service.")
val endMs = intent!!.extras!!.getInt("milliseconds") val endMs = intent!!.extras!!.getInt("milliseconds")
val notificationManager = getManager(applicationContext)
val builder = getBuilder(applicationContext)
countdownTimer?.cancel() countdownTimer?.cancel()
countdownTimer = object : CountDownTimer(endMs.toLong(), 1000) { countdownTimer = object : CountDownTimer(endMs.toLong(), 1000) {
override fun onTick(currentMs: Long) { override fun onTick(currentMs: Long) {
val broadcastIntent = Intent(applicationContext, TimerBroadcast::class.java) val seconds = floor((currentMs / 1000).toDouble() % 60)
broadcastIntent.putExtra("endMs", endMs) .toInt().toString().padStart(2, '0')
broadcastIntent.putExtra("currentMs", currentMs) val minutes = floor((currentMs / 1000).toDouble() / 60)
broadcastIntent.action = "tick" .toInt().toString().padStart(2, '0')
sendBroadcast(broadcastIntent) builder.setContentText("$minutes:$seconds")
.setAutoCancel(false)
.setDefaults(0)
.setProgress(endMs, currentMs.toInt(), false)
.setCategory(NotificationCompat.CATEGORY_PROGRESS)
.priority = NotificationCompat.PRIORITY_LOW
notificationManager.notify(NOTIFICATION_ID, builder.build())
} }
override fun onFinish() { override fun onFinish() {
val broadcastIntent = Intent(applicationContext, TimerBroadcast::class.java) val finishIntent = Intent(applicationContext, StopAlarm::class.java)
broadcastIntent.action = "finish" val finishPending =
sendBroadcast(broadcastIntent) PendingIntent.getActivity(applicationContext, 0, finishIntent, PendingIntent.FLAG_IMMUTABLE)
builder.setContentText("Timer finished.")
.setAutoCancel(true)
.setOngoing(false)
.setContentIntent(finishPending)
.setCategory(NotificationCompat.CATEGORY_ALARM)
.priority = NotificationCompat.PRIORITY_HIGH
notificationManager.notify(NOTIFICATION_ID, builder.build())
applicationContext.startService(Intent(applicationContext, AlarmService::class.java))
} }
} }
countdownTimer!!.start() countdownTimer!!.start()
@ -46,4 +68,39 @@ class TimerService : Service() {
sendBroadcast(broadcastIntent) sendBroadcast(broadcastIntent)
super.onDestroy() super.onDestroy()
} }
@RequiresApi(Build.VERSION_CODES.M)
private fun getBuilder(context: Context): NotificationCompat.Builder {
val contentIntent = Intent(context, MainActivity::class.java)
val pendingContent =
PendingIntent.getActivity(context, 0, contentIntent, PendingIntent.FLAG_IMMUTABLE)
val actionIntent = Intent(context, StopTimer::class.java)
val pendingAction =
PendingIntent.getService(context, 0, actionIntent, PendingIntent.FLAG_IMMUTABLE)
return NotificationCompat.Builder(context, CHANNEL_ID)
.setSmallIcon(R.drawable.ic_baseline_hourglass_bottom_24)
.setContentTitle("Resting")
.setContentIntent(pendingContent)
.addAction(R.drawable.ic_baseline_stop_24, "STOP", pendingAction)
}
@RequiresApi(Build.VERSION_CODES.O)
private fun getManager(context: Context): NotificationManager {
val importance = NotificationManager.IMPORTANCE_LOW
val channel = NotificationChannel(
CHANNEL_ID,
CHANNEL_ID, importance
)
channel.description = "Alarms for rest timings."
val notificationManager = context.getSystemService(
NotificationManager::class.java
)
notificationManager.createNotificationChannel(channel)
return notificationManager
}
companion object {
private const val CHANNEL_ID = "MassiveTimer"
private const val NOTIFICATION_ID = 1
}
} }