Перейти к содержимому
Все проекты

Мобильный продукт · AI · Обучение

AI-словарь для Android

Нативное Android-приложение для изучения английских слов, сделанное мной самостоятельно: слово можно захватить из любого приложения, получить AI-статью с переводами и выучить его с интервальным повторением и экзаменами, которые генерирует AI.

Моя роль
Самостоятельный продукт: идея, спецификация, Android-архитектура, интеграция AI и разработка.
Стек
  • Kotlin
  • Jetpack Compose
  • Hilt
  • Room
  • Ktor
  • WorkManager
  • Gemini API
  • Anthropic API

Задача

Незнакомые слова встречаются везде — в браузере, чатах, на скриншотах, — и копирование их в словарь сбивает с мысли. А просто переведённые слова без практики быстро забываются.

Архитектура

AI-словарь для Android — Схема архитектурыCaptureselect · shareCompose UIViewModelsDomainuse cases · SRSAiClientAnthropic · GeminiRoomwords · examsWorkManageroffline queue
Приложение на Kotlin с UI на Jetpack Compose, ViewModel и доменным слоем из use case и интерфейсов репозиториев; Hilt связывает слой данных: Room для слов, прогресса и экзаменов, AiClient с реализациями для Gemini (по умолчанию) и Anthropic поверх Ktor, WorkManager для офлайн-очереди, EncryptedSharedPreferences для API-ключа и foreground-сервис, отслеживающий новые скриншоты.

Ключевые решения

  1. 01Один интерфейс AiClient, два провайдера

    Почему
    Приложение обращается к модели только через доменный интерфейс. Gemini и Anthropic — взаимозаменяемые реализации: смена провайдера — одна строка в DI, а остальной код не знает, какая из них используется.
  2. 02Строгий JSON от модели и защищённый парсинг

    Почему
    Каждый ответ должен быть JSON; парсер срезает markdown-ограждения, при ошибке делает один повтор, а затем возвращает типизированную ошибку, которую показывает UI, — плохой ответ модели не роняет приложение.
  3. 03Без AccessibilityService

    Почему
    Захват слов работает только через меню выделения текста, «Поделиться» и скриншоты, поэтому приложению не нужно самое чувствительное разрешение Android.
    Компромисс
    Слова не подхватываются с экрана автоматически: пользователь должен выделить, поделиться или сделать скриншот.

Что я сделал

  • Захват слов откуда угодно: меню выделения текста в любом приложении, «Поделиться картинкой» с обрезкой и AI-распознаванием, наблюдатель скриншотов с плавающим пузырём
  • AI-статьи о словах — объяснение, переводы на русский и туркменский, примеры — с озвучкой
  • AI за одним интерфейсом с реализациями для Gemini (по умолчанию) и Anthropic; собственный ключ пользователя хранится в зашифрованном виде
  • Интервальное повторение по Лейтнеру, пять типов локальных квизов, экзамены от AI и проверка открытых ответов
  • Офлайн-очередь: слова, добавленные без сети, обрабатывает WorkManager позже
  • База Room с протестированными миграциями, экспорт и импорт, интерфейс на английском, русском и туркменском