From 1f30a8838d787f31dbc0af83458d73afef104927 Mon Sep 17 00:00:00 2001
From: pacien
Date: Sun, 4 Mar 2018 19:24:28 +0100
Subject: Refactor log viewer, enhance scrolling
---
.../pacien/tincapp/activities/ViewLogActivity.kt | 44 +++++++++++++++-------
app/src/main/res/layout/page_viewlog.xml | 27 +++++++------
2 files changed, 47 insertions(+), 24 deletions(-)
(limited to 'app')
diff --git a/app/src/main/java/org/pacien/tincapp/activities/ViewLogActivity.kt b/app/src/main/java/org/pacien/tincapp/activities/ViewLogActivity.kt
index ebdd22a..673dedb 100644
--- a/app/src/main/java/org/pacien/tincapp/activities/ViewLogActivity.kt
+++ b/app/src/main/java/org/pacien/tincapp/activities/ViewLogActivity.kt
@@ -1,9 +1,10 @@
package org.pacien.tincapp.activities
import android.os.Bundle
-import android.text.method.ScrollingMovementMethod
import android.view.Menu
import android.view.MenuItem
+import android.view.View
+import android.widget.ScrollView
import kotlinx.android.synthetic.main.base.*
import kotlinx.android.synthetic.main.page_viewlog.*
import org.pacien.tincapp.R
@@ -20,7 +21,7 @@ class ViewLogActivity : BaseActivity() {
companion object {
private const val LOG_LINES = 250
private const val LOG_LEVEL = 5
- private const val NEW_LINE = "\n"
+ private const val NEW_LINE = "\n\n"
private const val UPDATE_INTERVAL = 250L // ms
}
@@ -53,37 +54,35 @@ class ViewLogActivity : BaseActivity() {
fun toggleLogging(menuItem: MenuItem) {
if (logger == null) {
startLogging()
- text_log.movementMethod = null
- text_log.setTextIsSelectable(false)
menuItem.setIcon(R.drawable.ic_pause_circle_outline_primary_24dp)
} else {
stopLogging()
- text_log.movementMethod = ScrollingMovementMethod.getInstance()
- text_log.setTextIsSelectable(true)
menuItem.setIcon(R.drawable.ic_pause_circle_filled_primary_24dp)
}
}
private fun startLogging(level: Int = LOG_LEVEL) {
+ disableUserScroll()
appendLog(resources.getString(R.string.message_log_level_set, level))
Tinc.log(TincVpnService.getCurrentNetName()!!, level).let { process ->
logger = process
- Executor.runAsyncTask { printLog(process) }
+ Executor.runAsyncTask { captureLog(process) }
}
- logUpdateTimer = timer(period = UPDATE_INTERVAL, action = { updateLog() })
+ logUpdateTimer = timer(period = UPDATE_INTERVAL, action = { printLog() })
}
private fun stopLogging() {
+ enableUserScroll()
logger?.destroy()
logger = null
logUpdateTimer?.cancel()
logUpdateTimer?.purge()
logUpdateTimer = null
appendLog(resources.getString(R.string.message_log_paused))
- updateLog()
+ printLog()
}
- private fun printLog(logger: Process) {
+ private fun captureLog(logger: Process) {
logger.inputStream?.use { inputStream ->
inputStream.bufferedReader().useLines { lines ->
lines.forEach { appendLog(it) }
@@ -96,9 +95,28 @@ class ViewLogActivity : BaseActivity() {
log.addLast(line)
}
- private fun updateLog() = synchronized(this) {
- log.joinToString(NEW_LINE + NEW_LINE, NEW_LINE, NEW_LINE).let {
- text_log.post { text_log.text = it }
+ private fun printLog() = synchronized(this) {
+ log.joinToString(NEW_LINE).let {
+ logview_text.post {
+ logview_text.text = it
+ logview_frame.post { logview_frame.fullScroll(View.FOCUS_DOWN) }
+ }
}
}
+
+ private fun enableUserScroll() {
+ logview_text.setTextIsSelectable(true)
+ logview_frame.setState(true)
+ }
+
+ private fun disableUserScroll() {
+ logview_text.setTextIsSelectable(false)
+ logview_frame.setState(false)
+ }
+
+ private fun ScrollView.setState(enabled: Boolean) {
+ if (enabled) setOnTouchListener(null) else setOnTouchListener { _, _ -> true }
+ logview_frame.isSmoothScrollingEnabled = enabled
+ logview_frame.isVerticalScrollBarEnabled = enabled
+ }
}
diff --git a/app/src/main/res/layout/page_viewlog.xml b/app/src/main/res/layout/page_viewlog.xml
index a7afed8..0795554 100644
--- a/app/src/main/res/layout/page_viewlog.xml
+++ b/app/src/main/res/layout/page_viewlog.xml
@@ -1,13 +1,18 @@
-
+ android:layout_height="match_parent">
+
+
+
--
cgit v1.2.3