From c895d2510fd54a22162524f514fed243c1fa9cee Mon Sep 17 00:00:00 2001 From: auricgoldfinger Date: Wed, 7 Sep 2016 17:06:43 +0200 Subject: [PATCH 1/6] Add inbox style + contact age --- .../alexstyl/specialdates/util/Notifier.java | 42 +++++++++++++++++-- mobile/src/main/res/values/strings.xml | 1 + 2 files changed, 40 insertions(+), 3 deletions(-) diff --git a/mobile/src/main/java/com/alexstyl/specialdates/util/Notifier.java b/mobile/src/main/java/com/alexstyl/specialdates/util/Notifier.java index f465bb8b..c4877b9c 100644 --- a/mobile/src/main/java/com/alexstyl/specialdates/util/Notifier.java +++ b/mobile/src/main/java/com/alexstyl/specialdates/util/Notifier.java @@ -16,7 +16,10 @@ import android.graphics.RectF; import android.net.Uri; import android.support.v4.app.NotificationCompat; +import android.text.Spannable; +import android.text.SpannableString; import android.text.TextUtils; +import android.text.style.StyleSpan; import com.alexstyl.specialdates.R; import com.alexstyl.specialdates.contact.Contact; @@ -29,6 +32,7 @@ import com.alexstyl.specialdates.settings.MainPreferenceActivity; import com.novoda.notils.logger.simple.Log; +import java.security.InvalidParameterException; import java.util.List; public class Notifier { @@ -89,19 +93,51 @@ public void forDailyReminder(ContactEvents events) { ); String title = NaturalLanguageUtils.joinContacts(context, events.getContacts(), 3); - String fullText = TextUtils.join(", ", events.getContacts()); NotificationCompat.Builder builder = new NotificationCompat.Builder(context) .setSmallIcon(R.drawable.ic_stat_contact_event) .setContentTitle(title) .setLargeIcon(largeIcon) - .setStyle(new NotificationCompat.BigTextStyle().bigText(fullText)) .setVisibility(NotificationCompat.VISIBILITY_PRIVATE) .setAutoCancel(true) - .setContentText(fullText) .setContentIntent(intent) .setColor(context.getResources().getColor(R.color.main_red)); + // if event.getContacts() > 1 then use InboxStyle, otherwise the BigTextStyle like here: + if (events.getContacts().size() == 1) { + int age = events.getContacts().get(0).getBirthday().getAgeOnYear(events.getDate().getYear()); + String msg = context.getString(R.string.turns_age, age); + + NotificationCompat.BigTextStyle bigTextStyle = new NotificationCompat.BigTextStyle().bigText(msg); + bigTextStyle.setBigContentTitle(title); + builder.setContentText(msg); + + builder.setStyle(bigTextStyle); + + } else if (events.getContacts().size() > 1) { + final NotificationCompat.InboxStyle inboxStyle = new NotificationCompat.InboxStyle(); + + inboxStyle.setBigContentTitle(title); + for (Contact contact : events.getContacts()) { + + String name = contact.getDisplayName().toString(); + int age = contact.getBirthday().getAgeOnYear(events.getDate().getYear()); + + String lineFormat = context.getString(R.string.age_today); + int lineParamStartPos = lineFormat.indexOf("%1$s"); + if (lineParamStartPos < 0) { + throw new InvalidParameterException("Something's wrong with your string! LINT could have caught that."); + } + String lineFormatted = context.getString(R.string.age_today, name, age); + + Spannable sb = new SpannableString(lineFormatted); + sb.setSpan(new StyleSpan(android.graphics.Typeface.BOLD), lineParamStartPos, lineParamStartPos + name.length(), Spannable.SPAN_EXCLUSIVE_EXCLUSIVE); + inboxStyle.addLine(sb); + } + + builder.setStyle(inboxStyle); + } + if (supportsPublicNotifications()) { String publicTitle = context.getString(R.string.contact_celebration_count, contactCount); NotificationCompat.Builder publicNotification = new NotificationCompat.Builder(context) diff --git a/mobile/src/main/res/values/strings.xml b/mobile/src/main/res/values/strings.xml index 50e5203d..484a11d3 100644 --- a/mobile/src/main/res/values/strings.xml +++ b/mobile/src/main/res/values/strings.xml @@ -19,6 +19,7 @@ %1$s %1$s and %2$s %1$s and %2$d others + %1$s %2$d today About Daily Reminder Service Display Name Days From 95d13f21f5c32c004a6cfc5e040a0d2f0e738ef3 Mon Sep 17 00:00:00 2001 From: auricgoldfinger Date: Wed, 7 Sep 2016 20:53:01 +0200 Subject: [PATCH 2/6] Add number of birthdays --- .../specialdates/settings/DailyReminderFragment.java | 7 +++++++ .../main/java/com/alexstyl/specialdates/util/Notifier.java | 4 +++- mobile/src/main/res/values/strings.xml | 2 +- secret.gradle | 1 - 4 files changed, 11 insertions(+), 3 deletions(-) diff --git a/mobile/src/main/java/com/alexstyl/specialdates/settings/DailyReminderFragment.java b/mobile/src/main/java/com/alexstyl/specialdates/settings/DailyReminderFragment.java index e0d3cee5..fc8b57c8 100644 --- a/mobile/src/main/java/com/alexstyl/specialdates/settings/DailyReminderFragment.java +++ b/mobile/src/main/java/com/alexstyl/specialdates/settings/DailyReminderFragment.java @@ -19,6 +19,7 @@ import com.alexstyl.specialdates.analytics.Analytics; import com.alexstyl.specialdates.analytics.ActionWithParameters; import com.alexstyl.specialdates.analytics.Firebase; +import com.alexstyl.specialdates.receiver.EventReceiver; import com.alexstyl.specialdates.service.DailyReminderIntentService; import com.alexstyl.specialdates.ui.widget.TimePreference; import com.alexstyl.specialdates.util.Utils; @@ -52,6 +53,12 @@ public boolean onPreferenceChange(Preference preference, Object newValue) { ActionWithParameters event = new ActionWithParameters(Action.DAILY_REMINDER, "enabled", isChecked); analytics.trackAction(event); if (isChecked) { + + // TODO DEBUG + Intent myIntent = new Intent(context, EventReceiver.class); + myIntent.setAction(EventReceiver.ACTION_START_DAILYREMINDER); + context.sendBroadcast(myIntent); + DailyReminderIntentService.rescheduleAlarm(context); } else { DailyReminderIntentService.cancelAlarm(context); diff --git a/mobile/src/main/java/com/alexstyl/specialdates/util/Notifier.java b/mobile/src/main/java/com/alexstyl/specialdates/util/Notifier.java index c4877b9c..457b4f6a 100644 --- a/mobile/src/main/java/com/alexstyl/specialdates/util/Notifier.java +++ b/mobile/src/main/java/com/alexstyl/specialdates/util/Notifier.java @@ -101,6 +101,7 @@ public void forDailyReminder(ContactEvents events) { .setVisibility(NotificationCompat.VISIBILITY_PRIVATE) .setAutoCancel(true) .setContentIntent(intent) + .setNumber(events.getContactCount()) .setColor(context.getResources().getColor(R.color.main_red)); // if event.getContacts() > 1 then use InboxStyle, otherwise the BigTextStyle like here: @@ -126,7 +127,7 @@ public void forDailyReminder(ContactEvents events) { String lineFormat = context.getString(R.string.age_today); int lineParamStartPos = lineFormat.indexOf("%1$s"); if (lineParamStartPos < 0) { - throw new InvalidParameterException("Something's wrong with your string! LINT could have caught that."); + throw new InvalidParameterException(); } String lineFormatted = context.getString(R.string.age_today, name, age); @@ -136,6 +137,7 @@ public void forDailyReminder(ContactEvents events) { } builder.setStyle(inboxStyle); + builder.setContentText(TextUtils.join(", ", events.getContacts())); } if (supportsPublicNotifications()) { diff --git a/mobile/src/main/res/values/strings.xml b/mobile/src/main/res/values/strings.xml index 484a11d3..1d28c196 100644 --- a/mobile/src/main/res/values/strings.xml +++ b/mobile/src/main/res/values/strings.xml @@ -19,7 +19,7 @@ %1$s %1$s and %2$s %1$s and %2$d others - %1$s %2$d today + %1$s %2$d today About Daily Reminder Service Display Name Days diff --git a/secret.gradle b/secret.gradle index e245e07b..6cb95b61 100644 --- a/secret.gradle +++ b/secret.gradle @@ -1,5 +1,4 @@ ext { - // Replace the existing values with your own unique keys crashlyticsKey = "1234567890123456789012345678901234567890" androidVendingKey = "Include your vending key here" From 31d07c6470b5f723cb237c1866e20711cfba25e5 Mon Sep 17 00:00:00 2001 From: auricgoldfinger Date: Wed, 7 Sep 2016 20:53:29 +0200 Subject: [PATCH 3/6] Removed debug code --- .../specialdates/settings/DailyReminderFragment.java | 9 +-------- 1 file changed, 1 insertion(+), 8 deletions(-) diff --git a/mobile/src/main/java/com/alexstyl/specialdates/settings/DailyReminderFragment.java b/mobile/src/main/java/com/alexstyl/specialdates/settings/DailyReminderFragment.java index fc8b57c8..ee28ed9f 100644 --- a/mobile/src/main/java/com/alexstyl/specialdates/settings/DailyReminderFragment.java +++ b/mobile/src/main/java/com/alexstyl/specialdates/settings/DailyReminderFragment.java @@ -16,10 +16,9 @@ import com.alexstyl.specialdates.R; import com.alexstyl.specialdates.analytics.Action; -import com.alexstyl.specialdates.analytics.Analytics; import com.alexstyl.specialdates.analytics.ActionWithParameters; +import com.alexstyl.specialdates.analytics.Analytics; import com.alexstyl.specialdates.analytics.Firebase; -import com.alexstyl.specialdates.receiver.EventReceiver; import com.alexstyl.specialdates.service.DailyReminderIntentService; import com.alexstyl.specialdates.ui.widget.TimePreference; import com.alexstyl.specialdates.util.Utils; @@ -53,12 +52,6 @@ public boolean onPreferenceChange(Preference preference, Object newValue) { ActionWithParameters event = new ActionWithParameters(Action.DAILY_REMINDER, "enabled", isChecked); analytics.trackAction(event); if (isChecked) { - - // TODO DEBUG - Intent myIntent = new Intent(context, EventReceiver.class); - myIntent.setAction(EventReceiver.ACTION_START_DAILYREMINDER); - context.sendBroadcast(myIntent); - DailyReminderIntentService.rescheduleAlarm(context); } else { DailyReminderIntentService.cancelAlarm(context); From 3d9388be47f763e743387c2fa194e5a13448fa7c Mon Sep 17 00:00:00 2001 From: auricgoldfinger Date: Thu, 8 Sep 2016 10:04:55 +0200 Subject: [PATCH 4/6] Fix @alexstyl remarks - remove second .setNumber() on builder - remove final keyword - use turn_age in stead of new age_today --- .../alexstyl/specialdates/util/Notifier.java | 49 ++++++++++++------- mobile/src/main/res/values/strings.xml | 1 - 2 files changed, 31 insertions(+), 19 deletions(-) diff --git a/mobile/src/main/java/com/alexstyl/specialdates/util/Notifier.java b/mobile/src/main/java/com/alexstyl/specialdates/util/Notifier.java index 457b4f6a..93206099 100644 --- a/mobile/src/main/java/com/alexstyl/specialdates/util/Notifier.java +++ b/mobile/src/main/java/com/alexstyl/specialdates/util/Notifier.java @@ -14,6 +14,7 @@ import android.graphics.PorterDuffXfermode; import android.graphics.Rect; import android.graphics.RectF; +import android.graphics.Typeface; import android.net.Uri; import android.support.v4.app.NotificationCompat; import android.text.Spannable; @@ -23,16 +24,17 @@ import com.alexstyl.specialdates.R; import com.alexstyl.specialdates.contact.Contact; +import com.alexstyl.specialdates.date.ContactEvent; import com.alexstyl.specialdates.date.Date; import com.alexstyl.specialdates.datedetails.DateDetailsActivity; import com.alexstyl.specialdates.events.ContactEvents; +import com.alexstyl.specialdates.events.EventType; import com.alexstyl.specialdates.events.bankholidays.BankHoliday; import com.alexstyl.specialdates.events.namedays.NamedayPreferences; import com.alexstyl.specialdates.images.ImageLoader; import com.alexstyl.specialdates.settings.MainPreferenceActivity; import com.novoda.notils.logger.simple.Log; -import java.security.InvalidParameterException; import java.util.List; public class Notifier { @@ -101,13 +103,20 @@ public void forDailyReminder(ContactEvents events) { .setVisibility(NotificationCompat.VISIBILITY_PRIVATE) .setAutoCancel(true) .setContentIntent(intent) - .setNumber(events.getContactCount()) + .setNumber(events.size()) .setColor(context.getResources().getColor(R.color.main_red)); - // if event.getContacts() > 1 then use InboxStyle, otherwise the BigTextStyle like here: - if (events.getContacts().size() == 1) { - int age = events.getContacts().get(0).getBirthday().getAgeOnYear(events.getDate().getYear()); - String msg = context.getString(R.string.turns_age, age); + if (events.size() == 1) { + ContactEvent event = events.getEvent(0); + String msg = ""; + + if (EventType.BIRTHDAY.equals(event.getType())) { + int age = event.getContact().getBirthday().getAgeOnYear(event.getYear()); + msg = context.getString(R.string.turns_age, age); + + } else if (EventType.NAMEDAY.equals(event.getType())) { + msg = context.getString(R.string.nameday); + } NotificationCompat.BigTextStyle bigTextStyle = new NotificationCompat.BigTextStyle().bigText(msg); bigTextStyle.setBigContentTitle(title); @@ -116,23 +125,29 @@ public void forDailyReminder(ContactEvents events) { builder.setStyle(bigTextStyle); } else if (events.getContacts().size() > 1) { - final NotificationCompat.InboxStyle inboxStyle = new NotificationCompat.InboxStyle(); - + NotificationCompat.InboxStyle inboxStyle = new NotificationCompat.InboxStyle(); inboxStyle.setBigContentTitle(title); - for (Contact contact : events.getContacts()) { + for (int i = 0; i < events.size(); ++i) { + + ContactEvent event = events.getEvent(i); + Contact contact = event.getContact(); String name = contact.getDisplayName().toString(); - int age = contact.getBirthday().getAgeOnYear(events.getDate().getYear()); - String lineFormat = context.getString(R.string.age_today); - int lineParamStartPos = lineFormat.indexOf("%1$s"); - if (lineParamStartPos < 0) { - throw new InvalidParameterException(); + String lineFormatted = name; + + if (EventType.BIRTHDAY.equals(event.getType())) { + int age = contact.getBirthday().getAgeOnYear(events.getDate().getYear()); + + lineFormatted += " " + context.getString(R.string.turns_age, age); + + } else if (EventType.NAMEDAY.equals(event.getType())) { + lineFormatted += " " + context.getString(R.string.nameday); + } - String lineFormatted = context.getString(R.string.age_today, name, age); Spannable sb = new SpannableString(lineFormatted); - sb.setSpan(new StyleSpan(android.graphics.Typeface.BOLD), lineParamStartPos, lineParamStartPos + name.length(), Spannable.SPAN_EXCLUSIVE_EXCLUSIVE); + sb.setSpan(new StyleSpan(Typeface.BOLD), 0, name.length(), Spannable.SPAN_EXCLUSIVE_EXCLUSIVE); inboxStyle.addLine(sb); } @@ -152,8 +167,6 @@ public void forDailyReminder(ContactEvents events) { builder.setPublicVersion(publicNotification.build()); } - builder.setNumber(contactCount); - for (Contact contact : events.getContacts()) { Uri uri = contact.getLookupUri(); if (uri != null) { diff --git a/mobile/src/main/res/values/strings.xml b/mobile/src/main/res/values/strings.xml index 1d28c196..50e5203d 100644 --- a/mobile/src/main/res/values/strings.xml +++ b/mobile/src/main/res/values/strings.xml @@ -19,7 +19,6 @@ %1$s %1$s and %2$s %1$s and %2$d others - %1$s %2$d today About Daily Reminder Service Display Name Days From f49603935dbd7d9814dd4a5e0f32a03eb275be94 Mon Sep 17 00:00:00 2001 From: auricgoldfinger Date: Thu, 8 Sep 2016 11:37:53 +0200 Subject: [PATCH 5/6] Get event label using a separate method Event labels are centralized this way. Fallback will make sure new events will be handled automatically + check whether birthday includes a year to avoid NPE's This method is copy-pased from ContactEventView and must be refactored. --- .../alexstyl/specialdates/util/Notifier.java | 34 +++++++++++++------ 1 file changed, 23 insertions(+), 11 deletions(-) diff --git a/mobile/src/main/java/com/alexstyl/specialdates/util/Notifier.java b/mobile/src/main/java/com/alexstyl/specialdates/util/Notifier.java index 93206099..81ca9809 100644 --- a/mobile/src/main/java/com/alexstyl/specialdates/util/Notifier.java +++ b/mobile/src/main/java/com/alexstyl/specialdates/util/Notifier.java @@ -23,6 +23,7 @@ import android.text.style.StyleSpan; import com.alexstyl.specialdates.R; +import com.alexstyl.specialdates.contact.Birthday; import com.alexstyl.specialdates.contact.Contact; import com.alexstyl.specialdates.date.ContactEvent; import com.alexstyl.specialdates.date.Date; @@ -134,17 +135,7 @@ public void forDailyReminder(ContactEvents events) { Contact contact = event.getContact(); String name = contact.getDisplayName().toString(); - String lineFormatted = name; - - if (EventType.BIRTHDAY.equals(event.getType())) { - int age = contact.getBirthday().getAgeOnYear(events.getDate().getYear()); - - lineFormatted += " " + context.getString(R.string.turns_age, age); - - } else if (EventType.NAMEDAY.equals(event.getType())) { - lineFormatted += " " + context.getString(R.string.nameday); - - } + String lineFormatted = name + " " + getLabelFor(event); Spannable sb = new SpannableString(lineFormatted); sb.setSpan(new StyleSpan(Typeface.BOLD), 0, name.length(), Spannable.SPAN_EXCLUSIVE_EXCLUSIVE); @@ -188,6 +179,27 @@ public void forDailyReminder(ContactEvents events) { } + /** + * TODO duplicated from {@link com.alexstyl.specialdates.upcoming.ui.ContactEventView#getLabelFor(ContactEvent)} + * + * @deprecated + */ + private String getLabelFor(ContactEvent event) { + Resources resources = context.getResources(); + + EventType eventType = event.getType(); + if (eventType == EventType.BIRTHDAY) { + Birthday birthday = event.getContact().getBirthday(); + if (birthday.includesYear()) { + int age = birthday.getAgeOnYear(event.getYear()); + if (age > 0) { + return resources.getString(R.string.turns_age, age); + } + } + } + return resources.getString(eventType.nameRes()); + } + public static Bitmap getCircleBitmap(Bitmap bitmap) { final Bitmap output = Bitmap.createBitmap(bitmap.getWidth(), bitmap.getHeight(), Bitmap.Config.ARGB_8888 From 77498ad1d2d222070a9ee50c931048c9cac929c4 Mon Sep 17 00:00:00 2001 From: auricgoldfinger Date: Thu, 8 Sep 2016 11:49:22 +0200 Subject: [PATCH 6/6] Use getLabelFor in case of a single event as well :-) --- .../java/com/alexstyl/specialdates/util/Notifier.java | 10 +--------- 1 file changed, 1 insertion(+), 9 deletions(-) diff --git a/mobile/src/main/java/com/alexstyl/specialdates/util/Notifier.java b/mobile/src/main/java/com/alexstyl/specialdates/util/Notifier.java index 81ca9809..9f75b2fa 100644 --- a/mobile/src/main/java/com/alexstyl/specialdates/util/Notifier.java +++ b/mobile/src/main/java/com/alexstyl/specialdates/util/Notifier.java @@ -109,15 +109,7 @@ public void forDailyReminder(ContactEvents events) { if (events.size() == 1) { ContactEvent event = events.getEvent(0); - String msg = ""; - - if (EventType.BIRTHDAY.equals(event.getType())) { - int age = event.getContact().getBirthday().getAgeOnYear(event.getYear()); - msg = context.getString(R.string.turns_age, age); - - } else if (EventType.NAMEDAY.equals(event.getType())) { - msg = context.getString(R.string.nameday); - } + String msg = getLabelFor(event); NotificationCompat.BigTextStyle bigTextStyle = new NotificationCompat.BigTextStyle().bigText(msg); bigTextStyle.setBigContentTitle(title);