ProfileRenameFragment.kt 3.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113
  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.view.Window
  9. import android.widget.Toast
  10. import androidx.fragment.app.DialogFragment
  11. import androidx.lifecycle.lifecycleScope
  12. import im.angry.openeuicc.R
  13. import im.angry.openeuicc.databinding.FragmentProfileRenameBinding
  14. import im.angry.openeuicc.util.setWidthPercent
  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 : DialogFragment(), EuiccFragmentMarker {
  21. companion object {
  22. const val TAG = "ProfileRenameFragment"
  23. fun newInstance(slotId: Int, iccid: String, currentName: String): ProfileRenameFragment {
  24. val instance = newInstanceEuicc(ProfileRenameFragment::class.java, slotId)
  25. instance.requireArguments().apply {
  26. putString("iccid", iccid)
  27. putString("currentName", currentName)
  28. }
  29. return instance
  30. }
  31. }
  32. private var _binding: FragmentProfileRenameBinding? = null
  33. private val binding get() = _binding!!
  34. private var renaming = false
  35. override fun onCreateView(
  36. inflater: LayoutInflater,
  37. container: ViewGroup?,
  38. savedInstanceState: Bundle?
  39. ): View {
  40. _binding = FragmentProfileRenameBinding.inflate(inflater, container, false)
  41. binding.toolbar.inflateMenu(R.menu.fragment_profile_rename)
  42. return binding.root
  43. }
  44. override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
  45. super.onViewCreated(view, savedInstanceState)
  46. binding.toolbar.apply {
  47. setTitle(R.string.rename)
  48. setNavigationOnClickListener {
  49. if (!renaming) dismiss()
  50. }
  51. setOnMenuItemClickListener {
  52. if (!renaming) rename()
  53. true
  54. }
  55. }
  56. }
  57. override fun onStart() {
  58. super.onStart()
  59. binding.profileRenameNewName.editText!!.setText(requireArguments().getString("currentName"))
  60. }
  61. override fun onResume() {
  62. super.onResume()
  63. setWidthPercent(95)
  64. }
  65. override fun onCreateDialog(savedInstanceState: Bundle?): Dialog {
  66. return super.onCreateDialog(savedInstanceState).also {
  67. it.window?.requestFeature(Window.FEATURE_NO_TITLE)
  68. it.setCanceledOnTouchOutside(false)
  69. }
  70. }
  71. private fun rename() {
  72. val name = binding.profileRenameNewName.editText!!.text.toString().trim()
  73. if (name.length >= 64) {
  74. Toast.makeText(context, R.string.toast_profile_name_too_long, Toast.LENGTH_LONG).show()
  75. return
  76. }
  77. renaming = true
  78. binding.progress.isIndeterminate = true
  79. binding.progress.visibility = View.VISIBLE
  80. lifecycleScope.launch {
  81. try {
  82. doRename(name)
  83. } catch (e: Exception) {
  84. Log.d(TAG, "Failed to rename profile")
  85. Log.d(TAG, Log.getStackTraceString(e))
  86. } finally {
  87. if (parentFragment is EuiccProfilesChangedListener) {
  88. (parentFragment as EuiccProfilesChangedListener).onEuiccProfilesChanged()
  89. }
  90. dismiss()
  91. }
  92. }
  93. }
  94. private suspend fun doRename(name: String) = withContext(Dispatchers.IO) {
  95. if (!channel.lpa.setNickname(requireArguments().getString("iccid"), name)) {
  96. throw RuntimeException("Profile nickname not changed")
  97. }
  98. }
  99. }