From 247aa33a15d67bc74d9f4cc0d786a64152359390 Mon Sep 17 00:00:00 2001 From: Daniel Kao Date: Sun, 12 Sep 2021 16:37:59 +0800 Subject: [PATCH] support adding adblock extra sites --- .../browser/activity/BrowserActivity.kt | 38 +++++++++++++----- .../de/baumann/browser/browser/AdBlock.java | 40 ++++++++++--------- .../browser/browser/NinjaWebViewClient.kt | 4 +- .../browser/preference/ConfigManager.kt | 5 +++ .../de/baumann/browser/unit/BrowserUnit.kt | 1 + .../res/layout/dialog_menu_context_link.xml | 31 ++++++++++++++ app/src/main/res/values-zh-rTW/strings.xml | 2 +- 7 files changed, 89 insertions(+), 32 deletions(-) diff --git a/app/src/main/java/de/baumann/browser/activity/BrowserActivity.kt b/app/src/main/java/de/baumann/browser/activity/BrowserActivity.kt index de4cb12e6..3c8816857 100755 --- a/app/src/main/java/de/baumann/browser/activity/BrowserActivity.kt +++ b/app/src/main/java/de/baumann/browser/activity/BrowserActivity.kt @@ -14,7 +14,6 @@ import android.os.Bundle import android.os.Environment import android.print.PrintAttributes import android.print.PrintManager -import android.provider.Browser import android.text.Editable import android.text.TextWatcher import android.util.Log @@ -55,7 +54,6 @@ import de.baumann.browser.view.viewControllers.TranslationViewController import kotlinx.coroutines.Dispatchers import kotlinx.coroutines.launch import java.io.* -import java.lang.reflect.Field import java.util.* import kotlin.math.floor import kotlin.math.roundToInt @@ -1281,7 +1279,8 @@ open class BrowserActivity : AppCompatActivity(), BrowserController, OnClickList } - private fun showContextMenuLinkDialog(url: String?) { + private fun showContextMenuLinkDialog(url: String?, hitTestResult: HitTestResult) { + val url = url ?: hitTestResult.extra ?: "" val dialogView = DialogMenuContextLinkBinding.inflate(layoutInflater) val dialog = dialogManager.showOptionDialog(dialogView.root) dialogView.contextLinkNewTab.setOnClickListener { @@ -1292,12 +1291,12 @@ open class BrowserActivity : AppCompatActivity(), BrowserController, OnClickList } dialogView.contextLinkShareLink.setOnClickListener { dialog.dismissWithAction { - if (prepareRecord()) NinjaToast.show(this, getString(R.string.toast_share_failed)) + if (prepareRecord()) NinjaToast.show(this, getString(R.string.toast_share_failed)) else IntentUnit.share(this, "", url) } } dialogView.contextLinkOpenWith.setOnClickListener { - dialog.dismissWithAction { HelperUnit.showBrowserChooser( this@BrowserActivity, url, getString(R.string.menu_open_with) ) } + dialog.dismissWithAction { HelperUnit.showBrowserChooser(this@BrowserActivity, url, getString(R.string.menu_open_with)) } } dialogView.contextLinkSaveBookmark.setOnClickListener { dialog.dismissWithAction { saveBookmark(url, title = "") } @@ -1308,17 +1307,34 @@ open class BrowserActivity : AppCompatActivity(), BrowserController, OnClickList dialogView.menuSavePdf.setOnClickListener { dialog.dismissWithAction { showSavePdfDialog(url) } } + + if (hitTestResult.extra != null) { + dialogView.menuRemoveAd.visibility = VISIBLE + dialogView.menuRemoveAd.setOnClickListener { + dialog.dismissWithAction { confirmAdSiteAddition(hitTestResult.extra) } + } + } } - override fun onLongPress(url: String?) { - val result = ninjaWebView.hitTestResult - if (url != null) { - showContextMenuLinkDialog(url) - } else if (result.type == HitTestResult.IMAGE_TYPE || result.type == HitTestResult.SRC_IMAGE_ANCHOR_TYPE || result.type == HitTestResult.SRC_ANCHOR_TYPE) { - showContextMenuLinkDialog(result.extra) + private fun confirmAdSiteAddition(url: String?) { + lifecycleScope.launch { + val domain = TextInputDialog( + this@BrowserActivity, + "Ad Url to be blocked", + "", + Uri.parse(url).host ?: "" + ).show() ?: "" + + if (domain.isNotBlank()) { + config.adSites = config.adSites.apply { add(domain) } + ninjaWebView.reload() + } } } + override fun onLongPress(url: String?) = + showContextMenuLinkDialog(url, ninjaWebView.hitTestResult) + private fun showSavePdfDialog(url: String?) { val url = url ?: return diff --git a/app/src/main/java/de/baumann/browser/browser/AdBlock.java b/app/src/main/java/de/baumann/browser/browser/AdBlock.java index 80fea80e6..8db51b7be 100755 --- a/app/src/main/java/de/baumann/browser/browser/AdBlock.java +++ b/app/src/main/java/de/baumann/browser/browser/AdBlock.java @@ -5,15 +5,20 @@ import android.content.res.AssetManager; import android.util.Log; -import de.baumann.browser.database.RecordAction; -import de.baumann.browser.unit.RecordUnit; - import java.io.BufferedReader; import java.io.IOException; import java.io.InputStreamReader; import java.net.URI; import java.net.URISyntaxException; -import java.util.*; +import java.util.ArrayList; +import java.util.HashSet; +import java.util.List; +import java.util.Locale; +import java.util.Set; + +import de.baumann.browser.database.RecordAction; +import de.baumann.browser.preference.ConfigManager; +import de.baumann.browser.unit.RecordUnit; public class AdBlock { private static final String FILE = "hosts.txt"; @@ -21,21 +26,20 @@ public class AdBlock { private static final List whitelist = new ArrayList<>(); @SuppressLint("ConstantLocale") private static final Locale locale = Locale.getDefault(); + private static ConfigManager config; private static void loadHosts(final Context context) { - Thread thread = new Thread(new Runnable() { - @Override - public void run() { - AssetManager manager = context.getAssets(); - try { - BufferedReader reader = new BufferedReader(new InputStreamReader(manager.open(FILE))); - String line; - while ((line = reader.readLine()) != null) { - hosts.add(line.toLowerCase(locale)); - } - } catch (IOException i) { - Log.w("browser", "Error loading hosts", i); + config = new ConfigManager(context); + Thread thread = new Thread(() -> { + AssetManager manager = context.getAssets(); + try { + BufferedReader reader = new BufferedReader(new InputStreamReader(manager.open(FILE))); + String line; + while ((line = reader.readLine()) != null) { + hosts.add(line.toLowerCase(locale)); } + } catch (IOException i) { + Log.w("browser", "Error loading hosts", i); } }); thread.start(); @@ -88,11 +92,11 @@ public boolean isWhite(String url) { boolean isAd(String url) { String domain; try { - domain = getDomain(url); + domain = getDomain(url).toLowerCase(locale); } catch (URISyntaxException u) { return false; } - return hosts.contains(domain.toLowerCase(locale)); + return hosts.contains(domain) || config.getAdSites().contains(domain); } public synchronized void addDomain(String domain) { diff --git a/app/src/main/java/de/baumann/browser/browser/NinjaWebViewClient.kt b/app/src/main/java/de/baumann/browser/browser/NinjaWebViewClient.kt index bd9f7062d..67e1767b0 100755 --- a/app/src/main/java/de/baumann/browser/browser/NinjaWebViewClient.kt +++ b/app/src/main/java/de/baumann/browser/browser/NinjaWebViewClient.kt @@ -67,7 +67,7 @@ class NinjaWebViewClient(private val ninjaWebView: NinjaWebView) : WebViewClient if (ninjaWebView.shouldHideTranslateContext) { ninjaWebView.postDelayed({ ninjaWebView.hideTranslateContext() - }, 3000) + }, 2000) } } @@ -128,7 +128,7 @@ class NinjaWebViewClient(private val ninjaWebView: NinjaWebView) : WebViewClient } private val webResourceResponse = WebResourceResponse( - BrowserUnit.MIME_TYPE_TEXT_PLAIN, + BrowserUnit.MIME_TYPE_IMAGE, BrowserUnit.URL_ENCODING, ByteArrayInputStream("".toByteArray()) ) diff --git a/app/src/main/java/de/baumann/browser/preference/ConfigManager.kt b/app/src/main/java/de/baumann/browser/preference/ConfigManager.kt index 6c640659b..df853b8f0 100644 --- a/app/src/main/java/de/baumann/browser/preference/ConfigManager.kt +++ b/app/src/main/java/de/baumann/browser/preference/ConfigManager.kt @@ -176,6 +176,10 @@ class ConfigManager(private val context: Context) { get() = TranslationMode.values()[sp.getInt(K_TRANSLATION_MODE, if (Build.MANUFACTURER == "ONYX") 0 else 1)] set(value) = sp.edit { putInt(K_TRANSLATION_MODE, value.ordinal)} + var adSites: MutableSet + get() = sp.getStringSet(K_ADBLOCK_SITES, mutableSetOf()) ?: mutableSetOf() + set(value) = sp.edit { putStringSet(K_ADBLOCK_SITES, value) } + private fun iconStringToEnumList(iconListString: String): List { if (iconListString.isBlank()) return listOf() @@ -223,6 +227,7 @@ class ConfigManager(private val context: Context) { const val K_DESKTOP = "sp_desktop" const val K_TRANSLATE_LANGUAGE = "sp_translate_language" const val K_TRANSLATE_ORIENTATION = "sp_translate_orientation" + const val K_ADBLOCK_SITES = "sp_adblock_sites" private const val ALBUM_INFO_SEPARATOR = "::::" } diff --git a/app/src/main/java/de/baumann/browser/unit/BrowserUnit.kt b/app/src/main/java/de/baumann/browser/unit/BrowserUnit.kt index 639fa7a9a..33acaaf4f 100755 --- a/app/src/main/java/de/baumann/browser/unit/BrowserUnit.kt +++ b/app/src/main/java/de/baumann/browser/unit/BrowserUnit.kt @@ -35,6 +35,7 @@ object BrowserUnit { const val SUFFIX_PNG = ".png" private const val SUFFIX_TXT = ".txt" const val MIME_TYPE_TEXT_PLAIN = "text/plain" + const val MIME_TYPE_IMAGE = "image/png" private const val SEARCH_ENGINE_GOOGLE = "https://www.google.com/search?q=" private const val SEARCH_ENGINE_DUCKDUCKGO = "https://duckduckgo.com/?q=" private const val SEARCH_ENGINE_STARTPAGE = "https://startpage.com/do/search?query=" diff --git a/app/src/main/res/layout/dialog_menu_context_link.xml b/app/src/main/res/layout/dialog_menu_context_link.xml index 7a1970e6f..d0aa55cfd 100755 --- a/app/src/main/res/layout/dialog_menu_context_link.xml +++ b/app/src/main/res/layout/dialog_menu_context_link.xml @@ -188,6 +188,37 @@ android:textColor="?android:attr/textColorPrimary" /> + + + + + + + + diff --git a/app/src/main/res/values-zh-rTW/strings.xml b/app/src/main/res/values-zh-rTW/strings.xml index 49af4ed20..075feb144 100644 --- a/app/src/main/res/values-zh-rTW/strings.xml +++ b/app/src/main/res/values-zh-rTW/strings.xml @@ -42,7 +42,7 @@ 儲存截圖 存為首頁 加入書籤 - 儲存 PDF + 儲存為... 存成 PDF 分享 PDF 複製網址