Skip to content
Merged

canary #7192

Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
12 changes: 6 additions & 6 deletions android/app/build.gradle
Original file line number Diff line number Diff line change
Expand Up @@ -170,13 +170,13 @@ android {
dimension "environment"
applicationId "me.tinykitten.trainlcd.dev"
versionNameSuffix "-dev"
versionCode 100000849
versionName "10.18.0"
versionCode 100000853
versionName "10.18.1"
}
prod {
dimension "environment"
versionCode 100000849
versionName "10.18.0"
versionCode 100000853
versionName "10.18.1"
}
// ストア配信する dev (Canary) と applicationId を分けた、ローカル検証専用のフレーバー。
// ストアの Canary 版を消さずに同居させるためだけに存在し、配信には使わない
Expand All @@ -186,8 +186,8 @@ android {
dimension "environment"
applicationId "me.tinykitten.trainlcd.local"
versionNameSuffix "-local"
versionCode 100000849
versionName "10.18.0"
versionCode 100000853
versionName "10.18.1"
}
}
}
Expand Down
12 changes: 6 additions & 6 deletions android/wearable/build.gradle.kts
Original file line number Diff line number Diff line change
Expand Up @@ -85,13 +85,13 @@ android {
dimension = "environment"
applicationIdSuffix = ".dev"
versionNameSuffix = "-dev"
versionCode = 100000850
versionName = "10.18.0"
versionCode = 100000854
versionName = "10.18.1"
}
create("prod") {
dimension = "environment"
versionCode = 100000850
versionName = "10.18.0"
versionCode = 100000854
versionName = "10.18.1"
}
// :app の local フレーバーと対になるローカル検証専用フレーバー。Wear の Data Layer は
// applicationId が一致する場合しか疎通しないため、:app を .local にしたときは
Expand All @@ -100,8 +100,8 @@ android {
dimension = "environment"
applicationIdSuffix = ".local"
versionNameSuffix = "-local"
versionCode = 100000850
versionName = "10.18.0"
versionCode = 100000854
versionName = "10.18.1"
}
}

