LogsActivity.kt 3.4 KB

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