MainActivity.kt 4.3 KB

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