MainActivity.kt 4.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124
  1. package im.angry.openeuicc.ui
  2. import android.content.Intent
  3. import android.os.Bundle
  4. import android.telephony.TelephonyManager
  5. import android.util.Log
  6. import android.view.Menu
  7. import android.view.MenuItem
  8. import android.view.View
  9. import android.widget.AdapterView
  10. import android.widget.ArrayAdapter
  11. import android.widget.Spinner
  12. import androidx.lifecycle.lifecycleScope
  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. open class MainActivity : BaseEuiccAccessActivity(), OpenEuiccContextMarker {
  19. companion object {
  20. const val TAG = "MainActivity"
  21. }
  22. private lateinit var spinnerAdapter: ArrayAdapter<String>
  23. private lateinit var spinnerItem: MenuItem
  24. private lateinit var spinner: Spinner
  25. private val fragments = arrayListOf<EuiccManagementFragment>()
  26. protected lateinit var tm: TelephonyManager
  27. override fun onCreate(savedInstanceState: Bundle?) {
  28. super.onCreate(savedInstanceState)
  29. setContentView(R.layout.activity_main)
  30. setSupportActionBar(requireViewById(R.id.toolbar))
  31. supportFragmentManager.beginTransaction().replace(
  32. R.id.fragment_root,
  33. appContainer.uiComponentFactory.createNoEuiccPlaceholderFragment()
  34. ).commit()
  35. tm = telephonyManager
  36. spinnerAdapter = ArrayAdapter<String>(this, R.layout.spinner_item)
  37. }
  38. override fun onCreateOptionsMenu(menu: Menu): Boolean {
  39. menuInflater.inflate(R.menu.activity_main, menu)
  40. if (!this::spinner.isInitialized) {
  41. spinnerItem = menu.findItem(R.id.spinner)
  42. spinner = spinnerItem.actionView as Spinner
  43. if (spinnerAdapter.isEmpty) {
  44. spinnerItem.isVisible = false
  45. }
  46. spinner.adapter = spinnerAdapter
  47. spinner.onItemSelectedListener = object : AdapterView.OnItemSelectedListener {
  48. override fun onItemSelected(
  49. parent: AdapterView<*>?,
  50. view: View?,
  51. position: Int,
  52. id: Long
  53. ) {
  54. supportFragmentManager.beginTransaction()
  55. .replace(R.id.fragment_root, fragments[position]).commit()
  56. }
  57. override fun onNothingSelected(parent: AdapterView<*>?) {
  58. }
  59. }
  60. } else {
  61. // Fragments may cause this menu to be inflated multiple times.
  62. // Simply reuse the action view in that case
  63. menu.findItem(R.id.spinner).actionView = spinner
  64. }
  65. return true
  66. }
  67. override fun onOptionsItemSelected(item: MenuItem): Boolean =
  68. when (item.itemId) {
  69. R.id.settings -> {
  70. startActivity(Intent(this, SettingsActivity::class.java));
  71. true
  72. }
  73. else -> super.onOptionsItemSelected(item)
  74. }
  75. override fun onInit() {
  76. lifecycleScope.launch {
  77. init()
  78. }
  79. }
  80. private suspend fun init() {
  81. withContext(Dispatchers.IO) {
  82. euiccChannelManager.enumerateEuiccChannels()
  83. euiccChannelManager.knownChannels.forEach {
  84. Log.d(TAG, "slot ${it.slotId} port ${it.portId}")
  85. Log.d(TAG, it.lpa.eID)
  86. // Request the system to refresh the list of profiles every time we start
  87. // Note that this is currently supposed to be no-op when unprivileged,
  88. // but it could change in the future
  89. euiccChannelManager.notifyEuiccProfilesChanged(it.logicalSlotId)
  90. }
  91. }
  92. withContext(Dispatchers.Main) {
  93. euiccChannelManager.knownChannels.sortedBy { it.logicalSlotId }.forEach { channel ->
  94. spinnerAdapter.add(getString(R.string.channel_name_format, channel.logicalSlotId))
  95. fragments.add(appContainer.uiComponentFactory.createEuiccManagementFragment(channel))
  96. }
  97. if (fragments.isNotEmpty()) {
  98. if (this@MainActivity::spinner.isInitialized) {
  99. spinnerItem.isVisible = true
  100. }
  101. supportFragmentManager.beginTransaction().replace(R.id.fragment_root, fragments.first()).commit()
  102. }
  103. }
  104. }
  105. }