From ccf3374d41fd12631bb2aa109364f212eeee3946 Mon Sep 17 00:00:00 2001 From: BentiGorlich Date: Tue, 26 Sep 2023 21:56:54 +0200 Subject: [PATCH] Structuring and adding LogView - move classes in sub packages for a better structure - add a log view - add log handlers to write log files. The format is one json serialized `LogEntity` per line --- app/src/main/AndroidManifest.xml | 17 ++- .../CheckTTSDataActivity.java | 5 +- .../activities/LogActivity.java | 125 ++++++++++++++++++ .../{ => activities}/MainActivity.java | 44 ++++-- .../{ => activities}/SettingsActivity.java | 6 +- .../{ => activities}/SettingsFragment.java | 5 +- .../{ => entities}/CacheEntry.java | 2 +- .../entities/LogEntity.java | 58 ++++++++ .../{ => entities}/MimicVoice.java | 2 +- .../{ => tts}/Mimic3TTSEngine.java | 4 +- .../{ => tts}/Mimic3TTSEngineWeb.java | 48 ++++--- .../{ => tts}/Mimic3TTSEngineWrapperApp.java | 2 +- .../{ => tts}/SynthesisListener.java | 2 +- .../util/JsonFormatter.java | 25 ++++ app/src/main/res/layout/activity_log.xml | 37 ++++++ app/src/main/res/layout/activity_main.xml | 2 +- app/src/main/res/layout/activity_settings.xml | 2 +- app/src/main/res/menu/logmenu.xml | 10 ++ app/src/main/res/menu/menu.xml | 6 + app/src/main/res/values-de/strings.xml | 3 + app/src/main/res/values/colors.xml | 2 + app/src/main/res/values/strings.xml | 3 + 22 files changed, 370 insertions(+), 40 deletions(-) rename app/src/main/java/de/bentigorlich/mimic3ttsenginewrapper/{ => activities}/CheckTTSDataActivity.java (95%) create mode 100644 app/src/main/java/de/bentigorlich/mimic3ttsenginewrapper/activities/LogActivity.java rename app/src/main/java/de/bentigorlich/mimic3ttsenginewrapper/{ => activities}/MainActivity.java (88%) rename app/src/main/java/de/bentigorlich/mimic3ttsenginewrapper/{ => activities}/SettingsActivity.java (89%) rename app/src/main/java/de/bentigorlich/mimic3ttsenginewrapper/{ => activities}/SettingsFragment.java (88%) rename app/src/main/java/de/bentigorlich/mimic3ttsenginewrapper/{ => entities}/CacheEntry.java (87%) create mode 100644 app/src/main/java/de/bentigorlich/mimic3ttsenginewrapper/entities/LogEntity.java rename app/src/main/java/de/bentigorlich/mimic3ttsenginewrapper/{ => entities}/MimicVoice.java (93%) rename app/src/main/java/de/bentigorlich/mimic3ttsenginewrapper/{ => tts}/Mimic3TTSEngine.java (97%) rename app/src/main/java/de/bentigorlich/mimic3ttsenginewrapper/{ => tts}/Mimic3TTSEngineWeb.java (96%) rename app/src/main/java/de/bentigorlich/mimic3ttsenginewrapper/{ => tts}/Mimic3TTSEngineWrapperApp.java (97%) rename app/src/main/java/de/bentigorlich/mimic3ttsenginewrapper/{ => tts}/SynthesisListener.java (98%) create mode 100644 app/src/main/java/de/bentigorlich/mimic3ttsenginewrapper/util/JsonFormatter.java create mode 100644 app/src/main/res/layout/activity_log.xml create mode 100644 app/src/main/res/menu/logmenu.xml 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