@@ -3,7 +3,6 @@ package com.raival.compose.file.explorer
33import android.app.Application
44import android.content.Context
55import android.os.Process
6- import android.util.Log
76import android.widget.Toast
87import androidx.annotation.StringRes
98import coil3.ImageLoader
@@ -19,9 +18,7 @@ import coil3.svg.SvgDecoder
1918import coil3.video.VideoFrameDecoder
2019import com.raival.compose.file.explorer.coil.apk.ApkFileDecoder
2120import com.raival.compose.file.explorer.coil.pdf.PdfFileDecoder
22- import com.raival.compose.file.explorer.common.extension.emptyString
23- import com.raival.compose.file.explorer.common.extension.printFullStackTrace
24- import com.raival.compose.file.explorer.common.extension.toFormattedDate
21+ import com.raival.compose.file.explorer.common.logger.FileExplorerLogger
2522import com.raival.compose.file.explorer.screen.main.MainActivityManager
2623import com.raival.compose.file.explorer.screen.main.tab.files.FilesTabManager
2724import com.raival.compose.file.explorer.screen.main.tab.files.coil.DocumentFileMapper
@@ -38,6 +35,7 @@ import io.github.rosemoe.sora.langs.textmate.registry.model.ThemeModel
3835import io.github.rosemoe.sora.langs.textmate.registry.provider.AssetsFileResolver
3936import kotlinx.coroutines.CoroutineScope
4037import kotlinx.coroutines.Dispatchers
38+ import kotlinx.coroutines.SupervisorJob
4139import kotlinx.coroutines.launch
4240import org.eclipse.tm4e.core.registry.IThemeSource
4341import java.io.File
@@ -49,18 +47,21 @@ class App : Application(), coil3.SingletonImageLoader.Factory {
4947
5048 val globalClass
5149 get() = appContext as App
50+
51+ val logger
52+ get() = globalClass.logger
5253 }
5354
55+ private val applicationScope = CoroutineScope (SupervisorJob () + Dispatchers .IO )
56+
57+ lateinit var logger: FileExplorerLogger
58+ private set
59+
5460 val appFiles: LocalFileHolder
5561 get() = LocalFileHolder (
5662 File (globalClass.cacheDir, " files" ).apply { if (! exists()) mkdirs() }
5763 )
5864
59- private val errorLogFile: LocalFileHolder
60- get() = LocalFileHolder (
61- File (globalClass.cacheDir, " logs.txt" ).apply { if (! exists()) createNewFile() }
62- )
63-
6465 val recycleBinDir: LocalFileHolder
6566 get() = LocalFileHolder (File (getExternalFilesDir(null ), " bin" ).apply { mkdirs() })
6667
@@ -78,19 +79,24 @@ class App : Application(), coil3.SingletonImageLoader.Factory {
7879 val zipManager: ZipManager by lazy { ZipManager () }
7980
8081 override fun onCreate () {
81- Thread .setDefaultUncaughtExceptionHandler { _: Thread ? , throwable: Throwable ? ->
82- throwable?.let {
83- Log .e(" AppCrash" , emptyString, it).also { log(throwable) }
84- }
85- Process .killProcess(Process .myPid())
86- exitProcess(2 )
87- }
88-
8982 super .onCreate()
9083
84+ logger = FileExplorerLogger (this , applicationScope)
85+ setupGlobalExceptionHandler()
86+
9187 appContext = this
9288 }
9389
90+ private fun setupGlobalExceptionHandler () {
91+ val defaultHandler = Thread .getDefaultUncaughtExceptionHandler()
92+ Thread .setDefaultUncaughtExceptionHandler { thread, exception ->
93+ logger.logError(exception)
94+ defaultHandler?.uncaughtException(thread, exception)
95+ Process .killProcess(Process .myPid())
96+ exitProcess(2 )
97+ }
98+ }
99+
94100 private fun setupTextMate () {
95101 CoroutineScope (Dispatchers .IO ).launch {
96102 FileProviderRegistry .getInstance().addFileProvider(
@@ -142,33 +148,6 @@ class App : Application(), coil3.SingletonImageLoader.Factory {
142148
143149 fun generateUid () = uid++
144150
145- fun log (throwable : Throwable ) {
146- log(throwable.printFullStackTrace(), " Error" )
147- }
148-
149- fun log (msg : String , header : String = emptyString) {
150- if (! errorLogFile.exists()) return
151- if (errorLogFile.isFolder) return
152-
153- if (errorLogFile.size > 1024 * 100 ) {
154- errorLogFile.writeText(emptyString)
155- }
156-
157- errorLogFile.appendText(
158- buildString {
159- if (header.isNotEmpty()) {
160- append(System .lineSeparator().repeat(2 ))
161- append(" -" .repeat(4 ))
162- append(" $header : ${System .currentTimeMillis().toFormattedDate()} " )
163- append(" -" .repeat(4 ))
164- append(System .lineSeparator())
165- }
166- append(msg)
167- append(System .lineSeparator())
168- }
169- )
170- }
171-
172151 override fun newImageLoader (context : PlatformContext ): ImageLoader {
173152 return ImageLoader (context)
174153 .newBuilder()
0 commit comments