Основные сведения:
- Строки: Kotlin 3500+, XML 2100+
- Файлы: .kt 100+, .xml 50+
- Паттерн: MVVM
- Архитектура: Одна активность, один модуль, возможно немного Чистой архитектуры
Было тяжело...
Обоснование принятых решений:
- Библиотеки:
- Room: библиотека для работы с локальными данными, под капотом SQLite. Многое уже сделано за тебя, остается лишь уточнить вид бд и взаимодействие с ней, благодаря этому экономится огромное количество времени. Почему не аналоги? Нет очевидных преимуществ, поэтому использую то, с чем уже работал
- Retrofit: библиотека для реализации rest-взаимодействия. Почему не дефолтный HttpConnection? Опять же, огромное количество кода уже написано за тебя, остается лишь уточнить реализацию. Также, более удобное взаимодействие с запросами. У аналогов явных преимуществ нет
- Skeleton: библиотека для реализации постепенной загрузки элементов. Есть большое количество аналогов, но функционал +- одинаковый. Не вижу смысла писать свой skeleton, так как данная библиотека покрывает весь требуемый мной функционал.
- Glide: библиотека для работы с изображениями. Есть аналоги, но мне захотелось использовать именно glide(снова, очевидных преимуществ нет). Позволяет быстро и без проблем загружать изображения с url/uri. Не нужно использовать лишние корутины, под капотом они уже есть. Также glide сам кэширует изображения.
- FusedLocation: входит в состав google play services. Позволяет получать локацию быстрее, чем встроенный LocationManager. Но если гугл сервисы недоступны, приходится использовать его.
- Coroutines: отличная замена потокам. Намного более эффективные и быстрые, чем потоки. Читабельнее в коде. Преимущества очевидны.
- Navigation: для лучшего опыта использования, приложения с навигацией интуитивно понятнее и проще для пользователя.
- ViewModel, LiveData: требуются для реализации паттерна MVVM.
- Решения:
- FeedAdapter: для того, чтобы добавить новый вид элемента в ленту нужно: в файле FeedItem.kt в класс FeedItem добавить новый элемент по примеру уже имеющихся. В enum FeedItemType добавить новый тип элемента. В сам адаптер добавить новый ViewHolder, в onCreateViewHolder создать этот view holder на примере уже имеющихся.
- Все View Model взаимодействуют с их владельцами через статусы. Каждый статус имеет имент несколько состояний, в основном - 2: Succeed, в котором передаются успешно полученные данные и Failed, в котором либо ничего не передается, либо передается код ошибки, хранящийся в FailureCode.
- Пароль при регистрации может быть любой длины, но не пустым. Не накладывал ограничений для более быстрого и удобного тестирования. Тоже и с логином
- Вся логика авторизации и регистрации вынесена в папку account. При использовании в другом приложении данный "модуль" предоставляет возможность регистрации и авторизации пользователей с использованием локальной бд. Локальную бд можно достаточно легко заменить на удаленную бд.
- Почему MVVM. Большая часть современных приложений пишется с этим паттерном. Имеется четкое разграничение между отображения данных, работой с ними и их получением. Поэтому при масштабировании и внесении каких-либо изменений в работу какой-либо из абстракций, остальные не меняют своего вида.
- В приложении используется View binding. Сильно ускоряет
Что сделано?
- Основной функционал кроме теста виджета погоды.
- Улучшения основного функционала в виде: Pull to refresh, Skeleton, временное кэширование данных.
- Дополнительный функционал: Bored API, под него выделена отдельная вкладка в навигации. Реализована логика избранного, реализовано кэширование полученных ответов. Есть возможность полной настройки запроса к Bored API ActivitySettingsFragment.kt
- Приложеие доступно в двух языках: Русском и английском и в двух темах - светлая и темная. Язык и тема как в устройстве.
- Неавторизованому пользователю недоступен виджет погоды и досуг. Досуг связан с пользователями, у каждого он свой.
Что можно сделать?
- Внедрить библиотеку для перевода и перевести api на русский язык.
- Доработать или переработать ui для лучшего взаимодействия с пользователем.
- Переработать код для большей понятности и читабельности.
- Использовать больше воозможностей Places и Venue API.
- Улучшить обработку ошибок: для каждой ситуации выводить свои сообщения или делать свои действия.
- Расширить функционалом путешествий:
- с помощью Places и Venue API можно получать информацию о интересных местах в других городах и местах
- c помощью TravelPayouts API можно мониторить авиабилеты
- с помощью карт (YandexMapKit к примеру) выбирать города и места для путешествий
- И много-много чего еще...