diff --git a/data/src/main/java/com/moez/QKSMS/util/Preferences.kt b/data/src/main/java/com/moez/QKSMS/util/Preferences.kt index 81f5380e..0af06c65 100644 --- a/data/src/main/java/com/moez/QKSMS/util/Preferences.kt +++ b/data/src/main/java/com/moez/QKSMS/util/Preferences.kt @@ -84,6 +84,7 @@ class Preferences @Inject constructor(private val rxPrefs: RxSharedPreferences) val delivery = rxPrefs.getBoolean("delivery", false) val unicode = rxPrefs.getBoolean("unicode", false) val mmsSize = rxPrefs.getInteger("mmsSize", 300) + val logging = rxPrefs.getBoolean("logging", false) fun theme(threadId: Long = 0): Preference { val default = rxPrefs.getInteger("theme", 0xFF0097A7.toInt()) diff --git a/presentation/src/main/java/com/moez/QKSMS/common/QKApplication.kt b/presentation/src/main/java/com/moez/QKSMS/common/QKApplication.kt index 55b0d763..aed16336 100644 --- a/presentation/src/main/java/com/moez/QKSMS/common/QKApplication.kt +++ b/presentation/src/main/java/com/moez/QKSMS/common/QKApplication.kt @@ -49,6 +49,7 @@ import com.bugsnag.android.Configuration import com.moez.QKSMS.BuildConfig import com.moez.QKSMS.R import com.moez.QKSMS.common.util.BugsnagTree +import com.moez.QKSMS.common.util.FileLoggingTree import com.moez.QKSMS.injection.AppComponentManager import com.moez.QKSMS.injection.appComponent import com.moez.QKSMS.manager.AnalyticsManager @@ -75,6 +76,7 @@ class QKApplication : Application(), HasActivityInjector, HasBroadcastReceiverIn @Inject lateinit var dispatchingActivityInjector: DispatchingAndroidInjector @Inject lateinit var dispatchingBroadcastReceiverInjector: DispatchingAndroidInjector @Inject lateinit var dispatchingServiceInjector: DispatchingAndroidInjector + @Inject lateinit var fileLoggingTree: FileLoggingTree @Inject lateinit var nightModeManager: NightModeManager private val packages = arrayOf("com.moez.QKSMS") @@ -109,7 +111,7 @@ class QKApplication : Application(), HasActivityInjector, HasBroadcastReceiverIn EmojiCompat.init(FontRequestEmojiCompatConfig(this, fontRequest)) - Timber.plant(Timber.DebugTree(), BugsnagTree()) + Timber.plant(Timber.DebugTree(), BugsnagTree(), fileLoggingTree) } override fun activityInjector(): AndroidInjector { diff --git a/presentation/src/main/java/com/moez/QKSMS/common/util/FileLoggingTree.kt b/presentation/src/main/java/com/moez/QKSMS/common/util/FileLoggingTree.kt index 400ecafc..bf5c6c8a 100644 --- a/presentation/src/main/java/com/moez/QKSMS/common/util/FileLoggingTree.kt +++ b/presentation/src/main/java/com/moez/QKSMS/common/util/FileLoggingTree.kt @@ -20,24 +20,30 @@ package com.moez.QKSMS.common.util import android.os.Environment import android.util.Log +import com.moez.QKSMS.util.Preferences +import io.reactivex.schedulers.Schedulers import timber.log.Timber import java.io.File import java.io.FileOutputStream import java.text.SimpleDateFormat import java.util.* +import javax.inject.Inject +import javax.inject.Singleton /** * Based off Vipin Kumar's FileLoggingTree: https://medium.com/@vicky7230/file-logging-with-timber-4e63a1b86a66 */ -class FileLoggingTree : Timber.DebugTree() { +@Singleton +class FileLoggingTree @Inject constructor(private val prefs: Preferences) : Timber.DebugTree() { + + private val fileLock: Boolean = false override fun log(priority: Int, tag: String, message: String, t: Throwable?) { - try { - val time = System.currentTimeMillis() - val dir = File(Environment.getExternalStorageDirectory(), "QKSMS/Logs").apply { mkdirs() } - val file = File(dir, "${SimpleDateFormat("yyyy-MM-dd", Locale.getDefault()).format(time)}.html") + if (!prefs.logging.get()) return - val priorityString = when(priority) { + Schedulers.io().scheduleDirect { + val timestamp = SimpleDateFormat("yyyy-MM-dd HH:mm:ss:SSS", Locale.getDefault()).format(System.currentTimeMillis()) + val priorityString = when (priority) { Log.VERBOSE -> "V" Log.DEBUG -> "D" Log.INFO -> "I" @@ -46,13 +52,24 @@ class FileLoggingTree : Timber.DebugTree() { else -> "WTF" } - FileOutputStream(file, true).use { fileOutputStream -> - val timestamp = SimpleDateFormat("yyyy-MM-dd HH:mm:ss:SSS", Locale.getDefault()).format(time) - fileOutputStream.write("$timestamp $priorityString/$tag: $message ${Log.getStackTraceString(t)}
".toByteArray()) - } - } catch (e: Exception) { - Log.e("FileLoggingTree", "Error while logging into file", e) - } + // Format the log to be written to the file + val log = "$timestamp $priorityString/$tag: $message ${Log.getStackTraceString(t)}
".toByteArray() + // Ensure that only one thread is writing to the file at a time + synchronized(fileLock) { + try { + // Create the directory + val dir = File(Environment.getExternalStorageDirectory(), "QKSMS/Logs").apply { mkdirs() } + + // Create the file + val file = File(dir, "${SimpleDateFormat("yyyy-MM-dd", Locale.getDefault()).format(System.currentTimeMillis())}.html") + + // Write the log to the file + FileOutputStream(file, true).use { fileOutputStream -> fileOutputStream.write(log) } + } catch (e: Exception) { + Log.e("FileLoggingTree", "Error while logging into file", e) + } + } + } } } \ No newline at end of file diff --git a/presentation/src/main/java/com/moez/QKSMS/feature/settings/SettingsController.kt b/presentation/src/main/java/com/moez/QKSMS/feature/settings/SettingsController.kt index 321d0684..44e7f0c8 100644 --- a/presentation/src/main/java/com/moez/QKSMS/feature/settings/SettingsController.kt +++ b/presentation/src/main/java/com/moez/QKSMS/feature/settings/SettingsController.kt @@ -11,6 +11,7 @@ import com.bluelinelabs.conductor.changehandler.HorizontalChangeHandler import com.bluelinelabs.conductor.changehandler.VerticalChangeHandler import com.google.android.material.snackbar.Snackbar import com.jakewharton.rxbinding2.view.clicks +import com.jakewharton.rxbinding2.view.longClicks import com.moez.QKSMS.BuildConfig import com.moez.QKSMS.R import com.moez.QKSMS.common.QkChangeHandler @@ -94,6 +95,8 @@ class SettingsController : QkController preference.clicks().map { preference } } .let { preferences -> Observable.merge(preferences) } + override fun aboutLongClicks(): Observable<*> = about.longClicks() + override fun viewQksmsPlusClicks(): Observable<*> = viewQksmsPlusSubject override fun nightModeSelected(): Observable = nightModeDialog.adapter.menuItemClicks diff --git a/presentation/src/main/java/com/moez/QKSMS/feature/settings/SettingsPresenter.kt b/presentation/src/main/java/com/moez/QKSMS/feature/settings/SettingsPresenter.kt index 1f834bb3..f665acd8 100644 --- a/presentation/src/main/java/com/moez/QKSMS/feature/settings/SettingsPresenter.kt +++ b/presentation/src/main/java/com/moez/QKSMS/feature/settings/SettingsPresenter.kt @@ -1,6 +1,7 @@ package com.moez.QKSMS.feature.settings import android.content.Context +import androidx.core.widget.toast import com.moez.QKSMS.R import com.moez.QKSMS.common.Navigator import com.moez.QKSMS.common.base.QkPresenter @@ -142,6 +143,17 @@ class SettingsPresenter @Inject constructor( } } + view.aboutLongClicks() + .map { !prefs.logging.get() } + .doOnNext { enabled -> prefs.logging.set(enabled) } + .autoDisposable(view.scope()) + .subscribe { enabled -> + context.toast(when (enabled) { + true -> R.string.settings_logging_enabled + false -> R.string.settings_logging_disabled + }) + } + view.nightModeSelected() .withLatestFrom(billingManager.upgradeStatus) { mode, upgraded -> if (!upgraded && mode == Preferences.NIGHT_MODE_AUTO) { diff --git a/presentation/src/main/java/com/moez/QKSMS/feature/settings/SettingsView.kt b/presentation/src/main/java/com/moez/QKSMS/feature/settings/SettingsView.kt index 4e403fff..081d4c08 100644 --- a/presentation/src/main/java/com/moez/QKSMS/feature/settings/SettingsView.kt +++ b/presentation/src/main/java/com/moez/QKSMS/feature/settings/SettingsView.kt @@ -24,6 +24,7 @@ import io.reactivex.Observable interface SettingsView : QkViewContract { fun preferenceClicks(): Observable + fun aboutLongClicks(): Observable<*> fun viewQksmsPlusClicks(): Observable<*> fun nightModeSelected(): Observable fun nightStartSelected(): Observable> diff --git a/presentation/src/main/res/values/strings.xml b/presentation/src/main/res/values/strings.xml index 02b6732f..e810df90 100644 --- a/presentation/src/main/res/values/strings.xml +++ b/presentation/src/main/res/values/strings.xml @@ -208,6 +208,8 @@ Re-sync your messages with the native Android SMS database About QKSMS Version %s + Debug logging enabled + Debug logging disabled Enter duration (seconds)