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
59 changes: 26 additions & 33 deletions AnkiDroid/src/main/java/com/ichi2/anki/dialogs/tags/TagsDialog.kt
Original file line number Diff line number Diff line change
Expand Up @@ -14,7 +14,6 @@ import android.view.View
import android.view.WindowManager
import android.widget.EditText
import android.widget.RadioGroup
import android.widget.TextView
import androidx.annotation.VisibleForTesting
import androidx.appcompat.app.AlertDialog
import androidx.appcompat.widget.SearchView
Expand All @@ -36,6 +35,7 @@ import com.ichi2.anki.R
import com.ichi2.anki.analytics.AnalyticsDialogFragment
import com.ichi2.anki.browser.IdsFile
import com.ichi2.anki.common.annotations.NeedsTest
import com.ichi2.anki.databinding.TagsDialogBinding
import com.ichi2.anki.launchCatchingTask
import com.ichi2.anki.libanki.NoteId
import com.ichi2.anki.libanki.withCollapsedWhitespace
Expand Down Expand Up @@ -80,11 +80,11 @@ class TagsDialog : AnalyticsDialogFragment {
CUSTOM_STUDY,
}

private lateinit var binding: TagsDialogBinding
private var type: DialogType? = null
private var tagsArrayAdapter: TagsArrayAdapter? = null
private var toolbarSearchView: AccessibleSearchView? = null
private var toolbarSearchItem: MenuItem? = null
private var noTagsTextView: TextView? = null
private val listener: TagsDialogListener?

