diff --git a/android/app/src/main/AndroidManifest.xml b/android/app/src/main/AndroidManifest.xml index b0372ee..d5c918a 100644 --- a/android/app/src/main/AndroidManifest.xml +++ b/android/app/src/main/AndroidManifest.xml @@ -43,17 +43,9 @@ android:name=".StopAlarm" android:exported="true" android:process=":remote" /> - - - \ No newline at end of file diff --git a/android/app/src/main/java/com/massive/DownloadModule.kt b/android/app/src/main/java/com/massive/DownloadModule.kt deleted file mode 100644 index 0c9a606..0000000 --- a/android/app/src/main/java/com/massive/DownloadModule.kt +++ /dev/null @@ -1,51 +0,0 @@ -package com.massive - -import android.app.DownloadManager -import android.app.NotificationChannel -import android.app.NotificationManager -import android.app.NotificationManager.IMPORTANCE_DEFAULT -import android.app.PendingIntent -import android.app.PendingIntent.FLAG_IMMUTABLE -import android.content.Intent -import android.net.Uri -import android.os.Build -import android.os.Environment -import android.util.Log -import androidx.annotation.RequiresApi -import androidx.core.app.NotificationCompat -import androidx.core.net.toUri -import com.facebook.react.bridge.ReactApplicationContext -import com.facebook.react.bridge.ReactContextBaseJavaModule -import com.facebook.react.bridge.ReactMethod -import java.io.File - -class DownloadModule internal constructor(context: ReactApplicationContext) : - ReactContextBaseJavaModule(context) { - override fun getName(): String { - return "DownloadModule" - } - - @RequiresApi(Build.VERSION_CODES.O) - @ReactMethod - fun show(name: String) { - val channel = NotificationChannel(CHANNEL_ID, CHANNEL_ID, IMPORTANCE_DEFAULT) - channel.description = "Notifications for downloaded files." - val manager = - reactApplicationContext.getSystemService(NotificationManager::class.java) - manager.createNotificationChannel(channel) - val intent = Intent(DownloadManager.ACTION_VIEW_DOWNLOADS) - val pendingIntent = - PendingIntent.getActivity(reactApplicationContext, 0, intent, FLAG_IMMUTABLE) - val builder = NotificationCompat.Builder(reactApplicationContext, CHANNEL_ID) - .setSmallIcon(R.drawable.ic_baseline_arrow_downward_24) - .setContentTitle("Downloaded $name") - .setContentIntent(pendingIntent) - .setAutoCancel(true) - manager.notify(NOTIFICATION_ID, builder.build()) - } - - companion object { - private const val CHANNEL_ID = "MassiveDownloads" - private const val NOTIFICATION_ID = 3 - } -} \ No newline at end of file diff --git a/android/app/src/main/java/com/massive/MassiveHelper.kt b/android/app/src/main/java/com/massive/MassiveHelper.kt deleted file mode 100644 index 2263c00..0000000 --- a/android/app/src/main/java/com/massive/MassiveHelper.kt +++ /dev/null @@ -1,15 +0,0 @@ -package com.massive - -import android.content.Context -import android.database.sqlite.SQLiteDatabase -import android.database.sqlite.SQLiteOpenHelper - -class MassiveHelper(context: Context) : SQLiteOpenHelper(context, "massive.db", null, 1) { - override fun onCreate(db: SQLiteDatabase) { - return - } - - override fun onUpgrade(p0: SQLiteDatabase?, p1: Int, p2: Int) { - return - } -} \ No newline at end of file diff --git a/android/app/src/main/java/com/massive/MassivePackage.kt b/android/app/src/main/java/com/massive/MassivePackage.kt index 6e123f5..25cbf82 100644 --- a/android/app/src/main/java/com/massive/MassivePackage.kt +++ b/android/app/src/main/java/com/massive/MassivePackage.kt @@ -17,7 +17,6 @@ class MassivePackage : ReactPackage { ): List { val modules: MutableList = ArrayList() modules.add(AlarmModule(reactContext)) - modules.add(DownloadModule(reactContext)) return modules } } diff --git a/android/app/src/main/java/com/massive/StopTimer.kt b/android/app/src/main/java/com/massive/StopTimer.kt deleted file mode 100644 index 1c02edf..0000000 --- a/android/app/src/main/java/com/massive/StopTimer.kt +++ /dev/null @@ -1,52 +0,0 @@ -package com.massive - -import android.app.Notification -import android.app.NotificationChannel -import android.app.NotificationManager -import android.app.Service -import android.content.Intent -import android.os.Build -import android.os.IBinder -import android.util.Log -import androidx.annotation.RequiresApi -import com.facebook.react.bridge.ReactApplicationContext - -class StopTimer : Service() { - @RequiresApi(Build.VERSION_CODES.O) - override fun onStartCommand(intent: Intent?, flags: Int, startId: Int): Int { - Log.d("StopTimer", "onStartCommand") - applicationContext.stopService(Intent(applicationContext, AlarmService::class.java)) - val manager = getManager(); - manager.cancel(AlarmModule.NOTIFICATION_ID_DONE) - manager.cancel(AlarmModule.NOTIFICATION_ID_PENDING) - val mod = AlarmModule(applicationContext as ReactApplicationContext?) - Log.d("StopTimer", "countdownTimer=${mod.countdownTimer}") - return super.onStartCommand(intent, flags, startId) - } - - override fun onBind(p0: Intent?): IBinder? { - return null - } - - - @RequiresApi(Build.VERSION_CODES.O) - private fun getManager(): NotificationManager { - val alarmsChannel = NotificationChannel( - AlarmModule.CHANNEL_ID_DONE, - AlarmModule.CHANNEL_ID_DONE, - NotificationManager.IMPORTANCE_HIGH - ) - alarmsChannel.description = "Alarms for rest timers." - alarmsChannel.lockscreenVisibility = Notification.VISIBILITY_PUBLIC - val notificationManager = applicationContext.getSystemService( - NotificationManager::class.java - ) - notificationManager.createNotificationChannel(alarmsChannel) - val timersChannel = - NotificationChannel(AlarmModule.CHANNEL_ID_PENDING, AlarmModule.CHANNEL_ID_PENDING, NotificationManager.IMPORTANCE_LOW) - timersChannel.setSound(null, null) - timersChannel.description = "Progress on rest timers." - notificationManager.createNotificationChannel(timersChannel) - return notificationManager - } -} \ No newline at end of file diff --git a/android/app/src/main/java/com/massive/TimerDone.kt b/android/app/src/main/java/com/massive/TimerDone.kt index cf6870f..7457765 100644 --- a/android/app/src/main/java/com/massive/TimerDone.kt +++ b/android/app/src/main/java/com/massive/TimerDone.kt @@ -1,10 +1,15 @@ package com.massive +import android.app.Notification +import android.app.NotificationChannel +import android.app.NotificationManager import android.content.Intent +import android.os.Build import androidx.appcompat.app.AppCompatActivity import android.os.Bundle import android.util.Log import android.view.View +import androidx.annotation.RequiresApi class TimerDone : AppCompatActivity() { override fun onCreate(savedInstanceState: Bundle?) { @@ -12,12 +17,41 @@ class TimerDone : AppCompatActivity() { setContentView(R.layout.activity_timer_done) } + @RequiresApi(Build.VERSION_CODES.O) fun stop(view: View) { Log.d("TimerDone", "Stopping...") - applicationContext.stopService(Intent(applicationContext, TimerService::class.java)) applicationContext.stopService(Intent(applicationContext, AlarmService::class.java)) + val manager = getManager() + manager.cancel(AlarmModule.NOTIFICATION_ID_DONE) + manager.cancel(AlarmModule.NOTIFICATION_ID_PENDING) val intent = Intent(applicationContext, MainActivity::class.java) intent.flags = Intent.FLAG_ACTIVITY_NEW_TASK applicationContext.startActivity(intent) } + + @RequiresApi(Build.VERSION_CODES.O) + fun getManager(): NotificationManager { + val alarmsChannel = NotificationChannel( + AlarmModule.CHANNEL_ID_DONE, + AlarmModule.CHANNEL_ID_DONE, + NotificationManager.IMPORTANCE_HIGH + ).apply { + description = "Alarms for rest timers." + lockscreenVisibility = Notification.VISIBILITY_PUBLIC + } + val timersChannel = NotificationChannel( + AlarmModule.CHANNEL_ID_PENDING, + AlarmModule.CHANNEL_ID_PENDING, + NotificationManager.IMPORTANCE_LOW + ).apply { + setSound(null, null) + description = "Progress on rest timers." + } + val notificationManager = applicationContext.getSystemService( + NotificationManager::class.java + ) + notificationManager.createNotificationChannel(alarmsChannel) + notificationManager.createNotificationChannel(timersChannel) + return notificationManager + } } \ No newline at end of file diff --git a/android/app/src/main/java/com/massive/TimerService.kt b/android/app/src/main/java/com/massive/TimerService.kt deleted file mode 100644 index f613b98..0000000 --- a/android/app/src/main/java/com/massive/TimerService.kt +++ /dev/null @@ -1,179 +0,0 @@ -package com.massive - -import android.annotation.SuppressLint -import android.app.* -import android.app.NotificationManager.IMPORTANCE_HIGH -import android.app.NotificationManager.IMPORTANCE_LOW -import android.content.Context -import android.content.Intent -import android.net.Uri -import android.os.Build -import android.os.CountDownTimer -import android.os.IBinder -import android.util.Log -import androidx.annotation.RequiresApi -import androidx.core.app.NotificationCompat -import kotlin.math.floor - -class TimerService : Service() { - private var countdownTimer: CountDownTimer? = null - private var endMs: Int = 0 - private var currentMs: Long = 0 - private var vibrate: Boolean = true - private var noSound: Boolean = false - private var sound: String? = null - - @RequiresApi(Build.VERSION_CODES.O) - override fun onStartCommand(intent: Intent?, flags: Int, startId: Int): Int { - vibrate = intent?.extras?.getBoolean("vibrate") == true - noSound = intent?.extras?.getBoolean("noSound") == true - sound = intent?.extras?.getString("sound") - val manager = getManager() - manager.cancel(NOTIFICATION_ID_DONE) - applicationContext.stopService(Intent(applicationContext, AlarmService::class.java)) - if (intent?.action == "add") { - endMs = currentMs.toInt().plus(60000) - applicationContext.stopService(Intent(applicationContext, AlarmService::class.java)) - } else { - val ms = intent?.extras?.getInt("milliseconds") - if (ms != null) endMs = ms; - } - Log.d("TimerService", "endMs=$endMs,currentMs=$currentMs,vibrate=$vibrate,sound=$sound") - val builder = getBuilder(applicationContext) - countdownTimer?.cancel() - countdownTimer = getTimer(builder) - countdownTimer?.start() - return super.onStartCommand(intent, flags, startId) - } - - private fun getTimer(builder: NotificationCompat.Builder): CountDownTimer { - return object : CountDownTimer(endMs.toLong(), 1000) { - @RequiresApi(Build.VERSION_CODES.O) - 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, current.toInt(), false) - .setCategory(NotificationCompat.CATEGORY_PROGRESS) - .priority = NotificationCompat.PRIORITY_LOW - val manager = getManager() - manager.notify(NOTIFICATION_ID_PENDING, builder.build()) - } - - @RequiresApi(Build.VERSION_CODES.O) - override fun onFinish() { - val finishIntent = Intent(applicationContext, StopAlarm::class.java) - val finishPending = - PendingIntent.getActivity( - applicationContext, - 0, - finishIntent, - PendingIntent.FLAG_IMMUTABLE - ) - val fullIntent = Intent(applicationContext, TimerDone::class.java) - val fullPending = - PendingIntent.getActivity( - applicationContext, - 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) - val alarmIntent = Intent(applicationContext, AlarmService::class.java).apply { - putExtra("vibrate", vibrate) - putExtra("sound", sound) - putExtra("noSound", noSound) - } - applicationContext.startService(alarmIntent) - } - } - } - - override fun onBind(p0: Intent?): IBinder? { - return null - } - - @RequiresApi(Build.VERSION_CODES.O) - override fun onDestroy() { - Log.d("TimerService", "Destroying...") - countdownTimer?.cancel() - val manager = getManager() - manager.cancel(NOTIFICATION_ID_PENDING) - manager.cancel(NOTIFICATION_ID_DONE) - super.onDestroy() - } - - @SuppressLint("UnspecifiedImmutableFlag") - @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 stopIntent = Intent(context, StopTimer::class.java) - val pendingStop = - PendingIntent.getService(context, 0, stopIntent, PendingIntent.FLAG_IMMUTABLE) - val addIntent = Intent(context, TimerService::class.java).apply { - action = "add" - putExtra("vibrate", vibrate) - putExtra("sound", sound) - putExtra("noSound", noSound) - data = Uri.parse("$currentMs") - } - 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) - } - return NotificationCompat.Builder(context, CHANNEL_ID_PENDING) - .setSmallIcon(R.drawable.ic_baseline_hourglass_bottom_24) - .setContentTitle("Resting") - .setContentIntent(pendingContent) - .addAction(R.drawable.ic_baseline_stop_24, "Stop", pendingStop) - .addAction(R.drawable.ic_baseline_stop_24, "Add 1 min", pendingAdd) - .setDeleteIntent(pendingStop) - } - - @RequiresApi(Build.VERSION_CODES.O) - private fun getManager(): NotificationManager { - val alarmsChannel = NotificationChannel( - CHANNEL_ID_DONE, - CHANNEL_ID_DONE, - IMPORTANCE_HIGH - ) - alarmsChannel.description = "Alarms for rest timers." - alarmsChannel.lockscreenVisibility = Notification.VISIBILITY_PUBLIC - val notificationManager = applicationContext.getSystemService( - NotificationManager::class.java - ) - notificationManager.createNotificationChannel(alarmsChannel) - val timersChannel = - NotificationChannel(CHANNEL_ID_PENDING, CHANNEL_ID_PENDING, IMPORTANCE_LOW) - timersChannel.setSound(null, null) - timersChannel.description = "Progress on rest timers." - notificationManager.createNotificationChannel(timersChannel) - return notificationManager - } - - companion object { - private const val CHANNEL_ID_PENDING = "Timer" - private const val CHANNEL_ID_DONE = "Alarm" - private const val NOTIFICATION_ID_PENDING = 1 - private const val NOTIFICATION_ID_DONE = 2 - } -} \ No newline at end of file