Skip to content

Commit e3cba50

Browse files
ADFA-3795: Validate git credentials input (#1229)
* fix(ADFA-3790): Reset push/pull state after internet error * fix(ADFA-3795): Validate Git credentials input
1 parent 5c77f69 commit e3cba50

3 files changed

Lines changed: 101 additions & 63 deletions

File tree

‎app/src/main/java/com/itsaky/androidide/fragments/git/GitBottomSheetFragment.kt‎

Lines changed: 20 additions & 27 deletions
Original file line numberDiff line numberDiff line change
@@ -18,7 +18,6 @@ import com.google.android.material.dialog.MaterialAlertDialogBuilder
1818
import com.itsaky.androidide.R
1919
import com.itsaky.androidide.activities.PreferencesActivity
2020
import com.itsaky.androidide.activities.editor.EditorHandlerActivity
21-
import com.itsaky.androidide.databinding.DialogGitCredentialsBinding
2221
import com.itsaky.androidide.databinding.FragmentGitBottomSheetBinding
2322
import com.itsaky.androidide.fragments.git.adapter.GitFileChangeAdapter
2423
import com.itsaky.androidide.git.core.GitCredentialsManager
@@ -333,6 +332,19 @@ class GitBottomSheetFragment : Fragment(R.layout.fragment_git_bottom_sheet) {
333332
}
334333
}
335334

335+
binding.btnPull.setOnClickListener {
336+
checkUnsavedChangesAndProceed {
337+
val username = credentialsManager.getUsername()
338+
val token = credentialsManager.getToken()
339+
if (!username.isNullOrBlank() && !token.isNullOrBlank()) {
340+
viewModel.pull(username, token)
341+
} else {
342+
showGitCredentialsDialog(
343+
credentialsManager = credentialsManager,
344+
positiveButtonTextResId = R.string.pull
345+
) { user, accessToken ->
346+
viewModel.pull(user, accessToken)}}
347+
336348
binding.btnPull.apply {
337349
setOnClickListener {
338350
checkUnsavedChangesAndProceed {
@@ -341,37 +353,18 @@ class GitBottomSheetFragment : Fragment(R.layout.fragment_git_bottom_sheet) {
341353
if (!username.isNullOrBlank() && !token.isNullOrBlank()) {
342354
viewModel.pull(username, token)
343355
} else {
344-
showCredentialsDialog()
356+
showGitCredentialsDialog(
357+
credentialsManager = credentialsManager,
358+
positiveButtonTextResId = R.string.pull
359+
) { user, accessToken ->
360+
viewModel.pull(user, accessToken)
361+
}
345362
}
346363
}
347364
}
348365
setTooltipOnView(TooltipTag.GIT_PULL)
349366
}
350-
}
351-
352-
private fun showCredentialsDialog() {
353-
val context = requireContext()
354-
val dialogBinding = DialogGitCredentialsBinding.inflate(layoutInflater)
355-
356-
dialogBinding.username.setText(credentialsManager.getUsername())
357-
dialogBinding.token.setText(credentialsManager.getToken())
358-
359-
MaterialAlertDialogBuilder(context)
360-
.setTitle(R.string.git_credentials_title)
361-
.setView(dialogBinding.root)
362-
.setPositiveButton(R.string.pull) { _, _ ->
363-
val username = dialogBinding.username.text?.toString()?.trim()
364-
val token = dialogBinding.token.text?.toString()?.trim()
365-
if (!username.isNullOrBlank() && !token.isNullOrBlank()) {
366-
viewModel.pull(username, token)
367-
}
368-
}
369-
.setNeutralButton(R.string.git_credentials_clear) { _, _ ->
370-
credentialsManager.clearCredentials()
371-
}
372-
.setNegativeButton(android.R.string.cancel, null)
373-
.show()
374-
}
367+
}}}
375368

376369
private fun refreshEditorContent(force: Boolean = false) {
377370
val activity = requireActivity()

‎app/src/main/java/com/itsaky/androidide/fragments/git/GitCommitHistoryDialog.kt‎

Lines changed: 28 additions & 36 deletions
Original file line numberDiff line numberDiff line change
@@ -11,7 +11,6 @@ import androidx.recyclerview.widget.LinearLayoutManager
1111
import com.google.android.material.dialog.MaterialAlertDialogBuilder
1212
import com.itsaky.androidide.R
1313
import com.itsaky.androidide.databinding.DialogGitCommitHistoryBinding
14-
import com.itsaky.androidide.databinding.DialogGitCredentialsBinding
1514
import com.itsaky.androidide.fragments.git.adapter.GitCommitHistoryAdapter
1615
import com.itsaky.androidide.git.core.GitCredentialsManager
1716
import com.itsaky.androidide.git.core.models.CommitHistoryUiState
@@ -66,19 +65,17 @@ class GitCommitHistoryDialog : DialogFragment() {
6665
true
6766
}
6867

69-
binding.rvCommitHistory.onLongPress {
70-
TooltipManager.showIdeCategoryTooltip(
71-
context = binding.root.context,
72-
anchorView = binding.root,
73-
tag = TooltipTag.GIT_COMMIT_HISTORY
74-
)
75-
}
76-
7768
binding.rvCommitHistory.apply {
7869
layoutManager = linearLayoutManager
7970
addItemDecoration(dividerItemDecoration)
8071
adapter = commitHistoryAdapter
81-
}
72+
onLongPress {
73+
TooltipManager.showIdeCategoryTooltip(
74+
context = binding.root.context,
75+
anchorView = binding.root,
76+
tag = TooltipTag.GIT_COMMIT_HISTORY
77+
)
78+
}
8279

8380
binding.btnBack.setOnClickListener {
8481
dismiss()
@@ -117,17 +114,35 @@ class GitCommitHistoryDialog : DialogFragment() {
117114
}
118115

119116
setupPushUI()
120-
}
117+
}}
121118

