Реализовать Android-приложение со следующими функциями:
- Выводится краткая информация о пользователях (ФИО, фотография, адрес, номер телефона) в виде списка, полученная от https://randomuser.me ;
- По клику на элемент списка на отдельном экране показывается полная информация о выбранном пользователе;
- Данные о пользователях не теряются при перезапуске приложения;
- Нажатие на Email, номер телефона, адрес/координаты отправляет пользователя в приложение, которое может обработать эти данные (почта, звонилка, карты);
- Список пользователей можно обновить принудительно;
- Пользователю выводятся уведомления о возникших ошибках при загрузке данных или работе с ними.
-
Jetpack Compose
- Выбран, потому что это современный декларативный UI-фреймворк от Google, который позволяет быстро строить адаптивный интерфейс без XML, что делает его проще и быстрее в разработке, чем ViewBinding или классические XML-layouts.
-
Navigation Compose
- Используется, так как он нативно встроен в Compose и даёт простой API для навигации и передачи аргументов, избавляя от необходимости писать сложный самописный стек экранов.
-
Koin
- Лёгкий DI-фреймворк без генерации кода и сложных аннотаций, что делает его быстрее и проще в интеграции с Compose по сравнению с Hilt.
-
Room
- Официальный ORM от Google с поддержкой AndroidX и удобной работой с SQLite, поэтому его проще интегрировать и сопровождать, чем Realm или SQLDelight.
-
Retrofit + OkHttp
- Стандарт HTTP-клиента в Android с простым API и отличной интеграцией с Kotlin Serialization, что делает его удобнее Ktor Client в чисто Android-проектах.
-
Kotlinx Serialization
- Нативный сериализатор от JetBrains с поддержкой
data-классов без сторонних аннотаций, что упрощает работу по сравнению с Gson и Moshi.
- Нативный сериализатор от JetBrains с поддержкой
-
Coil
- Быстрая и современная библиотека загрузки изображений, оптимизированная под Compose, что делает её легче и адаптивнее, чем Glide или Picasso.
-
Архитектура: Использована MVVM + Clean Architecture разделением на модули:
app- точка входа, глобальная навигация, DI инициализация.feature:user- функционал списка пользователей и экрана деталей пользователя.feature:user:api- usecase'ы, сущности, и направления навигации, доступные другим модулям.feature:user:impl- внутренняя реализация бизнес-логики и работы с данными/feature:user:presentation- UI-слой и ViewModel для отображения данных, обработки пользовательских событий и связи с бизнес-логикой/
feature:database- локальное хранилище с использованием Room.common:coroutine- вспомогательные классы и обёртки для работы с Kotlin Coroutines.common:design- общие UI-компоненты.common:mvvm- унифицированная реализация паттерна MVVM.common:navigation- минимальный набор абстракций для навигации между экранами.common:network- API-клиент с использованием Retrofit и OkHttp.common:resources- централизованное хранение строк, иконок и других ресурсов.
Это упрощает масштабирование и тестирование.
-
Навигация:
- Для глобальной навигации используется единый
NavHostвapp. - Каждая фича определяет собственный
NavGraph.
- Для глобальной навигации используется единый
-
Кэширование данных:
- Загруженные пользователи сохраняются в Room.
- При старте приложения данные берутся из БД, при обновлении из API с перезаписью.
-
Обработка ошибок:
- При первичной загрузке ошибки переводят экран в
ErrorScreen, при обновлении списка ошибки логируются без потери текущих данных.
- При первичной загрузке ошибки переводят экран в
-
Открытие внешних приложений:
Intentдля звонков (tel:), email (mailto:) и карт (geo:) с поддержкой любых совместимых приложений.
-
Обновление списка:
PullToRefreshBoxс флагомisRefreshing, данные обновляются черезobserveUsersUseCaseбез полной перезагрузки экрана.

