diff --git a/app/src/main/java/de/kuschku/quasseldroid_ng/QuasseldroidNG.kt b/app/src/main/java/de/kuschku/quasseldroid_ng/QuasseldroidNG.kt index 78add5c87ccf62370f27c6104a13ee1eb842b12a..8eac657318ec22d887adf509047a796b15841245 100644 --- a/app/src/main/java/de/kuschku/quasseldroid_ng/QuasseldroidNG.kt +++ b/app/src/main/java/de/kuschku/quasseldroid_ng/QuasseldroidNG.kt @@ -18,7 +18,10 @@ class QuasseldroidNG : Application() { } override fun onCreate() { - CrashHandler.init(this, buildConfig = BuildConfig::class.java) + CrashHandler.init( + application = this, + buildConfig = BuildConfig::class.java + ) super.onCreate() // Init compatibility utils diff --git a/app/src/main/java/de/kuschku/quasseldroid_ng/ui/chat/ChatActivity.kt b/app/src/main/java/de/kuschku/quasseldroid_ng/ui/chat/ChatActivity.kt index e3418711929e1705790edd411f9a9af2cc46b0b9..be2ccd8d052e9161a68de4d8d2c639e2c8de8c30 100644 --- a/app/src/main/java/de/kuschku/quasseldroid_ng/ui/chat/ChatActivity.kt +++ b/app/src/main/java/de/kuschku/quasseldroid_ng/ui/chat/ChatActivity.kt @@ -20,6 +20,7 @@ import de.kuschku.libquassel.session.SessionManager import de.kuschku.libquassel.session.SocketAddress import de.kuschku.libquassel.util.compatibility.LoggingHandler import de.kuschku.libquassel.util.compatibility.LoggingHandler.LogLevel.INFO +import de.kuschku.malheur.CrashHandler import de.kuschku.quasseldroid_ng.Keys import de.kuschku.quasseldroid_ng.R import de.kuschku.quasseldroid_ng.persistence.AccountDatabase @@ -111,6 +112,17 @@ class ChatActivity : ServiceBoundActivity() { true ) } + CrashHandler.handle( + IllegalArgumentException( + "WRONG!", + RuntimeException( + "WRONG!", + NullPointerException( + "Super wrong!" + ) + ) + ) + ) } } }) diff --git a/malheur/src/main/java/de/kuschku/malheur/CrashContext.kt b/malheur/src/main/java/de/kuschku/malheur/CrashContext.kt index ec7719c1f9437b7ddc31d766f50aaa9156c84684..607f1e01c543b7680a3d90937465efbc185c5057 100644 --- a/malheur/src/main/java/de/kuschku/malheur/CrashContext.kt +++ b/malheur/src/main/java/de/kuschku/malheur/CrashContext.kt @@ -11,5 +11,6 @@ data class CrashContext( val throwable: Throwable, val startTime: Date, val crashTime: Date, - val buildConfig: Class<*>? + val buildConfig: Class<*>?, + val stackTraces: Map<Thread, Array<StackTraceElement>>? ) diff --git a/malheur/src/main/java/de/kuschku/malheur/CrashHandler.kt b/malheur/src/main/java/de/kuschku/malheur/CrashHandler.kt index 4fe85518c1508d6ae14c57e5e3eede0e6cc494c1..7d98d97cd0ad02fbd336f1d999840de27a0892e0 100644 --- a/malheur/src/main/java/de/kuschku/malheur/CrashHandler.kt +++ b/malheur/src/main/java/de/kuschku/malheur/CrashHandler.kt @@ -20,6 +20,8 @@ object CrashHandler { val reportCollector = ReportCollector(application) myHandler = Thread.UncaughtExceptionHandler { activeThread, throwable -> + val crashTime = Date() + val stackTraces = Thread.getAllStackTraces() Thread { try { val json = gson.toJson(reportCollector.collect(CrashContext( @@ -28,11 +30,13 @@ object CrashHandler { crashingThread = activeThread, throwable = throwable, startTime = startTime, - crashTime = Date(), - buildConfig = buildConfig + crashTime = crashTime, + buildConfig = buildConfig, + stackTraces = stackTraces ), config)) println(json) } catch (e: Throwable) { + e.printStackTrace() originalHandler?.uncaughtException(activeThread, throwable) } }.start() @@ -40,5 +44,9 @@ object CrashHandler { Thread.setDefaultUncaughtExceptionHandler(myHandler) } + fun handle(throwable: Throwable) { + myHandler?.uncaughtException(Thread.currentThread(), throwable) + } + var myHandler: Thread.UncaughtExceptionHandler? = null } diff --git a/malheur/src/main/java/de/kuschku/malheur/collectors/ConfigurationCollector.kt b/malheur/src/main/java/de/kuschku/malheur/collectors/ConfigurationCollector.kt index bb0bcfe4b2071a1982eb83c27006346807a838ef..2d880d830c977642a093a84420d61c82d564d6a6 100644 --- a/malheur/src/main/java/de/kuschku/malheur/collectors/ConfigurationCollector.kt +++ b/malheur/src/main/java/de/kuschku/malheur/collectors/ConfigurationCollector.kt @@ -11,12 +11,6 @@ class ConfigurationCollector(private val application: Application) : private val configValueInfo = mutableMapOf<String, SparseArray<String>>() private val configurationFields = listOf( - FieldDefinition( - fieldName = "mcc" - ), - FieldDefinition( - fieldName = "mnc" - ), FieldDefinition( fieldName = "screenHeightDp" ), diff --git a/malheur/src/main/java/de/kuschku/malheur/collectors/CrashCollector.kt b/malheur/src/main/java/de/kuschku/malheur/collectors/CrashCollector.kt index 99fc29c1c0afb142852c128d7587e17207b6103c..7174dc0194c7c9ce6a75e4e95c75336dd0db9241 100644 --- a/malheur/src/main/java/de/kuschku/malheur/collectors/CrashCollector.kt +++ b/malheur/src/main/java/de/kuschku/malheur/collectors/CrashCollector.kt @@ -1,35 +1,22 @@ package de.kuschku.malheur.collectors -import android.app.Application import de.kuschku.malheur.CrashContext import de.kuschku.malheur.config.CrashConfig import de.kuschku.malheur.data.CrashInfo import de.kuschku.malheur.data.ExceptionInfo -import de.kuschku.malheur.data.ThreadInfo -import de.kuschku.malheur.util.printStackTraceToString -import java.text.SimpleDateFormat -import java.util.* - -class CrashCollector(application: Application) : Collector<CrashInfo, CrashConfig> { - private val configurationCollector = ConfigurationCollector(application) - private val isoFormatter = SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss.SSSX", Locale.US) +import java.io.PrintWriter +import java.io.StringWriter +class CrashCollector : Collector<CrashInfo, CrashConfig> { override fun collect(context: CrashContext, config: CrashConfig) = CrashInfo( cause = collectIf(config.cause) { ExceptionInfo(context.throwable) }, exception = collectIf(config.exception) { - context.throwable.printStackTraceToString() - }, - activeThread = collectIf(config.activeThread) { - ThreadInfo(context.crashingThread) - }, - startTime = collectIf(config.startTime) { - isoFormatter.format(context.startTime) - }, - crashTime = collectIf(config.crashTime) { - isoFormatter.format(context.crashTime) - }, - configuration = configurationCollector.collectIf(context, config.configuration) + val result = StringWriter() + val printWriter = PrintWriter(result) + context.throwable.printStackTrace(printWriter) + result.toString() + } ) } diff --git a/malheur/src/main/java/de/kuschku/malheur/collectors/DeviceCollector.kt b/malheur/src/main/java/de/kuschku/malheur/collectors/DeviceCollector.kt index 2768e1a065d9c7090574eb61a57162cc73d59551..fa2d2fd584b2133d259829425e316d8fc003a3ac 100644 --- a/malheur/src/main/java/de/kuschku/malheur/collectors/DeviceCollector.kt +++ b/malheur/src/main/java/de/kuschku/malheur/collectors/DeviceCollector.kt @@ -7,23 +7,38 @@ import android.provider.Settings import de.kuschku.malheur.CrashContext import de.kuschku.malheur.config.DeviceConfig import de.kuschku.malheur.data.DeviceInfo -import de.kuschku.malheur.util.readProcInfo import de.kuschku.malheur.util.reflectionCollectConstants +import java.io.File class DeviceCollector(private val application: Application) : Collector<DeviceInfo, DeviceConfig> { + private val displayCollector = DisplayCollector(application) + @SuppressLint("HardwareIds") - override fun collect(context: CrashContext, config: DeviceConfig) = DeviceInfo( - build = collectIf(config.build) { - reflectionCollectConstants(Build::class.java) - }, - version = collectIf(config.version) { - reflectionCollectConstants(Build.VERSION::class.java) - }, - installationId = collectIf(config.installationId) { - Settings.Secure.getString(application.contentResolver, Settings.Secure.ANDROID_ID) - }, - processor = collectIf(config.processor) { - readProcInfo() - } - ) + override fun collect(context: CrashContext, config: DeviceConfig): DeviceInfo { + return DeviceInfo( + build = collectIf(config.build) { + reflectionCollectConstants(Build::class.java) + }, + version = collectIf(config.version) { + reflectionCollectConstants(Build.VERSION::class.java) + }, + installationId = collectIf(config.installationId) { + Settings.Secure.getString(application.contentResolver, Settings.Secure.ANDROID_ID) + }, + processor = collectIf(config.processor) { + readProcInfo() + }, + display = displayCollector.collectIf(context, config.display) + ) + } + + private fun readProcInfo() = File("/proc/cpuinfo") + .bufferedReader(Charsets.UTF_8) + .lineSequence() + .map { line -> line.split(":") } + .filter { split -> split.size == 2 } + .map { (key, value) -> key.trim() to value.trim() } + .filter { (key, _) -> key == "Hardware" } + .map { (_, value) -> value } + .firstOrNull() } diff --git a/malheur/src/main/java/de/kuschku/malheur/collectors/DisplayCollector.kt b/malheur/src/main/java/de/kuschku/malheur/collectors/DisplayCollector.kt new file mode 100644 index 0000000000000000000000000000000000000000..c00c076102a930ba8be2e5798461cdb96cc23945 --- /dev/null +++ b/malheur/src/main/java/de/kuschku/malheur/collectors/DisplayCollector.kt @@ -0,0 +1,61 @@ +package de.kuschku.malheur.collectors + +import android.app.Application +import android.content.Context +import android.os.Build +import android.util.SparseArray +import android.view.Display +import android.view.WindowManager +import de.kuschku.malheur.CrashContext +import de.kuschku.malheur.data.DisplayInfo +import de.kuschku.malheur.data.MetricsInfo +import de.kuschku.malheur.util.getMetrics +import java.lang.reflect.Modifier + +class DisplayCollector(application: Application) : + Collector<DisplayInfo, Boolean> { + private val windowManager = application.getSystemService( + Context.WINDOW_SERVICE) as WindowManager + + @Suppress("DEPRECATION") + override fun collect(context: CrashContext, config: Boolean): DisplayInfo? { + val display = windowManager.defaultDisplay + val hdrCapabilities = if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N) { + val capabilitiesEnum = getHdrCapabilitiesEnum() + display.hdrCapabilities.supportedHdrTypes.map(capabilitiesEnum::get) + } else { + null + } + return DisplayInfo( + width = display.width, + height = display.height, + pixelFormat = display.pixelFormat, + refreshRate = display.refreshRate, + hdr = hdrCapabilities, + isWideGamut = if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) { + display.isWideColorGamut + } else { + null + }, + metrics = MetricsInfo(display.getMetrics()) + ) + } + + private fun getHdrCapabilitiesEnum(): SparseArray<String> { + val hdrCapabilityEnums = SparseArray<String>() + Display.HdrCapabilities::class.java.declaredFields.filter { + Modifier.isStatic(it.modifiers) + }.filter { + it.name.startsWith("HDR_TYPE_") + }.filter { + it.type == Int::class.java + }.forEach { + try { + val value = it.getInt(null) + hdrCapabilityEnums.put(value, it.name.substring("HDR_TYPE_".length)) + } catch (e: IllegalAccessException) { + } + } + return hdrCapabilityEnums + } +} diff --git a/malheur/src/main/java/de/kuschku/malheur/collectors/EnvCollector.kt b/malheur/src/main/java/de/kuschku/malheur/collectors/EnvCollector.kt index fb5ca1e8aa16bc1ab111fee0cc3b1244aa5175f9..5cb6e7d952f1cbcf4ec3526a48664f74893632ea 100644 --- a/malheur/src/main/java/de/kuschku/malheur/collectors/EnvCollector.kt +++ b/malheur/src/main/java/de/kuschku/malheur/collectors/EnvCollector.kt @@ -5,13 +5,16 @@ import android.os.Debug import android.os.Environment import de.kuschku.malheur.CrashContext import de.kuschku.malheur.config.EnvConfig +import de.kuschku.malheur.data.EnvInfo import de.kuschku.malheur.data.MemoryInfo import de.kuschku.malheur.util.reflectionCollectGetters import java.io.File -class EnvCollector(application: Application) : Collector<Map<String, Any?>, EnvConfig> { - override fun collect(context: CrashContext, config: EnvConfig) = mapOf( - "paths" to collectIf(config.paths) { +class EnvCollector(application: Application) : Collector<EnvInfo, EnvConfig> { + private val configurationCollector = ConfigurationCollector(application) + + override fun collect(context: CrashContext, config: EnvConfig) = EnvInfo( + paths = collectIf(config.paths) { reflectionCollectGetters( Environment::class.java)?.map { (key, value) -> key to if (value is File) { @@ -21,10 +24,17 @@ class EnvCollector(application: Application) : Collector<Map<String, Any?>, EnvC } }?.toMap() }, - "memory" to collectIf(config.memory) { + memory = collectIf(config.memory) { val memoryInfo = Debug.MemoryInfo() Debug.getMemoryInfo(memoryInfo) MemoryInfo(memoryInfo) + }, + configuration = configurationCollector.collectIf(context, config.configuration), + startTime = collectIf(config.startTime) { + context.startTime.time + }, + crashTime = collectIf(config.crashTime) { + context.crashTime.time } ) } diff --git a/malheur/src/main/java/de/kuschku/malheur/collectors/LogCollector.kt b/malheur/src/main/java/de/kuschku/malheur/collectors/LogCollector.kt index a8d1733135115bef8165acb9b402570401546b5d..8ea759ca2c4d577cd51f51d6648a37baf0b91a61 100644 --- a/malheur/src/main/java/de/kuschku/malheur/collectors/LogCollector.kt +++ b/malheur/src/main/java/de/kuschku/malheur/collectors/LogCollector.kt @@ -1,21 +1,25 @@ package de.kuschku.malheur.collectors -import android.app.Application -import android.os.Process import de.kuschku.malheur.CrashContext import de.kuschku.malheur.config.LogConfig -import de.kuschku.malheur.util.readLogCat import java.text.SimpleDateFormat import java.util.* -class LogCollector(application: Application) : Collector<Map<String, List<String>>, LogConfig> { +class LogCollector : Collector<Map<String, List<String>>, LogConfig> { private val logcatTimeFormatter = SimpleDateFormat("MM-dd HH:mm:ss.SSS", Locale.US) - private val pid = Process.myPid().toString() override fun collect(context: CrashContext, config: LogConfig): Map<String, List<String>> { val since = logcatTimeFormatter.format(context.startTime) return config.buffers.map { buffer -> - buffer to readLogCat(since, buffer, pid) + buffer to readLogCat(since, buffer) }.toMap() } + + private fun readLogCat(since: String, buffer: String) = ProcessBuilder() + .command("logcat", "-t", since, "-b", buffer) + .redirectErrorStream(true) + .start() + .inputStream + .bufferedReader(Charsets.UTF_8) + .readLines() } diff --git a/malheur/src/main/java/de/kuschku/malheur/collectors/ReportCollector.kt b/malheur/src/main/java/de/kuschku/malheur/collectors/ReportCollector.kt index ebe95f841240d2fbc125c7a97ba3e8a7a570ccfe..7c0eb23e6e9908d3b2347504454b316b85883028 100644 --- a/malheur/src/main/java/de/kuschku/malheur/collectors/ReportCollector.kt +++ b/malheur/src/main/java/de/kuschku/malheur/collectors/ReportCollector.kt @@ -4,24 +4,18 @@ import android.app.Application import de.kuschku.malheur.CrashContext import de.kuschku.malheur.config.ReportConfig import de.kuschku.malheur.data.Report -import de.kuschku.malheur.data.ThreadInfo class ReportCollector(application: Application) : Collector<Report, ReportConfig> { - private val logcatCollector = LogCollector(application) - private val crashCollector = CrashCollector(application) + private val crashCollector = CrashCollector() + private val threadCollector = ThreadCollector() + private val logcatCollector = LogCollector() private val applicationCollector = AppCollector(application) private val deviceCollector = DeviceCollector(application) private val environmentCollector = EnvCollector(application) override fun collect(context: CrashContext, config: ReportConfig) = Report( crash = crashCollector.collectIf(context, config.crash), - threads = collectIf(config.threads) { - Thread.getAllStackTraces() - .filterKeys { it != Thread.currentThread() } - .map { (thread, stackTrace) -> - ThreadInfo(thread, stackTrace) - } - }, + threads = threadCollector.collectIf(context, config.threads), logcat = logcatCollector.collectIf(context, config.logcat), application = applicationCollector.collectIf(context, config.application), device = deviceCollector.collectIf(context, config.device), diff --git a/malheur/src/main/java/de/kuschku/malheur/collectors/ThreadCollector.kt b/malheur/src/main/java/de/kuschku/malheur/collectors/ThreadCollector.kt new file mode 100644 index 0000000000000000000000000000000000000000..e8d374e93a00d18a201f0c9510201c970fea60d4 --- /dev/null +++ b/malheur/src/main/java/de/kuschku/malheur/collectors/ThreadCollector.kt @@ -0,0 +1,59 @@ +package de.kuschku.malheur.collectors + +import de.kuschku.malheur.CrashContext +import de.kuschku.malheur.CrashHandler +import de.kuschku.malheur.config.ThreadConfig +import de.kuschku.malheur.data.ThreadInfo +import de.kuschku.malheur.data.ThreadsInfo +import de.kuschku.malheur.data.TraceElement + +class ThreadCollector : Collector<ThreadsInfo, ThreadConfig> { + override fun collect(context: CrashContext, config: ThreadConfig) = ThreadsInfo( + crashed = context.stackTraces?.filterKeys { + it == context.crashingThread + }?.map { (thread, stackTrace) -> + threadToInfo(thread, stackTrace) + }?.firstOrNull(), + others = context.stackTraces?.filterKeys { + it != Thread.currentThread() && it != context.crashingThread + }?.map { (thread, stackTrace) -> + threadToInfo(thread, stackTrace) + } + ) + + private fun threadToInfo(thread: Thread, stackTrace: Array<StackTraceElement>) = ThreadInfo( + id = thread.id, + name = thread.name, + group = thread.threadGroup?.name, + status = thread.state?.name, + stackTrace = ArrayList(sanitize(stackTrace.map(::TraceElement))), + isDaemon = thread.isDaemon, + priority = thread.priority + ) + + private fun sanitize(list: List<TraceElement>): List<TraceElement> { + var idx = 0 + while (idx < list.size) { + val traceElement = list[idx] + if (traceElement.className == CrashHandler::class.java.canonicalName) + break + idx++ + } + while (idx < list.size) { + val traceElement = list[idx] + if (traceElement.className != CrashHandler::class.java.canonicalName) + break + idx++ + } + val after = mutableListOf<TraceElement>() + while (idx < list.size) { + val traceElement = list[idx] + after.add(traceElement) + idx++ + } + + return if (after.size > 0) { + after + } else list + } +} diff --git a/malheur/src/main/java/de/kuschku/malheur/config/CrashConfig.kt b/malheur/src/main/java/de/kuschku/malheur/config/CrashConfig.kt index 05728d5becab5f951c12cd2403b54fb660714cb9..e0fff52261251a769117d4b91021fd2e5df345af 100644 --- a/malheur/src/main/java/de/kuschku/malheur/config/CrashConfig.kt +++ b/malheur/src/main/java/de/kuschku/malheur/config/CrashConfig.kt @@ -2,9 +2,5 @@ package de.kuschku.malheur.config data class CrashConfig( val cause: Boolean = true, - val exception: Boolean = true, - val activeThread: Boolean = true, - val startTime: Boolean = true, - val crashTime: Boolean = true, - val configuration: Boolean = true + val exception: Boolean = true ) diff --git a/malheur/src/main/java/de/kuschku/malheur/config/DeviceConfig.kt b/malheur/src/main/java/de/kuschku/malheur/config/DeviceConfig.kt index ca332a7733ac53d9c7c6a88869eb065dbfde1dc2..337e4f3a9d415546aba6ee6d128900d85ef19501 100644 --- a/malheur/src/main/java/de/kuschku/malheur/config/DeviceConfig.kt +++ b/malheur/src/main/java/de/kuschku/malheur/config/DeviceConfig.kt @@ -5,5 +5,6 @@ data class DeviceConfig( val version: Boolean = true, val installationId: Boolean = true, val processor: Boolean = true, - val runtime: Boolean = true + val runtime: Boolean = true, + val display: Boolean = true ) diff --git a/malheur/src/main/java/de/kuschku/malheur/config/EnvConfig.kt b/malheur/src/main/java/de/kuschku/malheur/config/EnvConfig.kt index 29c5fbbfae95173d62ad34d864d780a43b0559e3..aedd636e4e83f3e77a98e2cff49d271285c8f126 100644 --- a/malheur/src/main/java/de/kuschku/malheur/config/EnvConfig.kt +++ b/malheur/src/main/java/de/kuschku/malheur/config/EnvConfig.kt @@ -2,5 +2,8 @@ package de.kuschku.malheur.config data class EnvConfig( val paths: Boolean = true, - val memory: Boolean = true + val memory: Boolean = true, + val configuration: Boolean = true, + val startTime: Boolean = true, + val crashTime: Boolean = true ) diff --git a/malheur/src/main/java/de/kuschku/malheur/config/ReportConfig.kt b/malheur/src/main/java/de/kuschku/malheur/config/ReportConfig.kt index 4ee6eedec3556a4b4a975aa0f47b7a56f9776093..9c3ae20ef9a9aacf57c2a055fae406d7126944b8 100644 --- a/malheur/src/main/java/de/kuschku/malheur/config/ReportConfig.kt +++ b/malheur/src/main/java/de/kuschku/malheur/config/ReportConfig.kt @@ -2,7 +2,7 @@ package de.kuschku.malheur.config data class ReportConfig( val crash: CrashConfig? = CrashConfig(), - val threads: Boolean = true, + val threads: ThreadConfig? = ThreadConfig(), val logcat: LogConfig? = LogConfig(), val application: AppConfig? = AppConfig(), val device: DeviceConfig? = DeviceConfig(), diff --git a/malheur/src/main/java/de/kuschku/malheur/config/ThreadConfig.kt b/malheur/src/main/java/de/kuschku/malheur/config/ThreadConfig.kt new file mode 100644 index 0000000000000000000000000000000000000000..3a680c183fffd9701d46f1f4cadb3a51ca57ce3f --- /dev/null +++ b/malheur/src/main/java/de/kuschku/malheur/config/ThreadConfig.kt @@ -0,0 +1,6 @@ +package de.kuschku.malheur.config + +data class ThreadConfig( + val current: Boolean = true, + val others: Boolean = true +) diff --git a/malheur/src/main/java/de/kuschku/malheur/data/CrashInfo.kt b/malheur/src/main/java/de/kuschku/malheur/data/CrashInfo.kt index 609624d65cc393b259a061c40fe73e36e2056f06..6be355b19c585d8af2830f879ac0cd1b23087904 100644 --- a/malheur/src/main/java/de/kuschku/malheur/data/CrashInfo.kt +++ b/malheur/src/main/java/de/kuschku/malheur/data/CrashInfo.kt @@ -2,9 +2,5 @@ package de.kuschku.malheur.data data class CrashInfo( val cause: ExceptionInfo?, - val exception: String?, - val activeThread: ThreadInfo?, - val startTime: String?, - val crashTime: String?, - val configuration: Map<String, Any?>? + val exception: String? ) diff --git a/malheur/src/main/java/de/kuschku/malheur/data/DeviceInfo.kt b/malheur/src/main/java/de/kuschku/malheur/data/DeviceInfo.kt index bd9a07ac51640f2ec1be6413144d0e452782d877..661c9fbd0c39b3a686a5f53fec359b53b6de3399 100644 --- a/malheur/src/main/java/de/kuschku/malheur/data/DeviceInfo.kt +++ b/malheur/src/main/java/de/kuschku/malheur/data/DeviceInfo.kt @@ -4,5 +4,6 @@ data class DeviceInfo( val build: Map<String, Any?>?, val version: Map<String, Any?>?, val installationId: String?, - val processor: String? + val processor: String?, + val display: DisplayInfo? ) diff --git a/malheur/src/main/java/de/kuschku/malheur/data/DisplayInfo.kt b/malheur/src/main/java/de/kuschku/malheur/data/DisplayInfo.kt index 38e1b7a2dd6bf89b36cd85cf834725f5ed8a3b97..a90e716f39b04d5fa5c45be7e63c902eb2801829 100644 --- a/malheur/src/main/java/de/kuschku/malheur/data/DisplayInfo.kt +++ b/malheur/src/main/java/de/kuschku/malheur/data/DisplayInfo.kt @@ -1,24 +1,11 @@ package de.kuschku.malheur.data -import android.view.Display -import de.kuschku.malheur.util.getMetrics - data class DisplayInfo( val width: Int, val height: Int, val pixelFormat: Int, val refreshRate: Float, - val isHdr: Boolean, - val isWideGamut: Boolean, + val hdr: List<String>?, + val isWideGamut: Boolean?, val metrics: MetricsInfo -) { - constructor(display: Display) : this( - width = display.width, - height = display.height, - pixelFormat = display.pixelFormat, - refreshRate = display.refreshRate, - isHdr = display.isHdr, - isWideGamut = display.isWideColorGamut, - metrics = MetricsInfo(display.getMetrics()) - ) -} +) diff --git a/malheur/src/main/java/de/kuschku/malheur/data/EnvInfo.kt b/malheur/src/main/java/de/kuschku/malheur/data/EnvInfo.kt new file mode 100644 index 0000000000000000000000000000000000000000..c18f4887681ddfa4243a54dcd028005980831611 --- /dev/null +++ b/malheur/src/main/java/de/kuschku/malheur/data/EnvInfo.kt @@ -0,0 +1,9 @@ +package de.kuschku.malheur.data + +data class EnvInfo( + val paths: Map<String, Any?>?, + val memory: MemoryInfo?, + val configuration: Map<String, Any?>?, + val startTime: Long?, + val crashTime: Long? +) diff --git a/malheur/src/main/java/de/kuschku/malheur/data/Report.kt b/malheur/src/main/java/de/kuschku/malheur/data/Report.kt index d0dfbb9dd2faa2b234d063f56f961f3f89d2f195..8cb399f449c99a4005cd1bbe472c668bca48a394 100644 --- a/malheur/src/main/java/de/kuschku/malheur/data/Report.kt +++ b/malheur/src/main/java/de/kuschku/malheur/data/Report.kt @@ -2,9 +2,9 @@ package de.kuschku.malheur.data data class Report( val crash: CrashInfo?, - val threads: List<ThreadInfo>?, + val threads: ThreadsInfo?, val logcat: Map<String, List<String>?>?, val application: AppInfo?, val device: DeviceInfo?, - val environment: Map<String, Any?>? + val environment: EnvInfo? ) diff --git a/malheur/src/main/java/de/kuschku/malheur/data/ThreadInfo.kt b/malheur/src/main/java/de/kuschku/malheur/data/ThreadInfo.kt index e80b4fc7679504e0f2bb369353a001281783b849..6503d9b544425e0303144bfe608a9b10c18e71c7 100644 --- a/malheur/src/main/java/de/kuschku/malheur/data/ThreadInfo.kt +++ b/malheur/src/main/java/de/kuschku/malheur/data/ThreadInfo.kt @@ -8,14 +8,4 @@ data class ThreadInfo( val stackTrace: List<TraceElement>?, val isDaemon: Boolean?, val priority: Int? -) { - constructor(thread: Thread, stackTrace: Array<StackTraceElement> = thread.stackTrace) : this( - id = thread.id, - name = thread.name, - group = thread.threadGroup?.name, - status = thread.state?.name, - stackTrace = ArrayList(stackTrace.map(::TraceElement)), - isDaemon = thread.isDaemon, - priority = thread.priority - ) -} +) diff --git a/malheur/src/main/java/de/kuschku/malheur/data/ThreadsInfo.kt b/malheur/src/main/java/de/kuschku/malheur/data/ThreadsInfo.kt new file mode 100644 index 0000000000000000000000000000000000000000..10d94c6e0a560b90624c683f7a58a395be5af36d --- /dev/null +++ b/malheur/src/main/java/de/kuschku/malheur/data/ThreadsInfo.kt @@ -0,0 +1,6 @@ +package de.kuschku.malheur.data + +data class ThreadsInfo( + val crashed: ThreadInfo?, + val others: List<ThreadInfo>? +) diff --git a/malheur/src/main/java/de/kuschku/malheur/util/LogCatHelper.kt b/malheur/src/main/java/de/kuschku/malheur/util/LogCatHelper.kt deleted file mode 100644 index 8837570c4484812382a6a60bac7f5771562e3d71..0000000000000000000000000000000000000000 --- a/malheur/src/main/java/de/kuschku/malheur/util/LogCatHelper.kt +++ /dev/null @@ -1,9 +0,0 @@ -package de.kuschku.malheur.util - -fun readLogCat(since: String, buffer: String, pid: String) = ProcessBuilder() - .command("logcat", "-t", since, "-b", buffer, "--pid", pid) - .redirectErrorStream(true) - .start() - .inputStream - .bufferedReader(Charsets.UTF_8) - .readLines() diff --git a/malheur/src/main/java/de/kuschku/malheur/util/ProcInfohelper.kt b/malheur/src/main/java/de/kuschku/malheur/util/ProcInfohelper.kt deleted file mode 100644 index 0940b565ae0615f650334684a8496cc60715238c..0000000000000000000000000000000000000000 --- a/malheur/src/main/java/de/kuschku/malheur/util/ProcInfohelper.kt +++ /dev/null @@ -1,13 +0,0 @@ -package de.kuschku.malheur.util - -import java.io.File - -fun readProcInfo() = File("/proc/cpuinfo") - .bufferedReader(Charsets.UTF_8) - .lineSequence() - .map { line -> line.split(":") } - .filter { split -> split.size == 2 } - .map { (key, value) -> key.trim() to value.trim() } - .filter { (key, _) -> key == "Hardware" } - .map { (_, value) -> value } - .firstOrNull() diff --git a/malheur/src/main/java/de/kuschku/malheur/util/ThrowableHelper.kt b/malheur/src/main/java/de/kuschku/malheur/util/ThrowableHelper.kt deleted file mode 100644 index c797860ed65155dc670e7c58143950732604de39..0000000000000000000000000000000000000000 --- a/malheur/src/main/java/de/kuschku/malheur/util/ThrowableHelper.kt +++ /dev/null @@ -1,11 +0,0 @@ -package de.kuschku.malheur.util - -import java.io.PrintWriter -import java.io.StringWriter - -fun Throwable.printStackTraceToString(): String? { - val result = StringWriter() - val printWriter = PrintWriter(result) - printStackTrace(printWriter) - return result.toString() -}