├── debug.keystore ├── settings.gradle ├── results ├── video.mp4 ├── screenshot_1.png ├── screenshot_2.png ├── screenshot_3.png ├── screenshot_4.png ├── screenshot_5.png └── screenshot_6.png ├── gradle └── wrapper │ ├── gradle-wrapper.jar │ └── gradle-wrapper.properties ├── app ├── src │ ├── main │ │ ├── ic_launcher-playstore.png │ │ ├── res │ │ │ ├── font │ │ │ │ ├── roboto_black.ttf │ │ │ │ ├── roboto_bold.ttf │ │ │ │ ├── roboto_medium.ttf │ │ │ │ └── roboto_regular.ttf │ │ │ ├── mipmap-hdpi │ │ │ │ ├── ic_launcher.png │ │ │ │ └── ic_launcher_round.png │ │ │ ├── mipmap-mdpi │ │ │ │ ├── ic_launcher.png │ │ │ │ └── ic_launcher_round.png │ │ │ ├── mipmap-xhdpi │ │ │ │ ├── ic_launcher.png │ │ │ │ └── ic_launcher_round.png │ │ │ ├── mipmap-xxhdpi │ │ │ │ ├── ic_launcher.png │ │ │ │ └── ic_launcher_round.png │ │ │ ├── mipmap-xxxhdpi │ │ │ │ ├── ic_launcher.png │ │ │ │ └── ic_launcher_round.png │ │ │ ├── values │ │ │ │ ├── ic_launcher_background.xml │ │ │ │ ├── colors.xml │ │ │ │ ├── strings.xml │ │ │ │ └── themes.xml │ │ │ ├── mipmap-anydpi-v26 │ │ │ │ ├── ic_launcher.xml │ │ │ │ └── ic_launcher_round.xml │ │ │ ├── drawable │ │ │ │ ├── ic_settingsn.xml │ │ │ │ ├── ic_settingsd.xml │ │ │ │ ├── ic_searchn.xml │ │ │ │ ├── ic_searchd.xml │ │ │ │ ├── ic_03d.xml │ │ │ │ ├── ic_03n.xml │ │ │ │ ├── ic_04n.xml │ │ │ │ ├── ic_04d.xml │ │ │ │ ├── ic_11n.xml │ │ │ │ ├── ic_11d.xml │ │ │ │ ├── ic_01n.xml │ │ │ │ ├── ic_01d.xml │ │ │ │ ├── ic_02n.xml │ │ │ │ ├── ic_02d.xml │ │ │ │ ├── ic_50n.xml │ │ │ │ ├── ic_50d.xml │ │ │ │ ├── ic_09n.xml │ │ │ │ ├── ic_09d.xml │ │ │ │ ├── ic_10d.xml │ │ │ │ ├── ic_10n.xml │ │ │ │ ├── ic_launcher_foreground.xml │ │ │ │ ├── ic_13n.xml │ │ │ │ └── ic_13d.xml │ │ │ └── values-night │ │ │ │ └── themes.xml │ │ ├── java │ │ │ └── com │ │ │ │ └── example │ │ │ │ └── androiddevchallenge │ │ │ │ ├── domain │ │ │ │ ├── model │ │ │ │ │ ├── City.kt │ │ │ │ │ ├── Weather.kt │ │ │ │ │ ├── FeelsLike.kt │ │ │ │ │ ├── Alert.kt │ │ │ │ │ ├── Temp.kt │ │ │ │ │ ├── WeatherData.kt │ │ │ │ │ ├── Current.kt │ │ │ │ │ ├── Daily.kt │ │ │ │ │ └── WWWeather.kt │ │ │ │ └── GetWeatherData.kt │ │ │ │ ├── presentation │ │ │ │ ├── cb │ │ │ │ │ └── WeatherDataEvent.kt │ │ │ │ └── WeatherViewModel.kt │ │ │ │ ├── ui │ │ │ │ ├── theme │ │ │ │ │ ├── Shape.kt │ │ │ │ │ ├── Color.kt │ │ │ │ │ ├── Type.kt │ │ │ │ │ └── Theme.kt │ │ │ │ ├── MainScreen.kt │ │ │ │ └── SettingsScreen.kt │ │ │ │ ├── data │ │ │ │ └── OpenWeatherAPI.kt │ │ │ │ ├── utils │ │ │ │ ├── SingleLiveEvent.kt │ │ │ │ └── Utils.kt │ │ │ │ └── MainActivity.kt │ │ └── AndroidManifest.xml │ ├── test │ │ └── java │ │ │ └── com │ │ │ └── example │ │ │ └── androiddevchallenge │ │ │ └── ExampleUnitTest.kt │ └── androidTest │ │ └── java │ │ └── com │ │ └── example │ │ └── androiddevchallenge │ │ └── ExampleInstrumentedTest.kt ├── .gitignore ├── proguard-rules.pro └── build.gradle ├── .gitignore ├── spotless └── copyright.kt ├── .github ├── ci-gradle.properties └── workflows │ └── Check.yaml ├── CONTRIBUTING.md ├── gradle.properties ├── README.md ├── gradlew.bat ├── gradlew └── LICENSE /debug.keystore: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/cmota/wwweather/HEAD/debug.keystore -------------------------------------------------------------------------------- /settings.gradle: -------------------------------------------------------------------------------- 1 | rootProject.name = "AndroidDevChallenge" 2 | include ':app' 3 | -------------------------------------------------------------------------------- /results/video.mp4: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/cmota/wwweather/HEAD/results/video.mp4 -------------------------------------------------------------------------------- /results/screenshot_1.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/cmota/wwweather/HEAD/results/screenshot_1.png -------------------------------------------------------------------------------- /results/screenshot_2.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/cmota/wwweather/HEAD/results/screenshot_2.png -------------------------------------------------------------------------------- /results/screenshot_3.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/cmota/wwweather/HEAD/results/screenshot_3.png -------------------------------------------------------------------------------- /results/screenshot_4.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/cmota/wwweather/HEAD/results/screenshot_4.png -------------------------------------------------------------------------------- /results/screenshot_5.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/cmota/wwweather/HEAD/results/screenshot_5.png -------------------------------------------------------------------------------- /results/screenshot_6.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/cmota/wwweather/HEAD/results/screenshot_6.png -------------------------------------------------------------------------------- /gradle/wrapper/gradle-wrapper.jar: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/cmota/wwweather/HEAD/gradle/wrapper/gradle-wrapper.jar -------------------------------------------------------------------------------- /app/src/main/ic_launcher-playstore.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/cmota/wwweather/HEAD/app/src/main/ic_launcher-playstore.png -------------------------------------------------------------------------------- /app/src/main/res/font/roboto_black.ttf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/cmota/wwweather/HEAD/app/src/main/res/font/roboto_black.ttf -------------------------------------------------------------------------------- /app/src/main/res/font/roboto_bold.ttf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/cmota/wwweather/HEAD/app/src/main/res/font/roboto_bold.ttf -------------------------------------------------------------------------------- /app/src/main/res/font/roboto_medium.ttf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/cmota/wwweather/HEAD/app/src/main/res/font/roboto_medium.ttf -------------------------------------------------------------------------------- /app/src/main/res/font/roboto_regular.ttf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/cmota/wwweather/HEAD/app/src/main/res/font/roboto_regular.ttf -------------------------------------------------------------------------------- /app/src/main/res/mipmap-hdpi/ic_launcher.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/cmota/wwweather/HEAD/app/src/main/res/mipmap-hdpi/ic_launcher.png -------------------------------------------------------------------------------- /app/src/main/res/mipmap-mdpi/ic_launcher.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/cmota/wwweather/HEAD/app/src/main/res/mipmap-mdpi/ic_launcher.png -------------------------------------------------------------------------------- /app/src/main/res/mipmap-xhdpi/ic_launcher.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/cmota/wwweather/HEAD/app/src/main/res/mipmap-xhdpi/ic_launcher.png -------------------------------------------------------------------------------- /app/src/main/res/mipmap-xxhdpi/ic_launcher.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/cmota/wwweather/HEAD/app/src/main/res/mipmap-xxhdpi/ic_launcher.png -------------------------------------------------------------------------------- /app/src/main/res/mipmap-xxxhdpi/ic_launcher.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/cmota/wwweather/HEAD/app/src/main/res/mipmap-xxxhdpi/ic_launcher.png -------------------------------------------------------------------------------- /app/src/main/res/mipmap-hdpi/ic_launcher_round.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/cmota/wwweather/HEAD/app/src/main/res/mipmap-hdpi/ic_launcher_round.png -------------------------------------------------------------------------------- /app/src/main/res/mipmap-mdpi/ic_launcher_round.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/cmota/wwweather/HEAD/app/src/main/res/mipmap-mdpi/ic_launcher_round.png -------------------------------------------------------------------------------- /app/src/main/res/mipmap-xhdpi/ic_launcher_round.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/cmota/wwweather/HEAD/app/src/main/res/mipmap-xhdpi/ic_launcher_round.png -------------------------------------------------------------------------------- /app/src/main/res/mipmap-xxhdpi/ic_launcher_round.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/cmota/wwweather/HEAD/app/src/main/res/mipmap-xxhdpi/ic_launcher_round.png -------------------------------------------------------------------------------- /app/src/main/res/mipmap-xxxhdpi/ic_launcher_round.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/cmota/wwweather/HEAD/app/src/main/res/mipmap-xxxhdpi/ic_launcher_round.png -------------------------------------------------------------------------------- /app/src/main/res/values/ic_launcher_background.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | #000000 4 | -------------------------------------------------------------------------------- /app/.gitignore: -------------------------------------------------------------------------------- 1 | # Gradle 2 | .gradle 3 | build/ 4 | 5 | captures 6 | 7 | /local.properties 8 | 9 | # IntelliJ .idea folder 10 | /.idea 11 | *.iml 12 | 13 | # General 14 | .DS_Store 15 | .externalNativeBuild -------------------------------------------------------------------------------- /gradle/wrapper/gradle-wrapper.properties: -------------------------------------------------------------------------------- 1 | #Wed Feb 24 18:05:51 CET 2021 2 | distributionBase=GRADLE_USER_HOME 3 | distributionUrl=https\://services.gradle.org/distributions/gradle-6.8.2-bin.zip 4 | distributionPath=wrapper/dists 5 | zipStorePath=wrapper/dists 6 | zipStoreBase=GRADLE_USER_HOME 7 | -------------------------------------------------------------------------------- /app/src/main/res/mipmap-anydpi-v26/ic_launcher.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | -------------------------------------------------------------------------------- /app/src/main/res/mipmap-anydpi-v26/ic_launcher_round.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/ic_settingsn.xml: -------------------------------------------------------------------------------- 1 | 6 | 9 | 10 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/ic_settingsd.xml: -------------------------------------------------------------------------------- 1 | 6 | 9 | 10 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/ic_searchn.xml: -------------------------------------------------------------------------------- 1 | 6 | 9 | 10 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/ic_searchd.xml: -------------------------------------------------------------------------------- 1 | 6 | 9 | 10 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/ic_03d.xml: -------------------------------------------------------------------------------- 1 | 6 | 9 | 10 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/ic_03n.xml: -------------------------------------------------------------------------------- 1 | 6 | 9 | 10 | -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | # built application files 2 | *.apk 3 | *.ap_ 4 | 5 | # Mac files 6 | .DS_Store 7 | 8 | # files for the dex VM 9 | *.dex 10 | 11 | # Java class files 12 | *.class 13 | 14 | # generated files 15 | bin/ 16 | gen/ 17 | 18 | # Ignore gradle files 19 | .gradle/ 20 | build/ 21 | 22 | # Local configuration file (sdk path, etc) 23 | local.properties 24 | 25 | # Proguard folder generated by Eclipse 26 | proguard/ 27 | proguard-project.txt 28 | 29 | # Eclipse files 30 | .project 31 | .classpath 32 | .settings/ 33 | 34 | # Android Studio/IDEA 35 | *.iml 36 | .idea -------------------------------------------------------------------------------- /spotless/copyright.kt: -------------------------------------------------------------------------------- 1 | /* 2 | * Copyright $YEAR The Android Open Source Project 3 | * 4 | * Licensed under the Apache License, Version 2.0 (the "License"); 5 | * you may not use this file except in compliance with the License. 6 | * You may obtain a copy of the License at 7 | * 8 | * https://www.apache.org/licenses/LICENSE-2.0 9 | * 10 | * Unless required by applicable law or agreed to in writing, software 11 | * distributed under the License is distributed on an "AS IS" BASIS, 12 | * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13 | * See the License for the specific language governing permissions and 14 | * limitations under the License. 15 | */ 16 | -------------------------------------------------------------------------------- /app/src/main/res/values/colors.xml: -------------------------------------------------------------------------------- 1 | 2 | 12 | 13 | #FF000000 14 | #FFFFFFFF 15 | -------------------------------------------------------------------------------- /app/proguard-rules.pro: -------------------------------------------------------------------------------- 1 | # Add project specific ProGuard rules here. 2 | # You can control the set of applied configuration files using the 3 | # proguardFiles setting in build.gradle. 4 | # 5 | # For more details, see 6 | # http://developer.android.com/guide/developing/tools/proguard.html 7 | 8 | # If your project uses WebView with JS, uncomment the following 9 | # and specify the fully qualified class name to the JavaScript interface 10 | # class: 11 | #-keepclassmembers class fqcn.of.javascript.interface.for.webview { 12 | # public *; 13 | #} 14 | 15 | # Uncomment this to preserve the line number information for 16 | # debugging stack traces. 17 | #-keepattributes SourceFile,LineNumberTable 18 | 19 | # If you keep the line number information, uncomment this to 20 | # hide the original source file name. 21 | #-renamesourcefileattribute SourceFile -------------------------------------------------------------------------------- /app/src/main/java/com/example/androiddevchallenge/domain/model/City.kt: -------------------------------------------------------------------------------- 1 | /* 2 | * Copyright 2021 The Android Open Source Project 3 | * 4 | * Licensed under the Apache License, Version 2.0 (the "License"); 5 | * you may not use this file except in compliance with the License. 6 | * You may obtain a copy of the License at 7 | * 8 | * https://www.apache.org/licenses/LICENSE-2.0 9 | * 10 | * Unless required by applicable law or agreed to in writing, software 11 | * distributed under the License is distributed on an "AS IS" BASIS, 12 | * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13 | * See the License for the specific language governing permissions and 14 | * limitations under the License. 15 | */ 16 | package com.example.androiddevchallenge.domain.model 17 | 18 | data class City(val name: String, val lat: String, val lon: String) 19 | -------------------------------------------------------------------------------- /.github/ci-gradle.properties: -------------------------------------------------------------------------------- 1 | 2 | # 3 | # Copyright 2020 The Android Open Source Project 4 | # 5 | # Licensed under the Apache License, Version 2.0 (the "License"); 6 | # you may not use this file except in compliance with the License. 7 | # You may obtain a copy of the License at 8 | # 9 | # http://www.apache.org/licenses/LICENSE-2.0 10 | # 11 | # Unless required by applicable law or agreed to in writing, software 12 | # distributed under the License is distributed on an "AS IS" BASIS, 13 | # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 14 | # See the License for the specific language governing permissions and 15 | # limitations under the License. 16 | # 17 | 18 | org.gradle.daemon=false 19 | org.gradle.parallel=true 20 | org.gradle.jvmargs=-Xmx5120m 21 | org.gradle.workers.max=2 22 | 23 | kotlin.incremental=false 24 | kotlin.compiler.execution.strategy=in-process 25 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/ic_04n.xml: -------------------------------------------------------------------------------- 1 | 6 | 9 | 12 | 13 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/ic_04d.xml: -------------------------------------------------------------------------------- 1 | 6 | 9 | 12 | 13 | -------------------------------------------------------------------------------- /app/src/main/java/com/example/androiddevchallenge/domain/model/Weather.kt: -------------------------------------------------------------------------------- 1 | /* 2 | * Copyright 2021 The Android Open Source Project 3 | * 4 | * Licensed under the Apache License, Version 2.0 (the "License"); 5 | * you may not use this file except in compliance with the License. 6 | * You may obtain a copy of the License at 7 | * 8 | * https://www.apache.org/licenses/LICENSE-2.0 9 | * 10 | * Unless required by applicable law or agreed to in writing, software 11 | * distributed under the License is distributed on an "AS IS" BASIS, 12 | * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13 | * See the License for the specific language governing permissions and 14 | * limitations under the License. 15 | */ 16 | package com.example.androiddevchallenge.domain.model 17 | 18 | import kotlinx.serialization.Serializable 19 | 20 | @Serializable 21 | data class Weather( 22 | val description: String = "", 23 | val icon: String = "", 24 | val id: Int = 0, 25 | val main: String = "" 26 | ) 27 | -------------------------------------------------------------------------------- /app/src/main/java/com/example/androiddevchallenge/presentation/cb/WeatherDataEvent.kt: -------------------------------------------------------------------------------- 1 | /* 2 | * Copyright 2021 The Android Open Source Project 3 | * 4 | * Licensed under the Apache License, Version 2.0 (the "License"); 5 | * you may not use this file except in compliance with the License. 6 | * You may obtain a copy of the License at 7 | * 8 | * https://www.apache.org/licenses/LICENSE-2.0 9 | * 10 | * Unless required by applicable law or agreed to in writing, software 11 | * distributed under the License is distributed on an "AS IS" BASIS, 12 | * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13 | * See the License for the specific language governing permissions and 14 | * limitations under the License. 15 | */ 16 | package com.example.androiddevchallenge.presentation.cb 17 | 18 | import com.example.androiddevchallenge.domain.model.WeatherData 19 | 20 | interface WeatherDataEvent { 21 | 22 | fun onWeatherDataFetched(data: WeatherData) 23 | 24 | fun onWeatherDataFailed() 25 | } 26 | -------------------------------------------------------------------------------- /app/src/main/java/com/example/androiddevchallenge/domain/model/FeelsLike.kt: -------------------------------------------------------------------------------- 1 | /* 2 | * Copyright 2021 The Android Open Source Project 3 | * 4 | * Licensed under the Apache License, Version 2.0 (the "License"); 5 | * you may not use this file except in compliance with the License. 6 | * You may obtain a copy of the License at 7 | * 8 | * https://www.apache.org/licenses/LICENSE-2.0 9 | * 10 | * Unless required by applicable law or agreed to in writing, software 11 | * distributed under the License is distributed on an "AS IS" BASIS, 12 | * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13 | * See the License for the specific language governing permissions and 14 | * limitations under the License. 15 | */ 16 | package com.example.androiddevchallenge.domain.model 17 | 18 | import kotlinx.serialization.Serializable 19 | 20 | @Serializable 21 | data class FeelsLike( 22 | val day: Double = 0.0, 23 | val eve: Double = 0.0, 24 | val morn: Double = 0.0, 25 | val night: Double = 0.0 26 | ) 27 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/ic_11n.xml: -------------------------------------------------------------------------------- 1 | 6 | 9 | 12 | 13 | -------------------------------------------------------------------------------- /app/src/test/java/com/example/androiddevchallenge/ExampleUnitTest.kt: -------------------------------------------------------------------------------- 1 | /* 2 | * Copyright 2021 The Android Open Source Project 3 | * 4 | * Licensed under the Apache License, Version 2.0 (the "License"); 5 | * you may not use this file except in compliance with the License. 6 | * You may obtain a copy of the License at 7 | * 8 | * https://www.apache.org/licenses/LICENSE-2.0 9 | * 10 | * Unless required by applicable law or agreed to in writing, software 11 | * distributed under the License is distributed on an "AS IS" BASIS, 12 | * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13 | * See the License for the specific language governing permissions and 14 | * limitations under the License. 15 | */ 16 | package com.example.androiddevchallenge 17 | 18 | /** 19 | * Example local unit test, which will execute on the development machine (host). 20 | * 21 | * See [testing documentation](http://d.android.com/tools/testing). 22 | */ 23 | class ExampleUnitTest { 24 | // Add unit tests here 25 | } 26 | -------------------------------------------------------------------------------- /app/src/main/java/com/example/androiddevchallenge/domain/model/Alert.kt: -------------------------------------------------------------------------------- 1 | /* 2 | * Copyright 2021 The Android Open Source Project 3 | * 4 | * Licensed under the Apache License, Version 2.0 (the "License"); 5 | * you may not use this file except in compliance with the License. 6 | * You may obtain a copy of the License at 7 | * 8 | * https://www.apache.org/licenses/LICENSE-2.0 9 | * 10 | * Unless required by applicable law or agreed to in writing, software 11 | * distributed under the License is distributed on an "AS IS" BASIS, 12 | * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13 | * See the License for the specific language governing permissions and 14 | * limitations under the License. 15 | */ 16 | package com.example.androiddevchallenge.domain.model 17 | 18 | import kotlinx.serialization.Serializable 19 | 20 | @Serializable 21 | data class Alert( 22 | val description: String, 23 | val end: Int, 24 | val event: String, 25 | val sender_name: String, 26 | val start: Int 27 | ) 28 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/ic_11d.xml: -------------------------------------------------------------------------------- 1 | 6 | 9 | 12 | 13 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/ic_01n.xml: -------------------------------------------------------------------------------- 1 | 6 | 11 | 14 | 15 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/ic_01d.xml: -------------------------------------------------------------------------------- 1 | 6 | 11 | 14 | 15 | -------------------------------------------------------------------------------- /app/src/main/java/com/example/androiddevchallenge/domain/model/Temp.kt: -------------------------------------------------------------------------------- 1 | /* 2 | * Copyright 2021 The Android Open Source Project 3 | * 4 | * Licensed under the Apache License, Version 2.0 (the "License"); 5 | * you may not use this file except in compliance with the License. 6 | * You may obtain a copy of the License at 7 | * 8 | * https://www.apache.org/licenses/LICENSE-2.0 9 | * 10 | * Unless required by applicable law or agreed to in writing, software 11 | * distributed under the License is distributed on an "AS IS" BASIS, 12 | * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13 | * See the License for the specific language governing permissions and 14 | * limitations under the License. 15 | */ 16 | package com.example.androiddevchallenge.domain.model 17 | 18 | import kotlinx.serialization.Serializable 19 | 20 | @Serializable 21 | data class Temp( 22 | val day: Double = 0.0, 23 | val eve: Double = 0.0, 24 | val max: Double = 0.0, 25 | val min: Double = 0.0, 26 | val morn: Double = 0.0, 27 | val night: Double = 0.0 28 | ) 29 | -------------------------------------------------------------------------------- /app/src/main/java/com/example/androiddevchallenge/ui/theme/Shape.kt: -------------------------------------------------------------------------------- 1 | /* 2 | * Copyright 2021 The Android Open Source Project 3 | * 4 | * Licensed under the Apache License, Version 2.0 (the "License"); 5 | * you may not use this file except in compliance with the License. 6 | * You may obtain a copy of the License at 7 | * 8 | * https://www.apache.org/licenses/LICENSE-2.0 9 | * 10 | * Unless required by applicable law or agreed to in writing, software 11 | * distributed under the License is distributed on an "AS IS" BASIS, 12 | * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13 | * See the License for the specific language governing permissions and 14 | * limitations under the License. 15 | */ 16 | package com.example.androiddevchallenge.ui.theme 17 | 18 | import androidx.compose.foundation.shape.RoundedCornerShape 19 | import androidx.compose.material.Shapes 20 | import androidx.compose.ui.unit.dp 21 | 22 | val shapes = Shapes( 23 | small = RoundedCornerShape(4.dp), 24 | medium = RoundedCornerShape(4.dp), 25 | large = RoundedCornerShape(0.dp) 26 | ) 27 | -------------------------------------------------------------------------------- /app/src/main/java/com/example/androiddevchallenge/domain/model/WeatherData.kt: -------------------------------------------------------------------------------- 1 | /* 2 | * Copyright 2021 The Android Open Source Project 3 | * 4 | * Licensed under the Apache License, Version 2.0 (the "License"); 5 | * you may not use this file except in compliance with the License. 6 | * You may obtain a copy of the License at 7 | * 8 | * https://www.apache.org/licenses/LICENSE-2.0 9 | * 10 | * Unless required by applicable law or agreed to in writing, software 11 | * distributed under the License is distributed on an "AS IS" BASIS, 12 | * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13 | * See the License for the specific language governing permissions and 14 | * limitations under the License. 15 | */ 16 | package com.example.androiddevchallenge.domain.model 17 | 18 | import kotlinx.serialization.Serializable 19 | 20 | @Serializable 21 | data class WeatherData( 22 | val alerts: List = emptyList(), 23 | val current: Current, 24 | val daily: List, 25 | val lat: Double, 26 | val lon: Double, 27 | val timezone: String, 28 | val timezone_offset: Int 29 | ) 30 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/ic_02n.xml: -------------------------------------------------------------------------------- 1 | 6 | 9 | 12 | 13 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/ic_02d.xml: -------------------------------------------------------------------------------- 1 | 6 | 9 | 12 | 13 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/ic_50n.xml: -------------------------------------------------------------------------------- 1 | 6 | 9 | 12 | 13 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/ic_50d.xml: -------------------------------------------------------------------------------- 1 | 6 | 9 | 12 | 13 | -------------------------------------------------------------------------------- /CONTRIBUTING.md: -------------------------------------------------------------------------------- 1 | # How to Contribute 2 | 3 | We'd love to accept your patches and contributions to this project. There are 4 | just a few small guidelines you need to follow. 5 | 6 | ## Contributor License Agreement 7 | 8 | Contributions to this project must be accompanied by a Contributor License 9 | Agreement. You (or your employer) retain the copyright to your contribution, 10 | this simply gives us permission to use and redistribute your contributions as 11 | part of the project. Head over to to see 12 | your current agreements on file or to sign a new one. 13 | 14 | You generally only need to submit a CLA once, so if you've already submitted one 15 | (even if it was for a different project), you probably don't need to do it 16 | again. 17 | 18 | ## Code reviews 19 | 20 | All submissions, including submissions by project members, require review. We 21 | use GitHub pull requests for this purpose. Consult 22 | [GitHub Help](https://help.github.com/articles/about-pull-requests/) for more 23 | information on using pull requests. 24 | 25 | ## Community Guidelines 26 | 27 | This project follows [Google's Open Source Community 28 | Guidelines](https://opensource.google.com/conduct/). -------------------------------------------------------------------------------- /gradle.properties: -------------------------------------------------------------------------------- 1 | # Project-wide Gradle settings. 2 | # IDE (e.g. Android Studio) users: 3 | # Gradle settings configured through the IDE *will override* 4 | # any settings specified in this file. 5 | # For more details on how to configure your build environment visit 6 | # http://www.gradle.org/docs/current/userguide/build_environment.html 7 | # Specifies the JVM arguments used for the daemon process. 8 | # The setting is particularly useful for tweaking memory settings. 9 | org.gradle.jvmargs=-Xmx2048m -Dfile.encoding=UTF-8 10 | # When configured, Gradle will run in incubating parallel mode. 11 | # This option should only be used with decoupled projects. More details, visit 12 | # http://www.gradle.org/docs/current/userguide/multi_project_builds.html#sec:decoupled_projects 13 | # org.gradle.parallel=true 14 | # AndroidX package structure to make it clearer which packages are bundled with the 15 | # Android operating system, and which are packaged with your app"s APK 16 | # https://developer.android.com/topic/libraries/support-library/androidx-rn 17 | android.useAndroidX=true 18 | # Automatically convert third-party libraries to use AndroidX 19 | android.enableJetifier=true 20 | # Kotlin code style for this project: "official" or "obsolete": 21 | kotlin.code.style=official -------------------------------------------------------------------------------- /app/src/main/res/drawable/ic_09n.xml: -------------------------------------------------------------------------------- 1 | 6 | 9 | 12 | 13 | -------------------------------------------------------------------------------- /app/src/main/java/com/example/androiddevchallenge/domain/model/Current.kt: -------------------------------------------------------------------------------- 1 | /* 2 | * Copyright 2021 The Android Open Source Project 3 | * 4 | * Licensed under the Apache License, Version 2.0 (the "License"); 5 | * you may not use this file except in compliance with the License. 6 | * You may obtain a copy of the License at 7 | * 8 | * https://www.apache.org/licenses/LICENSE-2.0 9 | * 10 | * Unless required by applicable law or agreed to in writing, software 11 | * distributed under the License is distributed on an "AS IS" BASIS, 12 | * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13 | * See the License for the specific language governing permissions and 14 | * limitations under the License. 15 | */ 16 | package com.example.androiddevchallenge.domain.model 17 | 18 | import kotlinx.serialization.Serializable 19 | 20 | @Serializable 21 | data class Current( 22 | val clouds: Int, 23 | val dew_point: Double, 24 | val dt: Int, 25 | val feels_like: Double, 26 | val humidity: Int, 27 | val pressure: Int, 28 | val sunrise: Int, 29 | val sunset: Int, 30 | val temp: Double, 31 | val uvi: Double, 32 | val visibility: Int, 33 | val weather: List, 34 | val wind_deg: Int, 35 | val wind_speed: Double 36 | ) 37 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/ic_09d.xml: -------------------------------------------------------------------------------- 1 | 6 | 9 | 12 | 13 | -------------------------------------------------------------------------------- /app/src/main/java/com/example/androiddevchallenge/domain/model/Daily.kt: -------------------------------------------------------------------------------- 1 | /* 2 | * Copyright 2021 The Android Open Source Project 3 | * 4 | * Licensed under the Apache License, Version 2.0 (the "License"); 5 | * you may not use this file except in compliance with the License. 6 | * You may obtain a copy of the License at 7 | * 8 | * https://www.apache.org/licenses/LICENSE-2.0 9 | * 10 | * Unless required by applicable law or agreed to in writing, software 11 | * distributed under the License is distributed on an "AS IS" BASIS, 12 | * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13 | * See the License for the specific language governing permissions and 14 | * limitations under the License. 15 | */ 16 | package com.example.androiddevchallenge.domain.model 17 | 18 | import kotlinx.serialization.Serializable 19 | 20 | @Serializable 21 | data class Daily( 22 | val clouds: Int = 0, 23 | val dew_point: Double = 0.0, 24 | val dt: Int = 0, 25 | val feels_like: FeelsLike = FeelsLike(), 26 | val humidity: Int = 0, 27 | val pop: Double = 0.0, 28 | val pressure: Int = 0, 29 | val rain: Double? = 0.0, 30 | val sunrise: Int = 0, 31 | val sunset: Int = 0, 32 | val temp: Temp = Temp(), 33 | val uvi: Double = 0.0, 34 | val weather: List = listOf(Weather()), 35 | val wind_deg: Int = 0, 36 | val wind_speed: Double = 0.0 37 | ) 38 | -------------------------------------------------------------------------------- /app/src/androidTest/java/com/example/androiddevchallenge/ExampleInstrumentedTest.kt: -------------------------------------------------------------------------------- 1 | /* 2 | * Copyright 2021 The Android Open Source Project 3 | * 4 | * Licensed under the Apache License, Version 2.0 (the "License"); 5 | * you may not use this file except in compliance with the License. 6 | * You may obtain a copy of the License at 7 | * 8 | * https://www.apache.org/licenses/LICENSE-2.0 9 | * 10 | * Unless required by applicable law or agreed to in writing, software 11 | * distributed under the License is distributed on an "AS IS" BASIS, 12 | * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13 | * See the License for the specific language governing permissions and 14 | * limitations under the License. 15 | */ 16 | package com.example.androiddevchallenge 17 | 18 | import androidx.compose.ui.test.junit4.createAndroidComposeRule 19 | import androidx.test.ext.junit.runners.AndroidJUnit4 20 | import org.junit.Rule 21 | import org.junit.Test 22 | import org.junit.runner.RunWith 23 | 24 | /** 25 | * Instrumented test, which will execute on an Android device. 26 | * 27 | * See [testing documentation](http://d.android.com/tools/testing). 28 | */ 29 | @RunWith(AndroidJUnit4::class) 30 | class ExampleInstrumentedTest { 31 | @get:Rule 32 | val composeTestRule = createAndroidComposeRule() 33 | 34 | @Test 35 | fun sampleTest() { 36 | // Add instrumented tests here 37 | } 38 | } 39 | -------------------------------------------------------------------------------- /app/src/main/java/com/example/androiddevchallenge/ui/theme/Color.kt: -------------------------------------------------------------------------------- 1 | /* 2 | * Copyright 2021 The Android Open Source Project 3 | * 4 | * Licensed under the Apache License, Version 2.0 (the "License"); 5 | * you may not use this file except in compliance with the License. 6 | * You may obtain a copy of the License at 7 | * 8 | * https://www.apache.org/licenses/LICENSE-2.0 9 | * 10 | * Unless required by applicable law or agreed to in writing, software 11 | * distributed under the License is distributed on an "AS IS" BASIS, 12 | * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13 | * See the License for the specific language governing permissions and 14 | * limitations under the License. 15 | */ 16 | package com.example.androiddevchallenge.ui.theme 17 | 18 | import androidx.compose.ui.graphics.Color 19 | 20 | val darkBackground = Color(0xFF000000) 21 | val darkBackgroundField = Color(0xFF121212) 22 | val darkText = Color(0xFFFFFFFF) 23 | val darkTextSecondary = Color(0xFF546E7A) 24 | val darkSelected = Color(0xFFFFFFFF) 25 | val darkNotSelected = Color(0xFF212121) 26 | val darkSingleOption = Color(0xFF546E7A) 27 | 28 | val lightBackground = Color(0xFFFFFFFF) 29 | val lightBackgroundField = Color(0xFFF4F4F4) 30 | val lightText = Color(0xFF000000) 31 | val lightTextSecondary = Color(0xFFE0E0E0) 32 | val lightSelected = Color(0xFF292E3C) 33 | val lightNotSelected = Color(0xFFE0E0E0) 34 | val lightSingleOption = Color(0xFF546E7A) 35 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # wwweather 2 | 3 | ![Workflow result](https://github.com/cmota/wwweather/workflows/Check/badge.svg) 4 | 5 | 6 | ## :scroll: Description 7 | A simple, yet beautiful weather app done with Jetpack Compose. 8 | 9 | A special thank you to [@henrikemacedo](https://twitter.com/henrikemacedo) who designed this beautiful UI. 10 | 11 | 12 | ## :bulb: Motivation and Context 13 | Played with Jetpack Compose to create a simple, yet beautiful weather app made entirely with Jetpack Compose. The app supports two theme modes: light and night which can be changed by either activiating the night mode on the device or changing it on runtime inside the app settings. 14 | 15 | ## :camera_flash: Screenshots 16 |   17 |   18 |   19 |   20 |   21 | 22 | 23 | ## License 24 | ``` 25 | Copyright 2020 The Android Open Source Project 26 | 27 | Licensed under the Apache License, Version 2.0 (the "License"); 28 | you may not use this file except in compliance with the License. 29 | You may obtain a copy of the License at 30 | 31 | https://www.apache.org/licenses/LICENSE-2.0 32 | 33 | Unless required by applicable law or agreed to in writing, software 34 | distributed under the License is distributed on an "AS IS" BASIS, 35 | WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 36 | See the License for the specific language governing permissions and 37 | limitations under the License. 38 | ``` -------------------------------------------------------------------------------- /app/src/main/AndroidManifest.xml: -------------------------------------------------------------------------------- 1 | 2 | 12 | 13 | 15 | 16 | 17 | 18 | 25 | 29 | 30 | 31 | 32 | 33 | 34 | 35 | 36 | 37 | -------------------------------------------------------------------------------- /app/src/main/java/com/example/androiddevchallenge/domain/model/WWWeather.kt: -------------------------------------------------------------------------------- 1 | /* 2 | * Copyright 2021 The Android Open Source Project 3 | * 4 | * Licensed under the Apache License, Version 2.0 (the "License"); 5 | * you may not use this file except in compliance with the License. 6 | * You may obtain a copy of the License at 7 | * 8 | * https://www.apache.org/licenses/LICENSE-2.0 9 | * 10 | * Unless required by applicable law or agreed to in writing, software 11 | * distributed under the License is distributed on an "AS IS" BASIS, 12 | * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13 | * See the License for the specific language governing permissions and 14 | * limitations under the License. 15 | */ 16 | package com.example.androiddevchallenge.domain.model 17 | 18 | data class WWWeather( 19 | val icon: String = "", 20 | val feelsLike: Double = 0.0, 21 | val now: Double = 0.0, 22 | val min: Double = 0.0, 23 | val max: Double = 0.0, 24 | val wind: Double = 0.0, 25 | val humidity: Int = 0, 26 | val daily: List = emptyList() 27 | ) 28 | 29 | fun mapper(weatherData: WeatherData?, index: Int): WWWeather { 30 | if (weatherData == null) { 31 | return WWWeather() 32 | } 33 | 34 | val daily = if (weatherData.daily.size > index) { 35 | weatherData.daily[index] 36 | } else { 37 | Daily() 38 | } 39 | 40 | return WWWeather( 41 | icon = daily.weather[0].icon, 42 | feelsLike = daily.feels_like.day, 43 | now = daily.temp.day, 44 | min = daily.temp.min, 45 | max = daily.temp.max, 46 | wind = daily.wind_speed, 47 | humidity = daily.humidity, 48 | daily = weatherData.daily 49 | ) 50 | } 51 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/ic_10d.xml: -------------------------------------------------------------------------------- 1 | 6 | 9 | 12 | 13 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/ic_10n.xml: -------------------------------------------------------------------------------- 1 | 6 | 9 | 12 | 13 | -------------------------------------------------------------------------------- /app/src/main/java/com/example/androiddevchallenge/domain/GetWeatherData.kt: -------------------------------------------------------------------------------- 1 | /* 2 | * Copyright 2021 The Android Open Source Project 3 | * 4 | * Licensed under the Apache License, Version 2.0 (the "License"); 5 | * you may not use this file except in compliance with the License. 6 | * You may obtain a copy of the License at 7 | * 8 | * https://www.apache.org/licenses/LICENSE-2.0 9 | * 10 | * Unless required by applicable law or agreed to in writing, software 11 | * distributed under the License is distributed on an "AS IS" BASIS, 12 | * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13 | * See the License for the specific language governing permissions and 14 | * limitations under the License. 15 | */ 16 | package com.example.androiddevchallenge.domain 17 | 18 | import android.util.Log 19 | import com.example.androiddevchallenge.data.OpenWeatherAPI 20 | import com.example.androiddevchallenge.data.UNITS 21 | import com.example.androiddevchallenge.domain.model.City 22 | import com.example.androiddevchallenge.presentation.cb.WeatherDataEvent 23 | import kotlinx.coroutines.coroutineScope 24 | 25 | private const val TAG = "GetWeatherData" 26 | 27 | class GetWeatherData { 28 | 29 | suspend fun invoke(city: City, units: UNITS, event: WeatherDataEvent) { 30 | try { 31 | 32 | val result = OpenWeatherAPI.getWeather(city.lat, city.lon, units) 33 | 34 | Log.d(TAG, "Result=$result") 35 | 36 | coroutineScope { 37 | event.onWeatherDataFetched(result) 38 | } 39 | } catch (e: Exception) { 40 | Log.d(TAG, "Unable to get data for city=$city. Reason=$e") 41 | 42 | coroutineScope { 43 | event.onWeatherDataFailed() 44 | } 45 | } 46 | } 47 | } 48 | -------------------------------------------------------------------------------- /app/src/main/res/values-night/themes.xml: -------------------------------------------------------------------------------- 1 | 2 | 12 | 13 | 30 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/ic_launcher_foreground.xml: -------------------------------------------------------------------------------- 1 | 6 | 10 | 11 | 13 | 16 | 19 | 22 | 25 | 28 | 29 | 30 | 31 | -------------------------------------------------------------------------------- /app/src/main/res/values/strings.xml: -------------------------------------------------------------------------------- 1 | 2 | 12 | wwweather 13 | 14 | Feels like 15 | 16 | Now 17 | Min / Max 18 | Wind 19 | Humidity 20 | 21 | %sº 22 | %sº 23 | %s Km/h 24 | %s mph 25 | % 26 | 27 | Today 28 | 29 | Settings 30 | Units 31 | Metric (ºC, Km/h) 32 | Imperial (ºF, mph) 33 | Theme 34 | Light 35 | Dark 36 | 37 | Search 38 | Recent Searches 39 | 40 | 41 | Weather image 42 | Open settings 43 | Open search for location 44 | -------------------------------------------------------------------------------- /app/src/main/java/com/example/androiddevchallenge/presentation/WeatherViewModel.kt: -------------------------------------------------------------------------------- 1 | /* 2 | * Copyright 2021 The Android Open Source Project 3 | * 4 | * Licensed under the Apache License, Version 2.0 (the "License"); 5 | * you may not use this file except in compliance with the License. 6 | * You may obtain a copy of the License at 7 | * 8 | * https://www.apache.org/licenses/LICENSE-2.0 9 | * 10 | * Unless required by applicable law or agreed to in writing, software 11 | * distributed under the License is distributed on an "AS IS" BASIS, 12 | * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13 | * See the License for the specific language governing permissions and 14 | * limitations under the License. 15 | */ 16 | package com.example.androiddevchallenge.presentation 17 | 18 | import androidx.lifecycle.ViewModel 19 | import com.example.androiddevchallenge.data.UNITS 20 | import com.example.androiddevchallenge.domain.GetWeatherData 21 | import com.example.androiddevchallenge.domain.model.City 22 | import com.example.androiddevchallenge.domain.model.WeatherData 23 | import com.example.androiddevchallenge.presentation.cb.WeatherDataEvent 24 | import com.example.androiddevchallenge.utils.SingleLiveEvent 25 | import kotlinx.coroutines.CoroutineScope 26 | import kotlinx.coroutines.Dispatchers 27 | import kotlinx.coroutines.Job 28 | import kotlinx.coroutines.launch 29 | 30 | class WeatherViewModel : ViewModel(), WeatherDataEvent { 31 | 32 | private val _weather = SingleLiveEvent() 33 | val weather: SingleLiveEvent = _weather 34 | 35 | private val scope = CoroutineScope(Job() + Dispatchers.Main) 36 | 37 | fun getWeather(city: City, units: UNITS) { 38 | val event = this 39 | scope.launch { 40 | GetWeatherData().invoke(city, units, event) 41 | } 42 | } 43 | 44 | //region WeatherDataEvent 45 | 46 | override fun onWeatherDataFetched(data: WeatherData) { 47 | weather.postValue(data) 48 | } 49 | 50 | override fun onWeatherDataFailed() { 51 | weather.postValue(null) 52 | } 53 | 54 | //endregion 55 | } 56 | -------------------------------------------------------------------------------- /.github/workflows/Check.yaml: -------------------------------------------------------------------------------- 1 | name: Check 2 | 3 | on: 4 | push: 5 | branches: 6 | - main 7 | 8 | jobs: 9 | build: 10 | runs-on: ubuntu-latest 11 | timeout-minutes: 30 12 | 13 | steps: 14 | - name: Checkout 15 | uses: actions/checkout@v2 16 | 17 | - name: Copy CI gradle.properties 18 | run: mkdir -p ~/.gradle ; cp .github/ci-gradle.properties ~/.gradle/gradle.properties 19 | 20 | - name: Set up JDK 11 21 | uses: actions/setup-java@v1 22 | with: 23 | java-version: 11 24 | 25 | - name: Build project 26 | run: ./gradlew spotlessCheck assembleDebug lintDebug --stacktrace 27 | 28 | - name: Upload build outputs (APKs) 29 | uses: actions/upload-artifact@v2 30 | with: 31 | name: build-outputs 32 | path: app/build/outputs 33 | 34 | - name: Upload build reports 35 | if: always() 36 | uses: actions/upload-artifact@v2 37 | with: 38 | name: build-reports 39 | path: app/build/reports 40 | 41 | test: 42 | needs: build 43 | runs-on: macOS-latest # enables hardware acceleration in the virtual machine 44 | timeout-minutes: 30 45 | strategy: 46 | matrix: 47 | api-level: [23, 26, 29] 48 | 49 | steps: 50 | - name: Checkout 51 | uses: actions/checkout@v2 52 | 53 | - name: Copy CI gradle.properties 54 | run: mkdir -p ~/.gradle ; cp .github/ci-gradle.properties ~/.gradle/gradle.properties 55 | 56 | - name: Set up JDK 11 57 | uses: actions/setup-java@v1 58 | with: 59 | java-version: 11 60 | 61 | - name: Run instrumentation tests 62 | uses: reactivecircus/android-emulator-runner@v2 63 | with: 64 | api-level: ${{ matrix.api-level }} 65 | arch: x86 66 | disable-animations: true 67 | script: ./gradlew connectedCheck --stacktrace 68 | 69 | - name: Upload test reports 70 | if: always() 71 | uses: actions/upload-artifact@v2 72 | with: 73 | name: test-reports 74 | path: app/build/reports 75 | -------------------------------------------------------------------------------- /app/src/main/res/values/themes.xml: -------------------------------------------------------------------------------- 1 | 2 | 12 | 13 | 29 | 30 | 34 | 35 |