feat: list searching

This commit is contained in:
rebelonion 2024-05-10 22:02:30 -05:00
parent e1a865c973
commit 988e4def64
6 changed files with 117 additions and 12 deletions

View file

@ -69,6 +69,7 @@ class CalendarActivity : AppCompatActivity() {
binding.listTitle.setText(R.string.release_calendar) binding.listTitle.setText(R.string.release_calendar)
binding.listSort.visibility = View.GONE binding.listSort.visibility = View.GONE
binding.random.visibility = View.GONE binding.random.visibility = View.GONE
binding.search.visibility = View.GONE
binding.listTabLayout.addOnTabSelectedListener(object : TabLayout.OnTabSelectedListener { binding.listTabLayout.addOnTabSelectedListener(object : TabLayout.OnTabSelectedListener {
override fun onTabSelected(tab: TabLayout.Tab?) { override fun onTabSelected(tab: TabLayout.Tab?) {
this@CalendarActivity.selectedTabIdx = tab?.position ?: 1 this@CalendarActivity.selectedTabIdx = tab?.position ?: 1

View file

@ -302,7 +302,7 @@ class SelectorDialogFragment : BottomSheetDialogFragment() {
} catch (e: Exception) { } catch (e: Exception) {
Injekt.get<CrashlyticsInterface>().logException(e) Injekt.get<CrashlyticsInterface>().logException(e)
Logger.log(e) Logger.log(e)
toast("Error starting video") toast("Error starting video: ${e.message}")
dismiss() dismiss()
} }
} }

View file

@ -4,11 +4,14 @@ import android.os.Bundle
import android.view.View import android.view.View
import android.view.ViewGroup import android.view.ViewGroup
import android.view.Window import android.view.Window
import android.view.inputmethod.InputMethodManager
import androidx.activity.viewModels import androidx.activity.viewModels
import androidx.appcompat.app.AppCompatActivity import androidx.appcompat.app.AppCompatActivity
import androidx.appcompat.widget.PopupMenu import androidx.appcompat.widget.PopupMenu
import androidx.core.content.ContextCompat import androidx.core.content.ContextCompat
import androidx.core.view.isVisible
import androidx.core.view.updateLayoutParams import androidx.core.view.updateLayoutParams
import androidx.core.widget.addTextChangedListener
import androidx.lifecycle.MutableLiveData import androidx.lifecycle.MutableLiveData
import androidx.lifecycle.lifecycleScope import androidx.lifecycle.lifecycleScope
import ani.dantotsu.R import ani.dantotsu.R
@ -26,6 +29,7 @@ import kotlinx.coroutines.Dispatchers
import kotlinx.coroutines.launch import kotlinx.coroutines.launch
import kotlinx.coroutines.withContext import kotlinx.coroutines.withContext
class ListActivity : AppCompatActivity() { class ListActivity : AppCompatActivity() {
private lateinit var binding: ActivityListBinding private lateinit var binding: ActivityListBinding
private val scope = lifecycleScope private val scope = lifecycleScope
@ -177,5 +181,28 @@ class ListActivity : AppCompatActivity() {
supportFragmentManager.findFragmentByTag("f" + currentTab?.position.toString()) as? ListFragment supportFragmentManager.findFragmentByTag("f" + currentTab?.position.toString()) as? ListFragment
currentFragment?.randomOptionClick() currentFragment?.randomOptionClick()
} }
binding.search.setOnClickListener {
toggleSearchView(binding.searchView.isVisible)
if (!binding.searchView.isVisible) {
model.unfilterLists()
}
}
binding.searchViewText.addTextChangedListener {
model.searchLists(binding.searchViewText.text.toString())
}
}
private fun toggleSearchView(isVisible: Boolean) {
if (isVisible) {
binding.searchView.visibility = View.GONE
binding.searchViewText.text.clear()
} else {
binding.searchView.visibility = View.VISIBLE
binding.searchViewText.requestFocus()
val imm = getSystemService(INPUT_METHOD_SERVICE) as InputMethodManager
imm.showSoftInput(binding.searchViewText, InputMethodManager.SHOW_IMPLICIT)
}
} }
} }

View file

@ -38,4 +38,30 @@ class ListViewModel : ViewModel() {
lists.postValue(filteredLists) lists.postValue(filteredLists)
} }
fun searchLists(search: String) {
if (search.isEmpty()) {
lists.postValue(unfilteredLists.value)
return
}
val currentLists = unfilteredLists.value ?: return
val filteredLists = currentLists.mapValues { entry ->
entry.value.filter { media ->
media.name?.contains(
search,
ignoreCase = true
) == true || media.synonyms.any { it.contains(search, ignoreCase = true) } ||
media.nameRomaji.contains(
search,
ignoreCase = true
)
} as ArrayList<Media>
}.toMutableMap()
lists.postValue(filteredLists)
}
fun unfilterLists() {
lists.postValue(unfilteredLists.value)
}
} }

View file

