@@ -65,6 +65,7 @@ class ChooseTemplateDialogFragment :
6565 Injectable {
6666
6767 private lateinit var fileNames: MutableSet <String >
68+ private var hasUserInteracted = false
6869
6970 @Inject
7071 lateinit var clientFactory: ClientFactory
@@ -142,6 +143,7 @@ class ChooseTemplateDialogFragment :
142143 override fun beforeTextChanged (s : CharSequence , start : Int , count : Int , after : Int ) = Unit
143144 override fun onTextChanged (s : CharSequence , start : Int , before : Int , count : Int ) = Unit
144145 override fun afterTextChanged (s : Editable ) {
146+ hasUserInteracted = true
145147 checkFileNameAfterEachType()
146148 }
147149 })
@@ -224,71 +226,59 @@ class ChooseTemplateDialogFragment :
224226 private fun getOCCapability (): OCCapability = fileDataStorageManager.getCapability(currentAccount.user.accountName)
225227
226228 override fun onClick (v : View ) {
229+ val selectedTemplate = adapter?.selectedTemplate
230+ ? : return DisplayUtils .showSnackMessage(binding.list, R .string.select_one_template)
231+
232+ val state = resolveFilenameState()
233+ if (state !is TemplateFilenameState .Valid ) {
234+ state.errorMessage?.let { DisplayUtils .showSnackMessage(requireActivity(), it.toString()) }
235+ return
236+ }
237+
227238 val name = binding.filename.text.toString()
228239 val path = parentFolder?.remotePath + name
229- val selectedTemplate = adapter?.selectedTemplate
240+ val fullPath = if (name.endsWith(selectedTemplate.extension)) {
241+ path
242+ } else {
243+ path + DOT + selectedTemplate.extension
244+ }
230245
231- val errorMessage = FileNameValidator .checkFileName(name, getOCCapability(), requireContext())
246+ createFromTemplate(selectedTemplate, fullPath)
247+ }
232248
233- when {
234- selectedTemplate == null -> {
235- DisplayUtils .showSnackMessage( binding.list, R .string.select_one_template )
236- }
249+ private fun resolveFilenameState (): TemplateFilenameState {
250+ val selectedTemplate = adapter?.selectedTemplate ? : return TemplateFilenameState . NoTemplateSelected
251+ val name = binding.filename.text.toString().trim( )
252+ val validationError = FileNameValidator .checkFileName(name, getOCCapability(), requireContext(), fileNames)
237253
238- errorMessage != null -> {
239- DisplayUtils .showSnackMessage(requireActivity(), errorMessage)
240- }
254+ return when {
255+ name.equals( DOT + selectedTemplate.extension, ignoreCase = true ) ->
256+ TemplateFilenameState . JustExtension (getString( R .string.enter_filename))
241257
242- name.equals(DOT + selectedTemplate.extension, ignoreCase = true ) -> {
243- DisplayUtils .showSnackMessage(binding.list, R .string.enter_filename)
244- }
258+ validationError != null -> TemplateFilenameState .Invalid (validationError)
245259
246- else -> {
247- val fullPath = if (! name.endsWith(selectedTemplate.extension)) {
248- path + DOT + selectedTemplate.extension
249- } else {
250- path
251- }
252- createFromTemplate(selectedTemplate, fullPath)
253- }
260+ FileNameValidator .isFileHidden(name) ->
261+ TemplateFilenameState .HiddenName (getText(R .string.hidden_file_name_warning))
262+
263+ name.substringAfterLast(DOT ) != selectedTemplate.extension ->
264+ TemplateFilenameState .ChangedExtension (getString(R .string.extension_cannot_be_changed))
265+
266+ else -> TemplateFilenameState .Valid
254267 }
255268 }
256269
257270 private fun checkFileNameAfterEachType () {
258- if (positiveButton == null ) return
271+ val positiveButton = positiveButton ? : return
272+ val state = resolveFilenameState()
259273
260- val selectedTemplate = adapter?.selectedTemplate
261- val name = binding.filename.text.toString().trim()
262- val isNameJustExtension = selectedTemplate != null &&
263- name.equals(
264- DOT + selectedTemplate.extension,
265- ignoreCase = true
266- )
267- val fileNameValidatorResult =
268- FileNameValidator .checkFileName(name, getOCCapability(), requireContext(), fileNames)
269-
270- val errorMessage = when {
271- isNameJustExtension -> null
272- fileNameValidatorResult != null -> fileNameValidatorResult
273- else -> null
274- }
274+ val isValid = state is TemplateFilenameState .Valid
275+ positiveButton.isEnabled = isValid
276+ positiveButton.isClickable = isValid
275277
276- val isNameValid = (errorMessage == null ) && ! name.equals(DOT + selectedTemplate?.extension, ignoreCase = true )
277- val isHiddenFileName = FileNameValidator .isFileHidden(name)
278- val isChangedExtension = name.substringAfterLast(DOT ) != selectedTemplate?.extension
278+ if (! hasUserInteracted) return
279279
280- binding.filenameContainer.isErrorEnabled = ! isNameValid || isHiddenFileName || isChangedExtension
281- binding.filenameContainer.error = when {
282- ! isNameValid -> errorMessage ? : getString(R .string.enter_filename)
283- isHiddenFileName -> getText(R .string.hidden_file_name_warning)
284- isChangedExtension -> getString(R .string.extension_cannot_be_changed)
285- else -> null
286- }
287-
288- positiveButton?.apply {
289- isEnabled = isNameValid && ! isHiddenFileName && ! isChangedExtension
290- isClickable = isEnabled
291- }
280+ binding.filenameContainer.isErrorEnabled = state.errorMessage != null
281+ binding.filenameContainer.error = state.errorMessage
292282 }
293283
294284 @Suppress(" LongParameterList" , " DEPRECATION" )
@@ -406,7 +396,8 @@ class ChooseTemplateDialogFragment :
406396 }
407397
408398 if (templateList.templates.isEmpty()) {
409- DisplayUtils .showSnackMessage(fragment.binding.list, R .string.error_retrieving_templates)
399+ fragment.dismiss()
400+ DisplayUtils .showSnackMessage(fragment.requireActivity(), R .string.error_retrieving_templates)
410401 return
411402 }
412403
0 commit comments