ProfileRenameFragment.kt 4.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134
  1. package im.angry.openeuicc.ui
  2. import android.app.Dialog
  3. import android.os.Bundle
  4. import android.view.LayoutInflater
  5. import android.view.View
  6. import android.view.ViewGroup
  7. import android.widget.ProgressBar
  8. import android.widget.Toast
  9. import androidx.annotation.StringRes
  10. import androidx.appcompat.widget.Toolbar
  11. import androidx.lifecycle.lifecycleScope
  12. import com.google.android.material.textfield.TextInputLayout
  13. import im.angry.openeuicc.common.R
  14. import im.angry.openeuicc.core.EuiccChannel
  15. import im.angry.openeuicc.service.EuiccChannelManagerService.Companion.waitDone
  16. import im.angry.openeuicc.util.*
  17. import kotlinx.coroutines.launch
  18. import net.typeblog.lpac_jni.LocalProfileAssistant
  19. class ProfileRenameFragment : BaseMaterialDialogFragment(), EuiccChannelFragmentMarker {
  20. companion object {
  21. private const val FIELD_ICCID = "iccid"
  22. private const val FIELD_CURRENT_NAME = "currentName"
  23. const val TAG = "ProfileRenameFragment"
  24. fun newInstance(
  25. slotId: Int, portId: Int, seId: EuiccChannel.SecureElementId,
  26. iccid: String, currentName: String
  27. ) = newInstanceEuicc(ProfileRenameFragment::class.java, slotId, portId, seId) {
  28. putString(FIELD_ICCID, iccid)
  29. putString(FIELD_CURRENT_NAME, currentName)
  30. }
  31. }
  32. private lateinit var toolbar: Toolbar
  33. private lateinit var profileRenameNewName: TextInputLayout
  34. private lateinit var progress: ProgressBar
  35. private var renaming = false
  36. private val iccid: String by lazy {
  37. requireArguments().getString(FIELD_ICCID)!!
  38. }
  39. private val currentName: String by lazy {
  40. requireArguments().getString(FIELD_CURRENT_NAME)!!
  41. }
  42. override fun onCreateView(
  43. inflater: LayoutInflater,
  44. container: ViewGroup?,
  45. savedInstanceState: Bundle?
  46. ): View {
  47. val view = inflater.inflate(R.layout.fragment_profile_rename, container, false)
  48. toolbar = view.requireViewById(R.id.toolbar)
  49. profileRenameNewName = view.requireViewById(R.id.profile_rename_new_name)
  50. progress = view.requireViewById(R.id.progress)
  51. toolbar.inflateMenu(R.menu.fragment_profile_rename)
  52. return view
  53. }
  54. override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
  55. super.onViewCreated(view, savedInstanceState)
  56. profileRenameNewName.editText!!.setText(currentName)
  57. toolbar.apply {
  58. setTitle(R.string.profile_rename)
  59. setNavigationOnClickListener {
  60. if (!renaming) dismiss()
  61. }
  62. setOnMenuItemClickListener {
  63. if (!renaming) rename()
  64. true
  65. }
  66. }
  67. }
  68. override fun onResume() {
  69. super.onResume()
  70. setWidthPercent(95)
  71. }
  72. override fun onCreateDialog(savedInstanceState: Bundle?): Dialog {
  73. return super.onCreateDialog(savedInstanceState).also {
  74. it.setCanceledOnTouchOutside(false)
  75. }
  76. }
  77. private fun showErrorAndCancel(@StringRes resId: Int) {
  78. Toast.makeText(requireContext(), resId, Toast.LENGTH_LONG).show()
  79. renaming = false
  80. progress.visibility = View.GONE
  81. }
  82. private fun rename() {
  83. renaming = true
  84. progress.isIndeterminate = true
  85. progress.visibility = View.VISIBLE
  86. val newName = profileRenameNewName.editText!!.text.toString().trim()
  87. lifecycleScope.launch {
  88. ensureEuiccChannelManager()
  89. euiccChannelManagerService.waitForForegroundTask()
  90. val response = euiccChannelManagerService
  91. .launchProfileRenameTask(slotId, portId, seId, iccid, newName).waitDone()
  92. when (response) {
  93. is LocalProfileAssistant.ProfileNameTooLongException -> {
  94. showErrorAndCancel(R.string.profile_rename_too_long)
  95. }
  96. is LocalProfileAssistant.ProfileNameIsInvalidUTF8Exception -> {
  97. showErrorAndCancel(R.string.profile_rename_encoding_error)
  98. }
  99. is Throwable -> {
  100. showErrorAndCancel(R.string.profile_rename_failure)
  101. }
  102. else -> {
  103. parentFragment?.notifyEuiccProfilesChanged()
  104. runCatching(::dismiss)
  105. }
  106. }
  107. }
  108. }
  109. }