initial commit

This commit is contained in:
Henry Hiles 2023-03-28 10:30:49 -04:00
commit 6936eab685
70 changed files with 2398 additions and 0 deletions

10
.gitignore vendored Normal file
View file

@ -0,0 +1,10 @@
*.iml
/.idea
.gradle
/local.properties
.DS_Store
/build
/captures
.externalNativeBuild
.cxx
local.properties

1
app/.gitignore vendored Normal file
View file

@ -0,0 +1 @@
/build

96
app/build.gradle.kts Normal file
View file

@ -0,0 +1,96 @@
plugins {
id("com.android.application")
id("org.jetbrains.kotlin.android")
id("kotlin-kapt")
}
android {
namespace = "com.henryhiles.qweather"
compileSdk = 33
defaultConfig {
applicationId = "com.henryhiles.qweather"
minSdk = 21
targetSdk = 33
versionCode = 1
versionName = "1.0"
testInstrumentationRunner = "androidx.test.runner.AndroidJUnitRunner"
vectorDrawables {
useSupportLibrary = true
}
}
buildTypes {
named("release") {
isMinifyEnabled = true
setProguardFiles(
listOf(
getDefaultProguardFile("proguard-android-optimize.txt"),
"proguard-rules.pro"
)
)
}
named("debug") {
applicationIdSuffix = ".debug"
}
}
compileOptions {
isCoreLibraryDesugaringEnabled = true
sourceCompatibility = JavaVersion.VERSION_1_8
targetCompatibility = JavaVersion.VERSION_1_8
}
kotlinOptions {
jvmTarget = "1.8"
}
buildFeatures {
compose = true
}
composeOptions {
kotlinCompilerExtensionVersion = "1.4.3"
}
packagingOptions {
resources {
excludes += "/META-INF/{AL2.0,LGPL2.1}"
}
}
}
dependencies {
implementation("androidx.core:core-ktx:1.9.0")
implementation("androidx.compose.ui:ui:1.4.0")
implementation("androidx.compose.material3:material3:1.1.0-beta01")
implementation("androidx.compose.ui:ui-tooling-preview:1.4.0")
implementation("androidx.lifecycle:lifecycle-runtime-ktx:2.6.1")
implementation("androidx.activity:activity-compose:1.7.0")
implementation("androidx.core:core-ktx:1.9.0")
implementation("androidx.lifecycle:lifecycle-viewmodel-ktx:2.6.1")
testImplementation("junit:junit:4.13.2")
androidTestImplementation("androidx.test.ext:junit:1.1.5")
androidTestImplementation("androidx.test.espresso:espresso-core:3.5.1")
androidTestImplementation("androidx.compose.ui:ui-test-junit4:1.4.0")
debugImplementation("androidx.compose.ui:ui-tooling:1.4.0")
coreLibraryDesugaring("com.android.tools:desugar_jdk_libs:2.0.2")
// Voyager
val voyagerVersion = "1.0.0-rc04"
implementation("cafe.adriel.voyager:voyager-navigator:$voyagerVersion")
implementation("cafe.adriel.voyager:voyager-transitions:$voyagerVersion")
implementation("cafe.adriel.voyager:voyager-androidx:$voyagerVersion")
implementation("cafe.adriel.voyager:voyager-koin:$voyagerVersion")
// Koin
val koinVersion = "3.2.0"
implementation("io.insert-koin:koin-core:$koinVersion")
implementation("io.insert-koin:koin-android:$koinVersion")
implementation("io.insert-koin:koin-androidx-compose:$koinVersion")
// Retrofit
implementation("com.squareup.retrofit2:retrofit:2.9.0")
implementation("com.squareup.retrofit2:converter-moshi:2.9.0")
implementation("com.squareup.okhttp3:logging-interceptor:5.0.0-alpha.3")
implementation("androidx.lifecycle:lifecycle-viewmodel-compose:2.6.1")
}

21
app/proguard-rules.pro vendored Normal file
View file

@ -0,0 +1,21 @@
# Add project specific ProGuard rules here.
# You can control the set of applied configuration files using the
# proguardFiles setting in build.gradle.kts.
#
# For more details, see
# http://developer.android.com/guide/developing/tools/proguard.html
# If your project uses WebView with JS, uncomment the following
# and specify the fully qualified class name to the JavaScript interface
# class:
#-keepclassmembers class fqcn.of.javascript.interface.for.webview {
# public *;
#}
# Uncomment this to preserve the line number information for
# debugging stack traces.
#-keepattributes SourceFile,LineNumberTable
# If you keep the line number information, uncomment this to
# hide the original source file name.
#-renamesourcefileattribute SourceFile

View file

@ -0,0 +1,27 @@
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android">
<uses-permission android:name="android.permission.INTERNET" />
<uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION" />
<uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" />
<application
android:name=".QWeather"
android:allowBackup="true"
android:icon="@mipmap/ic_launcher"
android:label="@string/app_name"
android:roundIcon="@mipmap/ic_launcher_round"
android:supportsRtl="true"
android:theme="@style/Theme.WeatherApp">
<activity
android:name=".presentation.activity.MainActivity"
android:exported="true">
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
</application>
</manifest>

View file

@ -0,0 +1,21 @@
package com.henryhiles.qweather
import android.app.Application
import com.henryhiles.qweather.di.appModule
import com.henryhiles.qweather.di.locationModule
import com.henryhiles.qweather.di.repositoryModule
import org.koin.android.ext.koin.androidContext
import org.koin.core.context.startKoin
class QWeather : Application() {
override fun onCreate() {
super.onCreate()
startKoin {
androidContext(this@QWeather)
modules(
appModule, locationModule, repositoryModule
)
}
}
}

View file

@ -0,0 +1,56 @@
package com.henryhiles.qweather.data.location
import android.Manifest
import android.app.Application
import android.content.Context
import android.content.pm.PackageManager
import android.location.Location
import android.location.LocationManager
import androidx.core.content.ContextCompat
import com.henryhiles.qweather.domain.location.LocationTracker
class DefaultLocationTracker constructor(
private val application: Application
) : LocationTracker {
override suspend fun getCurrentLocation(): Location? {
val hasAccessFineLocationPermission = ContextCompat.checkSelfPermission(
application,
Manifest.permission.ACCESS_FINE_LOCATION
) == PackageManager.PERMISSION_GRANTED
val hasAccessCoarseLocationPermission = ContextCompat.checkSelfPermission(
application,
Manifest.permission.ACCESS_COARSE_LOCATION
) == PackageManager.PERMISSION_GRANTED
val locationManager =
application.getSystemService(Context.LOCATION_SERVICE) as LocationManager
val isGpsEnabled = locationManager.isProviderEnabled(
LocationManager.GPS_PROVIDER
)
if (!hasAccessFineLocationPermission || !isGpsEnabled) return null
return locationManager.getLastKnownLocation(LocationManager.GPS_PROVIDER)
// return suspendCancellableCoroutine { cont ->
// locationManager.getLastKnownLocation.apply {
// if (isComplete) {
// if (isSuccessful) {
// cont.resume(result)
// } else {
// cont.resume(null)
// }
// return@suspendCancellableCoroutine
// }
// addOnSuccessListener {
// cont.resume(it)
// }
// addOnFailureListener {
// cont.resume(null)
// }
// addOnCanceledListener {
// cont.cancel()
// }
// }
// }
}
}

View file

@ -0,0 +1,35 @@
package com.henryhiles.qweather.data.mappers
import com.henryhiles.qweather.data.remote.WeatherDataDto
import com.henryhiles.qweather.data.remote.WeatherDto
import com.henryhiles.qweather.domain.weather.WeatherData
import com.henryhiles.qweather.domain.weather.WeatherInfo
import com.henryhiles.qweather.domain.weather.WeatherType
import java.time.LocalDateTime
import java.time.format.DateTimeFormatter
private data class IndexedWeatherData(val index: Int, val data: WeatherData)
fun WeatherDataDto.toWeatherDataMap(): Map<Int, List<WeatherData>> {
return time.mapIndexed { index, time ->
IndexedWeatherData(
index = index, data = WeatherData(
time = LocalDateTime.parse(time, DateTimeFormatter.ISO_DATE_TIME),
temperatureCelsius = temperatures[index],
pressure = pressures[index],
windSpeed = windSpeeds[index],
humidity = humidities[index],
weatherType = WeatherType.fromWMO(weatherCodes[index])
)
)
}.groupBy { it.index / 24 }.mapValues { entry -> entry.value.map { it.data } }
}
fun WeatherDto.toWeatherInfo(): WeatherInfo {
val weatherDataMap = weatherData.toWeatherDataMap()
val now = LocalDateTime.now()
val currentWeatherData = weatherDataMap[0]?.find {
it.time.hour == now.hour
}
return WeatherInfo(weatherDataPerDay = weatherDataMap, currentWeatherData = currentWeatherData)
}

View file

@ -0,0 +1,12 @@
package com.henryhiles.qweather.data.remote
import retrofit2.http.GET
import retrofit2.http.Query
interface WeatherApi {
@GET("v1/forecast?hourly=temperature_2m,weathercode,relativehumidity_2m,windspeed_10m,pressure_msl")
suspend fun getWeatherData(
@Query("latitude") lat: Double,
@Query("longitude") long: Double
): WeatherDto
}

View file

@ -0,0 +1,17 @@
package com.henryhiles.qweather.data.remote
import com.squareup.moshi.Json
data class WeatherDataDto(
val time: List<String>,
@field:Json(name = "temperature_2m")
val temperatures: List<Double>,
@field:Json(name = "weathercode")
val weatherCodes: List<Int>,
@field:Json(name = "pressure_msl")
val pressures: List<Double>,
@field:Json(name = "windspeed_10m")
val windSpeeds: List<Double>,
@field:Json(name = "relativehumidity_2m")
val humidities: List<Double>
)

View file

@ -0,0 +1,8 @@
package com.henryhiles.qweather.data.remote
import com.squareup.moshi.Json
data class WeatherDto(
@field:Json(name = "hourly")
val weatherData: WeatherDataDto
)

View file

@ -0,0 +1,18 @@
package com.henryhiles.qweather.data.repository
import com.henryhiles.qweather.data.mappers.toWeatherInfo
import com.henryhiles.qweather.data.remote.WeatherApi
import com.henryhiles.qweather.domain.repository.WeatherRepository
import com.henryhiles.qweather.domain.util.Resource
import com.henryhiles.qweather.domain.weather.WeatherInfo
class WeatherRepositoryImpl constructor(private val api: WeatherApi) : WeatherRepository {
override suspend fun getWeatherData(lat: Double, long: Double): Resource<WeatherInfo> {
return try {
Resource.Success(data = api.getWeatherData(lat = lat, long = long).toWeatherInfo())
} catch (e: Exception) {
e.printStackTrace()
Resource.Error(e.message ?: "An unknown error occurred.")
}
}
}

View file

@ -0,0 +1,40 @@
package com.henryhiles.qweather.di
import com.henryhiles.qweather.data.remote.WeatherApi
import com.henryhiles.qweather.presentation.viewmodel.WeatherViewModel
import org.koin.androidx.viewmodel.dsl.viewModelOf
import org.koin.core.module.dsl.singleOf
import org.koin.dsl.module
import retrofit2.Retrofit
import retrofit2.converter.moshi.MoshiConverterFactory
import retrofit2.create
//@Module
//@InstallIn(SingletonComponent::class)
//object AppModule {
// @Provides
// @Singleton
// fun provideWeatherApi(): WeatherApi {
// return Retrofit.Builder().baseUrl("https://api.open-meteo.com")
// .addConverterFactory(MoshiConverterFactory.create()).build().create()
// }
//
// @Provides
// @Singleton
// fun provideFusedLocationProviderClient(app: Application): FusedLocationProviderClient {
// return LocationServices.getFusedLocationProviderClient(app)
// }
//}
val appModule = module {
fun provideWeatherApi(): WeatherApi {
return Retrofit.Builder().baseUrl("https://api.open-meteo.com")
.addConverterFactory(MoshiConverterFactory.create()).build().create()
}
singleOf(::provideWeatherApi)
// single {
// LocationServices.getFusedLocationProviderClient(get<Application>())
// }
viewModelOf(::WeatherViewModel)
}

View file

@ -0,0 +1,20 @@
package com.henryhiles.qweather.di
import com.henryhiles.qweather.data.location.DefaultLocationTracker
import com.henryhiles.qweather.domain.location.LocationTracker
import org.koin.core.module.dsl.singleOf
import org.koin.dsl.bind
import org.koin.dsl.module
//@Module
//@InstallIn(SingletonComponent::class)
//abstract class LocationModule {
// @Binds
// @Singleton
// abstract fun bindLocationTracker(defaultLocationTracker: DefaultLocationTracker): LocationTracker
//}
val locationModule = module {
singleOf(::DefaultLocationTracker) bind LocationTracker::class
}

View file

@ -0,0 +1,19 @@
package com.henryhiles.qweather.di
import com.henryhiles.qweather.data.repository.WeatherRepositoryImpl
import com.henryhiles.qweather.domain.repository.WeatherRepository
import org.koin.core.module.dsl.singleOf
import org.koin.dsl.bind
import org.koin.dsl.module
//@Module
//@InstallIn(SingletonComponent::class)
//abstract class RepositoryModule {
// @Binds
// @Singleton
// abstract fun bindWeatherRepository(weatherRepository: WeatherRepository): WeatherRepository
//}
val repositoryModule = module {
singleOf(::WeatherRepositoryImpl) bind WeatherRepository::class
}

View file

@ -0,0 +1,7 @@
package com.henryhiles.qweather.domain.location
import android.location.Location
interface LocationTracker {
suspend fun getCurrentLocation(): Location?
}

View file

@ -0,0 +1,8 @@
package com.henryhiles.qweather.domain.repository
import com.henryhiles.qweather.domain.util.Resource
import com.henryhiles.qweather.domain.weather.WeatherInfo
interface WeatherRepository {
suspend fun getWeatherData(lat: Double, long: Double): Resource<WeatherInfo>
}

View file

@ -0,0 +1,6 @@
package com.henryhiles.qweather.domain.util
sealed class Resource<T>(val data: T? = null, val message: String? = null) {
class Success<T>(data: T?): Resource<T>(data)
class Error<T>(message: String, data: T? = null): Resource<T>(data, message)
}

View file

@ -0,0 +1,12 @@
package com.henryhiles.qweather.domain.weather
import java.time.LocalDateTime
data class WeatherData(
val time: LocalDateTime,
val temperatureCelsius: Double,
val pressure: Double,
val windSpeed: Double,
val humidity: Double,
val weatherType: WeatherType
)

View file

@ -0,0 +1,6 @@
package com.henryhiles.qweather.domain.weather
data class WeatherInfo(
val weatherDataPerDay: Map<Int, List<WeatherData>>,
val currentWeatherData: WeatherData?
)

View file

