Skip to content

Latest commit

 

History

1,184 Commits

Folders and files

NameName
Last commit message
Last commit date
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 

Repository files navigation


License Kotlin Android Jetpack Compose

Get it on Google Play Get it on F-Droid

繁體中文 | English

總覽

TigerDuck 手機介面      TigerDuck Wear OS 介面

TigerDuck 是由一群學生共同開發的校園助手
為了解決資源零散、通知不及時與介面不直觀等問題
有用過 TAT 嗎,我們努力把 TigerDuck 做得更 OAO

專案目前持續開發中,部分功能仍在完善與調整。

📚 作業

  • 一眼就知道還有多少作業沒有繳交
  • 全自動從 Moodle 同步作業與截止日期,再也不被教授偷襲!
  • 進行中通知與訊息提醒,別等到最後一小時才收到 Moodle 的通知

📋 課表

  • 從選課系統同步,不用再等 Moodle 延遲
  • 互動式時間軸滑條,下一節課在哪一目了然!

📊 歷年成績

  • 學期 / 累計 GPA、排名、各科成績一次看完
  • 互動式圖表追蹤成績走勢

🗓️ 行事曆

  • 整合校方 ICS 行程與 Moodle 作業截止
  • 月曆檢視、切換日期、下拉同步

📢 公告

  • 各處室、中心公告全部整合在一頁
  • 後端 LLM 自動分類去重,可訂閱類別並設未讀篩選
  • 重要消息可由運營者透過伺服器推播即時送達(設定中可關閉)

🏛️ 圖書館(實驗性)

  • 秒開入館 QR-Code,無任何延遲
  • 翻面就開:把手機面朝下放著,自動跳到入館 QR-Code
  • 登入、QR 等敏感畫面自動啟用 FLAG_SECURE,防止截圖 / 錄影

🌏 外觀

  • 與 iOS 共用 65 種語系翻譯,自行設定或跟著系統語言切換
  • 名字過長?課程 / 教室名稱自動簡寫

🎨 客製化

  • 要就加,不要就刪掉
  • 編輯 Tab、首頁區塊自由增減、選擇主題色
  • 各情境震動可逐項開關(含翻面開啟 QR 等)

☁️ 跨裝置同步(TigerSync)

  • 同步內容分成作業(作業、作業到期提醒、即時更新)與課表(所有課程、課程顏色、自訂課程名稱)兩組,逐項選擇要不要同步
  • 跨平台:macOS、iPad、iPhone 與 Android 只要開啟 TigerSync 就會互相同步,作業提醒與即時更新的設定也一起帶過去
  • F-Droid 版沒有 Google 推播服務,TigerSync 只保留「取得必要資訊」
  • 沒開啟的項目只留在本機;關掉同步後,資料一律不離開這台裝置

🔄 自動更新(Play 限定)

  • 內建 Play In-App Update FLEXIBLE 流程,新版本主動提示
  • 升級後顯示「最新更新內容」對話框,讓你一眼看完新功能

Wear OS(Play 限定)

  • Now & Next 主畫面:當下 / 下一節課與進行中課程進度條
  • Today 列表與課程詳情頁
  • TileComplication,把下一節課放到主畫面 / 錶面
  • 透過 Wearable Data Layer 自動從手機同步課表、語系、主題色
  • 入館 QR-Code 直接上手錶:憑證由手機加密下發,手錶自行更新,不用掏手機
  • 點擊空狀態可從手錶喚起手機上的 TigerDuck

開發規劃

🎓 教務與學習

  • 作業 – 全自動同步 Moodle 作業
  • 作業+ – 訊息與進行中通知
  • 課表 – 擷取自選課系統
  • 課表+ – 可修改的課程名稱、可刪除的課程
  • 行事曆 – 整合校公告、Moodle 等行程資訊
  • 歷年 GPA 與排名查詢 – 學期 / 累計 / 各科成績 + 互動式圖表
  • 畢業門檻學分計算 – 各通識向度、院 / 系學分、體育、國文、英文等檢核

📝 選課相關

  • 選課查詢 – 同時顯示 GPA,提升選課決策效率
  • 中籤機率估算與志願序建議 – 根據人數上限與目前選課人數估算

📚 圖書館服務

  • 圖書館出入館 QR-Code – 快速開啟入館 QR-Code
  • 翻面開啟 QR-Code – 手機面朝下放置自動跳到入館 QR
  • 圖書館討論小間借用 – 支援討論室預約與借用查詢
  • 臺科大圖書館講座活動 – 包含活動報名與查詢(需校內連線)

📣 校園資訊

  • 各處室、中心公告 – 支援公告整合
  • 公告 LLM 分類 + 訂閱通知 – 後端自動分類去重、可訂閱類別、未讀篩選
  • 伺服器推播提醒 – 由運營者手動發送的單次推播,可在設定開關
  • 獎學金資訊 – 支援 Filter,可依低收、中低收、原住民等條件過濾
  • 當日社團活動 – 整理每日社團活動資訊
  • 空教室查詢 – 快速查詢目前可使用的教室

