Skip to content

Commit c458f37

Browse files
authored
Merge pull request #9 from CoderJava/feature/buat-pengaturan-reminder-not-track
Feature - Buat pengaturan reminder track time
2 parents 8d83b80 + 109e436 commit c458f37

File tree

5 files changed

+643
-101
lines changed

5 files changed

+643
-101
lines changed

assets/translations/en-US.json

Lines changed: 24 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -84,7 +84,7 @@
8484
"try_changing_it": "Try changing it",
8585
"example_hostname": "e.g. https://dipantau.id",
8686
"screenshot_notification": "Screenshot Notification",
87-
"subtitle_screenshot_notification": "Show notification while capture screenshot",
87+
"subtitle_screenshot_notification": "Show notification while capture screenshot.",
8888
"setting": "Setting",
8989
"current": "Current",
9090
"warning_change_hostname": "Make sure your data has been synced. This change requires restarting the app.",
@@ -147,11 +147,11 @@
147147
"general": "General",
148148
"company": "Company",
149149
"members": "Members",
150-
"add_edit_or_remove_member": "Add, edit, or remove member",
150+
"add_edit_or_remove_member": "Add, edit, or remove member.",
151151
"projects": "Projects",
152-
"add_edit_or_remove_project": "Add, edit, or remove project",
152+
"add_edit_or_remove_project": "Add, edit, or remove project.",
153153
"tasks_2": "Tasks",
154-
"add_edit_or_remove_task": "Add, edit, or remove task",
154+
"add_edit_or_remove_task": "Add, edit, or remove task.",
155155
"member_setting": "Member Setting",
156156
"name": "Name",
157157
"role": "Role",
@@ -185,7 +185,7 @@
185185
"avg_activity": "Avg. Activity",
186186
"idle_time": "Idle Time",
187187
"discord_channel_id": "Discord Channel ID",
188-
"subtitle_discord_channel_id": "It's used as cloud storage for all screenshots members",
188+
"subtitle_discord_channel_id": "It's used as cloud storage for all screenshots members.",
189189
"discord_channel_id_sucessfully_updated": "Discord channel ID successfully updated",
190190
"set_discord_channel_id": "Set Discord Channel ID",
191191
"cannot_be_empty": "Cannot be empty",
@@ -208,7 +208,24 @@
208208
"check": "Check",
209209
"version_app": "Version App",
210210
"always_on_top": "Always on Top",
211-
"subtitle_always_on_top": "Set Dipantau window always on top of other windows",
211+
"subtitle_always_on_top": "Set Dipantau window always on top of other windows.",
212212
"back_to_main_menu": "Back to Main Menu",
213-
"screenshot": "Screenshot"
213+
"screenshot": "Screenshot",
214+
"remind_me_to_track_time": "Reminder Not Track",
215+
"subtitle_remind_me_to_track_time": "Show notification for remind me to track time.",
216+
"from": "From",
217+
"to": "to",
218+
"on_these_days": "On these days",
219+
"mon": "Mon",
220+
"tue": "Tue",
221+
"wed": "Wed",
222+
"thu": "Thu",
223+
"fri": "Fri",
224+
"sat": "Sat",
225+
"sun": "Sun",
226+
"if_i_havent_tracked_time_in": "If I haven't tracked time in",
227+
"alias_minutes": "minutes",
228+
"n_minute": "{} minutes",
229+
"choose": "Choose",
230+
"finish_time_must_be_after_start_time": "Finish time must be after start time"
214231
}

