Нативное Android-приложение для изучения английских слов, сделанное мной самостоятельно: слово можно захватить из любого приложения, получить AI-статью с переводами и выучить его с интервальным повторением и экзаменами, которые генерирует AI.
Моя роль
Самостоятельный продукт: идея, спецификация, Android-архитектура, интеграция AI и разработка.
Стек
Kotlin
Jetpack Compose
Hilt
Room
Ktor
WorkManager
Gemini API
Anthropic API
Задача
Незнакомые слова встречаются везде — в браузере, чатах, на скриншотах, — и копирование их в словарь сбивает с мысли. А просто переведённые слова без практики быстро забываются.
Архитектура
Приложение на Kotlin с UI на Jetpack Compose, ViewModel и доменным слоем из use case и интерфейсов репозиториев; Hilt связывает слой данных: Room для слов, прогресса и экзаменов, AiClient с реализациями для Gemini (по умолчанию) и Anthropic поверх Ktor, WorkManager для офлайн-очереди, EncryptedSharedPreferences для API-ключа и foreground-сервис, отслеживающий новые скриншоты.
Ключевые решения
01Один интерфейс AiClient, два провайдера
Почему
Приложение обращается к модели только через доменный интерфейс. Gemini и Anthropic — взаимозаменяемые реализации: смена провайдера — одна строка в DI, а остальной код не знает, какая из них используется.
02Строгий JSON от модели и защищённый парсинг
Почему
Каждый ответ должен быть JSON; парсер срезает markdown-ограждения, при ошибке делает один повтор, а затем возвращает типизированную ошибку, которую показывает UI, — плохой ответ модели не роняет приложение.
03Без AccessibilityService
Почему
Захват слов работает только через меню выделения текста, «Поделиться» и скриншоты, поэтому приложению не нужно самое чувствительное разрешение Android.
Компромисс
Слова не подхватываются с экрана автоматически: пользователь должен выделить, поделиться или сделать скриншот.
Что я сделал
Захват слов откуда угодно: меню выделения текста в любом приложении, «Поделиться картинкой» с обрезкой и AI-распознаванием, наблюдатель скриншотов с плавающим пузырём
AI-статьи о словах — объяснение, переводы на русский и туркменский, примеры — с озвучкой
AI за одним интерфейсом с реализациями для Gemini (по умолчанию) и Anthropic; собственный ключ пользователя хранится в зашифрованном виде
Интервальное повторение по Лейтнеру, пять типов локальных квизов, экзамены от AI и проверка открытых ответов
Офлайн-очередь: слова, добавленные без сети, обрабатывает WorkManager позже
База Room с протестированными миграциями, экспорт и импорт, интерфейс на английском, русском и туркменском