create custom filters android
This commit is contained in:
@@ -414,6 +414,7 @@ brave_java_resources = [
|
||||
"java/res/drawable/circle_shimmer.xml",
|
||||
"java/res/drawable/circular_progress.xml",
|
||||
"java/res/drawable/country_spinner_background.xml",
|
||||
"java/res/drawable/create_custom_filter_edit_bg.xml",
|
||||
"java/res/drawable/crypto_wallet_blue_button.xml",
|
||||
"java/res/drawable/crypto_wallet_hollow_button.xml",
|
||||
"java/res/drawable/crypto_wallet_negative_button.xml",
|
||||
@@ -878,6 +879,7 @@ brave_java_resources = [
|
||||
"java/res/layout/fragment_content_filtering.xml",
|
||||
"java/res/layout/fragment_create_account.xml",
|
||||
"java/res/layout/fragment_create_account.xml",
|
||||
"java/res/layout/fragment_create_custom_filters.xml",
|
||||
"java/res/layout/fragment_cross_promotional_modal_dialog.xml",
|
||||
"java/res/layout/fragment_dapps_message.xml",
|
||||
"java/res/layout/fragment_dormant_users_engagement_dialog.xml",
|
||||
|
||||
@@ -399,6 +399,7 @@ brave_java_sources = [
|
||||
"../../brave/android/java/org/chromium/chrome/browser/shields/BraveShieldsUtils.java",
|
||||
"../../brave/android/java/org/chromium/chrome/browser/shields/ContentFilteringAdapter.java",
|
||||
"../../brave/android/java/org/chromium/chrome/browser/shields/ContentFilteringFragment.java",
|
||||
"../../brave/android/java/org/chromium/chrome/browser/shields/CreateCustomFiltersFragment.java",
|
||||
"../../brave/android/java/org/chromium/chrome/browser/shields/FilterListServiceFactory.java",
|
||||
"../../brave/android/java/org/chromium/chrome/browser/shields/UrlSanitizerServiceFactory.java",
|
||||
"../../brave/android/java/org/chromium/chrome/browser/signin/BraveSigninManager.java",
|
||||
|
||||
@@ -6,8 +6,13 @@
|
||||
package org.chromium.chrome.browser.shields;
|
||||
|
||||
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);
|
||||
public void onAddSubscriptionFilter();
|
||||
|
||||
public void onSubscriptionFilterToggle(int position, boolean isEnable);
|
||||
|
||||
public void onSubscriptionFilterDelete(int position);
|
||||
|
||||
public void onFilterToggle(String uuid, boolean isEnable);
|
||||
|
||||
public void onCustomFilters();
|
||||
}
|
||||
|
||||
@@ -33,9 +33,10 @@ public class ContentFilteringAdapter extends RecyclerView.Adapter<RecyclerView.V
|
||||
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 static final int FOUR_ITEMS_SPACE = 4;
|
||||
|
||||
private BraveContentFilteringListener mBraveContentFileringListener;
|
||||
private ArrayList<SubscriptionInfo> mCustomFilterLists;
|
||||
private ArrayList<SubscriptionInfo> mSubscriptionFilterLists;
|
||||
private Value mFilterLists[];
|
||||
private Context mContext;
|
||||
private boolean mIsEdit;
|
||||
@@ -63,8 +64,15 @@ public class ContentFilteringAdapter extends RecyclerView.Adapter<RecyclerView.V
|
||||
CustomFilterListViewHolder customFilterListViewHolder =
|
||||
(CustomFilterListViewHolder) holder;
|
||||
|
||||
if (holder.getAdapterPosition() == mCustomFilterLists.size() + ONE_ITEM_SPACE) {
|
||||
customFilterListViewHolder.titleText.setText(R.string.add_custom_filter_list);
|
||||
if (holder.getAdapterPosition() == ONE_ITEM_SPACE
|
||||
|| holder.getAdapterPosition()
|
||||
== mSubscriptionFilterLists.size() + TWO_ITEMS_SPACE) {
|
||||
if (holder.getAdapterPosition() == ONE_ITEM_SPACE) {
|
||||
customFilterListViewHolder.titleText.setText(
|
||||
R.string.create_custom_filters_title);
|
||||
} else {
|
||||
customFilterListViewHolder.titleText.setText(R.string.add_custom_filter_list);
|
||||
}
|
||||
customFilterListViewHolder.lastUpdateText.setVisibility(View.GONE);
|
||||
customFilterListViewHolder.toggleSwitch.setVisibility(View.GONE);
|
||||
customFilterListViewHolder.urlText.setVisibility(View.GONE);
|
||||
@@ -73,7 +81,7 @@ public class ContentFilteringAdapter extends RecyclerView.Adapter<RecyclerView.V
|
||||
|
||||
} else {
|
||||
SubscriptionInfo customFilter =
|
||||
mCustomFilterLists.get(holder.getAdapterPosition() - ONE_ITEM_SPACE);
|
||||
mSubscriptionFilterLists.get(holder.getAdapterPosition() - TWO_ITEMS_SPACE);
|
||||
String url = customFilter.subscriptionUrl.url;
|
||||
if (customFilter.title != null && customFilter.title.length() > 0) {
|
||||
customFilterListViewHolder.titleText.setText(customFilter.title);
|
||||
@@ -132,11 +140,13 @@ public class ContentFilteringAdapter extends RecyclerView.Adapter<RecyclerView.V
|
||||
customFilterListViewHolder.urlText.setText(url);
|
||||
customFilterListViewHolder.toggleSwitch.setChecked(customFilter.enabled);
|
||||
|
||||
customFilterListViewHolder.toggleSwitch.setOnClickListener(view -> {
|
||||
customFilter.enabled = !customFilter.enabled;
|
||||
mBraveContentFileringListener.onCustomFilterToggle(
|
||||
holder.getAdapterPosition() - ONE_ITEM_SPACE, customFilter.enabled);
|
||||
});
|
||||
customFilterListViewHolder.toggleSwitch.setOnClickListener(
|
||||
view -> {
|
||||
customFilter.enabled = !customFilter.enabled;
|
||||
mBraveContentFileringListener.onSubscriptionFilterToggle(
|
||||
holder.getAdapterPosition() - TWO_ITEMS_SPACE,
|
||||
customFilter.enabled);
|
||||
});
|
||||
|
||||
if (mIsEdit) {
|
||||
customFilterListViewHolder.deleteImageView.setVisibility(View.VISIBLE);
|
||||
@@ -146,24 +156,29 @@ public class ContentFilteringAdapter extends RecyclerView.Adapter<RecyclerView.V
|
||||
customFilterListViewHolder.toggleSwitch.setVisibility(View.VISIBLE);
|
||||
}
|
||||
|
||||
customFilterListViewHolder.deleteImageView.setOnClickListener(view -> {
|
||||
if (mIsEdit) {
|
||||
mBraveContentFileringListener.onCustomFilterDelete(
|
||||
holder.getAdapterPosition() - ONE_ITEM_SPACE);
|
||||
}
|
||||
});
|
||||
customFilterListViewHolder.deleteImageView.setOnClickListener(
|
||||
view -> {
|
||||
if (mIsEdit) {
|
||||
mBraveContentFileringListener.onSubscriptionFilterDelete(
|
||||
holder.getAdapterPosition() - TWO_ITEMS_SPACE);
|
||||
}
|
||||
});
|
||||
customFilterListViewHolder.urlText.setVisibility(View.VISIBLE);
|
||||
customFilterListViewHolder.arrowImageView.setVisibility(View.GONE);
|
||||
}
|
||||
|
||||
customFilterListViewHolder.itemView.setOnClickListener(view -> {
|
||||
if (holder.getAdapterPosition() == mCustomFilterLists.size() + ONE_ITEM_SPACE) {
|
||||
mBraveContentFileringListener.onAddCustomFiltering();
|
||||
}
|
||||
});
|
||||
customFilterListViewHolder.itemView.setOnClickListener(
|
||||
view -> {
|
||||
if (holder.getAdapterPosition() == ONE_ITEM_SPACE) {
|
||||
mBraveContentFileringListener.onCustomFilters();
|
||||
} else if (holder.getAdapterPosition()
|
||||
== mSubscriptionFilterLists.size() + TWO_ITEMS_SPACE) {
|
||||
mBraveContentFileringListener.onAddSubscriptionFilter();
|
||||
}
|
||||
});
|
||||
} else if (holder instanceof FilterListViewHolder) {
|
||||
FilterListViewHolder filterListViewHolder = (FilterListViewHolder) holder;
|
||||
int filterPosition = position - mCustomFilterLists.size() - THREE_ITEMS_SPACE;
|
||||
int filterPosition = position - mSubscriptionFilterLists.size() - FOUR_ITEMS_SPACE;
|
||||
if (filterPosition < mFilterLists.length) {
|
||||
Map<String, Value> storage =
|
||||
mFilterLists[filterPosition].getDictionaryValue().storage;
|
||||
@@ -175,17 +190,18 @@ public class ContentFilteringAdapter extends RecyclerView.Adapter<RecyclerView.V
|
||||
filterListViewHolder.descriptionText.setText(description);
|
||||
filterListViewHolder.toggleSwitch.setChecked(isEnabled);
|
||||
|
||||
filterListViewHolder.toggleSwitch.setOnClickListener(view -> {
|
||||
storage.get("enabled").setBoolValue(!isEnabled);
|
||||
mBraveContentFileringListener.onDefaultFilterToggle(uuid, !isEnabled);
|
||||
});
|
||||
filterListViewHolder.toggleSwitch.setOnClickListener(
|
||||
view -> {
|
||||
storage.get("enabled").setBoolValue(!isEnabled);
|
||||
mBraveContentFileringListener.onFilterToggle(uuid, !isEnabled);
|
||||
});
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
public int getItemCount() {
|
||||
int count = mCustomFilterLists.size() + THREE_ITEMS_SPACE;
|
||||
int count = mSubscriptionFilterLists.size() + FOUR_ITEMS_SPACE;
|
||||
if (mFilterLists != null) {
|
||||
count += mFilterLists.length;
|
||||
}
|
||||
@@ -214,9 +230,9 @@ public class ContentFilteringAdapter extends RecyclerView.Adapter<RecyclerView.V
|
||||
|
||||
@Override
|
||||
public int getItemViewType(int position) {
|
||||
if (position == 0 || position == mCustomFilterLists.size() + TWO_ITEMS_SPACE) {
|
||||
if (position == 0 || position == mSubscriptionFilterLists.size() + THREE_ITEMS_SPACE) {
|
||||
return TYPE_FILTER_HEADER;
|
||||
} else if (position > 0 && position <= mCustomFilterLists.size() + ONE_ITEM_SPACE) {
|
||||
} else if (position > 0 && position <= mSubscriptionFilterLists.size() + TWO_ITEMS_SPACE) {
|
||||
return TYPE_CUSTOM_FILTER_LIST;
|
||||
} else {
|
||||
return TYPE_FILTER_LIST;
|
||||
@@ -225,21 +241,22 @@ public class ContentFilteringAdapter extends RecyclerView.Adapter<RecyclerView.V
|
||||
|
||||
public void setEditable(boolean isEdit) {
|
||||
mIsEdit = isEdit;
|
||||
notifyItemRangeChanged(ONE_ITEM_SPACE, mCustomFilterLists.size());
|
||||
notifyItemRangeChanged(TWO_ITEMS_SPACE, mSubscriptionFilterLists.size());
|
||||
}
|
||||
|
||||
public void setCustomFilterLists(ArrayList<SubscriptionInfo> customFilterLists) {
|
||||
if (mCustomFilterLists != null && mCustomFilterLists.size() > 0) {
|
||||
notifyItemRangeRemoved(ONE_ITEM_SPACE, mCustomFilterLists.size());
|
||||
public void setSubscriptionFilterLists(ArrayList<SubscriptionInfo> customFilterLists) {
|
||||
if (mSubscriptionFilterLists != null && mSubscriptionFilterLists.size() > 0) {
|
||||
notifyItemRangeRemoved(TWO_ITEMS_SPACE, mSubscriptionFilterLists.size());
|
||||
}
|
||||
mCustomFilterLists = customFilterLists;
|
||||
notifyItemRangeInserted(ONE_ITEM_SPACE, mCustomFilterLists.size());
|
||||
mSubscriptionFilterLists = customFilterLists;
|
||||
notifyItemRangeInserted(TWO_ITEMS_SPACE, mSubscriptionFilterLists.size());
|
||||
}
|
||||
|
||||
public void setFilterLists(Value filterLists[]) {
|
||||
mFilterLists = filterLists;
|
||||
notifyItemRangeInserted(
|
||||
mCustomFilterLists.size() + TWO_ITEMS_SPACE, mFilterLists.length + ONE_ITEM_SPACE);
|
||||
mSubscriptionFilterLists.size() + THREE_ITEMS_SPACE,
|
||||
mFilterLists.length + ONE_ITEM_SPACE);
|
||||
}
|
||||
|
||||
public static class FilterListHeaderViewHolder extends RecyclerView.ViewHolder {
|
||||
|
||||
@@ -42,7 +42,7 @@ public class ContentFilteringFragment extends BravePreferenceFragment
|
||||
|
||||
private ContentFilteringAdapter mAdapter;
|
||||
private FilterListAndroidHandler mFilterListAndroidHandler;
|
||||
private ArrayList<SubscriptionInfo> mCustomFilterLists;
|
||||
private ArrayList<SubscriptionInfo> mSubscriptionFilterLists;
|
||||
private Value mFilterLists[];
|
||||
private MenuItem mEditItem;
|
||||
private MenuItem mDoneItem;
|
||||
@@ -71,13 +71,15 @@ public class ContentFilteringFragment extends BravePreferenceFragment
|
||||
public void onAttach(@NonNull Context context) {
|
||||
super.onAttach(context);
|
||||
|
||||
mAddCustomFilterResultLauncher = registerForActivityResult(
|
||||
new ActivityResultContracts.StartActivityForResult(),
|
||||
((BraveSettingsActivity) requireActivity()).getActivityResultRegistry(), result -> {
|
||||
if (result.getResultCode() == Activity.RESULT_OK) {
|
||||
getCustomFilterLists();
|
||||
}
|
||||
});
|
||||
mAddCustomFilterResultLauncher =
|
||||
registerForActivityResult(
|
||||
new ActivityResultContracts.StartActivityForResult(),
|
||||
((BraveSettingsActivity) requireActivity()).getActivityResultRegistry(),
|
||||
result -> {
|
||||
if (result.getResultCode() == Activity.RESULT_OK) {
|
||||
getSubscriptionFilters();
|
||||
}
|
||||
});
|
||||
}
|
||||
|
||||
private void setData() {
|
||||
@@ -88,20 +90,21 @@ public class ContentFilteringFragment extends BravePreferenceFragment
|
||||
mRecyclerView.setLayoutManager(linearLayoutManager);
|
||||
mAdapter = new ContentFilteringAdapter(getActivity(), this);
|
||||
mRecyclerView.setAdapter(mAdapter);
|
||||
getCustomFilterLists();
|
||||
getSubscriptionFilters();
|
||||
getFilterLists();
|
||||
}
|
||||
|
||||
private void getCustomFilterLists() {
|
||||
private void getSubscriptionFilters() {
|
||||
if (mFilterListAndroidHandler != null) {
|
||||
mFilterListAndroidHandler.getSubscriptions(subscriptions -> {
|
||||
mCustomFilterLists = new ArrayList(Arrays.asList(subscriptions));
|
||||
mAdapter.setCustomFilterLists(mCustomFilterLists);
|
||||
mIsGetSubscriptionsLoaded = true;
|
||||
if (mIsMenuLoaded) {
|
||||
checkForEmptyCustomFilterLists(true);
|
||||
}
|
||||
});
|
||||
mFilterListAndroidHandler.getSubscriptions(
|
||||
subscriptions -> {
|
||||
mSubscriptionFilterLists = new ArrayList(Arrays.asList(subscriptions));
|
||||
mAdapter.setSubscriptionFilterLists(mSubscriptionFilterLists);
|
||||
mIsGetSubscriptionsLoaded = true;
|
||||
if (mIsMenuLoaded) {
|
||||
checkForEmptySubscriptionFilters(true);
|
||||
}
|
||||
});
|
||||
}
|
||||
}
|
||||
|
||||
@@ -115,17 +118,17 @@ public class ContentFilteringFragment extends BravePreferenceFragment
|
||||
}
|
||||
|
||||
@Override
|
||||
public void onCustomFilterToggle(int position, boolean isEnable) {
|
||||
public void onSubscriptionFilterToggle(int position, boolean isEnable) {
|
||||
if (mFilterListAndroidHandler != null) {
|
||||
SubscriptionInfo customFilter = mCustomFilterLists.get(position);
|
||||
SubscriptionInfo customFilter = mSubscriptionFilterLists.get(position);
|
||||
mFilterListAndroidHandler.enableSubscription(customFilter.subscriptionUrl, isEnable);
|
||||
customFilter.enabled = isEnable;
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
public void onAddCustomFiltering() {
|
||||
if (mCustomFilterLists.size() > 0) {
|
||||
public void onAddSubscriptionFilter() {
|
||||
if (mSubscriptionFilterLists.size() > 0) {
|
||||
isEditSelected(false);
|
||||
}
|
||||
Intent intent = mSettingsLauncher.createSettingsActivityIntent(
|
||||
@@ -134,26 +137,37 @@ public class ContentFilteringFragment extends BravePreferenceFragment
|
||||
}
|
||||
|
||||
@Override
|
||||
public void onCustomFilterDelete(int position) {
|
||||
public void onSubscriptionFilterDelete(int position) {
|
||||
if (mFilterListAndroidHandler != null) {
|
||||
SubscriptionInfo customFilter = mCustomFilterLists.get(position);
|
||||
SubscriptionInfo customFilter = mSubscriptionFilterLists.get(position);
|
||||
mFilterListAndroidHandler.deleteSubscription(customFilter.subscriptionUrl);
|
||||
mCustomFilterLists.remove(position);
|
||||
mSubscriptionFilterLists.remove(position);
|
||||
mAdapter.notifyItemRemoved(position + 1);
|
||||
mAdapter.notifyItemRangeChanged(position + 1, mAdapter.getItemCount());
|
||||
checkForEmptyCustomFilterLists(false);
|
||||
checkForEmptySubscriptionFilters(false);
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
public void onDefaultFilterToggle(String uuid, boolean isEnable) {
|
||||
public void onCustomFilters() {
|
||||
if (mSubscriptionFilterLists.size() > 0) {
|
||||
isEditSelected(false);
|
||||
}
|
||||
Intent intent =
|
||||
mSettingsLauncher.createSettingsActivityIntent(
|
||||
getActivity(), CreateCustomFiltersFragment.class.getName(), null);
|
||||
getActivity().startActivity(intent);
|
||||
}
|
||||
|
||||
@Override
|
||||
public void onFilterToggle(String uuid, boolean isEnable) {
|
||||
if (mFilterListAndroidHandler != null) {
|
||||
mFilterListAndroidHandler.enableFilter(uuid, isEnable);
|
||||
}
|
||||
}
|
||||
|
||||
private void checkForEmptyCustomFilterLists(boolean shouldEditVisible) {
|
||||
if (mCustomFilterLists.size() == 0) {
|
||||
private void checkForEmptySubscriptionFilters(boolean shouldEditVisible) {
|
||||
if (mSubscriptionFilterLists.size() == 0) {
|
||||
isEditSelected(false);
|
||||
mEditItem.setVisible(false);
|
||||
} else if (shouldEditVisible) {
|
||||
@@ -192,7 +206,7 @@ public class ContentFilteringFragment extends BravePreferenceFragment
|
||||
mDoneItem = menu.findItem(R.id.menu_id_done);
|
||||
mIsMenuLoaded = true;
|
||||
if (mIsGetSubscriptionsLoaded) {
|
||||
checkForEmptyCustomFilterLists(true);
|
||||
checkForEmptySubscriptionFilters(true);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -0,0 +1,151 @@
|
||||
/* Copyright (c) 2023 The Brave Authors. All rights reserved.
|
||||
* This Source Code Form is subject to the terms of the Mozilla Public
|
||||
* License, v. 2.0. If a copy of the MPL was not distributed with this file,
|
||||
* You can obtain one at https://mozilla.org/MPL/2.0/. */
|
||||
|
||||
package org.chromium.chrome.browser.shields;
|
||||
|
||||
import android.os.Bundle;
|
||||
import android.text.SpannableString;
|
||||
import android.text.Spanned;
|
||||
import android.text.method.LinkMovementMethod;
|
||||
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.Button;
|
||||
import android.widget.EditText;
|
||||
import android.widget.TextView;
|
||||
|
||||
import org.chromium.brave_shields.mojom.FilterListAndroidHandler;
|
||||
import org.chromium.chrome.R;
|
||||
import org.chromium.chrome.browser.BraveRewardsHelper;
|
||||
import org.chromium.chrome.browser.customtabs.CustomTabActivity;
|
||||
import org.chromium.chrome.browser.settings.BravePreferenceFragment;
|
||||
import org.chromium.mojo.bindings.ConnectionErrorHandler;
|
||||
import org.chromium.mojo.system.MojoException;
|
||||
import org.chromium.ui.text.NoUnderlineClickableSpan;
|
||||
import org.chromium.ui.widget.Toast;
|
||||
|
||||
public class CreateCustomFiltersFragment extends BravePreferenceFragment
|
||||
implements ConnectionErrorHandler {
|
||||
public static final String BRAVE_ADBLOCK_FILTER_SYNTAX_PAGE =
|
||||
"https://support.brave.com/hc/en-us/articles/6449369961741";
|
||||
|
||||
private FilterListAndroidHandler mFilterListAndroidHandler;
|
||||
private EditText mEtCustomFilters;
|
||||
|
||||
@Override
|
||||
public View onCreateView(
|
||||
LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
|
||||
return inflater.inflate(R.layout.fragment_create_custom_filters, container, false);
|
||||
}
|
||||
|
||||
@Override
|
||||
public void onActivityCreated(Bundle savedInstanceState) {
|
||||
if (getActivity() != null) {
|
||||
getActivity().setTitle(R.string.create_custom_filters_title);
|
||||
}
|
||||
super.onActivityCreated(savedInstanceState);
|
||||
|
||||
setData();
|
||||
}
|
||||
|
||||
private void setData() {
|
||||
initFilterListAndroidHandler();
|
||||
mEtCustomFilters = getView().findViewById(R.id.enter_custom_filters);
|
||||
TextView tvSummary = getView().findViewById(R.id.summary);
|
||||
String summaryText =
|
||||
String.format(
|
||||
getResources().getString(R.string.create_custom_filter_summary),
|
||||
getResources().getString(R.string.adblock_filter_syntax));
|
||||
Spanned summaryTextSpanned = BraveRewardsHelper.spannedFromHtmlString(summaryText);
|
||||
SpannableString summaryTextSpannableString =
|
||||
new SpannableString(summaryTextSpanned.toString());
|
||||
|
||||
if (getActivity() != null) {
|
||||
NoUnderlineClickableSpan summaryTextClickableSpan =
|
||||
new NoUnderlineClickableSpan(
|
||||
getActivity(),
|
||||
R.color.brave_link,
|
||||
(textView) -> {
|
||||
CustomTabActivity.showInfoPage(
|
||||
getActivity(), BRAVE_ADBLOCK_FILTER_SYNTAX_PAGE);
|
||||
});
|
||||
|
||||
BraveRewardsHelper.setSpan(
|
||||
getActivity(),
|
||||
summaryText,
|
||||
summaryTextSpannableString,
|
||||
R.string.adblock_filter_syntax,
|
||||
summaryTextClickableSpan);
|
||||
tvSummary.setMovementMethod(LinkMovementMethod.getInstance());
|
||||
tvSummary.setText(summaryTextSpannableString);
|
||||
}
|
||||
|
||||
Button saveBtn = getView().findViewById(R.id.btn_save);
|
||||
saveBtn.setOnClickListener(
|
||||
view -> {
|
||||
updateCustomFilters();
|
||||
});
|
||||
getCustomFilters();
|
||||
}
|
||||
|
||||
@Override
|
||||
public void onConnectionError(MojoException e) {
|
||||
mFilterListAndroidHandler = null;
|
||||
initFilterListAndroidHandler();
|
||||
}
|
||||
|
||||
private void initFilterListAndroidHandler() {
|
||||
if (mFilterListAndroidHandler != null) {
|
||||
return;
|
||||
}
|
||||
|
||||
mFilterListAndroidHandler =
|
||||
FilterListServiceFactory.getInstance().getFilterListAndroidHandler(this);
|
||||
}
|
||||
|
||||
private void getCustomFilters() {
|
||||
if (mFilterListAndroidHandler != null) {
|
||||
mFilterListAndroidHandler.getCustomFilters(
|
||||
customFilters -> {
|
||||
mEtCustomFilters.setText(customFilters);
|
||||
});
|
||||
}
|
||||
}
|
||||
|
||||
private void updateCustomFilters() {
|
||||
if (mFilterListAndroidHandler != null) {
|
||||
mFilterListAndroidHandler.updateCustomFilters(
|
||||
mEtCustomFilters.getText().toString(),
|
||||
isUpdated -> {
|
||||
int messageId =
|
||||
isUpdated
|
||||
? R.string.saved_changes_success
|
||||
: R.string.brave_rewards_local_general_grant_error_title;
|
||||
if (getActivity() != null) {
|
||||
Toast.makeText(getActivity(), messageId, Toast.LENGTH_SHORT).show();
|
||||
}
|
||||
});
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
public void onCreateOptionsMenu(Menu menu, MenuInflater inflater) {
|
||||
MenuItem closeItem = menu.findItem(R.id.close_menu_id);
|
||||
if (closeItem != null) {
|
||||
closeItem.setVisible(false);
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
public void onDestroy() {
|
||||
if (mFilterListAndroidHandler != null) {
|
||||
mFilterListAndroidHandler.close();
|
||||
}
|
||||
super.onDestroy();
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,12 @@
|
||||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<!-- Copyright (c) 2023 The Brave Authors. All rights reserved.
|
||||
This Source Code Form is subject to the terms of the Mozilla Public
|
||||
License, v. 2.0. If a copy of the MPL was not distributed with this file,
|
||||
You can obtain one at https://mozilla.org/MPL/2.0/.
|
||||
-->
|
||||
|
||||
<shape xmlns:android="http://schemas.android.com/apk/res/android">
|
||||
<solid android:color="@android:color/transparent" />
|
||||
<stroke android:width="1dp" android:color="@color/add_custom_filter_text_input_stroke_color" />
|
||||
<corners android:radius="5dp"/>
|
||||
</shape>
|
||||
@@ -0,0 +1,57 @@
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<!-- Copyright (c) 2023 The Brave Authors. All rights reserved.
|
||||
This Source Code Form is subject to the terms of the Mozilla Public
|
||||
License, v. 2.0. If a copy of the MPL was not distributed with this file,
|
||||
You can obtain one at https://mozilla.org/MPL/2.0/.
|
||||
-->
|
||||
<androidx.constraintlayout.widget.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
|
||||
xmlns:app="http://schemas.android.com/apk/res-auto"
|
||||
xmlns:tools="http://schemas.android.com/tools"
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="match_parent">
|
||||
|
||||
<EditText
|
||||
android:id="@+id/enter_custom_filters"
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="200dp"
|
||||
android:layout_marginTop="12dp"
|
||||
android:layout_marginHorizontal="16dp"
|
||||
android:paddingHorizontal="15dp"
|
||||
android:paddingTop="15dp"
|
||||
app:layout_constraintTop_toTopOf="parent"
|
||||
android:gravity="top|start"
|
||||
android:background="@drawable/create_custom_filter_edit_bg"
|
||||
android:textColor="@color/filter_title_color"
|
||||
android:inputType="text|textMultiLine"
|
||||
android:importantForAutofill="no"
|
||||
tools:ignore="LabelFor"/>
|
||||
|
||||
<TextView
|
||||
android:id="@+id/summary"
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="wrap_content"
|
||||
android:layout_marginTop="16dp"
|
||||
android:layout_marginHorizontal="16dp"
|
||||
app:layout_constraintTop_toBottomOf="@id/enter_custom_filters"
|
||||
android:textSize="16sp"
|
||||
android:textColor="@color/add_custom_filter_summary_color"/>
|
||||
|
||||
<Button
|
||||
android:id="@+id/btn_save"
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="wrap_content"
|
||||
android:layout_gravity="center_horizontal"
|
||||
android:layout_marginBottom="16dp"
|
||||
android:layout_marginHorizontal="16dp"
|
||||
app:layout_constraintBottom_toBottomOf="parent"
|
||||
android:background="@drawable/blue_48_rounded_bg"
|
||||
app:backgroundTint="@null"
|
||||
android:text="@string/save_changes"
|
||||
android:textAllCaps="false"
|
||||
android:textColor="@android:color/white"
|
||||
android:textSize="16sp"
|
||||
android:paddingVertical="4dp"
|
||||
android:minHeight="0dp"
|
||||
style="?android:attr/borderlessButtonStyle"/>
|
||||
|
||||
</androidx.constraintlayout.widget.ConstraintLayout>
|
||||
@@ -548,6 +548,21 @@ This file contains all "about" strings. It is set to NOT be translated, in tran
|
||||
<message name="IDS_UPDATE_FAILED_CUSTOM_FILTER" desc="Custom filter Update failed.">
|
||||
<ph name="TIME">%1$s<ex>1 hours ago</ex></ph> Update failed
|
||||
</message>
|
||||
<message name="IDS_CREATE_CUSTOM_FILTERS_TITLE" desc="Title for Create Custom filters.">
|
||||
Create custom filters
|
||||
</message>
|
||||
<message name="IDS_SAVE_CHANGES" desc="Button text for create custom filter lists.">
|
||||
Save changes
|
||||
</message>
|
||||
<message name="IDS_SAVED_CHANGES_SUCCESS" desc="Create custom filter lists success text.">
|
||||
Saved changes successfully
|
||||
</message>
|
||||
<message name="IDS_CREATE_CUSTOM_FILTER_SUMMARY" desc="Create custom filter summary.">
|
||||
Add custom filters you've created, one per line, in the field above. Be sure to use the <ph name="ADBLOCK_FILTER_SYNTAX">%1$s</ph>.
|
||||
</message>
|
||||
<message name="IDS_ADBLOCK_FILTER_SYNTAX" desc="Text for Adblock filter syntax.">
|
||||
Adblock filter syntax
|
||||
</message>
|
||||
<message name="IDS_ASSET_PRICE" desc="Text for asset price.">
|
||||
<ph name="ASSET_NAME">%1$s<ex>Ethereum</ex></ph> Price (<ph name="ASSET_SYMBOL">%2$s<ex>ETH</ex></ph>)
|
||||
</message>
|
||||
|
||||
@@ -110,4 +110,17 @@ void FilterListService::DeleteSubscription(const GURL& sub_url) {
|
||||
sub_url);
|
||||
}
|
||||
|
||||
void FilterListService::GetCustomFilters(GetCustomFiltersCallback callback) {
|
||||
std::move(callback).Run(
|
||||
ad_block_service_->custom_filters_provider()->GetCustomFilters());
|
||||
}
|
||||
|
||||
void FilterListService::UpdateCustomFilters(
|
||||
const std::string& custom_filters,
|
||||
UpdateCustomFiltersCallback callback) {
|
||||
std::move(callback).Run(
|
||||
ad_block_service_->custom_filters_provider()->UpdateCustomFilters(
|
||||
custom_filters));
|
||||
}
|
||||
|
||||
} // namespace brave_shields
|
||||
|
||||
@@ -38,6 +38,9 @@ class FilterListService : public KeyedService,
|
||||
void EnableSubscription(const GURL& sub_url, bool enabled) override;
|
||||
void DeleteSubscription(const GURL& sub_url) override;
|
||||
void GetFilterLists(GetFilterListsCallback callback) override;
|
||||
void GetCustomFilters(GetCustomFiltersCallback callback) override;
|
||||
void UpdateCustomFilters(const std::string& custom_filters,
|
||||
UpdateCustomFiltersCallback callback) override;
|
||||
|
||||
private:
|
||||
raw_ptr<AdBlockService> ad_block_service_ = nullptr;
|
||||
|
||||
@@ -28,6 +28,8 @@ interface FilterListAndroidHandler {
|
||||
EnableSubscription(url.mojom.Url sub_url, bool enabled);
|
||||
DeleteSubscription(url.mojom.Url sub_url);
|
||||
GetFilterLists() => (mojo_base.mojom.ListValue filterLists);
|
||||
GetCustomFilters() => (string custom_filters);
|
||||
UpdateCustomFilters(string custom_filters) => (bool is_updated);
|
||||
};
|
||||
|
||||
const string kSwitchToAppUuid = "2F3DCE16-A19A-493C-A88F-2E110FBD37D6";
|
||||
|
||||
Reference in New Issue
Block a user