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(-) 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