LogsActivity.kt 2.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899
  1. package im.angry.openeuicc.ui
  2. import android.icu.text.SimpleDateFormat
  3. import android.os.Bundle
  4. import android.view.Menu
  5. import android.view.MenuItem
  6. import android.view.View
  7. import android.widget.ScrollView
  8. import android.widget.TextView
  9. import androidx.activity.enableEdgeToEdge
  10. import androidx.appcompat.app.AppCompatActivity
  11. import androidx.lifecycle.lifecycleScope
  12. import androidx.swiperefreshlayout.widget.SwipeRefreshLayout
  13. import im.angry.openeuicc.common.R
  14. import im.angry.openeuicc.util.*
  15. import kotlinx.coroutines.Dispatchers
  16. import kotlinx.coroutines.launch
  17. import kotlinx.coroutines.withContext
  18. import java.util.Date
  19. class LogsActivity : AppCompatActivity() {
  20. private lateinit var swipeRefresh: SwipeRefreshLayout
  21. private lateinit var scrollView: ScrollView
  22. private lateinit var logText: TextView
  23. private lateinit var logStr: String
  24. private val saveLogs =
  25. setupLogSaving(
  26. getLogFileName = {
  27. getString(
  28. R.string.logs_filename_template,
  29. SimpleDateFormat.getDateTimeInstance().format(Date())
  30. )
  31. },
  32. getLogText = { logStr }
  33. )
  34. override fun onCreate(savedInstanceState: Bundle?) {
  35. enableEdgeToEdge()
  36. super.onCreate(savedInstanceState)
  37. setContentView(R.layout.activity_logs)
  38. setSupportActionBar(requireViewById(R.id.toolbar))
  39. setupToolbarInsets()
  40. supportActionBar!!.setDisplayHomeAsUpEnabled(true)
  41. swipeRefresh = requireViewById(R.id.swipe_refresh)
  42. scrollView = requireViewById(R.id.scroll_view)
  43. logText = requireViewById(R.id.log_text)
  44. setupRootViewInsets(scrollView)
  45. swipeRefresh.setOnRefreshListener {
  46. lifecycleScope.launch {
  47. reload()
  48. }
  49. }
  50. }
  51. override fun onStart() {
  52. super.onStart()
  53. lifecycleScope.launch {
  54. reload()
  55. }
  56. }
  57. override fun onCreateOptionsMenu(menu: Menu?): Boolean {
  58. menuInflater.inflate(R.menu.activity_logs, menu)
  59. return true
  60. }
  61. override fun onOptionsItemSelected(item: MenuItem): Boolean = when (item.itemId) {
  62. android.R.id.home -> {
  63. finish()
  64. true
  65. }
  66. R.id.save -> {
  67. saveLogs()
  68. true
  69. }
  70. else -> super.onOptionsItemSelected(item)
  71. }
  72. private suspend fun reload() = withContext(Dispatchers.Main) {
  73. swipeRefresh.isRefreshing = true
  74. logStr = intent.extras?.getString("log") ?: readSelfLog()
  75. logText.text = withContext(Dispatchers.IO) {
  76. // Limit the UI to display only 256 lines
  77. logStr.lines().takeLast(256).joinToString("\n")
  78. }
  79. swipeRefresh.isRefreshing = false
  80. scrollView.post {
  81. scrollView.fullScroll(View.FOCUS_DOWN)
  82. }
  83. }
  84. }