From 8a9162832207253a3a1f7853a3bbd1eaddeeaf82 Mon Sep 17 00:00:00 2001 From: Normano64 Date: Thu, 19 May 2016 16:34:59 +0200 Subject: [PATCH 1/5] Detects if Do Not Disturb is in use. Can handle sms and phone calls from priority senders when in Priority only, but doesn't handle events and reminders. --- .../gadgetbridge/GBApplication.java | 40 +++++++++++++++++++ .../activities/SettingsActivity.java | 9 +++++ .../externalevents/K9Receiver.java | 12 ++++++ .../externalevents/NotificationListener.java | 14 +++++++ .../externalevents/PhoneCallReceiver.java | 18 +++++++++ .../externalevents/SMSReceiver.java | 18 +++++++++ app/src/main/res/values/strings.xml | 2 + app/src/main/res/xml/preferences.xml | 7 ++++ 8 files changed, 120 insertions(+) diff --git a/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/GBApplication.java b/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/GBApplication.java index e17c4584..eb934346 100644 --- a/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/GBApplication.java +++ b/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/GBApplication.java @@ -1,15 +1,20 @@ package nodomain.freeyourgadget.gadgetbridge; import android.app.Application; +import android.app.NotificationManager.Policy; import android.content.BroadcastReceiver; import android.content.Context; import android.content.Intent; import android.content.IntentFilter; import android.content.SharedPreferences; import android.content.res.Resources; +import android.database.Cursor; +import android.net.Uri; import android.os.Build; import android.os.Build.VERSION; import android.preference.PreferenceManager; +import android.provider.ContactsContract; +import android.provider.ContactsContract.PhoneLookup; import android.support.v4.content.LocalBroadcastManager; import android.util.Log; import android.util.TypedValue; @@ -247,6 +252,41 @@ public class GBApplication extends Application { return VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP; } + public static boolean isRunningMarshmallowOrLater() { + return VERSION.SDK_INT >= Build.VERSION_CODES.M; + } + + public static boolean isPriorityNumber(int prioritySenders, String number) { + Uri uri = Uri.withAppendedPath(PhoneLookup.CONTENT_FILTER_URI, Uri.encode(number)); + String[] projection = new String[]{PhoneLookup._ID, PhoneLookup.STARRED}; + Cursor cursor = context.getContentResolver().query(uri, projection, null, null, null); + boolean exists = false; + int starred = 0; + try { + if (cursor.moveToFirst()) { + exists = true; + starred = cursor.getInt(cursor.getColumnIndexOrThrow(PhoneLookup.STARRED)); + } + } finally { + if (cursor != null) { + cursor.close(); + } + } + switch (prioritySenders) { + case Policy.PRIORITY_SENDERS_ANY: + return true; + case Policy.PRIORITY_SENDERS_CONTACTS: + if (exists) { + return true; + } + case Policy.PRIORITY_SENDERS_STARRED: + if (PhoneLookup.STARRED.equals(starred)) { + return true; + } + } + return false; + } + public static HashSet blacklist = null; private static void loadBlackList() { diff --git a/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/activities/SettingsActivity.java b/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/activities/SettingsActivity.java index c8bfe835..3684fab8 100644 --- a/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/activities/SettingsActivity.java +++ b/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/activities/SettingsActivity.java @@ -1,13 +1,16 @@ package nodomain.freeyourgadget.gadgetbridge.activities; +import android.app.NotificationManager; import android.content.Intent; import android.content.pm.PackageManager; import android.content.pm.ResolveInfo; import android.os.Bundle; import android.preference.ListPreference; import android.preference.Preference; +import android.preference.PreferenceCategory; import android.support.v4.content.LocalBroadcastManager; import android.widget.Toast; +import android.service.notification.NotificationListenerService; import java.io.IOException; import java.util.List; @@ -107,6 +110,12 @@ public class SettingsActivity extends AbstractSettingsActivity { }); + if (!GBApplication.isRunningMarshmallowOrLater()) { + pref = findPreference("notification_filter"); + PreferenceCategory category = (PreferenceCategory) findPreference("pref_key_notifications"); + category.removePreference(pref); + } + // Get all receivers of Media Buttons Intent mediaButtonIntent = new Intent(Intent.ACTION_MEDIA_BUTTON); diff --git a/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/externalevents/K9Receiver.java b/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/externalevents/K9Receiver.java index 899ee0c6..732464aa 100644 --- a/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/externalevents/K9Receiver.java +++ b/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/externalevents/K9Receiver.java @@ -1,5 +1,6 @@ package nodomain.freeyourgadget.gadgetbridge.externalevents; +import android.app.NotificationManager; import android.content.BroadcastReceiver; import android.content.Context; import android.content.Intent; @@ -33,6 +34,17 @@ public class K9Receiver extends BroadcastReceiver { return; } } + if (prefs.getBoolean("notification_filter", false) && GBApplication.isRunningMarshmallowOrLater()) { + NotificationManager notificationManager = (NotificationManager) context.getSystemService(context.NOTIFICATION_SERVICE); + if (notificationManager.isNotificationPolicyAccessGranted()) { + switch (notificationManager.getCurrentInterruptionFilter()) { + case NotificationManager.INTERRUPTION_FILTER_ALARMS: + case NotificationManager.INTERRUPTION_FILTER_NONE: + case NotificationManager.INTERRUPTION_FILTER_PRIORITY: + return; + } + } + } String uriWanted = intent.getData().toString(); diff --git a/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/externalevents/NotificationListener.java b/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/externalevents/NotificationListener.java index 9f93618b..d7d64088 100644 --- a/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/externalevents/NotificationListener.java +++ b/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/externalevents/NotificationListener.java @@ -3,6 +3,7 @@ package nodomain.freeyourgadget.gadgetbridge.externalevents; import android.annotation.SuppressLint; import android.app.ActivityManager; import android.app.Notification; +import android.app.NotificationManager; import android.app.PendingIntent; import android.content.BroadcastReceiver; import android.content.Context; @@ -167,6 +168,19 @@ public class NotificationListener extends NotificationListenerService { return; } } + if (prefs.getBoolean("notification_filter", false) && GBApplication.isRunningMarshmallowOrLater()) { + NotificationManager notificationManager = (NotificationManager) getSystemService(NOTIFICATION_SERVICE); + if (notificationManager.isNotificationPolicyAccessGranted()) { + switch (notificationManager.getCurrentInterruptionFilter()) { + case NotificationManager.INTERRUPTION_FILTER_ALARMS: + case NotificationManager.INTERRUPTION_FILTER_NONE: + return; + case NotificationManager.INTERRUPTION_FILTER_PRIORITY: + // FIXME: Handle Reminders and Events if they are enabled in Do Not Disturb + return; + } + } + } String source = sbn.getPackageName(); Notification notification = sbn.getNotification(); diff --git a/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/externalevents/PhoneCallReceiver.java b/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/externalevents/PhoneCallReceiver.java index 496872db..eb344df1 100644 --- a/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/externalevents/PhoneCallReceiver.java +++ b/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/externalevents/PhoneCallReceiver.java @@ -1,5 +1,6 @@ package nodomain.freeyourgadget.gadgetbridge.externalevents; +import android.app.NotificationManager; import android.content.BroadcastReceiver; import android.content.Context; import android.content.Intent; @@ -67,6 +68,23 @@ public class PhoneCallReceiver extends BroadcastReceiver { if ("never".equals(prefs.getString("notification_mode_calls", "always"))) { return; } + if (prefs.getBoolean("notification_filter", false) && GBApplication.isRunningMarshmallowOrLater()) { + NotificationManager notificationManager = (NotificationManager) context.getSystemService(context.NOTIFICATION_SERVICE); + if (notificationManager.isNotificationPolicyAccessGranted()) { + switch (notificationManager.getCurrentInterruptionFilter()) { + case NotificationManager.INTERRUPTION_FILTER_ALARMS: + case NotificationManager.INTERRUPTION_FILTER_NONE: + return; + case NotificationManager.INTERRUPTION_FILTER_PRIORITY: + NotificationManager.Policy notificationPolicy = notificationManager.getNotificationPolicy(); + if (!GBApplication.isPriorityNumber(notificationPolicy.priorityCallSenders, mSavedNumber)) { + return; + } + // FIXME: Handle Repeat callers if it is enabled in Do Not Disturb + break; + } + } + } CallSpec callSpec = new CallSpec(); callSpec.number = mSavedNumber; callSpec.command = callCommand; diff --git a/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/externalevents/SMSReceiver.java b/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/externalevents/SMSReceiver.java index 0404cbc2..05372ab3 100644 --- a/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/externalevents/SMSReceiver.java +++ b/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/externalevents/SMSReceiver.java @@ -1,11 +1,13 @@ package nodomain.freeyourgadget.gadgetbridge.externalevents; +import android.app.NotificationManager; import android.content.BroadcastReceiver; import android.content.Context; import android.content.Intent; import android.os.Bundle; import android.os.PowerManager; import android.telephony.SmsMessage; +import android.util.Log; import nodomain.freeyourgadget.gadgetbridge.GBApplication; import nodomain.freeyourgadget.gadgetbridge.model.NotificationSpec; @@ -41,6 +43,22 @@ public class SMSReceiver extends BroadcastReceiver { notificationSpec.body = message.getDisplayMessageBody(); notificationSpec.phoneNumber = message.getOriginatingAddress(); if (notificationSpec.phoneNumber != null) { + if (prefs.getBoolean("notification_filter", false) && GBApplication.isRunningMarshmallowOrLater()) { + NotificationManager notificationManager = (NotificationManager) context.getSystemService(context.NOTIFICATION_SERVICE); + if (notificationManager.isNotificationPolicyAccessGranted()) { + switch (notificationManager.getCurrentInterruptionFilter()) { + case NotificationManager.INTERRUPTION_FILTER_ALARMS: + case NotificationManager.INTERRUPTION_FILTER_NONE: + return; + case NotificationManager.INTERRUPTION_FILTER_PRIORITY: + NotificationManager.Policy notificationPolicy = notificationManager.getNotificationPolicy(); + if (!GBApplication.isPriorityNumber(notificationPolicy.priorityMessageSenders, notificationSpec.phoneNumber)) { + return; + } + break; + } + } + } GBApplication.deviceService().onNotification(notificationSpec); } } diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index 133216e5..95f0f188 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -52,6 +52,8 @@ Support for applications which send Notifications to the Pebble via Intent. Can be used for Conversations. Generic notification support … also when screen is on + Do Not Disturb + Stop unwanted Notifications from being sent based on the Do Not Disturb mode. always when screen is off diff --git a/app/src/main/res/xml/preferences.xml b/app/src/main/res/xml/preferences.xml index 4def8d01..6ae2be49 100644 --- a/app/src/main/res/xml/preferences.xml +++ b/app/src/main/res/xml/preferences.xml @@ -77,6 +77,13 @@ android:defaultValue="false" android:key="notifications_generic_whenscreenon" android:title="@string/pref_title_whenscreenon" /> + + + From 2e2030f67b8494d236a0b335e6b8f223ed8f1d02 Mon Sep 17 00:00:00 2001 From: cpfeiffer Date: Thu, 19 May 2016 22:07:55 +0200 Subject: [PATCH 2/5] Update translations from transifex, thanks! --- app/src/main/res/values-es/strings.xml | 6 +----- app/src/main/res/values-fr/strings.xml | 2 +- app/src/main/res/values-it/strings.xml | 6 +----- app/src/main/res/values-ko/strings.xml | 3 ++- app/src/main/res/values-pl/strings.xml | 6 +----- app/src/main/res/values-ru/strings.xml | 6 +----- app/src/main/res/values-uk/strings.xml | 9 ++++----- app/src/main/res/values-vi/strings.xml | 3 --- 8 files changed, 11 insertions(+), 30 deletions(-) diff --git a/app/src/main/res/values-es/strings.xml b/app/src/main/res/values-es/strings.xml index 6dc1e3cc..adf7da93 100644 --- a/app/src/main/res/values-es/strings.xml +++ b/app/src/main/res/values-es/strings.xml @@ -69,8 +69,6 @@ Notificación de prueba desde Gadgetbridge Bluetooth no está soportado. Bluetooth está desactivado. - pulsa el dispositivo conectado para el Gestor de App - pulsa un dispositivo para conectar No se puede conectar. ¿Dirección BT incorrecta? Gadgetbridge funcionando instalando binario %1$d/%2$d @@ -101,13 +99,11 @@ No se han proporcionado datos de usuario válidos, se usarán datos de usuario por defecto. Cuando tu MiBand vibre y parpadee, púlsala repetidas veces. Instalar - Haz visible tu dispositivo. No es probable que se detecten los dispositivos que ya están conectados. Nota: Imagen del dispositivo Nombre/Apodo Número de vibraciones Monitor de sueño - Guardar logs iniciando Recuperando datos de actividad Desde %1$s a %2$s @@ -178,9 +174,9 @@ Pasos Actividad Pasos hoy, objetivo: %1$s + No confirmar transferencia Si los datos no son marcados como descargados, no serán borrados de tu MiBand. Útil si Gadgetbridge se usa conjuntamente con otras apps. Mantendrá los datos de actividad en la MiBand incluso después de la sincronización. Útil si GB se usa junto con otras apps. - No confirmar transferencia Historial de pasos Pasos/min actuales Pasos totales diff --git a/app/src/main/res/values-fr/strings.xml b/app/src/main/res/values-fr/strings.xml index 4324f1f6..0ae83aa0 100644 --- a/app/src/main/res/values-fr/strings.xml +++ b/app/src/main/res/values-fr/strings.xml @@ -178,9 +178,9 @@ Pas Activité en direct Nombre de pas aujourd\'hui, objectif: %1$s + Ne pas confirmer le transfert de données d\'activités Les données d\'activités ne seront pas effacées du bracelet si elles ne sont pas confirmées. Utile si GB est utilisé avec d\'autres applications. Les données d\'activités seront conservées sur le Mi Band après la synchronisation. Utile si GB est utilisé avec d\'autres applications. - Ne pas confirmer le transfert de données d\'activités Historique de pas Pas/minute actuel Nombre total de pas diff --git a/app/src/main/res/values-it/strings.xml b/app/src/main/res/values-it/strings.xml index 14f87afb..3f1e3135 100644 --- a/app/src/main/res/values-it/strings.xml +++ b/app/src/main/res/values-it/strings.xml @@ -70,8 +70,6 @@ Notifica di prova creata da Gadgetbridge Bluetooth non supportato. Bluetooth disabilitato. - tocca il dispositivo connesso per gestire le App - tocca il dispositivo da connettere Impossibile connettersi. Indirizzo BT non valido? Gadgetbridge in esecuzione installazione del binario %1$d/%2$d @@ -102,13 +100,11 @@ Dati dell\'utente non inseriti, vengono usati dati d\'esempio. Quando la Mi Band vibra e lampeggia, dalle qualche leggero colpetto. Installa - Imposta il tuo dispositivo perchè sia rilevabile. I dispositivi attualmente connessi non saranno probabilmente rilevati. Nota: Immagine dispositivo Nome / Soprannome Numero vibrazioni Monitoraggio del sonno - Salva il log su file inizializzazione in corso Recupero dati attività Da %1$s a %2$s @@ -179,9 +175,9 @@ Passi Attività in tempo reale Passi di oggi, traguardo: %1$s + Non confermare il trasferimento dati Se il trasferimento non viene confermato, i dati rimangono memorizzati sulla Mi Band. Utile se GB è usato insieme ad altre app. Conserva i dati delle attività sulla Mi Band anche dopo averli sincronizzati. Utile se GB è usato insieme ad altre app. - Non confermare il trasferimento dati Storico dei passi Passi/minuto Passi totali diff --git a/app/src/main/res/values-ko/strings.xml b/app/src/main/res/values-ko/strings.xml index ddce42bc..2afb4a02 100644 --- a/app/src/main/res/values-ko/strings.xml +++ b/app/src/main/res/values-ko/strings.xml @@ -181,9 +181,9 @@ 걸음 수 실시간 활동 오늘 걸음 수, 목표: %1$s + 활동 데이터 전송을 확인하지 않음 만약 활동 데이터가 밴드에 확인되지 않았다면, 지워지지 않을 것입니다. 가젯브릿지가 다른 앱들과 같이 사용될 때 유용합니다. 동기화 이후에도 Mi Band의 활동 데이터가 유지될 것입니다. 가젯브릿지가 다른 앱들과 같이 사용될 때 유용합니다. - 활동 데이터 전송을 확인하지 않음 걸음 수 기록 현재의 분당 걸음 수 전체 걸음 수 @@ -224,4 +224,5 @@ 펌웨어가 전송되지 않음 심박수 심박수 + 자동으로 재연결 diff --git a/app/src/main/res/values-pl/strings.xml b/app/src/main/res/values-pl/strings.xml index f1748748..bc0929a3 100644 --- a/app/src/main/res/values-pl/strings.xml +++ b/app/src/main/res/values-pl/strings.xml @@ -67,8 +67,6 @@ To jest testowe powiadomienie z Gadgetbridge Bluetooth nie jest obsługiwane Bluetooth jest wyłączone - Kliknij podłączone urządzenia dla zarządzania aplikacjami - kliknij urządzenie by połączyć Nie można połączyć. Adres BT nieprawidłowy? Gadgetbridge działa Instalowanie binarki %1$d/%2$d @@ -99,13 +97,11 @@ Brak prawidłowych danych użytkownika, używam danych zastępczych na ten moment. Gdy twój Mi Band wibruje i błyska, stuknij go kilka razy pod rząd. instaluj - Uwidocznij swoje urządzenie. Aktualnie połączone urządzenia prawdopodobnie nie będą znalezione. Uwaga Obraz urządzenia Nazwisko/Pseudonim Liczba wibracji Monitor snu - Zapisuj logi Uruchamianie Pobieranie danych aktywności Od %1$s do %2$s @@ -176,9 +172,9 @@ Kroki Ostatnia aktywność Kroków dziś, cel: %1$s + Nie wysyłaj danych aktywności Gdy dane aktywności nie są przesłane na opaskę, wtedy nie będą usuwane. Przydatne gdy Gadgetbridge jest używany wraz z innymi aplikacjami Dane aktywności będą zachowane na Mi Band nawet po synchronizacji. Przydatne gdy Gadgetbridge jest używany z innymi aplikacjami. - Nie wysyłaj danych aktywności Historia kroków Aktualnie kroków/min Kroków łącznie diff --git a/app/src/main/res/values-ru/strings.xml b/app/src/main/res/values-ru/strings.xml index 5039e880..5ea805eb 100644 --- a/app/src/main/res/values-ru/strings.xml +++ b/app/src/main/res/values-ru/strings.xml @@ -68,8 +68,6 @@ Это тестовое уведомление от Gadgetbridge Bluetooth не поддерживается. Bluetooth отключён. - нажмите на подключённое устройство для App Manager - нажмите на устройство для соединения Не удалось соединиться. Неверен адрес BT? Gadgetbridge запущен установки бинарного файла %1$d/%2$d @@ -100,13 +98,11 @@ Не предоставлено действительных данных пользователя. Используются данные по-умолчанию. Когда ваш Mi Band вибрирует и мигает, постучите по нему несколько раз. Установить - Подключённые в настоящее время устройства, скорее всего, не будут обнаружены. Заметка: Изображение устройства Имя/псевдоним Количество вибраций Анализ сна - Записывать файлы журнала Инициализация Получение данных активности От %1$s до %2$s @@ -177,9 +173,9 @@ Шаги Жизненная активность Шагов сегодня, цель: %1$s + Не передавать данные об активности Если данные об активности не будут переданы на устройство, оно не будет очищено. Полезно, если GB используется с другими приложениями. Хранить данные о деятельности на Mi Band, даже после синхронизации. Полезно, если Mi Band используется совместно с другими приложениями. - Не передавать данные об активности История шагов Текущие шаги в минуту Всего шагов diff --git a/app/src/main/res/values-uk/strings.xml b/app/src/main/res/values-uk/strings.xml index f0d6f36a..7f79179f 100644 --- a/app/src/main/res/values-uk/strings.xml +++ b/app/src/main/res/values-uk/strings.xml @@ -31,6 +31,9 @@ Дата і час Синхронізувати час під час з\'єднання Синхронізувати час під час з\'єднання з пристроєм, а також під час зміни часу чи часової зони в системі + Тема + Світла + Темна Сповіщення Повтори Виклики @@ -67,8 +70,6 @@ Це тестове сповіщення від Gadgetbridge Bluetooth не підтримується. Bluetooth вимкнуто. - натисніть на під\'єднаний пристрій для App Manager - натисніть на пристрій для з\'єднання Не вдалося з\'єднатися. Можливо помилкова адреса BT? Gadgetbridge запущено встановлення бінарного файлу %1$d/%2$d @@ -99,13 +100,11 @@ Не отримано дійсних даних користувача. Використовуються типові дані. Коли ваш Mi—Band вібрує та блимає, постукайте по ньому кілька раз. Встановити - Під\'єднані на даний момент пристрої, скоріш за все не будуть виявлені. Замітка: Зображення пристрою Ім\'я/нік Кількість вібрацій Аналіз сну - Записувати файли звіту Ініціалізація… Отримання даних активності Від %1$s до %2$s @@ -176,9 +175,9 @@ Кроки Життєва активність Кроків сьогодні, мета: %1$s + Не передавати дані про активність Якщо дані не будуть передані на пристрій, пристрій не буде очищений. Корисно, якщо Gadgetbridge використовується разом з іншими додатками. Дозволяє лишити дані на Mi-браслеті після синхронізації. Зазвичай використовується, якщо GB працює ще з іншими додатками. - Не передавати дані про активність Історія кроків Поточні кроки/хв Загалом кроків diff --git a/app/src/main/res/values-vi/strings.xml b/app/src/main/res/values-vi/strings.xml index af3de63c..f41f8478 100644 --- a/app/src/main/res/values-vi/strings.xml +++ b/app/src/main/res/values-vi/strings.xml @@ -52,8 +52,6 @@ Đây là một kiểm tra thông báo từ Gadgetbridge Không hỗ trợ Bluetooth. Đã tắt Bluetooth. - chạm vào thiết bị đã kết nối để chạy Trình quản lý ứng dụng - chạm vào một thiết bị để kết nối Không thể kết nối. Địa chỉ BT không hợp lệ? Gadgetbridge đang chạy đang cài phần mềm chạy %1$d/%2$d @@ -83,7 +81,6 @@ Ảnh thiết bị Tên/Bí danh Trình giám sát giấc ngủ - Ghi tập tin nhật ký đang khởi chạy Từ %1$s đến %2$s Đeo bên trái hay phải? From cfed531ad0a45892925198e8c9515db15a3225f7 Mon Sep 17 00:00:00 2001 From: cpfeiffer Date: Thu, 19 May 2016 22:33:27 +0200 Subject: [PATCH 3/5] Add list of contributors --- CONTRIBUTORS.md | 27 +++++++++++++++++++++++++++ 1 file changed, 27 insertions(+) create mode 100644 CONTRIBUTORS.md diff --git a/CONTRIBUTORS.md b/CONTRIBUTORS.md new file mode 100644 index 00000000..752c6abb --- /dev/null +++ b/CONTRIBUTORS.md @@ -0,0 +1,27 @@ + Andreas Shimokawa + cpfeiffer + Daniele Gobbetti + Daniele Gobbetti + danielegobbetti + Carsten Pfeiffer + Julien Pivotto + Lem Dulfo + Sergey Trofimov + Daniele Gobbetti + cpfeiffer + 0nse <0nse@users.noreply.github.com> + Christian Fischer + Ⲇⲁⲛⲓ Φi + xphnx + Tarik Sekmen + rober + Nicolò Balzarotti + Marc Schlaich + kevlarcade + Kasha + Chris Perelstein + Alexey Afanasev + +And all the Transifex translators, which I cannot automatically list, at the moment. + +git log --raw | grep "^Author: " | sort | uniq -c | sort -k 1 -n -r | cut -f 2- -d: > CONTRIBUTORS.md From 31eabe960527f5fa853e6e2d880dbfd1556f563e Mon Sep 17 00:00:00 2001 From: Normano64 Date: Thu, 19 May 2016 23:58:13 +0200 Subject: [PATCH 4/5] Fixed things based on feedback --- .../gadgetbridge/GBApplication.java | 77 ++++++++++++------- .../activities/SettingsActivity.java | 2 - .../externalevents/K9Receiver.java | 17 ++-- .../externalevents/NotificationListener.java | 21 +++-- .../externalevents/PhoneCallReceiver.java | 27 +++---- .../externalevents/SMSReceiver.java | 26 +++---- 6 files changed, 90 insertions(+), 80 deletions(-) diff --git a/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/GBApplication.java b/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/GBApplication.java index eb934346..e1aa01a2 100644 --- a/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/GBApplication.java +++ b/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/GBApplication.java @@ -1,6 +1,7 @@ package nodomain.freeyourgadget.gadgetbridge; import android.app.Application; +import android.app.NotificationManager; import android.app.NotificationManager.Policy; import android.content.BroadcastReceiver; import android.content.Context; @@ -13,7 +14,6 @@ import android.net.Uri; import android.os.Build; import android.os.Build.VERSION; import android.preference.PreferenceManager; -import android.provider.ContactsContract; import android.provider.ContactsContract.PhoneLookup; import android.support.v4.content.LocalBroadcastManager; import android.util.Log; @@ -64,6 +64,7 @@ public class GBApplication extends Application { private static Appender fileLogger; private static Prefs prefs; private static GBPrefs gbPrefs; + private static NotificationManager notificationManager; public static final String ACTION_QUIT = "nodomain.freeyourgadget.gadgetbridge.gbapplication.action.quit"; @@ -124,6 +125,10 @@ public class GBApplication extends Application { filterLocal.addAction(ACTION_QUIT); LocalBroadcastManager.getInstance(this).registerReceiver(mReceiver, filterLocal); + if (isRunningMarshmallowOrLater()) { + notificationManager = (NotificationManager) context.getSystemService(context.NOTIFICATION_SERVICE); + } + // for testing DB stuff // SQLiteDatabase db = mActivityDatabaseHandler.getWritableDatabase(); // db.close(); @@ -256,37 +261,57 @@ public class GBApplication extends Application { return VERSION.SDK_INT >= Build.VERSION_CODES.M; } - public static boolean isPriorityNumber(int prioritySenders, String number) { - Uri uri = Uri.withAppendedPath(PhoneLookup.CONTENT_FILTER_URI, Uri.encode(number)); - String[] projection = new String[]{PhoneLookup._ID, PhoneLookup.STARRED}; - Cursor cursor = context.getContentResolver().query(uri, projection, null, null, null); - boolean exists = false; - int starred = 0; - try { - if (cursor.moveToFirst()) { - exists = true; - starred = cursor.getInt(cursor.getColumnIndexOrThrow(PhoneLookup.STARRED)); + private static boolean isPrioritySender(int prioritySenders, String number) { + if (prioritySenders == Policy.PRIORITY_SENDERS_ANY) { + return true; + } else { + Uri uri = Uri.withAppendedPath(PhoneLookup.CONTENT_FILTER_URI, Uri.encode(number)); + String[] projection = new String[]{PhoneLookup._ID, PhoneLookup.STARRED}; + Cursor cursor = context.getContentResolver().query(uri, projection, null, null, null); + boolean exists = false; + int starred = 0; + try { + if (cursor.moveToFirst()) { + exists = true; + starred = cursor.getInt(cursor.getColumnIndexOrThrow(PhoneLookup.STARRED)); + } + } finally { + if (cursor != null) { + cursor.close(); + } } - } finally { - if (cursor != null) { - cursor.close(); - } - } - switch (prioritySenders) { - case Policy.PRIORITY_SENDERS_ANY: + if (prioritySenders == Policy.PRIORITY_SENDERS_CONTACTS && exists) { return true; - case Policy.PRIORITY_SENDERS_CONTACTS: - if (exists) { - return true; - } - case Policy.PRIORITY_SENDERS_STARRED: - if (PhoneLookup.STARRED.equals(starred)) { - return true; - } + } else if (prioritySenders == Policy.PRIORITY_SENDERS_STARRED && starred == 1) { + return true; + } + return false; + } + } + + public static boolean isPriorityNumber(int priorityType, String number) { + NotificationManager.Policy notificationPolicy = notificationManager.getNotificationPolicy(); + if(priorityType == Policy.PRIORITY_CATEGORY_MESSAGES) { + if ((notificationPolicy.priorityCategories & Policy.PRIORITY_CATEGORY_MESSAGES) == Policy.PRIORITY_CATEGORY_MESSAGES) { + return isPrioritySender(notificationPolicy.priorityMessageSenders, number); + } + } else if (priorityType == Policy.PRIORITY_CATEGORY_CALLS) { + if ((notificationPolicy.priorityCategories & Policy.PRIORITY_CATEGORY_CALLS) == Policy.PRIORITY_CATEGORY_CALLS) { + return isPrioritySender(notificationPolicy.priorityCallSenders, number); + } } return false; } + public static int getGrantedInterruptionFilter() { + if (prefs.getBoolean("notification_filter", false) && GBApplication.isRunningMarshmallowOrLater()) { + if (notificationManager.isNotificationPolicyAccessGranted()) { + return notificationManager.getCurrentInterruptionFilter(); + } + } + return NotificationManager.INTERRUPTION_FILTER_ALL; + } + public static HashSet blacklist = null; private static void loadBlackList() { diff --git a/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/activities/SettingsActivity.java b/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/activities/SettingsActivity.java index 3684fab8..c6479695 100644 --- a/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/activities/SettingsActivity.java +++ b/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/activities/SettingsActivity.java @@ -1,6 +1,5 @@ package nodomain.freeyourgadget.gadgetbridge.activities; -import android.app.NotificationManager; import android.content.Intent; import android.content.pm.PackageManager; import android.content.pm.ResolveInfo; @@ -10,7 +9,6 @@ import android.preference.Preference; import android.preference.PreferenceCategory; import android.support.v4.content.LocalBroadcastManager; import android.widget.Toast; -import android.service.notification.NotificationListenerService; import java.io.IOException; import java.util.List; diff --git a/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/externalevents/K9Receiver.java b/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/externalevents/K9Receiver.java index 732464aa..439c34b0 100644 --- a/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/externalevents/K9Receiver.java +++ b/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/externalevents/K9Receiver.java @@ -34,16 +34,13 @@ public class K9Receiver extends BroadcastReceiver { return; } } - if (prefs.getBoolean("notification_filter", false) && GBApplication.isRunningMarshmallowOrLater()) { - NotificationManager notificationManager = (NotificationManager) context.getSystemService(context.NOTIFICATION_SERVICE); - if (notificationManager.isNotificationPolicyAccessGranted()) { - switch (notificationManager.getCurrentInterruptionFilter()) { - case NotificationManager.INTERRUPTION_FILTER_ALARMS: - case NotificationManager.INTERRUPTION_FILTER_NONE: - case NotificationManager.INTERRUPTION_FILTER_PRIORITY: - return; - } - } + switch (GBApplication.getGrantedInterruptionFilter()) { + case NotificationManager.INTERRUPTION_FILTER_ALL: + break; + case NotificationManager.INTERRUPTION_FILTER_ALARMS: + case NotificationManager.INTERRUPTION_FILTER_NONE: + case NotificationManager.INTERRUPTION_FILTER_PRIORITY: + return; } String uriWanted = intent.getData().toString(); diff --git a/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/externalevents/NotificationListener.java b/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/externalevents/NotificationListener.java index d7d64088..a3c3d37c 100644 --- a/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/externalevents/NotificationListener.java +++ b/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/externalevents/NotificationListener.java @@ -168,18 +168,15 @@ public class NotificationListener extends NotificationListenerService { return; } } - if (prefs.getBoolean("notification_filter", false) && GBApplication.isRunningMarshmallowOrLater()) { - NotificationManager notificationManager = (NotificationManager) getSystemService(NOTIFICATION_SERVICE); - if (notificationManager.isNotificationPolicyAccessGranted()) { - switch (notificationManager.getCurrentInterruptionFilter()) { - case NotificationManager.INTERRUPTION_FILTER_ALARMS: - case NotificationManager.INTERRUPTION_FILTER_NONE: - return; - case NotificationManager.INTERRUPTION_FILTER_PRIORITY: - // FIXME: Handle Reminders and Events if they are enabled in Do Not Disturb - return; - } - } + switch (GBApplication.getGrantedInterruptionFilter()) { + case NotificationManager.INTERRUPTION_FILTER_ALL: + break; + case NotificationManager.INTERRUPTION_FILTER_ALARMS: + case NotificationManager.INTERRUPTION_FILTER_NONE: + return; + case NotificationManager.INTERRUPTION_FILTER_PRIORITY: + // FIXME: Handle Reminders and Events if they are enabled in Do Not Disturb + return; } String source = sbn.getPackageName(); diff --git a/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/externalevents/PhoneCallReceiver.java b/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/externalevents/PhoneCallReceiver.java index eb344df1..29693538 100644 --- a/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/externalevents/PhoneCallReceiver.java +++ b/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/externalevents/PhoneCallReceiver.java @@ -1,6 +1,7 @@ package nodomain.freeyourgadget.gadgetbridge.externalevents; import android.app.NotificationManager; +import android.app.NotificationManager.Policy; import android.content.BroadcastReceiver; import android.content.Context; import android.content.Intent; @@ -68,22 +69,18 @@ public class PhoneCallReceiver extends BroadcastReceiver { if ("never".equals(prefs.getString("notification_mode_calls", "always"))) { return; } - if (prefs.getBoolean("notification_filter", false) && GBApplication.isRunningMarshmallowOrLater()) { - NotificationManager notificationManager = (NotificationManager) context.getSystemService(context.NOTIFICATION_SERVICE); - if (notificationManager.isNotificationPolicyAccessGranted()) { - switch (notificationManager.getCurrentInterruptionFilter()) { - case NotificationManager.INTERRUPTION_FILTER_ALARMS: - case NotificationManager.INTERRUPTION_FILTER_NONE: - return; - case NotificationManager.INTERRUPTION_FILTER_PRIORITY: - NotificationManager.Policy notificationPolicy = notificationManager.getNotificationPolicy(); - if (!GBApplication.isPriorityNumber(notificationPolicy.priorityCallSenders, mSavedNumber)) { - return; - } - // FIXME: Handle Repeat callers if it is enabled in Do Not Disturb - break; + switch (GBApplication.getGrantedInterruptionFilter()) { + case NotificationManager.INTERRUPTION_FILTER_ALL: + break; + case NotificationManager.INTERRUPTION_FILTER_ALARMS: + case NotificationManager.INTERRUPTION_FILTER_NONE: + return; + case NotificationManager.INTERRUPTION_FILTER_PRIORITY: + if (GBApplication.isPriorityNumber(Policy.PRIORITY_CATEGORY_CALLS, mSavedNumber)) { + break; } - } + // FIXME: Handle Repeat callers if it is enabled in Do Not Disturb + return; } CallSpec callSpec = new CallSpec(); callSpec.number = mSavedNumber; diff --git a/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/externalevents/SMSReceiver.java b/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/externalevents/SMSReceiver.java index 05372ab3..5df07c8d 100644 --- a/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/externalevents/SMSReceiver.java +++ b/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/externalevents/SMSReceiver.java @@ -1,13 +1,13 @@ package nodomain.freeyourgadget.gadgetbridge.externalevents; import android.app.NotificationManager; +import android.app.NotificationManager.Policy; import android.content.BroadcastReceiver; import android.content.Context; import android.content.Intent; import android.os.Bundle; import android.os.PowerManager; import android.telephony.SmsMessage; -import android.util.Log; import nodomain.freeyourgadget.gadgetbridge.GBApplication; import nodomain.freeyourgadget.gadgetbridge.model.NotificationSpec; @@ -43,21 +43,17 @@ public class SMSReceiver extends BroadcastReceiver { notificationSpec.body = message.getDisplayMessageBody(); notificationSpec.phoneNumber = message.getOriginatingAddress(); if (notificationSpec.phoneNumber != null) { - if (prefs.getBoolean("notification_filter", false) && GBApplication.isRunningMarshmallowOrLater()) { - NotificationManager notificationManager = (NotificationManager) context.getSystemService(context.NOTIFICATION_SERVICE); - if (notificationManager.isNotificationPolicyAccessGranted()) { - switch (notificationManager.getCurrentInterruptionFilter()) { - case NotificationManager.INTERRUPTION_FILTER_ALARMS: - case NotificationManager.INTERRUPTION_FILTER_NONE: - return; - case NotificationManager.INTERRUPTION_FILTER_PRIORITY: - NotificationManager.Policy notificationPolicy = notificationManager.getNotificationPolicy(); - if (!GBApplication.isPriorityNumber(notificationPolicy.priorityMessageSenders, notificationSpec.phoneNumber)) { - return; - } - break; + switch (GBApplication.getGrantedInterruptionFilter()) { + case NotificationManager.INTERRUPTION_FILTER_ALL: + break; + case NotificationManager.INTERRUPTION_FILTER_ALARMS: + case NotificationManager.INTERRUPTION_FILTER_NONE: + return; + case NotificationManager.INTERRUPTION_FILTER_PRIORITY: + if (GBApplication.isPriorityNumber(Policy.PRIORITY_CATEGORY_MESSAGES, notificationSpec.phoneNumber)) { + break; } - } + return; } GBApplication.deviceService().onNotification(notificationSpec); } From a97efe15132c20548dcb1c9cc3639dd76984bf2c Mon Sep 17 00:00:00 2001 From: cpfeiffer Date: Fri, 20 May 2016 21:31:30 +0200 Subject: [PATCH 5/5] Updated contributors --- CONTRIBUTORS.md | 1 + 1 file changed, 1 insertion(+) diff --git a/CONTRIBUTORS.md b/CONTRIBUTORS.md index 752c6abb..1637e814 100644 --- a/CONTRIBUTORS.md +++ b/CONTRIBUTORS.md @@ -11,6 +11,7 @@ cpfeiffer 0nse <0nse@users.noreply.github.com> Christian Fischer + Normano64 Ⲇⲁⲛⲓ Φi xphnx Tarik Sekmen