2022-07-05 03:33:42 +00:00
|
|
|
package com.massive
|
|
|
|
|
2022-09-08 10:11:48 +00:00
|
|
|
import android.annotation.SuppressLint
|
2022-08-22 06:31:47 +00:00
|
|
|
import android.app.*
|
|
|
|
import android.app.NotificationManager.IMPORTANCE_HIGH
|
|
|
|
import android.app.NotificationManager.IMPORTANCE_LOW
|
2022-07-16 04:12:28 +00:00
|
|
|
import android.content.Context
|
2022-07-05 03:33:42 +00:00
|
|
|
import android.content.Intent
|
2022-09-08 10:11:48 +00:00
|
|
|
import android.net.Uri
|
2022-07-05 03:33:42 +00:00
|
|
|
import android.os.Build
|
|
|
|
import android.os.CountDownTimer
|
|
|
|
import android.os.IBinder
|
|
|
|
import android.util.Log
|
|
|
|
import androidx.annotation.RequiresApi
|
2022-07-16 04:12:28 +00:00
|
|
|
import androidx.core.app.NotificationCompat
|
|
|
|
import kotlin.math.floor
|
2022-07-05 03:33:42 +00:00
|
|
|
|
2022-09-08 10:11:48 +00:00
|
|
|
class TimerService() : Service() {
|
|
|
|
private lateinit var manager: NotificationManager
|
|
|
|
private lateinit var countdownTimer: CountDownTimer
|
|
|
|
private var endMs: Int = 0
|
|
|
|
private var currentMs: Long = 0
|
2022-08-20 04:37:59 +00:00
|
|
|
private var vibrate: Boolean = true
|
2022-08-25 08:41:01 +00:00
|
|
|
private var sound: String? = null
|
2022-07-05 03:33:42 +00:00
|
|
|
|
2022-07-16 04:12:28 +00:00
|
|
|
@RequiresApi(Build.VERSION_CODES.O)
|
2022-07-05 03:33:42 +00:00
|
|
|
override fun onStartCommand(intent: Intent?, flags: Int, startId: Int): Int {
|
2022-08-20 04:37:59 +00:00
|
|
|
vibrate = intent!!.extras!!.getBoolean("vibrate")
|
2022-08-25 08:41:01 +00:00
|
|
|
sound = intent.extras?.getString("sound")
|
2022-08-20 04:37:59 +00:00
|
|
|
if (intent.action == "add") {
|
2022-09-08 10:11:48 +00:00
|
|
|
manager.cancel(NOTIFICATION_ID_DONE)
|
|
|
|
endMs = currentMs.toInt().plus(60000)
|
2022-07-19 05:03:43 +00:00
|
|
|
applicationContext.stopService(Intent(applicationContext, AlarmService::class.java))
|
2022-08-22 06:31:47 +00:00
|
|
|
} else {
|
2022-08-20 04:37:59 +00:00
|
|
|
endMs = intent.extras!!.getInt("milliseconds")
|
2022-07-19 05:03:43 +00:00
|
|
|
}
|
2022-09-08 10:11:48 +00:00
|
|
|
Log.d("TimerService", "endMs=$endMs,currentMs=$currentMs,vibrate=$vibrate,sound=$sound")
|
2022-08-22 06:31:47 +00:00
|
|
|
manager = getManager(applicationContext)
|
2022-07-16 04:12:28 +00:00
|
|
|
val builder = getBuilder(applicationContext)
|
2022-09-08 10:11:48 +00:00
|
|
|
countdownTimer.cancel()
|
2022-08-22 06:31:47 +00:00
|
|
|
countdownTimer = getTimer(builder)
|
2022-09-08 10:11:48 +00:00
|
|
|
countdownTimer.start()
|
2022-07-05 03:33:42 +00:00
|
|
|
return super.onStartCommand(intent, flags, startId)
|
|
|
|
}
|
|
|
|
|
2022-08-22 06:31:47 +00:00
|
|
|
private fun getTimer(builder: NotificationCompat.Builder): CountDownTimer {
|
2022-09-08 10:11:48 +00:00
|
|
|
return object : CountDownTimer(endMs.toLong(), 1000) {
|
2022-08-22 06:31:47 +00:00
|
|
|
override fun onTick(current: Long) {
|
|
|
|
currentMs = current
|
|
|
|
val seconds = floor((current / 1000).toDouble() % 60)
|
|
|
|
.toInt().toString().padStart(2, '0')
|
|
|
|
val minutes = floor((current / 1000).toDouble() / 60)
|
|
|
|
.toInt().toString().padStart(2, '0')
|
|
|
|
builder.setContentText("$minutes:$seconds")
|
|
|
|
.setAutoCancel(false)
|
|
|
|
.setDefaults(0)
|
2022-09-08 10:11:48 +00:00
|
|
|
.setProgress(endMs, current.toInt(), false)
|
2022-08-22 06:31:47 +00:00
|
|
|
.setCategory(NotificationCompat.CATEGORY_PROGRESS)
|
|
|
|
.priority = NotificationCompat.PRIORITY_LOW
|
2022-09-08 10:11:48 +00:00
|
|
|
manager.notify(NOTIFICATION_ID_PENDING, builder.build())
|
2022-08-22 06:31:47 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
@RequiresApi(Build.VERSION_CODES.M)
|
|
|
|
override fun onFinish() {
|
|
|
|
val finishIntent = Intent(applicationContext, StopAlarm::class.java)
|
|
|
|
val finishPending =
|
|
|
|
PendingIntent.getActivity(
|
|
|
|
applicationContext,
|
|
|
|
0,
|
|
|
|
finishIntent,
|
|
|
|
PendingIntent.FLAG_IMMUTABLE
|
|
|
|
)
|
2022-08-30 09:42:38 +00:00
|
|
|
val stopIntent = Intent(applicationContext, StopTimer::class.java)
|
|
|
|
val pendingStop =
|
|
|
|
PendingIntent.getService(
|
|
|
|
applicationContext,
|
|
|
|
0,
|
|
|
|
stopIntent,
|
|
|
|
PendingIntent.FLAG_IMMUTABLE
|
|
|
|
)
|
2022-08-22 06:31:47 +00:00
|
|
|
builder.setContentText("Timer finished.")
|
|
|
|
.setAutoCancel(true)
|
|
|
|
.setProgress(0, 0, false)
|
|
|
|
.setOngoing(false)
|
|
|
|
.setContentIntent(finishPending)
|
|
|
|
.setChannelId(CHANNEL_ID_DONE)
|
|
|
|
.setCategory(NotificationCompat.CATEGORY_ALARM)
|
2022-08-30 09:42:38 +00:00
|
|
|
.setDeleteIntent(pendingStop)
|
2022-08-22 06:31:47 +00:00
|
|
|
.priority = NotificationCompat.PRIORITY_HIGH
|
2022-09-08 10:11:48 +00:00
|
|
|
manager.notify(NOTIFICATION_ID_DONE, builder.build())
|
|
|
|
manager.cancel(NOTIFICATION_ID_PENDING)
|
2022-08-22 06:31:47 +00:00
|
|
|
val alarmIntent = Intent(applicationContext, AlarmService::class.java)
|
|
|
|
alarmIntent.putExtra("vibrate", vibrate)
|
2022-08-25 08:41:01 +00:00
|
|
|
alarmIntent.putExtra("sound", sound)
|
2022-08-22 06:31:47 +00:00
|
|
|
applicationContext.startService(alarmIntent)
|
|
|
|
}
|
|
|
|
}
|
2022-07-19 05:03:43 +00:00
|
|
|
}
|
|
|
|
|
2022-07-05 03:33:42 +00:00
|
|
|
override fun onBind(p0: Intent?): IBinder? {
|
|
|
|
return null
|
|
|
|
}
|
|
|
|
|
|
|
|
override fun onDestroy() {
|
2022-07-06 04:27:36 +00:00
|
|
|
Log.d("TimerService", "Destroying...")
|
2022-09-08 10:11:48 +00:00
|
|
|
countdownTimer.cancel()
|
|
|
|
manager.cancel(NOTIFICATION_ID_PENDING)
|
|
|
|
manager.cancel(NOTIFICATION_ID_DONE)
|
2022-07-05 03:33:42 +00:00
|
|
|
super.onDestroy()
|
|
|
|
}
|
2022-07-16 04:12:28 +00:00
|
|
|
|
2022-09-08 10:11:48 +00:00
|
|
|
@SuppressLint("UnspecifiedImmutableFlag")
|
2022-08-22 03:51:03 +00:00
|
|
|
@RequiresApi(Build.VERSION_CODES.M)
|
2022-07-16 04:12:28 +00:00
|
|
|
private fun getBuilder(context: Context): NotificationCompat.Builder {
|
|
|
|
val contentIntent = Intent(context, MainActivity::class.java)
|
|
|
|
val pendingContent =
|
2022-08-22 03:51:03 +00:00
|
|
|
PendingIntent.getActivity(context, 0, contentIntent, PendingIntent.FLAG_IMMUTABLE)
|
2022-07-19 05:03:43 +00:00
|
|
|
val stopIntent = Intent(context, StopTimer::class.java)
|
|
|
|
val pendingStop =
|
2022-08-22 03:51:03 +00:00
|
|
|
PendingIntent.getService(context, 0, stopIntent, PendingIntent.FLAG_IMMUTABLE)
|
2022-07-19 05:03:43 +00:00
|
|
|
val addIntent = Intent(context, TimerService::class.java)
|
|
|
|
addIntent.action = "add"
|
2022-08-22 03:48:53 +00:00
|
|
|
addIntent.putExtra("vibrate", vibrate)
|
2022-09-08 10:11:48 +00:00
|
|
|
addIntent.putExtra("sound", sound)
|
|
|
|
addIntent.data = Uri.parse("$currentMs")
|
2022-08-22 03:48:53 +00:00
|
|
|
val pendingAdd = if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.S) {
|
|
|
|
PendingIntent.getService(context, 0, addIntent, PendingIntent.FLAG_MUTABLE)
|
|
|
|
} else {
|
|
|
|
PendingIntent.getService(context, 0, addIntent, PendingIntent.FLAG_UPDATE_CURRENT)
|
|
|
|
}
|
2022-08-22 06:31:47 +00:00
|
|
|
return NotificationCompat.Builder(context, CHANNEL_ID_PENDING)
|
2022-07-16 04:12:28 +00:00
|
|
|
.setSmallIcon(R.drawable.ic_baseline_hourglass_bottom_24)
|
|
|
|
.setContentTitle("Resting")
|
|
|
|
.setContentIntent(pendingContent)
|
2022-07-19 05:03:43 +00:00
|
|
|
.addAction(R.drawable.ic_baseline_stop_24, "Stop", pendingStop)
|
|
|
|
.addAction(R.drawable.ic_baseline_stop_24, "Add 1 min", pendingAdd)
|
2022-07-16 04:12:28 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
@RequiresApi(Build.VERSION_CODES.O)
|
|
|
|
private fun getManager(context: Context): NotificationManager {
|
2022-08-22 06:31:47 +00:00
|
|
|
val alarmsChannel = NotificationChannel(
|
|
|
|
CHANNEL_ID_DONE,
|
|
|
|
CHANNEL_ID_DONE,
|
|
|
|
IMPORTANCE_HIGH
|
2022-07-16 04:12:28 +00:00
|
|
|
)
|
2022-08-22 06:31:47 +00:00
|
|
|
alarmsChannel.description = "Alarms for rest timers."
|
|
|
|
alarmsChannel.lockscreenVisibility = Notification.VISIBILITY_PUBLIC
|
2022-07-16 04:12:28 +00:00
|
|
|
val notificationManager = context.getSystemService(
|
|
|
|
NotificationManager::class.java
|
|
|
|
)
|
2022-08-22 06:31:47 +00:00
|
|
|
notificationManager.createNotificationChannel(alarmsChannel)
|
|
|
|
val timersChannel =
|
|
|
|
NotificationChannel(CHANNEL_ID_PENDING, CHANNEL_ID_PENDING, IMPORTANCE_LOW)
|
|
|
|
timersChannel.description = "Progress on rest timers."
|
|
|
|
notificationManager.createNotificationChannel(timersChannel)
|
2022-07-16 04:12:28 +00:00
|
|
|
return notificationManager
|
|
|
|
}
|
|
|
|
|
|
|
|
companion object {
|
2022-08-22 06:31:47 +00:00
|
|
|
private const val CHANNEL_ID_PENDING = "MassiveTimer"
|
|
|
|
private const val CHANNEL_ID_DONE = "MassiveDone"
|
|
|
|
private const val NOTIFICATION_ID_PENDING = 1
|
|
|
|
private const val NOTIFICATION_ID_DONE = 2
|
2022-07-16 04:12:28 +00:00
|
|
|
}
|
2022-07-05 03:33:42 +00:00
|
|
|
}
|