Skip to content

Commit

Permalink
Added in-time notifications
Browse files Browse the repository at this point in the history
  • Loading branch information
GoneUp committed Nov 13, 2015
1 parent f09a0a7 commit 2d6fc46
Show file tree
Hide file tree
Showing 12 changed files with 198 additions and 81 deletions.
Binary file removed app/app-rel_1.apk
Binary file not shown.
45 changes: 18 additions & 27 deletions app/app.iml
Original file line number Diff line number Diff line change
Expand Up @@ -8,15 +8,12 @@
</facet>
<facet type="android" name="Android">
<configuration>
<option name="SELECTED_BUILD_VARIANT" value="debug" />
<option name="SELECTED_BUILD_VARIANT" value="release" />
<option name="SELECTED_TEST_ARTIFACT" value="_android_test_" />
<option name="ASSEMBLE_TASK_NAME" value="assembleDebug" />
<option name="COMPILE_JAVA_TASK_NAME" value="compileDebugSources" />
<option name="ASSEMBLE_TEST_TASK_NAME" value="assembleDebugAndroidTest" />
<option name="COMPILE_JAVA_TEST_TASK_NAME" value="compileDebugAndroidTestSources" />
<option name="ASSEMBLE_TASK_NAME" value="assembleRelease" />
<option name="COMPILE_JAVA_TASK_NAME" value="compileReleaseSources" />
<afterSyncTasks>
<task>generateDebugAndroidTestSources</task>
<task>generateDebugSources</task>
<task>generateReleaseSources</task>
</afterSyncTasks>
<option name="ALLOW_USER_CONFIGURATION" value="false" />
<option name="MANIFEST_FILE_RELATIVE_PATH" value="/src/main/AndroidManifest.xml" />
Expand All @@ -27,29 +24,23 @@
</facet>
</component>
<component name="NewModuleRootManager" LANGUAGE_LEVEL="JDK_1_7" inherit-compiler-output="false">
<output url="file://$MODULE_DIR$/build/intermediates/classes/debug" />
<output url="file://$MODULE_DIR$/build/intermediates/classes/release" />
<output-test url="file://$MODULE_DIR$/build/intermediates/classes/androidTest/debug" />
<exclude-output />
<content url="file://$MODULE_DIR$">
<sourceFolder url="file://$MODULE_DIR$/build/generated/source/r/debug" isTestSource="false" generated="true" />
<sourceFolder url="file://$MODULE_DIR$/build/generated/source/aidl/debug" isTestSource="false" generated="true" />
<sourceFolder url="file://$MODULE_DIR$/build/generated/source/buildConfig/debug" isTestSource="false" generated="true" />
<sourceFolder url="file://$MODULE_DIR$/build/generated/source/rs/debug" isTestSource="false" generated="true" />
<sourceFolder url="file://$MODULE_DIR$/build/generated/res/rs/debug" type="java-resource" />
<sourceFolder url="file://$MODULE_DIR$/build/generated/res/resValues/debug" type="java-resource" />
<sourceFolder url="file://$MODULE_DIR$/build/generated/source/r/androidTest/debug" isTestSource="true" generated="true" />
<sourceFolder url="file://$MODULE_DIR$/build/generated/source/aidl/androidTest/debug" isTestSource="true" generated="true" />
<sourceFolder url="file://$MODULE_DIR$/build/generated/source/buildConfig/androidTest/debug" isTestSource="true" generated="true" />
<sourceFolder url="file://$MODULE_DIR$/build/generated/source/rs/androidTest/debug" isTestSource="true" generated="true" />
<sourceFolder url="file://$MODULE_DIR$/build/generated/res/rs/androidTest/debug" type="java-test-resource" />
<sourceFolder url="file://$MODULE_DIR$/build/generated/res/resValues/androidTest/debug" type="java-test-resource" />
<sourceFolder url="file://$MODULE_DIR$/src/debug/res" type="java-resource" />
<sourceFolder url="file://$MODULE_DIR$/src/debug/resources" type="java-resource" />
<sourceFolder url="file://$MODULE_DIR$/src/debug/assets" type="java-resource" />
<sourceFolder url="file://$MODULE_DIR$/src/debug/aidl" isTestSource="false" />
<sourceFolder url="file://$MODULE_DIR$/src/debug/java" isTestSource="false" />
<sourceFolder url="file://$MODULE_DIR$/src/debug/jni" isTestSource="false" />
<sourceFolder url="file://$MODULE_DIR$/src/debug/rs" isTestSource="false" />
<sourceFolder url="file://$MODULE_DIR$/build/generated/source/r/release" isTestSource="false" generated="true" />
<sourceFolder url="file://$MODULE_DIR$/build/generated/source/aidl/release" isTestSource="false" generated="true" />
<sourceFolder url="file://$MODULE_DIR$/build/generated/source/buildConfig/release" isTestSource="false" generated="true" />
<sourceFolder url="file://$MODULE_DIR$/build/generated/source/rs/release" isTestSource="false" generated="true" />
<sourceFolder url="file://$MODULE_DIR$/build/generated/res/rs/release" type="java-resource" />
<sourceFolder url="file://$MODULE_DIR$/build/generated/res/resValues/release" type="java-resource" />
<sourceFolder url="file://$MODULE_DIR$/src/release/res" type="java-resource" />
<sourceFolder url="file://$MODULE_DIR$/src/release/resources" type="java-resource" />
<sourceFolder url="file://$MODULE_DIR$/src/release/assets" type="java-resource" />
<sourceFolder url="file://$MODULE_DIR$/src/release/aidl" isTestSource="false" />
<sourceFolder url="file://$MODULE_DIR$/src/release/java" isTestSource="false" />
<sourceFolder url="file://$MODULE_DIR$/src/release/jni" isTestSource="false" />
<sourceFolder url="file://$MODULE_DIR$/src/release/rs" isTestSource="false" />
<sourceFolder url="file://$MODULE_DIR$/src/main/res" type="java-resource" />
<sourceFolder url="file://$MODULE_DIR$/src/main/resources" type="java-resource" />
<sourceFolder url="file://$MODULE_DIR$/src/main/assets" type="java-resource" />
Expand Down
10 changes: 10 additions & 0 deletions app/src/main/AndroidManifest.xml
Original file line number Diff line number Diff line change
Expand Up @@ -3,6 +3,8 @@
package="com.hstrobel.lsfplan">