@ -86,7 +86,7 @@
android:layout_height="match_parent" android:layout_height="match_parent"
android:layout_gravity="bottom" android:layout_gravity="bottom"
android:layout_weight="1" android:layout_weight="1"
android:visibility="gone"></FrameLayout> android:visibility="gone"/>
<com.google.android.material.textfield.TextInputLayout <com.google.android.material.textfield.TextInputLayout
android:id="@+id/searchView" android:id="@+id/searchView"

View file

@ -34,8 +34,8 @@
<TextView <TextView
android:id="@+id/listTitle" android:id="@+id/listTitle"
android:layout_width="0dp" android:layout_width="0dp"
android:layout_height="48dp" android:layout_height="40dp"
android:layout_marginStart="32dp" android:layout_marginStart="16dp"
android:layout_weight="1" android:layout_weight="1"
android:ellipsize="end" android:ellipsize="end"
android:fontFamily="@font/poppins_bold" android:fontFamily="@font/poppins_bold"
@ -43,13 +43,22 @@
android:singleLine="true" android:singleLine="true"
android:textAppearance="@style/TextAppearance.Widget.AppCompat.Toolbar.Title" android:textAppearance="@style/TextAppearance.Widget.AppCompat.Toolbar.Title"
android:textColor="?attr/colorOnBackground" android:textColor="?attr/colorOnBackground"
android:textSize="16sp" android:textSize="14sp"
tools:text="@string/app_name" /> tools:text="@string/app_name" />
<ImageButton
android:id="@+id/search"
android:layout_width="40dp"
android:layout_height="40dp"
android:background="?android:attr/selectableItemBackground"
android:contentDescription="@string/search"
app:srcCompat="@drawable/ic_round_search_24"
app:tint="?attr/colorOnBackground" />
<ImageButton <ImageButton
android:id="@+id/random" android:id="@+id/random"
android:layout_width="48dp" android:layout_width="40dp"
android:layout_height="48dp" android:layout_height="40dp"
android:background="?android:attr/selectableItemBackground" android:background="?android:attr/selectableItemBackground"
android:contentDescription="@string/random_selection" android:contentDescription="@string/random_selection"
app:srcCompat="@drawable/ic_shuffle_24" app:srcCompat="@drawable/ic_shuffle_24"
@ -57,8 +66,8 @@
<ImageButton <ImageButton
android:id="@+id/filter" android:id="@+id/filter"
android:layout_width="48dp" android:layout_width="40dp"
android:layout_height="48dp" android:layout_height="40dp"
android:background="?android:attr/selectableItemBackground" android:background="?android:attr/selectableItemBackground"
android:contentDescription="@string/filter" android:contentDescription="@string/filter"
app:srcCompat="@drawable/ic_round_filter_alt_24" app:srcCompat="@drawable/ic_round_filter_alt_24"
@ -66,15 +75,57 @@
<ImageButton <ImageButton
android:id="@+id/listSort" android:id="@+id/listSort"
android:layout_width="48dp" android:layout_width="40dp"
android:layout_height="48dp" android:layout_height="40dp"
android:layout_marginEnd="8dp" android:layout_marginEnd="4dp"
android:background="?android:attr/selectableItemBackground" android:background="?android:attr/selectableItemBackground"
android:contentDescription="@string/sort_by" android:contentDescription="@string/sort_by"
app:srcCompat="@drawable/ic_round_sort_24" app:srcCompat="@drawable/ic_round_sort_24"
app:tint="?attr/colorOnBackground" /> app:tint="?attr/colorOnBackground" />
</LinearLayout> </LinearLayout>
<com.google.android.material.textfield.TextInputLayout
android:id="@+id/searchView"
style="@style/Widget.MaterialComponents.TextInputLayout.OutlinedBox.ExposedDropdownMenu"
android:layout_width="match_parent"
android:layout_height="56dp"
android:layout_gravity="bottom"
android:layout_marginStart="16dp"
android:layout_marginEnd="16dp"
android:transitionName="@string/search"
app:boxBackgroundColor="?android:attr/colorBackground"
app:hintTextColor="?attr/colorOnBackground"
app:boxStrokeColor="?attr/colorOnBackground"
app:cursorColor="?attr/colorOnBackground"
app:boxBackgroundMode="outline"
app:boxCornerRadiusBottomEnd="28dp"
app:boxCornerRadiusBottomStart="28dp"
app:boxCornerRadiusTopEnd="28dp"
app:boxCornerRadiusTopStart="28dp"
app:endIconDrawable="@drawable/ic_round_search_24"
app:endIconTint="?attr/colorOnBackground"
android:visibility="gone"
tools:visibility="visible"
app:hintAnimationEnabled="true">
<AutoCompleteTextView
android:id="@+id/searchViewText"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_gravity="bottom"
android:layout_marginBottom="8dp"
android:layout_weight="1"
android:fontFamily="@font/poppins_bold"
android:hint="@string/search"
android:imeOptions="actionSearch"
android:inputType="textPersonName"
android:padding="8dp"
android:paddingBottom="4dp"
android:selectAllOnFocus="true"
android:textSize="14sp"
tools:ignore="LabelFor,TextContrastCheck" />
</com.google.android.material.textfield.TextInputLayout>
</LinearLayout> </LinearLayout>
<com.google.android.material.tabs.TabLayout <com.google.android.material.tabs.TabLayout