From 204c1ab98310f98c0326a56b5f3818ab79f2fe53 Mon Sep 17 00:00:00 2001 From: Alex Baker Date: Sat, 23 Jul 2016 22:13:23 -0500 Subject: [PATCH] Add LED color setting --- .../astrid/reminders/ReminderPreferences.java | 93 ++++++++++++++++--- src/main/java/org/tasks/Notifier.java | 20 ++-- .../org/tasks/dialogs/ThemePickerDialog.java | 6 +- src/main/java/org/tasks/themes/LEDColor.java | 41 ++++++++ .../java/org/tasks/themes/ThemeCache.java | 11 +++ src/main/res/values-bg-rBG/strings.xml | 1 - src/main/res/values-de/strings.xml | 1 - src/main/res/values-es/strings.xml | 1 - src/main/res/values-fa/strings.xml | 1 - src/main/res/values-fr/strings.xml | 1 - src/main/res/values-it/strings.xml | 1 - src/main/res/values-iw/strings.xml | 1 - src/main/res/values-ja/strings.xml | 1 - src/main/res/values-ko/strings.xml | 1 - src/main/res/values-pt-rBR/strings.xml | 1 - src/main/res/values-ru/strings.xml | 1 - src/main/res/values-sv/strings.xml | 1 - src/main/res/values/arrays.xml | 20 ++++ src/main/res/values/keys.xml | 3 +- src/main/res/values/strings.xml | 4 +- src/main/res/xml/preferences_reminders.xml | 22 ++++- 21 files changed, 193 insertions(+), 39 deletions(-) create mode 100644 src/main/java/org/tasks/themes/LEDColor.java diff --git a/src/main/java/com/todoroo/astrid/reminders/ReminderPreferences.java b/src/main/java/com/todoroo/astrid/reminders/ReminderPreferences.java index 22ec45c07..13b36f80b 100644 --- a/src/main/java/com/todoroo/astrid/reminders/ReminderPreferences.java +++ b/src/main/java/com/todoroo/astrid/reminders/ReminderPreferences.java @@ -17,31 +17,47 @@ import android.preference.PreferenceManager; import org.tasks.R; import org.tasks.activities.TimePickerActivity; +import org.tasks.billing.PurchaseHelper; +import org.tasks.billing.PurchaseHelperCallback; +import org.tasks.dialogs.DialogBuilder; +import org.tasks.dialogs.ThemePickerDialog; import org.tasks.injection.ActivityComponent; import org.tasks.injection.InjectingPreferenceActivity; import org.tasks.preferences.ActivityPermissionRequestor; import org.tasks.preferences.Device; import org.tasks.preferences.PermissionChecker; import org.tasks.preferences.PermissionRequestor; +import org.tasks.preferences.Preferences; import org.tasks.scheduling.GeofenceSchedulingIntentService; import org.tasks.scheduling.ReminderSchedulerIntentService; +import org.tasks.themes.LEDColor; +import org.tasks.themes.ThemeCache; import org.tasks.time.DateTime; import org.tasks.ui.TimePreference; import javax.inject.Inject; +import timber.log.Timber; + import static com.todoroo.andlib.utility.AndroidUtilities.atLeastJellybean; import static com.todoroo.andlib.utility.AndroidUtilities.atLeastMarshmallow; +import static org.tasks.dialogs.NativeThemePickerDialog.newNativeThemePickerDialog; -public class ReminderPreferences extends InjectingPreferenceActivity { +public class ReminderPreferences extends InjectingPreferenceActivity implements ThemePickerDialog.ThemePickerCallback, PurchaseHelperCallback { private static final int REQUEST_QUIET_START = 10001; private static final int REQUEST_QUIET_END = 10002; private static final int REQUEST_DEFAULT_REMIND = 10003; + private static final int REQUEST_PURCHASE = 10004; + private static final String FRAG_TAG_LED_PICKER = "frag_tag_led_picker"; @Inject Device device; @Inject ActivityPermissionRequestor permissionRequestor; @Inject PermissionChecker permissionChecker; + @Inject DialogBuilder dialogBuilder; + @Inject PurchaseHelper purchaseHelper; + @Inject Preferences preferences; + @Inject ThemeCache themeCache; private CheckBoxPreference fieldMissedCalls; @@ -75,9 +91,19 @@ public class ReminderPreferences extends InjectingPreferenceActivity { initializeTimePreference(getQuietStartPreference(), REQUEST_QUIET_START); initializeTimePreference(getQuietEndPreference(), REQUEST_QUIET_END); + findPreference(getString(R.string.p_led_color)).setOnPreferenceClickListener(new Preference.OnPreferenceClickListener() { + @Override + public boolean onPreferenceClick(Preference preference) { + showLEDColorPicker(); + return false; + } + }); + requires(atLeastJellybean(), R.string.p_rmd_notif_actions_enabled, R.string.p_notification_priority); requires(atLeastMarshmallow(), R.string.p_doze_notifications); requires(device.supportsLocationServices(), R.string.geolocation_reminders); + + updateLEDColor(); } private void rescheduleNotificationsOnChange(int... resIds) { @@ -156,20 +182,25 @@ public class ReminderPreferences extends InjectingPreferenceActivity { @Override protected void onActivityResult(int requestCode, int resultCode, Intent data) { - if (resultCode == RESULT_OK) { - switch (requestCode) { - case REQUEST_QUIET_START: - getQuietStartPreference().handleTimePickerActivityIntent(data); - return; - case REQUEST_QUIET_END: - getQuietEndPreference().handleTimePickerActivityIntent(data); - return; - case REQUEST_DEFAULT_REMIND: - getDefaultRemindTimePreference().handleTimePickerActivityIntent(data); - return; + if (requestCode == REQUEST_QUIET_START) { + if (resultCode == RESULT_OK) { + getQuietStartPreference().handleTimePickerActivityIntent(data); + } + } else if (requestCode == REQUEST_QUIET_END) { + if (resultCode == RESULT_OK) { + getQuietEndPreference().handleTimePickerActivityIntent(data); + } + } else if (requestCode == REQUEST_DEFAULT_REMIND) { + if (resultCode == RESULT_OK) { + getDefaultRemindTimePreference().handleTimePickerActivityIntent(data); + } + } else if (requestCode == REQUEST_PURCHASE) { + if (resultCode == RESULT_OK) { + purchaseHelper.handleActivityResult(this, requestCode, resultCode, data); } + } else { + super.onActivityResult(requestCode, resultCode, data); } - super.onActivityResult(requestCode, resultCode, data); } private TimePreference getQuietStartPreference() { @@ -192,4 +223,40 @@ public class ReminderPreferences extends InjectingPreferenceActivity { public void inject(ActivityComponent component) { component.inject(this); } + + @Override + public void themePicked(ThemePickerDialog.ColorPalette palette, int index) { + preferences.setInt(R.string.p_led_color, index); + updateLEDColor(); + } + + @Override + public void initiateThemePurchase() { + purchaseHelper.purchase(dialogBuilder, this, getString(R.string.sku_themes), getString(R.string.p_purchased_themes), REQUEST_PURCHASE, this); + } + + @Override + public void purchaseCompleted(boolean success, final String sku) { + runOnUiThread(new Runnable() { + @Override + public void run() { + if (getString(R.string.sku_themes).equals(sku)) { + showLEDColorPicker(); + } else { + Timber.d("Unhandled sku: %s", sku); + } + } + }); + } + + private void showLEDColorPicker() { + newNativeThemePickerDialog(ThemePickerDialog.ColorPalette.LED) + .show(getFragmentManager(), FRAG_TAG_LED_PICKER); + } + + private void updateLEDColor() { + int index = preferences.getInt(R.string.p_led_color); + LEDColor ledColor = themeCache.getLEDColor(index); + findPreference(getString(R.string.p_led_color)).setSummary(ledColor.getName()); + } } diff --git a/src/main/java/org/tasks/Notifier.java b/src/main/java/org/tasks/Notifier.java index e7ce21b9d..7a61ce906 100644 --- a/src/main/java/org/tasks/Notifier.java +++ b/src/main/java/org/tasks/Notifier.java @@ -35,6 +35,9 @@ import org.tasks.reminders.NotificationActivity; import org.tasks.reminders.SnoozeActivity; import org.tasks.reminders.SnoozeDialog; import org.tasks.reminders.SnoozeOption; +import org.tasks.themes.LEDColor; +import org.tasks.themes.ThemeAccent; +import org.tasks.themes.ThemeCache; import java.io.InputStream; @@ -58,12 +61,14 @@ public class Notifier { private final AudioManager audioManager; private final VoiceOutputAssistant voiceOutputAssistant; private final Preferences preferences; + private final ThemeCache themeCache; @Inject public Notifier(@ForApplication Context context, TaskDao taskDao, NotificationManager notificationManager, TaskService taskService, TelephonyManager telephonyManager, AudioManager audioManager, - VoiceOutputAssistant voiceOutputAssistant, Preferences preferences) { + VoiceOutputAssistant voiceOutputAssistant, Preferences preferences, + ThemeCache themeCache) { this.context = context; this.taskDao = taskDao; this.notificationManager = notificationManager; @@ -72,6 +77,7 @@ public class Notifier { this.audioManager = audioManager; this.voiceOutputAssistant = voiceOutputAssistant; this.preferences = preferences; + this.themeCache = themeCache; } public void triggerMissedCallNotification(final String name, final String number, long contactId) { @@ -298,14 +304,16 @@ public class Notifier { if (preferences.getBoolean(R.string.p_rmd_persistent, true)) { notification.flags |= Notification.FLAG_NO_CLEAR; } - if (preferences.getBoolean(R.string.p_disable_notification_light, false)) { - notification.ledOffMS = 0; - notification.ledOnMS = 0; - } else { + if (preferences.getBoolean(R.string.p_led_notification, true)) { + int accent = preferences.getInt(R.string.p_led_color); + LEDColor ledColor = themeCache.getLEDColor(accent); notification.flags |= Notification.FLAG_SHOW_LIGHTS; notification.ledOffMS = 5000; notification.ledOnMS = 700; - notification.ledARGB = Color.YELLOW; + notification.ledARGB = ledColor.getColor(); + } else { + notification.ledOffMS = 0; + notification.ledOnMS = 0; } if (atLeastJellybean()) { diff --git a/src/main/java/org/tasks/dialogs/ThemePickerDialog.java b/src/main/java/org/tasks/dialogs/ThemePickerDialog.java index 4d6d01d8e..dd088ef6e 100644 --- a/src/main/java/org/tasks/dialogs/ThemePickerDialog.java +++ b/src/main/java/org/tasks/dialogs/ThemePickerDialog.java @@ -24,7 +24,7 @@ import static com.todoroo.andlib.utility.AndroidUtilities.atLeastJellybeanMR1; public class ThemePickerDialog { - public enum ColorPalette {THEMES, COLORS, ACCENTS, WIDGET_BACKGROUND} + public enum ColorPalette {THEMES, COLORS, ACCENTS, WIDGET_BACKGROUND, LED} public interface ThemePickerCallback { void themePicked(ColorPalette palette, int index); @@ -102,6 +102,8 @@ public class ThemePickerDialog { return R.array.accents; case WIDGET_BACKGROUND: return R.array.widget_background; + case LED: + return R.array.led; default: return R.array.themes; } @@ -115,6 +117,8 @@ public class ThemePickerDialog { return themeCache.getThemeAccent(index).getAccentColor(); case WIDGET_BACKGROUND: return themeCache.getWidgetTheme(index).getBackgroundColor(); + case LED: + return themeCache.getLEDColor(index).getColor(); default: return themeCache.getThemeBase(index).getContentBackground(); } diff --git a/src/main/java/org/tasks/themes/LEDColor.java b/src/main/java/org/tasks/themes/LEDColor.java new file mode 100644 index 000000000..4382eb6ca --- /dev/null +++ b/src/main/java/org/tasks/themes/LEDColor.java @@ -0,0 +1,41 @@ +package org.tasks.themes; + +import org.tasks.R; + +public class LEDColor { + + public static final int[] LED_COLORS = new int[]{ + R.color.yellow_a400, + R.color.blue_grey_400, + R.color.red_a400, + R.color.pink_a400, + R.color.purple_a400, + R.color.deep_purple_a400, + R.color.indigo_a400, + R.color.blue_a400, + R.color.light_blue_a400, + R.color.cyan_a400, + R.color.teal_a400, + R.color.green_a400, + R.color.light_green_a400, + R.color.lime_a400, + R.color.amber_a400, + R.color.orange_a400, + R.color.deep_orange_a400 + }; + private final String name; + private final int color; + + public LEDColor(String name, int color) { + this.name = name; + this.color = color; + } + + public String getName() { + return name; + } + + public int getColor() { + return color; + } +} diff --git a/src/main/java/org/tasks/themes/ThemeCache.java b/src/main/java/org/tasks/themes/ThemeCache.java index 61f194bcd..7cb2c5d34 100644 --- a/src/main/java/org/tasks/themes/ThemeCache.java +++ b/src/main/java/org/tasks/themes/ThemeCache.java @@ -17,6 +17,7 @@ public class ThemeCache { private final List colors = new ArrayList<>(); private final List accents = new ArrayList<>(); private final List widgetThemes = new ArrayList<>(); + private final List led = new ArrayList<>(); private final ThemeColor untaggedColor; public ThemeCache(Context context) { @@ -55,6 +56,12 @@ public class ThemeCache { resources.getColor(WidgetTheme.BACKGROUNDS[i]), resources.getColor(i == 0 ? R.color.black_87 : R.color.white_100))); } + String []ledNames = resources.getStringArray(R.array.led); + for (int i = 0 ; i < LEDColor.LED_COLORS.length ; i++) { + led.add(new LEDColor( + ledNames[i], + resources.getColor(LEDColor.LED_COLORS[i]))); + } untaggedColor = new ThemeColor(null, 19, resources.getColor(R.color.tag_color_none_background), 0, resources.getColor(R.color.black_87), false); } @@ -78,6 +85,10 @@ public class ThemeCache { return untaggedColor; } + public LEDColor getLEDColor(int index) { + return led.get(index); + } + private static int resolveAttribute(Resources.Theme theme, int attribute) { TypedValue typedValue = new TypedValue(); theme.resolveAttribute(attribute, typedValue, true); diff --git a/src/main/res/values-bg-rBG/strings.xml b/src/main/res/values-bg-rBG/strings.xml index 7392f9078..cb6e27d4e 100644 --- a/src/main/res/values-bg-rBG/strings.xml +++ b/src/main/res/values-bg-rBG/strings.xml @@ -363,7 +363,6 @@ Изпрати анонимна статистика за използването и отчети за грешки за да помогнеш да се подобри Tasks. Няма да бъдат събирани персонални данни. Този таг вече съществува Името не може да е празно - Деактивиране на светлина за уведомления Прекъсване на Doze режим за уведомления Android значително ще забави уведомленията когато устройството е в Doze режим Android ще позволява ограничен брой прекъсвания когато устройството е в Doze режим diff --git a/src/main/res/values-de/strings.xml b/src/main/res/values-de/strings.xml index b5a0ca973..11b1bcb48 100644 --- a/src/main/res/values-de/strings.xml +++ b/src/main/res/values-de/strings.xml @@ -354,7 +354,6 @@ Anonyme Nutzungsstatistiken und Absturzberichte zur Verbesserung von Tasks senden. Es werden keine persönlichen Daten gesammelt. Tag existiert bereits Name darf nicht leer sein - Benachrichtigungsleuchte deaktivieren Doze-Modus für Benachrichtigungen unterbrechen Im Doze-Modus von Android erfolgen Benachrichtigungen mit deutlicher Verzögerung Android erlaubt nur eine begrenzte Anzahl von Unterbrechungen des Doze-Modus diff --git a/src/main/res/values-es/strings.xml b/src/main/res/values-es/strings.xml index b00cf4dd3..ec526cea0 100644 --- a/src/main/res/values-es/strings.xml +++ b/src/main/res/values-es/strings.xml @@ -359,7 +359,6 @@ Enviar de forma anónima estadísticas de uso e informes de error para ayudar a mejorar Task. No se recogerán datos personales. La etiqueta ya existe El nombre no puede estar vacío - Deshabilitar luz de notificación Interrumpir modo reposo con notificaciones Android retrasará las notificaciones si el dispositivo está en modo reposo Android permitirá interrupciones limitadas si el dispositivo está en modo reposo diff --git a/src/main/res/values-fa/strings.xml b/src/main/res/values-fa/strings.xml index 2f3f663a9..681183a59 100644 --- a/src/main/res/values-fa/strings.xml +++ b/src/main/res/values-fa/strings.xml @@ -264,7 +264,6 @@ تعداد لرزش ها گرفتن عکس بهبود وظیفه - خاموش کردن چراغ اعلان (بدون عنوان) لیست پیش فرض غیرفعال diff --git a/src/main/res/values-fr/strings.xml b/src/main/res/values-fr/strings.xml index 96f085217..f7c63ffec 100644 --- a/src/main/res/values-fr/strings.xml +++ b/src/main/res/values-fr/strings.xml @@ -350,7 +350,6 @@ Améliorer Tasks Envoyer des statistiques anonymes d\'usage et les rapports de plantage afin d\'aider à l\'amélioration de Tasks. Aucune donnée personnelle ne sera collectée. Le tag existe déjà - Désactiver la lumière des notifications Interrompt le Doze mode pour les notifications Android va différer les notifications de façon importante lorsque l\'appareil sera en Doze mode Android autorisera des interruptions limitées lorsque l\'appareil sera en Doze mode diff --git a/src/main/res/values-it/strings.xml b/src/main/res/values-it/strings.xml index ac39a1252..a9afece72 100644 --- a/src/main/res/values-it/strings.xml +++ b/src/main/res/values-it/strings.xml @@ -359,7 +359,6 @@ Invio anonimo di statistiche e problemi di funzionamento atti a migliorare \"Tasks\". Non verrà inviato nessun dato personale. Etichetta già presente Il nome non può essere omesso - Disabilita led di notifica Le notifiche interrompono il pisolino Android limiterà le notifiche se il dispositivo è in modalità riposo Android limiterà le notifiche se il dispositivo è in modalità riposo diff --git a/src/main/res/values-iw/strings.xml b/src/main/res/values-iw/strings.xml index 2a461bcd9..a73708e26 100644 --- a/src/main/res/values-iw/strings.xml +++ b/src/main/res/values-iw/strings.xml @@ -361,7 +361,6 @@ שליחת סטסיטיקות ודיווחי קריסה של האפליקציה באופן אנונימי. מידע אישי לא נאסף כלל. תגית כבר קיימת השם לא יכול להיות ריק - בטל תאורת נוטיפיקציות ניטרול Doze Mode בהתראות אנדרואיד יעכב את ההתראות באופן משמעותי כאשר Doze mode פעיל מערכת אנדרואיד תאפשר מספר מוגבל של יקיצות כאשר המכשיר במצב Doze diff --git a/src/main/res/values-ja/strings.xml b/src/main/res/values-ja/strings.xml index 66b9b7e0c..12a6b3336 100644 --- a/src/main/res/values-ja/strings.xml +++ b/src/main/res/values-ja/strings.xml @@ -361,7 +361,6 @@ Tasks を改善するために、匿名で使用状況データとクラッシュレポートを送信します。個人情報は収集されません。 タグは既に存在します 名前は空にできません。 - 通知ライトを無効にする 通知の Doze モード割り込み デバイスが Doze モードの間、Android は通知を大幅に遅らせます デバイスが Doze モードの間、Android は限定された割り込みを許可します diff --git a/src/main/res/values-ko/strings.xml b/src/main/res/values-ko/strings.xml index 37a1816c9..cba8d46fc 100644 --- a/src/main/res/values-ko/strings.xml +++ b/src/main/res/values-ko/strings.xml @@ -361,7 +361,6 @@ Tasks 향상 Tasks를 향상시키기 위해 사용 기록과 충돌 보고서를 익명으로 전송합니다. 개인 정보는 수집되지 않습니다. 태그가 이미 존재합니다 - 알림 LED 해제 알림을 위해 Doze Mode 방해하기 Android는 기기가 Doze Mode에 있을 때 알림을 매우 늦춥니다 Android는 기기가 Doze Mode에 있을 때 제한된 수준에서 이 모드를 방해합니다 diff --git a/src/main/res/values-pt-rBR/strings.xml b/src/main/res/values-pt-rBR/strings.xml index 09849c265..1bae3cc32 100644 --- a/src/main/res/values-pt-rBR/strings.xml +++ b/src/main/res/values-pt-rBR/strings.xml @@ -296,7 +296,6 @@ Melhorar o Tasks Enviar estatísticas de uso e relatórios de falha anonimamente para ajudar a melhorar o Tasks. Nenhuma informação pessoal será coletada. Etiqueta já existe - Desativar luz de notificação Interromper modo Doze para notificações O Android irá adiar as notificações significativamente enquanto o dispositivo estiver no modo Doze O Android irá permitir interrupções limitadas enquanto o dispositivo estiver no modo Doze diff --git a/src/main/res/values-ru/strings.xml b/src/main/res/values-ru/strings.xml index 0370feece..26d1bbf5b 100644 --- a/src/main/res/values-ru/strings.xml +++ b/src/main/res/values-ru/strings.xml @@ -360,7 +360,6 @@ Высылать анонимную статистику и отчёты об ошибках, чтобы помочь улучшить Tasks. Персональная информация собираться не будет. Тег уже существует Необходимо задать имя - Не использовать световой индикатор для напоминаний Прерывать спящий режим для уведомлений Android будет сильно задерживать уведомления, если устройство находится в спящем режиме Android разрешит ограниченные прерывания, если устройство находится в спящем режиме diff --git a/src/main/res/values-sv/strings.xml b/src/main/res/values-sv/strings.xml index 1ff27c899..f3f549dbc 100644 --- a/src/main/res/values-sv/strings.xml +++ b/src/main/res/values-sv/strings.xml @@ -357,7 +357,6 @@ Förbättra Tasks Skicka anonym användarstatistik och crashrapporter för att hjälpa till att förbättra Tasks. Ingen personlig information kommer samlas in. Etiketten finns redan - Inaktivera notifieringslampa Avbryt Doze-läge för påminnelser Android kommer att avsevärt fördröja påminnelser medan enheten är i Doze-läge Android kommer att tillåta begränsade avbrott medan enheten är i Doze-läge diff --git a/src/main/res/values/arrays.xml b/src/main/res/values/arrays.xml index 925b85a29..3538d72e0 100644 --- a/src/main/res/values/arrays.xml +++ b/src/main/res/values/arrays.xml @@ -131,6 +131,26 @@ @string/theme_deep_orange + + @string/theme_yellow + @string/theme_blue_grey + @string/theme_red + @string/theme_pink + @string/theme_purple + @string/theme_deep_purple + @string/theme_indigo + @string/theme_blue + @string/theme_light_blue + @string/theme_cyan + @string/theme_teal + @string/theme_green + @string/theme_light_green + @string/theme_lime + @string/theme_amber + @string/theme_orange + @string/theme_deep_orange + + @string/theme_light @string/theme_black diff --git a/src/main/res/values/keys.xml b/src/main/res/values/keys.xml index d006fc07e..95c60cfc7 100644 --- a/src/main/res/values/keys.xml +++ b/src/main/res/values/keys.xml @@ -236,7 +236,6 @@ reverse_sort manual_sort notification_priority - disable_notification_light doze_notifications @@ -309,4 +308,6 @@ sync_warning_shown language layout_direction + led_color + led_notification diff --git a/src/main/res/values/strings.xml b/src/main/res/values/strings.xml index 6c5f6e7d5..e62cd005f 100644 --- a/src/main/res/values/strings.xml +++ b/src/main/res/values/strings.xml @@ -834,7 +834,6 @@ File %1$s contained %2$s.\n\n Send anonymous usage statistics and crash reports to help improve Tasks. No personal data will be collected. Tag already exists Name cannot be empty - Disable notification light Interrupt Doze mode for notifications Android will significantly delay notifications while device is in Doze mode Android will allow limited interruptions while device is in Doze mode @@ -905,5 +904,8 @@ File %1$s contained %2$s.\n\n Use locale direction Left to right Right to left + LED Notification + Hardware support required + LED color diff --git a/src/main/res/xml/preferences_reminders.xml b/src/main/res/xml/preferences_reminders.xml index b25ca6894..877119689 100644 --- a/src/main/res/xml/preferences_reminders.xml +++ b/src/main/res/xml/preferences_reminders.xml @@ -33,11 +33,6 @@ android:showDefault="true" android:showSilent="true" android:title="@string/sound" /> - + + + + + + + +