Files
TaskTracker/lib/Data.dart

312 lines
8.2 KiB
Dart

import 'dart:async';
import 'dart:convert';
import 'dart:io';
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);
String category_id;
String name;
String color;
bool productive;
static String colCatId = "category_id";
static String colName = "name";
static String colColor = "color";
static String colProductive = "productive";
}
class TaskType {
TaskType(this.id, this.name, this.category, {this.relatedProject, this.cat});
String id;
String name;
String category;
Category? cat;
Project? relatedProject;
static String colId = "id";
static String colName = "name";
static String colCategory = "category_id";
static String colRelatedProject = "related_project";
static String getDisplayName(TaskType taskType) {
return (taskType.name +
((taskType.relatedProject != null)
? ' [${taskType.relatedProject!.name}]'
: ''));
}
}
class Activity {
Activity(this.taskType, this.startTime, this.endTime,
{this.metadata, DateTime? tEndTime, DateTime? tStartTime}) {
trueStartTime = tStartTime ?? startTime;
trueEndTime = tEndTime ?? endTime;
}
late DateTime trueStartTime;
late DateTime trueEndTime;
TaskType taskType;
DateTime startTime;
DateTime endTime;
String? metadata;
Activity.fromJson(Map<String, dynamic> json)
: taskType = json['taskType'],
startTime = json['sTime'],
endTime = json['eTime'];
Map<String, dynamic> toJson() =>
{'taskType': taskType, 'sTime': startTime, 'eTime': endTime};
static String colType = "type";
static String colStartTime = "s_time";
static String colEndTime = "e_time";
static String colMetadata = "metadata";
}
class InitialData {
static List<TaskType> getTaskTypes(String username) {
List<TaskType> tasks = [
TaskType(username + 'Sleep', 'Sleep', 'Relax'),
TaskType(username + 'Physics', 'Physics', 'Study'),
TaskType(username + 'History', 'History', 'Study'),
TaskType(username + 'Football', 'Football', 'Play'),
TaskType(username + 'At work', 'At work', 'Work'),
TaskType(username + 'Chores', 'Chores', 'Daily Activities'),
TaskType(username + 'Eat', 'Eat', 'Daily Activities'),
TaskType(username + 'Hang out', 'Hang out', 'Social')
];
return tasks;
}
static List<Category> getCategories(String username) {
List<Category> cats = [
Category(username + 'Relax', 'Relax', '#555555', false),
Category(
username + 'Daily Activities', 'Daily Activities', '#009955', false),
Category(username + 'Study', 'Study', '#00FF00', true),
Category(username + 'Play', 'Play', '#FF0000', false),
Category(username + 'Work', 'Work', '#00AAFF', true),
Category(username + 'Social', 'Social', '#00AAAA', false)
];
return cats;
}
}
class Queries {
Queries(this.link, this.data);
String link;
String data;
static String colLink = "file";
static String colData = "data";
}
class Project {
Project(this.name, this.category, this.steps, this.eta, this.deadline,
{this.cat});
String name;
String getName() => name.replaceAll(User.username, "");
String category;
Category? cat;
List<ProjectStep> steps;
int? eta;
DateTime deadline;
static String colName = "name";
static String colCat = "category_id";
static String colSteps = "steps";
static String colDeadline = "deadline";
static String colEta = "eta";
}
class ProjectStep {
ProjectStep(this.stepName, this.eta, this.progress);
ProjectStep.fromJson(Map<String, dynamic> json)
: stepName = json['name'],
eta = json['eta'],
progress = json['progress'],
finishedDate = (json['finishedDate'] != null)
? DateTime.parse(json['finishedDate'])
: null;
Map<String, dynamic> toJson() => {
'name': stepName,
'eta': eta,
'progress': progress,
if (finishedDate != null) 'finishedDate': finishedDate.toString()
};
String stepName;
int eta;
int progress;
DateTime? finishedDate;
}
class Journal {
Journal(this.id, this.day, {this.title, this.description});
String id;
DateTime day;
String? title;
String? description;
static String colTitle = 'Title';
static String colDescription = 'Desc';
}
class Todo {
Todo(this.id, this.category, this.metadata, this.dueDate,
{this.notificationTime, this.task});
String id;
String category;
TaskType? task;
String metadata;
DateTime dueDate;
DateTime? notificationTime;
static String colCat = 'category';
static String colMetadata = 'metadata';
static String colDueDate = 'due_date';
static String colNotificationTime = 'notification_time';
}
class Settings {
static Future<String> UUID() async {
final prefs = await SharedPreferences.getInstance();
if (prefs.containsKey('uuid')) {
return await Future.value(prefs.getString('uuid'));
} else {
var uuid = Uuid();
String _uuid = uuid.v4();
// if(Platform.isAndroid){
//
// }
await prefs.setString('uuid', _uuid);
return Future.value(_uuid);
}
}
static Future<void> setTheme(int value) async {
final prefs = await SharedPreferences.getInstance();
await prefs.setInt("theme", value);
}
static String notification_key = "notification_interval";
static String adaptive_notification_key = "adaptive_notification";
static String untracked_unprod_key = "untracked_unproductive";
static String auto_log_key = "auto_log";
static Future<int> 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<void> setNotificationInterval(int value) async {
final prefs = await SharedPreferences.getInstance();
prefs.setInt(notification_key, value);
}
static List<String> notificationOptions = <String>[
'Off',
'1 hour',
'2 hour',
'3 hour',
'4 hour',
'5 hour',
'6 hour'
];
static bool adaptiveNotificationAvailable() {
List<String> 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);
}
static Future<bool> getAdaptiveNotification() async {
final prefs = await SharedPreferences.getInstance();
bool _value = true;
if (prefs.containsKey(notification_key)) {
_value = await prefs.getBool(adaptive_notification_key) ?? true;
} else {
prefs.setBool(adaptive_notification_key, _value);
}
return _value;
}
static Future<void> setAdaptiveNotification(bool value) async {
final prefs = await SharedPreferences.getInstance();
prefs.setBool(adaptive_notification_key, value);
}
static Future<bool> getUntrackedUnproductive() async {
final prefs = await SharedPreferences.getInstance();
bool _value = true;
if (prefs.containsKey(untracked_unprod_key)) {
_value = await prefs.getBool(untracked_unprod_key) ?? true;
} else {
prefs.setBool(untracked_unprod_key, _value);
}
return _value;
}
static Future<bool> getAutoLog() async {
final prefs = await SharedPreferences.getInstance();
bool _value = true;
if (prefs.containsKey(auto_log_key)) {
_value = await prefs.getBool(auto_log_key) ?? true;
} else {
prefs.setBool(auto_log_key, _value);
}
return _value;
}
static Future<void> setUntrackedUnproductive(bool value) async {
final prefs = await SharedPreferences.getInstance();
prefs.setBool(untracked_unprod_key, value);
}
static Future<void> setAutoLog(bool value) async {
final prefs = await SharedPreferences.getInstance();
prefs.setBool(auto_log_key, value);
}
}
final settings = Settings();