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 @@ -51,12 +51,20 @@ class DetailExploreResultViewModel

if (filterGenres.value?.isNotEmpty() == true) appliedFilters.add(GENRES_LABEL)
if (filterIsNovelCompleted.value != null) appliedFilters.add(NOVEL_COMPLETED_LABEL)
appliedFilters.add(RATING_LABEL)
if (isRatingFilterApplied()) appliedFilters.add(RATING_LABEL)
if (filterKeywordIds.value?.isNotEmpty() == true) appliedFilters.add(KEYWORDS_LABEL)

_appliedFiltersMessage.value = appliedFilters.joinToString(FILTER_SEPARATOR)
}

private fun isRatingFilterApplied(): Boolean {
val ratingStart = filterRatingStart.value ?: DetailExploreFilteredModel.RATING_MIN_DEFAULT
val ratingEnd = filterRatingEnd.value ?: DetailExploreFilteredModel.RATING_MAX_DEFAULT

return ratingStart > DetailExploreFilteredModel.RATING_MIN_DEFAULT ||
ratingEnd < DetailExploreFilteredModel.RATING_MAX_DEFAULT
}

fun updatePreviousSearchFilteredValue(detailExploreFilteredModel: DetailExploreFilteredModel) {
filterGenres.value = detailExploreFilteredModel.genres
filterIsNovelCompleted.value = detailExploreFilteredModel.isCompleted
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -17,12 +17,17 @@ import com.into.websoso.core.common.util.SingleEventHandler
import com.into.websoso.core.common.util.tracker.Tracker
import com.into.websoso.core.resource.R.string.novel_inquire_link
import com.into.websoso.databinding.ActivityNormalExploreBinding
import com.into.websoso.ui.detailExplore.info.model.Genre
import com.into.websoso.ui.detailExploreResult.DetailExploreResultActivity
import com.into.websoso.ui.detailExploreResult.model.DetailExploreFilteredModel
import com.into.websoso.ui.main.explore.adapter.SosoPickAdapter
import com.into.websoso.ui.normalExplore.adapter.GenreSearchAdapter
import com.into.websoso.ui.normalExplore.adapter.NormalExploreAdapter
import com.into.websoso.ui.normalExplore.adapter.NormalExploreItemType.Header
import com.into.websoso.ui.normalExplore.adapter.NormalExploreItemType.Loading
import com.into.websoso.ui.normalExplore.adapter.NormalExploreItemType.Novels
import com.into.websoso.ui.normalExplore.adapter.RecentSearchAdapter
import com.into.websoso.ui.normalExplore.model.GenreSearchModel
import com.into.websoso.ui.normalExplore.model.NormalExploreUiState
import com.into.websoso.ui.novelDetail.NovelDetailActivity
import dagger.hilt.android.AndroidEntryPoint
Expand All @@ -45,6 +50,9 @@ class NormalExploreActivity : BaseActivity<ActivityNormalExploreBinding>(activit
normalExploreViewModel::deleteRecentSearch,
)
}
private val genreSearchAdapter: GenreSearchAdapter by lazy {
GenreSearchAdapter(::navigateToDetailExploreResult)
}
private val sosoPickAdapter: SosoPickAdapter by lazy { SosoPickAdapter(::navigateToNovelDetailFromSosoPick) }
private val normalExploreViewModel: NormalExploreViewModel by viewModels()
private val singleEventHandler: SingleEventHandler by lazy { SingleEventHandler.from() }
Expand Down Expand Up @@ -78,6 +86,8 @@ class NormalExploreActivity : BaseActivity<ActivityNormalExploreBinding>(activit
}
rvNormalExploreSosoPick.adapter = sosoPickAdapter
rvNormalExploreRecentSearch.adapter = recentSearchAdapter
rvNormalExploreGenreSearch.adapter = genreSearchAdapter
genreSearchAdapter.submitList(GenreSearchModel.items)
onClick = onNormalExploreButtonClick()
}
}
Expand Down Expand Up @@ -164,6 +174,18 @@ class NormalExploreActivity : BaseActivity<ActivityNormalExploreBinding>(activit
)
}

private fun navigateToDetailExploreResult(genre: Genre) {
singleEventHandler.throttleFirst {
val intent = DetailExploreResultActivity.getIntent(
context = this,
detailExploreFilteredModel = DetailExploreFilteredModel(
genres = listOf(genre),
),
)
startActivity(intent)
}
}

