ProfileRenameFragment.kt 4.2 KB

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