1
0
Fork 0

repaced the 'dictionary update available' popup with a notification

This commit is contained in:
sspanak 2024-04-12 14:02:28 +03:00 committed by Dimo Karaivanov
parent 17f1681be5
commit 28a81740ff
25 changed files with 126 additions and 50 deletions

View file

@ -24,8 +24,8 @@ import io.github.sspanak.tt9.languages.Language;
import io.github.sspanak.tt9.languages.exceptions.InvalidLanguageCharactersException;
import io.github.sspanak.tt9.languages.exceptions.InvalidLanguageException;
import io.github.sspanak.tt9.preferences.settings.SettingsStore;
import io.github.sspanak.tt9.ui.dialogs.ConfirmDictionaryUpdateDialog;
import io.github.sspanak.tt9.ui.notifications.DictionaryLoadingBar;
import io.github.sspanak.tt9.ui.notifications.DictionaryUpdateNotification;
import io.github.sspanak.tt9.util.ConsumerCompat;
import io.github.sspanak.tt9.util.Logger;
import io.github.sspanak.tt9.util.Timer;
@ -130,7 +130,7 @@ public class DictionaryLoader {
}
// or if the database is outdated, compared to the dictionary file, ask for confirmation and load
else if (!hash.equals(new WordFile(language.getDictionaryFile(), self.assets).getHash())) {
ConfirmDictionaryUpdateDialog.show(context, language.getId());
new DictionaryUpdateNotification(context, language).show();
}
},
language

View file

@ -105,6 +105,8 @@ public class TraditionalT9 extends HotkeyHandler {
initUi();
}
DictionaryLoader.autoLoad(this, mLanguage);
return true;
}

View file

