diff --git a/AndroidManifest.xml b/AndroidManifest.xml
index c2bdf6a03..107ee741b 100644
--- a/AndroidManifest.xml
+++ b/AndroidManifest.xml
@@ -6,7 +6,7 @@
+ android:targetSdkVersion="22" />
-
+
diff --git a/libs/android-support-v4.jar b/libs/android-support-v4.jar
index 187bdf48b..1437d24e6 100644
Binary files a/libs/android-support-v4.jar and b/libs/android-support-v4.jar differ
diff --git a/project.properties b/project.properties
index ce39f2d0a..00cf62bac 100644
--- a/project.properties
+++ b/project.properties
@@ -11,4 +11,4 @@
#proguard.config=${sdk.dir}/tools/proguard/proguard-android.txt:proguard-project.txt
# Project target.
-target=android-18
+target=android-22
diff --git a/src/org/isoron/uhabits/MainActivity.java b/src/org/isoron/uhabits/MainActivity.java
index 76832e360..f9c4e0feb 100644
--- a/src/org/isoron/uhabits/MainActivity.java
+++ b/src/org/isoron/uhabits/MainActivity.java
@@ -1,22 +1,22 @@
package org.isoron.uhabits;
+import java.text.DateFormat;
+import java.util.Calendar;
+import java.util.Date;
import java.util.LinkedList;
import org.isoron.helpers.Command;
import org.isoron.uhabits.dialogs.ShowHabitsFragment;
+import org.isoron.uhabits.models.Habit;
import android.app.Activity;
import android.app.AlarmManager;
-import android.app.Notification;
-import android.app.NotificationManager;
import android.app.PendingIntent;
import android.content.Context;
import android.content.Intent;
-import android.media.RingtoneManager;
import android.net.Uri;
import android.os.Bundle;
-import android.os.SystemClock;
-import android.support.v4.app.NotificationCompat;
+import android.util.Log;
import android.view.Menu;
import android.view.MenuItem;
import android.widget.Toast;
@@ -39,8 +39,7 @@ public class MainActivity extends Activity
protected void onCreate(Bundle savedInstanceState)
{
super.onCreate(savedInstanceState);
- // Habit.rebuildOrder();
- // Habit.roundTimestamps();
+
setContentView(R.layout.main_activity);
showHabitsFragment = (ShowHabitsFragment) getFragmentManager().findFragmentById(
R.id.fragment1);
@@ -48,23 +47,39 @@ public class MainActivity extends Activity
undoList = new LinkedList();
redoList = new LinkedList();
-// startAlarm("http://hello-world.com/", 5);
-// startAlarm("http://ola-mundo.com.br/", 10);
+ createReminderAlarms();
}
- private void startAlarm(String data, int interval)
+ public void createReminderAlarms()
{
- Intent alarmIntent = new Intent(MainActivity.this, AlarmReceiver.class);
- alarmIntent.setData(Uri.parse(data));
-
- PendingIntent pendingIntent = PendingIntent.getBroadcast(MainActivity.this, 0, alarmIntent, 0);
-
- AlarmManager manager = (AlarmManager) getSystemService(Context.ALARM_SERVICE);
- manager.set(AlarmManager.ELAPSED_REALTIME_WAKEUP,
- SystemClock.elapsedRealtime() +
- interval * 1000, pendingIntent);
-
- Toast.makeText(this, "Alarm Set", Toast.LENGTH_SHORT).show();
+ for(Habit habit : Habit.getHabitsWithReminder())
+ {
+ Uri uri = Uri.parse("content://org.isoron.uhabits/habit/" + habit.getId());
+
+ Calendar calendar = Calendar.getInstance();
+ calendar.setTimeInMillis(System.currentTimeMillis());
+ calendar.set(Calendar.HOUR_OF_DAY, habit.reminder_hour);
+ calendar.set(Calendar.MINUTE, habit.reminder_min);
+ calendar.set(Calendar.SECOND, 0);
+
+ long reminderTime = calendar.getTimeInMillis();
+
+ if(System.currentTimeMillis() > reminderTime) {
+ reminderTime += AlarmManager.INTERVAL_DAY;
+ }
+
+ Intent alarmIntent = new Intent(MainActivity.this, ReminderAlarmReceiver.class);
+ alarmIntent.setData(uri);
+
+ PendingIntent pendingIntent = PendingIntent.getBroadcast(MainActivity.this, 100,
+ alarmIntent, PendingIntent.FLAG_UPDATE_CURRENT);
+
+ AlarmManager manager = (AlarmManager) getSystemService(Context.ALARM_SERVICE);
+ manager.setExact(AlarmManager.RTC_WAKEUP, reminderTime, pendingIntent);
+
+ Log.d("Alarm", String.format("Setting alarm (%s): %s", DateFormat.getDateTimeInstance()
+ .format(new Date(reminderTime)), habit.name));
+ }
}
/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
diff --git a/src/org/isoron/uhabits/AlarmReceiver.java b/src/org/isoron/uhabits/ReminderAlarmReceiver.java
similarity index 64%
rename from src/org/isoron/uhabits/AlarmReceiver.java
rename to src/org/isoron/uhabits/ReminderAlarmReceiver.java
index 0c3c9ff02..1c992a9cf 100644
--- a/src/org/isoron/uhabits/AlarmReceiver.java
+++ b/src/org/isoron/uhabits/ReminderAlarmReceiver.java
@@ -1,20 +1,23 @@
package org.isoron.uhabits;
+import org.isoron.helpers.DateHelper;
+import org.isoron.uhabits.models.Habit;
+
import android.app.Activity;
import android.app.Notification;
import android.app.NotificationManager;
import android.app.PendingIntent;
import android.content.BroadcastReceiver;
+import android.content.ContentUris;
import android.content.Context;
import android.content.Intent;
import android.media.RingtoneManager;
import android.net.Uri;
import android.support.v4.app.NotificationCompat;
+import android.util.Log;
-public class AlarmReceiver extends BroadcastReceiver
+public class ReminderAlarmReceiver extends BroadcastReceiver
{
- static int k = 1;
-
@Override
public void onReceive(Context context, Intent intent)
{
@@ -24,6 +27,17 @@ public class AlarmReceiver extends BroadcastReceiver
private void createNotification(Context context, Uri data, String text)
{
+ Log.d("Alarm", "Alarm received!");
+ Habit habit = Habit.get(ContentUris.parseId(data));
+
+ // Check if user already did the habit repetition
+ if(habit.hasRep(DateHelper.getStartOfDay(DateHelper.getLocalTime())))
+ return;
+
+ // Check if reminder has been turned off after alarm was scheduled
+ if(habit.reminder_hour == null)
+ return;
+
Intent resultIntent = new Intent(context, MainActivity.class);
resultIntent.setData(data);
@@ -35,15 +49,17 @@ public class AlarmReceiver extends BroadcastReceiver
new NotificationCompat.Builder(context)
.setSmallIcon(R.drawable.ic_notification)
.setContentTitle("Habit Reminder")
- .setContentText(text)
+ .setContentText(habit.name)
.setContentIntent(notificationIntent)
.setSound(soundUri)
.build();
notification.flags = Notification.FLAG_AUTO_CANCEL;
- NotificationManager notificationManager = (NotificationManager) context.getSystemService(Activity.NOTIFICATION_SERVICE);
- notificationManager.notify(k++, notification);
+ NotificationManager notificationManager = (NotificationManager) context
+ .getSystemService(Activity.NOTIFICATION_SERVICE);
+
+ notificationManager.notify(0, notification);
}
}
diff --git a/src/org/isoron/uhabits/dialogs/ShowHabitsFragment.java b/src/org/isoron/uhabits/dialogs/ShowHabitsFragment.java
index 49bb5f798..ca6eadc6c 100644
--- a/src/org/isoron/uhabits/dialogs/ShowHabitsFragment.java
+++ b/src/org/isoron/uhabits/dialogs/ShowHabitsFragment.java
@@ -1,6 +1,5 @@
package org.isoron.uhabits.dialogs;
-import java.util.Date;
import java.util.GregorianCalendar;
import java.util.Locale;
import java.util.TimeZone;
@@ -20,7 +19,6 @@ import android.graphics.Typeface;
import android.os.Bundle;
import android.os.Vibrator;
import android.util.DisplayMetrics;
-import android.util.Log;
import android.view.ContextMenu;
import android.view.ContextMenu.ContextMenuInfo;
import android.view.Display;
@@ -53,6 +51,7 @@ public class ShowHabitsFragment extends Fragment implements OnSavedListener, OnI
private int button_count;
ShowHabitsAdapter adapter;
DragSortListView listView;
+ MainActivity mainActivity;
/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
* Adapter *
@@ -245,6 +244,8 @@ public class ShowHabitsFragment extends Fragment implements OnSavedListener, OnI
day.add(GregorianCalendar.DAY_OF_MONTH, -1);
}
+
+ mainActivity = (MainActivity) getActivity();
setHasOptionsMenu(true);
return view;
@@ -311,6 +312,7 @@ public class ShowHabitsFragment extends Fragment implements OnSavedListener, OnI
public void onSaved(Command command)
{
executeCommand(command);
+ mainActivity.createReminderAlarms();
}
public void notifyDataSetChanged()
@@ -344,7 +346,7 @@ public class ShowHabitsFragment extends Fragment implements OnSavedListener, OnI
private void executeCommand(Command c)
{
- ((MainActivity) getActivity()).executeCommand(c, false);
+ mainActivity.executeCommand(c, false);
adapter.notifyDataSetChanged();
}
diff --git a/src/org/isoron/uhabits/models/Habit.java b/src/org/isoron/uhabits/models/Habit.java
index 35c33417e..c7984e711 100644
--- a/src/org/isoron/uhabits/models/Habit.java
+++ b/src/org/isoron/uhabits/models/Habit.java
@@ -1,6 +1,5 @@
package org.isoron.uhabits.models;
-import java.util.Date;
import java.util.List;
import org.isoron.helpers.Command;
@@ -9,7 +8,6 @@ import org.isoron.uhabits.R;
import android.annotation.SuppressLint;
import android.graphics.Color;
-import android.util.Log;
import com.activeandroid.Model;
import com.activeandroid.annotation.Column;
@@ -236,6 +234,17 @@ public class Habit extends Model
{
return select().offset(position).executeSingle();
}
+
+ public static java.util.List getHabits()
+ {
+ return select().execute();
+ }
+
+ public static java.util.List getHabitsWithReminder()
+ {
+ return select().where("reminder_hour is not null").execute();
+ }
+
/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
* Repetitions *