From 469fd7df73647477269ec2be231e9efc654682a4 Mon Sep 17 00:00:00 2001 From: "kyriakos.georgiopoulos" Date: Sun, 6 Jun 2021 14:06:18 +0300 Subject: [PATCH] Initial commit --- .gitignore | 15 ++ .idea/.gitignore | 3 + .idea/codeStyles/Project.xml | 123 +++++++++++++ .idea/codeStyles/codeStyleConfig.xml | 5 + .idea/compiler.xml | 6 + .idea/gradle.xml | 20 ++ .idea/jarRepositories.xml | 30 +++ .idea/misc.xml | 14 ++ .idea/runConfigurations.xml | 10 + .idea/vcs.xml | 6 + app/.gitignore | 1 + app/build.gradle | 68 +++++++ app/proguard-rules.pro | 21 +++ .../ExampleInstrumentedTest.kt | 24 +++ app/src/main/AndroidManifest.xml | 23 +++ app/src/main/ic_launcher-playstore.png | Bin 0 -> 15413 bytes .../common/definitions/Definitions.kt | 12 ++ .../extensions/RecyclerViewExtensions.kt | 2 + .../common/extensions/StringExtensions.kt | 2 + .../common/extensions/ViewExtensions.kt | 4 + .../common/logger/CommonLogger.kt | 4 + .../weather_forecast/common/logger/Logger.kt | 4 + .../weather_forecast/database/CityDatabase.kt | 5 + .../database/dao/CityTable.kt | 4 + .../database/dao/CityTableDao.kt | 4 + .../weather_forecast/model/error/Error.kt | 3 + .../weather_forecast/WeatherForecast.kt | 42 +++++ .../weather_forecast/ForecastTransformer.kt | 4 + .../weather_forecast/SectionTransformer.kt | 4 + .../weather_forecast/Transformer.kt | 4 + .../WeatherForecastTransformerFactory.kt | 4 + .../WeatherForecastUiModel.kt | 3 + .../validator/wather_forecast/Validator.kt | 4 + .../validator/wather_forecast/Validity.kt | 3 + .../WeatherForecastValidator.kt | 4 + .../network/api/WeatherForecastApi.kt | 17 ++ .../network/client/WeatherForecastClient.kt | 43 +++++ .../ui/activity/base/BaseActivity.kt | 77 ++++++++ .../ui/activity/home/HomeActivity.kt | 12 ++ .../ui/activity/splash/SplashActivity.kt | 41 +++++ .../WeatherForecastActivity.kt | 4 + .../cities/CitiesRecyclerViewAdapter.kt | 4 + .../PredictionsRecyclerViewAdapter.kt | 45 +++++ .../WeatherForecastRecyclerViewAdapter.kt | 4 + .../CitiesDatabaseAccessUseCase.kt | 4 + .../database_access/DatabaseAccessUseCase.kt | 4 + .../result/DatabaseAccessResult.kt | 4 + .../load/DatabaseAccessLoadCitiesResult.kt | 4 + .../places/PlacesPredictionsUseCase.kt | 4 + .../use_case/places/PlacesUseCase.kt | 4 + .../use_case/places/result/PlacesResult.kt | 4 + .../FetchWeatherForecastUseCase.kt | 4 + .../WeatherForecastUseCase.kt | 4 + .../weather_forecast/result/WeatherResult.kt | 4 + .../view_model/base/BaseViewModel.kt | 83 +++++++++ .../view_model/base/BaseViewModelFactory.kt | 12 ++ .../view_model/home/HomeViewModel.kt | 6 + app/src/main/res/anim/no_change.xml | 4 + app/src/main/res/anim/slide_down.xml | 5 + app/src/main/res/anim/slide_up.xml | 4 + .../res/drawable/black_stroke_rectangle.xml | 9 + app/src/main/res/drawable/ic_add.xml | 5 + app/src/main/res/drawable/ic_back.xml | 5 + app/src/main/res/drawable/ic_cloud.xml | 5 + app/src/main/res/drawable/ic_delete.xml | 5 + .../res/drawable/ic_launcher_foreground.xml | 15 ++ app/src/main/res/drawable/ic_see_weather.xml | 5 + app/src/main/res/drawable/ic_sun.xml | 5 + .../main/res/drawable/ic_sun_animation.xml | 4 + app/src/main/res/drawable/white_oval.xml | 8 + app/src/main/res/layout/activity_home.xml | 18 ++ .../res/layout/activity_weather_forecast.xml | 6 + .../main/res/layout/bottom_sheet_add_city.xml | 58 ++++++ app/src/main/res/layout/layout_city.xml | 6 + app/src/main/res/layout/layout_date.xml | 6 + app/src/main/res/layout/layout_error.xml | 35 ++++ app/src/main/res/layout/layout_forecast.xml | 74 ++++++++ app/src/main/res/layout/layout_loading.xml | 22 +++ app/src/main/res/layout/layout_prediction.xml | 15 ++ .../res/mipmap-anydpi-v26/ic_launcher.xml | 5 + .../mipmap-anydpi-v26/ic_launcher_round.xml | 5 + app/src/main/res/mipmap-hdpi/ic_launcher.png | Bin 0 -> 1814 bytes .../res/mipmap-hdpi/ic_launcher_round.png | Bin 0 -> 3902 bytes app/src/main/res/mipmap-mdpi/ic_launcher.png | Bin 0 -> 1360 bytes .../res/mipmap-mdpi/ic_launcher_round.png | Bin 0 -> 2488 bytes app/src/main/res/mipmap-xhdpi/ic_launcher.png | Bin 0 -> 2533 bytes .../res/mipmap-xhdpi/ic_launcher_round.png | Bin 0 -> 5510 bytes .../main/res/mipmap-xxhdpi/ic_launcher.png | Bin 0 -> 3909 bytes .../res/mipmap-xxhdpi/ic_launcher_round.png | Bin 0 -> 8830 bytes .../main/res/mipmap-xxxhdpi/ic_launcher.png | Bin 0 -> 5505 bytes .../res/mipmap-xxxhdpi/ic_launcher_round.png | Bin 0 -> 12770 bytes app/src/main/res/values/colors.xml | 12 ++ app/src/main/res/values/dimens.xml | 14 ++ .../res/values/ic_launcher_background.xml | 4 + app/src/main/res/values/strings.xml | 8 + app/src/main/res/values/themes.xml | 13 ++ app/src/main/res/xml/backup_descriptor.xml | 4 + .../weather_forecast/ExampleUnitTest.kt | 17 ++ .../extensions/StringExtensionsKtTest.kt | 5 + .../WeatherForecastValidatorTest.kt | 5 + .../view_model/home/HomeViewModelTest.kt | 5 + build.gradle | 27 +++ gradle.properties | 19 ++ gradle/wrapper/gradle-wrapper.jar | Bin 0 -> 54329 bytes gradle/wrapper/gradle-wrapper.properties | 6 + gradlew | 172 ++++++++++++++++++ gradlew.bat | 84 +++++++++ settings.gradle | 2 + 108 files changed, 1599 insertions(+) create mode 100644 .gitignore create mode 100644 .idea/.gitignore create mode 100644 .idea/codeStyles/Project.xml create mode 100644 .idea/codeStyles/codeStyleConfig.xml create mode 100644 .idea/compiler.xml create mode 100644 .idea/gradle.xml create mode 100644 .idea/jarRepositories.xml create mode 100644 .idea/misc.xml create mode 100644 .idea/runConfigurations.xml create mode 100644 .idea/vcs.xml create mode 100644 app/.gitignore create mode 100644 app/build.gradle create mode 100644 app/proguard-rules.pro create mode 100644 app/src/androidTest/java/gr/georgiopoulos/weather_forecast/ExampleInstrumentedTest.kt create mode 100644 app/src/main/AndroidManifest.xml create mode 100644 app/src/main/ic_launcher-playstore.png create mode 100644 app/src/main/java/gr/georgiopoulos/weather_forecast/common/definitions/Definitions.kt create mode 100644 app/src/main/java/gr/georgiopoulos/weather_forecast/common/extensions/RecyclerViewExtensions.kt create mode 100644 app/src/main/java/gr/georgiopoulos/weather_forecast/common/extensions/StringExtensions.kt create mode 100644 app/src/main/java/gr/georgiopoulos/weather_forecast/common/extensions/ViewExtensions.kt create mode 100644 app/src/main/java/gr/georgiopoulos/weather_forecast/common/logger/CommonLogger.kt create mode 100644 app/src/main/java/gr/georgiopoulos/weather_forecast/common/logger/Logger.kt create mode 100644 app/src/main/java/gr/georgiopoulos/weather_forecast/database/CityDatabase.kt create mode 100644 app/src/main/java/gr/georgiopoulos/weather_forecast/database/dao/CityTable.kt create mode 100644 app/src/main/java/gr/georgiopoulos/weather_forecast/database/dao/CityTableDao.kt create mode 100644 app/src/main/java/gr/georgiopoulos/weather_forecast/model/error/Error.kt create mode 100644 app/src/main/java/gr/georgiopoulos/weather_forecast/model/parser/weather_forecast/WeatherForecast.kt create mode 100644 app/src/main/java/gr/georgiopoulos/weather_forecast/model/transformer/weather_forecast/ForecastTransformer.kt create mode 100644 app/src/main/java/gr/georgiopoulos/weather_forecast/model/transformer/weather_forecast/SectionTransformer.kt create mode 100644 app/src/main/java/gr/georgiopoulos/weather_forecast/model/transformer/weather_forecast/Transformer.kt create mode 100644 app/src/main/java/gr/georgiopoulos/weather_forecast/model/transformer/weather_forecast/WeatherForecastTransformerFactory.kt create mode 100644 app/src/main/java/gr/georgiopoulos/weather_forecast/model/ui/weather_forecast/WeatherForecastUiModel.kt create mode 100644 app/src/main/java/gr/georgiopoulos/weather_forecast/model/validator/wather_forecast/Validator.kt create mode 100644 app/src/main/java/gr/georgiopoulos/weather_forecast/model/validator/wather_forecast/Validity.kt create mode 100644 app/src/main/java/gr/georgiopoulos/weather_forecast/model/validator/wather_forecast/WeatherForecastValidator.kt create mode 100644 app/src/main/java/gr/georgiopoulos/weather_forecast/network/api/WeatherForecastApi.kt create mode 100644 app/src/main/java/gr/georgiopoulos/weather_forecast/network/client/WeatherForecastClient.kt create mode 100644 app/src/main/java/gr/georgiopoulos/weather_forecast/ui/activity/base/BaseActivity.kt create mode 100644 app/src/main/java/gr/georgiopoulos/weather_forecast/ui/activity/home/HomeActivity.kt create mode 100644 app/src/main/java/gr/georgiopoulos/weather_forecast/ui/activity/splash/SplashActivity.kt create mode 100644 app/src/main/java/gr/georgiopoulos/weather_forecast/ui/activity/weather_forecast/WeatherForecastActivity.kt create mode 100644 app/src/main/java/gr/georgiopoulos/weather_forecast/ui/adapter/cities/CitiesRecyclerViewAdapter.kt create mode 100644 app/src/main/java/gr/georgiopoulos/weather_forecast/ui/adapter/predictions/PredictionsRecyclerViewAdapter.kt create mode 100644 app/src/main/java/gr/georgiopoulos/weather_forecast/ui/adapter/weather_forecast/WeatherForecastRecyclerViewAdapter.kt create mode 100644 app/src/main/java/gr/georgiopoulos/weather_forecast/use_case/database_access/CitiesDatabaseAccessUseCase.kt create mode 100644 app/src/main/java/gr/georgiopoulos/weather_forecast/use_case/database_access/DatabaseAccessUseCase.kt create mode 100644 app/src/main/java/gr/georgiopoulos/weather_forecast/use_case/database_access/result/DatabaseAccessResult.kt create mode 100644 app/src/main/java/gr/georgiopoulos/weather_forecast/use_case/database_access/result/load/DatabaseAccessLoadCitiesResult.kt create mode 100644 app/src/main/java/gr/georgiopoulos/weather_forecast/use_case/places/PlacesPredictionsUseCase.kt create mode 100644 app/src/main/java/gr/georgiopoulos/weather_forecast/use_case/places/PlacesUseCase.kt create mode 100644 app/src/main/java/gr/georgiopoulos/weather_forecast/use_case/places/result/PlacesResult.kt create mode 100644 app/src/main/java/gr/georgiopoulos/weather_forecast/use_case/weather_forecast/FetchWeatherForecastUseCase.kt create mode 100644 app/src/main/java/gr/georgiopoulos/weather_forecast/use_case/weather_forecast/WeatherForecastUseCase.kt create mode 100644 app/src/main/java/gr/georgiopoulos/weather_forecast/use_case/weather_forecast/result/WeatherResult.kt create mode 100644 app/src/main/java/gr/georgiopoulos/weather_forecast/view_model/view_model/base/BaseViewModel.kt create mode 100644 app/src/main/java/gr/georgiopoulos/weather_forecast/view_model/view_model/base/BaseViewModelFactory.kt create mode 100644 app/src/main/java/gr/georgiopoulos/weather_forecast/view_model/view_model/home/HomeViewModel.kt create mode 100644 app/src/main/res/anim/no_change.xml create mode 100644 app/src/main/res/anim/slide_down.xml create mode 100644 app/src/main/res/anim/slide_up.xml create mode 100644 app/src/main/res/drawable/black_stroke_rectangle.xml create mode 100644 app/src/main/res/drawable/ic_add.xml create mode 100644 app/src/main/res/drawable/ic_back.xml create mode 100644 app/src/main/res/drawable/ic_cloud.xml create mode 100644 app/src/main/res/drawable/ic_delete.xml create mode 100644 app/src/main/res/drawable/ic_launcher_foreground.xml create mode 100644 app/src/main/res/drawable/ic_see_weather.xml create mode 100644 app/src/main/res/drawable/ic_sun.xml create mode 100644 app/src/main/res/drawable/ic_sun_animation.xml create mode 100644 app/src/main/res/drawable/white_oval.xml create mode 100644 app/src/main/res/layout/activity_home.xml create mode 100644 app/src/main/res/layout/activity_weather_forecast.xml create mode 100644 app/src/main/res/layout/bottom_sheet_add_city.xml create mode 100644 app/src/main/res/layout/layout_city.xml create mode 100644 app/src/main/res/layout/layout_date.xml create mode 100644 app/src/main/res/layout/layout_error.xml create mode 100644 app/src/main/res/layout/layout_forecast.xml create mode 100644 app/src/main/res/layout/layout_loading.xml create mode 100644 app/src/main/res/layout/layout_prediction.xml create mode 100644 app/src/main/res/mipmap-anydpi-v26/ic_launcher.xml create mode 100644 app/src/main/res/mipmap-anydpi-v26/ic_launcher_round.xml create mode 100644 app/src/main/res/mipmap-hdpi/ic_launcher.png create mode 100644 app/src/main/res/mipmap-hdpi/ic_launcher_round.png create mode 100644 app/src/main/res/mipmap-mdpi/ic_launcher.png create mode 100644 app/src/main/res/mipmap-mdpi/ic_launcher_round.png create mode 100644 app/src/main/res/mipmap-xhdpi/ic_launcher.png create mode 100644 app/src/main/res/mipmap-xhdpi/ic_launcher_round.png create mode 100644 app/src/main/res/mipmap-xxhdpi/ic_launcher.png create mode 100644 app/src/main/res/mipmap-xxhdpi/ic_launcher_round.png create mode 100644 app/src/main/res/mipmap-xxxhdpi/ic_launcher.png create mode 100644 app/src/main/res/mipmap-xxxhdpi/ic_launcher_round.png create mode 100644 app/src/main/res/values/colors.xml create mode 100644 app/src/main/res/values/dimens.xml create mode 100644 app/src/main/res/values/ic_launcher_background.xml create mode 100644 app/src/main/res/values/strings.xml create mode 100644 app/src/main/res/values/themes.xml create mode 100644 app/src/main/res/xml/backup_descriptor.xml create mode 100644 app/src/test/java/gr/georgiopoulos/weather_forecast/ExampleUnitTest.kt create mode 100644 app/src/test/java/gr/georgiopoulos/weather_forecast/common/extensions/StringExtensionsKtTest.kt create mode 100644 app/src/test/java/gr/georgiopoulos/weather_forecast/model/validator/wather_forecast/WeatherForecastValidatorTest.kt create mode 100644 app/src/test/java/gr/georgiopoulos/weather_forecast/view_model/view_model/home/HomeViewModelTest.kt create mode 100644 build.gradle create mode 100644 gradle.properties create mode 100644 gradle/wrapper/gradle-wrapper.jar create mode 100644 gradle/wrapper/gradle-wrapper.properties create mode 100644 gradlew create mode 100644 gradlew.bat create mode 100644 settings.gradle diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..aa724b7 --- /dev/null +++ b/.gitignore @@ -0,0 +1,15 @@ +*.iml +.gradle +/local.properties +/.idea/caches +/.idea/libraries +/.idea/modules.xml +/.idea/workspace.xml +/.idea/navEditor.xml +/.idea/assetWizardSettings.xml +.DS_Store +/build +/captures +.externalNativeBuild +.cxx +local.properties diff --git a/.idea/.gitignore b/.idea/.gitignore new file mode 100644 index 0000000..26d3352 --- /dev/null +++ b/.idea/.gitignore @@ -0,0 +1,3 @@ +# Default ignored files +/shelf/ +/workspace.xml diff --git a/.idea/codeStyles/Project.xml b/.idea/codeStyles/Project.xml new file mode 100644 index 0000000..7643783 --- /dev/null +++ b/.idea/codeStyles/Project.xml @@ -0,0 +1,123 @@ + + + + + + + + + + \ No newline at end of file diff --git a/.idea/codeStyles/codeStyleConfig.xml b/.idea/codeStyles/codeStyleConfig.xml new file mode 100644 index 0000000..79ee123 --- /dev/null +++ b/.idea/codeStyles/codeStyleConfig.xml @@ -0,0 +1,5 @@ + + + + \ No newline at end of file diff --git a/.idea/compiler.xml b/.idea/compiler.xml new file mode 100644 index 0000000..fb7f4a8 --- /dev/null +++ b/.idea/compiler.xml @@ -0,0 +1,6 @@ + + + + + + \ No newline at end of file diff --git a/.idea/gradle.xml b/.idea/gradle.xml new file mode 100644 index 0000000..5cd135a --- /dev/null +++ b/.idea/gradle.xml @@ -0,0 +1,20 @@ + + + + + + + \ No newline at end of file diff --git a/.idea/jarRepositories.xml b/.idea/jarRepositories.xml new file mode 100644 index 0000000..0380d8d --- /dev/null +++ b/.idea/jarRepositories.xml @@ -0,0 +1,30 @@ + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/.idea/misc.xml b/.idea/misc.xml new file mode 100644 index 0000000..a2f5006 --- /dev/null +++ b/.idea/misc.xml @@ -0,0 +1,14 @@ + + + + + + + + + + + + + \ No newline at end of file diff --git a/.idea/runConfigurations.xml b/.idea/runConfigurations.xml new file mode 100644 index 0000000..797acea --- /dev/null +++ b/.idea/runConfigurations.xml @@ -0,0 +1,10 @@ + + + + + + \ No newline at end of file diff --git a/.idea/vcs.xml b/.idea/vcs.xml new file mode 100644 index 0000000..94a25f7 --- /dev/null +++ b/.idea/vcs.xml @@ -0,0 +1,6 @@ + + + + + + \ No newline at end of file diff --git a/app/.gitignore b/app/.gitignore new file mode 100644 index 0000000..42afabf --- /dev/null +++ b/app/.gitignore @@ -0,0 +1 @@ +/build \ No newline at end of file diff --git a/app/build.gradle b/app/build.gradle new file mode 100644 index 0000000..9b5b964 --- /dev/null +++ b/app/build.gradle @@ -0,0 +1,68 @@ +plugins { + id 'com.android.application' + id 'kotlin-android' + id 'kotlin-kapt' +} + +android { + compileSdkVersion 30 + buildToolsVersion "30.0.3" + + defaultConfig { + applicationId "gr.georgiopoulos.weather_forecast" + minSdkVersion 21 + targetSdkVersion 30 + versionCode 1 + versionName "1.0" + + testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner" + } + + buildTypes { + release { + minifyEnabled false + proguardFiles getDefaultProguardFile('proguard-android-optimize.txt'), 'proguard-rules.pro' + } + } + compileOptions { + sourceCompatibility JavaVersion.VERSION_1_8 + targetCompatibility JavaVersion.VERSION_1_8 + } + kotlinOptions { + jvmTarget = '1.8' + } + + viewBinding { + enabled = true + } +} + +dependencies { + + implementation "org.jetbrains.kotlin:kotlin-stdlib:$kotlin_version" + implementation 'androidx.core:core-ktx:1.5.0' + implementation 'androidx.appcompat:appcompat:1.3.0' + implementation 'com.google.android.material:material:1.3.0' + implementation 'androidx.constraintlayout:constraintlayout:2.0.4' + implementation 'androidx.core:core-ktx:1.5.0' + implementation "com.google.android.material:material:1.3.0" + implementation 'androidx.lifecycle:lifecycle-extensions:2.2.0' + implementation "androidx.lifecycle:lifecycle-livedata-ktx:2.3.1" + //Dialogs + implementation "com.afollestad.material-dialogs:core:2.8.0" + //Network + implementation 'com.jakewharton.retrofit:retrofit2-kotlin-coroutines-adapter:0.9.2' + implementation 'org.jetbrains.kotlinx:kotlinx-coroutines-android:1.4.3' + implementation 'com.google.code.gson:gson:2.8.6' + implementation "com.squareup.retrofit2:retrofit:2.9.0" + implementation "com.squareup.retrofit2:converter-gson:2.9.0" + implementation 'com.squareup.okhttp3:logging-interceptor:4.9.1' + // Room components + implementation 'androidx.room:room-runtime:2.3.0' + kapt 'androidx.room:room-compiler:2.3.0' + //Image Handling + implementation 'com.squareup.picasso:picasso:2.71828' + testImplementation 'junit:junit:4.13.2' + androidTestImplementation 'androidx.test.ext:junit:1.1.2' + androidTestImplementation 'androidx.test.espresso:espresso-core:3.3.0' +} \ No newline at end of file diff --git a/app/proguard-rules.pro b/app/proguard-rules.pro new file mode 100644 index 0000000..481bb43 --- /dev/null +++ b/app/proguard-rules.pro @@ -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. +# +# 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 \ No newline at end of file diff --git a/app/src/androidTest/java/gr/georgiopoulos/weather_forecast/ExampleInstrumentedTest.kt b/app/src/androidTest/java/gr/georgiopoulos/weather_forecast/ExampleInstrumentedTest.kt new file mode 100644 index 0000000..a5098fb --- /dev/null +++ b/app/src/androidTest/java/gr/georgiopoulos/weather_forecast/ExampleInstrumentedTest.kt @@ -0,0 +1,24 @@ +package gr.georgiopoulos.weather_forecast + +import androidx.test.platform.app.InstrumentationRegistry +import androidx.test.ext.junit.runners.AndroidJUnit4 + +import org.junit.Test +import org.junit.runner.RunWith + +import org.junit.Assert.* + +/** + * Instrumented test, which will execute on an Android device. + * + * See [testing documentation](http://d.android.com/tools/testing). + */ +@RunWith(AndroidJUnit4::class) +class ExampleInstrumentedTest { + @Test + fun useAppContext() { + // Context of the app under test. + val appContext = InstrumentationRegistry.getInstrumentation().targetContext + assertEquals("gr.georgiopoulos.weather_forecast", appContext.packageName) + } +} \ No newline at end of file diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml new file mode 100644 index 0000000..f5ab3a1 --- /dev/null +++ b/app/src/main/AndroidManifest.xml @@ -0,0 +1,23 @@ + + + + + + + + + + + + + + \ No newline at end of file diff --git a/app/src/main/ic_launcher-playstore.png b/app/src/main/ic_launcher-playstore.png new file mode 100644 index 0000000000000000000000000000000000000000..012330771103691194cdca57b22465a7c274cff1 GIT binary patch literal 15413 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 literal 0 HcmV?d00001 diff --git a/app/src/main/java/gr/georgiopoulos/weather_forecast/common/definitions/Definitions.kt b/app/src/main/java/gr/georgiopoulos/weather_forecast/common/definitions/Definitions.kt new file mode 100644 index 0000000..c6ae02c --- /dev/null +++ b/app/src/main/java/gr/georgiopoulos/weather_forecast/common/definitions/Definitions.kt @@ -0,0 +1,12 @@ +package gr.georgiopoulos.weather_forecast.common + +object DefinitionsApi { + const val DOMAIN = "https://api.worldweatheronline.com/premium/v1/" + const val KEY = "a3f757787b24422f9fa152335212705" + const val DAYS = "5" + const val FORMAT = "json" +} + +object PlacesApi { + const val KEY = "AIzaSyDLVRDmqHzwOQ1C3D7JV6xi0JiH8oiO33M" +} \ No newline at end of file diff --git a/app/src/main/java/gr/georgiopoulos/weather_forecast/common/extensions/RecyclerViewExtensions.kt b/app/src/main/java/gr/georgiopoulos/weather_forecast/common/extensions/RecyclerViewExtensions.kt new file mode 100644 index 0000000..2c9eea0 --- /dev/null +++ b/app/src/main/java/gr/georgiopoulos/weather_forecast/common/extensions/RecyclerViewExtensions.kt @@ -0,0 +1,2 @@ +package gr.georgiopoulos.weather_forecast.common.extensions + diff --git a/app/src/main/java/gr/georgiopoulos/weather_forecast/common/extensions/StringExtensions.kt b/app/src/main/java/gr/georgiopoulos/weather_forecast/common/extensions/StringExtensions.kt new file mode 100644 index 0000000..2c9eea0 --- /dev/null +++ b/app/src/main/java/gr/georgiopoulos/weather_forecast/common/extensions/StringExtensions.kt @@ -0,0 +1,2 @@ +package gr.georgiopoulos.weather_forecast.common.extensions + diff --git a/app/src/main/java/gr/georgiopoulos/weather_forecast/common/extensions/ViewExtensions.kt b/app/src/main/java/gr/georgiopoulos/weather_forecast/common/extensions/ViewExtensions.kt new file mode 100644 index 0000000..88b8c9d --- /dev/null +++ b/app/src/main/java/gr/georgiopoulos/weather_forecast/common/extensions/ViewExtensions.kt @@ -0,0 +1,4 @@ +package gr.georgiopoulos.weather_forecast.common.extensions + +class ViewExtensions { +} \ No newline at end of file diff --git a/app/src/main/java/gr/georgiopoulos/weather_forecast/common/logger/CommonLogger.kt b/app/src/main/java/gr/georgiopoulos/weather_forecast/common/logger/CommonLogger.kt new file mode 100644 index 0000000..6bdd187 --- /dev/null +++ b/app/src/main/java/gr/georgiopoulos/weather_forecast/common/logger/CommonLogger.kt @@ -0,0 +1,4 @@ +package gr.georgiopoulos.weather_forecast.common.logger + +class CommonLogger { +} \ No newline at end of file diff --git a/app/src/main/java/gr/georgiopoulos/weather_forecast/common/logger/Logger.kt b/app/src/main/java/gr/georgiopoulos/weather_forecast/common/logger/Logger.kt new file mode 100644 index 0000000..ba69aca --- /dev/null +++ b/app/src/main/java/gr/georgiopoulos/weather_forecast/common/logger/Logger.kt @@ -0,0 +1,4 @@ +package gr.georgiopoulos.weather_forecast.common.logger + +interface Logger { +} \ No newline at end of file diff --git a/app/src/main/java/gr/georgiopoulos/weather_forecast/database/CityDatabase.kt b/app/src/main/java/gr/georgiopoulos/weather_forecast/database/CityDatabase.kt new file mode 100644 index 0000000..9a17c2f --- /dev/null +++ b/app/src/main/java/gr/georgiopoulos/weather_forecast/database/CityDatabase.kt @@ -0,0 +1,5 @@ +package gr.georgiopoulos.weather_forecast.database + +@Database(entities = [MovieDbTable::class], version = 1, exportSchema = false) +abstract class CityDatabase { +} \ No newline at end of file diff --git a/app/src/main/java/gr/georgiopoulos/weather_forecast/database/dao/CityTable.kt b/app/src/main/java/gr/georgiopoulos/weather_forecast/database/dao/CityTable.kt new file mode 100644 index 0000000..cb0235d --- /dev/null +++ b/app/src/main/java/gr/georgiopoulos/weather_forecast/database/dao/CityTable.kt @@ -0,0 +1,4 @@ +package gr.georgiopoulos.weather_forecast.database.dao + +class CityTable { +} \ No newline at end of file diff --git a/app/src/main/java/gr/georgiopoulos/weather_forecast/database/dao/CityTableDao.kt b/app/src/main/java/gr/georgiopoulos/weather_forecast/database/dao/CityTableDao.kt new file mode 100644 index 0000000..2051faa --- /dev/null +++ b/app/src/main/java/gr/georgiopoulos/weather_forecast/database/dao/CityTableDao.kt @@ -0,0 +1,4 @@ +package gr.georgiopoulos.weather_forecast.database.dao + +class CityTableDao { +} \ No newline at end of file diff --git a/app/src/main/java/gr/georgiopoulos/weather_forecast/model/error/Error.kt b/app/src/main/java/gr/georgiopoulos/weather_forecast/model/error/Error.kt new file mode 100644 index 0000000..43a778d --- /dev/null +++ b/app/src/main/java/gr/georgiopoulos/weather_forecast/model/error/Error.kt @@ -0,0 +1,3 @@ +package gr.georgiopoulos.weather_forecast.model.error + +sealed class Error diff --git a/app/src/main/java/gr/georgiopoulos/weather_forecast/model/parser/weather_forecast/WeatherForecast.kt b/app/src/main/java/gr/georgiopoulos/weather_forecast/model/parser/weather_forecast/WeatherForecast.kt new file mode 100644 index 0000000..8842518 --- /dev/null +++ b/app/src/main/java/gr/georgiopoulos/weather_forecast/model/parser/weather_forecast/WeatherForecast.kt @@ -0,0 +1,42 @@ +package gr.georgiopoulos.weather_forecast.model.parser.weather_forecast + +import com.google.gson.annotations.SerializedName + +data class WeatherForecast( + @SerializedName("data") + val data: Data? = null +) + +data class Data( + @SerializedName("weather") + val weather: List? = arrayListOf() +) + +data class Weather( + @SerializedName("date") + val date: String? = "", + @SerializedName("hourly") + val hourly: List? = arrayListOf() +) + +data class Hourly( + @SerializedName("weatherIconUrl") + val weatherIconUrl: List? = arrayListOf(), + @SerializedName("weatherDesc") + val weatherDesc: List? = arrayListOf(), + @SerializedName("time") + val time: String? = "", + @SerializedName("tempC") + val tempC: String? = "" +) + +data class WeatherDescription( + @SerializedName("value") + val value: String? = "" +) + + +data class WeatherIconUrl( + @SerializedName("value") + val value: String? = "" +) diff --git a/app/src/main/java/gr/georgiopoulos/weather_forecast/model/transformer/weather_forecast/ForecastTransformer.kt b/app/src/main/java/gr/georgiopoulos/weather_forecast/model/transformer/weather_forecast/ForecastTransformer.kt new file mode 100644 index 0000000..c04d694 --- /dev/null +++ b/app/src/main/java/gr/georgiopoulos/weather_forecast/model/transformer/weather_forecast/ForecastTransformer.kt @@ -0,0 +1,4 @@ +package gr.georgiopoulos.weather_forecast.model.transformer.weather_forecast + +class ForecastTransformer { +} \ No newline at end of file diff --git a/app/src/main/java/gr/georgiopoulos/weather_forecast/model/transformer/weather_forecast/SectionTransformer.kt b/app/src/main/java/gr/georgiopoulos/weather_forecast/model/transformer/weather_forecast/SectionTransformer.kt new file mode 100644 index 0000000..d0cb95d --- /dev/null +++ b/app/src/main/java/gr/georgiopoulos/weather_forecast/model/transformer/weather_forecast/SectionTransformer.kt @@ -0,0 +1,4 @@ +package gr.georgiopoulos.weather_forecast.model.transformer.weather_forecast + +class WeatherForecastTransformer { +} \ No newline at end of file diff --git a/app/src/main/java/gr/georgiopoulos/weather_forecast/model/transformer/weather_forecast/Transformer.kt b/app/src/main/java/gr/georgiopoulos/weather_forecast/model/transformer/weather_forecast/Transformer.kt new file mode 100644 index 0000000..e6c0457 --- /dev/null +++ b/app/src/main/java/gr/georgiopoulos/weather_forecast/model/transformer/weather_forecast/Transformer.kt @@ -0,0 +1,4 @@ +package gr.georgiopoulos.weather_forecast.model.transformer.weather_forecast + +interface Transformer { +} \ No newline at end of file diff --git a/app/src/main/java/gr/georgiopoulos/weather_forecast/model/transformer/weather_forecast/WeatherForecastTransformerFactory.kt b/app/src/main/java/gr/georgiopoulos/weather_forecast/model/transformer/weather_forecast/WeatherForecastTransformerFactory.kt new file mode 100644 index 0000000..b7bc92c --- /dev/null +++ b/app/src/main/java/gr/georgiopoulos/weather_forecast/model/transformer/weather_forecast/WeatherForecastTransformerFactory.kt @@ -0,0 +1,4 @@ +package gr.georgiopoulos.weather_forecast.model.transformer.weather_forecast + +class WeatherForecastTransformerFactory { +} \ No newline at end of file diff --git a/app/src/main/java/gr/georgiopoulos/weather_forecast/model/ui/weather_forecast/WeatherForecastUiModel.kt b/app/src/main/java/gr/georgiopoulos/weather_forecast/model/ui/weather_forecast/WeatherForecastUiModel.kt new file mode 100644 index 0000000..ba73dc1 --- /dev/null +++ b/app/src/main/java/gr/georgiopoulos/weather_forecast/model/ui/weather_forecast/WeatherForecastUiModel.kt @@ -0,0 +1,3 @@ +package gr.georgiopoulos.weather_forecast.model.ui.weather_forecast + +sealed class WeatherForecastUiModel diff --git a/app/src/main/java/gr/georgiopoulos/weather_forecast/model/validator/wather_forecast/Validator.kt b/app/src/main/java/gr/georgiopoulos/weather_forecast/model/validator/wather_forecast/Validator.kt new file mode 100644 index 0000000..02f1ca6 --- /dev/null +++ b/app/src/main/java/gr/georgiopoulos/weather_forecast/model/validator/wather_forecast/Validator.kt @@ -0,0 +1,4 @@ +package gr.georgiopoulos.weather_forecast.model.validator.wather_forecast + +interface WatherValidator { +} \ No newline at end of file diff --git a/app/src/main/java/gr/georgiopoulos/weather_forecast/model/validator/wather_forecast/Validity.kt b/app/src/main/java/gr/georgiopoulos/weather_forecast/model/validator/wather_forecast/Validity.kt new file mode 100644 index 0000000..0b98f1e --- /dev/null +++ b/app/src/main/java/gr/georgiopoulos/weather_forecast/model/validator/wather_forecast/Validity.kt @@ -0,0 +1,3 @@ +package gr.georgiopoulos.weather_forecast.model.validator + +sealed class Validity diff --git a/app/src/main/java/gr/georgiopoulos/weather_forecast/model/validator/wather_forecast/WeatherForecastValidator.kt b/app/src/main/java/gr/georgiopoulos/weather_forecast/model/validator/wather_forecast/WeatherForecastValidator.kt new file mode 100644 index 0000000..41d2db7 --- /dev/null +++ b/app/src/main/java/gr/georgiopoulos/weather_forecast/model/validator/wather_forecast/WeatherForecastValidator.kt @@ -0,0 +1,4 @@ +package gr.georgiopoulos.weather_forecast.model.validator.wather_forecast + +class WeatherForecastUIModelValidator { +} \ No newline at end of file diff --git a/app/src/main/java/gr/georgiopoulos/weather_forecast/network/api/WeatherForecastApi.kt b/app/src/main/java/gr/georgiopoulos/weather_forecast/network/api/WeatherForecastApi.kt new file mode 100644 index 0000000..18f52ff --- /dev/null +++ b/app/src/main/java/gr/georgiopoulos/weather_forecast/network/api/WeatherForecastApi.kt @@ -0,0 +1,17 @@ +package gr.georgiopoulos.weather_forecast.network.api + +import gr.georgiopoulos.weather_forecast.model.parser.weather_forecast.WeatherForecast +import retrofit2.http.GET +import retrofit2.http.Query + +interface WeatherForecastApi { + + @GET("/weather.ashx") + suspend fun getWeatherForecast( + @Query("key") key: String, + @Query("q", encoded = true) city: String, + @Query("num_of_days") days: String, + @Query("format") format: String + ): WeatherForecast + +} \ No newline at end of file diff --git a/app/src/main/java/gr/georgiopoulos/weather_forecast/network/client/WeatherForecastClient.kt b/app/src/main/java/gr/georgiopoulos/weather_forecast/network/client/WeatherForecastClient.kt new file mode 100644 index 0000000..27e6538 --- /dev/null +++ b/app/src/main/java/gr/georgiopoulos/weather_forecast/network/client/WeatherForecastClient.kt @@ -0,0 +1,43 @@ +package gr.georgiopoulos.weather_forecast.network.client + +import gr.georgiopoulos.weather_forecast.common.DefinitionsApi +import gr.georgiopoulos.weather_forecast.model.parser.weather_forecast.WeatherForecast +import gr.georgiopoulos.weather_forecast.network.api.WeatherForecastApi +import okhttp3.OkHttpClient +import okhttp3.logging.HttpLoggingInterceptor +import retrofit2.Retrofit +import retrofit2.converter.gson.GsonConverterFactory +import java.util.concurrent.TimeUnit + +class WeatherForecastClient { + + private var weatherForecastApi: WeatherForecastApi + + init { + weatherForecastApi = getRetrofit().create(WeatherForecastApi::class.java) + } + + private fun getRetrofit(): Retrofit { + return Retrofit.Builder() + .baseUrl(DefinitionsApi.DOMAIN) + .client(getOkHttpClient()) + .addConverterFactory(GsonConverterFactory.create()) + .build() + } + + private fun getOkHttpClient() = OkHttpClient().newBuilder() + .addInterceptor(HttpLoggingInterceptor().setLevel(HttpLoggingInterceptor.Level.BODY)) + .connectTimeout(60L, TimeUnit.SECONDS) + .readTimeout(60L, TimeUnit.SECONDS) + .writeTimeout(60L, TimeUnit.SECONDS) + .build() + + suspend fun getWeatherForecast(city: String): WeatherForecast { + return weatherForecastApi.getWeatherForecast( + key = DefinitionsApi.KEY, + city = city, + days = DefinitionsApi.DAYS, + format = DefinitionsApi.FORMAT + ) + } +} \ No newline at end of file diff --git a/app/src/main/java/gr/georgiopoulos/weather_forecast/ui/activity/base/BaseActivity.kt b/app/src/main/java/gr/georgiopoulos/weather_forecast/ui/activity/base/BaseActivity.kt new file mode 100644 index 0000000..915eb6b --- /dev/null +++ b/app/src/main/java/gr/georgiopoulos/weather_forecast/ui/activity/base/BaseActivity.kt @@ -0,0 +1,77 @@ +package gr.georgiopoulos.weather_forecast.ui.activity.base + +import android.annotation.SuppressLint +import android.view.View +import androidx.appcompat.app.AppCompatActivity +import androidx.lifecycle.Observer +import com.afollestad.materialdialogs.DialogCallback +import com.afollestad.materialdialogs.MaterialDialog +import gr.georgiopoulos.weather_forecast.R +import gr.georgiopoulos.weather_forecast.databinding.LayoutEmptyBinding +import gr.georgiopoulos.weather_forecast.databinding.LayoutLoadingBinding +import gr.georgiopoulos.weather_forecast.mvvm.view_model.base.BaseViewModel + +@SuppressLint("Registered") +open class BaseActivity : AppCompatActivity() { + + private var materialDialog: MaterialDialog? = null + protected var viewModel: T? = null + + override fun onDestroy() { + super.onDestroy() + materialDialog?.dismiss() + materialDialog = null + } + + fun initViewModelState(loadingLayout: LayoutLoadingBinding?, emptyLayout: LayoutEmptyBinding?) { + viewModel?.showLoadingView()?.observe(this, Observer { value -> + value?.let { show -> + loadingLayout?.root?.visibility = if (show) View.VISIBLE else View.GONE + } + }) + + viewModel?.showEmptyView()?.observe(this, Observer { value -> + value?.let { show -> + emptyLayout?.root?.visibility = if (show) View.VISIBLE else View.GONE + } + }) + + viewModel?.showInternetError()?.observe(this, Observer { value -> + value?.let { showError -> + if (showError) { + showNoInternetError() + } + } + }) + + viewModel?.showGenericError()?.observe(this, Observer { value -> + value?.let { showError -> + if (showError) { + showGenericError() + } + } + }) + } + + private fun showGenericError() { + showErrorDialog(getString(R.string.generic_error), closeListener = { dialog -> + dialog.dismiss() + viewModel?.genericErrorLiveData?.value = false + }) + } + + private fun showNoInternetError() { + showErrorDialog(getString(R.string.no_internet), closeListener = { dialog -> + dialog.dismiss() + viewModel?.noInternetLiveData?.value = false + }) + } + + fun showErrorDialog(errorDescription: String = "", closeListener: DialogCallback) { + materialDialog = MaterialDialog(this).show { + title(text = getString(R.string.dialog_title)) + message(text = errorDescription) + positiveButton(text = getString(R.string.ok), click = closeListener) + } + } +} \ No newline at end of file diff --git a/app/src/main/java/gr/georgiopoulos/weather_forecast/ui/activity/home/HomeActivity.kt b/app/src/main/java/gr/georgiopoulos/weather_forecast/ui/activity/home/HomeActivity.kt new file mode 100644 index 0000000..f2a4c55 --- /dev/null +++ b/app/src/main/java/gr/georgiopoulos/weather_forecast/ui/activity/home/HomeActivity.kt @@ -0,0 +1,12 @@ +package gr.georgiopoulos.weather_forecast.ui.home + +import androidx.appcompat.app.AppCompatActivity +import android.os.Bundle +import gr.georgiopoulos.weather_forecast.R + +class HomeActivity : AppCompatActivity() { + override fun onCreate(savedInstanceState: Bundle?) { + super.onCreate(savedInstanceState) + setContentView(R.layout.activity_home) + } +} \ No newline at end of file diff --git a/app/src/main/java/gr/georgiopoulos/weather_forecast/ui/activity/splash/SplashActivity.kt b/app/src/main/java/gr/georgiopoulos/weather_forecast/ui/activity/splash/SplashActivity.kt new file mode 100644 index 0000000..616b7ef --- /dev/null +++ b/app/src/main/java/gr/georgiopoulos/weather_forecast/ui/activity/splash/SplashActivity.kt @@ -0,0 +1,41 @@ +package gr.georgiopoulos.weather_forecast.ui.splash + +import android.content.Intent +import android.os.Bundle +import android.os.Handler +import android.os.Looper +import androidx.appcompat.app.AppCompatActivity +import gr.georgiopoulos.weather_forecast.R +import gr.georgiopoulos.weather_forecast.ui.home.HomeActivity + +class SplashActivity : AppCompatActivity() { + + companion object { + const val SPLASH_DELAY: Long = 3000 + } + + private var delayHandler: Handler? = null + + override fun onCreate(savedInstanceState: Bundle?) { + super.onCreate(savedInstanceState) + setContentView(R.layout.activity_splash) + initLayout() + } + + private val mRunnable: Runnable = Runnable { + if (!isFinishing) { + startActivity(Intent(this, HomeActivity::class.java)) + finish() + } + } + + public override fun onDestroy() { + delayHandler?.removeCallbacks(mRunnable) + super.onDestroy() + } + + private fun initLayout() { + delayHandler = Looper.myLooper()?.let { Handler(it) } + delayHandler?.postDelayed(mRunnable, SPLASH_DELAY) + } +} \ No newline at end of file diff --git a/app/src/main/java/gr/georgiopoulos/weather_forecast/ui/activity/weather_forecast/WeatherForecastActivity.kt b/app/src/main/java/gr/georgiopoulos/weather_forecast/ui/activity/weather_forecast/WeatherForecastActivity.kt new file mode 100644 index 0000000..8d26412 --- /dev/null +++ b/app/src/main/java/gr/georgiopoulos/weather_forecast/ui/activity/weather_forecast/WeatherForecastActivity.kt @@ -0,0 +1,4 @@ +package gr.georgiopoulos.weather_forecast.ui.activity.weather_forecast + +class WeatherForecastActivity { +} \ No newline at end of file diff --git a/app/src/main/java/gr/georgiopoulos/weather_forecast/ui/adapter/cities/CitiesRecyclerViewAdapter.kt b/app/src/main/java/gr/georgiopoulos/weather_forecast/ui/adapter/cities/CitiesRecyclerViewAdapter.kt new file mode 100644 index 0000000..fc837e0 --- /dev/null +++ b/app/src/main/java/gr/georgiopoulos/weather_forecast/ui/adapter/cities/CitiesRecyclerViewAdapter.kt @@ -0,0 +1,4 @@ +package gr.georgiopoulos.weather_forecast.ui.adapter.cities + +class CitiesRecyclerViewAdapter { +} \ No newline at end of file diff --git a/app/src/main/java/gr/georgiopoulos/weather_forecast/ui/adapter/predictions/PredictionsRecyclerViewAdapter.kt b/app/src/main/java/gr/georgiopoulos/weather_forecast/ui/adapter/predictions/PredictionsRecyclerViewAdapter.kt new file mode 100644 index 0000000..86bef55 --- /dev/null +++ b/app/src/main/java/gr/georgiopoulos/weather_forecast/ui/adapter/predictions/PredictionsRecyclerViewAdapter.kt @@ -0,0 +1,45 @@ +package gr.georgiopoulos.weather_forecast.ui.adapter.add_city + +import android.view.LayoutInflater +import android.view.ViewGroup +import androidx.recyclerview.widget.RecyclerView +import gr.georgiopoulos.weather_forecast.databinding.LayoutCityBinding + +class AddCityRecyclerViewAdapter( + private val onCityClick: (String) -> Unit, +) : RecyclerView.Adapter() { + + private var cities: MutableList = mutableListOf() + + override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): CityViewHolder { + val binding = LayoutCityBinding.inflate(LayoutInflater.from(parent.context), parent, false) + return CityViewHolder(binding, onCityClick) + } + + override fun onBindViewHolder(holder: CityViewHolder, position: Int) { + val city = cities[position] + holder.bind(city) + } + + override fun getItemCount(): Int { + return cities.size + } + + fun setCities(cities: MutableList) { + this.cities.clear() + this.cities.addAll(cities) + notifyDataSetChanged() + } + + class CityViewHolder( + private val binding: LayoutCityBinding, + private val onCityClick: (String) -> Unit + ) : RecyclerView.ViewHolder(binding.root) { + fun bind(city: String) { + with(binding) { + cityName.text = city + root.setOnClickListener { onCityClick(city) } + } + } + } +} \ No newline at end of file diff --git a/app/src/main/java/gr/georgiopoulos/weather_forecast/ui/adapter/weather_forecast/WeatherForecastRecyclerViewAdapter.kt b/app/src/main/java/gr/georgiopoulos/weather_forecast/ui/adapter/weather_forecast/WeatherForecastRecyclerViewAdapter.kt new file mode 100644 index 0000000..e777743 --- /dev/null +++ b/app/src/main/java/gr/georgiopoulos/weather_forecast/ui/adapter/weather_forecast/WeatherForecastRecyclerViewAdapter.kt @@ -0,0 +1,4 @@ +package gr.georgiopoulos.weather_forecast.ui.adapter.weather_forecast + +class WeatherForecastRecyclerViewAdapter { +} \ No newline at end of file diff --git a/app/src/main/java/gr/georgiopoulos/weather_forecast/use_case/database_access/CitiesDatabaseAccessUseCase.kt b/app/src/main/java/gr/georgiopoulos/weather_forecast/use_case/database_access/CitiesDatabaseAccessUseCase.kt new file mode 100644 index 0000000..0450bee --- /dev/null +++ b/app/src/main/java/gr/georgiopoulos/weather_forecast/use_case/database_access/CitiesDatabaseAccessUseCase.kt @@ -0,0 +1,4 @@ +package gr.georgiopoulos.weather_forecast.use_case.database_access + +class CitiesDatabaseAccessUseCase { +} \ No newline at end of file diff --git a/app/src/main/java/gr/georgiopoulos/weather_forecast/use_case/database_access/DatabaseAccessUseCase.kt b/app/src/main/java/gr/georgiopoulos/weather_forecast/use_case/database_access/DatabaseAccessUseCase.kt new file mode 100644 index 0000000..fa57af7 --- /dev/null +++ b/app/src/main/java/gr/georgiopoulos/weather_forecast/use_case/database_access/DatabaseAccessUseCase.kt @@ -0,0 +1,4 @@ +package gr.georgiopoulos.weather_forecast.use_case.database_access + +interface DatabaseAccessUseCase { +} \ No newline at end of file diff --git a/app/src/main/java/gr/georgiopoulos/weather_forecast/use_case/database_access/result/DatabaseAccessResult.kt b/app/src/main/java/gr/georgiopoulos/weather_forecast/use_case/database_access/result/DatabaseAccessResult.kt new file mode 100644 index 0000000..0e59478 --- /dev/null +++ b/app/src/main/java/gr/georgiopoulos/weather_forecast/use_case/database_access/result/DatabaseAccessResult.kt @@ -0,0 +1,4 @@ +package gr.georgiopoulos.weather_forecast.use_case.database_access.result + +interface DatabaseAccessResult { +} \ No newline at end of file diff --git a/app/src/main/java/gr/georgiopoulos/weather_forecast/use_case/database_access/result/load/DatabaseAccessLoadCitiesResult.kt b/app/src/main/java/gr/georgiopoulos/weather_forecast/use_case/database_access/result/load/DatabaseAccessLoadCitiesResult.kt new file mode 100644 index 0000000..b4de572 --- /dev/null +++ b/app/src/main/java/gr/georgiopoulos/weather_forecast/use_case/database_access/result/load/DatabaseAccessLoadCitiesResult.kt @@ -0,0 +1,4 @@ +package gr.georgiopoulos.weather_forecast.use_case.database_access.result.load + +interface DatabaseAccessLoadCitiesResult { +} \ No newline at end of file diff --git a/app/src/main/java/gr/georgiopoulos/weather_forecast/use_case/places/PlacesPredictionsUseCase.kt b/app/src/main/java/gr/georgiopoulos/weather_forecast/use_case/places/PlacesPredictionsUseCase.kt new file mode 100644 index 0000000..7d02d93 --- /dev/null +++ b/app/src/main/java/gr/georgiopoulos/weather_forecast/use_case/places/PlacesPredictionsUseCase.kt @@ -0,0 +1,4 @@ +package gr.georgiopoulos.weather_forecast.use_case.places + +class PlacesPredictionsUseCase { +} \ No newline at end of file diff --git a/app/src/main/java/gr/georgiopoulos/weather_forecast/use_case/places/PlacesUseCase.kt b/app/src/main/java/gr/georgiopoulos/weather_forecast/use_case/places/PlacesUseCase.kt new file mode 100644 index 0000000..f525385 --- /dev/null +++ b/app/src/main/java/gr/georgiopoulos/weather_forecast/use_case/places/PlacesUseCase.kt @@ -0,0 +1,4 @@ +package gr.georgiopoulos.weather_forecast.use_case.places + +interface PlacesUseCase { +} \ No newline at end of file diff --git a/app/src/main/java/gr/georgiopoulos/weather_forecast/use_case/places/result/PlacesResult.kt b/app/src/main/java/gr/georgiopoulos/weather_forecast/use_case/places/result/PlacesResult.kt new file mode 100644 index 0000000..d698222 --- /dev/null +++ b/app/src/main/java/gr/georgiopoulos/weather_forecast/use_case/places/result/PlacesResult.kt @@ -0,0 +1,4 @@ +package gr.georgiopoulos.weather_forecast.use_case.places.result + +interface PlacesResult { +} \ No newline at end of file diff --git a/app/src/main/java/gr/georgiopoulos/weather_forecast/use_case/weather_forecast/FetchWeatherForecastUseCase.kt b/app/src/main/java/gr/georgiopoulos/weather_forecast/use_case/weather_forecast/FetchWeatherForecastUseCase.kt new file mode 100644 index 0000000..79efc94 --- /dev/null +++ b/app/src/main/java/gr/georgiopoulos/weather_forecast/use_case/weather_forecast/FetchWeatherForecastUseCase.kt @@ -0,0 +1,4 @@ +package gr.georgiopoulos.weather_forecast.use_case.weather_forecast + +interface FetchWeatherForecastUseCase { +} \ No newline at end of file diff --git a/app/src/main/java/gr/georgiopoulos/weather_forecast/use_case/weather_forecast/WeatherForecastUseCase.kt b/app/src/main/java/gr/georgiopoulos/weather_forecast/use_case/weather_forecast/WeatherForecastUseCase.kt new file mode 100644 index 0000000..fa8aef8 --- /dev/null +++ b/app/src/main/java/gr/georgiopoulos/weather_forecast/use_case/weather_forecast/WeatherForecastUseCase.kt @@ -0,0 +1,4 @@ +package gr.georgiopoulos.weather_forecast.use_case.weather_forecast + +interface WeatherForecastUseCase { +} \ No newline at end of file diff --git a/app/src/main/java/gr/georgiopoulos/weather_forecast/use_case/weather_forecast/result/WeatherResult.kt b/app/src/main/java/gr/georgiopoulos/weather_forecast/use_case/weather_forecast/result/WeatherResult.kt new file mode 100644 index 0000000..579ff85 --- /dev/null +++ b/app/src/main/java/gr/georgiopoulos/weather_forecast/use_case/weather_forecast/result/WeatherResult.kt @@ -0,0 +1,4 @@ +package gr.georgiopoulos.weather_forecast.use_case.weather_forecast.result + +interface WeatherResult { +} \ No newline at end of file diff --git a/app/src/main/java/gr/georgiopoulos/weather_forecast/view_model/view_model/base/BaseViewModel.kt b/app/src/main/java/gr/georgiopoulos/weather_forecast/view_model/view_model/base/BaseViewModel.kt new file mode 100644 index 0000000..167237f --- /dev/null +++ b/app/src/main/java/gr/georgiopoulos/weather_forecast/view_model/view_model/base/BaseViewModel.kt @@ -0,0 +1,83 @@ +package gr.georgiopoulos.weather_forecast.mvvm.view_model.base + +import androidx.lifecycle.LiveData +import androidx.lifecycle.MutableLiveData +import androidx.lifecycle.ViewModel +import kotlinx.coroutines.CoroutineDispatcher +import kotlinx.coroutines.CoroutineScope +import kotlinx.coroutines.Dispatchers +import kotlinx.coroutines.SupervisorJob +import java.net.UnknownHostException +import kotlin.coroutines.CoroutineContext + +open class BaseViewModel : ViewModel(), CoroutineScope { + + private val viewModelJob = SupervisorJob() + protected val bgDispatcher: CoroutineDispatcher = Dispatchers.IO + protected val uiScope = CoroutineScope(Dispatchers.Main + viewModelJob) + protected var loadingLiveData: MutableLiveData = MutableLiveData() + protected var emptyLiveData: MutableLiveData = MutableLiveData() + var noInternetLiveData: MutableLiveData = MutableLiveData() + var genericErrorLiveData: MutableLiveData = MutableLiveData() + + /** + * This is the job for all coroutines started by this ViewModel. + * + * Cancelling this job will cancel all coroutines started by this ViewModel. + * + * This would ensure that our coroutines do not get canceled even + * when the screen rotates and our activity is recreated + */ + + override val coroutineContext: CoroutineContext + get() = Dispatchers.IO + viewModelJob + + /** + * Cancel all coroutines when the ViewModel is cleared + */ + + override fun onCleared() { + super.onCleared() + viewModelJob.cancel() + } + + fun showEmptyView(): LiveData { + return emptyLiveData + } + + fun showLoadingView(): LiveData { + return loadingLiveData + } + + fun showInternetError(): LiveData { + return noInternetLiveData + } + + fun showGenericError(): LiveData { + return genericErrorLiveData + } + + fun onErrorThrowable(throwable: Throwable?, isShowEmptyView: Boolean = false) { + loadingLiveData.value = false + if (throwable == null) { + genericErrorLiveData.value = true + return + } + if (isNetworkError(throwable)) { + noInternetLiveData.value = true + } else { + genericErrorLiveData.value = true + } + if (isShowEmptyView) + emptyLiveData.value = true + } + + private fun isNetworkError(throwable: Throwable): Boolean { + when (throwable) { + is UnknownHostException -> { + return true + } + } + return false + } +} \ No newline at end of file diff --git a/app/src/main/java/gr/georgiopoulos/weather_forecast/view_model/view_model/base/BaseViewModelFactory.kt b/app/src/main/java/gr/georgiopoulos/weather_forecast/view_model/view_model/base/BaseViewModelFactory.kt new file mode 100644 index 0000000..fc1a1fe --- /dev/null +++ b/app/src/main/java/gr/georgiopoulos/weather_forecast/view_model/view_model/base/BaseViewModelFactory.kt @@ -0,0 +1,12 @@ +package gr.georgiopoulos.weather_forecast.mvvm.view_model.base + +import androidx.lifecycle.ViewModel +import androidx.lifecycle.ViewModelProvider + +@Suppress("UNCHECKED_CAST") +class BaseViewModelFactory(val creator: () -> T) : ViewModelProvider.Factory { + + override fun create(modelClass: Class): T { + return creator() as T + } +} \ No newline at end of file diff --git a/app/src/main/java/gr/georgiopoulos/weather_forecast/view_model/view_model/home/HomeViewModel.kt b/app/src/main/java/gr/georgiopoulos/weather_forecast/view_model/view_model/home/HomeViewModel.kt new file mode 100644 index 0000000..f264e29 --- /dev/null +++ b/app/src/main/java/gr/georgiopoulos/weather_forecast/view_model/view_model/home/HomeViewModel.kt @@ -0,0 +1,6 @@ +package gr.georgiopoulos.weather_forecast.mvvm.view_model.home + +import gr.georgiopoulos.weather_forecast.mvvm.view_model.base.BaseViewModel + +class HomeViewModel: BaseViewModel() { +} \ No newline at end of file diff --git a/app/src/main/res/anim/no_change.xml b/app/src/main/res/anim/no_change.xml new file mode 100644 index 0000000..d05f36c --- /dev/null +++ b/app/src/main/res/anim/no_change.xml @@ -0,0 +1,4 @@ + + + + \ No newline at end of file diff --git a/app/src/main/res/anim/slide_down.xml b/app/src/main/res/anim/slide_down.xml new file mode 100644 index 0000000..12607af --- /dev/null +++ b/app/src/main/res/anim/slide_down.xml @@ -0,0 +1,5 @@ + + \ No newline at end of file diff --git a/app/src/main/res/anim/slide_up.xml b/app/src/main/res/anim/slide_up.xml new file mode 100644 index 0000000..d05f36c --- /dev/null +++ b/app/src/main/res/anim/slide_up.xml @@ -0,0 +1,4 @@ + + + + \ No newline at end of file diff --git a/app/src/main/res/drawable/black_stroke_rectangle.xml b/app/src/main/res/drawable/black_stroke_rectangle.xml new file mode 100644 index 0000000..f244e94 --- /dev/null +++ b/app/src/main/res/drawable/black_stroke_rectangle.xml @@ -0,0 +1,9 @@ + + + + + + \ No newline at end of file diff --git a/app/src/main/res/drawable/ic_add.xml b/app/src/main/res/drawable/ic_add.xml new file mode 100644 index 0000000..cc94d5a --- /dev/null +++ b/app/src/main/res/drawable/ic_add.xml @@ -0,0 +1,5 @@ + + + diff --git a/app/src/main/res/drawable/ic_back.xml b/app/src/main/res/drawable/ic_back.xml new file mode 100644 index 0000000..31e7df2 --- /dev/null +++ b/app/src/main/res/drawable/ic_back.xml @@ -0,0 +1,5 @@ + + + diff --git a/app/src/main/res/drawable/ic_cloud.xml b/app/src/main/res/drawable/ic_cloud.xml new file mode 100644 index 0000000..7d76add --- /dev/null +++ b/app/src/main/res/drawable/ic_cloud.xml @@ -0,0 +1,5 @@ + + + diff --git a/app/src/main/res/drawable/ic_delete.xml b/app/src/main/res/drawable/ic_delete.xml new file mode 100644 index 0000000..5c93a9f --- /dev/null +++ b/app/src/main/res/drawable/ic_delete.xml @@ -0,0 +1,5 @@ + + + diff --git a/app/src/main/res/drawable/ic_launcher_foreground.xml b/app/src/main/res/drawable/ic_launcher_foreground.xml new file mode 100644 index 0000000..4aaafee --- /dev/null +++ b/app/src/main/res/drawable/ic_launcher_foreground.xml @@ -0,0 +1,15 @@ + + + + + diff --git a/app/src/main/res/drawable/ic_see_weather.xml b/app/src/main/res/drawable/ic_see_weather.xml new file mode 100644 index 0000000..dad80a1 --- /dev/null +++ b/app/src/main/res/drawable/ic_see_weather.xml @@ -0,0 +1,5 @@ + + + diff --git a/app/src/main/res/drawable/ic_sun.xml b/app/src/main/res/drawable/ic_sun.xml new file mode 100644 index 0000000..7ba8d12 --- /dev/null +++ b/app/src/main/res/drawable/ic_sun.xml @@ -0,0 +1,5 @@ + + + diff --git a/app/src/main/res/drawable/ic_sun_animation.xml b/app/src/main/res/drawable/ic_sun_animation.xml new file mode 100644 index 0000000..a8b409b --- /dev/null +++ b/app/src/main/res/drawable/ic_sun_animation.xml @@ -0,0 +1,4 @@ + + + + \ No newline at end of file diff --git a/app/src/main/res/drawable/white_oval.xml b/app/src/main/res/drawable/white_oval.xml new file mode 100644 index 0000000..efef162 --- /dev/null +++ b/app/src/main/res/drawable/white_oval.xml @@ -0,0 +1,8 @@ + + + + + \ No newline at end of file diff --git a/app/src/main/res/layout/activity_home.xml b/app/src/main/res/layout/activity_home.xml new file mode 100644 index 0000000..aed3474 --- /dev/null +++ b/app/src/main/res/layout/activity_home.xml @@ -0,0 +1,18 @@ + + + + + + \ No newline at end of file diff --git a/app/src/main/res/layout/activity_weather_forecast.xml b/app/src/main/res/layout/activity_weather_forecast.xml new file mode 100644 index 0000000..cdc89f2 --- /dev/null +++ b/app/src/main/res/layout/activity_weather_forecast.xml @@ -0,0 +1,6 @@ + + + + \ No newline at end of file diff --git a/app/src/main/res/layout/bottom_sheet_add_city.xml b/app/src/main/res/layout/bottom_sheet_add_city.xml new file mode 100644 index 0000000..b5ca1e4 --- /dev/null +++ b/app/src/main/res/layout/bottom_sheet_add_city.xml @@ -0,0 +1,58 @@ + + + + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/layout/layout_city.xml b/app/src/main/res/layout/layout_city.xml new file mode 100644 index 0000000..cdc89f2 --- /dev/null +++ b/app/src/main/res/layout/layout_city.xml @@ -0,0 +1,6 @@ + + + + \ No newline at end of file diff --git a/app/src/main/res/layout/layout_date.xml b/app/src/main/res/layout/layout_date.xml new file mode 100644 index 0000000..cdc89f2 --- /dev/null +++ b/app/src/main/res/layout/layout_date.xml @@ -0,0 +1,6 @@ + + + + \ No newline at end of file diff --git a/app/src/main/res/layout/layout_error.xml b/app/src/main/res/layout/layout_error.xml new file mode 100644 index 0000000..2439f08 --- /dev/null +++ b/app/src/main/res/layout/layout_error.xml @@ -0,0 +1,35 @@ + + + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/layout/layout_forecast.xml b/app/src/main/res/layout/layout_forecast.xml new file mode 100644 index 0000000..61b1ed0 --- /dev/null +++ b/app/src/main/res/layout/layout_forecast.xml @@ -0,0 +1,74 @@ + + + + + + + + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/layout/layout_loading.xml b/app/src/main/res/layout/layout_loading.xml new file mode 100644 index 0000000..e457077 --- /dev/null +++ b/app/src/main/res/layout/layout_loading.xml @@ -0,0 +1,22 @@ + + + + + \ No newline at end of file diff --git a/app/src/main/res/layout/layout_prediction.xml b/app/src/main/res/layout/layout_prediction.xml new file mode 100644 index 0000000..dbef09f --- /dev/null +++ b/app/src/main/res/layout/layout_prediction.xml @@ -0,0 +1,15 @@ + + \ No newline at end of file diff --git a/app/src/main/res/mipmap-anydpi-v26/ic_launcher.xml b/app/src/main/res/mipmap-anydpi-v26/ic_launcher.xml new file mode 100644 index 0000000..7353dbd --- /dev/null +++ b/app/src/main/res/mipmap-anydpi-v26/ic_launcher.xml @@ -0,0 +1,5 @@ + + + + + \ No newline at end of file diff --git a/app/src/main/res/mipmap-anydpi-v26/ic_launcher_round.xml b/app/src/main/res/mipmap-anydpi-v26/ic_launcher_round.xml new file mode 100644 index 0000000..7353dbd --- /dev/null +++ b/app/src/main/res/mipmap-anydpi-v26/ic_launcher_round.xml @@ -0,0 +1,5 @@ + + + + + \ No newline at end of file diff --git a/app/src/main/res/mipmap-hdpi/ic_launcher.png b/app/src/main/res/mipmap-hdpi/ic_launcher.png new file mode 100644 index 0000000000000000000000000000000000000000..c9d4bbfe7ff84621e46b8abce01a8b81ed3f6640 GIT binary patch literal 1814 zcmV+x2kH2UP))6@$y1qrBJJq81MmY&$Vmee)Km0pu1V4_MNTP}<5xu-sY* zAe4aRBKO^Hx3lf`vfWF!6l1vrs0x(Q5)&Rkqz}jQKV@L&oE?~%o!ymPfwh?gdPeWi04?z}>KgJ3*F<`AXma1Gj()<3+{k>WjYj^!TYnW{$2k35ysWR|KzqAe$q+3z<$w|KJaSD`fE@ z|IAp;n#TR$Vb0dSDzep}(#Va$m7!j;QYL zx#t?K0NeODHBbvRQJa5GjkFlFI{YU&E6pVTy7P#;c^y4ky)MMWV|BQP9BJ9E0NePu zc%TMqp(bjh2RU1<1-PLCWmMbL0lQ!%LsUlC%>0_N2FD_E_eshPui&|*@` z4cgy!ko@P$Rjea-U1LaFmH++CTx1rZFmkbdjcofYxq0>HBbvRwVDIcW)MK5YSU^IH5Q;G7IEPWIeKk zL1pw9CK-E=Ow>1r)!^%D!4d{lhECIC8HXUuERY*D__|t1szGRKGd-T+SsT8jXku5u zBb=X^338)GY)$mQ_XT((lWGvYRKHa>LEu>TnYvjZH)_PzL=Svl06nM7Agxq}&X61RlLcXB(O3T#`8o8vP*)3VvK zm|28;-)O!tz+(x6z|KGex$S;g5SJ*(iQIfWtysn&tO-Hi0zqJ+ASb`(>A^Av0jv|f z_0t5AMnNv4Ymbbj3<6c{ZRDT2iGoNRT2PArr zB5I+gR&zkw3^GEZ1{uLN=rPy^JqFvL$Bkcf>uKY6-(z+vInIDXd2psnvL&4%e>v|v;7Bk^LE!&L#rW!=IuH4nVhUN(kB$j zRG5~I{y}GR5BapbYA&=ERYgYfKB$iSKX84LGIr_ljwp6TBpfm-^I=-3rUiSwT~uQ} zwCeg%FUG9eS{O9y^>=2xyRf#YtEA~7SsA=WkT{dUv?}pmBJ*qN&%8Qq`gCY4bUL+9 zuh=oJu<$ARkVl#H;dd*SeX()>-lAa7+=7B<>7%}>6>m5kj*;Ug z6^_cA;K<2+rC@X>0}apuO}tJs2HegD>|qak*drsx|4VrQ1l3T0xc~qF07*qoM6N<$ Ef;~5JrT_o{ literal 0 HcmV?d00001 diff --git a/app/src/main/res/mipmap-hdpi/ic_launcher_round.png b/app/src/main/res/mipmap-hdpi/ic_launcher_round.png new file mode 100644 index 0000000000000000000000000000000000000000..540804dd9b1eaf411f2ac0d5c4d536e4f8da624c GIT binary patch literal 3902 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 M07*qoM6N<$g1Li~DgXcg literal 0 HcmV?d00001 diff --git a/app/src/main/res/mipmap-mdpi/ic_launcher.png b/app/src/main/res/mipmap-mdpi/ic_launcher.png new file mode 100644 index 0000000000000000000000000000000000000000..b1baaf9696a62e4dcd683eb548ed837562fafe21 GIT binary patch literal 1360 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 IM6N<$f-sVuV*mgE literal 0 HcmV?d00001 diff --git a/app/src/main/res/mipmap-xxhdpi/ic_launcher.png b/app/src/main/res/mipmap-xxhdpi/ic_launcher.png new file mode 100644 index 0000000000000000000000000000000000000000..6af1dd15c4befecc6324c1173fba9d6a2eedef45 GIT binary patch literal 3909 zcmaKv2QVDo_Q$PdwG~~Ikd3I(R}W%|AWE#L(W36Mi58+PA!|uui53z>Ss{qtdkIPO zvXQlV2zH5RL5TkRe{beL|C#^1cV_OnXYTpToVj=A-21&T@H_gM)|>j z9=XJxlq=~4nU8PgrskOO@DpgJ(n!YQ_R~39Kh+BNVz1N$DQ3TMXowKc)hY`0ppu?K zeY2AM1T+z;7qP<>ORUCm{>F3vDn&#olJ zZI!C@a)7}GFba{um$`GBK zUT;+BHgZ&O`Ng6$Q1ooGhyT~CS z)e(Q&*A*YcCkm4>r68@9Wujtb-!DzF{eZXU!NFl%bfk&Hn>mxL@mQAO8w|CuQHY6@ zu(M> zOtRR5=31TfbTZFbK&UU7!Zteb9PDPsCjvBSSodf;=qr`Pd!o_hdy9BHrrFfK6_FA^ z;X;D8EsUM%a6Pq5H>@{YO{hWWY7hMZlLSpA!HiWG{Jhprzwu*t*M+aJKk-L4MrMXB zMD>k}dsU)h%mF9)agw>7wzia?hHaKCldvF!tbh@y8hV~`I7}(QOYj=d_QLq|2{6q* zn3cX9+!UI~n21rl0A=MBFMt4(FfNS$C(Hxy#zkDVyXPQu?C3S<1X+p+OYN|JLjxsf z%sEm%1V;)~F(cm2Hc3r)-2cm8CpQY~WjeSrQj7yj_>kv{^dosZ+BX#()6FNV-uVjy z%$hbE9Z75S4vP|Qb`G)Av^kRdX22!$6~}Aj=Nd_}+j^({9hT2&W^2Zyx9JVV+d|i2a-`4}!`K=2k1(g3W2g`8 zsa%r&gmAz`*RskSE*tCAk@h+kjz`Izn5y8k`i56Dz1`_O43* z$vXgc>J6&CMkzaJ0<@3%E={Qx8fO|^5)AL&{M}@W4NM7j7;CN+)oJgwE1S_}{|uv2 zs0DCjUGfcg?MNi=^e4Dm@h!BjN+U&v57wUaIFvR8mkLwZZWJ7r7ip|4ML_&9%fKnC z#^DjYG|X)`slWQ0pL*!Gn(Q3JCfljCa8w5UL9S8!mz1O=Cs6XFO&yLLqO9jGIGBeY zn6?aLQb+OgbhCcN8nIqZHF5f-;d9GfcMieN<_6RVn#(~)RsIuHsk#1A~OHnwbQ z!EpvW;7V0cYL~uh+Y1wjj7?~4SPnMR(zem;^x~}}pUF8J>4H!f?UCqlKNc0!TBP-A zq$gFxf$*!BF}*P7&dIonW9M&a`XJFqmKvTy97z}&$OX_~4|t<~YSG3lB0QtRQM^Gu z5kvC`)yg&pa^XDh-D(k~$2yaLo`Z=XaE70njzk*oZ)dpI-*jHyBIZU^!Y@n1szLfY zn{!(axgQZOLgA83Pg*8=+*O#)?~4fa4T}TrG4p6Jkx|CY_WhrvPKOl9VxwsLT`X7_ z^KCCkV4sot9%dESr$Lu@=T{$$T}?@8ZNTM8h5v_Ju6@kFl+^H6DaBs;g^P%<|6BPtDpCl@j2^CJ@p8&6 zxBP)+NY{Q;b!~S~ySSjpIkWfXI8xL4=>C-kIGm-w*)t*Q648IzoQ7M0pflG~7?z$p zQ3v~*4Y#tKz8YTrt#n?mAu|JYPUEt6qED_<|7lHZ81CQnWa52MMh3!5hR(!0KSfJk z5AoyX?X7r;k;8b9BsY^HTSU}bO0_}T4_qM{fGb)p?v}n(^DsDtoADovgjTLQI)#)x z-R}4y!TN|P8ocxz6IkMn9~-;H))v+|h(9hV_R{gr#S5k!J*HXZHNSLTG?om`4`-^K z`E`T5smOnSQr3B()$$yIGcEO8RSwN>i1(5-P2dSI>)&J`M^Bwqb|>dBaCwOE8HEq; z{Dt*Oa}u%D-shW`Irvt^t&qq)|1);hU4`MD4MRqZG66<4o}BW|CT6=o{oiL@x$P!2 z{E=kwVCVbK;VZz~QpHbl)+KpmU%1lp8I~_B=4AcDp=bvn;$Nz$hx>VTWDd1KDB6mS zx~W^1t=TLUPt7RrF1z8aCVk@YXGv~&<0{Q_`pN38$Qq@<-3Wv>@?{e_4=WweDyKcU8w$TaEz2G?hLv4^gQ^{k=S##0A>1E- z2$;QHu`jxC7G{esW1yg~M}h+k=LK}gsiyk1de%~5u9t^#SxkyHixytzt=~xH86*?8 z3Z-gRlp2px-y?+-k@IrggyIhE)H(xFwqhP<87=_Kzs zBP+1p?7%~i`B3Kie)yrMi|mxjq^rAtRHci*rWmi-6b8CoxwHB4L|dGx;7VDHHxd~8ngchNsz zLf*~}d9u0 z2!R+qQJgCR*fx(!3E&h+AnKo$?>HM;~R@=OpW`5vAgLP zb*Gx@3N3X}5FYC5-`MgGQ)*$Rr#S`MhM7x?YP za4^(?HUa1FBNbBDy>(P>IjYSHGAzRPP-Bs8P+ZMx}FV`j7z4Hmq#=O>-+<8g^ zWrevHhjOzEUS$@>ru%p`m%-TwVQ6O%@F$Shfa6>W(eb_jbDAe&dSUXk|0Vp~g7HmI z@-Fvb2`iuJ$wE zz_$`w^)%`O24UY4L9yQ85Bu5ZOi)x(;(Cdte0{w2_cwCOtKWEe<53^1y_-V^z+nEV zr$P)7s)b~ckt`zH?lGXIEOYBbzdqh&-p}l7kYH)^eycp*kmG*zwim|jQr=+(CG5UK z2Tl)Otj;CBAlABhln`uRtw0}6R0@WL?j;;uX!k{%%@)diwU025t;Rxp)S2-A%Ex;xi+jD@-6j5`??lZLRJ zJ9!}&0%!B%`UrAGA|OIDFFm$w>3bU;GiCZm15zga=x;YlxddH7RE+%ivH3S$7mcs9 zn*$=0f8y$cfr%(FiqzA9<5Yt}(VA7F zbkA|6F_{lb$pz}3w*0nhrNIv!&kW5m`L#2*Swy}rJ51mki&Fj zJVh(vLPm@nj|ad6&#V|}r9FffP$ahfNxDkZ)uQZ@ot&Ns%C6ih6cf9joEf%f(4~q8 zjJv2RGN6Dj@u@#3NjH_*WImsWOTbmZgNGuthZ6wpd9;q!68braK%J49%1NNNP4Cip zgojio$w6**;6C_qa@UZkuuA_6!T2Xt3*=2bdTBr5!T8Fk-@WKGlInW2y;GNs`2RB( c+!=86ub6~t!<~Th?=jWwTX%HJb(|vq1&n4^lmGw# literal 0 HcmV?d00001 diff --git a/app/src/main/res/mipmap-xxhdpi/ic_launcher_round.png b/app/src/main/res/mipmap-xxhdpi/ic_launcher_round.png new file mode 100644 index 0000000000000000000000000000000000000000..a52de7610592ea660d97e33fb61490f61eb2eb6c GIT binary patch literal 8830 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 TG-99sZUAH@6(t(Pj6?nh&njR# literal 0 HcmV?d00001 diff --git a/app/src/main/res/values/colors.xml b/app/src/main/res/values/colors.xml new file mode 100644 index 0000000..999ecd5 --- /dev/null +++ b/app/src/main/res/values/colors.xml @@ -0,0 +1,12 @@ + + + #FFBB86FC + #FF6200EE + #FF3700B3 + #FF03DAC5 + #FF018786 + #87CEEB + #FDB813 + #FF000000 + #FFFFFFFF + \ No newline at end of file diff --git a/app/src/main/res/values/dimens.xml b/app/src/main/res/values/dimens.xml new file mode 100644 index 0000000..416ca8d --- /dev/null +++ b/app/src/main/res/values/dimens.xml @@ -0,0 +1,14 @@ + + + + + 12sp + 14sp + 16sp + 18sp + 24sp + + + 160dp + 80dp + \ No newline at end of file diff --git a/app/src/main/res/values/ic_launcher_background.xml b/app/src/main/res/values/ic_launcher_background.xml new file mode 100644 index 0000000..ce094b8 --- /dev/null +++ b/app/src/main/res/values/ic_launcher_background.xml @@ -0,0 +1,4 @@ + + + #87CEEB + \ No newline at end of file diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml new file mode 100644 index 0000000..e6cc4f7 --- /dev/null +++ b/app/src/main/res/values/strings.xml @@ -0,0 +1,8 @@ + + Weather Forecast + No results + Oops! There was an error + Oops + No internet connection + OK + \ No newline at end of file diff --git a/app/src/main/res/values/themes.xml b/app/src/main/res/values/themes.xml new file mode 100644 index 0000000..37cb14d --- /dev/null +++ b/app/src/main/res/values/themes.xml @@ -0,0 +1,13 @@ + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/xml/backup_descriptor.xml b/app/src/main/res/xml/backup_descriptor.xml new file mode 100644 index 0000000..cfcd563 --- /dev/null +++ b/app/src/main/res/xml/backup_descriptor.xml @@ -0,0 +1,4 @@ + + + + diff --git a/app/src/test/java/gr/georgiopoulos/weather_forecast/ExampleUnitTest.kt b/app/src/test/java/gr/georgiopoulos/weather_forecast/ExampleUnitTest.kt new file mode 100644 index 0000000..2865f4c --- /dev/null +++ b/app/src/test/java/gr/georgiopoulos/weather_forecast/ExampleUnitTest.kt @@ -0,0 +1,17 @@ +package gr.georgiopoulos.weather_forecast + +import org.junit.Test + +import org.junit.Assert.* + +/** + * Example local unit test, which will execute on the development machine (host). + * + * See [testing documentation](http://d.android.com/tools/testing). + */ +class ExampleUnitTest { + @Test + fun addition_isCorrect() { + assertEquals(4, 2 + 2) + } +} \ No newline at end of file diff --git a/app/src/test/java/gr/georgiopoulos/weather_forecast/common/extensions/StringExtensionsKtTest.kt b/app/src/test/java/gr/georgiopoulos/weather_forecast/common/extensions/StringExtensionsKtTest.kt new file mode 100644 index 0000000..d8366c5 --- /dev/null +++ b/app/src/test/java/gr/georgiopoulos/weather_forecast/common/extensions/StringExtensionsKtTest.kt @@ -0,0 +1,5 @@ +package gr.georgiopoulos.weather_forecast.common.extensions + +import junit.framework.TestCase + +class StringExtensionsKtTest : TestCase() \ No newline at end of file diff --git a/app/src/test/java/gr/georgiopoulos/weather_forecast/model/validator/wather_forecast/WeatherForecastValidatorTest.kt b/app/src/test/java/gr/georgiopoulos/weather_forecast/model/validator/wather_forecast/WeatherForecastValidatorTest.kt new file mode 100644 index 0000000..a0c6657 --- /dev/null +++ b/app/src/test/java/gr/georgiopoulos/weather_forecast/model/validator/wather_forecast/WeatherForecastValidatorTest.kt @@ -0,0 +1,5 @@ +package gr.georgiopoulos.weather_forecast.model.validator.wather_forecast + +import org.junit.Assert.* + +class WeatherForecastValidatorTest \ No newline at end of file diff --git a/app/src/test/java/gr/georgiopoulos/weather_forecast/view_model/view_model/home/HomeViewModelTest.kt b/app/src/test/java/gr/georgiopoulos/weather_forecast/view_model/view_model/home/HomeViewModelTest.kt new file mode 100644 index 0000000..fc70f7c --- /dev/null +++ b/app/src/test/java/gr/georgiopoulos/weather_forecast/view_model/view_model/home/HomeViewModelTest.kt @@ -0,0 +1,5 @@ +package gr.georgiopoulos.weather_forecast.view_model.view_model.home + +import org.junit.Assert.* + +class HomeViewModelTest \ No newline at end of file diff --git a/build.gradle b/build.gradle new file mode 100644 index 0000000..2f3d35b --- /dev/null +++ b/build.gradle @@ -0,0 +1,27 @@ +// Top-level build file where you can add configuration options common to all sub-projects/modules. +buildscript { + ext.kotlin_version = "1.5.10" + repositories { + google() + mavenCentral() + } + dependencies { + classpath "com.android.tools.build:gradle:4.2.1" + classpath "org.jetbrains.kotlin:kotlin-gradle-plugin:$kotlin_version" + + // NOTE: Do not place your application dependencies here; they belong + // in the individual module build.gradle files + } +} + +allprojects { + repositories { + google() + mavenCentral() + jcenter() // Warning: this repository is going to shut down soon + } +} + +task clean(type: Delete) { + delete rootProject.buildDir +} \ No newline at end of file diff --git a/gradle.properties b/gradle.properties new file mode 100644 index 0000000..2521752 --- /dev/null +++ b/gradle.properties @@ -0,0 +1,19 @@ +# 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 \ No newline at end of file diff --git a/gradle/wrapper/gradle-wrapper.jar b/gradle/wrapper/gradle-wrapper.jar new file mode 100644 index 0000000000000000000000000000000000000000..f6b961fd5a86aa5fbfe90f707c3138408be7c718 GIT binary patch literal 54329 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