122119
private fun setupPushUI() {
120+
binding.btnPush.setOnClickListener {
121+
val username = credentialsManager.getUsername()
122+
val token = credentialsManager.getToken()
123+
if (!username.isNullOrBlank() && !token.isNullOrBlank()) {
124+
viewModel.push(username, token)
125+
} else {
126+
showGitCredentialsDialog(
127+
credentialsManager = credentialsManager,
128+
positiveButtonTextResId = R.string.push
129+
) { user, accessToken ->
130+
viewModel.push(user, accessToken)
131+
}}
132+
123133
binding.btnPush.apply {
124134
setOnClickListener {
125135
val username = credentialsManager.getUsername()
126136
val token = credentialsManager.getToken()
127137
if (!username.isNullOrBlank() && !token.isNullOrBlank()) {
128138
viewModel.push(username, token)
129139
} else {
130-
showCredentialsDialog()
140+
showGitCredentialsDialog(
141+
credentialsManager = credentialsManager,
142+
positiveButtonTextResId = R.string.pull
143+
) { user, accessToken ->
144+
viewModel.pull(user, accessToken)
145+
}
131146
}
132147
}
133148
setOnLongClickListener { view ->
@@ -192,30 +207,7 @@ class GitCommitHistoryDialog : DialogFragment() {
192207
}
193208
}
194209

195-
}
196-
197-
private fun showCredentialsDialog() {
198-
val dialogBinding = DialogGitCredentialsBinding.inflate(layoutInflater)
199-
200-
dialogBinding.username.setText(credentialsManager.getUsername())
201-
dialogBinding.token.setText(credentialsManager.getToken())
202-
203-
MaterialAlertDialogBuilder(requireContext())
204-
.setTitle(R.string.git_credentials_title)
205-
.setView(dialogBinding.root)
206-
.setPositiveButton(R.string.push) { _, _ ->
207-
val username = dialogBinding.username.text?.toString()?.trim()
208-
val token = dialogBinding.token.text?.toString()?.trim()
209-
if (!username.isNullOrBlank() && !token.isNullOrBlank()) {
210-
viewModel.push(username, token)
211-
}
212-
}
213-
.setNeutralButton(R.string.git_credentials_clear) { _, _ ->
214-
credentialsManager.clearCredentials()
215-
}
216-
.setNegativeButton(android.R.string.cancel, null)
217-
.show()
218-
}
210+
}}
219211

220212
override fun onDestroyView() {
221213
super.onDestroyView()
Lines changed: 53 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,53 @@
1+
package com.itsaky.androidide.fragments.git
2+
3+
import androidx.appcompat.app.AlertDialog
4+
import androidx.core.widget.doAfterTextChanged
5+
import androidx.fragment.app.Fragment
6+
import com.google.android.material.dialog.MaterialAlertDialogBuilder
7+
import com.itsaky.androidide.R
8+
import com.itsaky.androidide.databinding.DialogGitCredentialsBinding
9+
import com.itsaky.androidide.git.core.GitCredentialsManager
10+
11+
fun Fragment.showGitCredentialsDialog(
12+
credentialsManager: GitCredentialsManager,
13+
positiveButtonTextResId: Int,
14+
onPositiveClick: (username: String, token: String) -> Unit
15+
) {
16+
val dialogBinding = DialogGitCredentialsBinding.inflate(layoutInflater)
17+
18+
dialogBinding.username.setText(credentialsManager.getUsername())
19+
dialogBinding.token.setText(credentialsManager.getToken())
20+
21+
val dialog = MaterialAlertDialogBuilder(requireContext())
22+
.setTitle(R.string.git_credentials_title)
23+
.setView(dialogBinding.root)
24+
.setPositiveButton(positiveButtonTextResId) { _, _ ->
25+
val username = dialogBinding.username.text?.toString()?.trim()
26+
val token = dialogBinding.token.text?.toString()?.trim()
27+
if (!username.isNullOrBlank() && !token.isNullOrBlank()) {
28+
onPositiveClick(username, token)
29+
}
30+
}
31+
.setNeutralButton(R.string.git_credentials_clear) { _, _ ->
32+
credentialsManager.clearCredentials()
33+
}
34+
.setNegativeButton(android.R.string.cancel, null)
35+
.create()
36+
37+
dialog.setOnShowListener {
38+
val positiveButton = dialog.getButton(AlertDialog.BUTTON_POSITIVE)
39+
40+
val validate = {
41+
val user = dialogBinding.username.text?.toString()?.trim()
42+
val token = dialogBinding.token.text?.toString()?.trim()
43+
positiveButton.isEnabled = !user.isNullOrBlank() && !token.isNullOrBlank()
44+
}
45+
46+
dialogBinding.username.doAfterTextChanged { validate() }
47+
dialogBinding.token.doAfterTextChanged { validate() }
48+
49+
validate()
50+
}
51+
52+
dialog.show()
53+
}

0 commit comments

Comments
 (0)