Skip to content

Commit 3c82601

Browse files
committed
Added notification feature
1 parent a35e8d3 commit 3c82601

File tree

7 files changed

+137
-2
lines changed

7 files changed

+137
-2
lines changed

android/app/src/main/AndroidManifest.xml

+10
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,9 @@
22
package="com.drinkable.drinkable">
33
<uses-permission android:name="android.permission.INTERNET"/>
44
<uses-permission android:name="android.permission.ACCESS_FINE_LOCATION"/>
5+
<uses-permission android:name="android.permission.RECEIVE_BOOT_COMPLETED"/>
6+
<uses-permission android:name="android.permission.VIBRATE" />
7+
<uses-permission android:name="android.permission.WAKE_LOCK" />
58

69
<application
710
android:name="io.flutter.app.FlutterApplication"
@@ -38,6 +41,13 @@
3841
<category android:name="android.intent.category.LAUNCHER"/>
3942
</intent-filter>
4043
</activity>
44+
<receiver android:name="com.dexterous.flutterlocalnotifications.ScheduledNotificationReceiver" />
45+
<receiver android:name="com.dexterous.flutterlocalnotifications.ScheduledNotificationBootReceiver">
46+
<intent-filter>
47+
<action android:name="android.intent.action.BOOT_COMPLETED"/>
48+
<action android:name="android.intent.action.MY_PACKAGE_REPLACED"/>
49+
</intent-filter>
50+
</receiver>
4151
<!-- Don't delete the meta-data below.
4252
This is used by the Flutter tool to generate GeneratedPluginRegistrant.java -->
4353
<meta-data

lib/main.dart

+12-1
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,7 @@ import 'package:flutter/material.dart';
22
import 'package:flutter/services.dart';
33
import 'package:provider/provider.dart';
44
import 'package:firebase_core/firebase_core.dart';
5-
5+
import 'package:flutter_local_notifications/flutter_local_notifications.dart';
66

77
// providers
88
import './providers/home_provider.dart';
@@ -22,6 +22,17 @@ void main() async {
2222
DeviceOrientation.portraitUp
2323
]
2424
);
25+
26+
FlutterLocalNotificationsPlugin notificationsPlugin = FlutterLocalNotificationsPlugin();
27+
AndroidInitializationSettings android = AndroidInitializationSettings('notification_icon');
28+
IOSInitializationSettings ios = IOSInitializationSettings();
29+
InitializationSettings settings = InitializationSettings(
30+
android,ios
31+
);
32+
await notificationsPlugin.initialize(
33+
settings,
34+
);
35+
2536
runApp(MyApp());
2637
}
2738

lib/providers/auth_provider.dart

+12
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,9 @@ import 'package:google_sign_in/google_sign_in.dart';
77
// models
88
import '../models/app_user.dart';
99

10+
//utils
11+
import '../utils/notification_utils.dart';
12+
1013