@ -0,0 +1,154 @@
package com.henryhiles.qweather.domain.weather
import androidx.annotation.DrawableRes
import com.henryhiles.qweather.R
sealed class WeatherType(
val weatherDesc: String,
@DrawableRes val iconRes: Int
) {
object ClearSky : WeatherType(
weatherDesc = "Clear sky",
iconRes = R.drawable.ic_sunny
)
object MainlyClear : WeatherType(
weatherDesc = "Mainly clear",
iconRes = R.drawable.ic_cloudy
)
object PartlyCloudy : WeatherType(
weatherDesc = "Partly cloudy",
iconRes = R.drawable.ic_cloudy
)
object Overcast : WeatherType(
weatherDesc = "Overcast",
iconRes = R.drawable.ic_cloudy
)
object Foggy : WeatherType(
weatherDesc = "Foggy",
iconRes = R.drawable.ic_very_cloudy
)
object DepositingRimeFog : WeatherType(
weatherDesc = "Depositing rime fog",
iconRes = R.drawable.ic_very_cloudy
)
object LightDrizzle : WeatherType(
weatherDesc = "Light drizzle",
iconRes = R.drawable.ic_rainshower
)
object ModerateDrizzle : WeatherType(
weatherDesc = "Moderate drizzle",
iconRes = R.drawable.ic_rainshower
)
object DenseDrizzle : WeatherType(
weatherDesc = "Dense drizzle",
iconRes = R.drawable.ic_rainshower
)
object LightFreezingDrizzle : WeatherType(
weatherDesc = "Slight freezing drizzle",
iconRes = R.drawable.ic_snowyrainy
)
object DenseFreezingDrizzle : WeatherType(
weatherDesc = "Dense freezing drizzle",
iconRes = R.drawable.ic_snowyrainy
)
object SlightRain : WeatherType(
weatherDesc = "Slight rain",
iconRes = R.drawable.ic_rainy
)
object ModerateRain : WeatherType(
weatherDesc = "Rainy",
iconRes = R.drawable.ic_rainy
)
object HeavyRain : WeatherType(
weatherDesc = "Heavy rain",
iconRes = R.drawable.ic_rainy
)
object HeavyFreezingRain: WeatherType(
weatherDesc = "Heavy freezing rain",
iconRes = R.drawable.ic_snowyrainy
)
object SlightSnowFall: WeatherType(
weatherDesc = "Slight snow fall",
iconRes = R.drawable.ic_snowy
)
object ModerateSnowFall: WeatherType(
weatherDesc = "Moderate snow fall",
iconRes = R.drawable.ic_heavysnow
)
object HeavySnowFall: WeatherType(
weatherDesc = "Heavy snow fall",
iconRes = R.drawable.ic_heavysnow
)
object SnowGrains: WeatherType(
weatherDesc = "Snow grains",
iconRes = R.drawable.ic_heavysnow
)
object SlightRainShowers: WeatherType(
weatherDesc = "Slight rain showers",
iconRes = R.drawable.ic_rainshower
)
object ModerateRainShowers: WeatherType(
weatherDesc = "Moderate rain showers",
iconRes = R.drawable.ic_rainshower
)
object ViolentRainShowers: WeatherType(
weatherDesc = "Violent rain showers",
iconRes = R.drawable.ic_rainshower
)
object SlightSnowShowers: WeatherType(
weatherDesc = "Light snow showers",
iconRes = R.drawable.ic_snowy
)
object HeavySnowShowers: WeatherType(
weatherDesc = "Heavy snow showers",
iconRes = R.drawable.ic_snowy
)
object ModerateThunderstorm: WeatherType(
weatherDesc = "Moderate thunderstorm",
iconRes = R.drawable.ic_thunder
)
object SlightHailThunderstorm: WeatherType(
weatherDesc = "Thunderstorm with slight hail",
iconRes = R.drawable.ic_rainythunder
)
object HeavyHailThunderstorm: WeatherType(
weatherDesc = "Thunderstorm with heavy hail",
iconRes = R.drawable.ic_rainythunder
)
companion object {
fun fromWMO(code: Int): WeatherType {
return when(code) {
0 -> ClearSky
1 -> MainlyClear
2 -> PartlyCloudy
3 -> Overcast
45 -> Foggy
48 -> DepositingRimeFog
51 -> LightDrizzle
53 -> ModerateDrizzle
55 -> DenseDrizzle
56 -> LightFreezingDrizzle
57 -> DenseFreezingDrizzle
61 -> SlightRain
63 -> ModerateRain
65 -> HeavyRain
66 -> LightFreezingDrizzle
67 -> HeavyFreezingRain
71 -> SlightSnowFall
73 -> ModerateSnowFall
75 -> HeavySnowFall
77 -> SnowGrains
80 -> SlightRainShowers
81 -> ModerateRainShowers
82 -> ViolentRainShowers
85 -> SlightSnowShowers
86 -> HeavySnowShowers
95 -> ModerateThunderstorm
96 -> SlightHailThunderstorm
99 -> HeavyHailThunderstorm
else -> ClearSky
}
}
}
}

View file

@ -0,0 +1,49 @@
package com.henryhiles.qweather.presentation.activity
import android.Manifest
import android.os.Bundle
import androidx.activity.ComponentActivity
import androidx.activity.compose.setContent
import androidx.activity.result.ActivityResultLauncher
import androidx.activity.result.contract.ActivityResultContracts
import androidx.compose.foundation.layout.Box
import androidx.compose.foundation.layout.padding
import androidx.compose.material3.Scaffold
import androidx.compose.material3.Surface
import androidx.compose.ui.Modifier
import cafe.adriel.voyager.navigator.CurrentScreen
import cafe.adriel.voyager.navigator.Navigator
import com.henryhiles.qweather.presentation.screen.TodayScreen
import com.henryhiles.qweather.presentation.ui.theme.WeatherAppTheme
import com.henryhiles.qweather.presentation.viewmodel.WeatherViewModel
import org.koin.androidx.viewmodel.ext.android.getViewModel
class MainActivity : ComponentActivity() {
private lateinit var permissionLauncher: ActivityResultLauncher<Array<String>>
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
val weatherViewModel = getViewModel<WeatherViewModel>()
permissionLauncher =
registerForActivityResult(ActivityResultContracts.RequestMultiplePermissions()) { weatherViewModel.loadWeatherInfo() }
permissionLauncher.launch(
arrayOf(
Manifest.permission.ACCESS_FINE_LOCATION,
)
)
setContent {
WeatherAppTheme {
Surface {
Navigator(TodayScreen()) { navigator ->
Scaffold(
topBar = { /* ... */ },
content = { padding -> Box(modifier = Modifier.padding(padding)) { CurrentScreen() } },
bottomBar = { /* ... */ }
)
}
}
}
}
}
}

View file

@ -0,0 +1,81 @@
package com.henryhiles.qweather.presentation.components
import androidx.compose.foundation.Image
import androidx.compose.foundation.layout.*
import androidx.compose.foundation.shape.RoundedCornerShape
import androidx.compose.material3.Card
import androidx.compose.material3.Text
import androidx.compose.runtime.Composable
import androidx.compose.runtime.remember
import androidx.compose.ui.Alignment
import androidx.compose.ui.Modifier
import androidx.compose.ui.graphics.Color
import androidx.compose.ui.graphics.vector.ImageVector
import androidx.compose.ui.res.painterResource
import androidx.compose.ui.res.vectorResource
import androidx.compose.ui.unit.dp
import androidx.compose.ui.unit.sp
import com.henryhiles.qweather.R
import com.henryhiles.qweather.presentation.viewmodel.WeatherState
import java.time.format.DateTimeFormatter
import kotlin.math.roundToInt
@Composable
fun WeatherCard(state: WeatherState, modifier: Modifier = Modifier) {
state.weatherInfo?.currentWeatherData?.let {
val formattedTime = remember(it) {
it.time.format(DateTimeFormatter.ofPattern("HH:mm"))
}
Card(
shape = RoundedCornerShape(8.dp),
modifier = modifier.padding(16.dp)
) {
Column(
modifier = Modifier
.fillMaxWidth()
.padding(16.dp),
horizontalAlignment = Alignment.CenterHorizontally
) {
Text(
text = "Today $formattedTime",
modifier = Modifier.align(Alignment.End), color = Color.White
)
Spacer(modifier = Modifier.height(16.dp))
Image(
painter = painterResource(id = it.weatherType.iconRes),
contentDescription = "Image of ${it.weatherType.weatherDesc}",
modifier = Modifier.width(200.dp)
)
Spacer(modifier = Modifier.height(16.dp))
Text(text = "${it.temperatureCelsius}°C", fontSize = 50.sp)
Spacer(modifier = Modifier.height(16.dp))
Text(text = it.weatherType.weatherDesc, fontSize = 20.sp)
Spacer(modifier = Modifier.height(32.dp))
Row(
modifier = Modifier.fillMaxWidth(),
horizontalArrangement = Arrangement.SpaceAround
) {
WeatherDataDisplay(
value = it.pressure.roundToInt(),
unit = "hpa",
icon = ImageVector.vectorResource(id = R.drawable.ic_pressure),
description = "Pressure",
)
WeatherDataDisplay(
value = it.humidity.roundToInt(),
unit = "%",
icon = ImageVector.vectorResource(id = R.drawable.ic_drop),
description = "Humidity"
)
WeatherDataDisplay(
value = it.windSpeed.roundToInt(),
unit = "km/h",
icon = ImageVector.vectorResource(id = R.drawable.ic_wind),
description = "Wind Speed",
)
}
}
}
}
}

View file

@ -0,0 +1,33 @@
package com.henryhiles.qweather.presentation.components
import androidx.compose.foundation.layout.Row
import androidx.compose.foundation.layout.Spacer
import androidx.compose.foundation.layout.size
import androidx.compose.foundation.layout.width
import androidx.compose.material3.Icon
import androidx.compose.material3.Text
import androidx.compose.runtime.Composable
import androidx.compose.ui.Alignment
import androidx.compose.ui.Modifier
import androidx.compose.ui.graphics.vector.ImageVector
import androidx.compose.ui.unit.dp
@Composable
fun WeatherDataDisplay(
value: Int,
unit: String,
icon: ImageVector,
description: String,
modifier: Modifier = Modifier,
) {
Row(modifier = modifier, verticalAlignment = Alignment.CenterVertically) {
Icon(
imageVector = icon,
contentDescription = description,
// tint = MaterialTheme.colorScheme.onSecondary,
modifier = Modifier.size(25.dp)
)
Spacer(modifier = Modifier.width(4.dp))
Text(text = "$value$unit")
}
}

View file

@ -0,0 +1,2 @@
package com.henryhiles.qweather.presentation.components

View file

@ -0,0 +1,40 @@
package com.henryhiles.qweather.presentation.components
import androidx.compose.foundation.layout.*
import androidx.compose.foundation.lazy.LazyRow
import androidx.compose.foundation.lazy.items
import androidx.compose.foundation.lazy.rememberLazyListState
import androidx.compose.material3.Text
import androidx.compose.runtime.Composable
import androidx.compose.ui.Modifier
import androidx.compose.ui.graphics.Color
import androidx.compose.ui.unit.dp
import androidx.compose.ui.unit.sp
import com.henryhiles.qweather.presentation.viewmodel.WeatherState
import java.time.LocalDateTime
@Composable
fun WeatherForecast(state: WeatherState, modifier: Modifier = Modifier) {
state.weatherInfo?.weatherDataPerDay?.get(0)?.let {
Column(
modifier = modifier
.fillMaxWidth()
.padding(horizontal = 16.dp)
) {
Text(text = "Today", fontSize = 20.sp, color = Color.White)
Spacer(modifier = Modifier.height(16.dp))
val rowState = rememberLazyListState(LocalDateTime.now().hour)
LazyRow(state = rowState) {
items(it) {
WeatherHour(
data = it,
modifier = Modifier
.height(100.dp)
.padding(horizontal = 16.dp)
)
}
}
}
}
}

View file

@ -0,0 +1,39 @@
package com.henryhiles.qweather.presentation.components
import androidx.compose.foundation.Image
import androidx.compose.foundation.layout.Arrangement
import androidx.compose.foundation.layout.Column
import androidx.compose.foundation.layout.width
import androidx.compose.material3.Text
import androidx.compose.runtime.Composable
import androidx.compose.runtime.remember
import androidx.compose.ui.Alignment
import androidx.compose.ui.Modifier
import androidx.compose.ui.res.painterResource
import androidx.compose.ui.unit.dp
import com.henryhiles.qweather.domain.weather.WeatherData
import java.time.format.DateTimeFormatter
@Composable
fun WeatherHour(data: WeatherData, modifier: Modifier = Modifier) {
data.let {
val formattedTime = remember(it) {
it.time.format(DateTimeFormatter.ofPattern("HH:mm"))
}
Column(
modifier = modifier,
horizontalAlignment = Alignment.CenterHorizontally,
verticalArrangement = Arrangement.SpaceBetween
) {
Text(text = formattedTime)
Image(
painter = painterResource(id = it.weatherType.iconRes),
contentDescription = "Image of ${data.weatherType.weatherDesc}",
modifier = Modifier.width(40.dp)
)
Text(text = "${it.temperatureCelsius}°C")
}
}
}

View file

@ -0,0 +1,61 @@
package com.henryhiles.qweather.presentation.screen
import androidx.compose.foundation.layout.*
import androidx.compose.foundation.text.selection.SelectionContainer
import androidx.compose.material3.*
import androidx.compose.runtime.Composable
import androidx.compose.ui.Alignment
import androidx.compose.ui.Modifier
import androidx.compose.ui.unit.dp
import cafe.adriel.voyager.androidx.AndroidScreen
import com.henryhiles.qweather.presentation.components.WeatherCard
import com.henryhiles.qweather.presentation.components.WeatherForecast
import com.henryhiles.qweather.presentation.viewmodel.WeatherViewModel
import org.koin.androidx.compose.getViewModel
class TodayScreen : AndroidScreen() {
@OptIn(ExperimentalMaterial3Api::class)
@Composable
override fun Content() {
val weatherViewModel = getViewModel<WeatherViewModel>()
Box(modifier = Modifier.fillMaxSize()) {
Column(
modifier = Modifier
.fillMaxSize()
) {
WeatherCard(state = weatherViewModel.state)
Spacer(modifier = Modifier.height(16.dp))
WeatherForecast(state = weatherViewModel.state)
}
if (weatherViewModel.state.isLoading) CircularProgressIndicator(
modifier = Modifier.align(
Alignment.Center
)
)
weatherViewModel.state.error?.let {
AlertDialog(onDismissRequest = {}) {
Surface(
shape = MaterialTheme.shapes.large
) {
Column(modifier = Modifier.padding(16.dp)) {
Text(
text = "An error occurred",
style = MaterialTheme.typography.headlineSmall,
modifier = Modifier.align(Alignment.CenterHorizontally)
)
SelectionContainer {
Text(
text = it,
style = MaterialTheme.typography.bodyMedium,
modifier = Modifier.padding(16.dp)
)
}
}
}
}
}
}
}
}

View file

@ -0,0 +1,11 @@
package com.henryhiles.qweather.presentation.ui.theme
import androidx.compose.ui.graphics.Color
val Purple80 = Color(0xFFD0BCFF)
val PurpleGrey80 = Color(0xFFCCC2DC)
val Pink80 = Color(0xFFEFB8C8)
val Purple40 = Color(0xFF6650a4)
val PurpleGrey40 = Color(0xFF625b71)
val Pink40 = Color(0xFF7D5260)

View file

@ -0,0 +1,59 @@
package com.henryhiles.qweather.presentation.ui.theme
import android.app.Activity
import android.os.Build
import androidx.compose.foundation.isSystemInDarkTheme
import androidx.compose.material3.*
import androidx.compose.runtime.Composable
import androidx.compose.runtime.SideEffect
import androidx.compose.ui.graphics.toArgb
import androidx.compose.ui.platform.LocalContext
import androidx.compose.ui.platform.LocalView
private val DarkColorScheme = darkColorScheme(
primary = Purple80,
secondary = PurpleGrey80,
tertiary = Pink80
)
private val LightColorScheme = lightColorScheme(
primary = Purple40,
secondary = PurpleGrey40,
tertiary = Pink40
/* Other default colors to override
background = Color(0xFFFFFBFE),
surface = Color(0xFFFFFBFE),
onPrimary = Color.White,
onSecondary = Color.White,
onTertiary = Color.White,
onBackground = Color(0xFF1C1B1F),
onSurface = Color(0xFF1C1B1F),
*/
)
@Composable
fun WeatherAppTheme(
darkTheme: Boolean = isSystemInDarkTheme(),
content: @Composable () -> Unit
) {
val colorScheme = when {
Build.VERSION.SDK_INT >= Build.VERSION_CODES.S -> {
val context = LocalContext.current
if (darkTheme) dynamicDarkColorScheme(context) else dynamicLightColorScheme(context)
}
darkTheme -> DarkColorScheme
else -> LightColorScheme
}
val view = LocalView.current
if (!view.isInEditMode) {
SideEffect {
(view.context as Activity).window.statusBarColor = colorScheme.primary.toArgb()
}
}
MaterialTheme(
colorScheme = colorScheme,
content = content
)
}

View file

@ -0,0 +1,58 @@
package com.henryhiles.qweather.presentation.viewmodel
import androidx.compose.runtime.getValue
import androidx.compose.runtime.mutableStateOf
import androidx.compose.runtime.setValue
import androidx.lifecycle.ViewModel
import androidx.lifecycle.viewModelScope
import com.henryhiles.qweather.domain.location.LocationTracker
import com.henryhiles.qweather.domain.repository.WeatherRepository
import com.henryhiles.qweather.domain.util.Resource
import com.henryhiles.qweather.domain.weather.WeatherInfo
import kotlinx.coroutines.launch
data class WeatherState(
val weatherInfo: WeatherInfo? = null,
val isLoading: Boolean = false,
val error: String? = null
)
class WeatherViewModel constructor(
private val repository: WeatherRepository,
private val locationTracker: LocationTracker,
) : ViewModel() {
var state by mutableStateOf(WeatherState())
private set
fun loadWeatherInfo() {
viewModelScope.launch {
state = state.copy(isLoading = true, error = null)
val currentLocation = locationTracker.getCurrentLocation()
currentLocation?.let { location ->
state = when (val result =
repository.getWeatherData(location.latitude, location.longitude)) {
is Resource.Success -> {
state.copy(
weatherInfo = result.data,
isLoading = false,
error = null
)
}
is Resource.Error -> {
state.copy(
weatherInfo = null,
isLoading = false,
error = result.message
)
}
}
} ?: kotlin.run {
state = state.copy(
isLoading = false,
error = "Couldn't retrieve location. Make sure to grant permission and enable GPS."
)
}
}
}
}

View file

