diff --git a/app/src/main/java/ani/dantotsu/media/SearchAdapter.kt b/app/src/main/java/ani/dantotsu/media/SearchAdapter.kt index 2bfec418..f79a01f0 100644 --- a/app/src/main/java/ani/dantotsu/media/SearchAdapter.kt +++ b/app/src/main/java/ani/dantotsu/media/SearchAdapter.kt @@ -13,9 +13,10 @@ import android.view.animation.AlphaAnimation import android.view.animation.Animation import android.view.inputmethod.EditorInfo import android.view.inputmethod.InputMethodManager +import android.widget.ImageView +import android.widget.PopupMenu import androidx.appcompat.app.AppCompatActivity import androidx.appcompat.content.res.AppCompatResources -import androidx.core.content.ContextCompat.startActivity import androidx.recyclerview.widget.LinearLayoutManager import androidx.recyclerview.widget.RecyclerView import androidx.recyclerview.widget.RecyclerView.HORIZONTAL @@ -44,6 +45,18 @@ class SearchAdapter(private val activity: SearchActivity, private val type: Stri private lateinit var searchHistoryAdapter: SearchHistoryAdapter private lateinit var binding: ItemSearchHeaderBinding + private fun updateFilterTextViewDrawable() { + val filterDrawable = when (activity.result.sort) { + Anilist.sortBy[0] -> R.drawable.ic_round_area_chart_24 + Anilist.sortBy[1] -> R.drawable.ic_round_filter_peak_24 + Anilist.sortBy[2] -> R.drawable.ic_round_star_graph_24 + Anilist.sortBy[3] -> R.drawable.ic_round_filter_list_24 + Anilist.sortBy[4] -> R.drawable.ic_round_filter_list_24_reverse + Anilist.sortBy[5] -> R.drawable.ic_round_assist_walker_24 + else -> R.drawable.ic_round_filter_alt_24 + } + binding.filterTextView.setCompoundDrawablesWithIntrinsicBounds(filterDrawable, 0, 0, 0) + } override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): SearchHeaderViewHolder { val binding = ItemSearchHeaderBinding.inflate(LayoutInflater.from(parent.context), parent, false) @@ -92,7 +105,7 @@ class SearchAdapter(private val activity: SearchActivity, private val type: Stri binding.searchAdultCheck.isChecked = adult binding.searchList.isChecked = listOnly == true - binding.searchChipRecycler.adapter = SearchChipAdapter(activity).also { + binding.searchChipRecycler.adapter = SearchChipAdapter(activity, this).also { activity.updateChips = { it.update() } } @@ -102,6 +115,47 @@ class SearchAdapter(private val activity: SearchActivity, private val type: Stri binding.searchFilter.setOnClickListener { SearchFilterBottomDialog.newInstance().show(activity.supportFragmentManager, "dialog") } + binding.searchFilter.setOnLongClickListener { + val popupMenu = PopupMenu(activity, binding.searchFilter) + popupMenu.menuInflater.inflate(R.menu.sortby_filter_menu, popupMenu.menu) + popupMenu.setOnMenuItemClickListener { item -> + when (item.itemId) { + R.id.sort_by_score -> { + activity.result.sort = Anilist.sortBy[0] + activity.updateChips.invoke() + updateFilterTextViewDrawable() + } + R.id.sort_by_popular -> { + activity.result.sort = Anilist.sortBy[1] + activity.updateChips.invoke() + updateFilterTextViewDrawable() + } + R.id.sort_by_trending -> { + activity.result.sort = Anilist.sortBy[2] + activity.updateChips.invoke() + updateFilterTextViewDrawable() + } + R.id.sort_by_a_z -> { + activity.result.sort = Anilist.sortBy[3] + activity.updateChips.invoke() + updateFilterTextViewDrawable() + } + R.id.sort_by_z_a -> { + activity.result.sort = Anilist.sortBy[4] + activity.updateChips.invoke() + updateFilterTextViewDrawable() + } + R.id.sort_by_pure_pain -> { + activity.result.sort = Anilist.sortBy[5] + activity.updateChips.invoke() + updateFilterTextViewDrawable() + } + } + true + } + popupMenu.show() + true + } binding.searchByImage.setOnClickListener { activity.startActivity(Intent(activity, ImageSearchActivity::class.java)) } @@ -256,7 +310,7 @@ class SearchAdapter(private val activity: SearchActivity, private val type: Stri } - class SearchChipAdapter(val activity: SearchActivity) : + class SearchChipAdapter(val activity: SearchActivity, private val searchAdapter: SearchAdapter) : RecyclerView.Adapter() { private var chips = activity.result.toChipList() @@ -278,6 +332,7 @@ class SearchAdapter(private val activity: SearchActivity, private val type: Stri activity.result.removeChip(chip) update() activity.search() + searchAdapter.updateFilterTextViewDrawable() } } } @@ -286,6 +341,7 @@ class SearchAdapter(private val activity: SearchActivity, private val type: Stri fun update() { chips = activity.result.toChipList() notifyDataSetChanged() + searchAdapter.updateFilterTextViewDrawable() } override fun getItemCount(): Int = chips.size diff --git a/app/src/main/java/ani/dantotsu/media/SearchFilterBottomDialog.kt b/app/src/main/java/ani/dantotsu/media/SearchFilterBottomDialog.kt index 297f8289..7fab29ed 100644 --- a/app/src/main/java/ani/dantotsu/media/SearchFilterBottomDialog.kt +++ b/app/src/main/java/ani/dantotsu/media/SearchFilterBottomDialog.kt @@ -1,11 +1,15 @@ package ani.dantotsu.media +import android.animation.ObjectAnimator import android.os.Bundle import android.view.LayoutInflater import android.view.View import android.view.View.GONE import android.view.ViewGroup +import android.view.animation.AccelerateDecelerateInterpolator +import android.view.animation.AnimationUtils import android.widget.ArrayAdapter +import android.widget.PopupMenu import androidx.recyclerview.widget.GridLayoutManager import androidx.recyclerview.widget.LinearLayoutManager import androidx.recyclerview.widget.RecyclerView @@ -24,6 +28,7 @@ class SearchFilterBottomDialog : BottomSheetDialogFragment() { private val binding get() = _binding!! private lateinit var activity: SearchActivity + private var selectedCountry: String? = null override fun onCreateView( inflater: LayoutInflater, @@ -38,6 +43,29 @@ class SearchFilterBottomDialog : BottomSheetDialogFragment() { private var exGenres = mutableListOf() private var selectedTags = mutableListOf() private var exTags = mutableListOf() + private fun updateChips() { + binding.searchFilterGenres.adapter?.notifyDataSetChanged() + binding.searchFilterTags.adapter?.notifyDataSetChanged() + } + + private fun startBounceZoomAnimation(view: View? = null) { + val targetView = view ?: binding.sortByFilter + val bounceZoomAnimation = AnimationUtils.loadAnimation(requireContext(), R.anim.bounce_zoom) + targetView.startAnimation(bounceZoomAnimation) + } + + private fun setSortByFilterImage() { + val filterDrawable = when (activity.result.sort) { + Anilist.sortBy[0] -> R.drawable.ic_round_area_chart_24 + Anilist.sortBy[1] -> R.drawable.ic_round_filter_peak_24 + Anilist.sortBy[2] -> R.drawable.ic_round_star_graph_24 + Anilist.sortBy[3] -> R.drawable.ic_round_filter_list_24 + Anilist.sortBy[4] -> R.drawable.ic_round_filter_list_24_reverse + Anilist.sortBy[5] -> R.drawable.ic_round_assist_walker_24 + else -> R.drawable.ic_round_filter_alt_24 + } + binding.sortByFilter.setImageResource(filterDrawable) + } override fun onViewCreated(view: View, savedInstanceState: Bundle?) { @@ -47,14 +75,121 @@ class SearchFilterBottomDialog : BottomSheetDialogFragment() { exGenres = activity.result.excludedGenres ?: mutableListOf() selectedTags = activity.result.tags ?: mutableListOf() exTags = activity.result.excludedTags ?: mutableListOf() + setSortByFilterImage() + + binding.resetSearchFilter.setOnClickListener { + activity.result.sort = null + binding.sortByFilter.setImageResource(R.drawable.ic_round_filter_alt_24) + startBounceZoomAnimation(binding.sortByFilter) + + selectedCountry = null + binding.countryFilter.setImageResource(R.drawable.ic_round_globe_search_googlefonts) + startBounceZoomAnimation(binding.countryFilter) + + val rotateAnimation = ObjectAnimator.ofFloat(binding.resetSearchFilter, "rotation", 180f, 540f) + rotateAnimation.duration = 500 + rotateAnimation.interpolator = AccelerateDecelerateInterpolator() + rotateAnimation.start() + + selectedGenres.clear() + exGenres.clear() + selectedTags.clear() + exTags.clear() + + binding.searchStatus.setText("") + binding.searchFormat.setText("") + binding.searchSeason.setText("") + binding.searchYear.setText("") + binding.searchStatus.clearFocus() + binding.searchFormat.clearFocus() + binding.searchSeason.clearFocus() + binding.searchYear.clearFocus() + updateChips() + } + + binding.sortByFilter.setOnClickListener { view -> + val popupMenu = PopupMenu(requireContext(), view) + popupMenu.menuInflater.inflate(R.menu.sortby_filter_menu, popupMenu.menu) + popupMenu.setOnMenuItemClickListener { menuItem -> + when (menuItem.itemId) { + R.id.sort_by_score -> { + activity.result.sort = Anilist.sortBy[0] + binding.sortByFilter.setImageResource(R.drawable.ic_round_area_chart_24) + startBounceZoomAnimation() + } + + R.id.sort_by_popular -> { + activity.result.sort = Anilist.sortBy[1] + binding.sortByFilter.setImageResource(R.drawable.ic_round_filter_peak_24) + startBounceZoomAnimation() + } + + R.id.sort_by_trending -> { + activity.result.sort = Anilist.sortBy[2] + binding.sortByFilter.setImageResource(R.drawable.ic_round_star_graph_24) + startBounceZoomAnimation() + } + + R.id.sort_by_a_z -> { + activity.result.sort = Anilist.sortBy[3] + binding.sortByFilter.setImageResource(R.drawable.ic_round_filter_list_24) + startBounceZoomAnimation() + } + + R.id.sort_by_z_a -> { + activity.result.sort = Anilist.sortBy[4] + binding.sortByFilter.setImageResource(R.drawable.ic_round_filter_list_24_reverse) + startBounceZoomAnimation() + } + + R.id.sort_by_pure_pain -> { + activity.result.sort = Anilist.sortBy[5] + binding.sortByFilter.setImageResource(R.drawable.ic_round_assist_walker_24) + startBounceZoomAnimation() + } + } + true + } + popupMenu.show() + } + + binding.countryFilter.setOnClickListener { view -> + val popupMenu = PopupMenu(requireContext(), view) + popupMenu.menuInflater.inflate(R.menu.country_filter_menu, popupMenu.menu) + popupMenu.setOnMenuItemClickListener { menuItem -> + when (menuItem.itemId) { + R.id.country_china -> { + selectedCountry = "China" + binding.countryFilter.setImageResource(R.drawable.ic_round_globe_china_googlefonts) + startBounceZoomAnimation(binding.countryFilter) + } + R.id.country_south_korea -> { + selectedCountry = "South Korea" + binding.countryFilter.setImageResource(R.drawable.ic_round_globe_south_korea_googlefonts) + startBounceZoomAnimation(binding.countryFilter) + } + R.id.country_japan -> { + selectedCountry = "Japan" + binding.countryFilter.setImageResource(R.drawable.ic_round_globe_japan_googlefonts) + startBounceZoomAnimation(binding.countryFilter) + } + R.id.country_taiwan -> { + selectedCountry = "Taiwan" + binding.countryFilter.setImageResource(R.drawable.ic_round_globe_taiwan_googlefonts) + startBounceZoomAnimation(binding.countryFilter) + } + } + true + } + popupMenu.show() + } binding.searchFilterApply.setOnClickListener { activity.result.apply { format = binding.searchFormat.text.toString().ifBlank { null } - sort = binding.searchSortBy.text.toString().ifBlank { null } - ?.let { Anilist.sortBy[resources.getStringArray(R.array.sort_by).indexOf(it)] } season = binding.searchSeason.text.toString().ifBlank { null } seasonYear = binding.searchYear.text.toString().toIntOrNull() + sort = activity.result.sort genres = selectedGenres tags = selectedTags excludedGenres = exGenres @@ -68,17 +203,6 @@ class SearchFilterBottomDialog : BottomSheetDialogFragment() { dismiss() } - binding.searchSortBy.setText(activity.result.sort?.let { - resources.getStringArray(R.array.sort_by)[Anilist.sortBy.indexOf(it)] - }) - binding.searchSortBy.setAdapter( - ArrayAdapter( - binding.root.context, - R.layout.item_dropdown, - resources.getStringArray(R.array.sort_by) - ) - ) - binding.searchFormat.setText(activity.result.format) binding.searchFormat.setAdapter( ArrayAdapter( diff --git a/app/src/main/java/ani/dantotsu/profile/ProfileFragment.kt b/app/src/main/java/ani/dantotsu/profile/ProfileFragment.kt index 980c70c5..388b4297 100644 --- a/app/src/main/java/ani/dantotsu/profile/ProfileFragment.kt +++ b/app/src/main/java/ani/dantotsu/profile/ProfileFragment.kt @@ -151,22 +151,23 @@ class ProfileFragment : Fragment() { private fun setFavPeople() { if (favStaff.isEmpty()) { binding.profileFavStaffContainer.visibility = View.GONE + } else { + binding.profileFavStaffRecycler.adapter = AuthorAdapter(favStaff) + binding.profileFavStaffRecycler.layoutManager = LinearLayoutManager( + activity, LinearLayoutManager.HORIZONTAL, false + ) + binding.profileFavStaffRecycler.layoutAnimation = LayoutAnimationController(setSlideIn(), 0.25f) } - binding.profileFavStaffRecycler.adapter = AuthorAdapter(favStaff) - binding.profileFavStaffRecycler.layoutManager = LinearLayoutManager( - activity, - LinearLayoutManager.HORIZONTAL, - false - ) + if (favCharacter.isEmpty()) { binding.profileFavCharactersContainer.visibility = View.GONE + } else { + binding.profileFavCharactersRecycler.adapter = CharacterAdapter(favCharacter) + binding.profileFavCharactersRecycler.layoutManager = LinearLayoutManager( + activity, LinearLayoutManager.HORIZONTAL, false + ) + binding.profileFavCharactersRecycler.layoutAnimation = LayoutAnimationController(setSlideIn(), 0.25f) } - binding.profileFavCharactersRecycler.adapter = CharacterAdapter(favCharacter) - binding.profileFavCharactersRecycler.layoutManager = LinearLayoutManager( - activity, - LinearLayoutManager.HORIZONTAL, - false - ) } private fun initRecyclerView( diff --git a/app/src/main/res/drawable/ic_round_area_chart_24.xml b/app/src/main/res/drawable/ic_round_area_chart_24.xml new file mode 100644 index 00000000..b1d6f78c --- /dev/null +++ b/app/src/main/res/drawable/ic_round_area_chart_24.xml @@ -0,0 +1,12 @@ + + + + + diff --git a/app/src/main/res/drawable/ic_round_assist_walker_24.xml b/app/src/main/res/drawable/ic_round_assist_walker_24.xml new file mode 100644 index 00000000..0d38faeb --- /dev/null +++ b/app/src/main/res/drawable/ic_round_assist_walker_24.xml @@ -0,0 +1,16 @@ + + + + + + + diff --git a/app/src/main/res/drawable/ic_round_early_bird_special.xml b/app/src/main/res/drawable/ic_round_early_bird_special.xml deleted file mode 100644 index 4aa4292f..00000000 --- a/app/src/main/res/drawable/ic_round_early_bird_special.xml +++ /dev/null @@ -1,16 +0,0 @@ - - - - - - - diff --git a/app/src/main/res/drawable/ic_round_filter_list_24.xml b/app/src/main/res/drawable/ic_round_filter_list_24.xml new file mode 100644 index 00000000..e3dc45c1 --- /dev/null +++ b/app/src/main/res/drawable/ic_round_filter_list_24.xml @@ -0,0 +1,12 @@ + + + + + diff --git a/app/src/main/res/drawable/ic_round_filter_list_24_reverse.xml b/app/src/main/res/drawable/ic_round_filter_list_24_reverse.xml new file mode 100644 index 00000000..ac200103 --- /dev/null +++ b/app/src/main/res/drawable/ic_round_filter_list_24_reverse.xml @@ -0,0 +1,12 @@ + + + + + diff --git a/app/src/main/res/drawable/ic_round_filter_peak_24.xml b/app/src/main/res/drawable/ic_round_filter_peak_24.xml new file mode 100644 index 00000000..061d0ec0 --- /dev/null +++ b/app/src/main/res/drawable/ic_round_filter_peak_24.xml @@ -0,0 +1,12 @@ + + + + + diff --git a/app/src/main/res/drawable/ic_round_globe_china_googlefonts.xml b/app/src/main/res/drawable/ic_round_globe_china_googlefonts.xml new file mode 100644 index 00000000..1a36e8f6 --- /dev/null +++ b/app/src/main/res/drawable/ic_round_globe_china_googlefonts.xml @@ -0,0 +1,9 @@ + + + diff --git a/app/src/main/res/drawable/ic_round_globe_japan_googlefonts.xml b/app/src/main/res/drawable/ic_round_globe_japan_googlefonts.xml new file mode 100644 index 00000000..24803edd --- /dev/null +++ b/app/src/main/res/drawable/ic_round_globe_japan_googlefonts.xml @@ -0,0 +1,9 @@ + + + diff --git a/app/src/main/res/drawable/ic_round_globe_off_googlefonts.xml b/app/src/main/res/drawable/ic_round_globe_off_googlefonts.xml new file mode 100644 index 00000000..f37e99cd --- /dev/null +++ b/app/src/main/res/drawable/ic_round_globe_off_googlefonts.xml @@ -0,0 +1,9 @@ + + + diff --git a/app/src/main/res/drawable/ic_round_globe_search_googlefonts.xml b/app/src/main/res/drawable/ic_round_globe_search_googlefonts.xml new file mode 100644 index 00000000..97b82b0e --- /dev/null +++ b/app/src/main/res/drawable/ic_round_globe_search_googlefonts.xml @@ -0,0 +1,9 @@ + + + diff --git a/app/src/main/res/drawable/ic_round_globe_south_korea_googlefonts.xml b/app/src/main/res/drawable/ic_round_globe_south_korea_googlefonts.xml new file mode 100644 index 00000000..dff31e26 --- /dev/null +++ b/app/src/main/res/drawable/ic_round_globe_south_korea_googlefonts.xml @@ -0,0 +1,9 @@ + + + diff --git a/app/src/main/res/drawable/ic_round_globe_taiwan_googlefonts.xml b/app/src/main/res/drawable/ic_round_globe_taiwan_googlefonts.xml new file mode 100644 index 00000000..52052789 --- /dev/null +++ b/app/src/main/res/drawable/ic_round_globe_taiwan_googlefonts.xml @@ -0,0 +1,9 @@ + + + diff --git a/app/src/main/res/drawable/ic_round_reset_star_24.xml b/app/src/main/res/drawable/ic_round_reset_star_24.xml new file mode 100644 index 00000000..00830a3e --- /dev/null +++ b/app/src/main/res/drawable/ic_round_reset_star_24.xml @@ -0,0 +1,32 @@ + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/drawable/ic_round_star_graph_24.xml b/app/src/main/res/drawable/ic_round_star_graph_24.xml new file mode 100644 index 00000000..590f5f18 --- /dev/null +++ b/app/src/main/res/drawable/ic_round_star_graph_24.xml @@ -0,0 +1,12 @@ + + + + + diff --git a/app/src/main/res/layout/activity_player_settings.xml b/app/src/main/res/layout/activity_player_settings.xml index d9486c31..d188b0d5 100644 --- a/app/src/main/res/layout/activity_player_settings.xml +++ b/app/src/main/res/layout/activity_player_settings.xml @@ -711,7 +711,7 @@ android:layout_height="wrap_content" android:layout_marginBottom="8dp" android:checked="false" - android:drawableStart="@drawable/ic_round_early_bird_special" + android:drawableStart="@drawable/ic_round_assist_walker_24" android:drawablePadding="16dp" android:elegantTextHeight="true" android:fontFamily="@font/poppins_bold" diff --git a/app/src/main/res/layout/activity_reader_settings.xml b/app/src/main/res/layout/activity_reader_settings.xml index 160adfdf..e4944d35 100644 --- a/app/src/main/res/layout/activity_reader_settings.xml +++ b/app/src/main/res/layout/activity_reader_settings.xml @@ -1318,7 +1318,7 @@ android:layout_height="wrap_content" android:layout_marginBottom="8dp" android:checked="false" - android:drawableStart="@drawable/ic_round_early_bird_special" + android:drawableStart="@drawable/ic_round_assist_walker_24" android:drawablePadding="16dp" android:elegantTextHeight="true" android:fontFamily="@font/poppins_bold" diff --git a/app/src/main/res/layout/bottom_sheet_search_filter.xml b/app/src/main/res/layout/bottom_sheet_search_filter.xml index 8ca02366..92d524df 100644 --- a/app/src/main/res/layout/bottom_sheet_search_filter.xml +++ b/app/src/main/res/layout/bottom_sheet_search_filter.xml @@ -11,17 +11,59 @@ android:layout_height="wrap_content" android:orientation="vertical"> - + android:layout_marginTop="17dp" + android:layout_marginBottom="10dp" + android:orientation="horizontal"> + + + + + + + + + - + + - + + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/menu/sortby_filter_menu.xml b/app/src/main/res/menu/sortby_filter_menu.xml new file mode 100644 index 00000000..e10752d7 --- /dev/null +++ b/app/src/main/res/menu/sortby_filter_menu.xml @@ -0,0 +1,21 @@ + + + + + + + + + \ No newline at end of file