diff --git a/app/src/main/java/io/github/sspanak/tt9/db/exporter/AbstractExporter.java b/app/src/main/java/io/github/sspanak/tt9/db/exporter/AbstractExporter.java index 53a8e3ce..5972ff55 100644 --- a/app/src/main/java/io/github/sspanak/tt9/db/exporter/AbstractExporter.java +++ b/app/src/main/java/io/github/sspanak/tt9/db/exporter/AbstractExporter.java @@ -25,9 +25,11 @@ public abstract class AbstractExporter { final protected static String MIME_TYPE = "text/csv"; protected Runnable failureHandler; + protected Runnable startHandler; protected ConsumerCompat successHandler; - protected Thread processThread; + private Thread processThread; private String outputFile; + private String statusMessage = ""; public static AbstractExporter getInstance() { @@ -113,6 +115,18 @@ public abstract class AbstractExporter { return Build.VERSION.SDK_INT >= Build.VERSION_CODES.Q ? Environment.DIRECTORY_DOCUMENTS : Environment.DIRECTORY_DOWNLOADS; } + protected void sendFailure() { + if (failureHandler != null) { + failureHandler.run(); + } + } + + protected void sendStart(@NonNull String message) { + if (startHandler != null) { + statusMessage = message; + startHandler.run(); + } + } protected void sendSuccess() { if (successHandler != null) { @@ -120,30 +134,39 @@ public abstract class AbstractExporter { } } - - protected void sendFailure() { - if (failureHandler != null) { - failureHandler.run(); + public boolean export(@NonNull Activity activity) { + if (isRunning()) { + return false; } - } + processThread = new Thread(() -> exportSync(activity)); + processThread.start(); + + return true; + } public boolean isRunning() { return processThread != null && processThread.isAlive(); } + public String getStatusMessage() { + return statusMessage; + } + + public void setFailureHandler(Runnable handler) { + failureHandler = handler; + } + + public void setStartHandler(Runnable handler) { + startHandler = handler; + } public void setSuccessHandler(ConsumerCompat handler) { successHandler = handler; } - public void setFailureHandler(Runnable handler) { - failureHandler = handler; - } - - + abstract protected void exportSync(Activity activity); @NonNull abstract protected String generateFileName(); @NonNull abstract protected byte[] getWords(Activity activity) throws Exception; - abstract public boolean export(Activity activity); } diff --git a/app/src/main/java/io/github/sspanak/tt9/db/exporter/CustomWordsExporter.java b/app/src/main/java/io/github/sspanak/tt9/db/exporter/CustomWordsExporter.java index e84c9952..beb13632 100644 --- a/app/src/main/java/io/github/sspanak/tt9/db/exporter/CustomWordsExporter.java +++ b/app/src/main/java/io/github/sspanak/tt9/db/exporter/CustomWordsExporter.java @@ -5,6 +5,7 @@ import android.database.sqlite.SQLiteDatabase; import androidx.annotation.NonNull; +import io.github.sspanak.tt9.R; import io.github.sspanak.tt9.db.sqlite.ReadOps; import io.github.sspanak.tt9.db.sqlite.SQLiteOpener; @@ -22,22 +23,15 @@ public class CustomWordsExporter extends AbstractExporter { return customWordsExporterSelf; } - public boolean export(Activity activity) { - if (isRunning()) { - return false; + @Override + protected void exportSync(Activity activity) { + try { + sendStart(activity.getString(R.string.dictionary_export_generating_csv)); + write(activity); + sendSuccess(); + } catch (Exception e) { + sendFailure(); } - - processThread = new Thread(() -> { - try { - write(activity); - sendSuccess(); - } catch (Exception e) { - sendFailure(); - } - }); - - processThread.start(); - return true; } @Override diff --git a/app/src/main/java/io/github/sspanak/tt9/db/exporter/DictionaryExporter.java b/app/src/main/java/io/github/sspanak/tt9/db/exporter/DictionaryExporter.java index 755a2c1c..dce91252 100644 --- a/app/src/main/java/io/github/sspanak/tt9/db/exporter/DictionaryExporter.java +++ b/app/src/main/java/io/github/sspanak/tt9/db/exporter/DictionaryExporter.java @@ -8,6 +8,7 @@ import androidx.annotation.NonNull; import java.util.ArrayList; import io.github.sspanak.tt9.Logger; +import io.github.sspanak.tt9.R; import io.github.sspanak.tt9.db.sqlite.ReadOps; import io.github.sspanak.tt9.db.sqlite.SQLiteOpener; import io.github.sspanak.tt9.languages.Language; @@ -28,20 +29,23 @@ public class DictionaryExporter extends AbstractExporter { return self; } - public boolean export(Activity activity) { - if (isRunning()) { - return false; - } - + @Override + protected void exportSync(Activity activity) { if (languages == null || languages.isEmpty()) { Logger.d(LOG_TAG, "Nothing to do"); - return true; + return; } - processThread = new Thread(() -> { for (Language l : languages) exportLanguage(activity, l); }); - processThread.start(); - - return true; + try { + for (Language l : languages) { + sendStart(activity.getString(R.string.dictionary_export_generating_csv_for_language, l.getName())); + exportLanguage(activity, l); + } + sendSuccess(); + } catch (Exception e) { + logExportError(e); + sendFailure(); + } } public DictionaryExporter setLanguages(ArrayList languages) { @@ -66,21 +70,25 @@ public class DictionaryExporter extends AbstractExporter { return new ReadOps().getWords(db, currentLanguage, false).getBytes(); } - private void exportLanguage(Activity activity, Language language) { + private void exportLanguage(Activity activity, Language language) throws Exception { currentLanguage = language; if (currentLanguage == null) { Logger.e(LOG_TAG, "Cannot export dictionary for null language"); return; } - try { - long start = System.currentTimeMillis(); - write(activity); - sendSuccess(); - Logger.d(LOG_TAG, "All words for language '" + currentLanguage.getName() + "' exported. Time: " + (System.currentTimeMillis() - start) + "ms"); - } catch (Exception e) { - sendFailure(); - Logger.e(LOG_TAG, "Failed exporting dictionary for '" + currentLanguage.getName() + "' to '" + getOutputFile() + "'. " + e); + long start = System.currentTimeMillis(); + write(activity); + Logger.d(LOG_TAG, "All words for language '" + currentLanguage.getName() + "' exported. Time: " + (System.currentTimeMillis() - start) + "ms"); + } + + private void logExportError(Exception e) { + String message; + if (currentLanguage == null) { + message = "Failed exporting '" + getOutputFile() + "' . " + e; + } else { + message = "Failed exporting dictionary for '" + currentLanguage.getName() + "' to '" + getOutputFile() + "'. " + e; } + Logger.e(LOG_TAG, message); } } diff --git a/app/src/main/java/io/github/sspanak/tt9/preferences/screens/languages/ItemExportAbstract.java b/app/src/main/java/io/github/sspanak/tt9/preferences/screens/languages/ItemExportAbstract.java index cfb5eb30..ce875e16 100644 --- a/app/src/main/java/io/github/sspanak/tt9/preferences/screens/languages/ItemExportAbstract.java +++ b/app/src/main/java/io/github/sspanak/tt9/preferences/screens/languages/ItemExportAbstract.java @@ -21,6 +21,7 @@ abstract class ItemExportAbstract extends ItemClickable { AbstractExporter exporter = getExporter(); exporter.setFailureHandler(() -> onFinishExporting(null)); + exporter.setStartHandler(() -> activity.runOnUiThread(this::setLoadingStatus)); exporter.setSuccessHandler(this::onFinishExporting); refreshStatus(); } @@ -73,14 +74,11 @@ abstract class ItemExportAbstract extends ItemClickable { } - abstract protected String getLoadingMessage(); - - protected void setLoadingStatus() { onStart.run(); disable(); - String loadingMessage = getLoadingMessage(); + String loadingMessage = getExporter().getStatusMessage(); item.setSummary(loadingMessage); DictionaryNotification.getInstance(activity).showLoadingMessage(loadingMessage, ""); } diff --git a/app/src/main/java/io/github/sspanak/tt9/preferences/screens/languages/ItemExportCustomWords.java b/app/src/main/java/io/github/sspanak/tt9/preferences/screens/languages/ItemExportCustomWords.java index b15bcc7c..e1b44b7e 100644 --- a/app/src/main/java/io/github/sspanak/tt9/preferences/screens/languages/ItemExportCustomWords.java +++ b/app/src/main/java/io/github/sspanak/tt9/preferences/screens/languages/ItemExportCustomWords.java @@ -9,28 +9,19 @@ import io.github.sspanak.tt9.preferences.PreferencesActivity; class ItemExportCustomWords extends ItemExportAbstract { final public static String NAME = "dictionary_export_custom"; - ItemExportCustomWords(Preference item, PreferencesActivity activity, Runnable onStart, Runnable onFinish) { super(item, activity, onStart, onFinish); } - @Override protected CustomWordsExporter getExporter() { return CustomWordsExporter.getInstance(); } - protected boolean onStartExporting() { return CustomWordsExporter.getInstance().export(activity); } - - @Override - protected String getLoadingMessage() { - return activity.getString(R.string.dictionary_export_generating_csv); - } - public void setReadyStatus() { super.setReadyStatus(); item.setSummary(activity.getString( diff --git a/app/src/main/java/io/github/sspanak/tt9/preferences/screens/languages/ItemExportDictionary.java b/app/src/main/java/io/github/sspanak/tt9/preferences/screens/languages/ItemExportDictionary.java index 98802dc1..8634d892 100644 --- a/app/src/main/java/io/github/sspanak/tt9/preferences/screens/languages/ItemExportDictionary.java +++ b/app/src/main/java/io/github/sspanak/tt9/preferences/screens/languages/ItemExportDictionary.java @@ -3,9 +3,7 @@ package io.github.sspanak.tt9.preferences.screens.languages; import androidx.preference.Preference; import io.github.sspanak.tt9.Logger; -import io.github.sspanak.tt9.R; import io.github.sspanak.tt9.db.exporter.DictionaryExporter; -import io.github.sspanak.tt9.languages.Language; import io.github.sspanak.tt9.languages.LanguageCollection; import io.github.sspanak.tt9.preferences.PreferencesActivity; @@ -16,7 +14,6 @@ class ItemExportDictionary extends ItemExportAbstract { super(item, activity, onStart, onFinish); } - @Override public ItemExportAbstract refreshStatus() { if (item != null) { @@ -25,32 +22,17 @@ class ItemExportDictionary extends ItemExportAbstract { return super.refreshStatus(); } - @Override protected DictionaryExporter getExporter() { return DictionaryExporter.getInstance(); } - protected boolean onStartExporting() { return DictionaryExporter.getInstance() .setLanguages(LanguageCollection.getAll(activity, activity.getSettings().getEnabledLanguageIds())) .export(activity); } - @Override - protected String getLoadingMessage() { - String message = activity.getString(R.string.dictionary_export_generating_csv); - - Language language = LanguageCollection.getLanguage(activity, activity.getSettings().getInputLanguage()); - if (language != null) { - message = activity.getString(R.string.dictionary_export_generating_csv_for_language, language.getName()); - } - - return message; - } - - public void setReadyStatus() { super.setReadyStatus(); item.setSummary("");