diff --git a/app/build.gradle b/app/build.gradle index 73e731f7..9fabca4c 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -59,7 +59,7 @@ android { defaultConfig { applicationId PACKAGE_NAME minSdk 19 - targetSdk 32 + targetSdk 33 versionCode getVerCode() versionName getVerName() } diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index 2e0581b4..3a33973d 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -1,11 +1,11 @@ - - + + = Build.VERSION_CODES.M - && activity.checkSelfPermission(Manifest.permission.WRITE_EXTERNAL_STORAGE) != PackageManager.PERMISSION_GRANTED - ) { - activity.requestPermissions(new String[]{Manifest.permission.WRITE_EXTERNAL_STORAGE}, 0); + Permissions permissions = new Permissions(activity); + if (permissions.noWriteStorage()) { + permissions.requestWriteStorage(); } final String exportDir = Environment.getExternalStoragePublicDirectory(getOutputDir()).getAbsolutePath(); diff --git a/app/src/main/java/io/github/sspanak/tt9/preferences/screens/languages/ItemDictionaryNotifications.java b/app/src/main/java/io/github/sspanak/tt9/preferences/screens/languages/ItemDictionaryNotifications.java new file mode 100644 index 00000000..9d150723 --- /dev/null +++ b/app/src/main/java/io/github/sspanak/tt9/preferences/screens/languages/ItemDictionaryNotifications.java @@ -0,0 +1,53 @@ +package io.github.sspanak.tt9.preferences.screens.languages; + +import androidx.preference.Preference; +import androidx.preference.SwitchPreferenceCompat; + +import io.github.sspanak.tt9.preferences.PreferencesActivity; +import io.github.sspanak.tt9.util.Permissions; + +public class ItemDictionaryNotifications { + public static final String NAME = "dictionary_notifications"; + + private final SwitchPreferenceCompat item; + private final Permissions permissions; + + + public ItemDictionaryNotifications(SwitchPreferenceCompat preference, PreferencesActivity activity) { + this.item = preference; + this.permissions = new Permissions(activity); + } + + + public ItemDictionaryNotifications populate() { + if (item == null) { + return this; + } + + boolean noPermission = permissions.noPostNotifications(); + item.setVisible(noPermission); + ((SwitchPreferenceCompat) item).setChecked(!noPermission); + + return this; + } + + + public ItemDictionaryNotifications enableClickHandler() { + if (item != null) { + item.setOnPreferenceChangeListener(this::onClick); + } + + return this; + } + + + protected boolean onClick(Preference p, Object value) { + if (value == Boolean.TRUE || permissions.noPostNotifications()) { + permissions.requestPostNotifications(); + } + + // Switch off the component on user refusal. Android will not allow permission request again. + item.setEnabled(false); + return !permissions.noPostNotifications(); + } +} diff --git a/app/src/main/java/io/github/sspanak/tt9/preferences/screens/languages/LanguagesScreen.java b/app/src/main/java/io/github/sspanak/tt9/preferences/screens/languages/LanguagesScreen.java index 7e718ff2..7a2add2d 100644 --- a/app/src/main/java/io/github/sspanak/tt9/preferences/screens/languages/LanguagesScreen.java +++ b/app/src/main/java/io/github/sspanak/tt9/preferences/screens/languages/LanguagesScreen.java @@ -26,6 +26,7 @@ public class LanguagesScreen extends BaseScreenFragment { @Override protected int getTitle() { return R.string.pref_choose_languages; } @Override protected int getXml() { return R.xml.prefs_screen_languages; } + @Override protected void onCreate() { ItemSelectLanguage multiSelect = new ItemSelectLanguage( @@ -34,6 +35,10 @@ public class LanguagesScreen extends BaseScreenFragment { ); multiSelect.populate().enableValidation(); + new ItemDictionaryNotifications(findPreference(ItemDictionaryNotifications.NAME), activity) + .populate() + .enableClickHandler(); + loadItem = new ItemLoadDictionary(findPreference(ItemLoadDictionary.NAME), activity, () -> ItemClickable.disableOthers(clickables, loadItem), @@ -77,6 +82,7 @@ public class LanguagesScreen extends BaseScreenFragment { refreshItems(); } + @Override public void onResume() { super.onResume(); diff --git a/app/src/main/java/io/github/sspanak/tt9/util/Permissions.java b/app/src/main/java/io/github/sspanak/tt9/util/Permissions.java new file mode 100644 index 00000000..c97c413b --- /dev/null +++ b/app/src/main/java/io/github/sspanak/tt9/util/Permissions.java @@ -0,0 +1,51 @@ +package io.github.sspanak.tt9.util; + + +import android.Manifest; +import android.app.Activity; +import android.content.pm.PackageManager; +import android.os.Build; + +public class Permissions { + private final Activity activity; + + public Permissions(Activity activity) { + this.activity = activity; + } + + public boolean noPostNotifications() { + return + Build.VERSION.SDK_INT >= Build.VERSION_CODES.TIRAMISU + && activity.shouldShowRequestPermissionRationale(Manifest.permission.POST_NOTIFICATIONS); + } + + public void requestPostNotifications() { + if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.TIRAMISU) { + requestPermission(Manifest.permission.POST_NOTIFICATIONS); + } + } + + public boolean noWriteStorage() { + return + Build.VERSION.SDK_INT < Build.VERSION_CODES.R + && isRefused(Manifest.permission.WRITE_EXTERNAL_STORAGE); + } + + public void requestWriteStorage() { + if (Build.VERSION.SDK_INT < Build.VERSION_CODES.R) { + requestPermission(Manifest.permission.WRITE_EXTERNAL_STORAGE); + } + } + + private void requestPermission(String permission) { + if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) { + activity.requestPermissions(new String[] { permission }, 0); + } + } + + private boolean isRefused(String permission) { + return + Build.VERSION.SDK_INT >= Build.VERSION_CODES.M + && activity.checkSelfPermission(permission) != PackageManager.PERMISSION_GRANTED; + } +} diff --git a/app/src/main/res/values-bg/strings.xml b/app/src/main/res/values-bg/strings.xml index 1b3734eb..f09cd371 100644 --- a/app/src/main/res/values-bg/strings.xml +++ b/app/src/main/res/values-bg/strings.xml @@ -64,6 +64,8 @@ Добавяне на нова дума Триене на текст Избор на клавиатура + Речникови известия + Получавайте известия за обновления на речника и за прогреса при зареждане. Изчистване на филтър Филтриране на думи Предишна дума diff --git a/app/src/main/res/values-de/strings.xml b/app/src/main/res/values-de/strings.xml index f586b91d..43fc985d 100644 --- a/app/src/main/res/values-de/strings.xml +++ b/app/src/main/res/values-de/strings.xml @@ -101,4 +101,6 @@ CSV wird exportiert… CSV wird exportiert (%1$s)… Layout auf dem Bildschirm + Wörterbuchbenachrichtigungen + Benachrichtigen über Wörterbuchaktualisierungen und den Ladevorgang. diff --git a/app/src/main/res/values-es/strings.xml b/app/src/main/res/values-es/strings.xml index c381ea07..67b90ffe 100644 --- a/app/src/main/res/values-es/strings.xml +++ b/app/src/main/res/values-es/strings.xml @@ -71,6 +71,8 @@ Configuración inicial Error Cambiar el teclado + Notificaciones del diccionario + Recibir notificaciones sobre actualizaciones del diccionario y sobre el progreso de la carga. Limpiar el filtro Filtrar sugerencias Sugerencia previa diff --git a/app/src/main/res/values-fr/strings.xml b/app/src/main/res/values-fr/strings.xml index 2b52871d..47637cbb 100644 --- a/app/src/main/res/values-fr/strings.xml +++ b/app/src/main/res/values-fr/strings.xml @@ -62,6 +62,8 @@ Ajouter un mot Retour arrière Changer le clavier + Notifications du dictionnaire + Recevoir des notifications sur les mises à jour du dictionnaire et sur la progression du chargement. Supprimer le filtre Filtrer les mots Mot précédent diff --git a/app/src/main/res/values-it/strings.xml b/app/src/main/res/values-it/strings.xml index 9ddf237b..86c21ca7 100644 --- a/app/src/main/res/values-it/strings.xml +++ b/app/src/main/res/values-it/strings.xml @@ -103,5 +103,7 @@ CSV in corso… CSV in corso (%1$s)… Layout sullo schermo + Notifiche del dizionario + Ricevere notifiche sugli aggiornamenti del dizionario e sul progresso del caricamento. diff --git a/app/src/main/res/values-iw/strings.xml b/app/src/main/res/values-iw/strings.xml index 855482b2..156f2b40 100644 --- a/app/src/main/res/values-iw/strings.xml +++ b/app/src/main/res/values-iw/strings.xml @@ -118,4 +118,6 @@ מייצא CSV… מייצא CSV (%1$s)… תצורת המקלדת על המסך + התראות מילון + לקבל התראות על עדכוני המילון ועל התקדמות הטעינה. diff --git a/app/src/main/res/values-lt/strings.xml b/app/src/main/res/values-lt/strings.xml index 6f40ea08..b5329675 100644 --- a/app/src/main/res/values-lt/strings.xml +++ b/app/src/main/res/values-lt/strings.xml @@ -74,6 +74,8 @@ Pridėti žodį Trinti Keisti klaviatūrą + Žodyno pranešimai + Gaukite pranešimus apie žodynų atnaujinimus ir įkėlimo progresą. Panaikinti filtrą Filtruoti pasiūlymus Ankstesnis pasiūlytas žodis diff --git a/app/src/main/res/values-nl/strings.xml b/app/src/main/res/values-nl/strings.xml index d64b69ac..e0219577 100644 --- a/app/src/main/res/values-nl/strings.xml +++ b/app/src/main/res/values-nl/strings.xml @@ -99,4 +99,6 @@ CSV exporteren… CSV exporteren (%1$s)… Indeling op het scherm + Woordenboekmeldingen + Ontvang meldingen over woordenboekupdates en de voortgang van het laden. diff --git a/app/src/main/res/values-pt-rBR/strings.xml b/app/src/main/res/values-pt-rBR/strings.xml index bcd5f20c..d6fb2173 100644 --- a/app/src/main/res/values-pt-rBR/strings.xml +++ b/app/src/main/res/values-pt-rBR/strings.xml @@ -120,4 +120,6 @@ Exportando CSV… Exportando CSV (%1$s)… Layout na tela + Notificações do dicionário + Receber notificações sobre atualizações do dicionário e sobre o progresso do carregamento. diff --git a/app/src/main/res/values-ru/strings.xml b/app/src/main/res/values-ru/strings.xml index fc6e3114..459df325 100644 --- a/app/src/main/res/values-ru/strings.xml +++ b/app/src/main/res/values-ru/strings.xml @@ -63,6 +63,8 @@ Добавить новое слово Стереть Выбор клавиатуры + Уведомления словаря + Получать уведомления о обновлениях словаря и о процессе загрузки. Удалить фильтр Фильтровать слова Предыдущее слово diff --git a/app/src/main/res/values-uk/strings.xml b/app/src/main/res/values-uk/strings.xml index f0d7a4f1..3ae688d2 100644 --- a/app/src/main/res/values-uk/strings.xml +++ b/app/src/main/res/values-uk/strings.xml @@ -99,6 +99,8 @@ Додати слово Стерти Змінити клавіатуру + Сповіщення словника + Отримувати повідомлення про оновлення словника та процес завантаження. Очистити фільтр Фільтрувати пропозиції Попередня пропозиція diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index d1c76c10..7e5c4fca 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -79,6 +79,8 @@ Please wait for the dictionary to load. Load Selected Loading failed. Dictionary for \"%1$s\" not found. + Dictionary Notifications + Get notified about dictionary updates and see the loading progress. Delete All Delete Unselected Dictionary deleted successfully. diff --git a/app/src/main/res/xml/prefs_screen_languages.xml b/app/src/main/res/xml/prefs_screen_languages.xml index fe81f2f0..d167609c 100644 --- a/app/src/main/res/xml/prefs_screen_languages.xml +++ b/app/src/main/res/xml/prefs_screen_languages.xml @@ -6,6 +6,13 @@ app:layout="@layout/pref_text" app:title="@string/pref_choose_languages" /> + +