diff --git a/app/src/main/java/com/hippo/ehviewer/ui/fragment/FilterFragment.kt b/app/src/main/java/com/hippo/ehviewer/ui/fragment/FilterFragment.kt index ca2cb2d4b..1165452a8 100644 --- a/app/src/main/java/com/hippo/ehviewer/ui/fragment/FilterFragment.kt +++ b/app/src/main/java/com/hippo/ehviewer/ui/fragment/FilterFragment.kt @@ -15,469 +15,378 @@ * You should have received a copy of the GNU General Public License along with EhViewer. * If not, see . */ +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(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 = + 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 { - - 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() { + 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 mTitleFilterList; - private final List mUploaderFilterList; - private final List mTagFilterList; - private final List 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 = mEhFilter.titleFilterList + private val mUploaderFilterList: List = mEhFilter.uploaderFilterList + private val mTagFilterList: List = mEhFilter.tagFilterList + private val mTagNamespaceFilterList: List = 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 + } +} \ No newline at end of file diff --git a/app/src/main/res/layout/dialog_add_filter.xml b/app/src/main/res/layout/dialog_add_filter.xml index 5231f07e9..910e0fe7a 100644 --- a/app/src/main/res/layout/dialog_add_filter.xml +++ b/app/src/main/res/layout/dialog_add_filter.xml @@ -15,17 +15,27 @@ --> - + android:hint="@string/filter_label"> + + + + 依赖库之版本 需要解锁 代理类型 + 屏蔽项类型 diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index 2b694ac98..b94268788 100755 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -827,4 +827,5 @@ Library Version Require Unlock Proxy Type + Blocker Type