private lateinit var selectedOption: CardStateFilter
Expand Down Expand Up @@ -175,7 +175,7 @@ class TagsDialog : AnalyticsDialogFragment {
"filled as prefix properly. In other dialog types, long-clicking a tag behaves like a short click.",
)
override fun onCreateDialog(savedInstanceState: Bundle?): Dialog {
val view = layoutInflater.inflate(R.layout.tags_dialog, null)
binding = TagsDialogBinding.inflate(layoutInflater)

val positiveText =
if (type == DialogType.EDIT_TAGS) {
Expand All @@ -185,46 +185,42 @@ class TagsDialog : AnalyticsDialogFragment {
}

val tagsListLayout: RecyclerView.LayoutManager = LinearLayoutManager(requireContext())
val tagsListRecyclerView =
view.findViewById<RecyclerView>(R.id.tags_dialog_tags_list).apply {
requestFocus()
layoutManager = tagsListLayout
}
val optionsGroup =
view.findViewById<RadioGroup>(R.id.tags_dialog_options_radiogroup).apply {
isVisible = type != DialogType.EDIT_TAGS && type != DialogType.CUSTOM_STUDY
for (i in 0 until childCount) {
getChildAt(i).id = i
}
check(0)
binding.tagsList.apply {
requestFocus()
layoutManager = tagsListLayout
}
binding.optionsGroup.apply {
isVisible = type != DialogType.EDIT_TAGS && type != DialogType.CUSTOM_STUDY
for (i in 0 until childCount) {
getChildAt(i).id = i
}
selectedOption = radioButtonIdToCardState(optionsGroup.checkedRadioButtonId)
optionsGroup.setOnCheckedChangeListener { _: RadioGroup?, checkedId: Int ->
check(0)
}
selectedOption = radioButtonIdToCardState(binding.optionsGroup.checkedRadioButtonId)
binding.optionsGroup.setOnCheckedChangeListener { _: RadioGroup?, checkedId: Int ->
selectedOption = radioButtonIdToCardState(checkedId)
}

adjustToolbar(view)
adjustToolbar(binding.root)

val dialog =
AlertDialog
.Builder(requireActivity())
.positiveButton(text = positiveText) { onPositiveButton() }
.negativeButton(R.string.dialog_cancel)
.customView(view = view)
.customView(view = binding.root)
.create()

lifecycleScope.launch {
val loadingContainer = view.findViewById<View>(R.id.loading_container)
val progressTextView = view.findViewById<TextView>(R.id.progress_text)
val showProgressJob =
launch {
delay(600)
withContext(Dispatchers.Main) {
loadingContainer.visibility = View.VISIBLE
binding.loadingContainer.visibility = View.VISIBLE
viewModel.initProgress
.flowWithLifecycle(lifecycle)
.onEach { progress ->
progressTextView.text =
binding.progressText.text =
when (progress) {
TagsDialogViewModel.InitProgress.Processing ->
getString(R.string.dialog_processing)
Expand All @@ -240,11 +236,10 @@ class TagsDialog : AnalyticsDialogFragment {

val tags = viewModel.tags.await()

tagsArrayAdapter = TagsArrayAdapter(tags) { view.showMaxTagSelectedNotice(tags) }
tagsListRecyclerView.adapter = tagsArrayAdapter
noTagsTextView = view.findViewById(R.id.tags_dialog_no_tags_textview)
tagsArrayAdapter = TagsArrayAdapter(tags) { binding.root.showMaxTagSelectedNotice(tags) }
binding.tagsList.adapter = tagsArrayAdapter
if (tags.isEmpty) {
noTagsTextView?.visibility = View.VISIBLE
binding.noTagsTextView.visibility = View.VISIBLE
}
tagsArrayAdapter?.tagContextAndLongClickListener =
if (type == DialogType.EDIT_TAGS) {
Expand All @@ -256,7 +251,7 @@ class TagsDialog : AnalyticsDialogFragment {
OnContextAndLongClickListener { false }
}
showProgressJob.cancel()
loadingContainer.isVisible = false
binding.loadingContainer.isVisible = false
positiveButton?.isEnabled = true
}

Expand Down Expand Up @@ -313,7 +308,7 @@ class TagsDialog : AnalyticsDialogFragment {
}

private fun adjustToolbar(tagsDialogView: View) {
val toolbar: Toolbar = tagsDialogView.findViewById(R.id.tags_dialog_toolbar)
val toolbar: Toolbar = binding.toolbar.root
val titleRes = if (type == DialogType.EDIT_TAGS) R.string.card_details_tags else R.string.studyoptions_limit_select_tags
toolbar.setTitle(titleRes)

Expand Down Expand Up @@ -411,9 +406,7 @@ class TagsDialog : AnalyticsDialogFragment {
val tag = TagsUtil.getUniformedTag(rawTag)
val feedbackText: String
if (tags.add(tag)) {
if (noTagsTextView!!.isVisible) {
noTagsTextView!!.visibility = View.GONE
}
binding.noTagsTextView.isVisible = false
tags.add(tag)
val positiveText = (dialog as? AlertDialog)?.positiveButton?.text ?: getString(R.string.dialog_ok)
feedbackText = getString(R.string.tag_editor_add_feedback, tag, positiveText)
Expand All @@ -430,7 +423,7 @@ class TagsDialog : AnalyticsDialogFragment {
}

// Show a snackbar to let the user know the tag was added successfully
dialog?.findViewById<View>(R.id.tags_dialog_snackbar)?.showSnackbar(feedbackText)
binding.tagsDialogSnackbar.showSnackbar(feedbackText)
}
}

Expand Down
14 changes: 7 additions & 7 deletions AnkiDroid/src/main/res/layout/tags_dialog.xml
Original file line number Diff line number Diff line change
Expand Up @@ -6,17 +6,17 @@
android:layout_height="match_parent">

<include layout="@layout/tags_dialog_title"
android:id="@+id/tags_dialog_toolbar"/>
<com.ichi2.ui.FixedTextView android:id="@+id/tags_dialog_no_tags_textview"
android:id="@+id/toolbar"/>
<com.ichi2.ui.FixedTextView android:id="@+id/no_tags_text_view"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_centerHorizontal="true"
android:layout_below="@id/tags_dialog_toolbar"
android:layout_below="@id/toolbar"
android:text="@string/no_tags"
android:visibility="gone"/>


<RadioGroup android:id="@+id/tags_dialog_options_radiogroup"
<RadioGroup android:id="@+id/options_group"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_centerHorizontal="true"
Expand Down Expand Up @@ -64,12 +64,12 @@
</LinearLayout>


<androidx.recyclerview.widget.RecyclerView android:id="@+id/tags_dialog_tags_list"
<androidx.recyclerview.widget.RecyclerView android:id="@+id/tags_list"
android:scrollbars="vertical"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_above="@id/tags_dialog_options_radiogroup"
android:layout_below="@id/tags_dialog_toolbar"
android:layout_above="@id/options_group"
android:layout_below="@id/toolbar"
tools:listitem="@layout/tags_item_list_dialog" />

<androidx.coordinatorlayout.widget.CoordinatorLayout
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -56,7 +56,7 @@ class TagsDialogTest : RobolectricTest() {
val dialog = f.dialog as AlertDialog?
assertThat(dialog, IsNull.notNullValue())

val recycler: RecyclerView = dialog!!.findViewById(R.id.tags_dialog_tags_list)!!
val recycler: RecyclerView = dialog!!.findViewById(R.id.tags_list)!!
val tag = "zzzz"
f.addTag(tag)

Expand Down Expand Up @@ -90,7 +90,7 @@ class TagsDialogTest : RobolectricTest() {
val dialog = f.dialog as AlertDialog?
assertThat(dialog, IsNull.notNullValue())

val recycler: RecyclerView = dialog!!.findViewById(R.id.tags_dialog_tags_list)!!
val recycler: RecyclerView = dialog!!.findViewById(R.id.tags_list)!!
val tag = "e"
f.addTag(tag)

Expand Down Expand Up @@ -126,7 +126,7 @@ class TagsDialogTest : RobolectricTest() {
val dialog = f.dialog as AlertDialog?
assertThat(dialog, IsNull.notNullValue())

val recycler: RecyclerView = dialog!!.findViewById(R.id.tags_dialog_tags_list)!!
val recycler: RecyclerView = dialog!!.findViewById(R.id.tags_list)!!

// workaround robolectric recyclerView issue
// update recycler
Expand Down Expand Up @@ -181,7 +181,7 @@ class TagsDialogTest : RobolectricTest() {
val dialog = f.dialog as AlertDialog?
assertThat(dialog, IsNull.notNullValue())

val recycler: RecyclerView = dialog!!.findViewById(R.id.tags_dialog_tags_list)!!
val recycler: RecyclerView = dialog!!.findViewById(R.id.tags_list)!!

fun getItem(index: Int): TagsArrayAdapter.ViewHolder = RecyclerViewUtils.viewHolderAt(recycler, index)

Expand Down Expand Up @@ -226,7 +226,7 @@ class TagsDialogTest : RobolectricTest() {
val dialog = f.dialog as AlertDialog?
assertThat(dialog, IsNull.notNullValue())

val recycler: RecyclerView = dialog!!.findViewById(R.id.tags_dialog_tags_list)!!
val recycler: RecyclerView = dialog!!.findViewById(R.id.tags_list)!!
val tag = "common::sport::football::small"
f.addTag(tag)

Expand Down Expand Up @@ -279,7 +279,7 @@ class TagsDialogTest : RobolectricTest() {
val dialog = f.dialog as AlertDialog?
assertThat(dialog, IsNull.notNullValue())

val recycler: RecyclerView = dialog!!.findViewById(R.id.tags_dialog_tags_list)!!
val recycler: RecyclerView = dialog!!.findViewById(R.id.tags_list)!!
val tag = "common::::careless"
f.addTag(tag)

Expand Down Expand Up @@ -328,7 +328,7 @@ class TagsDialogTest : RobolectricTest() {
val dialog = f.dialog as AlertDialog?
assertThat(dialog, IsNull.notNullValue())

val recycler: RecyclerView = dialog!!.findViewById(R.id.tags_dialog_tags_list)!!
val recycler: RecyclerView = dialog!!.findViewById(R.id.tags_list)!!
val adapter = recycler.adapter!! as TagsArrayAdapter
adapter.filter.filter("tennis")

Expand Down Expand Up @@ -368,7 +368,7 @@ class TagsDialogTest : RobolectricTest() {
val dialog = f.dialog as AlertDialog?
assertThat(dialog, IsNull.notNullValue())

val recycler: RecyclerView = dialog!!.findViewById(R.id.tags_dialog_tags_list)!!
val recycler: RecyclerView = dialog!!.findViewById(R.id.tags_list)!!

fun updateLayout() {
recycler.measure(0, 0)
Expand Down Expand Up @@ -415,7 +415,7 @@ class TagsDialogTest : RobolectricTest() {
val dialog = f.dialog as AlertDialog?
assertThat(dialog, IsNull.notNullValue())

val recycler: RecyclerView = dialog!!.findViewById(R.id.tags_dialog_tags_list)!!
val recycler: RecyclerView = dialog!!.findViewById(R.id.tags_list)!!

fun getItem(index: Int): TagsArrayAdapter.ViewHolder = RecyclerViewUtils.viewHolderAt(recycler, index)

Expand Down