summaryrefslogtreecommitdiffhomepage
diff options
context:
space:
mode:
authorJason A. Donenfeld <Jason@zx2c4.com>2020-09-16 15:20:32 +0200
committerJason A. Donenfeld <Jason@zx2c4.com>2020-09-16 18:01:06 +0200
commit44c2afbfba380fbdbd83f0edb85f77547506eb2c (patch)
tree93a51a56c951a1d1ae56f8a118f4629e540b500f
parentbd1679b7e0db627afe37f6b1e7c47997a348f3e8 (diff)
LogViewerActivity: destroy process when coroutine scope is cancelled
Signed-off-by: Jason A. Donenfeld <Jason@zx2c4.com>
-rw-r--r--ui/src/main/java/com/wireguard/android/activity/LogViewerActivity.kt79
1 files changed, 42 insertions, 37 deletions
diff --git a/ui/src/main/java/com/wireguard/android/activity/LogViewerActivity.kt b/ui/src/main/java/com/wireguard/android/activity/LogViewerActivity.kt
index 3408fc7b..7ef9222c 100644
--- a/ui/src/main/java/com/wireguard/android/activity/LogViewerActivity.kt
+++ b/ui/src/main/java/com/wireguard/android/activity/LogViewerActivity.kt
@@ -193,49 +193,54 @@ class LogViewerActivity : AppCompatActivity() {
private suspend fun streamingLog() = withContext(Dispatchers.IO) {
val builder = ProcessBuilder().command("logcat", "-b", "all", "-v", "threadtime", "*:V")
builder.environment()["LC_ALL"] = "C"
- val process = try {
- builder.start()
- } catch (e: IOException) {
- e.printStackTrace()
- return@withContext
- }
- val stdout = BufferedReader(InputStreamReader(process!!.inputStream, StandardCharsets.UTF_8))
- var haveScrolled = false
- val start = System.nanoTime()
- var startPeriod = start
- while (true) {
- val line = stdout.readLine() ?: break
- rawLogLines.append(line)
- rawLogLines.append('\n')
- val logLine = parseLine(line)
- withContext(Dispatchers.Main.immediate) {
- if (logLine != null) {
- recyclerView?.let {
- val shouldScroll = haveScrolled && !it.canScrollVertically(1)
- logLines.add(logLine)
- if (haveScrolled) logAdapter.notifyDataSetChanged()
- if (shouldScroll)
- it.scrollToPosition(logLines.size - 1)
- }
- } else {
- /* I'd prefer for the next line to be:
+ var process: Process? = null
+ try {
+ process = try {
+ builder.start()
+ } catch (e: IOException) {
+ e.printStackTrace()
+ return@withContext
+ }
+ val stdout = BufferedReader(InputStreamReader(process!!.inputStream, StandardCharsets.UTF_8))
+ var haveScrolled = false
+ val start = System.nanoTime()
+ var startPeriod = start
+ while (true) {
+ val line = stdout.readLine() ?: break
+ rawLogLines.append(line)
+ rawLogLines.append('\n')
+ val logLine = parseLine(line)
+ withContext(Dispatchers.Main.immediate) {
+ if (logLine != null) {
+ recyclerView?.let {
+ val shouldScroll = haveScrolled && !it.canScrollVertically(1)
+ logLines.add(logLine)
+ if (haveScrolled) logAdapter.notifyDataSetChanged()
+ if (shouldScroll)
+ it.scrollToPosition(logLines.size - 1)
+ }
+ } else {
+ /* I'd prefer for the next line to be:
* logLines.lastOrNull()?.msg += "\n$line"
* However, as of writing, that causes the kotlin compiler to freak out and crash, spewing bytecode.
*/
- logLines.lastOrNull()?.apply { msg += "\n$line" }
- if (haveScrolled) logAdapter.notifyDataSetChanged()
- }
- if (!haveScrolled) {
- val end = System.nanoTime()
- val scroll = (end - start) > 1000000000L * 2.5 || !stdout.ready()
- if (logLines.isNotEmpty() && (scroll || (end - startPeriod) > 1000000000L / 4)) {
- logAdapter.notifyDataSetChanged()
- recyclerView?.scrollToPosition(logLines.size - 1)
- startPeriod = end
+ logLines.lastOrNull()?.apply { msg += "\n$line" }
+ if (haveScrolled) logAdapter.notifyDataSetChanged()
+ }
+ if (!haveScrolled) {
+ val end = System.nanoTime()
+ val scroll = (end - start) > 1000000000L * 2.5 || !stdout.ready()
+ if (logLines.isNotEmpty() && (scroll || (end - startPeriod) > 1000000000L / 4)) {
+ logAdapter.notifyDataSetChanged()
+ recyclerView?.scrollToPosition(logLines.size - 1)
+ startPeriod = end
+ }
+ if (scroll) haveScrolled = true
}
- if (scroll) haveScrolled = true
}
}
+ } finally {
+ process?.destroy()
}
}