Skip to content

Commit 3e21ba5

Browse files
committed
Merge branch 'dev'
New Alpha release 1.0.3
2 parents 32d6b4f + a86d3c9 commit 3e21ba5

35 files changed

Lines changed: 330 additions & 66 deletions

app/src/main/AndroidManifest.xml

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,8 @@
11
<?xml version="1.0" encoding="utf-8"?>
22
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
33
package="iiitd.mc.timetracker"
4-
android:versionCode="3"
5-
android:versionName="1.0.2">
4+
android:versionCode="4"
5+
android:versionName="1.0.3">
66

77
<uses-permission android:name="android.permission.RECEIVE_BOOT_COMPLETED" />
88
<uses-permission android:name="android.permission.VIBRATE" />
@@ -13,7 +13,7 @@
1313
<application
1414
android:name=".ApplicationHelper"
1515
android:allowBackup="true"
16-
android:icon="@drawable/ic_launchertimeturner"
16+
android:icon="@mipmap/ic_launcher"
1717
android:label="@string/app_name"
1818
android:theme="@style/AppTheme">
1919
<activity

app/src/main/ic_launcher-web.png

26 KB
Loading

app/src/main/java/iiitd/mc/timetracker/ApplicationHelper.java

Lines changed: 19 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -3,8 +3,10 @@
33
import android.app.Application;
44
import android.content.Context;
55

6-
import iiitd.mc.timetracker.database.DatabaseController;
6+
import iiitd.mc.timetracker.database.CachedDatabaseController;
77
import iiitd.mc.timetracker.database.IDatabaseController;
8+
import iiitd.mc.timetracker.suggestor.ITaskSuggestor;
9+
import iiitd.mc.timetracker.suggestor.MainTaskSuggestor;
810

