iT邦幫忙

2021 iThome 鐵人賽

DAY 17
0
Mobile Development

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

電子書閱讀器上的瀏覽器 [Day17] 利用 Room 強化書籤功能

  • 分享至 

  • xImage
  •  

書籤功能在電腦瀏覽器是個很重要的功能,因為操作方便,所以通常會記錄一大堆連結,並且分門別類放在不同的目錄中。但是手機上的瀏覽器,情況略有不同。大部分人比較常用的功能,應該都已經下載對應的 APP 了;剩下一些不常用的服務,才會開啟網頁偶爾使用;或是需要搜尋網頁內容時,會開啟瀏覽器;再來是很大一部分是從其他 APP 中轉導到瀏覽器的。這些應用場景,都不見得需要像電腦上一樣,建立書籤、管理書籤。

但是目前開發中的 browser 的性質又跟一般手機上的瀏覽器不大一樣,因為它是設計給電子紙設備使用的。在電子紙設備上,大部分的 APP 使用體驗並不好,所以我預期(至少我自己)使用者在使用電子書閱讀器時,除了看電子書外,很多事情是在 browser 上完成的。也因此,有足夠強大的書籤功能才能符合(我的)需求。

書籤目錄

原本的書籤功能還算堪用,能新增/刪除,或是長按書籤做修改或其他小功能(加到桌面、存為首頁、前景/背景開啟新分頁)。這次花了點時間,幫它加上了新增目錄的功能。

一般電子書閱讀器的尺寸至少6吋起跳,所以一個畫面可以顯示十幾二十個書籤;但是如果在電子紙手機上的話(像是海信 A5),15 個以上就要開始滑動畫面以看到更多的書籤。如果能把相同性質的書籤放在同個目錄,那多按個兩下就可以開啟網頁,會比一直滑動畫面來得有效率。

畫面1 畫面2
https://ithelp.ithome.com.tw/upload/images/20210917/20140260UmcaZvSpgp.png https://ithelp.ithome.com.tw/upload/images/20210917/20140260h6S2Aq5Tu7.png

既然有了書籤目錄,自然要有方式來把書籤放到想要的地方去。所以,在編輯書籤的畫面多了一個目錄選項。Top 表示第一層,其他的選項,就是使用者已經建立的目錄名稱。建立目錄可以在書籤頁開啟後,點三個點按鈕,選擇新增書籤目錄 。雖然這方式不是很直覺,而且要一個一個書籤去調整,不過,至少是個在有限時間內可以開發出來的功能。

以後有時間的話,再考慮做成可以直接在書籤列表用拖拉的方式來調整。

畫面3 畫面4
https://ithelp.ithome.com.tw/upload/images/20210917/20140260YS29ZJmCNU.png https://ithelp.ithome.com.tw/upload/images/20210917/20140260eyxVq1sFl9.png

技術細節

舊版的書籤實作,是直接操作 SQLiteOpenHelper,寫了一堆 CRUD 的 SQL 語法,並且要自行處理 cursor 的開開關關。如果我要在這基礎上加上目錄的功能,感覺會很麻煩,而且很原始。所以我決定把它打掉重練。畢竟,Room 都出來那麼久了,沒道理不用比較新的,單純的作法。

引入 Room 後,先是替書籤 data model 加入是否為目錄的判斷,並為每個書籤加上 parent 的概念。

https://ithelp.ithome.com.tw/upload/images/20210917/20140260chx7LijNrQ.png

接下來是建立 Dao interface 來存取資料庫。從下面可以看到,這些函式都宣告成 suspend function。這樣子之後在使用時,就可以用 coroutine 輕鬆確保這些操作都不會跑在 main thread 中。

https://ithelp.ithome.com.tw/upload/images/20210917/20140260Jw0w0BReci.png

最後,寫個 Manager 把建立資料庫實體的實作包裝起來:

https://ithelp.ithome.com.tw/upload/images/20210917/20140260HswksKqAzR.png
上面 47 行有個函式叫 migrateOldData(),這是用來將使用者舊版的書籤資料搬到新的資料庫;也是這次的實作中,唯一接觸到 cursor 的部分。搬運完成後,順手寫到 preference 中,以後開啟 App 時就不用再搬一次啦。

https://ithelp.ithome.com.tw/upload/images/20210917/201402603emH9e3teH.png

這些都完成後,在 Activity 中需要顯示書籤時,呼叫上面的 Manager,拿到資料,再餵進 Adapter 就行了。這邊針對目錄和書籤有不同的處理方式,分別在 1212 行和 1214 行:前者是點擊後要把畫面的書籤列表更新為目錄中的項目;後者是把畫面的網頁載入書籤連結。

https://ithelp.ithome.com.tw/upload/images/20210917/201402606BY5kzHd2C.png

這樣就大致完成啦!

備分/還原書籤

這功能主要是因為我有太多台電子書閱讀器,平常常用的只有一兩台,偶爾要換到別台使用時,苦於上頭的 EinkBro 沒有完整的書籤列表,都得再透過搜尋的方式找到網頁。

通常要同步資料的話, App 起手式作法是,跟雲端結合,把資料都往雲端送。但是我完全不想要讓 browser 有把任何資料送到哪個雲端去的功能,所以,做個可以把資料備份出來,傳送到別台機器上,再用匯入的方式,是目前比較可行的作法。雖然步驟了點,但可以讓 browser 不會因為扯上雲端而增加複雜度。那類功能就留給 Firefox, Chrome 就好了。

目前的作法很簡單,把上面透過 Room 建立好的書籤資料庫全讀出來,轉成 json 格式,再寫到檔案系統中。預設的檔名是 bookmarks.json。拿到這檔案後,傳到另一台設備上,再匯入 json 檔就可以了。
這功能是做在設定 → 備份畫面中。

https://ithelp.ithome.com.tw/upload/images/20210917/20140260Y1wTVdp7vJ.png

因為不想再引用其他的 json 函式庫,所以很簡單地包了 JSONObject 的實作:

https://ithelp.ithome.com.tw/upload/images/20210917/20140260SxvWJXFM2p.png

這一篇長了點,稍微復習了一下 Room 的使用方式。下一篇會來談談怎麼讓目前的 browser 支援夜間模式。


上一篇
電子書閱讀器上的瀏覽器 [Day16] 網頁匯出成 epub 檔案 (II)
下一篇
電子書閱讀器上的瀏覽器 [Day18] 支援夜間模式
系列文
如何開發適合電子書閱讀器使用的瀏覽器 Android APP30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言