Remove flight photos from Android
Summary
Section titled “Summary”The owner asked (2026-10-20) to make flight photos on Android work as on iOS, without the manual “Add photos…”, or else to remove the feature from Android.
The iOS way is not possible on Android under Google Play’s rules, so the feature leaves Android.
| iOS | Android today | |
|---|---|---|
| How photos are found | Automatically: PhotoKit reads the library for the photos taken during the flight, each time the flight opens | The pilot picks them with the system photo picker (⋮ › Photos › Add photos…), kept per flight in Room (decisions §9 D6) |
| Permission | Photo library access | None (the picker needs no permission) |
Why not the iOS way
Section titled “Why not the iOS way”To search the library by date, Android needs READ_MEDIA_IMAGES (and ACCESS_MEDIA_LOCATION to read where a
photo was taken). Since 28 May 2025, Google Play’s Photo and Video Permissions policy lets an app request it only when
the system photo picker cannot provide the app’s core functionality, which is in practice gallery and photo
editing apps. Every other app must use the picker, and an app that requests the permission without an accepted
declaration can be removed from Play. Photos on the flight map are not Vulture’s core function, and the picker can
serve it (Android does that today), so the declaration would be refused. In addition, the library on the phone only
holds photos stored on the device, not the ones that only exist in Google Photos’ cloud.
Sources: Details on Google Play’s Photo and Video Permissions policy, Policy preview (both read 2026-10-20).
Behaviour
Section titled “Behaviour”On Android, after this change:
- The flight map’s ⋮ menu has no Photos submenu (Add photos…, Show your photos).
- The flight map draws no photo markers, and there is no photo pager.
- Settings › Flight display has no Show your photos row.
- Photos picked before are forgotten. Only the links to them are removed; the photos themselves stay on the phone.
- iOS does not change.
| Data | Change |
|---|---|
Room flight_photo (local, not synced, P8B-D3) | Dropped in a migration (schema 4 → 5) |
Synced setting arePhotosVisible (iOS “Show your photos”) | Kept in SyncedSettings and the codec, without a row on Android, so a value set on an iPhone round-trips unchanged |
None. Android’s WeGlide upload sends no photos (it has no stories, P7-D18).
Strings
Section titled “Strings”The photo strings that only Android used (photos_message_skipped and the Photos submenu’s) can go. Strings shared
with iOS through strings_ios.xml stay, as that file mirrors iOS.
Decisions
Section titled “Decisions”| # | Question | Decision | Date |
|---|---|---|---|
| 1 | Flight photos as on iOS, without a manual add? | Not possible within Google Play’s policy (see above), so photos leave Android (owner: “otherwise I want this feature out of android”). | 2026-10-20 |
| 2 | Photos picked before | Forgotten: the table is dropped, nothing is migrated. | 2026-10-20 |
| 3 | The synced “Show your photos” setting | Kept and round-tripped, with no row on Android. | 2026-10-20 |
Decisions 2 and 3 are defaults taken while writing this up; the owner can overrule them. Decision 1 replaces decisions §9 D6 and D17 (Coil for the pager).
Open questions
Section titled “Open questions”None.
Platforms
Section titled “Platforms”No changes.
Android
Section titled “Android”| Code (vulture-android) | Change |
|---|---|
feature/photos (PhotoAdding.kt, PhotoPager.kt, data/, model/), settings.gradle.kts, app/build.gradle.kts, feature/flightmap/build.gradle.kts | Remove the module |
gradle/libs.versions.toml | Remove Coil, which only the pager uses |
feature/flightmap/.../data/FlightMapPhotos.kt, di/FlightMapModule.kt, FlightMapViewModel.kt, FlightMapUiState.kt, FlightMapScreen.kt, topbar/OverflowMenu.kt | Remove the photo state, the Photos submenu and the pager |
core/map/.../flightmap/PhotoFeatures.kt, FlightMapController.kt, MapboxFlightMapController.kt | Remove the photos source, its layers and its tap handling (photos were checked before thermals) |
data/db (FlightPhotoEntity, FlightPhotoDao, VultureDatabase, Migrations.kt, FlightRepository, SyncDao) | Drop flight_photo in migration 4 → 5; remove the entity and DAO |
feature/settings/.../flightdisplay/ | Remove the Show your photos row |
app/src/debug/.../lab/PhotoLab.kt, MapLab.kt, GestureLab.kt | Remove the photo lab and the photo parts of the others |
data/prefs (SyncedSettings.arePhotosVisible), domain/sync/SettingsCodec.kt | Keep (decision 3) |
Tests: the migration drops the table; the menu, settings and map tests without photos; screenshots. READMEs of the touched modules. Changelog, under Removed: “Your photos on the flight map: Android does not let Vulture find the photos of a flight by itself, as the iPhone does”.
No changes.
- vulture-android: remove the photos feature, the module and Coil; the migration; tests; screenshots; READMEs; changelog (2026-10-20). exifinterface went too (only the photos read EXIF);
photos_message_skippedand the submenu’s strings left with:feature:photos. - vulture-docs: when built, set Android to
not-plannedon Flight photos (with this analysis innotes), update decisions §9 D6/D17 and P8B-D3 in Port decisions, Flight screens where it describes Android’s photos, and setstatus: shipped.
