Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 1 addition & 1 deletion .idea/misc.xml

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

Original file line number Diff line number Diff line change
@@ -1,13 +1,16 @@
package pl.rafalmag.worktimetracker;

import android.app.Activity;
import android.app.Application;
import android.util.Log;

import pl.rafalmag.worktimetracerlibrary.EventSourcingPersistenceManager;
import pl.rafalmag.worktimetracerlibrary.NotificationAwarePersistenceManager;
import pl.rafalmag.worktimetracerlibrary.PersistenceManager;
import pl.rafalmag.worktimetracerlibrary.WorkTimeTracerManager;
import pl.rafalmag.worktimetracerlibrary.notification.MainActivityClassProvider;

public class WorkTimeTrackerApp extends Application {
public class WorkTimeTrackerApp extends Application implements MainActivityClassProvider {

private static final String TAG = WorkTimeTrackerApp.class.getCanonicalName();

Expand All @@ -19,7 +22,9 @@ public void onCreate() {
super.onCreate();
initExceptionHandler();
// persistenceManager = new PreferencesPersistenceManager(this);
persistenceManager = new EventSourcingPersistenceManager(this);
persistenceManager = new NotificationAwarePersistenceManager(
new EventSourcingPersistenceManager(this),
this);
workTimeTracerManager = new WorkTimeTracerManager(persistenceManager);
}

Expand All @@ -33,13 +38,18 @@ public void uncaughtException(Thread thread, Throwable ex) {
}
});
}

@Override
public PersistenceManager getPersistenceManager() {
return persistenceManager;
}

@Override
public WorkTimeTracerManager getWorkTimeTracerManager() {
return workTimeTracerManager;
}

@Override
public Class<? extends Activity> getMainActivityClass() {
return WorkTimeTracker.class;
}
}

Original file line number Diff line number Diff line change
Expand Up @@ -14,9 +14,6 @@
import android.widget.TableRow;
import android.widget.TextView;

import com.j256.ormlite.android.apptools.OpenHelperManager;
import com.j256.ormlite.dao.Dao;

import org.joda.time.format.DateTimeFormat;
import org.joda.time.format.DateTimeFormatter;

Expand All @@ -31,7 +28,7 @@
import butterknife.ButterKnife;
import pl.rafalmag.worktimetracerlibrary.db.Event;
import pl.rafalmag.worktimetracerlibrary.db.EventParser;
import pl.rafalmag.worktimetracerlibrary.db.WorkTimeTracerOpenHelper;
import pl.rafalmag.worktimetracerlibrary.db.EventsService;
import pl.rafalmag.worktimetracker.R;