@ -8,7 +8,7 @@ public class SettingsStore extends SettingsUI {
/************* internal settings *************/
public final static int DELETE_WORDS_SEARCH_DELAY = 500; // ms
public final static int DICTIONARY_AUTO_LOAD_COOLDOWN_TIME = 86400000; // 24 hours in ms
public final static int DICTIONARY_AUTO_LOAD_COOLDOWN_TIME = 1200000; // 20 minutes in ms
public final static int DICTIONARY_IMPORT_BATCH_SIZE = 5000; // words
public final static int DICTIONARY_IMPORT_PROGRESS_UPDATE_TIME = 250; // ms
public final static byte SLOW_QUERY_TIME = 50; // ms

View file

@ -2,29 +2,24 @@ package io.github.sspanak.tt9.ui.dialogs;
import android.content.Context;
import android.content.Intent;
import android.inputmethodservice.InputMethodService;
import androidx.annotation.NonNull;
import io.github.sspanak.tt9.R;
import io.github.sspanak.tt9.db.DictionaryLoader;
import io.github.sspanak.tt9.languages.Language;
import io.github.sspanak.tt9.languages.LanguageCollection;
import io.github.sspanak.tt9.util.ConsumerCompat;
import io.github.sspanak.tt9.util.Logger;
public class ConfirmDictionaryUpdateDialog extends PopupDialog {
public class AutoUpdateMonologue extends PopupDialog {
public static final String TYPE = "tt9.popup_dialog.confirm_words_update";
public static final String PARAMETER_LANGUAGE = "lang";
private Language language;
ConfirmDictionaryUpdateDialog(@NonNull Context context, @NonNull Intent intent, ConsumerCompat<String> activityFinisher) {
AutoUpdateMonologue(@NonNull Context context, @NonNull Intent intent, ConsumerCompat<String> activityFinisher) {
super(context, activityFinisher);
title = context.getString(R.string.app_name);
OKLabel = context.getString(R.string.dictionary_update_update);
parseIntent(context, intent);
}
@ -34,35 +29,27 @@ public class ConfirmDictionaryUpdateDialog extends PopupDialog {
language = LanguageCollection.getLanguage(context, languageId);
if (language == null) {
Logger.e(getClass().getSimpleName(), "Failed auto-updating the dictionary for language: '" + languageId + "'");
} else {
message = context.getResources().getString(R.string.dictionary_update_message, language.getName());
Logger.e(getClass().getSimpleName(), "Auto-updating is not possible. Intent parameter '" + PARAMETER_LANGUAGE + "' is invalid: " + languageId);
}
}
private void loadDictionary() {
DictionaryLoader.load(context, language);
close();
}
@Override
void render() {
if (language == null) {
close();
} else {
super.render(this::loadDictionary);
if (language != null) {
DictionaryLoader.load(context, language);
}
close();
}
public static void show(InputMethodService ims, int language) {
Intent intent = new Intent(ims, PopupDialogActivity.class);
public static Intent generateShowIntent(Context context, int language) {
Intent intent = new Intent(context, PopupDialogActivity.class);
intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
intent.addFlags(Intent.FLAG_ACTIVITY_NO_HISTORY);
intent.putExtra(PARAMETER_DIALOG_TYPE, TYPE);
intent.putExtra(PARAMETER_LANGUAGE, language);
ims.startActivity(intent);
return intent;
}
}

View file

@ -33,8 +33,8 @@ public class PopupDialogActivity extends AppCompatActivity {
switch (popupType) {
case AddWordDialog.TYPE:
return new AddWordDialog(this, i, this::onDialogClose);
case ConfirmDictionaryUpdateDialog.TYPE:
return new ConfirmDictionaryUpdateDialog(this, i, this::onDialogClose);
case AutoUpdateMonologue.TYPE:
return new AutoUpdateMonologue(this, i, this::onDialogClose);
default:
Logger.w(LOG_TAG, "Unknown popup type: '" + popupType + "'. Not displaying anything.");
return null;

View file

@ -8,8 +8,11 @@ import android.content.res.Resources;
import android.os.Build;
import androidx.annotation.NonNull;
import androidx.annotation.Nullable;
import androidx.core.app.NotificationCompat;
import io.github.sspanak.tt9.languages.Language;
public abstract class DictionaryNotification {
private static final int NOTIFICATION_ID = 1;
private static final String NOTIFICATION_CHANNEL_ID = "dictionary-notifications";
@ -24,20 +27,20 @@ public abstract class DictionaryNotification {
protected String messageLong = "";
protected DictionaryNotification(Context context) {
protected DictionaryNotification(@NonNull Context context, @Nullable Language language) {
resources = context.getResources();
manager = (NotificationManager) context.getSystemService(Context.NOTIFICATION_SERVICE);
notificationBuilder = getNotificationBuilderCompat(context);
notificationBuilder
.setContentIntent(createNavigationIntent(context))
.setContentIntent(createNavigationIntent(context, language))
.setSmallIcon(android.R.drawable.stat_notify_sync)
.setCategory(NotificationCompat.CATEGORY_PROGRESS)
.setOnlyAlertOnce(true);
}
protected abstract PendingIntent createNavigationIntent(Context context);
protected abstract PendingIntent createNavigationIntent(@NonNull Context context, @Nullable Language language);
private NotificationCompat.Builder getNotificationBuilderCompat(Context context) {
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {
@ -54,16 +57,21 @@ public abstract class DictionaryNotification {
}
public void showMessage(@NonNull String title, @NonNull String message, @NonNull String messageLong) {
public void show() {
indeterminate = false;
this.title = title;
this.message = message;
this.messageLong = messageLong;
renderMessage();
}
public void showError(@NonNull String title, @NonNull String message) {
public void showMessage(String title, String message, String messageLong) {
this.title = title;
this.message = message;
this.messageLong = messageLong;
this.show();
}
public void showError(String title, String message) {
indeterminate = false;
this.title = title;
this.message = message;

View file

@ -5,8 +5,10 @@ import android.content.Context;
import android.content.Intent;
import androidx.annotation.NonNull;
import androidx.annotation.Nullable;
import io.github.sspanak.tt9.R;
import io.github.sspanak.tt9.languages.Language;
import io.github.sspanak.tt9.preferences.PreferencesActivity;
import io.github.sspanak.tt9.preferences.screens.languages.LanguagesScreen;
@ -18,7 +20,7 @@ public class DictionaryProgressNotification extends DictionaryNotification {
protected DictionaryProgressNotification(Context context) {
super(context);
super(context, null);
}
@ -32,7 +34,7 @@ public class DictionaryProgressNotification extends DictionaryNotification {
@Override
protected final PendingIntent createNavigationIntent(Context context) {
protected final PendingIntent createNavigationIntent(@NonNull Context context, @Nullable Language language) {
Intent intent = new Intent(context, PreferencesActivity.class);
intent.putExtra("screen", LanguagesScreen.NAME);
intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK | Intent.FLAG_ACTIVITY_CLEAR_TASK);

View file

@ -0,0 +1,52 @@
package io.github.sspanak.tt9.ui.notifications;
import android.app.PendingIntent;
import android.content.Context;
import android.content.Intent;
import androidx.annotation.NonNull;
import androidx.annotation.Nullable;
import androidx.core.app.NotificationCompat;
import io.github.sspanak.tt9.R;
import io.github.sspanak.tt9.languages.Language;
import io.github.sspanak.tt9.ui.dialogs.AutoUpdateMonologue;
public class DictionaryUpdateNotification extends DictionaryNotification {
private final Language language;
public DictionaryUpdateNotification(@NonNull Context context, @NonNull Language language) {
super(context, language);
this.language = language;
notificationBuilder.addAction(getAction(context));
}
@Override
protected PendingIntent createNavigationIntent(@NonNull Context context, @Nullable Language language) {
Intent intent = AutoUpdateMonologue.generateShowIntent(context, language != null ? language.getId() : -1);
return PendingIntent.getActivity(context, 0, intent,PendingIntent.FLAG_UPDATE_CURRENT | PendingIntent.FLAG_IMMUTABLE);
}
private NotificationCompat.Action getAction(Context context) {
return new NotificationCompat.Action(
R.drawable.ic_dictionary_update,
resources.getString(R.string.dictionary_update_update),
createNavigationIntent(context, language)
);
}
@Override
public void show() {
notificationBuilder.setSmallIcon(R.drawable.ic_dictionary_update);
messageLong = message = resources.getString(R.string.dictionary_update_message, language.getName());
super.show();
}
@Override
public void showError(@NonNull String ignored, @NonNull String ignored2) {}
}

View file

@ -0,0 +1,25 @@
<vector xmlns:android="http://schemas.android.com/apk/res/android"
android:width="24dp"
android:height="24dp"
android:viewportWidth="24"
android:viewportHeight="24"
android:tint="#FFFFFF"
android:autoMirrored="true">
<group android:scaleX="1.0036364"
android:scaleY="1.0036364"
android:translateX="-0.043636363"
android:translateY="-1.0472727">
<path
android:fillColor="@android:color/white"
android:pathData="M21,5c-1.11,-0.35 -2.33,-0.5 -3.5,-0.5c-1.95,0 -4.05,0.4 -5.5,1.5c-1.45,-1.1 -3.55,-1.5 -5.5,-1.5S2.45,4.9 1,6v14.65c0,0.25 0.25,0.5 0.5,0.5c0.1,0 0.15,-0.05 0.25,-0.05C3.1,20.45 5.05,20 6.5,20c1.95,0 4.05,0.4 5.5,1.5c1.35,-0.85 3.8,-1.5 5.5,-1.5c1.65,0 3.35,0.3 4.75,1.05c0.1,0.05 0.15,0.05 0.25,0.05c0.25,0 0.5,-0.25 0.5,-0.5V6C22.4,5.55 21.75,5.25 21,5zM21,18.5c-1.1,-0.35 -2.3,-0.5 -3.5,-0.5c-1.7,0 -4.15,0.65 -5.5,1.5V8c1.35,-0.85 3.8,-1.5 5.5,-1.5c1.2,0 2.4,0.15 3.5,0.5V18.5z"/>
<path
android:fillColor="@android:color/white"
android:pathData="M17.5,10.5c0.88,0 1.73,0.09 2.5,0.26V9.24C19.21,9.09 18.36,9 17.5,9c-1.7,0 -3.24,0.29 -4.5,0.83v1.66C14.13,10.85 15.7,10.5 17.5,10.5z"/>
<path
android:fillColor="@android:color/white"
android:pathData="M13,12.49v1.66c1.13,-0.64 2.7,-0.99 4.5,-0.99c0.88,0 1.73,0.09 2.5,0.26V11.9c-0.79,-0.15 -1.64,-0.24 -2.5,-0.24C15.8,11.66 14.26,11.96 13,12.49z"/>
<path
android:fillColor="@android:color/white"
android:pathData="M17.5,14.33c-1.7,0 -3.24,0.29 -4.5,0.83v1.66c1.13,-0.64 2.7,-0.99 4.5,-0.99c0.88,0 1.73,0.09 2.5,0.26v-1.52C19.21,14.41 18.36,14.33 17.5,14.33z"/>
</group>
</vector>

Binary file not shown.

After

Width:  |  Height:  |  Size: 508 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 346 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 721 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 957 B

View file

@ -57,7 +57,7 @@
<string name="delete_words_deleted_confirm_deletion_title">Потвърдете изтриването</string>
<string name="delete_words_deleted_confirm_deletion_question">Наистина ли искате да изтриете „%1$s“?</string>
<string name="delete_words_deleted_x">„%1$s“ беше изтрита.</string>
<string name="dictionary_update_message">Налично е обновление на речника за „%1$s“. Искате ли да го заредите?</string>
<string name="dictionary_update_message">Налично е обновление на речника за „%1$s“.</string>
<string name="dictionary_update_update">Зареди</string>
<string name="donate_title">Дарете</string>
<string name="donate_summary">Ако харесвате %1$s, подкрепете разработката му на: %2$s.</string>

View file

@ -85,7 +85,7 @@
<string name="delete_words_deleted_confirm_deletion_title">Löschung bestätigen</string>
<string name="delete_words_deleted_confirm_deletion_question">Sind Sie sicher, dass Sie \"%1$s\" löschen möchten?</string>
<string name="delete_words_deleted_x">\"%1$s\" wurde gelöscht.</string>
<string name="dictionary_update_message">" Wörterbuchupdate verfügbar für „%1$s“. Möchten Sie es laden?"</string>
<string name="dictionary_update_message">" Wörterbuchupdate verfügbar für „%1$s“."</string>
<string name="dictionary_update_update">Laden</string>
<string name="donate_title">Spenden</string>
<string name="donate_summary">Wenn Ihnen %1$s gefällt, könnten Sie die Entwicklung auf %2$s unterstützen.</string>

View file

@ -104,7 +104,7 @@
<string name="delete_words_deleted_confirm_deletion_title">Confirma la eliminación</string>
<string name="delete_words_deleted_confirm_deletion_question">¿Estás seguro de que quieres eliminar \"%1$s\"?</string>
<string name="delete_words_deleted_x">\"%1$s\" fue eliminada.</string>
<string name="dictionary_update_message">Actualización del diccionario disponible para «%1$s». ¿Te gustaría cargarlo?</string>
<string name="dictionary_update_message">Actualización del diccionario disponible para «%1$s».</string>
<string name="dictionary_update_update">Cargar</string>
<string name="donate_title">Donar</string>
<string name="donate_summary">Si te gusta %1$s, podrías apoyar su desarrollo en: %2$s.</string>

View file

@ -102,7 +102,7 @@
<string name="delete_words_deleted_confirm_deletion_title">Confirmer la suppression</string>
<string name="delete_words_deleted_confirm_deletion_question">Êtes-vous sûr de vouloir supprimer « %1$s » ?</string>
<string name="delete_words_deleted_x">\"%1$s\" a été supprimé.</string>
<string name="dictionary_update_message">Mise à jour du dictionnaire «%1$s» disponible. Souhaitez-vous le charger ?</string>
<string name="dictionary_update_message">Mise à jour du dictionnaire «%1$s» disponible.</string>
<string name="dictionary_update_update">Charger</string>
<string name="donate_title">Donner</string>
<string name="donate_summary">Si vous aimez %1$s vous pouvez soutenir son développement à : %2$s</string>

View file

@ -87,7 +87,7 @@
<string name="delete_words_deleted_confirm_deletion_title">Conferma l\'eliminazione</string>
<string name="delete_words_deleted_confirm_deletion_question">Sei sicuro di voler eliminare \"%1$s\"?</string>
<string name="delete_words_deleted_x">\"%1$s\" è stata eliminata.</string>
<string name="dictionary_update_message">Aggiornamento del dizionario disponibile per \"%1$s\". Vuoi caricarlo?</string>
<string name="dictionary_update_message">Aggiornamento del dizionario disponibile per \"%1$s\".</string>
<string name="dictionary_update_update">Carica</string>
<string name="donate_title">Donare</string>
<string name="donate_summary">Se ti piace %1$s, potresti supportarne lo sviluppo su: %2$s.</string>

View file

@ -103,7 +103,7 @@
<string name="delete_words_deleted_confirm_deletion_title">אישור מחיקה</string>
<string name="delete_words_deleted_confirm_deletion_question">האם אתה בטוח שברצונך להסיר את \"%1$s\"?</string>
<string name="delete_words_deleted_x">\"%1$s\" נמחקה.</string>
<string name="dictionary_update_message">עדכון מילון זמין עבור \"%1$s\". האם תרצה לטעון אותו?</string>
<string name="dictionary_update_message">עדכון למילון זמין עבור \"%1$s\"</string>
<string name="dictionary_update_update">טען</string>
<string name="donate_title">לִתְרוֹם</string>
<string name="donate_summary">אם אתה אוהב את %1$s, תוכל לתמוך בפיתוח שלו בכתובת: %2$s</string>

View file

@ -123,7 +123,7 @@
<string name="delete_words_deleted_confirm_deletion_title">Patvirtinkite ištrynimą</string>
<string name="delete_words_deleted_confirm_deletion_question">Ar tikrai norite ištrinti „%1$s“?</string>
<string name="delete_words_deleted_x">„%1$s“ buvo ištrintas.</string>
<string name="dictionary_update_message">Atnaujinta žodyno versija skirta \"%1$s\". Ar norėtumėte ją įkelti?</string>
<string name="dictionary_update_message">Atnaujinta žodyno versija skirta \"%1$s\".</string>
<string name="dictionary_update_update">Įkelti</string>
<string name="donate_title">Paaukoti</string>
<string name="donate_summary">Jei jums patinka %1$s, galite paremti jo plėtrą čia: %2$s.</string>

View file

@ -83,7 +83,7 @@
<string name="delete_words_deleted_confirm_deletion_title">Bevestig verwijdering</string>
<string name="delete_words_deleted_confirm_deletion_question">Weet u zeker dat u \"%1$s\" wilt verwijderen?</string>
<string name="delete_words_deleted_x">\"%1$s\" is verwijderd.</string>
<string name="dictionary_update_message">Woordenboekupdate beschikbaar voor \"%1$s\". Wil je het laden?</string>
<string name="dictionary_update_message">Woordenboekupdate beschikbaar voor \"%1$s\".</string>
<string name="dictionary_update_update">Laden</string>
<string name="donate_title">Doneer</string>
<string name="donate_summary">Als je %1$s leuk vindt, zou je de ontwikkeling kunnen ondersteunen op: %2$s.</string>

View file

@ -105,7 +105,7 @@
<string name="delete_words_deleted_confirm_deletion_title">Confirme a exclusão</string>
<string name="delete_words_deleted_confirm_deletion_question">Tem certeza de que deseja excluir \"%1$s\"?</string>
<string name="delete_words_deleted_x">\"%1$s\" foi excluída.</string>
<string name="dictionary_update_message">Atualização do dicionário disponível para \"%1$s\". Você gostaria de carregá-lo?</string>
<string name="dictionary_update_message">Atualização do dicionário disponível para \"%1$s\".</string>
<string name="dictionary_update_update">Carregar</string>
<string name="donate_title">Doar</string>
<string name="donate_summary">Se você gosta de %1$s, você poderia apoiar o seu desenvolvimento em: %2$s.</string>

View file

@ -107,7 +107,7 @@
<string name="delete_words_deleted_confirm_deletion_title">Подтвердите удаление</string>
<string name="delete_words_deleted_confirm_deletion_question">Уверены, что хотите удалить «%1$s»?</string>
<string name="delete_words_deleted_x">\"%1$s\" было удалено.</string>
<string name="dictionary_update_message">Доступно обновление словаря для «%1$s». Хотите загрузить его?</string>
<string name="dictionary_update_message">Доступно обновление словаря для «%1$s».</string>
<string name="dictionary_update_update">Загрузить</string>
<string name="donate_title">Поддержать</string>
<string name="donate_summary">Если вам нравится %1$s, вы можете поддержать его разработку по: %2$s.</string>

View file

@ -90,7 +90,7 @@
<string name="delete_words_deleted_confirm_deletion_title">Підтвердіть видалення</string>
<string name="delete_words_deleted_confirm_deletion_question">Ви впевнені, що хочете видалити \"%1$s\"?</string>
<string name="delete_words_deleted_x">\"%1$s\" було видалено.</string>
<string name="dictionary_update_message">Доступне оновлення словника для \"%1$s\". Бажаєте його завантажити?</string>
<string name="dictionary_update_message">Доступне оновлення словника для \"%1$s\".</string>
<string name="dictionary_update_update">Завантажити</string>
<string name="donate_title">Підтримати</string>

View file

@ -103,7 +103,7 @@
<string name="delete_words_deleted_confirm_deletion_question">Are you sure you want to delete \"%1$s\"?</string>
<string name="delete_words_deleted_x">\"%1$s\" was deleted.</string>
<string name="dictionary_update_message">Dictionary update available for \"%1$s\". Would you like to load it?</string>
<string name="dictionary_update_message">Dictionary update available for \"%1$s\".</string>
<string name="dictionary_update_update">Load</string>
<string name="donate_title">Donate</string>