Add LED color setting

pull/437/head
Alex Baker 8 years ago
parent adbd75863f
commit 204c1ab983

@ -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());
}
}

@ -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()) {

@ -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();
}

@ -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;
}
}

@ -17,6 +17,7 @@ public class ThemeCache {
private final List<ThemeColor> colors = new ArrayList<>();
private final List<ThemeAccent> accents = new ArrayList<>();
private final List<WidgetTheme> widgetThemes = new ArrayList<>();
private final List<LEDColor> 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);

@ -363,7 +363,6 @@
<string name="send_anonymous_statistics_summary">Изпрати анонимна статистика за използването и отчети за грешки за да помогнеш да се подобри Tasks. Няма да бъдат събирани персонални данни.</string>
<string name="tag_already_exists">Този таг вече съществува</string>
<string name="name_cannot_be_empty">Името не може да е празно</string>
<string name="disable_notification_light">Деактивиране на светлина за уведомления</string>
<string name="doze_notifications">Прекъсване на Doze режим за уведомления</string>
<string name="doze_notifications_off">Android значително ще забави уведомленията когато устройството е в Doze режим</string>
<string name="doze_notifications_on">Android ще позволява ограничен брой прекъсвания когато устройството е в Doze режим</string>

@ -354,7 +354,6 @@
<string name="send_anonymous_statistics_summary">Anonyme Nutzungsstatistiken und Absturzberichte zur Verbesserung von Tasks senden. Es werden keine persönlichen Daten gesammelt.</string>
<string name="tag_already_exists">Tag existiert bereits</string>
<string name="name_cannot_be_empty">Name darf nicht leer sein</string>
<string name="disable_notification_light">Benachrichtigungsleuchte deaktivieren</string>
<string name="doze_notifications">Doze-Modus für Benachrichtigungen unterbrechen</string>
<string name="doze_notifications_off">Im Doze-Modus von Android erfolgen Benachrichtigungen mit deutlicher Verzögerung</string>
<string name="doze_notifications_on">Android erlaubt nur eine begrenzte Anzahl von Unterbrechungen des Doze-Modus</string>

@ -359,7 +359,6 @@
<string name="send_anonymous_statistics_summary">Enviar de forma anónima estadísticas de uso e informes de error para ayudar a mejorar Task. No se recogerán datos personales.</string>
<string name="tag_already_exists">La etiqueta ya existe</string>
<string name="name_cannot_be_empty">El nombre no puede estar vacío</string>
<string name="disable_notification_light">Deshabilitar luz de notificación</string>
<string name="doze_notifications">Interrumpir modo reposo con notificaciones</string>
<string name="doze_notifications_off">Android retrasará las notificaciones si el dispositivo está en modo reposo</string>
<string name="doze_notifications_on">Android permitirá interrupciones limitadas si el dispositivo está en modo reposo</string>

@ -264,7 +264,6 @@
<string name="vibration_count">تعداد لرزش ها</string>
<string name="take_a_picture">گرفتن عکس</string>
<string name="send_anonymous_statistics">بهبود وظیفه</string>
<string name="disable_notification_light">خاموش کردن چراغ اعلان</string>
<string name="no_title">(بدون عنوان)</string>
<string name="default_list">لیست پیش فرض</string>
<string name="sync_interval_disable">غیرفعال</string>

@ -350,7 +350,6 @@
<string name="send_anonymous_statistics">Améliorer Tasks</string>
<string name="send_anonymous_statistics_summary">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.</string>
<string name="tag_already_exists">Le tag existe déjà</string>
<string name="disable_notification_light">Désactiver la lumière des notifications</string>
<string name="doze_notifications">Interrompt le Doze mode pour les notifications</string>
<string name="doze_notifications_off">Android va différer les notifications de façon importante lorsque l\'appareil sera en Doze mode</string>
<string name="doze_notifications_on">Android autorisera des interruptions limitées lorsque l\'appareil sera en Doze mode</string>

@ -359,7 +359,6 @@
<string name="send_anonymous_statistics_summary">Invio anonimo di statistiche e problemi di funzionamento atti a migliorare \"Tasks\". Non verrà inviato nessun dato personale.</string>
<string name="tag_already_exists">Etichetta già presente</string>
<string name="name_cannot_be_empty">Il nome non può essere omesso</string>
<string name="disable_notification_light">Disabilita led di notifica</string>
<string name="doze_notifications">Le notifiche interrompono il pisolino</string>
<string name="doze_notifications_off">Android limiterà le notifiche se il dispositivo è in modalità riposo</string>
<string name="doze_notifications_on">Android limiterà le notifiche se il dispositivo è in modalità riposo</string>

