Android-приложение для отображения текущей погоды и прогноза погоды на 5 дней в заданном городе, использующее публичное API сервиса OpenWeatherMap. Приложение построено согласно Clean Architecture и реализует паттерн MVVM в UI-слое.
- Получение погоды по введенному названию города или текущему местоположению;
- Отображение текущей погоды и прогноза на ближайшие 5 дней каждые 3 часа;
- Кеширование данных в БД приложения;
- Kotlin
- Android SDK
- Clean Architecture
- MVVM, LiveData
- Coroutines
- Dagger 2
- Room
- Retrofit
- Glide
- RecyclerView
Подробное описание приложения
-
Главный экран:
- Поле для ввода названия города;
- Кнопка для отображения погоды по введенному названию города;
- Кнопка для отображения погоды по местоположению;
- (После получения ответа от сервера) Блок с названием города и текущей температурой;
При нажатии на первую кнопку отправляется запрос на получение информации по указанному в поле названию города. Если город не был найден или сеть недоступна, отобразится соответствующее Toast-уведомление об ошибке, иначе информация из ответа отобразится на экране.
При нажатии на вторую кнопку запрашивается разрешение на получение местоположения. Если пользователь отказывается, появляется диалоговое окно с информацией о том, зачем необходимо разрешение. Если пользователь запретил показывать запрос разрешения или несколько раз отклонил его, диалоговое окно позволяет перейти в настройки телефона для ручной выдачи разрешения.
После получения разрешения при нажатии на вторую кнопку отправляется запрос на получение информации по текущим координатам. Если местоположение недоступно (на устройстве отключен GPS) или сеть недоступна, отобразится соответствующее Toast-уведомление об ошибке, иначе информация из ответа отобразится на экране.
При нажатии на блок с названием города открывается
BottomSheetDialogFragment
с подробной информацией о текущей погоде. В bundle передаются данные о текущей погоде, в том числе координаты выбранного города. Запрос на получение прогноза погоды происходит при открытииBottomSheetDialogFragment
с использованием полученных в bundle координат. -
Экран BottomSheetDialogFragment:
- Иконка погоды;
- Список параметров текущей погоды: город, температура, влажность, давление, скорость ветра;
- Список с прогнозом погоды на 5 дней. Каждый элемент содержит иконку дату, время, иконку погоды и температуру.
Оба списка отображаются с помощью
RecyclerView
. Иконки загружаются по URL с помощьюGlide
.У каждого из фрагментов есть соответствующая
ViewModel
, создающая с помощью аннотаций@AssistedInject
и@AssistedFactory
. В учебных целях координаты выбранного города с фрагментаBottomSheetDialogFragment
передаются вViewModel
через конструктор с помощью аннотации@Assisted
. Для передачи информации изViewModel
во фрагменты используетсяLiveData
.Также доступен английский язык. При повороте экрана приложение работает исправно.
-
Для каждого из возможных действий пользователя создан соответствующий
UseCase
:- GetLocationUseCase;
- GetWeatherByCityNameUseCase;
- GetWeatherByLocationUseCase;
- GetWeatherForecastByLocationUseCase;
-
Созданы интерфейсы репозиториев для получения текущей погоды, прогноза погоды и местоположения:
- LocationRepository;
- WeatherRepository;
- WeatherForecastRepository;
- Реализован каждый интерфейс репозитория из Domain-слоя.
-
LocationRepositoryImpl:
Для получения текущего местоположения обращается к классу
LocationDataSource
, который в свою очередь используетFusedLocationProviderClient
. -
WeatherRepositoryImpl:
Для получения текущей погоды обращается к
WeatherApiService
, генерируемому с помощьюRetrofit
, а также кWeatherDao
, генерируемому с помощьюRoom
. Если в БД есть запись с погодой в выбранном городе, обновленная менее чем минуту назад, возвращается информация из БД, иначе отправляется запрос на сервер. Ответ с сервера кэшируется в БД. -
WeatherForecastRepositoryImpl:
Работает аналогично
WeatherRepositoryImpl
. В учебных целях (для знакомства с аннотацией@Named
) для сервисовWeatherApiService
иWeatherForecastApiService
используются разные экземплярыRetrofit
.
-
- Склонируйте репозиторий:
git clone https://github.com/arshapshap/weather
- Создайте файл
credentials.properties
в корне проекта. - Создайте API ключ на сайте OpenWeatherMap и добавьте его в файл
credentials.properties
в формате:
WEATHER_API_KEY="your_key_here"
-
APK-файл доступен для скачивания в разделе Releases: