# commons-app/apps-android-commons architecture

> Architecture diagram of the GitHub repository commons-app/apps-android-commons, generated by GitDiagram from its file tree, README and a sample of source files (last updated 2026-09-30). It is an AI-made overview: check details against the source.

- Interactive diagram: https://gitdiagram.com/commons-app/apps-android-commons
- Repository: https://github.com/commons-app/apps-android-commons

## Overview

Wikimedia Commons Android is a mobile client for discovering Commons/Wikidata media and uploading pictures from a device. A primary workflow selects local media, validates and enriches it, queues contributions, then uploads them; users can also browse/search media, explore nearby places, review files, manage bookmarks, and sign in. The graph reflects documented product capabilities and sampled call/import evidence. Several feature implementations were not excerpted, so those connections are omitted or marked unverified rather than asserted as inspected.

Main entry points: [`app/src/main/java/fr/free/nrw/commons/contributions/ContributionController.kt`](https://github.com/commons-app/apps-android-commons/blob/main/app/src/main/java/fr/free/nrw/commons/contributions/ContributionController.kt) (Contribution flow), [`app/src/main/java/fr/free/nrw/commons/upload/worker/UploadWorker.kt`](https://github.com/commons-app/apps-android-commons/blob/main/app/src/main/java/fr/free/nrw/commons/upload/worker/UploadWorker.kt) (Upload execution), [`app/src/main/java/fr/free/nrw/commons/review/ReviewActivity.kt`](https://github.com/commons-app/apps-android-commons/blob/main/app/src/main/java/fr/free/nrw/commons/review/ReviewActivity.kt) (Review workflow), [`app/src/main/java/fr/free/nrw/commons/explore/SearchActivity.kt`](https://github.com/commons-app/apps-android-commons/blob/main/app/src/main/java/fr/free/nrw/commons/explore/SearchActivity.kt) (Search experience)

## Diagram (Mermaid)

```mermaid
flowchart TD

subgraph group_upload["Contributions and upload"]
  node_contributions["Contribution flow"]
  node_picker["File selection<br/>[FilePicker.kt]"]
  node_processing["Image validation"]
  node_uploadworker["Upload execution<br/>[UploadWorker.kt]"]
  node_uploadrepo["Contribution repository"]
end

subgraph group_discovery["Explore and discover"]
  node_search["Search experience<br/>[SearchActivity.kt]"]
  node_recent[("Recent searches")]
  node_categories["Category browsing"]
  node_map["Map exploration"]
  node_nearby["Nearby places"]
end

subgraph group_media["Media actions"]
  node_media["Media details"]
  node_review["Review workflow<br/>[ReviewActivity.kt]"]
  node_reviewops["Review actions"]
  node_wikidata["Wikidata edits"]
end

subgraph group_identity["Identity and persistence"]
  node_bookmarks["Bookmarks"]
  node_account["Account and login<br/>[LoginActivity.kt]"]
  node_session["Session management<br/>[SessionManager.kt]"]
  node_database[("App database<br/>[AppDatabase.kt]")]
end

subgraph group_platform["App platform"]
  node_app["Application entry"]
end

node_user(("Mobile user"))
node_commons{{"Wikimedia Commons"}}

node_user -->|"selects photos"| node_contributions
node_contributions -->|"opens picker"| node_picker
node_contributions -->|"loads contributions"| node_uploadrepo
node_contributions -.->|"queues upload"| node_uploadworker
node_uploadworker -.->|"validates media"| node_processing
node_uploadworker -.->|"uploads files"| node_commons
node_search -->|"shows history"| node_recent
node_user -.->|"searches media"| node_search
node_user -.->|"browses categories"| node_categories
node_user -.->|"explores map"| node_map
node_map -->|"uses place data"| node_nearby
node_user -.->|"reviews media"| node_review
node_review -->|"creates controller"| node_reviewops
node_review -->|"opens details"| node_media
node_reviewops -.->|"edits metadata"| node_wikidata
node_user -.->|"manages bookmarks"| node_bookmarks
node_user -.->|"signs in"| node_account
node_account -.->|"uses session"| node_session
node_app -.->|"initializes storage"| node_database

click node_contributions "https://github.com/commons-app/apps-android-commons/blob/main/app/src/main/java/fr/free/nrw/commons/contributions/ContributionController.kt"
click node_picker "https://github.com/commons-app/apps-android-commons/blob/main/app/src/main/java/fr/free/nrw/commons/filepicker/FilePicker.kt"
click node_processing "https://github.com/commons-app/apps-android-commons/blob/main/app/src/main/java/fr/free/nrw/commons/upload/ImageProcessingService.kt"
click node_uploadworker "https://github.com/commons-app/apps-android-commons/blob/main/app/src/main/java/fr/free/nrw/commons/upload/worker/UploadWorker.kt"
click node_uploadrepo "https://github.com/commons-app/apps-android-commons/blob/main/app/src/main/java/fr/free/nrw/commons/repository/UploadRepository.kt"
click node_search "https://github.com/commons-app/apps-android-commons/blob/main/app/src/main/java/fr/free/nrw/commons/explore/SearchActivity.kt"
click node_recent "https://github.com/commons-app/apps-android-commons/blob/main/app/src/main/java/fr/free/nrw/commons/explore/recentsearches/RecentSearchesDao.kt"
click node_categories "https://github.com/commons-app/apps-android-commons/blob/main/app/src/main/java/fr/free/nrw/commons/explore/categories/parent/ParentCategoriesFragment.kt"
click node_map "https://github.com/commons-app/apps-android-commons/blob/main/app/src/main/java/fr/free/nrw/commons/explore/map/ExploreMapController.kt"
click node_nearby "https://github.com/commons-app/apps-android-commons/blob/main/app/src/main/java/fr/free/nrw/commons/nearby/NearbyController.java"
click node_media "https://github.com/commons-app/apps-android-commons/blob/main/app/src/main/java/fr/free/nrw/commons/media/MediaDetailFragment.kt"
click node_review "https://github.com/commons-app/apps-android-commons/blob/main/app/src/main/java/fr/free/nrw/commons/review/ReviewActivity.kt"
click node_reviewops "https://github.com/commons-app/apps-android-commons/blob/main/app/src/main/java/fr/free/nrw/commons/review/ReviewController.kt"
click node_wikidata "https://github.com/commons-app/apps-android-commons/blob/main/app/src/main/java/fr/free/nrw/commons/wikidata/WikidataEditService.kt"
click node_bookmarks "https://github.com/commons-app/apps-android-commons/blob/main/app/src/main/java/fr/free/nrw/commons/bookmarks/items/BookmarkItemsController.kt"
click node_account "https://github.com/commons-app/apps-android-commons/blob/main/app/src/main/java/fr/free/nrw/commons/auth/LoginActivity.kt"
click node_session "https://github.com/commons-app/apps-android-commons/blob/main/app/src/main/java/fr/free/nrw/commons/auth/SessionManager.kt"
click node_database "https://github.com/commons-app/apps-android-commons/blob/main/app/src/main/java/fr/free/nrw/commons/db/AppDatabase.kt"
click node_app "https://github.com/commons-app/apps-android-commons/blob/main/app/src/main/java/fr/free/nrw/commons/CommonsApplication.kt"

classDef toneNeutral fill:#f8fafc,stroke:#334155,stroke-width:1.5px,color:#0f172a
classDef toneBlue fill:#dbeafe,stroke:#2563eb,stroke-width:1.5px,color:#172554
classDef toneAmber fill:#fef3c7,stroke:#d97706,stroke-width:1.5px,color:#78350f
classDef toneMint fill:#dcfce7,stroke:#16a34a,stroke-width:1.5px,color:#14532d
classDef toneRose fill:#ffe4e6,stroke:#e11d48,stroke-width:1.5px,color:#881337
classDef toneIndigo fill:#e0e7ff,stroke:#4f46e5,stroke-width:1.5px,color:#312e81
classDef toneTeal fill:#ccfbf1,stroke:#0f766e,stroke-width:1.5px,color:#134e4a
class node_contributions,node_picker,node_processing,node_uploadworker,node_uploadrepo,node_user toneBlue
class node_search,node_recent,node_categories,node_map,node_nearby toneAmber
class node_media,node_review,node_reviewops,node_wikidata toneMint
class node_bookmarks,node_account,node_session,node_database toneRose
class node_app,node_commons toneIndigo
```

## Components

### Contributions and upload

- [Contribution flow](https://github.com/commons-app/apps-android-commons/blob/main/app/src/main/java/fr/free/nrw/commons/contributions/ContributionController.kt): `app/src/main/java/fr/free/nrw/commons/contributions/ContributionController.kt`
- [File selection](https://github.com/commons-app/apps-android-commons/blob/main/app/src/main/java/fr/free/nrw/commons/filepicker/FilePicker.kt): `app/src/main/java/fr/free/nrw/commons/filepicker/FilePicker.kt`
- [Image validation](https://github.com/commons-app/apps-android-commons/blob/main/app/src/main/java/fr/free/nrw/commons/upload/ImageProcessingService.kt): `app/src/main/java/fr/free/nrw/commons/upload/ImageProcessingService.kt`
- [Upload execution](https://github.com/commons-app/apps-android-commons/blob/main/app/src/main/java/fr/free/nrw/commons/upload/worker/UploadWorker.kt): `app/src/main/java/fr/free/nrw/commons/upload/worker/UploadWorker.kt`
- [Contribution repository](https://github.com/commons-app/apps-android-commons/blob/main/app/src/main/java/fr/free/nrw/commons/repository/UploadRepository.kt): `app/src/main/java/fr/free/nrw/commons/repository/UploadRepository.kt`

### Explore and discover

- [Search experience](https://github.com/commons-app/apps-android-commons/blob/main/app/src/main/java/fr/free/nrw/commons/explore/SearchActivity.kt): `app/src/main/java/fr/free/nrw/commons/explore/SearchActivity.kt`
- [Recent searches](https://github.com/commons-app/apps-android-commons/blob/main/app/src/main/java/fr/free/nrw/commons/explore/recentsearches/RecentSearchesDao.kt): `app/src/main/java/fr/free/nrw/commons/explore/recentsearches/RecentSearchesDao.kt`
- [Category browsing](https://github.com/commons-app/apps-android-commons/blob/main/app/src/main/java/fr/free/nrw/commons/explore/categories/parent/ParentCategoriesFragment.kt): `app/src/main/java/fr/free/nrw/commons/explore/categories/parent/ParentCategoriesFragment.kt`
- [Map exploration](https://github.com/commons-app/apps-android-commons/blob/main/app/src/main/java/fr/free/nrw/commons/explore/map/ExploreMapController.kt): `app/src/main/java/fr/free/nrw/commons/explore/map/ExploreMapController.kt`
- [Nearby places](https://github.com/commons-app/apps-android-commons/blob/main/app/src/main/java/fr/free/nrw/commons/nearby/NearbyController.java): `app/src/main/java/fr/free/nrw/commons/nearby/NearbyController.java`

### Media actions

- [Media details](https://github.com/commons-app/apps-android-commons/blob/main/app/src/main/java/fr/free/nrw/commons/media/MediaDetailFragment.kt): `app/src/main/java/fr/free/nrw/commons/media/MediaDetailFragment.kt`
- [Review workflow](https://github.com/commons-app/apps-android-commons/blob/main/app/src/main/java/fr/free/nrw/commons/review/ReviewActivity.kt): `app/src/main/java/fr/free/nrw/commons/review/ReviewActivity.kt`
- [Review actions](https://github.com/commons-app/apps-android-commons/blob/main/app/src/main/java/fr/free/nrw/commons/review/ReviewController.kt): `app/src/main/java/fr/free/nrw/commons/review/ReviewController.kt`
- [Wikidata edits](https://github.com/commons-app/apps-android-commons/blob/main/app/src/main/java/fr/free/nrw/commons/wikidata/WikidataEditService.kt): `app/src/main/java/fr/free/nrw/commons/wikidata/WikidataEditService.kt`

### Identity and persistence

- [Bookmarks](https://github.com/commons-app/apps-android-commons/blob/main/app/src/main/java/fr/free/nrw/commons/bookmarks/items/BookmarkItemsController.kt): `app/src/main/java/fr/free/nrw/commons/bookmarks/items/BookmarkItemsController.kt`
- [Account and login](https://github.com/commons-app/apps-android-commons/blob/main/app/src/main/java/fr/free/nrw/commons/auth/LoginActivity.kt): `app/src/main/java/fr/free/nrw/commons/auth/LoginActivity.kt`
- [Session management](https://github.com/commons-app/apps-android-commons/blob/main/app/src/main/java/fr/free/nrw/commons/auth/SessionManager.kt): `app/src/main/java/fr/free/nrw/commons/auth/SessionManager.kt`
- [App database](https://github.com/commons-app/apps-android-commons/blob/main/app/src/main/java/fr/free/nrw/commons/db/AppDatabase.kt): `app/src/main/java/fr/free/nrw/commons/db/AppDatabase.kt`

### App platform

- [Application entry](https://github.com/commons-app/apps-android-commons/blob/main/app/src/main/java/fr/free/nrw/commons/CommonsApplication.kt): `app/src/main/java/fr/free/nrw/commons/CommonsApplication.kt`

### Other components

- **Mobile user**
- **Wikimedia Commons**

## Connections

- Mobile user → Contribution flow: selects photos (evidence: `README.md`)
- Contribution flow → File selection: opens picker (evidence: `app/src/main/java/fr/free/nrw/commons/contributions/ContributionController.kt`)
- Contribution flow → Contribution repository: loads contributions (evidence: `app/src/main/java/fr/free/nrw/commons/contributions/ContributionController.kt`)
- Contribution flow → Upload execution: queues upload
- Upload execution → Image validation: validates media
- Upload execution → Wikimedia Commons: uploads files
- Search experience → Recent searches: shows history (evidence: `app/src/main/java/fr/free/nrw/commons/explore/SearchActivity.kt`)
- Mobile user → Search experience: searches media
- Mobile user → Category browsing: browses categories
- Mobile user → Map exploration: explores map
- Map exploration → Nearby places: uses place data (evidence: `app/src/main/java/fr/free/nrw/commons/explore/map/ExploreMapController.kt`)
- Mobile user → Review workflow: reviews media
- Review workflow → Review actions: creates controller (evidence: `app/src/main/java/fr/free/nrw/commons/review/ReviewActivity.kt`)
- Review workflow → Media details: opens details (evidence: `app/src/main/java/fr/free/nrw/commons/review/ReviewActivity.kt`)
- Review actions → Wikidata edits: edits metadata
- Mobile user → Bookmarks: manages bookmarks
- Mobile user → Account and login: signs in
- Account and login → Session management: uses session
- Application entry → App database: initializes storage
