Notifications

This commit is contained in:
brausjonas
2024-09-15 23:40:00 +02:00
parent 77a411e4b7
commit 27c628019e
8 changed files with 149 additions and 5 deletions
+3
View File
@@ -1,4 +1,5 @@
<manifest xmlns:android="http://schemas.android.com/apk/res/android"> <manifest xmlns:android="http://schemas.android.com/apk/res/android">
<uses-permission android:name="android.permission.WAKE_LOCK"/>
<application <application
android:label="ToDo" android:label="ToDo"
android:name="${applicationName}" android:name="${applicationName}"
@@ -30,6 +31,8 @@
<meta-data <meta-data
android:name="flutterEmbedding" android:name="flutterEmbedding"
android:value="2" /> android:value="2" />
<!--This should make the able to run in background-->
<receiver android:name="be.tramckrijte.workmanager.WorkManagerBroadcastReceiver" android:exported="true"/>
</application> </application>
<!-- Required to query activities that can process text, see: <!-- Required to query activities that can process text, see:
https://developer.android.com/training/package-visibility and https://developer.android.com/training/package-visibility and
Binary file not shown.

After

Width:  |  Height:  |  Size: 28 KiB

View File
+65 -4
View File
@@ -1,9 +1,72 @@
import 'package:flutter/material.dart'; import 'package:flutter/material.dart';
import 'package:todoapp/elems/filehandler.dart';
import 'package:todoapp/pages/Home.dart'; import 'package:todoapp/pages/Home.dart';
import 'package:provider/provider.dart'; import 'package:provider/provider.dart';
import 'package:todoapp/providers/todoprovider.dart'; import 'package:todoapp/providers/todoprovider.dart';
import 'package:awesome_notifications/awesome_notifications.dart';
import 'package:workmanager/workmanager.dart';
import 'package:disable_battery_optimization/disable_battery_optimization.dart';
@pragma('vm:entry-point')
void callbackDispatcher() {
Workmanager().executeTask((task, inputData) async {
AwesomeNotifications().initialize(
null,
[
NotificationChannel(
channelKey: "reminder_channel",
channelName: "Reminders",
channelDescription: "Reminder for ToDo")
]);
Map content = await FileHandler.fileContent;
for (String key in content.keys) {
Map list = content[key];
for (String title in list.keys) {
Map current = list[title];
DateTime dueTime = DateTime.parse(current["dueTime"]);
bool checked = current["checked"];
DateTime currentTime = DateTime.now();
int timeDiff = dueTime
.difference(currentTime)
.inMinutes;
if (timeDiff <= 30 && timeDiff >= 0 && !checked) {
AwesomeNotifications().createNotification(
content: NotificationContent(
id: 10,
channelKey: "reminder_channel",
title: "Task due!",
body: "Task $title due in $timeDiff minutes!"
)
);
}
}
}
return Future.value(true);
});
}
void main() async {
AwesomeNotifications().initialize(
null,
[
NotificationChannel(
channelKey: "reminder_channel",
channelName: "Reminders",
channelDescription: "Reminder for ToDo")
]);
Workmanager().initialize(
callbackDispatcher,
isInDebugMode: true
);
Workmanager().registerPeriodicTask("check_nots", "nots_check", frequency: Duration(minutes: 15));
// Workmanager().registerOneOffTask("test", "test1");
void main() {
runApp(const MyApp()); runApp(const MyApp());
} }
@@ -13,9 +76,7 @@ class MyApp extends StatelessWidget {
@override @override
Widget build(BuildContext context) { Widget build(BuildContext context) {
return MultiProvider( return MultiProvider(
providers: [ providers: [ChangeNotifierProvider(create: (context) => TodoProvider())],
ChangeNotifierProvider(create: (context) => TodoProvider())
],
child: MaterialApp( child: MaterialApp(
theme: ThemeData( theme: ThemeData(
colorScheme: ColorScheme.fromSeed( colorScheme: ColorScheme.fromSeed(
+6
View File
@@ -117,6 +117,10 @@ class _ModalEditTodoState extends State<ModalEditTodo> {
const SizedBox(height: 20), const SizedBox(height: 20),
SegmentedButton( SegmentedButton(
segments: const [ segments: const [
ButtonSegment(
value: "Delete",
label: Text("Delete"),
icon: Icon(Icons.delete)),
ButtonSegment( ButtonSegment(
value: "Cancel", value: "Cancel",
label: Text("Cancel"), label: Text("Cancel"),
@@ -131,6 +135,8 @@ class _ModalEditTodoState extends State<ModalEditTodo> {
onSelectionChanged: (p0) { onSelectionChanged: (p0) {
if (p0.last == "Save") { if (p0.last == "Save") {
context.read<TodoProvider>().updateTodo(widget.oldValue, tempValue, combineTime()); context.read<TodoProvider>().updateTodo(widget.oldValue, tempValue, combineTime());
} else if (p0.last == "Delete") {
context.read<TodoProvider>().removeTodo(widget.oldValue);
} }
Navigator.pop(context); Navigator.pop(context);
}, },
+24
View File
@@ -5,6 +5,10 @@ import 'package:todoapp/modules/body.dart';
import 'package:todoapp/modules/drawer.dart'; import 'package:todoapp/modules/drawer.dart';
import 'package:provider/provider.dart'; import 'package:provider/provider.dart';
import 'package:todoapp/providers/todoprovider.dart'; import 'package:todoapp/providers/todoprovider.dart';
import 'package:awesome_notifications/awesome_notifications.dart';
import 'package:workmanager/workmanager.dart';
import 'package:disable_battery_optimization/disable_battery_optimization.dart';
class Home extends StatefulWidget { class Home extends StatefulWidget {
const Home({super.key}); const Home({super.key});
@@ -14,8 +18,28 @@ class Home extends StatefulWidget {
} }
class _HomeState extends State<Home> { class _HomeState extends State<Home> {
void getPermissions() async {
await DisableBatteryOptimization.showEnableAutoStartSettings("Enable Auto Start", "Follow the steps and enable the auto start of this app");
await DisableBatteryOptimization.showDisableBatteryOptimizationSettings();
AwesomeNotifications().isNotificationAllowed().then((isAllowed) {
AwesomeNotifications().requestPermissionToSendNotifications();
});
}
@override
void initState() {
getPermissions();
super.initState();
}
@override @override
Widget build(BuildContext context) { Widget build(BuildContext context) {
// AwesomeNotifications().createNotification(
// content: NotificationContent(id: 10, channelKey: "reminder_channel", title: "test", body: "test"),
// );
return FutureBuilder( return FutureBuilder(
future: context.read<TodoProvider>().readListsFromDisk(), future: context.read<TodoProvider>().readListsFromDisk(),
builder: (context, snapshot) => const Scaffold( builder: (context, snapshot) => const Scaffold(
+45
View File
@@ -1,6 +1,14 @@
# Generated by pub # Generated by pub
# See https://dart.dev/tools/pub/glossary#lockfile # See https://dart.dev/tools/pub/glossary#lockfile
packages: packages:
android_intent_plus:
dependency: "direct dev"
description:
name: android_intent_plus
sha256: "007703c1b2cac7ca98add3336b98cffa4baa11d5133cc463293dba9daa39cdf6"
url: "https://pub.dev"
source: hosted
version: "5.1.0"
async: async:
dependency: transitive dependency: transitive
description: description:
@@ -9,6 +17,14 @@ packages:
url: "https://pub.dev" url: "https://pub.dev"
source: hosted source: hosted
version: "2.11.0" version: "2.11.0"
awesome_notifications:
dependency: "direct dev"
description:
name: awesome_notifications
sha256: d9e46ce7f5171ee1e9b1c5bc6dc40bd77528561f592842ce97ce3a0a9ae155ef
url: "https://pub.dev"
source: hosted
version: "0.9.3+1"
boolean_selector: boolean_selector:
dependency: transitive dependency: transitive
description: description:
@@ -49,6 +65,14 @@ packages:
url: "https://pub.dev" url: "https://pub.dev"
source: hosted source: hosted
version: "1.0.8" version: "1.0.8"
disable_battery_optimization:
dependency: "direct dev"
description:
name: disable_battery_optimization
sha256: "6b2ba802f984af141faf1b6b5fb956d5ef01f9cd555597c35b9cc335a03185ba"
url: "https://pub.dev"
source: hosted
version: "1.1.1"
fake_async: fake_async:
dependency: transitive dependency: transitive
description: description:
@@ -83,6 +107,19 @@ packages:
description: flutter description: flutter
source: sdk source: sdk
version: "0.0.0" version: "0.0.0"
flutter_web_plugins:
dependency: transitive
description: flutter
source: sdk
version: "0.0.0"
intl:
dependency: transitive
description:
name: intl
sha256: d6f56758b7d3014a48af9701c085700aac781a92a87a62b1333b46d8879661cf
url: "https://pub.dev"
source: hosted
version: "0.19.0"
leak_tracker: leak_tracker:
dependency: transitive dependency: transitive
description: description:
@@ -296,6 +333,14 @@ packages:
url: "https://pub.dev" url: "https://pub.dev"
source: hosted source: hosted
version: "14.2.5" version: "14.2.5"
workmanager:
dependency: "direct dev"
description:
name: workmanager
sha256: ed13530cccd28c5c9959ad42d657cd0666274ca74c56dea0ca183ddd527d3a00
url: "https://pub.dev"
source: hosted
version: "0.5.2"
xdg_directories: xdg_directories:
dependency: transitive dependency: transitive
description: description:
+6 -1
View File
@@ -41,6 +41,10 @@ dev_dependencies:
sdk: flutter sdk: flutter
provider: provider:
path_provider: path_provider:
awesome_notifications:
workmanager:
android_intent_plus:
disable_battery_optimization:
# The "flutter_lints" package below contains a set of recommended lints to # The "flutter_lints" package below contains a set of recommended lints to
# encourage good coding practices. The lint set provided by the package is # encourage good coding practices. The lint set provided by the package is
@@ -54,7 +58,8 @@ dev_dependencies:
# The following section is specific to Flutter packages. # The following section is specific to Flutter packages.
flutter: flutter:
assets:
- icons/ic_launcher.png
# The following line ensures that the Material Icons font is # The following line ensures that the Material Icons font is
# included with your application, so that you can use the icons in # included with your application, so that you can use the icons in
# the material Icons class. # the material Icons class.