MainActivity.kt 3.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116
  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.MenuItem
  7. import android.view.View
  8. import android.widget.AdapterView
  9. import android.widget.ArrayAdapter
  10. import android.widget.Spinner
  11. import android.widget.Toast
  12. import androidx.appcompat.app.AppCompatActivity
  13. import androidx.lifecycle.lifecycleScope
  14. import im.angry.openeuicc.R
  15. import im.angry.openeuicc.core.EuiccChannelManager
  16. import im.angry.openeuicc.databinding.ActivityMainBinding
  17. import im.angry.openeuicc.util.*
  18. import kotlinx.coroutines.Dispatchers
  19. import kotlinx.coroutines.launch
  20. import kotlinx.coroutines.withContext
  21. class MainActivity : AppCompatActivity() {
  22. companion object {
  23. const val TAG = "MainActivity"
  24. }
  25. private 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 binding: ActivityMainBinding
  30. private lateinit var tm: TelephonyManager
  31. override fun onCreate(savedInstanceState: Bundle?) {
  32. super.onCreate(savedInstanceState)
  33. binding = ActivityMainBinding.inflate(layoutInflater)
  34. setContentView(binding.root)
  35. tm = openEuiccApplication.telephonyManager
  36. manager = openEuiccApplication.euiccChannelManager
  37. spinnerAdapter = ArrayAdapter<String>(this, android.R.layout.simple_spinner_item)
  38. lifecycleScope.launch {
  39. init()
  40. }
  41. }
  42. override fun onCreateOptionsMenu(menu: Menu): Boolean {
  43. menuInflater.inflate(R.menu.activity_main, menu)
  44. spinner = menu.findItem(R.id.spinner).actionView as Spinner
  45. spinner.adapter = spinnerAdapter
  46. spinner.onItemSelectedListener = object : AdapterView.OnItemSelectedListener {
  47. override fun onItemSelected(
  48. parent: AdapterView<*>?,
  49. view: View?,
  50. position: Int,
  51. id: Long
  52. ) {
  53. supportFragmentManager.beginTransaction().replace(R.id.fragment_root, fragments[position]).commit()
  54. }
  55. override fun onNothingSelected(parent: AdapterView<*>?) {
  56. }
  57. }
  58. if (tm.supportsDSDS) {
  59. val dsds = menu.findItem(R.id.dsds)
  60. dsds.isVisible = true
  61. dsds.isChecked = tm.dsdsEnabled
  62. }
  63. return true
  64. }
  65. override fun onOptionsItemSelected(item: MenuItem): Boolean = when (item.itemId) {
  66. R.id.dsds -> {
  67. tm.dsdsEnabled = !item.isChecked
  68. Toast.makeText(this, R.string.toast_dsds_switched, Toast.LENGTH_LONG).show()
  69. finish()
  70. true
  71. }
  72. else -> false
  73. }
  74. private suspend fun init() {
  75. withContext(Dispatchers.IO) {
  76. manager.enumerateEuiccChannels()
  77. manager.knownChannels.forEach {
  78. Log.d(TAG, it.name)
  79. Log.d(TAG, it.lpa.eid)
  80. openEuiccApplication.subscriptionManager.tryRefreshCachedEuiccInfo(it.cardId)
  81. }
  82. }
  83. withContext(Dispatchers.Main) {
  84. manager.knownChannels.forEach { channel ->
  85. spinnerAdapter.add(channel.name)
  86. fragments.add(EuiccManagementFragment.newInstance(channel.slotId))
  87. }
  88. if (fragments.isNotEmpty()) {
  89. binding.noEuiccPlaceholder.visibility = View.GONE
  90. supportFragmentManager.beginTransaction().replace(R.id.fragment_root, fragments.first()).commit()
  91. }
  92. }
  93. }
  94. }