5 Commits
Author SHA1 Message Date
alexpolo1andClaude Sonnet 4.6 c00368c303 Commit keystore to repo for consistent APK signing across all CI builds
Simplifies signing: the keystore is stored in the repo so every release
workflow run uses the same certificate. This fixes "App not installed"
when updating via GitHub releases.

Co-Authored-By: Claude Sonnet 4.6 <[email protected]>
2026-02-28 23:36:10 +01:00
alexpolo1andClaude Sonnet 4.6 268e0176ae Fix keystore base64 decode in CI (use printf + ignore-garbage)
Co-Authored-By: Claude Sonnet 4.6 <[email protected]>
2026-02-28 23:33:22 +01:00
alexpolo1andClaude Sonnet 4.6 04135d7539 Add consistent APK signing so updates install without uninstalling
- Generate pixel10.keystore and store as KEYSTORE_BASE64 GitHub secret
- Release workflow decodes keystore and signs every APK with same key
- build.gradle.kts: signingConfig reads from env (CI) or local keystore
- Bump versionCode 8 / versionName 1.8.0

Co-Authored-By: Claude Sonnet 4.6 <[email protected]>
2026-02-28 23:28:39 +01:00
alexpolo1andClaude Sonnet 4.6 ec3beea01e Remove cloud backend — on-device Tensor chip only
Delete GeminiCloudModel.kt entirely. All inference now runs through
Gemini Nano on the Tensor G5 TPU via ML Kit, with MediaPipe as fallback
for custom local model files. No data leaves the device.

- OnDeviceModel.create() reverts to Nano → MediaPipe chain, no apiKey param
- Removed: API key UI, SharedPreferences key storage, cloud model routing
- Removed: thinking mode (cloud-only feature)
- Removed: pixel10-fast / pixel10-thinking model IDs → single "pixel10" model
- /v1/models now reports honest on-device limits (4096 ctx, 1024 output)
- CI smoke test updated: installs APK on emulator and verifies package,
  no inference tests (require real Pixel hardware with Tensor chip)

Co-Authored-By: Claude Sonnet 4.6 <[email protected]>
2026-02-28 21:58:21 +01:00
alexpolo1andClaude Sonnet 4.6 db48abb0a2 Add GeminiCloudModel, background inference fix, and CI pipeline
- Add GeminiCloudModel: proxies inference to Gemini 2.0 Flash via HTTPS
  using HttpURLConnection (no new deps). Supports both blocking and SSE
  streaming. Works from any context — background, emulator, CI.

- Fix background inference: OnDeviceModel.create() now accepts an apiKey;
  when set, GeminiCloudModel is selected immediately, bypassing Gemini
  Nano's foreground-only restriction. ApiServerService reads the key from
  SharedPreferences at startup.

- Add API key UI: password field in MainActivity saved to SharedPreferences
  before the service starts; disabled while server is running.

- Add GitHub Actions CI (.github/workflows/ci.yml): build job produces a
  debug APK artifact; test job spins up a KVM-accelerated Android 31
  emulator, installs the APK, writes the GEMINI_API_KEY secret into
  SharedPreferences via adb run-as, starts the service, and runs curl
  assertions against /health, /v1/models, /v1/chat/completions, and the
  SSE streaming endpoint.

- Add release workflow (.github/workflows/release.yml): triggered on v*
  tags, builds the APK and creates a GitHub Release with it attached.

Co-Authored-By: Claude Sonnet 4.6 <[email protected]>
2026-02-28 21:29:47 +01:00