Приложение - онлайн магазин косметических средств. Приложение состоит из 5 главных экранов и нескольких дополнительных.
Реализована регистрация пользователя с сохранением данных для следующего входа (данные хранятся в базе данных). Осноные экраны - каталог, детали товара и просмотр избранных товаров.
Стартовый экран и экран регистрации
В приложении реализован стартовый экрна, логика которого определяет есть ли сохраненный пользователь в базе данных или у нас новый пользователь. В случае нового пользователя - старнтовый экране откроет регистрации, в противном случае - сразу каталог
. Экран регистрации валидирует вводимые значения и сохраняет данные пользователя в базу данных; при успешном вводе открывает каталог.
Экран "Каталог"
На экране каталога отображаются товары. Пользователь может отсортировать товары тремя способами - по популярности, по возрастанию и убыванию цены. На экране также присутствуют теги (chip group) с помощью которых можно отфильтровать
список отображемых товаров. Сортировка на отфильтрованном списке сохраняется и её можно поменять. На элементе списка товаров есть кнопки добавить и удалить из избранного. Для лучшего визуального восприятия товара реализована карусель изображений.
Экран "Детали"
При клике на товар пользователь попадет на экран деталей, где сможет посмотреть подробности, цену, увеличенное изображение товара и т.д. На экране деталей также есть кнопки добавить/удалить из избранного, при изменеии статуса товара в избранном
статус также поменяется и на экране "Каталог".
Экран "Профиль"
На экране профиля пользователь видит данные о себе и избранных товарах. Выход из приложения осуществляется по нажатию на кнопку выйти, в этом случае стираются все данные о пользователе и его избранных товарах.
Экран "Избранное
Экран реализован в виде двух табов, между которыми можно перемещатся свайпом или нажатием. На экране отображаются избранные товары, есть возможность удалить товар из избранного или перейти в детали товара.
Остальные экраны находятся в разработке.
- Приложение создано по принципам чистой архитектуры и SOLID, есть 3 слоя (data, domain, presentation). Связь между слоями осуществляется через интерфейсы.
- Используется паттерн MVVM в презентейшн слое.
- В качетсве библиотеки для DI выбрана библиотека Hilt.
- Приложения реализовано по принципу единой активити с фрагментами, навигация через navigation component и safe args.
- Получение данных реализовано с помощью Retrofit и корутин.
- Избранные товары и данные о пользователе хранятся в SQlite базе данные, библиотека Room и корутины.
- Списки сделаны через recyclerView и ListAdapter + Diffutil.
- Все по работе с данными лежит в data слое, некоторая часть бизнес логики (фильтрация и сортировка) в domain.
- На экране каталога и избранного реализована LCE модель управления состоянием экрана (loading, content, error).
- Валидация вводимого номера телефона реализована с помощью библиотеки Tinkoff decoro. Работа с UI через viewBinding.
- Карусели избражений и табы в избранном реализованы через viewPager2 и tabLayout.
- Kotlin
- Clean Architecture
- Hilt
- Retrofit
- Room
- SOLID
- MVVM (ViewModel, LiveData)
- RecyclerView
- ViewBinding
- Navigation Component
- Glide
- Tinkoff decoro
- Coroutines
![](https://private-user-images.githubusercontent.com/96295239/302069291-c8029aa9-374f-4bac-b415-f99811508eea.gif?jwt=eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJpc3MiOiJnaXRodWIuY29tIiwiYXVkIjoicmF3LmdpdGh1YnVzZXJjb250ZW50LmNvbSIsImtleSI6ImtleTUiLCJleHAiOjE3MjI0Mjc0NjQsIm5iZiI6MTcyMjQyNzE2NCwicGF0aCI6Ii85NjI5NTIzOS8zMDIwNjkyOTEtYzgwMjlhYTktMzc0Zi00YmFjLWI0MTUtZjk5ODExNTA4ZWVhLmdpZj9YLUFtei1BbGdvcml0aG09QVdTNC1ITUFDLVNIQTI1NiZYLUFtei1DcmVkZW50aWFsPUFLSUFWQ09EWUxTQTUzUFFLNFpBJTJGMjAyNDA3MzElMkZ1cy1lYXN0LTElMkZzMyUyRmF3czRfcmVxdWVzdCZYLUFtei1EYXRlPTIwMjQwNzMxVDExNTkyNFomWC1BbXotRXhwaXJlcz0zMDAmWC1BbXotU2lnbmF0dXJlPTg4ZTI1Yjk1ZmQ1ODIyYWEwMDk5NGI3YzcwMWRkNmU2ZGMwZjEyZTcwNzAxYmYxNzEyNDIwZjU3ZGUxNjUwN2EmWC1BbXotU2lnbmVkSGVhZGVycz1ob3N0JmFjdG9yX2lkPTAma2V5X2lkPTAmcmVwb19pZD0wIn0.-7LIU8hFguKlgeVh9yciQgQYItqT7Qa-jUHgIPvh6Rg)
![](https://private-user-images.githubusercontent.com/96295239/302069467-9b83ce86-e92a-4c7f-8226-6fe54b64f91d.gif?jwt=eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJpc3MiOiJnaXRodWIuY29tIiwiYXVkIjoicmF3LmdpdGh1YnVzZXJjb250ZW50LmNvbSIsImtleSI6ImtleTUiLCJleHAiOjE3MjI0Mjc0NjQsIm5iZiI6MTcyMjQyNzE2NCwicGF0aCI6Ii85NjI5NTIzOS8zMDIwNjk0NjctOWI4M2NlODYtZTkyYS00YzdmLTgyMjYtNmZlNTRiNjRmOTFkLmdpZj9YLUFtei1BbGdvcml0aG09QVdTNC1ITUFDLVNIQTI1NiZYLUFtei1DcmVkZW50aWFsPUFLSUFWQ09EWUxTQTUzUFFLNFpBJTJGMjAyNDA3MzElMkZ1cy1lYXN0LTElMkZzMyUyRmF3czRfcmVxdWVzdCZYLUFtei1EYXRlPTIwMjQwNzMxVDExNTkyNFomWC1BbXotRXhwaXJlcz0zMDAmWC1BbXotU2lnbmF0dXJlPWYxNGExNWJjYmYwZjkwMzIyNzI3NjAzMDNkYzEyMzZmZGUxNGJkYTliZDNjZmFlMDNlOGJiMjE4Mzg2ZTIwM2MmWC1BbXotU2lnbmVkSGVhZGVycz1ob3N0JmFjdG9yX2lkPTAma2V5X2lkPTAmcmVwb19pZD0wIn0.E60Il1J3RoeevuVFG2vTZCBF28Ly_KGhFLJn4jEl_LM)
![](https://private-user-images.githubusercontent.com/96295239/302069604-182e167d-5962-4345-bb2f-59513a5d29f9.gif?jwt=eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJpc3MiOiJnaXRodWIuY29tIiwiYXVkIjoicmF3LmdpdGh1YnVzZXJjb250ZW50LmNvbSIsImtleSI6ImtleTUiLCJleHAiOjE3MjI0Mjc0NjQsIm5iZiI6MTcyMjQyNzE2NCwicGF0aCI6Ii85NjI5NTIzOS8zMDIwNjk2MDQtMTgyZTE2N2QtNTk2Mi00MzQ1LWJiMmYtNTk1MTNhNWQyOWY5LmdpZj9YLUFtei1BbGdvcml0aG09QVdTNC1ITUFDLVNIQTI1NiZYLUFtei1DcmVkZW50aWFsPUFLSUFWQ09EWUxTQTUzUFFLNFpBJTJGMjAyNDA3MzElMkZ1cy1lYXN0LTElMkZzMyUyRmF3czRfcmVxdWVzdCZYLUFtei1EYXRlPTIwMjQwNzMxVDExNTkyNFomWC1BbXotRXhwaXJlcz0zMDAmWC1BbXotU2lnbmF0dXJlPWNlNmQzMmI0MTUxMTc0NzA2NTljOGQ3MTBmNDdmYTA3ODFjYjZmM2I1NTVmODVhODUzMDYxMjFkNmQxYTg4NzAmWC1BbXotU2lnbmVkSGVhZGVycz1ob3N0JmFjdG9yX2lkPTAma2V5X2lkPTAmcmVwb19pZD0wIn0.tDB5aCk14G2PeHqiHLZD3L8H2dP3fyxyKdOGJPR0h7M)
![](https://private-user-images.githubusercontent.com/96295239/302069635-f32b77c8-1738-43ea-9ca2-af81c725c7a6.gif?jwt=eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJpc3MiOiJnaXRodWIuY29tIiwiYXVkIjoicmF3LmdpdGh1YnVzZXJjb250ZW50LmNvbSIsImtleSI6ImtleTUiLCJleHAiOjE3MjI0Mjc0NjQsIm5iZiI6MTcyMjQyNzE2NCwicGF0aCI6Ii85NjI5NTIzOS8zMDIwNjk2MzUtZjMyYjc3YzgtMTczOC00M2VhLTljYTItYWY4MWM3MjVjN2E2LmdpZj9YLUFtei1BbGdvcml0aG09QVdTNC1ITUFDLVNIQTI1NiZYLUFtei1DcmVkZW50aWFsPUFLSUFWQ09EWUxTQTUzUFFLNFpBJTJGMjAyNDA3MzElMkZ1cy1lYXN0LTElMkZzMyUyRmF3czRfcmVxdWVzdCZYLUFtei1EYXRlPTIwMjQwNzMxVDExNTkyNFomWC1BbXotRXhwaXJlcz0zMDAmWC1BbXotU2lnbmF0dXJlPTMxZTkxMjFkMjE4NzRjOGU2YmFjYzEwYTlmMzFjMTRkN2UwYmFlMmM5Yzc4MmM1NDViMTAxMzE2NjAxYmQ5MGMmWC1BbXotU2lnbmVkSGVhZGVycz1ob3N0JmFjdG9yX2lkPTAma2V5X2lkPTAmcmVwb19pZD0wIn0.2zAkDl0x7zmzrPak1qbqqNCsVn2y2TpSbNAREA1RMag)
![](https://private-user-images.githubusercontent.com/96295239/302069639-96fd0f56-1dac-4298-8895-8788c5ceb4f4.gif?jwt=eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJpc3MiOiJnaXRodWIuY29tIiwiYXVkIjoicmF3LmdpdGh1YnVzZXJjb250ZW50LmNvbSIsImtleSI6ImtleTUiLCJleHAiOjE3MjI0Mjc0NjQsIm5iZiI6MTcyMjQyNzE2NCwicGF0aCI6Ii85NjI5NTIzOS8zMDIwNjk2MzktOTZmZDBmNTYtMWRhYy00Mjk4LTg4OTUtODc4OGM1Y2ViNGY0LmdpZj9YLUFtei1BbGdvcml0aG09QVdTNC1ITUFDLVNIQTI1NiZYLUFtei1DcmVkZW50aWFsPUFLSUFWQ09EWUxTQTUzUFFLNFpBJTJGMjAyNDA3MzElMkZ1cy1lYXN0LTElMkZzMyUyRmF3czRfcmVxdWVzdCZYLUFtei1EYXRlPTIwMjQwNzMxVDExNTkyNFomWC1BbXotRXhwaXJlcz0zMDAmWC1BbXotU2lnbmF0dXJlPWE4NTA2Mzg3Yjc4OTA4OTdlMjg4M2ZmNjhiMjFhMGQ0OTU2Mjk5MzdkZTM2Zjg1OTJjZWUwMjQ5Mjc4NzcxYTkmWC1BbXotU2lnbmVkSGVhZGVycz1ob3N0JmFjdG9yX2lkPTAma2V5X2lkPTAmcmVwb19pZD0wIn0.qMfCog3dc259squsWHiu28KQSKsHTt5JYC1YcVxt6Fg)
![](https://private-user-images.githubusercontent.com/96295239/302069642-17488888-372b-4ffb-b9f0-f9624aa2f017.gif?jwt=eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJpc3MiOiJnaXRodWIuY29tIiwiYXVkIjoicmF3LmdpdGh1YnVzZXJjb250ZW50LmNvbSIsImtleSI6ImtleTUiLCJleHAiOjE3MjI0Mjc0NjQsIm5iZiI6MTcyMjQyNzE2NCwicGF0aCI6Ii85NjI5NTIzOS8zMDIwNjk2NDItMTc0ODg4ODgtMzcyYi00ZmZiLWI5ZjAtZjk2MjRhYTJmMDE3LmdpZj9YLUFtei1BbGdvcml0aG09QVdTNC1ITUFDLVNIQTI1NiZYLUFtei1DcmVkZW50aWFsPUFLSUFWQ09EWUxTQTUzUFFLNFpBJTJGMjAyNDA3MzElMkZ1cy1lYXN0LTElMkZzMyUyRmF3czRfcmVxdWVzdCZYLUFtei1EYXRlPTIwMjQwNzMxVDExNTkyNFomWC1BbXotRXhwaXJlcz0zMDAmWC1BbXotU2lnbmF0dXJlPWNhY2QzNzFhYzkyNjM0NGJhYTA3NzUwYTg5NGI3ZDRhMTgyMDkxYzk3ZjI0Zjk0NmM1NzZjM2RjYTA5YTczYWQmWC1BbXotU2lnbmVkSGVhZGVycz1ob3N0JmFjdG9yX2lkPTAma2V5X2lkPTAmcmVwb19pZD0wIn0.2SlZk46_fVVhe-akQNP6-d90djVs4wRYsKwnocwA4bI)
![](https://private-user-images.githubusercontent.com/96295239/302069647-09cc4239-58aa-4a2f-b525-58628ea71f71.gif?jwt=eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJpc3MiOiJnaXRodWIuY29tIiwiYXVkIjoicmF3LmdpdGh1YnVzZXJjb250ZW50LmNvbSIsImtleSI6ImtleTUiLCJleHAiOjE3MjI0Mjc0NjQsIm5iZiI6MTcyMjQyNzE2NCwicGF0aCI6Ii85NjI5NTIzOS8zMDIwNjk2NDctMDljYzQyMzktNThhYS00YTJmLWI1MjUtNTg2MjhlYTcxZjcxLmdpZj9YLUFtei1BbGdvcml0aG09QVdTNC1ITUFDLVNIQTI1NiZYLUFtei1DcmVkZW50aWFsPUFLSUFWQ09EWUxTQTUzUFFLNFpBJTJGMjAyNDA3MzElMkZ1cy1lYXN0LTElMkZzMyUyRmF3czRfcmVxdWVzdCZYLUFtei1EYXRlPTIwMjQwNzMxVDExNTkyNFomWC1BbXotRXhwaXJlcz0zMDAmWC1BbXotU2lnbmF0dXJlPWYwYjY5ZGRlYmMyMjAzOTJiM2Q5NjM1OWMwMzJjNTdjYTlkYTEyMGQyZTljODg3NmViZjlmZjUxYTAyOWNkYmEmWC1BbXotU2lnbmVkSGVhZGVycz1ob3N0JmFjdG9yX2lkPTAma2V5X2lkPTAmcmVwb19pZD0wIn0.jNI3wlc8Kt26sRNP8I-rsSlYm3ZAKIhhRAW7eE_X_-c)
![](https://private-user-images.githubusercontent.com/96295239/302069660-df9fb7d5-2d7d-4e36-a0c5-1a3051d3821b.gif?jwt=eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJpc3MiOiJnaXRodWIuY29tIiwiYXVkIjoicmF3LmdpdGh1YnVzZXJjb250ZW50LmNvbSIsImtleSI6ImtleTUiLCJleHAiOjE3MjI0Mjc0NjQsIm5iZiI6MTcyMjQyNzE2NCwicGF0aCI6Ii85NjI5NTIzOS8zMDIwNjk2NjAtZGY5ZmI3ZDUtMmQ3ZC00ZTM2LWEwYzUtMWEzMDUxZDM4MjFiLmdpZj9YLUFtei1BbGdvcml0aG09QVdTNC1ITUFDLVNIQTI1NiZYLUFtei1DcmVkZW50aWFsPUFLSUFWQ09EWUxTQTUzUFFLNFpBJTJGMjAyNDA3MzElMkZ1cy1lYXN0LTElMkZzMyUyRmF3czRfcmVxdWVzdCZYLUFtei1EYXRlPTIwMjQwNzMxVDExNTkyNFomWC1BbXotRXhwaXJlcz0zMDAmWC1BbXotU2lnbmF0dXJlPTk2MjcxMzYxM2Q2YzZkMmY1M2NjNGU2ZjZjZGE4Y2ZlNGZkOTNkOWEyMjQxNjRjZjQ3OTRkYzE0YjdlZmJhZTQmWC1BbXotU2lnbmVkSGVhZGVycz1ob3N0JmFjdG9yX2lkPTAma2V5X2lkPTAmcmVwb19pZD0wIn0.Lbv2ypz9tUpFU-4gSL4Ou_aI5mSCPcy5QZA-rvuCkO8)
![](https://private-user-images.githubusercontent.com/96295239/302069661-7d9f32c1-4756-424a-a3e3-e12d97896aa3.gif?jwt=eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJpc3MiOiJnaXRodWIuY29tIiwiYXVkIjoicmF3LmdpdGh1YnVzZXJjb250ZW50LmNvbSIsImtleSI6ImtleTUiLCJleHAiOjE3MjI0Mjc0NjQsIm5iZiI6MTcyMjQyNzE2NCwicGF0aCI6Ii85NjI5NTIzOS8zMDIwNjk2NjEtN2Q5ZjMyYzEtNDc1Ni00MjRhLWEzZTMtZTEyZDk3ODk2YWEzLmdpZj9YLUFtei1BbGdvcml0aG09QVdTNC1ITUFDLVNIQTI1NiZYLUFtei1DcmVkZW50aWFsPUFLSUFWQ09EWUxTQTUzUFFLNFpBJTJGMjAyNDA3MzElMkZ1cy1lYXN0LTElMkZzMyUyRmF3czRfcmVxdWVzdCZYLUFtei1EYXRlPTIwMjQwNzMxVDExNTkyNFomWC1BbXotRXhwaXJlcz0zMDAmWC1BbXotU2lnbmF0dXJlPWE4ZWMxODY4ZjYyNmIzZWY0NDZkNTc4OGFjY2Y0NmFmYWRlZWE0ZDEwMTQ4ZWQxYzNkMTkxNjlmYTU0Njk3OTMmWC1BbXotU2lnbmVkSGVhZGVycz1ob3N0JmFjdG9yX2lkPTAma2V5X2lkPTAmcmVwb19pZD0wIn0.CZLfqsnWX559aMCpqScrJGU1nkT5xnrvBahOfBVLJ_c)
![](https://private-user-images.githubusercontent.com/96295239/302069663-9ea40758-abd6-401f-af01-a1dd8a33eaae.gif?jwt=eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJpc3MiOiJnaXRodWIuY29tIiwiYXVkIjoicmF3LmdpdGh1YnVzZXJjb250ZW50LmNvbSIsImtleSI6ImtleTUiLCJleHAiOjE3MjI0Mjc0NjQsIm5iZiI6MTcyMjQyNzE2NCwicGF0aCI6Ii85NjI5NTIzOS8zMDIwNjk2NjMtOWVhNDA3NTgtYWJkNi00MDFmLWFmMDEtYTFkZDhhMzNlYWFlLmdpZj9YLUFtei1BbGdvcml0aG09QVdTNC1ITUFDLVNIQTI1NiZYLUFtei1DcmVkZW50aWFsPUFLSUFWQ09EWUxTQTUzUFFLNFpBJTJGMjAyNDA3MzElMkZ1cy1lYXN0LTElMkZzMyUyRmF3czRfcmVxdWVzdCZYLUFtei1EYXRlPTIwMjQwNzMxVDExNTkyNFomWC1BbXotRXhwaXJlcz0zMDAmWC1BbXotU2lnbmF0dXJlPWUyMTdjOGY4ZWFiMDRlNzRlODY1OTYxMjI5OTYzZjkwMGQyM2RhYWM5ZTdlYmNmZTYyMGIyMWYzNGYzYzJiZDQmWC1BbXotU2lnbmVkSGVhZGVycz1ob3N0JmFjdG9yX2lkPTAma2V5X2lkPTAmcmVwb19pZD0wIn0.Tbg2wdz2LvCu4qlYkLX7qnd6eMiKI3XBK9o1Ig6xn68)
![](https://private-user-images.githubusercontent.com/96295239/302069698-2877cdd4-85a2-41ef-9413-49f89a3d0a7d.gif?jwt=eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJpc3MiOiJnaXRodWIuY29tIiwiYXVkIjoicmF3LmdpdGh1YnVzZXJjb250ZW50LmNvbSIsImtleSI6ImtleTUiLCJleHAiOjE3MjI0Mjc0NjQsIm5iZiI6MTcyMjQyNzE2NCwicGF0aCI6Ii85NjI5NTIzOS8zMDIwNjk2OTgtMjg3N2NkZDQtODVhMi00MWVmLTk0MTMtNDlmODlhM2QwYTdkLmdpZj9YLUFtei1BbGdvcml0aG09QVdTNC1ITUFDLVNIQTI1NiZYLUFtei1DcmVkZW50aWFsPUFLSUFWQ09EWUxTQTUzUFFLNFpBJTJGMjAyNDA3MzElMkZ1cy1lYXN0LTElMkZzMyUyRmF3czRfcmVxdWVzdCZYLUFtei1EYXRlPTIwMjQwNzMxVDExNTkyNFomWC1BbXotRXhwaXJlcz0zMDAmWC1BbXotU2lnbmF0dXJlPTBhMDYwMTZmY2Q5YzdlZWM3Y2M2ZDg0NzRlNTdmNWMyOWM3NmQ3M2NlY2M2OTkwYzU1N2NkZDgyOWUzMDU2MGMmWC1BbXotU2lnbmVkSGVhZGVycz1ob3N0JmFjdG9yX2lkPTAma2V5X2lkPTAmcmVwb19pZD0wIn0.CWrol6fstp3Z2uX6O0y6cW5eaoy7WbP8gBaJwsfveOg)
![](https://private-user-images.githubusercontent.com/96295239/302069699-2b246ca5-1f4a-45c5-851d-31b412f78ba2.gif?jwt=eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJpc3MiOiJnaXRodWIuY29tIiwiYXVkIjoicmF3LmdpdGh1YnVzZXJjb250ZW50LmNvbSIsImtleSI6ImtleTUiLCJleHAiOjE3MjI0Mjc0NjQsIm5iZiI6MTcyMjQyNzE2NCwicGF0aCI6Ii85NjI5NTIzOS8zMDIwNjk2OTktMmIyNDZjYTUtMWY0YS00NWM1LTg1MWQtMzFiNDEyZjc4YmEyLmdpZj9YLUFtei1BbGdvcml0aG09QVdTNC1ITUFDLVNIQTI1NiZYLUFtei1DcmVkZW50aWFsPUFLSUFWQ09EWUxTQTUzUFFLNFpBJTJGMjAyNDA3MzElMkZ1cy1lYXN0LTElMkZzMyUyRmF3czRfcmVxdWVzdCZYLUFtei1EYXRlPTIwMjQwNzMxVDExNTkyNFomWC1BbXotRXhwaXJlcz0zMDAmWC1BbXotU2lnbmF0dXJlPWRhOTNhZTBmZTIwYzc4ODQ2Y2ZhYmVmMjU1ZjEwNDhmZGQxNGIwMmE1ODMyMjdiM2RmN2FmMzE3NGY5OTk3NjYmWC1BbXotU2lnbmVkSGVhZGVycz1ob3N0JmFjdG9yX2lkPTAma2V5X2lkPTAmcmVwb19pZD0wIn0.iUQ1dCgXLGLBl4Vf8EN1muY8Y0_ZnjkcScaNO0k6HbY)