diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml
index 00abada..6ab3d86 100644
--- a/app/src/main/AndroidManifest.xml
+++ b/app/src/main/AndroidManifest.xml
@@ -5,7 +5,7 @@
+
@@ -24,26 +27,29 @@
+
+
+
+
diff --git a/app/src/main/java/de/bentigorlich/mimic3ttsenginewrapper/CheckTTSDataActivity.java b/app/src/main/java/de/bentigorlich/mimic3ttsenginewrapper/activities/CheckTTSDataActivity.java
similarity index 95%
rename from app/src/main/java/de/bentigorlich/mimic3ttsenginewrapper/CheckTTSDataActivity.java
rename to app/src/main/java/de/bentigorlich/mimic3ttsenginewrapper/activities/CheckTTSDataActivity.java
index 90c5b4a..8a44c08 100644
--- a/app/src/main/java/de/bentigorlich/mimic3ttsenginewrapper/CheckTTSDataActivity.java
+++ b/app/src/main/java/de/bentigorlich/mimic3ttsenginewrapper/activities/CheckTTSDataActivity.java
@@ -1,4 +1,4 @@
-package de.bentigorlich.mimic3ttsenginewrapper;
+package de.bentigorlich.mimic3ttsenginewrapper.activities;
import android.app.Activity;
import android.content.Intent;
@@ -13,6 +13,9 @@
import java.util.logging.LogManager;
import java.util.logging.Logger;
+import de.bentigorlich.mimic3ttsenginewrapper.tts.Mimic3TTSEngineWeb;
+import de.bentigorlich.mimic3ttsenginewrapper.entities.MimicVoice;
+
public class CheckTTSDataActivity extends Activity {
Logger _Logger;
diff --git a/app/src/main/java/de/bentigorlich/mimic3ttsenginewrapper/activities/LogActivity.java b/app/src/main/java/de/bentigorlich/mimic3ttsenginewrapper/activities/LogActivity.java
new file mode 100644
index 0000000..7ce97a3
--- /dev/null
+++ b/app/src/main/java/de/bentigorlich/mimic3ttsenginewrapper/activities/LogActivity.java
@@ -0,0 +1,125 @@
+package de.bentigorlich.mimic3ttsenginewrapper.activities;
+
+import androidx.annotation.NonNull;
+import androidx.appcompat.app.AppCompatActivity;
+
+import android.app.Activity;
+import android.os.Bundle;
+import android.view.MenuItem;
+import android.widget.LinearLayout;
+import android.widget.TextView;
+
+import com.google.gson.Gson;
+
+import java.io.BufferedReader;
+import java.io.File;
+import java.io.FileReader;
+import java.io.FileWriter;
+import java.io.IOException;
+import java.util.ArrayList;
+import java.util.Comparator;
+import java.util.List;
+import java.util.Timer;
+import java.util.TimerTask;
+
+import de.bentigorlich.mimic3ttsenginewrapper.R;
+import de.bentigorlich.mimic3ttsenginewrapper.entities.LogEntity;
+
+public class LogActivity extends AppCompatActivity {
+ Timer refreshLogInterval;
+
+ @Override
+ protected void onCreate(Bundle savedInstanceState) {
+ super.onCreate(savedInstanceState);
+ setContentView(R.layout.activity_log);
+
+ Activity parent = this;
+ refreshLogInterval = new Timer();
+ refreshLogInterval.schedule(new TimerTask() {
+ @Override
+ public void run() {
+ parent.runOnUiThread(() -> populateLogView());
+ }
+ }, 0, 10000);
+ }
+
+ @Override
+ protected void onDestroy() {
+ super.onDestroy();
+ refreshLogInterval.cancel();
+ }
+
+ private void populateLogView() {
+ Gson gson = new Gson();
+ List logs = new ArrayList<>();
+ for (File logFile : getLogFiles()) {
+ try {
+ BufferedReader br = new BufferedReader(new FileReader(logFile));
+ br.lines().forEach(line -> {
+ LogEntity lr = gson.fromJson(line, LogEntity.class);
+ logs.add(lr);
+ });
+ br.close();
+ } catch (IOException ignored) {
+ }
+ }
+
+ logs.sort(Comparator.comparing(l -> l.Timestamp));
+
+ LinearLayout logView = findViewById(R.id.logContainer);
+ logView.removeAllViews();
+ for (LogEntity curr : logs) {
+ TextView t = new TextView(this);
+ t.setText(curr.GetText(false));
+ t.setTextColor(getLevelColor(curr.Level));
+ t.setTextIsSelectable(true);
+ logView.addView(t);
+ }
+ }
+
+ private int getLevelColor(String level) {
+ switch (level.toLowerCase()) {
+ case "info":
+ default:
+ return getResources().getColor(com.google.android.material.R.color.design_default_color_surface, getTheme());
+
+ case "warning":
+ return getResources().getColor(R.color.colorTextWarning, getTheme());
+
+ case "severe":
+ return getResources().getColor(R.color.colorTextSevere, getTheme());
+ }
+ }
+
+ private List getLogFiles() {
+ File cacheDir = getDataDir();
+ List logList = new ArrayList<>();
+ File[] fileList = cacheDir.listFiles();
+ for (File f: fileList) {
+ String fileName = f.getName();
+ int pointIndex = fileName.lastIndexOf(".");
+ if(f.exists() && pointIndex > 0) {
+ String ext = fileName.substring(pointIndex);
+ if(ext.equals(".log")) {
+ logList.add(f);
+ }
+ }
+ }
+ return logList;
+ }
+
+ public void onMenuItemClick(@NonNull MenuItem menuItem) {
+ if (menuItem.getItemId() == R.id.menu_logs_delete) {
+ for(File f : getLogFiles()) {
+ try {
+ FileWriter fw = new FileWriter(f.getAbsolutePath(), false);
+ fw.write("");
+ fw.close();
+ } catch (IOException e) {
+ e.printStackTrace();
+ }
+ }
+ populateLogView();
+ }
+ }
+}
\ No newline at end of file
diff --git a/app/src/main/java/de/bentigorlich/mimic3ttsenginewrapper/MainActivity.java b/app/src/main/java/de/bentigorlich/mimic3ttsenginewrapper/activities/MainActivity.java
similarity index 88%
rename from app/src/main/java/de/bentigorlich/mimic3ttsenginewrapper/MainActivity.java
rename to app/src/main/java/de/bentigorlich/mimic3ttsenginewrapper/activities/MainActivity.java
index e6d10f0..66d6545 100644
--- a/app/src/main/java/de/bentigorlich/mimic3ttsenginewrapper/MainActivity.java
+++ b/app/src/main/java/de/bentigorlich/mimic3ttsenginewrapper/activities/MainActivity.java
@@ -1,13 +1,13 @@
-package de.bentigorlich.mimic3ttsenginewrapper;
+package de.bentigorlich.mimic3ttsenginewrapper.activities;
-import static de.bentigorlich.mimic3ttsenginewrapper.Mimic3TTSEngineWrapperApp.PREF_AUDIO_VOLATILITY;
-import static de.bentigorlich.mimic3ttsenginewrapper.Mimic3TTSEngineWrapperApp.PREF_CACHE_ACTIVATE;
-import static de.bentigorlich.mimic3ttsenginewrapper.Mimic3TTSEngineWrapperApp.PREF_LANGUAGE;
-import static de.bentigorlich.mimic3ttsenginewrapper.Mimic3TTSEngineWrapperApp.PREF_PHONEME_VOLATILITY;
-import static de.bentigorlich.mimic3ttsenginewrapper.Mimic3TTSEngineWrapperApp.PREF_SERVER_ADDRESS;
-import static de.bentigorlich.mimic3ttsenginewrapper.Mimic3TTSEngineWrapperApp.PREF_SPEAKER;
-import static de.bentigorlich.mimic3ttsenginewrapper.Mimic3TTSEngineWrapperApp.PREF_SPEED;
-import static de.bentigorlich.mimic3ttsenginewrapper.Mimic3TTSEngineWrapperApp.PREF_VOICE;
+import static de.bentigorlich.mimic3ttsenginewrapper.tts.Mimic3TTSEngineWrapperApp.PREF_AUDIO_VOLATILITY;
+import static de.bentigorlich.mimic3ttsenginewrapper.tts.Mimic3TTSEngineWrapperApp.PREF_CACHE_ACTIVATE;
+import static de.bentigorlich.mimic3ttsenginewrapper.tts.Mimic3TTSEngineWrapperApp.PREF_LANGUAGE;
+import static de.bentigorlich.mimic3ttsenginewrapper.tts.Mimic3TTSEngineWrapperApp.PREF_PHONEME_VOLATILITY;
+import static de.bentigorlich.mimic3ttsenginewrapper.tts.Mimic3TTSEngineWrapperApp.PREF_SERVER_ADDRESS;
+import static de.bentigorlich.mimic3ttsenginewrapper.tts.Mimic3TTSEngineWrapperApp.PREF_SPEAKER;
+import static de.bentigorlich.mimic3ttsenginewrapper.tts.Mimic3TTSEngineWrapperApp.PREF_SPEED;
+import static de.bentigorlich.mimic3ttsenginewrapper.tts.Mimic3TTSEngineWrapperApp.PREF_VOICE;
import androidx.annotation.NonNull;
import androidx.appcompat.app.AppCompatActivity;
@@ -27,14 +27,23 @@
import android.widget.SeekBar;
import android.widget.Spinner;
+import java.io.IOException;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
+import java.util.logging.FileHandler;
import java.util.logging.LogManager;
import java.util.logging.Logger;
+import de.bentigorlich.mimic3ttsenginewrapper.tts.Mimic3TTSEngineWeb;
+import de.bentigorlich.mimic3ttsenginewrapper.tts.Mimic3TTSEngineWrapperApp;
+import de.bentigorlich.mimic3ttsenginewrapper.entities.MimicVoice;
+import de.bentigorlich.mimic3ttsenginewrapper.R;
+import de.bentigorlich.mimic3ttsenginewrapper.tts.SynthesisListener;
+import de.bentigorlich.mimic3ttsenginewrapper.util.JsonFormatter;
+
public class MainActivity extends AppCompatActivity implements SeekBar.OnSeekBarChangeListener,
AdapterView.OnItemSelectedListener, View.OnClickListener, Mimic3TTSEngineWeb.OnVoicesLoadedListener,
SharedPreferences.OnSharedPreferenceChangeListener, Mimic3TTSEngineWeb.OnLoadedListener, Mimic3TTSEngineWeb.OnErrorListener {
@@ -55,6 +64,7 @@ public class MainActivity extends AppCompatActivity implements SeekBar.OnSeekBar
public MainActivity() {
_Logger = Logger.getLogger(this.getClass().toString());
LogManager.getLogManager().addLogger(_Logger);
+
}
@Override
@@ -64,6 +74,18 @@ protected void onCreate(Bundle savedInstanceState) {
setSupportActionBar(findViewById(R.id.toolbar));
setContentView(R.layout.activity_main);
+ String cacheDir = getDataDir().getAbsolutePath();
+ try {
+ FileHandler fileHandler = new FileHandler(cacheDir + "/main_%g.log", 1024 * 1024, 1, true);
+ fileHandler.setFormatter(new JsonFormatter());
+ _Logger.addHandler(fileHandler);
+ } catch (IOException e) {
+ _Logger.severe("IOException while adding filehandler to logger: " + e.getMessage());
+ for(StackTraceElement el : e.getStackTrace()) {
+ _Logger.warning("at: " + el.toString());
+ }
+ }
+
SharedPreferences = PreferenceManager.getDefaultSharedPreferences(Mimic3TTSEngineWrapperApp.getStorageContext());
SharedPreferences.registerOnSharedPreferenceChangeListener(this);
SelectedLanguage = SharedPreferences.getString(PREF_LANGUAGE, "");
@@ -76,7 +98,7 @@ protected void onCreate(Bundle savedInstanceState) {
Mimic3TTSEngineWeb.s_ServerAddress = SharedPreferences.getString(PREF_SERVER_ADDRESS, "");
Mimic3TTSEngineWeb.addLoadedListener(this);
if (Mimic3TTSEngineWeb.s_RunningService == null) {
- Intent startIntent = new Intent(MainActivity.this, de.bentigorlich.mimic3ttsenginewrapper.Mimic3TTSEngineWeb.class);
+ Intent startIntent = new Intent(MainActivity.this, Mimic3TTSEngineWeb.class);
startIntent.putExtra(PREF_SERVER_ADDRESS, Mimic3TTSEngineWeb.s_ServerAddress);
startService(startIntent);
} else {
@@ -280,6 +302,8 @@ public void onClick(View view) {
public void onMenuItemClick(@NonNull MenuItem menuItem) {
if (menuItem.getItemId() == R.id.menu_settings) {
startActivity(new Intent(MainActivity.this, SettingsActivity.class));
+ } else if (menuItem.getItemId() == R.id.menu_logs) {
+ startActivity(new Intent(MainActivity.this, LogActivity.class));
}
}
diff --git a/app/src/main/java/de/bentigorlich/mimic3ttsenginewrapper/SettingsActivity.java b/app/src/main/java/de/bentigorlich/mimic3ttsenginewrapper/activities/SettingsActivity.java
similarity index 89%
rename from app/src/main/java/de/bentigorlich/mimic3ttsenginewrapper/SettingsActivity.java
rename to app/src/main/java/de/bentigorlich/mimic3ttsenginewrapper/activities/SettingsActivity.java
index 27dc0c9..2d3a669 100644
--- a/app/src/main/java/de/bentigorlich/mimic3ttsenginewrapper/SettingsActivity.java
+++ b/app/src/main/java/de/bentigorlich/mimic3ttsenginewrapper/activities/SettingsActivity.java
@@ -1,4 +1,4 @@
-package de.bentigorlich.mimic3ttsenginewrapper;
+package de.bentigorlich.mimic3ttsenginewrapper.activities;
import androidx.annotation.NonNull;
import androidx.appcompat.app.AppCompatActivity;
@@ -10,6 +10,10 @@
import android.content.SharedPreferences;
import android.os.Bundle;
+import de.bentigorlich.mimic3ttsenginewrapper.tts.Mimic3TTSEngineWeb;
+import de.bentigorlich.mimic3ttsenginewrapper.tts.Mimic3TTSEngineWrapperApp;
+import de.bentigorlich.mimic3ttsenginewrapper.R;
+
public class SettingsActivity extends AppCompatActivity implements Mimic3TTSEngineWeb.OnErrorListener, Preference.OnPreferenceChangeListener {
@Override
diff --git a/app/src/main/java/de/bentigorlich/mimic3ttsenginewrapper/SettingsFragment.java b/app/src/main/java/de/bentigorlich/mimic3ttsenginewrapper/activities/SettingsFragment.java
similarity index 88%
rename from app/src/main/java/de/bentigorlich/mimic3ttsenginewrapper/SettingsFragment.java
rename to app/src/main/java/de/bentigorlich/mimic3ttsenginewrapper/activities/SettingsFragment.java
index 1ce1bfa..4df316d 100644
--- a/app/src/main/java/de/bentigorlich/mimic3ttsenginewrapper/SettingsFragment.java
+++ b/app/src/main/java/de/bentigorlich/mimic3ttsenginewrapper/activities/SettingsFragment.java
@@ -1,4 +1,4 @@
-package de.bentigorlich.mimic3ttsenginewrapper;
+package de.bentigorlich.mimic3ttsenginewrapper.activities;
import android.app.AlertDialog;
import android.os.Bundle;
@@ -7,6 +7,9 @@
import androidx.preference.Preference;
import androidx.preference.PreferenceFragmentCompat;
+import de.bentigorlich.mimic3ttsenginewrapper.tts.Mimic3TTSEngineWeb;
+import de.bentigorlich.mimic3ttsenginewrapper.R;
+
public class SettingsFragment extends PreferenceFragmentCompat implements Preference.OnPreferenceClickListener {
@Override
diff --git a/app/src/main/java/de/bentigorlich/mimic3ttsenginewrapper/CacheEntry.java b/app/src/main/java/de/bentigorlich/mimic3ttsenginewrapper/entities/CacheEntry.java
similarity index 87%
rename from app/src/main/java/de/bentigorlich/mimic3ttsenginewrapper/CacheEntry.java
rename to app/src/main/java/de/bentigorlich/mimic3ttsenginewrapper/entities/CacheEntry.java
index fe775be..32fab56 100644
--- a/app/src/main/java/de/bentigorlich/mimic3ttsenginewrapper/CacheEntry.java
+++ b/app/src/main/java/de/bentigorlich/mimic3ttsenginewrapper/entities/CacheEntry.java
@@ -1,4 +1,4 @@
-package de.bentigorlich.mimic3ttsenginewrapper;
+package de.bentigorlich.mimic3ttsenginewrapper.entities;
import androidx.annotation.NonNull;
diff --git a/app/src/main/java/de/bentigorlich/mimic3ttsenginewrapper/entities/LogEntity.java b/app/src/main/java/de/bentigorlich/mimic3ttsenginewrapper/entities/LogEntity.java
new file mode 100644
index 0000000..2d38f65
--- /dev/null
+++ b/app/src/main/java/de/bentigorlich/mimic3ttsenginewrapper/entities/LogEntity.java
@@ -0,0 +1,58 @@
+package de.bentigorlich.mimic3ttsenginewrapper.entities;
+
+import androidx.annotation.NonNull;
+
+import java.text.SimpleDateFormat;
+import java.util.Calendar;
+import java.util.logging.LogRecord;
+
+public class LogEntity implements Cloneable {
+ public String Message;
+ public String Level;
+ public String SourceClassName;
+ public String SourceMethodName;
+ public long Timestamp;
+ public String LoggerName;
+
+ public LogEntity(LogRecord record) {
+ Message = record.getMessage();
+ Level = record.getLevel().toString();
+ SourceClassName = record.getSourceClassName();
+ SourceMethodName = record.getSourceMethodName();
+ Timestamp = record.getMillis();
+ LoggerName = record.getLoggerName();
+ }
+
+ public LogEntity() {}
+
+ @NonNull
+ @Override
+ public LogEntity clone() {
+ LogEntity copy = new LogEntity();
+ copy.LoggerName = LoggerName;
+ copy.Level = Level;
+ copy.Timestamp = Timestamp;
+ copy.Message = Message;
+ copy.SourceClassName = SourceClassName;
+ copy.SourceMethodName = SourceMethodName;
+ return copy;
+ }
+
+ public String GetText(boolean includeSource) {
+ Calendar c = Calendar.getInstance();
+ c.setTimeInMillis(Timestamp);
+ SimpleDateFormat formatter = new SimpleDateFormat("dd/MM/yyyy|HH:mm:ss");
+ String source = "";
+ if(includeSource) {
+ if (LoggerName != null && !LoggerName.equals(""))
+ source += "[" + LoggerName + "]";
+
+ if (SourceClassName != null && !SourceClassName.equals(""))
+ source += "[" + SourceClassName + "]";
+
+ if (SourceMethodName != null && !SourceMethodName.equals(""))
+ source += "[" + SourceMethodName + "]";
+ }
+ return "<" + formatter.format(c.getTime()) + " " + Level + ">" + source + " " + Message;
+ }
+}
diff --git a/app/src/main/java/de/bentigorlich/mimic3ttsenginewrapper/MimicVoice.java b/app/src/main/java/de/bentigorlich/mimic3ttsenginewrapper/entities/MimicVoice.java
similarity index 93%
rename from app/src/main/java/de/bentigorlich/mimic3ttsenginewrapper/MimicVoice.java
rename to app/src/main/java/de/bentigorlich/mimic3ttsenginewrapper/entities/MimicVoice.java
index b0f3cd4..b58cf3e 100644
--- a/app/src/main/java/de/bentigorlich/mimic3ttsenginewrapper/MimicVoice.java
+++ b/app/src/main/java/de/bentigorlich/mimic3ttsenginewrapper/entities/MimicVoice.java
@@ -1,4 +1,4 @@
-package de.bentigorlich.mimic3ttsenginewrapper;
+package de.bentigorlich.mimic3ttsenginewrapper.entities;
import androidx.annotation.NonNull;
diff --git a/app/src/main/java/de/bentigorlich/mimic3ttsenginewrapper/Mimic3TTSEngine.java b/app/src/main/java/de/bentigorlich/mimic3ttsenginewrapper/tts/Mimic3TTSEngine.java
similarity index 97%
rename from app/src/main/java/de/bentigorlich/mimic3ttsenginewrapper/Mimic3TTSEngine.java
rename to app/src/main/java/de/bentigorlich/mimic3ttsenginewrapper/tts/Mimic3TTSEngine.java
index 378d68d..c55c27d 100644
--- a/app/src/main/java/de/bentigorlich/mimic3ttsenginewrapper/Mimic3TTSEngine.java
+++ b/app/src/main/java/de/bentigorlich/mimic3ttsenginewrapper/tts/Mimic3TTSEngine.java
@@ -1,4 +1,4 @@
-package de.bentigorlich.mimic3ttsenginewrapper;
+package de.bentigorlich.mimic3ttsenginewrapper.tts;
import android.speech.tts.SynthesisCallback;
import android.speech.tts.SynthesisRequest;
@@ -13,6 +13,8 @@
import java.util.List;
import java.util.Locale;
+import de.bentigorlich.mimic3ttsenginewrapper.entities.MimicVoice;
+
public class Mimic3TTSEngine extends TextToSpeechService {
//private final PyObject TtsModule;
diff --git a/app/src/main/java/de/bentigorlich/mimic3ttsenginewrapper/Mimic3TTSEngineWeb.java b/app/src/main/java/de/bentigorlich/mimic3ttsenginewrapper/tts/Mimic3TTSEngineWeb.java
similarity index 96%
rename from app/src/main/java/de/bentigorlich/mimic3ttsenginewrapper/Mimic3TTSEngineWeb.java
rename to app/src/main/java/de/bentigorlich/mimic3ttsenginewrapper/tts/Mimic3TTSEngineWeb.java
index 16e92e3..8e6f65d 100644
--- a/app/src/main/java/de/bentigorlich/mimic3ttsenginewrapper/Mimic3TTSEngineWeb.java
+++ b/app/src/main/java/de/bentigorlich/mimic3ttsenginewrapper/tts/Mimic3TTSEngineWeb.java
@@ -1,4 +1,4 @@
-package de.bentigorlich.mimic3ttsenginewrapper;
+package de.bentigorlich.mimic3ttsenginewrapper.tts;
import android.content.Intent;
import android.content.SharedPreferences;
@@ -48,10 +48,15 @@
import java.util.TimerTask;
import java.util.concurrent.locks.Lock;
import java.util.concurrent.locks.ReentrantLock;
+import java.util.logging.FileHandler;
import java.util.logging.LogManager;
import java.util.logging.Logger;
import java.util.stream.Collectors;
+import de.bentigorlich.mimic3ttsenginewrapper.entities.CacheEntry;
+import de.bentigorlich.mimic3ttsenginewrapper.entities.MimicVoice;
+import de.bentigorlich.mimic3ttsenginewrapper.util.JsonFormatter;
+
public class Mimic3TTSEngineWeb extends TextToSpeechService {
@@ -116,8 +121,21 @@ public KVP(K key, V value) {
private final Timer cacheFlushInterval;
public Mimic3TTSEngineWeb() {
- _Logger = Logger.getLogger("de.bentigorlich.mimic3ttsenginewrapper.Mimic3TTSEngineWeb");
+ _Logger = Logger.getLogger("de.bentigorlich.mimic3ttsenginewrapper.tts.Mimic3TTSEngineWeb");
LogManager.getLogManager().addLogger(_Logger);
+
+ String cacheDir = Mimic3TTSEngineWrapperApp.getStorageContext().getDataDir().getAbsolutePath();
+ try {
+ FileHandler fileHandler = new FileHandler(cacheDir + "/tts_%g.log", 1024 * 1024, 1, true);
+ fileHandler.setFormatter(new JsonFormatter());
+ _Logger.addHandler(fileHandler);
+ } catch (IOException e) {
+ _Logger.severe("IOException while adding filehandler to logger: " + e.getMessage());
+ for(StackTraceElement el : e.getStackTrace()) {
+ _Logger.warning("at: " + el.toString());
+ }
+ }
+
_Logger.info("Instantiated Mimic3TTSEngineWeb");
String[] languages = Locale.getISOLanguages();
@@ -130,6 +148,18 @@ public Mimic3TTSEngineWeb() {
CountryMap.put(locale.getISO3Country(), locale);
}
+ try {
+ buildCache();
+ if(Voices != null && Voices.size() > 0) {
+ FetchVoices = false;
+ }
+ } catch (Exception ex) {
+ _Logger.severe("An unhandled exception occurred: " + ex.getClass().getName() + ": " + ex.getMessage());
+ for(StackTraceElement el : ex.getStackTrace()) {
+ _Logger.warning("at: " + el.toString());
+ }
+ }
+
cacheFlushInterval = new Timer();
cacheFlushInterval.schedule(new TimerTask() {
@Override
@@ -158,18 +188,6 @@ public int onStartCommand(Intent intent, int flags, int startId) {
if (address != null && !address.equals(""))
s_ServerAddress = address;
}
-
- try {
- buildCache();
- if(Voices != null && Voices.size() > 0) {
- FetchVoices = false;
- }
- } catch (Exception ex) {
- _Logger.severe("An unhandled exception occurred: " + ex.getClass().getName() + ": " + ex.getMessage());
- for(StackTraceElement el : ex.getStackTrace()) {
- _Logger.warning("at: " + el.toString());
- }
- }
T = new Thread(this::main);
T.start();
return super.onStartCommand(intent, flags, startId);
@@ -229,7 +247,7 @@ private void main() {
private void loadVoices() {
List voices = new ArrayList<>();
- if(s_ServerAddress != null) {
+ if(s_ServerAddress != null && !s_ServerAddress.equals("") && !s_ServerAddress.equals("https://")) {
String slash = "";
if (!s_ServerAddress.endsWith("/"))
slash = "/";
diff --git a/app/src/main/java/de/bentigorlich/mimic3ttsenginewrapper/Mimic3TTSEngineWrapperApp.java b/app/src/main/java/de/bentigorlich/mimic3ttsenginewrapper/tts/Mimic3TTSEngineWrapperApp.java
similarity index 97%
rename from app/src/main/java/de/bentigorlich/mimic3ttsenginewrapper/Mimic3TTSEngineWrapperApp.java
rename to app/src/main/java/de/bentigorlich/mimic3ttsenginewrapper/tts/Mimic3TTSEngineWrapperApp.java
index 6a221a1..99a256e 100644
--- a/app/src/main/java/de/bentigorlich/mimic3ttsenginewrapper/Mimic3TTSEngineWrapperApp.java
+++ b/app/src/main/java/de/bentigorlich/mimic3ttsenginewrapper/tts/Mimic3TTSEngineWrapperApp.java
@@ -1,4 +1,4 @@
-package de.bentigorlich.mimic3ttsenginewrapper;
+package de.bentigorlich.mimic3ttsenginewrapper.tts;
import android.app.Application;
import android.content.Context;
diff --git a/app/src/main/java/de/bentigorlich/mimic3ttsenginewrapper/SynthesisListener.java b/app/src/main/java/de/bentigorlich/mimic3ttsenginewrapper/tts/SynthesisListener.java
similarity index 98%
rename from app/src/main/java/de/bentigorlich/mimic3ttsenginewrapper/SynthesisListener.java
rename to app/src/main/java/de/bentigorlich/mimic3ttsenginewrapper/tts/SynthesisListener.java
index b9f17e3..b921343 100644
--- a/app/src/main/java/de/bentigorlich/mimic3ttsenginewrapper/SynthesisListener.java
+++ b/app/src/main/java/de/bentigorlich/mimic3ttsenginewrapper/tts/SynthesisListener.java
@@ -1,4 +1,4 @@
-package de.bentigorlich.mimic3ttsenginewrapper;
+package de.bentigorlich.mimic3ttsenginewrapper.tts;
import android.media.AudioAttributes;
import android.media.AudioFormat;
diff --git a/app/src/main/java/de/bentigorlich/mimic3ttsenginewrapper/util/JsonFormatter.java b/app/src/main/java/de/bentigorlich/mimic3ttsenginewrapper/util/JsonFormatter.java
new file mode 100644
index 0000000..8567602
--- /dev/null
+++ b/app/src/main/java/de/bentigorlich/mimic3ttsenginewrapper/util/JsonFormatter.java
@@ -0,0 +1,25 @@
+package de.bentigorlich.mimic3ttsenginewrapper.util;
+
+import com.google.gson.Gson;
+
+import java.util.logging.Formatter;
+import java.util.logging.LogRecord;
+
+import de.bentigorlich.mimic3ttsenginewrapper.entities.LogEntity;
+
+public class JsonFormatter extends Formatter {
+
+ Gson _Gson;
+
+ public JsonFormatter() {
+ super();
+ _Gson = new Gson();
+ }
+
+ @Override
+ public String format(LogRecord logRecord) {
+
+ String message = _Gson.toJson(new LogEntity(logRecord)) + "\n";
+ return message;
+ }
+}
diff --git a/app/src/main/res/layout/activity_log.xml b/app/src/main/res/layout/activity_log.xml
new file mode 100644
index 0000000..b329260
--- /dev/null
+++ b/app/src/main/res/layout/activity_log.xml
@@ -0,0 +1,37 @@
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/app/src/main/res/layout/activity_main.xml b/app/src/main/res/layout/activity_main.xml
index 6dabbd5..d7d6d54 100644
--- a/app/src/main/res/layout/activity_main.xml
+++ b/app/src/main/res/layout/activity_main.xml
@@ -4,7 +4,7 @@
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
- tools:context=".MainActivity">
+ tools:context=".activities.MainActivity">
+ tools:context=".activities.SettingsActivity">
+
\ No newline at end of file
diff --git a/app/src/main/res/menu/menu.xml b/app/src/main/res/menu/menu.xml
index 813381a..41fa1cd 100644
--- a/app/src/main/res/menu/menu.xml
+++ b/app/src/main/res/menu/menu.xml
@@ -8,4 +8,10 @@
android:icon="@android:drawable/ic_menu_manage"
android:onClick="onMenuItemClick"
android:title="@string/lbl_settings" />
+
\ No newline at end of file
diff --git a/app/src/main/res/values-de/strings.xml b/app/src/main/res/values-de/strings.xml
index 92638d2..c5604f4 100644
--- a/app/src/main/res/values-de/strings.xml
+++ b/app/src/main/res/values-de/strings.xml
@@ -41,4 +41,7 @@
Zwischenspeicherlöschung erfolgreich.
Zwischenspeicherlöschung ist fehlgeschlagen, der Service läuft nicht.
+
+ Logs
+ Lösche Logs
\ No newline at end of file
diff --git a/app/src/main/res/values/colors.xml b/app/src/main/res/values/colors.xml
index d64a964..7ea1d5b 100644
--- a/app/src/main/res/values/colors.xml
+++ b/app/src/main/res/values/colors.xml
@@ -7,4 +7,6 @@
#DF3D3D
#1B1B1B
#F0F0F0
+ #FFD500
+ #FF4800
\ No newline at end of file
diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml
index 8561db3..f96df09 100644
--- a/app/src/main/res/values/strings.xml
+++ b/app/src/main/res/values/strings.xml
@@ -40,4 +40,7 @@
Cache reset was successful.
Cache reset failed, because the service is offline.
+
+ Logs
+ Delete Logs
\ No newline at end of file