@ -0,0 +1,30 @@
<vector xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:aapt="http://schemas.android.com/aapt"
android:width="108dp"
android:height="108dp"
android:viewportWidth="108"
android:viewportHeight="108">
<path android:pathData="M31,63.928c0,0 6.4,-11 12.1,-13.1c7.2,-2.6 26,-1.4 26,-1.4l38.1,38.1L107,108.928l-32,-1L31,63.928z">
<aapt:attr name="android:fillColor">
<gradient
android:endX="85.84757"
android:endY="92.4963"
android:startX="42.9492"
android:startY="49.59793"
android:type="linear">
<item
android:color="#44000000"
android:offset="0.0" />
<item
android:color="#00000000"
android:offset="1.0" />
</gradient>
</aapt:attr>
</path>
<path
android:fillColor="#FFFFFF"
android:fillType="nonZero"
android:pathData="M65.3,45.828l3.8,-6.6c0.2,-0.4 0.1,-0.9 -0.3,-1.1c-0.4,-0.2 -0.9,-0.1 -1.1,0.3l-3.9,6.7c-6.3,-2.8 -13.4,-2.8 -19.7,0l-3.9,-6.7c-0.2,-0.4 -0.7,-0.5 -1.1,-0.3C38.8,38.328 38.7,38.828 38.9,39.228l3.8,6.6C36.2,49.428 31.7,56.028 31,63.928h46C76.3,56.028 71.8,49.428 65.3,45.828zM43.4,57.328c-0.8,0 -1.5,-0.5 -1.8,-1.2c-0.3,-0.7 -0.1,-1.5 0.4,-2.1c0.5,-0.5 1.4,-0.7 2.1,-0.4c0.7,0.3 1.2,1 1.2,1.8C45.3,56.528 44.5,57.328 43.4,57.328L43.4,57.328zM64.6,57.328c-0.8,0 -1.5,-0.5 -1.8,-1.2s-0.1,-1.5 0.4,-2.1c0.5,-0.5 1.4,-0.7 2.1,-0.4c0.7,0.3 1.2,1 1.2,1.8C66.5,56.528 65.6,57.328 64.6,57.328L64.6,57.328z"
android:strokeWidth="1"
android:strokeColor="#00000000" />
</vector>

View file

@ -0,0 +1,17 @@
<vector xmlns:android="http://schemas.android.com/apk/res/android"
android:width="346.84dp"
android:height="197.73dp"
android:viewportWidth="346.84"
android:viewportHeight="197.73">
<path
android:fillColor="#FF000000"
android:pathData="M295.89,95.39A85.15,85.15 0,0 0,144.42 46.76,63.21 63.21,0 0,0 59.13,106a65.36,65.36 0,0 0,0.45 7.45,43.29 43.29,0 0,0 -6.49,-0.49 42.4,42.4 0,0 0,0 84.8H295.67a51.17,51.17 0,0 0,0.22 -102.34Z"
android:strokeAlpha="0.2"
android:fillAlpha="0.2"/>
<path
android:pathData="M285.2,80.51A85.2,85.2 0,0 0,168.07 6.26V182.84H285a51.17,51.17 0,0 0,0.23 -102.33Z"
android:fillColor="#ebebeb"/>
<path
android:pathData="M133.73,31.88A63.15,63.15 0,0 0,48.89 98.54a42.4,42.4 0,1 0,-6.49 84.3H168.07V6.26A85.51,85.51 0,0 0,133.73 31.88Z"
android:fillColor="#fff"/>
</vector>

View file

@ -0,0 +1,9 @@
<vector xmlns:android="http://schemas.android.com/apk/res/android"
android:width="149.86dp"
android:height="249.77dp"
android:viewportWidth="149.86"
android:viewportHeight="249.77">
<path
android:fillColor="#FF000000"
android:pathData="M74.93,249.77c41.32,0 74.93,-28.71 74.93,-64 0,-34 -75.48,-178 -78.7,-184.1a3.12,3.12 0,0 0,-5.62 0.2C62.87,8 0,151.88 0,185.77 0,221.06 33.61,249.77 74.93,249.77ZM68.66,10.38c14.36,27.76 75,146.61 75,175.39 0,31.84 -30.82,57.75 -68.69,57.75S6.24,217.61 6.24,185.77C6.24,157 56.53,38.52 68.66,10.38ZM13.11,190.91a3.12,3.12 0,0 1,2.62 -3.55A3.15,3.15 0,0 1,19.28 190c2.64,17.47 15.64,31.71 34.78,38.09a3.12,3.12 0,1 1,-2 5.93C31,227 16.06,210.46 13.11,190.91Z"/>
</vector>

View file

@ -0,0 +1,44 @@
<vector xmlns:android="http://schemas.android.com/apk/res/android"
android:width="330.96dp"
android:height="256.21dp"
android:viewportWidth="330.96"
android:viewportHeight="256.21">
<path
android:fillColor="#FF000000"
android:pathData="M114.05,216.86a4.1,4.1 0,0 0,-5.6 -1.5l-13,7.52v-15a4.1,4.1 0,0 0,-8.2 0v15l-13,-7.52a4.1,4.1 0,0 0,-4.1 7.1l13,7.52 -13,7.52a4.1,4.1 0,1 0,4.1 7.1l13,-7.52v15a4.1,4.1 0,0 0,8.2 0v-15l13,7.52a4.1,4.1 0,0 0,4.1 -7.1l-13,-7.52 13,-7.52A4.1,4.1 0,0 0,114.05 216.86Z"
android:strokeAlpha="0.2"
android:fillAlpha="0.2"/>
<path
android:fillColor="#FF000000"
android:pathData="M282.81,90.77A80.47,80.47 0,0 0,139.66 44.82a59.73,59.73 0,0 0,-80.61 56,60.62 60.62,0 0,0 0.43,7 40.08,40.08 0,1 0,-6.13 79.68H282.6a48.36,48.36 0,0 0,0.21 -96.72Z"
android:strokeAlpha="0.2"
android:fillAlpha="0.2"/>
<path
android:fillColor="#FF000000"
android:pathData="M194,216.86a4.1,4.1 0,0 0,-5.6 -1.5l-13,7.52v-15a4.1,4.1 0,1 0,-8.19 0v15l-13,-7.52a4.1,4.1 0,0 0,-4.09 7.1L163,230l-13,7.52a4.1,4.1 0,1 0,4.09 7.1l13,-7.52v15a4.1,4.1 0,1 0,8.19 0v-15l13,7.52a4.1,4.1 0,0 0,4.1 -7.1l-13,-7.52 13,-7.52A4.09,4.09 0,0 0,194 216.86Z"
android:strokeAlpha="0.2"
android:fillAlpha="0.2"/>
<path
android:fillColor="#FF000000"
android:pathData="M271.59,216.86a4.1,4.1 0,0 0,-5.6 -1.5l-13,7.52v-15a4.1,4.1 0,1 0,-8.19 0v15l-13,-7.52a4.1,4.1 0,1 0,-4.1 7.1l13,7.52 -13,7.52a4.1,4.1 0,1 0,4.1 7.1l13,-7.52v15a4.1,4.1 0,1 0,8.19 0v-15l13,7.52a4.15,4.15 0,0 0,2.05 0.55,4.1 4.1,0 0,0 2,-7.65l-13,-7.52 13,-7.52A4.08,4.08 0,0 0,271.59 216.86Z"
android:strokeAlpha="0.2"
android:fillAlpha="0.2"/>
<path
android:pathData="M126.38,30.13a59.72,59.72 0,0 0,-80.6 56,60.49 60.49,0 0,0 0.42,7 41.23,41.23 0,0 0,-6.13 -0.46,40.07 40.07,0 0,0 0,80.14H158V6.28A80.82,80.82 0,0 0,126.38 30.13Z"
android:fillColor="#fff"/>
<path
android:pathData="M100.78,202.18a4.1,4.1 0,0 0,-5.6 -1.5l-13,7.51v-15a4.1,4.1 0,1 0,-8.2 0v15l-13,-7.51a4.1,4.1 0,0 0,-4.1 7.1l13,7.51 -13,7.52a4.1,4.1 0,1 0,4.1 7.1l13,-7.52v15a4.1,4.1 0,1 0,8.2 0v-15l13,7.52a4.1,4.1 0,1 0,4.09 -7.1l-13,-7.52 13,-7.51A4.1,4.1 0,0 0,100.78 202.18Z"
android:fillColor="#fff"/>
<path
android:pathData="M153.86,193.16v15l-13,-7.51a4.1,4.1 0,1 0,-4.1 7.1l13,7.51 -13,7.52a4.1,4.1 0,1 0,4.1 7.1l13,-7.52v15a4.1,4.1 0,0 0,4.1 4.1V189.06A4.09,4.09 0,0 0,153.86 193.16Z"
android:fillColor="#fff"/>
<path
android:pathData="M269.53,76.09A80.52,80.52 0,0 0,158 6.28V172.8H269.32a48.36,48.36 0,0 0,0.21 -96.71Z"
android:fillColor="#ebebeb"/>
<path
android:pathData="M162.06,237.43v-15l13,7.52a4.1,4.1 0,0 0,4.1 -7.1l-13,-7.52 13,-7.51a4.1,4.1 0,0 0,-4.1 -7.1l-13,7.51v-15a4.1,4.1 0,0 0,-4.1 -4.1v52.47A4.11,4.11 0,0 0,162.06 237.43Z"
android:fillColor="#ebebeb"/>
<path
android:pathData="M258.32,202.18a4.09,4.09 0,0 0,-5.6 -1.5l-13,7.51v-15a4.1,4.1 0,0 0,-8.2 0v15l-13,-7.51a4.1,4.1 0,1 0,-4.1 7.1l13,7.51 -13,7.52a4.1,4.1 0,1 0,4.1 7.1l13,-7.52v15a4.1,4.1 0,1 0,8.2 0v-15l13,7.52a4.1,4.1 0,0 0,4.1 -7.1l-13,-7.52 13,-7.51A4.1,4.1 0,0 0,258.32 202.18Z"
android:fillColor="#ebebeb"/>
</vector>

View file

@ -0,0 +1,170 @@
<?xml version="1.0" encoding="utf-8"?>
<vector xmlns:android="http://schemas.android.com/apk/res/android"
android:width="108dp"
android:height="108dp"
android:viewportWidth="108"
android:viewportHeight="108">
<path
android:fillColor="#3DDC84"
android:pathData="M0,0h108v108h-108z" />
<path
android:fillColor="#00000000"
android:pathData="M9,0L9,108"
android:strokeWidth="0.8"
android:strokeColor="#33FFFFFF" />
<path
android:fillColor="#00000000"
android:pathData="M19,0L19,108"
android:strokeWidth="0.8"
android:strokeColor="#33FFFFFF" />
<path
android:fillColor="#00000000"
android:pathData="M29,0L29,108"
android:strokeWidth="0.8"
android:strokeColor="#33FFFFFF" />
<path
android:fillColor="#00000000"
android:pathData="M39,0L39,108"
android:strokeWidth="0.8"
android:strokeColor="#33FFFFFF" />
<path
android:fillColor="#00000000"
android:pathData="M49,0L49,108"
android:strokeWidth="0.8"
android:strokeColor="#33FFFFFF" />
<path
android:fillColor="#00000000"
android:pathData="M59,0L59,108"
android:strokeWidth="0.8"
android:strokeColor="#33FFFFFF" />
<path
android:fillColor="#00000000"
android:pathData="M69,0L69,108"
android:strokeWidth="0.8"
android:strokeColor="#33FFFFFF" />
<path
android:fillColor="#00000000"
android:pathData="M79,0L79,108"
android:strokeWidth="0.8"
android:strokeColor="#33FFFFFF" />
<path
android:fillColor="#00000000"
android:pathData="M89,0L89,108"
android:strokeWidth="0.8"
android:strokeColor="#33FFFFFF" />
<path
android:fillColor="#00000000"
android:pathData="M99,0L99,108"
android:strokeWidth="0.8"
android:strokeColor="#33FFFFFF" />
<path
android:fillColor="#00000000"
android:pathData="M0,9L108,9"
android:strokeWidth="0.8"
android:strokeColor="#33FFFFFF" />
<path
android:fillColor="#00000000"
android:pathData="M0,19L108,19"
android:strokeWidth="0.8"
android:strokeColor="#33FFFFFF" />
<path
android:fillColor="#00000000"
android:pathData="M0,29L108,29"
android:strokeWidth="0.8"
android:strokeColor="#33FFFFFF" />
<path
android:fillColor="#00000000"
android:pathData="M0,39L108,39"
android:strokeWidth="0.8"
android:strokeColor="#33FFFFFF" />
<path
android:fillColor="#00000000"
android:pathData="M0,49L108,49"
android:strokeWidth="0.8"
android:strokeColor="#33FFFFFF" />
<path
android:fillColor="#00000000"
android:pathData="M0,59L108,59"
android:strokeWidth="0.8"
android:strokeColor="#33FFFFFF" />
<path
android:fillColor="#00000000"
android:pathData="M0,69L108,69"
android:strokeWidth="0.8"
android:strokeColor="#33FFFFFF" />
<path
android:fillColor="#00000000"
android:pathData="M0,79L108,79"
android:strokeWidth="0.8"
android:strokeColor="#33FFFFFF" />
<path
android:fillColor="#00000000"
android:pathData="M0,89L108,89"
android:strokeWidth="0.8"
android:strokeColor="#33FFFFFF" />
<path
android:fillColor="#00000000"
android:pathData="M0,99L108,99"
android:strokeWidth="0.8"
android:strokeColor="#33FFFFFF" />
<path
android:fillColor="#00000000"
android:pathData="M19,29L89,29"
android:strokeWidth="0.8"
android:strokeColor="#33FFFFFF" />
<path
android:fillColor="#00000000"
android:pathData="M19,39L89,39"
android:strokeWidth="0.8"
android:strokeColor="#33FFFFFF" />
<path
android:fillColor="#00000000"
android:pathData="M19,49L89,49"
android:strokeWidth="0.8"
android:strokeColor="#33FFFFFF" />
<path
android:fillColor="#00000000"
android:pathData="M19,59L89,59"
android:strokeWidth="0.8"
android:strokeColor="#33FFFFFF" />
<path
android:fillColor="#00000000"
android:pathData="M19,69L89,69"
android:strokeWidth="0.8"
android:strokeColor="#33FFFFFF" />
<path
android:fillColor="#00000000"
android:pathData="M19,79L89,79"
android:strokeWidth="0.8"
android:strokeColor="#33FFFFFF" />
<path
android:fillColor="#00000000"
android:pathData="M29,19L29,89"
android:strokeWidth="0.8"
android:strokeColor="#33FFFFFF" />
<path
android:fillColor="#00000000"
android:pathData="M39,19L39,89"
android:strokeWidth="0.8"
android:strokeColor="#33FFFFFF" />
<path
android:fillColor="#00000000"
android:pathData="M49,19L49,89"
android:strokeWidth="0.8"
android:strokeColor="#33FFFFFF" />
<path
android:fillColor="#00000000"
android:pathData="M59,19L59,89"
android:strokeWidth="0.8"
android:strokeColor="#33FFFFFF" />
<path
android:fillColor="#00000000"
android:pathData="M69,19L69,89"
android:strokeWidth="0.8"
android:strokeColor="#33FFFFFF" />
<path
android:fillColor="#00000000"
android:pathData="M79,19L79,89"
android:strokeWidth="0.8"
android:strokeColor="#33FFFFFF" />
</vector>

View file

@ -0,0 +1,33 @@
<vector xmlns:android="http://schemas.android.com/apk/res/android"
android:width="212.3dp"
android:height="62.44dp"
android:viewportWidth="212.3"
android:viewportHeight="62.44">
<path
android:fillColor="#FF000000"
android:pathData="M209.18,6.24H193.57a3.12,3.12 0,0 1,0 -6.24h15.61a3.12,3.12 0,1 1,0 6.24Z"/>
<path
android:fillColor="#FF000000"
android:pathData="M181.08,6.24H178A3.12,3.12 0,0 1,178 0h3.12a3.12,3.12 0,0 1,0 6.24Z"/>
<path
android:fillColor="#FF000000"
android:pathData="M165.47,6.24H3.12A3.12,3.12 0,0 1,3.12 0H165.47a3.12,3.12 0,1 1,0 6.24Z"/>
<path
android:fillColor="#FF000000"
android:pathData="M181.08,43.71H31.22a3.13,3.13 0,0 1,0 -6.25H181.08a3.13,3.13 0,0 1,0 6.25Z"/>
<path
android:fillColor="#FF000000"
android:pathData="M165.47,62.44H106.15a3.12,3.12 0,0 1,0 -6.24h59.32a3.12,3.12 0,1 1,0 6.24Z"/>
<path
android:fillColor="#FF000000"
android:pathData="M93.66,62.44H90.54a3.12,3.12 0,0 1,0 -6.24h3.12a3.12,3.12 0,1 1,0 6.24Z"/>
<path
android:fillColor="#FF000000"
android:pathData="M78.05,62.44H46.83a3.12,3.12 0,1 1,0 -6.24H78.05a3.12,3.12 0,1 1,0 6.24Z"/>
<path
android:fillColor="#FF000000"
android:pathData="M196.69,25h-153a3.13,3.13 0,0 1,0 -6.25h153a3.13,3.13 0,0 1,0 6.25Z"/>
<path
android:fillColor="#FF000000"
android:pathData="M31.22,25H15.61a3.13,3.13 0,0 1,0 -6.25H31.22a3.13,3.13 0,0 1,0 6.25Z"/>
</vector>

