Skip to content

Commit

Permalink
Update README.md
Browse files Browse the repository at this point in the history
  • Loading branch information
Nauruz-Guliev authored May 13, 2023
1 parent e66fad1 commit f728848
Showing 1 changed file with 74 additions and 18 deletions.
92 changes: 74 additions & 18 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -18,29 +18,85 @@

### Введение
Данное мобильное приложение позволяет познакомиться с миром анимационного сериала [Рик и Морти](https://rick-i-morty.online/).
Пользователю доступна подробная информация о персонажах, эпизодах и локациях, которые предоставляются сервисом ["The Rick and Morty Api"](https://rickandmortyapi.com/).

### Общие требования к приложению

* Главный экран состоит из нижней навигации с тремя вкладками: персонажи, эпизоды и локации.
* Экран с деталями о персонаже, эпизоде или локации.
* Списки на главных экранах выполнены в виде двух столбцов.
* Фильтрация и поиск данных на главных экранах.
* Обновление данных на каждом экране посредством смахивания сверху вниз (Pull-to-Reresh).
* Кнопка назад на экранах с деталями.
* Скрывание нижней навигации на экранах с деталями.
* Поддержка работы без интернета путём кэширования данных.
* Возможность навигации на предыдущий экран.
* Поддержка [пагинации](https://ru.wikipedia.org/wiki/%D0%9F%D0%B0%D0%B3%D0%B8%D0%BD%D0%B0%D1%86%D0%B8%D1%8F) на главных экранах.
* Наличие начального экрана (Splash Screen).
* Отображение прогресс-индикатора в момент загрузки на всех экранах.
* Уведомление для пользователя в случае, если не было найдено данных соотвествующих фильтру.
Пользователю доступна подробная информация о персонажах, эпизодах и локациях, которые предоставляются сервисом ["The Rick and Morty Api"](https://rickandmortyapi.com/).

### Требования к приложению

- [x] Главный экран состоит из нижней навигации с тремя вкладками: персонажи, эпизоды и локации.
- [x] Экран с деталями о персонаже, эпизоде или локации.
- [x] Списки на главных экранах выполнены в виде двух столбцов.
- [x] Фильтрация и поиск данных на главных экранах.
- [x] Обновление данных на каждом экране посредством смахивания сверху вниз (Pull-to-Reresh).
- [x] Кнопка назад на экранах с деталями.
- [x] Скрывание нижней навигации на экранах с деталями.
- [x] Поддержка работы без интернета путём кэширования данных.
- [x] Возможность навигации на предыдущий экран.
- [x] Поддержка [пагинации](https://ru.wikipedia.org/wiki/%D0%9F%D0%B0%D0%B3%D0%B8%D0%BD%D0%B0%D1%86%D0%B8%D1%8F) на главных экранах.
- [x] Наличие начального экрана (Splash Screen).
- [x] Отображение прогресс-индикатора в момент загрузки на всех экранах.
- [x] Уведомление для пользователя в случае, если не было найдено данных соотвествующих фильтру.

### Какие темы были затронуты в рамках интенсива и применены в проекте

1) **Git**

Сохранение версий приложения, разделение на ветки для удобства разработки.

2) **Android studio**

Вся разработка велась в Android Studio, сборщик - Gradle. К тому же использовался файл с раширением [.toml](https://docs.gradle.org/current/userguide/platforms.html) в сочетании с kotlin для настройки зависомстей, что облегчило работу с модулями.

3,4) **View**

Помимо обычных view (button, edittext) и viewgroup (linear layout, constraint layout) использовались: ChipGroup для фильтра, общий Searchview для поиска, своя реализация Toolbar, MotionLayout для разорачивания списков на экранах с деталями, Coordinator Layout для реализации выезжающего фильтра. Хотелось достигнуть схожего результата, как в примере [Material Backdrop](https://m2.material.io/components/backdrop#usage)

5) **Fragments**

Весь проект построен на связке 1 activity + 6 fragments. Для реализации Splash Screen использовалась официальная библиотека [Splash Screen Api](https://developer.android.com/develop/ui/views/launch/splash-screen), которая появлиась в Android 12. Навигация между фрагментами реализована с помошью Fragment Manager. За всю навигацию в приложении отвечает класс [Router](https://github.com/Nauruz-Guliev/RickAndMorty/blob/master/app/src/main/java/ru/example/gnt/rickandmorty/navigation/MainRouter.kt), который реализует интерфейсы-роутеры других модулей и предоставляет реализацию этих интерфейсов.

6) **Recycler View**

Реализация Recycler View есть на каждом экране, отличаются лишь адаптеры. Для главных экранов использовался PagingDataAdapter, который является частью билиотеки [Paging 3](https://developer.android.com/topic/libraries/architecture/paging/v3-overview). В качестве Layout Manager выступает Staggerred Layout Manager. Для экранов с деталями использовался List Adapter.


7) **Concurrency**

На экранах с деталями использовалась связка Handler + Looper, так как результат из [Connectivity Manager](https://developer.android.com/reference/android/net/ConnectivityManager) мог приходить не на главном потоке, вся остальная работа с параллелилизмом велась с помощью RxJava и Kotlin Coroutines.


8) **Network**

Работа с сетью производится с помощью [Retrofit 2](https://square.github.io/retrofit/), [OkHttp](https://square.github.io/okhttp/) и [Glide](https://github.com/bumptech/glide). OkHttp понадобился для создания перехватчиков (Interceptor) логирования и отслеживания состояния подключения к интернету. Glide используется для загрузки изображений.

9) **SQL**

Для взаимодействия с базой данных использовался [Room](https://developer.android.com/training/data-storage/room). Так как для пагинации понадобился RemoteMediator и в проекте была RxJava, были добавлены дополнительные завимости для Room.

10) **MVVM / MVP /CA**

Приложение спроектировано с использованием шаблона MVVM и чистой архитектуры. Слои явно не знают друг о друге. View подписана на события (состояние) во View Model. Взаимодействие view и viewmodel происходит с помощью LiveData/Kotlin flows. Приложение разделено на 7 модулей. App - связывает все модули приложения. Data отвечает за взаимодействие с внешними источниками данных. Ui - в основном хранит в себе ресурсы, которые могут понадобится в других модулях. Common - хранит данные, которые могут понадобится в любом из модулей. Оставшиеся 3 - фиче-модули locations, episodes, characters, которые несут в себе основную бизнес- логику. Каждый фиче-модуль разделен на Data, Domain, Di, Presentation. В Data слое - мапперы, реализация репозиториев. В Domain - интерфейсы репозиториев, сущности, usecase'ы. Di - компоненты, модули, интерфейсы зависимостей. Presentation - модели, адаптеры, фрагменты, вью модели.

11) **Services**

Сервисы не понадобились.

12) **Coroutines**

Coroutines использовались для асинхронного выполнения запросов в сеть и доступа к базе данных. В основном использовался Dispatcher - IO, который внедрялся в репозитории. Для хранения состояния в view model был применен Kotlin Flows.

13) **RxJava**

RxJava выступала альтернативой Coroutines в местах, где использовалась Java. В качестве Scheduler во всем проекте использовались IO и Android Main Thread. Последний подключался отдельной зависимостью.

14) **Dagger**

Зависимости внедрялись с помощью [Dagger 2](https://www.google.com/search?q=dagger+2&rlz=1C1GCEU_ruRU1029RU1029&oq=dagger+2&aqs=chrome..69i57j35i39l2j69i59j0i20i263i512j69i60j69i61j69i60.1033j0j7&sourceid=chrome&ie=UTF-8). Из одного модуля в другой зависимость поставляется посредством интерфейсов. Фиче-модуль содержит интерфейс, App модуль его реализует и отдаёт реализацию. Жизненный цикл компонентов в фиче модулях завязан на вью моделе.

### Содержание

1) **Главный экран - Персонажи.**

Данный экран содержит список всех персонажей. Каждый элемент списка отображает следующую информацию о персонаже:
Данный экран содержит список всех персонажей. Каждый элемент списка отображает следующую информацию о персонаже:

1.1 **Фильтрация**

Expand Down

0 comments on commit f728848

Please sign in to comment.