public class EventsFragment extends Fragment {
Expand All @@ -48,33 +45,28 @@ public class EventsFragment extends Fragment {
LinearLayout layout;

Map<String, CheckBox> types = new HashMap<>();
private WorkTimeTracerOpenHelper workTimeTracerOpenHelper;
private EventsService eventsService;

@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
View view = inflater.inflate(R.layout.events, container, false);
ButterKnife.bind(this, view);

workTimeTracerOpenHelper = OpenHelperManager.getHelper(getActivity(), WorkTimeTracerOpenHelper.class);
Dao<Event, Integer> eventDao = workTimeTracerOpenHelper.getEventDao();
eventsService = new EventsService(getActivity());
try {
initTypes(eventDao);
initTable(eventDao);
initTypes();
initTable();
} catch (SQLException e) {
throw new IllegalStateException("Could not init events fragment, because of "
+ e.getMessage(), e);
}
return view;
}

private void initTable(Dao<Event, Integer> eventDao) throws SQLException {
private void initTable() throws SQLException {
int childCount = table.getChildCount();
table.removeViews(1, childCount - 1);
List<Event> events = eventDao
.queryBuilder()
.orderBy("date", false)
.where().in("typeClass", getTypesToSelect())
.query();
Iterable<String> typesToSelect = getTypesToSelect();
List<Event> events = eventsService.getEvents(typesToSelect);
for (Event event : events) {
table.addView(createTableRow(event));
}
Expand All @@ -91,8 +83,8 @@ private Iterable<String> getTypesToSelect() {
return typesToSelect;
}

private void initTypes(Dao<Event, Integer> eventDao) throws SQLException {
List<String[]> results = eventDao.queryRaw("select distinct typeClass from events").getResults();
private void initTypes() throws SQLException {
List<String[]> results = eventsService.getTypes();
for (String[] result : results) {
CheckBox checkBox = new CheckBox(getActivity());
checkBox.setText(getTypeSimpleText(result[0]));
Expand All @@ -101,7 +93,7 @@ private void initTypes(Dao<Event, Integer> eventDao) throws SQLException {
@Override
public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) {
try {
initTable(workTimeTracerOpenHelper.getEventDao());
initTable();
} catch (SQLException e) {
Log.e(TAG, "Could not init table, because of " + e.getMessage(), e);
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -40,8 +40,8 @@ public class OverTimePreference extends DialogPreference {

public OverTimePreference(Context ctxt, AttributeSet attrs) {
super(ctxt, attrs);
setPositiveButtonText("Set");
setNegativeButtonText("Cancel");
setPositiveButtonText(ctxt.getString(R.string.date_time_set));
setNegativeButtonText(ctxt.getString(android.R.string.cancel));
setDialogLayoutResource(R.layout.overtime);
}

Expand Down Expand Up @@ -94,16 +94,16 @@ private void initMinutePicker() {
@Override
public void onValueChange(NumberPicker picker, int oldVal, int newVal) {
updateInputState();
if (oldVal == 59 && newVal == 0) {
int oldHour = hourPicker.getValue();
hourPicker.setValue(oldHour + 1);
}
if (oldVal == 0 && newVal == 59) {
int oldHour = hourPicker.getValue();
if (oldHour >= 1) {
hourPicker.setValue(oldHour - 1);
}
}
// if (oldVal == 59 && newVal == 0) {
// int oldHour = hourPicker.getValue();
// hourPicker.setValue(oldHour + 1);
// }
// if (oldVal == 0 && newVal == 59) {
// int oldHour = hourPicker.getValue();
// if (oldHour >= 1) {
// hourPicker.setValue(oldHour - 1);
// }
// }
}
});
minutePicker.setValue(lastMinute);
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -6,7 +6,9 @@
import android.util.AttributeSet;
import android.util.Log;
import android.view.View;
import android.widget.TimePicker;

import pl.rafalmag.worktimetracerlibrary.CompatibleTimePicker;
import pl.rafalmag.worktimetracker.R;

/**
* User: rafalmag
Expand All @@ -23,34 +25,34 @@ public class TimePreference extends DialogPreference {

private int lastHour = 0;
private int lastMinute = 0;
private TimePicker picker;
private CompatibleTimePicker picker;

public TimePreference(Context ctxt, AttributeSet attrs) {
super(ctxt, attrs);
setPositiveButtonText("Set");
setNegativeButtonText("Cancel");
setPositiveButtonText(ctxt.getString(R.string.date_time_set));
setNegativeButtonText(ctxt.getString(android.R.string.cancel));
}

@Override
protected View onCreateDialogView() {
picker = new TimePicker(getContext());
picker = new CompatibleTimePicker(getContext());
picker.setIs24HourView(true);
return picker;
}

@Override
protected void onBindDialogView(View v) {
super.onBindDialogView(v);
picker.setCurrentHour(lastHour);
picker.setCurrentMinute(lastMinute);
picker.setHour(lastHour);
picker.setMinute(lastMinute);
}

@Override
protected void onDialogClosed(boolean positiveResult) {
super.onDialogClosed(positiveResult);
if (positiveResult) {
lastHour = picker.getCurrentHour();
lastMinute = picker.getCurrentMinute();
lastHour = picker.getHour();
lastMinute = picker.getMinute();
int mins = lastHour * 60 + lastMinute;
if (callChangeListener(mins)) {
Log.d(TAG, "Persisting " + getKey() + " = " + mins + " mins");
Expand Down
Binary file removed app/src/main/res/mipmap-hdpi/ic_launcher.png
Binary file not shown.
Binary file removed app/src/main/res/mipmap-mdpi/ic_launcher.png
Binary file not shown.
Binary file removed app/src/main/res/mipmap-xhdpi/ic_launcher.png
Binary file not shown.
Binary file removed app/src/main/res/mipmap-xxhdpi/ic_launcher.png
Binary file not shown.
Binary file removed app/src/main/res/mipmap-xxxhdpi/ic_launcher.png
Binary file not shown.
23 changes: 23 additions & 0 deletions app/src/main/res/values-pl/strings.xml
Original file line number Diff line number Diff line change
@@ -0,0 +1,23 @@
<?xml version="1.0" encoding="utf-8"?>
<resources>
<string name="action_settings">Ustawienia</string>
<string name="action_events">Zdarzenia</string>
<string name="start_time">Czas startu:</string>
<string name="stop_time">Czas stopu:</string>
<string name="diff_time">Różnica:</string>
<string name="over_hours">Nadgodzin:</string>
<string name="now">Teraz</string>
<string name="log">Loguj</string>
<string name="over_time">nadgodziny</string>
<string name="under_time">niedogodziny</string>
<string name="logged">Zalogowano czas</string>
<string name="overHours">Nadgodzin: %s</string>
<string name="diff">Różnica: %s</string>
<string name="date">Data</string>
<string name="event">Zdarzenie</string>
<string name="date_time_set">Ustaw</string>
<string name="workTime">Czas pracy</string>
<string name="workTimeSummary">Ustaw średni dzienny czas pracy</string>
<string name="overTime">Nadgodziny</string>
<string name="overTimeSummary">Ustaw nadgodziny / niedogodziny</string>
</resources>
5 changes: 5 additions & 0 deletions app/src/main/res/values/strings.xml
Original file line number Diff line number Diff line change
Expand Up @@ -15,5 +15,10 @@
<string name="diff">Diff: %s</string>
<string name="date">Date</string>
<string name="event">Event</string>
<string name="date_time_set">Set</string>
<string name="workTime">Work time</string>
<string name="workTimeSummary">Set your average day work time</string>
<string name="overTime">Over time</string>
<string name="overTimeSummary">Set your overtime / undertime</string>

</resources>
8 changes: 4 additions & 4 deletions app/src/main/res/xml/preferences.xml
Original file line number Diff line number Diff line change
Expand Up @@ -5,13 +5,13 @@
<pl.rafalmag.worktimetracker.settings.TimePreference
android:key="work_time"
android:defaultValue="480"
android:title="Work time"
android:summary="Set your average day work time" />
android:title="@string/workTime"
android:summary="@string/workTimeSummary" />

<pl.rafalmag.worktimetracker.settings.OverTimePreference
android:key="total_over_hours_as_mins"
android:defaultValue="0"
android:title="Over hours"
android:summary="Set your overtime / undertime" />
android:title="@string/overTime"
android:summary="@string/overTimeSummary" />

</PreferenceScreen>
Binary file added publishStuff/icon18px.psd
Binary file not shown.
Binary file added publishStuff/icon24px.psd
Binary file not shown.
Binary file added publishStuff/icon36px.psd
Binary file not shown.
Binary file added publishStuff/icon48px.psd
Binary file not shown.
11 changes: 10 additions & 1 deletion worktimetracerlibrary/src/main/AndroidManifest.xml
Original file line number Diff line number Diff line change
@@ -1,10 +1,19 @@
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="pl.rafalmag.worktimetracerlibrary">

<uses-permission android:name="android.permission.RECEIVE_BOOT_COMPLETED"/>
<application
android:allowBackup="true"
android:label="@string/app_name"
android:supportsRtl="true">
<receiver android:name=".notification.WorkEndNotificationBootReceiver"
android:enabled="false">
<intent-filter>
<action android:name="android.intent.action.BOOT_COMPLETED" />
</intent-filter>
</receiver>
<receiver
android:name=".notification.WorkEndNotificationPublisher"
android:enabled="true" />
</application>

</manifest>
Original file line number Diff line number Diff line change
@@ -0,0 +1,84 @@
package pl.rafalmag.worktimetracerlibrary;

import android.content.Context;
import android.support.annotation.NonNull;

import org.joda.time.DateTime;
import org.joda.time.Minutes;
import org.joda.time.MutableDateTime;

import pl.rafalmag.worktimetracerlibrary.notification.WorkEndNotificationScheduler;

public class NotificationAwarePersistenceManager implements PersistenceManager {

private final Context context;
private final PersistenceManager persistenceManager;
private final WorkEndNotificationScheduler workEndNotificationScheduler = new WorkEndNotificationScheduler();

public NotificationAwarePersistenceManager(PersistenceManager persistenceManager, Context context) {
this.persistenceManager = persistenceManager;
this.context = context;
}

@Override
public Time loadStartTime() {
return persistenceManager.loadStartTime();
}

@Override
public Time loadStopTime() {
return persistenceManager.loadStopTime();
}

@Override
public void saveStartStopTime(Time startTime, Time stopTime) {
persistenceManager.saveStartStopTime(startTime, stopTime);
DateTime expectedEndTime = getExpectedEndTime(startTime, getWorkTime());
// TODO make it event aware - so do not shown notification is work logged today.
workEndNotificationScheduler.scheduleWorkEndNotification(context, expectedEndTime);
}

@NonNull
private DateTime getExpectedEndTime(Time startTime, Minutes workTime) {
MutableDateTime dateTime = new MutableDateTime();
dateTime.setHourOfDay(startTime.getHours());
dateTime.setMinuteOfHour(startTime.getMinutes());
// if start time is after now, that mean it was yesterday, ie. now is 1:00, but start was at 23:00
if(dateTime.isAfterNow()){
dateTime.addDays(-1);
}
// add work time
dateTime.addMinutes(workTime.getMinutes());
// clear seconds, so alarm sets at "full minute"
dateTime.setSecondOfMinute(0);
return dateTime.toDateTime();
}

@Override
public void saveOvertime(Minutes newOverHours) {
persistenceManager.saveOvertime(newOverHours);
}

@Override
public void logWork() {
persistenceManager.logWork();
workEndNotificationScheduler.cancelWorkEndNotification(context);
}

@Override
public Minutes getOvertime() {
return persistenceManager.getOvertime();
}

@Override
public Minutes getWorkTime() {
return persistenceManager.getWorkTime();
}

@Override
public void saveWorkTime(Minutes workTime) {
persistenceManager.saveWorkTime(workTime);
DateTime expectedEndTime = getExpectedEndTime(loadStartTime(),workTime);
workEndNotificationScheduler.scheduleWorkEndNotification(context, expectedEndTime);
}
}
Loading