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 @@ - - -