🍱 校園生活

  • 免費便當通知 – 任何人可實名登記,並整合台科大、台大相關資訊,主動推播通知

🌏 在地化與無障礙

  • 多語系(與 iOS 共用,65 語系) – 跟著系統或在 App 內單獨切換
  • 課程 / 教室名稱簡稱 – 一鍵切換、可還原
  • RTL 版面修正 – 阿拉伯語 / 希伯來語等右至左語系排版

🔔 通知與隱私

  • TigerDuck 風格通知圖示與震動情境設定
  • 公告通知頻道(一般 / 靜音)可獨立調整
  • In-App Update + 最新更新內容對話框 – Play 版升級主動提示
  • 敏感畫面 FLAG_SECURE – 登入、入館 QR 等防止截圖 / 螢幕錄影
  • 帳號刪除入口 – 設定內可申請刪除伺服器端推播身分
  • 通知權限設定 – 通知權限、精確鬧鐘與背景活動限制集中在一頁,點一下前往對應的系統設定

⌚ Wear OS(Play 限定)

  • Now & Next 主畫面 – 當下 / 下一節課與進行中課程進度條
  • Today 列表 + 課程詳情
  • Tile 與 Complication – 下一節課直接顯示在主畫面 / 錶面
  • Phone ↔ Watch 同步 – 透過 Wearable Data Layer 同步課表、登入狀態、語系與主題色
  • 手錶入館 QR-Code – 憑證由手機加密下發,手錶端加密保存並自動更新
  • 空狀態喚醒 – 從手錶呼起手機上的 TigerDuck

系統需求

項目 需求
作業系統 Android 10(API 29)以上
Wear OS Wear OS 3(API 30)以上,需與 Play 版手機 App 配對
SSO 帳號 學生帳號(部分功能需要)
圖書館 圖書館帳號(部分功能需要)






開發環境建置

Kotlin Android Studio

需求

  • Android Studio(建議最新版)
  • Android SDK Platform 37
  • JDK 21(Gradle 9.7 / AGP 9.3 需要 JDK 17 以上)

Android App

# clone 專案(含子模組:app-translation、name-abbr)
git clone --recurse-submodules https://github.com/tigerduck-app/tigerduck-app-android.git
cd tigerduck-app-android

# 已經 clone 過的話,補抓子模組
git submodule update --init --recursive

# 以 Android Studio 開啟,或用 Gradle 直接 build
# 目前有 fdroid 與 play 兩個 product flavor,請擇一
./gradlew :app:assembleFdroidDebug   # 或 :app:assemblePlayDebug
./gradlew :app:installFdroidDebug    # 或 :app:installPlayDebug

💡 課程/教室簡稱(name-abbr/)與多語系字串(app-translation/generated/android/)皆由子模組提供,clone 後 務必先抓子模組再開 Android Studio,否則 build 會找不到資源檔。

Wear OS App(:wear 模組)

Wear OS 為 Play 限定:與 Play 版手機 App 共用 applicationId = org.ntust.app.tigerduck,並透過 :shared 模組共用 Course / PeriodTimes / NextClassResolver / AppClock 等課表邏輯。

./gradlew :wear:assembleDebug
./gradlew :wear:installDebug   # 需先連上 Wear OS 模擬器或實機

⚠️ Wear App 依賴 play-services-wearable(GMS)才能與手機配對,與 F-Droid 政策不相容,因此不提供 F-Droid 變體,也不會出現在 F-Droid 商店上。