private fun navigateToNovelDetail(novelId: Long) {
singleEventHandler.throttleFirst {
val intent = NovelDetailActivity.getIntent(this, novelId)
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,73 @@
package com.into.websoso.ui.normalExplore.adapter

import android.view.LayoutInflater
import android.view.ViewGroup
import androidx.recyclerview.widget.DiffUtil
import androidx.recyclerview.widget.ListAdapter
import androidx.recyclerview.widget.RecyclerView
import com.into.websoso.databinding.ItemNormalExploreGenreSearchBinding
import com.into.websoso.ui.detailExplore.info.model.Genre
import com.into.websoso.ui.normalExplore.model.GenreSearchModel

class GenreSearchAdapter(
private val genreClickListener: (genre: Genre) -> Unit,
) : ListAdapter<GenreSearchModel, GenreSearchAdapter.GenreSearchViewHolder>(diffCallBack) {
override fun onCreateViewHolder(
parent: ViewGroup,
viewType: Int,
): GenreSearchViewHolder =
GenreSearchViewHolder.from(
parent = parent,
genreClickListener = genreClickListener,
)

override fun onBindViewHolder(
holder: GenreSearchViewHolder,
position: Int,
) {
holder.bind(getItem(position))
}

class GenreSearchViewHolder(
private val binding: ItemNormalExploreGenreSearchBinding,
private val genreClickListener: (genre: Genre) -> Unit,
) : RecyclerView.ViewHolder(binding.root) {
fun bind(genreSearch: GenreSearchModel) {
binding.genreSearch = genreSearch
binding.ivNormalExploreGenreSearchIcon.setImageResource(genreSearch.drawableRes)
binding.root.setOnClickListener {
genreClickListener(genreSearch.genre)
}
binding.executePendingBindings()
}

companion object {
fun from(
parent: ViewGroup,
genreClickListener: (genre: Genre) -> Unit,
): GenreSearchViewHolder =
GenreSearchViewHolder(
ItemNormalExploreGenreSearchBinding.inflate(
LayoutInflater.from(parent.context),
parent,
false,
),
genreClickListener,
)
}
}

companion object {
private val diffCallBack = object : DiffUtil.ItemCallback<GenreSearchModel>() {
override fun areItemsTheSame(
oldItem: GenreSearchModel,
newItem: GenreSearchModel,
): Boolean = oldItem.genre == newItem.genre

override fun areContentsTheSame(
oldItem: GenreSearchModel,
newItem: GenreSearchModel,
): Boolean = oldItem == newItem
}
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,33 @@
package com.into.websoso.ui.normalExplore.model

import com.into.websoso.core.resource.R.drawable.ic_onboarding_bl
import com.into.websoso.core.resource.R.drawable.ic_onboarding_drama
import com.into.websoso.core.resource.R.drawable.ic_onboarding_fantasy
import com.into.websoso.core.resource.R.drawable.ic_onboarding_light_novel
import com.into.websoso.core.resource.R.drawable.ic_onboarding_modern_fantasy
import com.into.websoso.core.resource.R.drawable.ic_onboarding_mystery
import com.into.websoso.core.resource.R.drawable.ic_onboarding_romance
import com.into.websoso.core.resource.R.drawable.ic_onboarding_romance_fantasy
import com.into.websoso.core.resource.R.drawable.ic_onboarding_wuxia
import com.into.websoso.ui.detailExplore.info.model.Genre

data class GenreSearchModel(
val genre: Genre,
val drawableRes: Int,
) {
val title: String get() = genre.titleKr

companion object {
val items: List<GenreSearchModel> = listOf(
GenreSearchModel(Genre.MODERN_FANTASY, ic_onboarding_modern_fantasy),
GenreSearchModel(Genre.ROMANCE_FANTASY, ic_onboarding_romance_fantasy),
GenreSearchModel(Genre.ROMANCE, ic_onboarding_romance),
GenreSearchModel(Genre.FANTASY, ic_onboarding_fantasy),
GenreSearchModel(Genre.WUXIA, ic_onboarding_wuxia),
GenreSearchModel(Genre.BOYS_LOVE, ic_onboarding_bl),
GenreSearchModel(Genre.LIGHT_NOVEL, ic_onboarding_light_novel),
GenreSearchModel(Genre.DRAMA, ic_onboarding_drama),
GenreSearchModel(Genre.MYSTERY, ic_onboarding_mystery),
)
}
}
56 changes: 54 additions & 2 deletions app/src/main/res/layout/activity_normal_explore.xml
Original file line number Diff line number Diff line change
Expand Up @@ -182,7 +182,7 @@
</androidx.constraintlayout.widget.ConstraintLayout>

<androidx.constraintlayout.widget.ConstraintLayout
android:id="@+id/cl_normal_explore_soso_pick_section"
android:id="@+id/cl_normal_explore_genre_search_section"
isVisible="@{normalExploreViewModel.isSosoPickVisible}"
android:layout_width="0dp"
android:layout_height="wrap_content"
Expand All @@ -191,12 +191,64 @@
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toBottomOf="@id/cl_normal_explore_recent_search_section">

<TextView
android:id="@+id/tv_normal_explore_genre_search_title"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginStart="16dp"
android:layout_marginTop="32dp"
android:text="@string/normal_explore_genre_search_title"
android:textAppearance="@style/title2"
android:textColor="@color/black"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toTopOf="parent" />

<ImageView
android:id="@+id/iv_normal_explore_genre_search_navigate"
android:layout_width="16dp"
android:layout_height="16dp"
android:layout_marginStart="3dp"
android:contentDescription="@null"
android:src="@drawable/ic_navigate_right"
app:layout_constraintBottom_toBottomOf="@id/tv_normal_explore_genre_search_title"
app:layout_constraintStart_toEndOf="@id/tv_normal_explore_genre_search_title"
app:layout_constraintTop_toTopOf="@id/tv_normal_explore_genre_search_title"
app:tint="@color/black" />

<androidx.recyclerview.widget.RecyclerView
android:id="@+id/rv_normal_explore_genre_search"
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_marginTop="12dp"
android:clipToPadding="false"
android:orientation="horizontal"
android:overScrollMode="never"
android:paddingStart="16dp"
android:paddingEnd="16dp"
app:layoutManager="androidx.recyclerview.widget.LinearLayoutManager"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toBottomOf="@id/tv_normal_explore_genre_search_title"
tools:listitem="@layout/item_normal_explore_genre_search" />
</androidx.constraintlayout.widget.ConstraintLayout>

<androidx.constraintlayout.widget.ConstraintLayout
android:id="@+id/cl_normal_explore_soso_pick_section"
isVisible="@{normalExploreViewModel.isSosoPickVisible}"
android:layout_width="0dp"
android:layout_height="wrap_content"
android:visibility="gone"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toBottomOf="@id/cl_normal_explore_genre_search_section">

<TextView
android:id="@+id/tv_normal_explore_soso_title"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginStart="20dp"
android:layout_marginTop="24dp"
android:layout_marginTop="32dp"
android:text="@string/explore_soso"
android:textAppearance="@style/title1"
android:textColor="@color/black"
Expand Down
45 changes: 45 additions & 0 deletions app/src/main/res/layout/item_normal_explore_genre_search.xml
Original file line number Diff line number Diff line change
@@ -0,0 +1,45 @@
<?xml version="1.0" encoding="utf-8"?>
<layout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools">

<data>

<variable
name="genreSearch"
type="com.into.websoso.ui.normalExplore.model.GenreSearchModel" />
</data>

<LinearLayout
android:id="@+id/ll_normal_explore_genre_search"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginEnd="10dp"
android:gravity="center"
android:minWidth="44dp"
android:orientation="vertical">

<FrameLayout
android:id="@+id/fl_normal_explore_genre_search_icon_container"
android:layout_width="44dp"
android:layout_height="44dp">

<ImageView
android:id="@+id/iv_normal_explore_genre_search_icon"
android:layout_width="32dp"
android:layout_height="32dp"
android:layout_gravity="center"
android:contentDescription="@null"
tools:src="@drawable/ic_onboarding_modern_fantasy" />
</FrameLayout>

<TextView
android:id="@+id/tv_normal_explore_genre_search_title"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginTop="3dp"
android:text="@{genreSearch.title}"
android:textAppearance="@style/body3"
android:textColor="@color/gray_300_52515F"
tools:text="현판" />
</LinearLayout>
</layout>
1 change: 1 addition & 0 deletions core/resource/src/main/res/values/strings.xml
Original file line number Diff line number Diff line change
Expand Up @@ -20,6 +20,7 @@
<string name="normal_explore_result_inquire">찾는 작품이 없다면?</string>
<string name="normal_explore_recent_search_title">최근 검색어</string>
<string name="normal_explore_recent_search_delete_all">전체삭제</string>
<string name="normal_explore_genre_search_title">장르별 검색</string>

<!-- 탐색 뷰 -->
<string name="explore_normal_search_hint">작품 제목, 작가를 검색하세요</string>
Expand Down
Loading