From 4475d4d018cbd0986c0dcf6df433c2fb253c36f9 Mon Sep 17 00:00:00 2001 From: tarsin Date: Fri, 20 May 2022 12:31:00 +0800 Subject: [PATCH] Search layout tweaks --- .../com/hippo/ehviewer/widget/SearchLayout.kt | 222 +++++++----------- app/src/main/res/layout/search_normal.xml | 2 +- 2 files changed, 83 insertions(+), 141 deletions(-) diff --git a/app/src/main/java/com/hippo/ehviewer/widget/SearchLayout.kt b/app/src/main/java/com/hippo/ehviewer/widget/SearchLayout.kt index a4c3e2dd0..e7e9e2622 100644 --- a/app/src/main/java/com/hippo/ehviewer/widget/SearchLayout.kt +++ b/app/src/main/java/com/hippo/ehviewer/widget/SearchLayout.kt @@ -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> = 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) { - super.dispatchSaveInstanceState(container) - mNormalView!!.saveHierarchyState(container) - mAdvanceView!!.saveHierarchyState(container) - mImageView!!.saveHierarchyState(container) - mActionView!!.saveHierarchyState(container) - } - - override fun dispatchRestoreInstanceState(container: SparseArray) { - 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> = 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 diff --git a/app/src/main/res/layout/search_normal.xml b/app/src/main/res/layout/search_normal.xml index aa42d401c..96b788ee4 100644 --- a/app/src/main/res/layout/search_normal.xml +++ b/app/src/main/res/layout/search_normal.xml @@ -89,7 +89,7 @@ android:layout_height="wrap_content" android:layout_weight="1" /> -