diff --git a/android/app/src/main/java/com/massive/AlarmModule.kt b/android/app/src/main/java/com/massive/AlarmModule.kt index f353afb..fa26818 100644 --- a/android/app/src/main/java/com/massive/AlarmModule.kt +++ b/android/app/src/main/java/com/massive/AlarmModule.kt @@ -3,8 +3,10 @@ package com.massive import android.annotation.SuppressLint import android.app.* import android.content.ActivityNotFoundException +import android.content.BroadcastReceiver import android.content.Context import android.content.Intent +import android.content.IntentFilter import android.net.Uri import android.os.Build import android.os.CountDownTimer @@ -14,14 +16,10 @@ import android.util.Log import android.widget.Toast import androidx.annotation.RequiresApi import androidx.core.app.NotificationCompat -import com.facebook.react.bridge.ActivityEventListener -import com.facebook.react.bridge.Arguments -import com.facebook.react.bridge.BaseActivityEventListener import com.facebook.react.bridge.Callback import com.facebook.react.bridge.ReactApplicationContext import com.facebook.react.bridge.ReactContextBaseJavaModule import com.facebook.react.bridge.ReactMethod -import com.facebook.react.modules.core.DeviceEventManagerModule.RCTDeviceEventEmitter import kotlin.math.floor @@ -34,20 +32,15 @@ class AlarmModule internal constructor(context: ReactApplicationContext?) : return "AlarmModule" } - private val mActivityEventListener: ActivityEventListener = - object : BaseActivityEventListener() { - override fun onActivityResult( - activity: Activity?, - requestCode: Int, - resultCode: Int, - data: Intent? - ) { - Log.d("AlarmModule", "onActivityResult") - } + private val broadcastReceiver = object : BroadcastReceiver() { + override fun onReceive(context: Context?, intent: Intent?) { + Toast.makeText(reactApplicationContext, "called from test receiver", Toast.LENGTH_SHORT) + .show() } + } init { - reactApplicationContext.addActivityEventListener(mActivityEventListener) + reactApplicationContext.registerReceiver(broadcastReceiver, IntentFilter(STOP_BROADCAST)) } @RequiresApi(api = Build.VERSION_CODES.O) @@ -82,8 +75,7 @@ class AlarmModule internal constructor(context: ReactApplicationContext?) : manager.cancel(NOTIFICATION_ID_DONE) reactApplicationContext.stopService( Intent( - reactApplicationContext, - AlarmService::class.java + reactApplicationContext, AlarmService::class.java ) ) countdownTimer?.cancel() @@ -95,8 +87,7 @@ class AlarmModule internal constructor(context: ReactApplicationContext?) : @ReactMethod fun ignoringBattery(callback: Callback) { val packageName = reactApplicationContext.packageName - val pm = - reactApplicationContext.getSystemService(Context.POWER_SERVICE) as PowerManager + val pm = reactApplicationContext.getSystemService(Context.POWER_SERVICE) as PowerManager if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) { callback.invoke(pm.isIgnoringBatteryOptimizations(packageName)) } else { @@ -128,16 +119,14 @@ class AlarmModule internal constructor(context: ReactApplicationContext?) : return object : CountDownTimer(endMs.toLong(), 1000) { @RequiresApi(Build.VERSION_CODES.O) override fun onTick(current: Long) { - 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) + 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, current.toInt(), false) - .setCategory(NotificationCompat.CATEGORY_PROGRESS) - .priority = NotificationCompat.PRIORITY_LOW + .setCategory(NotificationCompat.CATEGORY_PROGRESS).priority = + NotificationCompat.PRIORITY_LOW val manager = getManager() manager.notify(NOTIFICATION_ID_PENDING, builder.build()) } @@ -146,30 +135,18 @@ class AlarmModule internal constructor(context: ReactApplicationContext?) : override fun onFinish() { val context = reactApplicationContext val finishIntent = Intent(context, StopAlarm::class.java) - val finishPending = - PendingIntent.getActivity( - context, - 0, - finishIntent, - PendingIntent.FLAG_IMMUTABLE - ) + val finishPending = PendingIntent.getActivity( + context, 0, finishIntent, PendingIntent.FLAG_IMMUTABLE + ) val fullIntent = Intent(context, TimerDone::class.java) - val fullPending = - PendingIntent.getActivity( - context, - 0, - fullIntent, - PendingIntent.FLAG_IMMUTABLE - ) - builder.setContentText("Timer finished.") - .setProgress(0, 0, false) - .setAutoCancel(true) - .setOngoing(true) - .setFullScreenIntent(fullPending, true) - .setContentIntent(finishPending) - .setChannelId(CHANNEL_ID_DONE) - .setCategory(NotificationCompat.CATEGORY_ALARM) - .priority = NotificationCompat.PRIORITY_HIGH + val fullPending = PendingIntent.getActivity( + context, 0, fullIntent, PendingIntent.FLAG_IMMUTABLE + ) + builder.setContentText("Timer finished.").setProgress(0, 0, false) + .setAutoCancel(true).setOngoing(true).setFullScreenIntent(fullPending, true) + .setContentIntent(finishPending).setChannelId(CHANNEL_ID_DONE) + .setCategory(NotificationCompat.CATEGORY_ALARM).priority = + NotificationCompat.PRIORITY_HIGH val manager = getManager() manager.notify(NOTIFICATION_ID_DONE, builder.build()) manager.cancel(NOTIFICATION_ID_PENDING) @@ -188,12 +165,11 @@ class AlarmModule internal constructor(context: ReactApplicationContext?) : val contentIntent = Intent(context, MainActivity::class.java) val pendingContent = PendingIntent.getActivity(context, 0, contentIntent, PendingIntent.FLAG_IMMUTABLE) - val stopIntent = Intent(context, StopTimer::class.java) + val stopIntent = Intent(STOP_BROADCAST) val pendingStop = PendingIntent.getService(context, 0, stopIntent, PendingIntent.FLAG_IMMUTABLE) return NotificationCompat.Builder(context, CHANNEL_ID_PENDING) - .setSmallIcon(R.drawable.ic_baseline_hourglass_bottom_24) - .setContentTitle("Resting") + .setSmallIcon(R.drawable.ic_baseline_hourglass_bottom_24).setContentTitle("Resting") .setContentIntent(pendingContent) .addAction(R.drawable.ic_baseline_stop_24, "Stop", pendingStop) .setDeleteIntent(pendingStop) @@ -202,9 +178,7 @@ class AlarmModule internal constructor(context: ReactApplicationContext?) : @RequiresApi(Build.VERSION_CODES.O) fun getManager(): NotificationManager { val alarmsChannel = NotificationChannel( - CHANNEL_ID_DONE, - CHANNEL_ID_DONE, - NotificationManager.IMPORTANCE_HIGH + CHANNEL_ID_DONE, CHANNEL_ID_DONE, NotificationManager.IMPORTANCE_HIGH ) alarmsChannel.description = "Alarms for rest timers." alarmsChannel.lockscreenVisibility = Notification.VISIBILITY_PUBLIC @@ -212,12 +186,9 @@ class AlarmModule internal constructor(context: ReactApplicationContext?) : NotificationManager::class.java ) notificationManager.createNotificationChannel(alarmsChannel) - val timersChannel = - NotificationChannel( - CHANNEL_ID_PENDING, - CHANNEL_ID_PENDING, - NotificationManager.IMPORTANCE_LOW - ) + 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) @@ -225,6 +196,7 @@ class AlarmModule internal constructor(context: ReactApplicationContext?) : } companion object { + const val STOP_BROADCAST = "stop-timer-event" const val CHANNEL_ID_PENDING = "Timer" const val CHANNEL_ID_DONE = "Alarm" const val NOTIFICATION_ID_PENDING = 1