Skip to content

Commit f4bda20

Browse files
committed
create a better logging system
1 parent 02bdca2 commit f4bda20

File tree

26 files changed

+907
-62
lines changed

26 files changed

+907
-62
lines changed

app/src/main/AndroidManifest.xml

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -137,6 +137,13 @@
137137
</intent-filter>
138138
</activity>
139139

140+
<activity
141+
android:name=".screen.logs.LogsActivity"
142+
android:exported="false"
143+
android:label="@string/title_activity_logs"
144+
android:theme="@style/Theme.FileExplorer"
145+
android:windowSoftInputMode="adjustResize" />
146+
140147
<activity
141148
android:name=".screen.main.MainActivity"
142149
android:exported="true"

app/src/main/java/com/raival/compose/file/explorer/App.kt

Lines changed: 23 additions & 44 deletions
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,6 @@ package com.raival.compose.file.explorer
33
import android.app.Application
44
import android.content.Context
55
import android.os.Process
6-
import android.util.Log
76
import android.widget.Toast
87
import androidx.annotation.StringRes
98
import coil3.ImageLoader
@@ -19,9 +18,7 @@ import coil3.svg.SvgDecoder
1918
import coil3.video.VideoFrameDecoder
2019
import com.raival.compose.file.explorer.coil.apk.ApkFileDecoder
2120
import 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
2522
import com.raival.compose.file.explorer.screen.main.MainActivityManager
2623
import com.raival.compose.file.explorer.screen.main.tab.files.FilesTabManager
2724
import 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
3835
import io.github.rosemoe.sora.langs.textmate.registry.provider.AssetsFileResolver
3936
import kotlinx.coroutines.CoroutineScope
4037
import kotlinx.coroutines.Dispatchers
38+
import kotlinx.coroutines.SupervisorJob
4139
import kotlinx.coroutines.launch
4240
import org.eclipse.tm4e.core.registry.IThemeSource
4341
import 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()

app/src/main/java/com/raival/compose/file/explorer/common/extension/Extensions.kt

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -255,13 +255,13 @@ fun Uri.exists(context: Context): Boolean {
255255
// which means the URI is valid and accessible.
256256
return true
257257
}
258-
} catch (e: FileNotFoundException) {
258+
} catch (_: FileNotFoundException) {
259259
// The content provider reported that the file doesn't exist.
260260
return false
261-
} catch (e: SecurityException) {
261+
} catch (_: SecurityException) {
262262
// We don't have permission to read the URI.
263263
return false
264-
} catch (e: Exception) {
264+
} catch (_: Exception) {
265265
// Handle other potential exceptions, such as IllegalArgumentException for a malformed URI.
266266
return false
267267
}

0 commit comments

Comments
 (0)