2021 iThome 鐵人賽 Day 20:Station list screen (2)

本篇文章是 2021 iThome 鐵人賽參賽題目「寫一個列車抵站時間 Android App」的第 20 篇,你可到 iThome 查看原文。 文章目錄 上一篇我們完成了 StationListAdapter,我們現在會繼續車站列表的 UI 部分。 ...

October 5, 2021

2021 iThome 鐵人賽 Day 19:Station list screen (1)

本篇文章是 2021 iThome 鐵人賽參賽題目「寫一個列車抵站時間 Android App」的第 19 篇,你可到 iThome 查看原文。 文章目錄 最近兩篇都是講 navigation component,入面為了示範設定 navigation 我們已經預先準備了兩頁的 Fragment class 和 layout XML,這樣我們之後就不用再跳去設定 navigation 的東西。現在開始會開始正式實作 app 的界面部分。我們會由車站列表頁開始實作,現在看看完成品: ...

October 4, 2021

2021 iThome 鐵人賽 Day 18:Navigation (2)

本篇文章是 2021 iThome 鐵人賽參賽題目「寫一個列車抵站時間 Android App」的第 18 篇,你可到 iThome 查看原文。 文章目錄 在 Android,navigation graph 是 resource 的一種,我們先建立 eta.xml。 eta.xml 在 project 的位置 先附上完整的內容,然後再慢慢講解入面的意思。 ...

October 3, 2021

2021 iThome 鐵人賽 Day 17:Navigation (1)

本篇文章是 2021 iThome 鐵人賽參賽題目「寫一個列車抵站時間 Android App」的第 17 篇,你可到 iThome 查看原文。 文章目錄 經過了兩個多星期後,我們終於開始進入 presentation layer 的部分。Presentation layer 就是做 UI 相關的東西,例如 Activity、Fragment、ViewModel 這些 class。而這次要做的部分是要準備基本的 navigation。 ...

October 2, 2021

2021 iThome 鐵人賽 Day 16:Domain layer testing

本篇文章是 2021 iThome 鐵人賽參賽題目「寫一個列車抵站時間 Android App」的第 16 篇,你可到 iThome 查看原文。 文章目錄 今天會為上一篇所寫的兩個 use case 加上 unit test。 GetLinesAndStationsUseCaseImplTest 這個 test 其實很簡單,因為本身就是直接把 EtaRepository 拿到的 Map return 出去,所以 unit test 我們只需 mock EtaRepository 的 getLinesAndStations 然後檢查 use case return 出來的 map 是不是跟我們 mock 出來的 getLinesAndStations return value 是否一致即可。 ...

October 1, 2021

2021 iThome 鐵人賽 Day 15:Domain layer implementation

本篇文章是 2021 iThome 鐵人賽參賽題目「寫一個列車抵站時間 Android App」的第 15 篇,你可到 iThome 查看原文。 文章目錄 經過這麼多集的 data layer 後,我們來到 domain layer。Domain layer 的用途是用來放 business logic,並向 presentation layer(即是 Activity、Fragment、ViewModel、layout XML 這層)提供一個表象 (façade) 去用跟 data 互動。你或許會問為甚麼我們不在 ViewModel 直接 call 之前寫好的 repository 而要經 domain layer,這是為了日後功能變更提供彈性。例如一個新聞 app 會有新聞列表頁跟新聞正文頁,當按下新聞列表的項目時就會進入正文頁。在正文頁按了收藏後返回列表頁就會發現剛才那個項目出現了一個收藏 icon。如果在 data layer 跟 presentation layer 之間直接接駁的話,那個列表頁在收藏狀態變動後自動更新的 logic 就會放入 ViewModel 內。(可能是正文頁在按下收藏 icon 時用 event bus 通知其他 ViewModel 去更新 UI。)如果再多幾個地方跟那個收藏狀態有關連的話那些觸發檢查更新的 code 就會放在各個 ViewModel 之中,日後收藏功能再有改動就很麻煩。另外,一些複雜的東西例如之前提及過的車費計算都不是單純在網路上 call API 然後稍加修飾就輸出去 UI 上,而是真的有 business logic 在 mobile app 內進行。那些 business logic 都是會放在 domain layer 入面。可能車費計算背後有很多的 class,但我們只外露幾個 use case 或者 interactor 讓 presentation layer call,這樣就把背後複雜的東西隱藏起來。 ...

September 30, 2021

2021 iThome 鐵人賽 Day 14:Flipper

本篇文章是 2021 iThome 鐵人賽參賽題目「寫一個列車抵站時間 Android App」的第 14 篇,你可到 iThome 查看原文。 文章目錄 在繼續實作 domain layer 之前,我們會介紹一個方便日常開發的工具:Flipper。 Android Studio 有個功能是查看 HTTP request 和 UI layout,但有時不太方便。如果是查看 HTTP request 的話,有些人會用 proxy server 來截取 HTTP request 和 response。但有個問題是裝置要先安裝 proxy server 的 root certificate,而且部分 app 或 SDK 會做 cert pinning,駁了 proxy server 就用不到那些 app 或 SDK(Google Places SDK 會有這個問題)。 ...

September 29, 2021

2021 iThome 鐵人賽 Day 13:Data layer testing (4)

本篇文章是 2021 iThome 鐵人賽參賽題目「寫一個列車抵站時間 Android App」的第 13 篇,你可到 iThome 查看原文。 文章目錄 上一篇示範了 Ktor mock engine 的設定和測試了如果出現 exception 時能否順利地處理。現在就測試 getEta 輸出班次的情景。 ...

September 28, 2021

2021 iThome 鐵人賽 Day 12:Data layer testing (3)

本篇文章是 2021 iThome 鐵人賽參賽題目「寫一個列車抵站時間 Android App」的第 12 篇,你可到 iThome 查看原文。 文章目錄 上一篇我們寫好了 EtaResponseMapper 的 unit test。但 data layer 還有 EtaResponseMapper 未寫 unit test。今天我們就寫這一個 class 的 unit test。 ...

September 27, 2021

2021 iThome 鐵人賽 Day 11:Data layer testing (2)

本篇文章是 2021 iThome 鐵人賽參賽題目「寫一個列車抵站時間 Android App」的第 11 篇,你可到 iThome 查看原文。 文章目錄 今天會繼續寫 EtaResponseMapperTest。我們示範的 test case 是正常輸出班次的情景。首先是準備 response: ...

September 26, 2021