@ -361,7 +361,6 @@
<string name="send_anonymous_statistics_summary">שליחת סטסיטיקות ודיווחי קריסה של האפליקציה באופן אנונימי. מידע אישי לא נאסף כלל.</string>
<string name="tag_already_exists">תגית כבר קיימת</string>
<string name="name_cannot_be_empty">השם לא יכול להיות ריק</string>
<string name="disable_notification_light">בטל תאורת נוטיפיקציות</string>
<string name="doze_notifications">ניטרול Doze Mode בהתראות</string>
<string name="doze_notifications_off">אנדרואיד יעכב את ההתראות באופן משמעותי כאשר Doze mode פעיל</string>
<string name="doze_notifications_on">מערכת אנדרואיד תאפשר מספר מוגבל של יקיצות כאשר המכשיר במצב Doze</string>

@ -361,7 +361,6 @@
<string name="send_anonymous_statistics_summary">Tasks を改善するために、匿名で使用状況データとクラッシュレポートを送信します。個人情報は収集されません。</string>
<string name="tag_already_exists">タグは既に存在します</string>
<string name="name_cannot_be_empty">名前は空にできません。</string>
<string name="disable_notification_light">通知ライトを無効にする</string>
<string name="doze_notifications">通知の Doze モード割り込み</string>
<string name="doze_notifications_off">デバイスが Doze モードの間、Android は通知を大幅に遅らせます</string>
<string name="doze_notifications_on">デバイスが Doze モードの間、Android は限定された割り込みを許可します</string>

@ -361,7 +361,6 @@
<string name="send_anonymous_statistics">Tasks 향상</string>
<string name="send_anonymous_statistics_summary">Tasks를 향상시키기 위해 사용 기록과 충돌 보고서를 익명으로 전송합니다. 개인 정보는 수집되지 않습니다.</string>
<string name="tag_already_exists">태그가 이미 존재합니다</string>
<string name="disable_notification_light">알림 LED 해제</string>
<string name="doze_notifications">알림을 위해 Doze Mode 방해하기</string>
<string name="doze_notifications_off">Android는 기기가 Doze Mode에 있을 때 알림을 매우 늦춥니다</string>
<string name="doze_notifications_on">Android는 기기가 Doze Mode에 있을 때 제한된 수준에서 이 모드를 방해합니다</string>

@ -296,7 +296,6 @@
<string name="send_anonymous_statistics">Melhorar o Tasks</string>
<string name="send_anonymous_statistics_summary">Enviar estatísticas de uso e relatórios de falha anonimamente para ajudar a melhorar o Tasks. Nenhuma informação pessoal será coletada.</string>
<string name="tag_already_exists">Etiqueta já existe</string>
<string name="disable_notification_light">Desativar luz de notificação</string>
<string name="doze_notifications">Interromper modo Doze para notificações</string>
<string name="doze_notifications_off">O Android irá adiar as notificações significativamente enquanto o dispositivo estiver no modo Doze</string>
<string name="doze_notifications_on">O Android irá permitir interrupções limitadas enquanto o dispositivo estiver no modo Doze</string>

@ -360,7 +360,6 @@
<string name="send_anonymous_statistics_summary">Высылать анонимную статистику и отчёты об ошибках, чтобы помочь улучшить Tasks. Персональная информация собираться не будет.</string>
<string name="tag_already_exists">Тег уже существует</string>
<string name="name_cannot_be_empty">Необходимо задать имя</string>
<string name="disable_notification_light">Не использовать световой индикатор для напоминаний</string>
<string name="doze_notifications">Прерывать спящий режим для уведомлений</string>
<string name="doze_notifications_off">Android будет сильно задерживать уведомления, если устройство находится в спящем режиме</string>
<string name="doze_notifications_on">Android разрешит ограниченные прерывания, если устройство находится в спящем режиме</string>

