ProfileRenameFragment.kt 3.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119
  1. package im.angry.openeuicc.ui
  2. import android.app.Dialog
  3. import android.os.Bundle
  4. import android.util.Log
  5. import android.view.LayoutInflater
  6. import android.view.View
  7. import android.view.ViewGroup
  8. import android.widget.ProgressBar
  9. import android.widget.Toast
  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.util.*
  15. import kotlinx.coroutines.Dispatchers
  16. import kotlinx.coroutines.launch
  17. import kotlinx.coroutines.withContext
  18. import java.lang.Exception
  19. import java.lang.RuntimeException
  20. class ProfileRenameFragment : BaseMaterialDialogFragment(), EuiccChannelFragmentMarker {
  21. companion object {
  22. const val TAG = "ProfileRenameFragment"
  23. fun newInstance(slotId: Int, portId: Int, iccid: String, currentName: String): ProfileRenameFragment {
  24. val instance = newInstanceEuicc(ProfileRenameFragment::class.java, slotId, portId)
  25. instance.requireArguments().apply {
  26. putString("iccid", iccid)
  27. putString("currentName", currentName)
  28. }
  29. return instance
  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. override fun onCreateView(
  37. inflater: LayoutInflater,
  38. container: ViewGroup?,
  39. savedInstanceState: Bundle?
  40. ): View {
  41. val view = inflater.inflate(R.layout.fragment_profile_rename, container, false)
  42. toolbar = view.requireViewById(R.id.toolbar)
  43. profileRenameNewName = view.requireViewById(R.id.profile_rename_new_name)
  44. progress = view.requireViewById(R.id.progress)
  45. toolbar.inflateMenu(R.menu.fragment_profile_rename)
  46. return view
  47. }
  48. override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
  49. super.onViewCreated(view, savedInstanceState)
  50. toolbar.apply {
  51. setTitle(R.string.rename)
  52. setNavigationOnClickListener {
  53. if (!renaming) dismiss()
  54. }
  55. setOnMenuItemClickListener {
  56. if (!renaming) rename()
  57. true
  58. }
  59. }
  60. }
  61. override fun onStart() {
  62. super.onStart()
  63. profileRenameNewName.editText!!.setText(requireArguments().getString("currentName"))
  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 rename() {
  75. val name = profileRenameNewName.editText!!.text.toString().trim()
  76. if (name.length >= 64) {
  77. Toast.makeText(context, R.string.toast_profile_name_too_long, Toast.LENGTH_LONG).show()
  78. return
  79. }
  80. renaming = true
  81. progress.isIndeterminate = true
  82. progress.visibility = View.VISIBLE
  83. lifecycleScope.launch {
  84. try {
  85. doRename(name)
  86. } catch (e: Exception) {
  87. Log.d(TAG, "Failed to rename profile")
  88. Log.d(TAG, Log.getStackTraceString(e))
  89. } finally {
  90. if (parentFragment is EuiccProfilesChangedListener) {
  91. (parentFragment as EuiccProfilesChangedListener).onEuiccProfilesChanged()
  92. }
  93. dismiss()
  94. }
  95. }
  96. }
  97. private suspend fun doRename(name: String) = withContext(Dispatchers.IO) {
  98. if (!channel.lpa.setNickname(requireArguments().getString("iccid")!!, name)) {
  99. throw RuntimeException("Profile nickname not changed")
  100. }
  101. }
  102. }