Приложение,способное найти любого пользователя гитхаба по его имени,отобразить все его репозитории, а также скачать понравившийся репозиторий
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" для предоставления зависимостей извне
Сейчас я хочу кратко рассказать о каждой фиче данного приложения (будет приложено видео,как что собой представляет та или иная фича)
Получая юзера из сети мы сохраняли его локально. Теперь мы имеем возможность видеть список юзеров,раннее полученных с интернета
Третья и четвертая фичи - "GA03,GA04 repositories" (получение репозиториев юзера гитхаба,кеширование их)
В первый раз по нажатии на юзера его репозитории сохраняются локально,благодаря чему мы можем просматривать список юзера автономно
Теперь мы можем разворачивать элемент списка для получения дополнительной информации. В случае элемента юзера - это его биография (если она присутствует), в случае элемента репозиторий - его основная ветка
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
Теперь наш пользователь может не только искать юзеров,просматривать его репозитории,фильтровать их по состоянию,но и скачивать любой репозиторий выбранного юзера
Стоит отметить,что в этой фиче я обрабатывал несколько состояний по нажатии на репозиторий
Первое состояние - Big (файл слишком большой),когда в ui слой приходит данное состояние,мы отобажаем SnackBar с действитим "Download"
В snackbar говорится о том,что размер репозитория большой.К тому же отображается размер нажатого репозитория в килобайтах.
Если пользователь в течение 10 секунд нажимает на "Download",то начинается загрузка репозитория в память устройства,отображется диалоговое окно с процессом загрузки.
Второе состояние - WaitingToDownload,когда размер нажатого репозитория небольшой,то в ui слой приходит это состояние,после чего мы начнем загрузку репозитория в память устройства,отображая диалоговое окно с процессом загрузки
Третье состояние - Exist(данный репозиторий уже скачан)
Четвертое состояние - Failure,который инкапсулирует в себе сообщение об ошибке
Поведение ui слоя в зависимости от пришедшего состояния вы можете лицезреть ниже
Big | WaitingToDownload | Exist | Failure |
---|---|---|---|
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
Fetching a github user by his name from the Internet and show a detail information about him using Retrofit
Fetching the github user by his name for the local storage using Room
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
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
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!