Jetpack Compose 遷移 (1)

近幾個月斷斷續續替 MetroRide 的界面由傳統 view system(即是 layout XML)轉為 Jetpack Compose,順帶補上去年參加 iThome 鐵人賽時用來做示範的重鐵抵站時間功能。昨天新版 app 上架了就來分享一下遷移過程。其實這個 app 在之前的版本有把其中一頁靜態的頁面(延誤定義)改用 Compose,那時是在 Fragment 內的 onCreateView 加入 setContent 顯示 Compose 內容。由於那時只是做排版,沒有遇到大問題。之後開始慢慢轉用 Compose 才遇到問題。 ...

July 24, 2022

AndroidX Room Relational Query Method

最近為 MetroRide 做新功能,剛好有個地方可以用到 Room 2.4 的新功能:Relational Query Method。這個功能可以把平常 table 之間的 relationship 用 Map 一次過 return 出來,不用像以前般要特製一個專門的 data class 來做 DAO query method 的 return type(正式名稱叫做 intermediate data class)。 ...

January 29, 2022

2021 iThome 鐵人賽 Day 30:Wrapping up

本篇文章是 2021 iThome 鐵人賽參賽題目「寫一個列車抵站時間 Android App」的第 30 篇,你可到 iThome 查看原文。 文章目錄 終於來到最後一篇了!不經不覺已經寫了三十篇文章。我們由 Ktor client 接駁 API 一直講到 UI,然後再做 ViewModel 的 unit testing。中間加插了時間處理、Flipper 和 proxy server 的內容。其實這些內容有部分是以前工作上跟 Android 同事定期會議分享的內容。那時已經有想法把內容放到自己的 blog 上,但最後只是放了小許。現在有這個機會就加插這些內容進去。除了用來填滿三十篇之外,就是把一些不會直接在 Android 開發教學找到但又實用的東西放進去。我在八月尾才決定題目,然後開始寫開首的文章,並且準備示範 project 的 code。初初寫的時候以為三十篇是很多,所以開頭寫的內容不夠充實。但到了多 code snippet 的部分就發覺光是 code 就很長,要分拆做好幾篇。所以三十篇入面光是不同的 unit testing 都佔了十篇。由於我是一邊寫文一邊準備示範 project,所以內容分配是頭輕尾重,尤其是後段做 UI 的部分一篇的長度比開首的文章長幾倍。還有是內容可能有時會跟前一兩篇重覆(好像 Dagger 某些內容有重覆提及)。本來還打算加插 Compose 的內容但發覺剩餘篇數太少而且寫完都不夠完整,所以改做 ViewModel 測試作罷。 ...

October 15, 2021

2021 iThome 鐵人賽 Day 29:Leftover topics

本篇文章是 2021 iThome 鐵人賽參賽題目「寫一個列車抵站時間 Android App」的第 29 篇,你可到 iThome 查看原文。 文章目錄 我們終於來到第廿九篇,我們這次討論的題目都是之前討論過的東西的延伸。因為篇幅和時間有限就只好把它們合併成一篇。 ...

October 14, 2021

2021 iThome 鐵人賽 Day 28:ETA screen testing (2)

本篇文章是 2021 iThome 鐵人賽參賽題目「寫一個列車抵站時間 Android App」的第 28 篇,你可到 iThome 查看原文。 文章目錄 上一篇我們寫了一些 EtaViewModel 的測試,這一篇會集中寫跟時間相關的測試。 之前在 EtaViewModel 我們定義了更新一次的間距常數 AUTO_REFRESH_INTERVAL,現在我們要在 EtaViewModelTest 用到它,所以要把它改成 public: ...

October 13, 2021

2021 iThome 鐵人賽 Day 27:ETA screen testing (1)

本篇文章是 2021 iThome 鐵人賽參賽題目「寫一個列車抵站時間 Android App」的第 27 篇,你可到 iThome 查看原文。 文章目錄 上一篇我們完成了車站列表頁的 ViewModel 和 Presenter 的 unit test。現在轉過去寫班次頁的 unit test。 EtaPresenter 首先我們寫 EtaPresenter 的 test。這次我們來點新意思:使用 JUnit 4 的 parameterized test,寫法跟之前 LineStationPresenterTest 很不同。Parameterized test 的基本格式是: ...

October 12, 2021

2021 iThome 鐵人賽 Day 26:Station list screen testing

本篇文章是 2021 iThome 鐵人賽參賽題目「寫一個列車抵站時間 Android App」的第 26 篇,你可到 iThome 查看原文。 文章目錄 終於來到為 ViewModel 寫 unit test 的部分,亦都意味着這個系列快要完結。之前我們寫過其他 layer 的 unit test,用過 MockK 和 Strikt。來到現在偏向 UI 那邊的 unit test,我們會用到 Robolectric。 ...

October 11, 2021

2021 iThome 鐵人賽 Day 25:ETA screen (4)

本篇文章是 2021 iThome 鐵人賽參賽題目「寫一個列車抵站時間 Android App」的第 25 篇,你可到 iThome 查看原文。 文章目錄 現在來到整個 app 最後一個功能:錯誤 banner。這個 banner 出現的目的是因為鐵路隧道沿綫的電話上網訊號都接收得不太好(因為太多人同時在用),很容易出現錯誤。如果自動更新時有不能上網的錯誤會彈出全頁錯誤畫面的話效果就不太好。所以就設計了 banner 形式的顯示錯誤方式。 ...

October 10, 2021

2021 iThome 鐵人賽 Day 24:ETA screen (3)

本篇文章是 2021 iThome 鐵人賽參賽題目「寫一個列車抵站時間 Android App」的第 24 篇,你可到 iThome 查看原文。 文章目錄 我們這次會為班次頁加上自動更新和順帶為下一篇實作錯誤 banner 做準備。 我們這頁除非顯示不能連接到互聯網這類錯誤外,都不會出現重新載入按鈕,這是因為這頁就應該自動更新。按照 API 的介紹,它是每十秒更新一次。我們先準備一個 constant 來表示這個數值: ...

October 9, 2021

2021 iThome 鐵人賽 Day 23:ETA screen (2)

本篇文章是 2021 iThome 鐵人賽參賽題目「寫一個列車抵站時間 Android App」的第 23 篇,你可到 iThome 查看原文。 文章目錄 SavedStateHandle 不知道大家有沒有發現在「ETA Screen (1)」貼出來的 EtaViewModel 的 constructor 有一個 SavedStateHandle?在繼續完成餘下的錯誤情景前,我們先看看 SavedStateHandle 是甚麼。 ...

October 8, 2021