feat: on-the-fly SMS translation via offline-translator AIDL

Adds a small `:translate` Gradle module that translates received SMS /
MMS bubbles and conversation-list snippets on the fly by binding to the
offline-translator app on F-Droid (`dev.davidv.translator`). The actual
translation runs there — Mozilla Bergamot/Marian on-device — so this
patch ships no model, no inference, and no permissions beyond an
Android 11+ <queries> block for package visibility.

Behavior:
- User-defined source-language allowlist + target language in
  Settings → Translation (right after Language). Off by default.
- Auto-translate fires on RecyclerView bind for received bubbles and
  conversation snippets. Detection uses ML Kit Language Identification
  (CLD3, on-device). Once dev.davidv.translator exposes a
  detectLanguage() AIDL method we'll route through that and drop ML Kit.
- AIDL latency is sub-second, so the bubble just quietly swaps from
  the original to the translation — no loading spinner.
- Tap the translate icon next to a bubble to flip it back to the
  original; tap again to flip to the translation. Cached in process
  memory.
- Long-press → ⋮ → Translate forces a one-off translation regardless
  of the allowlist (useful for messages in non-allowlisted languages),
  with a toast surfacing AIDL errors like 'language pack not installed'.
- Copy / Share / Select on a translated bubble captures what the user
  sees, not the underlying source body.
- Silently no-ops when offline-translator isn't installed; settings
  screen shows an F-Droid install banner.
- Translation Settings is a regular Fossify sub-screen with
  MyAppBarLayout + MaterialToolbar + NestedScrollView, matching
  Manage Blocked Numbers / Keywords / SettingsActivity.

No new database, no service, no boot receiver, no foreground service.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
This commit is contained in:
Jeena 2026-05-07 04:13:43 +00:00
parent ffabeb2730
commit 99649c54d7
22 changed files with 1015 additions and 6 deletions

View file

@ -0,0 +1,11 @@
<?xml version="1.0" encoding="utf-8"?>
<vector xmlns:android="http://schemas.android.com/apk/res/android"
android:width="24dp"
android:height="24dp"
android:viewportWidth="24"
android:viewportHeight="24"
android:tint="?attr/colorControlNormal">
<path
android:fillColor="@android:color/white"
android:pathData="M12.87,15.07l-2.54,-2.51 0.03,-0.03A17.52,17.52 0,0 0,14.07 6H17V4h-7V2H8v2H1v1.99h11.17C11.5,7.92 10.44,9.75 9,11.35 8.07,10.32 7.3,9.19 6.69,8h-2c0.73,1.63 1.73,3.17 2.98,4.56l-5.09,5.02L4,19l5,-5 3.11,3.11 0.76,-2.04zM18.5,10h-2L12,22h2l1.12,-3h4.75L21,22h2l-4.5,-12zM15.88,17l1.62,-4.33L19.12,17h-3.24z" />
</vector>