Android App

Everything’s Android app is now a native Kotlin project in apps/android, with a phone module and a Wear OS module for modern Galaxy Watches.

Stack

  • Kotlin with the Android Gradle Plugin.
  • Jetpack Compose for the UI layer.
  • Material 3 components and theming.
  • Firebase Remote Config for server-driven home-screen UI.
  • A phone :app module with package name co.sapientic.everything.
  • A watch :wear module with package name co.sapientic.everything.wear.

Local commands

  • npm run android:assemble builds a debug APK.
  • npm run android:bundle builds a release Android App Bundle for the phone app.
  • npm run android:install installs the debug app on a connected emulator or device.
  • npm run android:test runs JVM unit tests.
  • npm run android:check runs phone and Wear Gradle verification tasks.
  • npm run wear:assemble builds the Galaxy Watch / Wear OS debug APK.
  • npm run wear:bundle builds a release Android App Bundle for the Wear app.
  • npm run wear:install installs the Wear app on a connected watch or Wear emulator.
  • npm run wear:test runs Wear JVM unit tests.
  • npm run wear:check runs Wear Gradle verification tasks.

Production branch

main is treated as production. Android pushes to main run the production workflow and publish the phone app to Google Play internal testing when Play and signing secrets are configured. See Android production for the exact release workflow and required secrets.

Remote Config UI

The phone app reads home_screen_json from Firebase Remote Config and renders the home screen from that schema. If Firebase is not configured or the parameter is missing, the app falls back to the built-in screen. The app uses Firebase real-time Remote Config for live updates, fetches again when the app returns to the foreground, and uses a throttled foreground poll as a fallback. Remote Config is limited to bounded presentation data and non-destructive actions. Use this JSON shape:
{
  "schemaVersion": 1,
  "topBarTitle": "Everything",
  "spacingDp": 18,
  "components": [
    { "id": "tagline", "type": "headline", "text": "Capture faster than forgetting." },
    {
      "id": "actions",
      "type": "buttonList",
      "buttons": [
        { "id": "red", "label": "Red button", "color": "#B3261E", "action": { "type": "counter" } },
        { "id": "green", "label": "Add sample", "color": "#15803D", "action": { "type": "add_task", "taskTitle": "Added over the air" } }
      ]
    },
    { "id": "capture", "type": "captureBar", "label": "New task", "buttonLabel": "Add" },
    { "id": "tasks", "type": "taskList" }
  ]
}
Supported component types are headline, title, text, caption, buttonList, captureBar, taskList, spacer, and divider. Supported button actions are counter, add_task, open_url, and noop; URL actions are restricted to HTTPS links under sapientic.co. Set "visible": false on any component or button to hide it without shipping a new app build.

Next build step

Replace the starter in-memory task lists with durable local storage, then connect the phone and watch apps to the shared Everything data model.