911
/**
1012
* Helper class to get the application Context in static functions.
@@ -13,6 +15,8 @@
1315
*/
1416
public class ApplicationHelper extends Application {
1517
private static Context context;
18+
private static IDatabaseController databaseController;
19+
private static ITaskSuggestor mainTaskSuggestor;
1620

1721
public void onCreate() {
1822
super.onCreate();
@@ -34,8 +38,19 @@ public static Context getAppContext() {
3438
*
3539
* @return An instance implementing the IDatabaseController interface.
3640
*/
37-
public static IDatabaseController createDatabaseController() {
38-
//return new MockupDatabaseController();
39-
return new DatabaseController(ApplicationHelper.context);
41+
public static IDatabaseController getDatabaseController() {
42+
if (databaseController == null) {
43+
databaseController = new CachedDatabaseController(context);
44+
}
45+
46+
return databaseController;
47+
}
48+
49+
public static ITaskSuggestor getMainTaskSuggestor() {
50+
if (mainTaskSuggestor == null) {
51+
mainTaskSuggestor = new MainTaskSuggestor();
52+
}
53+
54+
return mainTaskSuggestor;
4055
}
4156
}

app/src/main/java/iiitd/mc/timetracker/TaskRecorderService.java

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -32,7 +32,7 @@ public class TaskRecorderService extends Service {
3232
private final int ONGOING_NOTIFICATION_ID = 1;
3333
private Recording currentRecording = null;
3434
private Recording lastRecording = null;
35-
private IDatabaseController db = ApplicationHelper.createDatabaseController();
35+
private IDatabaseController db = ApplicationHelper.getDatabaseController();
3636
private Task breakTask;
3737
private static final String SETTINGS_BREAK_TASK_ID = "breakTaskId";
3838
private static final String BREAK_TASK_NAME = "Break";
@@ -233,7 +233,7 @@ public Task getBreakTask() {
233233
*/
234234
public static Task getTaskFromString(String taskString) {
235235
Task task = null;
236-
IDatabaseController db = ApplicationHelper.createDatabaseController();
236+
IDatabaseController db = ApplicationHelper.getDatabaseController();
237237
db.open();
238238
String[] taskStringParts = taskString.split(Pattern.quote(Task.THS));
239239
// get all tasks with name like the lowest hierarchy part of the string
@@ -276,7 +276,7 @@ public static Task createTaskFromString(String taskString) {
276276
taskParent = createTaskFromString(parentName);
277277
}
278278
Task newTask = new Task(taskName, taskParent);
279-
IDatabaseController db = ApplicationHelper.createDatabaseController();
279+
IDatabaseController db = ApplicationHelper.getDatabaseController();
280280
db.open();
281281
db.insertTask(newTask);
282282
db.close();
Lines changed: 196 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,196 @@
1+
package iiitd.mc.timetracker.database;
2+
3+
import android.content.Context;
4+
import android.database.SQLException;
5+
6+
import java.util.ArrayList;
7+
import java.util.Collection;
8+
import java.util.Collections;
9+
import java.util.HashMap;
10+
import java.util.List;
11+
12+
import iiitd.mc.timetracker.model.Recording;
13+
import iiitd.mc.timetracker.model.Task;
14+
15+
/**
16+
* Wrapper for DatabaseController that caches the Records and Tasks list in memory for faster access.
17+
*/
18+
public class CachedDatabaseController implements IDatabaseController {
19+
private IDatabaseController db;
20+
/* in-memory caches of data. to invalidate clear the map. */
21+
private boolean cachedTasksComplete = false;
22+
private HashMap<Long, Task> cachedTasks = new HashMap<>();
23+
private boolean cachedRecordingsComplete = false;
24+
private HashMap<Long, Recording> cachedRecordings = new HashMap<>();
25+
26+
public CachedDatabaseController(Context context) {
27+
db = new DatabaseController(context);
28+
}
29+
30+
@Override
31+
public IDatabaseController open() throws SQLException {
32+
db.open();
33+
return this;
34+
}
35+
36+
@Override
37+
public void close() {
38+
db.close();
39+
}
40+
41+
@Override
42+
public void insertTask(Task newTask) {
43+
db.insertTask(newTask);
44+
45+
cachedTasks.put(newTask.getId(), newTask);
46+
}
47+
48+
@Override
49+
public Task getTask(long id) {
50+
Task task = cachedTasks.get(id);
51+
52+
if (task == null && !cachedTasksComplete) {
53+
task = db.getTask(id);
54+
cachedTasks.put(id, task);
55+
}
56+
57+
return task;
58+
}
59+
60+
@Override
61+
public List<Task> getTasks() {
62+
if (!cachedTasksComplete) {
63+
List<Task> tasks = db.getTasks();
64+
for (Task t : tasks) {
65+
cachedTasks.put(t.getId(), t);
66+
}
67+
cachedTasksComplete = true;
68+
}
69+
70+
return new ArrayList<>(cachedTasks.values());
71+
}
72+
73+
@Override
74+
public List<Task> getTasks(String name) {
75+
//TODO: Cache name searches?
76+
return db.getTasks(name);
77+
}
78+
79+
@Override
80+
public void updateTask(Task updatedTask) {
81+
db.updateTask(updatedTask);
82+
83+
cachedTasks.put(updatedTask.getId(), updatedTask);
84+
}
85+
86+
@Override
87+
public void deleteTask(long id) {
88+
db.deleteTask(id);
89+
90+
cachedTasks.remove(id);
91+
}
92+
93+
@Override
94+
public void deleteTask(Task removedTask) {
95+
deleteTask(removedTask.getId());
96+
}
97+
98+
99+
@Override
100+
public void insertRecording(Recording newRecording) {
101+
db.insertRecording(newRecording);
102+
103+
cachedRecordings.put(newRecording.getRecordingId(), newRecording);
104+
}
105+
106+
@Override
107+
public Recording getRecording(long recordingId) {
108+
Recording recording = cachedRecordings.get(recordingId);
109+
110+
if (recording == null && !cachedRecordingsComplete) {
111+
recording = db.getRecording(recordingId);
112+
cachedRecordings.put(recordingId, recording);
113+
}
114+
115+
return recording;
116+
}
117+
118+
@Override
119+
public List<Recording> getRecordings() {
120+
if (cachedRecordingsComplete) {
121+
return convertToSortedList(cachedRecordings.values());
122+
} else {
123+
List<Recording> recordings = db.getRecordings();
124+
for (Recording r : recordings) {
125+
cachedRecordings.put(r.getRecordingId(), r);
126+
}
127+
cachedRecordingsComplete = true;
128+
return recordings;
129+
}
130+
}
131+
132+
private List<Recording> convertToSortedList(Collection<Recording> recordingValues) {
133+
List<Recording> recordings = new ArrayList<>(recordingValues);
134+
Collections.sort(recordings);
135+
return recordings;
136+
}
137+
138+
@Override
139+
public List<Recording> getRecordings(int limit) {
140+
//TODO: Cache limit recordings search?
141+
return db.getRecordings(limit);
142+
}
143+
144+
@Override
145+
public List<Recording> getRecordings(long date) {
146+
//TODO: Cache date recordings search?
147+
return db.getRecordings(date);
148+
}
149+
150+
@Override
151+
public List<Recording> getRecordings(long start, long end) {
152+
//TODO: Cache limit recordings search?
153+
return db.getRecordings(start, end);
154+
}
155+
156+
@Override
157+
public List<Recording> getRecordings(long taskid, long start, long end) {
158+
//TODO: Cache task and time recordings search?
159+
return db.getRecordings(taskid, start, end);
160+
}
161+
162+
@Override
163+
public void updateRecording(Recording updatedRecording) {
164+
db.updateRecording(updatedRecording);
165+
166+
cachedRecordings.put(updatedRecording.getRecordingId(), updatedRecording);
167+
}
168+
169+
@Override
170+
public void deleteRecording(long id) {
171+
db.deleteRecording(id);
172+
173+
cachedRecordings.remove(id);
174+
}
175+
176+
@Override
177+
public void deleteRecording(Recording removedRecording) {
178+
deleteRecording(removedRecording.getRecordingId());
179+
}
180+
181+
@Override
182+
public List<Task> getSubTasks(long id) {
183+
//TODO: Cache subtask requests?
184+
return db.getSubTasks(id);
185+
}
186+
187+
@Override
188+
public void resetDatabase() {
189+
db.resetDatabase();
190+
191+
cachedTasks.clear();
192+
cachedTasksComplete = false;
193+
cachedRecordings.clear();
194+
cachedRecordingsComplete = false;
195+
}
196+
}

app/src/main/java/iiitd/mc/timetracker/database/DatabaseExportImport.java

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -35,7 +35,7 @@ public static String getDefaultExportFileName() {
3535
public static List<String> exportCsv() {
3636
List<String> lines = new ArrayList<>();
3737

38-
IDatabaseController db = ApplicationHelper.createDatabaseController();
38+
IDatabaseController db = ApplicationHelper.getDatabaseController();
3939
db.open();
4040
for (Recording recording : db.getRecordings()) {
4141
lines.add(recording2csv(recording));
@@ -78,7 +78,7 @@ private static String unescapeString(String s) {
7878
* @param csvLines A list of Strings, each representing csv data of one recording.
7979
*/
8080
public static void importCsv(List<String> csvLines) {
81-
IDatabaseController db = ApplicationHelper.createDatabaseController();
81+
IDatabaseController db = ApplicationHelper.getDatabaseController();
8282
db.open();
8383
for (String line : csvLines) {
8484
Recording recording = csv2recording(line);
@@ -134,7 +134,7 @@ private static Recording csv2recording(String csvLine) {
134134
* Use with care!
135135
*/
136136
public static void resetDatabase() {
137-
IDatabaseController db = ApplicationHelper.createDatabaseController();
137+
IDatabaseController db = ApplicationHelper.getDatabaseController();
138138
db.open();
139139
db.resetDatabase();
140140
db.close();

app/src/main/java/iiitd/mc/timetracker/model/Recording.java

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -10,7 +10,7 @@
1010
/**
1111
* A Recording describes a specific time period spent working on a Task.
1212
*/
13-
public class Recording {
13+
public class Recording implements Comparable<Recording> {
1414

1515
private long recordingId;
1616
private Date start;
@@ -175,4 +175,9 @@ public String toString() {
175175
eTime = dateFormatter.format(end) + " " + timeFormatter.format(end);
176176
return getTask().toString() + " [" + sTime + " - " + eTime + "]";
177177
}
178+
179+
@Override
180+
public int compareTo(Recording recording) {
181+
return recording.getStart().compareTo(this.getStart());
182+
}
178183
}

app/src/main/java/iiitd/mc/timetracker/model/Task.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -146,7 +146,7 @@ public List<Task> getSubtasks() {
146146
if (subtasks == null)
147147
subtasks = new ArrayList<>();
148148

149-
IDatabaseController db = ApplicationHelper.createDatabaseController();
149+
IDatabaseController db = ApplicationHelper.getDatabaseController();
150150
db.open();
151151
List<Task> subtasks = db.getSubTasks(id);
152152
db.close();

app/src/main/java/iiitd/mc/timetracker/suggestor/LocationTaskSuggestor.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -18,7 +18,7 @@ public class LocationTaskSuggestor implements ITaskSuggestor {
1818

1919
public LocationTaskSuggestor() {
2020
appContext = ApplicationHelper.getAppContext();
21-
db = ApplicationHelper.createDatabaseController();
21+
db = ApplicationHelper.getDatabaseController();
2222
}
2323

2424
/**

app/src/main/java/iiitd/mc/timetracker/suggestor/MainTaskSuggestor.java

Lines changed: 1 addition & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -6,8 +6,6 @@
66

77
/**
88
* Merges different tasks into one Task list
9-
*
10-
* @author gullal
119
*/
1210
public class MainTaskSuggestor implements ITaskSuggestor {
1311
private ITaskSuggestor[] suggestors = new ITaskSuggestor[]{
@@ -17,7 +15,7 @@ public class MainTaskSuggestor implements ITaskSuggestor {
1715
new LocationTaskSuggestor(),
1816
};
1917
private double[] suggestorWeights = new double[]{
20-
0, // top hierarchy
18+
0, // top hierarchy
2119
0.1, // recent tasks
2220
0.4, // time
2321
0.5, // location

0 commit comments

Comments
 (0)