View file

@ -0,0 +1,89 @@
<vector xmlns:android="http://schemas.android.com/apk/res/android"
android:width="300.86dp"
android:height="252.28dp"
android:viewportWidth="300.86"
android:viewportHeight="252.28">
<path
android:fillColor="#FF000000"
android:pathData="M257.33,83.62A72.77,72.77 0,0 0,127.91 42.07,53.92 53.92,0 0,0 55.43,99a37.56,37.56 0,0 0,-5.55 -0.42,36.23 36.23,0 0,0 0,72.46H257.14a43.72,43.72 0,0 0,0.19 -87.44Z"
android:strokeAlpha="0.2"
android:fillAlpha="0.2"/>
<path
android:fillColor="#FF000000"
android:pathData="M83.2,191.31A4.1,4.1 0,0 0,78 193.8l-6.24,17.48a4.09,4.09 0,0 0,2.48 5.24,3.9 3.9,0 0,0 1.38,0.24A4.1,4.1 0,0 0,79.44 214l6.24,-17.49A4.11,4.11 0,0 0,83.2 191.31Z"
android:strokeAlpha="0.2"
android:fillAlpha="0.2"/>
<path
android:fillColor="#FF000000"
android:pathData="M124.32,191.31a4.1,4.1 0,0 0,-5.24 2.49l-6.25,17.48a4.1,4.1 0,0 0,2.49 5.24,3.88 3.88,0 0,0 1.37,0.24 4.08,4.08 0,0 0,3.86 -2.72l6.25,-17.49A4.11,4.11 0,0 0,124.32 191.31Z"
android:strokeAlpha="0.2"
android:fillAlpha="0.2"/>
<path
android:fillColor="#FF000000"
android:pathData="M94.4,226.83a4.1,4.1 0,0 0,-5.24 2.49L82.91,246.8A4.1,4.1 0,0 0,85.4 252a3.88,3.88 0,0 0,1.37 0.24,4.1 4.1,0 0,0 3.87,-2.72l6.24,-17.49A4.1,4.1 0,0 0,94.4 226.83Z"
android:strokeAlpha="0.2"
android:fillAlpha="0.2"/>
<path
android:fillColor="#FF000000"
android:pathData="M135.72,226.83a4.1,4.1 0,0 0,-5.24 2.49l-6.24,17.48a4.1,4.1 0,0 0,2.48 5.24,3.9 3.9,0 0,0 1.38,0.24 4.1,4.1 0,0 0,3.86 -2.72l6.25,-17.49A4.1,4.1 0,0 0,135.72 226.83Z"
android:strokeAlpha="0.2"
android:fillAlpha="0.2"/>
<path
android:fillColor="#FF000000"
android:pathData="M172.2,226.22A4.09,4.09 0,0 0,167 228.7l-6.25,17.49a4.09,4.09 0,0 0,2.48 5.23,4 4,0 0,0 1.38,0.24 4.08,4.08 0,0 0,3.86 -2.72l6.25,-17.49A4.09,4.09 0,0 0,172.2 226.22Z"
android:strokeAlpha="0.2"
android:fillAlpha="0.2"/>
<path
android:fillColor="#FF000000"
android:pathData="M213.52,226.22a4.09,4.09 0,0 0,-5.24 2.48L202,246.19a4.08,4.08 0,0 0,2.48 5.23,3.9 3.9,0 0,0 1.38,0.24 4.1,4.1 0,0 0,3.86 -2.72L216,231.45A4.08,4.08 0,0 0,213.52 226.22Z"
android:strokeAlpha="0.2"
android:fillAlpha="0.2"/>
<path
android:fillColor="#FF000000"
android:pathData="M160.59,190.7a4.13,4.13 0,0 0,-5.24 2.48l-6.25,17.49a4.11,4.11 0,0 0,2.48 5.24,4.18 4.18,0 0,0 1.38,0.24 4.1,4.1 0,0 0,3.86 -2.73l6.25,-17.48A4.1,4.1 0,0 0,160.59 190.7Z"
android:strokeAlpha="0.2"
android:fillAlpha="0.2"/>
<path
android:fillColor="#FF000000"
android:pathData="M201.7,190.7a4.08,4.08 0,0 0,-5.23 2.48l-6.25,17.49a4.11,4.11 0,0 0,2.48 5.24,4.18 4.18,0 0,0 1.38,0.24 4.11,4.11 0,0 0,3.86 -2.73l6.25,-17.48A4.1,4.1 0,0 0,201.7 190.7Z"
android:strokeAlpha="0.2"
android:fillAlpha="0.2"/>
<path
android:fillColor="#FF000000"
android:pathData="M242.82,190.7a4.09,4.09 0,0 0,-5.24 2.48l-6.24,17.49a4.1,4.1 0,1 0,7.72 2.75l6.24,-17.48A4.09,4.09 0,0 0,242.82 190.7Z"
android:strokeAlpha="0.2"
android:fillAlpha="0.2"/>
<path
android:pathData="M114.26,27.24A54,54 0,0 0,41.39 77.82a55.73,55.73 0,0 0,0.38 6.37,36.23 36.23,0 1,0 -5.54,72H143.6V5.37A72.94,72.94 0,0 0,114.26 27.24Z"
android:fillColor="#fff"/>
<path
android:pathData="M243.67,68.79A72.75,72.75 0,0 0,143.6 5.37V156.22h99.88a43.72,43.72 0,0 0,0.19 -87.43Z"
android:fillColor="#ebebeb"/>
<path
android:pathData="M69.55,176.48A4.1,4.1 0,0 0,64.31 179l-6.25,17.49a4.1,4.1 0,0 0,2.48 5.24,4.18 4.18,0 0,0 1.38,0.24 4.11,4.11 0,0 0,3.86 -2.72L72,181.72A4.1,4.1 0,0 0,69.55 176.48Z"
android:fillColor="#78d9ff"/>
<path
android:pathData="M110.66,176.48a4.1,4.1 0,0 0,-5.24 2.48l-6.24,17.49a4.1,4.1 0,1 0,7.72 2.76l6.24,-17.49A4.09,4.09 0,0 0,110.66 176.48Z"
android:fillColor="#78d9ff"/>
<path
android:pathData="M80.74,212a4.11,4.11 0,0 0,-5.24 2.48L69.26,232a4.1,4.1 0,0 0,2.48 5.24,4.18 4.18,0 0,0 1.38,0.24A4.11,4.11 0,0 0,77 234.73l6.25,-17.49A4.1,4.1 0,0 0,80.74 212Z"
android:fillColor="#78d9ff"/>
<path
android:pathData="M122.07,212a4.1,4.1 0,0 0,-5.24 2.48L110.58,232a4.1,4.1 0,0 0,2.48 5.24,4.18 4.18,0 0,0 1.38,0.24 4.1,4.1 0,0 0,3.86 -2.72l6.25,-17.49A4.1,4.1 0,0 0,122.07 212Z"
android:fillColor="#78d9ff"/>
<path
android:pathData="M158.54,211.38a4.1,4.1 0,0 0,-5.24 2.48l-6.24,17.49a4.1,4.1 0,1 0,7.72 2.76L161,216.62A4.09,4.09 0,0 0,158.54 211.38Z"
android:fillColor="#78d9ff"/>
<path
android:pathData="M199.87,211.38a4.1,4.1 0,0 0,-5.24 2.48l-6.25,17.49a4.1,4.1 0,0 0,2.48 5.24,4.18 4.18,0 0,0 1.38,0.24 4.1,4.1 0,0 0,3.86 -2.72l6.25,-17.49A4.1,4.1 0,0 0,199.87 211.38Z"
android:fillColor="#78d9ff"/>
<path
android:pathData="M141.69,178.34l-6.24,17.49a4.1,4.1 0,1 0,7.72 2.76l6.24,-17.49a4.09,4.09 0,0 0,-5.81 -5v0A4.09,4.09 0,0 0,141.69 178.34Z"
android:fillColor="#78d9ff"/>
<path
android:pathData="M188.05,175.86a4.1,4.1 0,0 0,-5.24 2.48l-6.25,17.49a4.1,4.1 0,0 0,2.48 5.24,4.22 4.22,0 0,0 1.38,0.24 4.08,4.08 0,0 0,3.86 -2.72l6.25,-17.49A4.1,4.1 0,0 0,188.05 175.86Z"
android:fillColor="#78d9ff"/>
<path
android:pathData="M229.17,175.86a4.1,4.1 0,0 0,-5.24 2.48l-6.25,17.49a4.1,4.1 0,0 0,2.48 5.24,4.18 4.18,0 0,0 1.38,0.24 4.09,4.09 0,0 0,3.86 -2.72l6.25,-17.49A4.1,4.1 0,0 0,229.17 175.86Z"
android:fillColor="#78d9ff"/>
</vector>

View file

@ -0,0 +1,49 @@
<vector xmlns:android="http://schemas.android.com/apk/res/android"
android:width="303.56dp"
android:height="254.15dp"
android:viewportWidth="303.56"
android:viewportHeight="254.15">
<path
android:fillColor="#FF000000"
android:pathData="M259.61,83.9A73.47,73.47 0,0 0,128.94 42a54.46,54.46 0,0 0,-73.18 57.5,37 37,0 0,0 -5.6,-0.43 36.58,36.58 0,0 0,0 73.16H259.42a44.14,44.14 0,0 0,0.19 -88.28Z"
android:strokeAlpha="0.2"
android:fillAlpha="0.2"/>
<path
android:fillColor="#FF000000"
android:pathData="M91,187.21a4.1,4.1 0,0 0,-5.24 2.49l-21.06,59a4.1,4.1 0,0 0,2.48 5.24,4.18 4.18,0 0,0 1.38,0.24 4.1,4.1 0,0 0,3.86 -2.72l21.06,-59A4.11,4.11 0,0 0,91 187.21Z"
android:strokeAlpha="0.2"
android:fillAlpha="0.2"/>
<path
android:fillColor="#FF000000"
android:pathData="M137.54,187.21a4.1,4.1 0,0 0,-5.24 2.49l-21.06,59a4.1,4.1 0,0 0,2.48 5.24,4.18 4.18,0 0,0 1.38,0.24 4.1,4.1 0,0 0,3.86 -2.72l21.06,-59A4.1,4.1 0,0 0,137.54 187.21Z"
android:strokeAlpha="0.2"
android:fillAlpha="0.2"/>
<path
android:fillColor="#FF000000"
android:pathData="M184.06,187.21a4.1,4.1 0,0 0,-5.24 2.49l-21.06,59a4.1,4.1 0,0 0,2.48 5.24,4.18 4.18,0 0,0 1.38,0.24 4.09,4.09 0,0 0,3.86 -2.72l21.06,-59A4.1,4.1 0,0 0,184.06 187.21Z"
android:strokeAlpha="0.2"
android:fillAlpha="0.2"/>
<path
android:fillColor="#FF000000"
android:pathData="M230.58,187.21a4.1,4.1 0,0 0,-5.24 2.49l-21.06,59a4.1,4.1 0,0 0,2.48 5.24,4.18 4.18,0 0,0 1.38,0.24 4.09,4.09 0,0 0,3.86 -2.72l21.07,-59A4.1,4.1 0,0 0,230.58 187.21Z"
android:strokeAlpha="0.2"
android:fillAlpha="0.2"/>
<path
android:pathData="M115.36,27.5A54.46,54.46 0,0 0,42.18 85a37,37 0,0 0,-5.6 -0.42,36.58 36.58,0 1,0 0,73.15H145V5.42A73.68,73.68 0,0 0,115.36 27.5Z"
android:fillColor="#fff"/>
<path
android:pathData="M246,69.45a73.46,73.46 0,0 0,-101 -64V157.73H245.83a44.14,44.14 0,0 0,0.2 -88.28Z"
android:fillColor="#ebebeb"/>
<path
android:pathData="M77.44,172.77a4.09,4.09 0,0 0,-5.24 2.48l-21.06,59a4.1,4.1 0,0 0,2.48 5.24,3.9 3.9,0 0,0 1.38,0.24A4.1,4.1 0,0 0,58.86 237l21.06,-59A4.1,4.1 0,0 0,77.44 172.77Z"
android:fillColor="#78d9ff"/>
<path
android:pathData="M124,172.77a4.09,4.09 0,0 0,-5.24 2.48l-21.06,59a4.1,4.1 0,0 0,2.48 5.24,3.94 3.94,0 0,0 1.38,0.24 4.1,4.1 0,0 0,3.86 -2.72l21.06,-59A4.1,4.1 0,0 0,124 172.77Z"
android:fillColor="#78d9ff"/>
<path
android:pathData="M170.48,172.77a4.09,4.09 0,0 0,-5.24 2.48l-21.06,59a4.1,4.1 0,0 0,2.48 5.24,3.94 3.94,0 0,0 1.38,0.24A4.1,4.1 0,0 0,151.9 237L173,178A4.1,4.1 0,0 0,170.48 172.77Z"
android:fillColor="#78d9ff"/>
<path
android:pathData="M217,172.77a4.09,4.09 0,0 0,-5.24 2.48l-21.06,59a4.1,4.1 0,0 0,2.48 5.24,3.94 3.94,0 0,0 1.38,0.24 4.1,4.1 0,0 0,3.86 -2.72l21.06,-59A4.09,4.09 0,0 0,217 172.77Z"
android:fillColor="#78d9ff"/>
</vector>

View file

@ -0,0 +1,38 @@
<vector xmlns:android="http://schemas.android.com/apk/res/android"
android:width="332.37dp"
android:height="255.76dp"
android:viewportWidth="332.37"
android:viewportHeight="255.76">
<path
android:fillColor="#FF000000"
android:pathData="M284.31,90.92A80.31,80.31 0,0 0,141.44 45.05,59.64 59.64,0 0,0 61,100.9a60.45,60.45 0,0 0,0.43 7,40 40,0 1,0 -6.12,79.52H83l-24,39.22a4.1,4.1 0,1 0,7 4.27l26.57,-43.49h26.19l-9.13,15a4.11,4.11 0,0 0,1.36 5.64,4.18 4.18,0 0,0 2.14,0.6 4.09,4.09 0,0 0,3.5 -2l11.74,-19.22h29.11l-26.1,42.73a4.11,4.11 0,0 0,1.36 5.64,4 4,0 0,0 2.13,0.6 4.1,4.1 0,0 0,3.5 -2l28.71,-47h9.74v13.33l19.35,0.69q4.13,0.15 8.25,0.21 3.39,0 6.77,0 -3.26,8.45 -6.1,17.1c-1.92,5.93 -3.69,11.95 -5.23,18.08a160.69,160.69 0,0 0,-3.69 18.85,160 160,0 0,0 12.8,-14.32c4,-4.92 7.7,-9.95 11.28,-15.07a359.69,359.69 0,0 0,19.59 -31.62l4,-7.3H284.1a48.27,48.27 0,0 0,0.21 -96.53Z"
android:strokeAlpha="0.2"
android:fillAlpha="0.2"/>
<path
android:pathData="M126.14,30.07A59.61,59.61 0,0 0,45.69 85.92a60.45,60.45 0,0 0,0.43 7A40,40 0,1 0,40 172.47H67.75l13.89,-22.73a4.1,4.1 0,0 1,7 4.27L77.36,172.47h26.19l28.71,-47a4.1,4.1 0,0 1,7 4.27l-26.11,42.73h29.11L154,153.25a4.1,4.1 0,0 1,7 4.27l-9.13,14.95h9.73V4.73A80.51,80.51 0,0 0,126.14 30.07Z"
android:fillColor="#fff"/>
<path
android:pathData="M269,75.94A80.38,80.38 0,0 0,161.6 4.73V172.47h6.85l1.61,-3.12a367.89,367.89 0,0 1,19.53 -33.73c3.59,-5.46 7.35,-10.85 11.36,-16.11a167.46,167.46 0,0 1,13 -15.34,164.31 164.31,0 0,1 -3.5,19.8c-1.49,6.45 -3.22,12.79 -5.14,19 -2,6.48 -4.17,12.86 -6.52,19.17q3.45,0 6.91,0.1c2.75,0.07 5.5,0.14 8.25,0.27l19.66,0.92 -5,9h40.16A48.27,48.27 0,0 0,269 75.94Z"
android:fillColor="#ebebeb"/>
<path
android:pathData="M214,162.55c-2.75,-0.13 -5.5,-0.2 -8.25,-0.27q-3.47,-0.09 -6.91,-0.1c2.35,-6.31 4.54,-12.69 6.52,-19.17 1.92,-6.25 3.65,-12.59 5.14,-19a164.31,164.31 0,0 0,3.5 -19.8,167.46 167.46,0 0,0 -13,15.34c-4,5.26 -7.77,10.65 -11.36,16.11a367.89,367.89 0,0 0,-19.53 33.73l-1.61,3.12 -6.85,13.32 19.35,0.7q4.13,0.15 8.25,0.21 3.39,0 6.78,0.05 -3.27,8.44 -6.1,17.09c-1.93,5.94 -3.69,12 -5.23,18.09a160.94,160.94 0,0 0,-3.7 18.84,161.4 161.4,0 0,0 12.81,-14.31c4,-4.92 7.7,-10 11.27,-15.07a358.79,358.79 0,0 0,19.59 -31.62l4,-7.3 5,-9Z"
android:fillColor="#ebbf02"/>
<path
android:pathData="M43.79,211.69a4.09,4.09 0,0 0,1.37 5.63,4 4,0 0,0 2.13,0.6 4.08,4.08 0,0 0,3.5 -2l26.57,-43.49H67.75Z"
android:fillColor="#78d9ff"/>
<path
android:pathData="M87.27,148.38a4.09,4.09 0,0 0,-5.63 1.36L67.75,172.47h9.61L88.63,154A4.1,4.1 0,0 0,87.27 148.38Z"
android:fillColor="#78d9ff"/>
<path
android:pathData="M94.42,187.42a4.1,4.1 0,0 0,1.36 5.63,4.1 4.1,0 0,0 5.63,-1.36l11.74,-19.22h-9.6Z"
android:fillColor="#78d9ff"/>
<path
android:pathData="M137.89,124.11a4.08,4.08 0,0 0,-5.63 1.36l-28.71,47h9.6l26.11,-42.73A4.09,4.09 0,0 0,137.89 124.11Z"
android:fillColor="#78d9ff"/>
<path
android:pathData="M116.16,215.2a4.11,4.11 0,0 0,1.36 5.64,4.18 4.18,0 0,0 2.14,0.6 4.09,4.09 0,0 0,3.5 -2l28.71,-47h-9.61Z"
android:fillColor="#78d9ff"/>
<path
android:pathData="M159.64,151.89a4.11,4.11 0,0 0,-5.64 1.36l-11.74,19.22h9.61L161,157.52A4.1,4.1 0,0 0,159.64 151.89Z"
android:fillColor="#78d9ff"/>
</vector>

