diff --git a/assets/ca/certificate.crt b/assets/ca/certificate.crt new file mode 100644 index 0000000..2d251a2 --- /dev/null +++ b/assets/ca/certificate.crt @@ -0,0 +1,40 @@ +-----BEGIN CERTIFICATE----- +MIIHATCCBemgAwIBAgIQdYaBpc1LZ3O20DsKU64NdjANBgkqhkiG9w0BAQsFADBy +MQswCQYDVQQGEwJVUzELMAkGA1UECBMCVFgxEDAOBgNVBAcTB0hvdXN0b24xFTAT +BgNVBAoTDGNQYW5lbCwgSW5jLjEtMCsGA1UEAxMkY1BhbmVsLCBJbmMuIENlcnRp +ZmljYXRpb24gQXV0aG9yaXR5MB4XDTIyMDIwNjAwMDAwMFoXDTIyMDUwNzIzNTk1 +OVowIjEgMB4GA1UEAxMXdnBzLnBsYXlwb29sc3R1ZGlvcy5jb20wggIiMA0GCSqG +SIb3DQEBAQUAA4ICDwAwggIKAoICAQDZb8DUkCzrMRTXeXZxxOiKxUJlGWXrZdaO +kB2tnpv6JH0wQm7hZMRTZgD6UhiLMV/9wt9VScZ/s3VDq6D9VAkTpQ64gwl4ozoW +MzgVk+goZbS/grOPdmWmGNLpul5kgJ74DCKu8NRx8EovJK2ItaJ6HX51ckcBpjwV +JAmiO8xYmSs9t14eRDtu2O8CgC6/fc63Wp+yLbK3kpZX3vuwzSZd1MsVapi5JsPG +EzFyQAD/vfoV60l0oVdhJtYOqAr06csVvKDxAC1IoBlxy4yg62O8IF23pTHr0QN7 +p0VLsOElSCC+I6ci6Uwtpx9AvqavSXintAGm0bm0fwKKUovQBm8y6l4IwyY3+B/k +Hq8TntX3bjoSDA9PrqM9+5k2ZPmpW5cnrOa5fDxFu6wfQIHiwcQ09UeOSbXw9wBY +iPqxBSEDjYylhg8zQVrPo5x4aS5K4jVdatCiQDVFDYxRw7D3+0CtT56HfC6IDsIx +HrB3vHMcXxcB6JCsn+zp2sv8No+HbD1I/5Smm83Lr+ysSmyopFXZph+S8r9qUv4J +HgaJlLHBOkRMC6iEW9wt7wws6z/U+UVLOHX4ORqxObWHx8560cnp8nyiW70xEEn9 +bNi4iA3tijwcW45gJJYFPIrlHIJ50T+6BjNBeYM/5w94AM4V821ZOe8Ekr1+yrdQ +la9JjyPJGQIDAQABo4IC4TCCAt0wHwYDVR0jBBgwFoAUfgNaZUFrp34K4bidCOod +jh1qx2UwHQYDVR0OBBYEFBGOwoebiHl31SmCmop3xEE7RK3sMA4GA1UdDwEB/wQE +AwIFoDAMBgNVHRMBAf8EAjAAMB0GA1UdJQQWMBQGCCsGAQUFBwMBBggrBgEFBQcD +AjBJBgNVHSAEQjBAMDQGCysGAQQBsjEBAgI0MCUwIwYIKwYBBQUHAgEWF2h0dHBz +Oi8vc2VjdGlnby5jb20vQ1BTMAgGBmeBDAECATBMBgNVHR8ERTBDMEGgP6A9hjto +dHRwOi8vY3JsLmNvbW9kb2NhLmNvbS9jUGFuZWxJbmNDZXJ0aWZpY2F0aW9uQXV0 +aG9yaXR5LmNybDB9BggrBgEFBQcBAQRxMG8wRwYIKwYBBQUHMAKGO2h0dHA6Ly9j +cnQuY29tb2RvY2EuY29tL2NQYW5lbEluY0NlcnRpZmljYXRpb25BdXRob3JpdHku +Y3J0MCQGCCsGAQUFBzABhhhodHRwOi8vb2NzcC5jb21vZG9jYS5jb20wggEDBgor +BgEEAdZ5AgQCBIH0BIHxAO8AdQBGpVXrdfqRIDC1oolp9PN9ESxBdL79SbiFq/L8 +cP5tRwAAAX7QktcXAAAEAwBGMEQCIFrbqvegkFyZYBhtQ6jiz3G8JCcUqfCbBFYK +2drnkxJlAiB1EF6Dr8nfwxVGi+BtxWXCiDwtXm1CenfLanMLcKDi9QB2AEHIyrHf +IkZKEMahOglCh15OMYsbA+vrS8do8JBilgb2AAABftCS1yAAAAQDAEcwRQIhALHB +SjVZlGTCj0VSlJECgfN87kebnuEKoZVFyOCCfEvAAiAF3kipkv2ULXxwcctZQ/Ac +1oym5EA2oyEwuRBhg2TpjDA/BgNVHREEODA2ghd2cHMucGxheXBvb2xzdHVkaW9z +LmNvbYIbd3d3LnZwcy5wbGF5cG9vbHN0dWRpb3MuY29tMA0GCSqGSIb3DQEBCwUA +A4IBAQBjk+qwy+FckSF6Aji/8AqYFkcgEbdrcYS7d6za7ZkOiv9UOiOWtqtVDaZZ +I/1yLcsB1XTxcPvdyAh36E6sZ6l3Yv21XJvr7qqiMvQv6W8Hz1/Io2aLxtBJ2C3S +NTh1xN+VjqYl78qaySLCRPdppTklBr+7He/HrXkM0aIbbCjaDUdtbM3x98aRsahA +psk2ih6U7KtTX0t8kS+pNunkGsqhznhttBCTUMAWaxbFTSkavCoVrDDmnhDeOrmL +aagBi4biPtWeSIfhY0anCMXHQsROACET9hfiAgBGfVkvZBVqZ9AvRZS7NRzU3/Uh +/h/gKE3JOQYZk+CvGyQTHsU3w++h +-----END CERTIFICATE----- \ No newline at end of file diff --git a/assets/ca/lets-encrypt-r3.pem b/assets/ca/lets-encrypt-r3.pem new file mode 100644 index 0000000..43b222a --- /dev/null +++ b/assets/ca/lets-encrypt-r3.pem @@ -0,0 +1,30 @@ +-----BEGIN CERTIFICATE----- +MIIFFjCCAv6gAwIBAgIRAJErCErPDBinU/bWLiWnX1owDQYJKoZIhvcNAQELBQAw +TzELMAkGA1UEBhMCVVMxKTAnBgNVBAoTIEludGVybmV0IFNlY3VyaXR5IFJlc2Vh +cmNoIEdyb3VwMRUwEwYDVQQDEwxJU1JHIFJvb3QgWDEwHhcNMjAwOTA0MDAwMDAw +WhcNMjUwOTE1MTYwMDAwWjAyMQswCQYDVQQGEwJVUzEWMBQGA1UEChMNTGV0J3Mg +RW5jcnlwdDELMAkGA1UEAxMCUjMwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEK +AoIBAQC7AhUozPaglNMPEuyNVZLD+ILxmaZ6QoinXSaqtSu5xUyxr45r+XXIo9cP +R5QUVTVXjJ6oojkZ9YI8QqlObvU7wy7bjcCwXPNZOOftz2nwWgsbvsCUJCWH+jdx +sxPnHKzhm+/b5DtFUkWWqcFTzjTIUu61ru2P3mBw4qVUq7ZtDpelQDRrK9O8Zutm +NHz6a4uPVymZ+DAXXbpyb/uBxa3Shlg9F8fnCbvxK/eG3MHacV3URuPMrSXBiLxg +Z3Vms/EY96Jc5lP/Ooi2R6X/ExjqmAl3P51T+c8B5fWmcBcUr2Ok/5mzk53cU6cG +/kiFHaFpriV1uxPMUgP17VGhi9sVAgMBAAGjggEIMIIBBDAOBgNVHQ8BAf8EBAMC +AYYwHQYDVR0lBBYwFAYIKwYBBQUHAwIGCCsGAQUFBwMBMBIGA1UdEwEB/wQIMAYB +Af8CAQAwHQYDVR0OBBYEFBQusxe3WFbLrlAJQOYfr52LFMLGMB8GA1UdIwQYMBaA +FHm0WeZ7tuXkAXOACIjIGlj26ZtuMDIGCCsGAQUFBwEBBCYwJDAiBggrBgEFBQcw +AoYWaHR0cDovL3gxLmkubGVuY3Iub3JnLzAnBgNVHR8EIDAeMBygGqAYhhZodHRw +Oi8veDEuYy5sZW5jci5vcmcvMCIGA1UdIAQbMBkwCAYGZ4EMAQIBMA0GCysGAQQB +gt8TAQEBMA0GCSqGSIb3DQEBCwUAA4ICAQCFyk5HPqP3hUSFvNVneLKYY611TR6W +PTNlclQtgaDqw+34IL9fzLdwALduO/ZelN7kIJ+m74uyA+eitRY8kc607TkC53wl +ikfmZW4/RvTZ8M6UK+5UzhK8jCdLuMGYL6KvzXGRSgi3yLgjewQtCPkIVz6D2QQz +CkcheAmCJ8MqyJu5zlzyZMjAvnnAT45tRAxekrsu94sQ4egdRCnbWSDtY7kh+BIm +lJNXoB1lBMEKIq4QDUOXoRgffuDghje1WrG9ML+Hbisq/yFOGwXD9RiX8F6sw6W4 +avAuvDszue5L3sz85K+EC4Y/wFVDNvZo4TYXao6Z0f+lQKc0t8DQYzk1OXVu8rp2 +yJMC6alLbBfODALZvYH7n7do1AZls4I9d1P4jnkDrQoxB3UqQ9hVl3LEKQ73xF1O +yK5GhDDX8oVfGKF5u+decIsH4YaTw7mP3GFxJSqv3+0lUFJoi5Lc5da149p90Ids +hCExroL1+7mryIkXPeFM5TgO9r0rvZaBFOvV2z0gp35Z0+L4WPlbuEjN/lxPFin+ +HlUjr8gRsI3qfJOQFy/9rKIJR0Y/8Omwt/8oTWgy1mdeHmmjk7j1nYsvC9JSQ6Zv +MldlTTKB3zhThV1+XWYp6rjd5JW1zbVWEkLNxE7GJThEUG3szgBVGP7pSWTUTsqX +nLRbwHOoq7hHwg== +-----END CERTIFICATE----- diff --git a/lib/Dialogs.dart b/lib/Dialogs.dart index 569b8cc..95e6f6f 100644 --- a/lib/Dialogs.dart +++ b/lib/Dialogs.dart @@ -4,6 +4,8 @@ import 'package:flutter_spinkit/flutter_spinkit.dart'; import 'main.dart'; class Dialogs{ + static String syncingMessage = "Syncing"; + static showAlertDialog(BuildContext context, String title, String message) { // set up the button Widget okButton = TextButton( @@ -54,7 +56,7 @@ class Dialogs{ mainAxisAlignment: MainAxisAlignment.spaceBetween, children: [ SpinKitChasingDots(color: Colors.green), - Expanded(child: Text(title,textAlign: TextAlign.center,)), + Expanded(child: Text(syncingMessage,textAlign: TextAlign.center,)), ], ), ); diff --git a/lib/NewProject.dart b/lib/NewProject.dart index 121949d..18b4a9b 100644 --- a/lib/NewProject.dart +++ b/lib/NewProject.dart @@ -2,6 +2,7 @@ import 'package:flutter/material.dart'; import 'package:flutter_datetime_picker/flutter_datetime_picker.dart'; import 'package:intl/intl.dart'; import 'package:flutter_colorpicker/flutter_colorpicker.dart'; +import 'package:tasktracker/main.dart'; import 'User.dart' as User; import 'Data.dart'; import 'package:flutter_switch/flutter_switch.dart'; @@ -657,10 +658,11 @@ class _NewProject2State extends State { }, ); } + + void OnClickAdd() async{ + if(projectName==null || deadline.isBefore(DateTime.now())){showAlertDialog(context, 'Error', 'Please make sure you have entered correct information'); return;} + + } } - -void OnClickedAdd(){ - -} diff --git a/lib/User.dart b/lib/User.dart index 705642b..3a04d94 100644 --- a/lib/User.dart +++ b/lib/User.dart @@ -16,6 +16,7 @@ import 'package:device_info_plus/device_info_plus.dart'; import 'package:sqflite_common/sqlite_api.dart'; import 'package:sqflite_common_ffi/sqflite_ffi.dart' as SqlFF; import 'Tasks.dart'; +import 'Dialogs.dart'; bool cacheEnabled = true; @@ -163,6 +164,7 @@ void onCacheDatabaseCreate(Database db, int newVersion) async { } Future addInitialDataToCache() async { + Dialogs.syncingMessage= "Adding initial data"; print("adding init data"); await Future.delayed(const Duration(seconds: 1)); @@ -170,7 +172,7 @@ Future addInitialDataToCache() async { for (Category element in InitialData.getCategories(username)) { await UserOperations.addCategory(element.name, element.color, element.productive, bulk: true); } - + Dialogs.syncingMessage= "Just a minute"; for (TaskType element in InitialData.getTaskTypes(username)) { await UserOperations.addTaskType(element.name, element.category, bulk: true); // Map data = { @@ -179,8 +181,9 @@ Future addInitialDataToCache() async { // }; // await cacheDb.insert('TaskTypes', data); } + Dialogs.syncingMessage= "Syncing"; await UserOperations.executeQueries(); - await refreshUserData(); + // await refreshUserData(); } void onCacheDatabaseUpgrade(Database db, int oldVersion, int newVersion) async { @@ -322,18 +325,23 @@ Future> GetTaskTypes(bool forceOffline) async { } taskTypes = _taskTypes; } else { - print("NC: Updating TaskTypes as $username"); - 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("taskType retreive: ${response.body}"); - List data = response.body.split(""); List _taskTypes = []; - for (var value in data) { - Map data = jsonDecode(value); - Category? cat = await getCatFromId(data['category_id']); - _taskTypes.add(TaskType(data['task_id'], data['name'], data['category_id'], cat)); - //print(cat); + print("NC: 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()})); + + print("taskType retreive (try): ${response.body}"); + List data = response.body.split(""); + + for (var value in data) { + Map data = jsonDecode(value); + Category? cat = await getCatFromId(data['category_id']); + _taskTypes.add(TaskType(data['task_id'], data['name'], data['category_id'], cat)); + //print(cat); + } + }catch(e){ + print("Error while tasks NC $e"); } taskTypes = _taskTypes; @@ -711,16 +719,11 @@ class UserOperations { 'metadata': metadata }; Map query = {Queries.colLink: 'edit_activity', Queries.colData: jsonEncode(queryBody)}; - if(cacheEnabled) { + if (cacheEnabled) { //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'))) AND ${Activity.colStartTime}!=datetime('${init_sTime}') AND ${Activity - .colEndTime} != datetime('${init_eTime}')")); + "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'))) AND ${Activity.colStartTime}!=datetime('${init_sTime}') AND ${Activity.colEndTime} != datetime('${init_eTime}')")); print("ActivityOverlaps: $overlapCount"); if (overlapCount! > 0) { @@ -728,7 +731,6 @@ class UserOperations { return; } - if (metadata.length > 0) {} //Add Query @@ -741,8 +743,8 @@ class UserOperations { // String updateActQuery = "UPDATE Activities SET ${Activity.colType}="; // await cacheDb.insert('Activities', data); await refreshUserData(); - }else{ - // queries.add(Queries('edit_activity', jsonEncode(queryBody))); + } else { + // queries.add(Queries('edit_activity', jsonEncode(queryBody))); try { http.Response queryResponse = (await http.post(Uri.parse('http://161.97.127.136/task_tracker/edit_activity.php'), body: queryBody)); print("Query executed : Results{${queryResponse.body}"); @@ -759,6 +761,43 @@ class UserOperations { } } + static Future addProject(String name, String category, List steps, DateTime deadline) async { + Map queryBody = { + 'name': username + name, + 'username': username, + 'device_id': await Settings.UUID(), + 'category': username + category, + 'steps': jsonEncode(steps), + 'deadline': DateFormat("yyyy-mm-dd").format(deadline) + }; + + if (cacheEnabled) { + //Add Query + Map query = {Queries.colLink: 'add_project', Queries.colData: jsonEncode(queryBody)}; + + print("adding new query ${query[Queries.colLink]} : ${jsonEncode(queryBody)}"); + + await cacheDb.insert('Queries', query); + + //update Cache + Map data = {}; + await cacheDb.insert('Projects', data); + await refreshUserData(); + } else { + try { + http.Response queryResponse = (await http.post(Uri.parse('http://161.97.127.136/task_tracker/add_project.php'), body: queryBody)); + print("Query executed : Results{${queryResponse.body}"); + if (queryResponse.body.toLowerCase().contains("success")) { + //Success + } + } catch (e) { + print('NC: Error adding prjct $e}'); + } + } + + await executeQueries(); + } + static Future deleteTask(String name, {bulk = false}) async { Map queryBody = { 'id': username + name, @@ -769,7 +808,7 @@ class UserOperations { Map query = {Queries.colLink: 'delete_taskType', Queries.colData: jsonEncode(queryBody)}; print("adding new query ${query[Queries.colLink]} : ${jsonEncode(queryBody)}"); - if(cacheEnabled) { + if (cacheEnabled) { await cacheDb.insert('Queries', query); //update Cache @@ -781,7 +820,7 @@ class UserOperations { await refreshUserData(); //Add to server and refresh Cache - }else{ + } else { try { http.Response queryResponse = (await http.post(Uri.parse('http://161.97.127.136/task_tracker/delete_taskType.php'), body: queryBody)); print("Query executed : Results{${queryResponse.body}"); @@ -807,7 +846,7 @@ class UserOperations { Map query = {Queries.colLink: 'delete_category', Queries.colData: jsonEncode(queryBody)}; print("adding new query ${query[Queries.colLink]} : ${jsonEncode(queryBody)}"); - if(cacheEnabled) { + if (cacheEnabled) { await cacheDb.insert('Queries', query); //update Cache @@ -818,7 +857,7 @@ class UserOperations { await cacheDb.rawDelete("DELETE FROM Categories WHERE ${Category.colCatId}='${username + name}'"); await refreshUserData(); //Add to server and refresh Cache - }else{ + } else { try { http.Response queryResponse = (await http.post(Uri.parse('http://161.97.127.136/task_tracker/delete_category.php'), body: queryBody)); print("Query executed : Results{${queryResponse.body}"); @@ -846,19 +885,18 @@ class UserOperations { print("adding new query ${query[Queries.colLink]} : ${jsonEncode(queryBody)}"); - if(cacheEnabled) { + if (cacheEnabled) { await cacheDb.insert('Queries', query); //update Cache String deleteQuery = - "DELETE FROM Activities WHERE ${Activity.colStartTime}=datetime('${dFormat.format(activity.trueStartTime)}') AND ${Activity - .colEndTime}=datetime('${dFormat.format(activity.trueEndTime)}')"; + "DELETE FROM Activities WHERE ${Activity.colStartTime}=datetime('${dFormat.format(activity.trueStartTime)}') AND ${Activity.colEndTime}=datetime('${dFormat.format(activity.trueEndTime)}')"; print("delteQuery : $deleteQuery"); await cacheDb.rawDelete(deleteQuery); await refreshUserData(); //Add to server and refresh Cache - }else{ + } else { try { http.Response queryResponse = (await http.post(Uri.parse('http://161.97.127.136/task_tracker/delete_activity.php'), body: queryBody)); print("Query executed : Results{${queryResponse.body}"); diff --git a/lib/main.dart b/lib/main.dart index b7d92ed..6a994eb 100644 --- a/lib/main.dart +++ b/lib/main.dart @@ -1,7 +1,9 @@ import 'dart:async'; +import 'dart:io'; import 'package:flutter/cupertino.dart'; import 'package:flutter/material.dart'; +import 'package:flutter/services.dart'; import 'package:intl/intl.dart'; import 'package:provider/provider.dart'; import 'package:tasktracker/Categories.dart'; @@ -66,8 +68,13 @@ extension HexColor on Color { '${blue.toRadixString(16).padLeft(2, '0')}'; } -void main() { +void main() async { //Wakelock.enable(); // or Wakelock.toggle(on: true); + // WidgetsFlutterBinding.ensureInitialized(); + // + // ByteData data = await PlatformAssetBundle().load('assets/ca/certificate.crt'); + // SecurityContext.defaultContext.setTrustedCertificatesBytes(data.buffer.asUint8List()); + runApp(const MyApp()); } diff --git a/pubspec.lock b/pubspec.lock index c4f2219..359d34d 100644 --- a/pubspec.lock +++ b/pubspec.lock @@ -208,7 +208,7 @@ packages: name: flutter_local_notifications url: "https://pub.dartlang.org" source: hosted - version: "9.3.3" + version: "9.4.0" flutter_local_notifications_linux: dependency: transitive description: @@ -496,7 +496,7 @@ packages: name: sqflite_common url: "https://pub.dartlang.org" source: hosted - version: "2.2.0" + version: "2.2.1" sqflite_common_ffi: dependency: "direct main" description: @@ -538,14 +538,14 @@ packages: name: syncfusion_flutter_charts url: "https://pub.dartlang.org" source: hosted - version: "19.4.54" + version: "19.4.56" syncfusion_flutter_core: dependency: transitive description: name: syncfusion_flutter_core url: "https://pub.dartlang.org" source: hosted - version: "19.4.54" + version: "19.4.56" synchronized: dependency: transitive description: @@ -601,7 +601,7 @@ packages: name: wakelock url: "https://pub.dartlang.org" source: hosted - version: "0.6.1+1" + version: "0.6.1+2" wakelock_macos: dependency: transitive description: diff --git a/pubspec.yaml b/pubspec.yaml index 52c43b9..e90002d 100644 --- a/pubspec.yaml +++ b/pubspec.yaml @@ -74,6 +74,7 @@ flutter: # To add assets to your application, add an assets section, like this: assets: - images/ + - assets/ca/ # An image asset can refer to one or more resolution-specific "variants", see # https://flutter.dev/assets-and-images/#resolution-aware.