lib/core/util/shared_preferences_manager.dart

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -18,6 +18,11 @@ class SharedPreferencesManager {
1818
static const keyBaseFilePathScreenshot = 'base_file_path_screenshot';
1919
static const keyIsLaunchAtStartup = 'is_launch_at_startup';
2020
static const keyIsAlwaysOnTop = 'is_always_on_top';
21+
static const keyIsEnableReminderTrack = 'is_enable_reminder_track';
22+
static const keyStartTimeReminderTrack = 'start_time_reminder_track';
23+
static const keyFinishTimeReminderTrack = 'finish_time_reminder_track';
24+
static const keyDayReminderTrack = 'day_reminder_track';
25+
static const keyIntervalReminderTrack = 'interval_reminder_track';
2126

2227
SharedPreferencesManager();
2328

lib/feature/presentation/page/home/home_page.dart

Lines changed: 89 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -38,6 +38,8 @@ import 'package:path_provider/path_provider.dart';
3838
import 'package:tray_manager/tray_manager.dart';
3939
import 'package:window_manager/window_manager.dart';
4040

41+
var countTimeReminderTrackInSeconds = 0;
42+
4143
class HomePage extends StatefulWidget {
4244
static const routePath = '/home';
4345
static const routeName = 'home';
@@ -65,7 +67,6 @@ class _HomePageState extends State<HomePage> with TrayListener, WindowListener {
6567
final notificationHelper = sl<NotificationHelper>();
6668
final intervalScreenshot = 60 * 5; // 300 detik (5 menit)
6769
final listTrackLocal = <Track>[];
68-
final intervalReminderNotTrack = 60 * 10; // 600 detik (10 menit)
6970

7071
var isWindowVisible = true;
7172
var userId = '';
@@ -76,7 +77,6 @@ class _HomePageState extends State<HomePage> with TrayListener, WindowListener {
7677
TrackTask? selectedTask;
7778
Timer? timeTrack, timerCronTrack, timerDate;
7879
var countTimerInSeconds = 0;
79-
var countTimerReminderNotTrack = 0;
8080
var isHaveActivity = false;
8181
var counterActivity = 0;
8282
DateTime? startTime;
@@ -127,13 +127,93 @@ class _HomePageState extends State<HomePage> with TrayListener, WindowListener {
127127
);
128128
timerDate = Timer.periodic(const Duration(seconds: 1), (_) {
129129
if (!isTimerStart) {
130-
countTimerReminderNotTrack += 1;
131-
if (countTimerReminderNotTrack == intervalReminderNotTrack) {
132-
countTimerReminderNotTrack = 0;
133-
notificationHelper.showReminderNotTrackNotification();
130+
// reminder track
131+
var isShowReminderTrack = false;
132+
final now = DateTime.now();
133+
countTimeReminderTrackInSeconds += 1;
134+
final isEnableReminderTrack =
135+
sharedPreferencesManager.getBool(SharedPreferencesManager.keyIsEnableReminderTrack) ?? false;
136+
if (isEnableReminderTrack) {
137+
DateTime? startReminderTrack, finishReminderTrack;
138+
final strStartReminderTrack = sharedPreferencesManager.getString(
139+
SharedPreferencesManager.keyStartTimeReminderTrack,
140+
) ??
141+
'';
142+
if (strStartReminderTrack.contains(':') && strStartReminderTrack.split(':').length == 2) {
143+
final splitStrStartReminderTrack = strStartReminderTrack.split(':');
144+
final strStartHourReminderTrack = splitStrStartReminderTrack.first;
145+
final strStartMinuteReminderTrack = splitStrStartReminderTrack.last;
146+
final startHourReminderTrack = int.tryParse(strStartHourReminderTrack);
147+
final startMinuteReminderTrack = int.tryParse(strStartMinuteReminderTrack);
148+
if (startHourReminderTrack != null && startMinuteReminderTrack != null) {
149+
startReminderTrack = DateTime(
150+
now.year,
151+
now.month,
152+
now.day,
153+
startHourReminderTrack,
154+
startMinuteReminderTrack,
155+
);
156+
}
157+
}
158+
159+
final strFinishReminderTrack = sharedPreferencesManager.getString(
160+
SharedPreferencesManager.keyFinishTimeReminderTrack,
161+
) ??
162+
'';
163+
if (strFinishReminderTrack.contains(':') && strFinishReminderTrack.split(':').length == 2) {
164+
final splitStrFinishReminderTrack = strFinishReminderTrack.split(':');
165+
final strFinishHourReminderTrack = splitStrFinishReminderTrack.first;
166+
final strFinishMinuteReminderTrack = splitStrFinishReminderTrack.last;
167+
final finishHourReminderTrack = int.tryParse(strFinishHourReminderTrack);
168+
final finishMinuteReminderTrack = int.tryParse(strFinishMinuteReminderTrack);
169+
if (finishHourReminderTrack != null && finishMinuteReminderTrack != null) {
170+
finishReminderTrack = DateTime(
171+
now.year,
172+
now.month,
173+
now.day,
174+
finishHourReminderTrack,
175+
finishMinuteReminderTrack,
176+
);
177+
}
178+
}
179+
180+
final daysReminderTrack =
181+
sharedPreferencesManager.getStringList(SharedPreferencesManager.keyDayReminderTrack) ?? [];
182+
final nowWeekday = now.weekday;
183+
final isTodayReminderTrackEnabled =
184+
daysReminderTrack.where((element) => element == nowWeekday.toString()).isNotEmpty;
185+
186+
int? intervalReminderTrackInSeconds;
187+
final intervalReminderTrackInMinutes =
188+
sharedPreferencesManager.getInt(SharedPreferencesManager.keyIntervalReminderTrack) ?? -1;
189+
if (intervalReminderTrackInMinutes != -1 && intervalReminderTrackInMinutes > 0) {
190+
intervalReminderTrackInSeconds = intervalReminderTrackInMinutes * 60;
191+
}
192+
193+
if (startReminderTrack != null &&
194+
finishReminderTrack != null &&
195+
isTodayReminderTrackEnabled &&
196+
countTimeReminderTrackInSeconds == intervalReminderTrackInSeconds) {
197+
if (now.isAfter(startReminderTrack) && now.isBefore(finishReminderTrack) ||
198+
(now.isAtSameMomentAs(startReminderTrack) || now.isAtSameMomentAs(finishReminderTrack))) {
199+
isShowReminderTrack = true;
200+
}
201+
}
202+
203+
if (countTimeReminderTrackInSeconds == intervalReminderTrackInSeconds ||
204+
intervalReminderTrackInSeconds == null) {
205+
countTimeReminderTrackInSeconds = 0;
206+
}
207+
208+
if (isShowReminderTrack) {
209+
notificationHelper.showReminderNotTrackNotification();
210+
}
211+
} else {
212+
countTimeReminderTrackInSeconds = 0;
134213
}
135214
}
136215

216+
// reset timer jika berpindah hari
137217
final now = DateTime.now();
138218
final dateTimeNow = DateTime(
139219
now.year,
@@ -965,8 +1045,7 @@ class _HomePageState extends State<HomePage> with TrayListener, WindowListener {
9651045
final activity = percentActivity.round();
9661046

9671047
final listPathScreenshots = await platformChannelHelper.doTakeScreenshot();
968-
final isPermissionScreenRecordingGranted =
969-
await platformChannelHelper.checkPermissionScreenRecording();
1048+
final isPermissionScreenRecordingGranted = await platformChannelHelper.checkPermissionScreenRecording();
9701049
if (isPermissionScreenRecordingGranted != null && !isPermissionScreenRecordingGranted) {
9711050
debugPrint('screen recording not granted');
9721051
notificationHelper.showPermissionScreenRecordingIssuedNotification();
@@ -1047,15 +1126,15 @@ class _HomePageState extends State<HomePage> with TrayListener, WindowListener {
10471126
}
10481127

10491128
void startTimer() {
1050-
countTimerReminderNotTrack = 0;
1129+
countTimeReminderTrackInSeconds = 0;
10511130
stopTimer();
10521131
timeTrack = Timer.periodic(const Duration(seconds: 1), (_) {
10531132
increaseTimerTray();
10541133
});
10551134
}
10561135

10571136
void stopTimer() {
1058-
countTimerReminderNotTrack = 0;
1137+
countTimeReminderTrackInSeconds = 0;
10591138
if (timeTrack != null && timeTrack!.isActive) {
10601139
timeTrack!.cancel();
10611140
}

0 commit comments

Comments
 (0)