From 3992a0734010ccd8efd75957a00e0934c25dec01 Mon Sep 17 00:00:00 2001 From: tom5079 Date: Wed, 3 Jul 2019 19:40:19 +0900 Subject: [PATCH] Search algorithm improved Language settings in default tag fixed --- app/build.gradle | 2 +- .../main/java/xyz/quaver/pupil/types/Tags.kt | 4 +- .../java/xyz/quaver/pupil/ui/MainActivity.kt | 162 +++++++++++------- .../xyz/quaver/pupil/ui/SettingsActivity.kt | 4 +- .../res/layout/item_selector_suggestion.xml | 34 ++++ .../main/java/xyz/quaver/hitomi/results.kt | 31 ++-- 6 files changed, 152 insertions(+), 85 deletions(-) create mode 100644 app/src/main/res/layout/item_selector_suggestion.xml diff --git a/app/build.gradle b/app/build.gradle index 9b1f14c2..db1cf65d 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -14,7 +14,7 @@ android { minSdkVersion 16 targetSdkVersion 29 versionCode 20 - versionName "2.11.1" + versionName "2.12" testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner" multiDexEnabled true vectorDrawables.useSupportLibrary = true diff --git a/app/src/main/java/xyz/quaver/pupil/types/Tags.kt b/app/src/main/java/xyz/quaver/pupil/types/Tags.kt index 70d0a119..4d784f1e 100644 --- a/app/src/main/java/xyz/quaver/pupil/types/Tags.kt +++ b/app/src/main/java/xyz/quaver/pupil/types/Tags.kt @@ -90,8 +90,8 @@ class Tags(tag: List?) : ArrayList() { } } - fun removeByArea(area: String) { - filter { it.area == area }.forEach { + fun removeByArea(area: String, isNegative: Boolean? = null) { + filter { it.area == area && (if(isNegative == null) true else (it.isNegative == isNegative)) }.forEach { remove(it) } } diff --git a/app/src/main/java/xyz/quaver/pupil/ui/MainActivity.kt b/app/src/main/java/xyz/quaver/pupil/ui/MainActivity.kt index 084020b1..cfdf076d 100644 --- a/app/src/main/java/xyz/quaver/pupil/ui/MainActivity.kt +++ b/app/src/main/java/xyz/quaver/pupil/ui/MainActivity.kt @@ -17,6 +17,7 @@ import android.widget.TextView import androidx.appcompat.app.AlertDialog import androidx.appcompat.app.AppCompatActivity import androidx.cardview.widget.CardView +import androidx.constraintlayout.widget.ConstraintLayout import androidx.core.app.ActivityCompat import androidx.core.content.ContextCompat import androidx.core.content.res.ResourcesCompat @@ -45,6 +46,7 @@ import xyz.quaver.pupil.BuildConfig import xyz.quaver.pupil.Pupil import xyz.quaver.pupil.R import xyz.quaver.pupil.adapters.GalleryBlockAdapter +import xyz.quaver.pupil.types.SelectorSuggestion import xyz.quaver.pupil.types.Tag import xyz.quaver.pupil.types.TagSuggestion import xyz.quaver.pupil.types.Tags @@ -755,7 +757,7 @@ class MainActivity : AppCompatActivity() { if (query.isEmpty() or query.endsWith(' ')) { swapSuggestions(json.parse(serializer, favoritesFile.readText()).map { TagSuggestion(it.tag, -1, "", it.area ?: "tag") - }) + } + SelectorSuggestion()) return@setOnQueryChangeListener } @@ -782,83 +784,115 @@ class MainActivity : AppCompatActivity() { } setOnBindSuggestionCallback { suggestionView, leftIcon, textView, item, _ -> - val suggestion = item as TagSuggestion - val tag = "${suggestion.n}:${suggestion.s.replace(Regex("\\s"), "_")}" + if (item is SelectorSuggestion) { + var hasSelector = false - leftIcon.setImageDrawable( - ResourcesCompat.getDrawable( - resources, - when(suggestion.n) { - "female" -> R.drawable.ic_gender_female - "male" -> R.drawable.ic_gender_male - "language" -> R.drawable.ic_translate - "group" -> R.drawable.ic_account_group - "character" -> R.drawable.ic_account_star - "series" -> R.drawable.ic_book_open - "artist" -> R.drawable.ic_brush - else -> R.drawable.ic_tag - }, - null) - ) - - with(suggestionView.findViewById(R.id.right_icon)) { - - if (Tags(json.parse(serializer, favoritesFile.readText())).contains(tag)) - setImageResource(R.drawable.ic_star_filled) - else - setImageResource(R.drawable.ic_star_empty) - - visibility = View.VISIBLE - rotation = 0f - isEnabled = true - - setColorFilter(ContextCompat.getColor(context, R.color.material_orange_500)) - - isClickable = true - setOnClickListener { - val favorites = Tags(json.parse(serializer, favoritesFile.readText())) - - if (favorites.contains(tag)) { - setImageResource(R.drawable.ic_star_empty) - favorites.remove(tag) + with(suggestionView as LinearLayout) { + for (i in 0 until childCount) { + val child = getChildAt(i) + if (child is ConstraintLayout) { + child.visibility = View.VISIBLE + hasSelector = true + } + else + child.visibility = View.GONE } - else { - setImageDrawable(AnimatedVectorDrawableCompat.create(context, - R.drawable.avd_star - )) - (drawable as Animatable).start() - - favorites.add(tag) - } - - favoritesFile.writeText(json.stringify(favorites)) } - } - if (suggestion.t == -1) { - textView.text = suggestion.s - } else { - val text = "${suggestion.s}\n ${suggestion.t}" + if (!hasSelector) { + val view = LayoutInflater.from(context) + .inflate(R.layout.item_selector_suggestion, suggestionView, false) - val len = text.length - val left = suggestion.s.length + suggestionView.addView(view) + } + } else if(item is TagSuggestion) { + with(suggestionView as LinearLayout) { + for (i in 0 until childCount) { + val child = getChildAt(i) + if (child is ConstraintLayout) { + child.visibility = View.GONE + } + else + child.visibility = View.VISIBLE + } + } + val tag = "${item.n}:${item.s.replace(Regex("\\s"), "_")}" - textView.text = SpannableString(text).apply { - val s = AlignmentSpan.Standard(Layout.Alignment.ALIGN_OPPOSITE) - setSpan(s, left, len, Spannable.SPAN_EXCLUSIVE_EXCLUSIVE) - setSpan(SetLineOverlap(true), 1, len-2, Spannable.SPAN_EXCLUSIVE_EXCLUSIVE) - setSpan(SetLineOverlap(false), len-1, len, Spannable.SPAN_EXCLUSIVE_EXCLUSIVE) + leftIcon.setImageDrawable( + ResourcesCompat.getDrawable( + resources, + when(item.n) { + "female" -> R.drawable.ic_gender_female + "male" -> R.drawable.ic_gender_male + "language" -> R.drawable.ic_translate + "group" -> R.drawable.ic_account_group + "character" -> R.drawable.ic_account_star + "series" -> R.drawable.ic_book_open + "artist" -> R.drawable.ic_brush + else -> R.drawable.ic_tag + }, + null) + ) + + with(suggestionView.findViewById(R.id.right_icon)) { + + if (Tags(json.parse(serializer, favoritesFile.readText())).contains(tag)) + setImageResource(R.drawable.ic_star_filled) + else + setImageResource(R.drawable.ic_star_empty) + + rotation = 0f + isEnabled = true + + setColorFilter(ContextCompat.getColor(context, R.color.material_orange_500)) + + isClickable = true + setOnClickListener { + val favorites = Tags(json.parse(serializer, favoritesFile.readText())) + + if (favorites.contains(tag)) { + setImageResource(R.drawable.ic_star_empty) + favorites.remove(tag) + } + else { + setImageDrawable(AnimatedVectorDrawableCompat.create(context, + R.drawable.avd_star + )) + (drawable as Animatable).start() + + favorites.add(tag) + } + + favoritesFile.writeText(json.stringify(favorites)) + } + } + + if (item.t == -1) { + textView.text = item.s + } else { + val text = "${item.s}\n ${item.t}" + + val len = text.length + val left = item.s.length + + textView.text = SpannableString(text).apply { + val s = AlignmentSpan.Standard(Layout.Alignment.ALIGN_OPPOSITE) + setSpan(s, left, len, Spannable.SPAN_EXCLUSIVE_EXCLUSIVE) + setSpan(SetLineOverlap(true), 1, len-2, Spannable.SPAN_EXCLUSIVE_EXCLUSIVE) + setSpan(SetLineOverlap(false), len-1, len, Spannable.SPAN_EXCLUSIVE_EXCLUSIVE) + } } } } setOnSearchListener(object : FloatingSearchView.OnSearchListener { override fun onSuggestionClicked(searchSuggestion: SearchSuggestion?) { - val suggestion = searchSuggestion as TagSuggestion + if (searchSuggestion !is TagSuggestion) + return with(searchInputView.text) { delete(if (lastIndexOf(' ') == -1) 0 else lastIndexOf(' ')+1, length) - append("${suggestion.n}:${suggestion.s.replace(Regex("\\s"), "_")} ") + append("${searchSuggestion.n}:${searchSuggestion.s.replace(Regex("\\s"), "_")} ") } } @@ -872,7 +906,7 @@ class MainActivity : AppCompatActivity() { if (query.isEmpty() or query.endsWith(' ')) swapSuggestions(json.parse(serializer, favoritesFile.readText()).map { TagSuggestion(it.tag, -1, "", it.area ?: "tag") - }) + } + SelectorSuggestion()) } override fun onFocusCleared() { diff --git a/app/src/main/java/xyz/quaver/pupil/ui/SettingsActivity.kt b/app/src/main/java/xyz/quaver/pupil/ui/SettingsActivity.kt index e4229365..ea0d9f8c 100644 --- a/app/src/main/java/xyz/quaver/pupil/ui/SettingsActivity.kt +++ b/app/src/main/java/xyz/quaver/pupil/ui/SettingsActivity.kt @@ -222,14 +222,14 @@ class SettingsActivity : AppCompatActivity() { addAll(languages.values) } ) - if (tags.any { it.area == "language" }) { + if (tags.any { it.area == "language" && !it.isNegative }) { val tag = languages[tags.first { it.area == "language" }.tag] if (tag != null) { setSelection( @Suppress("UNCHECKED_CAST") (adapter as ArrayAdapter).getPosition(tag) ) - tags.removeByArea("language") + tags.removeByArea("language", false) } } } diff --git a/app/src/main/res/layout/item_selector_suggestion.xml b/app/src/main/res/layout/item_selector_suggestion.xml new file mode 100644 index 00000000..144792cb --- /dev/null +++ b/app/src/main/res/layout/item_selector_suggestion.xml @@ -0,0 +1,34 @@ + + + + + + + +