<5G2M1WZP5 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 F{|7XC?P&l2 literal 0 HcmV?d00001 diff --git a/gradle/wrapper/gradle-wrapper.properties b/gradle/wrapper/gradle-wrapper.properties new file mode 100644 index 0000000..93b0342 --- /dev/null +++ b/gradle/wrapper/gradle-wrapper.properties @@ -0,0 +1,6 @@ +#Sun May 30 13:56:54 EEST 2021 +distributionBase=GRADLE_USER_HOME +distributionUrl=https\://services.gradle.org/distributions/gradle-6.7.1-bin.zip +distributionPath=wrapper/dists +zipStorePath=wrapper/dists +zipStoreBase=GRADLE_USER_HOME diff --git a/gradlew b/gradlew new file mode 100644 index 0000000..cccdd3d --- /dev/null +++ b/gradlew @@ -0,0 +1,172 @@ +#!/usr/bin/env sh + +############################################################################## +## +## 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="" + +# 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, switch paths to Windows format before running java +if $cygwin ; 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=$((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" + +# by default we should be in the correct project dir, but when run from Finder on Mac, the cwd is wrong +if [ "$(uname)" = "Darwin" ] && [ "$HOME" = "$PWD" ]; then + cd "$(dirname "$0")" +fi + +exec "$JAVACMD" "$@" diff --git a/gradlew.bat b/gradlew.bat new file mode 100644 index 0000000..f955316 --- /dev/null +++ b/gradlew.bat @@ -0,0 +1,84 @@ +@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 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= + +@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 init + +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 init + +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 + +:init +@rem Get command-line arguments, handling Windows variants + +if not "%OS%" == "Windows_NT" goto win9xME_args + +:win9xME_args +@rem Slurp the command line arguments. +set CMD_LINE_ARGS= +set _SKIP=2 + +:win9xME_args_slurp +if "x%~1" == "x" goto execute + +set CMD_LINE_ARGS=%* + +: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 %CMD_LINE_ARGS% + +: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 diff --git a/settings.gradle b/settings.gradle new file mode 100644 index 0000000..ac8f3c9 --- /dev/null +++ b/settings.gradle @@ -0,0 +1,2 @@ +rootProject.name = "weather_forecast" +include ':app'