- Клонируйте репозиторий:
git clone https://github.com/LebedevSergeyVach/EltexSocialMedia.git
-
Откройте проект в Android Studio.
-
Соберите проект с помощью Gradle.
-
Запустите приложение на эмуляторе или физическом устройстве.
- Реализован CRUD (Create, Read, Update, Delete) для работы с постами и событиями.
- Возможность создания, чтения, обновления и удаления постов и событий через удаленный сервер.
- Использование Retrofit для отправки запросов на сервер и получения данных в формате JSON.
- Поддержка Coroutines для асинхронных операций, что упрощает код и повышает производительность.
- Использование Jetpack Preferences DataStore для хранения настроек приложения и других локальных данных. DataStore предоставляет более современный и безопасный способ хранения данных по сравнению с SharedPreferences.
- Работа с локальной базой данных SQLite через ORM Room. Room упрощает работу с базой данных, предоставляя абстракцию над SQLite.
- Поддержка ksp (Kotlin Symbol Processing) для генерации кода на этапе компиляции, что ускоряет работу с Room.
- Использование Prepopulate your Room database для удобства тестирования. Это позволяет заполнить базу данных начальными данными перед запуском приложения.
- Работа с удаленным сервером через Retrofit2 и OkHttp3. Retrofit используется для создания HTTP-запросов, а OkHttp — для обработки сетевых запросов и ответов.
- Обработка данных в формате JSON с использованием Kotlin Serialization.
- Поддержка асинхронных операций через Coroutines. Coroutines предоставляют более простой и читаемый способ работы с асинхронным кодом.
-
Проект построен на архитектуре MVI (Model-View-Intent), которая обеспечивает четкое разделение ответственности между компонентами приложения. Основные элементы MVI:
- Model: Представляет собой состояние приложения. В нашем случае это данные о постах, событиях и текущем статусе загрузки.
- View: Отвечает за отображение данных пользователю. В проекте это фрагменты и активити, которые отображают список постов и другие элементы интерфейса.
- Intent: Представляет собой намерения пользователя, такие как загрузка постов, лайки, удаление и т.д. Эти намерения передаются в ViewModel, где обрабатываются и преобразуются в изменения состояния.
-
Проект построен на архитектуре MVVM (Model-View-ViewModel). MVVM разделяет логику приложения на три компонента: Model (данные), View (интерфейс) и ViewModel (логика представления).
- Model: Отвечает за данные и бизнес-логику приложения. Включает в себя работу с локальной базой данных (Room), сетевыми запросами (Retrofit) и другими источниками данных.
- View: Отвечает за отображение данных пользователю. Это фрагменты и активити, которые взаимодействуют с пользователем и отображают UI.
- ViewModel: Связывает Model и View. ViewModel получает данные от Model и преобразует их в формат, который может быть отображен в View. Также ViewModel обрабатывает пользовательские действия и передает их в Model.
-
Использование следующих архитектурных паттернов и парадигм:
- Строитель (Builder): Паттерн для создания сложных объектов.
- Наблюдаемый (Observable): Паттерн для уведомления объектов об изменениях в данных.
- Наблюдатель (Observer): Паттерн для подписки на изменения данных.
- Адаптер (Adapter): Паттерн для преобразования интерфейса одного класса в интерфейс, ожидаемый клиентом.
- Внедрение зависимостей (Dependency Injection): Паттерн для управления зависимостями между компонентами.
- Архитектура с одной активностью (Single Activity Architecture): Подход, при котором все экраны приложения управляются одной Activity, что упрощает навигацию и управление состоянием.
- Модульная архитектура (Modular Architecture): Разделение приложения на независимые модули для упрощения разработки и тестирования.
- Реактивное программирование (Reactive Programming): Подход к программированию, основанный на асинхронных потоках данных.
- Возможность выбора языка интерфейса: Русский, Английский или системный язык.
- Выбор темы приложения: темная, светлая или системная тема.
- Включение и отключение виброотклика в приложении.
- Использование Prepopulate your Room database для удобного тестирования локальной базы данных.
- Поддержка модульной архитектуры для упрощения тестирования отдельных компонентов.
- Использование JUnit для модульного тестирования и Espresso для UI-тестирования.
- Использование библиотеки SkeletonLayout для отображения анимированных заглушек (скелетонов) во время загрузки данных.
- Скелетоны помогают улучшить пользовательский опыт, показывая, что данные загружаются, и предотвращая "мерцание" интерфейса.
- Библиотека поддерживает настройку цвета анимации, фона и других параметров для создания адаптивных скелетонов.
В проекте используются две архитектуры: MVVM (Model-View-ViewModel) и MVI (Model-View-Intent). Обе архитектуры помогают организовать код, разделяя ответственность между компонентами приложения, но они имеют свои особенности и применяются в разных частях проекта.
В проекте также используется архитектура MVVM (Model-View-ViewModel), которая обеспечивает четкое разделение ответственности между компонентами приложения. Основные элементы MVVM:
- Model: Отвечает за данные и бизнес-логику приложения. Включает в себя работу с локальной базой данных (Room), сетевыми запросами (Retrofit) и другими источниками данных.
- View: Отвечает за отображение данных пользователю. Это фрагменты и активити, которые взаимодействуют с пользователем и отображают UI.
- ViewModel: Связывает Model и View. ViewModel получает данные от Model и преобразует их в формат, который может быть отображен в View. Также ViewModel обрабатывает пользовательские действия и передает их в Model.
- PostRepository: Репозиторий, который управляет данными о постах. Он взаимодействует с локальной базой данных (Room) и сетевым API (Retrofit) для получения и обновления данных.
- PostViewModel: ViewModel, которая связывает View с репозиторием. Она получает данные от репозитория и предоставляет их View через LiveData или StateFlow.
- View: Фрагменты и активити, которые отображают данные пользователю и обрабатывают пользовательские действия, такие как лайки, удаление и обновление постов.
- Загрузка постов: Посты загружаются с сервера порциями (пагинация). ViewModel запрашивает данные у репозитория, который, в свою очередь, взаимодействует с Retrofit для выполнения сетевых запросов.
- Лайки и удаление: Пользователь может лайкать посты и удалять их. Эти действия передаются в ViewModel, которая обновляет данные через репозиторий и уведомляет View об изменениях.
- Обработка ошибок: В случае ошибок при загрузке данных или выполнении действий, ViewModel уведомляет View, и пользователю показываются соответствующие уведомления.
- Retrofit2: Для выполнения сетевых запросов к серверу.
- Coroutines: Для асинхронной обработки запросов и обновления состояния.
- Jetpack DataStore: Для хранения локальных настроек, таких как выбор темы и языка.
- Room: Для работы с локальной базой данных SQLite.
- Разделение ответственности: Каждый компонент выполняет свою задачу, что упрощает поддержку и тестирование кода.
- Жизненный цикл ViewModel: ViewModel сохраняет данные при изменении конфигурации (например, при повороте экрана), что улучшает пользовательский опыт.
- Поддержка DataBinding: MVVM хорошо интегрируется с DataBinding, что позволяет автоматически обновлять UI при изменении данных.
Проект также построен на архитектуре MVI (Model-View-Intent), которая обеспечивает четкое разделение ответственности между компонентами приложения. Основные элементы MVI:
- Model: Представляет собой состояние приложения. В нашем случае это данные о постах, событиях и текущем статусе загрузки.
- View: Отвечает за отображение данных пользователю. В проекте это фрагменты и активити, которые отображают список постов и другие элементы интерфейса.
- Intent: Представляет собой намерения пользователя, такие как загрузка постов, лайки, удаление и т.д. Эти намерения передаются в ViewModel, где обрабатываются и преобразуются в изменения состояния.
- PostStore: Хранилище, которое управляет состоянием постов и эффектами. Оно обрабатывает сообщения (Intents) и обновляет состояние (Model).
- PostEffectHandler: Обработчик эффектов, который выполняет побочные эффекты, такие как загрузка данных с сервера, лайки и удаление постов.
- PostReducer: Редьюсер, который обрабатывает сообщения и обновляет состояние приложения. Он определяет, как состояние изменяется в ответ на действия пользователя.
- PostViewModel: ViewModel, которая связывает View с хранилищем (Store). Она принимает сообщения от пользователя и передает их в хранилище для обработки.
- Загрузка постов: Посты загружаются с сервера порциями (пагинация). Когда пользователь приближается к концу списка, автоматически загружается следующая порция данных.
- Лайки и удаление: Пользователь может лайкать посты и удалять их. Эти действия отправляются на сервер, и состояние приложения обновляется в реальном времени.
- Обработка ошибок: В случае ошибок при загрузке данных или выполнении действий, пользователю показываются соответствующие уведомления, а состояние приложения корректно обновляется.
- Retrofit2: Для выполнения сетевых запросов к серверу.
- Coroutines: Для асинхронной обработки запросов и обновления состояния.
- Jetpack DataStore: Для хранения локальных настроек, таких как выбор темы и языка.
- Room: Для работы с локальной базой данных SQLite.
- Предсказуемость: Состояние приложения всегда ясно и предсказуемо, так как все изменения происходят через редьюсер.
- Тестируемость: Компоненты MVI легко тестируются, так как они изолированы и имеют четкие обязанности.
- Масштабируемость: Архитектура MVI позволяет легко добавлять новые функции и изменять существующие без нарушения работы приложения.
Характеристика | MVVM | MVI |
---|---|---|
Состояние | Состояние может быть распределено между ViewModel и View. | Состояние централизовано и неизменно. |
Поток данных | Двусторонний: View может обновлять ViewModel, и наоборот. | Односторонний: View отправляет Intents, а ViewModel обновляет состояние. |
Тестируемость | Легко тестировать ViewModel, но сложнее тестировать взаимодействие с View. | Легко тестировать все компоненты, так как они изолированы. |
Сложность | Проще в реализации для небольших проектов. | Более сложная архитектура, но лучше подходит для больших проектов. |
Поддержка | Широко используется в Android-разработке. | Менее распространен, но набирает популярность. |
- MVVM лучше подходит для небольших проектов или экранов с простой логикой. Она проще в реализации и поддерживается большинством Android-разработчиков.
- MVI лучше подходит для сложных проектов, где важно управление состоянием и предсказуемость. MVI помогает избежать багов, связанных с изменением состояния, и упрощает тестирование.
Проект использует множество библиотек и инструментов для реализации различных функций. Ниже приведен список зависимостей, используемых в проекте:
-
AndroidX Core KTX: Утилиты для работы с Kotlin в Android.
implementation(libs.androidx.core.ktx)
-
AndroidX AppCompat: Поддержка обратной совместимости для новых функций Android.
implementation(libs.androidx.appcompat)
-
Material Design: Компоненты Material Design для создания современного интерфейса.
implementation(libs.material)
-
AndroidX Activity: Упрощение работы с Activity в Android.
implementation(libs.androidx.activity)
-
AndroidX ConstraintLayout: Гибкий и мощный макет для создания сложных интерфейсов.
implementation(libs.androidx.constraintlayout)
-
Room: ORM для работы с SQLite.
implementation(libs.androidx.room.runtime) implementation(libs.androidx.room.ktx) ksp(libs.androidx.room.compiler)
-
DataStore: Хранение ключевых данных и настроек.
implementation(libs.androidx.datastore.preferences) implementation(libs.androidx.datastore) implementation(libs.androidx.datastore.core)
-
Retrofit: HTTP-клиент для работы с REST API.
implementation(libs.retrofit) implementation(libs.retrofit2.kotlinx.serialization.converter)
-
OkHttp: Клиент для работы с HTTP-запросами.
implementation(platform(libs.okhttp.bom)) implementation(libs.okhttp) implementation(libs.logging.interceptor)
- Coroutines: Упрощение работы с асинхронными операциями.
Документация
testImplementation(libs.kotlinx.coroutines.test)
-
ViewParticleEmitter: Анимации для создания эффектов.
implementation(libs.confetti)
-
SplashScreen: Поддержка экрана загрузки.
implementation(libs.androidx.core.splashscreen)
-
SwipeRefreshLayout: Поддержка "pull-to-refresh" для обновления данных.
implementation(libs.androidx.swiperefreshlayout)
-
SkeletonLayout: Библиотека для отображения скелетонов (заглушек) во время загрузки данных.
implementation(libs.skeletonlayout)
-
Glide: Быстрая и эффективная платформа для управления мультимедиа и загрузки изображений с открытым исходным кодом для Android.
implementation(libs.glide)
-
JUnit: Фреймворк для модульного тестирования.
testImplementation(libs.junit)
-
AndroidX Test: Инструменты для тестирования Android-приложений.
androidTestImplementation(libs.androidx.junit) androidTestImplementation(libs.androidx.espresso.core)
-
Protobuf: Сериализация данных для хранения и передачи.
implementation(libs.protobuf.javalite)
-
Kotlin Serialization: Сериализация данных в формате JSON.
implementation(libs.kotlinx.serialization.json)
-
Desugaring: Поддержка Java 8 API на старых версиях Android.
coreLibraryDesugaring(libs.desugar.jdk.libs)
-
Dagger2-Hill: Внедрение зависимостей с помощью Hilt — это библиотека внедрения зависимостей для Android, которая упрощает шаблонное внедрение зависимостей вручную в ваш проект.
implementation(libs.hilt.android) ksp(libs.hilt.android.compiler)
- Kotlin: Основной язык программирования.
- Retrofit: HTTP-клиент для работы с REST API.
- Room: ORM для работы с SQLite.
- DataStore: Хранение ключевых данных и настроек.
- Coroutines: Упрощение работы с асинхронными операциями.
- Material Design: Компоненты для создания современного интерфейса.
- SkeletonLayout: Библиотека для отображения скелетонов во время загрузки данных.
- Glide: Библиотека для управления мультимедиа и загрузки изображений с открытым исходным кодом для Android.
Проект распространяется под лицензией AGPL v3. Подробнее см. LICENSE.