iT邦幫忙

2021 iThome 鐵人賽

DAY 27
0
Mobile Development

如何開發適合電子書閱讀器使用的瀏覽器 Android APP系列 第 27

電子書閱讀器上的瀏覽器 [Day27] 無痕模式

原先的 browser 實作就已經包含了無痕模式的細部功能,像是禁止使用 Cookie,和不記錄瀏覽歷史;但是卻沒有一個快速開關能夠進到一般瀏覽器支援的無痕模式。

所以,今天我來講講怎麼實作一鍵進入無痕模式。

新增無痕模式開關的進入點

首先,將進入點實作在長按分頁鍵。這是個蠻合理的位置。並在ConfigManager 中加入一個關於無痕模式的狀態。

binding.omniboxTabcount.setOnLongClickListener {
    config.isIncognitoMode = !config.isIncognitoMode
    true
}

ConfigManager 的狀態被改變時,BrowserActivity 會將這個狀態傳入當前的 WebView 分頁中,然後 updateWebViewCountUI() 將分頁預覽按鈕的圖案改成是虛線的。

private val preferenceChangeListener = SharedPreferences.OnSharedPreferenceChangeListener { _, key ->
        key.equals(ConfigManager.K_IS_INCOGNITO_MODE) -> {
            ninjaWebView.incognito = config.isIncognitoMode
            updateWebViewCountUI()
            NinjaToast.showShort(
                this,
                "Incognito mode is " + if (config.isIncognitoMode) "enabled." else "disabled."
            )
        }
	...
}

WebView 中的實作

再來看看 NinjaWebView 中的修改。首先也是增加 incognito 的狀態。當它被賦值時,會同時去呼叫 toggleCookieSupport(),藉此開關 Cookie 的支援。

var incognito: Boolean = false
    set(value) {
        field = value
        toggleCookieSupport(!incognito)
    }

除了 Cookie 開關外,在 NinjaWebViewClient 中的 onPageFinished() 原先有在記錄瀏覽歷轉的地方,也要多加上 incognito 的判斷才行:

override fun onPageFinished(view: WebView, url: String) {
    // skip translation pages
    if (config.saveHistory && !ninjaWebView.incognito && !isTranslationDomain(url)) {
        addHistoryAction(url)
    }
	...
}

如此一來,就可以在主畫面快速地切換到無痕模式,不用再一樣樣功能去切來切去。使用上方便許多。


上一篇
電子書閱讀器上的瀏覽器 [Day26] 保持畫面不會自動關閉
下一篇
電子書閱讀器上的瀏覽器 [Day28] 上架到 F-Droid
系列文
如何開發適合電子書閱讀器使用的瀏覽器 Android APP30

尚未有邦友留言

立即登入留言