From 92918068299100077ab6369e50348c9f93971422 Mon Sep 17 00:00:00 2001 From: Elliot Wolk Date: Mon, 16 Jan 2023 22:40:18 -0500 Subject: [PATCH 1/4] android: add simple file log for persistent state outside of logcat --- android/src/org/coolreader/CoolReader.java | 6 +++ .../crengine/CRStateFileLogger.java | 50 +++++++++++++++++++ 2 files changed, 56 insertions(+) create mode 100644 android/src/org/coolreader/crengine/CRStateFileLogger.java diff --git a/android/src/org/coolreader/CoolReader.java b/android/src/org/coolreader/CoolReader.java index 957d6ec1c..a2d5e4a45 100644 --- a/android/src/org/coolreader/CoolReader.java +++ b/android/src/org/coolreader/CoolReader.java @@ -56,6 +56,7 @@ import org.coolreader.crengine.BrowserViewLayout; import org.coolreader.crengine.CRRootView; import org.coolreader.crengine.CRToolBar; +import org.coolreader.crengine.CRStateFileLogger; import org.coolreader.crengine.DeviceInfo; import org.coolreader.crengine.DocumentsContractWrapper; import org.coolreader.crengine.Engine; @@ -212,6 +213,10 @@ public void onReceive(Context context, Intent intent) { */ @Override protected void onCreate(Bundle savedInstanceState) { + CRStateFileLogger.init(getApplicationContext()); + CRStateFileLogger.clear(); + CRStateFileLogger.appendState("APP_CREATE"); + startServices(); log.i("CoolReader.onCreate() entered"); @@ -283,6 +288,7 @@ protected void onCreate(Bundle savedInstanceState) { @Override protected void onDestroy() { + CRStateFileLogger.appendState("APP_DESTROY"); log.i("CoolReader.onDestroy() entered"); if (!CLOSE_BOOK_ON_STOP && mReaderView != null) diff --git a/android/src/org/coolreader/crengine/CRStateFileLogger.java b/android/src/org/coolreader/crengine/CRStateFileLogger.java new file mode 100644 index 000000000..0e6db2547 --- /dev/null +++ b/android/src/org/coolreader/crengine/CRStateFileLogger.java @@ -0,0 +1,50 @@ +package org.coolreader.crengine; + +import android.content.Context; +import android.text.format.DateFormat; + +import org.coolreader.crengine.L; +import org.coolreader.crengine.Logger; + +import java.io.File; +import java.io.FileOutputStream; +import java.io.IOException; + +import java.util.Date; + +public class CRStateFileLogger { + private static final String fileName = "cr-state-log.txt"; + private static File appFilesDir; + + public static final Logger log = L.create("state-logger"); + + public static void init(Context applicationContext){ + appFilesDir = applicationContext.getFilesDir(); + } + + public static void clear(){ + File file = new File(appFilesDir, fileName); + file.delete(); + } + + public static void appendState(String state){ + log.i("writing " + state + " to " + fileName); + + if (appFilesDir == null) { + log.e("ERROR: " + fileName + " is not initialized"); + return; + } + + String dtm = DateFormat.format("yyyy-MM-ddTHH:mm:ss", new Date()).toString(); + String msg = dtm + " - " + state.trim() + "\n"; + + try { + File file = new File(appFilesDir, fileName); + FileOutputStream stream = new FileOutputStream(file, true); + stream.write(msg.getBytes()); + stream.close(); + } catch (IOException e){ + log.e("ERROR: could not log to " + fileName); + } + } +} From 5fe6d997a06f1d7ea04ce70f7b7fbc3c1572cab9 Mon Sep 17 00:00:00 2001 From: Elliot Wolk Date: Mon, 16 Jan 2023 22:43:45 -0500 Subject: [PATCH 2/4] android: add TTS_CREATE and TTS_DESTROY to state file logger --- android/src/org/coolreader/tts/TTSControlService.java | 3 +++ 1 file changed, 3 insertions(+) diff --git a/android/src/org/coolreader/tts/TTSControlService.java b/android/src/org/coolreader/tts/TTSControlService.java index a4825f271..4a8da80c1 100644 --- a/android/src/org/coolreader/tts/TTSControlService.java +++ b/android/src/org/coolreader/tts/TTSControlService.java @@ -51,6 +51,7 @@ import org.coolreader.CoolReader; import org.coolreader.R; +import org.coolreader.crengine.CRStateFileLogger; import org.coolreader.crengine.L; import org.coolreader.crengine.Logger; import org.coolreader.crengine.SentenceInfo; @@ -310,6 +311,7 @@ public TTSControlService() { @Override public void onCreate() { + CRStateFileLogger.appendState("TTS_CREATE"); log.d("onCreate"); super.onCreate(); mState = State.STOPPED; @@ -571,6 +573,7 @@ public IBinder onBind(Intent intent) { @Override public void onDestroy() { + CRStateFileLogger.appendState("TTS_DESTROY"); log.d("onDestroy"); getApplicationContext().getContentResolver().unregisterContentObserver(mVolumeSettingsContentObserver); synchronized (mLocker) { From 2e1754f4d017ac10015804a94a53f044bf8d7024 Mon Sep 17 00:00:00 2001 From: Elliot Wolk Date: Sat, 3 Jun 2023 11:05:02 -0400 Subject: [PATCH 3/4] tts: tiny refactor of tts toolbar on-close-listener --- android/src/org/coolreader/crengine/ReaderView.java | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/android/src/org/coolreader/crengine/ReaderView.java b/android/src/org/coolreader/crengine/ReaderView.java index b910c4db7..7988667c6 100644 --- a/android/src/org/coolreader/crengine/ReaderView.java +++ b/android/src/org/coolreader/crengine/ReaderView.java @@ -2422,7 +2422,9 @@ public void onCommand(final ReaderCommand cmd, final int param, final Runnable o mActivity.initTTS(ttsacc -> BackgroundThread.instance().executeGUI(() -> { log.i("TTS created: opening TTS toolbar"); ttsToolbar = TTSToolbarDlg.showDialog(mActivity, ReaderView.this, ttsacc); - ttsToolbar.setOnCloseListener(() -> ttsToolbar = null); + ttsToolbar.setOnCloseListener(() -> { + ttsToolbar = null; + }); ttsToolbar.setAppSettings(mSettings, null); ttsToolbar.initAudiobookWordTimings(null); })); From f565efbf87d45af80f33cce42fb0d26f177b1961 Mon Sep 17 00:00:00 2001 From: Elliot Wolk Date: Sat, 3 Jun 2023 11:06:15 -0400 Subject: [PATCH 4/4] tts: log when TTS toolbar is shown/hidden instead of created/destroyed --- android/src/org/coolreader/crengine/ReaderView.java | 3 +++ android/src/org/coolreader/tts/TTSControlService.java | 3 --- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/android/src/org/coolreader/crengine/ReaderView.java b/android/src/org/coolreader/crengine/ReaderView.java index 7988667c6..7edadf215 100644 --- a/android/src/org/coolreader/crengine/ReaderView.java +++ b/android/src/org/coolreader/crengine/ReaderView.java @@ -58,6 +58,7 @@ import org.coolreader.CoolReader; import org.coolreader.R; +import org.coolreader.crengine.CRStateFileLogger; import org.coolreader.crengine.InputDialog.InputHandler; import org.koekak.android.ebookdownloader.SonyBookSelector; @@ -2421,9 +2422,11 @@ public void onCommand(final ReaderCommand cmd, final int param, final Runnable o log.i("DCMD_TTS_PLAY: initializing TTS"); mActivity.initTTS(ttsacc -> BackgroundThread.instance().executeGUI(() -> { log.i("TTS created: opening TTS toolbar"); + CRStateFileLogger.appendState("TTS_ON"); ttsToolbar = TTSToolbarDlg.showDialog(mActivity, ReaderView.this, ttsacc); ttsToolbar.setOnCloseListener(() -> { ttsToolbar = null; + CRStateFileLogger.appendState("TTS_OFF"); }); ttsToolbar.setAppSettings(mSettings, null); ttsToolbar.initAudiobookWordTimings(null); diff --git a/android/src/org/coolreader/tts/TTSControlService.java b/android/src/org/coolreader/tts/TTSControlService.java index 4a8da80c1..a4825f271 100644 --- a/android/src/org/coolreader/tts/TTSControlService.java +++ b/android/src/org/coolreader/tts/TTSControlService.java @@ -51,7 +51,6 @@ import org.coolreader.CoolReader; import org.coolreader.R; -import org.coolreader.crengine.CRStateFileLogger; import org.coolreader.crengine.L; import org.coolreader.crengine.Logger; import org.coolreader.crengine.SentenceInfo; @@ -311,7 +310,6 @@ public TTSControlService() { @Override public void onCreate() { - CRStateFileLogger.appendState("TTS_CREATE"); log.d("onCreate"); super.onCreate(); mState = State.STOPPED; @@ -573,7 +571,6 @@ public IBinder onBind(Intent intent) { @Override public void onDestroy() { - CRStateFileLogger.appendState("TTS_DESTROY"); log.d("onDestroy"); getApplicationContext().getContentResolver().unregisterContentObserver(mVolumeSettingsContentObserver); synchronized (mLocker) {