Search layout tweaks
This commit is contained in:
1 parent
08e45db49d
commit
4475d4d018
2 files changed
+83
-141
No files matched your search
@@ -15,103 +15,72 @@
|
||||
*/
|
||||
package com.hippo.ehviewer.widget
|
||||
|
||||
import com.hippo.easyrecyclerview.EasyRecyclerView
|
||||
import com.google.android.material.tabs.TabLayout.OnTabSelectedListener
|
||||
import android.view.LayoutInflater
|
||||
import com.google.android.material.chip.ChipGroup
|
||||
import com.hippo.widget.RadioGridGroup
|
||||
import com.google.android.material.tabs.TabLayout
|
||||
import androidx.recyclerview.widget.LinearLayoutManager
|
||||
import android.annotation.SuppressLint
|
||||
import android.content.Context
|
||||
import android.content.SharedPreferences
|
||||
import android.net.Uri
|
||||
import android.os.Bundle
|
||||
import androidx.recyclerview.widget.DefaultItemAnimator
|
||||
import com.hippo.ehviewer.R
|
||||
import com.hippo.easyrecyclerview.MarginItemDecoration
|
||||
import android.view.ViewGroup
|
||||
import android.util.SparseArray
|
||||
import android.os.Parcelable
|
||||
import android.util.AttributeSet
|
||||
import android.view.LayoutInflater
|
||||
import android.view.View
|
||||
import android.view.ViewGroup
|
||||
import android.widget.*
|
||||
import kotlin.Throws
|
||||
import com.hippo.ehviewer.client.exception.EhException
|
||||
import com.hippo.ehviewer.client.data.ListUrlBuilder
|
||||
import com.google.android.material.dialog.MaterialAlertDialogBuilder
|
||||
import androidx.annotation.IntDef
|
||||
import androidx.core.content.edit
|
||||
import androidx.preference.PreferenceManager
|
||||
import androidx.recyclerview.widget.DefaultItemAnimator
|
||||
import androidx.recyclerview.widget.LinearLayoutManager
|
||||
import com.google.android.material.chip.Chip
|
||||
import com.google.android.material.chip.ChipGroup
|
||||
import com.google.android.material.dialog.MaterialAlertDialogBuilder
|
||||
import com.google.android.material.switchmaterial.SwitchMaterial
|
||||
import com.google.android.material.tabs.TabLayout
|
||||
import com.google.android.material.tabs.TabLayout.OnTabSelectedListener
|
||||
import com.hippo.easyrecyclerview.EasyRecyclerView
|
||||
import com.hippo.easyrecyclerview.MarginItemDecoration
|
||||
import com.hippo.easyrecyclerview.SimpleHolder
|
||||
import com.hippo.ehviewer.R
|
||||
import com.hippo.ehviewer.client.EhConfig
|
||||
import com.hippo.ehviewer.client.data.ListUrlBuilder
|
||||
import com.hippo.ehviewer.client.exception.EhException
|
||||
import com.hippo.widget.RadioGridGroup
|
||||
import com.hippo.yorozuya.NumberUtils
|
||||
import com.hippo.yorozuya.ViewUtils
|
||||
import java.lang.IndexOutOfBoundsException
|
||||
|
||||
class SearchLayout : EasyRecyclerView, CompoundButton.OnCheckedChangeListener, View.OnClickListener,
|
||||
@SuppressLint("InflateParams")
|
||||
class SearchLayout @JvmOverloads constructor(
|
||||
context: Context, attrs: AttributeSet? = null
|
||||
) : EasyRecyclerView(context, attrs), CompoundButton.OnCheckedChangeListener, View.OnClickListener,
|
||||
ImageSearchLayout.Helper, OnTabSelectedListener {
|
||||
|
||||
private val mInflater : LayoutInflater
|
||||
private val mSharePref : SharedPreferences
|
||||
|
||||
@SearchMode
|
||||
private var mSearchMode = SEARCH_MODE_NORMAL
|
||||
private var mEnableAdvance = false
|
||||
private var mNormalView: View? = null
|
||||
private var mNormalSearchMode: RadioGridGroup? = null
|
||||
private var mNormalSearchModeHelp: ImageView? = null
|
||||
private var mEnableAdvanceSwitch: Switch? = null
|
||||
private var mAdvanceView: View? = null
|
||||
private var mTableAdvanceSearch: AdvanceSearchTable? = null
|
||||
private var mImageView: ImageSearchLayout? = null
|
||||
private var mActionView: View? = null
|
||||
private var mAction: TabLayout? = null
|
||||
private var mLayoutManager: LinearLayoutManager? = null
|
||||
private var mAdapter: SearchAdapter? = null
|
||||
private var mCategoryGroup: ChipGroup
|
||||
private var mNormalView: View
|
||||
private var mNormalSearchMode: RadioGridGroup
|
||||
private var mNormalSearchModeHelp: ImageView
|
||||
private var mEnableAdvanceSwitch: SwitchMaterial
|
||||
private var mAdvanceView: View
|
||||
private var mTableAdvanceSearch: AdvanceSearchTable
|
||||
private var mImageView: ImageSearchLayout
|
||||
private var mActionView: View
|
||||
private var mAction: TabLayout
|
||||
private var mAdapter: SearchAdapter
|
||||
private var mHelper: Helper? = null
|
||||
private val mSharePref: SharedPreferences
|
||||
private val mInflater: LayoutInflater
|
||||
|
||||
private val mCategoryTable : ArrayList<Pair<Int, Int>> = arrayListOf(
|
||||
Pair(EhConfig.DOUJINSHI, R.string.doujinshi),
|
||||
Pair(EhConfig.MANGA, R.string.manga),
|
||||
Pair(EhConfig.ARTIST_CG, R.string.artist_cg),
|
||||
Pair(EhConfig.GAME_CG, R.string.game_cg),
|
||||
Pair(EhConfig.WESTERN, R.string.western),
|
||||
Pair(EhConfig.NON_H, R.string.non_h),
|
||||
Pair(EhConfig.IMAGE_SET, R.string.image_set),
|
||||
Pair(EhConfig.COSPLAY, R.string.cosplay),
|
||||
Pair(EhConfig.ASIAN_PORN, R.string.asian_porn),
|
||||
Pair(EhConfig.MISC, R.string.misc)
|
||||
)
|
||||
|
||||
constructor(context: Context, attrs: AttributeSet?) : super(context, attrs) {
|
||||
init {
|
||||
mSharePref = PreferenceManager.getDefaultSharedPreferences(context)
|
||||
mInflater = LayoutInflater.from(context)
|
||||
init(context)
|
||||
}
|
||||
|
||||
constructor(context: Context, attrs: AttributeSet?, defStyle: Int) : super(
|
||||
context,
|
||||
attrs,
|
||||
defStyle
|
||||
) {
|
||||
mSharePref = PreferenceManager.getDefaultSharedPreferences(context)
|
||||
mInflater = LayoutInflater.from(context)
|
||||
init(context)
|
||||
}
|
||||
|
||||
@SuppressLint("InflateParams")
|
||||
private fun init(context: Context) {
|
||||
val resources = context.resources
|
||||
mLayoutManager = SearchLayoutManager(context)
|
||||
layoutManager = SearchLayoutManager(context)
|
||||
mAdapter = SearchAdapter()
|
||||
mAdapter!!.setHasStableIds(true)
|
||||
layoutManager = mLayoutManager
|
||||
mAdapter.setHasStableIds(true)
|
||||
adapter = mAdapter
|
||||
setHasFixedSize(true)
|
||||
clipToPadding = false
|
||||
(itemAnimator as DefaultItemAnimator?)!!.supportsChangeAnimations = false
|
||||
(itemAnimator as DefaultItemAnimator?)?.supportsChangeAnimations = false
|
||||
val interval = resources.getDimensionPixelOffset(R.dimen.search_layout_interval)
|
||||
val paddingH = resources.getDimensionPixelOffset(R.dimen.search_layout_margin_h)
|
||||
val paddingV = resources.getDimensionPixelOffset(R.dimen.search_layout_margin_v)
|
||||
@@ -120,13 +89,10 @@ class SearchLayout : EasyRecyclerView, CompoundButton.OnCheckedChangeListener, V
|
||||
)
|
||||
addItemDecoration(decoration)
|
||||
decoration.applyPaddings(this)
|
||||
|
||||
// Create normal view
|
||||
val normalView = mInflater.inflate(R.layout.search_normal, null)
|
||||
mNormalView = normalView
|
||||
mNormalView = mInflater.inflate(R.layout.search_normal, null)
|
||||
val mCategoryStored = mSharePref.getInt(SEARCH_CATEGORY_PREF, EhConfig.ALL_CATEGORY)
|
||||
|
||||
val mCategoryGroup = normalView.findViewById(R.id.search_category_chipgroup) as ChipGroup
|
||||
mCategoryGroup = mNormalView.findViewById(R.id.search_category_chipgroup)
|
||||
for (mPair in mCategoryTable) {
|
||||
val mChip = IdentifiedChip(context)
|
||||
mChip.isCheckable = true
|
||||
@@ -142,46 +108,44 @@ class SearchLayout : EasyRecyclerView, CompoundButton.OnCheckedChangeListener, V
|
||||
}
|
||||
mSharePref.edit { putInt(SEARCH_CATEGORY_PREF, mCategory) }
|
||||
}
|
||||
|
||||
mNormalSearchMode = normalView.findViewById(R.id.normal_search_mode)
|
||||
mNormalSearchModeHelp = normalView.findViewById(R.id.normal_search_mode_help)
|
||||
mEnableAdvanceSwitch = normalView.findViewById(R.id.search_enable_advance)
|
||||
mNormalSearchModeHelp!!.setOnClickListener(this)
|
||||
mEnableAdvanceSwitch!!.setOnCheckedChangeListener(this)
|
||||
mEnableAdvanceSwitch!!.switchPadding = resources.getDimensionPixelSize(R.dimen.switch_padding)
|
||||
|
||||
mNormalSearchMode = mNormalView.findViewById(R.id.normal_search_mode)
|
||||
mNormalSearchModeHelp = mNormalView.findViewById(R.id.normal_search_mode_help)
|
||||
mEnableAdvanceSwitch = mNormalView.findViewById(R.id.search_enable_advance)
|
||||
mNormalSearchModeHelp.setOnClickListener(this)
|
||||
mEnableAdvanceSwitch.setOnCheckedChangeListener(this)
|
||||
mEnableAdvanceSwitch.switchPadding =
|
||||
resources.getDimensionPixelSize(R.dimen.switch_padding)
|
||||
// Create advance view
|
||||
mAdvanceView = mInflater.inflate(R.layout.search_advance, null)
|
||||
mTableAdvanceSearch = mAdvanceView!!.findViewById(R.id.search_advance_search_table)
|
||||
|
||||
mTableAdvanceSearch = mAdvanceView.findViewById(R.id.search_advance_search_table)
|
||||
// Create image view
|
||||
mImageView = mInflater.inflate(R.layout.search_image, null) as ImageSearchLayout
|
||||
mImageView!!.setHelper(this)
|
||||
|
||||
mImageView.setHelper(this)
|
||||
// Create action view
|
||||
mActionView = mInflater.inflate(R.layout.search_action, null)
|
||||
mActionView!!.layoutParams = LayoutParams(
|
||||
mActionView.layoutParams = LayoutParams(
|
||||
ViewGroup.LayoutParams.MATCH_PARENT,
|
||||
ViewGroup.LayoutParams.WRAP_CONTENT
|
||||
)
|
||||
mAction = mActionView!!.findViewById(R.id.action)
|
||||
mAction!!.addOnTabSelectedListener(this)
|
||||
mAction = mActionView.findViewById(R.id.action)
|
||||
mAction.addOnTabSelectedListener(this)
|
||||
}
|
||||
|
||||
|
||||
fun setHelper(helper: Helper?) {
|
||||
mHelper = helper
|
||||
}
|
||||
|
||||
fun scrollSearchContainerToTop() {
|
||||
mLayoutManager!!.scrollToPositionWithOffset(0, 0)
|
||||
(layoutManager as LinearLayoutManager).scrollToPositionWithOffset(0, 0)
|
||||
}
|
||||
|
||||
fun setImageUri(imageUri: Uri?) {
|
||||
mImageView!!.setImageUri(imageUri)
|
||||
mImageView.setImageUri(imageUri)
|
||||
}
|
||||
|
||||
fun setNormalSearchMode(id: Int) {
|
||||
mNormalSearchMode!!.check(id)
|
||||
mNormalSearchMode.check(id)
|
||||
}
|
||||
|
||||
override fun onSelectImage() {
|
||||
@@ -190,47 +154,15 @@ class SearchLayout : EasyRecyclerView, CompoundButton.OnCheckedChangeListener, V
|
||||
}
|
||||
}
|
||||
|
||||
override fun dispatchSaveInstanceState(container: SparseArray<Parcelable>) {
|
||||
super.dispatchSaveInstanceState(container)
|
||||
mNormalView!!.saveHierarchyState(container)
|
||||
mAdvanceView!!.saveHierarchyState(container)
|
||||
mImageView!!.saveHierarchyState(container)
|
||||
mActionView!!.saveHierarchyState(container)
|
||||
}
|
||||
|
||||
override fun dispatchRestoreInstanceState(container: SparseArray<Parcelable>) {
|
||||
super.dispatchRestoreInstanceState(container)
|
||||
mNormalView!!.restoreHierarchyState(container)
|
||||
mAdvanceView!!.restoreHierarchyState(container)
|
||||
mImageView!!.restoreHierarchyState(container)
|
||||
mActionView!!.restoreHierarchyState(container)
|
||||
}
|
||||
|
||||
override fun onSaveInstanceState(): Parcelable {
|
||||
val state = Bundle()
|
||||
state.putParcelable(STATE_KEY_SUPER, super.onSaveInstanceState())
|
||||
state.putInt(STATE_KEY_SEARCH_MODE, mSearchMode)
|
||||
state.putBoolean(STATE_KEY_ENABLE_ADVANCE, mEnableAdvance)
|
||||
return state
|
||||
}
|
||||
|
||||
override fun onRestoreInstanceState(state: Parcelable) {
|
||||
if (state is Bundle) {
|
||||
super.onRestoreInstanceState(state.getParcelable(STATE_KEY_SUPER))
|
||||
mSearchMode = state.getInt(STATE_KEY_SEARCH_MODE)
|
||||
mEnableAdvance = state.getBoolean(STATE_KEY_ENABLE_ADVANCE)
|
||||
}
|
||||
}
|
||||
|
||||
override fun onCheckedChanged(buttonView: CompoundButton, isChecked: Boolean) {
|
||||
if (buttonView === mEnableAdvanceSwitch) {
|
||||
post {
|
||||
mEnableAdvance = isChecked
|
||||
if (mSearchMode == SEARCH_MODE_NORMAL) {
|
||||
if (mEnableAdvance) {
|
||||
mAdapter!!.notifyItemInserted(1)
|
||||
mAdapter.notifyItemInserted(1)
|
||||
} else {
|
||||
mAdapter!!.notifyItemRemoved(1)
|
||||
mAdapter.notifyItemRemoved(1)
|
||||
}
|
||||
if (mHelper != null) {
|
||||
mHelper!!.onChangeSearchMode()
|
||||
@@ -246,7 +178,7 @@ class SearchLayout : EasyRecyclerView, CompoundButton.OnCheckedChangeListener, V
|
||||
urlBuilder.reset()
|
||||
when (mSearchMode) {
|
||||
SEARCH_MODE_NORMAL -> {
|
||||
when (mNormalSearchMode!!.checkedRadioButtonId) {
|
||||
when (mNormalSearchMode.checkedRadioButtonId) {
|
||||
R.id.search_subscription_search -> {
|
||||
urlBuilder.mode = ListUrlBuilder.MODE_SUBSCRIPTION
|
||||
}
|
||||
@@ -262,17 +194,18 @@ class SearchLayout : EasyRecyclerView, CompoundButton.OnCheckedChangeListener, V
|
||||
}
|
||||
urlBuilder.keyword = query
|
||||
urlBuilder.category = PreferenceManager.getDefaultSharedPreferences(context).getInt(
|
||||
SEARCH_CATEGORY_PREF, 0)
|
||||
SEARCH_CATEGORY_PREF, 0
|
||||
)
|
||||
if (mEnableAdvance) {
|
||||
urlBuilder.advanceSearch = mTableAdvanceSearch!!.advanceSearch
|
||||
urlBuilder.minRating = mTableAdvanceSearch!!.minRating
|
||||
urlBuilder.pageFrom = mTableAdvanceSearch!!.pageFrom
|
||||
urlBuilder.pageTo = mTableAdvanceSearch!!.pageTo
|
||||
urlBuilder.advanceSearch = mTableAdvanceSearch.advanceSearch
|
||||
urlBuilder.minRating = mTableAdvanceSearch.minRating
|
||||
urlBuilder.pageFrom = mTableAdvanceSearch.pageFrom
|
||||
urlBuilder.pageTo = mTableAdvanceSearch.pageTo
|
||||
}
|
||||
}
|
||||
SEARCH_MODE_IMAGE -> {
|
||||
urlBuilder.mode = ListUrlBuilder.MODE_IMAGE_SEARCH
|
||||
mImageView!!.formatListUrlBuilder(urlBuilder)
|
||||
mImageView.formatListUrlBuilder(urlBuilder)
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -290,11 +223,11 @@ class SearchLayout : EasyRecyclerView, CompoundButton.OnCheckedChangeListener, V
|
||||
}
|
||||
|
||||
fun setSearchMode(@SearchMode mode: Int) {
|
||||
val oldItemCount = mAdapter!!.itemCount
|
||||
val oldItemCount = mAdapter.itemCount
|
||||
mSearchMode = mode
|
||||
val newItemCount = mAdapter!!.itemCount
|
||||
mAdapter!!.notifyItemRangeRemoved(0, oldItemCount - 1)
|
||||
mAdapter!!.notifyItemRangeInserted(0, newItemCount - 1)
|
||||
val newItemCount = mAdapter.itemCount
|
||||
mAdapter.notifyItemRangeRemoved(0, oldItemCount - 1)
|
||||
mAdapter.notifyItemRangeInserted(0, newItemCount - 1)
|
||||
if (mHelper != null) {
|
||||
mHelper!!.onChangeSearchMode()
|
||||
}
|
||||
@@ -370,7 +303,7 @@ class SearchLayout : EasyRecyclerView, CompoundButton.OnCheckedChangeListener, V
|
||||
|
||||
override fun onBindViewHolder(holder: SimpleHolder, position: Int) {
|
||||
if (holder.itemViewType == ITEM_TYPE_ACTION) {
|
||||
mAction!!.selectTab(mAction!!.getTabAt(mSearchMode))
|
||||
mAction.selectTab(mAction.getTabAt(mSearchMode))
|
||||
}
|
||||
}
|
||||
|
||||
@@ -386,15 +319,12 @@ class SearchLayout : EasyRecyclerView, CompoundButton.OnCheckedChangeListener, V
|
||||
inner class IdentifiedChip @JvmOverloads constructor(
|
||||
context: Context, attrs: AttributeSet? = null
|
||||
) : Chip(context, attrs) {
|
||||
var idt = 0
|
||||
var idt = 0
|
||||
}
|
||||
|
||||
companion object {
|
||||
const val SEARCH_MODE_NORMAL = 0
|
||||
const val SEARCH_MODE_IMAGE = 1
|
||||
private const val STATE_KEY_SUPER = "super"
|
||||
private const val STATE_KEY_SEARCH_MODE = "search_mode"
|
||||
private const val STATE_KEY_ENABLE_ADVANCE = "enable_advance"
|
||||
const val SEARCH_CATEGORY_PREF = "search_pref"
|
||||
private const val ITEM_TYPE_NORMAL = 0
|
||||
private const val ITEM_TYPE_NORMAL_ADVANCE = 1
|
||||
@@ -403,6 +333,18 @@ class SearchLayout : EasyRecyclerView, CompoundButton.OnCheckedChangeListener, V
|
||||
private val SEARCH_ITEM_COUNT_ARRAY = intArrayOf(
|
||||
3, 2
|
||||
)
|
||||
private val mCategoryTable: ArrayList<Pair<Int, Int>> = arrayListOf(
|
||||
Pair(EhConfig.DOUJINSHI, R.string.doujinshi),
|
||||
Pair(EhConfig.MANGA, R.string.manga),
|
||||
Pair(EhConfig.ARTIST_CG, R.string.artist_cg),
|
||||
Pair(EhConfig.GAME_CG, R.string.game_cg),
|
||||
Pair(EhConfig.WESTERN, R.string.western),
|
||||
Pair(EhConfig.NON_H, R.string.non_h),
|
||||
Pair(EhConfig.IMAGE_SET, R.string.image_set),
|
||||
Pair(EhConfig.COSPLAY, R.string.cosplay),
|
||||
Pair(EhConfig.ASIAN_PORN, R.string.asian_porn),
|
||||
Pair(EhConfig.MISC, R.string.misc)
|
||||
)
|
||||
private val SEARCH_ITEM_TYPE = arrayOf(
|
||||
intArrayOf(ITEM_TYPE_NORMAL, ITEM_TYPE_NORMAL_ADVANCE, ITEM_TYPE_ACTION), intArrayOf(
|
||||
ITEM_TYPE_IMAGE, ITEM_TYPE_ACTION
|
||||
|
||||
@@ -89,7 +89,7 @@
|
||||
android:layout_height="wrap_content"
|
||||
android:layout_weight="1" />
|
||||
|
||||
<Switch
|
||||
<com.google.android.material.switchmaterial.SwitchMaterial
|
||||
android:id="@+id/search_enable_advance"
|
||||
android:layout_width="wrap_content"
|
||||
android:layout_height="wrap_content"
|
||||
|
||||
Reference in new issue
Block a user