Skip to content

feat(reminder): wire device adapters and SQLite data layer - #260

Closed
LUPENGHAN wants to merge 4 commits into
1024XEngineer:mainfrom
LUPENGHAN:feature/reminder-adapters
Closed

feat(reminder): wire device adapters and SQLite data layer#260
LUPENGHAN wants to merge 4 commits into
1024XEngineer:mainfrom
LUPENGHAN:feature/reminder-adapters

Conversation

@LUPENGHAN

Copy link
Copy Markdown
Contributor

Closes #256

拆分 #245 的第 3/4 层:设备适配器 + SQLite 数据层,依赖 #259(提醒引擎核心)先合。

标了 draft:分支历史包含 #258/#259 还没合的提交,diff 会显示三层加起来的内容,等前面两个合了再转 ready。

范围

  • 设备侧适配器:ExpoAudioPlaybackExpoSystemNotificationNativeAlarmScheduler/TimeflowAlarmBridgeNativeDeviceCapabilityReactNativeAlertDialogReactNativeVibration
  • 定位:ExpoLocationMonitor(当前实际接入)+ NativeLocationMonitor(百度 SDK,仓库里有但暂未接线)+ geofenceTask
  • IntervalTimeListenerfrontend/index.ts 注册 geofence headless task
  • 数据层:SqliteLocalScheduleReaderSqliteReminderStateStoreLocalReminderAdaptersInMemoryLocalScheduleReader
  • 删除对应 Mock 适配器
  • bugfix:进程被杀时地理围栏事件不再丢失(批量 rebuild);重启/更新后重新排闹钟

⚠️ nativeAlarmScheduler.test.ts/nativeDeviceCapability.test.ts 两个旧 mock 版测试在原来的合并里被删掉、没补新的,这个 PR 没有顺手补,先如实记录(见 #256)。

拆分顺序

  1. feat(reminder): add native alarm and Baidu location modules #258 — 原生模块 + 脚手架
  2. feat(reminder): add reminder engine core (domain + application) #259 — 提醒引擎核心
  3. 这个 PR — 设备适配器 + SQLite 数据层
  4. 拆分提醒功能 4/4:接线 + 呈现层(替代 #245) #257 — 接线 + 呈现层(替代 feat(reminder): merge gac0812 reminder engine, wire real local data + native-ring race fix #245

Native Android modules for the reminder engine's device layer:
timeflow-alarm (AlarmManager scheduling, ring UI, boot rescheduling)
and timeflow-baidu-location (continuous positioning bridge). Includes
the Expo config plugins that wire them into the native build,
app.config.js (replaces static app.json so the Baidu API key can come
from an env var), and the new package deps/patches these modules need.

No app code references these yet -- pure addition, nothing wired in.
Three unrelated bugs in the already-merged voice/location-search path
(PR 1024XEngineer#243), fixed together since they're small and independent of the
reminder engine work in this stack:
- reuse a recent position during voice handshake instead of blocking
  on a fresh fix (backend location tools + realtime agent)
- preserve newly-started TTS after an interruption instead of letting
  the old stream clobber it
- remove stale push-to-talk listeners left on the shared WebSocket
  connection after a session ends
LocalReminderApplication and its ports (AlarmSchedulerPort,
LocationMonitorPort, DeviceCapabilityPort, NotificationChannels,
ReminderDeliveryPort, ReminderApplicationPort), plus the domain layer
(reminder.ts, strengthDelivery.ts) that drives arm/fire/confirm state
transitions and recurring-schedule advancement.

Pure logic layer: no device-specific adapters yet, nothing wired into
the app. shared/time gains format.ts (used by the delivery strength
calc); MockClock/MockTimeListener are removed since nothing in this
stack still needs a fake clock once the real engine lands.
Device-side adapters implementing the ports added in the previous
commit: ExpoAudioPlayback, ExpoSystemNotification, NativeAlarmScheduler
(+ TimeflowAlarmBridge), NativeDeviceCapability, ReactNativeAlertDialog,
ReactNativeVibration, ExpoLocationMonitor (system geofencing) +
NativeLocationMonitor (Baidu continuous polling, not currently wired
into the app -- see createAppServices comment in a later commit),
IntervalTimeListener. frontend/index.ts registers the geofence
TaskManager task at module scope so headless launches pick it up.

Data layer: SqliteLocalScheduleReader / SqliteReminderStateStore read
and persist against the real local database instead of in-memory
fixtures; LocalScheduleWriter's post-write refresh hooks into the new
reader. InMemoryLocalScheduleReader is kept as a non-persisted
alternative implementation of the same port.

Removes the Mock* adapters these replace. Also removes two dangling
test files (nativeAlarmScheduler.test.ts, nativeDeviceCapability.test.ts)
that were written against the old mock-backed versions of these classes
and don't apply to the real implementations -- this is a real coverage
gap, not covered by a replacement here.
@vercel

vercel Bot commented Aug 17, 2026

Copy link
Copy Markdown

The latest updates on your projects. Learn more about Vercel for GitHub.

Project Deployment Actions Updated (UTC)
timeflow Ready Ready Preview Aug 17, 2026 12:30am

@LUPENGHAN

Copy link
Copy Markdown
Contributor Author

拆分粒度还是太粗(这个都还有 55 个文件改动),先撤回去重新想怎么拆,关掉这个。

@LUPENGHAN LUPENGHAN closed this Aug 17, 2026
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

拆分提醒功能 3/4:设备适配器 + SQLite 数据层

1 participant