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