@ -357,7 +357,6 @@
<string name="send_anonymous_statistics">Förbättra Tasks</string>
<string name="send_anonymous_statistics_summary">Skicka anonym användarstatistik och crashrapporter för att hjälpa till att förbättra Tasks. Ingen personlig information kommer samlas in.</string>
<string name="tag_already_exists">Etiketten finns redan</string>
<string name="disable_notification_light">Inaktivera notifieringslampa</string>
<string name="doze_notifications">Avbryt Doze-läge för påminnelser</string>
<string name="doze_notifications_off">Android kommer att avsevärt fördröja påminnelser medan enheten är i Doze-läge</string>
<string name="doze_notifications_on">Android kommer att tillåta begränsade avbrott medan enheten är i Doze-läge</string>

@ -131,6 +131,26 @@
<item>@string/theme_deep_orange</item>
</string-array>
<string-array name="led">
<item>@string/theme_yellow</item>
<item>@string/theme_blue_grey</item>
<item>@string/theme_red</item>
<item>@string/theme_pink</item>
<item>@string/theme_purple</item>
<item>@string/theme_deep_purple</item>
<item>@string/theme_indigo</item>
<item>@string/theme_blue</item>
<item>@string/theme_light_blue</item>
<item>@string/theme_cyan</item>
<item>@string/theme_teal</item>
<item>@string/theme_green</item>
<item>@string/theme_light_green</item>
<item>@string/theme_lime</item>
<item>@string/theme_amber</item>
<item>@string/theme_orange</item>
<item>@string/theme_deep_orange</item>
</string-array>
<string-array name="widget_background">
<item>@string/theme_light</item>
<item>@string/theme_black</item>

@ -236,7 +236,6 @@
<string name="p_reverse_sort">reverse_sort</string>
<string name="p_manual_sort">manual_sort</string>
<string name="p_notification_priority">notification_priority</string>
<string name="p_disable_notification_light">disable_notification_light</string>
<string name="p_doze_notifications">doze_notifications</string>
<string-array name="TEA_control_sets_prefs">
@ -309,4 +308,6 @@
<string name="p_sync_warning_shown">sync_warning_shown</string>
<string name="p_language">language</string>
<string name="p_layout_direction">layout_direction</string>
<string name="p_led_color">led_color</string>
<string name="p_led_notification">led_notification</string>
</resources>

@ -834,7 +834,6 @@ File %1$s contained %2$s.\n\n
<string name="send_anonymous_statistics_summary">Send anonymous usage statistics and crash reports to help improve Tasks. No personal data will be collected.</string>
<string name="tag_already_exists">Tag already exists</string>
<string name="name_cannot_be_empty">Name cannot be empty</string>
<string name="disable_notification_light">Disable notification light</string>
<string name="doze_notifications">Interrupt Doze mode for notifications</string>
<string name="doze_notifications_off">Android will significantly delay notifications while device is in Doze mode</string>
<string name="doze_notifications_on">Android will allow limited interruptions while device is in Doze mode</string>
@ -905,5 +904,8 @@ File %1$s contained %2$s.\n\n
<string name="layout_direction_locale">Use locale direction</string>
<string name="layout_direction_left_to_right">Left to right</string>
<string name="layout_direction_right_to_left">Right to left</string>
<string name="led_notification">LED Notification</string>
<string name="hardware_support_required">Hardware support required</string>
<string name="led_color">LED color</string>
</resources>

@ -33,11 +33,6 @@
android:showDefault="true"
android:showSilent="true"
android:title="@string/sound" />
<CheckBoxPreference
android:defaultValue="false"
android:dependency="@string/p_rmd_enabled"
android:key="@string/p_disable_notification_light"
android:title="@string/disable_notification_light" />
<com.todoroo.astrid.ui.MultilineCheckboxPreference
android:defaultValue="true"
android:dependency="@string/p_rmd_enabled"
@ -69,6 +64,23 @@
android:summary="@string/rmd_EPr_multiple_maxvolume_desc_true"
android:title="@string/rmd_EPr_multiple_maxvolume_title" />
<PreferenceCategory
android:title="@string/led_notification">
<CheckBoxPreference
android:defaultValue="true"
android:dependency="@string/p_rmd_enabled"
android:key="@string/p_led_notification"
android:title="@string/enabled"
android:summary="@string/hardware_support_required"/>
<Preference
android:key="@string/p_led_color"
android:dependency="@string/p_led_notification"
android:title="@string/led_color" />
</PreferenceCategory>
<PreferenceCategory
android:title="@string/vibrations">

Loading…
Cancel
Save