diff --git a/app/app-rel_1.apk b/app/app-rel_1.apk
deleted file mode 100644
index 2b38a05..0000000
Binary files a/app/app-rel_1.apk and /dev/null differ
diff --git a/app/app.iml b/app/app.iml
index b109966..9fad11c 100644
--- a/app/app.iml
+++ b/app/app.iml
@@ -8,15 +8,12 @@
-
+
-
-
-
-
+
+
- generateDebugAndroidTestSources
- generateDebugSources
+ generateReleaseSources
@@ -27,29 +24,23 @@
-
+
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml
index 2cd1555..5a8ae3b 100644
--- a/app/src/main/AndroidManifest.xml
+++ b/app/src/main/AndroidManifest.xml
@@ -3,6 +3,8 @@
package="com.hstrobel.lsfplan">
+
+
/>
+
+
+
+
+
+
+
diff --git a/app/src/main/java/com/hstrobel/lsfplan/MainActivity.java b/app/src/main/java/com/hstrobel/lsfplan/MainActivity.java
index 1d29d0d..6469e5b 100644
--- a/app/src/main/java/com/hstrobel/lsfplan/MainActivity.java
+++ b/app/src/main/java/com/hstrobel/lsfplan/MainActivity.java
@@ -1,7 +1,9 @@
package com.hstrobel.lsfplan;
+import android.content.ComponentName;
import android.content.Intent;
import android.content.SharedPreferences;
+import android.content.pm.PackageManager;
import android.os.Bundle;
import android.preference.PreferenceManager;
import android.support.v7.app.ActionBarActivity;
@@ -9,6 +11,9 @@
import android.view.MenuItem;
import android.widget.TextView;
+import com.hstrobel.lsfplan.classes.BootReceiver;
+import com.hstrobel.lsfplan.classes.CalenderUtils;
+import com.hstrobel.lsfplan.classes.Globals;
import com.hstrobel.lsfplan.frags.MainDefaultFragment;
import com.hstrobel.lsfplan.frags.MainListFragment;
@@ -16,7 +21,6 @@
import org.apache.commons.lang.exception.ExceptionUtils;
-import java.util.Collection;
import java.util.List;
public class MainActivity extends ActionBarActivity {
@@ -86,7 +90,7 @@ protected void onResume() {
//present --> show info
try {
- Globals.InitCalender(this);
+ Globals.InitCalender(this, true);
if (Globals.myCal == null) {
@@ -104,14 +108,6 @@ protected void onResume() {
transaction.replace(R.id.mainDefaultFragment, new MainListFragment(), "list");
transaction.commit();
}
-/*
- Collection evs = CalenderUtils.GetNextEvent(Globals.myCal);
- StringBuilder builder = new StringBuilder();
- for (VEvent ev : evs) {
- builder.append(ev.toString() + "\n" + CalenderUtils.formatEventLong(ev, this));
- }
- infoText.setText(builder.toString());
- */
}
diff --git a/app/src/main/java/com/hstrobel/lsfplan/UserSettings.java b/app/src/main/java/com/hstrobel/lsfplan/UserSettings.java
index c15a6f3..ecb4a3d 100644
--- a/app/src/main/java/com/hstrobel/lsfplan/UserSettings.java
+++ b/app/src/main/java/com/hstrobel/lsfplan/UserSettings.java
@@ -4,12 +4,11 @@
import android.os.Bundle;
import android.preference.ListPreference;
import android.preference.Preference;
-import android.preference.PreferenceActivity;
import android.preference.PreferenceFragment;
-import android.preference.PreferenceManager;
import android.support.v4.app.NavUtils;
import android.support.v7.app.ActionBarActivity;
-import android.view.Window;
+
+import com.hstrobel.lsfplan.classes.Globals;
public class UserSettings extends ActionBarActivity {
@@ -51,6 +50,13 @@ public boolean onPreferenceClick(Preference preference) {
@Override
public void onSharedPreferenceChanged(SharedPreferences sharedPreferences, String key) {
+ switch (key) {
+ case "notfiyTime":
+ case "enableNotifications":
+ Globals.InitNotifications(getActivity());
+ break;
+ }
+
Preference myPref = findPreference("notfiyTime");
int time = Integer.parseInt(Globals.mSettings.getString("notfiyTime", "15"));
myPref.setSummary(String.format(getString(R.string.pref_description_timeSetter), time));
diff --git a/app/src/main/java/com/hstrobel/lsfplan/WebSelector.java b/app/src/main/java/com/hstrobel/lsfplan/WebSelector.java
index f128dd0..7a469f5 100644
--- a/app/src/main/java/com/hstrobel/lsfplan/WebSelector.java
+++ b/app/src/main/java/com/hstrobel/lsfplan/WebSelector.java
@@ -1,38 +1,26 @@
package com.hstrobel.lsfplan;
-import android.app.Activity;
-import android.content.Context;
-import android.content.ContextWrapper;
-import android.content.Intent;
import android.content.SharedPreferences;
import android.net.Uri;
import android.os.AsyncTask;
import android.os.Bundle;
import android.os.Handler;
import android.preference.PreferenceManager;
-import android.provider.Settings;
-import android.support.design.widget.FloatingActionButton;
import android.support.design.widget.Snackbar;
import android.support.v4.app.NavUtils;
import android.support.v7.app.ActionBarActivity;
-import android.support.v7.app.AppCompatActivity;
-import android.support.v7.widget.Toolbar;
-import android.util.Log;
import android.view.MenuItem;
-import android.view.View;
import android.webkit.DownloadListener;
import android.webkit.WebView;
import android.webkit.WebViewClient;
-import android.widget.Button;
import android.widget.Toast;
+import com.hstrobel.lsfplan.classes.Globals;
+
import org.apache.commons.io.IOUtils;
import org.apache.commons.lang.exception.ExceptionUtils;
-import org.w3c.dom.Document;
-import java.io.BufferedInputStream;
import java.io.InputStream;
-import java.net.HttpURLConnection;
import java.net.URL;
public class WebSelector extends ActionBarActivity {
diff --git a/app/src/main/java/com/hstrobel/lsfplan/classes/AlarmReceiver.java b/app/src/main/java/com/hstrobel/lsfplan/classes/AlarmReceiver.java
new file mode 100644
index 0000000..04eb352
--- /dev/null
+++ b/app/src/main/java/com/hstrobel/lsfplan/classes/AlarmReceiver.java
@@ -0,0 +1,74 @@
+package com.hstrobel.lsfplan.classes;
+
+import android.app.AlarmManager;
+import android.app.PendingIntent;
+import android.content.BroadcastReceiver;
+import android.content.Context;
+import android.content.Intent;
+import android.util.Log;
+
+import net.fortuna.ical4j.model.Date;
+import net.fortuna.ical4j.model.DateTime;
+import net.fortuna.ical4j.model.component.VEvent;
+
+import org.apache.commons.lang.exception.ExceptionUtils;
+
+import java.util.List;
+
+public class AlarmReceiver extends BroadcastReceiver {
+ @Override
+ public void onReceive(Context context, Intent intent) {
+ Log.i("LSF", "onReceive");
+ try {
+ //Process could be killed in the meantime, setup our calender, but NOT init the notifications to prevent duplicates loops etc
+ if (!Globals.initalized) Globals.InitCalender(context, false);
+ VEvent event = (VEvent) intent.getSerializableExtra("event");
+ CalenderUtils.showNotfication(event, context);
+ ScheduleNextEventNot(context);
+ } catch (Exception ex) {
+ System.out.println("FAIL onReceive:\n " + ExceptionUtils.getCause(ex));
+ System.out.println("FAIL onReceive ST:\n " + ExceptionUtils.getFullStackTrace(ex));
+ }
+ }
+
+ public static void ScheduleNextEventNot(Context c) {
+ //cancel for all cases
+ CancelNextEventNot(c);
+
+ if (Globals.myCal == null) {
+ Log.i("LSF", "mycal null");
+ return;
+ }
+
+ List events = CalenderUtils.GetNextEvent(Globals.myCal);
+
+ if (events.size() > 1) {
+ Log.i("LSF", "events size bigger 1, size is " + events.size());
+ return;
+ }
+
+ Date start = CalenderUtils.GetNextRecuringStartDate(events.get(0));
+ int minutesBefore = Integer.parseInt(Globals.mSettings.getString("notfiyTime", "15"));
+ start.setTime(start.getTime() - minutesBefore * 60 * 1000);
+
+ //DEBUG DEBUG REMOVE IT
+ //start.setTime(new DateTime().getTime() + 30 * 1000);
+
+ Intent intentAlarm = new Intent(c, AlarmReceiver.class);
+ intentAlarm.putExtra("event", events.get(0));
+
+ AlarmManager alarmManager = (AlarmManager) c.getSystemService(Context.ALARM_SERVICE);
+ alarmManager.set(AlarmManager.RTC_WAKEUP, start.getTime(), PendingIntent.getBroadcast(c, 1, intentAlarm, PendingIntent.FLAG_UPDATE_CURRENT));
+
+
+ Log.i("LSF", "Alarm Scheduled for event " + events.get(0).getDescription().getValue());
+ Log.i("LSF", "time sched " + start.toString());
+ }
+
+ public static void CancelNextEventNot(Context c) {
+ AlarmManager alarmManager = (AlarmManager) c.getSystemService(Context.ALARM_SERVICE);
+ Intent intentAlarm = new Intent(c, AlarmReceiver.class);
+ alarmManager.cancel(PendingIntent.getBroadcast(c, 1, intentAlarm, PendingIntent.FLAG_UPDATE_CURRENT));
+
+ }
+}
\ No newline at end of file
diff --git a/app/src/main/java/com/hstrobel/lsfplan/classes/BootReceiver.java b/app/src/main/java/com/hstrobel/lsfplan/classes/BootReceiver.java
new file mode 100644
index 0000000..fd5ba66
--- /dev/null
+++ b/app/src/main/java/com/hstrobel/lsfplan/classes/BootReceiver.java
@@ -0,0 +1,26 @@
+package com.hstrobel.lsfplan.classes;
+
+
+import android.content.BroadcastReceiver;
+import android.content.Context;
+import android.content.Intent;
+import android.util.Log;
+
+import org.apache.commons.lang.exception.ExceptionUtils;
+
+public class BootReceiver extends BroadcastReceiver {
+
+ @Override
+ public void onReceive(Context context, Intent intent) {
+ if (intent.getAction().equals("android.intent.action.BOOT_COMPLETED")) {
+ Log.i("LSF", "Setting Bootup");
+ try {
+ Globals.InitCalender(context, true);
+ } catch (Exception ex) {
+ System.out.println("FAIL Bootup:\n " + ExceptionUtils.getCause(ex));
+ System.out.println("FAIL Bootup ST:\n " + ExceptionUtils.getFullStackTrace(ex));
+ }
+
+ }
+ }
+}
\ No newline at end of file
diff --git a/app/src/main/java/com/hstrobel/lsfplan/CalenderUtils.java b/app/src/main/java/com/hstrobel/lsfplan/classes/CalenderUtils.java
similarity index 93%
rename from app/src/main/java/com/hstrobel/lsfplan/CalenderUtils.java
rename to app/src/main/java/com/hstrobel/lsfplan/classes/CalenderUtils.java
index 3a8dca3..5a241ea 100644
--- a/app/src/main/java/com/hstrobel/lsfplan/CalenderUtils.java
+++ b/app/src/main/java/com/hstrobel/lsfplan/classes/CalenderUtils.java
@@ -1,4 +1,4 @@
-package com.hstrobel.lsfplan;
+package com.hstrobel.lsfplan.classes;
import android.app.NotificationManager;
import android.app.PendingIntent;
@@ -6,6 +6,9 @@
import android.content.Intent;
import android.support.v4.app.NotificationCompat;
+import com.hstrobel.lsfplan.MainActivity;
+import com.hstrobel.lsfplan.R;
+
import net.fortuna.ical4j.filter.Filter;
import net.fortuna.ical4j.filter.PeriodRule;
import net.fortuna.ical4j.model.Calendar;
@@ -15,26 +18,21 @@
import net.fortuna.ical4j.model.Period;
import net.fortuna.ical4j.model.PeriodList;
import net.fortuna.ical4j.model.component.VEvent;
-import net.fortuna.ical4j.model.property.Description;
-import java.lang.reflect.Array;
import java.util.ArrayList;
-import java.util.Arrays;
import java.util.Collection;
import java.util.Collections;
import java.util.Comparator;
-import java.util.Date;
import java.util.List;
import java.util.NoSuchElementException;
-import java.util.Random;
/**
* Created by Henry on 10.11.2015.
*/
public class CalenderUtils {
- public static List GetEventsNext24h(Calendar myCal) {
+ public static List GetEventsNextWeek(Calendar myCal) {
java.util.Calendar today = java.util.Calendar.getInstance();
- return GetEvents(myCal, today);
+ return GetEvents(myCal, today, new Dur(7, 0, 0, 0));
}
public static List GetEventsForDay(Calendar myCal, java.util.Calendar date) {
@@ -43,11 +41,11 @@ public static List GetEventsForDay(Calendar myCal, java.util.Calendar date) {
date.clear(java.util.Calendar.MINUTE);
date.clear(java.util.Calendar.SECOND);
System.out.print(date.toString());
- return GetEvents(myCal, date);
+ return GetEvents(myCal, date, new Dur(1, 0, 0, 0));
}
- private static List GetEvents(Calendar myCal, java.util.Calendar date) {
- Period period = new Period(new DateTime(date.getTime()), new Dur(1, 0, 0, 0));
+ private static List GetEvents(Calendar myCal, java.util.Calendar date, Dur duration) {
+ Period period = new Period(new DateTime(date.getTime()), duration);
Filter filter = new Filter(new PeriodRule(period));
Collection eventsTodayC = filter.filter(myCal.getComponents(Component.VEVENT));
@@ -85,7 +83,7 @@ public static List GetNextEvent(Calendar myCal) {
DateTime starttR = null;
List toReturn = new ArrayList();
- List events = GetEventsNext24h(myCal);
+ List events = GetEventsNextWeek(myCal);
for (Object comp : events) {
if (!(comp instanceof VEvent)) continue;
@@ -191,7 +189,7 @@ public static void showNotfication(VEvent event, Context context) {
.setContentText(formatEventShort(event, context)) // message for notification
.setAutoCancel(true) // clear notification after click
.setStyle(new NotificationCompat.BigTextStyle().bigText(formatEventLong(event, context)))
- .setPriority(NotificationCompat.PRIORITY_HIGH)
+ .setPriority(NotificationCompat.PRIORITY_DEFAULT)
.setDefaults(soundMode);
diff --git a/app/src/main/java/com/hstrobel/lsfplan/Globals.java b/app/src/main/java/com/hstrobel/lsfplan/classes/Globals.java
similarity index 60%
rename from app/src/main/java/com/hstrobel/lsfplan/Globals.java
rename to app/src/main/java/com/hstrobel/lsfplan/classes/Globals.java
index 3dcf946..4f59a93 100644
--- a/app/src/main/java/com/hstrobel/lsfplan/Globals.java
+++ b/app/src/main/java/com/hstrobel/lsfplan/classes/Globals.java
@@ -1,23 +1,27 @@
-package com.hstrobel.lsfplan;
+package com.hstrobel.lsfplan.classes;
import android.app.Activity;
+import android.content.ComponentName;
+import android.content.Context;
import android.content.SharedPreferences;
+import android.content.pm.PackageManager;
import android.preference.PreferenceManager;
+import com.hstrobel.lsfplan.WebSelector;
+
import net.fortuna.ical4j.data.CalendarBuilder;
import net.fortuna.ical4j.data.CalendarOutputter;
import net.fortuna.ical4j.data.ParserException;
import net.fortuna.ical4j.model.Calendar;
import net.fortuna.ical4j.model.ValidationException;
-import net.fortuna.ical4j.model.component.VEvent;
import org.apache.commons.io.IOUtils;
-import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.StringWriter;
import java.io.Writer;
+import java.net.ConnectException;
/**
* Created by Henry on 09.11.2015.
@@ -32,10 +36,11 @@ public class Globals {
public static InputStream icsFileStream = null;
public static Calendar myCal = null;
- public static void InitCalender(Activity act) throws IOException, ParserException {
+ public static void InitCalender(Context c, boolean initNotification) throws IOException, ParserException {
if (!initalized) {
//Try to load from file
- mSettings = PreferenceManager.getDefaultSharedPreferences(act);
+ mSettings = PreferenceManager.getDefaultSharedPreferences(c);
+ myCal = null;
if (mSettings.getBoolean("gotICS", false)) {
//found something!
icsFile = mSettings.getString("ICS_FILE", "");
@@ -51,12 +56,38 @@ public static void InitCalender(Activity act) throws IOException, ParserExceptio
myCal = builder.build(icsFileStream);
}
updated = false;
+ if (initNotification){
+ InitNotifications(c);
+ }
+ }
+ }
+
+ public static void InitNotifications(final Context c) {
+ ComponentName receiver = new ComponentName(c, BootReceiver.class);
+ PackageManager pm = c.getPackageManager();
+
+ if (Globals.mSettings.getBoolean("enableNotifications", false)) {
+ pm.setComponentEnabledSetting(receiver,
+ PackageManager.COMPONENT_ENABLED_STATE_ENABLED,
+ PackageManager.DONT_KILL_APP);
+ new Thread(new Runnable() {
+ public void run() {
+ AlarmReceiver.ScheduleNextEventNot(c);
+ }
+ }).start();
+
+ } else {
+ pm.setComponentEnabledSetting(receiver,
+ PackageManager.COMPONENT_ENABLED_STATE_DISABLED,
+ PackageManager.DONT_KILL_APP);
+ AlarmReceiver.CancelNextEventNot(c);
}
}
+
public static void Update(Activity act) throws IOException, ParserException {
updated = true;
- InitCalender(act);
+ InitCalender(act, false);
}
public static void Save() throws IOException, ValidationException {
@@ -67,7 +98,7 @@ public static void Save() throws IOException, ValidationException {
icsFile = w.toString();
SharedPreferences.Editor editor = mSettings.edit();
- editor.putString("ICS_FILE", Globals.icsFile);
+ editor.putString("ICS_FILE", Globals.icsFile);
editor.commit();
}
diff --git a/app/src/main/java/com/hstrobel/lsfplan/frags/MainListFragment.java b/app/src/main/java/com/hstrobel/lsfplan/frags/MainListFragment.java
index 19eac12..57b651b 100644
--- a/app/src/main/java/com/hstrobel/lsfplan/frags/MainListFragment.java
+++ b/app/src/main/java/com/hstrobel/lsfplan/frags/MainListFragment.java
@@ -6,13 +6,12 @@
import android.app.ListFragment;
import android.support.v4.content.ContextCompat;
import android.view.View;
-import android.widget.CalendarView;
import android.widget.DatePicker;
import android.widget.ListView;
import android.widget.Toast;
-import com.hstrobel.lsfplan.CalenderUtils;
-import com.hstrobel.lsfplan.Globals;
+import com.hstrobel.lsfplan.classes.CalenderUtils;
+import com.hstrobel.lsfplan.classes.Globals;
import com.hstrobel.lsfplan.R;
import net.fortuna.ical4j.model.component.VEvent;
@@ -22,8 +21,6 @@
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Calendar;
-import java.util.Collection;
-import java.util.Date;
import java.util.List;
diff --git a/app/src/main/res/xml/settings.xml b/app/src/main/res/xml/settings.xml
index 785a7a1..692c22e 100644
--- a/app/src/main/res/xml/settings.xml
+++ b/app/src/main/res/xml/settings.xml
@@ -6,7 +6,7 @@
@@ -15,7 +15,7 @@
android:title="@string/pref_title_timeSetter"
android:summary="@string/pref_description_timeSetter"
android:numeric="integer"
- android:defaultValue="30"
+ android:defaultValue="15"
/>