Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
22 commits
Select commit Hold shift + click to select a range
27a1eb7
delete profile tile added
SGI-CAPP-AT2 Sep 3, 2025
6603ef9
changed taskchampion setting to be profile dependant
SGI-CAPP-AT2 Sep 4, 2025
ff669a1
navigate back icon size increased
SGI-CAPP-AT2 Sep 4, 2025
6445362
menubar language fix
SGI-CAPP-AT2 Sep 4, 2025
45de690
change in bottom sheet color
SGI-CAPP-AT2 Sep 4, 2025
c4ee2cc
added save creds language fix
SGI-CAPP-AT2 Sep 4, 2025
6ebc5c8
language fix on profile page
SGI-CAPP-AT2 Sep 4, 2025
3c1c93f
logs option language adaptation
SGI-CAPP-AT2 Sep 4, 2025
a0c5d38
fix: deleted tasks project surfing fixed
SGI-CAPP-AT2 Sep 4, 2025
71ad104
fix: theme color fixes for snackbar at Show Task of TC
SGI-CAPP-AT2 Sep 4, 2025
41186b8
added preview for hindi and marathi
SGI-CAPP-AT2 Sep 4, 2025
b899a26
TW2 and widget bug of reactivity fixed with new build script
SGI-CAPP-AT2 Sep 4, 2025
72913ad
fix: profile change of TW2 made reactive
SGI-CAPP-AT2 Sep 4, 2025
07a9051
moved option of delete all tasks to settings page
SGI-CAPP-AT2 Sep 4, 2025
d190274
profile page update 2
SGI-CAPP-AT2 Sep 6, 2025
e86de57
ccsync intr: database ensureDatabaseIsOpen() fixed for null check on …
SGI-CAPP-AT2 Sep 6, 2025
431bc41
added rustLib for taskchampion client
SGI-CAPP-AT2 Sep 8, 2025
20a0443
rustlib integrated
SGI-CAPP-AT2 Oct 3, 2025
122f7af
integrated rust functions
SGI-CAPP-AT2 Oct 19, 2025
7fa2a97
due date update failure fixed
SGI-CAPP-AT2 Oct 20, 2025
8aa192f
tags error from rustlib fixed
SGI-CAPP-AT2 Oct 20, 2025
9741929
complete integration with local rust Replica
SGI-CAPP-AT2 Oct 21, 2025
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
4 changes: 2 additions & 2 deletions android/app/build.gradle
Original file line number Diff line number Diff line change
Expand Up @@ -77,12 +77,12 @@ android {
productFlavors {
production {
dimension "default"
applicationId "com.ccextractor.taskwarrior"
applicationId "com.ccextractor.taskwarriorflutter"
signingConfig keystoreProperties.isEmpty() ? signingConfigs.debug : signingConfigs.production
}
nightly {
dimension "default"
applicationId "com.ccextractor.taskwarrior.nightly"
applicationId "com.ccextractor.taskwarriorflutter.nightly"
versionNameSuffix "-nightly"
signingConfig nightlyKeystoreProperties.isEmpty() ? signingConfigs.debug : signingConfigs.nightly
}
Expand Down
2 changes: 1 addition & 1 deletion android/app/src/main/AndroidManifest.xml
Original file line number Diff line number Diff line change
Expand Up @@ -38,7 +38,7 @@
</intent-filter>
</activity>

<receiver android:name="TaskWarriorWidgetProvider"
<receiver android:name=".TaskWarriorWidgetProvider"
android:exported="true">
<intent-filter>
<action android:name="android.appwidget.action.APPWIDGET_UPDATE" />
Expand Down
Binary file not shown.
Binary file not shown.
10 changes: 5 additions & 5 deletions lib/app/modules/about/views/about_page_app_bar.dart
Original file line number Diff line number Diff line change
Expand Up @@ -6,18 +6,17 @@ import 'package:taskwarrior/app/utils/language/sentence_manager.dart';

class AboutPageAppBar extends StatelessWidget implements PreferredSizeWidget {
final AboutController aboutController;
const AboutPageAppBar({required this.aboutController,super.key});
const AboutPageAppBar({required this.aboutController, super.key});

@override
Widget build(BuildContext context) {
return AppBar(
centerTitle: true,
backgroundColor: TaskWarriorColors.kprimaryBackgroundColor,
title: Text(
SentenceManager(
currentLanguage: aboutController.selectedLanguage.value)
.sentences
.aboutPageAppBarTitle,
SentenceManager(currentLanguage: aboutController.selectedLanguage.value)
.sentences
.aboutPageAppBarTitle,
// style: GoogleFonts.poppins(color: TaskWarriorColors.white),
style: TextStyle(
fontFamily: FontFamily.poppins,
Expand All @@ -31,6 +30,7 @@ class AboutPageAppBar extends StatelessWidget implements PreferredSizeWidget {
child: Icon(
Icons.chevron_left,
color: TaskWarriorColors.white,
size: 35,
),
),
);
Expand Down
52 changes: 52 additions & 0 deletions lib/app/modules/home/controllers/home_controller.dart
Original file line number Diff line number Diff line change
Expand Up @@ -8,6 +8,7 @@ import 'package:flutter/material.dart';
import 'package:get/get.dart';
import 'package:home_widget/home_widget.dart';
import 'package:loggy/loggy.dart';
import 'package:path_provider/path_provider.dart';
import 'package:shared_preferences/shared_preferences.dart';
import 'package:taskwarrior/app/models/filters.dart';

Expand All @@ -31,10 +32,13 @@ import 'package:taskwarrior/app/utils/taskfunctions/projects.dart';
import 'package:taskwarrior/app/utils/taskfunctions/query.dart';
import 'package:taskwarrior/app/utils/taskfunctions/tags.dart';
import 'package:taskwarrior/app/utils/app_settings/app_settings.dart';
import 'package:taskwarrior/app/v3/champion/Replica.dart';
import 'package:taskwarrior/app/v3/champion/models/task_for_replica.dart';
import 'package:taskwarrior/app/v3/db/task_database.dart';
import 'package:taskwarrior/app/v3/db/update.dart';
import 'package:taskwarrior/app/v3/models/task.dart';
import 'package:taskwarrior/app/v3/net/fetch.dart';
import 'package:taskwarrior/rust_bridge/api.dart';
import 'package:textfield_tags/textfield_tags.dart';
import 'package:taskwarrior/app/utils/themes/theme_extension.dart';
import 'package:tutorial_coach_mark/tutorial_coach_mark.dart';
Expand Down Expand Up @@ -63,6 +67,7 @@ class HomeController extends GetxController {
final RxBool showbtn = false.obs;
late TaskDatabase taskdb;
var tasks = <TaskForC>[].obs;
var tasksFromReplica = <TaskForReplica>[].obs;
final RxBool isRefreshing = false.obs;

@override
Expand Down Expand Up @@ -101,9 +106,27 @@ class HomeController extends GetxController {
widgetController.update();
}
});
ever(splashController.currentProfile, (_) {
if (splashController.getMode(splashController.currentProfile.value) !=
"TW3") {
refreshTaskWithNewProfile();
}
if (Platform.isAndroid) {
WidgetController widgetController = Get.put(WidgetController());
widgetController.fetchAllData();
widgetController.updateWidget();
}
});
}

Future<List<String>> getUniqueProjects() async {
if (taskReplica.value) {
return tasksFromReplica
.where((task) => task.project != null)
.map((task) => task.project!)
.toSet()
.toList();
}
var taskDatabase = TaskDatabase();
List<String> uniqueProjects = await taskDatabase.fetchUniqueProjects();
debugPrint('Unique projects: $uniqueProjects');
Expand All @@ -116,6 +139,12 @@ class HomeController extends GetxController {
debugPrint('Deleted all tasks from db');
}

Future<void> refreshReplicaTaskList() async {
if (!taskReplica.value) return;
tasksFromReplica.value = await Replica.getAllTasksFromReplica();
debugPrint("Tasks from Replica: ${tasks.length}");
}

Future<void> refreshTasks(String clientId, String encryptionSecret) async {
TaskDatabase taskDatabase = TaskDatabase();
await taskDatabase.open();
Expand All @@ -127,6 +156,16 @@ class HomeController extends GetxController {
}

Future<void> fetchTasksFromDB() async {
debugPrint("Fetching tasks from DB ${taskReplica.value}");
await _loadTaskChampion();
if (taskReplica.value) {
tasksFromReplica.value = await Replica.getAllTasksFromReplica();
debugPrint("Tasks from Replica: ${tasks.length}");
return;
}
if (taskchampion.value == false) {
return;
}
TaskDatabase taskDatabase = TaskDatabase();
await taskDatabase.open();
List<TaskForC> fetchedTasks = await taskDatabase.fetchTasksFromDatabase();
Expand All @@ -136,6 +175,14 @@ class HomeController extends GetxController {
Future<void> _loadTaskChampion() async {
final SharedPreferences prefs = await SharedPreferences.getInstance();
taskchampion.value = prefs.getBool('settings_taskc') ?? false;
taskReplica.value = prefs.getBool('settings_taskr_repl') ?? false;
}

Future<void> refreshReplicaTasks() async {
if (!taskReplica.value) return;
await Replica.sync();
tasksFromReplica.value = await Replica.getAllTasksFromReplica();
debugPrint("Tasks from Replica: ${tasks.length}");
}

void addListenerToScrollController() {
Expand Down Expand Up @@ -327,6 +374,10 @@ class HomeController extends GetxController {
_refreshTasks();
}

Future<void> syncReplica() async {
await Replica.sync();
}

Future<void> synchronize(BuildContext context, bool isDialogNeeded) async {
try {
final connectivityResult = await Connectivity().checkConnectivity();
Expand Down Expand Up @@ -503,6 +554,7 @@ class HomeController extends GetxController {
RxBool delaytask = false.obs;
RxBool change24hr = false.obs;
RxBool taskchampion = false.obs;
RxBool taskReplica = false.obs;

// dialogue box
final formKey = GlobalKey<FormState>();
Expand Down
87 changes: 84 additions & 3 deletions lib/app/modules/home/views/add_task_bottom_sheet_new.dart
Original file line number Diff line number Diff line change
@@ -1,3 +1,4 @@
import 'dart:collection';
import 'dart:io';

import 'package:flutter/material.dart';
Expand All @@ -16,13 +17,18 @@ import 'package:taskwarrior/app/utils/taskfunctions/add_task_dialog_utils.dart';
import 'package:taskwarrior/app/utils/taskfunctions/tags.dart';
import 'package:taskwarrior/app/utils/taskfunctions/taskparser.dart';
import 'package:taskwarrior/app/utils/themes/theme_extension.dart';
import 'package:taskwarrior/app/v3/champion/Replica.dart';
import 'package:taskwarrior/app/v3/models/task.dart';

class AddTaskBottomSheet extends StatelessWidget {
final HomeController homeController;
final bool forTaskC;
final bool forReplica;
const AddTaskBottomSheet(
{required this.homeController, super.key, this.forTaskC = false});
{required this.homeController,
super.key,
this.forTaskC = false,
this.forReplica = false});

@override
Widget build(BuildContext context) {
Expand Down Expand Up @@ -66,6 +72,9 @@ class AddTaskBottomSheet extends StatelessWidget {
onPressed: () {
if (forTaskC) {
onSaveButtonClickedTaskC(context);
} else if (forReplica) {
debugPrint("Saving to Replica");
onSaveButtonClickedForReplica(context);
} else {
onSaveButtonClicked(context);
}
Expand Down Expand Up @@ -215,7 +224,7 @@ class AddTaskBottomSheet extends StatelessWidget {
onDateChanges: (List<DateTime?> p0) {
homeController.selectedDates.value = p0;
},
onlyDueDate: forTaskC,
onlyDueDate: forTaskC || forReplica,
);

Widget buildPriority(BuildContext context) => Column(
Expand Down Expand Up @@ -354,7 +363,6 @@ class AddTaskBottomSheet extends StatelessWidget {
}

void onSaveButtonClicked(BuildContext context) async {
// print(homeController.formKey.currentState);
if (homeController.formKey.currentState!.validate()) {
try {
var task = taskParser(homeController.namecontroller.text)
Expand Down Expand Up @@ -432,4 +440,77 @@ class AddTaskBottomSheet extends StatelessWidget {
}
}
}

void onSaveButtonClickedForReplica(BuildContext context) async {
if (homeController.formKey.currentState!.validate()) {
try {
await Replica.addTaskToReplica(HashMap<String, dynamic>.from({
"description": homeController.namecontroller.text,
"due": getDueDate(homeController.selectedDates)?.toUtc(),
"priority": homeController.priority.value,
"project": homeController.projectcontroller.text != ""
? homeController.projectcontroller.text
: null,
"wait": getWaitDate(homeController.selectedDates)?.toUtc(),
"tags": homeController.tags,
}));
homeController.namecontroller.text = '';
homeController.projectcontroller.text = '';
homeController.dueString.value = "";
homeController.priority.value = 'X';
homeController.tagcontroller.text = '';
homeController.tags.value = [];
homeController.update();
Get.back();
if (Platform.isAndroid) {
WidgetController widgetController = Get.put(WidgetController());
widgetController.fetchAllData();
widgetController.update();
}

homeController.update();
ScaffoldMessenger.of(context).showSnackBar(SnackBar(
content: Text(
SentenceManager(
currentLanguage: homeController.selectedLanguage.value)
.sentences
.addTaskTaskAddedSuccessfully,
style: TextStyle(
color: AppSettings.isDarkMode
? TaskWarriorColors.kprimaryTextColor
: TaskWarriorColors.kLightPrimaryTextColor,
),
),
backgroundColor: AppSettings.isDarkMode
? TaskWarriorColors.ksecondaryBackgroundColor
: TaskWarriorColors.kLightSecondaryBackgroundColor,
duration: const Duration(seconds: 2)));

final SharedPreferences prefs = await SharedPreferences.getInstance();
bool? value;
value = prefs.getBool('sync-OnTaskCreate') ?? false;
// late InheritedStorage storageWidget;
// storageWidget = StorageWidget.of(context);
var storageWidget = Get.find<HomeController>();
if (value) {
storageWidget.synchronize(context, true);
}
await storageWidget.refreshReplicaTasks();
} on FormatException catch (e) {
ScaffoldMessenger.of(context).showSnackBar(SnackBar(
content: Text(
e.message,
style: TextStyle(
color: AppSettings.isDarkMode
? TaskWarriorColors.kprimaryTextColor
: TaskWarriorColors.kLightPrimaryTextColor,
),
),
backgroundColor: AppSettings.isDarkMode
? TaskWarriorColors.ksecondaryBackgroundColor
: TaskWarriorColors.kLightSecondaryBackgroundColor,
duration: const Duration(seconds: 2)));
}
}
}
}
Loading