View file

@ -0,0 +1,92 @@
<vector xmlns:android="http://schemas.android.com/apk/res/android"
android:width="309.13dp"
android:height="278.52dp"
android:viewportWidth="309.13"
android:viewportHeight="278.52">
<path
android:fillColor="#FF000000"
android:pathData="M74.14,189.34a10.29,10.29 0,1 0,10.29 10.28A10.28,10.28 0,0 0,74.14 189.34Z"
android:strokeAlpha="0.2"
android:fillAlpha="0.2"/>
<path
android:fillColor="#FF000000"
android:pathData="M144.08,199.62a10.29,10.29 0,1 0,-10.29 10.29A10.29,10.29 0,0 0,144.08 199.62Z"
android:strokeAlpha="0.2"
android:fillAlpha="0.2"/>
<path
android:fillColor="#FF000000"
android:pathData="M104.69,233.994m-10.147,1.647a10.28,10.28 125.78,1 1,20.294 -3.294a10.28,10.28 125.78,1 1,-20.294 3.294"
android:strokeAlpha="0.2"
android:fillAlpha="0.2"/>
<path
android:fillColor="#FF000000"
android:pathData="M137.886,268.223m-10.147,1.647a10.28,10.28 125.78,1 1,20.294 -3.294a10.28,10.28 125.78,1 1,-20.294 3.294"
android:strokeAlpha="0.2"
android:fillAlpha="0.2"/>
<path
android:fillColor="#FF000000"
android:pathData="M264.3,84.87A74.92,74.92 0,0 0,131 42.09,55.6 55.6,0 0,0 56,94.18a54.46,54.46 0,0 0,0.4 6.55,38.47 38.47,0 0,0 -5.71,-0.43 37.31,37.31 0,1 0,0 74.61H264.11a45,45 0,0 0,0.19 -90Z"
android:strokeAlpha="0.2"
android:fillAlpha="0.2"/>
<path
android:fillColor="#FF000000"
android:pathData="M203.73,199.62a10.29,10.29 0,1 0,-10.28 10.29A10.28,10.28 0,0 0,203.73 199.62Z"
android:strokeAlpha="0.2"
android:fillAlpha="0.2"/>
<path
android:fillColor="#FF000000"
android:pathData="M253.1,189.34a10.29,10.29 0,1 0,10.28 10.28A10.29,10.29 0,0 0,253.1 189.34Z"
android:strokeAlpha="0.2"
android:fillAlpha="0.2"/>
<path
android:fillColor="#FF000000"
android:pathData="M164.338,233.998m-3.934,9.497a10.28,10.28 67.5,1 1,7.868 -18.995a10.28,10.28 67.5,1 1,-7.868 18.995"
android:strokeAlpha="0.2"
android:fillAlpha="0.2"/>
<path
android:fillColor="#FF000000"
android:pathData="M197.53,258a10.29,10.29 0,1 0,10.29 10.28A10.28,10.28 0,0 0,197.53 258Z"
android:strokeAlpha="0.2"
android:fillAlpha="0.2"/>
<path
android:fillColor="#FF000000"
android:pathData="M223.995,233.998m-3.934,9.497a10.28,10.28 67.5,1 1,7.868 -18.995a10.28,10.28 67.5,1 1,-7.868 18.995"
android:strokeAlpha="0.2"
android:fillAlpha="0.2"/>
<path
android:pathData="M117.66,28.05a55.62,55.62 0,0 0,-75 52.09A54.63,54.63 0,0 0,43 86.7a37.31,37.31 0,1 0,-5.71 74.18H151V4.33A75.09,75.09 0,0 0,117.66 28.05Z"
android:fillColor="#fff"/>
<path
android:pathData="M60.77,175.3a10.29,10.29 0,1 0,10.29 10.29A10.29,10.29 0,0 0,60.77 175.3Z"
android:fillColor="#fff"/>
<path
android:pathData="M130.71,185.59a10.29,10.29 0,1 0,-10.29 10.28A10.29,10.29 0,0 0,130.71 185.59Z"
android:fillColor="#fff"/>
<path
android:pathData="M91.324,219.958m-10.147,1.647a10.28,10.28 125.78,1 1,20.294 -3.294a10.28,10.28 125.78,1 1,-20.294 3.294"
android:fillColor="#fff"/>
<path
android:pathData="M140.68,220A10.29,10.29 0,0 0,151 230.25V209.68A10.29,10.29 0,0 0,140.68 220Z"
android:fillColor="#fff"/>
<path
android:pathData="M124.518,254.196m-3.934,9.497a10.28,10.28 67.5,1 1,7.868 -18.995a10.28,10.28 67.5,1 1,-7.868 18.995"
android:fillColor="#fff"/>
<path
android:pathData="M250.93,70.84A75,75 0,0 0,151 4.33V160.88h99.77a45,45 0,0 0,0.19 -90Z"
android:fillColor="#ebebeb"/>
<path
android:pathData="M190.36,185.59a10.29,10.29 0,1 0,-10.28 10.28A10.29,10.29 0,0 0,190.36 185.59Z"
android:fillColor="#ebebeb"/>
<path
android:pathData="M239.73,175.3A10.29,10.29 0,1 0,250 185.59,10.29 10.29,0 0,0 239.73,175.3Z"
android:fillColor="#ebebeb"/>
<path
android:pathData="M161.25,220A10.28,10.28 0,0 0,151 209.68v20.57A10.29,10.29 0,0 0,161.25 220Z"
android:fillColor="#ebebeb"/>
<path
android:pathData="M184.165,254.196m-3.934,9.497a10.28,10.28 67.5,1 1,7.868 -18.995a10.28,10.28 67.5,1 1,-7.868 18.995"
android:fillColor="#ebebeb"/>
<path
android:pathData="M210.617,219.958m-3.934,9.497a10.28,10.28 67.5,1 1,7.868 -18.995a10.28,10.28 67.5,1 1,-7.868 18.995"
android:fillColor="#ebebeb"/>
</vector>

View file

@ -0,0 +1,81 @@
<vector xmlns:android="http://schemas.android.com/apk/res/android"
android:width="306.45dp"
android:height="255.7dp"
android:viewportWidth="306.45"
android:viewportHeight="255.7">
<path
android:fillColor="#FF000000"
android:pathData="M261.63,85.37A74.93,74.93 0,0 0,128.36 42.58,55.63 55.63,0 0,0 53.31,94.67a56.78,56.78 0,0 0,0.4 6.56A37.31,37.31 0,1 0,48 175.41H261.43a45,45 0,0 0,0.2 -90Z"
android:strokeAlpha="0.2"
android:fillAlpha="0.2"/>
<path
android:fillColor="#FF000000"
android:pathData="M169.78,229.73a4.09,4.09 0,0 0,-5.24 2.48l-6.43,18a4.11,4.11 0,0 0,2.48 5.24,4.18 4.18,0 0,0 1.38,0.24 4.11,4.11 0,0 0,3.86 -2.73l6.43,-18A4.09,4.09 0,0 0,169.78 229.73Z"
android:strokeAlpha="0.2"
android:fillAlpha="0.2"/>
<path
android:fillColor="#FF000000"
android:pathData="M212.34,229.73a4.08,4.08 0,0 0,-5.24 2.48l-6.44,18a4.1,4.1 0,1 0,7.73 2.75l6.43,-18A4.09,4.09 0,0 0,212.34 229.73Z"
android:strokeAlpha="0.2"
android:fillAlpha="0.2"/>
<path
android:fillColor="#FF000000"
android:pathData="M157.82,193.15a4.1,4.1 0,0 0,-5.24 2.48l-6.43,18a4.1,4.1 0,0 0,2.48 5.24,4.18 4.18,0 0,0 1.38,0.24 4.1,4.1 0,0 0,3.86 -2.72l6.43,-18A4.09,4.09 0,0 0,157.82 193.15Z"
android:strokeAlpha="0.2"
android:fillAlpha="0.2"/>
<path
android:fillColor="#FF000000"
android:pathData="M200.17,193.15a4.1,4.1 0,0 0,-5.24 2.48l-6.44,18a4.1,4.1 0,0 0,7.73 2.76l6.43,-18A4.1,4.1 0,0 0,200.17 193.15Z"
android:strokeAlpha="0.2"
android:fillAlpha="0.2"/>
<path
android:fillColor="#FF000000"
android:pathData="M242.51,193.15a4.1,4.1 0,0 0,-5.24 2.48l-6.43,18a4.1,4.1 0,1 0,7.72 2.76l6.43,-18A4.1,4.1 0,0 0,242.51 193.15Z"
android:strokeAlpha="0.2"
android:fillAlpha="0.2"/>
<path
android:fillColor="#FF000000"
android:pathData="M76.44,212.76a4.09,4.09 0,0 0,-1.5 -5.6L69,203.74l5.91,-3.42a4.1,4.1 0,0 0,-4.1 -7.1l-5.91,3.42v-6.83a4.1,4.1 0,0 0,-8.2 0v6.83l-5.92,-3.42a4.1,4.1 0,0 0,-4.1 7.1l5.92,3.42 -5.92,3.42a4.1,4.1 0,1 0,4.1 7.1l5.92,-3.42v6.84a4.1,4.1 0,0 0,8.2 0v-6.84l5.91,3.42a4.15,4.15 0,0 0,2 0.55A4.09,4.09 0,0 0,76.44 212.76Z"
android:strokeAlpha="0.2"
android:fillAlpha="0.2"/>
<path
android:fillColor="#FF000000"
android:pathData="M129.6,194.73a4.1,4.1 0,0 0,-5.6 -1.51l-5.92,3.42v-6.83a4.1,4.1 0,1 0,-8.2 0v6.83L104,193.22a4.1,4.1 0,0 0,-4.1 7.1l5.92,3.42 -5.92,3.42a4.1,4.1 0,1 0,4.1 7.1l5.92,-3.42v6.84a4.1,4.1 0,0 0,8.2 0v-6.84l5.92,3.42a4.1,4.1 0,0 0,4.1 -7.1l-5.92,-3.42 5.92,-3.42A4.09,4.09 0,0 0,129.6 194.73Z"
android:strokeAlpha="0.2"
android:fillAlpha="0.2"/>
<path
android:fillColor="#FF000000"
android:pathData="M103.17,228.65a4.1,4.1 0,0 0,-5.6 -1.5l-5.92,3.41v-6.83a4.1,4.1 0,0 0,-8.2 0v6.83l-5.92,-3.41a4.1,4.1 0,0 0,-4.1 7.1l5.92,3.41 -5.92,3.42a4.1,4.1 0,1 0,4.1 7.1l5.92,-3.42v6.84a4.1,4.1 0,0 0,8.2 0v-6.84l5.92,3.42a4.1,4.1 0,0 0,4.1 -7.1l-5.92,-3.42 5.92,-3.41A4.1,4.1 0,0 0,103.17 228.65Z"
android:strokeAlpha="0.2"
android:fillAlpha="0.2"/>
<path
android:pathData="M250.93,70.84A74.91,74.91 0,0 0,149.85 4.76V160.88H250.74a45,45 0,0 0,0.19 -90Z"
android:fillColor="#ebebeb"/>
<path
android:pathData="M117.66,28.05a55.62,55.62 0,0 0,-75 52.09A54.63,54.63 0,0 0,43 86.7a37.31,37.31 0,1 0,-5.71 74.18H149.85V4.76A75.19,75.19 0,0 0,117.66 28.05Z"
android:fillColor="#fff"/>
<path
android:pathData="M159.09,215.19a4.1,4.1 0,0 0,-5.24 2.49l-6.43,18a4.1,4.1 0,1 0,7.72 2.75l6.43,-18A4.11,4.11 0,0 0,159.09 215.19Z"
android:fillColor="#78d9ff"/>
<path
android:pathData="M201.64,215.19a4.1,4.1 0,0 0,-5.24 2.49l-6.43,18a4.11,4.11 0,0 0,2.48 5.24,4.18 4.18,0 0,0 1.38,0.24 4.1,4.1 0,0 0,3.86 -2.73l6.43,-18A4.1,4.1 0,0 0,201.64 215.19Z"
android:fillColor="#78d9ff"/>
<path
android:pathData="M147.13,178.62a4.09,4.09 0,0 0,-5.24 2.48l-6.43,18a4.1,4.1 0,0 0,2.48 5.24,4.18 4.18,0 0,0 1.38,0.24 4.11,4.11 0,0 0,3.86 -2.72l6.43,-18A4.1,4.1 0,0 0,147.13 178.62Z"
android:fillColor="#78d9ff"/>
<path
android:pathData="M189.47,178.62a4.1,4.1 0,0 0,-5.24 2.48l-6.43,18a4.1,4.1 0,0 0,2.48 5.24,4.18 4.18,0 0,0 1.38,0.24 4.1,4.1 0,0 0,3.86 -2.72l6.43,-18A4.08,4.08 0,0 0,189.47 178.62Z"
android:fillColor="#78d9ff"/>
<path
android:pathData="M231.82,178.62a4.09,4.09 0,0 0,-5.24 2.48l-6.44,18a4.1,4.1 0,0 0,7.73 2.76l6.43,-18A4.1,4.1 0,0 0,231.82 178.62Z"
android:fillColor="#78d9ff"/>
<path
android:pathData="M65.75,198.23a4.1,4.1 0,0 0,-1.5 -5.6l-5.92,-3.42 5.92,-3.42a4.1,4.1 0,1 0,-4.1 -7.1l-5.92,3.42v-6.83a4.1,4.1 0,1 0,-8.2 0v6.83l-5.91,-3.42a4.1,4.1 0,0 0,-4.1 7.1l5.92,3.42L36,192.63a4.1,4.1 0,1 0,4.1 7.1L46,196.31v6.83a4.1,4.1 0,1 0,8.2 0v-6.83l5.92,3.42a4.1,4.1 0,0 0,5.6 -1.5Z"
android:fillColor="#fff"/>
<path
android:pathData="M118.9,180.19a4.1,4.1 0,0 0,-5.6 -1.5l-5.91,3.42v-6.83a4.1,4.1 0,1 0,-8.2 0v6.83l-5.92,-3.42a4.1,4.1 0,0 0,-4.1 7.1l5.92,3.42 -5.92,3.42a4.1,4.1 0,1 0,4.1 7.1l5.92,-3.42v6.83a4.1,4.1 0,1 0,8.2 0v-6.83l5.91,3.42a4.15,4.15 0,0 0,2 0.55,4.1 4.1,0 0,0 2.05,-7.65l-5.91,-3.42 5.91,-3.42A4.09,4.09 0,0 0,118.9 180.19Z"
android:fillColor="#fff"/>
<path
android:pathData="M92.47,214.11a4.1,4.1 0,0 0,-5.6 -1.5L81,216V209.2a4.1,4.1 0,1 0,-8.2 0V216l-5.92,-3.42a4.1,4.1 0,0 0,-4.1 7.1l5.92,3.42 -5.92,3.42a4.1,4.1 0,1 0,4.1 7.1l5.92,-3.42v6.84a4.1,4.1 0,0 0,8.2 0v-6.84l5.91,3.42a4.1,4.1 0,1 0,4.1 -7.1l-5.92,-3.42L91,219.71A4.1,4.1 0,0 0,92.47 214.11Z"
android:fillColor="#fff"/>
</vector>