一鍵安裝腳本(debug/

debug/ 目錄收錄了三支安裝腳本,會依 ro.build.characteristics 自動把 APK 推到對的裝置,遇到同時連著手機 + 手錶時尤其方便:

腳本 用途
./debug/install-fdroid.sh 編譯並安裝 :app:fdroidDebug
./debug/install-play.sh 編譯並安裝 :app:playDebug,並可同時把 :wear:debug 推到配對的手錶
./debug/install-play-release.sh 編譯並安裝 :app:playRelease(與 :wear:release),用來測 R8 / 簽章行為

更詳細的 build variant 說明、debug 時鐘覆寫(時光旅行測試)、無線 ADB、push backend 對接與常見錯誤排查,請見 debug/DEBUG.md

多語系翻譯(Android + iOS 共用)

翻譯字串放在 app-translation/ 子模組,與 iOS 共用。

  • 翻譯原始檔在 app-translation/source/,共 55 份(en.jsonzh-Hant.jsonja.jsonko.jsonar.json …)
  • 共用翻譯輸出在 app-translation/generated/
    • Android:android/values/strings.xml(繁中預設)、android/values-<lang>/strings.xml
    • Apple(iOS / macOS):apple/<lang>.lproj/Localizable.strings
  • Android App 使用的 app/src/main/res/values*/strings.xml 會由同一支腳本同步覆寫,請不要手動改動生成檔。

手動同步一次翻譯:

python3 tools/localization/sync_localizations.py

Gradle 也能在編譯前自動跑一次,但預設不啟用——要加上 -PsyncLocalizationssyncLocalizations 才會掛到 preBuild 上(見 app/build.gradle.ktswear/build.gradle.kts):

./gradlew :app:assemblePlayDebug -PsyncLocalizations

新語系或字串請對 app-translation/ 子模組另開 PR,* *不要**直接改生成檔。

課程名稱簡稱

name-abbr/ 子模組提供與 iOS 共用的課程 / 教室簡稱字典,避免長名稱破版。

專案架構

tigerduck-app-android/                  # Android App + Wear OS(Kotlin 2.4 / Compose / API 29+)
├── app/                                # 手機 App(fdroid / play 兩種 flavor)
│   ├── build.gradle.kts
│   └── src/main/java/org/ntust/app/tigerduck/
│       ├── auth/                       # NTUST SSO 認證、登入狀態
│       ├── data/
│       │   ├── cache/                  # 檔案快取
│       │   ├── model/                  # Domain / DTO 模型
│       │   └── preferences/            # App 偏好與憑證管理(EncryptedSharedPreferences)
│       ├── debug/                      # Debug 時鐘覆寫、API endpoint override 等開發者工具
│       ├── di/                         # Hilt 模組
│       ├── liveactivity/               # 即時動態 / 進行中通知
│       ├── network/                    # 課表 / Moodle / 公告 / 圖書館 API
│       │   └── model/
│       ├── notification/               # 作業到期通知排程、通知頻道
│       ├── push/                       # FCM 註冊與伺服器 API 用戶端
│       ├── sensor/                     # 翻面偵測(FlipDetector)
│       ├── serverpush/                 # 伺服器推播彈窗協調 + intent token
│       ├── ui/
│       │   ├── component/              # 共用 Composable
│       │   ├── navigation/             # NavHost / Tab navigation
│       │   ├── screen/                 # 各頁面與 ViewModel
│       │   │   ├── home/               # 首頁(時間滑條、作業、區塊客製化)
│       │   │   ├── classtable/         # 課表
│       │   │   ├── calendar/           # 行事曆
│       │   │   ├── announcements/      # 公告整合、LLM 分類、訂閱規則
│       │   │   ├── library/            # 圖書館
│       │   │   ├── score/              # 歷年成績與排名
│       │   │   ├── more/               # 「更多」聚合頁
│       │   │   ├── settings/           # 設定(語言、Tab、通知、震動、伺服器推播、即時動態、來源碼)
│       │   │   ├── whatsnew/           # 「最新更新內容」對話框
│       │   │   └── onboarding/         # 初次使用引導 + 隱私同意
│       │   ├── theme/                  # 主題、配色、視覺預設
│       │   └── AppState.kt
│       ├── update/                     # In-App Update gate + What's new repository
│       ├── widget/                     # 桌面 widget
│       ├── MainActivity.kt
│       └── TigerDuckApp.kt
├── shared/                             # 手機 + 手錶共用模組(`:shared`)
│   └── src/main/java/org/ntust/app/tigerduck/shared/
│       ├── clock/                      # AppClock 抽象(可被 debug 時鐘覆寫)
│       └── …                           # Course / PeriodTimes / CourseScheduleUtils / NextClassResolver
├── wear/                               # ⌚ Wear OS App(Play 限定,`:wear`)
│   └── src/main/java/org/ntust/app/tigerduck/wear/
│       ├── ui/                         # Now & Next / Today / 課程詳情 / 設定
│       ├── tile/                       # NextClassTileService
│       ├── complication/               # NextClassComplicationService
│       └── data/                       # DataLayerListener / SchedulePersistence / Repository / SyncRequester
├── debug/                              # 一鍵安裝腳本與 [DEBUG.md](debug/DEBUG.md)(build variants、debug 時鐘、push 等)
├── gradle/
│   └── libs.versions.toml              # Version Catalog
├── app-translation/                    # ⤴ git submodule:65 語系翻譯(含 `watch_*` 鍵)
├── name-abbr/                          # ⤴ git submodule:課程 / 教室簡稱字典
├── tools/localization/                 # 翻譯同步腳本(需 -PsyncLocalizations 才綁進 preBuild)
├── build.gradle.kts
└── settings.gradle.kts

貢獻

歡迎 PR 與 Issue!

送出前請確認

  1. 遵循現有的 Kotlin / Compose 程式碼風格與架構慣例
  2. 至少完成一次 :app:compileFdroidDebugKotlin / :app:compilePlayDebugKotlin:app:assembleFdroidDebug / :app:assemblePlayDebug
  3. feature/your-featurefix/your-fix 命名分支
  4. 發布 PR 時目標分支為 dev,並把機器人留言的 pre-merge checklist 逐項勾完 (送 main 的版本另外要求跑過 debug/ 三支腳本、驗過從舊版升級的路徑,並更新 app/src/main/assets/whatsnew.json
  5. 翻譯字串請改 app-translation/ 子模組(透過獨立 PR),不要直接改生成檔

授權

本專案採用 GNU Affero General Public License v3.0 授權。

About

由一群學生共同開發的校園助手,為了解決資源零散、通知不及時與介面不直觀等問題

Topics

Resources

Contributing

Stars

19 stars

Watchers

1 watching

Forks

Releases

Contributors

Languages