PageRenderTime 28ms CodeModel.GetById 16ms app.highlight 10ms RepoModel.GetById 0ms app.codeStats 0ms

/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
  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