Приложение для Android на языке Java. APK-файл (debug-версия) лежит в папке apk. Реализованный минимальный функционал:
- Перевод с одного языка на другой с помощью API Яндекс.Переводчика.
- Поле для ввода текста, который будет переведён на другой язык; переключатель языка и варианты перевода, которые появляются, когда пользователь вводит текст в поле.
- Возможность добавить переведённое слово или предложение в избранное.
- Возможность просмотра истории переводов.
- Возможность просмотра избранного.
По дизайну скриншотов к заданию был реализован дополнительный функционал:
- Голосовой ввод текста для перевода с использованием API Яндекс.SpeechKit
- Вокализация исходного текста и переведенного текста с использованием API Яндекс.SpeechKit
- Вывод словарной статьи для ряда языков через API Яндекс.Словаря
- Поиск по началу слова в Истории и Закладках
- Множественный выбор и удаление пунктов в Истории и закладках
При запуске в StartActivity происходит подключение к серверу и забор актуальной информации по доступным языкам для перевода.
При ошибке подключения к серверу или отсутствии выводится экран с сообщением об ошибке. Экран переводчика неактивен, доступна только кнопка для проверки соединения. Пользователь может искать ранее сохраненные переводы в закладках и истории.
При нормальном подключении запускается TabActivity с ViewPager, в котором расположено три фрагмента
- переводчик
- история/закладки
- настройки (пустой экран, не успел реализовать)
Каждый реализованный экран сделан по модели MVP. Фрагменты-вью отвечают только за отображение переданных данных, презентер инкапсулирует в себе работу с сетью и базой данных. Презентер сохраняется при смене ориентации экрана и позволяет восстанавливать последние данные.
Работа с API и базой данных сделана в виде отдельных сервисов, запросы к которым осуществляются асинхронно.
Дополнительно сделан TranslateRepository, чтобы инкапсулировать логику для работы с переводом, которая выполняется таким образом
- Проверяется наличие перевода в базе данных.
- При наличии перевода в базе - возвращается он
- Если перевода нет - запрашивается комплексный запрос к API.Переводчика и API.Словарям. При выполнении обеих запросов формируется новый перевод, который выводится на экран и записывается в базу данных.
Поиск в базе идет по исходному тексту, исходному языку и языку перевода. Это позволяет сохранять переводы с одним исходным текстом и разными целевыми языками.
Кроме библиотек Яндекс.SpeechKit и стандартных библиотек для Android были выбраны следующие решения:
-
Moxy для реализации MVP-подхода. Выбрана за то, что автоматически позволяет сохранять презентер при смене ориентации экрана.
-
RxAndroid для удобной работы с асинхронными запросами и коллбэками.
-
Dagger 2 для того, чтобы инжектировать репозитории, сервисы и некоторые другие объекты, а не передавать их в презентеры или создавать на месте.
-
Retrofit 2 поскольку это очень хорошая библиотека для работы с сетевыми запросами, кардинально облегчающая разработку даже для новичков.
-
Cupboard для небольшого облегчения для работы с базой данных. При выборе ORM я склонялся к Realm, но решил таки применить Cupboard, так как она легче, а также для того, чтобы лишний раз потренироваться с базовыми операциями с SQLite
-
ButterKnife из-за быстрого инжектирования View и удобства работы с коллбэками для них
-
SlidingSquaresLoader просто потому, что это забавный ProgressBar - для показа на StartActivity.
-
LeakCanary для обнаружения утечек памяти на этапе отладки. Благодаря ему обнаружил, что SlidingSquaresLoader необходимо останавливать при закрытии Activity, иначе возникает небольшой (очень небольшой, но все же!) Memory Leak.
Дополнительно - для Layout старался выбирать ConstraintLayout от Google, поскольку этот Layout заявлен как более быстрый и удобный, чем, к примеру, RelativeLayout. В 2016 на этапе беты у ConstraintLayout был ряд неприятных багов (к примеру, перенос текста во вложенных TextView), но сейчас в релизной версии он выглядит надежным.