Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
8 changes: 8 additions & 0 deletions lib/app/modules/detailRoute/views/dateTimePicker.dart
Original file line number Diff line number Diff line change
Expand Up @@ -163,6 +163,14 @@ class DateTimeWidget extends StatelessWidget {
var time = await showTimePicker(
context: context,
initialTime: TimeOfDay.now(),
builder: (BuildContext context, Widget? child) {
return MediaQuery(
data: MediaQuery.of(context).copyWith(
alwaysUse24HourFormat: AppSettings.use24HourFormatRx.value,
),
child: child!,
);
},
);
if (time != null) {
var dateTime = date.add(
Expand Down
5 changes: 4 additions & 1 deletion lib/app/modules/detailRoute/views/detail_route_view.dart
Original file line number Diff line number Diff line change
Expand Up @@ -262,7 +262,10 @@ class AttributeWidget extends StatelessWidget {
@override
Widget build(BuildContext context) {
var localValue = (value is DateTime)
? DateFormat.yMEd().add_jms().format(value.toLocal())
? DateFormat(AppSettings.use24HourFormatRx.value
? 'EEE, yyyy-MM-dd HH:mm:ss'
: 'EEE, yyyy-MM-dd hh:mm:ss a')
.format(value.toLocal())
: ((value is BuiltList) ? (value).toBuilder() : value);
TaskwarriorColorTheme tColors =
Theme.of(context).extension<TaskwarriorColorTheme>()!;
Expand Down
7 changes: 6 additions & 1 deletion lib/app/modules/home/controllers/home_controller.dart
Original file line number Diff line number Diff line change
Expand Up @@ -89,6 +89,12 @@ class HomeController extends GetxController {
getUniqueProjects();
_loadTaskChampion();
fetchTasksFromDB();

ever(AppSettings.use24HourFormatRx, (_) {
_refreshTasks();
update();
});

ever(taskReplica, (_) {
if (taskReplica.value) refreshReplicaTaskList();
});
Expand Down Expand Up @@ -562,7 +568,6 @@ class HomeController extends GetxController {
RxBool syncOnStart = false.obs;
RxBool syncOnTaskCreate = false.obs;
RxBool delaytask = false.obs;
RxBool change24hr = false.obs;
RxBool taskchampion = false.obs;
RxBool taskReplica = false.obs;

Expand Down
2 changes: 0 additions & 2 deletions lib/app/modules/home/views/nav_drawer.dart
Original file line number Diff line number Diff line change
Expand Up @@ -161,8 +161,6 @@ class NavDrawer extends StatelessWidget {
prefs.getBool('sync-OnTaskCreate') ?? false;
homeController.delaytask.value =
prefs.getBool('delaytask') ?? false;
homeController.change24hr.value =
prefs.getBool('24hourformate') ?? false;

Get.toNamed(Routes.SETTINGS);
},
Expand Down
2 changes: 0 additions & 2 deletions lib/app/modules/settings/controllers/settings_controller.dart
Original file line number Diff line number Diff line change
Expand Up @@ -217,7 +217,6 @@ class SettingsController extends GetxController {
RxBool isSyncOnStartActivel = false.obs;
RxBool isSyncOnTaskCreateActivel = false.obs;
RxBool delaytask = false.obs;
RxBool change24hr = false.obs;
RxBool taskchampion = false.obs;
RxBool isDarkModeOn = false.obs;

Expand All @@ -232,7 +231,6 @@ class SettingsController extends GetxController {
isSyncOnTaskCreateActivel.value =
prefs.getBool('sync-OnTaskCreate') ?? false;
delaytask.value = prefs.getBool('delaytask') ?? false;
change24hr.value = prefs.getBool('24hourformate') ?? false;
taskchampion.value = prefs.getBool('settings_taskc') ?? false;
initDarkMode();
baseDirectory.value = await getBaseDirectory();
Expand Down
Original file line number Diff line number Diff line change
@@ -1,12 +1,10 @@
import 'package:flutter/material.dart';

import 'package:get/get.dart';
import 'package:shared_preferences/shared_preferences.dart';
import 'package:taskwarrior/app/modules/home/controllers/home_controller.dart';
import 'package:taskwarrior/app/utils/app_settings/app_settings.dart';

import '../controllers/settings_controller.dart';


class SettingsPageEnable24hrFormatListTileTrailing extends StatelessWidget {
final SettingsController controller;
const SettingsPageEnable24hrFormatListTileTrailing(
Expand All @@ -16,13 +14,14 @@ class SettingsPageEnable24hrFormatListTileTrailing extends StatelessWidget {
Widget build(BuildContext context) {
return Obx(
() => Switch(
value: controller.change24hr.value,
value: AppSettings.use24HourFormatRx.value,
onChanged: (bool value) async {
controller.change24hr.value = value;

final SharedPreferences prefs = await SharedPreferences.getInstance();
await prefs.setBool('24hourformate', value);
Get.find<HomeController>().change24hr.value = value;
AppSettings.use24HourFormatRx.value = value;
AppSettings.saveSettings(
AppSettings.isDarkMode,
AppSettings.selectedLanguage,
value,
);
},
),
);
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -106,24 +106,40 @@ class TaskcDetailsController extends GetxController {
String formatDate(dynamic date) {
if (date == null) return '-';
// If date is epoch seconds as int
bool is24hrFormat = AppSettings.use24HourFormatRx.value;
final pattern = is24hrFormat
? 'EEE, yyyy-MM-dd HH:mm:ss'
: 'EEE, yyyy-MM-dd hh:mm:ss a';

if (date == null) return '-';

if (date is int) {
try {
final dt = DateTime.fromMillisecondsSinceEpoch(date * 1000);
return DateFormat('yyyy-MM-dd HH:mm:ss').format(dt.toLocal());
return DateFormat(pattern).format(dt.toLocal());
} catch (e) {
debugPrint('Error formatting epoch date: $e');
return '-';
}
}

if (date is DateTime) {
return DateFormat('yyyy-MM-dd HH:mm:ss').format(date.toLocal());
try {
return DateFormat(pattern).format(date.toLocal());
} catch (e) {
debugPrint('Error formatting DateTime: $e');
return '-';
}
}

final dateString = date?.toString() ?? '';
if (dateString.isEmpty || dateString == '-') return '-';

try {
DateTime parsedDate = DateTime.parse(dateString).toLocal();
return DateFormat('yyyy-MM-dd HH:mm:ss').format(parsedDate);
final parsedDate = DateTime.parse(dateString).toLocal();
return DateFormat(pattern).format(parsedDate);
} catch (e) {
debugPrint('Error parsing date: $dateString');
debugPrint('Error parsing date: $dateString $e');
return '-';
}
}
Expand Down Expand Up @@ -212,6 +228,11 @@ class TaskcDetailsController extends GetxController {
}

Future<void> saveTask() async {
bool is24hrFormat = AppSettings.use24HourFormatRx.value;
final datePattern = is24hrFormat
? 'EEE, yyyy-MM-dd HH:mm:ss'
: 'EEE, yyyy-MM-dd hh:mm:ss a';

if (tags.length == 1 && tags[0] == "") {
tags.clear();
}
Expand Down Expand Up @@ -247,7 +268,7 @@ class TaskcDetailsController extends GetxController {
due: () {
if (due.string == '-' || due.string.isEmpty) return null;
try {
final parsed = DateFormat('yyyy-MM-dd HH:mm:ss').parse(due.string);
final parsed = DateFormat(datePattern).parse(due.string);
return parsed.toUtc().toIso8601String();
} catch (e) {
try {
Expand All @@ -263,8 +284,7 @@ class TaskcDetailsController extends GetxController {
start: () {
if (start.string == '-' || start.string.isEmpty) return null;
try {
final parsed =
DateFormat('yyyy-MM-dd HH:mm:ss').parse(start.string);
final parsed = DateFormat(datePattern).parse(start.string);
return parsed.toUtc().toIso8601String();
} catch (e) {
try {
Expand All @@ -280,7 +300,7 @@ class TaskcDetailsController extends GetxController {
wait: () {
if (wait.string == '-' || wait.string.isEmpty) return null;
try {
final parsed = DateFormat('yyyy-MM-dd HH:mm:ss').parse(wait.string);
final parsed = DateFormat(datePattern).parse(wait.string);
return parsed.toUtc().toIso8601String();
} catch (e) {
try {
Expand Down
24 changes: 13 additions & 11 deletions lib/app/modules/taskc_details/views/taskc_details_view.dart
Original file line number Diff line number Diff line change
Expand Up @@ -3,7 +3,6 @@
import 'package:flutter/material.dart';
import 'package:get/get.dart';
import 'package:google_fonts/google_fonts.dart';
import 'package:intl/intl.dart';
import 'package:taskwarrior/app/utils/app_settings/app_settings.dart';
import 'package:taskwarrior/app/utils/constants/taskwarrior_colors.dart';
import 'package:taskwarrior/app/utils/themes/theme_extension.dart';
Expand Down Expand Up @@ -76,14 +75,14 @@ class TaskcDetailsView extends GetView<TaskcDetailsController> {
controller.start.value,
() => controller.updateField(
controller.start,
DateFormat('yyyy-MM-dd HH:mm:ss')
.format(DateTime.now()),
controller.formatDate(DateTime.now()),
),
)
: _buildDetail(
context,
'${SentenceManager(currentLanguage: AppSettings.selectedLanguage).sentences.detailPageStart}:',
controller.formatDate(controller.start.value)),
controller.start.value,
disabled: true),
_buildDatePickerDetail(
context,
'${SentenceManager(currentLanguage: AppSettings.selectedLanguage).sentences.detailPageWait}:',
Expand Down Expand Up @@ -148,11 +147,11 @@ class TaskcDetailsView extends GetView<TaskcDetailsController> {

// Modified is available for both; show it for both types
_buildDetail(
context,
'${SentenceManager(currentLanguage: AppSettings.selectedLanguage).sentences.detailPageModified}:',
controller.formatDate(
controller.initialTaskModifiedForFormatting()),
),
context,
'${SentenceManager(currentLanguage: AppSettings.selectedLanguage).sentences.detailPageModified}:',
controller.formatDate(
controller.initialTaskModifiedForFormatting()),
disabled: true),
],
),
),
Expand Down Expand Up @@ -203,7 +202,8 @@ class TaskcDetailsView extends GetView<TaskcDetailsController> {
);
}

Widget _buildDetail(BuildContext context, String label, String value) {
Widget _buildDetail(BuildContext context, String label, String value,
{bool disabled = false}) {
TaskwarriorColorTheme tColors =
Theme.of(context).extension<TaskwarriorColorTheme>()!;
return Container(
Expand All @@ -230,7 +230,9 @@ class TaskcDetailsView extends GetView<TaskcDetailsController> {
style: TextStyle(
fontWeight: FontWeight.bold,
fontSize: 18,
color: tColors.primaryTextColor,
color: disabled
? tColors.primaryDisabledTextColor
: tColors.primaryTextColor,
),
),
const SizedBox(width: 8),
Expand Down
12 changes: 11 additions & 1 deletion lib/app/services/notification_services.dart
Original file line number Diff line number Diff line change
Expand Up @@ -7,6 +7,8 @@ import 'package:flutter/foundation.dart';
import 'package:flutter_local_notifications/flutter_local_notifications.dart';
import 'package:timezone/data/latest.dart' as tz;
import 'package:timezone/timezone.dart' as tz;
import 'package:intl/intl.dart';
import 'package:taskwarrior/app/utils/app_settings/app_settings.dart';

class NotificationService {
final FlutterLocalNotificationsPlugin _flutterLocalNotificationsPlugin =
Expand Down Expand Up @@ -53,13 +55,21 @@ class NotificationService {
return notificationId;
}

// Helper method to format date time based on user preferences
String getFormattedDateTime(DateTime dateTime) {
String timeFormat = AppSettings.use24HourFormatRx.value
? 'yyyy-MM-dd HH:mm:ss'
: 'yyyy-MM-dd hh:mm:ss a';
return DateFormat(timeFormat).format(dateTime);
}

void sendNotification(
DateTime dtb, String taskname, bool isWait, DateTime entryTime) async {
DateTime dateTime = DateTime.now();
tz.initializeTimeZones();
if (kDebugMode) {
print("date and time are:-$dateTime");
print("date and time are:-$dtb");
print("date and time are:-${getFormattedDateTime(dtb)}");
}
final tz.TZDateTime scheduledAt =
tz.TZDateTime.from(dtb.add(const Duration(minutes: 0)), tz.local);
Expand Down
8 changes: 7 additions & 1 deletion lib/app/utils/app_settings/app_settings.dart
Original file line number Diff line number Diff line change
@@ -1,20 +1,24 @@
import 'package:get/get.dart';
import 'package:home_widget/home_widget.dart';
import 'package:shared_preferences/shared_preferences.dart';
import 'package:taskwarrior/app/utils/language/supported_language.dart';

part 'save_tour_status.dart';
part 'selected_theme.dart';
part 'selected_language.dart';
part 'selected_time_format.dart';

class AppSettings {
static bool isDarkMode = true;
static SupportedLanguage selectedLanguage = SupportedLanguage.english;
static final RxBool use24HourFormatRx = false.obs;

static Future init() async {
await HomeWidget.setAppGroupId("group.taskwarrior");
await SelectedTheme.init();
await SelectedLanguage.init();
await SaveTourStatus.init();
await SelectedTimeFormat.init();

isDarkMode = SelectedTheme.getMode() ?? true;

Expand All @@ -29,11 +33,13 @@ class AppSettings {
// Save the system language as the user's preference
await SelectedLanguage.saveSelectedLanguage(selectedLanguage);
}
use24HourFormatRx.value = SelectedTimeFormat.getTimeFormat() ?? false;
}

static Future saveSettings(
bool isDarkMode, SupportedLanguage language) async {
bool isDarkMode, SupportedLanguage language, bool use24hour) async {
await SelectedTheme.saveMode(isDarkMode);
await SelectedLanguage.saveSelectedLanguage(language);
await SelectedTimeFormat.saveTimeFormat(use24hour);
}
}
17 changes: 17 additions & 0 deletions lib/app/utils/app_settings/selected_time_format.dart
Original file line number Diff line number Diff line change
@@ -0,0 +1,17 @@
part of 'app_settings.dart';

class SelectedTimeFormat {
static SharedPreferences? _preferences;

static Future init() async {
_preferences = await SharedPreferences.getInstance();
}

static Future saveTimeFormat(bool mode) async {
await _preferences?.setBool('24hourformate', mode);
}

static bool? getTimeFormat() {
return _preferences?.getBool('24hourformate');
}
}
Loading