<uses-permission android:name="android.permission.INTERNET" />
<uses-permission android:name="com.android.alarm.permission.SET_ALARM"/>
<uses-permission android:name="android.permission.RECEIVE_BOOT_COMPLETED"/>

<application
android:allowBackup="true"
Expand Down Expand Up @@ -38,6 +40,14 @@
android:value="com.hstrobel.lsfplan.MainActivity" />
/>
</activity>

<receiver android:name=".classes.AlarmReceiver"/>
<receiver android:name=".classes.BootReceiver"
android:enabled="false">
<intent-filter>
<action android:name="android.intent.action.BOOT_COMPLETED"></action>
</intent-filter>
</receiver>
</application>

</manifest>
16 changes: 6 additions & 10 deletions app/src/main/java/com/hstrobel/lsfplan/MainActivity.java
Original file line number Diff line number Diff line change
@@ -1,22 +1,26 @@
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;
import android.view.Menu;
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;

import net.fortuna.ical4j.model.component.VEvent;

import org.apache.commons.lang.exception.ExceptionUtils;

import java.util.Collection;
import java.util.List;

public class MainActivity extends ActionBarActivity {
Expand Down Expand Up @@ -86,7 +90,7 @@ protected void onResume() {
//present --> show info

try {
Globals.InitCalender(this);
Globals.InitCalender(this, true);


if (Globals.myCal == null) {
Expand All @@ -104,14 +108,6 @@ protected void onResume() {
transaction.replace(R.id.mainDefaultFragment, new MainListFragment(), "list");
transaction.commit();
}
/*
Collection<VEvent> 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());
*/
}


Expand Down
12 changes: 9 additions & 3 deletions app/src/main/java/com/hstrobel/lsfplan/UserSettings.java
Original file line number Diff line number Diff line change
Expand Up @@ -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 {

Expand Down Expand Up @@ -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));
Expand Down
16 changes: 2 additions & 14 deletions app/src/main/java/com/hstrobel/lsfplan/WebSelector.java
Original file line number Diff line number Diff line change
@@ -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 {
Expand Down
74 changes: 74 additions & 0 deletions app/src/main/java/com/hstrobel/lsfplan/classes/AlarmReceiver.java
Original file line number Diff line number Diff line change
@@ -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<VEvent> 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));

}
}
26 changes: 26 additions & 0 deletions app/src/main/java/com/hstrobel/lsfplan/classes/BootReceiver.java
Original file line number Diff line number Diff line change
@@ -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));
}

}
}
}
Original file line number Diff line number Diff line change
@@ -1,11 +1,14 @@
package com.hstrobel.lsfplan;
package com.hstrobel.lsfplan.classes;

import android.app.NotificationManager;
import android.app.PendingIntent;
import android.content.Context;
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;
Expand All @@ -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) {
Expand All @@ -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));
Expand Down Expand Up @@ -85,7 +83,7 @@ public static List<VEvent> GetNextEvent(Calendar myCal) {
DateTime starttR = null;
List<VEvent> toReturn = new ArrayList<VEvent>();

List events = GetEventsNext24h(myCal);
List events = GetEventsNextWeek(myCal);
for (Object comp : events) {
if (!(comp instanceof VEvent)) continue;

Expand Down Expand Up @@ -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);


Expand Down
Loading

0 comments on commit 2d6fc46

Please sign in to comment.