From a758fd3cb9d444b4ee37fd37ab4c9d0a83a16b0f Mon Sep 17 00:00:00 2001
From: NekoInverter <7741672-NekoInverter@users.noreply.gitlab.com>
Date: Fri, 18 Dec 2020 13:35:03 +0800
Subject: [PATCH] Filter settings refactored
---
app/src/main/AndroidManifest.xml | 8 +-
.../FilterFragment.java} | 204 +++++++++---------
.../ehviewer/ui/fragment/HostsFragment.java | 37 ++--
app/src/main/res/layout/activity_filter.xml | 21 +-
.../main/res/layout/item_download_label.xml | 69 ------
app/src/main/res/layout/item_filter.xml | 63 +++---
.../main/res/layout/item_filter_header.xml | 6 +-
app/src/main/res/layout/item_quick_search.xml | 69 ------
app/src/main/res/menu/activity_filter.xml | 6 -
app/src/main/res/xml/eh_settings.xml | 4 +-
10 files changed, 175 insertions(+), 312 deletions(-)
rename app/src/main/java/com/hippo/ehviewer/ui/{FilterActivity.java => fragment/FilterFragment.java} (70%)
delete mode 100644 app/src/main/res/layout/item_download_label.xml
delete mode 100644 app/src/main/res/layout/item_quick_search.xml
diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml
index d3c14c405..c86e51670 100755
--- a/app/src/main/AndroidManifest.xml
+++ b/app/src/main/AndroidManifest.xml
@@ -23,7 +23,8 @@
+ android:maxSdkVersion="28"
+ tools:ignore="ScopedStorage" />
-
showAddFilterDialog());
+
+ return view;
+ }
+
+ @Override
+ public void onViewCreated(@NonNull View view, @Nullable Bundle savedInstanceState) {
+ super.onViewCreated(view, savedInstanceState);
updateView(false);
}
@@ -99,48 +120,40 @@ public class FilterActivity extends ToolbarActivity {
}
@Override
- protected void onDestroy() {
- super.onDestroy();
+ public void onDestroyView() {
+ super.onDestroyView();
- mRecyclerView = null;
mViewTransition = null;
mAdapter = null;
mFilterList = null;
}
@Override
- public boolean onCreateOptionsMenu(Menu menu) {
- super.onCreateOptionsMenu(menu);
- getMenuInflater().inflate(R.menu.activity_filter, menu);
- return true;
+ public void onCreateOptionsMenu(@NonNull Menu menu, @NonNull MenuInflater inflater) {
+ super.onCreateOptionsMenu(menu, inflater);
+ inflater.inflate(R.menu.activity_filter, menu);
}
@Override
public boolean onOptionsItemSelected(MenuItem item) {
- switch (item.getItemId()) {
- case android.R.id.home:
- finish();
- return true;
- case R.id.action_add:
- showAddFilterDialog();
- return true;
- case R.id.action_tip:
- showTipDialog();
- return true;
- default:
- return super.onOptionsItemSelected(item);
+ int itemId = item.getItemId();
+ if (itemId == R.id.action_tip) {
+ showTipDialog();
+ return true;
}
+ return super.onOptionsItemSelected(item);
}
private void showTipDialog() {
- new MaterialAlertDialogBuilder(this)
+ 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(this)
+ AlertDialog dialog = new MaterialAlertDialogBuilder(requireActivity())
.setTitle(R.string.add_filter)
.setView(R.layout.dialog_add_filter)
.setPositiveButton(R.string.add, null)
@@ -152,7 +165,7 @@ public class FilterActivity extends ToolbarActivity {
private void showDeleteFilterDialog(final Filter filter) {
String message = getString(R.string.delete_filter, filter.text);
- new MaterialAlertDialogBuilder(this)
+ new MaterialAlertDialogBuilder(requireActivity())
.setMessage(message)
.setPositiveButton(R.string.delete, (dialog, which) -> {
if (DialogInterface.BUTTON_POSITIVE != which || null == mFilterList) {
@@ -224,41 +237,17 @@ public class FilterActivity extends ToolbarActivity {
}
}
- private class FilterHolder extends RecyclerView.ViewHolder implements View.OnClickListener {
+ private static class FilterHolder extends RecyclerView.ViewHolder {
+ private final MaterialCheckBox checkbox;
private final TextView text;
- private final ImageView icon;
+ private final ImageView delete;
public FilterHolder(View itemView) {
super(itemView);
- text = (TextView) ViewUtils.$$(itemView, R.id.text);
- icon = itemView.findViewById(R.id.icon);
-
- if (null != icon) {
- icon.setOnClickListener(this);
- }
- // click on the filter text to enable/disable it
- text.setOnClickListener(this);
- }
-
- @Override
- public void onClick(View v) {
- int position = getAdapterPosition();
- if (position < 0 || null == mFilterList) {
- return;
- }
- Filter filter = mFilterList.get(position);
- if (FilterList.MODE_HEADER != filter.mode) {
- if (v instanceof ImageView) {
- showDeleteFilterDialog(filter);
- } else if (v instanceof TextView) {
- mFilterList.trigger(filter);
-
- //for updating delete line on filter text
- mAdapter.notifyItemChanged(getAdapterPosition());
- }
-
- }
+ checkbox = itemView.findViewById(R.id.checkbox);
+ text = itemView.findViewById(R.id.text);
+ delete = itemView.findViewById(R.id.delete);
}
}
@@ -280,8 +269,9 @@ public class FilterActivity extends ToolbarActivity {
}
}
+ @NonNull
@Override
- public FilterHolder onCreateViewHolder(ViewGroup parent, int viewType) {
+ public FilterHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
int layoutId;
switch (viewType) {
default:
@@ -293,18 +283,11 @@ public class FilterActivity extends ToolbarActivity {
break;
}
- FilterHolder holder = new FilterHolder(getLayoutInflater().inflate(layoutId, parent, false));
-
- if (R.layout.item_filter == layoutId) {
- holder.icon.setImageDrawable(
- DrawableManager.getVectorDrawable(FilterActivity.this, R.drawable.v_delete_x24));
- }
-
- return holder;
+ return new FilterHolder(getLayoutInflater().inflate(layoutId, parent, false));
}
@Override
- public void onBindViewHolder(FilterHolder holder, int position) {
+ public void onBindViewHolder(@NonNull FilterHolder holder, int position) {
if (null == mFilterList) {
return;
}
@@ -313,13 +296,17 @@ public class FilterActivity extends ToolbarActivity {
if (FilterList.MODE_HEADER == filter.mode) {
holder.text.setText(filter.text);
} else {
- holder.text.setText(filter.text);
- // add a delete line if the filter is disabled
- if (!filter.enable) {
- holder.text.setPaintFlags(holder.text.getPaintFlags() | Paint.STRIKE_THRU_TEXT_FLAG);
- } else {
- holder.text.setPaintFlags(holder.text.getPaintFlags() & (~Paint.STRIKE_THRU_TEXT_FLAG));
- }
+ holder.checkbox.setText(filter.text);
+ holder.checkbox.setChecked(filter.enable);
+ holder.itemView.setOnClickListener(v -> {
+ mFilterList.trigger(filter);
+
+ //for updating delete line on filter text
+ if (mAdapter != null) {
+ mAdapter.notifyItemChanged(position);
+ }
+ });
+ holder.delete.setOnClickListener(v -> showDeleteFilterDialog(filter));
}
}
@@ -327,6 +314,11 @@ public class FilterActivity extends ToolbarActivity {
public int getItemCount() {
return null != mFilterList ? mFilterList.size() : 0;
}
+
+ @Override
+ public long getItemId(int position) {
+ return null != mFilterList ? mFilterList.get(position).text.hashCode() : 0;
+ }
}
private class FilterList {
@@ -441,8 +433,6 @@ public class FilterActivity extends ToolbarActivity {
return getTagNamespaceHeader();
} else if (index <= size) {
return mTagNamespaceFilterList.get(index - 1);
- } else {
- index -= size + 1;
}
}
@@ -461,4 +451,8 @@ public class FilterActivity extends ToolbarActivity {
mEhFilter.triggerFilter(filter);
}
}
+
+ public void setTitle(@StringRes int string) {
+ requireActivity().setTitle(string);
+ }
}
diff --git a/app/src/main/java/com/hippo/ehviewer/ui/fragment/HostsFragment.java b/app/src/main/java/com/hippo/ehviewer/ui/fragment/HostsFragment.java
index 68369864c..637dd2724 100644
--- a/app/src/main/java/com/hippo/ehviewer/ui/fragment/HostsFragment.java
+++ b/app/src/main/java/com/hippo/ehviewer/ui/fragment/HostsFragment.java
@@ -22,12 +22,13 @@ import com.google.android.material.dialog.MaterialAlertDialogBuilder;
import com.google.android.material.floatingactionbutton.FloatingActionButton;
import com.google.android.material.textfield.TextInputLayout;
import com.hippo.android.resource.AttrResources;
-import com.hippo.easyrecyclerview.EasyRecyclerView;
import com.hippo.easyrecyclerview.LinearDividerItemDecoration;
import com.hippo.ehviewer.EhApplication;
import com.hippo.ehviewer.Hosts;
import com.hippo.ehviewer.R;
+import com.hippo.view.ViewTransition;
import com.hippo.yorozuya.LayoutUtils;
+import com.hippo.yorozuya.ViewUtils;
import java.util.List;
import java.util.Locale;
@@ -44,8 +45,7 @@ public class HostsFragment extends Fragment
private Hosts hosts;
private List> data;
- private EasyRecyclerView recyclerView;
- private View tip;
+ private ViewTransition mViewTransition;
private HostsAdapter adapter;
@Override
@@ -61,8 +61,9 @@ public class HostsFragment extends Fragment
public View onCreateView(@NonNull LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {
View view = inflater.inflate(R.layout.activity_hosts, container, false);
setTitle(R.string.hosts);
- recyclerView = view.findViewById(R.id.recycler_view);
- tip = view.findViewById(R.id.tip);
+ RecyclerView recyclerView = view.findViewById(R.id.recycler_view);
+ TextView tip = (TextView) ViewUtils.$$(view, R.id.tip);
+ mViewTransition = new ViewTransition(recyclerView, tip);
FloatingActionButton fab = view.findViewById(R.id.fab);
adapter = new HostsAdapter();
@@ -83,12 +84,17 @@ public class HostsFragment extends Fragment
fab.setOnClickListener(this);
- recyclerView.setVisibility(data.isEmpty() ? View.GONE : View.VISIBLE);
- tip.setVisibility(data.isEmpty() ? View.VISIBLE : View.GONE);
+ updateView(false);
return view;
}
+ @Override
+ public void onViewCreated(@NonNull View view, @Nullable Bundle savedInstanceState) {
+ super.onViewCreated(view, savedInstanceState);
+ updateView(false);
+ }
+
public boolean onItemClick(int position) {
Pair pair = data.get(position);
Bundle args = new Bundle();
@@ -107,10 +113,17 @@ public class HostsFragment extends Fragment
new AddHostDialogFragment().show(getChildFragmentManager(), DIALOG_TAG_ADD_HOST);
}
- private void notifyHostsChanges() {
+ private void updateView(boolean animation) {
+ if (null == mViewTransition) {
+ return;
+ }
+
data = hosts.getAll();
- recyclerView.setVisibility(data.isEmpty() ? View.GONE : View.VISIBLE);
- tip.setVisibility(data.isEmpty() ? View.VISIBLE : View.GONE);
+ if (data.isEmpty()) {
+ mViewTransition.showView(1, animation);
+ } else {
+ mViewTransition.showView(0, animation);
+ }
adapter.notifyDataSetChanged();
}
@@ -172,7 +185,7 @@ public class HostsFragment extends Fragment
}
hostsFragment.hosts.put(hostString, ipString);
- hostsFragment.notifyHostsChanges();
+ hostsFragment.updateView(true);
dialog.dismiss();
}
@@ -185,7 +198,7 @@ public class HostsFragment extends Fragment
String hostString = host.getText().toString().trim().toLowerCase(Locale.US);
hostsFragment.hosts.delete(hostString);
- hostsFragment.notifyHostsChanges();
+ hostsFragment.updateView(true);
dialog.dismiss();
}
diff --git a/app/src/main/res/layout/activity_filter.xml b/app/src/main/res/layout/activity_filter.xml
index 510f62c20..0bf5d9de7 100644
--- a/app/src/main/res/layout/activity_filter.xml
+++ b/app/src/main/res/layout/activity_filter.xml
@@ -21,8 +21,7 @@
+ android:layout_height="match_parent" />
+
+
+
+
+
+
diff --git a/app/src/main/res/layout/item_download_label.xml b/app/src/main/res/layout/item_download_label.xml
deleted file mode 100644
index dc449552e..000000000
--- a/app/src/main/res/layout/item_download_label.xml
+++ /dev/null
@@ -1,69 +0,0 @@
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
diff --git a/app/src/main/res/layout/item_filter.xml b/app/src/main/res/layout/item_filter.xml
index 485298785..9d7258eca 100644
--- a/app/src/main/res/layout/item_filter.xml
+++ b/app/src/main/res/layout/item_filter.xml
@@ -17,45 +17,32 @@
+ android:background="?selectableItemBackground"
+ android:clickable="true"
+ android:focusable="true"
+ android:paddingHorizontal="@dimen/keyline_margin">
-
+ android:background="@android:color/transparent"
+ android:clickable="false"
+ android:maxLines="1"
+ android:ellipsize="end"
+ android:focusable="false"
+ android:paddingStart="0dp"
+ android:paddingEnd="24dp" />
-
-
-
-
-
-
-
-
-
-
-
-
+
+
\ No newline at end of file
diff --git a/app/src/main/res/layout/item_filter_header.xml b/app/src/main/res/layout/item_filter_header.xml
index fc0018fec..3587be459 100644
--- a/app/src/main/res/layout/item_filter_header.xml
+++ b/app/src/main/res/layout/item_filter_header.xml
@@ -19,6 +19,6 @@
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:orientation="vertical"
- android:padding="8dp"
- android:textAppearance="@style/TextAppearance.AppCompat.Title"
- android:textColor="?android:attr/textColorPrimary" />
+ android:paddingHorizontal="16dp"
+ android:paddingVertical="8dp"
+ android:textAppearance="@style/TextAppearance.MaterialComponents.Headline6" />
diff --git a/app/src/main/res/layout/item_quick_search.xml b/app/src/main/res/layout/item_quick_search.xml
deleted file mode 100644
index dc449552e..000000000
--- a/app/src/main/res/layout/item_quick_search.xml
+++ /dev/null
@@ -1,69 +0,0 @@
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
diff --git a/app/src/main/res/menu/activity_filter.xml b/app/src/main/res/menu/activity_filter.xml
index 1c258e395..ff53fcc4d 100644
--- a/app/src/main/res/menu/activity_filter.xml
+++ b/app/src/main/res/menu/activity_filter.xml
@@ -17,12 +17,6 @@