From 0272b2d1fd95c6fe6268f3633cea720ee2ed49e7 Mon Sep 17 00:00:00 2001 From: warlock Date: Sat, 5 Mar 2022 18:48:18 +0530 Subject: [PATCH] Polished --- android/app/src/main/AndroidManifest.xml | 9 + images/empty.png | Bin 0 -> 215831 bytes images/hourglass_base.png | Bin 1374 -> 0 bytes images/hourglass_half.png | Bin 3518 -> 0 bytes lib/Activities.dart | 49 +- lib/Categories.dart | 16 +- lib/Data.dart | 41 +- lib/Dialogs.dart | 41 ++ lib/NewCategory.dart | 4 +- lib/NewTask.dart | 4 +- lib/Settings/NotificationSettings.dart | 63 +- lib/Tasks.dart | 35 +- lib/User.dart | 540 +++++++----------- lib/Welcome.dart | 2 +- lib/main.dart | 166 ++++-- lib/newActivity.dart | 14 +- lib/splash.dart | 47 +- linux/.gitignore | 1 + linux/CMakeLists.txt | 116 ++++ linux/flutter/CMakeLists.txt | 87 +++ linux/flutter/generated_plugin_registrant.cc | 11 + linux/flutter/generated_plugin_registrant.h | 15 + linux/flutter/generated_plugins.cmake | 15 + linux/main.cc | 6 + linux/my_application.cc | 104 ++++ linux/my_application.h | 18 + pubspec.lock | 126 +++- pubspec.yaml | 7 +- web/favicon.png | Bin 0 -> 917 bytes web/icons/Icon-192.png | Bin 0 -> 5292 bytes web/icons/Icon-512.png | Bin 0 -> 8252 bytes web/icons/Icon-maskable-192.png | Bin 0 -> 5594 bytes web/icons/Icon-maskable-512.png | Bin 0 -> 20998 bytes web/index.html | 104 ++++ web/manifest.json | 35 ++ windows/.gitignore | 17 + windows/CMakeLists.txt | 95 +++ windows/flutter/CMakeLists.txt | 103 ++++ .../flutter/generated_plugin_registrant.cc | 14 + windows/flutter/generated_plugin_registrant.h | 15 + windows/flutter/generated_plugins.cmake | 16 + windows/runner/CMakeLists.txt | 17 + windows/runner/Runner.rc | 121 ++++ windows/runner/flutter_window.cpp | 61 ++ windows/runner/flutter_window.h | 33 ++ windows/runner/main.cpp | 43 ++ windows/runner/resource.h | 16 + windows/runner/resources/app_icon.ico | Bin 0 -> 33772 bytes windows/runner/runner.exe.manifest | 20 + windows/runner/utils.cpp | 64 +++ windows/runner/utils.h | 19 + windows/runner/win32_window.cpp | 245 ++++++++ windows/runner/win32_window.h | 98 ++++ 53 files changed, 2233 insertions(+), 440 deletions(-) create mode 100644 images/empty.png delete mode 100644 images/hourglass_base.png delete mode 100644 images/hourglass_half.png create mode 100644 lib/Dialogs.dart create mode 100644 linux/.gitignore create mode 100644 linux/CMakeLists.txt create mode 100644 linux/flutter/CMakeLists.txt create mode 100644 linux/flutter/generated_plugin_registrant.cc create mode 100644 linux/flutter/generated_plugin_registrant.h create mode 100644 linux/flutter/generated_plugins.cmake create mode 100644 linux/main.cc create mode 100644 linux/my_application.cc create mode 100644 linux/my_application.h create mode 100644 web/favicon.png create mode 100644 web/icons/Icon-192.png create mode 100644 web/icons/Icon-512.png create mode 100644 web/icons/Icon-maskable-192.png create mode 100644 web/icons/Icon-maskable-512.png create mode 100644 web/index.html create mode 100644 web/manifest.json create mode 100644 windows/.gitignore create mode 100644 windows/CMakeLists.txt create mode 100644 windows/flutter/CMakeLists.txt create mode 100644 windows/flutter/generated_plugin_registrant.cc create mode 100644 windows/flutter/generated_plugin_registrant.h create mode 100644 windows/flutter/generated_plugins.cmake create mode 100644 windows/runner/CMakeLists.txt create mode 100644 windows/runner/Runner.rc create mode 100644 windows/runner/flutter_window.cpp create mode 100644 windows/runner/flutter_window.h create mode 100644 windows/runner/main.cpp create mode 100644 windows/runner/resource.h create mode 100644 windows/runner/resources/app_icon.ico create mode 100644 windows/runner/runner.exe.manifest create mode 100644 windows/runner/utils.cpp create mode 100644 windows/runner/utils.h create mode 100644 windows/runner/win32_window.cpp create mode 100644 windows/runner/win32_window.h diff --git a/android/app/src/main/AndroidManifest.xml b/android/app/src/main/AndroidManifest.xml index bbc1b7f..fb25e39 100644 --- a/android/app/src/main/AndroidManifest.xml +++ b/android/app/src/main/AndroidManifest.xml @@ -1,10 +1,19 @@ + + + + + + + + + $(loxvR=Z$4&9D0z)>3T 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

d;Z1R^T#MYA4oA*{H&B_N6Lq#i+Mq4Km4R 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

