Convert filter add dialog's spinner to dropdownmenu
This commit is contained in:
1 parent
67024486e7
commit
8fa04644c4
4 files changed
+306
-385
No files matched your search
@@ -15,469 +15,378 @@
|
||||
* You should have received a copy of the GNU General Public License along with EhViewer.
|
||||
* If not, see <https://www.gnu.org/licenses/>.
|
||||
*/
|
||||
package com.hippo.ehviewer.ui.fragment
|
||||
|
||||
package com.hippo.ehviewer.ui.fragment;
|
||||
import android.content.DialogInterface
|
||||
import android.os.Bundle
|
||||
import android.text.TextUtils
|
||||
import android.view.*
|
||||
import android.widget.EditText
|
||||
import android.widget.ImageView
|
||||
import android.widget.TextView
|
||||
import androidx.appcompat.app.AlertDialog
|
||||
import androidx.core.content.ContextCompat
|
||||
import androidx.core.view.MenuProvider
|
||||
import androidx.recyclerview.widget.DefaultItemAnimator
|
||||
import androidx.recyclerview.widget.LinearLayoutManager
|
||||
import androidx.recyclerview.widget.RecyclerView
|
||||
import com.google.android.material.checkbox.MaterialCheckBox
|
||||
import com.google.android.material.dialog.MaterialAlertDialogBuilder
|
||||
import com.google.android.material.floatingactionbutton.FloatingActionButton
|
||||
import com.google.android.material.textfield.TextInputLayout
|
||||
import com.hippo.easyrecyclerview.EasyRecyclerView
|
||||
import com.hippo.easyrecyclerview.LinearDividerItemDecoration
|
||||
import com.hippo.ehviewer.R
|
||||
import com.hippo.ehviewer.client.EhFilter
|
||||
import com.hippo.ehviewer.dao.Filter
|
||||
import com.hippo.view.ViewTransition
|
||||
import com.hippo.yorozuya.LayoutUtils
|
||||
import com.hippo.yorozuya.ViewUtils
|
||||
import rikka.core.res.resolveColor
|
||||
|
||||
import android.content.DialogInterface;
|
||||
import android.graphics.drawable.Drawable;
|
||||
import android.os.Bundle;
|
||||
import android.text.TextUtils;
|
||||
import android.view.LayoutInflater;
|
||||
import android.view.Menu;
|
||||
import android.view.MenuInflater;
|
||||
import android.view.MenuItem;
|
||||
import android.view.View;
|
||||
import android.view.ViewGroup;
|
||||
import android.widget.EditText;
|
||||
import android.widget.ImageView;
|
||||
import android.widget.Spinner;
|
||||
import android.widget.TextView;
|
||||
class FilterFragment : BaseFragment() {
|
||||
private var mViewTransition: ViewTransition? = null
|
||||
private var mAdapter: FilterAdapter = FilterAdapter()
|
||||
private var mFilterList: FilterList = FilterList()
|
||||
private val mMenuProvider: MenuProvider = FilterMenuProvider()
|
||||
|
||||
import androidx.annotation.NonNull;
|
||||
import androidx.annotation.Nullable;
|
||||
import androidx.appcompat.app.AlertDialog;
|
||||
import androidx.core.content.ContextCompat;
|
||||
import androidx.recyclerview.widget.DefaultItemAnimator;
|
||||
import androidx.recyclerview.widget.LinearLayoutManager;
|
||||
import androidx.recyclerview.widget.RecyclerView;
|
||||
|
||||
import com.google.android.material.checkbox.MaterialCheckBox;
|
||||
import com.google.android.material.dialog.MaterialAlertDialogBuilder;
|
||||
import com.google.android.material.floatingactionbutton.FloatingActionButton;
|
||||
import com.google.android.material.textfield.TextInputLayout;
|
||||
import com.hippo.easyrecyclerview.EasyRecyclerView;
|
||||
import com.hippo.easyrecyclerview.LinearDividerItemDecoration;
|
||||
import com.hippo.ehviewer.R;
|
||||
import com.hippo.ehviewer.client.EhFilter;
|
||||
import com.hippo.ehviewer.dao.Filter;
|
||||
import com.hippo.view.ViewTransition;
|
||||
import com.hippo.yorozuya.LayoutUtils;
|
||||
import com.hippo.yorozuya.ViewUtils;
|
||||
|
||||
import java.util.List;
|
||||
|
||||
import rikka.core.res.ResourcesKt;
|
||||
|
||||
public class FilterFragment extends BaseFragment {
|
||||
|
||||
@Nullable
|
||||
private ViewTransition mViewTransition;
|
||||
@Nullable
|
||||
private FilterAdapter mAdapter;
|
||||
@Nullable
|
||||
private FilterList mFilterList;
|
||||
|
||||
@Override
|
||||
public void onCreate(@Nullable Bundle savedInstanceState) {
|
||||
super.onCreate(savedInstanceState);
|
||||
setHasOptionsMenu(true);
|
||||
}
|
||||
|
||||
@Nullable
|
||||
@Override
|
||||
public View onCreateView(@NonNull LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {
|
||||
View view = inflater.inflate(R.layout.activity_filter, container, false);
|
||||
|
||||
mFilterList = new FilterList();
|
||||
|
||||
RecyclerView recyclerView = (EasyRecyclerView) ViewUtils.$$(view, R.id.recycler_view);
|
||||
TextView tip = (TextView) ViewUtils.$$(view, R.id.tip);
|
||||
mViewTransition = new ViewTransition(recyclerView, tip);
|
||||
FloatingActionButton fab = view.findViewById(R.id.fab);
|
||||
|
||||
Drawable drawable = ContextCompat.getDrawable(requireActivity(), R.drawable.big_filter);
|
||||
drawable.setBounds(0, 0, drawable.getIntrinsicWidth(), drawable.getIntrinsicHeight());
|
||||
tip.setCompoundDrawables(null, drawable, null, null);
|
||||
|
||||
mAdapter = new FilterAdapter();
|
||||
mAdapter.setHasStableIds(true);
|
||||
recyclerView.setAdapter(mAdapter);
|
||||
recyclerView.setClipToPadding(false);
|
||||
recyclerView.setClipChildren(false);
|
||||
LinearDividerItemDecoration decoration = new LinearDividerItemDecoration(
|
||||
LinearDividerItemDecoration.VERTICAL,
|
||||
ResourcesKt.resolveColor(requireActivity().getTheme(), R.attr.dividerColor),
|
||||
LayoutUtils.dp2pix(requireActivity(), 1));
|
||||
decoration.setShowLastDivider(true);
|
||||
recyclerView.addItemDecoration(decoration);
|
||||
recyclerView.setLayoutManager(new LinearLayoutManager(requireContext()));
|
||||
recyclerView.setHasFixedSize(true);
|
||||
DefaultItemAnimator defaultItemAnimator = (DefaultItemAnimator) recyclerView.getItemAnimator();
|
||||
if (defaultItemAnimator != null) {
|
||||
defaultItemAnimator.setSupportsChangeAnimations(false);
|
||||
inner class FilterMenuProvider : MenuProvider {
|
||||
override fun onCreateMenu(menu: Menu, menuInflater: MenuInflater) {
|
||||
menuInflater.inflate(R.menu.activity_filter, menu)
|
||||
}
|
||||
|
||||
fab.setOnClickListener(v -> showAddFilterDialog());
|
||||
|
||||
return view;
|
||||
override fun onMenuItemSelected(menuItem: MenuItem): Boolean {
|
||||
val itemId = menuItem.itemId
|
||||
if (itemId == R.id.action_tip) {
|
||||
showTipDialog()
|
||||
return true
|
||||
}
|
||||
return false
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
public void onViewCreated(@NonNull View view, @Nullable Bundle savedInstanceState) {
|
||||
super.onViewCreated(view, savedInstanceState);
|
||||
updateView(false);
|
||||
override fun onCreateView(
|
||||
inflater: LayoutInflater,
|
||||
container: ViewGroup?,
|
||||
savedInstanceState: Bundle?
|
||||
): View? {
|
||||
val view = inflater.inflate(R.layout.activity_filter, container, false)
|
||||
val recyclerView: RecyclerView =
|
||||
ViewUtils.`$$`(view, R.id.recycler_view) as EasyRecyclerView
|
||||
val tip = ViewUtils.`$$`(view, R.id.tip) as TextView
|
||||
mViewTransition = ViewTransition(recyclerView, tip)
|
||||
val fab = view.findViewById<FloatingActionButton>(R.id.fab)
|
||||
val drawable = ContextCompat.getDrawable(requireActivity(), R.drawable.big_filter)
|
||||
drawable!!.setBounds(0, 0, drawable.intrinsicWidth, drawable.intrinsicHeight)
|
||||
tip.setCompoundDrawables(null, drawable, null, null)
|
||||
mAdapter.setHasStableIds(true)
|
||||
recyclerView.adapter = mAdapter
|
||||
recyclerView.clipToPadding = false
|
||||
recyclerView.clipChildren = false
|
||||
val decoration = LinearDividerItemDecoration(
|
||||
LinearDividerItemDecoration.VERTICAL,
|
||||
requireActivity().theme.resolveColor(R.attr.dividerColor),
|
||||
LayoutUtils.dp2pix(requireActivity(), 1f)
|
||||
)
|
||||
decoration.setShowLastDivider(true)
|
||||
recyclerView.addItemDecoration(decoration)
|
||||
recyclerView.layoutManager = LinearLayoutManager(requireContext())
|
||||
recyclerView.setHasFixedSize(true)
|
||||
val defaultItemAnimator = recyclerView.itemAnimator as DefaultItemAnimator?
|
||||
defaultItemAnimator?.supportsChangeAnimations = false
|
||||
fab.setOnClickListener { showAddFilterDialog() }
|
||||
return view
|
||||
}
|
||||
|
||||
private void updateView(boolean animation) {
|
||||
override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
|
||||
super.onViewCreated(view, savedInstanceState)
|
||||
updateView(false)
|
||||
requireActivity().addMenuProvider(mMenuProvider)
|
||||
}
|
||||
|
||||
private fun updateView(animation: Boolean) {
|
||||
if (null == mViewTransition) {
|
||||
return;
|
||||
return
|
||||
}
|
||||
|
||||
if (null == mFilterList || 0 == mFilterList.size()) {
|
||||
mViewTransition.showView(1, animation);
|
||||
if (0 == mFilterList.size()) {
|
||||
mViewTransition!!.showView(1, animation)
|
||||
} else {
|
||||
mViewTransition.showView(0, animation);
|
||||
mViewTransition!!.showView(0, animation)
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
public void onDestroyView() {
|
||||
super.onDestroyView();
|
||||
|
||||
mViewTransition = null;
|
||||
mAdapter = null;
|
||||
mFilterList = null;
|
||||
override fun onDestroyView() {
|
||||
super.onDestroyView()
|
||||
mViewTransition = null
|
||||
requireActivity().removeMenuProvider(mMenuProvider)
|
||||
}
|
||||
|
||||
@Override
|
||||
public void onCreateOptionsMenu(@NonNull Menu menu, @NonNull MenuInflater inflater) {
|
||||
super.onCreateOptionsMenu(menu, inflater);
|
||||
inflater.inflate(R.menu.activity_filter, menu);
|
||||
private fun showTipDialog() {
|
||||
MaterialAlertDialogBuilder(requireActivity())
|
||||
.setTitle(R.string.filter)
|
||||
.setMessage(R.string.filter_tip)
|
||||
.setPositiveButton(android.R.string.ok, null)
|
||||
.show()
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean onOptionsItemSelected(MenuItem item) {
|
||||
int itemId = item.getItemId();
|
||||
if (itemId == R.id.action_tip) {
|
||||
showTipDialog();
|
||||
return true;
|
||||
}
|
||||
return super.onOptionsItemSelected(item);
|
||||
private fun showAddFilterDialog() {
|
||||
val dialog = MaterialAlertDialogBuilder(requireActivity())
|
||||
.setTitle(R.string.add_filter)
|
||||
.setView(R.layout.dialog_add_filter)
|
||||
.setPositiveButton(R.string.add, null)
|
||||
.setNegativeButton(android.R.string.cancel, null)
|
||||
.show()
|
||||
AddFilterDialogHelper(dialog)
|
||||
}
|
||||
|
||||
private void showTipDialog() {
|
||||
new MaterialAlertDialogBuilder(requireActivity())
|
||||
.setTitle(R.string.filter)
|
||||
.setMessage(R.string.filter_tip)
|
||||
.setPositiveButton(android.R.string.ok, null)
|
||||
.show();
|
||||
}
|
||||
|
||||
private void showAddFilterDialog() {
|
||||
AlertDialog dialog = new MaterialAlertDialogBuilder(requireActivity())
|
||||
.setTitle(R.string.add_filter)
|
||||
.setView(R.layout.dialog_add_filter)
|
||||
.setPositiveButton(R.string.add, null)
|
||||
.setNegativeButton(android.R.string.cancel, null)
|
||||
.show();
|
||||
AddFilterDialogHelper helper = new AddFilterDialogHelper();
|
||||
helper.setDialog(dialog);
|
||||
}
|
||||
|
||||
private void showDeleteFilterDialog(final Filter filter) {
|
||||
String message = getString(R.string.delete_filter, filter.text);
|
||||
new MaterialAlertDialogBuilder(requireActivity())
|
||||
.setMessage(message)
|
||||
.setPositiveButton(R.string.delete, (dialog, which) -> {
|
||||
if (DialogInterface.BUTTON_POSITIVE != which || null == mFilterList) {
|
||||
return;
|
||||
}
|
||||
mFilterList.delete(filter);
|
||||
if (null != mAdapter) {
|
||||
mAdapter.notifyDataSetChanged();
|
||||
}
|
||||
updateView(true);
|
||||
})
|
||||
.setNegativeButton(android.R.string.cancel, null)
|
||||
.show();
|
||||
}
|
||||
|
||||
@Override
|
||||
public int getFragmentTitle() {
|
||||
return R.string.filter;
|
||||
}
|
||||
|
||||
private static class FilterHolder extends RecyclerView.ViewHolder {
|
||||
|
||||
private final MaterialCheckBox checkbox;
|
||||
private final TextView text;
|
||||
private final ImageView delete;
|
||||
|
||||
public FilterHolder(View itemView) {
|
||||
super(itemView);
|
||||
checkbox = itemView.findViewById(R.id.checkbox);
|
||||
text = itemView.findViewById(R.id.text);
|
||||
delete = itemView.findViewById(R.id.delete);
|
||||
}
|
||||
}
|
||||
|
||||
private class AddFilterDialogHelper implements View.OnClickListener {
|
||||
|
||||
@Nullable
|
||||
private AlertDialog mDialog;
|
||||
@Nullable
|
||||
private Spinner mSpinner;
|
||||
@Nullable
|
||||
private TextInputLayout mInputLayout;
|
||||
@Nullable
|
||||
private EditText mEditText;
|
||||
|
||||
public void setDialog(AlertDialog dialog) {
|
||||
mDialog = dialog;
|
||||
mSpinner = (Spinner) ViewUtils.$$(dialog, R.id.spinner);
|
||||
mInputLayout = (TextInputLayout) ViewUtils.$$(dialog, R.id.text_input_layout);
|
||||
mEditText = mInputLayout.getEditText();
|
||||
View button = dialog.getButton(DialogInterface.BUTTON_POSITIVE);
|
||||
if (null != button) {
|
||||
button.setOnClickListener(this);
|
||||
private fun showDeleteFilterDialog(filter: Filter) {
|
||||
val message = getString(R.string.delete_filter, filter.text)
|
||||
MaterialAlertDialogBuilder(requireActivity())
|
||||
.setMessage(message)
|
||||
.setPositiveButton(R.string.delete) { _: DialogInterface?, which: Int ->
|
||||
if (DialogInterface.BUTTON_POSITIVE != which) {
|
||||
return@setPositiveButton
|
||||
}
|
||||
mFilterList.delete(filter)
|
||||
mAdapter.notifyDataSetChanged()
|
||||
updateView(true)
|
||||
}
|
||||
.setNegativeButton(android.R.string.cancel, null)
|
||||
.show()
|
||||
}
|
||||
|
||||
override fun getFragmentTitle(): Int {
|
||||
return R.string.filter
|
||||
}
|
||||
|
||||
private class FilterHolder(itemView: View) : RecyclerView.ViewHolder(itemView) {
|
||||
val checkbox: MaterialCheckBox?
|
||||
val text: TextView?
|
||||
val delete: ImageView?
|
||||
|
||||
init {
|
||||
checkbox = itemView.findViewById(R.id.checkbox)
|
||||
text = itemView.findViewById(R.id.text)
|
||||
delete = itemView.findViewById(R.id.delete)
|
||||
}
|
||||
}
|
||||
|
||||
private inner class AddFilterDialogHelper(dialog: AlertDialog) : View.OnClickListener {
|
||||
private var mDialog: AlertDialog
|
||||
private var mSpinner: TextInputLayout
|
||||
private var mInputLayout: TextInputLayout
|
||||
private var mEditText: EditText
|
||||
private val mArray: Array<String> =
|
||||
context!!.resources.getStringArray(R.array.filter_entries)
|
||||
|
||||
init {
|
||||
mDialog = dialog
|
||||
mSpinner = ViewUtils.`$$`(dialog, R.id.spinner) as TextInputLayout
|
||||
mInputLayout = ViewUtils.`$$`(dialog, R.id.text_input_layout) as TextInputLayout
|
||||
mEditText = mInputLayout.editText!!
|
||||
val button: View? = dialog.getButton(DialogInterface.BUTTON_POSITIVE)
|
||||
button?.setOnClickListener(this)
|
||||
}
|
||||
|
||||
@Override
|
||||
public void onClick(View v) {
|
||||
if (null == mFilterList || null == mDialog || null == mSpinner ||
|
||||
null == mInputLayout || null == mEditText) {
|
||||
return;
|
||||
override fun onClick(v: View) {
|
||||
val text1 = mSpinner.editText!!.text.toString()
|
||||
if (TextUtils.isEmpty(text1)) {
|
||||
mSpinner.error = getString(R.string.text_is_empty)
|
||||
return
|
||||
} else {
|
||||
mSpinner.error = null
|
||||
}
|
||||
|
||||
String text = mEditText.getText().toString().trim();
|
||||
val text = mEditText.text.toString().trim { it <= ' ' }
|
||||
if (TextUtils.isEmpty(text)) {
|
||||
mInputLayout.setError(getString(R.string.text_is_empty));
|
||||
return;
|
||||
mInputLayout.error = getString(R.string.text_is_empty)
|
||||
return
|
||||
} else {
|
||||
mInputLayout.setError(null);
|
||||
mInputLayout.error = null
|
||||
}
|
||||
int mode = mSpinner.getSelectedItemPosition();
|
||||
|
||||
Filter filter = new Filter();
|
||||
filter.mode = mode;
|
||||
filter.text = text;
|
||||
val mode = mArray.indexOf(text1)
|
||||
val filter = Filter()
|
||||
filter.mode = mode
|
||||
filter.text = text
|
||||
if (!mFilterList.add(filter)) {
|
||||
mInputLayout.setError(getString(R.string.label_text_exist));
|
||||
return;
|
||||
mInputLayout.error = getString(R.string.label_text_exist)
|
||||
return
|
||||
} else {
|
||||
mInputLayout.setError(null);
|
||||
mInputLayout.error = null
|
||||
}
|
||||
|
||||
if (null != mAdapter) {
|
||||
mAdapter.notifyDataSetChanged();
|
||||
}
|
||||
updateView(true);
|
||||
|
||||
mDialog.dismiss();
|
||||
mDialog = null;
|
||||
mSpinner = null;
|
||||
mInputLayout = null;
|
||||
mEditText = null;
|
||||
mAdapter.notifyDataSetChanged()
|
||||
updateView(true)
|
||||
mDialog.dismiss()
|
||||
}
|
||||
}
|
||||
|
||||
private class FilterAdapter extends RecyclerView.Adapter<FilterHolder> {
|
||||
|
||||
private static final int TYPE_ITEM = 0;
|
||||
private static final int TYPE_HEADER = 1;
|
||||
|
||||
@Override
|
||||
public int getItemViewType(int position) {
|
||||
if (null == mFilterList) {
|
||||
return TYPE_ITEM;
|
||||
}
|
||||
|
||||
if (mFilterList.get(position).mode == FilterList.MODE_HEADER) {
|
||||
return TYPE_HEADER;
|
||||
private inner class FilterAdapter : RecyclerView.Adapter<FilterHolder>() {
|
||||
override fun getItemViewType(position: Int): Int {
|
||||
return if (mFilterList[position].mode == MODE_HEADER) {
|
||||
TYPE_HEADER
|
||||
} else {
|
||||
return TYPE_ITEM;
|
||||
TYPE_ITEM
|
||||
}
|
||||
}
|
||||
|
||||
@NonNull
|
||||
@Override
|
||||
public FilterHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
|
||||
int layoutId;
|
||||
switch (viewType) {
|
||||
default:
|
||||
case TYPE_ITEM:
|
||||
layoutId = R.layout.item_filter;
|
||||
break;
|
||||
case TYPE_HEADER:
|
||||
layoutId = R.layout.item_filter_header;
|
||||
break;
|
||||
override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): FilterHolder {
|
||||
val layoutId: Int = when (viewType) {
|
||||
TYPE_ITEM -> R.layout.item_filter
|
||||
TYPE_HEADER -> R.layout.item_filter_header
|
||||
else -> R.layout.item_filter
|
||||
}
|
||||
|
||||
return new FilterHolder(getLayoutInflater().inflate(layoutId, parent, false));
|
||||
return FilterHolder(layoutInflater.inflate(layoutId, parent, false))
|
||||
}
|
||||
|
||||
@Override
|
||||
public void onBindViewHolder(@NonNull FilterHolder holder, int position) {
|
||||
if (null == mFilterList) {
|
||||
return;
|
||||
}
|
||||
|
||||
Filter filter = mFilterList.get(position);
|
||||
if (FilterList.MODE_HEADER == filter.mode) {
|
||||
holder.text.setText(filter.text);
|
||||
override fun onBindViewHolder(holder: FilterHolder, position: Int) {
|
||||
val filter = mFilterList[position]
|
||||
if (MODE_HEADER == filter.mode) {
|
||||
holder.text?.text = filter.text
|
||||
} else {
|
||||
holder.checkbox.setText(filter.text);
|
||||
holder.checkbox.setChecked(filter.enable);
|
||||
holder.itemView.setOnClickListener(v -> {
|
||||
mFilterList.trigger(filter);
|
||||
holder.checkbox?.text = filter.text
|
||||
holder.checkbox?.isChecked = filter.enable
|
||||
holder.itemView.setOnClickListener {
|
||||
mFilterList.trigger(filter)
|
||||
|
||||
//for updating delete line on filter text
|
||||
if (mAdapter != null) {
|
||||
mAdapter.notifyItemChanged(position);
|
||||
}
|
||||
});
|
||||
holder.delete.setOnClickListener(v -> showDeleteFilterDialog(filter));
|
||||
mAdapter.notifyItemChanged(position)
|
||||
}
|
||||
holder.delete?.setOnClickListener { showDeleteFilterDialog(filter) }
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
public int getItemCount() {
|
||||
return null != mFilterList ? mFilterList.size() : 0;
|
||||
override fun getItemCount(): Int {
|
||||
return mFilterList.size()
|
||||
}
|
||||
|
||||
@Override
|
||||
public long getItemId(int position) {
|
||||
if (mFilterList == null) {
|
||||
return 0;
|
||||
} else {
|
||||
Filter filter = mFilterList.get(position);
|
||||
if (filter.getId() != null) {
|
||||
return (filter.text.hashCode() >> filter.mode) + filter.getId();
|
||||
}
|
||||
return filter.text.hashCode() >> filter.mode;
|
||||
override fun getItemId(position: Int): Long {
|
||||
return run {
|
||||
val filter = mFilterList[position]
|
||||
if (filter.id != null) {
|
||||
(filter.text.hashCode() shr filter.mode) + filter.id
|
||||
} else (filter.text.hashCode() shr filter.mode).toLong()
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
private class FilterList {
|
||||
|
||||
public static final int MODE_HEADER = -1;
|
||||
|
||||
private final EhFilter mEhFilter;
|
||||
private final List<Filter> mTitleFilterList;
|
||||
private final List<Filter> mUploaderFilterList;
|
||||
private final List<Filter> mTagFilterList;
|
||||
private final List<Filter> mTagNamespaceFilterList;
|
||||
|
||||
private Filter mTitleHeader;
|
||||
private Filter mUploaderHeader;
|
||||
private Filter mTagHeader;
|
||||
private Filter mTagNamespaceHeader;
|
||||
|
||||
public FilterList() {
|
||||
mEhFilter = EhFilter.getInstance();
|
||||
mTitleFilterList = mEhFilter.getTitleFilterList();
|
||||
mUploaderFilterList = mEhFilter.getUploaderFilterList();
|
||||
mTagFilterList = mEhFilter.getTagFilterList();
|
||||
mTagNamespaceFilterList = mEhFilter.getTagNamespaceFilterList();
|
||||
private inner class FilterList {
|
||||
private val mEhFilter: EhFilter = EhFilter.getInstance()
|
||||
private val mTitleFilterList: List<Filter> = mEhFilter.titleFilterList
|
||||
private val mUploaderFilterList: List<Filter> = mEhFilter.uploaderFilterList
|
||||
private val mTagFilterList: List<Filter> = mEhFilter.tagFilterList
|
||||
private val mTagNamespaceFilterList: List<Filter> = mEhFilter.tagNamespaceFilterList
|
||||
private var mTitleHeader: Filter? = null
|
||||
private var mUploaderHeader: Filter? = null
|
||||
private var mTagHeader: Filter? = null
|
||||
private var mTagNamespaceHeader: Filter? = null
|
||||
fun size(): Int {
|
||||
var count = 0
|
||||
var size = mTitleFilterList.size
|
||||
count += if (0 == size) 0 else size + 1
|
||||
size = mUploaderFilterList.size
|
||||
count += if (0 == size) 0 else size + 1
|
||||
size = mTagFilterList.size
|
||||
count += if (0 == size) 0 else size + 1
|
||||
size = mTagNamespaceFilterList.size
|
||||
count += if (0 == size) 0 else size + 1
|
||||
return count
|
||||
}
|
||||
|
||||
public int size() {
|
||||
int count = 0;
|
||||
int size = mTitleFilterList.size();
|
||||
count += 0 == size ? 0 : size + 1;
|
||||
size = mUploaderFilterList.size();
|
||||
count += 0 == size ? 0 : size + 1;
|
||||
size = mTagFilterList.size();
|
||||
count += 0 == size ? 0 : size + 1;
|
||||
size = mTagNamespaceFilterList.size();
|
||||
count += 0 == size ? 0 : size + 1;
|
||||
return count;
|
||||
}
|
||||
|
||||
private Filter getTitleHeader() {
|
||||
if (null == mTitleHeader) {
|
||||
mTitleHeader = new Filter();
|
||||
mTitleHeader.mode = MODE_HEADER;
|
||||
mTitleHeader.text = getString(R.string.filter_title);
|
||||
private val titleHeader: Filter
|
||||
get() {
|
||||
if (null == mTitleHeader) {
|
||||
mTitleHeader = Filter()
|
||||
mTitleHeader!!.mode = MODE_HEADER
|
||||
mTitleHeader!!.text = getString(R.string.filter_title)
|
||||
}
|
||||
return mTitleHeader!!
|
||||
}
|
||||
return mTitleHeader;
|
||||
}
|
||||
|
||||
private Filter getUploaderHeader() {
|
||||
if (null == mUploaderHeader) {
|
||||
mUploaderHeader = new Filter();
|
||||
mUploaderHeader.mode = MODE_HEADER;
|
||||
mUploaderHeader.text = getString(R.string.filter_uploader);
|
||||
private val uploaderHeader: Filter
|
||||
get() {
|
||||
if (null == mUploaderHeader) {
|
||||
mUploaderHeader = Filter()
|
||||
mUploaderHeader!!.mode = MODE_HEADER
|
||||
mUploaderHeader!!.text = getString(R.string.filter_uploader)
|
||||
}
|
||||
return mUploaderHeader!!
|
||||
}
|
||||
return mUploaderHeader;
|
||||
}
|
||||
|
||||
private Filter getTagHeader() {
|
||||
if (null == mTagHeader) {
|
||||
mTagHeader = new Filter();
|
||||
mTagHeader.mode = MODE_HEADER;
|
||||
mTagHeader.text = getString(R.string.filter_tag);
|
||||
private val tagHeader: Filter
|
||||
get() {
|
||||
if (null == mTagHeader) {
|
||||
mTagHeader = Filter()
|
||||
mTagHeader!!.mode = MODE_HEADER
|
||||
mTagHeader!!.text = getString(R.string.filter_tag)
|
||||
}
|
||||
return mTagHeader!!
|
||||
}
|
||||
return mTagHeader;
|
||||
}
|
||||
|
||||
private Filter getTagNamespaceHeader() {
|
||||
if (null == mTagNamespaceHeader) {
|
||||
mTagNamespaceHeader = new Filter();
|
||||
mTagNamespaceHeader.mode = MODE_HEADER;
|
||||
mTagNamespaceHeader.text = getString(R.string.filter_tag_namespace);
|
||||
private val tagNamespaceHeader: Filter
|
||||
get() {
|
||||
if (null == mTagNamespaceHeader) {
|
||||
mTagNamespaceHeader = Filter()
|
||||
mTagNamespaceHeader!!.mode = MODE_HEADER
|
||||
mTagNamespaceHeader!!.text = getString(R.string.filter_tag_namespace)
|
||||
}
|
||||
return mTagNamespaceHeader!!
|
||||
}
|
||||
return mTagNamespaceHeader;
|
||||
}
|
||||
|
||||
public Filter get(int index) {
|
||||
int size = mTitleFilterList.size();
|
||||
operator fun get(index: Int): Filter {
|
||||
var index1 = index
|
||||
var size = mTitleFilterList.size
|
||||
if (0 != size) {
|
||||
if (index == 0) {
|
||||
return getTitleHeader();
|
||||
} else if (index <= size) {
|
||||
return mTitleFilterList.get(index - 1);
|
||||
index1 -= if (index1 == 0) {
|
||||
return titleHeader
|
||||
} else if (index1 <= size) {
|
||||
return mTitleFilterList[index1 - 1]
|
||||
} else {
|
||||
index -= size + 1;
|
||||
size + 1
|
||||
}
|
||||
}
|
||||
|
||||
size = mUploaderFilterList.size();
|
||||
size = mUploaderFilterList.size
|
||||
if (0 != size) {
|
||||
if (index == 0) {
|
||||
return getUploaderHeader();
|
||||
} else if (index <= size) {
|
||||
return mUploaderFilterList.get(index - 1);
|
||||
index1 -= if (index1 == 0) {
|
||||
return uploaderHeader
|
||||
} else if (index1 <= size) {
|
||||
return mUploaderFilterList[index1 - 1]
|
||||
} else {
|
||||
index -= size + 1;
|
||||
size + 1
|
||||
}
|
||||
}
|
||||
|
||||
size = mTagFilterList.size();
|
||||
size = mTagFilterList.size
|
||||
if (0 != size) {
|
||||
if (index == 0) {
|
||||
return getTagHeader();
|
||||
} else if (index <= size) {
|
||||
return mTagFilterList.get(index - 1);
|
||||
index1 -= if (index1 == 0) {
|
||||
return tagHeader
|
||||
} else if (index1 <= size) {
|
||||
return mTagFilterList[index1 - 1]
|
||||
} else {
|
||||
index -= size + 1;
|
||||
size + 1
|
||||
}
|
||||
}
|
||||
|
||||
size = mTagNamespaceFilterList.size();
|
||||
size = mTagNamespaceFilterList.size
|
||||
if (0 != size) {
|
||||
if (index == 0) {
|
||||
return getTagNamespaceHeader();
|
||||
} else if (index <= size) {
|
||||
return mTagNamespaceFilterList.get(index - 1);
|
||||
if (index1 == 0) {
|
||||
return tagNamespaceHeader
|
||||
} else if (index1 <= size) {
|
||||
return mTagNamespaceFilterList[index1 - 1]
|
||||
}
|
||||
}
|
||||
|
||||
throw new IndexOutOfBoundsException();
|
||||
throw IndexOutOfBoundsException()
|
||||
}
|
||||
|
||||
public boolean add(Filter filter) {
|
||||
return mEhFilter.addFilter(filter);
|
||||
fun add(filter: Filter?): Boolean {
|
||||
return mEhFilter.addFilter(filter)
|
||||
}
|
||||
|
||||
public void delete(Filter filter) {
|
||||
mEhFilter.deleteFilter(filter);
|
||||
fun delete(filter: Filter?) {
|
||||
mEhFilter.deleteFilter(filter)
|
||||
}
|
||||
|
||||
public void trigger(Filter filter) {
|
||||
mEhFilter.triggerFilter(filter);
|
||||
fun trigger(filter: Filter?) {
|
||||
mEhFilter.triggerFilter(filter)
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
companion object {
|
||||
private const val MODE_HEADER = -1
|
||||
private const val TYPE_ITEM = 0
|
||||
private const val TYPE_HEADER = 1
|
||||
}
|
||||
}
|
||||
Reference in new issue
Block a user