EuiccInfoActivity.kt 6.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202
  1. package im.angry.openeuicc.ui
  2. import android.annotation.SuppressLint
  3. import android.os.Bundle
  4. import android.view.LayoutInflater
  5. import android.view.MenuItem
  6. import android.view.View
  7. import android.view.ViewGroup
  8. import android.widget.TextView
  9. import androidx.activity.enableEdgeToEdge
  10. import androidx.lifecycle.lifecycleScope
  11. import androidx.recyclerview.widget.DividerItemDecoration
  12. import androidx.recyclerview.widget.LinearLayoutManager
  13. import androidx.recyclerview.widget.RecyclerView
  14. import androidx.recyclerview.widget.RecyclerView.ViewHolder
  15. import androidx.swiperefreshlayout.widget.SwipeRefreshLayout
  16. import im.angry.openeuicc.common.R
  17. import im.angry.openeuicc.util.*
  18. import kotlinx.coroutines.launch
  19. import net.typeblog.lpac_jni.impl.DEFAULT_PKID_GSMA_RSP2_ROOT_CI1
  20. import net.typeblog.lpac_jni.impl.PKID_GSMA_TEST_CI
  21. class EuiccInfoActivity : BaseEuiccAccessActivity() {
  22. private lateinit var swipeRefresh: SwipeRefreshLayout
  23. private lateinit var infoList: RecyclerView
  24. private var logicalSlotId: Int = -1
  25. override fun onCreate(savedInstanceState: Bundle?) {
  26. enableEdgeToEdge()
  27. super.onCreate(savedInstanceState)
  28. setContentView(R.layout.activity_euicc_info)
  29. setSupportActionBar(requireViewById(R.id.toolbar))
  30. setupToolbarInsets()
  31. supportActionBar!!.setDisplayHomeAsUpEnabled(true)
  32. swipeRefresh = requireViewById(R.id.swipe_refresh)
  33. infoList = requireViewById(R.id.recycler_view)
  34. infoList.layoutManager =
  35. LinearLayoutManager(this, LinearLayoutManager.VERTICAL, false)
  36. infoList.addItemDecoration(DividerItemDecoration(this, LinearLayoutManager.VERTICAL))
  37. infoList.adapter = EuiccInfoAdapter()
  38. logicalSlotId = intent.getIntExtra("logicalSlotId", 0)
  39. title = getString(
  40. R.string.euicc_info_activity_title,
  41. getString(R.string.channel_name_format, logicalSlotId)
  42. )
  43. swipeRefresh.setOnRefreshListener { refresh() }
  44. setupRootViewInsets(infoList)
  45. }
  46. override fun onOptionsItemSelected(item: MenuItem): Boolean = when (item.itemId) {
  47. android.R.id.home -> {
  48. finish()
  49. true
  50. }
  51. else -> super.onOptionsItemSelected(item)
  52. }
  53. override fun onInit() {
  54. refresh()
  55. }
  56. private fun refresh() {
  57. swipeRefresh.isRefreshing = true
  58. lifecycleScope.launch {
  59. val unknownStr = getString(R.string.unknown)
  60. val newItems = mutableListOf<Pair<String, String>>()
  61. newItems.add(
  62. Pair(
  63. getString(R.string.euicc_info_access_mode),
  64. euiccChannelManager.withEuiccChannel(logicalSlotId) { channel -> channel.type }
  65. )
  66. )
  67. newItems.add(
  68. Pair(
  69. getString(R.string.euicc_info_removable),
  70. if (euiccChannelManager.withEuiccChannel(logicalSlotId) { channel -> channel.port.card.isRemovable }) {
  71. getString(R.string.yes)
  72. } else {
  73. getString(R.string.no)
  74. }
  75. )
  76. )
  77. newItems.add(
  78. Pair(
  79. getString(R.string.euicc_info_eid),
  80. euiccChannelManager.withEuiccChannel(logicalSlotId) { channel -> channel.lpa.eID }
  81. )
  82. )
  83. val euiccInfo2 = euiccChannelManager.withEuiccChannel(logicalSlotId) { channel ->
  84. channel.lpa.euiccInfo2
  85. }
  86. newItems.add(
  87. Pair(
  88. getString(R.string.euicc_info_firmware_version),
  89. euiccInfo2?.euiccFirmwareVersion ?: unknownStr
  90. )
  91. )
  92. newItems.add(
  93. Pair(
  94. getString(R.string.euicc_info_globalplatform_version),
  95. euiccInfo2?.globalPlatformVersion ?: unknownStr
  96. )
  97. )
  98. newItems.add(
  99. Pair(
  100. getString(R.string.euicc_info_pp_version),
  101. euiccInfo2?.ppVersion ?: unknownStr
  102. )
  103. )
  104. newItems.add(
  105. Pair(
  106. getString(R.string.euicc_info_sas_accreditation_number),
  107. euiccInfo2?.sasAccreditationNumber ?: unknownStr
  108. )
  109. )
  110. newItems.add(
  111. Pair(
  112. getString(R.string.euicc_info_free_nvram),
  113. euiccInfo2?.freeNvram?.let { formatFreeSpace(it) } ?: unknownStr
  114. ))
  115. newItems.add(
  116. Pair(
  117. getString(R.string.euicc_info_gsma_prod),
  118. if (euiccInfo2?.euiccCiPKIdListForSigning?.contains(
  119. DEFAULT_PKID_GSMA_RSP2_ROOT_CI1
  120. ) == true
  121. ) {
  122. getString(R.string.supported)
  123. } else {
  124. getString(R.string.unsupported)
  125. }
  126. )
  127. )
  128. newItems.add(
  129. Pair(
  130. getString(R.string.euicc_info_gsma_test),
  131. if (PKID_GSMA_TEST_CI.any { euiccInfo2?.euiccCiPKIdListForSigning?.contains(it) == true }) {
  132. getString(R.string.supported)
  133. } else {
  134. getString(R.string.unsupported)
  135. }
  136. )
  137. )
  138. (infoList.adapter!! as EuiccInfoAdapter).euiccInfoItems = newItems
  139. swipeRefresh.isRefreshing = false
  140. }
  141. }
  142. inner class EuiccInfoViewHolder(root: View) : ViewHolder(root) {
  143. private val title: TextView = root.requireViewById(R.id.euicc_info_title)
  144. private val content: TextView = root.requireViewById(R.id.euicc_info_content)
  145. fun bind(item: Pair<String, String>) {
  146. title.text = item.first
  147. content.text = item.second
  148. }
  149. }
  150. inner class EuiccInfoAdapter : RecyclerView.Adapter<EuiccInfoViewHolder>() {
  151. var euiccInfoItems: List<Pair<String, String>> = listOf()
  152. @SuppressLint("NotifyDataSetChanged")
  153. set(newVal) {
  154. field = newVal
  155. notifyDataSetChanged()
  156. }
  157. override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): EuiccInfoViewHolder {
  158. val root = LayoutInflater.from(parent.context)
  159. .inflate(R.layout.euicc_info_item, parent, false)
  160. return EuiccInfoViewHolder(root)
  161. }
  162. override fun getItemCount(): Int = euiccInfoItems.size
  163. override fun onBindViewHolder(holder: EuiccInfoViewHolder, position: Int) {
  164. holder.bind(euiccInfoItems[position])
  165. }
  166. }
  167. }