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 @@ - - + - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + 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" />