From 7577277425c2857769f32dd849723bb55721f006 Mon Sep 17 00:00:00 2001 From: Alinson Xavier Date: Fri, 13 Mar 2015 05:41:04 -0400 Subject: [PATCH] Add notification actions (check, snooze) --- res/drawable-hdpi/ic_action_snooze.png | Bin 0 -> 1036 bytes res/drawable-mdpi/ic_action_snooze.png | Bin 0 -> 694 bytes res/drawable-v21/habits_item_check_normal.xml | 22 +++++ .../habits_item_check_pressed.xml | 22 +++++ res/drawable-xhdpi/ic_action_snooze.png | Bin 0 -> 1381 bytes res/drawable-xxhdpi/ic_action_snooze.png | Bin 0 -> 2119 bytes res/drawable/habits_item_check_normal.xml | 2 +- res/drawable/habits_item_check_pressed.xml | 2 +- res/values/strings.xml | 4 +- src/org/isoron/helpers/DateHelper.java | 5 + src/org/isoron/uhabits/MainActivity.java | 57 +++++++---- .../isoron/uhabits/ReminderAlarmReceiver.java | 93 +++++++++++++++--- .../uhabits/dialogs/ShowHabitsFragment.java | 10 +- src/org/isoron/uhabits/models/Habit.java | 17 ++++ 14 files changed, 198 insertions(+), 36 deletions(-) create mode 100644 res/drawable-hdpi/ic_action_snooze.png create mode 100644 res/drawable-mdpi/ic_action_snooze.png create mode 100644 res/drawable-v21/habits_item_check_normal.xml create mode 100644 res/drawable-v21/habits_item_check_pressed.xml create mode 100644 res/drawable-xhdpi/ic_action_snooze.png create mode 100644 res/drawable-xxhdpi/ic_action_snooze.png diff --git a/res/drawable-hdpi/ic_action_snooze.png b/res/drawable-hdpi/ic_action_snooze.png new file mode 100644 index 0000000000000000000000000000000000000000..257274d8a38e5bc66a1b4b611ba72afcd01bd92b GIT binary patch literal 1036 zcmV+n1oQieP)qiZ*WF;tEkY@>mu^^=m1Sw6L_vo3*vuYARAOrVw|$?S z1BXF(XT}-rhdFSW-I;sO`Ofp6d+X{ViYTIpB8tdA#frt^0l$me+uQe7DwQppf;^ke zCNi1Kn~si-DZf0hejH<_v$Hd`VZf8g}Ef-=EXzbe5rH=aovOZ2)u#-y}8 z`M}r|fino1T~#)^v{<&QnjD55E0@Tb#qaInguP-_oF+4Vo~*W( z$u4tyT!d<)Rv^qjFB@h({8)jEwvsL=n)x{fh#~D0;t!e!lPo%Pj1VgCO$(c3=cdNKz(lJYaJIr6K>iJ z%c8&;*V}5!ohM*jbvJUGn z2=DID4)t;vd8egrtya1k@fZoP_qCH1o-Z}O{P6TdjDL-1mezG1`(p6KkaoE2J~!lU zh!x2s91k`1UU|?1So?Uj$4A^Hk9JO+5E3v|Bj88=ag1D$a{6 z1AG?aCNBp5>pOQ|(z06d;){bJ#mlX_h$4z8qKG02nEnButF$FzY&yjN0000w=@y0j@G6l`4{ME$pZ zU-H}Lk@yRG zS4%h+iwz}{$#a|;ck8e*Y8YLG!doc(mC0m=%lE?Ja6d`e`M>b}3i1a!^Bw0q8Zo{H zB{!hOd_Mn>sRi#d=#YFGk)a##e&T%w4s@1Er3d()75|95y3>w>D^!q5r9O~>XOv|S zuRvodE%2uBy(MSQ@Sf%w$XjxBi%z+=jsv5LY*BUnsAzt`-k>dq@0X!a=y6&72jtu> zGay~l%G4)U#;Fj8Pg!%OJ)KTR6xlLL&{pAS39=*QJVpvfzA1o=vbhJkbXAIIH2Q`p z2E|nKQ$}8CTp9Qii9|w`d|_aldV;}VH@gS#`|J>(%RZ(tKhvhvzjl%X{{l*rPJ5PR zy}LK%dZT zRl&+r0d3CUKv+%=*6jdl``qLJ5skeo0ui0kYjU6(hHAE>YCKa-28Q1f>8vwA*W-}I zF*@M1=e7)opq(0-8ekSA+fi|z_sB^jT`77{}HlFJK)1MI87mu<=)2}>b`1ztd=&cXhsWEXtR zT)KA8G@3U!fOt`nbX%^e=9i}F*wA9{bMU~(Z~JG&CblAm)0c*8UXL^E4ib>x)%tC3 ct$Vxf0Oz&ZMTg_U5dZ)H07*qoM6N<$f*c(`=Kufz literal 0 HcmV?d00001 diff --git a/res/drawable-v21/habits_item_check_normal.xml b/res/drawable-v21/habits_item_check_normal.xml new file mode 100644 index 000000000..0a83d0180 --- /dev/null +++ b/res/drawable-v21/habits_item_check_normal.xml @@ -0,0 +1,22 @@ + + + + + + + + + + + + + + \ No newline at end of file diff --git a/res/drawable-v21/habits_item_check_pressed.xml b/res/drawable-v21/habits_item_check_pressed.xml new file mode 100644 index 000000000..8fc26c9e2 --- /dev/null +++ b/res/drawable-v21/habits_item_check_pressed.xml @@ -0,0 +1,22 @@ + + + + + + + + + + + + + + \ No newline at end of file diff --git a/res/drawable-xhdpi/ic_action_snooze.png b/res/drawable-xhdpi/ic_action_snooze.png new file mode 100644 index 0000000000000000000000000000000000000000..951ebdab8ef865ce6147fe32d6fbb8d3955670a3 GIT binary patch literal 1381 zcmV-r1)BPaP)gwtPAaELEgM^x~ z;8CzM5ngE4J&c-X4ReR#;o%)1W?2~DG`sZ+1><84;QuBLKeXY+Oqr)Tf{;IyFcAAE zo*k^mJfBx8l^5{dKFlBH!2A1gzq4AcZmZ`5@c#(LHEXS#@D2MjVIGV3W2{>QeU;DW zpNx684@|xbW|u89*|g^0#aO}hhfw=nHlBfjfro)(&YE)vzs1ydp3)a}ypQ`S?o^EP zy1@VIG2Lj;v=C7WF#@fqASpNq>_A#Ozg^YdEdD=_Pc6XnGjU8&7#P3Nqhp+fkj~P^ zF)q`=)e!{$@6$EP$DKwigbjdyR4g_e{Vn|VCXBp_oK?lbS zFj|j!g_@x{Xl&BgKGnYrApCqgcc4>rQhNxNqd_UlM zwNNNL;oT2RPEI}z#1DzY&kG@E5}MVTnLF_8>S+*+;npa}1hV;R0j z9dqgp5Qd?MfVc{<5ilKYmv}?Nx+@Lss(+s_aLqBRjOO2HBQ^g%!oy@N%`T9tUt$|( z(^O1gqYVLk?rMhZ7Da>F1aX)@pjjJzf+HQr1y8kW1ORn?-Kr{UT_ph8n-IU~kV8C* zdA~QR@LKdmpGg`%o|*ud^a$ZsT(e3r@Ux`}ZzUAKlFZ$gY8Z?X8D@ixx;!mpbW2um zvC=9H+Lvs#2=f^Vmxb_AS3E3p*%#FI8QWq>{0Qb;O+6Dt`Z+BE__9rO?EBX=G_tqY zWCLna7SE+F0QvzbhVHUB^3Zp9M{us!I}l}G0Pp-Q0?TJo5wf){M11P0`7##O`#fce z>lxzN`?Bt8&N`3CBpmu|Mw%YuO@sHSWqLe;zMV<009C72oNAZfH?REttivcrjWjk00000NkvXXu0mjf+&`hh literal 0 HcmV?d00001 diff --git a/res/drawable-xxhdpi/ic_action_snooze.png b/res/drawable-xxhdpi/ic_action_snooze.png new file mode 100644 index 0000000000000000000000000000000000000000..c1b201ceae6a392c854941438860defa793e5280 GIT binary patch literal 2119 zcmV-N2)Or&P)Umga~^Kjg5`(;@jD5c8ywJ zeSQ6tdxH3FZEbHiH#h&ng#V|}?=xYKqqVhl#5)FNh9*cxRT7?vTth8S?V&MoEWmbq zd;7tV$FgdUgCyY*wMmkO1Jy?S*Qm{!6E-H_7uI;_dks5`PmP%oAV{z(Klw+k;M+11tc0yq-}9K@mbKSra! z^-`amnM|gh{`U$9Tug`b?I(DQ8y4nxL_fbMw!bJLNrNBc2}s2Ml?Zrbr#?VTYCZJM z6?iLtYQyM%lYUN9>&JI?A|QE0we-$aA1R&0V#S8~G-;9e1&)Fdw7pwbSN9aS8J>|% zdP-<>kP^Rm1B*n@eFVw0^f46+Nq|U8#K**_b=h<(Yyb#AZP^jgCCRu?KZpGm0xFK4 zS+_{SNTh874KOWnEl<3`rfOgisVx;tNM7JAs2Vi-{eey0S=u^1|Dlbe*=w_n=aWbh zAAY>VIUqiHLho6){s5_~$s#y+h1vv&M!%=1zn3~XI-X{Kz6OSz4fHX3rkm`>m?z5i zYuD51^sCa?V1KB;J5tQz!%UR{3=|FOrlfXkgQW?+xdV~5h?wJ038ff7b~TS8__L{$ zf;12lG+J!gA$tFwFt1e@?kK6AvzDl`+ecMx`gkzIBvH>fWRQI@!cz2G7^}_ar~lP~ z8O(Qxfv!fv9)Oc2&w>7SQ5qoqz1_#t_!goc)L2Q~JOe{2*(qLxL21nN_Y>n#^skI0mI4W_FsB?oLvW;7pUY!YO2oD+=I1xJ0~@~Qw+^_2sp!i(|jBEKO+ z>gPw3lU(Ibyj+U7!)09&?~*ME-d#;>s1Ji=8Z@|~4!LyQ8#p1TayfpaoCPUph|K~J z_n$N;fc;vB#&X**l!rrLpo?+R|5JwUUvnkGymR)S#ia#*CxAF-##n&)I4!_kWAK+< z^^LGUNa^xO@u2ygSQKo*APT;Jufqj6DDfSlfc}7_`HtaCT#ADV z>NV33E)PLqOEauUmA-Y`Sb(qM-~siS8O5L%0F?{K(1x%86sm^UA9EcSw{d=qcEZWwbp8~Ft&oW1h4TrT&%YY&C`{o1k! zzqyb&u9!B{5vSv@0JUMbiChwM-m(ZY<=P!C(hWS~4$2d{7gQ$H%-Nu#+ENPteL49j zVw(SDL?cy>xPvEj#oR9r@_+*ee_MhiT*g`C5}D|l(brOJl5x^rFl-dD;}o&9BE zmo=Q6@Y@pli3gB+5Nat$g8ptgoqmG|^@otIzOb7`fUylD;TI&Jn{SvEWMNbga1w1+ zD5M=IauJed#UJ)FT<$wpBp_oo^jSzwzT8#tQHd+ia*(rqQ>$f`=7R3fh6LZ=ns zAVh1(aS2YxY(oNV`^UV|V|qRhr7G!IfmF^10#|_$hr-TL*<4|^8S}z8^NA`z(x~P9 zH*rSo`AQFtt1PCa@m0-bPV5@4NLLnAU3)dZ>hyHIaqJF6SCt15AR zrEc&FD>mq~B+k~b*BjP2_+;mTC6k&@R5K6^`CQ~N8f3K0vB7|pxGSVf;&?SpDe*zK z&pkq`Nane`z=`(`+AN0(3+?=#AbtVZ-0-^thy$h}c2`RZ++h6q3YrDKD-mK*a21eB zc-cHhU^zTJ%e!AqFxXOJ4C)0{%_t-1y3Xs;1%ajm5I|vXyuf#e_W0c^C**S;@JaVY zoImCR6r06fS;MFGhhvxF3=$~nB?5j9;s$tO(>AUg2=j`}IHoRY*;83`NcdGOZrJIM zSOa^xT;ei}h%<7)(BW*^hvUuOA-8mLsGF=XP diff --git a/res/drawable/habits_item_check_pressed.xml b/res/drawable/habits_item_check_pressed.xml index 8fc26c9e2..887279103 100644 --- a/res/drawable/habits_item_check_pressed.xml +++ b/res/drawable/habits_item_check_pressed.xml @@ -4,7 +4,7 @@ diff --git a/res/values/strings.xml b/res/values/strings.xml index d76b5568b..810e0f446 100644 --- a/res/values/strings.xml +++ b/res/values/strings.xml @@ -41,5 +41,7 @@ - + + + \ No newline at end of file diff --git a/src/org/isoron/helpers/DateHelper.java b/src/org/isoron/helpers/DateHelper.java index c1bd0624f..8f46a9711 100644 --- a/src/org/isoron/helpers/DateHelper.java +++ b/src/org/isoron/helpers/DateHelper.java @@ -20,6 +20,11 @@ public class DateHelper { return (timestamp / millisecondsInOneDay) * millisecondsInOneDay; } + + public static long getStartOfToday() + { + return getStartOfDay(DateHelper.getLocalTime()); + } // public static Date getStartOfDay(Date date) // { diff --git a/src/org/isoron/uhabits/MainActivity.java b/src/org/isoron/uhabits/MainActivity.java index c00a3f266..f10c095ed 100644 --- a/src/org/isoron/uhabits/MainActivity.java +++ b/src/org/isoron/uhabits/MainActivity.java @@ -15,7 +15,9 @@ import android.app.PendingIntent; import android.content.Context; import android.content.Intent; import android.net.Uri; +import android.os.Build; import android.os.Bundle; +import android.util.DisplayMetrics; import android.util.Log; import android.view.Menu; import android.view.MenuItem; @@ -43,44 +45,65 @@ public class MainActivity extends Activity setContentView(R.layout.main_activity); showHabitsFragment = (ShowHabitsFragment) getFragmentManager().findFragmentById( R.id.fragment1); + + Log.d("MainActivity", "Creating activity"); undoList = new LinkedList(); redoList = new LinkedList(); - createReminderAlarms(); + createReminderAlarms(MainActivity.this); + } + + @Override + protected void onStart() + { + super.onStart(); + showHabitsFragment.notifyDataSetChanged(); + Log.d("MainActivity", "Starting activity"); } - public void createReminderAlarms() + public static void createReminderAlarms(Context context) { for(Habit habit : Habit.getHabitsWithReminder()) + createReminderAlarm(context, habit, null); + } + + public static void createReminderAlarm(Context context, Habit habit, Long reminderTime) + { + Uri uri = Uri.parse("content://org.isoron.uhabits/habit/" + habit.getId()); + + if(reminderTime == null) { - 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(); + 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, - ((int)(habit.getId() % Integer.MAX_VALUE)) + 1, - alarmIntent, PendingIntent.FLAG_UPDATE_CURRENT); - - AlarmManager manager = (AlarmManager) getSystemService(Context.ALARM_SERVICE); + } + + Intent alarmIntent = new Intent(context, ReminderAlarmReceiver.class); + alarmIntent.setAction(ReminderAlarmReceiver.ACTION_REMIND); + alarmIntent.setData(uri); + + PendingIntent pendingIntent = PendingIntent.getBroadcast(context, + ((int)(habit.getId() % Integer.MAX_VALUE)) + 1, + alarmIntent, PendingIntent.FLAG_UPDATE_CURRENT); + + AlarmManager manager = (AlarmManager) context.getSystemService(Context.ALARM_SERVICE); + if (Build.VERSION.SDK_INT >= 19) { manager.setExact(AlarmManager.RTC_WAKEUP, reminderTime, pendingIntent); - - Log.d("Alarm", String.format("Setting alarm (%s): %s", DateFormat.getDateTimeInstance() - .format(new Date(reminderTime)), habit.name)); + } else { + manager.set(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/ReminderAlarmReceiver.java b/src/org/isoron/uhabits/ReminderAlarmReceiver.java index acf1578b7..ab0ee593b 100644 --- a/src/org/isoron/uhabits/ReminderAlarmReceiver.java +++ b/src/org/isoron/uhabits/ReminderAlarmReceiver.java @@ -1,11 +1,12 @@ package org.isoron.uhabits; +import java.util.Date; import java.util.List; -import org.isoron.helpers.DateHelper; 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; @@ -20,22 +21,77 @@ import android.util.Log; public class ReminderAlarmReceiver extends BroadcastReceiver { + + public static String ACTION_CHECK = "org.isoron.uhabits.ACTION_CHECK"; + public static String ACTION_DISMISS = "org.isoron.uhabits.ACTION_DISMISS"; + public static String ACTION_REMIND = "org.isoron.uhabits.ACTION_REMIND"; + public static String ACTION_REMOVE_REMINDER = "org.isoron.uhabits.ACTION_REMOVE_REMINDER"; + public static String ACTION_SNOOZE = "org.isoron.uhabits.ACTION_SNOOZE"; + @Override public void onReceive(Context context, Intent intent) { - createNotification(context, intent.getData(), intent.getDataString()); + String action = intent.getAction(); + + if(action.equals(ACTION_REMIND)) + createNotification(context, intent.getData()); + + else if(action.equals(ACTION_DISMISS)) + dismissAllHabits(); + + else if(action.equals(ACTION_CHECK)) + checkHabit(context, intent.getData()); + + else if(action.equals(ACTION_SNOOZE)) + snoozeHabit(context, intent.getData()); + } + + private void snoozeHabit(Context context, Uri data) + { + int delayMinutes = 15; + Habit habit = Habit.get(ContentUris.parseId(data)); + MainActivity.createReminderAlarm(context, habit, new Date().getTime() + delayMinutes * 1000); + dismissNotification(context); + } + + private void checkHabit(Context context, Uri data) + { + Habit habit = Habit.get(ContentUris.parseId(data)); + habit.toggleRepetitionToday(); + habit.save(); + dismissNotification(context); + } + + private void dismissAllHabits() + { + for(Habit h : Habit.getHighlightedHabits()) + { + Log.d("Alarm", String.format("Removing highlight from: %s", h.name)); + h.highlight = 0; + h.save(); + } + } + + private void dismissNotification(Context context) + { + NotificationManager notificationManager = (NotificationManager) context + .getSystemService(Activity.NOTIFICATION_SERVICE); + + notificationManager.cancel(1); } - private void createNotification(Context context, Uri data, String text) + private void createNotification(Context context, Uri data) { 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()))) + if(habit.hasImplicitRepToday()) + { + Log.d("Alarm", String.format("(%s) has implicit rep today", habit.name)); return; + } Log.d("Alarm", String.format("Applying highlight: %s", habit.name)); habit.highlight = 1; @@ -49,27 +105,38 @@ public class ReminderAlarmReceiver extends BroadcastReceiver contentIntent.setData(data); PendingIntent contentPendingIntent = PendingIntent.getActivity(context, 0, contentIntent, 0); - Intent deleteIntent = new Intent(context, ReminderAlarmDismissReceiver.class); + Intent deleteIntent = new Intent(context, ReminderAlarmReceiver.class); + deleteIntent.setAction(ACTION_DISMISS); PendingIntent deletePendingIntent = PendingIntent.getBroadcast(context, 0, deleteIntent, 0); + Intent checkIntent = new Intent(context, ReminderAlarmReceiver.class); + checkIntent.setData(data); + checkIntent.setAction(ACTION_CHECK); + PendingIntent checkIntentPending = PendingIntent.getBroadcast(context, 0, checkIntent, 0); + + Intent snoozeIntent = new Intent(context, ReminderAlarmReceiver.class); + snoozeIntent.setData(data); + snoozeIntent.setAction(ACTION_SNOOZE); + PendingIntent snoozeIntentPending = PendingIntent.getBroadcast(context, 0, snoozeIntent, 0); + Uri soundUri = RingtoneManager.getDefaultUri(RingtoneManager.TYPE_NOTIFICATION); NotificationCompat.InboxStyle inboxStyle = new NotificationCompat.InboxStyle(); inboxStyle.setBigContentTitle("Habit Reminder:"); List pendingHabits = Habit.getHighlightedHabits(); + StringBuffer contentText = new StringBuffer(); for(Habit h : pendingHabits) { - if(h.hasRep(DateHelper.getStartOfDay(DateHelper.getLocalTime()))) + if(h.hasImplicitRepToday()) continue; + inboxStyle.addLine(h.name); + if(contentText.length() > 0) + contentText.append(", "); + contentText.append(h.name); Log.d("Alarm", String.format("Found highlighted: %s", h.name)); } - String contentText = habit.name; - if(pendingHabits.size() > 1) { - contentText = String.format("%d pending habits.", pendingHabits.size()); - } - Notification notification = new NotificationCompat.Builder(context) .setSmallIcon(R.drawable.ic_notification) @@ -77,6 +144,8 @@ public class ReminderAlarmReceiver extends BroadcastReceiver .setContentText(contentText) .setContentIntent(contentPendingIntent) .setDeleteIntent(deletePendingIntent) + .addAction(R.drawable.ic_action_check, "Check", checkIntentPending) + .addAction(R.drawable.ic_action_snooze, "Later", snoozeIntentPending) .setSound(soundUri) .setStyle(inboxStyle) .build(); diff --git a/src/org/isoron/uhabits/dialogs/ShowHabitsFragment.java b/src/org/isoron/uhabits/dialogs/ShowHabitsFragment.java index ca6eadc6c..36dbed355 100644 --- a/src/org/isoron/uhabits/dialogs/ShowHabitsFragment.java +++ b/src/org/isoron/uhabits/dialogs/ShowHabitsFragment.java @@ -46,7 +46,7 @@ import com.mobeta.android.dslv.DragSortListView.DropListener; public class ShowHabitsFragment extends Fragment implements OnSavedListener, OnItemClickListener, OnLongClickListener, DropListener { - + private int tvNameWidth; private int button_count; ShowHabitsAdapter adapter; @@ -102,8 +102,8 @@ public class ShowHabitsFragment extends Fragment implements OnSavedListener, OnI public View getView(int position, View view, ViewGroup parent) { final Habit habit = (Habit) getItem(position); - - if(view == null) + + if(view == null || (Long) view.getTag(R.id.KEY_TIMESTAMP) != DateHelper.getStartOfToday()) { view = inflater.inflate(R.layout.show_habits_item, null); ((TextView) view.findViewById(R.id.tvStar)).setTypeface(fontawesome); @@ -125,6 +125,8 @@ public class ShowHabitsFragment extends Fragment implements OnSavedListener, OnI btCheck.setOnLongClickListener(ShowHabitsFragment.this); ((LinearLayout) view.findViewById(R.id.llButtons)).addView(check); } + + view.setTag(R.id.KEY_TIMESTAMP, DateHelper.getStartOfToday()); } TextView tvStar = (TextView) view.findViewById(R.id.tvStar); @@ -312,7 +314,7 @@ public class ShowHabitsFragment extends Fragment implements OnSavedListener, OnI public void onSaved(Command command) { executeCommand(command); - mainActivity.createReminderAlarms(); + MainActivity.createReminderAlarms(mainActivity); } public void notifyDataSetChanged() diff --git a/src/org/isoron/uhabits/models/Habit.java b/src/org/isoron/uhabits/models/Habit.java index 8b9d1006f..227ee88a7 100644 --- a/src/org/isoron/uhabits/models/Habit.java +++ b/src/org/isoron/uhabits/models/Habit.java @@ -276,6 +276,11 @@ public class Habit extends Model int count = selectReps().where("timestamp = ?", timestamp).count(); return (count > 0); } + + public boolean hasRepToday() + { + return hasRep(DateHelper.getStartOfToday()); + } public void deleteReps(long timestamp) { @@ -318,6 +323,13 @@ public class Habit extends Model return check; } + + public boolean hasImplicitRepToday() + { + long today = DateHelper.getStartOfToday(); + int reps[] = getReps(today - DateHelper.millisecondsInOneDay, today); + return (reps[0] > 0); + } public Repetition getOldestRep() { @@ -340,6 +352,11 @@ public class Habit extends Model deleteScoresNewerThan(timestamp); } + + public void toggleRepetitionToday() + { + toggleRepetition(DateHelper.getStartOfToday()); + } /* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * Scoring *