Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
Expand Up @@ -55,6 +55,7 @@ import com.ichi2.ui.FixedEditText
import com.ichi2.utils.customView
import com.ichi2.utils.getInputField
import com.ichi2.utils.input
import com.ichi2.utils.moveCursorToEnd
import com.ichi2.utils.negativeButton
import com.ichi2.utils.positiveButton
import com.ichi2.utils.show
Expand Down Expand Up @@ -318,7 +319,7 @@ class NoteTypeFieldEditor : AnkiActivity(R.layout.note_type_field_editor) {
fieldNameInput?.let { fieldNameInput ->
fieldNameInput.isSingleLine = true
fieldNameInput.setText(fieldsLabels[currentPos])
fieldNameInput.setSelection(fieldNameInput.text!!.length)
fieldNameInput.moveCursorToEnd()
AlertDialog.Builder(this).show {
customView(view = fieldNameInput, paddingStart = 64, paddingEnd = 64, paddingTop = 32)
title(R.string.model_field_editor_rename)
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -19,8 +19,6 @@ package com.ichi2.anki.dialogs
import android.app.Dialog
import android.os.Bundle
import android.view.View
import android.widget.CheckBox
import android.widget.ImageButton
import androidx.activity.OnBackPressedCallback
import androidx.appcompat.app.AlertDialog
import androidx.core.os.bundleOf
Expand All @@ -30,19 +28,19 @@ import androidx.core.widget.doOnTextChanged
import androidx.fragment.app.DialogFragment
import androidx.fragment.app.viewModels
import androidx.lifecycle.lifecycleScope
import com.google.android.material.appbar.MaterialToolbar
import com.google.android.material.dialog.MaterialAlertDialogBuilder
import com.google.android.material.textfield.TextInputEditText
import com.ichi2.anki.CollectionManager.TR
import com.ichi2.anki.R
import com.ichi2.anki.StudyOptionsFragment
import com.ichi2.anki.databinding.DialogDeckDescriptionBinding
import com.ichi2.anki.dialogs.EditDeckDescriptionDialogViewModel.DismissType
import com.ichi2.anki.libanki.DeckId
import com.ichi2.anki.snackbar.showSnackbar
import com.ichi2.anki.utils.ext.dismissAllDialogFragments
import com.ichi2.utils.AndroidUiUtils.hideKeyboard
import com.ichi2.utils.AndroidUiUtils.setFocusAndOpenKeyboard
import com.ichi2.utils.create
import com.ichi2.utils.moveCursorToEnd
import com.ichi2.utils.negativeButton
import com.ichi2.utils.positiveButton
import com.ichi2.utils.show
Expand All @@ -58,36 +56,28 @@ import timber.log.Timber
class EditDeckDescriptionDialog : DialogFragment() {
private val viewModel: EditDeckDescriptionDialogViewModel by viewModels()

private lateinit var alertDialog: AlertDialog
private lateinit var dialogView: View

private val deckDescriptionInput: TextInputEditText
get() = dialogView.findViewById(R.id.deck_description_input)

private val formatAsMarkdownInput: CheckBox
get() = dialogView.findViewById(R.id.format_as_markdown)
private lateinit var binding: DialogDeckDescriptionBinding

private val toolbar: MaterialToolbar
get() = dialogView.findViewById(R.id.topAppBar)
private lateinit var alertDialog: AlertDialog

private var isKeyboardVisible: Boolean = false

private val onUnsavedChangesBackCallback =
object : OnBackPressedCallback(enabled = false) {
override fun handleOnBackPressed() {
if (isKeyboardVisible) {
deckDescriptionInput.hideKeyboard()
binding.deckDescriptionInput.hideKeyboard()
} else {
showDiscardChangesDialog()
}
}
}

override fun onCreateDialog(savedInstanceState: Bundle?): Dialog {
this.dialogView = layoutInflater.inflate(R.layout.dialog_deck_description, null)
this.binding = DialogDeckDescriptionBinding.inflate(layoutInflater)
return MaterialAlertDialogBuilder(requireContext())
.create {
setView(dialogView)
setView(binding.root)
positiveButton(R.string.save)
negativeButton(R.string.close)
}.apply {
Expand All @@ -100,7 +90,7 @@ class EditDeckDescriptionDialog : DialogFragment() {
setCancelable(false)
onBackPressedDispatcher.addCallback(this, onUnsavedChangesBackCallback)
show()
setupDialogView(dialogView)
setupDialogView(binding.root)
}
}

Expand All @@ -118,23 +108,23 @@ class EditDeckDescriptionDialog : DialogFragment() {
}

private fun setupDialogView(view: View) {
deckDescriptionInput.apply {
binding.deckDescriptionInput.apply {
doOnTextChanged { text, _, _, _ ->
viewModel.description = text?.toString() ?: ""
}
}

formatAsMarkdownInput.apply {
binding.formatAsMarkdownInput.apply {
setOnCheckedChangeListener { _, value -> viewModel.formatAsMarkdown = value }
}

// setup 'Format as Markdown' help
view.findViewById<ImageButton>(R.id.markdown_formatting_help).apply {
binding.markdownFormattingHelp.apply {
contentDescription =
getString(R.string.help_button_content_description, getString(R.string.format_deck_description_as_markdown))
setOnClickListener {
MaterialAlertDialogBuilder(requireContext()).show {
setTitle(formatAsMarkdownInput.text)
setTitle(binding.formatAsMarkdownInput.text)
setIcon(R.drawable.ic_help_black_24dp)
// FIXME: the upstream string unexpectedly contains newlines
setMessage(TR.deckConfigDescriptionNewHandlingHint().replace("\n", " ").replace(" ", " "))
Expand Down Expand Up @@ -166,22 +156,24 @@ class EditDeckDescriptionDialog : DialogFragment() {

lifecycleScope.launch {
viewModel.flowOfDescription.collect { desc ->
if (desc == deckDescriptionInput.text.toString()) return@collect
deckDescriptionInput.setText(desc)
if (desc == binding.deckDescriptionInput.text.toString()) return@collect
binding.deckDescriptionInput.setText(desc)
}
}

lifecycleScope.launch {
viewModel.flowOfFormatAsMarkdown.collect {
formatAsMarkdownInput.isChecked = it
binding.formatAsMarkdownInput.isChecked = it
}
}

lifecycleScope.launch {
viewModel.flowOfInitCompleted.collect {
if (!it) return@collect
toolbar.title = viewModel.windowTitle
setFocusAndOpenKeyboard(deckDescriptionInput) { deckDescriptionInput.setSelection(deckDescriptionInput.text!!.length) }
binding.toolbar.title = viewModel.windowTitle
setFocusAndOpenKeyboard(binding.deckDescriptionInput) {
binding.deckDescriptionInput.moveCursorToEnd()
}
}
}

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -33,6 +33,7 @@ import com.google.android.material.textfield.TextInputEditText
import com.ichi2.anki.Flag
import com.ichi2.anki.R
import com.ichi2.anki.utils.ext.findViewById
import com.ichi2.utils.moveCursorToEnd
import kotlinx.coroutines.CoroutineScope
import kotlinx.coroutines.launch

Expand Down Expand Up @@ -85,7 +86,7 @@ class FlagAdapter(
holder.flagNameViewLayout.visibility = View.GONE
holder.flagNameEditLayout.visibility = View.VISIBLE
holder.flagNameEdit.requestFocus()
holder.flagNameEdit.text?.let { text -> holder.flagNameEdit.setSelection(text.length) }
holder.flagNameEdit.moveCursorToEnd()
val inputMethodManager = holder.flagNameEdit.context.getSystemService(Context.INPUT_METHOD_SERVICE) as InputMethodManager
inputMethodManager.showSoftInput(holder.flagNameEdit, InputMethodManager.SHOW_IMPLICIT)
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -47,6 +47,7 @@ import com.ichi2.utils.TagsUtil
import com.ichi2.utils.customView
import com.ichi2.utils.getInputField
import com.ichi2.utils.input
import com.ichi2.utils.moveCursorToEnd
import com.ichi2.utils.negativeButton
import com.ichi2.utils.positiveButton
import com.ichi2.utils.show
Expand Down Expand Up @@ -398,7 +399,7 @@ class TagsDialog : AnalyticsDialogFragment {
// utilize the addTagFilter to append '::' properly by appending a space to prefixTag
inputET.setText("$prefixTag ")
}
inputET.setSelection(inputET.text.length)
inputET.moveCursorToEnd()
addTagDialog.show()
}

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -39,6 +39,7 @@ import com.ichi2.anki.libanki.getNotetypeNames
import com.ichi2.anki.libanki.getStockNotetype
import com.ichi2.anki.withProgress
import com.ichi2.utils.customView
import com.ichi2.utils.moveCursorToEnd
import com.ichi2.utils.negativeButton
import com.ichi2.utils.positiveButton

Expand Down Expand Up @@ -119,7 +120,7 @@ class AddNewNotesType(
) {
val selectedNotetype = optionsToDisplay[index]
nameInput.setText(randomizeName(selectedNotetype.name))
nameInput.setSelection(nameInput.text.length)
nameInput.moveCursorToEnd()
}

override fun onNothingSelected(widget: AdapterView<*>?) {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -21,11 +21,11 @@ import android.util.AttributeSet
import android.view.View
import android.widget.EditText
import com.ichi2.utils.AndroidUiUtils.setFocusAndOpenKeyboard
import com.ichi2.utils.moveCursorToEnd

interface AutoFocusable {
fun autoFocusAndMoveCursorToEnd(editText: EditText) {
// focus EditText and place cursor at the end of text
setFocusAndOpenKeyboard(editText) { editText.setSelection(editText.text.length) }
setFocusAndOpenKeyboard(editText) { editText.moveCursorToEnd() }
}
}

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -25,6 +25,7 @@ import android.widget.Button
import android.widget.LinearLayout
import com.ichi2.anki.R
import com.ichi2.anki.common.utils.annotation.KotlinCleanup
import com.ichi2.utils.moveCursorToEnd

// TODO Tracked in https://github.com/ankidroid/Anki-Android/issues/5019 : use IncrementerNumberRangePreferenceCompat
@Suppress("deprecation", "OVERRIDE_DEPRECATION")
Expand Down Expand Up @@ -128,6 +129,6 @@ class IncrementerNumberRangePreference : NumberRangePreference {
// Make sure value is within range
lastValidEntry = super.getValidatedRangeFromInt(value)
editText.setText(lastValidEntry.toString())
editText.setSelection(editText.text.length)
editText.moveCursorToEnd()
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -26,6 +26,7 @@ import android.widget.Button
import android.widget.EditText
import android.widget.LinearLayout
import com.ichi2.anki.R
import com.ichi2.utils.moveCursorToEnd

/** Marker class to be used in preferences */
class IncrementerNumberRangePreferenceCompat :
Expand Down Expand Up @@ -131,7 +132,7 @@ class IncrementerNumberRangePreferenceCompat :
// Make sure value is within range
lastValidEntry = numberRangePreference.getValidatedRangeFromInt(value)
editText.setText(lastValidEntry.toString())
editText.setSelection(editText.text.length)
editText.moveCursorToEnd()
}
}

Expand Down
4 changes: 2 additions & 2 deletions AnkiDroid/src/main/res/layout/dialog_deck_description.xml
Original file line number Diff line number Diff line change
Expand Up @@ -24,7 +24,7 @@
>

<com.google.android.material.appbar.MaterialToolbar
android:id="@+id/topAppBar"
android:id="@+id/toolbar"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:minHeight="?attr/actionBarSize"
Expand Down Expand Up @@ -68,7 +68,7 @@
android:layout_marginEnd="10dp">

<CheckBox
android:id="@+id/format_as_markdown"
android:id="@+id/format_as_markdown_input"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_weight="1"
Expand Down