1114
class AuthProvider extends ChangeNotifier {
1215
FirebaseFirestore _firestore = FirebaseFirestore.instance;
@@ -31,6 +34,13 @@ class AuthProvider extends ChangeNotifier {
3134
if(docs.length==0){
3235
return true;
3336
}
37+
QueryDocumentSnapshot userDoc = docs[0];
38+
Map<String,dynamic> data = userDoc.data();
39+
TimeOfDay wakeUpTime = TimeOfDay(
40+
hour: data['wake_up_time']['hour'],
41+
minute: data['wake_up_time']['minute']
42+
);
43+
await setDailyStartNotification(wakeUpTime,data['name']);
3444
return false;
3545
}catch(e){
3646
print(e);
@@ -70,6 +80,7 @@ class AuthProvider extends ChangeNotifier {
7080
wakeUpTime: time,
7181
dailyTarget: water
7282
).toDoc());
83+
await setDailyStartNotification(time,user.displayName);
7384
notifyListeners();
7485
}catch(e){
7586
print(e);
@@ -82,6 +93,7 @@ class AuthProvider extends ChangeNotifier {
8293
}
8394

8495
void signOut() async {
96+
await cancelAllNotifications();
8597
await _googleSignIn.signOut();
8698
await _firebaseAuth.signOut();
8799
notifyListeners();

lib/providers/home_provider.dart

+9-1
Original file line numberDiff line numberDiff line change
@@ -4,16 +4,18 @@ import 'package:location/location.dart';
44
import 'dart:convert';
55
import 'package:cloud_firestore/cloud_firestore.dart';
66
import 'package:firebase_auth/firebase_auth.dart';
7+
78
// utils
89
import '../utils/get_week.dart';
9-
10+
import '../utils/notification_utils.dart';
1011
//values
1112
import '../values/api_key.dart';
1213

1314
// models
1415
import '../models/weekly_data.dart';
1516
import '../models/app_user.dart';
1617

18+
1719
class HomeProvider extends ChangeNotifier {
1820
FirebaseFirestore _firebaseFirestore = FirebaseFirestore.instance;
1921
Location _location = Location();
@@ -161,6 +163,11 @@ class HomeProvider extends ChangeNotifier {
161163
});
162164
if(_weeklyData.id==weekId){
163165
_weeklyData.amounts[weekday.toString()] += amount;
166+
if(weekday==DateTime.now().weekday){
167+
if(leftAmount>0){
168+
await waterNotification(leftAmount);
169+
}
170+
}
164171
notifyListeners();
165172
}
166173
}catch(e){
@@ -198,6 +205,7 @@ class HomeProvider extends ChangeNotifier {
198205
});
199206
transaction.update(_userRef, appUser.toDoc());
200207
});
208+
await setDailyStartNotification(appUser.wakeUpTime,appUser.name);
201209
_appUser = appUser;
202210
notifyListeners();
203211
}catch(e){

lib/utils/notification_utils.dart

+79
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,79 @@
1+
import 'package:flutter/material.dart';
2+
import 'package:flutter_local_notifications/flutter_local_notifications.dart';
3+
import 'dart:typed_data';
4+
5+
NotificationDetails getNotificationDetails(){
6+
AndroidNotificationDetails android = AndroidNotificationDetails(
7+
'channel_id',
8+
'channel_name',
9+
'channel_description',
10+
11+
visibility: NotificationVisibility.Public,
12+
priority: Priority.Max,
13+
importance: Importance.Max,
14+
15+
ledColor: const Color.fromARGB(255,0, 200, 255),
16+
ledOffMs: 500,
17+
ledOnMs: 300,
18+
19+
enableLights: true,
20+
21+
color: Colors.blue,
22+
23+
additionalFlags: Int32List.fromList([8]),
24+
category: 'reminder',
25+
26+
playSound: true,
27+
sound: RawResourceAndroidNotificationSound('notification_sound'),
28+
29+
enableVibration: true,
30+
vibrationPattern: Int64List.fromList([0,1000,1000,1000]),
31+
);
32+
IOSNotificationDetails ios = IOSNotificationDetails();
33+
NotificationDetails details = NotificationDetails(android, ios);
34+
return details;
35+
}
36+
37+
Future<void> setDailyStartNotification(TimeOfDay time, String user)async{
38+
try{
39+
FlutterLocalNotificationsPlugin plugin = FlutterLocalNotificationsPlugin();
40+
NotificationDetails notificationDetails = getNotificationDetails();
41+
await plugin.cancel(0);
42+
await plugin.showDailyAtTime(
43+
0,
44+
"Good Morning, $user",
45+
"Don't forget to dring enoung water today",
46+
Time(time.hour,time.minute),
47+
notificationDetails
48+
);
49+
}catch(e){
50+
print(e);
51+
}
52+
}
53+
54+
Future<void> waterNotification(int left)async {
55+
try{
56+
FlutterLocalNotificationsPlugin plugin = FlutterLocalNotificationsPlugin();
57+
NotificationDetails notificationDetails = getNotificationDetails();
58+
await plugin.cancel(1);
59+
await plugin.schedule(
60+
1,
61+
"Hey, it's time to drink water",
62+
"$left mL water left to drink today",
63+
DateTime.now().add(Duration(hours: 1,minutes: 30)),
64+
notificationDetails
65+
);
66+
}catch(e){
67+
print(e);
68+
}
69+
}
70+
71+
72+
Future<void> cancelAllNotifications() async{
73+
try{
74+
FlutterLocalNotificationsPlugin plugin = FlutterLocalNotificationsPlugin();
75+
await plugin.cancelAll();
76+
}catch(e){
77+
print(e);
78+
}
79+
}

pubspec.lock

+14
Original file line numberDiff line numberDiff line change
@@ -153,6 +153,20 @@ packages:
153153
description: flutter
154154
source: sdk
155155
version: "0.0.0"
156+
flutter_local_notifications:
157+
dependency: "direct main"
158+
description:
159+
name: flutter_local_notifications
160+
url: "https://pub.dartlang.org"
161+
source: hosted
162+
version: "1.4.4+4"
163+
flutter_local_notifications_platform_interface:
164+
dependency: transitive
165+
description:
166+
name: flutter_local_notifications_platform_interface
167+
url: "https://pub.dartlang.org"
168+
source: hosted
169+
version: "1.0.1"
156170
flutter_test:
157171
dependency: "direct dev"
158172
description: flutter

pubspec.yaml

+1
Original file line numberDiff line numberDiff line change
@@ -22,6 +22,7 @@ dependencies:
2222
cloud_firestore: ^0.14.0+2
2323
location: ^3.0.2
2424
http: ^0.12.2
25+
flutter_local_notifications: ^1.4.4+4
2526

2627
dev_dependencies:
2728
flutter_test:

0 commit comments

Comments
 (0)