/woloc/src/main/java/org/richardsson/woloc/activity/MainActivityHandler.java
Java | 182 lines | 146 code | 36 blank | 0 comment | 3 complexity | 7916a1c89f12b37fcff454e422064ec8 MD5 | raw file
1package org.richardsson.woloc.activity;
2
3import android.app.Activity;
4import android.graphics.Color;
5import android.os.Bundle;
6import android.view.MenuItem;
7import android.widget.Toast;
8import com.google.inject.Inject;
9import org.richardsson.woloc.*;
10import org.richardsson.woloc.android.wrapper.IntentWrapper;
11import org.richardsson.woloc.android.wrapper.Log;
12import org.richardsson.woloc.android.wrapper.TextViewWrapper;
13import org.richardsson.woloc.android.wrapper.UpdateTimer;
14import org.richardsson.woloc.export.RecordExporter;
15import org.richardsson.woloc.model.CurrentState;
16import org.richardsson.woloc.model.TimeRecord;
17import org.richardsson.woloc.persistence.CurrentStateQueryExtender;
18import org.richardsson.woloc.persistence.TimeDao;
19import org.richardsson.woloc.persistence.TimeRecordQuery;
20import org.richardsson.woloc.time.SystemTime;
21import org.richardsson.woloc.time.TimeUtil;
22import roboguice.inject.ContextSingleton;
23
24import java.io.IOException;
25import java.util.Calendar;
26import java.util.GregorianCalendar;
27import java.util.List;
28
29@ContextSingleton
30public class MainActivityHandler implements RecordCleanerWarningDialog.Listener, UpdateTimer.Listener {
31
32 private final Activity owner;
33 private final IntentWrapper intentWrapper;
34 private final RecordCleanerWarningDialog recordCleanerWarningDialog;
35 private final TimeDao timeDao;
36 private final TextViewWrapper textViewWrapper;
37 private final UpdateTimer updateTimer;
38 private final Log log;
39 private final RecordExporter recordExporter;
40
41 @Inject
42 protected MainActivityHandler(Activity owner, IntentWrapper intentWrapper, RecordCleanerWarningDialog recordCleanerWarningDialog, TimeDao timeDao, TextViewWrapper textViewWrapper, UpdateTimer updateTimer, Log log, RecordExporter recordExporter) {
43 this.owner = owner;
44 this.intentWrapper = intentWrapper;
45 this.recordCleanerWarningDialog = recordCleanerWarningDialog;
46 this.timeDao = timeDao;
47 this.textViewWrapper = textViewWrapper;
48 this.updateTimer = updateTimer;
49 this.log = log;
50 this.recordExporter = recordExporter;
51 }
52
53 public void onCreate(Bundle savedInstanceState) {
54 startService();
55 }
56
57 public void onResume() {
58 startUpdateTimer();
59 }
60
61 public void onPause() {
62 stopUpdateTimer();
63 }
64
65 public boolean onOptionsItemSelected(MenuItem item) {
66 switch (item.getItemId()) {
67 case R.id.menu_settings:
68 goToSettings();
69 return true;
70
71 case R.id.menu_record_list:
72 goToRecordList();
73 return true;
74
75 case R.id.menu_export_this_month:
76 exportThisMonth();
77 return true;
78
79 case R.id.menu_export_previous_month:
80 exportPreviousMonth();
81 return true;
82
83 case R.id.menu_clean_old_records:
84 cleanOldRecordsWithWarning();
85 return true;
86
87 default:
88 return false;
89 }
90 }
91
92 public void onAccept() {
93 cleanOldRecords();
94 }
95
96 public void updateTimerCallback() {
97 updateGui();
98 }
99
100 private void updateGui() {
101 log.i("Updating main GUI, using dao " + timeDao);
102
103 final CurrentState currentState = timeDao.getCurrentState();
104 final List<TimeRecord> records = timeDao.getRecords();
105
106 updateStatusDisplay(currentState);
107 updateWorkHoursDisplay(currentState, records);
108 }
109
110 private void startUpdateTimer() {
111 updateTimer.start(this);
112 }
113
114 private void stopUpdateTimer() {
115 updateTimer.stop();
116 }
117
118 private void exportThisMonth() {
119 recordExporter.exportThisMonth();
120 }
121
122 private void exportPreviousMonth() {
123 recordExporter.exportPreviousMonth();
124 }
125
126 private void goToSettings() {
127 intentWrapper.startActivity(SettingsActivity.class);
128 }
129
130 private void goToRecordList() {
131 intentWrapper.startActivity(RecordListActivity.class);
132 }
133
134 private void cleanOldRecordsWithWarning() {
135 recordCleanerWarningDialog.showAndGetUserInput(this);
136 }
137
138 private void cleanOldRecords() {
139 try {
140 final List<TimeRecord> records = timeDao.getRecords();
141 final TimeRecordQuery query = new TimeRecordQuery(records);
142
143 final GregorianCalendar calendar = TimeUtil.createCalendar(SystemTime.now());
144 calendar.add(Calendar.MONTH, -2);
145 long twoMonthsAgo = calendar.getTime().getTime();
146
147 final List<TimeRecord> oldRecords = query.olderThan(twoMonthsAgo);
148 timeDao.removeRecords(oldRecords);
149 } catch (IOException e) {
150 Toast.makeText(owner, "Failed to write records to file.", Toast.LENGTH_SHORT).show();
151 }
152 }
153
154 private void updateStatusDisplay(CurrentState currentState) {
155 final boolean networkFound = currentState.isNetworkFound();
156
157 final int id = R.id.status;
158 if (networkFound) {
159 textViewWrapper.setFromResource(id, R.string.punched_in, Color.GREEN);
160 } else {
161 textViewWrapper.setFromResource(id, R.string.punched_out, Color.RED);
162 }
163 }
164
165 private void updateWorkHoursDisplay(CurrentState currentState, List<TimeRecord> records) {
166 final TimeRecordQuery query = new TimeRecordQuery(records);
167 final CurrentStateQueryExtender extender = new CurrentStateQueryExtender(query, currentState);
168
169 setTextInView(extender.calculateTimeSummedToday(), R.id.working_hours_today);
170 setTextInView(extender.calculateTimeSummedThisWeek(), R.id.working_hours_this_week);
171 setTextInView(extender.calculateTimeSummedThisMonth(), R.id.working_hours_this_month);
172 }
173
174 private void setTextInView(long timeSpan, int id) {
175 textViewWrapper.set(id, Formatter.formatTimeSpan(timeSpan));
176 }
177
178 private void startService() {
179 intentWrapper.startService(WolocService.class);
180 }
181}
182