MainActivity.kt 3.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104
  1. package im.angry.openeuicc.ui
  2. import android.os.Bundle
  3. import android.telephony.TelephonyManager
  4. import android.util.Log
  5. import android.view.Menu
  6. import android.view.View
  7. import android.widget.AdapterView
  8. import android.widget.ArrayAdapter
  9. import android.widget.Spinner
  10. import androidx.appcompat.app.AppCompatActivity
  11. import androidx.lifecycle.lifecycleScope
  12. import im.angry.openeuicc.common.R
  13. import im.angry.openeuicc.core.EuiccChannel
  14. import im.angry.openeuicc.core.EuiccChannelManager
  15. import im.angry.openeuicc.util.*
  16. import kotlinx.coroutines.Dispatchers
  17. import kotlinx.coroutines.launch
  18. import kotlinx.coroutines.withContext
  19. open class MainActivity : AppCompatActivity() {
  20. companion object {
  21. const val TAG = "MainActivity"
  22. }
  23. protected lateinit var manager: EuiccChannelManager
  24. private lateinit var spinnerAdapter: ArrayAdapter<String>
  25. private lateinit var spinner: Spinner
  26. private val fragments = arrayListOf<EuiccManagementFragment>()
  27. private lateinit var noEuiccPlaceholder: View
  28. protected lateinit var tm: TelephonyManager
  29. override fun onCreate(savedInstanceState: Bundle?) {
  30. super.onCreate(savedInstanceState)
  31. setContentView(R.layout.activity_main)
  32. noEuiccPlaceholder = findViewById(R.id.no_euicc_placeholder)
  33. tm = openEuiccApplication.telephonyManager
  34. manager = openEuiccApplication.euiccChannelManager
  35. spinnerAdapter = ArrayAdapter<String>(this, R.layout.spinner_item)
  36. lifecycleScope.launch {
  37. init()
  38. }
  39. }
  40. override fun onCreateOptionsMenu(menu: Menu): Boolean {
  41. menuInflater.inflate(R.menu.activity_main, menu)
  42. spinner = menu.findItem(R.id.spinner).actionView as Spinner
  43. spinner.adapter = spinnerAdapter
  44. spinner.onItemSelectedListener = object : AdapterView.OnItemSelectedListener {
  45. override fun onItemSelected(
  46. parent: AdapterView<*>?,
  47. view: View?,
  48. position: Int,
  49. id: Long
  50. ) {
  51. supportFragmentManager.beginTransaction().replace(R.id.fragment_root, fragments[position]).commit()
  52. }
  53. override fun onNothingSelected(parent: AdapterView<*>?) {
  54. }
  55. }
  56. return true
  57. }
  58. protected open fun createEuiccManagementFragment(channel: EuiccChannel): EuiccManagementFragment =
  59. EuiccManagementFragment.newInstance(channel.slotId, channel.portId)
  60. private suspend fun init() {
  61. withContext(Dispatchers.IO) {
  62. manager.enumerateEuiccChannels()
  63. manager.knownChannels.forEach {
  64. Log.d(TAG, "slot ${it.slotId} port ${it.portId}")
  65. Log.d(TAG, it.lpa.eID)
  66. // Request the system to refresh the list of profiles every time we start
  67. // Note that this is currently supposed to be no-op when unprivileged,
  68. // but it could change in the future
  69. manager.notifyEuiccProfilesChanged(it.logicalSlotId)
  70. }
  71. }
  72. withContext(Dispatchers.Main) {
  73. manager.knownChannels.sortedBy { it.logicalSlotId }.forEach { channel ->
  74. spinnerAdapter.add(getString(R.string.channel_name_format, channel.logicalSlotId))
  75. fragments.add(createEuiccManagementFragment(channel))
  76. }
  77. if (fragments.isNotEmpty()) {
  78. noEuiccPlaceholder.visibility = View.GONE
  79. supportFragmentManager.beginTransaction().replace(R.id.fragment_root, fragments.first()).commit()
  80. }
  81. }
  82. }
  83. }