From e6863eb2e86bda8bc5afdc25038e4eea2df2db7d Mon Sep 17 00:00:00 2001 From: tapanmodh Date: Sat, 12 Aug 2023 01:15:44 +0530 Subject: [PATCH] default filter list settings android --- android/brave_java_resources.gni | 1 + .../BraveContentFilteringListener.java | 1 + .../shields/ContentFilteringAdapter.java | 121 +++++++++++++----- .../shields/ContentFilteringFragment.java | 23 +++- .../java/res/layout/item_custom_filter.xml | 1 + android/java/res/layout/item_filter_list.xml | 55 ++++++++ android/java/res/layout/item_filter_title.xml | 2 +- .../android/strings/android_brave_strings.grd | 10 +- .../ad_block_regional_service_manager.cc | 1 + .../browser/filter_list_service.cc | 5 + .../browser/filter_list_service.h | 1 + .../brave_shields/common/filter_list.mojom | 2 + 12 files changed, 186 insertions(+), 37 deletions(-) create mode 100644 android/java/res/layout/item_filter_list.xml diff --git a/android/brave_java_resources.gni b/android/brave_java_resources.gni index 87f611c029f..8f8e6ab76f8 100644 --- a/android/brave_java_resources.gni +++ b/android/brave_java_resources.gni @@ -910,6 +910,7 @@ brave_java_resources = [ "java/res/layout/icon_row_menu_footer.xml", "java/res/layout/item_create_account.xml", "java/res/layout/item_custom_filter.xml", + "java/res/layout/item_filter_list.xml", "java/res/layout/item_filter_title.xml", "java/res/layout/item_fragment_two_line_divider_item.xml", "java/res/layout/item_fragment_two_line_item.xml", diff --git a/android/java/org/chromium/chrome/browser/shields/BraveContentFilteringListener.java b/android/java/org/chromium/chrome/browser/shields/BraveContentFilteringListener.java index b4323b7f3d4..2fc3690f39d 100644 --- a/android/java/org/chromium/chrome/browser/shields/BraveContentFilteringListener.java +++ b/android/java/org/chromium/chrome/browser/shields/BraveContentFilteringListener.java @@ -9,4 +9,5 @@ public interface BraveContentFilteringListener { public void onAddCustomFiltering(); public void onCustomFilterToggle(int position, boolean isEnable); public void onCustomFilterDelete(int position); + public void onDefaultFilterToggle(String uuid, boolean isEnable); } diff --git a/android/java/org/chromium/chrome/browser/shields/ContentFilteringAdapter.java b/android/java/org/chromium/chrome/browser/shields/ContentFilteringAdapter.java index 9ab5bd0e0fe..5098e6d642a 100644 --- a/android/java/org/chromium/chrome/browser/shields/ContentFilteringAdapter.java +++ b/android/java/org/chromium/chrome/browser/shields/ContentFilteringAdapter.java @@ -20,15 +20,23 @@ import androidx.recyclerview.widget.RecyclerView; import org.chromium.brave_shields.mojom.SubscriptionInfo; import org.chromium.chrome.R; +import org.chromium.mojo_base.mojom.Value; import java.util.ArrayList; +import java.util.Map; public class ContentFilteringAdapter extends RecyclerView.Adapter { - private static int TYPE_CUSTOM_FILTER_HEADER = 1; + private static int TYPE_FILTER_HEADER = 1; private static int TYPE_CUSTOM_FILTER_LIST = 2; + private static int TYPE_FILTER_LIST = 3; + + private static final int ONE_ITEM_SPACE = 1; + private static final int TWO_ITEMS_SPACE = 2; + private static final int THREE_ITEMS_SPACE = 3; private BraveContentFilteringListener mBraveContentFileringListener; private ArrayList mCustomFilterLists; + private Value mFilterLists[]; private Context mContext; private boolean mIsEdit; @@ -40,16 +48,22 @@ public class ContentFilteringAdapter extends RecyclerView.Adapter 0) { customFilterListViewHolder.titleText.setText(customFilter.title); @@ -118,15 +132,11 @@ public class ContentFilteringAdapter extends RecyclerView.Adapter { + customFilter.enabled = !customFilter.enabled; + mBraveContentFileringListener.onCustomFilterToggle( + holder.getAdapterPosition() - ONE_ITEM_SPACE, customFilter.enabled); + }); if (mIsEdit) { customFilterListViewHolder.deleteImageView.setVisibility(View.VISIBLE); @@ -139,7 +149,7 @@ public class ContentFilteringAdapter extends RecyclerView.Adapter { if (mIsEdit) { mBraveContentFileringListener.onCustomFilterDelete( - holder.getAdapterPosition() - 1); + holder.getAdapterPosition() - ONE_ITEM_SPACE); } }); customFilterListViewHolder.urlText.setVisibility(View.VISIBLE); @@ -147,60 +157,96 @@ public class ContentFilteringAdapter extends RecyclerView.Adapter { - if (holder.getAdapterPosition() == mCustomFilterLists.size() + 1) { + if (holder.getAdapterPosition() == mCustomFilterLists.size() + ONE_ITEM_SPACE) { mBraveContentFileringListener.onAddCustomFiltering(); } }); + } else if (holder instanceof FilterListViewHolder) { + FilterListViewHolder filterListViewHolder = (FilterListViewHolder) holder; + int filterPosition = position - mCustomFilterLists.size() - THREE_ITEMS_SPACE; + if (filterPosition < mFilterLists.length) { + Map storage = + mFilterLists[filterPosition].getDictionaryValue().storage; + String title = storage.get("title").getStringValue(); + String description = storage.get("desc").getStringValue(); + boolean isEnabled = storage.get("enabled").getBoolValue(); + String uuid = storage.get("uuid").getStringValue(); + filterListViewHolder.titleText.setText(title); + filterListViewHolder.descriptionText.setText(description); + filterListViewHolder.toggleSwitch.setChecked(isEnabled); + + filterListViewHolder.toggleSwitch.setOnClickListener(view -> { + storage.get("enabled").setBoolValue(!isEnabled); + mBraveContentFileringListener.onDefaultFilterToggle(uuid, !isEnabled); + }); + } } } @Override public int getItemCount() { - return mCustomFilterLists.size() + 2; + int count = mCustomFilterLists.size() + THREE_ITEMS_SPACE; + if (mFilterLists != null) { + count += mFilterLists.length; + } + return count; } @NonNull @Override public RecyclerView.ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) { View view; - if (viewType == TYPE_CUSTOM_FILTER_HEADER) { + + if (viewType == TYPE_FILTER_HEADER) { view = LayoutInflater.from(parent.getContext()) .inflate(R.layout.item_filter_title, parent, false); - return new CustomFilterHeaderViewHolder(view); - } else { + return new FilterListHeaderViewHolder(view); + } else if (viewType == TYPE_CUSTOM_FILTER_LIST) { view = LayoutInflater.from(parent.getContext()) .inflate(R.layout.item_custom_filter, parent, false); return new CustomFilterListViewHolder(view); + } else { + view = LayoutInflater.from(parent.getContext()) + .inflate(R.layout.item_filter_list, parent, false); + return new FilterListViewHolder(view); } } @Override public int getItemViewType(int position) { - if (position == 0) { - return TYPE_CUSTOM_FILTER_HEADER; - } else { + if (position == 0 || position == mCustomFilterLists.size() + TWO_ITEMS_SPACE) { + return TYPE_FILTER_HEADER; + } else if (position > 0 && position <= mCustomFilterLists.size() + ONE_ITEM_SPACE) { return TYPE_CUSTOM_FILTER_LIST; + } else { + return TYPE_FILTER_LIST; } } public void setEditable(boolean isEdit) { mIsEdit = isEdit; - notifyItemRangeChanged(1, mCustomFilterLists.size()); + notifyItemRangeChanged(ONE_ITEM_SPACE, mCustomFilterLists.size()); } public void setCustomFilterLists(ArrayList customFilterLists) { if (mCustomFilterLists != null && mCustomFilterLists.size() > 0) { - notifyItemRangeRemoved(1, mCustomFilterLists.size()); + notifyItemRangeRemoved(ONE_ITEM_SPACE, mCustomFilterLists.size()); } mCustomFilterLists = customFilterLists; - notifyItemRangeInserted(1, mCustomFilterLists.size()); + notifyItemRangeInserted(ONE_ITEM_SPACE, mCustomFilterLists.size()); } - public static class CustomFilterHeaderViewHolder extends RecyclerView.ViewHolder { + public void setFilterLists(Value filterLists[]) { + mFilterLists = filterLists; + notifyItemRangeInserted( + mCustomFilterLists.size() + TWO_ITEMS_SPACE, mFilterLists.length + ONE_ITEM_SPACE); + } + + public static class FilterListHeaderViewHolder extends RecyclerView.ViewHolder { TextView titleText; TextView summaryText; - CustomFilterHeaderViewHolder(View itemView) { + FilterListHeaderViewHolder(View itemView) { super(itemView); this.titleText = (TextView) itemView.findViewById(R.id.title_text); this.summaryText = (TextView) itemView.findViewById(R.id.summary_text); @@ -227,4 +273,17 @@ public class ContentFilteringAdapter extends RecyclerView.Adapter mCustomFilterLists; + private Value mFilterLists[]; private MenuItem mEditItem; private MenuItem mDoneItem; private boolean mIsMenuLoaded; @@ -62,7 +62,7 @@ public class ContentFilteringFragment extends BravePreferenceFragment @Override public void onActivityCreated(Bundle savedInstanceState) { if (getActivity() != null) { - getActivity().setTitle(R.string.filter_lists_title); + getActivity().setTitle(R.string.content_filters_title); } super.onActivityCreated(savedInstanceState); setData(); @@ -89,6 +89,7 @@ public class ContentFilteringFragment extends BravePreferenceFragment mAdapter = new ContentFilteringAdapter(getActivity(), this); mRecyclerView.setAdapter(mAdapter); getCustomFilterLists(); + getFilterLists(); } private void getCustomFilterLists() { @@ -104,6 +105,15 @@ public class ContentFilteringFragment extends BravePreferenceFragment } } + private void getFilterLists() { + if (mFilterListAndroidHandler != null) { + mFilterListAndroidHandler.getFilterLists(filterLists -> { + mFilterLists = filterLists.storage; + mAdapter.setFilterLists(mFilterLists); + }); + } + } + @Override public void onCustomFilterToggle(int position, boolean isEnable) { if (mFilterListAndroidHandler != null) { @@ -135,6 +145,13 @@ public class ContentFilteringFragment extends BravePreferenceFragment } } + @Override + public void onDefaultFilterToggle(String uuid, boolean isEnable) { + if (mFilterListAndroidHandler != null) { + mFilterListAndroidHandler.enableFilter(uuid, isEnable); + } + } + private void checkForEmptyCustomFilterLists(boolean shouldEditVisible) { if (mCustomFilterLists.size() == 0) { isEditSelected(false); diff --git a/android/java/res/layout/item_custom_filter.xml b/android/java/res/layout/item_custom_filter.xml index be7e5fc18b5..c3989e74b6c 100644 --- a/android/java/res/layout/item_custom_filter.xml +++ b/android/java/res/layout/item_custom_filter.xml @@ -33,6 +33,7 @@ app:layout_constraintEnd_toStartOf="@id/toggle_switch" android:layout_marginTop="2dp" android:layout_marginHorizontal="16dp" + android:visibility="gone" android:textSize="14sp" android:textColor="@color/filter_summary_color"/> diff --git a/android/java/res/layout/item_filter_list.xml b/android/java/res/layout/item_filter_list.xml new file mode 100644 index 00000000000..d3052349017 --- /dev/null +++ b/android/java/res/layout/item_filter_list.xml @@ -0,0 +1,55 @@ + + + + + + + + + + + + + diff --git a/android/java/res/layout/item_filter_title.xml b/android/java/res/layout/item_filter_title.xml index d1b0a3e8b40..d522c000c87 100644 --- a/android/java/res/layout/item_filter_title.xml +++ b/android/java/res/layout/item_filter_title.xml @@ -18,7 +18,7 @@ android:id="@+id/title_text" android:layout_width="wrap_content" android:layout_height="wrap_content" - android:layout_marginTop="10dp" + android:layout_marginTop="20dp" android:textStyle="bold" android:textSize="16sp" android:textColor="@color/filter_title_color"/> diff --git a/browser/ui/android/strings/android_brave_strings.grd b/browser/ui/android/strings/android_brave_strings.grd index e22a14c7345..e356f30cf44 100644 --- a/browser/ui/android/strings/android_brave_strings.grd +++ b/browser/ui/android/strings/android_brave_strings.grd @@ -512,8 +512,14 @@ This file contains all "about" strings. It is set to NOT be translated, in tran Enable custom filters that block regional and language-specific trackers and Annoyances - - Filter Lists + + Content Filters + + + Filter lists + + + Additional popular community lists. Note that enabling too many filters will degrade browsing speeds. Custom filter lists diff --git a/components/brave_shields/browser/ad_block_regional_service_manager.cc b/components/brave_shields/browser/ad_block_regional_service_manager.cc index 4c807d93a00..48d4c789415 100644 --- a/components/brave_shields/browser/ad_block_regional_service_manager.cc +++ b/components/brave_shields/browser/ad_block_regional_service_manager.cc @@ -288,6 +288,7 @@ base::Value::List AdBlockRegionalServiceManager::GetRegionalLists() { dict.Set("uuid", region_list.uuid); dict.Set("url", region_list.url); dict.Set("title", region_list.title); + dict.Set("desc", region_list.desc); dict.Set("support_url", region_list.support_url); dict.Set("component_id", region_list.component_id); dict.Set("base64_public_key", region_list.base64_public_key); diff --git a/components/brave_shields/browser/filter_list_service.cc b/components/brave_shields/browser/filter_list_service.cc index 8577799c0db..a097504b83e 100644 --- a/components/brave_shields/browser/filter_list_service.cc +++ b/components/brave_shields/browser/filter_list_service.cc @@ -54,6 +54,11 @@ void FilterListService::EnableFilter(const std::string& filterListUuid, filterListUuid, shouldEnableFilter); } +void FilterListService::GetFilterLists(GetFilterListsCallback callback) { + std::move(callback).Run( + ad_block_service_->regional_service_manager()->GetRegionalLists()); +} + void FilterListService::GetSubscriptions(GetSubscriptionsCallback callback) { std::vector items; std::vector subscriptions_ = diff --git a/components/brave_shields/browser/filter_list_service.h b/components/brave_shields/browser/filter_list_service.h index 8ca11fb5bbf..775fdb8a39c 100644 --- a/components/brave_shields/browser/filter_list_service.h +++ b/components/brave_shields/browser/filter_list_service.h @@ -37,6 +37,7 @@ class FilterListService : public KeyedService, void CreateSubscription(const GURL& subscription_url) override; void EnableSubscription(const GURL& sub_url, bool enabled) override; void DeleteSubscription(const GURL& sub_url) override; + void GetFilterLists(GetFilterListsCallback callback) override; private: raw_ptr ad_block_service_ = nullptr; diff --git a/components/brave_shields/common/filter_list.mojom b/components/brave_shields/common/filter_list.mojom index 2f86789efda..d2d5b39722c 100644 --- a/components/brave_shields/common/filter_list.mojom +++ b/components/brave_shields/common/filter_list.mojom @@ -7,6 +7,7 @@ module brave_shields.mojom; import "url/mojom/url.mojom"; import "mojo/public/mojom/base/time.mojom"; +import "mojo/public/mojom/base/values.mojom"; struct SubscriptionInfo { bool enabled; @@ -26,6 +27,7 @@ interface FilterListAndroidHandler { CreateSubscription(url.mojom.Url subscription_url); EnableSubscription(url.mojom.Url sub_url, bool enabled); DeleteSubscription(url.mojom.Url sub_url); + GetFilterLists() => (mojo_base.mojom.ListValue filterLists); }; const string kSwitchToAppUuid = "2F3DCE16-A19A-493C-A88F-2E110FBD37D6";