From 4a1d6b9629b12a90b7e8bc1634221d2302fed64f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Florian=20M=C3=A4rkl?= Date: Sun, 13 Oct 2019 16:59:03 +0200 Subject: [PATCH] Android Regist Execute UI --- .../java/com/metallic/chiaki/lib/Chiaki.kt | 19 +++++- .../com/metallic/chiaki/regist/ChiakiRxLog.kt | 40 +++++++++++++ .../chiaki/regist/RegistExecuteActivity.kt | 15 ++++- .../chiaki/regist/RegistExecuteViewModel.kt | 7 ++- .../app/src/main/res/drawable/ic_share.xml | 9 +++ .../res/layout/activity_regist_execute.xml | 58 ++++++++++++++++++- android/app/src/main/res/values/strings.xml | 1 + android/app/src/main/res/values/styles.xml | 1 + 8 files changed, 144 insertions(+), 6 deletions(-) create mode 100644 android/app/src/main/java/com/metallic/chiaki/regist/ChiakiRxLog.kt create mode 100644 android/app/src/main/res/drawable/ic_share.xml diff --git a/android/app/src/main/java/com/metallic/chiaki/lib/Chiaki.kt b/android/app/src/main/java/com/metallic/chiaki/lib/Chiaki.kt index c6ef9c4..5579fbc 100644 --- a/android/app/src/main/java/com/metallic/chiaki/lib/Chiaki.kt +++ b/android/app/src/main/java/com/metallic/chiaki/lib/Chiaki.kt @@ -58,8 +58,23 @@ class ErrorCode(val value: Int) var isSuccess = value == 0 } -class ChiakiLog(val levelMask: Int) +class ChiakiLog(val levelMask: Int, val callback: (level: Int, text: String) -> Unit) { + companion object + { + fun formatLog(level: Int, text: String) = + "[${when(level) + { + Level.DEBUG.value -> "D" + Level.VERBOSE.value -> "V" + Level.INFO.value -> "I" + Level.WARNING.value -> "W" + Level.ERROR.value -> "E" + else -> "?" + } + }] $text" + } + enum class Level(val value: Int) { DEBUG(1 shl 4), @@ -72,7 +87,7 @@ class ChiakiLog(val levelMask: Int) private fun log(level: Int, text: String) { - Log.i("ChiakiJavaLog", "level $level, text $text") + callback(level, text) } } diff --git a/android/app/src/main/java/com/metallic/chiaki/regist/ChiakiRxLog.kt b/android/app/src/main/java/com/metallic/chiaki/regist/ChiakiRxLog.kt new file mode 100644 index 0000000..362cce4 --- /dev/null +++ b/android/app/src/main/java/com/metallic/chiaki/regist/ChiakiRxLog.kt @@ -0,0 +1,40 @@ +/* + * This file is part of Chiaki. + * + * Chiaki is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * Chiaki is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with Chiaki. If not, see . + */ + +package com.metallic.chiaki.regist + +import com.metallic.chiaki.lib.ChiakiLog +import io.reactivex.Observable +import io.reactivex.subjects.BehaviorSubject +import java.util.concurrent.locks.ReentrantLock +import kotlin.concurrent.withLock + +class ChiakiRxLog(levelMask: Int) +{ + private val accSubject: BehaviorSubject = BehaviorSubject.create().also { + it.onNext("") + } + private val accMutex = ReentrantLock() + val logText: Observable get() = accSubject + + val log = ChiakiLog(levelMask, callback = { level, text -> + accMutex.withLock { + val cur = accSubject.value ?: "" + accSubject.onNext(cur + (if(cur.isEmpty()) "" else "\n") + text) + } + }) +} \ No newline at end of file diff --git a/android/app/src/main/java/com/metallic/chiaki/regist/RegistExecuteActivity.kt b/android/app/src/main/java/com/metallic/chiaki/regist/RegistExecuteActivity.kt index 058e973..b03ca3e 100644 --- a/android/app/src/main/java/com/metallic/chiaki/regist/RegistExecuteActivity.kt +++ b/android/app/src/main/java/com/metallic/chiaki/regist/RegistExecuteActivity.kt @@ -18,10 +18,15 @@ package com.metallic.chiaki.regist import android.os.Bundle +import android.text.method.ScrollingMovementMethod +import android.util.Log import androidx.appcompat.app.AppCompatActivity +import androidx.lifecycle.Observer import androidx.lifecycle.ViewModelProviders import com.metallic.chiaki.R import com.metallic.chiaki.lib.RegistInfo +import kotlinx.android.synthetic.main.activity_regist_execute.* +import kotlin.math.max class RegistExecuteActivity: AppCompatActivity() { @@ -42,9 +47,17 @@ class RegistExecuteActivity: AppCompatActivity() viewModel = ViewModelProviders.of(this).get(RegistExecuteViewModel::class.java) + logTextView.setHorizontallyScrolling(true) + logTextView.movementMethod = ScrollingMovementMethod() + viewModel.logText.observe(this, Observer { + logTextView.text = it + val scrollY = logTextView.layout.getLineBottom(logTextView.lineCount - 1) - logTextView.height + logTextView.paddingTop + logTextView.paddingBottom + logTextView.scrollTo(0, max(scrollY, 0)) + }) + val registInfo = RegistInfo( intent.getStringExtra(EXTRA_HOST) ?: return, - intent.getBooleanExtra(EXTRA_BROADCAST, false) ?: return, + intent.getBooleanExtra(EXTRA_BROADCAST, false), intent.getStringExtra(EXTRA_PSN_ID) ?: return, intent.getIntExtra(EXTRA_PIN, 0).toUInt() ) diff --git a/android/app/src/main/java/com/metallic/chiaki/regist/RegistExecuteViewModel.kt b/android/app/src/main/java/com/metallic/chiaki/regist/RegistExecuteViewModel.kt index 1a536ff..2a049af 100644 --- a/android/app/src/main/java/com/metallic/chiaki/regist/RegistExecuteViewModel.kt +++ b/android/app/src/main/java/com/metallic/chiaki/regist/RegistExecuteViewModel.kt @@ -20,6 +20,7 @@ package com.metallic.chiaki.regist import androidx.lifecycle.LiveData import androidx.lifecycle.MutableLiveData import androidx.lifecycle.ViewModel +import com.metallic.chiaki.common.ext.toLiveData import com.metallic.chiaki.lib.* class RegistExecuteViewModel: ViewModel() @@ -36,16 +37,18 @@ class RegistExecuteViewModel: ViewModel() private val _state = MutableLiveData(State.IDLE) val state: LiveData get() = _state - private val log = ChiakiLog(ChiakiLog.Level.ALL.value/* and ChiakiLog.Level.VERBOSE.value.inv()*/) + private val log = ChiakiRxLog(ChiakiLog.Level.ALL.value/* and ChiakiLog.Level.VERBOSE.value.inv()*/) private var regist: Regist? = null + val logText: LiveData = log.logText.toLiveData() + fun start(info: RegistInfo) { if(regist != null) return try { - regist = Regist(info, log, this::registEvent) + regist = Regist(info, log.log, this::registEvent) _state.value = State.RUNNING } catch(error: CreateError) diff --git a/android/app/src/main/res/drawable/ic_share.xml b/android/app/src/main/res/drawable/ic_share.xml new file mode 100644 index 0000000..e3fe874 --- /dev/null +++ b/android/app/src/main/res/drawable/ic_share.xml @@ -0,0 +1,9 @@ + + + diff --git a/android/app/src/main/res/layout/activity_regist_execute.xml b/android/app/src/main/res/layout/activity_regist_execute.xml index 2ab963a..235b0a9 100644 --- a/android/app/src/main/res/layout/activity_regist_execute.xml +++ b/android/app/src/main/res/layout/activity_regist_execute.xml @@ -1,10 +1,66 @@ + android:layout_height="match_parent" + android:padding="8dp"> + + + + + + + + \ No newline at end of file diff --git a/android/app/src/main/res/values/strings.xml b/android/app/src/main/res/values/strings.xml index c9e2df3..bd3337d 100644 --- a/android/app/src/main/res/values/strings.xml +++ b/android/app/src/main/res/values/strings.xml @@ -26,4 +26,5 @@ Please enter a valid host name Please enter a valid PSN ID Please enter a valid %d-digit PIN + Share Log diff --git a/android/app/src/main/res/values/styles.xml b/android/app/src/main/res/values/styles.xml index 5ade4e0..eea547b 100644 --- a/android/app/src/main/res/values/styles.xml +++ b/android/app/src/main/res/values/styles.xml @@ -69,6 +69,7 @@ ?attr/colorOnSecondary ?attr/colorSecondary ?attr/colorOnSecondary + ?attr/colorOnSecondary