8DB@s2OEQ2~Wr37#^Uej)eQ=EVcgA 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 _ActivitiesState(); } -late ProgressDialog progressDialog; + class _ActivitiesState extends State { + //late ProgressDialog progressDialog; TextEditingController searchController = TextEditingController(); FocusNode _focus = FocusNode(); bool searching = false; @@ -38,6 +37,7 @@ class _ActivitiesState extends State { super.initState(); _focus.addListener(_onFocusChange); UpdateList(); + //init(context); } @override @@ -47,10 +47,20 @@ class _ActivitiesState extends State { _focus.removeListener(_onFocusChange); _focus.dispose(); } + void UpdateList() async { + try { + //progressDialog.show(max: 100, msg: 'Loading Activities'); + } catch (e) {} + await User.refreshUserData(); + setState(() {}); + try { + // progressDialog.update(value: 100); + } catch (e) {} + } @override Widget build(BuildContext context) { - progressDialog = ProgressDialog(context: context); + // progressDialog = ProgressDialog(context: context); return Scaffold( floatingActionButton: FloatingActionButton.extended( onPressed: () { @@ -129,9 +139,9 @@ class _ActivitiesState extends State { ), InkWell( onTap: () { - setState(() async { - await User.refreshUserData(); - UpdateList(); + UpdateList(); + setState(() { + }); }, child: Icon(Icons.refresh, size: 30), @@ -140,7 +150,7 @@ class _ActivitiesState extends State { ), ], )), - drawer: navDrawer(context, 2), + drawer: Main.navDrawer(context, 2), body: Container( padding: EdgeInsets.all(0), child: SingleChildScrollView( @@ -149,16 +159,6 @@ class _ActivitiesState extends State { )))); } - void UpdateList() async { - try { - progressDialog.show(max: 100, msg: 'Loading Activities'); - } catch (e) {} - await User.updateActList(); - setState(() {}); - try { - progressDialog.update(value: 100); - } catch (e) {} - } List PrintTasks() { List _tasks = []; @@ -214,9 +214,10 @@ class _ActivitiesState extends State { if (element.taskType.cat == null) { print('Got some null cat : ${element.taskType.name}'); } else { - Color color = HexColor.fromHex(element.taskType.cat?.color ?? '#000000'); + Color color = Main.HexColor.fromHex(element.taskType.cat?.color ?? '#000000'); bool productive = element.taskType.cat?.productive ?? true; Widget task = ActivityCard(context, name, element.startTime, element.endTime, productive, color, element, totalMinutes[thisDate] ?? 0); + // print('Activity : ${name} ,sTime: ${element.startTime}, eTime: ${element.endTime}'); _tasks.add(task); } } @@ -252,7 +253,7 @@ class _ActivitiesState extends State { children: [ Container( child: Align( - child: FittedBox(fit: BoxFit.fitWidth,child: Text(MinutesToTimeString(prodActs),)), + child: FittedBox(fit: BoxFit.fitWidth,child: Text(Main.MinutesToTimeString(prodActs),)), alignment: Alignment.center, ), width: (prodPercentage) * 1.7, @@ -261,7 +262,7 @@ class _ActivitiesState extends State { ), Container( child: Align( - child: Text(MinutesToTimeString(unprodActs)), + child: Text(Main.MinutesToTimeString(unprodActs)), alignment: Alignment.center, ), width: (100 - prodPercentage) * 1.7, @@ -400,7 +401,7 @@ class _ActivitiesState extends State { } void DeleteSelectedTasks() async { - progressDialog.show(max: 100, msg: 'Deleteing ${selectedActivities.length} Activities'); + //progressDialog.show(max: 100, msg: 'Deleteing ${selectedActivities.length} Activities'); selectedActivities.forEach((element) async { await User.UserOperations.deleteActivity(element, bulk: true); }); @@ -411,7 +412,7 @@ class _ActivitiesState extends State { selectedActivities = []; selecting = false; setState(() { - progressDialog.update(value: 100); + // progressDialog.update(value: 100); }); } } diff --git a/lib/Categories.dart b/lib/Categories.dart index bc8f5eb..1228447 100644 --- a/lib/Categories.dart +++ b/lib/Categories.dart @@ -4,7 +4,6 @@ import 'main.dart'; import 'NewTask.dart'; import 'User.dart' as User; import 'Data.dart'; -import 'package:sn_progress_dialog/sn_progress_dialog.dart'; class Categories extends StatefulWidget { const Categories({Key? key}) : super(key: key); @@ -12,20 +11,25 @@ class Categories extends StatefulWidget { _CategoriesState createState() => _CategoriesState(); } -late ProgressDialog progressDialog; + bool selecting=false; class _CategoriesState extends State { @override void initState() { // TODO: implement initState super.initState(); - + //init(context); UpdateList(); } + @override void dispose() { + // TODO: implement dispose + super.dispose(); + } + + @override Widget build(BuildContext context) { - progressDialog=ProgressDialog(context: context); return Scaffold( floatingActionButton: FloatingActionButton.extended( onPressed: () { @@ -66,7 +70,7 @@ class _CategoriesState extends State { } void UpdateList() async { - await User.updateCatsList(); + await User.refreshUserData(); setState(() {}); } @@ -92,7 +96,6 @@ class _CategoriesState extends State { } void DeleteSelectedCats() async{ - progressDialog.show(max: 100, msg: 'Deleteing ${selectedTasks.length} Categories'); selectedTasks.forEach((element) async { await User.UserOperations.deleteCategory(element, bulk:true); }); @@ -102,7 +105,6 @@ class _CategoriesState extends State { selectedTasks=[]; selecting=false; setState(() { - progressDialog.update(value: 100); }); } diff --git a/lib/Data.dart b/lib/Data.dart index 08956aa..a7ff3da 100644 --- a/lib/Data.dart +++ b/lib/Data.dart @@ -1,9 +1,11 @@ import 'dart:async'; +import 'package:intl/intl.dart'; import 'package:shared_preferences/shared_preferences.dart'; import 'package:uuid/uuid.dart'; import 'theme_provider.dart'; import 'package:provider/provider.dart'; +import 'User.dart' as User; class Category{ Category(this.category_id, this.name, this.color, this.productive); @@ -99,10 +101,47 @@ class Settings{ } } - static Future setTheme(int value) async{ final prefs = await SharedPreferences.getInstance(); await prefs.setInt("theme", value); } + + static String notification_key= "notification_interval"; + + static Future getNotificationInterval() async{ + final prefs = await SharedPreferences.getInstance(); + + int _value = 1; + if(prefs.containsKey(notification_key)){ + _value = await prefs.getInt(notification_key) ?? 1; + }else{ + prefs.setInt(notification_key,_value); + } + + return _value; + } + + static Future setNotificationInterval(int value) async{ + final prefs = await SharedPreferences.getInstance(); + prefs.setInt(notification_key, value); + } + static List notificationOptions = ['Off','1 hour', '2 hour', '3 hour', '4 hour', '5 hour', '6 hour']; + + static bool adaptiveNotificationAvailable() { + List dates = []; + if(User.activities.length < 10){ + return false; + }else{ + for (var element in User.activities) { + String thisDate = DateFormat("MM/dd").format(element.startTime); + if(!dates.contains(thisDate)){ + dates.add(thisDate); + } + } + } + + return (dates.length > 2); + + } } final settings = Settings(); \ No newline at end of file diff --git a/lib/Dialogs.dart b/lib/Dialogs.dart new file mode 100644 index 0000000..b1ac986 --- /dev/null +++ b/lib/Dialogs.dart @@ -0,0 +1,41 @@ +import 'package:flutter/cupertino.dart'; +import 'package:flutter/material.dart'; +import 'package:flutter_spinkit/flutter_spinkit.dart'; +import 'main.dart'; + +class Dialogs{ + static bool showing = false; + static BuildContext? context; + static List popupsOpened=[]; + static waiting( String title){ + showing=true; + context=navigatorKey.currentContext; + if(context!=null) { + return showDialog( + context: context!, + barrierDismissible: false, + routeSettings: const RouteSettings(name: "Progress"), + builder: (BuildContext context) { + return AlertDialog( + title: Row( + mainAxisSize: MainAxisSize.max, + mainAxisAlignment: MainAxisAlignment.spaceBetween, + children: [ + SpinKitChasingDots(color: Colors.green), + Expanded(child: Text(title,textAlign: TextAlign.center,)), + ], + ), + ); + } + ); + } + } + + + static hide(){ + showing=false; + Navigator.of(navigatorKey.currentContext!).popUntil((route){ + return route.settings.name!="Progress"; + }); + } +} \ No newline at end of file diff --git a/lib/NewCategory.dart b/lib/NewCategory.dart index caed134..ff54583 100644 --- a/lib/NewCategory.dart +++ b/lib/NewCategory.dart @@ -161,7 +161,9 @@ class _NewCategoryState extends State { } var hex = '#${pickerColor.value.toRadixString(16)}'; await User.UserOperations.addCategory(catName, hex, productive); - Navigator.of(context).pop(); + Navigator.of(context).popUntil((route){ + return route.isFirst; + }); } } diff --git a/lib/NewTask.dart b/lib/NewTask.dart index 3fdaa76..1acf0a3 100644 --- a/lib/NewTask.dart +++ b/lib/NewTask.dart @@ -148,7 +148,9 @@ class _NewTaskState extends State { return; } await User.UserOperations.addTaskType(catName,selectedCat); - Navigator.of(context).pop(); + Navigator.of(context).popUntil((route){ + return route.isFirst; + }); } } diff --git a/lib/Settings/NotificationSettings.dart b/lib/Settings/NotificationSettings.dart index 42e3b5a..d029ab8 100644 --- a/lib/Settings/NotificationSettings.dart +++ b/lib/Settings/NotificationSettings.dart @@ -1,4 +1,5 @@ import 'package:flutter/material.dart'; +import 'package:tasktracker/Data.dart'; class NotificationSettings extends StatefulWidget { const NotificationSettings({Key? key}) : super(key: key); @@ -8,6 +9,26 @@ class NotificationSettings extends StatefulWidget { } class _NotificationSettingsState extends State { + String dropdownValue = Settings.notificationOptions[1]; + + bool suggestionNotification = true; + bool adaptiveNotification =true; + bool adaptiveNotificationAvailable =false; + @override void initState() { + // TODO: implement initState + super.initState(); + + updateSettings(); + } + + void updateSettings() async{ + int notificationInterval= await Settings.getNotificationInterval(); + adaptiveNotificationAvailable = Settings.adaptiveNotificationAvailable(); + setState(() { + dropdownValue=Settings.notificationOptions[notificationInterval]; + }); + } + @override Widget build(BuildContext context) { return Scaffold( @@ -19,13 +40,51 @@ class _NotificationSettingsState extends State { height: 10, ), ListTile( + enabled: adaptiveNotificationAvailable, + title: Text("Adaptive Notifications"), + trailing:(adaptiveNotificationAvailable) ?Switch.adaptive(value: adaptiveNotification, onChanged: (val){ + adaptiveNotification=val; + setState(() { + + }); + }) : Text("Track more data to activate this", style: TextStyle(color: Colors.red)), + subtitle: Text("Notifies you to track activities according to your past activities patterns"), + + ), + ListTile( + enabled: !adaptiveNotification, title: Text("New Activity Notification"), - trailing: InkWell(onTap:(){},child: Text("1 hour")), + trailing:(adaptiveNotification) ? (Text("Adaptive")) : DropdownButton( + value: dropdownValue, + icon: const Icon(Icons.arrow_downward), + elevation: 16, + underline: Container( + height: 2, + color: Colors.red, + ), + onChanged: (String? newValue) { + setState(() { + Settings.setNotificationInterval(Settings.notificationOptions.indexOf(newValue!)); + dropdownValue = newValue!; + }); + }, + items:Settings.notificationOptions.map>((String value) { + return DropdownMenuItem( + value: value, + child: Text(value), + ); + }).toList(), + ), subtitle: Text("Notify you to track activities of past time"), ), Divider(), ListTile( - title: Text("Suggestion Notifications"), trailing:Switch.adaptive(value: true, onChanged: (val){}), + title: Text("Suggestion Notifications"), trailing:Switch.adaptive(value: suggestionNotification, onChanged: (val){ + suggestionNotification=val; + setState(() { + + }); + }), subtitle: Text("Notifies you about suggestions according to your data"), ) diff --git a/lib/Tasks.dart b/lib/Tasks.dart index 58a2a8a..bfb1ad6 100644 --- a/lib/Tasks.dart +++ b/lib/Tasks.dart @@ -3,9 +3,7 @@ import 'main.dart'; import 'NewTask.dart'; import 'Data.dart'; import 'User.dart' as User; -import 'package:sn_progress_dialog/sn_progress_dialog.dart'; -late ProgressDialog progressDialog; class Tasks extends StatefulWidget { const Tasks({Key? key}) : super(key: key); @@ -17,10 +15,29 @@ class _TasksState extends State { void initState() { // TODO: implement initState super.initState(); - progressDialog = ProgressDialog(context: context); - User.progressDialog=progressDialog; UpdateList(); + // init(context); + } + var refreshSub; + void init(BuildContext context) async{ + await Future.delayed(Duration(seconds: 1)); + refreshSub = User.refreshStream.stream.listen((value) { + print("Streaming refresh : $value"); + if(value){ + // dialogs.waiting(context, "Syncing"); + print("Opening progress dialog"); + }else{ + // dialogs.hide(context); + print("Closing progress dialog"); + } + }); + } + + @override void dispose() { + // TODO: implement dispose + super.dispose(); + refreshSub?.cancel(); } @override @@ -67,12 +84,12 @@ class _TasksState extends State { void UpdateList() async { - try{progressDialog.show(max:100, msg: 'Loading Task Types...');}catch(e){} - await User.updateTasksList(); + // try{progressDialog.show(max:100, msg: 'Loading Task Types...');}catch(e){} + await User.refreshUserData(); // hideProgressDialog(); - setState(() {}); + if(mounted)setState(() {}); - try{progressDialog.update(value: 100);}catch(e){} + // try{progressDialog.update(value: 100);}catch(e){} } List PrintTasks() { @@ -171,7 +188,6 @@ class _TasksState extends State { } void DeleteSelectedTasks() async{ - progressDialog.show(max: 100, msg: "Deleting ${selectedTasks.length} "); selectedTasks.forEach((element) async { await User.UserOperations.deleteTask(element, bulk:true); }); @@ -181,7 +197,6 @@ class _TasksState extends State { selectedTasks=[]; selecting=false; setState(() { - progressDialog.update(value: 100); }); } diff --git a/lib/User.dart b/lib/User.dart index 037edf3..6b36262 100644 --- a/lib/User.dart +++ b/lib/User.dart @@ -1,7 +1,9 @@ import 'dart:async'; import 'dart:io'; +import 'package:connectivity_plus/connectivity_plus.dart'; import 'package:flutter/cupertino.dart'; +import 'package:intl/intl.dart'; import 'package:shared_preferences/shared_preferences.dart'; import 'main.dart'; @@ -11,45 +13,38 @@ import 'Data.dart'; import 'package:sqflite/sqflite.dart'; import 'package:path_provider/path_provider.dart'; import 'package:device_info_plus/device_info_plus.dart'; -import 'package:sn_progress_dialog/sn_progress_dialog.dart'; import 'Tasks.dart'; -late ProgressDialog? progressDialog; + late http.Response loginResponse; late Database cacheDb; late String username; List categories = []; List taskTypes = []; -List activities=[]; +List activities = []; bool offline = true; bool registered = false; -bool refreshing = true; +StreamController refreshStream = StreamController(); Future login(String _username, String password) async { final prefs = await SharedPreferences.getInstance(); username = _username; var device_id = await Settings.UUID(); try { - loginResponse = (await http.post( - Uri.parse('http://161.97.127.136/task_tracker/login.php'), - body: { - "username": _username, - "password": password, - "device_id": device_id - })); + loginResponse = (await http.post(Uri.parse('http://161.97.127.136/task_tracker/login.php'), body: {"username": _username, "password": password, "device_id": device_id})); if (loginResponse.body.toLowerCase().contains("success")) { offline = false; username = _username; - registered =loginResponse.body.toLowerCase().contains("register"); + registered = loginResponse.body.toLowerCase().contains("register"); print("registered : $registered"); - if(registered){ + if (registered) { prefs.setBool("registered", true); } } - }catch(e){ - offline=true; + } catch (e) { + print("Error while login $e"); } return loginResponse; } @@ -58,52 +53,48 @@ Future initUserData() async { await initCacheDatabase(); await refreshUserData(); print('Initializing UserData...'); - if (offline) { - print('Going offline mode.'); - } + Connectivity().onConnectivityChanged.listen((result) { + offline = (result == ConnectivityResult.none); + if (!offline) { + UserOperations.executeQueries(); + refreshUserData(); + } + }); } -bool userDataInitiated =false; -Future refreshUserData() async{ - ShowProgress("Loading data"); - refreshing = true; - // categories= await GetCategories(true); - // taskTypes= await GetTaskTypes(true); - // activities= await GetActivities(true); + +Future refreshUserData() async { + refreshStream.add(true); await updateCatsList(); await updateTasksList(); await updateActList(); - userDataInitiated=true; - refreshing = false; - HideProgress(); + refreshStream.add(false); } - -Future cacheDbExist() async{ +Future cacheDbExist() async { Directory directory = await getApplicationDocumentsDirectory(); return databaseFactory.databaseExists(directory.path + 'cache.db'); } -Future updateCatsList() async{ +Future updateCatsList() async { //print('Updating with localCache'); - // categories = await GetCategories(true); + // categories = await GetCategories(true); print('Checking if can refresh'); categories = await GetCategories(false); } -Future updateTasksList() async{ - // print('Updating with localCache'); - // taskTypes = await GetTaskTypes(true); +Future updateTasksList() async { + // print('Updating with localCache'); + // taskTypes = await GetTaskTypes(true); print('Checking if can refresh'); taskTypes = await GetTaskTypes(false); } -Future updateActList() async{ +Future updateActList() async { //print('Updating with localCache'); //activities = await GetActivities(true); print('Checking if can refresh'); activities = await GetActivities(false); } - Future initCacheDatabase() async { Directory directory = await getApplicationDocumentsDirectory(); print('database at ' + directory.path + 'cache.db'); @@ -113,22 +104,20 @@ Future initCacheDatabase() async { } void onCacheDatabaseCreate(Database db, int newVersion) async { - String CategoriesTableSQL = - 'CREATE TABLE Categories(${Category.colCatId} VARCHAR(255) PRIMARY KEY,${Category.colName} TEXT, ${Category.colColor} TEXT, ${Category.colProductive} INTEGER)'; + String CategoriesTableSQL = 'CREATE TABLE Categories(${Category.colCatId} VARCHAR(255) PRIMARY KEY,${Category.colName} TEXT, ${Category.colColor} TEXT, ${Category.colProductive} INTEGER)'; // print(CategoriesTableSQL); await db.execute(CategoriesTableSQL); print("Initiated Categories Table"); - String TaskTableSQL = - 'CREATE TABLE TaskTypes(id TEXT PRIMARY KEY, ${TaskType.colName} TEXT, ${TaskType.colCategory} TEXT, ' + String TaskTableSQL = 'CREATE TABLE TaskTypes(id TEXT PRIMARY KEY, ${TaskType.colName} TEXT, ${TaskType.colCategory} TEXT, ' 'FOREIGN KEY (${TaskType.colCategory}) REFERENCES Categories(${Category.colCatId}))'; - // print(TaskTableSQL); + // print(TaskTableSQL); await db.execute(TaskTableSQL); String ActivityTableSQL = 'CREATE TABLE Activities(id INTEGER PRIMARY KEY AUTOINCREMENT, ${Activity.colType} INT, ${Activity.colStartTime} DATETIME, ${Activity.colEndTime} DATETIME, ${Activity.colMetadata} TEXT, ' 'FOREIGN KEY (${Activity.colType}) REFERENCES TaskTypes(id))'; - // print(ActivityTableSQL); + // print(ActivityTableSQL); await db.execute(ActivityTableSQL); String QueriesTableSQL = 'CREATE TABLE Queries(id INTEGER PRIMARY KEY AUTOINCREMENT, ${Queries.colLink} TEXT,${Queries.colData} TEXT)'; @@ -136,24 +125,23 @@ void onCacheDatabaseCreate(Database db, int newVersion) async { await db.execute(QueriesTableSQL); final prefs = await SharedPreferences.getInstance(); - if(prefs.getBool("registered") ?? false) { + if (prefs.getBool("registered") ?? false) { addInitialDataToCache(); prefs.setBool("registered", false); } - // GetCategories(); + // GetCategories(); } -Future addInitialDataToCache() async{ - ShowProgress("Initializing User Data"); +Future addInitialDataToCache() async { print("adding init data"); await Future.delayed(const Duration(seconds: 1)); //Insert Initial Entries - for(Category element in InitialData.getCategories(username)){ - await UserOperations.addCategory(element.name, element.color, element.productive,bulk: true); + for (Category element in InitialData.getCategories(username)) { + await UserOperations.addCategory(element.name, element.color, element.productive, bulk: true); } - for(TaskType element in InitialData.getTaskTypes(username)){ + for (TaskType element in InitialData.getTaskTypes(username)) { await UserOperations.addTaskType(element.name, element.category, bulk: true); // Map data = { // TaskType.colName: element.name, @@ -161,7 +149,6 @@ Future addInitialDataToCache() async{ // }; // await cacheDb.insert('TaskTypes', data); } - HideProgress(); await UserOperations.executeQueries(); await refreshUserData(); } @@ -171,281 +158,250 @@ void onCacheDatabaseUpgrade(Database db, int oldVersion, int newVersion) async { print('Upgrading CacheDB from ver.$oldVersion to ver.$newVersion'); } - -Future> GetCategories(bool forceOffline) async{ +Future> GetCategories(bool forceOffline) async { List _categories = []; - if(offline || forceOffline){ + if (offline || forceOffline) { //Retreive from cacheDB - }else{ + } else { //Check if server got updated, If not go for cache var android_id = await Settings.UUID(); //Validate device_id to check updates bool catsUpdated = true; - try{ - http.Response update_response = (await http.post( - Uri.parse('http://161.97.127.136/task_tracker/check_update.php'), - body: {"username": username, "device_id":android_id})); + try { + http.Response update_response = (await http.post(Uri.parse('http://161.97.127.136/task_tracker/check_update.php'), body: {"username": username, "device_id": android_id})); final data = update_response.body.split(','); catsUpdated = data[0] == '1'; - }catch(e){ + } catch (e) { print(e); } print("Need to update : ${!catsUpdated}"); //Update CacheDB - //if(!catsUpdated){ - await UpdateCategoriesFromServer(); - // } + if(!catsUpdated){ + await UpdateCategoriesFromServer(); + } } List cats = await cacheDb.query('Categories'); print(cats.length); - for(Map element in cats){ + for (Map element in cats) { String? catName = element[Category.colName].toString(); String? catColor = element[Category.colColor].toString(); String? catProductive = element[Category.colProductive].toString(); - if(catName==null || catColor==null || catProductive==null){ + if (catName == null || catColor == null || catProductive == null) { print("Something is null!"); print("name:{$catName}, color:{$catColor}, prod:{$Category.colProductive}"); continue; } - print("name:{$catName}, color:{$catColor}, prod:{$catProductive}"); + // print("name:{$catName}, color:{$catColor}, prod:{$catProductive}"); _categories.add(Category(username + catName, catName, catColor, ParseBool(catProductive))); } categories = _categories; return categories; } -Future UpdateCategoriesFromServer() async{ - +Future UpdateCategoriesFromServer() async { print("Updating Categories as $username"); try { - http.Response response = (await http.post( - Uri.parse('http://161.97.127.136/task_tracker/get_categories.php'), - body: { - "username": username, - "device_id": await Settings.UUID() - })); + http.Response response = (await http.post(Uri.parse('http://161.97.127.136/task_tracker/get_categories.php'), body: {"username": username, "device_id": await Settings.UUID()})); print(response.body); List data = response.body.split(""); - // await cacheDb.delete("Categories"); + // await cacheDb.delete("Categories"); for (var value in data) { Map cat = jsonDecode(value); //print(catData); - await cacheDb.rawInsert( - "INSERT OR REPLACE INTO Categories (${Category.colCatId},${Category - .colName},${Category.colProductive},${Category.colColor}) " - "VALUES ('${cat['category_id']}','${cat['name']}',${cat['productive']},'${cat['color']}') "); + await cacheDb.rawInsert("INSERT OR REPLACE INTO Categories (${Category.colCatId},${Category.colName},${Category.colProductive},${Category.colColor}) " + "VALUES ('${cat['category_id']}','${cat['name']}',${cat['productive']},'${cat['color']}') "); } - }catch(e){ - offline=true; + } catch (e) { + print("Error while cats $e"); } } -Future> GetTaskTypes(bool forceOffline) async{ +Future> GetTaskTypes(bool forceOffline) async { List _taskTypes = []; - if(offline || forceOffline){ + if (offline || forceOffline) { //Retreive from cacheDB - }else{ + } else { //Check if server got updated, If not go for cache var android_id = await Settings.UUID(); - bool updated =true; - try{ + bool updated = true; + try { //Validate device_id to check updates - http.Response update_response = (await http.post( - Uri.parse('http://161.97.127.136/task_tracker/check_update.php'), - body: {"username": username, "device_id":android_id})); + http.Response update_response = (await http.post(Uri.parse('http://161.97.127.136/task_tracker/check_update.php'), body: {"username": username, "device_id": android_id})); final data = update_response.body.split(','); updated = data[1] == '1'; - }catch(e){ + } catch (e) { print(e); } print("Need to update : ${!updated}"); //Update CacheDB - // if(!updated){ - await UpdateTaskTypesFromServer(); - // } + if(!updated){ + await UpdateTaskTypesFromServer(); + } } await Future.delayed(Duration(seconds: 1)); List cats = await cacheDb.query('TaskTypes'); print(cats.length); - for(Map element in cats){ + for (Map element in cats) { String? id = element[TaskType.colId].toString(); String? name = element[TaskType.colName].toString(); String? category = element[TaskType.colCategory].toString(); Category? cat = await getCatFromId(category); - if(id==null || name==null || category==null){ + if (id == null || name == null || category == null) { print("Something is null!"); print("name:{$name}, cat:{$category}, prod:{$id}"); continue; } - print("name:{$name}, cat:{$category}, prod:{$id}"); - _taskTypes.add(TaskType(id,name,category,cat)); + // print("name:{$name}, cat:{$category}, prod:{$id}"); + _taskTypes.add(TaskType(id, name, category, cat)); } taskTypes = _taskTypes; return taskTypes; } -Future UpdateTaskTypesFromServer() async{ - - - // await GetCategories(true); +Future UpdateTaskTypesFromServer() async { + // await GetCategories(true); print("Updating TaskTypes as $username"); try { - http.Response response = (await http.post( - Uri.parse('http://161.97.127.136/task_tracker/get_taskTypes.php'), - body: { - "username": username, - "device_id": await Settings.UUID() - })); + http.Response response = (await http.post(Uri.parse('http://161.97.127.136/task_tracker/get_taskTypes.php'), body: {"username": username, "device_id": await Settings.UUID()})); print(response.body); List data = response.body.split(""); await cacheDb.delete("TaskTypes"); for (var value in data) { Map cat = jsonDecode(value); - print(cat); - await cacheDb.rawInsert( - "INSERT OR REPLACE INTO TaskTypes (${TaskType.colId},${TaskType - .colName},${TaskType.colCategory}) " - "VALUES ('${cat['task_id']}','${cat['name']}','${cat['category_id']}') "); + //print(cat); + await cacheDb.rawInsert("INSERT OR REPLACE INTO TaskTypes (${TaskType.colId},${TaskType.colName},${TaskType.colCategory}) " + "VALUES ('${cat['task_id']}','${cat['name']}','${cat['category_id']}') "); print(await cacheDb.query("TaskTypes")); } - }catch(e){ - offline=true; + } catch (e) { + print("Error while tasks $e"); } } -Future> GetActivities(bool forceOffline) async{ +Future> GetActivities(bool forceOffline) async { List _activities = []; - if(offline || forceOffline){ + if (offline || forceOffline) { //Retreive from cacheDB print('offline, refreshing activities'); - }else{ + } else { //Check if server got updated, If not go for cache var android_id = await Settings.UUID(); - bool updated =true; - try{ + bool updated = true; + try { //Validate device_id to check updates - http.Response update_response = (await http.post( - Uri.parse('http://161.97.127.136/task_tracker/check_update.php'), - body: {"username": username, "device_id":android_id})); + http.Response update_response = (await http.post(Uri.parse('http://161.97.127.136/task_tracker/check_update.php'), body: {"username": username, "device_id": android_id})); final data = update_response.body.split(','); updated = data[2] == '1'; - }catch(e){ + } catch (e) { print(e); } print("Need to update activities : ${!updated}"); //Update CacheDB - //if(!updated){ - await UpdateActivitiesFromServer(); - //} + if(!updated){ + await UpdateActivitiesFromServer(); + } } List cats = await cacheDb.rawQuery('SELECT * FROM Activities ORDER BY ${Activity.colStartTime} DESC'); print(cats.length); - for(Map element in cats){ + for (Map element in cats) { String? type = element[Activity.colType].toString(); String? startTime = element[Activity.colStartTime].toString(); String? endTime = element[Activity.colEndTime].toString(); String? metadata = element[Activity.colMetadata].toString(); TaskType? taskType = await getTaskFromId(type); - if(type==null || startTime==null || endTime==null || taskType==null){ - print("Something is null!\ntype:${type==null}, startTime:${startTime==null}, eTime:${endTime==null}, taskType${taskType==null}"); + if (type == null || startTime == null || endTime == null || taskType == null) { + print("Something is null!\ntype:${type == null}, startTime:${startTime == null}, eTime:${endTime == null}, taskType${taskType == null}"); print("TaskType:{$type}, Start Time:{$startTime}, endTime:{$endTime}, metadata:${metadata}"); continue; } - print("TaskType:{$type}, Start Time:{$startTime}, endTime:{$endTime}, metadata:${metadata}"); + //print("TaskType:{$type}, Start Time:{$startTime}, endTime:{$endTime}, metadata:${metadata}"); _activities.add(Activity(taskType, DateTime.parse(startTime), DateTime.parse(endTime), metadata: metadata)); } activities = _activities; return activities; } -Future UpdateActivitiesFromServer() async{ - +Future UpdateActivitiesFromServer() async { print("Updating Activities as $username"); try { - http.Response response = (await http.post( - Uri.parse('http://161.97.127.136/task_tracker/get_activities.php'), - body: { - "username": username, - "device_id": await Settings.UUID() - })); + http.Response response = (await http.post(Uri.parse('http://161.97.127.136/task_tracker/get_activities.php'), body: {"username": username, "device_id": await Settings.UUID()})); await cacheDb.rawDelete("DELETE FROM Activities"); print('Truncate Activity Table before'); print("Activity response: ${response.body}"); - if(response.body.contains("{")){ - List data = response.body.split(""); + if (response.body.contains("{")) { + List data = response.body.split(""); - for (var value in data){ - Map cat = jsonDecode(value); - print(cat); - await cacheDb.rawInsert( - "INSERT OR REPLACE INTO Activities (${Activity.colType}, ${Activity.colStartTime}, ${Activity.colEndTime}, ${Activity.colMetadata}) " - "VALUES ('${cat['task_id']}', '${cat['sTime']}','${cat['eTime']}', '${cat['metadata']}') "); - } - }else{ + for (var value in data) { + Map cat = jsonDecode(value); + //print(cat); + await cacheDb.rawInsert("INSERT OR REPLACE INTO Activities (${Activity.colType}, ${Activity.colStartTime}, ${Activity.colEndTime}, ${Activity.colMetadata}) " + "VALUES ('${cat['task_id']}', '${cat['sTime']}','${cat['eTime']}', '${cat['metadata']}') "); + } + } else { print("No activities for now"); } - }catch(e){ + } catch (e) { print("Error : $e @ updating activities"); - offline=true; + print("Error while acts $e"); } } -Future getTaskFromId(String taskId) async{ +Future getTaskFromId(String taskId) async { // await GetTaskTypes(false); TaskType? cat = null; - for (var element in taskTypes){ - if(element.id == taskId){ - cat= element; + for (var element in taskTypes) { + if (element.id == taskId) { + cat = element; cat?.cat = await getCatFromId((cat?.category ?? '')); } } - if(cat==null){ + if (cat == null) { print('Got null tasktype for ${taskId} after searching on ${taskTypes.length}'); } return cat; } -Future getCatFromId(String catId) async{ - // await GetTaskTypes(false); +Future getCatFromId(String catId) async { + // await GetTaskTypes(false); Category? cat = null; for (var element in categories) { - if(element.category_id == catId){ - cat= element; + if (element.category_id == catId) { + cat = element; } } return cat; } - //Helpers class Helpers { Future _getId() async { var deviceInfo = DeviceInfoPlugin(); - if (Platform.isIOS) { // import 'dart:io' + if (Platform.isIOS) { + // import 'dart:io' var iosDeviceInfo = await deviceInfo.iosInfo; return iosDeviceInfo.identifierForVendor; // unique ID on iOS } else { @@ -454,228 +410,185 @@ class Helpers { } } } -bool ParseBool(obj){ - return obj.toString().toLowerCase()=="true" || obj.toString()=="1"; + +bool ParseBool(obj) { + return obj.toString().toLowerCase() == "true" || obj.toString() == "1"; } +class UserOperations { + static DateFormat dFormat = DateFormat("yyyy-MM-dd HH:mm:ss"); -class UserOperations{ - static Future addCategory(String name, String color, bool productive, {bool bulk = false}) async{ - Map queryBody= { - 'username': username, - 'device_id': await Settings.UUID(), - 'name' : name, - 'color':color, - 'productive': productive ? '1':'0' - }; + static Future addCategory(String name, String color, bool productive, {bool bulk = false}) async { + Map queryBody = {'username': username, 'device_id': await Settings.UUID(), 'name': name, 'color': color, 'productive': productive ? '1' : '0'}; //Add Query - Map query = { - Queries.colLink: 'add_category', - Queries.colData: jsonEncode(queryBody) - }; - - print("adding new query ${query[Queries.colLink]} : ${jsonEncode(queryBody)}"); - - await cacheDb.insert('Queries', query); - - //update Cache - Map data = { - Category.colCatId: username+name, - Category.colName: name, - Category.colColor: color, - Category.colProductive: productive - }; - await cacheDb.insert('Categories', data); - - await GetCategories(true); - if(!bulk){ - //Add to server and refresh Cache - await executeQueries(); - } - } - - static Future addTaskType(String name, String category, {bool bulk = false}) async{ - Map queryBody= { - 'id':username+name, - 'username': username, - 'device_id': await Settings.UUID(), - 'name' : name, - 'category': username + category - }; - //Add Query - Map query = { - Queries.colLink: 'add_taskType', - Queries.colData: jsonEncode(queryBody) - }; + Map query = {Queries.colLink: 'add_category', Queries.colData: jsonEncode(queryBody)}; print("adding new query ${query[Queries.colLink]} : ${jsonEncode(queryBody)}"); await cacheDb.insert('Queries', query); //update Cache - Map data = { - TaskType.colId: username+name, - Category.colName: name, - Category.colCatId: username + category - }; - await cacheDb.insert('TaskTypes', data); - await GetTaskTypes(true); - if(!bulk){ + Map data = {Category.colCatId: username + name, Category.colName: name, Category.colColor: color, Category.colProductive: productive}; + await cacheDb.insert('Categories', data); + await refreshUserData(); + if (!bulk) { //Add to server and refresh Cache await executeQueries(); } } - static Future addActivity(String type, String sTime,String eTime, {String metadata = 'null',bool bulk = false, Function(int)? onOverlap}) async{ + static Future addTaskType(String name, String category, {bool bulk = false}) async { + Map queryBody = {'id': username + name, 'username': username, 'device_id': await Settings.UUID(), 'name': name, 'category': username + category}; + //Add Query + Map query = {Queries.colLink: 'add_taskType', Queries.colData: jsonEncode(queryBody)}; + + print("adding new query ${query[Queries.colLink]} : ${jsonEncode(queryBody)}"); + + await cacheDb.insert('Queries', query); + + //update Cache + Map data = {TaskType.colId: username + name, Category.colName: name, Category.colCatId: username + category}; + await cacheDb.insert('TaskTypes', data); + await refreshUserData(); + if (!bulk) { + //Add to server and refresh Cache + await executeQueries(); + } + } + + static Future addActivity(String type, DateTime sTime, DateTime eTime, {String metadata = 'null', bool bulk = false, Function(int)? onOverlap}) async { //Check for timeoverlapse - activities= await GetActivities(true); - int? overlapCount = Sqflite.firstIntValue(await cacheDb.rawQuery("SELECT COUNT(*) FROM Activities WHERE (((${Activity.colStartTime} < datetime('$sTime')) AND ((${Activity.colEndTime} > datetime('$eTime')) OR (${Activity.colEndTime} < datetime('$eTime') AND ${Activity.colEndTime} > datetime('$sTime')))) OR (${Activity.colStartTime} > datetime('$sTime') AND ${Activity.colStartTime} < datetime('$eTime')) OR (${Activity.colStartTime}=datetime('$sTime') AND ${Activity.colEndTime}=datetime('$eTime')))")); + activities = await GetActivities(true); + int? overlapCount = Sqflite.firstIntValue(await cacheDb.rawQuery( + "SELECT COUNT(*) FROM Activities WHERE (((${Activity.colStartTime} < datetime('$sTime')) AND ((${Activity.colEndTime} > datetime('$eTime')) OR (${Activity.colEndTime} < datetime('$eTime') AND ${Activity.colEndTime} > datetime('$sTime')))) OR (${Activity.colStartTime} > datetime('$sTime') AND ${Activity.colStartTime} < datetime('$eTime')) OR (${Activity.colStartTime}=datetime('$sTime') AND ${Activity.colEndTime}=datetime('$eTime')))")); print("ActivityOverlaps: $overlapCount"); - if(overlapCount! > 0){ + if (overlapCount! > 0) { onOverlap!(overlapCount); + return; } - Map queryBody= { + Map queryBody = { 'username': username, 'device_id': await Settings.UUID(), - 'type' : username+type, - 'sTime': sTime, - 'eTime':eTime, + 'type': username + type, + 'sTime': dFormat.format(sTime), + 'eTime': dFormat.format(eTime), 'metadata': metadata }; - if(metadata.length > 0){ - - } + if (metadata.length > 0) {} //Add Query - Map query = { - Queries.colLink: 'add_activity', - Queries.colData: jsonEncode(queryBody) - }; + Map query = {Queries.colLink: 'add_activity', Queries.colData: jsonEncode(queryBody)}; print("adding new query ${query[Queries.colLink]} : ${jsonEncode(queryBody)}"); await cacheDb.insert('Queries', query); //update Cache - Map data = { - Activity.colType: username+type, - Activity.colStartTime: sTime, - Activity.colEndTime: eTime, - Activity.colMetadata: metadata - }; + Map data = {Activity.colType: username + type, Activity.colStartTime: dFormat.format(sTime), Activity.colEndTime: dFormat.format(eTime), Activity.colMetadata: metadata}; await cacheDb.insert('Activities', data); - activities= await GetActivities(false); - if(!bulk){ + await refreshUserData(); + if (!bulk) { //Add to server and refresh Cache await executeQueries(); } } - static Future deleteTask(String name,{bulk=false}) async{ - Map queryBody= { - 'id':username+name, + static Future deleteTask(String name, {bulk = false}) async { + Map queryBody = { + 'id': username + name, 'username': username, 'device_id': await Settings.UUID(), }; //Add Query - Map query = { - Queries.colLink: 'delete_taskType', - Queries.colData: jsonEncode(queryBody) - }; + Map query = {Queries.colLink: 'delete_taskType', Queries.colData: jsonEncode(queryBody)}; print("adding new query ${query[Queries.colLink]} : ${jsonEncode(queryBody)}"); await cacheDb.insert('Queries', query); //update Cache - Map data = { - TaskType.colId: username+name, + Map data = { + TaskType.colId: username + name, Category.colName: name, }; - await cacheDb.rawDelete("DELETE FROM TaskTypes WHERE id='${username+name}'"); - await GetTaskTypes(true); - //Add to server and refresh Cache + await cacheDb.rawDelete("DELETE FROM TaskTypes WHERE id='${username + name}'"); - if(!bulk) { - await executeQueries(); - } - } - - static Future deleteCategory(String name,{bulk=false}) async{ - Map queryBody= { - 'id':username+name, - 'username': username, - 'device_id': await Settings.UUID() , - }; - //Add Query - Map query = { - Queries.colLink: 'delete_category', - Queries.colData: jsonEncode(queryBody) - }; - - print("adding new query ${query[Queries.colLink]} : ${jsonEncode(queryBody)}"); - - await cacheDb.insert('Queries', query); - - //update Cache - Map data = { - TaskType.colId: username+name, - Category.colName: name, - }; - await cacheDb.rawDelete("DELETE FROM Categories WHERE ${Category.colCatId}='${username+name}'"); - await GetCategories(true); + await refreshUserData(); //Add to server and refresh Cache - if(!bulk) { + if (!bulk) { await executeQueries(); } } - static Future deleteActivity(Activity activity,{bulk=false}) async{ - Map queryBody= { + static Future deleteCategory(String name, {bulk = false}) async { + Map queryBody = { + 'id': username + name, + 'username': username, + 'device_id': await Settings.UUID(), + }; + //Add Query + Map query = {Queries.colLink: 'delete_category', Queries.colData: jsonEncode(queryBody)}; + + print("adding new query ${query[Queries.colLink]} : ${jsonEncode(queryBody)}"); + + await cacheDb.insert('Queries', query); + + //update Cache + Map data = { + TaskType.colId: username + name, + Category.colName: name, + }; + await cacheDb.rawDelete("DELETE FROM Categories WHERE ${Category.colCatId}='${username + name}'"); + await refreshUserData(); + //Add to server and refresh Cache + + if (!bulk) { + await executeQueries(); + } + } + + static Future deleteActivity(Activity activity, {bulk = false}) async { + Map queryBody = { 'username': username, 'device_id': await Settings.UUID(), 'sTime': activity.startTime.toString(), - 'eTime':activity.endTime.toString(), + 'eTime': activity.endTime.toString(), }; //Add Query - Map query = { - Queries.colLink: 'delete_activity', - Queries.colData: jsonEncode(queryBody) - }; + Map query = {Queries.colLink: 'delete_activity', Queries.colData: jsonEncode(queryBody)}; print("adding new query ${query[Queries.colLink]} : ${jsonEncode(queryBody)}"); await cacheDb.insert('Queries', query); //update Cache - // Map data = { - // TaskType.colId: username+name, - // Category.colName: name, - // }; - // await cacheDb.rawDelete("DELETE FROM Categories WHERE ${Category.colCatId}='${username+name}'"); - await GetCategories(true); + String deleteQuery = + "DELETE FROM Activities WHERE ${Activity.colStartTime}=datetime('${dFormat.format(activity.startTime)}') AND ${Activity.colEndTime}=datetime('${dFormat.format(activity.endTime)}')"; + print("delteQuery : $deleteQuery"); + + await cacheDb.rawDelete(deleteQuery); + await refreshUserData(); //Add to server and refresh Cache - if(!bulk) { + if (!bulk) { await executeQueries(); } } - static Future executeQueries() async{ - if(offline){ + static Future executeQueries() async { + if (offline) { print("Cannot executre queries, Offline!"); return; } - ShowProgress("Syncing"); - List> queries = await cacheDb.query('Queries'); + List> queries = await cacheDb.query('Queries'); - for(Map element in queries){ + for (Map element in queries) { int id = int.parse(element['id'].toString()); String? file = element[Queries.colLink].toString(); String? data = element[Queries.colData].toString(); - if(file==null || data==null){ + if (file == null || data == null) { print("Null query, Ignoring..."); continue; } @@ -684,27 +597,16 @@ class UserOperations{ //Execute the http here Map body = jsonDecode(data); try { - http.Response queryResponse = (await http.post( - Uri.parse('http://161.97.127.136/task_tracker/$file.php'), - body: body)); + http.Response queryResponse = (await http.post(Uri.parse('http://161.97.127.136/task_tracker/$file.php'), body: body)); print("Query executed : Results{${queryResponse.body}"); if (queryResponse.body.toLowerCase().contains("success")) { await cacheDb.rawDelete('DELETE FROM Queries WHERE id=$id'); } - offline=false; - }catch(e){ - offline=true; + offline = false; + } catch (e) { + print("Error while query $e"); } } - HideProgress(); + await refreshUserData(); } -} - -void ShowProgress(msg){ - //try{progressDialog?.show(max: 100, msg: msg);}catch(e){} -} - -void HideProgress(){ - // try{progressDialog?.update(value: 100);}catch(e){} -} - +} \ No newline at end of file diff --git a/lib/Welcome.dart b/lib/Welcome.dart index b55ed0e..d1674b4 100644 --- a/lib/Welcome.dart +++ b/lib/Welcome.dart @@ -392,7 +392,7 @@ class _onlineLoginPageState extends State final prefs = await SharedPreferences.getInstance(); prefs.setString("username", usernameController.text); prefs.setString("password", passwordController.text); - Navigator.of(context).pushNamedAndRemoveUntil('/splash', (route) => false); + Navigator.of(context).pushNamedAndRemoveUntil('/', (route) => false); }else{ showAlertDialog(context, "Failed to login", "There was an error trying to authorize you in servers."); } diff --git a/lib/main.dart b/lib/main.dart index cdf959a..6ed0343 100644 --- a/lib/main.dart +++ b/lib/main.dart @@ -1,3 +1,5 @@ +import 'dart:async'; + import 'package:flutter/cupertino.dart'; import 'package:flutter/material.dart'; import 'package:intl/intl.dart'; @@ -14,11 +16,10 @@ import 'newActivity.dart'; import 'Tasks.dart'; import 'Activities.dart'; import 'User.dart' as User; -import 'package:sn_progress_dialog/sn_progress_dialog.dart'; import 'package:syncfusion_flutter_charts/charts.dart'; - -late ProgressDialog progressDialog; - +import 'package:connectivity_plus/connectivity_plus.dart'; +import 'Dialogs.dart'; +final GlobalKey navigatorKey = new GlobalKey(); showAlertDialog(BuildContext context, String title, String message) { // set up the button Widget okButton = TextButton( @@ -73,27 +74,28 @@ class MyApp extends StatelessWidget { // This widget is the root of your application. @override Widget build(BuildContext context) => ChangeNotifierProvider( - create: (context)=>ThemeProvider(), - builder: (context, _){ + create: (context) => ThemeProvider(), + builder: (context, _) { final themeProvider = Provider.of(context); return MaterialApp( - title: 'Task Tracker', - themeMode: themeProvider.themeMode, - theme: ThemeData(accentColor: Colors.redAccent,brightness: Brightness.light, primaryColor: Colors.amber, fontFamily: 'Noto-Sans'), - darkTheme: ThemeData(accentColor: Colors.redAccent,brightness: Brightness.dark, primaryColor: Colors.amber, fontFamily: 'Noto-Sans'), - //home: const MyHomePage(), - initialRoute: '/splash', - routes: { - '/splash': (context) => const SplashScreen(), - '/welcome': (context) => const WelcomePage(), - '/': (context) => const MyHomePage(), - '/Tasks': (context) => const Tasks(), - '/Categories': (context) => const Categories(), - '/Activities': (context) => const Activities(), - '/Settings':(context) => const SettingsPage() - }); - }); + title: 'Task Tracker', + themeMode: themeProvider.themeMode, + theme: ThemeData(accentColor: Colors.redAccent, brightness: Brightness.light, primaryColor: Colors.amber, fontFamily: 'Noto-Sans'), + darkTheme: ThemeData(accentColor: Colors.redAccent, brightness: Brightness.dark, primaryColor: Colors.amber, fontFamily: 'Noto-Sans'), + navigatorKey: navigatorKey, + //home: const SplashScreen(), + initialRoute: '/', + routes: { + '/': (context) => const SplashScreen(), + '/welcome': (context) => const WelcomePage(), + '/home': (context) => const MyHomePage(), + '/Tasks': (context) => const Tasks(), + '/Categories': (context) => const Categories(), + '/Activities': (context) => const Activities(), + '/Settings': (context) => const SettingsPage() + }); + }); } List days = []; @@ -135,24 +137,48 @@ class MyHomePage extends StatefulWidget { } class _MyHomePageState extends State { + var connectivitySub; + @override void initState() { // TODO: implement initState + print("Im home!"); + init(context); super.initState(); - // User.refreshUserData().then((val) => LoadStats()); - // showOfflineSnack(); + print("Initializing refresh stream on main dart"); LoadStats(); - // progressDialog = ProgressDialog(context: context); + connectivitySub=Connectivity().onConnectivityChanged.listen((result) { + if (this.mounted) { + setState(() {}); + } + }); + // User.progressDialog=progressDialog; } + var refreshSub; + void init(BuildContext context) async{ + await Future.delayed(Duration(seconds: 1)); + refreshSub = User.refreshStream.stream.listen((value) { + print("Streaming refresh : $value"); + if(value){ + Dialogs.waiting("Syncing..."); + print("Opening progress dialog"); + }else{ + Dialogs.hide(); + print("Closing progress dialog"); + } + }); + } + @override + void dispose() { + // TODO: implement dispose + super.dispose(); + connectivitySub?.cancel(); + } void LoadStats() async { // return; - while (!User.userDataInitiated) { - await Future.delayed(const Duration(seconds: 1)); - } - DateFormat dFormat = DateFormat("MM/dd"); Map catTimeMap = {}; Map catBriefMap = {}; @@ -163,7 +189,7 @@ class _MyHomePageState extends State { firstDay = null; lastDay = null; String lastDate = ""; - days=[]; + days = []; for (var element in User.activities) { if (lastDay == null) { lastDay = element.endTime; @@ -248,7 +274,7 @@ class _MyHomePageState extends State { Color barCol = HexColor.fromHex(key.color); dailyData.add(CatMapData(key.name, value, barCol)); }); - dailyData.sort((a,b){ + dailyData.sort((a, b) { return a.name.toLowerCase().compareTo(b.name.toLowerCase()); }); for (var element in days) { @@ -265,7 +291,7 @@ class _MyHomePageState extends State { taskTypesData.add(TaskTypeMapData(key.name, value, HexColor.fromHex(key.cat!.color))); }); - taskTypesData.sort((a,b){ + taskTypesData.sort((a, b) { return a.time.compareTo(b.time); }); @@ -274,7 +300,7 @@ class _MyHomePageState extends State { Color barCol = HexColor.fromHex(key.color); catsData.add(CatMapData(key.name, value, barCol)); }); - catsData.sort((a,b)=> a.time.compareTo(b.time)); + catsData.sort((a, b) => a.time.compareTo(b.time)); }); } } @@ -299,26 +325,46 @@ class _MyHomePageState extends State { }, label: Text("New Activity"), icon: Icon(Icons.add)), - appBar: AppBar(title: Row( - mainAxisSize: MainAxisSize.max, - mainAxisAlignment: MainAxisAlignment.spaceBetween, + appBar: AppBar( + title: Column( + mainAxisSize: MainAxisSize.max, + mainAxisAlignment: MainAxisAlignment.end, children: [ - Row(children: [Icon(Icons.article_outlined, color: Theme.of(context).primaryColor), SizedBox(width: 10), Text('Summary')]), - Row(children: [ - InkWell( - onTap: () { - setState(() { - LoadStats(); - }); - }, - child: Icon(Icons.refresh, size: 30), - ) - ],) + Row( + mainAxisSize: MainAxisSize.max, + mainAxisAlignment: MainAxisAlignment.spaceBetween, + children: [ + Row(children: [Icon(Icons.article_outlined, color: Theme.of(context).primaryColor), SizedBox(width: 10), Text('Summary')]), + Row( + children: [ + (User.offline) + ? Icon(Icons.signal_cellular_connected_no_internet_4_bar_outlined) + : InkWell( + onTap: () { + setState(() { + LoadStats(); + }); + }, + child: Icon(Icons.refresh, size: 30), + ) + ], + ) + ], + ), + //Container(color: Colors.red,child: Text("Offline",style:TextStyle(fontSize: 5))), ], )), drawer: navDrawer(context, 0), body: SafeArea( - child: SingleChildScrollView( + child: (User.activities.isEmpty) ? Column( + mainAxisSize: MainAxisSize.max, + mainAxisAlignment: MainAxisAlignment.center, + crossAxisAlignment: CrossAxisAlignment.center + ,children:[ + Expanded(flex: 1,child: Container(),), + Expanded(flex: 2,child: Image(image: AssetImage('images/empty.png'))), + Expanded(flex:2,child: Text("Add your first activity to access Summary",style: TextStyle(color: Colors.grey, fontStyle: FontStyle.italic),)) + ]) :SingleChildScrollView( scrollDirection: Axis.vertical, child: Column( children: [ @@ -397,11 +443,7 @@ class _MyHomePageState extends State { xValueMapper: (ProductivityMapData sales, _) => sales.day, yValueMapper: (ProductivityMapData sales, _) => sales.productivity, dataLabelMapper: (ProductivityMapData sales, _) => sales.productivity.toStringAsFixed(1) + "%", - dataLabelSettings: DataLabelSettings( - overflowMode: OverflowMode.hide, - showZeroValue: false, - isVisible: true - ), + dataLabelSettings: DataLabelSettings(overflowMode: OverflowMode.hide, showZeroValue: false, isVisible: true), color: Colors.green) ]), ) @@ -602,7 +644,7 @@ Drawer navDrawer(BuildContext context, int pageIndex) { if (pageIndex == 0) { return; } - Navigator.of(context).pushReplacementNamed('/'); + Navigator.of(context).pushReplacementNamed('/home'); }, ), // ListTile( @@ -652,6 +694,18 @@ Drawer navDrawer(BuildContext context, int pageIndex) { }, ), Divider(), + ListTile( + selected: (pageIndex == 7), + title: Text('TODO'), + leading: Icon(Icons.check, color: Theme.of(context).primaryColor), + onTap: () { + if (pageIndex == 7) { + return; + } + Navigator.of(context).pushReplacementNamed('/Todo'); + }, + ), + Divider(), ListTile( selected: (pageIndex == 5), title: Text('Settings'), @@ -667,7 +721,9 @@ Drawer navDrawer(BuildContext context, int pageIndex) { selected: (pageIndex == 6), title: Text('About'), leading: Icon(Icons.help_outline_outlined), - onTap: () {}, + onTap: () { + showAboutDialog(context: context); + }, ), ], )); diff --git a/lib/newActivity.dart b/lib/newActivity.dart index 5ff6514..0970455 100644 --- a/lib/newActivity.dart +++ b/lib/newActivity.dart @@ -2,6 +2,7 @@ import 'package:flutter/material.dart'; import 'package:flutter/painting.dart'; import 'package:flutter_datetime_picker/flutter_datetime_picker.dart'; import 'package:intl/intl.dart'; +import 'package:tasktracker/main.dart'; import 'User.dart' as User; DateFormat dateFormat = DateFormat("yyyy-MM-dd HH:mm:ss"); DateFormat durationFormat = DateFormat("HH:mm:ss"); @@ -292,16 +293,21 @@ class _NewActivity extends State { } void add_action() async{ - print('adding Task Type : $selectedCat at $startTime - $endTime'); bool failed=false; - await User.UserOperations.addActivity(selectedCat,startTime.toString(), endTime.toString(),metadata:metadataController.text, onOverlap: (overlapCount){ + await User.UserOperations.addActivity(selectedCat,startTime, endTime,metadata:metadataController.text, onOverlap: (overlapCount){ showAlertDialog(context, 'Error adding activity', 'Cannot add activity between ${dateFormat.format(startTime)} - ${dateFormat.format(endTime)}, $overlapCount activities are already added within this time range'); failed=true; }); - if(!failed) - Navigator.of(context).pop(); + if(!failed) { + print("popping : ${navigatorKey.currentWidget?.toStringShort() ?? "n/a"}"); + Navigator.of(navigatorKey.currentContext!).popUntil((route){ + return route.isFirst; + }); + }else{ + print("Failed adding new activity"); + } } } diff --git a/lib/splash.dart b/lib/splash.dart index b111a16..5d280dc 100644 --- a/lib/splash.dart +++ b/lib/splash.dart @@ -1,12 +1,13 @@ import 'package:flutter/material.dart'; +import 'package:flutter_local_notifications/flutter_local_notifications.dart'; +import 'package:flutter_spinkit/flutter_spinkit.dart'; import 'package:shared_preferences/shared_preferences.dart'; import 'package:tasktracker/Data.dart'; import 'User.dart' as Users; import 'package:http/http.dart' as http; -import 'package:sn_progress_dialog/sn_progress_dialog.dart'; import 'theme_provider.dart'; import 'package:provider/provider.dart'; -late ProgressDialog progressDialog; +import 'newActivity.dart'; class SplashScreen extends StatefulWidget { const SplashScreen({Key? key}) : super(key: key); @@ -31,11 +32,41 @@ class _SplashScreenState extends State { void initState() { // TODO: implement initState super.initState(); - progressDialog = ProgressDialog(context: context); - Users.progressDialog=progressDialog; init(); + initNotifications(); + } + void initNotifications() async{ + var androidInitilize = new AndroidInitializationSettings('@mipmap/ic_launcher'); + var iOSinitilize = new IOSInitializationSettings(); + + var initilizationsSettings = + new InitializationSettings(android: androidInitilize, iOS: iOSinitilize); + var fltrNotification = new FlutterLocalNotificationsPlugin(); + fltrNotification.initialize(initilizationsSettings, + onSelectNotification: notificationSelected); + + int notification_interval = await Settings.getNotificationInterval(); + + if(notification_interval>0) { + var androidDetails = const AndroidNotificationDetails("Xperience", "TaskTracker", importance: Importance.max); + var iSODetails = new IOSNotificationDetails(); + var generalNotificationDetails = + new NotificationDetails(android: androidDetails, iOS: iSODetails); + var scheduledTime = DateTime.now().add(Duration(hours: notification_interval)); + fltrNotification.schedule(1, "What did you do in last $notification_interval hours?", "Click here to track your last activities...", + scheduledTime, generalNotificationDetails,); + print("Sent notification schedule"); + } + } + void notificationSelected(String? payload) { + if(payload!=null){ + if(payload.toLowerCase().contains("activity")){ + Navigator.of(context).push(MaterialPageRoute(builder: (context) => NewActivity())).then((value) => {Users.refreshUserData()}); + } + } + } void init() async { await initSettings(); final prefs = await SharedPreferences.getInstance(); @@ -73,20 +104,24 @@ class _SplashScreenState extends State { void Continue() async{ await Users.initUserData(); - Navigator.of(context).pushNamedAndRemoveUntil('/', (route) => false); + Navigator.of(context).pushReplacementNamed('/home'); + print('Going home!'); } @override Widget build(BuildContext context) { return Container( - color: Colors.purple, + color: Colors.redAccent, padding: EdgeInsets.all(80), child: Column( mainAxisSize: MainAxisSize.max, mainAxisAlignment: MainAxisAlignment.center, children: [ Image(image: AssetImage('images/logo.png')), + SpinKitPouringHourGlass(color: Colors.white) // Text('Loading', style:TextStyle(color: Colors.grey, fontSize: 20,fontStyle: FontStyle.italic)) ])); } + + } diff --git a/linux/.gitignore b/linux/.gitignore new file mode 100644 index 0000000..d3896c9 --- /dev/null +++ b/linux/.gitignore @@ -0,0 +1 @@ +flutter/ephemeral diff --git a/linux/CMakeLists.txt b/linux/CMakeLists.txt new file mode 100644 index 0000000..5184981 --- /dev/null +++ b/linux/CMakeLists.txt @@ -0,0 +1,116 @@ +cmake_minimum_required(VERSION 3.10) +project(runner LANGUAGES CXX) + +set(BINARY_NAME "tasktracker") +set(APPLICATION_ID "com.Xperience.TaskTracker.tasktracker") + +cmake_policy(SET CMP0063 NEW) + +set(CMAKE_INSTALL_RPATH "$ORIGIN/lib") + +# Root filesystem for cross-building. +if(FLUTTER_TARGET_PLATFORM_SYSROOT) + set(CMAKE_SYSROOT ${FLUTTER_TARGET_PLATFORM_SYSROOT}) + set(CMAKE_FIND_ROOT_PATH ${CMAKE_SYSROOT}) + set(CMAKE_FIND_ROOT_PATH_MODE_PROGRAM NEVER) + set(CMAKE_FIND_ROOT_PATH_MODE_PACKAGE ONLY) + set(CMAKE_FIND_ROOT_PATH_MODE_LIBRARY ONLY) + set(CMAKE_FIND_ROOT_PATH_MODE_INCLUDE ONLY) +endif() + +# Configure build options. +if(NOT CMAKE_BUILD_TYPE AND NOT CMAKE_CONFIGURATION_TYPES) + set(CMAKE_BUILD_TYPE "Debug" CACHE + STRING "Flutter build mode" FORCE) + set_property(CACHE CMAKE_BUILD_TYPE PROPERTY STRINGS + "Debug" "Profile" "Release") +endif() + +# Compilation settings that should be applied to most targets. +function(APPLY_STANDARD_SETTINGS TARGET) + target_compile_features(${TARGET} PUBLIC cxx_std_14) + target_compile_options(${TARGET} PRIVATE -Wall -Werror) + target_compile_options(${TARGET} PRIVATE "$<$>:-O3>") + target_compile_definitions(${TARGET} PRIVATE "$<$>:NDEBUG>") +endfunction() + +set(FLUTTER_MANAGED_DIR "${CMAKE_CURRENT_SOURCE_DIR}/flutter") + +# Flutter library and tool build rules. +add_subdirectory(${FLUTTER_MANAGED_DIR}) + +# System-level dependencies. +find_package(PkgConfig REQUIRED) +pkg_check_modules(GTK REQUIRED IMPORTED_TARGET gtk+-3.0) + +add_definitions(-DAPPLICATION_ID="${APPLICATION_ID}") + +# Application build +add_executable(${BINARY_NAME} + "main.cc" + "my_application.cc" + "${FLUTTER_MANAGED_DIR}/generated_plugin_registrant.cc" +) +apply_standard_settings(${BINARY_NAME}) +target_link_libraries(${BINARY_NAME} PRIVATE flutter) +target_link_libraries(${BINARY_NAME} PRIVATE PkgConfig::GTK) +add_dependencies(${BINARY_NAME} flutter_assemble) +# Only the install-generated bundle's copy of the executable will launch +# correctly, since the resources must in the right relative locations. To avoid +# people trying to run the unbundled copy, put it in a subdirectory instead of +# the default top-level location. +set_target_properties(${BINARY_NAME} + PROPERTIES + RUNTIME_OUTPUT_DIRECTORY "${CMAKE_BINARY_DIR}/intermediates_do_not_run" +) + +# Generated plugin build rules, which manage building the plugins and adding +# them to the application. +include(flutter/generated_plugins.cmake) + + +# === Installation === +# By default, "installing" just makes a relocatable bundle in the build +# directory. +set(BUILD_BUNDLE_DIR "${PROJECT_BINARY_DIR}/bundle") +if(CMAKE_INSTALL_PREFIX_INITIALIZED_TO_DEFAULT) + set(CMAKE_INSTALL_PREFIX "${BUILD_BUNDLE_DIR}" CACHE PATH "..." FORCE) +endif() + +# Start with a clean build bundle directory every time. +install(CODE " + file(REMOVE_RECURSE \"${BUILD_BUNDLE_DIR}/\") + " COMPONENT Runtime) + +set(INSTALL_BUNDLE_DATA_DIR "${CMAKE_INSTALL_PREFIX}/data") +set(INSTALL_BUNDLE_LIB_DIR "${CMAKE_INSTALL_PREFIX}/lib") + +install(TARGETS ${BINARY_NAME} RUNTIME DESTINATION "${CMAKE_INSTALL_PREFIX}" + COMPONENT Runtime) + +install(FILES "${FLUTTER_ICU_DATA_FILE}" DESTINATION "${INSTALL_BUNDLE_DATA_DIR}" + COMPONENT Runtime) + +install(FILES "${FLUTTER_LIBRARY}" DESTINATION "${INSTALL_BUNDLE_LIB_DIR}" + COMPONENT Runtime) + +if(PLUGIN_BUNDLED_LIBRARIES) + install(FILES "${PLUGIN_BUNDLED_LIBRARIES}" + DESTINATION "${INSTALL_BUNDLE_LIB_DIR}" + COMPONENT Runtime) +endif() + +# Fully re-copy the assets directory on each build to avoid having stale files +# from a previous install. +set(FLUTTER_ASSET_DIR_NAME "flutter_assets") +install(CODE " + file(REMOVE_RECURSE \"${INSTALL_BUNDLE_DATA_DIR}/${FLUTTER_ASSET_DIR_NAME}\") + " COMPONENT Runtime) +install(DIRECTORY "${PROJECT_BUILD_DIR}/${FLUTTER_ASSET_DIR_NAME}" + DESTINATION "${INSTALL_BUNDLE_DATA_DIR}" COMPONENT Runtime) + +# Install the AOT library on non-Debug builds only. +if(NOT CMAKE_BUILD_TYPE MATCHES "Debug") + install(FILES "${AOT_LIBRARY}" DESTINATION "${INSTALL_BUNDLE_LIB_DIR}" + COMPONENT Runtime) +endif() diff --git a/linux/flutter/CMakeLists.txt b/linux/flutter/CMakeLists.txt new file mode 100644 index 0000000..33fd580 --- /dev/null +++ b/linux/flutter/CMakeLists.txt @@ -0,0 +1,87 @@ +cmake_minimum_required(VERSION 3.10) + +set(EPHEMERAL_DIR "${CMAKE_CURRENT_SOURCE_DIR}/ephemeral") + +# Configuration provided via flutter tool. +include(${EPHEMERAL_DIR}/generated_config.cmake) + +# TODO: Move the rest of this into files in ephemeral. See +# https://github.com/flutter/flutter/issues/57146. + +# Serves the same purpose as list(TRANSFORM ... PREPEND ...), +# which isn't available in 3.10. +function(list_prepend LIST_NAME PREFIX) + set(NEW_LIST "") + foreach(element ${${LIST_NAME}}) + list(APPEND NEW_LIST "${PREFIX}${element}") + endforeach(element) + set(${LIST_NAME} "${NEW_LIST}" PARENT_SCOPE) +endfunction() + +# === Flutter Library === +# System-level dependencies. +find_package(PkgConfig REQUIRED) +pkg_check_modules(GTK REQUIRED IMPORTED_TARGET gtk+-3.0) +pkg_check_modules(GLIB REQUIRED IMPORTED_TARGET glib-2.0) +pkg_check_modules(GIO REQUIRED IMPORTED_TARGET gio-2.0) + +set(FLUTTER_LIBRARY "${EPHEMERAL_DIR}/libflutter_linux_gtk.so") + +# Published to parent scope for install step. +set(FLUTTER_LIBRARY ${FLUTTER_LIBRARY} PARENT_SCOPE) +set(FLUTTER_ICU_DATA_FILE "${EPHEMERAL_DIR}/icudtl.dat" PARENT_SCOPE) +set(PROJECT_BUILD_DIR "${PROJECT_DIR}/build/" PARENT_SCOPE) +set(AOT_LIBRARY "${PROJECT_DIR}/build/lib/libapp.so" PARENT_SCOPE) + +list(APPEND FLUTTER_LIBRARY_HEADERS + "fl_basic_message_channel.h" + "fl_binary_codec.h" + "fl_binary_messenger.h" + "fl_dart_project.h" + "fl_engine.h" + "fl_json_message_codec.h" + "fl_json_method_codec.h" + "fl_message_codec.h" + "fl_method_call.h" + "fl_method_channel.h" + "fl_method_codec.h" + "fl_method_response.h" + "fl_plugin_registrar.h" + "fl_plugin_registry.h" + "fl_standard_message_codec.h" + "fl_standard_method_codec.h" + "fl_string_codec.h" + "fl_value.h" + "fl_view.h" + "flutter_linux.h" +) +list_prepend(FLUTTER_LIBRARY_HEADERS "${EPHEMERAL_DIR}/flutter_linux/") +add_library(flutter INTERFACE) +target_include_directories(flutter INTERFACE + "${EPHEMERAL_DIR}" +) +target_link_libraries(flutter INTERFACE "${FLUTTER_LIBRARY}") +target_link_libraries(flutter INTERFACE + PkgConfig::GTK + PkgConfig::GLIB + PkgConfig::GIO +) +add_dependencies(flutter flutter_assemble) + +# === Flutter tool backend === +# _phony_ is a non-existent file to force this command to run every time, +# since currently there's no way to get a full input/output list from the +# flutter tool. +add_custom_command( + OUTPUT ${FLUTTER_LIBRARY} ${FLUTTER_LIBRARY_HEADERS} + ${CMAKE_CURRENT_BINARY_DIR}/_phony_ + COMMAND ${CMAKE_COMMAND} -E env + ${FLUTTER_TOOL_ENVIRONMENT} + "${FLUTTER_ROOT}/packages/flutter_tools/bin/tool_backend.sh" + ${FLUTTER_TARGET_PLATFORM} ${CMAKE_BUILD_TYPE} + VERBATIM +) +add_custom_target(flutter_assemble DEPENDS + "${FLUTTER_LIBRARY}" + ${FLUTTER_LIBRARY_HEADERS} +) diff --git a/linux/flutter/generated_plugin_registrant.cc b/linux/flutter/generated_plugin_registrant.cc new file mode 100644 index 0000000..e71a16d --- /dev/null +++ b/linux/flutter/generated_plugin_registrant.cc @@ -0,0 +1,11 @@ +// +// Generated file. Do not edit. +// + +// clang-format off + +#include "generated_plugin_registrant.h" + + +void fl_register_plugins(FlPluginRegistry* registry) { +} diff --git a/linux/flutter/generated_plugin_registrant.h b/linux/flutter/generated_plugin_registrant.h new file mode 100644 index 0000000..e0f0a47 --- /dev/null +++ b/linux/flutter/generated_plugin_registrant.h @@ -0,0 +1,15 @@ +// +// Generated file. Do not edit. +// + +// clang-format off + +#ifndef GENERATED_PLUGIN_REGISTRANT_ +#define GENERATED_PLUGIN_REGISTRANT_ + +#include + +// Registers Flutter plugins. +void fl_register_plugins(FlPluginRegistry* registry); + +#endif // GENERATED_PLUGIN_REGISTRANT_ diff --git a/linux/flutter/generated_plugins.cmake b/linux/flutter/generated_plugins.cmake new file mode 100644 index 0000000..51436ae --- /dev/null +++ b/linux/flutter/generated_plugins.cmake @@ -0,0 +1,15 @@ +# +# Generated file, do not edit. +# + +list(APPEND FLUTTER_PLUGIN_LIST +) + +set(PLUGIN_BUNDLED_LIBRARIES) + +foreach(plugin ${FLUTTER_PLUGIN_LIST}) + add_subdirectory(flutter/ephemeral/.plugin_symlinks/${plugin}/linux plugins/${plugin}) + target_link_libraries(${BINARY_NAME} PRIVATE ${plugin}_plugin) + list(APPEND PLUGIN_BUNDLED_LIBRARIES $) + list(APPEND PLUGIN_BUNDLED_LIBRARIES ${${plugin}_bundled_libraries}) +endforeach(plugin) diff --git a/linux/main.cc b/linux/main.cc new file mode 100644 index 0000000..e7c5c54 --- /dev/null +++ b/linux/main.cc @@ -0,0 +1,6 @@ +#include "my_application.h" + +int main(int argc, char** argv) { + g_autoptr(MyApplication) app = my_application_new(); + return g_application_run(G_APPLICATION(app), argc, argv); +} diff --git a/linux/my_application.cc b/linux/my_application.cc new file mode 100644 index 0000000..51cdca9 --- /dev/null +++ b/linux/my_application.cc @@ -0,0 +1,104 @@ +#include "my_application.h" + +#include +#ifdef GDK_WINDOWING_X11 +#include +#endif + +#include "flutter/generated_plugin_registrant.h" + +struct _MyApplication { + GtkApplication parent_instance; + char** dart_entrypoint_arguments; +}; + +G_DEFINE_TYPE(MyApplication, my_application, GTK_TYPE_APPLICATION) + +// Implements GApplication::activate. +static void my_application_activate(GApplication* application) { + MyApplication* self = MY_APPLICATION(application); + GtkWindow* window = + GTK_WINDOW(gtk_application_window_new(GTK_APPLICATION(application))); + + // Use a header bar when running in GNOME as this is the common style used + // by applications and is the setup most users will be using (e.g. Ubuntu + // desktop). + // If running on X and not using GNOME then just use a traditional title bar + // in case the window manager does more exotic layout, e.g. tiling. + // If running on Wayland assume the header bar will work (may need changing + // if future cases occur). + gboolean use_header_bar = TRUE; +#ifdef GDK_WINDOWING_X11 + GdkScreen* screen = gtk_window_get_screen(window); + if (GDK_IS_X11_SCREEN(screen)) { + const gchar* wm_name = gdk_x11_screen_get_window_manager_name(screen); + if (g_strcmp0(wm_name, "GNOME Shell") != 0) { + use_header_bar = FALSE; + } + } +#endif + if (use_header_bar) { + GtkHeaderBar* header_bar = GTK_HEADER_BAR(gtk_header_bar_new()); + gtk_widget_show(GTK_WIDGET(header_bar)); + gtk_header_bar_set_title(header_bar, "tasktracker"); + gtk_header_bar_set_show_close_button(header_bar, TRUE); + gtk_window_set_titlebar(window, GTK_WIDGET(header_bar)); + } else { + gtk_window_set_title(window, "tasktracker"); + } + + gtk_window_set_default_size(window, 1280, 720); + gtk_widget_show(GTK_WIDGET(window)); + + g_autoptr(FlDartProject) project = fl_dart_project_new(); + fl_dart_project_set_dart_entrypoint_arguments(project, self->dart_entrypoint_arguments); + + FlView* view = fl_view_new(project); + gtk_widget_show(GTK_WIDGET(view)); + gtk_container_add(GTK_CONTAINER(window), GTK_WIDGET(view)); + + fl_register_plugins(FL_PLUGIN_REGISTRY(view)); + + gtk_widget_grab_focus(GTK_WIDGET(view)); +} + +// Implements GApplication::local_command_line. +static gboolean my_application_local_command_line(GApplication* application, gchar*** arguments, int* exit_status) { + MyApplication* self = MY_APPLICATION(application); + // Strip out the first argument as it is the binary name. + self->dart_entrypoint_arguments = g_strdupv(*arguments + 1); + + g_autoptr(GError) error = nullptr; + if (!g_application_register(application, nullptr, &error)) { + g_warning("Failed to register: %s", error->message); + *exit_status = 1; + return TRUE; + } + + g_application_activate(application); + *exit_status = 0; + + return TRUE; +} + +// Implements GObject::dispose. +static void my_application_dispose(GObject* object) { + MyApplication* self = MY_APPLICATION(object); + g_clear_pointer(&self->dart_entrypoint_arguments, g_strfreev); + G_OBJECT_CLASS(my_application_parent_class)->dispose(object); +} + +static void my_application_class_init(MyApplicationClass* klass) { + G_APPLICATION_CLASS(klass)->activate = my_application_activate; + G_APPLICATION_CLASS(klass)->local_command_line = my_application_local_command_line; + G_OBJECT_CLASS(klass)->dispose = my_application_dispose; +} + +static void my_application_init(MyApplication* self) {} + +MyApplication* my_application_new() { + return MY_APPLICATION(g_object_new(my_application_get_type(), + "application-id", APPLICATION_ID, + "flags", G_APPLICATION_NON_UNIQUE, + nullptr)); +} diff --git a/linux/my_application.h b/linux/my_application.h new file mode 100644 index 0000000..72271d5 --- /dev/null +++ b/linux/my_application.h @@ -0,0 +1,18 @@ +#ifndef FLUTTER_MY_APPLICATION_H_ +#define FLUTTER_MY_APPLICATION_H_ + +#include + +G_DECLARE_FINAL_TYPE(MyApplication, my_application, MY, APPLICATION, + GtkApplication) + +/** + * my_application_new: + * + * Creates a new Flutter-based application. + * + * Returns: a new #MyApplication. + */ +MyApplication* my_application_new(); + +#endif // FLUTTER_MY_APPLICATION_H_ diff --git a/pubspec.lock b/pubspec.lock index c0bd609..ed62a37 100644 --- a/pubspec.lock +++ b/pubspec.lock @@ -1,6 +1,13 @@ # Generated by pub # See https://dart.dev/tools/pub/glossary#lockfile packages: + args: + dependency: transitive + description: + name: args + url: "https://pub.dartlang.org" + source: hosted + version: "2.3.0" async: dependency: transitive description: @@ -43,6 +50,48 @@ packages: url: "https://pub.dartlang.org" source: hosted version: "1.15.0" + connectivity_plus: + dependency: "direct main" + description: + name: connectivity_plus + url: "https://pub.dartlang.org" + source: hosted + version: "2.2.1" + connectivity_plus_linux: + dependency: transitive + description: + name: connectivity_plus_linux + url: "https://pub.dartlang.org" + source: hosted + version: "1.3.0" + connectivity_plus_macos: + dependency: transitive + description: + name: connectivity_plus_macos + url: "https://pub.dartlang.org" + source: hosted + version: "1.2.1" + connectivity_plus_platform_interface: + dependency: transitive + description: + name: connectivity_plus_platform_interface + url: "https://pub.dartlang.org" + source: hosted + version: "1.2.0" + connectivity_plus_web: + dependency: transitive + description: + name: connectivity_plus_web + url: "https://pub.dartlang.org" + source: hosted + version: "1.2.0" + connectivity_plus_windows: + dependency: transitive + description: + name: connectivity_plus_windows + url: "https://pub.dartlang.org" + source: hosted + version: "1.2.0" crypto: dependency: transitive description: @@ -57,6 +106,13 @@ packages: url: "https://pub.dartlang.org" source: hosted version: "1.0.4" + dbus: + dependency: transitive + description: + name: dbus + url: "https://pub.dartlang.org" + source: hosted + version: "0.7.1" device_info_plus: dependency: "direct main" description: @@ -146,6 +202,34 @@ packages: url: "https://pub.dartlang.org" source: hosted version: "1.0.4" + flutter_local_notifications: + dependency: "direct main" + description: + name: flutter_local_notifications + url: "https://pub.dartlang.org" + source: hosted + version: "9.3.3" + flutter_local_notifications_linux: + dependency: transitive + description: + name: flutter_local_notifications_linux + url: "https://pub.dartlang.org" + source: hosted + version: "0.4.2" + flutter_local_notifications_platform_interface: + dependency: transitive + description: + name: flutter_local_notifications_platform_interface + url: "https://pub.dartlang.org" + source: hosted + version: "5.0.0" + flutter_spinkit: + dependency: "direct main" + description: + name: flutter_spinkit + url: "https://pub.dartlang.org" + source: hosted + version: "5.1.0" flutter_test: dependency: "direct dev" description: flutter @@ -219,6 +303,13 @@ packages: url: "https://pub.dartlang.org" source: hosted version: "1.0.0" + nm: + dependency: transitive + description: + name: nm + url: "https://pub.dartlang.org" + source: hosted + version: "0.5.0" path: dependency: transitive description: @@ -275,6 +366,13 @@ packages: url: "https://pub.dartlang.org" source: hosted version: "2.0.5" + petitparser: + dependency: transitive + description: + name: petitparser + url: "https://pub.dartlang.org" + source: hosted + version: "4.4.0" platform: dependency: transitive description: @@ -303,6 +401,13 @@ packages: url: "https://pub.dartlang.org" source: hosted version: "6.0.2" + rxdart: + dependency: "direct main" + description: + name: rxdart + url: "https://pub.dartlang.org" + source: hosted + version: "0.27.3" shared_preferences: dependency: "direct main" description: @@ -364,13 +469,6 @@ packages: description: flutter source: sdk version: "0.0.99" - sn_progress_dialog: - dependency: "direct main" - description: - name: sn_progress_dialog - url: "https://pub.dartlang.org" - source: hosted - version: "1.0.3" source_span: dependency: transitive description: @@ -448,6 +546,13 @@ packages: url: "https://pub.dartlang.org" source: hosted version: "0.4.8" + timezone: + dependency: transitive + description: + name: timezone + url: "https://pub.dartlang.org" + source: hosted + version: "0.8.0" typed_data: dependency: transitive description: @@ -518,6 +623,13 @@ packages: url: "https://pub.dartlang.org" source: hosted version: "0.2.0+1" + xml: + dependency: transitive + description: + name: xml + url: "https://pub.dartlang.org" + source: hosted + version: "5.3.1" sdks: dart: ">=2.16.0 <3.0.0" flutter: ">=2.8.0" diff --git a/pubspec.yaml b/pubspec.yaml index 5cc8063..bace493 100644 --- a/pubspec.yaml +++ b/pubspec.yaml @@ -30,6 +30,10 @@ dependencies: flutter: sdk: flutter + connectivity_plus: ^2.2.1 + flutter_spinkit: ^5.1.0 + flutter_local_notifications: ^9.3.3 + rxdart: ^0.27.1 provider: ^6.0.2 cupertino_icons: ^1.0.2 uuid: ^3.0.5 @@ -39,11 +43,10 @@ dependencies: sqflite: ^2.0.2 intl: ^0.17.0 flutter_colorpicker: ^1.0.3 - path_provider: ^2.0.9 + path_provider: ^2.0.0 shared_preferences: ^2.0.13 http: ^0.13.4 device_info_plus: ^3.2.1 - sn_progress_dialog: ^1.0.3 flutter_lints: ^1.0.0 dev_dependencies: flutter_test: diff --git a/web/favicon.png b/web/favicon.png new file mode 100644 index 0000000000000000000000000000000000000000..8aaa46ac1ae21512746f852a42ba87e4165dfdd1 GIT binary patch literal 917 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`jKx9jP7LeL$-D$|I14-?iy0X7 zltGxWVyS%@P(fs7NJL45ua8x7ey(0(N`6wRUPW#JP&EUCO@$SZnVVXYs8ErclUHn2 zVXFjIVFhG^g!Ppaz)DK8ZIvQ?0~DO|i&7O#^-S~(l1AfjnEK zjFOT9D}DX)@^Za$W4-*MbbUihOG|wNBYh(yU7!lx;>x^|#0uTKVr7USFmqf|i<65o z3raHc^AtelCMM;Vme?vOfh>Xph&xL%(-1c06+^uR^q@XSM&D4+Kp$>4P^%3{)XKjo zGZknv$b36P8?Z_gF{nK@`XI}Z90TzwSQO}0J1!f2c(B=V`5aP@1P1a|PZ!4!3&Gl8 zTYqUsf!gYFyJnXpu0!n&N*SYAX-%d(5gVjrHJWqXQshj@!Zm{!01WsQrH~9=kTxW#6SvuapgMqt>$=j#%eyGrQzr zP{L-3gsMA^$I1&gsBAEL+vxi1*Igl=8#8`5?A-T5=z-sk46WA1IUT)AIZHx1rdUrf zVJrJn<74DDw`j)Ki#gt}mIT-Q`XRa2-jQXQoI%w`nb|XblvzK${ZzlV)m-XcwC(od z71_OEC5Bt9GEXosOXaPTYOia#R4ID2TiU~`zVMl08TV_C%DnU4^+HE>9(CE4D6?Fz oujB08i7adh9xk7*FX66dWH6F5TM;?E2b5PlUHx3vIVCg!0Dx9vYXATM literal 0 HcmV?d00001 diff --git a/web/icons/Icon-192.png b/web/icons/Icon-192.png new file mode 100644 index 0000000000000000000000000000000000000000..b749bfef07473333cf1dd31e9eed89862a5d52aa GIT binary patch literal 5292 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 literal 0 HcmV?d00001 diff --git a/web/icons/Icon-512.png b/web/icons/Icon-512.png new file mode 100644 index 0000000000000000000000000000000000000000..88cfd48dff1169879ba46840804b412fe02fefd6 GIT binary patch literal 8252 zcmd5=2T+s!lYZ%-(h(2@5fr2dC?F^$C=i-}R6$UX8af(!je;W5yC_|HmujSgN*6?W z3knF*TL1$|?oD*=zPbBVex*RUIKsL<(&Rj9%^UD2IK3W?2j>D?eWQgvS-HLymHo9%~|N2Q{~j za?*X-{b9JRowv_*Mh|;*-kPFn>PI;r<#kFaxFqbn?aq|PduQg=2Q;~Qc}#z)_T%x9 zE|0!a70`58wjREmAH38H1)#gof)U3g9FZ^ zF7&-0^Hy{4XHWLoC*hOG(dg~2g6&?-wqcpf{ z&3=o8vw7lMi22jCG9RQbv8H}`+}9^zSk`nlR8?Z&G2dlDy$4#+WOlg;VHqzuE=fM@ z?OI6HEJH4&tA?FVG}9>jAnq_^tlw8NbjNhfqk2rQr?h(F&WiKy03Sn=-;ZJRh~JrD zbt)zLbnabttEZ>zUiu`N*u4sfQaLE8-WDn@tHp50uD(^r-}UsUUu)`!Rl1PozAc!a z?uj|2QDQ%oV-jxUJmJycySBINSKdX{kDYRS=+`HgR2GO19fg&lZKyBFbbXhQV~v~L za^U944F1_GtuFXtvDdDNDvp<`fqy);>Vw=ncy!NB85Tw{&sT5&Ox%-p%8fTS;OzlRBwErvO+ROe?{%q-Zge=%Up|D4L#>4K@Ke=x%?*^_^P*KD zgXueMiS63!sEw@fNLB-i^F|@Oib+S4bcy{eu&e}Xvb^(mA!=U=Xr3||IpV~3K zQWzEsUeX_qBe6fky#M zzOJm5b+l;~>=sdp%i}}0h zO?B?i*W;Ndn02Y0GUUPxERG`3Bjtj!NroLoYtyVdLtl?SE*CYpf4|_${ku2s`*_)k zN=a}V8_2R5QANlxsq!1BkT6$4>9=-Ix4As@FSS;1q^#TXPrBsw>hJ}$jZ{kUHoP+H zvoYiR39gX}2OHIBYCa~6ERRPJ#V}RIIZakUmuIoLF*{sO8rAUEB9|+A#C|@kw5>u0 zBd=F!4I)Be8ycH*)X1-VPiZ+Ts8_GB;YW&ZFFUo|Sw|x~ZajLsp+_3gv((Q#N>?Jz zFBf`~p_#^${zhPIIJY~yo!7$-xi2LK%3&RkFg}Ax)3+dFCjGgKv^1;lUzQlPo^E{K zmCnrwJ)NuSaJEmueEPO@(_6h3f5mFffhkU9r8A8(JC5eOkux{gPmx_$Uv&|hyj)gN zd>JP8l2U&81@1Hc>#*su2xd{)T`Yw< zN$dSLUN}dfx)Fu`NcY}TuZ)SdviT{JHaiYgP4~@`x{&h*Hd>c3K_To9BnQi@;tuoL z%PYQo&{|IsM)_>BrF1oB~+`2_uZQ48z9!)mtUR zdfKE+b*w8cPu;F6RYJiYyV;PRBbThqHBEu_(U{(gGtjM}Zi$pL8Whx}<JwE3RM0F8x7%!!s)UJVq|TVd#hf1zVLya$;mYp(^oZQ2>=ZXU1c$}f zm|7kfk>=4KoQoQ!2&SOW5|JP1)%#55C$M(u4%SP~tHa&M+=;YsW=v(Old9L3(j)`u z2?#fK&1vtS?G6aOt@E`gZ9*qCmyvc>Ma@Q8^I4y~f3gs7*d=ATlP>1S zyF=k&6p2;7dn^8?+!wZO5r~B+;@KXFEn^&C=6ma1J7Au6y29iMIxd7#iW%=iUzq&C=$aPLa^Q zncia$@TIy6UT@69=nbty5epP>*fVW@5qbUcb2~Gg75dNd{COFLdiz3}kODn^U*=@E z0*$7u7Rl2u)=%fk4m8EK1ctR!6%Ve`e!O20L$0LkM#f+)n9h^dn{n`T*^~d+l*Qlx z$;JC0P9+en2Wlxjwq#z^a6pdnD6fJM!GV7_%8%c)kc5LZs_G^qvw)&J#6WSp< zmsd~1-(GrgjC56Pdf6#!dt^y8Rg}!#UXf)W%~PeU+kU`FeSZHk)%sFv++#Dujk-~m zFHvVJC}UBn2jN& zs!@nZ?e(iyZPNo`p1i#~wsv9l@#Z|ag3JR>0#u1iW9M1RK1iF6-RbJ4KYg?B`dET9 zyR~DjZ>%_vWYm*Z9_+^~hJ_|SNTzBKx=U0l9 z9x(J96b{`R)UVQ$I`wTJ@$_}`)_DyUNOso6=WOmQKI1e`oyYy1C&%AQU<0-`(ow)1 zT}gYdwWdm4wW6|K)LcfMe&psE0XGhMy&xS`@vLi|1#Za{D6l@#D!?nW87wcscUZgELT{Cz**^;Zb~7 z(~WFRO`~!WvyZAW-8v!6n&j*PLm9NlN}BuUN}@E^TX*4Or#dMMF?V9KBeLSiLO4?B zcE3WNIa-H{ThrlCoN=XjOGk1dT=xwwrmt<1a)mrRzg{35`@C!T?&_;Q4Ce=5=>z^*zE_c(0*vWo2_#TD<2)pLXV$FlwP}Ik74IdDQU@yhkCr5h zn5aa>B7PWy5NQ!vf7@p_qtC*{dZ8zLS;JetPkHi>IvPjtJ#ThGQD|Lq#@vE2xdl%`x4A8xOln}BiQ92Po zW;0%A?I5CQ_O`@Ad=`2BLPPbBuPUp@Hb%a_OOI}y{Rwa<#h z5^6M}s7VzE)2&I*33pA>e71d78QpF>sNK;?lj^Kl#wU7G++`N_oL4QPd-iPqBhhs| z(uVM}$ItF-onXuuXO}o$t)emBO3Hjfyil@*+GF;9j?`&67GBM;TGkLHi>@)rkS4Nj zAEk;u)`jc4C$qN6WV2dVd#q}2X6nKt&X*}I@jP%Srs%%DS92lpDY^K*Sx4`l;aql$ zt*-V{U&$DM>pdO?%jt$t=vg5|p+Rw?SPaLW zB6nvZ69$ne4Z(s$3=Rf&RX8L9PWMV*S0@R zuIk&ba#s6sxVZ51^4Kon46X^9`?DC9mEhWB3f+o4#2EXFqy0(UTc>GU| zGCJmI|Dn-dX#7|_6(fT)>&YQ0H&&JX3cTvAq(a@ydM4>5Njnuere{J8p;3?1az60* z$1E7Yyxt^ytULeokgDnRVKQw9vzHg1>X@@jM$n$HBlveIrKP5-GJq%iWH#odVwV6cF^kKX(@#%%uQVb>#T6L^mC@)%SMd4DF? zVky!~ge27>cpUP1Vi}Z32lbLV+CQy+T5Wdmva6Fg^lKb!zrg|HPU=5Qu}k;4GVH+x z%;&pN1LOce0w@9i1Mo-Y|7|z}fbch@BPp2{&R-5{GLoeu8@limQmFF zaJRR|^;kW_nw~0V^ zfTnR!Ni*;-%oSHG1yItARs~uxra|O?YJxBzLjpeE-=~TO3Dn`JL5Gz;F~O1u3|FE- zvK2Vve`ylc`a}G`gpHg58Cqc9fMoy1L}7x7T>%~b&irrNMo?np3`q;d3d;zTK>nrK zOjPS{@&74-fA7j)8uT9~*g23uGnxwIVj9HorzUX#s0pcp2?GH6i}~+kv9fWChtPa_ z@T3m+$0pbjdQw7jcnHn;Pi85hk_u2-1^}c)LNvjdam8K-XJ+KgKQ%!?2n_!#{$H|| zLO=%;hRo6EDmnOBKCL9Cg~ETU##@u^W_5joZ%Et%X_n##%JDOcsO=0VL|Lkk!VdRJ z^|~2pB@PUspT?NOeO?=0Vb+fAGc!j%Ufn-cB`s2A~W{Zj{`wqWq_-w0wr@6VrM zbzni@8c>WS!7c&|ZR$cQ;`niRw{4kG#e z70e!uX8VmP23SuJ*)#(&R=;SxGAvq|&>geL&!5Z7@0Z(No*W561n#u$Uc`f9pD70# z=sKOSK|bF~#khTTn)B28h^a1{;>EaRnHj~>i=Fnr3+Fa4 z`^+O5_itS#7kPd20rq66_wH`%?HNzWk@XFK0n;Z@Cx{kx==2L22zWH$Yg?7 zvDj|u{{+NR3JvUH({;b*$b(U5U z7(lF!1bz2%06+|-v(D?2KgwNw7( zJB#Tz+ZRi&U$i?f34m7>uTzO#+E5cbaiQ&L}UxyOQq~afbNB4EI{E04ZWg53w0A{O%qo=lF8d zf~ktGvIgf-a~zQoWf>loF7pOodrd0a2|BzwwPDV}ShauTK8*fmF6NRbO>Iw9zZU}u zw8Ya}?seBnEGQDmH#XpUUkj}N49tP<2jYwTFp!P+&Fd(%Z#yo80|5@zN(D{_pNow*&4%ql zW~&yp@scb-+Qj-EmErY+Tu=dUmf@*BoXY2&oKT8U?8?s1d}4a`Aq>7SV800m$FE~? zjmz(LY+Xx9sDX$;vU`xgw*jLw7dWOnWWCO8o|;}f>cu0Q&`0I{YudMn;P;L3R-uz# zfns_mZED_IakFBPP2r_S8XM$X)@O-xVKi4`7373Jkd5{2$M#%cRhWer3M(vr{S6>h zj{givZJ3(`yFL@``(afn&~iNx@B1|-qfYiZu?-_&Z8+R~v`d6R-}EX9IVXWO-!hL5 z*k6T#^2zAXdardU3Ao~I)4DGdAv2bx{4nOK`20rJo>rmk3S2ZDu}))8Z1m}CKigf0 z3L`3Y`{huj`xj9@`$xTZzZc3je?n^yG<8sw$`Y%}9mUsjUR%T!?k^(q)6FH6Af^b6 zlPg~IEwg0y;`t9y;#D+uz!oE4VP&Je!<#q*F?m5L5?J3i@!0J6q#eu z!RRU`-)HeqGi_UJZ(n~|PSNsv+Wgl{P-TvaUQ9j?ZCtvb^37U$sFpBrkT{7Jpd?HpIvj2!}RIq zH{9~+gErN2+}J`>Jvng2hwM`=PLNkc7pkjblKW|+Fk9rc)G1R>Ww>RC=r-|!m-u7( zc(a$9NG}w#PjWNMS~)o=i~WA&4L(YIW25@AL9+H9!?3Y}sv#MOdY{bb9j>p`{?O(P zIvb`n?_(gP2w3P#&91JX*md+bBEr%xUHMVqfB;(f?OPtMnAZ#rm5q5mh;a2f_si2_ z3oXWB?{NF(JtkAn6F(O{z@b76OIqMC$&oJ_&S|YbFJ*)3qVX_uNf5b8(!vGX19hsG z(OP>RmZp29KH9Ge2kKjKigUmOe^K_!UXP`von)PR8Qz$%=EmOB9xS(ZxE_tnyzo}7 z=6~$~9k0M~v}`w={AeqF?_)9q{m8K#6M{a&(;u;O41j)I$^T?lx5(zlebpY@NT&#N zR+1bB)-1-xj}R8uwqwf=iP1GbxBjneCC%UrSdSxK1vM^i9;bUkS#iRZw2H>rS<2<$ zNT3|sDH>{tXb=zq7XZi*K?#Zsa1h1{h5!Tq_YbKFm_*=A5-<~j63he;4`77!|LBlo zR^~tR3yxcU=gDFbshyF6>o0bdp$qmHS7D}m3;^QZq9kBBU|9$N-~oU?G5;jyFR7>z hN`IR97YZXIo@y!QgFWddJ3|0`sjFx!m))><{BI=FK%f8s literal 0 HcmV?d00001 diff --git a/web/icons/Icon-maskable-192.png b/web/icons/Icon-maskable-192.png new file mode 100644 index 0000000000000000000000000000000000000000..eb9b4d76e525556d5d89141648c724331630325d GIT binary patch literal 5594 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 X>c!)3PgKfL&lX^$Z>Cpu&6)6jvi^Z! literal 0 HcmV?d00001 diff --git a/web/icons/Icon-maskable-512.png b/web/icons/Icon-maskable-512.png new file mode 100644 index 0000000000000000000000000000000000000000..d69c56691fbdb0b7efa65097c7cc1edac12a6d3e GIT binary patch literal 20998 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 MPgg&ebxsLQ025IeI{*Lx literal 0 HcmV?d00001 diff --git a/web/index.html b/web/index.html new file mode 100644 index 0000000..6623167 --- /dev/null +++ b/web/index.html @@ -0,0 +1,104 @@ + + + + + + + + + + + + + + + + + + + + tasktracker + + + + + + + diff --git a/web/manifest.json b/web/manifest.json new file mode 100644 index 0000000..8b0f47c --- /dev/null +++ b/web/manifest.json @@ -0,0 +1,35 @@ +{ + "name": "tasktracker", + "short_name": "tasktracker", + "start_url": ".", + "display": "standalone", + "background_color": "#0175C2", + "theme_color": "#0175C2", + "description": "A new Flutter project.", + "orientation": "portrait-primary", + "prefer_related_applications": false, + "icons": [ + { + "src": "icons/Icon-192.png", + "sizes": "192x192", + "type": "image/png" + }, + { + "src": "icons/Icon-512.png", + "sizes": "512x512", + "type": "image/png" + }, + { + "src": "icons/Icon-maskable-192.png", + "sizes": "192x192", + "type": "image/png", + "purpose": "maskable" + }, + { + "src": "icons/Icon-maskable-512.png", + "sizes": "512x512", + "type": "image/png", + "purpose": "maskable" + } + ] +} diff --git a/windows/.gitignore b/windows/.gitignore new file mode 100644 index 0000000..d492d0d --- /dev/null +++ b/windows/.gitignore @@ -0,0 +1,17 @@ +flutter/ephemeral/ + +# Visual Studio user-specific files. +*.suo +*.user +*.userosscache +*.sln.docstates + +# Visual Studio build-related files. +x64/ +x86/ + +# Visual Studio cache files +# files ending in .cache can be ignored +*.[Cc]ache +# but keep track of directories ending in .cache +!*.[Cc]ache/ diff --git a/windows/CMakeLists.txt b/windows/CMakeLists.txt new file mode 100644 index 0000000..258e255 --- /dev/null +++ b/windows/CMakeLists.txt @@ -0,0 +1,95 @@ +cmake_minimum_required(VERSION 3.14) +project(tasktracker LANGUAGES CXX) + +set(BINARY_NAME "tasktracker") + +cmake_policy(SET CMP0063 NEW) + +set(CMAKE_INSTALL_RPATH "$ORIGIN/lib") + +# Configure build options. +get_property(IS_MULTICONFIG GLOBAL PROPERTY GENERATOR_IS_MULTI_CONFIG) +if(IS_MULTICONFIG) + set(CMAKE_CONFIGURATION_TYPES "Debug;Profile;Release" + CACHE STRING "" FORCE) +else() + if(NOT CMAKE_BUILD_TYPE AND NOT CMAKE_CONFIGURATION_TYPES) + set(CMAKE_BUILD_TYPE "Debug" CACHE + STRING "Flutter build mode" FORCE) + set_property(CACHE CMAKE_BUILD_TYPE PROPERTY STRINGS + "Debug" "Profile" "Release") + endif() +endif() + +set(CMAKE_EXE_LINKER_FLAGS_PROFILE "${CMAKE_EXE_LINKER_FLAGS_RELEASE}") +set(CMAKE_SHARED_LINKER_FLAGS_PROFILE "${CMAKE_SHARED_LINKER_FLAGS_RELEASE}") +set(CMAKE_C_FLAGS_PROFILE "${CMAKE_C_FLAGS_RELEASE}") +set(CMAKE_CXX_FLAGS_PROFILE "${CMAKE_CXX_FLAGS_RELEASE}") + +# Use Unicode for all projects. +add_definitions(-DUNICODE -D_UNICODE) + +# Compilation settings that should be applied to most targets. +function(APPLY_STANDARD_SETTINGS TARGET) + target_compile_features(${TARGET} PUBLIC cxx_std_17) + target_compile_options(${TARGET} PRIVATE /W4 /WX /wd"4100") + target_compile_options(${TARGET} PRIVATE /EHsc) + target_compile_definitions(${TARGET} PRIVATE "_HAS_EXCEPTIONS=0") + target_compile_definitions(${TARGET} PRIVATE "$<$:_DEBUG>") +endfunction() + +set(FLUTTER_MANAGED_DIR "${CMAKE_CURRENT_SOURCE_DIR}/flutter") + +# Flutter library and tool build rules. +add_subdirectory(${FLUTTER_MANAGED_DIR}) + +# Application build +add_subdirectory("runner") + +# Generated plugin build rules, which manage building the plugins and adding +# them to the application. +include(flutter/generated_plugins.cmake) + + +# === Installation === +# Support files are copied into place next to the executable, so that it can +# run in place. This is done instead of making a separate bundle (as on Linux) +# so that building and running from within Visual Studio will work. +set(BUILD_BUNDLE_DIR "$") +# Make the "install" step default, as it's required to run. +set(CMAKE_VS_INCLUDE_INSTALL_TO_DEFAULT_BUILD 1) +if(CMAKE_INSTALL_PREFIX_INITIALIZED_TO_DEFAULT) + set(CMAKE_INSTALL_PREFIX "${BUILD_BUNDLE_DIR}" CACHE PATH "..." FORCE) +endif() + +set(INSTALL_BUNDLE_DATA_DIR "${CMAKE_INSTALL_PREFIX}/data") +set(INSTALL_BUNDLE_LIB_DIR "${CMAKE_INSTALL_PREFIX}") + +install(TARGETS ${BINARY_NAME} RUNTIME DESTINATION "${CMAKE_INSTALL_PREFIX}" + COMPONENT Runtime) + +install(FILES "${FLUTTER_ICU_DATA_FILE}" DESTINATION "${INSTALL_BUNDLE_DATA_DIR}" + COMPONENT Runtime) + +install(FILES "${FLUTTER_LIBRARY}" DESTINATION "${INSTALL_BUNDLE_LIB_DIR}" + COMPONENT Runtime) + +if(PLUGIN_BUNDLED_LIBRARIES) + install(FILES "${PLUGIN_BUNDLED_LIBRARIES}" + DESTINATION "${INSTALL_BUNDLE_LIB_DIR}" + COMPONENT Runtime) +endif() + +# Fully re-copy the assets directory on each build to avoid having stale files +# from a previous install. +set(FLUTTER_ASSET_DIR_NAME "flutter_assets") +install(CODE " + file(REMOVE_RECURSE \"${INSTALL_BUNDLE_DATA_DIR}/${FLUTTER_ASSET_DIR_NAME}\") + " COMPONENT Runtime) +install(DIRECTORY "${PROJECT_BUILD_DIR}/${FLUTTER_ASSET_DIR_NAME}" + DESTINATION "${INSTALL_BUNDLE_DATA_DIR}" COMPONENT Runtime) + +# Install the AOT library on non-Debug builds only. +install(FILES "${AOT_LIBRARY}" DESTINATION "${INSTALL_BUNDLE_DATA_DIR}" + CONFIGURATIONS Profile;Release + COMPONENT Runtime) diff --git a/windows/flutter/CMakeLists.txt b/windows/flutter/CMakeLists.txt new file mode 100644 index 0000000..b2e4bd8 --- /dev/null +++ b/windows/flutter/CMakeLists.txt @@ -0,0 +1,103 @@ +cmake_minimum_required(VERSION 3.14) + +set(EPHEMERAL_DIR "${CMAKE_CURRENT_SOURCE_DIR}/ephemeral") + +# Configuration provided via flutter tool. +include(${EPHEMERAL_DIR}/generated_config.cmake) + +# TODO: Move the rest of this into files in ephemeral. See +# https://github.com/flutter/flutter/issues/57146. +set(WRAPPER_ROOT "${EPHEMERAL_DIR}/cpp_client_wrapper") + +# === Flutter Library === +set(FLUTTER_LIBRARY "${EPHEMERAL_DIR}/flutter_windows.dll") + +# Published to parent scope for install step. +set(FLUTTER_LIBRARY ${FLUTTER_LIBRARY} PARENT_SCOPE) +set(FLUTTER_ICU_DATA_FILE "${EPHEMERAL_DIR}/icudtl.dat" PARENT_SCOPE) +set(PROJECT_BUILD_DIR "${PROJECT_DIR}/build/" PARENT_SCOPE) +set(AOT_LIBRARY "${PROJECT_DIR}/build/windows/app.so" PARENT_SCOPE) + +list(APPEND FLUTTER_LIBRARY_HEADERS + "flutter_export.h" + "flutter_windows.h" + "flutter_messenger.h" + "flutter_plugin_registrar.h" + "flutter_texture_registrar.h" +) +list(TRANSFORM FLUTTER_LIBRARY_HEADERS PREPEND "${EPHEMERAL_DIR}/") +add_library(flutter INTERFACE) +target_include_directories(flutter INTERFACE + "${EPHEMERAL_DIR}" +) +target_link_libraries(flutter INTERFACE "${FLUTTER_LIBRARY}.lib") +add_dependencies(flutter flutter_assemble) + +# === Wrapper === +list(APPEND CPP_WRAPPER_SOURCES_CORE + "core_implementations.cc" + "standard_codec.cc" +) +list(TRANSFORM CPP_WRAPPER_SOURCES_CORE PREPEND "${WRAPPER_ROOT}/") +list(APPEND CPP_WRAPPER_SOURCES_PLUGIN + "plugin_registrar.cc" +) +list(TRANSFORM CPP_WRAPPER_SOURCES_PLUGIN PREPEND "${WRAPPER_ROOT}/") +list(APPEND CPP_WRAPPER_SOURCES_APP + "flutter_engine.cc" + "flutter_view_controller.cc" +) +list(TRANSFORM CPP_WRAPPER_SOURCES_APP PREPEND "${WRAPPER_ROOT}/") + +# Wrapper sources needed for a plugin. +add_library(flutter_wrapper_plugin STATIC + ${CPP_WRAPPER_SOURCES_CORE} + ${CPP_WRAPPER_SOURCES_PLUGIN} +) +apply_standard_settings(flutter_wrapper_plugin) +set_target_properties(flutter_wrapper_plugin PROPERTIES + POSITION_INDEPENDENT_CODE ON) +set_target_properties(flutter_wrapper_plugin PROPERTIES + CXX_VISIBILITY_PRESET hidden) +target_link_libraries(flutter_wrapper_plugin PUBLIC flutter) +target_include_directories(flutter_wrapper_plugin PUBLIC + "${WRAPPER_ROOT}/include" +) +add_dependencies(flutter_wrapper_plugin flutter_assemble) + +# Wrapper sources needed for the runner. +add_library(flutter_wrapper_app STATIC + ${CPP_WRAPPER_SOURCES_CORE} + ${CPP_WRAPPER_SOURCES_APP} +) +apply_standard_settings(flutter_wrapper_app) +target_link_libraries(flutter_wrapper_app PUBLIC flutter) +target_include_directories(flutter_wrapper_app PUBLIC + "${WRAPPER_ROOT}/include" +) +add_dependencies(flutter_wrapper_app flutter_assemble) + +# === Flutter tool backend === +# _phony_ is a non-existent file to force this command to run every time, +# since currently there's no way to get a full input/output list from the +# flutter tool. +set(PHONY_OUTPUT "${CMAKE_CURRENT_BINARY_DIR}/_phony_") +set_source_files_properties("${PHONY_OUTPUT}" PROPERTIES SYMBOLIC TRUE) +add_custom_command( + OUTPUT ${FLUTTER_LIBRARY} ${FLUTTER_LIBRARY_HEADERS} + ${CPP_WRAPPER_SOURCES_CORE} ${CPP_WRAPPER_SOURCES_PLUGIN} + ${CPP_WRAPPER_SOURCES_APP} + ${PHONY_OUTPUT} + COMMAND ${CMAKE_COMMAND} -E env + ${FLUTTER_TOOL_ENVIRONMENT} + "${FLUTTER_ROOT}/packages/flutter_tools/bin/tool_backend.bat" + windows-x64 $ + VERBATIM +) +add_custom_target(flutter_assemble DEPENDS + "${FLUTTER_LIBRARY}" + ${FLUTTER_LIBRARY_HEADERS} + ${CPP_WRAPPER_SOURCES_CORE} + ${CPP_WRAPPER_SOURCES_PLUGIN} + ${CPP_WRAPPER_SOURCES_APP} +) diff --git a/windows/flutter/generated_plugin_registrant.cc b/windows/flutter/generated_plugin_registrant.cc new file mode 100644 index 0000000..8083d74 --- /dev/null +++ b/windows/flutter/generated_plugin_registrant.cc @@ -0,0 +1,14 @@ +// +// Generated file. Do not edit. +// + +// clang-format off + +#include "generated_plugin_registrant.h" + +#include + +void RegisterPlugins(flutter::PluginRegistry* registry) { + ConnectivityPlusWindowsPluginRegisterWithRegistrar( + registry->GetRegistrarForPlugin("ConnectivityPlusWindowsPlugin")); +} diff --git a/windows/flutter/generated_plugin_registrant.h b/windows/flutter/generated_plugin_registrant.h new file mode 100644 index 0000000..dc139d8 --- /dev/null +++ b/windows/flutter/generated_plugin_registrant.h @@ -0,0 +1,15 @@ +// +// Generated file. Do not edit. +// + +// clang-format off + +#ifndef GENERATED_PLUGIN_REGISTRANT_ +#define GENERATED_PLUGIN_REGISTRANT_ + +#include + +// Registers Flutter plugins. +void RegisterPlugins(flutter::PluginRegistry* registry); + +#endif // GENERATED_PLUGIN_REGISTRANT_ diff --git a/windows/flutter/generated_plugins.cmake b/windows/flutter/generated_plugins.cmake new file mode 100644 index 0000000..ba4a217 --- /dev/null +++ b/windows/flutter/generated_plugins.cmake @@ -0,0 +1,16 @@ +# +# Generated file, do not edit. +# + +list(APPEND FLUTTER_PLUGIN_LIST + connectivity_plus_windows +) + +set(PLUGIN_BUNDLED_LIBRARIES) + +foreach(plugin ${FLUTTER_PLUGIN_LIST}) + add_subdirectory(flutter/ephemeral/.plugin_symlinks/${plugin}/windows plugins/${plugin}) + target_link_libraries(${BINARY_NAME} PRIVATE ${plugin}_plugin) + list(APPEND PLUGIN_BUNDLED_LIBRARIES $) + list(APPEND PLUGIN_BUNDLED_LIBRARIES ${${plugin}_bundled_libraries}) +endforeach(plugin) diff --git a/windows/runner/CMakeLists.txt b/windows/runner/CMakeLists.txt new file mode 100644 index 0000000..de2d891 --- /dev/null +++ b/windows/runner/CMakeLists.txt @@ -0,0 +1,17 @@ +cmake_minimum_required(VERSION 3.14) +project(runner LANGUAGES CXX) + +add_executable(${BINARY_NAME} WIN32 + "flutter_window.cpp" + "main.cpp" + "utils.cpp" + "win32_window.cpp" + "${FLUTTER_MANAGED_DIR}/generated_plugin_registrant.cc" + "Runner.rc" + "runner.exe.manifest" +) +apply_standard_settings(${BINARY_NAME}) +target_compile_definitions(${BINARY_NAME} PRIVATE "NOMINMAX") +target_link_libraries(${BINARY_NAME} PRIVATE flutter flutter_wrapper_app) +target_include_directories(${BINARY_NAME} PRIVATE "${CMAKE_SOURCE_DIR}") +add_dependencies(${BINARY_NAME} flutter_assemble) diff --git a/windows/runner/Runner.rc b/windows/runner/Runner.rc new file mode 100644 index 0000000..6dbe782 --- /dev/null +++ b/windows/runner/Runner.rc @@ -0,0 +1,121 @@ +// Microsoft Visual C++ generated resource script. +// +#pragma code_page(65001) +#include "resource.h" + +#define APSTUDIO_READONLY_SYMBOLS +///////////////////////////////////////////////////////////////////////////// +// +// Generated from the TEXTINCLUDE 2 resource. +// +#include "winres.h" + +///////////////////////////////////////////////////////////////////////////// +#undef APSTUDIO_READONLY_SYMBOLS + +///////////////////////////////////////////////////////////////////////////// +// English (United States) resources + +#if !defined(AFX_RESOURCE_DLL) || defined(AFX_TARG_ENU) +LANGUAGE LANG_ENGLISH, SUBLANG_ENGLISH_US + +#ifdef APSTUDIO_INVOKED +///////////////////////////////////////////////////////////////////////////// +// +// TEXTINCLUDE +// + +1 TEXTINCLUDE +BEGIN + "resource.h\0" +END + +2 TEXTINCLUDE +BEGIN + "#include ""winres.h""\r\n" + "\0" +END + +3 TEXTINCLUDE +BEGIN + "\r\n" + "\0" +END + +#endif // APSTUDIO_INVOKED + + +///////////////////////////////////////////////////////////////////////////// +// +// Icon +// + +// Icon with lowest ID value placed first to ensure application icon +// remains consistent on all systems. +IDI_APP_ICON ICON "resources\\app_icon.ico" + + +///////////////////////////////////////////////////////////////////////////// +// +// Version +// + +#ifdef FLUTTER_BUILD_NUMBER +#define VERSION_AS_NUMBER FLUTTER_BUILD_NUMBER +#else +#define VERSION_AS_NUMBER 1,0,0 +#endif + +#ifdef FLUTTER_BUILD_NAME +#define VERSION_AS_STRING #FLUTTER_BUILD_NAME +#else +#define VERSION_AS_STRING "1.0.0" +#endif + +VS_VERSION_INFO VERSIONINFO + FILEVERSION VERSION_AS_NUMBER + PRODUCTVERSION VERSION_AS_NUMBER + FILEFLAGSMASK VS_FFI_FILEFLAGSMASK +#ifdef _DEBUG + FILEFLAGS VS_FF_DEBUG +#else + FILEFLAGS 0x0L +#endif + FILEOS VOS__WINDOWS32 + FILETYPE VFT_APP + FILESUBTYPE 0x0L +BEGIN + BLOCK "StringFileInfo" + BEGIN + BLOCK "040904e4" + BEGIN + VALUE "CompanyName", "com.Xperience.TaskTracker" "\0" + VALUE "FileDescription", "tasktracker" "\0" + VALUE "FileVersion", VERSION_AS_STRING "\0" + VALUE "InternalName", "tasktracker" "\0" + VALUE "LegalCopyright", "Copyright (C) 2022 com.Xperience.TaskTracker. All rights reserved." "\0" + VALUE "OriginalFilename", "tasktracker.exe" "\0" + VALUE "ProductName", "tasktracker" "\0" + VALUE "ProductVersion", VERSION_AS_STRING "\0" + END + END + BLOCK "VarFileInfo" + BEGIN + VALUE "Translation", 0x409, 1252 + END +END + +#endif // English (United States) resources +///////////////////////////////////////////////////////////////////////////// + + + +#ifndef APSTUDIO_INVOKED +///////////////////////////////////////////////////////////////////////////// +// +// Generated from the TEXTINCLUDE 3 resource. +// + + +///////////////////////////////////////////////////////////////////////////// +#endif // not APSTUDIO_INVOKED diff --git a/windows/runner/flutter_window.cpp b/windows/runner/flutter_window.cpp new file mode 100644 index 0000000..b43b909 --- /dev/null +++ b/windows/runner/flutter_window.cpp @@ -0,0 +1,61 @@ +#include "flutter_window.h" + +#include + +#include "flutter/generated_plugin_registrant.h" + +FlutterWindow::FlutterWindow(const flutter::DartProject& project) + : project_(project) {} + +FlutterWindow::~FlutterWindow() {} + +bool FlutterWindow::OnCreate() { + if (!Win32Window::OnCreate()) { + return false; + } + + RECT frame = GetClientArea(); + + // The size here must match the window dimensions to avoid unnecessary surface + // creation / destruction in the startup path. + flutter_controller_ = std::make_unique( + frame.right - frame.left, frame.bottom - frame.top, project_); + // Ensure that basic setup of the controller was successful. + if (!flutter_controller_->engine() || !flutter_controller_->view()) { + return false; + } + RegisterPlugins(flutter_controller_->engine()); + SetChildContent(flutter_controller_->view()->GetNativeWindow()); + return true; +} + +void FlutterWindow::OnDestroy() { + if (flutter_controller_) { + flutter_controller_ = nullptr; + } + + Win32Window::OnDestroy(); +} + +LRESULT +FlutterWindow::MessageHandler(HWND hwnd, UINT const message, + WPARAM const wparam, + LPARAM const lparam) noexcept { + // Give Flutter, including plugins, an opportunity to handle window messages. + if (flutter_controller_) { + std::optional result = + flutter_controller_->HandleTopLevelWindowProc(hwnd, message, wparam, + lparam); + if (result) { + return *result; + } + } + + switch (message) { + case WM_FONTCHANGE: + flutter_controller_->engine()->ReloadSystemFonts(); + break; + } + + return Win32Window::MessageHandler(hwnd, message, wparam, lparam); +} diff --git a/windows/runner/flutter_window.h b/windows/runner/flutter_window.h new file mode 100644 index 0000000..6da0652 --- /dev/null +++ b/windows/runner/flutter_window.h @@ -0,0 +1,33 @@ +#ifndef RUNNER_FLUTTER_WINDOW_H_ +#define RUNNER_FLUTTER_WINDOW_H_ + +#include +#include + +#include + +#include "win32_window.h" + +// A window that does nothing but host a Flutter view. +class FlutterWindow : public Win32Window { + public: + // Creates a new FlutterWindow hosting a Flutter view running |project|. + explicit FlutterWindow(const flutter::DartProject& project); + virtual ~FlutterWindow(); + + protected: + // Win32Window: + bool OnCreate() override; + void OnDestroy() override; + LRESULT MessageHandler(HWND window, UINT const message, WPARAM const wparam, + LPARAM const lparam) noexcept override; + + private: + // The project to run. + flutter::DartProject project_; + + // The Flutter instance hosted by this window. + std::unique_ptr flutter_controller_; +}; + +#endif // RUNNER_FLUTTER_WINDOW_H_ diff --git a/windows/runner/main.cpp b/windows/runner/main.cpp new file mode 100644 index 0000000..67a3b36 --- /dev/null +++ b/windows/runner/main.cpp @@ -0,0 +1,43 @@ +#include +#include +#include + +#include "flutter_window.h" +#include "utils.h" + +int APIENTRY wWinMain(_In_ HINSTANCE instance, _In_opt_ HINSTANCE prev, + _In_ wchar_t *command_line, _In_ int show_command) { + // Attach to console when present (e.g., 'flutter run') or create a + // new console when running with a debugger. + if (!::AttachConsole(ATTACH_PARENT_PROCESS) && ::IsDebuggerPresent()) { + CreateAndAttachConsole(); + } + + // Initialize COM, so that it is available for use in the library and/or + // plugins. + ::CoInitializeEx(nullptr, COINIT_APARTMENTTHREADED); + + flutter::DartProject project(L"data"); + + std::vector command_line_arguments = + GetCommandLineArguments(); + + project.set_dart_entrypoint_arguments(std::move(command_line_arguments)); + + FlutterWindow window(project); + Win32Window::Point origin(10, 10); + Win32Window::Size size(1280, 720); + if (!window.CreateAndShow(L"tasktracker", origin, size)) { + return EXIT_FAILURE; + } + window.SetQuitOnClose(true); + + ::MSG msg; + while (::GetMessage(&msg, nullptr, 0, 0)) { + ::TranslateMessage(&msg); + ::DispatchMessage(&msg); + } + + ::CoUninitialize(); + return EXIT_SUCCESS; +} diff --git a/windows/runner/resource.h b/windows/runner/resource.h new file mode 100644 index 0000000..66a65d1 --- /dev/null +++ b/windows/runner/resource.h @@ -0,0 +1,16 @@ +//{{NO_DEPENDENCIES}} +// Microsoft Visual C++ generated include file. +// Used by Runner.rc +// +#define IDI_APP_ICON 101 + +// Next default values for new objects +// +#ifdef APSTUDIO_INVOKED +#ifndef APSTUDIO_READONLY_SYMBOLS +#define _APS_NEXT_RESOURCE_VALUE 102 +#define _APS_NEXT_COMMAND_VALUE 40001 +#define _APS_NEXT_CONTROL_VALUE 1001 +#define _APS_NEXT_SYMED_VALUE 101 +#endif +#endif diff --git a/windows/runner/resources/app_icon.ico b/windows/runner/resources/app_icon.ico new file mode 100644 index 0000000000000000000000000000000000000000..c04e20caf6370ebb9253ad831cc31de4a9c965f6 GIT binary patch literal 33772 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 literal 0 HcmV?d00001 diff --git a/windows/runner/runner.exe.manifest b/windows/runner/runner.exe.manifest new file mode 100644 index 0000000..c977c4a --- /dev/null +++ b/windows/runner/runner.exe.manifest @@ -0,0 +1,20 @@ + + + + + PerMonitorV2 + + + + + + + + + + + + + + + diff --git a/windows/runner/utils.cpp b/windows/runner/utils.cpp new file mode 100644 index 0000000..d19bdbb --- /dev/null +++ b/windows/runner/utils.cpp @@ -0,0 +1,64 @@ +#include "utils.h" + +#include +#include +#include +#include + +#include + +void CreateAndAttachConsole() { + if (::AllocConsole()) { + FILE *unused; + if (freopen_s(&unused, "CONOUT$", "w", stdout)) { + _dup2(_fileno(stdout), 1); + } + if (freopen_s(&unused, "CONOUT$", "w", stderr)) { + _dup2(_fileno(stdout), 2); + } + std::ios::sync_with_stdio(); + FlutterDesktopResyncOutputStreams(); + } +} + +std::vector GetCommandLineArguments() { + // Convert the UTF-16 command line arguments to UTF-8 for the Engine to use. + int argc; + wchar_t** argv = ::CommandLineToArgvW(::GetCommandLineW(), &argc); + if (argv == nullptr) { + return std::vector(); + } + + std::vector command_line_arguments; + + // Skip the first argument as it's the binary name. + for (int i = 1; i < argc; i++) { + command_line_arguments.push_back(Utf8FromUtf16(argv[i])); + } + + ::LocalFree(argv); + + return command_line_arguments; +} + +std::string Utf8FromUtf16(const wchar_t* utf16_string) { + if (utf16_string == nullptr) { + return std::string(); + } + int target_length = ::WideCharToMultiByte( + CP_UTF8, WC_ERR_INVALID_CHARS, utf16_string, + -1, nullptr, 0, nullptr, nullptr); + if (target_length == 0) { + return std::string(); + } + std::string utf8_string; + utf8_string.resize(target_length); + int converted_length = ::WideCharToMultiByte( + CP_UTF8, WC_ERR_INVALID_CHARS, utf16_string, + -1, utf8_string.data(), + target_length, nullptr, nullptr); + if (converted_length == 0) { + return std::string(); + } + return utf8_string; +} diff --git a/windows/runner/utils.h b/windows/runner/utils.h new file mode 100644 index 0000000..3879d54 --- /dev/null +++ b/windows/runner/utils.h @@ -0,0 +1,19 @@ +#ifndef RUNNER_UTILS_H_ +#define RUNNER_UTILS_H_ + +#include +#include + +// Creates a console for the process, and redirects stdout and stderr to +// it for both the runner and the Flutter library. +void CreateAndAttachConsole(); + +// Takes a null-terminated wchar_t* encoded in UTF-16 and returns a std::string +// encoded in UTF-8. Returns an empty std::string on failure. +std::string Utf8FromUtf16(const wchar_t* utf16_string); + +// Gets the command line arguments passed in as a std::vector, +// encoded in UTF-8. Returns an empty std::vector on failure. +std::vector GetCommandLineArguments(); + +#endif // RUNNER_UTILS_H_ diff --git a/windows/runner/win32_window.cpp b/windows/runner/win32_window.cpp new file mode 100644 index 0000000..c10f08d --- /dev/null +++ b/windows/runner/win32_window.cpp @@ -0,0 +1,245 @@ +#include "win32_window.h" + +#include + +#include "resource.h" + +namespace { + +constexpr const wchar_t kWindowClassName[] = L"FLUTTER_RUNNER_WIN32_WINDOW"; + +// The number of Win32Window objects that currently exist. +static int g_active_window_count = 0; + +using EnableNonClientDpiScaling = BOOL __stdcall(HWND hwnd); + +// Scale helper to convert logical scaler values to physical using passed in +// scale factor +int Scale(int source, double scale_factor) { + return static_cast(source * scale_factor); +} + +// Dynamically loads the |EnableNonClientDpiScaling| from the User32 module. +// This API is only needed for PerMonitor V1 awareness mode. +void EnableFullDpiSupportIfAvailable(HWND hwnd) { + HMODULE user32_module = LoadLibraryA("User32.dll"); + if (!user32_module) { + return; + } + auto enable_non_client_dpi_scaling = + reinterpret_cast( + GetProcAddress(user32_module, "EnableNonClientDpiScaling")); + if (enable_non_client_dpi_scaling != nullptr) { + enable_non_client_dpi_scaling(hwnd); + FreeLibrary(user32_module); + } +} + +} // namespace + +// Manages the Win32Window's window class registration. +class WindowClassRegistrar { + public: + ~WindowClassRegistrar() = default; + + // Returns the singleton registar instance. + static WindowClassRegistrar* GetInstance() { + if (!instance_) { + instance_ = new WindowClassRegistrar(); + } + return instance_; + } + + // Returns the name of the window class, registering the class if it hasn't + // previously been registered. + const wchar_t* GetWindowClass(); + + // Unregisters the window class. Should only be called if there are no + // instances of the window. + void UnregisterWindowClass(); + + private: + WindowClassRegistrar() = default; + + static WindowClassRegistrar* instance_; + + bool class_registered_ = false; +}; + +WindowClassRegistrar* WindowClassRegistrar::instance_ = nullptr; + +const wchar_t* WindowClassRegistrar::GetWindowClass() { + if (!class_registered_) { + WNDCLASS window_class{}; + window_class.hCursor = LoadCursor(nullptr, IDC_ARROW); + window_class.lpszClassName = kWindowClassName; + window_class.style = CS_HREDRAW | CS_VREDRAW; + window_class.cbClsExtra = 0; + window_class.cbWndExtra = 0; + window_class.hInstance = GetModuleHandle(nullptr); + window_class.hIcon = + LoadIcon(window_class.hInstance, MAKEINTRESOURCE(IDI_APP_ICON)); + window_class.hbrBackground = 0; + window_class.lpszMenuName = nullptr; + window_class.lpfnWndProc = Win32Window::WndProc; + RegisterClass(&window_class); + class_registered_ = true; + } + return kWindowClassName; +} + +void WindowClassRegistrar::UnregisterWindowClass() { + UnregisterClass(kWindowClassName, nullptr); + class_registered_ = false; +} + +Win32Window::Win32Window() { + ++g_active_window_count; +} + +Win32Window::~Win32Window() { + --g_active_window_count; + Destroy(); +} + +bool Win32Window::CreateAndShow(const std::wstring& title, + const Point& origin, + const Size& size) { + Destroy(); + + const wchar_t* window_class = + WindowClassRegistrar::GetInstance()->GetWindowClass(); + + const POINT target_point = {static_cast(origin.x), + static_cast(origin.y)}; + HMONITOR monitor = MonitorFromPoint(target_point, MONITOR_DEFAULTTONEAREST); + UINT dpi = FlutterDesktopGetDpiForMonitor(monitor); + double scale_factor = dpi / 96.0; + + HWND window = CreateWindow( + window_class, title.c_str(), WS_OVERLAPPEDWINDOW | WS_VISIBLE, + Scale(origin.x, scale_factor), Scale(origin.y, scale_factor), + Scale(size.width, scale_factor), Scale(size.height, scale_factor), + nullptr, nullptr, GetModuleHandle(nullptr), this); + + if (!window) { + return false; + } + + return OnCreate(); +} + +// static +LRESULT CALLBACK Win32Window::WndProc(HWND const window, + UINT const message, + WPARAM const wparam, + LPARAM const lparam) noexcept { + if (message == WM_NCCREATE) { + auto window_struct = reinterpret_cast(lparam); + SetWindowLongPtr(window, GWLP_USERDATA, + reinterpret_cast(window_struct->lpCreateParams)); + + auto that = static_cast(window_struct->lpCreateParams); + EnableFullDpiSupportIfAvailable(window); + that->window_handle_ = window; + } else if (Win32Window* that = GetThisFromHandle(window)) { + return that->MessageHandler(window, message, wparam, lparam); + } + + return DefWindowProc(window, message, wparam, lparam); +} + +LRESULT +Win32Window::MessageHandler(HWND hwnd, + UINT const message, + WPARAM const wparam, + LPARAM const lparam) noexcept { + switch (message) { + case WM_DESTROY: + window_handle_ = nullptr; + Destroy(); + if (quit_on_close_) { + PostQuitMessage(0); + } + return 0; + + case WM_DPICHANGED: { + auto newRectSize = reinterpret_cast(lparam); + LONG newWidth = newRectSize->right - newRectSize->left; + LONG newHeight = newRectSize->bottom - newRectSize->top; + + SetWindowPos(hwnd, nullptr, newRectSize->left, newRectSize->top, newWidth, + newHeight, SWP_NOZORDER | SWP_NOACTIVATE); + + return 0; + } + case WM_SIZE: { + RECT rect = GetClientArea(); + if (child_content_ != nullptr) { + // Size and position the child window. + MoveWindow(child_content_, rect.left, rect.top, rect.right - rect.left, + rect.bottom - rect.top, TRUE); + } + return 0; + } + + case WM_ACTIVATE: + if (child_content_ != nullptr) { + SetFocus(child_content_); + } + return 0; + } + + return DefWindowProc(window_handle_, message, wparam, lparam); +} + +void Win32Window::Destroy() { + OnDestroy(); + + if (window_handle_) { + DestroyWindow(window_handle_); + window_handle_ = nullptr; + } + if (g_active_window_count == 0) { + WindowClassRegistrar::GetInstance()->UnregisterWindowClass(); + } +} + +Win32Window* Win32Window::GetThisFromHandle(HWND const window) noexcept { + return reinterpret_cast( + GetWindowLongPtr(window, GWLP_USERDATA)); +} + +void Win32Window::SetChildContent(HWND content) { + child_content_ = content; + SetParent(content, window_handle_); + RECT frame = GetClientArea(); + + MoveWindow(content, frame.left, frame.top, frame.right - frame.left, + frame.bottom - frame.top, true); + + SetFocus(child_content_); +} + +RECT Win32Window::GetClientArea() { + RECT frame; + GetClientRect(window_handle_, &frame); + return frame; +} + +HWND Win32Window::GetHandle() { + return window_handle_; +} + +void Win32Window::SetQuitOnClose(bool quit_on_close) { + quit_on_close_ = quit_on_close; +} + +bool Win32Window::OnCreate() { + // No-op; provided for subclasses. + return true; +} + +void Win32Window::OnDestroy() { + // No-op; provided for subclasses. +} diff --git a/windows/runner/win32_window.h b/windows/runner/win32_window.h new file mode 100644 index 0000000..17ba431 --- /dev/null +++ b/windows/runner/win32_window.h @@ -0,0 +1,98 @@ +#ifndef RUNNER_WIN32_WINDOW_H_ +#define RUNNER_WIN32_WINDOW_H_ + +#include + +#include +#include +#include + +// A class abstraction for a high DPI-aware Win32 Window. Intended to be +// inherited from by classes that wish to specialize with custom +// rendering and input handling +class Win32Window { + public: + struct Point { + unsigned int x; + unsigned int y; + Point(unsigned int x, unsigned int y) : x(x), y(y) {} + }; + + struct Size { + unsigned int width; + unsigned int height; + Size(unsigned int width, unsigned int height) + : width(width), height(height) {} + }; + + Win32Window(); + virtual ~Win32Window(); + + // Creates and shows a win32 window with |title| and position and size using + // |origin| and |size|. New windows are created on the default monitor. Window + // sizes are specified to the OS in physical pixels, hence to ensure a + // consistent size to will treat the width height passed in to this function + // as logical pixels and scale to appropriate for the default monitor. Returns + // true if the window was created successfully. + bool CreateAndShow(const std::wstring& title, + const Point& origin, + const Size& size); + + // Release OS resources associated with window. + void Destroy(); + + // Inserts |content| into the window tree. + void SetChildContent(HWND content); + + // Returns the backing Window handle to enable clients to set icon and other + // window properties. Returns nullptr if the window has been destroyed. + HWND GetHandle(); + + // If true, closing this window will quit the application. + void SetQuitOnClose(bool quit_on_close); + + // Return a RECT representing the bounds of the current client area. + RECT GetClientArea(); + + protected: + // Processes and route salient window messages for mouse handling, + // size change and DPI. Delegates handling of these to member overloads that + // inheriting classes can handle. + virtual LRESULT MessageHandler(HWND window, + UINT const message, + WPARAM const wparam, + LPARAM const lparam) noexcept; + + // Called when CreateAndShow is called, allowing subclass window-related + // setup. Subclasses should return false if setup fails. + virtual bool OnCreate(); + + // Called when Destroy is called. + virtual void OnDestroy(); + + private: + friend class WindowClassRegistrar; + + // OS callback called by message pump. Handles the WM_NCCREATE message which + // is passed when the non-client area is being created and enables automatic + // non-client DPI scaling so that the non-client area automatically + // responsponds to changes in DPI. All other messages are handled by + // MessageHandler. + static LRESULT CALLBACK WndProc(HWND const window, + UINT const message, + WPARAM const wparam, + LPARAM const lparam) noexcept; + + // Retrieves a class instance pointer for |window| + static Win32Window* GetThisFromHandle(HWND const window) noexcept; + + bool quit_on_close_ = false; + + // window handle for top level window. + HWND window_handle_ = nullptr; + + // window handle for hosted content. + HWND child_content_ = nullptr; +}; + +#endif // RUNNER_WIN32_WINDOW_H_