fmassive/android/app/src/main/kotlin/com/example/fmassive/MainActivity.kt

164 lines
6.2 KiB
Kotlin
Raw Normal View History

2023-03-30 02:19:24 +00:00
package com.example.fmassive
2023-04-04 06:20:28 +00:00
import android.annotation.SuppressLint
import android.app.NotificationChannel
import android.app.NotificationManager
import android.app.PendingIntent
import android.content.BroadcastReceiver
import android.content.Context
import android.content.Intent
import android.content.IntentFilter
import android.os.Build
import android.os.CountDownTimer
import android.util.Log
import androidx.annotation.RequiresApi
import androidx.core.app.NotificationCompat
2023-03-30 02:19:24 +00:00
import io.flutter.embedding.android.FlutterActivity
2023-04-04 06:20:28 +00:00
import io.flutter.embedding.engine.FlutterEngine
import io.flutter.plugin.common.MethodChannel
import kotlin.math.floor
2023-03-30 02:19:24 +00:00
2023-04-13 03:09:36 +00:00
@RequiresApi(Build.VERSION_CODES.O)
2023-04-04 06:20:28 +00:00
class MainActivity : FlutterActivity() {
override fun configureFlutterEngine(flutterEngine: FlutterEngine) {
super.configureFlutterEngine(flutterEngine)
2023-04-11 01:14:26 +00:00
MethodChannel(flutterEngine.dartExecutor.binaryMessenger, FLUTTER_CHANNEL).setMethodCallHandler {
2023-04-04 06:20:28 +00:00
call, result ->
if (call.method == "timer") {
2023-04-05 00:16:12 +00:00
val args = call.arguments as ArrayList<*>
2023-04-11 01:14:26 +00:00
timer(args[0] as Int)
2023-04-04 06:20:28 +00:00
} else {
result.notImplemented()
}
}
}
private var countdownTimer: CountDownTimer? = null
var currentMs: Long = 0
private var running = false
private val stopReceiver = object : BroadcastReceiver() {
override fun onReceive(context: Context?, intent: Intent?) {
2023-04-11 01:14:26 +00:00
Log.d("MainActivity", "Received stop broadcast intent")
2023-04-04 06:20:28 +00:00
stop()
}
}
private val addReceiver = object : BroadcastReceiver() {
override fun onReceive(context: Context?, intent: Intent?) {
add()
}
}
init {
}
fun add() {
2023-04-11 01:14:26 +00:00
Log.d("MainActivity", "Add 1 min to alarm.")
2023-04-04 06:20:28 +00:00
countdownTimer?.cancel()
val newMs = if (running) currentMs.toInt().plus(60000) else 60000
2023-04-11 01:14:26 +00:00
countdownTimer = getTimer(newMs)
2023-04-04 06:20:28 +00:00
countdownTimer?.start()
running = true
2023-04-11 01:14:26 +00:00
val manager = getManager()
manager.cancel(AlarmService.NOTIFICATION_ID_DONE)
val intent = Intent(context, AlarmService::class.java)
context.stopService(intent)
2023-04-04 06:20:28 +00:00
}
fun stop() {
2023-04-11 01:14:26 +00:00
Log.d("MainActivity", "Stop alarm.")
2023-04-04 06:20:28 +00:00
countdownTimer?.cancel()
running = false
2023-04-11 01:14:26 +00:00
val intent = Intent(context, AlarmService::class.java)
context.stopService(intent)
val manager = getManager()
manager.cancel(AlarmService.NOTIFICATION_ID_DONE)
manager.cancel(NOTIFICATION_ID_PENDING)
2023-04-04 06:20:28 +00:00
}
2023-04-11 01:14:26 +00:00
fun timer(milliseconds: Int) {
2023-04-04 06:20:28 +00:00
context.registerReceiver(stopReceiver, IntentFilter(STOP_BROADCAST))
context.registerReceiver(addReceiver, IntentFilter(ADD_BROADCAST))
2023-04-11 01:14:26 +00:00
Log.d("MainActivity", "Queue alarm for $milliseconds delay")
val manager = getManager()
manager.cancel(AlarmService.NOTIFICATION_ID_DONE)
val intent = Intent(context, AlarmService::class.java)
context.stopService(intent)
2023-04-04 06:20:28 +00:00
countdownTimer?.cancel()
countdownTimer = getTimer(milliseconds)
countdownTimer?.start()
running = true
}
private fun getTimer(
2023-04-11 01:14:26 +00:00
endMs: Int,
2023-04-04 06:20:28 +00:00
): CountDownTimer {
val builder = getBuilder()
return object : CountDownTimer(endMs.toLong(), 1000) {
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)
.setProgress(endMs.toInt(), current.toInt(), false)
.setCategory(NotificationCompat.CATEGORY_PROGRESS).priority =
NotificationCompat.PRIORITY_LOW
val manager = getManager()
2023-04-11 01:14:26 +00:00
Log.d("MainActivity", "current=$current")
2023-04-04 06:20:28 +00:00
manager.notify(NOTIFICATION_ID_PENDING, builder.build())
}
override fun onFinish() {
2023-04-11 01:14:26 +00:00
Log.d("MainActivity", "Finish")
context.startForegroundService(Intent(context, AlarmService::class.java))
2023-04-04 06:20:28 +00:00
}
}
}
@SuppressLint("UnspecifiedImmutableFlag")
private fun getBuilder(): NotificationCompat.Builder {
val contentIntent = Intent(context, MainActivity::class.java)
val pendingContent =
PendingIntent.getActivity(context, 0, contentIntent, PendingIntent.FLAG_IMMUTABLE)
val addBroadcast = Intent(ADD_BROADCAST).apply {
setPackage(context.packageName)
}
val pendingAdd =
PendingIntent.getBroadcast(context, 0, addBroadcast, PendingIntent.FLAG_MUTABLE)
val stopBroadcast = Intent(STOP_BROADCAST)
stopBroadcast.setPackage(context.packageName)
val pendingStop =
PendingIntent.getBroadcast(context, 0, stopBroadcast, PendingIntent.FLAG_IMMUTABLE)
return NotificationCompat.Builder(context, CHANNEL_ID_PENDING)
2023-04-13 03:09:36 +00:00
.setSmallIcon(R.drawable.baseline_hourglass_bottom_24).setContentTitle("Resting")
2023-04-04 06:20:28 +00:00
.setContentIntent(pendingContent)
2023-04-13 03:09:36 +00:00
.addAction(R.drawable.baseline_hourglass_bottom_24, "Stop", pendingStop)
.addAction(R.drawable.baseline_hourglass_bottom_24, "Add 1 min", pendingAdd)
2023-04-04 06:20:28 +00:00
.setDeleteIntent(pendingStop)
}
private fun getManager(): NotificationManager {
val notificationManager = context.getSystemService(
NotificationManager::class.java
)
val timersChannel = NotificationChannel(
CHANNEL_ID_PENDING, CHANNEL_ID_PENDING, NotificationManager.IMPORTANCE_LOW
)
timersChannel.setSound(null, null)
timersChannel.description = "Progress on rest timers."
notificationManager.createNotificationChannel(timersChannel)
return notificationManager
}
companion object {
const val STOP_BROADCAST = "stop-timer-event"
const val ADD_BROADCAST = "add-timer-event"
const val CHANNEL_ID_PENDING = "Timer"
const val NOTIFICATION_ID_PENDING = 1
2023-04-11 01:14:26 +00:00
const val FLUTTER_CHANNEL = "com.massive/android"
2023-04-04 06:20:28 +00:00
}
2023-03-30 02:19:24 +00:00
}