1
0
Fork 0

fixed misleading dictionary export status messages

This commit is contained in:
sspanak 2024-03-16 13:08:25 +02:00 committed by Dimo Karaivanov
parent 962792728f
commit 4c163f9038
6 changed files with 73 additions and 77 deletions

View file

@ -25,9 +25,11 @@ public abstract class AbstractExporter {
final protected static String MIME_TYPE = "text/csv";
protected Runnable failureHandler;
protected Runnable startHandler;
protected ConsumerCompat<String> 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<String> 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);
}

View file

@ -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;
}
processThread = new Thread(() -> {
@Override
protected void exportSync(Activity activity) {
try {
sendStart(activity.getString(R.string.dictionary_export_generating_csv));
write(activity);
sendSuccess();
} catch (Exception e) {
sendFailure();
}
});
processThread.start();
return true;
}
@Override

View file

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

View file

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

View file

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

View file

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