Android app for browsing country data. Country facts are loaded from the mledoze/countries dataset (v3.1-compatible JSON). Clean Architecture, multi-module Gradle project, Jetpack Compose UI, and offline-friendly caching.
- Countries — Search (history/suggestions/voice), filters, sort, alphabet index, pull-to-refresh, favorites, compare multiselect.
- Details — Flag, facts, map (OpenStreetMap / osmdroid), share, favorites, neighbors, optional on-device AI summary (template fallback).
- Compare — Side-by-side table for 2–3 countries; optional template insight when AI summaries enabled in Settings.
- Quiz — Guess flag, capital, or region; score persisted in DataStore.
- Settings — Cache policy, offline mode, theme/dynamic color, AI summaries toggle, daily notification, map borders, cache stats, OSS licenses.
- Widget & Wear — Country of the Day (Glance widget + Wear tile).
- Adaptive UI — Two-pane list + detail on expanded width; list pane kept for Settings, Quiz, and Compare.
- Localization — Static strings in English plus de/es/fr/hi for key screens.
- Offline — Room is the source of truth after the first load. A WorkManager job re-checks the sources at the interval chosen in Settings (daily, weekly by default, monthly), revalidates with the server (ETag), and rewrites the database only when the merged data actually changed. Cache policy and the offline switch still apply. Plan: docs/plans/2026-09-19-data-refresh.md.
- UI — Material 3 Expressive, Navigation 3. The static "Explorer" look is a warm paper palette in light, ink navy in dark, with Fraunces for headings; colors, type, shapes and the shared
FlagImage,FactTileandSectionHeadercomponents live incore/designsystem. Design plan: docs/plans/2026-09-19-ui-redesign.md.
- Kotlin 2.4.0, AGP 9.2.1, Gradle wrapper
- Compose BOM 2026.06.00, Material 3, Hilt 2.59.2
- Retrofit 3.0.0, OkHttp 5.4.0, kotlinx-serialization, Coroutines
- Room 2.8.4, DataStore preferences
- Coil 3.5.0, Glance, osmdroid 6.1.20, Generative AI client (on-device summary), Timber, SnapNotify
app
benchmark
domain
data/countries
core: common, model, designsystem, navigation, network, database, datastore, ai
feature: countries, countrydetails, compare, quiz, settings, widget, wear
tests-shared
Use a recent Android Studio and an SDK that can build API 37. JDK 17+.
git clone https://github.com/iVamsi/WorldCountriesInformation.git
cd WorldCountriesInformation
./gradlew assembleDebugMaps use OpenStreetMap; no API keys are required for maps or country data. Add sdk.dir in local.properties if Android Studio has not created it.
Tests: ./gradlew test (and connectedAndroidTest for instrumentation on a device).
CI (see .github/workflows/ci.yml): lint, unit tests, assembleDebug, assembleRelease (R8).
Baseline profiles: hand-maintained app/src/main/baseline-prof.txt. Run ./gradlew :benchmark:connectedDebugAndroidTest on a device to capture updates.
Open source licenses: generated via com.google.android.gms.oss-licenses-plugin; linked from Settings → About.
Apache 2.0 — see LICENSE.
Typeface: Fraunces, SIL Open Font License 1.1. See THIRD_PARTY_NOTICES.md.
Country data: mledoze/countries, ODbL 1.0. Population: World Bank (SP.POP.TOTL), CC BY 4.0. See THIRD_PARTY_NOTICES.md.
OpenStreetMap data is ODbL; map tiles are credited in-app where required.
mledoze/countries, OpenStreetMap, osmdroid, Android Jetpack.
Contact / repo: github.com/iVamsi/WorldCountriesInformation