View file

@ -0,0 +1,87 @@
<vector xmlns:android="http://schemas.android.com/apk/res/android"
android:width="306.06dp"
android:height="306.74dp"
android:viewportWidth="306.06"
android:viewportHeight="306.74">
<path
android:fillColor="#FF000000"
android:pathData="M158.15,80.23a8.2,8.2 0,0 0,8.2 -8.2V19.13a8.2,8.2 0,1 0,-16.4 0V72A8.2,8.2 0,0 0,158.15 80.23Z"
android:strokeAlpha="0.2"
android:fillAlpha="0.2"/>
<path
android:fillColor="#FF000000"
android:pathData="M91,103.25a8.2,8.2 0,1 0,11.6 -11.59L65.16,54.25a8.2,8.2 0,0 0,-11.59 11.6Z"
android:strokeAlpha="0.2"
android:fillAlpha="0.2"/>
<path
android:fillColor="#FF000000"
android:pathData="M79.54,158.84a8.2,8.2 0,0 0,-8.19 -8.2H18.45a8.2,8.2 0,1 0,0 16.4h52.9A8.2,8.2 0,0 0,79.54 158.84Z"
android:strokeAlpha="0.2"
android:fillAlpha="0.2"/>
<path
android:fillColor="#FF000000"
android:pathData="M91,214.42l-37.4,37.41a8.2,8.2 0,0 0,11.59 11.59L102.57,226A8.2,8.2 0,0 0,91 214.42Z"
android:strokeAlpha="0.2"
android:fillAlpha="0.2"/>
<path
android:fillColor="#FF000000"
android:pathData="M158.15,90.56h0a68.28,68.28 0,0 0,0 136.55h0a68.28,68.28 0,1 0,0 -136.55Z"
android:strokeAlpha="0.2"
android:fillAlpha="0.2"/>
<path
android:fillColor="#FF000000"
android:pathData="M158.15,237.45a8.2,8.2 0,0 0,-8.2 8.19v52.9a8.2,8.2 0,1 0,16.4 0v-52.9A8.2,8.2 0,0 0,158.15 237.45Z"
android:strokeAlpha="0.2"
android:fillAlpha="0.2"/>
<path
android:fillColor="#FF000000"
android:pathData="M225.33,214.42A8.2,8.2 0,0 0,213.74 226l37.4,37.4a8.2,8.2 0,0 0,11.6 -11.59Z"
android:strokeAlpha="0.2"
android:fillAlpha="0.2"/>
<path
android:fillColor="#FF000000"
android:pathData="M297.86,150.64H245a8.2,8.2 0,0 0,0 16.4h52.9a8.2,8.2 0,0 0,0 -16.4Z"
android:strokeAlpha="0.2"
android:fillAlpha="0.2"/>
<path
android:fillColor="#FF000000"
android:pathData="M219.54,105.65a8.17,8.17 0,0 0,5.79 -2.4l37.41,-37.4a8.2,8.2 0,0 0,-11.6 -11.6l-37.4,37.41a8.2,8.2 0,0 0,5.8 14Z"
android:strokeAlpha="0.2"
android:fillAlpha="0.2"/>
<path
android:pathData="M79.63,147.91a68.28,68.28 0,0 0,68.28 68.27V79.63A68.28,68.28 0,0 0,79.63 147.91Z"
android:fillColor="#fdcd02"/>
<path
android:pathData="M139.71,8.2V61.1a8.2,8.2 0,0 0,8.2 8.2V0A8.2,8.2 0,0 0,139.71 8.2Z"
android:fillColor="#fdcd02"/>
<path
android:pathData="M139.71,234.71v52.9a8.2,8.2 0,0 0,8.2 8.2V226.52A8.2,8.2 0,0 0,139.71 234.71Z"
android:fillColor="#fdcd02"/>
<path
android:pathData="M80.73,92.32A8.2,8.2 0,1 0,92.32 80.73L54.91,43.32a8.2,8.2 0,0 0,-11.59 11.6Z"
android:fillColor="#fdcd02"/>
<path
android:pathData="M69.3,147.91a8.2,8.2 0,0 0,-8.2 -8.2H8.2a8.2,8.2 0,1 0,0 16.39H61.1A8.2,8.2 0,0 0,69.3 147.91Z"
android:fillColor="#fdcd02"/>
<path
android:pathData="M80.73,203.49 L43.32,240.9a8.2,8.2 0,0 0,11.59 11.59l37.41,-37.4a8.2,8.2 0,0 0,-11.59 -11.6Z"
android:fillColor="#fdcd02"/>
<path
android:pathData="M216.18,147.91a68.28,68.28 0,0 0,-68.27 -68.28h0V216.18h0A68.28,68.28 0,0 0,216.18 147.91Z"
android:fillColor="#ebbf02"/>
<path
android:pathData="M156.1,61.1V8.2A8.2,8.2 0,0 0,147.91 0V69.3A8.2,8.2 0,0 0,156.1 61.1Z"
android:fillColor="#ebbf02"/>
<path
android:pathData="M156.1,287.61v-52.9a8.19,8.19 0,0 0,-8.19 -8.19v69.29A8.2,8.2 0,0 0,156.1 287.61Z"
android:fillColor="#ebbf02"/>
<path
android:pathData="M215.09,203.49a8.2,8.2 0,0 0,-11.6 11.6l37.41,37.4a8.2,8.2 0,0 0,11.59 -11.59Z"
android:fillColor="#ebbf02"/>
<path
android:pathData="M287.61,139.71h-52.9a8.2,8.2 0,0 0,0 16.39h52.9a8.2,8.2 0,1 0,0 -16.39Z"
android:fillColor="#ebbf02"/>
<path
android:pathData="M209.29,94.72a8.18,8.18 0,0 0,5.8 -2.4l37.4,-37.4a8.2,8.2 0,0 0,-11.59 -11.6L203.49,80.73a8.2,8.2 0,0 0,5.8 14Z"
android:fillColor="#ebbf02"/>
</vector>

View file

@ -0,0 +1,73 @@
<vector xmlns:android="http://schemas.android.com/apk/res/android"
android:width="317.28dp"
android:height="241.65dp"
android:viewportWidth="317.28"
android:viewportHeight="241.65">
<path
android:fillColor="#FF000000"
android:pathData="M271.2,149.1A77,77 0,0 0,152.42 88.69a46.67,46.67 0,0 0,-37.88 -19.37h0a46.74,46.74 0,0 0,-46 55,56.91 56.91,0 0,0 -11.46,34.33 58.38,58.38 0,0 0,0.39 6.52l-0.19,0.19a39,39 0,0 0,-5.66 -0.42,38.35 38.35,0 0,0 0,76.69H271a46.28,46.28 0,0 0,0.2 -92.55Z"
android:strokeAlpha="0.2"
android:fillAlpha="0.2"/>
<path
android:fillColor="#FF000000"
android:pathData="M114.54,62.24a5.61,5.61 0,0 0,5.61 -5.61V20.41a5.61,5.61 0,1 0,-11.22 0V56.63A5.61,5.61 0,0 0,114.54 62.24Z"
android:strokeAlpha="0.2"
android:fillAlpha="0.2"/>
<path
android:fillColor="#FF000000"
android:pathData="M68.55,78a5.61,5.61 0,0 0,7.93 -7.94L50.87,44.46a5.61,5.61 0,0 0,-7.93 7.94Z"
android:strokeAlpha="0.2"
android:fillAlpha="0.2"/>
<path
android:fillColor="#FF000000"
android:pathData="M18.89,121.68H55.11a5.62,5.62 0,0 0,0 -11.23H18.89a5.62,5.62 0,0 0,0 11.23Z"
android:strokeAlpha="0.2"
android:fillAlpha="0.2"/>
<path
android:fillColor="#FF000000"
android:pathData="M156.56,79.65a5.6,5.6 0,0 0,4 -1.64L186.14,52.4a5.61,5.61 0,0 0,-7.94 -7.94L152.6,70.07a5.61,5.61 0,0 0,4 9.58Z"
android:strokeAlpha="0.2"
android:fillAlpha="0.2"/>
<path
android:pathData="M120.94,90.32A57.08,57.08 0,0 0,44.22 150.6a39.28,39.28 0,0 0,-5.87 -0.44,38.35 38.35,0 1,0 0,76.69H152.77L152,67.17A77.25,77.25 0,0 0,120.94 90.32Z"
android:fillColor="#fff"/>
<path
android:pathData="M257.93,134.3A77,77 0,0 0,152 67.17l0.76,159.68h105a46.28,46.28 0,0 0,0.21 -92.55Z"
android:fillColor="#ebebeb"/>
<path
android:pathData="M54.52,101.26A46.74,46.74 0,0 0,101.26 148V54.52A46.74,46.74 0,0 0,54.52 101.26Z"
android:fillColor="#fdcd02"/>
<path
android:pathData="M95.65,5.61V41.83a5.61,5.61 0,0 0,5.61 5.61V0A5.61,5.61 0,0 0,95.65 5.61Z"
android:fillColor="#fdcd02"/>
<path
android:pathData="M95.65,160.69v36.22a5.61,5.61 0,0 0,5.61 5.61V155.08A5.61,5.61 0,0 0,95.65 160.69Z"
android:fillColor="#fdcd02"/>
<path
android:pathData="M55.27,63.21a5.61,5.61 0,0 0,7.94 -7.94L37.6,29.66a5.61,5.61 0,0 0,-7.94 7.94Z"
android:fillColor="#fdcd02"/>
<path
android:pathData="M47.44,101.26a5.61,5.61 0,0 0,-5.61 -5.61H5.61a5.62,5.62 0,0 0,0 11.23H41.83A5.62,5.62 0,0 0,47.44 101.26Z"
android:fillColor="#fdcd02"/>
<path
android:pathData="M55.27,139.32 L29.66,164.93a5.61,5.61 0,0 0,7.94 7.94l25.61,-25.61a5.61,5.61 0,0 0,-7.94 -7.94Z"
android:fillColor="#fdcd02"/>
<path
android:pathData="M148,101.26a46.74,46.74 0,0 0,-46.74 -46.74h0V148h0A46.73,46.73 0,0 0,148 101.26Z"
android:fillColor="#ebbf02"/>
<path
android:pathData="M106.88,41.83V5.61A5.62,5.62 0,0 0,101.26 0V47.44A5.62,5.62 0,0 0,106.88 41.83Z"
android:fillColor="#ebbf02"/>
<path
android:pathData="M106.88,196.91V160.69a5.62,5.62 0,0 0,-5.62 -5.61v47.44A5.62,5.62 0,0 0,106.88 196.91Z"
android:fillColor="#ebbf02"/>
<path
android:pathData="M147.26,139.32a5.61,5.61 0,0 0,-7.94 7.94l25.61,25.61a5.61,5.61 0,0 0,7.94 -7.94Z"
android:fillColor="#ebbf02"/>
<path
android:pathData="M196.91,95.65H160.69a5.62,5.62 0,0 0,0 11.23h36.22a5.62,5.62 0,0 0,0 -11.23Z"
android:fillColor="#ebbf02"/>
<path
android:pathData="M143.29,64.85a5.64,5.64 0,0 0,4 -1.64L172.87,37.6a5.61,5.61 0,0 0,-7.94 -7.94L139.32,55.27a5.61,5.61 0,0 0,4 9.58Z"
android:fillColor="#ebbf02"/>
</vector>

View file

@ -0,0 +1,118 @@
<vector xmlns:android="http://schemas.android.com/apk/res/android"
android:width="376.36dp"
android:height="303.25dp"
android:viewportWidth="376.36"
android:viewportHeight="303.25">
<path
android:fillColor="#FF000000"
android:pathData="M109.5,263.11l6.24,-17.47a7,7 0,1 0,-13.18 -4.71L96.32,258.4a7,7 0,0 0,4.24 9,6.93 6.93,0 0,0 2.35,0.41A7,7 0,0 0,109.5 263.11Z"
android:strokeAlpha="0.2"
android:fillAlpha="0.2"/>
<path
android:fillColor="#FF000000"
android:pathData="M122.9,272.18a7,7 0,0 0,-8.94 4.24l-6.24,17.47a7,7 0,0 0,4.23 8.95,7.19 7.19,0 0,0 2.36,0.41 7,7 0,0 0,6.59 -4.65l6.24,-17.48A7,7 0,0 0,122.9 272.18Z"
android:strokeAlpha="0.2"
android:fillAlpha="0.2"/>
<path
android:fillColor="#FF000000"
android:pathData="M164.19,272.18a7,7 0,0 0,-8.94 4.24L149,293.89a7,7 0,0 0,4.24 8.95,7.19 7.19,0 0,0 2.36,0.41 7,7 0,0 0,6.59 -4.65l6.24,-17.48A7,7 0,0 0,164.19 272.18Z"
android:strokeAlpha="0.2"
android:fillAlpha="0.2"/>
<path
android:fillColor="#FF000000"
android:pathData="M150.59,263.11l6.24,-17.47a7,7 0,1 0,-13.19 -4.71L137.4,258.4a7,7 0,0 0,4.24 9,6.93 6.93,0 0,0 2.35,0.41A7,7 0,0 0,150.59 263.11Z"
android:strokeAlpha="0.2"
android:fillAlpha="0.2"/>
<path
android:fillColor="#FF000000"
android:pathData="M193.67,236.69a7,7 0,0 0,-8.94 4.24l-6.24,17.47a7,7 0,1 0,13.18 4.71l6.24,-17.47A7,7 0,0 0,193.67 236.69Z"
android:strokeAlpha="0.2"
android:fillAlpha="0.2"/>
<path
android:fillColor="#FF000000"
android:pathData="M278.65,59.51a5.42,5.42 0,0 0,5.42 -5.42V19.15a5.42,5.42 0,1 0,-10.83 0V54.09A5.42,5.42 0,0 0,278.65 59.51Z"
android:strokeAlpha="0.2"
android:fillAlpha="0.2"/>
<path
android:fillColor="#FF000000"
android:pathData="M234.28,74.72a5.42,5.42 0,1 0,7.66 -7.66L217.23,42.35A5.42,5.42 0,1 0,209.57 50Z"
android:strokeAlpha="0.2"
android:fillAlpha="0.2"/>
<path
android:fillColor="#FF000000"
android:pathData="M323.75,111.43a45.1,45.1 0,0 0,-45.1 -45.09h0a45.12,45.12 0,0 0,-41.82 28.22,72.69 72.69,0 0,0 -110.9,3 53.88,53.88 0,0 0,-72.42 56.91,36.2 36.2,0 1,0 -5.54,72H255.05a43.67,43.67 0,0 0,34 -71.08A45.1,45.1 0,0 0,323.75 111.43Z"
android:strokeAlpha="0.2"
android:fillAlpha="0.2"/>
<path
android:fillColor="#FF000000"
android:pathData="M323,148.15a5.42,5.42 0,0 0,-7.66 7.66l24.71,24.71a5.42,5.42 0,0 0,7.66 -7.66Z"
android:strokeAlpha="0.2"
android:fillAlpha="0.2"/>
<path
android:fillColor="#FF000000"
android:pathData="M370.94,106H336a5.42,5.42 0,1 0,0 10.83h34.94a5.42,5.42 0,1 0,0 -10.83Z"
android:strokeAlpha="0.2"
android:fillAlpha="0.2"/>
<path
android:fillColor="#FF000000"
android:pathData="M319.2,76.3A5.42,5.42 0,0 0,323 74.72L347.74,50a5.42,5.42 0,0 0,-7.66 -7.66L315.37,67.06a5.41,5.41 0,0 0,3.83 9.24Z"
android:strokeAlpha="0.2"
android:fillAlpha="0.2"/>
<path
android:pathData="M91.14,254a7,7 0,0 1,-6.59 -9.35l6.24,-17.48A7,7 0,0 1,104 231.9l-6.24,17.48A7,7 0,0 1,91.14 254Z"
android:fillColor="#78d9ff"/>
<path
android:pathData="M102.54,289.51A7,7 0,0 1,96 280.16l6.24,-17.48a7,7 0,0 1,13.18 4.71l-6.24,17.48A7,7 0,0 1,102.54 289.51Z"
android:fillColor="#78d9ff"/>
<path
android:pathData="M143.83,289.51a7,7 0,0 1,-6.6 -9.35l6.25,-17.48a7,7 0,0 1,13.18 4.71l-6.24,17.48A7,7 0,0 1,143.83 289.51Z"
android:fillColor="#78d9ff"/>
<path
android:pathData="M132.22,254a7,7 0,0 1,-6.59 -9.35l6.24,-17.48a7,7 0,0 1,13.19 4.71l-6.24,17.48A7,7 0,0 1,132.22 254Z"
android:fillColor="#78d9ff"/>
<path
android:pathData="M173.31,254a7,7 0,0 1,-6.59 -9.35L173,227.19a7,7 0,0 1,13.18 4.71l-6.24,17.48A7,7 0,0 1,173.31 254Z"
android:fillColor="#78d9ff"/>
<path
android:pathData="M221.79,97.7a45.1,45.1 0,0 0,45.09 45.1V52.6A45.1,45.1 0,0 0,221.79 97.7Z"
android:fillColor="#fdcd02"/>
<path
android:pathData="M261.47,5.42V40.36a5.41,5.41 0,0 0,5.41 5.41V0A5.41,5.41 0,0 0,261.47 5.42Z"
android:fillColor="#fdcd02"/>
<path
android:pathData="M261.47,155V190a5.41,5.41 0,0 0,5.41 5.42V149.63A5.41,5.41 0,0 0,261.47 155Z"
android:fillColor="#fdcd02"/>
<path
android:pathData="M222.51,61a5.42,5.42 0,0 0,7.66 -7.66l-24.71,-24.7a5.41,5.41 0,1 0,-7.66 7.65Z"
android:fillColor="#fdcd02"/>
<path
android:pathData="M215,97.7a5.42,5.42 0,0 0,-5.42 -5.42H174.6a5.42,5.42 0,1 0,0 10.84h34.94A5.42,5.42 0,0 0,215 97.7Z"
android:fillColor="#fdcd02"/>
<path
android:pathData="M222.51,134.42 L197.8,159.13a5.41,5.41 0,1 0,7.66 7.65l24.71,-24.7a5.42,5.42 0,0 0,-7.66 -7.66Z"
android:fillColor="#fdcd02"/>
<path
android:pathData="M312,97.7a45.1,45.1 0,0 0,-45.09 -45.1h0v90.2h0A45.1,45.1 0,0 0,312 97.7Z"
android:fillColor="#ebbf02"/>
<path
android:pathData="M272.3,40.36V5.42A5.41,5.41 0,0 0,266.88 0V45.77A5.41,5.41 0,0 0,272.3 40.36Z"
android:fillColor="#ebbf02"/>
<path
android:pathData="M272.3,190V155a5.41,5.41 0,0 0,-5.42 -5.41V195.4A5.41,5.41 0,0 0,272.3 190Z"
android:fillColor="#ebbf02"/>
<path
android:pathData="M311.26,134.42a5.42,5.42 0,0 0,-7.66 7.66l24.71,24.7a5.41,5.41 0,0 0,7.66 -7.65Z"
android:fillColor="#ebbf02"/>
<path
android:pathData="M359.17,92.28H324.23a5.42,5.42 0,0 0,0 10.84h34.94a5.42,5.42 0,0 0,0 -10.84Z"
android:fillColor="#ebbf02"/>
<path
android:pathData="M307.43,62.57A5.39,5.39 0,0 0,311.26 61L336,36.27a5.41,5.41 0,0 0,-7.66 -7.65L303.6,53.32a5.42,5.42 0,0 0,3.83 9.25Z"
android:fillColor="#ebbf02"/>
<path
android:pathData="M114.16,83.78a53.87,53.87 0,0 0,-72.42 56.9,36.2 36.2,0 1,0 -5.54,72H143.48V61.93A72.89,72.89 0,0 0,114.16 83.78Z"
android:fillColor="#fff"/>
<path
android:pathData="M243.47,125.29a72.68,72.68 0,0 0,-100 -63.36V212.65h99.8a43.68,43.68 0,0 0,0.19 -87.36Z"
android:fillColor="#ebebeb"/>
</vector>

