Тестовое задание. Многомодульное Android-приложение на Java с Clean Architecture.
| Категория | Технология |
|---|---|
| Язык | Java 17 |
| HTTP клиент | Retrofit 2 + OkHttp (MockInterceptor читает JSON из assets) |
| База данных | Room (избранные курсы) |
| DI | ServiceLocator в App + ViewModelProvider.Factory |
| Архитектура | MVVM + Clean Architecture |
| Навигация | Jetpack Navigation Component |
| Реактивность | AndroidX LiveData |
| Список | RecyclerView + AdapterDelegates4 |
| Верстка | XML layouts |
ITCourses/
├── app/ # App (ServiceLocator), LoginActivity, MainActivity, навигация, ресурсы
├── adaper/
├── view model/
├── view model factory/
└── fragment/
├── domain/ # Course, UseCase-ы, интерфейс CourseRepository
├── data/ # Retrofit, MockInterceptor, Room, CourseRepositoryImpl, CourseMapper
Presentation (Fragment + ViewModel)
↕ \[UseCase]
Domain (Course, UseCase, интерфейс CourseRepository)
↕ \[Implementation]
Storage (CourseRepositoryImpl → Retrofit / Room)
App.java играет роль ServiceLocator — создаёт все зависимости один раз при старте:
OkHttpClientсMockInterceptorRetrofit→CourseApiAppDatabase→FavoriteCourseDaoCourseRepositoryImpl(singleton)
Фрагменты получают репозиторий через App.getInstance().getCourseRepository()
и передают его в ViewModelFactory, который создаёт ViewModel с нужными UseCase.
- Email: маска
текст@текст.текст, кириллица заблокирована черезInputFilter - Кнопка "Войти" активна только при корректных обоих полях (
MediatorLiveData) - ВКонтакте →
https://vk.com/, Одноклассники →https://ok.ru/ - Любой корректный email + непустой пароль → вход
- Курсы из
assets/courses.jsonчерез Retrofit +MockInterceptor - Сортировка по убыванию
publishDate hasLike = true→ зелёная закладка; клик → Room (добавить/удалить)- Поиск и фильтр — нефункциональные заглушки
- Описание: maxLines=2, ellipsize=end
- LiveData из Room, обновляется реактивно
- Пустое состояние — текст