Expand Down
6 changes: 3 additions & 3 deletions app.config.ts
Original file line number Diff line number Diff line change
Expand Up @@ -8,7 +8,7 @@ const IS_DEV = process.env.APP_VARIANT === 'dev' || IS_LOCAL;
export default {
name: 'TrainLCD',
slug: 'trainlcd',
version: '10.18.0',
version: '10.18.1',
plugins: [
'expo-image',
'expo-font',
Expand Down Expand Up @@ -64,7 +64,7 @@ export default {
userInterfaceStyle: 'automatic',
// Expo SDK 57 の各モジュール(expo / expo-modules-core ほか)は podspec で iOS 16.4 以上を要求する
deploymentTarget: '16.4',
buildNumber: '2954',
buildNumber: '2956',
scheme: IS_DEV ? 'CanaryTrainLCD' : 'ProdTrainLCD',
bundleIdentifier: IS_DEV
? 'me.tinykitten.trainlcd.dev'
Expand All @@ -78,7 +78,7 @@ export default {
? 'me.tinykitten.trainlcd.dev'
: 'me.tinykitten.trainlcd',
permissions: [],
versionCode: 100000849,
versionCode: 100000853,
},
owner: 'trainlcd',
experiments: {
Expand Down
31 changes: 31 additions & 0 deletions docs/changelog.md
Original file line number Diff line number Diff line change
Expand Up @@ -6,6 +6,37 @@ CLAUDE.md「Security & Configuration Guardrails」に従い、依存更新後に

新しいエントリを上に追加する。

## 2026-10-05 — ビルドに入っていなかった expo-task-manager のパッチを削除

対象バージョン: v10.18.0 時点の `dev`

### 内容

- `patches/expo-task-manager+57.0.13.patch` を削除した。`TaskManagerUtils.createJobInfo` の API 31+ 分岐で
`setExpedited(true)` を `setMinimumLatency(0)` と `setOverrideDeadline` に置き換えるパッチだった。
- `expo-task-manager` はビルド済みの AAR(`local-maven-repo`)を同梱し、`expo-module.config.json` に `publication` を持つ。
`buildFromSource` に入っていないため、Gradle は AAR を使い、`node_modules` のソースへのパッチはビルドに入らない。
このパッチを作った時点の 14.0.9 から 57.0.13 まで、どの版も同じ構成だった。
- #5163 で `app.json` の `expo.android.autolinking.buildFromSource` に `expo-task-manager` を加えていた。
`expo-modules-autolinking` が読むのは `package.json` の `expo.autolinking` だけなので、この設定は使われていなかった。
その後 #5173 で `app.config.ts` へ移行したときに設定自体もなくなっている。
- ストア版の本番 APK(v10.18.0)を逆アセンブルし、`createJobInfo` が上流のまま(API 31+ は `setExpedited(true)`)であることを確かめた。
パッチを消しても、ビルドに入るコードは変わらない。

### 確認

- `./gradlew :app:dependencies --configuration prodReleaseRuntimeClasspath` で、
`expo-task-manager` が `host.exp.exponent:expo.modules.taskmanager:57.0.13`(AAR)として解決されることを確かめた。
- Sentry の直近 90 日間で、このパッチが対象にしていた `JobInfo.Builder.build()` の
`You're trying to build a job with no constraints` は 0 件だった。

### 学び

- Expo のモジュールへのネイティブのパッチは、`package.json` の `expo.autolinking.android.buildFromSource` に加えないとビルドに入らない。
`app.json` に書いても読まれない。
- 「2026-08-26 — Expo SDK 57 系の依存を推奨バージョンへ更新」の項にある、このパッチの挙動の説明は、
パッチがビルドに入っていた前提で書かれている。実際の出荷物は上流の実装のままだった。

## 2026-10-05 — Android で一覧から消して開き直すと端末内蔵 TTS が鳴らない不具合を修正

対象バージョン: v10.18.0 の本番で発生
Expand Down
6 changes: 6 additions & 0 deletions docs/location-simulation.md
Original file line number Diff line number Diff line change
Expand Up @@ -329,6 +329,12 @@ npm run gpx:replay -- --gpx assets/gpx/SampleTohokuShinkansen.gpx --serial <seri
| `--start` | GPX 先頭からのスキップ秒数 |
| `--provider` | テストプロバイダ名。既定 `gps,network,fused` |

再生を始める前に、GPX の終点の座標でステージングの StationAPI
(`https://gql-stg.trainlcd.app/`) に 1 回だけ問い合わせ、いちばん近い駅を行先として
表示する。行先は進捗行にも `京王八王子行` のように出る。環境変数 `GQL_API_URL` が
あればそちらへ問い合わせる。行先を引けなかったときは、テストプロバイダを有効にする前に
異常終了する。

Xcode と違い精度を指定できるので、`--accuracy 100,300` のように渡せば
`getSmoothingAlpha` の低精度分岐も実機で観測できる。一方で `coords.speed` を
渡す手段が無いため、DEV OVERLAY の `CURRENT SPEED` は常に 0km/h を表示する。
Expand Down
21 changes: 21 additions & 0 deletions docs/ride-log.md
Original file line number Diff line number Diff line change
Expand Up @@ -34,12 +34,27 @@ Main 画面を抜けたときの最後の書き込みが終わってから消す
- 出発駅の次の駅への到着を1回検出するまでは、DB に書かずメモリに溜めます。画面を開いただけのセッションや、ホームで待っているだけのセッションを数えないためです。通過駅を検出しただけでは確定しません。
- 確定したら、それまでに検出した駅をまとめて1トランザクションで書きます。書き込みに失敗したら、次に駅を検出したとき・発車したとき・Main 画面を抜けるときに、それまでの駅ごと書き直します。書く内容は書き込みを実行する時点のメモリから決めるので、書き込み待ちのあいだに検出した駅も取りこぼしません。以降は駅を検出するたびに追記するので、アプリが終了されても最後の到着までは残ります。
- オートモードを一度でも有効にしたら、Main 画面を抜けるまで記録しません。オートモードの駅移動は実際の乗車ではないためです。
- 直通運転の接続駅は、駅リストに前の路線の駅と次の路線の駅として2回並びます(`src/utils/dropJunctionStation.ts`)。
到着判定がこの2つを行き来しても、同じ駅なので2度目は書きません。
次の駅までの距離は、後から検出した方の駅から測ります。
通過として書いた駅に停車したと分かったときだけ、到着を残すために書きます。

## 時刻

- `ride_sessions.startedAt` は、出発駅を発車した時刻です。発車を検出できなかった場合は、Main 画面を開いた時刻にします。
- `ride_sessions.endedAt` は、最後に到着を検出した時刻です。通過では更新しません。
- `ride_stops.departedAt` は、駅の到着圏を出た時刻です。出入りを繰り返した場合は、最後に出た時刻で上書きします。
- `ride_stops.etaMinutesFromPrevious` は、ETA 上の所要時間(分)です。
StationAPI の `estimateArrivalTimes` が駅間距離と車両性能から求めた時刻を、`useEstimateArrivalTimesRoute` で取得して使います(`src/utils/rideEta.ts`)。
この乗車で前に ETA を引けた駅から、その駅までを数えます。
前の駅が出発駅なら発車の時刻から、それ以外なら到着(通過)の時刻から数えるので、途中の駅の停車時間も入ります。
乗車の中で足すと、出発駅の発車から最後の駅までの所要時間になります。
ETA を引けなかった駅と、この列を足す前に記録した行は `null` です。

到着圏を出入りした時刻だけでは、発車直後と停車直前の時間が抜けます。
到着圏の半径は駅間距離の 1/4 で、75〜200 m に収めています(`src/hooks/useThreshold.ts`)。
駅間が 1 km ほどの区間では、測れるのは真ん中の 600 m ほどだけです。
ETA の所要時間は、この抜けを補うために記録します。

## 距離

Expand Down Expand Up @@ -100,6 +115,12 @@ StationAPI の `Station.prefectureId`(1〜47)をそのまま入れます。
- 日付は端末のタイムゾーンで区切ります。乗車は、乗りはじめた時刻(`startedAt`)が入る期間と日(年は月)に数えます。
- 1回の乗車の距離は、出発駅から最後に到着を検出した駅までの `distanceFromPrevious` の合計です。最後の到着より後に通過だけを検出した駅は数えません。
- 1回の乗車の時間は、`startedAt` から最後に到着を検出した時刻までです。
ETA 上の所要時間(`etaMinutesFromPrevious` の合計)の方が長ければ、そちらを使います。
遅れたときは検出した時間の方が長くなるので、そのまま使います。
最後の駅で ETA を引けていない乗車は、検出した時間だけを使います。
- 接続駅を続けて記録した2つ目の駅(同じ駅グループで、あいだに駅を挟まないもの)は、乗った駅間として数えません。
最後の到着にも、路線ごとの集計にも入れません。
このような駅しか到着が無い乗車は、乗車回数にも数えません。
- 駅を検出する間隔が 90 分(`MAX_STOP_GAP_MS`)を超えたら、その手前の駅で乗車が終わったとみなします。アプリを開いたまま放置した乗車で時間が膨らまないようにするためです。
- 路線ごとの距離は、駅と駅のあいだを到着した側の駅の路線に数えます。直通運転で路線が変わる乗車も、区間ごとに分けて数えます。

Expand Down
44 changes: 22 additions & 22 deletions ios/TrainLCD.xcodeproj/project.pbxproj
Original file line number Diff line number Diff line change
Expand Up @@ -2562,7 +2562,7 @@
CODE_SIGN_ENTITLEMENTS = ProdTrainLCD.entitlements;
CODE_SIGN_IDENTITY = "Apple Development";
CODE_SIGN_STYLE = Automatic;
CURRENT_PROJECT_VERSION = 2954;
CURRENT_PROJECT_VERSION = 2956;
DEAD_CODE_STRIPPING = YES;
DEVELOPMENT_TEAM = E6R2G33Z36;
INFOPLIST_FILE = TrainLCD/Schemes/Prod/Info.plist;
Expand Down Expand Up @@ -2602,7 +2602,7 @@
CODE_SIGN_ENTITLEMENTS = ProdTrainLCD.entitlements;
CODE_SIGN_IDENTITY = "Apple Development";
CODE_SIGN_STYLE = Automatic;
CURRENT_PROJECT_VERSION = 2954;
CURRENT_PROJECT_VERSION = 2956;
DEVELOPMENT_TEAM = E6R2G33Z36;
INFOPLIST_FILE = TrainLCD/Schemes/Prod/Info.plist;
INFOPLIST_KEY_CFBundleDisplayName = TrainLCD;
Expand Down Expand Up @@ -2661,7 +2661,7 @@
CODE_SIGN_ENTITLEMENTS = TrainLCD/trainlcd.entitlements;
"CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer";
COPY_PHASE_STRIP = NO;
CURRENT_PROJECT_VERSION = 2954;
CURRENT_PROJECT_VERSION = 2956;
CXX = "$(REACT_NATIVE_PATH)/scripts/xcode/ccache-clang++.sh";
ENABLE_STRICT_OBJC_MSGSEND = YES;
ENABLE_TESTABILITY = YES;
Expand Down Expand Up @@ -2718,7 +2718,7 @@
"\"$(TOOLCHAIN_DIR)/usr/lib/swift/$(PLATFORM_NAME)\"",
"\"$(inherited)\"",
);
MARKETING_VERSION = 10.18.0;
MARKETING_VERSION = 10.18.1;
MTL_ENABLE_DEBUG_INFO = YES;
ONLY_ACTIVE_ARCH = YES;
OTHER_CFLAGS = "$(inherited)";
Expand Down Expand Up @@ -2768,7 +2768,7 @@
CODE_SIGN_ENTITLEMENTS = TrainLCD/trainlcd.entitlements;
"CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer";
COPY_PHASE_STRIP = YES;
CURRENT_PROJECT_VERSION = 2954;
CURRENT_PROJECT_VERSION = 2956;
CXX = "$(REACT_NATIVE_PATH)/scripts/xcode/ccache-clang++.sh";
ENABLE_NS_ASSERTIONS = NO;
ENABLE_STRICT_OBJC_MSGSEND = YES;
Expand Down Expand Up @@ -2821,7 +2821,7 @@
"\"$(TOOLCHAIN_DIR)/usr/lib/swift/$(PLATFORM_NAME)\"",
"\"$(inherited)\"",
);
MARKETING_VERSION = 10.18.0;
MARKETING_VERSION = 10.18.1;
MTL_ENABLE_DEBUG_INFO = NO;
OTHER_CFLAGS = "$(inherited)";
OTHER_CPLUSPLUSFLAGS = "$(inherited)";
Expand Down Expand Up @@ -2849,7 +2849,7 @@
CODE_SIGN_ENTITLEMENTS = CanaryTrainLCD.entitlements;
CODE_SIGN_IDENTITY = "Apple Development";
CODE_SIGN_STYLE = Automatic;
CURRENT_PROJECT_VERSION = 2954;
CURRENT_PROJECT_VERSION = 2956;
DEAD_CODE_STRIPPING = YES;
DEVELOPMENT_TEAM = E6R2G33Z36;
INFOPLIST_FILE = TrainLCD/Schemes/Dev/Info.plist;
Expand Down Expand Up @@ -2889,7 +2889,7 @@
CODE_SIGN_ENTITLEMENTS = CanaryTrainLCD.entitlements;
CODE_SIGN_IDENTITY = "Apple Development";
CODE_SIGN_STYLE = Automatic;
CURRENT_PROJECT_VERSION = 2954;
CURRENT_PROJECT_VERSION = 2956;
DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym";
DEVELOPMENT_TEAM = E6R2G33Z36;
INFOPLIST_FILE = TrainLCD/Schemes/Dev/Info.plist;
Expand Down Expand Up @@ -3101,7 +3101,7 @@
CODE_SIGN_ENTITLEMENTS = RideSessionActivity/CanaryRideSessionActivity.entitlements;
CODE_SIGN_IDENTITY = "Apple Development";
CODE_SIGN_STYLE = Automatic;
CURRENT_PROJECT_VERSION = 2954;
CURRENT_PROJECT_VERSION = 2956;
DEBUG_INFORMATION_FORMAT = dwarf;
DEVELOPMENT_TEAM = E6R2G33Z36;
GCC_C_LANGUAGE_STANDARD = gnu11;
Expand Down Expand Up @@ -3153,7 +3153,7 @@
CODE_SIGN_IDENTITY = "Apple Development";
CODE_SIGN_STYLE = Automatic;
COPY_PHASE_STRIP = NO;
CURRENT_PROJECT_VERSION = 2954;
CURRENT_PROJECT_VERSION = 2956;
DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym";
DEVELOPMENT_TEAM = E6R2G33Z36;
GCC_C_LANGUAGE_STANDARD = gnu11;
Expand Down Expand Up @@ -3204,7 +3204,7 @@
CODE_SIGN_ENTITLEMENTS = WatchWidget/ProdWatchWidget.entitlements;
CODE_SIGN_IDENTITY = "Apple Development";
CODE_SIGN_STYLE = Automatic;
CURRENT_PROJECT_VERSION = 2954;
CURRENT_PROJECT_VERSION = 2956;
DEBUG_INFORMATION_FORMAT = dwarf;
DEVELOPMENT_TEAM = E6R2G33Z36;
ENABLE_USER_SCRIPT_SANDBOXING = YES;
Expand Down Expand Up @@ -3262,7 +3262,7 @@
CODE_SIGN_IDENTITY = "Apple Development";
CODE_SIGN_STYLE = Automatic;
COPY_PHASE_STRIP = NO;
CURRENT_PROJECT_VERSION = 2954;
CURRENT_PROJECT_VERSION = 2956;
DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym";
DEVELOPMENT_TEAM = E6R2G33Z36;
ENABLE_USER_SCRIPT_SANDBOXING = YES;
Expand Down Expand Up @@ -3313,7 +3313,7 @@
CODE_SIGN_ENTITLEMENTS = WatchWidget/CanaryWatchWidget.entitlements;
CODE_SIGN_IDENTITY = "Apple Development";
CODE_SIGN_STYLE = Automatic;
CURRENT_PROJECT_VERSION = 2954;
CURRENT_PROJECT_VERSION = 2956;
DEBUG_INFORMATION_FORMAT = dwarf;
DEVELOPMENT_TEAM = E6R2G33Z36;
ENABLE_USER_SCRIPT_SANDBOXING = YES;
Expand Down Expand Up @@ -3370,7 +3370,7 @@
CODE_SIGN_IDENTITY = "Apple Development";
CODE_SIGN_STYLE = Automatic;
COPY_PHASE_STRIP = NO;
CURRENT_PROJECT_VERSION = 2954;
CURRENT_PROJECT_VERSION = 2956;
DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym";
DEVELOPMENT_TEAM = E6R2G33Z36;
ENABLE_USER_SCRIPT_SANDBOXING = YES;
Expand Down Expand Up @@ -3419,7 +3419,7 @@
CODE_SIGN_ENTITLEMENTS = RideSessionActivity/ProdRideSessionActivity.entitlements;
CODE_SIGN_IDENTITY = "Apple Development";
CODE_SIGN_STYLE = Automatic;
CURRENT_PROJECT_VERSION = 2954;
CURRENT_PROJECT_VERSION = 2956;
DEBUG_INFORMATION_FORMAT = dwarf;
DEVELOPMENT_TEAM = E6R2G33Z36;
GCC_C_LANGUAGE_STANDARD = gnu11;
Expand Down Expand Up @@ -3471,7 +3471,7 @@
CODE_SIGN_IDENTITY = "Apple Development";
CODE_SIGN_STYLE = Automatic;
COPY_PHASE_STRIP = NO;
CURRENT_PROJECT_VERSION = 2954;
CURRENT_PROJECT_VERSION = 2956;
DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym";
DEVELOPMENT_TEAM = E6R2G33Z36;
GCC_C_LANGUAGE_STANDARD = gnu11;
Expand Down Expand Up @@ -3690,7 +3690,7 @@
CODE_SIGN_ENTITLEMENTS = ProdAppClip/ProdAppClip.entitlements;
CODE_SIGN_IDENTITY = "Apple Development";
CODE_SIGN_STYLE = Automatic;
CURRENT_PROJECT_VERSION = 2954;
CURRENT_PROJECT_VERSION = 2956;
DEBUG_INFORMATION_FORMAT = dwarf;
DEVELOPMENT_TEAM = E6R2G33Z36;
ENABLE_USER_SCRIPT_SANDBOXING = NO;
Expand Down Expand Up @@ -3746,7 +3746,7 @@
CODE_SIGN_IDENTITY = "Apple Development";
CODE_SIGN_STYLE = Automatic;
COPY_PHASE_STRIP = NO;
CURRENT_PROJECT_VERSION = 2954;
CURRENT_PROJECT_VERSION = 2956;
DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym";
DEVELOPMENT_TEAM = E6R2G33Z36;
ENABLE_USER_SCRIPT_SANDBOXING = NO;
Expand Down Expand Up @@ -3796,7 +3796,7 @@
CODE_SIGN_ENTITLEMENTS = CanaryAppClip/CanaryAppClip.entitlements;
CODE_SIGN_IDENTITY = "Apple Development";
CODE_SIGN_STYLE = Automatic;
CURRENT_PROJECT_VERSION = 2954;
CURRENT_PROJECT_VERSION = 2956;
DEBUG_INFORMATION_FORMAT = dwarf;
DEVELOPMENT_TEAM = E6R2G33Z36;
ENABLE_USER_SCRIPT_SANDBOXING = NO;
Expand All @@ -3820,7 +3820,7 @@
"@executable_path/Frameworks",
);
LOCALIZATION_PREFERS_STRING_CATALOGS = YES;
MARKETING_VERSION = 10.18.0;
MARKETING_VERSION = 10.18.1;
MTL_ENABLE_DEBUG_INFO = INCLUDE_SOURCE;
MTL_FAST_MATH = YES;
OTHER_SWIFT_FLAGS = "$(inherited) -D EXPO_CONFIGURATION_DEBUG";
Expand Down Expand Up @@ -3854,7 +3854,7 @@
CODE_SIGN_IDENTITY = "Apple Development";
CODE_SIGN_STYLE = Automatic;
COPY_PHASE_STRIP = NO;
CURRENT_PROJECT_VERSION = 2954;
CURRENT_PROJECT_VERSION = 2956;
DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym";
DEVELOPMENT_TEAM = E6R2G33Z36;
ENABLE_USER_SCRIPT_SANDBOXING = NO;
Expand All @@ -3874,7 +3874,7 @@
"@executable_path/Frameworks",
);
LOCALIZATION_PREFERS_STRING_CATALOGS = YES;
MARKETING_VERSION = 10.18.0;
MARKETING_VERSION = 10.18.1;
MTL_FAST_MATH = YES;
OTHER_SWIFT_FLAGS = "$(inherited) -D EXPO_CONFIGURATION_RELEASE";
PODS_ROOT = "${SRCROOT}/Pods";
Expand Down
4 changes: 2 additions & 2 deletions package-lock.json

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

2 changes: 1 addition & 1 deletion package.json
Original file line number Diff line number Diff line change
Expand Up @@ -185,5 +185,5 @@
}
},
"name": "trainlcd",
"version": "10.18.0"
"version": "10.18.1"
}
Loading
Loading