From 57e468addd1dc9a3c578522437e8fbb7b0836cfc Mon Sep 17 00:00:00 2001 From: Kush Choudhary Date: Mon, 14 Apr 2025 18:25:54 +0530 Subject: [PATCH 1/4] added timer-dismiss notification --- android/app/src/main/AndroidManifest.xml | 4 ++ .../ultimate_alarm_clock/MainActivity.kt | 20 +++++- .../TimerBroadcasts/TimerDismiss.kt | 16 +++++ .../TimerBroadcasts/TimerNotification.kt | 25 ++++++- .../modules/timer/views/timer_animation.dart | 67 +++++++++++++------ 5 files changed, 106 insertions(+), 26 deletions(-) create mode 100644 android/app/src/main/kotlin/com/ccextractor/ultimate_alarm_clock/ultimate_alarm_clock/TimerBroadcasts/TimerDismiss.kt diff --git a/android/app/src/main/AndroidManifest.xml b/android/app/src/main/AndroidManifest.xml index 64507121..510831eb 100644 --- a/android/app/src/main/AndroidManifest.xml +++ b/android/app/src/main/AndroidManifest.xml @@ -90,6 +90,10 @@ android:name=".TimerReceiver" android:enabled="true" android:exported="false"> + + val timerId = arguments?.get("timerId") as? Int ?: 0 + val timerName = arguments?.get("timerName") as? String ?: "Unnamed" + val timerValue = arguments?.get("timerValue") as? Int ?: 0 + + TimerNotification().showDismissNotification(timerValue, timerId, context) } else { result.notImplemented() } @@ -288,6 +297,11 @@ class MainActivity : FlutterActivity() { ringtone?.stop() } + fun dismissTimer(timerID: Int) { + val args = hashMapOf("timerID" to timerID) + methodChannel2.invokeMethod("dismissTimer", args) + } + private fun openAndroidPermissionsMenu() { val intent = Intent(Settings.ACTION_MANAGE_WRITE_SETTINGS) intent.data = Uri.parse("package:${packageName}") diff --git a/android/app/src/main/kotlin/com/ccextractor/ultimate_alarm_clock/ultimate_alarm_clock/TimerBroadcasts/TimerDismiss.kt b/android/app/src/main/kotlin/com/ccextractor/ultimate_alarm_clock/ultimate_alarm_clock/TimerBroadcasts/TimerDismiss.kt new file mode 100644 index 00000000..33af6fe9 --- /dev/null +++ b/android/app/src/main/kotlin/com/ccextractor/ultimate_alarm_clock/ultimate_alarm_clock/TimerBroadcasts/TimerDismiss.kt @@ -0,0 +1,16 @@ +package com.ccextractor.ultimate_alarm_clock.ultimate_alarm_clock.TimerBroadcasts + + +import android.content.BroadcastReceiver +import android.content.Context +import android.content.Intent +import com.ccextractor.ultimate_alarm_clock.MainActivity + + +class TimerDismiss: BroadcastReceiver() { + override fun onReceive(context: Context, intent: Intent) { + val timerID: Int = intent.getIntExtra("timerID", 0) + val args = hashMapOf("timerID" to timerID) + MainActivity.methodChannel2.invokeMethod("dismissTimer", args) + } +} \ No newline at end of file diff --git a/android/app/src/main/kotlin/com/ccextractor/ultimate_alarm_clock/ultimate_alarm_clock/TimerBroadcasts/TimerNotification.kt b/android/app/src/main/kotlin/com/ccextractor/ultimate_alarm_clock/ultimate_alarm_clock/TimerBroadcasts/TimerNotification.kt index e2de3ffd..e047a1a9 100644 --- a/android/app/src/main/kotlin/com/ccextractor/ultimate_alarm_clock/ultimate_alarm_clock/TimerBroadcasts/TimerNotification.kt +++ b/android/app/src/main/kotlin/com/ccextractor/ultimate_alarm_clock/ultimate_alarm_clock/TimerBroadcasts/TimerNotification.kt @@ -7,7 +7,7 @@ import android.content.Context import android.content.Intent import android.os.Build import androidx.core.app.NotificationCompat -import com.ccextractor.ultimate_alarm_clock.getLatestTimer +import com.ccextractor.ultimate_alarm_clock.ultimate_alarm_clock.TimerBroadcasts.TimerDismiss class TimerNotification : BroadcastReceiver() { @@ -84,6 +84,29 @@ class TimerNotification : BroadcastReceiver() { notificationManager.notify(1, notification) } + fun showDismissNotification(milliseconds: Int, timerID: Int, context: Context) { + var notificationManager = + context.getSystemService(Context.NOTIFICATION_SERVICE) as NotificationManager + val dismissIntent = Intent(context, TimerDismiss::class.java).apply { + action = "com.ccextractor.ultimate_alarm_clock.DISMISS_TIMER" + putExtra("timerID", timerID) + } + val dismissPendingIntent = PendingIntent.getBroadcast( + context, System.currentTimeMillis().toInt(), dismissIntent, + PendingIntent.FLAG_IMMUTABLE + ) + + val notification = NotificationCompat.Builder(context, TimerService.TIMER_CHANNEL_ID) + .setSmallIcon(R.mipmap.launcher_icon) + .setContentTitle("Dismiss Timer") + .setContentText(formatDuration(milliseconds.toLong())) + .setPriority(NotificationCompat.PRIORITY_HIGH) + .setOnlyAlertOnce(true) + .addAction(R.mipmap.launcher_icon, "Dismiss", dismissPendingIntent) + .build() + notificationManager.notify(2, notification) + } + private fun formatDuration(milliseconds: Long): String { val seconds = (milliseconds / 1000) % 60 val minutes = (milliseconds / (1000 * 60)) % 60 diff --git a/lib/app/modules/timer/views/timer_animation.dart b/lib/app/modules/timer/views/timer_animation.dart index 828c44c8..66d7ef55 100644 --- a/lib/app/modules/timer/views/timer_animation.dart +++ b/lib/app/modules/timer/views/timer_animation.dart @@ -1,5 +1,6 @@ import 'dart:async'; import 'package:flutter/material.dart'; +import 'package:flutter/services.dart'; import 'package:get/get.dart'; import 'package:ultimate_alarm_clock/app/data/models/timer_model.dart'; import 'package:ultimate_alarm_clock/app/data/providers/isar_provider.dart'; @@ -26,6 +27,7 @@ class _TimerAnimatedCardState extends State with SingleTickerProviderStateMixin, AutomaticKeepAliveClientMixin { TimerController controller = Get.find(); ThemeController themeController = Get.find(); + MethodChannel timerChannel = const MethodChannel('timer'); var width = Get.width; var height = Get.height; @@ -40,6 +42,11 @@ class _TimerAnimatedCardState extends State }); } else { stopTimer(); + timerChannel.invokeMethod('dismissTimer', { + 'timerId': widget.timer.timerId, + 'timerName': widget.timer.timerName, + 'timerValue': widget.timer.timerValue, + }); controller.startRinger(widget.timer.timerId); } }); @@ -49,9 +56,46 @@ class _TimerAnimatedCardState extends State _timerCounter!.cancel(); } + void dismissTimer(int id) { + print('timer id: $id'); + + if(id != widget.timer.timerId){ + return; + } + setState(() { + if (widget.timer.isPaused == 0) { + stopTimer(); + } else { + startTimer(); + } + widget.timer.isPaused = + widget.timer.isPaused == 0 ? 1 : 0; + IsarDb.updateTimerPauseStatus(widget.timer); + }); + if (widget.timer.timeElapsed >= + widget.timer.timerValue) { + controller.stopRinger(widget.timer.timerId); + setState(() { + widget.timer.timeElapsed = 0; + IsarDb.updateTimerTick(widget.timer) + .then((value) => + IsarDb.updateTimerPauseStatus( + widget.timer)); + widget.timer.isPaused = 1; + }); + } + } + @override void initState() { super.initState(); + timerChannel.setMethodCallHandler((call) async { + if (call.method == 'dismissTimer') { + int timerID = call.arguments['timerID']; + print(timerID); + dismissTimer(timerID); + } + }); if (Utils.getDifferenceMillisFromNow( widget.timer.startedOn, widget.timer.timerValue) <= 0 && @@ -202,28 +246,7 @@ class _TimerAnimatedCardState extends State children: [ GestureDetector( onTap: () { - setState(() { - if (widget.timer.isPaused == 0) { - stopTimer(); - } else { - startTimer(); - } - widget.timer.isPaused = - widget.timer.isPaused == 0 ? 1 : 0; - IsarDb.updateTimerPauseStatus(widget.timer); - }); - if (widget.timer.timeElapsed >= - widget.timer.timerValue) { - controller.stopRinger(widget.timer.timerId); - setState(() { - widget.timer.timeElapsed = 0; - IsarDb.updateTimerTick(widget.timer) - .then((value) => - IsarDb.updateTimerPauseStatus( - widget.timer)); - widget.timer.isPaused = 1; - }); - } + dismissTimer(widget.timer.timerId); }, child: Container( decoration: BoxDecoration( From 8b942c6dc0b554bfed2bbd09e4ab8d2e2bafd8ec Mon Sep 17 00:00:00 2001 From: Kush Choudhary Date: Tue, 15 Apr 2025 00:27:47 +0530 Subject: [PATCH 2/4] few fixes --- android/app/src/main/AndroidManifest.xml | 4 ---- .../TimerBroadcasts/TimerDismiss.kt | 16 ---------------- .../TimerBroadcasts/TimerNotification.kt | 10 ++++++++-- 3 files changed, 8 insertions(+), 22 deletions(-) delete mode 100644 android/app/src/main/kotlin/com/ccextractor/ultimate_alarm_clock/ultimate_alarm_clock/TimerBroadcasts/TimerDismiss.kt diff --git a/android/app/src/main/AndroidManifest.xml b/android/app/src/main/AndroidManifest.xml index 510831eb..64507121 100644 --- a/android/app/src/main/AndroidManifest.xml +++ b/android/app/src/main/AndroidManifest.xml @@ -90,10 +90,6 @@ android:name=".TimerReceiver" android:enabled="true" android:exported="false"> - Date: Tue, 15 Apr 2025 00:40:01 +0530 Subject: [PATCH 3/4] fixed issue with timers table --- .../ultimate_alarm_clock/TimerDatabaseHelper.kt | 12 ++++++++++++ 1 file changed, 12 insertions(+) diff --git a/android/app/src/main/kotlin/com/ccextractor/ultimate_alarm_clock/ultimate_alarm_clock/TimerDatabaseHelper.kt b/android/app/src/main/kotlin/com/ccextractor/ultimate_alarm_clock/ultimate_alarm_clock/TimerDatabaseHelper.kt index 7b103b99..44fa162c 100644 --- a/android/app/src/main/kotlin/com/ccextractor/ultimate_alarm_clock/ultimate_alarm_clock/TimerDatabaseHelper.kt +++ b/android/app/src/main/kotlin/com/ccextractor/ultimate_alarm_clock/ultimate_alarm_clock/TimerDatabaseHelper.kt @@ -11,7 +11,19 @@ class TimerDatabaseHelper(context: Context) : SQLiteOpenHelper(context, DATABASE } override fun onCreate(db: SQLiteDatabase) { + val createTableQuery = """ + CREATE TABLE timers ( + id INTEGER PRIMARY KEY AUTOINCREMENT, + startedOn TEXT NOT NULL, + timerValue INTEGER NOT NULL, + timeElapsed INTEGER NOT NULL, + ringtoneName TEXT NOT NULL, + timerName TEXT NOT NULL, + isPaused INTEGER NOT NULL + ); + """.trimIndent() + db.execSQL(createTableQuery) } override fun onUpgrade(db: SQLiteDatabase, oldVersion: Int, newVersion: Int) { From 791b70e7543a1031e1e0e32d7dbff4cc3029d73f Mon Sep 17 00:00:00 2001 From: Kush Choudhary Date: Tue, 15 Apr 2025 00:49:30 +0530 Subject: [PATCH 4/4] removed unused function --- .../ultimate_alarm_clock/MainActivity.kt | 5 ----- 1 file changed, 5 deletions(-) diff --git a/android/app/src/main/kotlin/com/ccextractor/ultimate_alarm_clock/ultimate_alarm_clock/MainActivity.kt b/android/app/src/main/kotlin/com/ccextractor/ultimate_alarm_clock/ultimate_alarm_clock/MainActivity.kt index 3f64ecc0..7c2f9346 100644 --- a/android/app/src/main/kotlin/com/ccextractor/ultimate_alarm_clock/ultimate_alarm_clock/MainActivity.kt +++ b/android/app/src/main/kotlin/com/ccextractor/ultimate_alarm_clock/ultimate_alarm_clock/MainActivity.kt @@ -297,11 +297,6 @@ class MainActivity : FlutterActivity() { ringtone?.stop() } - fun dismissTimer(timerID: Int) { - val args = hashMapOf("timerID" to timerID) - methodChannel2.invokeMethod("dismissTimer", args) - } - private fun openAndroidPermissionsMenu() { val intent = Intent(Settings.ACTION_MANAGE_WRITE_SETTINGS) intent.data = Uri.parse("package:${packageName}")