From f12ed7ef2dd752ed596df88d6ea009aaade15311 Mon Sep 17 00:00:00 2001 From: Gaurav Ujjwal Date: Thu, 8 Apr 2021 21:26:51 +0530 Subject: [PATCH] Added ability to view logs --- .../com/gaurav/avnc/ui/prefs/InfoFragment.kt | 97 +++++++++++++++++++ .../java/com/gaurav/avnc/util/Debugging.kt | 62 ++++++++++++ app/src/main/res/drawable/ic_bug.xml | 9 ++ app/src/main/res/layout/fragment_info.xml | 30 ++++++ app/src/main/res/values/strings.xml | 6 +- app/src/main/res/xml/pref_tools.xml | 13 ++- 6 files changed, 215 insertions(+), 2 deletions(-) create mode 100644 app/src/main/java/com/gaurav/avnc/ui/prefs/InfoFragment.kt create mode 100644 app/src/main/java/com/gaurav/avnc/util/Debugging.kt create mode 100644 app/src/main/res/drawable/ic_bug.xml create mode 100644 app/src/main/res/layout/fragment_info.xml diff --git a/app/src/main/java/com/gaurav/avnc/ui/prefs/InfoFragment.kt b/app/src/main/java/com/gaurav/avnc/ui/prefs/InfoFragment.kt new file mode 100644 index 0000000..7386605 --- /dev/null +++ b/app/src/main/java/com/gaurav/avnc/ui/prefs/InfoFragment.kt @@ -0,0 +1,97 @@ +/* + * Copyright (c) 2021 Gaurav Ujjwal. + * + * SPDX-License-Identifier: GPL-3.0-or-later + * + * See COPYING.txt for more details. + */ + +package com.gaurav.avnc.ui.prefs + +import android.os.Bundle +import android.view.* +import androidx.annotation.Keep +import androidx.fragment.app.Fragment +import androidx.fragment.app.activityViewModels +import androidx.lifecycle.lifecycleScope +import com.gaurav.avnc.R +import com.gaurav.avnc.databinding.FragmentInfoBinding +import com.gaurav.avnc.util.Debugging +import com.gaurav.avnc.viewmodel.PrefsViewModel +import com.google.android.material.snackbar.Snackbar +import kotlinx.coroutines.Dispatchers +import kotlinx.coroutines.delay +import kotlinx.coroutines.withContext + +/** + * Simple fragment which shows different types of info in scrollable text view. + * It also allows copying the value to clipboard. + */ +@Keep +abstract class InfoFragment : Fragment() { + + var text = "" + + override fun onCreateView(inflater: LayoutInflater, container: ViewGroup?, savedInstanceState: Bundle?): View { + setHasOptionsMenu(true) + + val binding = FragmentInfoBinding.inflate(inflater, container, false) + + lifecycleScope.launchWhenCreated { + withContext(Dispatchers.IO) { + text = getInfo() + } + + binding.text.text = text + delay(100) + binding.scrollV.fullScroll(View.FOCUS_DOWN) + } + + return binding.root + } + + override fun onResume() { + super.onResume() + activity?.title = getTitle() + } + + override fun onCreateOptionsMenu(menu: Menu, inflater: MenuInflater) { + menu.add(getString(android.R.string.copy)) + .setOnMenuItemClickListener { copyToClipboard(); true } + .setShowAsAction(MenuItem.SHOW_AS_ACTION_ALWAYS) + } + + private fun copyToClipboard() { + activityViewModels().value.setClipboardText(text) + Snackbar.make(requireView(), "Copied!", Snackbar.LENGTH_SHORT).show() + } + + abstract fun getInfo(): String + abstract fun getTitle(): String +} + + +@Keep +class LogsFragment : InfoFragment() { + override fun getInfo() = Debugging.logcat() + override fun getTitle() = getString(R.string.pref_logs) + + /** + * In addition to Copy, users can Clear the logs + */ + override fun onCreateOptionsMenu(menu: Menu, inflater: MenuInflater) { + super.onCreateOptionsMenu(menu, inflater) + menu.add("Clear").setOnMenuItemClickListener { + Debugging.clearLogs() + Snackbar.make(requireView(), "Cleared!", Snackbar.LENGTH_SHORT).show() + parentFragmentManager.popBackStack() + true + } + } +} + +@Keep +class KeyCodeMapFragment : InfoFragment() { + override fun getInfo() = Debugging.keyCodeMap() + override fun getTitle() = getString(R.string.pref_keycode_map) +} \ No newline at end of file diff --git a/app/src/main/java/com/gaurav/avnc/util/Debugging.kt b/app/src/main/java/com/gaurav/avnc/util/Debugging.kt new file mode 100644 index 0000000..155fc53 --- /dev/null +++ b/app/src/main/java/com/gaurav/avnc/util/Debugging.kt @@ -0,0 +1,62 @@ +/* + * Copyright (c) 2021 Gaurav Ujjwal. + * + * SPDX-License-Identifier: GPL-3.0-or-later + * + * See COPYING.txt for more details. + */ + +package com.gaurav.avnc.util + +import android.view.KeyEvent + +/** + * Utilities to aid in debugging + */ +object Debugging { + + /** + * Returns logcat output. + * Should not be called from main thread. + */ + fun logcat(): String { + try { + return ProcessBuilder("logcat", "-d") + .redirectErrorStream(true) + .start() + .inputStream + .bufferedReader() + .readText() + } catch (t: Throwable) { + return "Error getting logs: ${t.message}" + } + } + + fun clearLogs() { + try { + ProcessBuilder("logcat", "-c").start() + } catch (t: Throwable) { + //Ignore + } + } + + /** + * This returns a map of various properties of key-codes. + * Can be useful if some keys are not working as intended. + */ + fun keyCodeMap(): String { + val builder = StringBuilder() + + builder.append("# Keycode Unicode Printing? Label\n") + for (i in 0..KeyEvent.getMaxKeyCode()) { + val e = KeyEvent(KeyEvent.ACTION_DOWN, i) + + val s = String.format("%4d %-40s %5d %5b %c \n", + i, KeyEvent.keyCodeToString(i), e.unicodeChar, e.isPrintingKey, e.displayLabel); + + builder.append(s) + } + + return builder.toString() + } +} \ No newline at end of file diff --git a/app/src/main/res/drawable/ic_bug.xml b/app/src/main/res/drawable/ic_bug.xml new file mode 100644 index 0000000..53a5e0c --- /dev/null +++ b/app/src/main/res/drawable/ic_bug.xml @@ -0,0 +1,9 @@ + + + \ No newline at end of file diff --git a/app/src/main/res/layout/fragment_info.xml b/app/src/main/res/layout/fragment_info.xml new file mode 100644 index 0000000..9bcdc8d --- /dev/null +++ b/app/src/main/res/layout/fragment_info.xml @@ -0,0 +1,30 @@ + + + + + + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index c8747c9..98f508e 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -49,6 +49,7 @@ Server deleted. Picture-in-Picture is not supported on this device + Loading … Open Navigation Drawer Disconnected state indicator icon Connect to this URL @@ -71,7 +72,7 @@ Servers Discovery, Credentials Tools - Import/Export + Import/Export, Debugging Experimental Extra goodies! @@ -107,6 +108,9 @@ Restart Discovery after it stops Restart Delay (Minutes) Import/Export Servers + Debugging + Logs + Keycode Map Availability Indicator Indicate saved servers which are also found by Discovery.\nRequires App restart. \ No newline at end of file diff --git a/app/src/main/res/xml/pref_tools.xml b/app/src/main/res/xml/pref_tools.xml index 20e4821..61b6304 100644 --- a/app/src/main/res/xml/pref_tools.xml +++ b/app/src/main/res/xml/pref_tools.xml @@ -11,7 +11,18 @@ + + + + + + \ No newline at end of file