Skip to content

KostyaGig/GithubRepositoriesApp

Repository files navigation

GithubRepositoriesApp

Приложение,способное найти любого пользователя гитхаба по его имени,отобразить все его репозитории, а также скачать понравившийся репозиторий

GuithubRepositoriesApp be able to find anything github user by his name and show all his repositories

Приложение сделано с помощью api github на базе чистой архитектуры (Clean Architecture) cоблюдая принципы ООП,а также SOLID

Для всех необходимых классов были написаны unit-тесты. Написаны user story и test cases

Историю создания проекта можно посмотреть по коммитам либо по веткам

1. Маппинг данных через слои
2. Архитектурный паттерн MVVM
3. Retrofit для запросов в сеть
4. RxJava для асинхронной работы
5. Room для локального хранения данных
6. Glide для загрузки и кеширования иконки юзера
7. Паттерн "Service locator" для предоставления зависимостей извне

Сейчас я хочу кратко рассказать о каждой фиче данного приложения (будет приложено видео,как что собой представляет та или иная фича)

Первая фича - "GA01_users" (получение юзера гитхаба по сети черех Retrofit)

Вторая фича - "GA02_local_users" (получение юзеров,закешированных раннее)

Получая юзера из сети мы сохраняли его локально. Теперь мы имеем возможность видеть список юзеров,раннее полученных с интернета

Третья и четвертая фичи - "GA03,GA04 repositories" (получение репозиториев юзера гитхаба,кеширование их)

В первый раз по нажатии на юзера его репозитории сохраняются локально,благодаря чему мы можем просматривать список юзера автономно

Пятая фича приложение - "GA05_collapse_item" (свертывание и развертывание элементов списка)

Теперь мы можем разворачивать элемент списка для получения дополнительной информации. В случае элемента юзера - это его биография (если она присутствует), в случае элемента репозиторий - его основная ветка

Users Repositories

Чтобы каждый раз не отправлять запрос в базу данных я кеширую состояния элементов в класс,что позволяет напрямую обращаться к этому классу. В нем инкапсулировано три листа,в каждом из которых хранятся элементы списка определенного состояния Более подробно: ui -> core -> cache -> UiTempCache Также был реализован searchview в тулбаре приложения

Следующая фича (шестая по счету) - "GA06_filter_items" (отображение элементов списка по интересующему состоянию)

Всего 3 состояния списка: collapsed(отображать лишь свернутые), expanded(отображать лишь развернутые), any(отображать как сернутые,так и развернутые элементы списка)

Здесь хочется остановиться на поиске пользователя или репозиторий по названию Был покрыт следующий случай: Условно,у нас есть пользователь гитхаба с ником "Bob",состояние его элемента - Collpased Если мы в меню выбираем "Collapsed",то будут отображаться только "Collapsed" элементы,при поиске "Bob" успешно отобразится элемент списка с ником юзера "Bob"

Если мы в меню выбираем "Expanded",то будут отображаться только "Expanded" элементы,при поиске "Bob" отобразится сообщение с ошибкой "Not found data by state",что означает не найден юзер с ником "Bob", и с состоянием Expanded,но данный элемент списка с таким юзером находится в другом состоянии

Чтобы сохранять выбранное состояние я использовал Shared preferences

Самая интересная фича под номером 7 - "GA07_download_repository"

Теперь наш пользователь может не только искать юзеров,просматривать его репозитории,фильтровать их по состоянию,но и скачивать любой репозиторий выбранного юзера Стоит отметить,что в этой фиче я обрабатывал несколько состояний по нажатии на репозиторий

Первое состояние - Big (файл слишком большой),когда в ui слой приходит данное состояние,мы отобажаем SnackBar с действитим "Download" В snackbar говорится о том,что размер репозитория большой.К тому же отображается размер нажатого репозитория в килобайтах. Если пользователь в течение 10 секунд нажимает на "Download",то начинается загрузка репозитория в память устройства,отображется диалоговое окно с процессом загрузки. Второе состояние - WaitingToDownload,когда размер нажатого репозитория небольшой,то в ui слой приходит это состояние,после чего мы начнем загрузку репозитория в память устройства,отображая диалоговое окно с процессом загрузки

Третье состояние - Exist(данный репозиторий уже скачан)

Четвертое состояние - Failure,который инкапсулирует в себе сообщение об ошибке

Поведение ui слоя в зависимости от пришедшего состояния вы можете лицезреть ниже

Big WaitingToDownload Exist Failure

English

The apllication uses an API github
Data layer was covered by Junit - tests

You can see all the history of developming this project here

Main stack
1. Map the data through layers (data,domain,presentation)
2. MVVM architecture pattern
3. Retrofit for working with network
4. RxJava for asynchronous work
5. Room for local store the data
6. Glide for download images by url
7. Service locator pattern for providing dependencies
8. Clean architecture

A short description features of the application

The first feature is "GA01_users"

Fetching a github user by his name from the Internet and show a detail information about him using Retrofit

The second feature is "GA02_local_users".

Fetching the github user by his name for the local storage using Room

The third "GA03 repositories" and fourth "GA04 repositories" features was included together.

Fething the repositories clicked github user from the Internet and show him in the recycler view. The fetched data about the user will be cached with the help of Room

The fifth feature is "GA05_collapse_item" Collapsed and Expanded recycler view's items

It Was implemented an opportunity to see the user's detail information and also hide it it
When the item of the recycler view is an collapsed state then we see a short bio about a github user
When the item has an expanded state we cane see a detail bio about the user

The follow feature is "GA06_filter_items" filter the recycler view's items by collapsed and expanded

The last feature is "GA07_download_repository"

Using this application our users have an opportunity to download other github user's repositories for the following research their code
They'll be able to learn code other userds absolutely free and offline!