/woloc/src/main/java/org/richardsson/woloc/activity/MainActivityHandler.java

https://bitbucket.org/krichardsson/woloc · Java · 182 lines · 146 code · 36 blank · 0 comment · 3 complexity · 7916a1c89f12b37fcff454e422064ec8 MD5 · raw file

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