View file

@ -0,0 +1,26 @@
<vector xmlns:android="http://schemas.android.com/apk/res/android"
android:width="326.99dp"
android:height="255.76dp"
android:viewportWidth="326.99"
android:viewportHeight="255.76">
<path
android:fillColor="#FF000000"
android:pathData="M278.93,90.92A80.31,80.31 0,0 0,136.06 45.05,59.64 59.64,0 0,0 55.61,100.9a60.45,60.45 0,0 0,0.42 7,40 40,0 1,0 -6.12,79.52H138c-1.12,3 -2.2,6 -3.19,9 -1.26,3.86 -2.41,7.78 -3.41,11.78A105.4,105.4 0,0 0,129 220.55a105.41,105.41 0,0 0,8.35 -9.33c2.58,-3.21 5,-6.49 7.34,-9.82 3.17,-4.55 6.13,-9.21 8.94,-14h17.92v13.33l19.35,0.69q4.13,0.15 8.25,0.21 3.39,0 6.78,0 -3.27,8.45 -6.1,17.1c-1.93,5.93 -3.7,11.95 -5.23,18.08a160.7,160.7 0,0 0,-3.7 18.85,161.68 161.68,0 0,0 12.81,-14.32c4,-4.92 7.7,-9.95 11.27,-15.07a357.33,357.33 0,0 0,19.59 -31.62l4,-7.3h40.15a48.27,48.27 0,0 0,0.21 -96.53Z"
android:strokeAlpha="0.2"
android:fillAlpha="0.2"/>
<path
android:pathData="M269,75.94A80.38,80.38 0,0 0,161.6 4.73V172.47h6.85l1.61,-3.12a367.89,367.89 0,0 1,19.53 -33.73c3.59,-5.46 7.35,-10.85 11.36,-16.11a167.46,167.46 0,0 1,13 -15.34,164.31 164.31,0 0,1 -3.5,19.8c-1.49,6.45 -3.22,12.79 -5.14,19 -2,6.48 -4.17,12.86 -6.52,19.17q3.45,0 6.91,0.1c2.75,0.07 5.5,0.14 8.25,0.27l19.66,0.92 -5,9h40.16A48.27,48.27 0,0 0,269 75.94Z"
android:fillColor="#ebebeb"/>
<path
android:pathData="M126.14,30.07A59.61,59.61 0,0 0,45.69 85.92a58.33,58.33 0,0 0,0.43 7A40,40 0,1 0,40 172.47h88.06c0.26,-0.7 0.51,-1.41 0.78,-2.11l-4.41,0c-1.79,0 -3.59,-0.07 -5.38,-0.14l-12.61,-0.45L112,159a241.17,241.17 0,0 1,12.72 -22c2.34,-3.56 4.79,-7.07 7.4,-10.5a111.39,111.39 0,0 1,8.48 -10,107.35 107.35,0 0,1 -2.28,12.91c-1,4.2 -2.1,8.33 -3.35,12.4s-2.72,8.38 -4.25,12.49c1.5,0 3,0 4.5,0.07 1.8,0 3.59,0.09 5.38,0.17l12.81,0.61 -5.86,10.61q-1.86,3.36 -3.83,6.66H161.6V4.73A80.51,80.51 0,0 0,126.14 30.07Z"
android:fillColor="#fff"/>
<path
android:pathData="M214,162.55c-2.75,-0.13 -5.5,-0.2 -8.25,-0.27q-3.47,-0.09 -6.91,-0.1c2.35,-6.31 4.54,-12.69 6.52,-19.17 1.92,-6.25 3.65,-12.59 5.14,-19a164.31,164.31 0,0 0,3.5 -19.8,167.46 167.46,0 0,0 -13,15.34c-4,5.26 -7.77,10.65 -11.36,16.11a367.89,367.89 0,0 0,-19.53 33.73l-1.61,3.12 -6.85,13.32 19.35,0.7q4.13,0.15 8.25,0.21 3.39,0 6.78,0.05 -3.27,8.44 -6.1,17.09c-1.93,5.94 -3.69,12 -5.23,18.09a160.94,160.94 0,0 0,-3.7 18.84,163 163,0 0,0 12.81,-14.31c4,-4.92 7.7,-10 11.27,-15.07a358.79,358.79 0,0 0,19.59 -31.62l4,-7.3 5,-9Z"
android:fillColor="#ebbf02"/>
<path
android:pathData="M124.87,181.5c-1.26,3.87 -2.41,7.79 -3.41,11.78a105.81,105.81 0,0 0,-2.41 12.28,105.3 105.3,0 0,0 8.35,-9.32c2.58,-3.21 5,-6.49 7.34,-9.82q4.75,-6.84 8.94,-13.95H128.06C126.94,175.45 125.86,178.46 124.87,181.5Z"
android:fillColor="#fdcd02"/>
<path
android:pathData="M153.37,155.2l-12.81,-0.61c-1.79,-0.08 -3.58,-0.13 -5.38,-0.17 -1.5,0 -3,-0.06 -4.5,-0.07 1.53,-4.11 3,-8.27 4.25,-12.49s2.38,-8.2 3.35,-12.4a107.35,107.35 0,0 0,2.28 -12.91,111.39 111.39,0 0,0 -8.48,10c-2.61,3.43 -5.06,6.94 -7.4,10.5A241.17,241.17 0,0 0,112 159l-5.52,10.72 12.61,0.45c1.79,0.07 3.59,0.11 5.38,0.14l4.41,0c-0.27,0.7 -0.52,1.41 -0.78,2.11h15.62q2,-3.3 3.83,-6.66Z"
android:fillColor="#fdcd02"/>
</vector>

View file

@ -0,0 +1,23 @@
<vector xmlns:android="http://schemas.android.com/apk/res/android"
android:width="342.01dp"
android:height="222.41dp"
android:viewportWidth="342.01"
android:viewportHeight="222.41">
<path
android:fillColor="#FF000000"
android:pathData="M342,120.56a41.35,41.35 0,0 0,-41.17 -41.35,68.81 68.81,0 0,0 -122.4,-39.29 51.05,51.05 0,0 0,-68.89 46.9,55.33 55.33,0 0,0 -52.91,55.26 56.08,56.08 0,0 0,0.4 6.52,38 38,0 0,0 -5.68,-0.43 37.12,37.12 0,0 0,0 74.24H263.71a44.81,44.81 0,0 0,41.85 -60.8A41.35,41.35 0,0 0,342 120.56Z"
android:strokeAlpha="0.2"
android:fillAlpha="0.2"/>
<path
android:pathData="M286.6,65.06A68.84,68.84 0,0 0,192 5.06V147.75h94.46a41.35,41.35 0,0 0,0.18 -82.69Z"
android:fillColor="#c2c2c2"/>
<path
android:pathData="M164.21,25.76A51.08,51.08 0,0 0,95.28 73.6a52.2,52.2 0,0 0,0.37 6,33.62 33.62,0 0,0 -5.25,-0.4 34.26,34.26 0,0 0,0 68.52H192V5.06A69.1,69.1 0,0 0,164.21 25.76Z"
android:fillColor="#d4d4d4"/>
<path
android:pathData="M249.67,118.66a74.56,74.56 0,0 0,-102.53 -65V208.25H249.48a44.8,44.8 0,0 0,0.19 -89.59Z"
android:fillColor="#ebebeb"/>
<path
android:pathData="M117.07,76.09A55.35,55.35 0,0 0,42.4 127.92a56.39,56.39 0,0 0,0.4 6.53,36.69 36.69,0 0,0 -5.68,-0.44 37.12,37.12 0,0 0,0 74.24h110V53.67A74.75,74.75 0,0 0,117.07 76.09Z"
android:fillColor="#fff"/>
</vector>

View file

@ -0,0 +1,9 @@
<vector xmlns:android="http://schemas.android.com/apk/res/android"
android:width="277.86dp"
android:height="199.81dp"
android:viewportWidth="277.86"
android:viewportHeight="199.81">
<path
android:fillColor="#FF000000"
android:pathData="M277.86,57.76c0,27.69 -26.67,48.39 -50.53,48.39L50,106.15a3.12,3.12 0,0 1,0 -6.24L227.33,99.91c20.48,0 44.29,-18.42 44.29,-42.15 0,-23.24 -17.06,-42.15 -38,-42.15 -13.64,0 -25.89,10.36 -32.79,27.72A3.12,3.12 0,1 1,195 41c7.87,-19.82 22.3,-31.65 38.59,-31.65C258,9.37 277.86,31.07 277.86,57.76ZM237.28,93.66a3,3 0,0 0,1.14 -0.22C252,88.06 260,80.06 265.17,66.68a3.12,3.12 0,0 0,-5.83 -2.24c-4.51,11.74 -11.23,18.46 -23.21,23.2a3.12,3.12 0,0 0,1.15 6ZM122.8,125.06a3.13,3.13 0,0 0,-0.87 -0.18L34.34,124.88a3.13,3.13 0,0 0,0 6.25h84.59c18.77,0 34,13.3 34,29.66 0,15.47 -14.56,32.78 -34,32.78 -13.79,0 -25.44,-10.15 -30.85,-20.22a3.13,3.13 0,0 0,-5.5 3c6.3,11.69 20,23.49 36.35,23.49 21.46,0 40.3,-18.23 40.3,-39C159.23,142.15 143.21,126.8 122.8,125.06ZM12.8,78.06a3.12,3.12 0,0 0,3.13 3.12h76.8a3,3 0,0 0,0.61 -0.12c18,-1.24 37.8,-16 37.8,-34.8s-18,-36.88 -37,-36.88c-12.83,0 -27.36,9.71 -33.08,22.1a3.12,3.12 0,0 0,5.67 2.62c4.7,-10.19 17,-18.48 27.41,-18.48 15.52,0 30.75,15.18 30.75,30.64 0,15.89 -18.6,28.68 -34,28.68h-75A3.13,3.13 0,0 0,12.79 78.05ZM108.64,6.18C120.73,8.69 135,23 137.43,35a3.13,3.13 0,0 0,3.06 2.5,3.52 3.52,0 0,0 0.63,-0.06 3.12,3.12 0,0 0,2.43 -3.68C140.65,19.42 124.3,3.06 109.91,0.06a3.13,3.13 0,1 0,-1.27 6.12ZM215.52,168.59c-7.34,0 -16,-6.1 -19.36,-13.6a3.12,3.12 0,1 0,-5.71 2.53c4.39,9.87 15.17,17.32 25.07,17.32 14.39,0 28,-14 28,-28.85s-15,-26.29 -28.57,-27.26a3.55,3.55 0,0 0,-0.47 -0.09L196.69,118.64a3.12,3.12 0,0 0,0 6.24h16.45c10.86,0 24.14,9.74 24.14,21.11S226.5,168.59 215.52,168.59ZM184.2,118.64h-3.12a3.12,3.12 0,0 0,0 6.24h3.12a3.12,3.12 0,0 0,0 -6.24ZM168.59,118.64h-15.3a3.12,3.12 0,1 0,0 6.24h15.3a3.12,3.12 0,0 0,0 -6.24ZM37.46,99.91L34.34,99.91a3.12,3.12 0,0 0,0 6.24h3.12a3.12,3.12 0,1 0,0 -6.24ZM25,103a3.12,3.12 0,0 0,-3.13 -3.12L3.12,99.88a3.12,3.12 0,0 0,0 6.24L21.85,106.12A3.13,3.13 0,0 0,25 103ZM43.73,137.34a3.13,3.13 0,0 0,0 6.25L78.05,143.59a3.13,3.13 0,0 0,0 -6.25Z"/>
</vector>

View file

