fixed misleading dictionary export status messages
This commit is contained in:
parent
962792728f
commit
4c163f9038
6 changed files with 73 additions and 77 deletions
|
|
@ -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);
|
||||
}
|
||||
|
|
|
|||
|
|
@ -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
|
||||
|
|
|
|||
|
|
@ -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);
|
||||
}
|
||||
}
|
||||
|
|
|
|||
|
|
@ -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, "");
|
||||
}
|
||||
|
|
|
|||
|
|
@ -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(
|
||||
|
|
|
|||
|
|
@ -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("");
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue