The common changes, and the files each one touches. One rule runs through all of them: anything that writes to the index must also keep the phone's copy in step, or the copy is wrong.
The field in solr/conf/schema.xml, raise config_version in solrconfig.xml and IndexManager.CONFIG_VERSION together, and the server side of photos_ingest, which builds the document. On the phone, usually PhotoReader to read it off the file and IngestItem to carry it. To reach the phone's copy it also needs EditRepository.CLONE_FIELDS and storeDoc.
A column: DOCS_TABLE, the VERSION constant and onUpgrade in PhotoCache.kt, then CLONE_FIELDS and storeDoc. Old installs only get the column through onUpgrade; if the copies already on phones cannot fill it, raise the clone format in AppPrefs so every phone reads its copy again.
SearchFilters and the filter query in SearchRepository.queryParams(), the facet, then the filter sheet in SearchScreen.kt, with its fold state and badge. The browsing lists are held in AppPrefs.facetsJson until something is written, so a new list travels with them.
QF, MM_LEVELS and the hybrid line in SearchRepository.queryParams(); the defaults of the two sliders in AppPrefs.
The heading builder in AppViewModel and buildRows() in SearchScreen.kt, where the headings are drawn and folded.
The comparison in SyncEngine.runOnce(): file size and time, then the file md5 (PhotoReader.fileMd5 against PhotoCache.docFileHash) and the picture fingerprint. This is what keeps a metadata-only change from costing a new reading.
The word counts in AppViewModel over PhotoCache, with the spelling rule in Words.kt; not SearchRepository, which is not asked.
A function in OpensolrApi, any new refusal in Errors.kt, and a line in docs/how-it-works.md.
The catch blocks at the end of SyncEngine.runOnce(), and the wording in SyncScreen.kt.
A value in Screen, a composable in ui/screens/, a branch in AppRoot.kt and the actions in AppViewModel. A setting is a property in AppPrefs, its value in UiState and its control on the Me screen.
A res/values-xx/ folder with every string file, and its entry in AppLanguage.SUPPORTED and res/xml/locales_config.xml.
Notifier.kt; ui/theme/Theme.kt; gradle/libs.versions.toml, then build.
versionCode and versionName in app/build.gradle.kts, a signed release build, and a GitHub release with the APK. See building from source.
For developers
- Project structure
- The Kotlin packages
- Code flows
- Where to change something
- Building from source
- Contributing