@ -0,0 +1,41 @@
<vector xmlns:android="http://schemas.android.com/apk/res/android"
android:width="344.35dp"
android:height="176.07dp"
android:viewportWidth="344.35"
android:viewportHeight="176.07">
<path
android:pathData="M297.43,102q-0.72,-0.84 -1.47,-1.65A3.2,3.2 0,0 0,297.43 102Z"
android:fillColor="#78d9ff"/>
<path
android:fillColor="#FF000000"
android:pathData="M327.45,131.29L308.11,131.29v-0.24a44.81,44.81 0,0 0,-0.78 -8.33L312,122.72a20.08,20.08 0,1 0,0 -40.15,16.28 16.28,0 0,0 -16.26,16.27v0.31a3.14,3.14 0,0 0,0.22 1.15A44.87,44.87 0,0 0,263.29 86,74.93 74.93,0 0,0 130,43.24 55.63,55.63 0,0 0,55 95.33a56.78,56.78 0,0 0,0.4 6.56,37.31 37.31,0 1,0 -5.71,74.18L263.09,176.07a45,45 0,0 0,44.53 -38.41h19.83a10.52,10.52 0,1 1,0 21,3.19 3.19,0 0,0 0,6.38 16.9,16.9 0,1 0,0 -33.79ZM297.45,101.95A3.2,3.2 0,0 1,296 100.3q0.75,0.81 1.47,1.65a3.15,3.15 0,0 0,1.49 0.39,3.19 3.19,0 0,0 3.19,-3.19v-0.31A9.91,9.91 0,0 1,312 89a13.7,13.7 0,0 1,0 27.4h-6.35A45,45 0,0 0,297.43 102Z"
android:strokeAlpha="0.2"
android:fillAlpha="0.2"/>
<path
android:pathData="M117.66,28.05a55.62,55.62 0,0 0,-75 52.09A54.63,54.63 0,0 0,43 86.7a37.31,37.31 0,1 0,-5.71 74.18H147.88V5.53A75.21,75.21 0,0 0,117.66 28.05Z"
android:fillColor="#fff"/>
<path
android:pathData="M209.68,119.28a3.18,3.18 0,0 1,3.19 -3.18h82.88c0,-0.08 0,-0.16 0,-0.24a45.68,45.68 0,0 0,-0.78 -8.33L191.14,107.53a3.19,3.19 0,0 1,0 -6.37L293.29,101.16a44.79,44.79 0,0 0,-8.21 -14.4,3.16 3.16,0 0,1 -1.47,-1.65 44.89,44.89 0,0 0,-32.68 -14.27,74.91 74.91,0 0,0 -103,-65.31L147.93,160.88L250.74,160.88a45,45 0,0 0,44.53 -38.41h-82.4A3.19,3.19 0,0 1,209.68 119.28ZM182.58,90.71a3.19,3.19 0,0 1,3.18 -3.19h85.08a3.19,3.19 0,0 1,0 6.37L185.76,93.89A3.18,3.18 0,0 1,182.58 90.71ZM279.33,143.32a13.43,13.43 0,0 1,-13.42 13.41,11.12 11.12,0 0,1 -11.11,-11.11v-0.18a3.19,3.19 0,1 1,6.37 0v0.18a4.74,4.74 0,0 0,4.74 4.74,7 7,0 1,0 0,-14.09L200.16,136.27a3.19,3.19 0,0 1,0 -6.37h65.75A13.43,13.43 0,0 1,279.33 143.32Z"
android:fillColor="#ebebeb"/>
<path
android:pathData="M286.57,87.15A3.19,3.19 0,0 0,289.76 84v-0.31a9.9,9.9 0,0 1,9.89 -9.89,13.7 13.7,0 1,1 0,27.4h-6.36a43.88,43.88 0,0 1,1.69 6.37h4.67a20.08,20.08 0,1 0,0 -40.15,16.28 16.28,0 0,0 -16.26,16.27V84a3.14,3.14 0,0 0,0.22 1.15q0.75,0.81 1.47,1.65A3.15,3.15 0,0 0,286.57 87.15Z"
android:fillColor="#78d9ff"/>
<path
android:pathData="M191.14,101.16a3.19,3.19 0,0 0,0 6.37H295a43.88,43.88 0,0 0,-1.69 -6.37Z"
android:fillColor="#78d9ff"/>
<path
android:pathData="M285.08,86.76q-0.72,-0.84 -1.47,-1.65A3.16,3.16 0,0 0,285.08 86.76Z"
android:fillColor="#78d9ff"/>
<path
android:pathData="M197,133.08a3.18,3.18 0,0 0,3.18 3.19h65.75a7,7 0,1 1,0 14.09,4.74 4.74,0 0,1 -4.74,-4.74v-0.18a3.19,3.19 0,1 0,-6.37 0v0.18a11.12,11.12 0,0 0,11.11 11.11,13.42 13.42,0 1,0 0,-26.83H200.16A3.18,3.18 0,0 0,197 133.08Z"
android:fillColor="#78d9ff"/>
<path
android:pathData="M274,90.71a3.18,3.18 0,0 0,-3.18 -3.19H185.76a3.19,3.19 0,0 0,0 6.37h85.08A3.18,3.18 0,0 0,274 90.71Z"
android:fillColor="#78d9ff"/>
<path
android:pathData="M315.1,116.1H295.75a44.63,44.63 0,0 1,-0.48 6.37H315.1a10.52,10.52 0,0 1,0 21,3.19 3.19,0 1,0 0,6.38 16.9,16.9 0,1 0,0 -33.79Z"
android:fillColor="#78d9ff"/>
<path
android:pathData="M212.87,116.1a3.19,3.19 0,1 0,0 6.37h82.4a44.63,44.63 0,0 0,0.48 -6.37Z"
android:fillColor="#78d9ff"/>
</vector>

View file

@ -0,0 +1,5 @@
<?xml version="1.0" encoding="utf-8"?>
<adaptive-icon xmlns:android="http://schemas.android.com/apk/res/android">
<background android:drawable="@drawable/ic_launcher_background" />
<foreground android:drawable="@drawable/ic_launcher_foreground" />
</adaptive-icon>

View file

@ -0,0 +1,5 @@
<?xml version="1.0" encoding="utf-8"?>
<adaptive-icon xmlns:android="http://schemas.android.com/apk/res/android">
<background android:drawable="@drawable/ic_launcher_background" />
<foreground android:drawable="@drawable/ic_launcher_foreground" />
</adaptive-icon>

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.4 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.8 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 982 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.7 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.9 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 3.8 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.8 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 5.8 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 3.8 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 7.6 KiB

View file

@ -0,0 +1,3 @@
<resources>
<string name="app_name">QWeather</string>
</resources>

View file

@ -0,0 +1,5 @@
<?xml version="1.0" encoding="utf-8"?>
<resources>
<style name="Theme.WeatherApp" parent="android:Theme.Material.Light.NoActionBar" />
</resources>

5
build.gradle.kts Normal file
View file

@ -0,0 +1,5 @@
plugins {
id("com.android.application") version "7.4.1" apply false
id("com.android.library") version "7.4.1" apply false
id("org.jetbrains.kotlin.android") version "1.8.10" apply false
}

23
gradle.properties Normal file
View file

@ -0,0 +1,23 @@
# Project-wide Gradle settings.
# IDE (e.g. Android Studio) users:
# Gradle settings configured through the IDE *will override*
# any settings specified in this file.
# For more details on how to configure your build environment visit
# http://www.gradle.org/docs/current/userguide/build_environment.html
# Specifies the JVM arguments used for the daemon process.
# The setting is particularly useful for tweaking memory settings.
org.gradle.jvmargs=-Xmx2048m -Dfile.encoding=UTF-8
# When configured, Gradle will run in incubating parallel mode.
# This option should only be used with decoupled projects. More details, visit
# http://www.gradle.org/docs/current/userguide/multi_project_builds.html#sec:decoupled_projects
# org.gradle.parallel=true
# AndroidX package structure to make it clearer which packages are bundled with the
# Android operating system, and which are packaged with your app"s APK
# https://developer.android.com/topic/libraries/support-library/androidx-rn
android.useAndroidX=true
# Kotlin code style for this project: "official" or "obsolete":
kotlin.code.style=official
# Enables namespacing of each library's R class so that its R class includes only the
# resources declared in the library itself and none from the library's dependencies,
# thereby reducing the size of the R class for that library
android.nonTransitiveRClass=true

BIN
gradle/wrapper/gradle-wrapper.jar vendored Normal file

Binary file not shown.

View file

@ -0,0 +1,6 @@
#Sun Jun 26 11:26:31 CEST 2022
distributionBase=GRADLE_USER_HOME
distributionUrl=https\://services.gradle.org/distributions/gradle-7.5-bin.zip
distributionPath=wrapper/dists
zipStorePath=wrapper/dists
zipStoreBase=GRADLE_USER_HOME

185
gradlew vendored Executable file
View file

@ -0,0 +1,185 @@
#!/usr/bin/env sh
#
# Copyright 2015 the original author or authors.
#
# Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License.
# You may obtain a copy of the License at
#
# https://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS,
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# See the License for the specific language governing permissions and
# limitations under the License.
#
##############################################################################
##
## Gradle start up script for UN*X
##
##############################################################################
# Attempt to set APP_HOME
# Resolve links: $0 may be a link
PRG="$0"
# Need this for relative symlinks.
while [ -h "$PRG" ] ; do
ls=`ls -ld "$PRG"`
link=`expr "$ls" : '.*-> \(.*\)$'`
if expr "$link" : '/.*' > /dev/null; then
PRG="$link"
else
PRG=`dirname "$PRG"`"/$link"
fi
done
SAVED="`pwd`"
cd "`dirname \"$PRG\"`/" >/dev/null
APP_HOME="`pwd -P`"
cd "$SAVED" >/dev/null
APP_NAME="Gradle"
APP_BASE_NAME=`basename "$0"`
# Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script.
DEFAULT_JVM_OPTS='"-Xmx64m" "-Xms64m"'
# Use the maximum available, or set MAX_FD != -1 to use that value.
MAX_FD="maximum"
warn () {
echo "$*"
}
die () {
echo
echo "$*"
echo
exit 1
}
# OS specific support (must be 'true' or 'false').
cygwin=false
msys=false
darwin=false
nonstop=false
case "`uname`" in
CYGWIN* )
cygwin=true
;;
Darwin* )
darwin=true
;;
MINGW* )
msys=true
;;
NONSTOP* )
nonstop=true
;;
esac
CLASSPATH=$APP_HOME/gradle/wrapper/gradle-wrapper.jar
# Determine the Java command to use to start the JVM.
if [ -n "$JAVA_HOME" ] ; then
if [ -x "$JAVA_HOME/jre/sh/java" ] ; then
# IBM's JDK on AIX uses strange locations for the executables
JAVACMD="$JAVA_HOME/jre/sh/java"
else
JAVACMD="$JAVA_HOME/bin/java"
fi
if [ ! -x "$JAVACMD" ] ; then
die "ERROR: JAVA_HOME is set to an invalid directory: $JAVA_HOME
Please set the JAVA_HOME variable in your environment to match the
location of your Java installation."
fi
else
JAVACMD="java"
which java >/dev/null 2>&1 || die "ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH.
Please set the JAVA_HOME variable in your environment to match the
location of your Java installation."
fi
# Increase the maximum file descriptors if we can.
if [ "$cygwin" = "false" -a "$darwin" = "false" -a "$nonstop" = "false" ] ; then
MAX_FD_LIMIT=`ulimit -H -n`
if [ $? -eq 0 ] ; then
if [ "$MAX_FD" = "maximum" -o "$MAX_FD" = "max" ] ; then
MAX_FD="$MAX_FD_LIMIT"
fi
ulimit -n $MAX_FD
if [ $? -ne 0 ] ; then
warn "Could not set maximum file descriptor limit: $MAX_FD"
fi
else
warn "Could not query maximum file descriptor limit: $MAX_FD_LIMIT"
fi
fi
# For Darwin, add options to specify how the application appears in the dock
if $darwin; then
GRADLE_OPTS="$GRADLE_OPTS \"-Xdock:name=$APP_NAME\" \"-Xdock:icon=$APP_HOME/media/gradle.icns\""
fi
# For Cygwin or MSYS, switch paths to Windows format before running java
if [ "$cygwin" = "true" -o "$msys" = "true" ] ; then
APP_HOME=`cygpath --path --mixed "$APP_HOME"`
CLASSPATH=`cygpath --path --mixed "$CLASSPATH"`
JAVACMD=`cygpath --unix "$JAVACMD"`
# We build the pattern for arguments to be converted via cygpath
ROOTDIRSRAW=`find -L / -maxdepth 1 -mindepth 1 -type d 2>/dev/null`
SEP=""
for dir in $ROOTDIRSRAW ; do
ROOTDIRS="$ROOTDIRS$SEP$dir"
SEP="|"
done
OURCYGPATTERN="(^($ROOTDIRS))"
# Add a user-defined pattern to the cygpath arguments
if [ "$GRADLE_CYGPATTERN" != "" ] ; then
OURCYGPATTERN="$OURCYGPATTERN|($GRADLE_CYGPATTERN)"
fi
# Now convert the arguments - kludge to limit ourselves to /bin/sh
i=0
for arg in "$@" ; do
CHECK=`echo "$arg"|egrep -c "$OURCYGPATTERN" -`
CHECK2=`echo "$arg"|egrep -c "^-"` ### Determine if an option
if [ $CHECK -ne 0 ] && [ $CHECK2 -eq 0 ] ; then ### Added a condition
eval `echo args$i`=`cygpath --path --ignore --mixed "$arg"`
else
eval `echo args$i`="\"$arg\""
fi
i=`expr $i + 1`
done
case $i in
0) set -- ;;
1) set -- "$args0" ;;
2) set -- "$args0" "$args1" ;;
3) set -- "$args0" "$args1" "$args2" ;;
4) set -- "$args0" "$args1" "$args2" "$args3" ;;
5) set -- "$args0" "$args1" "$args2" "$args3" "$args4" ;;
6) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" ;;
7) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" ;;
8) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" "$args7" ;;
9) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" "$args7" "$args8" ;;
esac
fi
# Escape application args
save () {
for i do printf %s\\n "$i" | sed "s/'/'\\\\''/g;1s/^/'/;\$s/\$/' \\\\/" ; done
echo " "
}
APP_ARGS=`save "$@"`
# Collect all arguments for the java command, following the shell quoting and substitution rules
eval set -- $DEFAULT_JVM_OPTS $JAVA_OPTS $GRADLE_OPTS "\"-Dorg.gradle.appname=$APP_BASE_NAME\"" -classpath "\"$CLASSPATH\"" org.gradle.wrapper.GradleWrapperMain "$APP_ARGS"
exec "$JAVACMD" "$@"

89
gradlew.bat vendored Normal file
View file

@ -0,0 +1,89 @@
@rem
@rem Copyright 2015 the original author or authors.
@rem
@rem Licensed under the Apache License, Version 2.0 (the "License");
@rem you may not use this file except in compliance with the License.
@rem You may obtain a copy of the License at
@rem
@rem https://www.apache.org/licenses/LICENSE-2.0
@rem
@rem Unless required by applicable law or agreed to in writing, software
@rem distributed under the License is distributed on an "AS IS" BASIS,
@rem WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
@rem See the License for the specific language governing permissions and
@rem limitations under the License.
@rem
@if "%DEBUG%" == "" @echo off
@rem ##########################################################################
@rem
@rem Gradle startup script for Windows
@rem
@rem ##########################################################################
@rem Set local scope for the variables with windows NT shell
if "%OS%"=="Windows_NT" setlocal
set DIRNAME=%~dp0
if "%DIRNAME%" == "" set DIRNAME=.
set APP_BASE_NAME=%~n0
set APP_HOME=%DIRNAME%
@rem Resolve any "." and ".." in APP_HOME to make it shorter.
for %%i in ("%APP_HOME%") do set APP_HOME=%%~fi
@rem Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script.
set DEFAULT_JVM_OPTS="-Xmx64m" "-Xms64m"
@rem Find java.exe
if defined JAVA_HOME goto findJavaFromJavaHome
set JAVA_EXE=java.exe
%JAVA_EXE% -version >NUL 2>&1
if "%ERRORLEVEL%" == "0" goto execute
echo.
echo ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH.
echo.
echo Please set the JAVA_HOME variable in your environment to match the
echo location of your Java installation.
goto fail
:findJavaFromJavaHome
set JAVA_HOME=%JAVA_HOME:"=%
set JAVA_EXE=%JAVA_HOME%/bin/java.exe
if exist "%JAVA_EXE%" goto execute
echo.
echo ERROR: JAVA_HOME is set to an invalid directory: %JAVA_HOME%
echo.
echo Please set the JAVA_HOME variable in your environment to match the
echo location of your Java installation.
goto fail
:execute
@rem Setup the command line
set CLASSPATH=%APP_HOME%\gradle\wrapper\gradle-wrapper.jar
@rem Execute Gradle
"%JAVA_EXE%" %DEFAULT_JVM_OPTS% %JAVA_OPTS% %GRADLE_OPTS% "-Dorg.gradle.appname=%APP_BASE_NAME%" -classpath "%CLASSPATH%" org.gradle.wrapper.GradleWrapperMain %*
:end
@rem End local scope for the variables with windows NT shell
if "%ERRORLEVEL%"=="0" goto mainEnd
:fail
rem Set variable GRADLE_EXIT_CONSOLE if you need the _script_ return code instead of
rem the _cmd.exe /c_ return code!
if not "" == "%GRADLE_EXIT_CONSOLE%" exit 1
exit /b 1
:mainEnd
if "%OS%"=="Windows_NT" endlocal
:omega

16
settings.gradle Normal file
View file

@ -0,0 +1,16 @@
pluginManagement {
repositories {
gradlePluginPortal()
google()
mavenCentral()
}
}
dependencyResolutionManagement {
repositoriesMode.set(RepositoriesMode.FAIL_ON_PROJECT_REPOS)
repositories {
google()
mavenCentral()
}
}
rootProject.name = "WeatherApp"
include ':app'