Технический стек: Kotlin + coroutines, Android Architechture Components (Navigation, ViewModel, LiveData), Dagger2, Retrofit, Security
Инструменты для отладки: LeakCanary, Chucker (сниффер HTTP трафика с GUI)
Приложение состоит из двух модулей: [base] и [mobile].
[base] содержит код независимый от UI (работа с сетевыми запросами) и потенциально может быть вынесен в отдельную библиотеку и/или использоваться другими модулями.
[mobile] содержит мобильный клиент с указанной в задании функциональностью.
Полученные OAuth токены сохраняются в SharedPreferences в зашифрованном виде с мастер-ключом хранящимся в AndroidKeystore. Для этих целей используется библиотека androidx.security.crypto.
Все запросы к API проходят через прокси-класс com.zakaryan.myretailcrm.data.http.ExtendedHttpManager, задача которого перехватывать ситуации, когда запрос к API завершается ошибкой авторизации (HTTP 401). В этом случае класс пытается использовать refresh-токен, чтобы получить новый access-токен и автоматически повторить запрос к API. Если все попытки оказываются неудачными, он обновляет LiveData с состоянием авторизации, чтобы наблюдатель мог отреагировать (показать экран с вводом пароля). Так сделано, для того, чтобы вынести всю работу с токенами в один класс и автоматизировать переотправку запроса при истекшем токене.
Тесты успел написать только на ExtendedHttpManager, но остальные в принципе делаются аналогично. (В ExtendedHttpManager сделал вызовы withContext, которые можно было бы убрать внутрь зависимости (TokenManager), чтобы тест был "поинтереснее" - с тестированием suspend функции).
-
Я плохо знаком с GraphQl, поэтому скорее всего неоптимально сделал парсинг данных приходящих от API - на данный момент там кастомные deserializer'ы (com.zakaryan.myretailcrm.base.http.model.deserializer). Возможно, можно обойтись без кастомных парсеров, или, возможно, нужно было использовать специльную библиотеку для работы с GraphQL вместо Retrofit.
-
androidx.security.crypto не поддерживают работу с AndroidKeystore на Android-устройствах до 6ой версии (API 23) - защита токенов на этих устройствах слабее.