From 1c369035f6e58cc06577ba0b08b8245b1a8117ef Mon Sep 17 00:00:00 2001 From: snehak24 Date: Sun, 2 Feb 2020 23:39:29 +0530 Subject: [PATCH 1/6] Initial commit - Base Project Structure --- .gitignore | 14 ++ .idea/codeStyles/Project.xml | 113 ++++++++++++ .idea/gradle.xml | 19 ++ .idea/runConfigurations.xml | 12 ++ .idea/vcs.xml | 6 + app/.gitignore | 1 + app/build.gradle | 115 ++++++++++++ app/proguard-rules.pro | 21 +++ .../weatherapp/ExampleInstrumentedTest.kt | 24 +++ app/src/main/AndroidManifest.xml | 32 ++++ .../sneha/weatherapp/WeatherApplication.kt | 23 +++ .../data/local/db/DatabaseService.kt | 20 ++ .../weatherapp/data/local/db/dao/DummyDao.kt | 20 ++ .../data/local/db/entity/DummyEntity.kt | 18 ++ .../data/local/prefs/UserPreferences.kt | 52 ++++++ .../com/sneha/weatherapp/data/model/Dummy.kt | 14 ++ .../com/sneha/weatherapp/data/model/User.kt | 27 +++ .../sneha/weatherapp/data/remote/Endpoints.kt | 8 + .../weatherapp/data/remote/NetworkService.kt | 19 ++ .../weatherapp/data/remote/Networking.kt | 43 +++++ .../data/remote/request/DummyRequest.kt | 10 + .../data/remote/response/DummyResponse.kt | 19 ++ .../data/remote/response/GeneralResponse.kt | 14 ++ .../data/repository/DummyRepository.kt | 18 ++ .../data/repository/UserRepository.kt | 43 +++++ .../com/sneha/weatherapp/di/Qualifiers.kt | 11 ++ .../java/com/sneha/weatherapp/di/Scopes.kt | 16 ++ .../di/component/ActivityComponent.kt | 19 ++ .../di/component/ApplicationComponent.kt | 61 +++++++ .../di/component/FragmentComponent.kt | 16 ++ .../di/component/ViewHolderComponent.kt | 16 ++ .../weatherapp/di/module/ActivityModule.kt | 50 +++++ .../weatherapp/di/module/ApplicationModule.kt | 73 ++++++++ .../weatherapp/di/module/FragmentModule.kt | 37 ++++ .../weatherapp/di/module/ViewHolderModule.kt | 15 ++ .../sneha/weatherapp/ui/base/BaseActivity.kt | 68 +++++++ .../sneha/weatherapp/ui/base/BaseAdapter.kt | 97 ++++++++++ .../sneha/weatherapp/ui/base/BaseFragment.kt | 75 ++++++++ .../weatherapp/ui/base/BaseItemViewHolder.kt | 88 +++++++++ .../weatherapp/ui/base/BaseItemViewModel.kt | 22 +++ .../sneha/weatherapp/ui/base/BaseViewModel.kt | 61 +++++++ .../weatherapp/ui/dummies/DummiesAdapter.kt | 14 ++ .../weatherapp/ui/dummies/DummiesFragment.kt | 50 +++++ .../weatherapp/ui/dummies/DummiesViewModel.kt | 46 +++++ .../ui/dummies/DummyItemViewHolder.kt | 37 ++++ .../ui/dummies/DummyItemViewModel.kt | 35 ++++ .../weatherapp/ui/dummy/DummyActivity.kt | 31 ++++ .../weatherapp/ui/dummy/DummyViewModel.kt | 20 ++ .../weatherapp/ui/splash/SplashActivity.kt | 38 ++++ .../weatherapp/ui/splash/SplashViewModel.kt | 38 ++++ .../utils/ViewModelProviderFactory.kt | 32 ++++ .../weatherapp/utils/common/Constants.kt | 5 + .../sneha/weatherapp/utils/common/Event.kt | 21 +++ .../weatherapp/utils/common/GlideHelper.kt | 13 ++ .../utils/common/LoadMoreListener.kt | 6 + .../sneha/weatherapp/utils/common/Resource.kt | 14 ++ .../sneha/weatherapp/utils/common/Status.kt | 8 + .../weatherapp/utils/common/TimeUtils.kt | 34 ++++ .../weatherapp/utils/display/ScreenUtils.kt | 10 + .../sneha/weatherapp/utils/display/Toaster.kt | 19 ++ .../com/sneha/weatherapp/utils/log/Logger.kt | 36 ++++ .../weatherapp/utils/network/NetworkError.kt | 14 ++ .../weatherapp/utils/network/NetworkHelper.kt | 45 +++++ .../utils/rx/RxSchedulerProvider.kt | 16 ++ .../weatherapp/utils/rx/SchedulerProvider.kt | 14 ++ .../drawable-v24/ic_launcher_foreground.xml | 34 ++++ .../res/drawable/ic_launcher_background.xml | 170 +++++++++++++++++ app/src/main/res/layout/activity_dummy.xml | 14 ++ app/src/main/res/layout/activity_splash.xml | 11 ++ app/src/main/res/layout/fragment_dummies.xml | 23 +++ app/src/main/res/layout/item_view_dummies.xml | 33 ++++ .../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 -> 2963 bytes .../res/mipmap-hdpi/ic_launcher_round.png | Bin 0 -> 4905 bytes app/src/main/res/mipmap-mdpi/ic_launcher.png | Bin 0 -> 2060 bytes .../res/mipmap-mdpi/ic_launcher_round.png | Bin 0 -> 2783 bytes app/src/main/res/mipmap-xhdpi/ic_launcher.png | Bin 0 -> 4490 bytes .../res/mipmap-xhdpi/ic_launcher_round.png | Bin 0 -> 6895 bytes .../main/res/mipmap-xxhdpi/ic_launcher.png | Bin 0 -> 6387 bytes .../res/mipmap-xxhdpi/ic_launcher_round.png | Bin 0 -> 10413 bytes .../main/res/mipmap-xxxhdpi/ic_launcher.png | Bin 0 -> 9128 bytes .../res/mipmap-xxxhdpi/ic_launcher_round.png | Bin 0 -> 15132 bytes app/src/main/res/values/colors.xml | 14 ++ app/src/main/res/values/strings.xml | 11 ++ app/src/main/res/values/styles.xml | 18 ++ .../com/sneha/weatherapp/ExampleUnitTest.kt | 17 ++ build.gradle | 88 +++++++++ gradle.properties | 21 +++ gradle/wrapper/gradle-wrapper.jar | Bin 0 -> 54329 bytes gradle/wrapper/gradle-wrapper.properties | 6 + gradlew | 172 ++++++++++++++++++ settings.gradle | 2 + 93 files changed, 2670 insertions(+) create mode 100644 .gitignore create mode 100644 .idea/codeStyles/Project.xml create mode 100644 .idea/gradle.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/com/sneha/weatherapp/ExampleInstrumentedTest.kt create mode 100644 app/src/main/AndroidManifest.xml create mode 100644 app/src/main/java/com/sneha/weatherapp/WeatherApplication.kt create mode 100644 app/src/main/java/com/sneha/weatherapp/data/local/db/DatabaseService.kt create mode 100644 app/src/main/java/com/sneha/weatherapp/data/local/db/dao/DummyDao.kt create mode 100644 app/src/main/java/com/sneha/weatherapp/data/local/db/entity/DummyEntity.kt create mode 100644 app/src/main/java/com/sneha/weatherapp/data/local/prefs/UserPreferences.kt create mode 100644 app/src/main/java/com/sneha/weatherapp/data/model/Dummy.kt create mode 100644 app/src/main/java/com/sneha/weatherapp/data/model/User.kt create mode 100644 app/src/main/java/com/sneha/weatherapp/data/remote/Endpoints.kt create mode 100644 app/src/main/java/com/sneha/weatherapp/data/remote/NetworkService.kt create mode 100644 app/src/main/java/com/sneha/weatherapp/data/remote/Networking.kt create mode 100644 app/src/main/java/com/sneha/weatherapp/data/remote/request/DummyRequest.kt create mode 100644 app/src/main/java/com/sneha/weatherapp/data/remote/response/DummyResponse.kt create mode 100644 app/src/main/java/com/sneha/weatherapp/data/remote/response/GeneralResponse.kt create mode 100644 app/src/main/java/com/sneha/weatherapp/data/repository/DummyRepository.kt create mode 100644 app/src/main/java/com/sneha/weatherapp/data/repository/UserRepository.kt create mode 100644 app/src/main/java/com/sneha/weatherapp/di/Qualifiers.kt create mode 100644 app/src/main/java/com/sneha/weatherapp/di/Scopes.kt create mode 100644 app/src/main/java/com/sneha/weatherapp/di/component/ActivityComponent.kt create mode 100644 app/src/main/java/com/sneha/weatherapp/di/component/ApplicationComponent.kt create mode 100644 app/src/main/java/com/sneha/weatherapp/di/component/FragmentComponent.kt create mode 100644 app/src/main/java/com/sneha/weatherapp/di/component/ViewHolderComponent.kt create mode 100644 app/src/main/java/com/sneha/weatherapp/di/module/ActivityModule.kt create mode 100644 app/src/main/java/com/sneha/weatherapp/di/module/ApplicationModule.kt create mode 100644 app/src/main/java/com/sneha/weatherapp/di/module/FragmentModule.kt create mode 100644 app/src/main/java/com/sneha/weatherapp/di/module/ViewHolderModule.kt create mode 100644 app/src/main/java/com/sneha/weatherapp/ui/base/BaseActivity.kt create mode 100644 app/src/main/java/com/sneha/weatherapp/ui/base/BaseAdapter.kt create mode 100644 app/src/main/java/com/sneha/weatherapp/ui/base/BaseFragment.kt create mode 100644 app/src/main/java/com/sneha/weatherapp/ui/base/BaseItemViewHolder.kt create mode 100644 app/src/main/java/com/sneha/weatherapp/ui/base/BaseItemViewModel.kt create mode 100644 app/src/main/java/com/sneha/weatherapp/ui/base/BaseViewModel.kt create mode 100644 app/src/main/java/com/sneha/weatherapp/ui/dummies/DummiesAdapter.kt create mode 100644 app/src/main/java/com/sneha/weatherapp/ui/dummies/DummiesFragment.kt create mode 100644 app/src/main/java/com/sneha/weatherapp/ui/dummies/DummiesViewModel.kt create mode 100644 app/src/main/java/com/sneha/weatherapp/ui/dummies/DummyItemViewHolder.kt create mode 100644 app/src/main/java/com/sneha/weatherapp/ui/dummies/DummyItemViewModel.kt create mode 100644 app/src/main/java/com/sneha/weatherapp/ui/dummy/DummyActivity.kt create mode 100644 app/src/main/java/com/sneha/weatherapp/ui/dummy/DummyViewModel.kt create mode 100644 app/src/main/java/com/sneha/weatherapp/ui/splash/SplashActivity.kt create mode 100644 app/src/main/java/com/sneha/weatherapp/ui/splash/SplashViewModel.kt create mode 100644 app/src/main/java/com/sneha/weatherapp/utils/ViewModelProviderFactory.kt create mode 100644 app/src/main/java/com/sneha/weatherapp/utils/common/Constants.kt create mode 100644 app/src/main/java/com/sneha/weatherapp/utils/common/Event.kt create mode 100644 app/src/main/java/com/sneha/weatherapp/utils/common/GlideHelper.kt create mode 100644 app/src/main/java/com/sneha/weatherapp/utils/common/LoadMoreListener.kt create mode 100644 app/src/main/java/com/sneha/weatherapp/utils/common/Resource.kt create mode 100644 app/src/main/java/com/sneha/weatherapp/utils/common/Status.kt create mode 100644 app/src/main/java/com/sneha/weatherapp/utils/common/TimeUtils.kt create mode 100644 app/src/main/java/com/sneha/weatherapp/utils/display/ScreenUtils.kt create mode 100644 app/src/main/java/com/sneha/weatherapp/utils/display/Toaster.kt create mode 100644 app/src/main/java/com/sneha/weatherapp/utils/log/Logger.kt create mode 100644 app/src/main/java/com/sneha/weatherapp/utils/network/NetworkError.kt create mode 100644 app/src/main/java/com/sneha/weatherapp/utils/network/NetworkHelper.kt create mode 100644 app/src/main/java/com/sneha/weatherapp/utils/rx/RxSchedulerProvider.kt create mode 100644 app/src/main/java/com/sneha/weatherapp/utils/rx/SchedulerProvider.kt create mode 100644 app/src/main/res/drawable-v24/ic_launcher_foreground.xml create mode 100644 app/src/main/res/drawable/ic_launcher_background.xml create mode 100644 app/src/main/res/layout/activity_dummy.xml create mode 100644 app/src/main/res/layout/activity_splash.xml create mode 100644 app/src/main/res/layout/fragment_dummies.xml create mode 100644 app/src/main/res/layout/item_view_dummies.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/strings.xml create mode 100644 app/src/main/res/values/styles.xml create mode 100644 app/src/test/java/com/sneha/weatherapp/ExampleUnitTest.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 settings.gradle diff --git a/.gitignore b/.gitignore new file mode 100644 index 00000000..603b1407 --- /dev/null +++ b/.gitignore @@ -0,0 +1,14 @@ +*.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 diff --git a/.idea/codeStyles/Project.xml b/.idea/codeStyles/Project.xml new file mode 100644 index 00000000..ae78c113 --- /dev/null +++ b/.idea/codeStyles/Project.xml @@ -0,0 +1,113 @@ + + + + + +
+ + + + xmlns:android + + ^$ + + + +
+
+ + + + xmlns:.* + + ^$ + + + BY_NAME + +
+
+ + + + .*:id + + http://schemas.android.com/apk/res/android + + + +
+
+ + + + .*:name + + http://schemas.android.com/apk/res/android + + + +
+
+ + + + name + + ^$ + + + +
+
+ + + + style + + ^$ + + + +
+
+ + + + .* + + ^$ + + + BY_NAME + +
+
+ + + + .* + + http://schemas.android.com/apk/res/android + + + ANDROID_ATTRIBUTE_ORDER + +
+
+ + + + .* + + .* + + + BY_NAME + +
+
+
+
+
+
\ No newline at end of file diff --git a/.idea/gradle.xml b/.idea/gradle.xml new file mode 100644 index 00000000..169fd0dd --- /dev/null +++ b/.idea/gradle.xml @@ -0,0 +1,19 @@ + + + + + + \ No newline at end of file diff --git a/.idea/runConfigurations.xml b/.idea/runConfigurations.xml new file mode 100644 index 00000000..7f68460d --- /dev/null +++ b/.idea/runConfigurations.xml @@ -0,0 +1,12 @@ + + + + + + \ No newline at end of file diff --git a/.idea/vcs.xml b/.idea/vcs.xml new file mode 100644 index 00000000..35eb1ddf --- /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 00000000..796b96d1 --- /dev/null +++ b/app/.gitignore @@ -0,0 +1 @@ +/build diff --git a/app/build.gradle b/app/build.gradle new file mode 100644 index 00000000..daad2849 --- /dev/null +++ b/app/build.gradle @@ -0,0 +1,115 @@ +apply plugin: 'com.android.application' + +apply plugin: 'kotlin-android' + +apply plugin: 'kotlin-android-extensions' + +apply plugin: 'kotlin-kapt' + +android { + // uses the variables like compile_sdk_version to keep the dependencies same throughout the application + compileSdkVersion rootProject.compile_sdk_version + buildToolsVersion rootProject.build_tool_version + + defaultConfig { + applicationId "com.sneha.weatherapp" + minSdkVersion rootProject.ext.min_sdk_version + targetSdkVersion rootProject.ext.target_sdk_version + versionCode 1 + versionName "1.0" + testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner" + multiDexEnabled true + } + + buildTypes { + debug { + buildConfigField("String", "BASE_URL", "\"http://worksample-api.herokuapp.com/\"") + buildConfigField("String", "API_KEY", "\"HBNA19QVVAPP\"") + } + release { + minifyEnabled false + proguardFiles getDefaultProguardFile('proguard-android-optimize.txt'), 'proguard-rules.pro' +// buildConfigField("String", "BASE_URL", "\"http://worksample-api.herokuapp.com/\"") +// buildConfigField("String", "API_KEY", "\"HBNA19QVVAPP\"") + } + } +} + +dependencies { + implementation"org.jetbrains.kotlin:kotlin-stdlib-jdk7:$kotlin_version" + + //JARs + implementation fileTree(dir: 'libs', include: ['*.jar']) + + // Android Support Library + implementation "androidx.appcompat:appcompat:$app_compat_version" + + // Constraint Layout + implementation "androidx.constraintlayout:constraintlayout:$constraint_version" + + // Material Design + implementation "com.google.android.material:material:$support_library_version" + + // RecyclerView + implementation 'androidx.recyclerview:recyclerview:1.1.0' + + // CardView + implementation "androidx.cardview:cardview:$support_library_version" + + // ViewModel and LiveData + implementation "androidx.lifecycle:lifecycle-extensions:$lifecycle_version" + + // Lifecycle Annotations + implementation 'androidx.legacy:legacy-support-v4:1.0.0' + implementation 'androidx.lifecycle:lifecycle-extensions:2.2.0' + implementation 'androidx.lifecycle:lifecycle-viewmodel-ktx:2.2.0' + kapt "androidx.lifecycle:lifecycle-compiler:$lifecycle_version" + + // Multidex + implementation "androidx.multidex:multidex:2.0.1" + + // Dagger + implementation "com.google.dagger:dagger:$dagger_version" + kapt "com.google.dagger:dagger-compiler:$dagger_version" + + // Database + implementation "androidx.room:room-runtime:$room_version" + kapt "androidx.room:room-compiler:$room_version" + implementation "androidx.room:room-rxjava2:$room_version" + + // Image + implementation "com.github.bumptech.glide:glide:$glide_version" + kapt "com.github.bumptech.glide:compiler:$glide_version" + + // Networking + implementation "com.squareup.retrofit2:retrofit:$retrofit_version" + implementation "com.squareup.retrofit2:converter-gson:$retrofit_version" + implementation "com.squareup.okhttp3:okhttp:$okhttp_version" + implementation "com.squareup.okhttp3:logging-interceptor:$okhttp_version" + implementation "com.jakewharton.retrofit:retrofit2-rxjava2-adapter:1.0.0" + + // Reactive + implementation "io.reactivex.rxjava2:rxjava:$rootProject.rxjava_version" + implementation "io.reactivex.rxjava2:rxandroid:$rootProject.rxandroid_version" + + // logger + implementation "com.jakewharton.timber:timber:$timber_version" + + // Parser + implementation "com.google.code.gson:gson:$gson_version" + + // Local Unit tests + testImplementation "junit:junit:$junit_version" + testImplementation "org.mockito:mockito-core:$mockito_version" + kaptTest "com.google.dagger:dagger-compiler:$dagger_version" + testImplementation "android.arch.core:core-testing:$core_testing_version" + testImplementation "org.hamcrest:hamcrest-library:$hamcrest_version" + + // UI Testing + androidTestImplementation "androidx.test:runner:$test_runner_version" + androidTestImplementation "androidx.test.ext:junit:$test_ext_runner_version" + androidTestImplementation "androidx.test.espresso:espresso-core:$espresso_version" + androidTestImplementation "androidx.test.espresso:espresso-intents:$espresso_version" + androidTestImplementation "org.mockito:mockito-core:$mockito_version" + kaptAndroidTest "com.google.dagger:dagger-compiler:$dagger_version" +} diff --git a/app/proguard-rules.pro b/app/proguard-rules.pro new file mode 100644 index 00000000..f1b42451 --- /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 diff --git a/app/src/androidTest/java/com/sneha/weatherapp/ExampleInstrumentedTest.kt b/app/src/androidTest/java/com/sneha/weatherapp/ExampleInstrumentedTest.kt new file mode 100644 index 00000000..495c32a9 --- /dev/null +++ b/app/src/androidTest/java/com/sneha/weatherapp/ExampleInstrumentedTest.kt @@ -0,0 +1,24 @@ +package com.sneha.weatherapp + +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("com.sneha.weatherapp", appContext.packageName) + } +} diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml new file mode 100644 index 00000000..0007cc0d --- /dev/null +++ b/app/src/main/AndroidManifest.xml @@ -0,0 +1,32 @@ + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/app/src/main/java/com/sneha/weatherapp/WeatherApplication.kt b/app/src/main/java/com/sneha/weatherapp/WeatherApplication.kt new file mode 100644 index 00000000..12e15044 --- /dev/null +++ b/app/src/main/java/com/sneha/weatherapp/WeatherApplication.kt @@ -0,0 +1,23 @@ +package com.sneha.weatherapp + +import android.app.Application +import com.sneha.weatherapp.di.component.ApplicationComponent +import com.sneha.weatherapp.di.component.DaggerApplicationComponent +import com.sneha.weatherapp.di.module.ApplicationModule + +class WeatherApplication : Application() { + lateinit var applicationComponent: ApplicationComponent + + override fun onCreate() { + super.onCreate() + injectDependencies() + } + + private fun injectDependencies() { + applicationComponent = DaggerApplicationComponent + .builder() + .applicationModule(ApplicationModule(this)) + .build() + applicationComponent.inject(this) + } +} \ No newline at end of file diff --git a/app/src/main/java/com/sneha/weatherapp/data/local/db/DatabaseService.kt b/app/src/main/java/com/sneha/weatherapp/data/local/db/DatabaseService.kt new file mode 100644 index 00000000..b9cc589c --- /dev/null +++ b/app/src/main/java/com/sneha/weatherapp/data/local/db/DatabaseService.kt @@ -0,0 +1,20 @@ +package com.sneha.weatherapp.data.local.db + +import androidx.room.Database +import androidx.room.RoomDatabase +import com.sneha.weatherapp.data.local.db.dao.DummyDao +import com.sneha.weatherapp.data.local.db.entity.DummyEntity +import javax.inject.Singleton + +@Singleton +@Database( + entities = [ + DummyEntity::class + ], + exportSchema = false, + version = 1 +) +abstract class DatabaseService : RoomDatabase() { + + abstract fun dummyDao(): DummyDao +} \ No newline at end of file diff --git a/app/src/main/java/com/sneha/weatherapp/data/local/db/dao/DummyDao.kt b/app/src/main/java/com/sneha/weatherapp/data/local/db/dao/DummyDao.kt new file mode 100644 index 00000000..3962b06c --- /dev/null +++ b/app/src/main/java/com/sneha/weatherapp/data/local/db/dao/DummyDao.kt @@ -0,0 +1,20 @@ +package com.sneha.weatherapp.data.local.db.dao + +import androidx.room.Dao +import androidx.room.Delete +import androidx.room.Insert +import androidx.room.Query +import com.sneha.weatherapp.data.local.db.entity.DummyEntity + +@Dao +interface DummyDao { + + @Query("SELECT * FROM dummy_entity") + fun getAll(): List + + @Insert + fun insert(entity: DummyEntity) + + @Delete + fun delete(entity: DummyEntity) +} \ No newline at end of file diff --git a/app/src/main/java/com/sneha/weatherapp/data/local/db/entity/DummyEntity.kt b/app/src/main/java/com/sneha/weatherapp/data/local/db/entity/DummyEntity.kt new file mode 100644 index 00000000..f183e199 --- /dev/null +++ b/app/src/main/java/com/sneha/weatherapp/data/local/db/entity/DummyEntity.kt @@ -0,0 +1,18 @@ +package com.sneha.weatherapp.data.local.db.entity + +import androidx.room.ColumnInfo +import androidx.room.Entity +import androidx.room.PrimaryKey +import org.jetbrains.annotations.NotNull + +@Entity(tableName = "dummy_entity") +data class DummyEntity( + + @PrimaryKey(autoGenerate = true) + @NotNull + val id: Long, + + @ColumnInfo(name = "name") + @NotNull + val name: String +) \ No newline at end of file diff --git a/app/src/main/java/com/sneha/weatherapp/data/local/prefs/UserPreferences.kt b/app/src/main/java/com/sneha/weatherapp/data/local/prefs/UserPreferences.kt new file mode 100644 index 00000000..80b551c2 --- /dev/null +++ b/app/src/main/java/com/sneha/weatherapp/data/local/prefs/UserPreferences.kt @@ -0,0 +1,52 @@ +package com.sneha.weatherapp.data.local.prefs + +import android.content.SharedPreferences +import javax.inject.Inject +import javax.inject.Singleton + +@Singleton +class UserPreferences @Inject constructor(private val prefs: SharedPreferences) { + + companion object { + const val KEY_USER_ID = "PREF_KEY_USER_ID" + const val KEY_USER_NAME = "PREF_KEY_USER_NAME" + const val KEY_USER_EMAIL = "PREF_KEY_USER_EMAIL" + const val KEY_ACCESS_TOKEN = "PREF_KEY_ACCESS_TOKEN" + } + + fun getUserId(): String? = + prefs.getString(KEY_USER_ID, null) + + fun setUserId(userId: String) = + prefs.edit().putString(KEY_USER_ID, userId).apply() + + fun removeUserId() = + prefs.edit().remove(KEY_USER_ID).apply() + + fun getUserName(): String? = + prefs.getString(KEY_USER_NAME, null) + + fun setUserName(userName: String) = + prefs.edit().putString(KEY_USER_NAME, userName).apply() + + fun removeUserName() = + prefs.edit().remove(KEY_USER_NAME).apply() + + fun getUserEmail(): String? = + prefs.getString(KEY_USER_EMAIL, null) + + fun setUserEmail(email: String) = + prefs.edit().putString(KEY_USER_EMAIL, email).apply() + + fun removeUserEmail() = + prefs.edit().remove(KEY_USER_EMAIL).apply() + + fun getAccessToken(): String? = + prefs.getString(KEY_ACCESS_TOKEN, null) + + fun setAccessToken(token: String) = + prefs.edit().putString(KEY_ACCESS_TOKEN, token).apply() + + fun removeAccessToken() = + prefs.edit().remove(KEY_ACCESS_TOKEN).apply() +} \ No newline at end of file diff --git a/app/src/main/java/com/sneha/weatherapp/data/model/Dummy.kt b/app/src/main/java/com/sneha/weatherapp/data/model/Dummy.kt new file mode 100644 index 00000000..a26634ce --- /dev/null +++ b/app/src/main/java/com/sneha/weatherapp/data/model/Dummy.kt @@ -0,0 +1,14 @@ +package com.sneha.weatherapp.data.model + +import com.google.gson.annotations.Expose +import com.google.gson.annotations.SerializedName + +data class Dummy( + @Expose + @SerializedName("name") + val name: String, + + @Expose + @SerializedName("imageUrl") + val imageUrl: String? +) \ No newline at end of file diff --git a/app/src/main/java/com/sneha/weatherapp/data/model/User.kt b/app/src/main/java/com/sneha/weatherapp/data/model/User.kt new file mode 100644 index 00000000..c20d4365 --- /dev/null +++ b/app/src/main/java/com/sneha/weatherapp/data/model/User.kt @@ -0,0 +1,27 @@ +package com.sneha.weatherapp.data.model + +import com.google.gson.annotations.Expose +import com.google.gson.annotations.SerializedName + +data class User( + + @Expose + @SerializedName("userId") + val id: String, + + @Expose + @SerializedName("userName") + val name: String, + + @Expose + @SerializedName("userEmail") + val email: String, + + @Expose + @SerializedName("accessToken") + val accessToken: String, + + @Expose + @SerializedName("profilePicUrl") + val profilePicUrl: String? = null +) \ No newline at end of file diff --git a/app/src/main/java/com/sneha/weatherapp/data/remote/Endpoints.kt b/app/src/main/java/com/sneha/weatherapp/data/remote/Endpoints.kt new file mode 100644 index 00000000..c94e727d --- /dev/null +++ b/app/src/main/java/com/sneha/weatherapp/data/remote/Endpoints.kt @@ -0,0 +1,8 @@ +package com.sneha.weatherapp.data.remote + +object Endpoints { + + const val WEATHER = "weather" + const val FORECAST = "forecast" + const val FORECAST_DAILY = "forecast/daily" +} \ No newline at end of file diff --git a/app/src/main/java/com/sneha/weatherapp/data/remote/NetworkService.kt b/app/src/main/java/com/sneha/weatherapp/data/remote/NetworkService.kt new file mode 100644 index 00000000..f1ced730 --- /dev/null +++ b/app/src/main/java/com/sneha/weatherapp/data/remote/NetworkService.kt @@ -0,0 +1,19 @@ +package com.sneha.weatherapp.data.remote + +import com.sneha.weatherapp.data.remote.request.DummyRequest +import com.sneha.weatherapp.data.remote.response.DummyResponse +import io.reactivex.Single +import retrofit2.http.Body +import retrofit2.http.Header +import retrofit2.http.POST +import javax.inject.Singleton + +@Singleton +interface NetworkService { + + @POST(Endpoints.WEATHER) + fun doDummyCall( + @Body request: DummyRequest, + @Header(Networking.HEADER_API_KEY) apiKey: String = Networking.API_KEY // default value set when Networking create is called + ): Single +} \ No newline at end of file diff --git a/app/src/main/java/com/sneha/weatherapp/data/remote/Networking.kt b/app/src/main/java/com/sneha/weatherapp/data/remote/Networking.kt new file mode 100644 index 00000000..ca23e7ca --- /dev/null +++ b/app/src/main/java/com/sneha/weatherapp/data/remote/Networking.kt @@ -0,0 +1,43 @@ +package com.sneha.weatherapp.data.remote + +import com.jakewharton.retrofit2.adapter.rxjava2.RxJava2CallAdapterFactory +import com.sneha.weatherapp.BuildConfig +import okhttp3.Cache +import okhttp3.OkHttpClient +import okhttp3.logging.HttpLoggingInterceptor +import retrofit2.Retrofit +import retrofit2.converter.gson.GsonConverterFactory +import java.io.File +import java.util.concurrent.TimeUnit + +object Networking { + + const val HEADER_API_KEY = "x-api-key" + + private const val NETWORK_CALL_TIMEOUT = 60 + internal lateinit var API_KEY: String +// const val HEADER_ACCESS_TOKEN = "x-access-token" +// const val HEADER_USER_ID = "x-user-id" + + fun create(apiKey: String, baseUrl: String, cacheDir: File, cacheSize: Long): NetworkService { + API_KEY = apiKey + return Retrofit.Builder() + .baseUrl(baseUrl) + .client( + OkHttpClient.Builder() + .cache(Cache(cacheDir, cacheSize)) + .addInterceptor(HttpLoggingInterceptor() + .apply { + level = if (BuildConfig.DEBUG) HttpLoggingInterceptor.Level.BODY + else HttpLoggingInterceptor.Level.NONE + }) + .readTimeout(NETWORK_CALL_TIMEOUT.toLong(), TimeUnit.SECONDS) + .writeTimeout(NETWORK_CALL_TIMEOUT.toLong(), TimeUnit.SECONDS) + .build() + ) + .addConverterFactory(GsonConverterFactory.create()) + .addCallAdapterFactory(RxJava2CallAdapterFactory.create()) + .build() + .create(NetworkService::class.java) + } +} \ No newline at end of file diff --git a/app/src/main/java/com/sneha/weatherapp/data/remote/request/DummyRequest.kt b/app/src/main/java/com/sneha/weatherapp/data/remote/request/DummyRequest.kt new file mode 100644 index 00000000..a8b948c0 --- /dev/null +++ b/app/src/main/java/com/sneha/weatherapp/data/remote/request/DummyRequest.kt @@ -0,0 +1,10 @@ +package com.sneha.weatherapp.data.remote.request + +import com.google.gson.annotations.Expose +import com.google.gson.annotations.SerializedName + +data class DummyRequest( + @Expose + @SerializedName("id") + var id: String +) \ No newline at end of file diff --git a/app/src/main/java/com/sneha/weatherapp/data/remote/response/DummyResponse.kt b/app/src/main/java/com/sneha/weatherapp/data/remote/response/DummyResponse.kt new file mode 100644 index 00000000..a6a17706 --- /dev/null +++ b/app/src/main/java/com/sneha/weatherapp/data/remote/response/DummyResponse.kt @@ -0,0 +1,19 @@ +package com.sneha.weatherapp.data.remote.response + +import com.google.gson.annotations.Expose +import com.google.gson.annotations.SerializedName +import com.sneha.weatherapp.data.model.Dummy + +data class DummyResponse( + @Expose + @SerializedName("statusCode") + var statusCode: String, + + @Expose + @SerializedName("message") + var message: String, + + @Expose + @SerializedName("data") + val data: List +) \ No newline at end of file diff --git a/app/src/main/java/com/sneha/weatherapp/data/remote/response/GeneralResponse.kt b/app/src/main/java/com/sneha/weatherapp/data/remote/response/GeneralResponse.kt new file mode 100644 index 00000000..deb2ad10 --- /dev/null +++ b/app/src/main/java/com/sneha/weatherapp/data/remote/response/GeneralResponse.kt @@ -0,0 +1,14 @@ +package com.sneha.weatherapp.data.remote.response + +import com.google.gson.annotations.Expose +import com.google.gson.annotations.SerializedName + +data class GeneralResponse( + @Expose + @SerializedName("statusCode") + var statusCode: String, + + @Expose + @SerializedName("message") + var message: String +) \ No newline at end of file diff --git a/app/src/main/java/com/sneha/weatherapp/data/repository/DummyRepository.kt b/app/src/main/java/com/sneha/weatherapp/data/repository/DummyRepository.kt new file mode 100644 index 00000000..2e68d1a2 --- /dev/null +++ b/app/src/main/java/com/sneha/weatherapp/data/repository/DummyRepository.kt @@ -0,0 +1,18 @@ +package com.sneha.weatherapp.data.repository + +import com.sneha.weatherapp.data.local.db.DatabaseService +import com.sneha.weatherapp.data.model.Dummy +import com.sneha.weatherapp.data.remote.NetworkService +import com.sneha.weatherapp.data.remote.request.DummyRequest +import io.reactivex.Single +import javax.inject.Inject + +class DummyRepository @Inject constructor( + private val networkService: NetworkService, + private val databaseService: DatabaseService +) { + + fun fetchDummy(id: String): Single> = + networkService.doDummyCall(DummyRequest(id)).map { it.data } + +} \ No newline at end of file diff --git a/app/src/main/java/com/sneha/weatherapp/data/repository/UserRepository.kt b/app/src/main/java/com/sneha/weatherapp/data/repository/UserRepository.kt new file mode 100644 index 00000000..1efc4c52 --- /dev/null +++ b/app/src/main/java/com/sneha/weatherapp/data/repository/UserRepository.kt @@ -0,0 +1,43 @@ +package com.sneha.weatherapp.data.repository + +import com.sneha.weatherapp.data.local.db.DatabaseService +import com.sneha.weatherapp.data.local.prefs.UserPreferences +import com.sneha.weatherapp.data.model.User +import com.sneha.weatherapp.data.remote.NetworkService +import javax.inject.Inject +import javax.inject.Singleton + +@Singleton +class UserRepository @Inject constructor( + private val networkService: NetworkService, + private val databaseService: DatabaseService, + private val userPreferences: UserPreferences +) { + + fun saveCurrentUser(user: User) { + userPreferences.setUserId(user.id) + userPreferences.setUserName(user.name) + userPreferences.setUserEmail(user.email) + userPreferences.setAccessToken(user.accessToken) + } + + fun removeCurrentUser() { + userPreferences.removeUserId() + userPreferences.removeUserName() + userPreferences.removeUserEmail() + userPreferences.removeAccessToken() + } + + fun getCurrentUser(): User? { + + val userId = userPreferences.getUserId() + val userName = userPreferences.getUserName() + val userEmail = userPreferences.getUserEmail() + val accessToken = userPreferences.getAccessToken() + + return if (userId !== null && userName != null && userEmail != null && accessToken != null) + User(userId, userName, userEmail, accessToken) + else + null + } +} \ No newline at end of file diff --git a/app/src/main/java/com/sneha/weatherapp/di/Qualifiers.kt b/app/src/main/java/com/sneha/weatherapp/di/Qualifiers.kt new file mode 100644 index 00000000..0fa1212d --- /dev/null +++ b/app/src/main/java/com/sneha/weatherapp/di/Qualifiers.kt @@ -0,0 +1,11 @@ +package com.sneha.weatherapp.di + +import javax.inject.Qualifier + +@Qualifier +@Retention(AnnotationRetention.SOURCE) +annotation class ApplicationContext + +@Qualifier +@Retention(AnnotationRetention.SOURCE) +annotation class ActivityContext \ No newline at end of file diff --git a/app/src/main/java/com/sneha/weatherapp/di/Scopes.kt b/app/src/main/java/com/sneha/weatherapp/di/Scopes.kt new file mode 100644 index 00000000..0358adb1 --- /dev/null +++ b/app/src/main/java/com/sneha/weatherapp/di/Scopes.kt @@ -0,0 +1,16 @@ +package com.sneha.weatherapp.di + +import javax.inject.Scope + +@Scope +@Retention(AnnotationRetention.SOURCE) +annotation class ActivityScope + + +@Scope +@Retention(AnnotationRetention.SOURCE) +annotation class FragmentScope + +@Scope +@Retention(AnnotationRetention.SOURCE) +annotation class ViewModelScope \ No newline at end of file diff --git a/app/src/main/java/com/sneha/weatherapp/di/component/ActivityComponent.kt b/app/src/main/java/com/sneha/weatherapp/di/component/ActivityComponent.kt new file mode 100644 index 00000000..57c5e294 --- /dev/null +++ b/app/src/main/java/com/sneha/weatherapp/di/component/ActivityComponent.kt @@ -0,0 +1,19 @@ +package com.sneha.weatherapp.di.component + +import com.sneha.weatherapp.di.ActivityScope +import com.sneha.weatherapp.di.module.ActivityModule +import com.sneha.weatherapp.ui.dummy.DummyActivity +import com.sneha.weatherapp.ui.splash.SplashActivity +import dagger.Component + +@ActivityScope +@Component( + dependencies = [ApplicationComponent::class], + modules = [ActivityModule::class] +) +interface ActivityComponent { + + fun inject(activity: SplashActivity) + + fun inject(activity: DummyActivity) +} \ No newline at end of file diff --git a/app/src/main/java/com/sneha/weatherapp/di/component/ApplicationComponent.kt b/app/src/main/java/com/sneha/weatherapp/di/component/ApplicationComponent.kt new file mode 100644 index 00000000..0b24c6f3 --- /dev/null +++ b/app/src/main/java/com/sneha/weatherapp/di/component/ApplicationComponent.kt @@ -0,0 +1,61 @@ +package com.sneha.weatherapp.di.component + +import android.app.Application +import android.content.Context +import android.content.SharedPreferences +import com.sneha.weatherapp.WeatherApplication +import com.sneha.weatherapp.data.local.db.DatabaseService +import com.sneha.weatherapp.data.remote.NetworkService +import com.sneha.weatherapp.data.repository.UserRepository +import com.sneha.weatherapp.di.ApplicationContext +import com.sneha.weatherapp.di.module.ApplicationModule +import com.sneha.weatherapp.utils.network.NetworkHelper +import com.sneha.weatherapp.utils.rx.SchedulerProvider +import dagger.Component +import io.reactivex.disposables.CompositeDisposable +import javax.inject.Singleton + + +@Singleton +@Component(modules = [ApplicationModule::class]) +interface ApplicationComponent { + + fun inject(app: WeatherApplication) + + fun getApplication(): Application + + @ApplicationContext + fun getContext(): Context + + /** + * These methods are written in ApplicationComponent because the instance of + * NetworkService is singleton and is maintained in the ApplicationComponent's implementation by Dagger + * For NetworkService singleton instance to be accessible to say DummyActivity's DummyViewModel + * this ApplicationComponent must expose a method that returns NetworkService instance + * This method will be called when NetworkService is injected in DummyViewModel. + * Also, in ActivityComponent you can find dependencies = [ApplicationComponent::class] to link this relationship + */ + fun getNetworkService(): NetworkService + + fun getDatabaseService(): DatabaseService + + fun getSharedPreferences(): SharedPreferences + + fun getNetworkHelper(): NetworkHelper + + /**--------------------------------------------------------------------------- + * Dagger will internally create UserRepository instance using constructor injection. + * Dependency through constructor + * UserRepository -> + * [NetworkService -> Nothing is required], + * [DatabaseService -> Nothing is required], + * [UserPreferences -> [SharedPreferences -> provided by the function provideSharedPreferences in ApplicationModule class]] + * So, Dagger will be able to create an instance of UserRepository by its own using constructor injection + *--------------------------------------------------------------------------------- + */ + fun getUserRepository(): UserRepository + + fun getSchedulerProvider(): SchedulerProvider + + fun getCompositeDisposable(): CompositeDisposable +} \ No newline at end of file diff --git a/app/src/main/java/com/sneha/weatherapp/di/component/FragmentComponent.kt b/app/src/main/java/com/sneha/weatherapp/di/component/FragmentComponent.kt new file mode 100644 index 00000000..707340b8 --- /dev/null +++ b/app/src/main/java/com/sneha/weatherapp/di/component/FragmentComponent.kt @@ -0,0 +1,16 @@ +package com.sneha.weatherapp.di.component + +import com.sneha.weatherapp.di.FragmentScope +import com.sneha.weatherapp.di.module.FragmentModule +import com.sneha.weatherapp.ui.dummies.DummiesFragment +import dagger.Component + +@FragmentScope +@Component( + dependencies = [ApplicationComponent::class], + modules = [FragmentModule::class] +) +interface FragmentComponent { + + fun inject(fragment: DummiesFragment) +} \ No newline at end of file diff --git a/app/src/main/java/com/sneha/weatherapp/di/component/ViewHolderComponent.kt b/app/src/main/java/com/sneha/weatherapp/di/component/ViewHolderComponent.kt new file mode 100644 index 00000000..1978214b --- /dev/null +++ b/app/src/main/java/com/sneha/weatherapp/di/component/ViewHolderComponent.kt @@ -0,0 +1,16 @@ +package com.sneha.weatherapp.di.component + +import com.sneha.weatherapp.di.ViewModelScope +import com.sneha.weatherapp.di.module.ViewHolderModule +import com.sneha.weatherapp.ui.dummies.DummyItemViewHolder +import dagger.Component + +@ViewModelScope +@Component( + dependencies = [ApplicationComponent::class], + modules = [ViewHolderModule::class] +) +interface ViewHolderComponent { + + fun inject(viewHolder: DummyItemViewHolder) +} \ No newline at end of file diff --git a/app/src/main/java/com/sneha/weatherapp/di/module/ActivityModule.kt b/app/src/main/java/com/sneha/weatherapp/di/module/ActivityModule.kt new file mode 100644 index 00000000..0eed81c6 --- /dev/null +++ b/app/src/main/java/com/sneha/weatherapp/di/module/ActivityModule.kt @@ -0,0 +1,50 @@ +package com.sneha.weatherapp.di.module + +import androidx.lifecycle.ViewModelProviders +import androidx.recyclerview.widget.LinearLayoutManager +import com.sneha.weatherapp.data.repository.DummyRepository +import com.sneha.weatherapp.data.repository.UserRepository +import com.sneha.weatherapp.ui.base.BaseActivity +import com.sneha.weatherapp.ui.dummy.DummyViewModel +import com.sneha.weatherapp.ui.splash.SplashViewModel +import com.sneha.weatherapp.utils.ViewModelProviderFactory +import com.sneha.weatherapp.utils.network.NetworkHelper +import com.sneha.weatherapp.utils.rx.SchedulerProvider +import dagger.Module +import dagger.Provides +import io.reactivex.disposables.CompositeDisposable + +/** + * Kotlin Generics Reference: https://kotlinlang.org/docs/reference/generics.html + * Basically it means that we can pass any class that extends BaseActivity which take + * BaseViewModel subclass as parameter + */ +@Module +class ActivityModule(private val activity: BaseActivity<*>) { + + @Provides + fun provideLinearLayoutManager(): LinearLayoutManager = LinearLayoutManager(activity) + + @Provides + fun provideSplashViewModel( + schedulerProvider: SchedulerProvider, + compositeDisposable: CompositeDisposable, + networkHelper: NetworkHelper, + userRepository: UserRepository + ): SplashViewModel = ViewModelProviders.of( + activity, ViewModelProviderFactory(SplashViewModel::class) { + SplashViewModel(schedulerProvider, compositeDisposable, networkHelper, userRepository) + //this lambda creates and return SplashViewModel + }).get(SplashViewModel::class.java) + + @Provides + fun provideDummyViewModel( + schedulerProvider: SchedulerProvider, + compositeDisposable: CompositeDisposable, + networkHelper: NetworkHelper, + dummyRepository: DummyRepository + ): DummyViewModel = ViewModelProviders.of( + activity, ViewModelProviderFactory(DummyViewModel::class) { + DummyViewModel(schedulerProvider, compositeDisposable, networkHelper, dummyRepository) + }).get(DummyViewModel::class.java) +} \ No newline at end of file diff --git a/app/src/main/java/com/sneha/weatherapp/di/module/ApplicationModule.kt b/app/src/main/java/com/sneha/weatherapp/di/module/ApplicationModule.kt new file mode 100644 index 00000000..fa4922f4 --- /dev/null +++ b/app/src/main/java/com/sneha/weatherapp/di/module/ApplicationModule.kt @@ -0,0 +1,73 @@ +package com.sneha.weatherapp.di.module + +import android.app.Application +import android.content.Context +import android.content.SharedPreferences +import androidx.room.Room +import com.sneha.weatherapp.BuildConfig +import com.sneha.weatherapp.WeatherApplication +import com.sneha.weatherapp.data.local.db.DatabaseService +import com.sneha.weatherapp.data.remote.NetworkService +import com.sneha.weatherapp.data.remote.Networking +import com.sneha.weatherapp.di.ApplicationContext +import com.sneha.weatherapp.utils.network.NetworkHelper +import com.sneha.weatherapp.utils.rx.RxSchedulerProvider +import com.sneha.weatherapp.utils.rx.SchedulerProvider +import dagger.Module +import dagger.Provides +import io.reactivex.disposables.CompositeDisposable +import javax.inject.Singleton + +@Module +class ApplicationModule(private val application: WeatherApplication) { + + @Provides + @Singleton + fun provideApplication(): Application = application + + @Provides + @Singleton + @ApplicationContext + fun provideContext(): Context = application + + /** + * Since this function do not have @Singleton then each time CompositeDisposable is injected + * then a new instance of CompositeDisposable will be provided + */ + @Provides + fun provideCompositeDisposable(): CompositeDisposable = CompositeDisposable() + + @Provides + fun provideSchedulerProvider(): SchedulerProvider = RxSchedulerProvider() + + @Provides + @Singleton + fun provideSharedPreferences(): SharedPreferences = + application.getSharedPreferences("weather-app-prefs", Context.MODE_PRIVATE) + + /** + * We need to write @Singleton on the provide method if we are create the instance inside this method + * to make it singleton. Even if we have written @Singleton on the instance's class + */ + @Provides + @Singleton + fun provideDatabaseService(): DatabaseService = + Room.databaseBuilder( + application, DatabaseService::class.java, + "weather-app-db" + ).build() + + @Provides + @Singleton + fun provideNetworkService(): NetworkService = + Networking.create( + BuildConfig.API_KEY, + BuildConfig.BASE_URL, + application.cacheDir, + 10 * 1024 * 1024 // 10MB + ) + + @Singleton + @Provides + fun provideNetworkHelper(): NetworkHelper = NetworkHelper(application) +} \ No newline at end of file diff --git a/app/src/main/java/com/sneha/weatherapp/di/module/FragmentModule.kt b/app/src/main/java/com/sneha/weatherapp/di/module/FragmentModule.kt new file mode 100644 index 00000000..ab7ac381 --- /dev/null +++ b/app/src/main/java/com/sneha/weatherapp/di/module/FragmentModule.kt @@ -0,0 +1,37 @@ +package com.sneha.weatherapp.di.module + +import androidx.lifecycle.ViewModelProviders +import androidx.recyclerview.widget.LinearLayoutManager +import com.sneha.weatherapp.data.repository.DummyRepository +import com.sneha.weatherapp.ui.base.BaseFragment +import com.sneha.weatherapp.ui.dummies.DummiesAdapter +import com.sneha.weatherapp.ui.dummies.DummiesViewModel +import com.sneha.weatherapp.utils.ViewModelProviderFactory +import com.sneha.weatherapp.utils.network.NetworkHelper +import com.sneha.weatherapp.utils.rx.SchedulerProvider +import dagger.Module +import dagger.Provides +import io.reactivex.disposables.CompositeDisposable + +@Module +class FragmentModule(private val fragment: BaseFragment<*>) { + + @Provides + fun provideLinearLayoutManager(): LinearLayoutManager = LinearLayoutManager(fragment.context) + + @Provides + fun provideDummiesViewModel( + schedulerProvider: SchedulerProvider, + compositeDisposable: CompositeDisposable, + networkHelper: NetworkHelper, + dummyRepository: DummyRepository + ): DummiesViewModel = + ViewModelProviders.of(fragment, + ViewModelProviderFactory(DummiesViewModel::class) { + DummiesViewModel(schedulerProvider, compositeDisposable, networkHelper, dummyRepository) + } + ).get(DummiesViewModel::class.java) + + @Provides + fun provideDummiesAdapter() = DummiesAdapter(fragment.lifecycle, ArrayList()) +} \ No newline at end of file diff --git a/app/src/main/java/com/sneha/weatherapp/di/module/ViewHolderModule.kt b/app/src/main/java/com/sneha/weatherapp/di/module/ViewHolderModule.kt new file mode 100644 index 00000000..af27cd1f --- /dev/null +++ b/app/src/main/java/com/sneha/weatherapp/di/module/ViewHolderModule.kt @@ -0,0 +1,15 @@ +package com.sneha.weatherapp.di.module + +import androidx.lifecycle.LifecycleRegistry +import com.sneha.weatherapp.di.ViewModelScope +import com.sneha.weatherapp.ui.base.BaseItemViewHolder +import dagger.Module +import dagger.Provides + +@Module +class ViewHolderModule(private val viewHolder: BaseItemViewHolder<*, *>) { + + @Provides + @ViewModelScope + fun provideLifecycleRegistry(): LifecycleRegistry = LifecycleRegistry(viewHolder) +} \ No newline at end of file diff --git a/app/src/main/java/com/sneha/weatherapp/ui/base/BaseActivity.kt b/app/src/main/java/com/sneha/weatherapp/ui/base/BaseActivity.kt new file mode 100644 index 00000000..f9186146 --- /dev/null +++ b/app/src/main/java/com/sneha/weatherapp/ui/base/BaseActivity.kt @@ -0,0 +1,68 @@ +package com.sneha.weatherapp.ui.base + +import android.os.Bundle +import androidx.annotation.LayoutRes +import androidx.annotation.StringRes +import androidx.appcompat.app.AppCompatActivity +import androidx.lifecycle.Observer +import com.sneha.weatherapp.WeatherApplication +import com.sneha.weatherapp.di.component.ActivityComponent +import com.sneha.weatherapp.di.component.DaggerActivityComponent +import com.sneha.weatherapp.di.module.ActivityModule +import com.sneha.weatherapp.utils.display.Toaster +import javax.inject.Inject + +/** + * Reference for generics: https://kotlinlang.org/docs/reference/generics.html + * Basically BaseActivity will take any class that extends BaseViewModel + */ +abstract class BaseActivity : AppCompatActivity() { + + @Inject + lateinit var viewModel: VM + + override fun onCreate(savedInstanceState: Bundle?) { + injectDependencies(buildActivityComponent()) + super.onCreate(savedInstanceState) + setContentView(provideLayoutId()) + setupObservers() + setupView(savedInstanceState) + viewModel.onCreate() + } + + private fun buildActivityComponent() = + DaggerActivityComponent + .builder() + .applicationComponent((application as WeatherApplication).applicationComponent) + .activityModule(ActivityModule(this)) + .build() + + protected open fun setupObservers() { + viewModel.messageString.observe(this, Observer { + it.data?.run { showMessage(this) } + }) + + viewModel.messageStringId.observe(this, Observer { + it.data?.run { showMessage(this) } + }) + } + + fun showMessage(message: String) = Toaster.show(applicationContext, message) + + fun showMessage(@StringRes resId: Int) = showMessage(getString(resId)) + + open fun goBack() = onBackPressed() + + override fun onBackPressed() { + if (supportFragmentManager.backStackEntryCount > 0) + supportFragmentManager.popBackStackImmediate() + else super.onBackPressed() + } + + @LayoutRes + protected abstract fun provideLayoutId(): Int + + protected abstract fun injectDependencies(activityComponent: ActivityComponent) + + protected abstract fun setupView(savedInstanceState: Bundle?) +} \ No newline at end of file diff --git a/app/src/main/java/com/sneha/weatherapp/ui/base/BaseAdapter.kt b/app/src/main/java/com/sneha/weatherapp/ui/base/BaseAdapter.kt new file mode 100644 index 00000000..3e43faca --- /dev/null +++ b/app/src/main/java/com/sneha/weatherapp/ui/base/BaseAdapter.kt @@ -0,0 +1,97 @@ +package com.sneha.weatherapp.ui.base + +import androidx.lifecycle.Lifecycle +import androidx.lifecycle.LifecycleObserver +import androidx.lifecycle.OnLifecycleEvent +import androidx.recyclerview.widget.LinearLayoutManager +import androidx.recyclerview.widget.RecyclerView + +abstract class BaseAdapter>>( + parentLifecycle: Lifecycle, + private val dataList: ArrayList +) : RecyclerView.Adapter() { + + private var recyclerView: RecyclerView? = null + + init { + parentLifecycle.addObserver(object : LifecycleObserver { + @OnLifecycleEvent(Lifecycle.Event.ON_DESTROY) + fun onParentDestroy() { + recyclerView?.run { + for (i in 0 until childCount) { + getChildAt(i)?.let { + (getChildViewHolder(it) as BaseItemViewHolder<*, *>) + .run { + onDestroy() + viewModel.onManualCleared() + } + } + } + } + } + + @OnLifecycleEvent(Lifecycle.Event.ON_STOP) + fun onParentStop() { + recyclerView?.run { + for (i in 0 until childCount) { + getChildAt(i)?.let { + (getChildViewHolder(it) as BaseItemViewHolder<*, *>).onStop() + } + } + } + } + + @OnLifecycleEvent(Lifecycle.Event.ON_START) + fun onParentStart() { + recyclerView?.run { + if (layoutManager is LinearLayoutManager) { + val first = (layoutManager as LinearLayoutManager).findFirstVisibleItemPosition() + val last = (layoutManager as LinearLayoutManager).findLastVisibleItemPosition() + if (first in 0..last) + for (i in first..last) { + findViewHolderForAdapterPosition(i)?.let { + (it as BaseItemViewHolder<*, *>).onStart() + } + } + } + } + } + }) + } + + override fun onViewAttachedToWindow(holder: VH) { + super.onViewAttachedToWindow(holder) + holder.onStart() + } + + override fun onViewDetachedFromWindow(holder: VH) { + super.onViewDetachedFromWindow(holder) + holder.onStop() + } + + override fun onAttachedToRecyclerView(recyclerView: RecyclerView) { + super.onAttachedToRecyclerView(recyclerView) + this.recyclerView = recyclerView + } + + override fun onDetachedFromRecyclerView(recyclerView: RecyclerView) { + super.onDetachedFromRecyclerView(recyclerView) + this.recyclerView = null + } + + override fun getItemCount(): Int = dataList.size + + override fun onBindViewHolder(holder: VH, position: Int) { + holder.bind(dataList[position]) + } + + fun appendData(dataList: List) { + val oldCount = itemCount + this.dataList.addAll(dataList) + val currentCount = itemCount + if (oldCount == 0 && currentCount > 0) + notifyDataSetChanged() + else if (oldCount > 0 && currentCount > oldCount) + notifyItemRangeChanged(oldCount - 1, currentCount - oldCount) + } +} \ No newline at end of file diff --git a/app/src/main/java/com/sneha/weatherapp/ui/base/BaseFragment.kt b/app/src/main/java/com/sneha/weatherapp/ui/base/BaseFragment.kt new file mode 100644 index 00000000..e29d08ca --- /dev/null +++ b/app/src/main/java/com/sneha/weatherapp/ui/base/BaseFragment.kt @@ -0,0 +1,75 @@ +package com.sneha.weatherapp.ui.base + +import android.os.Bundle +import android.view.LayoutInflater +import android.view.View +import android.view.ViewGroup +import androidx.annotation.LayoutRes +import androidx.annotation.StringRes +import androidx.fragment.app.Fragment +import androidx.lifecycle.Observer +import com.sneha.weatherapp.WeatherApplication +import com.sneha.weatherapp.di.component.DaggerFragmentComponent +import com.sneha.weatherapp.di.component.FragmentComponent +import com.sneha.weatherapp.di.module.FragmentModule +import com.sneha.weatherapp.utils.display.Toaster +import javax.inject.Inject + +/** + * Reference for generics: https://kotlinlang.org/docs/reference/generics.html + * Basically BaseFragment will take any class that extends BaseViewModel + */ +abstract class BaseFragment : Fragment() { + + @Inject + lateinit var viewModel: VM + + override fun onCreate(savedInstanceState: Bundle?) { + injectDependencies(buildFragmentComponent()) + super.onCreate(savedInstanceState) + setupObservers() + viewModel.onCreate() + } + + private fun buildFragmentComponent() = + DaggerFragmentComponent + .builder() + .applicationComponent((context!!.applicationContext as WeatherApplication).applicationComponent) + .fragmentModule(FragmentModule(this)) + .build() + + + override fun onCreateView(inflater: LayoutInflater, container: ViewGroup?, savedInstanceState: Bundle?): View? = + inflater.inflate(provideLayoutId(), container, false) + + protected open fun setupObservers() { + viewModel.messageString.observe(this, Observer { + it.data?.run { showMessage(this) } + }) + + viewModel.messageStringId.observe(this, Observer { + it.data?.run { showMessage(this) } + }) + } + + override fun onViewCreated(view: View, savedInstanceState: Bundle?) { + super.onViewCreated(view, savedInstanceState) + setupView(view) + } + + + fun showMessage(message: String) = context?.let { Toaster.show(it, message) } + + fun showMessage(@StringRes resId: Int) = showMessage(getString(resId)) + + fun goBack() { + if (activity is BaseActivity<*>) (activity as BaseActivity<*>).goBack() + } + + @LayoutRes + protected abstract fun provideLayoutId(): Int + + protected abstract fun injectDependencies(fragmentComponent: FragmentComponent) + + protected abstract fun setupView(view: View) +} \ No newline at end of file diff --git a/app/src/main/java/com/sneha/weatherapp/ui/base/BaseItemViewHolder.kt b/app/src/main/java/com/sneha/weatherapp/ui/base/BaseItemViewHolder.kt new file mode 100644 index 00000000..c805d72e --- /dev/null +++ b/app/src/main/java/com/sneha/weatherapp/ui/base/BaseItemViewHolder.kt @@ -0,0 +1,88 @@ +package com.sneha.weatherapp.ui.base + +import android.view.LayoutInflater +import android.view.View +import android.view.ViewGroup +import androidx.annotation.LayoutRes +import androidx.annotation.StringRes +import androidx.lifecycle.Lifecycle +import androidx.lifecycle.LifecycleOwner +import androidx.lifecycle.LifecycleRegistry +import androidx.lifecycle.Observer +import androidx.recyclerview.widget.RecyclerView +import com.sneha.weatherapp.WeatherApplication +import com.sneha.weatherapp.di.component.DaggerViewHolderComponent +import com.sneha.weatherapp.di.component.ViewHolderComponent +import com.sneha.weatherapp.di.module.ViewHolderModule +import com.sneha.weatherapp.utils.display.Toaster +import javax.inject.Inject + +abstract class BaseItemViewHolder>( + @LayoutRes layoutId: Int, parent: ViewGroup +) : RecyclerView.ViewHolder(LayoutInflater.from(parent.context).inflate(layoutId, parent, false)), + LifecycleOwner { + + init { + onCreate() + } + + @Inject + lateinit var viewModel: VM + + @Inject + lateinit var lifecycleRegistry: LifecycleRegistry + + override fun getLifecycle(): Lifecycle = lifecycleRegistry + + open fun bind(data: T) { + viewModel.updateData(data) + } + + protected fun onCreate() { + injectDependencies(buildViewHolderComponent()) + lifecycleRegistry.markState(Lifecycle.State.INITIALIZED) + lifecycleRegistry.markState(Lifecycle.State.CREATED) + setupObservers() + setupView(itemView) + } + + fun onStart() { + lifecycleRegistry.markState(Lifecycle.State.STARTED) + lifecycleRegistry.markState(Lifecycle.State.RESUMED) + } + + fun onStop() { + lifecycleRegistry.markState(Lifecycle.State.STARTED) + lifecycleRegistry.markState(Lifecycle.State.CREATED) + } + + fun onDestroy() { + lifecycleRegistry.markState(Lifecycle.State.DESTROYED) + } + + private fun buildViewHolderComponent() = + DaggerViewHolderComponent + .builder() + .applicationComponent((itemView.context.applicationContext as WeatherApplication).applicationComponent) + .viewHolderModule(ViewHolderModule(this)) + .build() + + fun showMessage(message: String) = Toaster.show(itemView.context, message) + + fun showMessage(@StringRes resId: Int) = showMessage(itemView.context.getString(resId)) + + protected open fun setupObservers() { + viewModel.messageString.observe(this, Observer { + it.data?.run { showMessage(this) } + }) + + viewModel.messageStringId.observe(this, Observer { + it.data?.run { showMessage(this) } + }) + } + + protected abstract fun injectDependencies(viewHolderComponent: ViewHolderComponent) + + abstract fun setupView(view: View) + +} \ No newline at end of file diff --git a/app/src/main/java/com/sneha/weatherapp/ui/base/BaseItemViewModel.kt b/app/src/main/java/com/sneha/weatherapp/ui/base/BaseItemViewModel.kt new file mode 100644 index 00000000..c0429b99 --- /dev/null +++ b/app/src/main/java/com/sneha/weatherapp/ui/base/BaseItemViewModel.kt @@ -0,0 +1,22 @@ +package com.sneha.weatherapp.ui.base + +import androidx.lifecycle.MutableLiveData +import com.sneha.weatherapp.utils.network.NetworkHelper +import com.sneha.weatherapp.utils.rx.SchedulerProvider +import io.reactivex.disposables.CompositeDisposable + + +abstract class BaseItemViewModel( + schedulerProvider: SchedulerProvider, + compositeDisposable: CompositeDisposable, + networkHelper: NetworkHelper +) : BaseViewModel(schedulerProvider, compositeDisposable, networkHelper) { + + val data: MutableLiveData = MutableLiveData() + + fun onManualCleared() = onCleared() + + fun updateData(data: T) { + this.data.postValue(data) + } +} \ No newline at end of file diff --git a/app/src/main/java/com/sneha/weatherapp/ui/base/BaseViewModel.kt b/app/src/main/java/com/sneha/weatherapp/ui/base/BaseViewModel.kt new file mode 100644 index 00000000..e2e13c6c --- /dev/null +++ b/app/src/main/java/com/sneha/weatherapp/ui/base/BaseViewModel.kt @@ -0,0 +1,61 @@ +package com.sneha.weatherapp.ui.base + +import androidx.lifecycle.MutableLiveData +import androidx.lifecycle.ViewModel +import com.sneha.weatherapp.R +import com.sneha.weatherapp.utils.common.Resource +import com.sneha.weatherapp.utils.network.NetworkHelper +import com.sneha.weatherapp.utils.rx.SchedulerProvider +import io.reactivex.disposables.CompositeDisposable +import javax.net.ssl.HttpsURLConnection + + +abstract class BaseViewModel( + protected val schedulerProvider: SchedulerProvider, + protected val compositeDisposable: CompositeDisposable, + protected val networkHelper: NetworkHelper +) : ViewModel() { + + override fun onCleared() { + compositeDisposable.dispose() + super.onCleared() + } + + val messageStringId: MutableLiveData> = MutableLiveData() + val messageString: MutableLiveData> = MutableLiveData() + + protected fun checkInternetConnectionWithMessage(): Boolean = + if (networkHelper.isNetworkConnected()) { + true + } else { + messageStringId.postValue(Resource.error(R.string.network_connection_error)) + false + } + + protected fun checkInternetConnection(): Boolean = networkHelper.isNetworkConnected() + + protected fun handleNetworkError(err: Throwable?) = + err?.let { + networkHelper.castToNetworkError(it).run { + when (status) { + -1 -> messageStringId.postValue(Resource.error(R.string.network_default_error)) + 0 -> messageStringId.postValue(Resource.error(R.string.server_connection_error)) + HttpsURLConnection.HTTP_UNAUTHORIZED -> { + forcedLogoutUser() + messageStringId.postValue(Resource.error(R.string.server_connection_error)) + } + HttpsURLConnection.HTTP_INTERNAL_ERROR -> + messageStringId.postValue(Resource.error(R.string.network_internal_error)) + HttpsURLConnection.HTTP_UNAVAILABLE -> + messageStringId.postValue(Resource.error(R.string.network_server_not_available)) + else -> messageString.postValue(Resource.error(message)) + } + } + } + + protected open fun forcedLogoutUser() { + // do something + } + + abstract fun onCreate() +} \ No newline at end of file diff --git a/app/src/main/java/com/sneha/weatherapp/ui/dummies/DummiesAdapter.kt b/app/src/main/java/com/sneha/weatherapp/ui/dummies/DummiesAdapter.kt new file mode 100644 index 00000000..0bdaced2 --- /dev/null +++ b/app/src/main/java/com/sneha/weatherapp/ui/dummies/DummiesAdapter.kt @@ -0,0 +1,14 @@ +package com.sneha.weatherapp.ui.dummies + +import android.view.ViewGroup +import androidx.lifecycle.Lifecycle +import com.sneha.weatherapp.data.model.Dummy +import com.sneha.weatherapp.ui.base.BaseAdapter + +class DummiesAdapter( + parentLifecycle: Lifecycle, + private val dummies: ArrayList +) : BaseAdapter(parentLifecycle, dummies) { + + override fun onCreateViewHolder(parent: ViewGroup, viewType: Int) = DummyItemViewHolder(parent) +} \ No newline at end of file diff --git a/app/src/main/java/com/sneha/weatherapp/ui/dummies/DummiesFragment.kt b/app/src/main/java/com/sneha/weatherapp/ui/dummies/DummiesFragment.kt new file mode 100644 index 00000000..80f78fb4 --- /dev/null +++ b/app/src/main/java/com/sneha/weatherapp/ui/dummies/DummiesFragment.kt @@ -0,0 +1,50 @@ +package com.sneha.weatherapp.ui.dummies + +import android.os.Bundle +import android.view.View +import androidx.lifecycle.Observer +import androidx.recyclerview.widget.LinearLayoutManager +import com.sneha.weatherapp.R +import com.sneha.weatherapp.di.component.FragmentComponent +import com.sneha.weatherapp.ui.base.BaseFragment +import kotlinx.android.synthetic.main.fragment_dummies.* +import javax.inject.Inject + +class DummiesFragment : BaseFragment() { + + companion object { + + const val TAG = "DummiesFragment" + + fun newInstance(): DummiesFragment { + val args = Bundle() + val fragment = DummiesFragment() + fragment.arguments = args + return fragment + } + } + + @Inject + lateinit var linearLayoutManager: LinearLayoutManager + + @Inject + lateinit var dummiesAdapter: DummiesAdapter + + override fun provideLayoutId(): Int = R.layout.fragment_dummies + + override fun injectDependencies(fragmentComponent: FragmentComponent) { + fragmentComponent.inject(this) + } + + override fun setupObservers() { + viewModel.getDummies().observe(this, Observer { + it?.run { dummiesAdapter.appendData(this) } + }) + } + + override fun setupView(view: View) { + rv_dummy.layoutManager = linearLayoutManager + rv_dummy.adapter = dummiesAdapter + } + +} \ No newline at end of file diff --git a/app/src/main/java/com/sneha/weatherapp/ui/dummies/DummiesViewModel.kt b/app/src/main/java/com/sneha/weatherapp/ui/dummies/DummiesViewModel.kt new file mode 100644 index 00000000..d22394a3 --- /dev/null +++ b/app/src/main/java/com/sneha/weatherapp/ui/dummies/DummiesViewModel.kt @@ -0,0 +1,46 @@ +package com.sneha.weatherapp.ui.dummies + +import androidx.lifecycle.LiveData +import androidx.lifecycle.MutableLiveData +import androidx.lifecycle.Transformations +import com.sneha.weatherapp.data.model.Dummy +import com.sneha.weatherapp.data.repository.DummyRepository +import com.sneha.weatherapp.ui.base.BaseViewModel +import com.sneha.weatherapp.utils.common.Resource +import com.sneha.weatherapp.utils.common.Status +import com.sneha.weatherapp.utils.network.NetworkHelper +import com.sneha.weatherapp.utils.rx.SchedulerProvider +import io.reactivex.disposables.CompositeDisposable + + +class DummiesViewModel( + schedulerProvider: SchedulerProvider, + compositeDisposable: CompositeDisposable, + networkHelper: NetworkHelper, + private val dummyRepository: DummyRepository +) : BaseViewModel(schedulerProvider, compositeDisposable, networkHelper) { + + private val dummyLiveData: MutableLiveData>> = MutableLiveData() + + fun getDummies(): LiveData> = + Transformations.map(dummyLiveData) { it.data } + + fun isDummiesFetching(): LiveData = + Transformations.map(dummyLiveData) { it.status == Status.LOADING } + + override fun onCreate() { + if (dummyLiveData.value == null && checkInternetConnectionWithMessage()) { + dummyLiveData.postValue(Resource.loading()) + compositeDisposable.add( + dummyRepository.fetchDummy("MY_SAMPLE_DUMMY") + .subscribeOn(schedulerProvider.io()) + .subscribe( + { dummyLiveData.postValue(Resource.success(it)) }, + { + handleNetworkError(it) + dummyLiveData.postValue(Resource.error()) + }) + ) + } + } +} \ No newline at end of file diff --git a/app/src/main/java/com/sneha/weatherapp/ui/dummies/DummyItemViewHolder.kt b/app/src/main/java/com/sneha/weatherapp/ui/dummies/DummyItemViewHolder.kt new file mode 100644 index 00000000..5face1e7 --- /dev/null +++ b/app/src/main/java/com/sneha/weatherapp/ui/dummies/DummyItemViewHolder.kt @@ -0,0 +1,37 @@ +package com.sneha.weatherapp.ui.dummies + +import android.view.View +import android.view.ViewGroup +import androidx.lifecycle.Observer +import com.bumptech.glide.Glide +import com.sneha.weatherapp.R +import com.sneha.weatherapp.data.model.Dummy +import com.sneha.weatherapp.di.component.ViewHolderComponent +import com.sneha.weatherapp.ui.base.BaseItemViewHolder +import kotlinx.android.synthetic.main.item_view_dummies.view.* + +class DummyItemViewHolder(parent: ViewGroup) : + BaseItemViewHolder(R.layout.item_view_dummies, parent) { + + override fun injectDependencies(viewHolderComponent: ViewHolderComponent) { + viewHolderComponent.inject(this) + } + + override fun setupObservers() { + super.setupObservers() + + viewModel.name.observe(this, Observer { + itemView.tv_head_line_dummy.text = it + }) + + viewModel.url.observe(this, Observer { + Glide.with(itemView.context).load(it).into(itemView.iv_dummy) + }) + } + + override fun setupView(view: View) { + view.setOnClickListener { + viewModel.onItemClick(adapterPosition) + } + } +} \ No newline at end of file diff --git a/app/src/main/java/com/sneha/weatherapp/ui/dummies/DummyItemViewModel.kt b/app/src/main/java/com/sneha/weatherapp/ui/dummies/DummyItemViewModel.kt new file mode 100644 index 00000000..dc536c36 --- /dev/null +++ b/app/src/main/java/com/sneha/weatherapp/ui/dummies/DummyItemViewModel.kt @@ -0,0 +1,35 @@ +package com.sneha.weatherapp.ui.dummies + +import androidx.lifecycle.LiveData +import androidx.lifecycle.Transformations +import com.sneha.weatherapp.data.model.Dummy +import com.sneha.weatherapp.ui.base.BaseItemViewModel +import com.sneha.weatherapp.utils.common.Resource +import com.sneha.weatherapp.utils.log.Logger +import com.sneha.weatherapp.utils.network.NetworkHelper +import com.sneha.weatherapp.utils.rx.SchedulerProvider +import io.reactivex.disposables.CompositeDisposable +import javax.inject.Inject + +class DummyItemViewModel @Inject constructor( + schedulerProvider: SchedulerProvider, + compositeDisposable: CompositeDisposable, + networkHelper: NetworkHelper +) : BaseItemViewModel(schedulerProvider, compositeDisposable, networkHelper) { + + companion object { + const val TAG = "DummyItemViewModel" + } + + val name: LiveData = Transformations.map(data) { it.name } + val url: LiveData = Transformations.map(data) { it.imageUrl } + + fun onItemClick(position: Int) { + messageString.postValue(Resource.success("onItemClick at $position of ${data.value?.name}")) + Logger.d(TAG, "onItemClick at $position") + } + + override fun onCreate() { + Logger.d(TAG, "onCreate called") + } +} \ No newline at end of file diff --git a/app/src/main/java/com/sneha/weatherapp/ui/dummy/DummyActivity.kt b/app/src/main/java/com/sneha/weatherapp/ui/dummy/DummyActivity.kt new file mode 100644 index 00000000..0c8f3b03 --- /dev/null +++ b/app/src/main/java/com/sneha/weatherapp/ui/dummy/DummyActivity.kt @@ -0,0 +1,31 @@ +package com.sneha.weatherapp.ui.dummy + +import android.os.Bundle +import com.sneha.weatherapp.R +import com.sneha.weatherapp.di.component.ActivityComponent +import com.sneha.weatherapp.ui.base.BaseActivity +import com.sneha.weatherapp.ui.dummies.DummiesFragment + +class DummyActivity : BaseActivity() { + + companion object { + const val TAG = "DummyActivity" + } + + override fun provideLayoutId(): Int = R.layout.activity_dummy + + override fun injectDependencies(activityComponent: ActivityComponent) { + activityComponent.inject(this) + } + + override fun setupView(savedInstanceState: Bundle?) { + addDummiesFragment() + } + + private fun addDummiesFragment() { + supportFragmentManager.findFragmentByTag(DummiesFragment.TAG) ?: supportFragmentManager + .beginTransaction() + .add(R.id.container_fragment, DummiesFragment.newInstance(), DummiesFragment.TAG) + .commitAllowingStateLoss() + } +} \ No newline at end of file diff --git a/app/src/main/java/com/sneha/weatherapp/ui/dummy/DummyViewModel.kt b/app/src/main/java/com/sneha/weatherapp/ui/dummy/DummyViewModel.kt new file mode 100644 index 00000000..22c9de8c --- /dev/null +++ b/app/src/main/java/com/sneha/weatherapp/ui/dummy/DummyViewModel.kt @@ -0,0 +1,20 @@ +package com.sneha.weatherapp.ui.dummy + +import com.sneha.weatherapp.data.repository.DummyRepository +import com.sneha.weatherapp.ui.base.BaseViewModel +import com.sneha.weatherapp.utils.network.NetworkHelper +import com.sneha.weatherapp.utils.rx.SchedulerProvider +import io.reactivex.disposables.CompositeDisposable + + +class DummyViewModel( + schedulerProvider: SchedulerProvider, + compositeDisposable: CompositeDisposable, + networkHelper: NetworkHelper, + private val dummyRepository: DummyRepository +) : BaseViewModel(schedulerProvider, compositeDisposable, networkHelper) { + + override fun onCreate() { + // do something + } +} \ No newline at end of file diff --git a/app/src/main/java/com/sneha/weatherapp/ui/splash/SplashActivity.kt b/app/src/main/java/com/sneha/weatherapp/ui/splash/SplashActivity.kt new file mode 100644 index 00000000..ae521616 --- /dev/null +++ b/app/src/main/java/com/sneha/weatherapp/ui/splash/SplashActivity.kt @@ -0,0 +1,38 @@ +package com.sneha.weatherapp.ui.splash + +import android.content.Intent +import android.os.Bundle +import androidx.lifecycle.Observer +import com.sneha.weatherapp.R +import com.sneha.weatherapp.di.component.ActivityComponent +import com.sneha.weatherapp.ui.base.BaseActivity +import com.sneha.weatherapp.ui.dummy.DummyActivity +import com.sneha.weatherapp.utils.common.Event + +class SplashActivity : BaseActivity() { + + companion object { + const val TAG = "SplashActivity" + } + + override fun provideLayoutId(): Int = R.layout.activity_splash + + override fun injectDependencies(activityComponent: ActivityComponent) { + activityComponent.inject(this) + } + + override fun setupView(savedInstanceState: Bundle?) { + + } + + override fun setupObservers() { + // Event is used by the view model to tell the activity to launch another activity + // view model also provided the Bundle in the event that is needed for the Activity + viewModel.launchDummy.observe(this, Observer>> { + it.getIfNotHandled()?.run { + finish() + startActivity(Intent(applicationContext, DummyActivity::class.java)) + } + }) + } +} \ No newline at end of file diff --git a/app/src/main/java/com/sneha/weatherapp/ui/splash/SplashViewModel.kt b/app/src/main/java/com/sneha/weatherapp/ui/splash/SplashViewModel.kt new file mode 100644 index 00000000..d78419d6 --- /dev/null +++ b/app/src/main/java/com/sneha/weatherapp/ui/splash/SplashViewModel.kt @@ -0,0 +1,38 @@ +package com.sneha.weatherapp.ui.splash + +import androidx.lifecycle.MutableLiveData +import com.sneha.weatherapp.data.repository.UserRepository +import com.sneha.weatherapp.ui.base.BaseViewModel +import com.sneha.weatherapp.utils.common.Event +import com.sneha.weatherapp.utils.network.NetworkHelper +import com.sneha.weatherapp.utils.rx.SchedulerProvider +import io.reactivex.disposables.CompositeDisposable +import kotlinx.coroutines.GlobalScope +import kotlinx.coroutines.delay +import kotlinx.coroutines.launch + + +class SplashViewModel( + schedulerProvider: SchedulerProvider, + compositeDisposable: CompositeDisposable, + networkHelper: NetworkHelper, + val userRepository: UserRepository +) : BaseViewModel(schedulerProvider, compositeDisposable, networkHelper) { + + // Event is used by the view model to tell the activity to launch another Activity + // view model also provided the Bundle in the event that is needed for the Activity + val launchDummy: MutableLiveData>> = MutableLiveData() + + init { + GlobalScope.launch { + delay(5000) + } + } + + override fun onCreate() { + // Empty Bundle passed to Activity in Event that is needed by the other Activity + // Here in actual application we will decide which screen to open based on + // either the user is logged in or not + launchDummy.postValue(Event(emptyMap())) + } +} \ No newline at end of file diff --git a/app/src/main/java/com/sneha/weatherapp/utils/ViewModelProviderFactory.kt b/app/src/main/java/com/sneha/weatherapp/utils/ViewModelProviderFactory.kt new file mode 100644 index 00000000..3138e0a3 --- /dev/null +++ b/app/src/main/java/com/sneha/weatherapp/utils/ViewModelProviderFactory.kt @@ -0,0 +1,32 @@ +package com.sneha.weatherapp.utils + + +import androidx.lifecycle.ViewModel +import androidx.lifecycle.ViewModelProvider +import javax.inject.Singleton +import kotlin.reflect.KClass + +/** + * When ViewModel require parameters in the constructor then ViewModelProviders.of(activity).get(ViewModel.class) do not work + * In this case we need to provide our own ViewModelProvider's Factory. + * create method is called by Android Framework when it needs to create a ViewModel instance. + * NOTE: When activity rotates then create method is not called but earlier instance of ViewModel is returned. + * that is why creator is provided here so that Android Framework can create the ViewModel instance according to its need. + * @T: It says that the ViewModelProviderFactory works with variable of type SplashViewModel + * Example: T -> SplashViewModel, + * + */ +@Singleton +class ViewModelProviderFactory( + private val kClass: KClass, // KClass is the holder of class of type ViewModel that needs to be inject + private val creator: () -> T // This is the Lambda function, this is provided be the ActivityModule/FragmentModule, + // when creator lambda is called then that module creates and return the instance of ViewModel +) : ViewModelProvider.NewInstanceFactory() { + + @Suppress("UNCHECKED_CAST") + @Throws(IllegalArgumentException::class) + override fun create(modelClass: Class): T { + if (modelClass.isAssignableFrom(kClass.java)) return creator() as T + throw IllegalArgumentException("Unknown class name") + } +} diff --git a/app/src/main/java/com/sneha/weatherapp/utils/common/Constants.kt b/app/src/main/java/com/sneha/weatherapp/utils/common/Constants.kt new file mode 100644 index 00000000..a325a2e9 --- /dev/null +++ b/app/src/main/java/com/sneha/weatherapp/utils/common/Constants.kt @@ -0,0 +1,5 @@ +package com.sneha.weatherapp.utils.common + +object Constants { + const val NULL_INDEX = -1L +} \ No newline at end of file diff --git a/app/src/main/java/com/sneha/weatherapp/utils/common/Event.kt b/app/src/main/java/com/sneha/weatherapp/utils/common/Event.kt new file mode 100644 index 00000000..0f127e61 --- /dev/null +++ b/app/src/main/java/com/sneha/weatherapp/utils/common/Event.kt @@ -0,0 +1,21 @@ +package com.sneha.weatherapp.utils.common + +import java.util.concurrent.atomic.AtomicBoolean + +/** + * Used as a wrapper for data that is exposed via a LiveData that represents an event. + */ +data class Event(private val content: T) { + + private var hasBeenHandled = AtomicBoolean(false) + + /** + * Returns the content and prevents its use again. + */ + fun getIfNotHandled(): T? = if (hasBeenHandled.getAndSet(true)) null else content + + /** + * Returns the content, even if it's already been handled. + */ + fun peek(): T = content +} diff --git a/app/src/main/java/com/sneha/weatherapp/utils/common/GlideHelper.kt b/app/src/main/java/com/sneha/weatherapp/utils/common/GlideHelper.kt new file mode 100644 index 00000000..0479a1dc --- /dev/null +++ b/app/src/main/java/com/sneha/weatherapp/utils/common/GlideHelper.kt @@ -0,0 +1,13 @@ +package com.sneha.weatherapp.utils.common + +import com.bumptech.glide.load.model.GlideUrl +import com.bumptech.glide.load.model.LazyHeaders + +object GlideHelper { + + fun getProtectedUrl(url: String, headers: Map): GlideUrl { + val builder = LazyHeaders.Builder() + for (entry in headers) builder.addHeader(entry.key, entry.value) + return GlideUrl(url, builder.build()) + } +} diff --git a/app/src/main/java/com/sneha/weatherapp/utils/common/LoadMoreListener.kt b/app/src/main/java/com/sneha/weatherapp/utils/common/LoadMoreListener.kt new file mode 100644 index 00000000..f27f68b9 --- /dev/null +++ b/app/src/main/java/com/sneha/weatherapp/utils/common/LoadMoreListener.kt @@ -0,0 +1,6 @@ +package com.sneha.weatherapp.utils.common + +interface LoadMoreListener { + + fun onLoadMore() +} \ No newline at end of file diff --git a/app/src/main/java/com/sneha/weatherapp/utils/common/Resource.kt b/app/src/main/java/com/sneha/weatherapp/utils/common/Resource.kt new file mode 100644 index 00000000..d1e669ee --- /dev/null +++ b/app/src/main/java/com/sneha/weatherapp/utils/common/Resource.kt @@ -0,0 +1,14 @@ +package com.sneha.weatherapp.utils.common + +data class Resource private constructor(val status: Status, val data: T?) { + + companion object { + fun success(data: T? = null): Resource = Resource(Status.SUCCESS, data) + + fun error(data: T? = null): Resource = Resource(Status.ERROR, data) + + fun loading(data: T? = null): Resource = Resource(Status.LOADING, data) + + fun unknown(data: T? = null): Resource = Resource(Status.UNKNOWN, data) + } +} \ No newline at end of file diff --git a/app/src/main/java/com/sneha/weatherapp/utils/common/Status.kt b/app/src/main/java/com/sneha/weatherapp/utils/common/Status.kt new file mode 100644 index 00000000..63d7b9e0 --- /dev/null +++ b/app/src/main/java/com/sneha/weatherapp/utils/common/Status.kt @@ -0,0 +1,8 @@ +package com.sneha.weatherapp.utils.common + +enum class Status { + SUCCESS, + ERROR, + LOADING, + UNKNOWN +} \ No newline at end of file diff --git a/app/src/main/java/com/sneha/weatherapp/utils/common/TimeUtils.kt b/app/src/main/java/com/sneha/weatherapp/utils/common/TimeUtils.kt new file mode 100644 index 00000000..4a9f789c --- /dev/null +++ b/app/src/main/java/com/sneha/weatherapp/utils/common/TimeUtils.kt @@ -0,0 +1,34 @@ +package com.sneha.weatherapp.utils.common + +import java.util.* + +object TimeUtils { + + private const val SECOND_MILLIS = 1000 + private const val MINUTE_MILLIS = 60 * SECOND_MILLIS + private const val HOUR_MILLIS = 60 * MINUTE_MILLIS + private const val DAY_MILLIS = 24 * HOUR_MILLIS + + fun getTimeAgo(date: Date): String { + val time = date.time + val now = System.currentTimeMillis() + if (time > now || time <= 0) return "" + + val diff = now - time + return if (diff < MINUTE_MILLIS) { + "just now" + } else if (diff < 2 * MINUTE_MILLIS) { + "a minute ago" + } else if (diff < 50 * MINUTE_MILLIS) { + "${diff / MINUTE_MILLIS} minutes ago" + } else if (diff < 90 * MINUTE_MILLIS) { + "an hour ago" + } else if (diff < 24 * HOUR_MILLIS) { + "${diff / HOUR_MILLIS} hours ago" + } else if (diff < 48 * HOUR_MILLIS) { + "yesterday" + } else { + "${diff / DAY_MILLIS} days ago" + } + } +} \ No newline at end of file diff --git a/app/src/main/java/com/sneha/weatherapp/utils/display/ScreenUtils.kt b/app/src/main/java/com/sneha/weatherapp/utils/display/ScreenUtils.kt new file mode 100644 index 00000000..feb427da --- /dev/null +++ b/app/src/main/java/com/sneha/weatherapp/utils/display/ScreenUtils.kt @@ -0,0 +1,10 @@ +package com.sneha.weatherapp.utils.display + +import android.content.res.Resources + +object ScreenUtils { + + fun getScreenWidth() = Resources.getSystem().displayMetrics.widthPixels + + fun getScreenHeight() = Resources.getSystem().displayMetrics.heightPixels +} \ No newline at end of file diff --git a/app/src/main/java/com/sneha/weatherapp/utils/display/Toaster.kt b/app/src/main/java/com/sneha/weatherapp/utils/display/Toaster.kt new file mode 100644 index 00000000..325da30a --- /dev/null +++ b/app/src/main/java/com/sneha/weatherapp/utils/display/Toaster.kt @@ -0,0 +1,19 @@ +package com.sneha.weatherapp.utils.display + +import android.content.Context +import android.graphics.PorterDuff +import android.widget.TextView +import androidx.core.content.ContextCompat +import com.sneha.weatherapp.R + +object Toaster { + fun show(context: Context, text: CharSequence) { + val toast = android.widget.Toast.makeText(context, text, android.widget.Toast.LENGTH_SHORT) + toast.view.background.setColorFilter( + ContextCompat.getColor(context, R.color.white), PorterDuff.Mode.SRC_IN + ) + val textView = toast.view.findViewById(android.R.id.message) as TextView + textView.setTextColor(ContextCompat.getColor(context, R.color.black)) + toast.show() + } +} \ No newline at end of file diff --git a/app/src/main/java/com/sneha/weatherapp/utils/log/Logger.kt b/app/src/main/java/com/sneha/weatherapp/utils/log/Logger.kt new file mode 100644 index 00000000..ad36429d --- /dev/null +++ b/app/src/main/java/com/sneha/weatherapp/utils/log/Logger.kt @@ -0,0 +1,36 @@ +package com.sneha.weatherapp.utils.log + +import com.sneha.weatherapp.BuildConfig +import timber.log.Timber + +object Logger { + + init { + if (BuildConfig.DEBUG) Timber.plant(Timber.DebugTree()) + } + + fun d(tag: String, s: String, vararg params: Any) = + Timber.tag(tag).d(s, params) + + fun d(tag: String, throwable: Throwable, s: String, vararg params: Any) = + Timber.tag(tag).d(throwable, s, params) + + fun i(tag: String, s: String, vararg params: Any) = + Timber.tag(tag).i(s, params) + + fun i(tag: String, throwable: Throwable, s: String, vararg params: Any) = + Timber.tag(tag).i(throwable, s, params) + + fun w(tag: String, s: String, vararg params: Any) = + Timber.tag(tag).w(s, params) + + fun w(tag: String, throwable: Throwable, s: String, vararg params: Any) = + Timber.tag(tag).w(throwable, s, params) + + fun e(tag: String, s: String, vararg params: Any) = + Timber.tag(tag).e(s, params) + + fun e(tag: String, throwable: Throwable, s: String, vararg params: Any) = + Timber.tag(tag).e(throwable, s, params) + +} diff --git a/app/src/main/java/com/sneha/weatherapp/utils/network/NetworkError.kt b/app/src/main/java/com/sneha/weatherapp/utils/network/NetworkError.kt new file mode 100644 index 00000000..85cf0c94 --- /dev/null +++ b/app/src/main/java/com/sneha/weatherapp/utils/network/NetworkError.kt @@ -0,0 +1,14 @@ +package com.sneha.weatherapp.utils.network + +import com.google.gson.annotations.Expose +import com.google.gson.annotations.SerializedName + +data class NetworkError( + val status: Int = -1, + @Expose + @SerializedName("statusCode") + val statusCode: String = "-1", + @Expose + @SerializedName("message") + val message: String = "Something went wrong" +) \ No newline at end of file diff --git a/app/src/main/java/com/sneha/weatherapp/utils/network/NetworkHelper.kt b/app/src/main/java/com/sneha/weatherapp/utils/network/NetworkHelper.kt new file mode 100644 index 00000000..535e7e92 --- /dev/null +++ b/app/src/main/java/com/sneha/weatherapp/utils/network/NetworkHelper.kt @@ -0,0 +1,45 @@ +package com.sneha.weatherapp.utils.network + +import android.content.Context +import android.net.ConnectivityManager +import com.google.gson.GsonBuilder +import com.google.gson.JsonSyntaxException +import com.jakewharton.retrofit2.adapter.rxjava2.HttpException +import com.sneha.weatherapp.utils.log.Logger +import java.io.IOException +import java.net.ConnectException +import javax.inject.Singleton + +@Singleton +class NetworkHelper constructor(private val context: Context) { + + companion object { + private const val TAG = "NetworkHelper" + } + + fun isNetworkConnected(): Boolean { + val cm = context.getSystemService(Context.CONNECTIVITY_SERVICE) as ConnectivityManager + val activeNetwork = cm.activeNetworkInfo + return activeNetwork?.isConnected ?: false + } + + fun castToNetworkError(throwable: Throwable): NetworkError { + val defaultNetworkError = NetworkError() + try { + if (throwable is ConnectException) return NetworkError(0, "0") + if (throwable !is HttpException) return defaultNetworkError + val error = GsonBuilder() + .excludeFieldsWithoutExposeAnnotation() + .create() + .fromJson(throwable.response().errorBody()?.string(), NetworkError::class.java) + return NetworkError(throwable.code(), error.statusCode, error.message) + } catch (e: IOException) { + Logger.e(TAG, e.toString()) + } catch (e: JsonSyntaxException) { + Logger.e(TAG, e.toString()) + } catch (e: NullPointerException) { + Logger.e(TAG, e.toString()) + } + return defaultNetworkError + } +} \ No newline at end of file diff --git a/app/src/main/java/com/sneha/weatherapp/utils/rx/RxSchedulerProvider.kt b/app/src/main/java/com/sneha/weatherapp/utils/rx/RxSchedulerProvider.kt new file mode 100644 index 00000000..3f50435e --- /dev/null +++ b/app/src/main/java/com/sneha/weatherapp/utils/rx/RxSchedulerProvider.kt @@ -0,0 +1,16 @@ +package com.sneha.weatherapp.utils.rx + +import io.reactivex.Scheduler +import io.reactivex.android.schedulers.AndroidSchedulers +import io.reactivex.schedulers.Schedulers +import javax.inject.Singleton + +@Singleton +class RxSchedulerProvider : SchedulerProvider { + + override fun computation(): Scheduler = Schedulers.computation() + + override fun io(): Scheduler = Schedulers.io() + + override fun ui(): Scheduler = AndroidSchedulers.mainThread() +} diff --git a/app/src/main/java/com/sneha/weatherapp/utils/rx/SchedulerProvider.kt b/app/src/main/java/com/sneha/weatherapp/utils/rx/SchedulerProvider.kt new file mode 100644 index 00000000..c2c5aa60 --- /dev/null +++ b/app/src/main/java/com/sneha/weatherapp/utils/rx/SchedulerProvider.kt @@ -0,0 +1,14 @@ +package com.sneha.weatherapp.utils.rx + +import io.reactivex.Scheduler +import javax.inject.Singleton + +@Singleton +interface SchedulerProvider { + + fun computation(): Scheduler + + fun io(): Scheduler + + fun ui(): Scheduler +} \ No newline at end of file diff --git a/app/src/main/res/drawable-v24/ic_launcher_foreground.xml b/app/src/main/res/drawable-v24/ic_launcher_foreground.xml new file mode 100644 index 00000000..1f6bb290 --- /dev/null +++ b/app/src/main/res/drawable-v24/ic_launcher_foreground.xml @@ -0,0 +1,34 @@ + + + + + + + + + + + diff --git a/app/src/main/res/drawable/ic_launcher_background.xml b/app/src/main/res/drawable/ic_launcher_background.xml new file mode 100644 index 00000000..0d025f9b --- /dev/null +++ b/app/src/main/res/drawable/ic_launcher_background.xml @@ -0,0 +1,170 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/app/src/main/res/layout/activity_dummy.xml b/app/src/main/res/layout/activity_dummy.xml new file mode 100644 index 00000000..d4acc45a --- /dev/null +++ b/app/src/main/res/layout/activity_dummy.xml @@ -0,0 +1,14 @@ + + + + + + \ No newline at end of file diff --git a/app/src/main/res/layout/activity_splash.xml b/app/src/main/res/layout/activity_splash.xml new file mode 100644 index 00000000..4b85a3a7 --- /dev/null +++ b/app/src/main/res/layout/activity_splash.xml @@ -0,0 +1,11 @@ + + + + + \ No newline at end of file diff --git a/app/src/main/res/layout/fragment_dummies.xml b/app/src/main/res/layout/fragment_dummies.xml new file mode 100644 index 00000000..6cf71d20 --- /dev/null +++ b/app/src/main/res/layout/fragment_dummies.xml @@ -0,0 +1,23 @@ + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/layout/item_view_dummies.xml b/app/src/main/res/layout/item_view_dummies.xml new file mode 100644 index 00000000..3e0efae1 --- /dev/null +++ b/app/src/main/res/layout/item_view_dummies.xml @@ -0,0 +1,33 @@ + + + + + + + + + + + \ 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 00000000..eca70cfe --- /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 00000000..eca70cfe --- /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..898f3ed59ac9f3248734a00e5902736c9367d455 GIT binary patch literal 2963 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 JPDHLkV1g@XpTGbB 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..dffca3601eba7bf5f409bdd520820e2eb5122c75 GIT binary patch literal 4905 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 lV%Z2*hu);6rydA(}wUDXPCF_W1vnaRBK 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 literal 0 HcmV?d00001 diff --git a/app/src/main/res/mipmap-xhdpi/ic_launcher_round.png b/app/src/main/res/mipmap-xhdpi/ic_launcher_round.png new file mode 100644 index 0000000000000000000000000000000000000000..14ed0af35023e4f1901cf03487b6c524257b8483 GIT binary patch literal 6895 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 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..b0907cac3bfd8fbfdc46e1108247f0a1055387ec GIT binary patch literal 6387 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 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..d8ae03154975f397f8ed1b84f2d4bf9783ecfa26 GIT binary patch literal 10413 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 XdJ+W}DiIkV00000NkvXXu0mjfKBlg6 literal 0 HcmV?d00001 diff --git a/app/src/main/res/mipmap-xxxhdpi/ic_launcher.png b/app/src/main/res/mipmap-xxxhdpi/ic_launcher.png new file mode 100644 index 0000000000000000000000000000000000000000..2c18de9e66108411737e910f5c1972476f03ddbf GIT binary patch literal 9128 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 I20H400LcNok^lez literal 0 HcmV?d00001 diff --git a/app/src/main/res/mipmap-xxxhdpi/ic_launcher_round.png b/app/src/main/res/mipmap-xxxhdpi/ic_launcher_round.png new file mode 100644 index 0000000000000000000000000000000000000000..beed3cdd2c32af5114a7dc70b9ef5b698eb8797e GIT binary patch literal 15132 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 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 00000000..0fe4ea09 --- /dev/null +++ b/app/src/main/res/values/colors.xml @@ -0,0 +1,14 @@ + + + #008577 + #00574B + #D81B60 + #FFFFFF + #000000 + + #C9DFF7 + #26C0FF + #3DD2FF + #F1F1F1 + #2A2A2A + diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml new file mode 100644 index 00000000..e7d037c4 --- /dev/null +++ b/app/src/main/res/values/strings.xml @@ -0,0 +1,11 @@ + + WeatherApp + + Internet connection lost, please retry again + Something wrong happened, please retry again + Our systems got an error, please retry again + Our services are under maintenance, please retry after some time + + Not able to connect, please retry again + Please log in again + diff --git a/app/src/main/res/values/styles.xml b/app/src/main/res/values/styles.xml new file mode 100644 index 00000000..f482b351 --- /dev/null +++ b/app/src/main/res/values/styles.xml @@ -0,0 +1,18 @@ + + + + + + + + diff --git a/app/src/test/java/com/sneha/weatherapp/ExampleUnitTest.kt b/app/src/test/java/com/sneha/weatherapp/ExampleUnitTest.kt new file mode 100644 index 00000000..beeb361e --- /dev/null +++ b/app/src/test/java/com/sneha/weatherapp/ExampleUnitTest.kt @@ -0,0 +1,17 @@ +package com.sneha.weatherapp + +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) + } +} diff --git a/build.gradle b/build.gradle new file mode 100644 index 00000000..cc422b0f --- /dev/null +++ b/build.gradle @@ -0,0 +1,88 @@ +// Top-level build file where you can add configuration options common to all sub-projects/modules. + +buildscript { + ext.kotlin_version = '1.3.61' + repositories { + google() + jcenter() + + } + dependencies { + classpath 'com.android.tools.build:gradle:3.5.3' + 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() + jcenter() + + } +} + +//task clean(type: Delete) { +// delete rootProject.buildDir +//} + +ext{ + // Sdk and Tools + min_sdk_version = 15 + target_sdk_version = 29 + compile_sdk_version = 29 + + // Core + app_compat_version = '1.1.0' + support_library_version = '1.0.0' + build_tool_version = '29.0.2' + constraint_version = '1.1.3' + + // Lifecycle + lifecycle_version = '2.0.0' + + //Browser + browser_version = '1.2.0' + + // Reactive + rxjava_version = '2.2.3' + rxandroid_version = '2.1.1' + + // Image + glide_version = '4.8.0' + + // Parser + gson_version = '2.8.5' + + // Logging + timber_version = '4.7.1' + + // DB + room_version = '2.0.0' + debug_db_version = '1.0.6' + + // Networking + retrofit_version = '2.4.0' + okhttp_version = '3.11.0' + retrofit_adapter_version = '1.1.0' + + // DB + room_version = '2.0.0' + debug_db_version = '1.0.6' + + // Dagger + dagger_version = '2.21' + + //Multidex + retrofit_version = '2.0.1' + + // Tests + junit_version = '4.12' + espresso_version = '3.1.0' + mockito_version = '2.7.1' + core_testing_version = '1.1.1' + test_runner_version = '1.1.1' + test_ext_runner_version = '1.1.0' + hamcrest_version = '2.1' +} diff --git a/gradle.properties b/gradle.properties new file mode 100644 index 00000000..23339e0d --- /dev/null +++ b/gradle.properties @@ -0,0 +1,21 @@ +# 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=-Xmx1536m +# 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 +# Automatically convert third-party libraries to use AndroidX +android.enableJetifier=true +# Kotlin code style for this project: "official" or "obsolete": +kotlin.code.style=official 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 00000000..2edaae85 --- /dev/null +++ b/gradle/wrapper/gradle-wrapper.properties @@ -0,0 +1,6 @@ +#Thu Jan 30 22:40:59 IST 2020 +distributionBase=GRADLE_USER_HOME +distributionPath=wrapper/dists +zipStoreBase=GRADLE_USER_HOME +zipStorePath=wrapper/dists +distributionUrl=https\://services.gradle.org/distributions/gradle-5.4.1-all.zip diff --git a/gradlew b/gradlew new file mode 100644 index 00000000..cccdd3d5 --- /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/settings.gradle b/settings.gradle new file mode 100644 index 00000000..e2b911f9 --- /dev/null +++ b/settings.gradle @@ -0,0 +1,2 @@ +include ':app' +rootProject.name='WeatherApp' From 65fb4b315f83119e68bc290545fb8cc795d13b4a Mon Sep 17 00:00:00 2001 From: snehak24 Date: Tue, 4 Feb 2020 11:50:25 +0530 Subject: [PATCH 2/6] 1. Added ProximaNova font. 2. Updated styles. 3. API endpoints with networking changes. --- app/build.gradle | 4 +- app/src/main/AndroidManifest.xml | 6 +- .../weatherapp/data/model/DailyForecast.kt | 33 ++++++ .../sneha/weatherapp/data/model/Forecast.kt | 15 +++ .../sneha/weatherapp/data/model/Weather.kt | 112 ++++++++++++++++++ .../weatherapp/data/remote/NetworkService.kt | 34 ++++-- .../weatherapp/data/remote/Networking.kt | 2 +- .../data/repository/DummyRepository.kt | 18 --- .../data/repository/WeatherRepository.kt | 24 ++++ .../di/component/ActivityComponent.kt | 4 +- .../weatherapp/di/module/ActivityModule.kt | 16 +-- .../weatherapp/di/module/FragmentModule.kt | 4 +- .../weatherapp/ui/dummies/DummiesFragment.kt | 14 +-- .../weatherapp/ui/dummies/DummiesViewModel.kt | 25 ++-- .../weatherapp/ui/dummy/DummyActivity.kt | 31 ----- .../weatherapp/ui/dummy/DummyViewModel.kt | 20 ---- .../weatherapp/ui/splash/SplashActivity.kt | 4 +- .../weatherapp/ui/weather/WeatherActivity.kt | 30 +++++ .../weatherapp/ui/weather/WeatherViewModel.kt | 47 ++++++++ .../weatherapp/utils/common/TimeUtils.kt | 8 ++ app/src/main/res/font/font_family.xml | 7 ++ app/src/main/res/font/proxima_nova_bold.ttf | Bin 0 -> 88456 bytes app/src/main/res/font/proxima_nova_light.ttf | Bin 0 -> 89788 bytes app/src/main/res/font/proxima_nova_medium.ttf | Bin 0 -> 107664 bytes .../main/res/font/proxima_nova_regular.ttf | Bin 0 -> 90104 bytes app/src/main/res/layout/activity_dummy.xml | 14 --- app/src/main/res/layout/activity_weather.xml | 76 ++++++++++++ app/src/main/res/values/styles.xml | 81 ++++++++++++- 28 files changed, 492 insertions(+), 137 deletions(-) create mode 100644 app/src/main/java/com/sneha/weatherapp/data/model/DailyForecast.kt create mode 100644 app/src/main/java/com/sneha/weatherapp/data/model/Forecast.kt create mode 100644 app/src/main/java/com/sneha/weatherapp/data/model/Weather.kt delete mode 100644 app/src/main/java/com/sneha/weatherapp/data/repository/DummyRepository.kt create mode 100644 app/src/main/java/com/sneha/weatherapp/data/repository/WeatherRepository.kt delete mode 100644 app/src/main/java/com/sneha/weatherapp/ui/dummy/DummyActivity.kt delete mode 100644 app/src/main/java/com/sneha/weatherapp/ui/dummy/DummyViewModel.kt create mode 100644 app/src/main/java/com/sneha/weatherapp/ui/weather/WeatherActivity.kt create mode 100644 app/src/main/java/com/sneha/weatherapp/ui/weather/WeatherViewModel.kt create mode 100644 app/src/main/res/font/font_family.xml create mode 100644 app/src/main/res/font/proxima_nova_bold.ttf create mode 100644 app/src/main/res/font/proxima_nova_light.ttf create mode 100644 app/src/main/res/font/proxima_nova_medium.ttf create mode 100644 app/src/main/res/font/proxima_nova_regular.ttf delete mode 100644 app/src/main/res/layout/activity_dummy.xml create mode 100644 app/src/main/res/layout/activity_weather.xml diff --git a/app/build.gradle b/app/build.gradle index daad2849..f72bfcbd 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -23,13 +23,13 @@ android { buildTypes { debug { - buildConfigField("String", "BASE_URL", "\"http://worksample-api.herokuapp.com/\"") + buildConfigField("String", "BASE_URL", "\"https://worksample-api.herokuapp.com/\"") buildConfigField("String", "API_KEY", "\"HBNA19QVVAPP\"") } release { minifyEnabled false proguardFiles getDefaultProguardFile('proguard-android-optimize.txt'), 'proguard-rules.pro' -// buildConfigField("String", "BASE_URL", "\"http://worksample-api.herokuapp.com/\"") +// buildConfigField("String", "BASE_URL", "\"https://worksample-api.herokuapp.com/\"") // buildConfigField("String", "API_KEY", "\"HBNA19QVVAPP\"") } } diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index 0007cc0d..5d1460d8 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -14,7 +14,7 @@ android:roundIcon="@mipmap/ic_launcher_round"> @@ -25,8 +25,8 @@ + android:name="com.sneha.weatherapp.ui.weather.WeatherActivity" + android:theme="@style/NoActionBarTheme"/> \ No newline at end of file diff --git a/app/src/main/java/com/sneha/weatherapp/data/model/DailyForecast.kt b/app/src/main/java/com/sneha/weatherapp/data/model/DailyForecast.kt new file mode 100644 index 00000000..9fb4505a --- /dev/null +++ b/app/src/main/java/com/sneha/weatherapp/data/model/DailyForecast.kt @@ -0,0 +1,33 @@ +package com.sneha.weatherapp.data.model + +import com.google.gson.annotations.SerializedName + +data class DailyForecast( + + @SerializedName("list") + val forecastList: List + +) { + + data class ForecastItem( + @SerializedName("dt") + val time: Long, + + @SerializedName("weather") + val weather: List, + + @SerializedName("temp") + val temp: Temp + ) + + data class Temp( + @SerializedName("day") + val day: Double, + + @SerializedName("max") + val max: Double, + + @SerializedName("min") + val min: Double + ) +} \ No newline at end of file diff --git a/app/src/main/java/com/sneha/weatherapp/data/model/Forecast.kt b/app/src/main/java/com/sneha/weatherapp/data/model/Forecast.kt new file mode 100644 index 00000000..0c5ff8ea --- /dev/null +++ b/app/src/main/java/com/sneha/weatherapp/data/model/Forecast.kt @@ -0,0 +1,15 @@ +package com.sneha.weatherapp.data.model + +import com.google.gson.annotations.SerializedName + +data class Forecast( + @SerializedName("dt") + val time: Long, + + @SerializedName("weather") + val weather: List, + + @SerializedName("main") + val main: Weather.MainData + +) \ No newline at end of file diff --git a/app/src/main/java/com/sneha/weatherapp/data/model/Weather.kt b/app/src/main/java/com/sneha/weatherapp/data/model/Weather.kt new file mode 100644 index 00000000..cc36d61b --- /dev/null +++ b/app/src/main/java/com/sneha/weatherapp/data/model/Weather.kt @@ -0,0 +1,112 @@ +package com.sneha.weatherapp.data.model + +import com.google.gson.annotations.SerializedName + +data class Weather( + @SerializedName("coord") + val coordinates: Coordinates, + + @SerializedName("weather") + val weather: List, + + @SerializedName("base") + val base: String, + + @SerializedName("main") + val main: MainData, + + @SerializedName("visibility") + val visibility: Double, + + @SerializedName("wind") + val wind: Wind, + +// @SerializedName("clouds") +// val clouds: Clouds, + + @SerializedName("dt") + val dt: Double, + + @SerializedName("sys") + val sys: Sys, + + @SerializedName("timezone") + val timezone: Double, + + @SerializedName("id") + val id: Double, + + @SerializedName("name") + val name: String, + + @SerializedName("cod") + val cod: Int +) { + + data class Coordinates( + @SerializedName("lon") + val longitude: Double, + + @SerializedName("lat") + val latitude: Double + ) + + data class WeatherData( + @SerializedName("id") + val id: Int, + + @SerializedName("main") + val main: String, + + @SerializedName("description") + val description: String, + + @SerializedName("icon") + val icon: Int + ) + + data class MainData( + @SerializedName("temp") + val temperature: Double, + + @SerializedName("feels_like") + val feelsLike: Double, + + @SerializedName("temp_min") + val temperatureMin: Double, + + @SerializedName("temp_max") + val temperatureMax: Double, + + @SerializedName("pressure") + val pressure: Double, + + @SerializedName("humidity") + val humidity: Double + ) + + data class Wind( + @SerializedName("speed") + val speed: Double, + + @SerializedName("deg") + val degree: Double + ) + + data class Sys( + @SerializedName("type") + val type: Int, + + @SerializedName("id") + val id: Int, + + @SerializedName("country") + val country: String, + + @SerializedName("sunrise") + val sunrise: Double, + + @SerializedName("sunset") + val sunset: Double + ) +} \ No newline at end of file diff --git a/app/src/main/java/com/sneha/weatherapp/data/remote/NetworkService.kt b/app/src/main/java/com/sneha/weatherapp/data/remote/NetworkService.kt index f1ced730..ca7effc9 100644 --- a/app/src/main/java/com/sneha/weatherapp/data/remote/NetworkService.kt +++ b/app/src/main/java/com/sneha/weatherapp/data/remote/NetworkService.kt @@ -1,19 +1,33 @@ package com.sneha.weatherapp.data.remote -import com.sneha.weatherapp.data.remote.request.DummyRequest -import com.sneha.weatherapp.data.remote.response.DummyResponse +import com.sneha.weatherapp.data.model.DailyForecast +import com.sneha.weatherapp.data.model.Forecast +import com.sneha.weatherapp.data.model.Weather import io.reactivex.Single -import retrofit2.http.Body -import retrofit2.http.Header -import retrofit2.http.POST +import retrofit2.http.GET +import retrofit2.http.Query import javax.inject.Singleton @Singleton interface NetworkService { - @POST(Endpoints.WEATHER) - fun doDummyCall( - @Body request: DummyRequest, - @Header(Networking.HEADER_API_KEY) apiKey: String = Networking.API_KEY // default value set when Networking create is called - ): Single + @GET(Endpoints.WEATHER) + fun getWeatherData( + @Query("q") cityName: String, + @Query(Networking.HEADER_API_KEY) apiKey: String = Networking.API_KEY // default value set when Networking create is called + ): Single + + @GET(Endpoints.FORECAST_DAILY) + fun getDailyForecast( + @Query("id") cityId: Long, + @Query("cnt") count: Int, + @Query(Networking.HEADER_API_KEY) apiKey: String = Networking.API_KEY + ): Single + + @GET(Endpoints.FORECAST) + fun getTodayForecast( + @Query("id") cityId: Long, + @Query("cnt") count: Int, + @Query(Networking.HEADER_API_KEY) apiKey: String = Networking.API_KEY + ): Single } \ No newline at end of file diff --git a/app/src/main/java/com/sneha/weatherapp/data/remote/Networking.kt b/app/src/main/java/com/sneha/weatherapp/data/remote/Networking.kt index ca23e7ca..fa3a9deb 100644 --- a/app/src/main/java/com/sneha/weatherapp/data/remote/Networking.kt +++ b/app/src/main/java/com/sneha/weatherapp/data/remote/Networking.kt @@ -12,7 +12,7 @@ import java.util.concurrent.TimeUnit object Networking { - const val HEADER_API_KEY = "x-api-key" + const val HEADER_API_KEY = "key" private const val NETWORK_CALL_TIMEOUT = 60 internal lateinit var API_KEY: String diff --git a/app/src/main/java/com/sneha/weatherapp/data/repository/DummyRepository.kt b/app/src/main/java/com/sneha/weatherapp/data/repository/DummyRepository.kt deleted file mode 100644 index 2e68d1a2..00000000 --- a/app/src/main/java/com/sneha/weatherapp/data/repository/DummyRepository.kt +++ /dev/null @@ -1,18 +0,0 @@ -package com.sneha.weatherapp.data.repository - -import com.sneha.weatherapp.data.local.db.DatabaseService -import com.sneha.weatherapp.data.model.Dummy -import com.sneha.weatherapp.data.remote.NetworkService -import com.sneha.weatherapp.data.remote.request.DummyRequest -import io.reactivex.Single -import javax.inject.Inject - -class DummyRepository @Inject constructor( - private val networkService: NetworkService, - private val databaseService: DatabaseService -) { - - fun fetchDummy(id: String): Single> = - networkService.doDummyCall(DummyRequest(id)).map { it.data } - -} \ No newline at end of file diff --git a/app/src/main/java/com/sneha/weatherapp/data/repository/WeatherRepository.kt b/app/src/main/java/com/sneha/weatherapp/data/repository/WeatherRepository.kt new file mode 100644 index 00000000..9fd5aff3 --- /dev/null +++ b/app/src/main/java/com/sneha/weatherapp/data/repository/WeatherRepository.kt @@ -0,0 +1,24 @@ +package com.sneha.weatherapp.data.repository + +import com.sneha.weatherapp.data.local.db.DatabaseService +import com.sneha.weatherapp.data.model.DailyForecast +import com.sneha.weatherapp.data.model.Forecast +import com.sneha.weatherapp.data.model.Weather +import com.sneha.weatherapp.data.remote.NetworkService +import io.reactivex.Single +import javax.inject.Inject + +class WeatherRepository @Inject constructor( + private val networkService: NetworkService, + private val databaseService: DatabaseService +) { + + fun fetchWeatherData(cityName: String): Single = + networkService.getWeatherData(cityName = cityName) + + fun fetchDailyForecast(cityId: Long, count: Int): Single = + networkService.getDailyForecast(cityId, 7) + + fun fetchTodayForecast(cityId: Long): Single = + networkService.getTodayForecast(cityId, 7) +} \ No newline at end of file diff --git a/app/src/main/java/com/sneha/weatherapp/di/component/ActivityComponent.kt b/app/src/main/java/com/sneha/weatherapp/di/component/ActivityComponent.kt index 57c5e294..e11d8db1 100644 --- a/app/src/main/java/com/sneha/weatherapp/di/component/ActivityComponent.kt +++ b/app/src/main/java/com/sneha/weatherapp/di/component/ActivityComponent.kt @@ -2,7 +2,7 @@ package com.sneha.weatherapp.di.component import com.sneha.weatherapp.di.ActivityScope import com.sneha.weatherapp.di.module.ActivityModule -import com.sneha.weatherapp.ui.dummy.DummyActivity +import com.sneha.weatherapp.ui.weather.WeatherActivity import com.sneha.weatherapp.ui.splash.SplashActivity import dagger.Component @@ -15,5 +15,5 @@ interface ActivityComponent { fun inject(activity: SplashActivity) - fun inject(activity: DummyActivity) + fun inject(activity: WeatherActivity) } \ No newline at end of file diff --git a/app/src/main/java/com/sneha/weatherapp/di/module/ActivityModule.kt b/app/src/main/java/com/sneha/weatherapp/di/module/ActivityModule.kt index 0eed81c6..870e3855 100644 --- a/app/src/main/java/com/sneha/weatherapp/di/module/ActivityModule.kt +++ b/app/src/main/java/com/sneha/weatherapp/di/module/ActivityModule.kt @@ -2,10 +2,10 @@ package com.sneha.weatherapp.di.module import androidx.lifecycle.ViewModelProviders import androidx.recyclerview.widget.LinearLayoutManager -import com.sneha.weatherapp.data.repository.DummyRepository +import com.sneha.weatherapp.data.repository.WeatherRepository import com.sneha.weatherapp.data.repository.UserRepository import com.sneha.weatherapp.ui.base.BaseActivity -import com.sneha.weatherapp.ui.dummy.DummyViewModel +import com.sneha.weatherapp.ui.weather.WeatherViewModel import com.sneha.weatherapp.ui.splash.SplashViewModel import com.sneha.weatherapp.utils.ViewModelProviderFactory import com.sneha.weatherapp.utils.network.NetworkHelper @@ -38,13 +38,13 @@ class ActivityModule(private val activity: BaseActivity<*>) { }).get(SplashViewModel::class.java) @Provides - fun provideDummyViewModel( + fun provideWeatherViewModel( schedulerProvider: SchedulerProvider, compositeDisposable: CompositeDisposable, networkHelper: NetworkHelper, - dummyRepository: DummyRepository - ): DummyViewModel = ViewModelProviders.of( - activity, ViewModelProviderFactory(DummyViewModel::class) { - DummyViewModel(schedulerProvider, compositeDisposable, networkHelper, dummyRepository) - }).get(DummyViewModel::class.java) + weatherRepository: WeatherRepository + ): WeatherViewModel = ViewModelProviders.of( + activity, ViewModelProviderFactory(WeatherViewModel::class) { + WeatherViewModel(schedulerProvider, compositeDisposable, networkHelper, weatherRepository) + }).get(WeatherViewModel::class.java) } \ No newline at end of file diff --git a/app/src/main/java/com/sneha/weatherapp/di/module/FragmentModule.kt b/app/src/main/java/com/sneha/weatherapp/di/module/FragmentModule.kt index ab7ac381..dadc44ea 100644 --- a/app/src/main/java/com/sneha/weatherapp/di/module/FragmentModule.kt +++ b/app/src/main/java/com/sneha/weatherapp/di/module/FragmentModule.kt @@ -2,7 +2,7 @@ package com.sneha.weatherapp.di.module import androidx.lifecycle.ViewModelProviders import androidx.recyclerview.widget.LinearLayoutManager -import com.sneha.weatherapp.data.repository.DummyRepository +import com.sneha.weatherapp.data.repository.WeatherRepository import com.sneha.weatherapp.ui.base.BaseFragment import com.sneha.weatherapp.ui.dummies.DummiesAdapter import com.sneha.weatherapp.ui.dummies.DummiesViewModel @@ -24,7 +24,7 @@ class FragmentModule(private val fragment: BaseFragment<*>) { schedulerProvider: SchedulerProvider, compositeDisposable: CompositeDisposable, networkHelper: NetworkHelper, - dummyRepository: DummyRepository + dummyRepository: WeatherRepository ): DummiesViewModel = ViewModelProviders.of(fragment, ViewModelProviderFactory(DummiesViewModel::class) { diff --git a/app/src/main/java/com/sneha/weatherapp/ui/dummies/DummiesFragment.kt b/app/src/main/java/com/sneha/weatherapp/ui/dummies/DummiesFragment.kt index 80f78fb4..8c1e7431 100644 --- a/app/src/main/java/com/sneha/weatherapp/ui/dummies/DummiesFragment.kt +++ b/app/src/main/java/com/sneha/weatherapp/ui/dummies/DummiesFragment.kt @@ -2,12 +2,10 @@ package com.sneha.weatherapp.ui.dummies import android.os.Bundle import android.view.View -import androidx.lifecycle.Observer import androidx.recyclerview.widget.LinearLayoutManager import com.sneha.weatherapp.R import com.sneha.weatherapp.di.component.FragmentComponent import com.sneha.weatherapp.ui.base.BaseFragment -import kotlinx.android.synthetic.main.fragment_dummies.* import javax.inject.Inject class DummiesFragment : BaseFragment() { @@ -37,14 +35,14 @@ class DummiesFragment : BaseFragment() { } override fun setupObservers() { - viewModel.getDummies().observe(this, Observer { - it?.run { dummiesAdapter.appendData(this) } - }) +// viewModel.getWeatherData().observe(this, Observer { +// Log.e(TAG, "${it?.main?.temperature}") +//// it?.run { dummiesAdapter.appendData(this) } +// }) } override fun setupView(view: View) { - rv_dummy.layoutManager = linearLayoutManager - rv_dummy.adapter = dummiesAdapter +// rv_dummy.layoutManager = linearLayoutManager +// rv_dummy.adapter = dummiesAdapter } - } \ No newline at end of file diff --git a/app/src/main/java/com/sneha/weatherapp/ui/dummies/DummiesViewModel.kt b/app/src/main/java/com/sneha/weatherapp/ui/dummies/DummiesViewModel.kt index d22394a3..d168280a 100644 --- a/app/src/main/java/com/sneha/weatherapp/ui/dummies/DummiesViewModel.kt +++ b/app/src/main/java/com/sneha/weatherapp/ui/dummies/DummiesViewModel.kt @@ -4,7 +4,8 @@ import androidx.lifecycle.LiveData import androidx.lifecycle.MutableLiveData import androidx.lifecycle.Transformations import com.sneha.weatherapp.data.model.Dummy -import com.sneha.weatherapp.data.repository.DummyRepository +import com.sneha.weatherapp.data.model.Weather +import com.sneha.weatherapp.data.repository.WeatherRepository import com.sneha.weatherapp.ui.base.BaseViewModel import com.sneha.weatherapp.utils.common.Resource import com.sneha.weatherapp.utils.common.Status @@ -17,28 +18,28 @@ class DummiesViewModel( schedulerProvider: SchedulerProvider, compositeDisposable: CompositeDisposable, networkHelper: NetworkHelper, - private val dummyRepository: DummyRepository + private val weatherRepository: WeatherRepository ) : BaseViewModel(schedulerProvider, compositeDisposable, networkHelper) { - private val dummyLiveData: MutableLiveData>> = MutableLiveData() + private val weatherLiveData: MutableLiveData> = MutableLiveData() - fun getDummies(): LiveData> = - Transformations.map(dummyLiveData) { it.data } + fun getWeatherData(): LiveData = + Transformations.map(weatherLiveData) { it.data } - fun isDummiesFetching(): LiveData = - Transformations.map(dummyLiveData) { it.status == Status.LOADING } + fun isWeatherFetching(): LiveData = + Transformations.map(weatherLiveData) { it.status == Status.LOADING } override fun onCreate() { - if (dummyLiveData.value == null && checkInternetConnectionWithMessage()) { - dummyLiveData.postValue(Resource.loading()) + if (weatherLiveData.value == null && checkInternetConnectionWithMessage()) { + weatherLiveData.postValue(Resource.loading()) compositeDisposable.add( - dummyRepository.fetchDummy("MY_SAMPLE_DUMMY") + weatherRepository.fetchWeatherData("Stockholm,SE") .subscribeOn(schedulerProvider.io()) .subscribe( - { dummyLiveData.postValue(Resource.success(it)) }, + { weatherLiveData.postValue(Resource.success(it)) }, { handleNetworkError(it) - dummyLiveData.postValue(Resource.error()) + weatherLiveData.postValue(Resource.error()) }) ) } diff --git a/app/src/main/java/com/sneha/weatherapp/ui/dummy/DummyActivity.kt b/app/src/main/java/com/sneha/weatherapp/ui/dummy/DummyActivity.kt deleted file mode 100644 index 0c8f3b03..00000000 --- a/app/src/main/java/com/sneha/weatherapp/ui/dummy/DummyActivity.kt +++ /dev/null @@ -1,31 +0,0 @@ -package com.sneha.weatherapp.ui.dummy - -import android.os.Bundle -import com.sneha.weatherapp.R -import com.sneha.weatherapp.di.component.ActivityComponent -import com.sneha.weatherapp.ui.base.BaseActivity -import com.sneha.weatherapp.ui.dummies.DummiesFragment - -class DummyActivity : BaseActivity() { - - companion object { - const val TAG = "DummyActivity" - } - - override fun provideLayoutId(): Int = R.layout.activity_dummy - - override fun injectDependencies(activityComponent: ActivityComponent) { - activityComponent.inject(this) - } - - override fun setupView(savedInstanceState: Bundle?) { - addDummiesFragment() - } - - private fun addDummiesFragment() { - supportFragmentManager.findFragmentByTag(DummiesFragment.TAG) ?: supportFragmentManager - .beginTransaction() - .add(R.id.container_fragment, DummiesFragment.newInstance(), DummiesFragment.TAG) - .commitAllowingStateLoss() - } -} \ No newline at end of file diff --git a/app/src/main/java/com/sneha/weatherapp/ui/dummy/DummyViewModel.kt b/app/src/main/java/com/sneha/weatherapp/ui/dummy/DummyViewModel.kt deleted file mode 100644 index 22c9de8c..00000000 --- a/app/src/main/java/com/sneha/weatherapp/ui/dummy/DummyViewModel.kt +++ /dev/null @@ -1,20 +0,0 @@ -package com.sneha.weatherapp.ui.dummy - -import com.sneha.weatherapp.data.repository.DummyRepository -import com.sneha.weatherapp.ui.base.BaseViewModel -import com.sneha.weatherapp.utils.network.NetworkHelper -import com.sneha.weatherapp.utils.rx.SchedulerProvider -import io.reactivex.disposables.CompositeDisposable - - -class DummyViewModel( - schedulerProvider: SchedulerProvider, - compositeDisposable: CompositeDisposable, - networkHelper: NetworkHelper, - private val dummyRepository: DummyRepository -) : BaseViewModel(schedulerProvider, compositeDisposable, networkHelper) { - - override fun onCreate() { - // do something - } -} \ No newline at end of file diff --git a/app/src/main/java/com/sneha/weatherapp/ui/splash/SplashActivity.kt b/app/src/main/java/com/sneha/weatherapp/ui/splash/SplashActivity.kt index ae521616..78dddca8 100644 --- a/app/src/main/java/com/sneha/weatherapp/ui/splash/SplashActivity.kt +++ b/app/src/main/java/com/sneha/weatherapp/ui/splash/SplashActivity.kt @@ -6,7 +6,7 @@ import androidx.lifecycle.Observer import com.sneha.weatherapp.R import com.sneha.weatherapp.di.component.ActivityComponent import com.sneha.weatherapp.ui.base.BaseActivity -import com.sneha.weatherapp.ui.dummy.DummyActivity +import com.sneha.weatherapp.ui.weather.WeatherActivity import com.sneha.weatherapp.utils.common.Event class SplashActivity : BaseActivity() { @@ -31,7 +31,7 @@ class SplashActivity : BaseActivity() { viewModel.launchDummy.observe(this, Observer>> { it.getIfNotHandled()?.run { finish() - startActivity(Intent(applicationContext, DummyActivity::class.java)) + startActivity(Intent(applicationContext, WeatherActivity::class.java)) } }) } diff --git a/app/src/main/java/com/sneha/weatherapp/ui/weather/WeatherActivity.kt b/app/src/main/java/com/sneha/weatherapp/ui/weather/WeatherActivity.kt new file mode 100644 index 00000000..47f93dae --- /dev/null +++ b/app/src/main/java/com/sneha/weatherapp/ui/weather/WeatherActivity.kt @@ -0,0 +1,30 @@ +package com.sneha.weatherapp.ui.weather + +import android.os.Bundle +import android.util.Log +import androidx.lifecycle.Observer +import com.sneha.weatherapp.R +import com.sneha.weatherapp.di.component.ActivityComponent +import com.sneha.weatherapp.ui.base.BaseActivity + +class WeatherActivity : BaseActivity() { + + companion object { + const val TAG = "WeatherActivity" + } + + override fun provideLayoutId(): Int = R.layout.activity_weather + + override fun injectDependencies(activityComponent: ActivityComponent) { + activityComponent.inject(this) + } + + override fun setupObservers() { + viewModel.getWeatherData().observe(this, Observer { + Log.e(TAG, "${it?.name}") + }) + } + + override fun setupView(savedInstanceState: Bundle?) { + } +} \ No newline at end of file diff --git a/app/src/main/java/com/sneha/weatherapp/ui/weather/WeatherViewModel.kt b/app/src/main/java/com/sneha/weatherapp/ui/weather/WeatherViewModel.kt new file mode 100644 index 00000000..a8c7e4b0 --- /dev/null +++ b/app/src/main/java/com/sneha/weatherapp/ui/weather/WeatherViewModel.kt @@ -0,0 +1,47 @@ +package com.sneha.weatherapp.ui.weather + +import androidx.lifecycle.LiveData +import androidx.lifecycle.MutableLiveData +import androidx.lifecycle.Transformations +import com.sneha.weatherapp.data.model.Weather +import com.sneha.weatherapp.data.repository.WeatherRepository +import com.sneha.weatherapp.ui.base.BaseViewModel +import com.sneha.weatherapp.utils.common.Resource +import com.sneha.weatherapp.utils.common.Status +import com.sneha.weatherapp.utils.network.NetworkHelper +import com.sneha.weatherapp.utils.rx.SchedulerProvider +import io.reactivex.disposables.CompositeDisposable + + +class WeatherViewModel( + schedulerProvider: SchedulerProvider, + compositeDisposable: CompositeDisposable, + networkHelper: NetworkHelper, + private val weatherRepository: WeatherRepository +) : BaseViewModel(schedulerProvider, compositeDisposable, networkHelper) { + + private val weatherLiveData: MutableLiveData> = MutableLiveData() + + fun getWeatherData(): LiveData = Transformations.map(weatherLiveData) { + it.data + } + + fun isWeatherFetching(): LiveData = + Transformations.map(weatherLiveData) { it.status == Status.LOADING } + + override fun onCreate() { + if (weatherLiveData.value == null && checkInternetConnectionWithMessage()) { + weatherLiveData.postValue(Resource.loading()) + compositeDisposable.add( + weatherRepository.fetchWeatherData("Stockholm,SE") + .subscribeOn(schedulerProvider.io()) + .subscribe( + { weatherLiveData.postValue(Resource.success(it)) }, + { + handleNetworkError(it) + weatherLiveData.postValue(Resource.error()) + }) + ) + } + } +} \ No newline at end of file diff --git a/app/src/main/java/com/sneha/weatherapp/utils/common/TimeUtils.kt b/app/src/main/java/com/sneha/weatherapp/utils/common/TimeUtils.kt index 4a9f789c..2d0f9697 100644 --- a/app/src/main/java/com/sneha/weatherapp/utils/common/TimeUtils.kt +++ b/app/src/main/java/com/sneha/weatherapp/utils/common/TimeUtils.kt @@ -1,5 +1,6 @@ package com.sneha.weatherapp.utils.common +import java.text.SimpleDateFormat import java.util.* object TimeUtils { @@ -31,4 +32,11 @@ object TimeUtils { "${diff / DAY_MILLIS} days ago" } } + + fun getCurrentTime(): String { + //EEEE, h:mm a + val sdf = SimpleDateFormat("EEEE, HH:mm") + val resultDate = Date(System.currentTimeMillis()) + return sdf.format(resultDate) + } } \ No newline at end of file diff --git a/app/src/main/res/font/font_family.xml b/app/src/main/res/font/font_family.xml new file mode 100644 index 00000000..6da3c75f --- /dev/null +++ b/app/src/main/res/font/font_family.xml @@ -0,0 +1,7 @@ + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/font/proxima_nova_bold.ttf b/app/src/main/res/font/proxima_nova_bold.ttf new file mode 100644 index 0000000000000000000000000000000000000000..22380f5cf61ef9ee9866ee47208737c3f2040388 GIT binary patch literal 88456 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 literal 0 HcmV?d00001 diff --git a/app/src/main/res/font/proxima_nova_light.ttf b/app/src/main/res/font/proxima_nova_light.ttf new file mode 100644 index 0000000000000000000000000000000000000000..4aa51238834a314e3efb57569c6de2e20f7a23c5 GIT binary patch literal 89788 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ⅆ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 - - - - - \ No newline at end of file diff --git a/app/src/main/res/layout/activity_weather.xml b/app/src/main/res/layout/activity_weather.xml new file mode 100644 index 00000000..a76397cb --- /dev/null +++ b/app/src/main/res/layout/activity_weather.xml @@ -0,0 +1,76 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/app/src/main/res/values/styles.xml b/app/src/main/res/values/styles.xml index f482b351..5bacdf94 100644 --- a/app/src/main/res/values/styles.xml +++ b/app/src/main/res/values/styles.xml @@ -3,16 +3,89 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + From 0f48ace7e047ce37434d3eca212f222d9a49c7c5 Mon Sep 17 00:00:00 2001 From: snehak24 Date: Mon, 10 Feb 2020 15:52:11 +0530 Subject: [PATCH 3/6] 1. Complete App UI. 2. Parsing weather and forecast APIs. (currently static request is sent) 3. Pull to refresh implemented. 4. TODO : Implement runtime permission, Get current location. --- app/build.gradle | 8 +- app/src/main/AndroidManifest.xml | 8 +- .../data/local/db/entity/DummyEntity.kt | 2 +- .../weatherapp/data/model/DailyForecast.kt | 37 ++- .../com/sneha/weatherapp/data/model/Dummy.kt | 2 +- .../sneha/weatherapp/data/model/Forecast.kt | 25 +- .../weatherapp/data/model/LocationModel.kt | 7 + .../sneha/weatherapp/data/model/Weather.kt | 23 +- .../weatherapp/data/remote/NetworkService.kt | 12 +- .../data/repository/WeatherRepository.kt | 6 +- .../di/component/ActivityComponent.kt | 3 + .../di/component/ApplicationComponent.kt | 6 + .../di/component/FragmentComponent.kt | 4 +- .../di/component/ViewHolderComponent.kt | 7 +- .../weatherapp/di/module/ActivityModule.kt | 30 ++- .../weatherapp/di/module/ApplicationModule.kt | 12 + .../weatherapp/di/module/FragmentModule.kt | 19 +- .../sneha/weatherapp/ui/base/BaseAdapter.kt | 2 +- .../weatherapp/ui/dummies/DummiesAdapter.kt | 14 - .../weatherapp/ui/dummies/DummiesFragment.kt | 48 ---- .../ui/dummies/DummyItemViewHolder.kt | 37 --- .../ui/dummies/DummyItemViewModel.kt | 35 --- .../weatherapp/ui/splash/SplashActivity.kt | 2 +- .../weatherapp/ui/splash/SplashViewModel.kt | 4 +- .../ui/weather/SelectedDayForecastActivity.kt | 44 ++++ .../weatherapp/ui/weather/WeatherActivity.kt | 98 ++++++- .../weatherapp/ui/weather/WeatherViewModel.kt | 59 ++++- .../weather/adapter/DailyForecastAdapter.kt | 19 ++ .../adapter/DailyForecastItemViewHolder.kt | 58 +++++ .../adapter/DailyForecastItemViewModel.kt | 47 ++++ .../ui/weather/adapter/ForecastAdapter.kt | 16 ++ .../weather/adapter/ForecastItemViewHolder.kt | 41 +++ .../weather/adapter/ForecastItemViewModel.kt | 41 +++ .../ui/weather/fragment/WeatherFragment.kt | 37 +++ .../fragment/WeatherFragmentViewModel.kt} | 5 +- .../utils/ViewModelProviderFactory.kt | 2 +- .../weatherapp/utils/common/TimeUtils.kt | 31 ++- .../utils/display/WeatherToImage.kt | 41 +++ app/src/main/res/drawable/border.xml | 9 + app/src/main/res/drawable/box.xml | 12 + app/src/main/res/drawable/ic_broken_cloud.xml | 4 + app/src/main/res/drawable/ic_cancel.xml | 5 + app/src/main/res/drawable/ic_clear_sky.xml | 5 + .../main/res/drawable/ic_clear_sky_night.xml | 5 + app/src/main/res/drawable/ic_few_clouds.xml | 5 + app/src/main/res/drawable/ic_humidity.xml | 9 + app/src/main/res/drawable/ic_mist.xml | 7 + app/src/main/res/drawable/ic_pressure.xml | 6 + app/src/main/res/drawable/ic_rain.xml | 6 + .../main/res/drawable/ic_scattered_clouds.xml | 4 + app/src/main/res/drawable/ic_shower_rain.xml | 9 + app/src/main/res/drawable/ic_snow.xml | 7 + app/src/main/res/drawable/ic_sunrise.xml | 62 +++++ app/src/main/res/drawable/ic_sunset.xml | 54 ++++ app/src/main/res/drawable/ic_thunderstorm.xml | 5 + app/src/main/res/drawable/ic_wind.xml | 6 + .../main/res/layout/activity_selected_day.xml | 186 +++++++++++++ app/src/main/res/layout/activity_weather.xml | 164 +++++++----- ...gment_dummies.xml => fragment_weather.xml} | 2 +- .../res/layout/item_view_daily_forecast.xml | 57 ++++ app/src/main/res/layout/item_view_dummies.xml | 33 --- .../main/res/layout/item_view_forecast.xml | 32 +++ .../res/layout/layout_weather_details.xml | 245 ++++++++++++++++++ app/src/main/res/layout/progress_bar.xml | 14 + app/src/main/res/values/colors.xml | 23 +- app/src/main/res/values/strings.xml | 15 +- app/src/main/res/values/styles.xml | 79 ++++-- build.gradle | 2 +- 68 files changed, 1612 insertions(+), 352 deletions(-) create mode 100644 app/src/main/java/com/sneha/weatherapp/data/model/LocationModel.kt delete mode 100644 app/src/main/java/com/sneha/weatherapp/ui/dummies/DummiesAdapter.kt delete mode 100644 app/src/main/java/com/sneha/weatherapp/ui/dummies/DummiesFragment.kt delete mode 100644 app/src/main/java/com/sneha/weatherapp/ui/dummies/DummyItemViewHolder.kt delete mode 100644 app/src/main/java/com/sneha/weatherapp/ui/dummies/DummyItemViewModel.kt create mode 100644 app/src/main/java/com/sneha/weatherapp/ui/weather/SelectedDayForecastActivity.kt create mode 100644 app/src/main/java/com/sneha/weatherapp/ui/weather/adapter/DailyForecastAdapter.kt create mode 100644 app/src/main/java/com/sneha/weatherapp/ui/weather/adapter/DailyForecastItemViewHolder.kt create mode 100644 app/src/main/java/com/sneha/weatherapp/ui/weather/adapter/DailyForecastItemViewModel.kt create mode 100644 app/src/main/java/com/sneha/weatherapp/ui/weather/adapter/ForecastAdapter.kt create mode 100644 app/src/main/java/com/sneha/weatherapp/ui/weather/adapter/ForecastItemViewHolder.kt create mode 100644 app/src/main/java/com/sneha/weatherapp/ui/weather/adapter/ForecastItemViewModel.kt create mode 100644 app/src/main/java/com/sneha/weatherapp/ui/weather/fragment/WeatherFragment.kt rename app/src/main/java/com/sneha/weatherapp/ui/{dummies/DummiesViewModel.kt => weather/fragment/WeatherFragmentViewModel.kt} (94%) create mode 100644 app/src/main/java/com/sneha/weatherapp/utils/display/WeatherToImage.kt create mode 100644 app/src/main/res/drawable/border.xml create mode 100644 app/src/main/res/drawable/box.xml create mode 100644 app/src/main/res/drawable/ic_broken_cloud.xml create mode 100644 app/src/main/res/drawable/ic_cancel.xml create mode 100644 app/src/main/res/drawable/ic_clear_sky.xml create mode 100644 app/src/main/res/drawable/ic_clear_sky_night.xml create mode 100644 app/src/main/res/drawable/ic_few_clouds.xml create mode 100644 app/src/main/res/drawable/ic_humidity.xml create mode 100644 app/src/main/res/drawable/ic_mist.xml create mode 100644 app/src/main/res/drawable/ic_pressure.xml create mode 100644 app/src/main/res/drawable/ic_rain.xml create mode 100644 app/src/main/res/drawable/ic_scattered_clouds.xml create mode 100644 app/src/main/res/drawable/ic_shower_rain.xml create mode 100644 app/src/main/res/drawable/ic_snow.xml create mode 100644 app/src/main/res/drawable/ic_sunrise.xml create mode 100644 app/src/main/res/drawable/ic_sunset.xml create mode 100644 app/src/main/res/drawable/ic_thunderstorm.xml create mode 100644 app/src/main/res/drawable/ic_wind.xml create mode 100644 app/src/main/res/layout/activity_selected_day.xml rename app/src/main/res/layout/{fragment_dummies.xml => fragment_weather.xml} (95%) create mode 100644 app/src/main/res/layout/item_view_daily_forecast.xml delete mode 100644 app/src/main/res/layout/item_view_dummies.xml create mode 100644 app/src/main/res/layout/item_view_forecast.xml create mode 100644 app/src/main/res/layout/layout_weather_details.xml create mode 100644 app/src/main/res/layout/progress_bar.xml diff --git a/app/build.gradle b/app/build.gradle index f72bfcbd..58441638 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -24,7 +24,7 @@ android { buildTypes { debug { buildConfigField("String", "BASE_URL", "\"https://worksample-api.herokuapp.com/\"") - buildConfigField("String", "API_KEY", "\"HBNA19QVVAPP\"") + buildConfigField("String", "API_KEY", "\"62fc4256-8f8c-11e5-8994-feff819cdc9f\"") } release { minifyEnabled false @@ -98,6 +98,9 @@ dependencies { // Parser implementation "com.google.code.gson:gson:$gson_version" + //Gps + implementation 'com.google.android.gms:play-services-location:17.0.0' + // Local Unit tests testImplementation "junit:junit:$junit_version" testImplementation "org.mockito:mockito-core:$mockito_version" @@ -112,4 +115,7 @@ dependencies { androidTestImplementation "androidx.test.espresso:espresso-intents:$espresso_version" androidTestImplementation "org.mockito:mockito-core:$mockito_version" kaptAndroidTest "com.google.dagger:dagger-compiler:$dagger_version" + + implementation 'androidx.swiperefreshlayout:swiperefreshlayout:1.0.0' + implementation 'com.google.code.gson:gson:2.8.5' } diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index 5d1460d8..acd89c40 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -5,6 +5,7 @@ + + + android:theme="@style/AppTheme" /> + + \ No newline at end of file diff --git a/app/src/main/java/com/sneha/weatherapp/data/local/db/entity/DummyEntity.kt b/app/src/main/java/com/sneha/weatherapp/data/local/db/entity/DummyEntity.kt index f183e199..108041dd 100644 --- a/app/src/main/java/com/sneha/weatherapp/data/local/db/entity/DummyEntity.kt +++ b/app/src/main/java/com/sneha/weatherapp/data/local/db/entity/DummyEntity.kt @@ -12,7 +12,7 @@ data class DummyEntity( @NotNull val id: Long, - @ColumnInfo(name = "name") + @ColumnInfo(name = "time") @NotNull val name: String ) \ No newline at end of file diff --git a/app/src/main/java/com/sneha/weatherapp/data/model/DailyForecast.kt b/app/src/main/java/com/sneha/weatherapp/data/model/DailyForecast.kt index 9fb4505a..4c7f88fd 100644 --- a/app/src/main/java/com/sneha/weatherapp/data/model/DailyForecast.kt +++ b/app/src/main/java/com/sneha/weatherapp/data/model/DailyForecast.kt @@ -1,33 +1,46 @@ package com.sneha.weatherapp.data.model import com.google.gson.annotations.SerializedName +import java.io.Serializable +/** + * Daily forecast response object + */ data class DailyForecast( + @SerializedName("cod") + val cod: Int, @SerializedName("list") val forecastList: List - -) { - +){ data class ForecastItem( @SerializedName("dt") - val time: Long, + val dt: Long, @SerializedName("weather") val weather: List, @SerializedName("temp") - val temp: Temp - ) + val temp: Temp, - data class Temp( - @SerializedName("day") - val day: Double, + @SerializedName("humidity") + val humidity: Int, - @SerializedName("max") - val max: Double, + @SerializedName("pressure") + val pressure: Int, + @SerializedName("sunrise") + val sunrise: Long, + + @SerializedName("sunset") + val sunset: Long + ): Serializable + + data class Temp( @SerializedName("min") - val min: Double + val min: Double, + + @SerializedName("max") + val max: Double ) } \ No newline at end of file diff --git a/app/src/main/java/com/sneha/weatherapp/data/model/Dummy.kt b/app/src/main/java/com/sneha/weatherapp/data/model/Dummy.kt index a26634ce..c7bbde9e 100644 --- a/app/src/main/java/com/sneha/weatherapp/data/model/Dummy.kt +++ b/app/src/main/java/com/sneha/weatherapp/data/model/Dummy.kt @@ -5,7 +5,7 @@ import com.google.gson.annotations.SerializedName data class Dummy( @Expose - @SerializedName("name") + @SerializedName("time") val name: String, @Expose diff --git a/app/src/main/java/com/sneha/weatherapp/data/model/Forecast.kt b/app/src/main/java/com/sneha/weatherapp/data/model/Forecast.kt index 0c5ff8ea..c812c710 100644 --- a/app/src/main/java/com/sneha/weatherapp/data/model/Forecast.kt +++ b/app/src/main/java/com/sneha/weatherapp/data/model/Forecast.kt @@ -2,14 +2,25 @@ package com.sneha.weatherapp.data.model import com.google.gson.annotations.SerializedName +/** + * Today forecast response object + */ data class Forecast( - @SerializedName("dt") - val time: Long, - @SerializedName("weather") - val weather: List, + @SerializedName("list") + val weatherList: List +) { + data class Item( + @SerializedName("main") + val main: Weather.MainData, - @SerializedName("main") - val main: Weather.MainData + @SerializedName("weather") + val weather: List, -) \ No newline at end of file + @SerializedName("dt") + val dt: Long, + + @SerializedName("dt_txt") + val dt_txt: String + ) +} \ No newline at end of file diff --git a/app/src/main/java/com/sneha/weatherapp/data/model/LocationModel.kt b/app/src/main/java/com/sneha/weatherapp/data/model/LocationModel.kt new file mode 100644 index 00000000..8041b5dc --- /dev/null +++ b/app/src/main/java/com/sneha/weatherapp/data/model/LocationModel.kt @@ -0,0 +1,7 @@ +package com.sneha.weatherapp.data.model + +data class LocationModel( + val longitude: Double, + val latitude: Double, + val cityName: String +) \ No newline at end of file diff --git a/app/src/main/java/com/sneha/weatherapp/data/model/Weather.kt b/app/src/main/java/com/sneha/weatherapp/data/model/Weather.kt index cc36d61b..cc0f8433 100644 --- a/app/src/main/java/com/sneha/weatherapp/data/model/Weather.kt +++ b/app/src/main/java/com/sneha/weatherapp/data/model/Weather.kt @@ -21,11 +21,11 @@ data class Weather( @SerializedName("wind") val wind: Wind, -// @SerializedName("clouds") -// val clouds: Clouds, + @SerializedName("clouds") + val clouds: Clouds, @SerializedName("dt") - val dt: Double, + val dt: Long, @SerializedName("sys") val sys: Sys, @@ -37,7 +37,7 @@ data class Weather( val id: Double, @SerializedName("name") - val name: String, + val cityName: String, @SerializedName("cod") val cod: Int @@ -62,7 +62,7 @@ data class Weather( val description: String, @SerializedName("icon") - val icon: Int + val icon: String ) data class MainData( @@ -79,10 +79,10 @@ data class Weather( val temperatureMax: Double, @SerializedName("pressure") - val pressure: Double, + val pressure: Int, @SerializedName("humidity") - val humidity: Double + val humidity: Int ) data class Wind( @@ -104,9 +104,14 @@ data class Weather( val country: String, @SerializedName("sunrise") - val sunrise: Double, + val sunrise: Long, @SerializedName("sunset") - val sunset: Double + val sunset: Long + ) + + data class Clouds( + @SerializedName("all") + val all: Int ) } \ No newline at end of file diff --git a/app/src/main/java/com/sneha/weatherapp/data/remote/NetworkService.kt b/app/src/main/java/com/sneha/weatherapp/data/remote/NetworkService.kt index ca7effc9..3dec188d 100644 --- a/app/src/main/java/com/sneha/weatherapp/data/remote/NetworkService.kt +++ b/app/src/main/java/com/sneha/weatherapp/data/remote/NetworkService.kt @@ -17,17 +17,17 @@ interface NetworkService { @Query(Networking.HEADER_API_KEY) apiKey: String = Networking.API_KEY // default value set when Networking create is called ): Single - @GET(Endpoints.FORECAST_DAILY) - fun getDailyForecast( + @GET(Endpoints.FORECAST) + fun getTodayForecast( @Query("id") cityId: Long, @Query("cnt") count: Int, @Query(Networking.HEADER_API_KEY) apiKey: String = Networking.API_KEY - ): Single + ): Single - @GET(Endpoints.FORECAST) - fun getTodayForecast( + @GET(Endpoints.FORECAST_DAILY) + fun getDailyForecast( @Query("id") cityId: Long, @Query("cnt") count: Int, @Query(Networking.HEADER_API_KEY) apiKey: String = Networking.API_KEY - ): Single + ): Single } \ No newline at end of file diff --git a/app/src/main/java/com/sneha/weatherapp/data/repository/WeatherRepository.kt b/app/src/main/java/com/sneha/weatherapp/data/repository/WeatherRepository.kt index 9fd5aff3..ede4d2bf 100644 --- a/app/src/main/java/com/sneha/weatherapp/data/repository/WeatherRepository.kt +++ b/app/src/main/java/com/sneha/weatherapp/data/repository/WeatherRepository.kt @@ -16,9 +16,9 @@ class WeatherRepository @Inject constructor( fun fetchWeatherData(cityName: String): Single = networkService.getWeatherData(cityName = cityName) - fun fetchDailyForecast(cityId: Long, count: Int): Single = - networkService.getDailyForecast(cityId, 7) - fun fetchTodayForecast(cityId: Long): Single = networkService.getTodayForecast(cityId, 7) + + fun fetchDailyForecast(cityId: Long): Single = + networkService.getDailyForecast(cityId, 7) } \ No newline at end of file diff --git a/app/src/main/java/com/sneha/weatherapp/di/component/ActivityComponent.kt b/app/src/main/java/com/sneha/weatherapp/di/component/ActivityComponent.kt index e11d8db1..72983608 100644 --- a/app/src/main/java/com/sneha/weatherapp/di/component/ActivityComponent.kt +++ b/app/src/main/java/com/sneha/weatherapp/di/component/ActivityComponent.kt @@ -4,6 +4,7 @@ import com.sneha.weatherapp.di.ActivityScope import com.sneha.weatherapp.di.module.ActivityModule import com.sneha.weatherapp.ui.weather.WeatherActivity import com.sneha.weatherapp.ui.splash.SplashActivity +import com.sneha.weatherapp.ui.weather.SelectedDayForecastActivity import dagger.Component @ActivityScope @@ -16,4 +17,6 @@ interface ActivityComponent { fun inject(activity: SplashActivity) fun inject(activity: WeatherActivity) + + fun inject(activity: SelectedDayForecastActivity) } \ No newline at end of file diff --git a/app/src/main/java/com/sneha/weatherapp/di/component/ApplicationComponent.kt b/app/src/main/java/com/sneha/weatherapp/di/component/ApplicationComponent.kt index 0b24c6f3..beed7b2b 100644 --- a/app/src/main/java/com/sneha/weatherapp/di/component/ApplicationComponent.kt +++ b/app/src/main/java/com/sneha/weatherapp/di/component/ApplicationComponent.kt @@ -3,6 +3,8 @@ package com.sneha.weatherapp.di.component import android.app.Application import android.content.Context import android.content.SharedPreferences +import android.location.Geocoder +import com.google.android.gms.location.FusedLocationProviderClient import com.sneha.weatherapp.WeatherApplication import com.sneha.weatherapp.data.local.db.DatabaseService import com.sneha.weatherapp.data.remote.NetworkService @@ -58,4 +60,8 @@ interface ApplicationComponent { fun getSchedulerProvider(): SchedulerProvider fun getCompositeDisposable(): CompositeDisposable + + fun getFusedLocationProviderClient() : FusedLocationProviderClient + + fun getGeoCoder() : Geocoder } \ No newline at end of file diff --git a/app/src/main/java/com/sneha/weatherapp/di/component/FragmentComponent.kt b/app/src/main/java/com/sneha/weatherapp/di/component/FragmentComponent.kt index 707340b8..9c31a50d 100644 --- a/app/src/main/java/com/sneha/weatherapp/di/component/FragmentComponent.kt +++ b/app/src/main/java/com/sneha/weatherapp/di/component/FragmentComponent.kt @@ -2,7 +2,7 @@ package com.sneha.weatherapp.di.component import com.sneha.weatherapp.di.FragmentScope import com.sneha.weatherapp.di.module.FragmentModule -import com.sneha.weatherapp.ui.dummies.DummiesFragment +import com.sneha.weatherapp.ui.weather.fragment.WeatherFragment import dagger.Component @FragmentScope @@ -12,5 +12,5 @@ import dagger.Component ) interface FragmentComponent { - fun inject(fragment: DummiesFragment) + fun inject(fragment: WeatherFragment) } \ No newline at end of file diff --git a/app/src/main/java/com/sneha/weatherapp/di/component/ViewHolderComponent.kt b/app/src/main/java/com/sneha/weatherapp/di/component/ViewHolderComponent.kt index 1978214b..01710365 100644 --- a/app/src/main/java/com/sneha/weatherapp/di/component/ViewHolderComponent.kt +++ b/app/src/main/java/com/sneha/weatherapp/di/component/ViewHolderComponent.kt @@ -2,7 +2,8 @@ package com.sneha.weatherapp.di.component import com.sneha.weatherapp.di.ViewModelScope import com.sneha.weatherapp.di.module.ViewHolderModule -import com.sneha.weatherapp.ui.dummies.DummyItemViewHolder +import com.sneha.weatherapp.ui.weather.adapter.DailyForecastItemViewHolder +import com.sneha.weatherapp.ui.weather.adapter.ForecastItemViewHolder import dagger.Component @ViewModelScope @@ -12,5 +13,7 @@ import dagger.Component ) interface ViewHolderComponent { - fun inject(viewHolder: DummyItemViewHolder) + fun inject(viewHolder: ForecastItemViewHolder) + + fun inject(viewHolder: DailyForecastItemViewHolder) } \ No newline at end of file diff --git a/app/src/main/java/com/sneha/weatherapp/di/module/ActivityModule.kt b/app/src/main/java/com/sneha/weatherapp/di/module/ActivityModule.kt index 870e3855..16bb2a3c 100644 --- a/app/src/main/java/com/sneha/weatherapp/di/module/ActivityModule.kt +++ b/app/src/main/java/com/sneha/weatherapp/di/module/ActivityModule.kt @@ -7,12 +7,16 @@ import com.sneha.weatherapp.data.repository.UserRepository import com.sneha.weatherapp.ui.base.BaseActivity import com.sneha.weatherapp.ui.weather.WeatherViewModel import com.sneha.weatherapp.ui.splash.SplashViewModel +import com.sneha.weatherapp.ui.weather.adapter.DailyForecastAdapter +import com.sneha.weatherapp.ui.weather.adapter.ForecastAdapter import com.sneha.weatherapp.utils.ViewModelProviderFactory import com.sneha.weatherapp.utils.network.NetworkHelper import com.sneha.weatherapp.utils.rx.SchedulerProvider import dagger.Module import dagger.Provides import io.reactivex.disposables.CompositeDisposable +import javax.inject.Named +import kotlin.collections.ArrayList /** * Kotlin Generics Reference: https://kotlinlang.org/docs/reference/generics.html @@ -22,9 +26,6 @@ import io.reactivex.disposables.CompositeDisposable @Module class ActivityModule(private val activity: BaseActivity<*>) { - @Provides - fun provideLinearLayoutManager(): LinearLayoutManager = LinearLayoutManager(activity) - @Provides fun provideSplashViewModel( schedulerProvider: SchedulerProvider, @@ -45,6 +46,27 @@ class ActivityModule(private val activity: BaseActivity<*>) { weatherRepository: WeatherRepository ): WeatherViewModel = ViewModelProviders.of( activity, ViewModelProviderFactory(WeatherViewModel::class) { - WeatherViewModel(schedulerProvider, compositeDisposable, networkHelper, weatherRepository) + WeatherViewModel( + schedulerProvider, + compositeDisposable, + networkHelper, + weatherRepository) }).get(WeatherViewModel::class.java) + + @Provides + fun provideForecastAdapter() = ForecastAdapter(activity.lifecycle, ArrayList()) + + @Provides + fun providesDailyForecastAdapter() = DailyForecastAdapter(activity.lifecycle, ArrayList()) + + @Provides + @Named("DAILY_FORECAST_LAYOUT_MANAGER") + fun provideDailyForecastLayoutManager(): LinearLayoutManager = + LinearLayoutManager(activity, LinearLayoutManager.HORIZONTAL, false) + + @Provides + @Named("TODAY_FORECAST_LAYOUT_MANAGER") + fun provideTodayForecastLayoutManager(): LinearLayoutManager = + LinearLayoutManager(activity, LinearLayoutManager.HORIZONTAL, false) + } \ No newline at end of file diff --git a/app/src/main/java/com/sneha/weatherapp/di/module/ApplicationModule.kt b/app/src/main/java/com/sneha/weatherapp/di/module/ApplicationModule.kt index fa4922f4..72a81838 100644 --- a/app/src/main/java/com/sneha/weatherapp/di/module/ApplicationModule.kt +++ b/app/src/main/java/com/sneha/weatherapp/di/module/ApplicationModule.kt @@ -3,7 +3,10 @@ package com.sneha.weatherapp.di.module import android.app.Application import android.content.Context import android.content.SharedPreferences +import android.location.Geocoder import androidx.room.Room +import com.google.android.gms.location.FusedLocationProviderClient +import com.google.android.gms.location.LocationServices import com.sneha.weatherapp.BuildConfig import com.sneha.weatherapp.WeatherApplication import com.sneha.weatherapp.data.local.db.DatabaseService @@ -16,6 +19,7 @@ import com.sneha.weatherapp.utils.rx.SchedulerProvider import dagger.Module import dagger.Provides import io.reactivex.disposables.CompositeDisposable +import java.util.* import javax.inject.Singleton @Module @@ -70,4 +74,12 @@ class ApplicationModule(private val application: WeatherApplication) { @Singleton @Provides fun provideNetworkHelper(): NetworkHelper = NetworkHelper(application) + + @Singleton + @Provides + fun provideFusedLocationProviderClient() : FusedLocationProviderClient = LocationServices.getFusedLocationProviderClient(application) + + @Singleton + @Provides + fun provideGeoCoder() : Geocoder = Geocoder(application, Locale.getDefault()) } \ No newline at end of file diff --git a/app/src/main/java/com/sneha/weatherapp/di/module/FragmentModule.kt b/app/src/main/java/com/sneha/weatherapp/di/module/FragmentModule.kt index dadc44ea..062c77aa 100644 --- a/app/src/main/java/com/sneha/weatherapp/di/module/FragmentModule.kt +++ b/app/src/main/java/com/sneha/weatherapp/di/module/FragmentModule.kt @@ -4,8 +4,7 @@ import androidx.lifecycle.ViewModelProviders import androidx.recyclerview.widget.LinearLayoutManager import com.sneha.weatherapp.data.repository.WeatherRepository import com.sneha.weatherapp.ui.base.BaseFragment -import com.sneha.weatherapp.ui.dummies.DummiesAdapter -import com.sneha.weatherapp.ui.dummies.DummiesViewModel +import com.sneha.weatherapp.ui.weather.fragment.WeatherFragmentViewModel import com.sneha.weatherapp.utils.ViewModelProviderFactory import com.sneha.weatherapp.utils.network.NetworkHelper import com.sneha.weatherapp.utils.rx.SchedulerProvider @@ -20,18 +19,18 @@ class FragmentModule(private val fragment: BaseFragment<*>) { fun provideLinearLayoutManager(): LinearLayoutManager = LinearLayoutManager(fragment.context) @Provides - fun provideDummiesViewModel( + fun provideWeatherFragmentViewModel( schedulerProvider: SchedulerProvider, compositeDisposable: CompositeDisposable, networkHelper: NetworkHelper, - dummyRepository: WeatherRepository - ): DummiesViewModel = + weatherRepository: WeatherRepository + ): WeatherFragmentViewModel = ViewModelProviders.of(fragment, - ViewModelProviderFactory(DummiesViewModel::class) { - DummiesViewModel(schedulerProvider, compositeDisposable, networkHelper, dummyRepository) + ViewModelProviderFactory(WeatherFragmentViewModel::class) { + WeatherFragmentViewModel(schedulerProvider, compositeDisposable, networkHelper, weatherRepository) } - ).get(DummiesViewModel::class.java) + ).get(WeatherFragmentViewModel::class.java) - @Provides - fun provideDummiesAdapter() = DummiesAdapter(fragment.lifecycle, ArrayList()) +// @Provides +// fun provideWeatherAdapter() = WeatherAdapter(fragment.lifecycle, ArrayList()) } \ No newline at end of file diff --git a/app/src/main/java/com/sneha/weatherapp/ui/base/BaseAdapter.kt b/app/src/main/java/com/sneha/weatherapp/ui/base/BaseAdapter.kt index 3e43faca..f6a2be6f 100644 --- a/app/src/main/java/com/sneha/weatherapp/ui/base/BaseAdapter.kt +++ b/app/src/main/java/com/sneha/weatherapp/ui/base/BaseAdapter.kt @@ -91,7 +91,7 @@ abstract class BaseAdapter 0) notifyDataSetChanged() - else if (oldCount > 0 && currentCount > oldCount) + else if (oldCount in 1 until currentCount) notifyItemRangeChanged(oldCount - 1, currentCount - oldCount) } } \ No newline at end of file diff --git a/app/src/main/java/com/sneha/weatherapp/ui/dummies/DummiesAdapter.kt b/app/src/main/java/com/sneha/weatherapp/ui/dummies/DummiesAdapter.kt deleted file mode 100644 index 0bdaced2..00000000 --- a/app/src/main/java/com/sneha/weatherapp/ui/dummies/DummiesAdapter.kt +++ /dev/null @@ -1,14 +0,0 @@ -package com.sneha.weatherapp.ui.dummies - -import android.view.ViewGroup -import androidx.lifecycle.Lifecycle -import com.sneha.weatherapp.data.model.Dummy -import com.sneha.weatherapp.ui.base.BaseAdapter - -class DummiesAdapter( - parentLifecycle: Lifecycle, - private val dummies: ArrayList -) : BaseAdapter(parentLifecycle, dummies) { - - override fun onCreateViewHolder(parent: ViewGroup, viewType: Int) = DummyItemViewHolder(parent) -} \ No newline at end of file diff --git a/app/src/main/java/com/sneha/weatherapp/ui/dummies/DummiesFragment.kt b/app/src/main/java/com/sneha/weatherapp/ui/dummies/DummiesFragment.kt deleted file mode 100644 index 8c1e7431..00000000 --- a/app/src/main/java/com/sneha/weatherapp/ui/dummies/DummiesFragment.kt +++ /dev/null @@ -1,48 +0,0 @@ -package com.sneha.weatherapp.ui.dummies - -import android.os.Bundle -import android.view.View -import androidx.recyclerview.widget.LinearLayoutManager -import com.sneha.weatherapp.R -import com.sneha.weatherapp.di.component.FragmentComponent -import com.sneha.weatherapp.ui.base.BaseFragment -import javax.inject.Inject - -class DummiesFragment : BaseFragment() { - - companion object { - - const val TAG = "DummiesFragment" - - fun newInstance(): DummiesFragment { - val args = Bundle() - val fragment = DummiesFragment() - fragment.arguments = args - return fragment - } - } - - @Inject - lateinit var linearLayoutManager: LinearLayoutManager - - @Inject - lateinit var dummiesAdapter: DummiesAdapter - - override fun provideLayoutId(): Int = R.layout.fragment_dummies - - override fun injectDependencies(fragmentComponent: FragmentComponent) { - fragmentComponent.inject(this) - } - - override fun setupObservers() { -// viewModel.getWeatherData().observe(this, Observer { -// Log.e(TAG, "${it?.main?.temperature}") -//// it?.run { dummiesAdapter.appendData(this) } -// }) - } - - override fun setupView(view: View) { -// rv_dummy.layoutManager = linearLayoutManager -// rv_dummy.adapter = dummiesAdapter - } -} \ No newline at end of file diff --git a/app/src/main/java/com/sneha/weatherapp/ui/dummies/DummyItemViewHolder.kt b/app/src/main/java/com/sneha/weatherapp/ui/dummies/DummyItemViewHolder.kt deleted file mode 100644 index 5face1e7..00000000 --- a/app/src/main/java/com/sneha/weatherapp/ui/dummies/DummyItemViewHolder.kt +++ /dev/null @@ -1,37 +0,0 @@ -package com.sneha.weatherapp.ui.dummies - -import android.view.View -import android.view.ViewGroup -import androidx.lifecycle.Observer -import com.bumptech.glide.Glide -import com.sneha.weatherapp.R -import com.sneha.weatherapp.data.model.Dummy -import com.sneha.weatherapp.di.component.ViewHolderComponent -import com.sneha.weatherapp.ui.base.BaseItemViewHolder -import kotlinx.android.synthetic.main.item_view_dummies.view.* - -class DummyItemViewHolder(parent: ViewGroup) : - BaseItemViewHolder(R.layout.item_view_dummies, parent) { - - override fun injectDependencies(viewHolderComponent: ViewHolderComponent) { - viewHolderComponent.inject(this) - } - - override fun setupObservers() { - super.setupObservers() - - viewModel.name.observe(this, Observer { - itemView.tv_head_line_dummy.text = it - }) - - viewModel.url.observe(this, Observer { - Glide.with(itemView.context).load(it).into(itemView.iv_dummy) - }) - } - - override fun setupView(view: View) { - view.setOnClickListener { - viewModel.onItemClick(adapterPosition) - } - } -} \ No newline at end of file diff --git a/app/src/main/java/com/sneha/weatherapp/ui/dummies/DummyItemViewModel.kt b/app/src/main/java/com/sneha/weatherapp/ui/dummies/DummyItemViewModel.kt deleted file mode 100644 index dc536c36..00000000 --- a/app/src/main/java/com/sneha/weatherapp/ui/dummies/DummyItemViewModel.kt +++ /dev/null @@ -1,35 +0,0 @@ -package com.sneha.weatherapp.ui.dummies - -import androidx.lifecycle.LiveData -import androidx.lifecycle.Transformations -import com.sneha.weatherapp.data.model.Dummy -import com.sneha.weatherapp.ui.base.BaseItemViewModel -import com.sneha.weatherapp.utils.common.Resource -import com.sneha.weatherapp.utils.log.Logger -import com.sneha.weatherapp.utils.network.NetworkHelper -import com.sneha.weatherapp.utils.rx.SchedulerProvider -import io.reactivex.disposables.CompositeDisposable -import javax.inject.Inject - -class DummyItemViewModel @Inject constructor( - schedulerProvider: SchedulerProvider, - compositeDisposable: CompositeDisposable, - networkHelper: NetworkHelper -) : BaseItemViewModel(schedulerProvider, compositeDisposable, networkHelper) { - - companion object { - const val TAG = "DummyItemViewModel" - } - - val name: LiveData = Transformations.map(data) { it.name } - val url: LiveData = Transformations.map(data) { it.imageUrl } - - fun onItemClick(position: Int) { - messageString.postValue(Resource.success("onItemClick at $position of ${data.value?.name}")) - Logger.d(TAG, "onItemClick at $position") - } - - override fun onCreate() { - Logger.d(TAG, "onCreate called") - } -} \ No newline at end of file diff --git a/app/src/main/java/com/sneha/weatherapp/ui/splash/SplashActivity.kt b/app/src/main/java/com/sneha/weatherapp/ui/splash/SplashActivity.kt index 78dddca8..b6d2892b 100644 --- a/app/src/main/java/com/sneha/weatherapp/ui/splash/SplashActivity.kt +++ b/app/src/main/java/com/sneha/weatherapp/ui/splash/SplashActivity.kt @@ -28,7 +28,7 @@ class SplashActivity : BaseActivity() { override fun setupObservers() { // Event is used by the view model to tell the activity to launch another activity // view model also provided the Bundle in the event that is needed for the Activity - viewModel.launchDummy.observe(this, Observer>> { + viewModel.launchWeather.observe(this, Observer>> { it.getIfNotHandled()?.run { finish() startActivity(Intent(applicationContext, WeatherActivity::class.java)) diff --git a/app/src/main/java/com/sneha/weatherapp/ui/splash/SplashViewModel.kt b/app/src/main/java/com/sneha/weatherapp/ui/splash/SplashViewModel.kt index d78419d6..61c29a7a 100644 --- a/app/src/main/java/com/sneha/weatherapp/ui/splash/SplashViewModel.kt +++ b/app/src/main/java/com/sneha/weatherapp/ui/splash/SplashViewModel.kt @@ -21,7 +21,7 @@ class SplashViewModel( // Event is used by the view model to tell the activity to launch another Activity // view model also provided the Bundle in the event that is needed for the Activity - val launchDummy: MutableLiveData>> = MutableLiveData() + val launchWeather: MutableLiveData>> = MutableLiveData() init { GlobalScope.launch { @@ -33,6 +33,6 @@ class SplashViewModel( // Empty Bundle passed to Activity in Event that is needed by the other Activity // Here in actual application we will decide which screen to open based on // either the user is logged in or not - launchDummy.postValue(Event(emptyMap())) + launchWeather.postValue(Event(emptyMap())) } } \ No newline at end of file diff --git a/app/src/main/java/com/sneha/weatherapp/ui/weather/SelectedDayForecastActivity.kt b/app/src/main/java/com/sneha/weatherapp/ui/weather/SelectedDayForecastActivity.kt new file mode 100644 index 00000000..a2652f27 --- /dev/null +++ b/app/src/main/java/com/sneha/weatherapp/ui/weather/SelectedDayForecastActivity.kt @@ -0,0 +1,44 @@ +package com.sneha.weatherapp.ui.weather + +import android.os.Bundle +import com.sneha.weatherapp.R +import com.sneha.weatherapp.data.model.DailyForecast +import com.sneha.weatherapp.di.component.ActivityComponent +import com.sneha.weatherapp.ui.base.BaseActivity +import com.sneha.weatherapp.utils.common.TimeUtils +import com.sneha.weatherapp.utils.display.WeatherToImage +import kotlinx.android.synthetic.main.activity_selected_day.* +import kotlinx.android.synthetic.main.activity_selected_day.tv_day +import kotlinx.android.synthetic.main.activity_selected_day.tv_feels_like +import com.google.gson.Gson + + +class SelectedDayForecastActivity : BaseActivity() { + + override fun injectDependencies(activityComponent: ActivityComponent) { + activityComponent.inject(this) + } + + override fun setupView(savedInstanceState: Bundle?) { + + Gson().fromJson( + intent.getStringExtra("forecast_data"), + DailyForecast.ForecastItem::class.java + ).let { + tv_day.text = TimeUtils.getTimeInExpectedFormat(it.dt, "EEEE") + tv_feels_like.text = it.weather[0].description.capitalize() + tv_icon.setImageResource(WeatherToImage.getImageForCode(it.weather[0].icon)) + rv_temp_min_max.text = getString(R.string.temperature).plus(" ") + .plus(it.temp.min.toInt()).plus("℃").plus("/") + .plus(it.temp.max.toInt()).plus("℃") + tv_humidity.text = it.humidity.toString().plus("%") + tv_pressure.text = it.pressure.toString().plus(" hpa") + tv_sunrise.text = TimeUtils.getTimeInExpectedFormat(it.sunrise, "HH:mm") + tv_sunset.text = TimeUtils.getTimeInExpectedFormat(it.sunset, "HH:mm") + } + + cancel.setOnClickListener { finish() } + } + + override fun provideLayoutId(): Int = R.layout.activity_selected_day +} \ No newline at end of file diff --git a/app/src/main/java/com/sneha/weatherapp/ui/weather/WeatherActivity.kt b/app/src/main/java/com/sneha/weatherapp/ui/weather/WeatherActivity.kt index 47f93dae..08a9a06d 100644 --- a/app/src/main/java/com/sneha/weatherapp/ui/weather/WeatherActivity.kt +++ b/app/src/main/java/com/sneha/weatherapp/ui/weather/WeatherActivity.kt @@ -1,16 +1,47 @@ package com.sneha.weatherapp.ui.weather +import android.content.Intent import android.os.Bundle -import android.util.Log +import android.view.View import androidx.lifecycle.Observer +import androidx.recyclerview.widget.LinearLayoutManager import com.sneha.weatherapp.R import com.sneha.weatherapp.di.component.ActivityComponent import com.sneha.weatherapp.ui.base.BaseActivity +import com.sneha.weatherapp.ui.weather.adapter.DailyForecastAdapter +import com.sneha.weatherapp.ui.weather.adapter.ForecastAdapter +import com.sneha.weatherapp.utils.common.TimeUtils +import kotlinx.android.synthetic.main.activity_weather.* +import kotlinx.android.synthetic.main.layout_weather_details.* +import javax.inject.Inject +import com.sneha.weatherapp.data.model.Weather +import com.sneha.weatherapp.ui.weather.adapter.ClickListener +import kotlinx.android.synthetic.main.progress_bar.* +import javax.inject.Named + class WeatherActivity : BaseActivity() { - companion object { - const val TAG = "WeatherActivity" + @Inject + @field:Named("DAILY_FORECAST_LAYOUT_MANAGER") + lateinit var dailyForecastLayoutManager: LinearLayoutManager + + @Inject + @field:Named("TODAY_FORECAST_LAYOUT_MANAGER") + lateinit var todayForecastLayoutManager: LinearLayoutManager + + @Inject + lateinit var forecastAdapter: ForecastAdapter + + @Inject + lateinit var dailyForecastAdapter: DailyForecastAdapter + + private val clickListener = object : ClickListener { + override fun onItemClicked(forecast: String) { + val intent = Intent(this@WeatherActivity, SelectedDayForecastActivity::class.java) + intent.putExtra("forecast_data", forecast) + startActivity(intent) + } } override fun provideLayoutId(): Int = R.layout.activity_weather @@ -20,11 +51,70 @@ class WeatherActivity : BaseActivity() { } override fun setupObservers() { + + viewModel.isWeatherFetching().observe(this, Observer { + if (it) layout_progress.visibility = View.VISIBLE + }) + + //fetching weather data viewModel.getWeatherData().observe(this, Observer { - Log.e(TAG, "${it?.name}") + it?.let { weather -> + setWeatherData(weather) + } + }) + + //get today's forecast + viewModel.getForecastData().observe(this, Observer { + it?.weatherList?.let { + tv_today_forecast_label.visibility = View.VISIBLE + forecastAdapter.appendData(it) + } + }) + + //get this week's forecast + viewModel.getDailyForecastData().observe(this, Observer { + it?.forecastList?.let { forecast -> + tv_week_forecast_label.visibility = View.VISIBLE + dailyForecastAdapter.appendData(forecast) + } }) } override fun setupView(savedInstanceState: Bundle?) { + rv_today_forecast.layoutManager = todayForecastLayoutManager + rv_today_forecast.adapter = forecastAdapter + + dailyForecastAdapter.clickListener = clickListener + rv_daily_forecast.layoutManager = dailyForecastLayoutManager + rv_daily_forecast.adapter = dailyForecastAdapter + + swipe_refresh.setOnRefreshListener { + viewModel.refreshData() + viewModel.getWeatherData().observe(this, Observer { + it?.let { + setWeatherData(it) + swipe_refresh.isRefreshing = false + } + }) + } + } + + private fun setWeatherData(weather: Weather) { + layout_progress.visibility = View.GONE + tv_today_label.visibility = View.VISIBLE + weather_details.visibility = View.VISIBLE + tv_today_weather_details.visibility = View.VISIBLE + tv_updated_at.text = getString(R.string.updated).plus(" ").plus(TimeUtils.getTimeAgo(weather.dt)) + tv_pressure.text = weather.main.pressure.toString().plus(" ").plus("hpa") + tv_humidity.text = weather.main.humidity.toString().plus("%") + tv_wind.text = weather.wind.speed.toString().plus(" ").plus("mps") + tv_rain.text = weather.clouds.all.toString().plus("%") + tv_sunrise.text = TimeUtils.getTimeInExpectedFormat(weather.sys.sunrise, "HH:mm") + tv_sunset.text = TimeUtils.getTimeInExpectedFormat(weather.sys.sunset, "HH:mm") + tv_temperature.text = weather.main.temperature.toInt().toString().plus("\u00B0") + tv_weather.text = weather.weather[0].description.capitalize() + rv_temp_min_max.text = getString(R.string.expected).plus(" ") + .plus(weather.main.temperatureMin.toInt()).plus("℃").plus("/") + .plus(weather.main.temperatureMax.toInt()).plus("℃") } } \ No newline at end of file diff --git a/app/src/main/java/com/sneha/weatherapp/ui/weather/WeatherViewModel.kt b/app/src/main/java/com/sneha/weatherapp/ui/weather/WeatherViewModel.kt index a8c7e4b0..ef48e627 100644 --- a/app/src/main/java/com/sneha/weatherapp/ui/weather/WeatherViewModel.kt +++ b/app/src/main/java/com/sneha/weatherapp/ui/weather/WeatherViewModel.kt @@ -3,6 +3,8 @@ package com.sneha.weatherapp.ui.weather import androidx.lifecycle.LiveData import androidx.lifecycle.MutableLiveData import androidx.lifecycle.Transformations +import com.sneha.weatherapp.data.model.DailyForecast +import com.sneha.weatherapp.data.model.Forecast import com.sneha.weatherapp.data.model.Weather import com.sneha.weatherapp.data.repository.WeatherRepository import com.sneha.weatherapp.ui.base.BaseViewModel @@ -21,27 +23,72 @@ class WeatherViewModel( ) : BaseViewModel(schedulerProvider, compositeDisposable, networkHelper) { private val weatherLiveData: MutableLiveData> = MutableLiveData() + private val forecastLiveData: MutableLiveData> = MutableLiveData() + private val dailyForecastLiveData: MutableLiveData> = MutableLiveData() - fun getWeatherData(): LiveData = Transformations.map(weatherLiveData) { + fun getWeatherData(): LiveData = + Transformations.map(weatherLiveData) { + it.data + } + + fun getForecastData(): LiveData = Transformations.map(forecastLiveData) { it.data } + fun getDailyForecastData(): LiveData = Transformations.map(dailyForecastLiveData) { + it.data + } + fun isWeatherFetching(): LiveData = Transformations.map(weatherLiveData) { it.status == Status.LOADING } override fun onCreate() { - if (weatherLiveData.value == null && checkInternetConnectionWithMessage()) { - weatherLiveData.postValue(Resource.loading()) + callWeatherApi() + + if (forecastLiveData.value == null && checkInternetConnectionWithMessage()) { + forecastLiveData.postValue(Resource.loading()) + compositeDisposable.add( + weatherRepository.fetchTodayForecast(2673730) + .subscribeOn(schedulerProvider.io()) + .subscribe( + { forecastLiveData.postValue(Resource.success(it)) }, + { + handleNetworkError(it) + forecastLiveData.postValue(Resource.error()) + }) + ) + } + + if (dailyForecastLiveData.value == null && checkInternetConnectionWithMessage()) { + dailyForecastLiveData.postValue(Resource.loading()) compositeDisposable.add( - weatherRepository.fetchWeatherData("Stockholm,SE") + weatherRepository.fetchDailyForecast(2673730) .subscribeOn(schedulerProvider.io()) .subscribe( - { weatherLiveData.postValue(Resource.success(it)) }, + { dailyForecastLiveData.postValue(Resource.success(it)) }, { handleNetworkError(it) - weatherLiveData.postValue(Resource.error()) + dailyForecastLiveData.postValue(Resource.error()) }) ) } } + + private fun callWeatherApi() { + compositeDisposable.add( + weatherRepository.fetchWeatherData("Stockholm,SE") + .subscribeOn(schedulerProvider.io()) + .subscribe({ + weatherLiveData.postValue(Resource.success(it)) + }, + { + handleNetworkError(it) + weatherLiveData.postValue(Resource.error()) + }) + ) + } + + fun refreshData() { + callWeatherApi() + } } \ No newline at end of file diff --git a/app/src/main/java/com/sneha/weatherapp/ui/weather/adapter/DailyForecastAdapter.kt b/app/src/main/java/com/sneha/weatherapp/ui/weather/adapter/DailyForecastAdapter.kt new file mode 100644 index 00000000..397471cb --- /dev/null +++ b/app/src/main/java/com/sneha/weatherapp/ui/weather/adapter/DailyForecastAdapter.kt @@ -0,0 +1,19 @@ +package com.sneha.weatherapp.ui.weather.adapter + +import android.view.ViewGroup +import androidx.lifecycle.Lifecycle +import com.sneha.weatherapp.data.model.DailyForecast +import com.sneha.weatherapp.ui.base.BaseAdapter + +interface ClickListener{ + fun onItemClicked(forecast: String) +} + +class DailyForecastAdapter( + parentLifecycle: Lifecycle, + forecasts: ArrayList, + var clickListener: ClickListener? = null +) : BaseAdapter(parentLifecycle, forecasts) { + + override fun onCreateViewHolder(parent: ViewGroup, viewType: Int) = DailyForecastItemViewHolder(parent, clickListener) +} \ No newline at end of file diff --git a/app/src/main/java/com/sneha/weatherapp/ui/weather/adapter/DailyForecastItemViewHolder.kt b/app/src/main/java/com/sneha/weatherapp/ui/weather/adapter/DailyForecastItemViewHolder.kt new file mode 100644 index 00000000..bb77f432 --- /dev/null +++ b/app/src/main/java/com/sneha/weatherapp/ui/weather/adapter/DailyForecastItemViewHolder.kt @@ -0,0 +1,58 @@ +package com.sneha.weatherapp.ui.weather.adapter + +import android.view.View +import android.view.ViewGroup +import androidx.lifecycle.Observer +import com.sneha.weatherapp.R +import com.sneha.weatherapp.data.model.DailyForecast +import com.sneha.weatherapp.di.component.ViewHolderComponent +import com.sneha.weatherapp.ui.base.BaseItemViewHolder +import kotlinx.android.synthetic.main.item_view_daily_forecast.view.* +import kotlinx.android.synthetic.main.item_view_forecast.view.iv_image +import java.util.* +import com.google.gson.Gson + + +class DailyForecastItemViewHolder(parent: ViewGroup, var clickListener: ClickListener?) : + BaseItemViewHolder( + R.layout.item_view_daily_forecast, parent) { + + var forecast: DailyForecast.ForecastItem? = null + + override fun injectDependencies(viewHolderComponent: ViewHolderComponent) { + viewHolderComponent.inject(this) + } + + override fun setupObservers() { + super.setupObservers() + + viewModel.time.observe(this, Observer { + itemView.tv_day.text = it + }) + + viewModel.feelsLike.observe(this, Observer { + itemView.tv_feels_like.text = it + }) + + viewModel.icon.observe(this, Observer { + itemView.iv_image.setImageResource(it) + }) + + viewModel.temp.observe(this, Observer { + itemView.tv_temp.text = it + }) + + viewModel.forecastItem.observe(this, Observer { + forecast = it + }) + } + + override fun setupView(view: View) { + view.setOnClickListener { + clickListener?.onItemClicked(Gson().toJson(forecast)) + } + val androidColors = this.itemView.resources.getIntArray(R.array.cardColors) + val randomAndroidColor = androidColors[Random().nextInt(androidColors.size)] + itemView.card_view.setBackgroundColor(randomAndroidColor) + } +} \ No newline at end of file diff --git a/app/src/main/java/com/sneha/weatherapp/ui/weather/adapter/DailyForecastItemViewModel.kt b/app/src/main/java/com/sneha/weatherapp/ui/weather/adapter/DailyForecastItemViewModel.kt new file mode 100644 index 00000000..3f219b89 --- /dev/null +++ b/app/src/main/java/com/sneha/weatherapp/ui/weather/adapter/DailyForecastItemViewModel.kt @@ -0,0 +1,47 @@ +package com.sneha.weatherapp.ui.weather.adapter + +import androidx.lifecycle.LiveData +import androidx.lifecycle.Transformations +import com.sneha.weatherapp.data.model.DailyForecast +import com.sneha.weatherapp.ui.base.BaseItemViewModel +import com.sneha.weatherapp.utils.common.Resource +import com.sneha.weatherapp.utils.common.TimeUtils +import com.sneha.weatherapp.utils.display.WeatherToImage +import com.sneha.weatherapp.utils.log.Logger +import com.sneha.weatherapp.utils.network.NetworkHelper +import com.sneha.weatherapp.utils.rx.SchedulerProvider +import io.reactivex.disposables.CompositeDisposable +import javax.inject.Inject + +class DailyForecastItemViewModel @Inject constructor( + schedulerProvider: SchedulerProvider, + compositeDisposable: CompositeDisposable, + networkHelper: NetworkHelper +) : BaseItemViewModel( + schedulerProvider, + compositeDisposable, + networkHelper +) { + + companion object { + const val TAG = "DailyForecastItemViewModel" + } + + val forecastItem: LiveData = Transformations.map(data) {it} + val time: LiveData = + Transformations.map(data) { TimeUtils.getTimeInExpectedFormat(it.dt, "EEE") } + val feelsLike: LiveData = Transformations.map(data) { it.weather[0].description } + val icon: LiveData = Transformations.map(data) { WeatherToImage.getImageForCode(it.weather[0].icon) } + val temp: LiveData = Transformations.map(data) { + "${it.temp.min.toInt()}℃ / ${it.temp.max.toInt()}℃" + } + + fun onItemClick(position: Int) { +// messageString.postValue(Resource.success("onItemClick at $position of ${data.value?.temp?.max?.toInt()}")) +// Logger.d(TAG, "onItemClick at $position") + } + + override fun onCreate() { + Logger.d(TAG, "onCreate called") + } +} \ No newline at end of file diff --git a/app/src/main/java/com/sneha/weatherapp/ui/weather/adapter/ForecastAdapter.kt b/app/src/main/java/com/sneha/weatherapp/ui/weather/adapter/ForecastAdapter.kt new file mode 100644 index 00000000..b163d424 --- /dev/null +++ b/app/src/main/java/com/sneha/weatherapp/ui/weather/adapter/ForecastAdapter.kt @@ -0,0 +1,16 @@ +package com.sneha.weatherapp.ui.weather.adapter + +import android.view.ViewGroup +import androidx.lifecycle.Lifecycle +import com.sneha.weatherapp.data.model.Forecast +import com.sneha.weatherapp.ui.base.BaseAdapter + +class ForecastAdapter( + parentLifecycle: Lifecycle, + private val forecasts: ArrayList +) : BaseAdapter(parentLifecycle, forecasts) { + + override fun onCreateViewHolder(parent: ViewGroup, viewType: Int) = ForecastItemViewHolder(parent) + + override fun getItemCount(): Int = if(forecasts.size > 10) 10 else forecasts.size +} \ No newline at end of file diff --git a/app/src/main/java/com/sneha/weatherapp/ui/weather/adapter/ForecastItemViewHolder.kt b/app/src/main/java/com/sneha/weatherapp/ui/weather/adapter/ForecastItemViewHolder.kt new file mode 100644 index 00000000..c6963d46 --- /dev/null +++ b/app/src/main/java/com/sneha/weatherapp/ui/weather/adapter/ForecastItemViewHolder.kt @@ -0,0 +1,41 @@ +package com.sneha.weatherapp.ui.weather.adapter + +import android.view.View +import android.view.ViewGroup +import androidx.lifecycle.Observer +import com.sneha.weatherapp.R +import com.sneha.weatherapp.data.model.Forecast +import com.sneha.weatherapp.di.component.ViewHolderComponent +import com.sneha.weatherapp.ui.base.BaseItemViewHolder +import com.sneha.weatherapp.utils.display.WeatherToImage +import kotlinx.android.synthetic.main.item_view_forecast.view.* + +class ForecastItemViewHolder(parent: ViewGroup) : + BaseItemViewHolder(R.layout.item_view_forecast, parent) { + + override fun injectDependencies(viewHolderComponent: ViewHolderComponent) { + viewHolderComponent.inject(this) + } + + override fun setupObservers() { + super.setupObservers() + + viewModel.time.observe(this, Observer { + itemView.tv_time.text = it + }) + + viewModel.feelsLike.observe(this, Observer { + itemView.tv_feels_like.text = it + }) + + viewModel.icon.observe(this, Observer { + itemView.iv_image.setImageResource(WeatherToImage.getImageForCode(it)) + }) + } + + override fun setupView(view: View) { + view.setOnClickListener { + viewModel.onItemClick(adapterPosition) + } + } +} \ No newline at end of file diff --git a/app/src/main/java/com/sneha/weatherapp/ui/weather/adapter/ForecastItemViewModel.kt b/app/src/main/java/com/sneha/weatherapp/ui/weather/adapter/ForecastItemViewModel.kt new file mode 100644 index 00000000..7395908f --- /dev/null +++ b/app/src/main/java/com/sneha/weatherapp/ui/weather/adapter/ForecastItemViewModel.kt @@ -0,0 +1,41 @@ +package com.sneha.weatherapp.ui.weather.adapter + +import androidx.lifecycle.LiveData +import androidx.lifecycle.Transformations +import com.sneha.weatherapp.data.model.Forecast +import com.sneha.weatherapp.ui.base.BaseItemViewModel +import com.sneha.weatherapp.utils.common.TimeUtils +import com.sneha.weatherapp.utils.log.Logger +import com.sneha.weatherapp.utils.network.NetworkHelper +import com.sneha.weatherapp.utils.rx.SchedulerProvider +import io.reactivex.disposables.CompositeDisposable +import javax.inject.Inject + +class ForecastItemViewModel @Inject constructor( + schedulerProvider: SchedulerProvider, + compositeDisposable: CompositeDisposable, + networkHelper: NetworkHelper +) : BaseItemViewModel( + schedulerProvider, + compositeDisposable, + networkHelper +) { + + companion object { + const val TAG = "ForecastItemViewModel" + } + + val time: LiveData = + Transformations.map(data) { TimeUtils.changeDateToHourFormat(it.dt_txt) } + val feelsLike: LiveData = Transformations.map(data) { it.weather[0].description } + val icon: LiveData = Transformations.map(data) { it.weather[0].icon } + + fun onItemClick(position: Int) { +// messageString.postValue(Resource.success("onItemClick at $position of ${data.value?.time}")) +// Logger.d(TAG, "onItemClick at $position") + } + + override fun onCreate() { + Logger.d(TAG, "onCreate called") + } +} \ No newline at end of file diff --git a/app/src/main/java/com/sneha/weatherapp/ui/weather/fragment/WeatherFragment.kt b/app/src/main/java/com/sneha/weatherapp/ui/weather/fragment/WeatherFragment.kt new file mode 100644 index 00000000..faf983d1 --- /dev/null +++ b/app/src/main/java/com/sneha/weatherapp/ui/weather/fragment/WeatherFragment.kt @@ -0,0 +1,37 @@ +package com.sneha.weatherapp.ui.weather.fragment + +import android.os.Bundle +import android.view.View +import androidx.lifecycle.Observer +import com.sneha.weatherapp.R +import com.sneha.weatherapp.di.component.FragmentComponent +import com.sneha.weatherapp.ui.base.BaseFragment + +class WeatherFragment : BaseFragment() { + + companion object { + + const val TAG = "WeatherFragment" + + fun newInstance(): WeatherFragment { + val args = Bundle() + val fragment = WeatherFragment() + fragment.arguments = args + return fragment + } + } + + override fun provideLayoutId(): Int = R.layout.fragment_weather + + override fun injectDependencies(fragmentComponent: FragmentComponent) { + fragmentComponent.inject(this) + } + + override fun setupObservers() { + viewModel.getWeatherData().observe(this, Observer { + }) + } + + override fun setupView(view: View) { + } +} \ No newline at end of file diff --git a/app/src/main/java/com/sneha/weatherapp/ui/dummies/DummiesViewModel.kt b/app/src/main/java/com/sneha/weatherapp/ui/weather/fragment/WeatherFragmentViewModel.kt similarity index 94% rename from app/src/main/java/com/sneha/weatherapp/ui/dummies/DummiesViewModel.kt rename to app/src/main/java/com/sneha/weatherapp/ui/weather/fragment/WeatherFragmentViewModel.kt index d168280a..788fba18 100644 --- a/app/src/main/java/com/sneha/weatherapp/ui/dummies/DummiesViewModel.kt +++ b/app/src/main/java/com/sneha/weatherapp/ui/weather/fragment/WeatherFragmentViewModel.kt @@ -1,9 +1,8 @@ -package com.sneha.weatherapp.ui.dummies +package com.sneha.weatherapp.ui.weather.fragment import androidx.lifecycle.LiveData import androidx.lifecycle.MutableLiveData import androidx.lifecycle.Transformations -import com.sneha.weatherapp.data.model.Dummy import com.sneha.weatherapp.data.model.Weather import com.sneha.weatherapp.data.repository.WeatherRepository import com.sneha.weatherapp.ui.base.BaseViewModel @@ -14,7 +13,7 @@ import com.sneha.weatherapp.utils.rx.SchedulerProvider import io.reactivex.disposables.CompositeDisposable -class DummiesViewModel( +class WeatherFragmentViewModel( schedulerProvider: SchedulerProvider, compositeDisposable: CompositeDisposable, networkHelper: NetworkHelper, diff --git a/app/src/main/java/com/sneha/weatherapp/utils/ViewModelProviderFactory.kt b/app/src/main/java/com/sneha/weatherapp/utils/ViewModelProviderFactory.kt index 3138e0a3..7fd84883 100644 --- a/app/src/main/java/com/sneha/weatherapp/utils/ViewModelProviderFactory.kt +++ b/app/src/main/java/com/sneha/weatherapp/utils/ViewModelProviderFactory.kt @@ -27,6 +27,6 @@ class ViewModelProviderFactory( @Throws(IllegalArgumentException::class) override fun create(modelClass: Class): T { if (modelClass.isAssignableFrom(kClass.java)) return creator() as T - throw IllegalArgumentException("Unknown class name") + throw IllegalArgumentException("Unknown class time") } } diff --git a/app/src/main/java/com/sneha/weatherapp/utils/common/TimeUtils.kt b/app/src/main/java/com/sneha/weatherapp/utils/common/TimeUtils.kt index 2d0f9697..54eed78a 100644 --- a/app/src/main/java/com/sneha/weatherapp/utils/common/TimeUtils.kt +++ b/app/src/main/java/com/sneha/weatherapp/utils/common/TimeUtils.kt @@ -1,5 +1,6 @@ package com.sneha.weatherapp.utils.common +import android.text.format.DateUtils import java.text.SimpleDateFormat import java.util.* @@ -10,8 +11,10 @@ object TimeUtils { private const val HOUR_MILLIS = 60 * MINUTE_MILLIS private const val DAY_MILLIS = 24 * HOUR_MILLIS - fun getTimeAgo(date: Date): String { - val time = date.time + fun getTimeAgo(time: Long): String { + + val time = Date(time * 1000L).time + val now = System.currentTimeMillis() if (time > now || time <= 0) return "" @@ -33,10 +36,24 @@ object TimeUtils { } } - fun getCurrentTime(): String { - //EEEE, h:mm a - val sdf = SimpleDateFormat("EEEE, HH:mm") - val resultDate = Date(System.currentTimeMillis()) - return sdf.format(resultDate) + fun getTimeInExpectedFormat(dt: Long, format: String): String { + val date = Date(dt * 1000L) + val sdf: SimpleDateFormat = when (format) { + "HH:mm" -> SimpleDateFormat("hh:mm", Locale.US) + "EEE" -> SimpleDateFormat("EEE", Locale.US) + "EEEE" -> SimpleDateFormat("EEEE", Locale.US) + else -> SimpleDateFormat("yyyy-MM-dd", Locale.US) + } + sdf.timeZone = TimeZone.getTimeZone("UTC") + return sdf.format(date) + } + + fun changeDateToHourFormat(date: String): String { + val sdf = SimpleDateFormat("yyyy-MM-dd HH:mm:ss", Locale.US) + val expectedDate = sdf.parse(date) + + val formatter = SimpleDateFormat("HH:mm", Locale.US) + val format = formatter.format(expectedDate) + return format } } \ No newline at end of file diff --git a/app/src/main/java/com/sneha/weatherapp/utils/display/WeatherToImage.kt b/app/src/main/java/com/sneha/weatherapp/utils/display/WeatherToImage.kt new file mode 100644 index 00000000..e2579a1a --- /dev/null +++ b/app/src/main/java/com/sneha/weatherapp/utils/display/WeatherToImage.kt @@ -0,0 +1,41 @@ +package com.sneha.weatherapp.utils.display + +import com.sneha.weatherapp.R + +object WeatherToImage { + fun getImageForCode(code: String): Int = when (code) { + "01d" -> { + R.drawable.ic_clear_sky + } + "01n" -> { + R.drawable.ic_clear_sky_night + } + "02d", "02n" -> { + R.drawable.ic_few_clouds + } + "03d", "03n" -> { + R.drawable.ic_broken_cloud + } + "04d", "04n" -> { + R.drawable.ic_broken_cloud + } + "09d", "09n" -> { + R.drawable.ic_shower_rain + } + "10d", "10n" -> { + R.drawable.ic_rain + } + "11d", "11n" -> { + R.drawable.ic_thunderstorm + } + "13d", "13n" -> { + R.drawable.ic_snow + } + "50d", "50n" -> { + R.drawable.ic_mist + } + else -> { + R.drawable.ic_broken_cloud + } + } +} \ No newline at end of file diff --git a/app/src/main/res/drawable/border.xml b/app/src/main/res/drawable/border.xml new file mode 100644 index 00000000..fbb881d7 --- /dev/null +++ b/app/src/main/res/drawable/border.xml @@ -0,0 +1,9 @@ + + + + + \ No newline at end of file diff --git a/app/src/main/res/drawable/box.xml b/app/src/main/res/drawable/box.xml new file mode 100644 index 00000000..cd582cb8 --- /dev/null +++ b/app/src/main/res/drawable/box.xml @@ -0,0 +1,12 @@ + + + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/drawable/ic_broken_cloud.xml b/app/src/main/res/drawable/ic_broken_cloud.xml new file mode 100644 index 00000000..c9454ea4 --- /dev/null +++ b/app/src/main/res/drawable/ic_broken_cloud.xml @@ -0,0 +1,4 @@ + + + diff --git a/app/src/main/res/drawable/ic_cancel.xml b/app/src/main/res/drawable/ic_cancel.xml new file mode 100644 index 00000000..ef839937 --- /dev/null +++ b/app/src/main/res/drawable/ic_cancel.xml @@ -0,0 +1,5 @@ + + + + diff --git a/app/src/main/res/drawable/ic_clear_sky.xml b/app/src/main/res/drawable/ic_clear_sky.xml new file mode 100644 index 00000000..37a2afcd --- /dev/null +++ b/app/src/main/res/drawable/ic_clear_sky.xml @@ -0,0 +1,5 @@ + + + + diff --git a/app/src/main/res/drawable/ic_clear_sky_night.xml b/app/src/main/res/drawable/ic_clear_sky_night.xml new file mode 100644 index 00000000..99c95921 --- /dev/null +++ b/app/src/main/res/drawable/ic_clear_sky_night.xml @@ -0,0 +1,5 @@ + + + + diff --git a/app/src/main/res/drawable/ic_few_clouds.xml b/app/src/main/res/drawable/ic_few_clouds.xml new file mode 100644 index 00000000..d87fb31e --- /dev/null +++ b/app/src/main/res/drawable/ic_few_clouds.xml @@ -0,0 +1,5 @@ + + + + diff --git a/app/src/main/res/drawable/ic_humidity.xml b/app/src/main/res/drawable/ic_humidity.xml new file mode 100644 index 00000000..46eb5e26 --- /dev/null +++ b/app/src/main/res/drawable/ic_humidity.xml @@ -0,0 +1,9 @@ + + + + + diff --git a/app/src/main/res/drawable/ic_mist.xml b/app/src/main/res/drawable/ic_mist.xml new file mode 100644 index 00000000..33fed52d --- /dev/null +++ b/app/src/main/res/drawable/ic_mist.xml @@ -0,0 +1,7 @@ + + + + + + diff --git a/app/src/main/res/drawable/ic_pressure.xml b/app/src/main/res/drawable/ic_pressure.xml new file mode 100644 index 00000000..3818bd94 --- /dev/null +++ b/app/src/main/res/drawable/ic_pressure.xml @@ -0,0 +1,6 @@ + + + diff --git a/app/src/main/res/drawable/ic_rain.xml b/app/src/main/res/drawable/ic_rain.xml new file mode 100644 index 00000000..e70b422e --- /dev/null +++ b/app/src/main/res/drawable/ic_rain.xml @@ -0,0 +1,6 @@ + + + + + diff --git a/app/src/main/res/drawable/ic_scattered_clouds.xml b/app/src/main/res/drawable/ic_scattered_clouds.xml new file mode 100644 index 00000000..c9454ea4 --- /dev/null +++ b/app/src/main/res/drawable/ic_scattered_clouds.xml @@ -0,0 +1,4 @@ + + + diff --git a/app/src/main/res/drawable/ic_shower_rain.xml b/app/src/main/res/drawable/ic_shower_rain.xml new file mode 100644 index 00000000..f111478e --- /dev/null +++ b/app/src/main/res/drawable/ic_shower_rain.xml @@ -0,0 +1,9 @@ + + + + + + + + diff --git a/app/src/main/res/drawable/ic_snow.xml b/app/src/main/res/drawable/ic_snow.xml new file mode 100644 index 00000000..86554d49 --- /dev/null +++ b/app/src/main/res/drawable/ic_snow.xml @@ -0,0 +1,7 @@ + + + + + + diff --git a/app/src/main/res/drawable/ic_sunrise.xml b/app/src/main/res/drawable/ic_sunrise.xml new file mode 100644 index 00000000..cfa0fd29 --- /dev/null +++ b/app/src/main/res/drawable/ic_sunrise.xml @@ -0,0 +1,62 @@ + + + + + + + + + + diff --git a/app/src/main/res/drawable/ic_sunset.xml b/app/src/main/res/drawable/ic_sunset.xml new file mode 100644 index 00000000..3bc20543 --- /dev/null +++ b/app/src/main/res/drawable/ic_sunset.xml @@ -0,0 +1,54 @@ + + + + + + + + + + diff --git a/app/src/main/res/drawable/ic_thunderstorm.xml b/app/src/main/res/drawable/ic_thunderstorm.xml new file mode 100644 index 00000000..4ee43200 --- /dev/null +++ b/app/src/main/res/drawable/ic_thunderstorm.xml @@ -0,0 +1,5 @@ + + + + diff --git a/app/src/main/res/drawable/ic_wind.xml b/app/src/main/res/drawable/ic_wind.xml new file mode 100644 index 00000000..0d6e29c0 --- /dev/null +++ b/app/src/main/res/drawable/ic_wind.xml @@ -0,0 +1,6 @@ + + + diff --git a/app/src/main/res/layout/activity_selected_day.xml b/app/src/main/res/layout/activity_selected_day.xml new file mode 100644 index 00000000..351f387b --- /dev/null +++ b/app/src/main/res/layout/activity_selected_day.xml @@ -0,0 +1,186 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/layout/activity_weather.xml b/app/src/main/res/layout/activity_weather.xml index a76397cb..839dd6eb 100644 --- a/app/src/main/res/layout/activity_weather.xml +++ b/app/src/main/res/layout/activity_weather.xml @@ -1,76 +1,116 @@ - - + android:fitsSystemWindows="true" + android:orientation="vertical" + tools:context=".ui.weather.WeatherActivity"> - + android:layout_height="match_parent"> - + android:layout_height="match_parent" + android:background="@color/white" + app:layout_behavior="@string/appbar_scrolling_view_behavior"> - + - + - + - + - - - - - - + - + - - + + + + + + + + + + + - + + + + + \ No newline at end of file diff --git a/app/src/main/res/layout/fragment_dummies.xml b/app/src/main/res/layout/fragment_weather.xml similarity index 95% rename from app/src/main/res/layout/fragment_dummies.xml rename to app/src/main/res/layout/fragment_weather.xml index 6cf71d20..6be97ca2 100644 --- a/app/src/main/res/layout/fragment_dummies.xml +++ b/app/src/main/res/layout/fragment_weather.xml @@ -7,7 +7,7 @@ diff --git a/app/src/main/res/layout/item_view_daily_forecast.xml b/app/src/main/res/layout/item_view_daily_forecast.xml new file mode 100644 index 00000000..05a13535 --- /dev/null +++ b/app/src/main/res/layout/item_view_daily_forecast.xml @@ -0,0 +1,57 @@ + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/layout/item_view_dummies.xml b/app/src/main/res/layout/item_view_dummies.xml deleted file mode 100644 index 3e0efae1..00000000 --- a/app/src/main/res/layout/item_view_dummies.xml +++ /dev/null @@ -1,33 +0,0 @@ - - - - - - - - - - - \ No newline at end of file diff --git a/app/src/main/res/layout/item_view_forecast.xml b/app/src/main/res/layout/item_view_forecast.xml new file mode 100644 index 00000000..72a42d73 --- /dev/null +++ b/app/src/main/res/layout/item_view_forecast.xml @@ -0,0 +1,32 @@ + + + + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/layout/layout_weather_details.xml b/app/src/main/res/layout/layout_weather_details.xml new file mode 100644 index 00000000..1768fc47 --- /dev/null +++ b/app/src/main/res/layout/layout_weather_details.xml @@ -0,0 +1,245 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/layout/progress_bar.xml b/app/src/main/res/layout/progress_bar.xml new file mode 100644 index 00000000..2383a7e3 --- /dev/null +++ b/app/src/main/res/layout/progress_bar.xml @@ -0,0 +1,14 @@ + + + + + \ No newline at end of file diff --git a/app/src/main/res/values/colors.xml b/app/src/main/res/values/colors.xml index 0fe4ea09..12374adc 100644 --- a/app/src/main/res/values/colors.xml +++ b/app/src/main/res/values/colors.xml @@ -1,14 +1,19 @@ - #008577 - #00574B - #D81B60 - #FFFFFF #000000 - #C9DFF7 - #26C0FF - #3DD2FF - #F1F1F1 - #2A2A2A + #0093c4 + #4fc3f7 + #81d4fa + #00acc1 + #00acc1 + #616161 + #FFFFFF + + + @color/blueDark + @color/blueMedium + @color/cyanDark + @color/cyanMedium + diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index e7d037c4..71481bb4 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -1,5 +1,5 @@ - WeatherApp + Weather Internet connection lost, please retry again Something wrong happened, please retry again @@ -8,4 +8,17 @@ Not able to connect, please retry again Please log in again + Forecast for 7 days + Forecast today + Clouds + Sunset + Sunrise + Wind speed + Humidity + Pressure + Stockholm, SE + Updated + Expected + Weather details + Temperature diff --git a/app/src/main/res/values/styles.xml b/app/src/main/res/values/styles.xml index 5bacdf94..7d216760 100644 --- a/app/src/main/res/values/styles.xml +++ b/app/src/main/res/values/styles.xml @@ -4,88 +4,113 @@ + + - - - - diff --git a/build.gradle b/build.gradle index cc422b0f..d8b64881 100644 --- a/build.gradle +++ b/build.gradle @@ -29,7 +29,7 @@ allprojects { ext{ // Sdk and Tools - min_sdk_version = 15 + min_sdk_version = 21 target_sdk_version = 29 compile_sdk_version = 29 From 8b61225208ec65a1bd50a3bc6099a3433467edc8 Mon Sep 17 00:00:00 2001 From: snehak24 Date: Mon, 10 Feb 2020 16:24:29 +0530 Subject: [PATCH 4/6] 1. Complete App UI. 2. Parsing weather and forecast APIs. (currently static request is sent) 3. Pull to refresh implemented. 4. TODO : Implement runtime permission, Get current location. --- app/build.gradle | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/build.gradle b/app/build.gradle index 58441638..331d2d5c 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -24,7 +24,7 @@ android { buildTypes { debug { buildConfigField("String", "BASE_URL", "\"https://worksample-api.herokuapp.com/\"") - buildConfigField("String", "API_KEY", "\"62fc4256-8f8c-11e5-8994-feff819cdc9f\"") + buildConfigField("String", "API_KEY", "\"HBNA19QVVAPP\"") } release { minifyEnabled false From 713be31c528f31e7ee423c015df065c8d05f2415 Mon Sep 17 00:00:00 2001 From: snehak24 Date: Tue, 11 Feb 2020 15:45:19 +0530 Subject: [PATCH 5/6] 1. Runtime permissions for location. 2. LiveData for location and GPS state changes. 3. Intermediate screen (LocationActivity) to prompt the user to enable device GPS and accept location permission. 4. UI changes. --- app/build.gradle | 8 +- app/src/main/AndroidManifest.xml | 12 +- .../data/local/prefs/UserPreferences.kt | 14 ++ .../weatherapp/data/model/DailyForecast.kt | 46 ------ .../com/sneha/weatherapp/data/model/Dummy.kt | 14 -- .../sneha/weatherapp/data/model/Forecast.kt | 35 ++-- .../weatherapp/data/model/ForecastItem.kt | 17 ++ .../weatherapp/data/model/LocationData.kt | 6 + .../weatherapp/data/model/LocationModel.kt | 7 - .../com/sneha/weatherapp/data/model/Temp.kt | 12 ++ .../weatherapp/data/remote/NetworkService.kt | 8 +- .../remote/response/DailyForecastResponse.kt | 15 ++ .../data/remote/response/DummyResponse.kt | 19 --- .../data/remote/response/GeneralResponse.kt | 14 -- .../remote/response/TodayForecastResponse.kt | 13 ++ .../data/repository/UserRepository.kt | 17 +- .../data/repository/WeatherRepository.kt | 8 +- .../di/component/ActivityComponent.kt | 1 + .../di/component/ApplicationComponent.kt | 5 +- .../weatherapp/di/module/ApplicationModule.kt | 12 -- .../ui/location/GpsStatusLiveData.kt | 65 ++++++++ .../ui/location/LocationActivity.kt | 150 ++++++++++++++++++ .../ui/location/LocationLiveData.kt | 65 ++++++++ .../ui/location/LocationViewModel.kt | 21 +++ .../weatherapp/ui/splash/SplashViewModel.kt | 2 +- .../ui/weather/SelectedDayForecastActivity.kt | 4 +- .../weatherapp/ui/weather/WeatherActivity.kt | 9 +- .../weatherapp/ui/weather/WeatherViewModel.kt | 12 +- .../weather/adapter/DailyForecastAdapter.kt | 6 +- .../adapter/DailyForecastItemViewHolder.kt | 16 +- .../adapter/DailyForecastItemViewModel.kt | 7 +- .../ui/weather/adapter/ForecastAdapter.kt | 6 +- .../weather/adapter/ForecastItemViewHolder.kt | 4 +- .../weather/adapter/ForecastItemViewModel.kt | 4 +- .../weatherapp/utils/common/GlideHelper.kt | 13 -- .../weatherapp/utils/common/LiveDataUtils.kt | 46 ++++++ app/src/main/res/drawable/box.xml | 12 -- app/src/main/res/drawable/chip.xml | 18 +++ app/src/main/res/drawable/ic_location.xml | 5 + app/src/main/res/layout/activity_location.xml | 38 +++++ .../main/res/layout/activity_selected_day.xml | 105 ++++++------ app/src/main/res/layout/activity_weather.xml | 2 +- .../mipmap-anydpi-v26/ic_launcher_round.xml | 5 - app/src/main/res/mipmap-hdpi/ic_launcher.png | Bin 2963 -> 3179 bytes .../res/mipmap-hdpi/ic_launcher_round.png | Bin 4905 -> 0 bytes app/src/main/res/mipmap-mdpi/ic_launcher.png | Bin 2060 -> 1793 bytes .../res/mipmap-mdpi/ic_launcher_round.png | Bin 2783 -> 0 bytes app/src/main/res/mipmap-xhdpi/ic_launcher.png | Bin 4490 -> 4229 bytes .../res/mipmap-xhdpi/ic_launcher_round.png | Bin 6895 -> 0 bytes .../main/res/mipmap-xxhdpi/ic_launcher.png | Bin 6387 -> 8514 bytes .../res/mipmap-xxhdpi/ic_launcher_round.png | Bin 10413 -> 0 bytes .../main/res/mipmap-xxxhdpi/ic_launcher.png | Bin 9128 -> 12173 bytes .../res/mipmap-xxxhdpi/ic_launcher_round.png | Bin 15132 -> 0 bytes app/src/main/res/values/colors.xml | 1 + app/src/main/res/values/strings.xml | 16 +- build.gradle | 14 +- 56 files changed, 650 insertions(+), 279 deletions(-) delete mode 100644 app/src/main/java/com/sneha/weatherapp/data/model/DailyForecast.kt delete mode 100644 app/src/main/java/com/sneha/weatherapp/data/model/Dummy.kt create mode 100644 app/src/main/java/com/sneha/weatherapp/data/model/ForecastItem.kt create mode 100644 app/src/main/java/com/sneha/weatherapp/data/model/LocationData.kt delete mode 100644 app/src/main/java/com/sneha/weatherapp/data/model/LocationModel.kt create mode 100644 app/src/main/java/com/sneha/weatherapp/data/model/Temp.kt create mode 100644 app/src/main/java/com/sneha/weatherapp/data/remote/response/DailyForecastResponse.kt delete mode 100644 app/src/main/java/com/sneha/weatherapp/data/remote/response/DummyResponse.kt delete mode 100644 app/src/main/java/com/sneha/weatherapp/data/remote/response/GeneralResponse.kt create mode 100644 app/src/main/java/com/sneha/weatherapp/data/remote/response/TodayForecastResponse.kt create mode 100644 app/src/main/java/com/sneha/weatherapp/ui/location/GpsStatusLiveData.kt create mode 100644 app/src/main/java/com/sneha/weatherapp/ui/location/LocationActivity.kt create mode 100644 app/src/main/java/com/sneha/weatherapp/ui/location/LocationLiveData.kt create mode 100644 app/src/main/java/com/sneha/weatherapp/ui/location/LocationViewModel.kt delete mode 100644 app/src/main/java/com/sneha/weatherapp/utils/common/GlideHelper.kt create mode 100644 app/src/main/java/com/sneha/weatherapp/utils/common/LiveDataUtils.kt delete mode 100644 app/src/main/res/drawable/box.xml create mode 100644 app/src/main/res/drawable/chip.xml create mode 100644 app/src/main/res/drawable/ic_location.xml create mode 100644 app/src/main/res/layout/activity_location.xml delete mode 100644 app/src/main/res/mipmap-anydpi-v26/ic_launcher_round.xml delete mode 100644 app/src/main/res/mipmap-hdpi/ic_launcher_round.png delete mode 100644 app/src/main/res/mipmap-mdpi/ic_launcher_round.png delete mode 100644 app/src/main/res/mipmap-xhdpi/ic_launcher_round.png delete mode 100644 app/src/main/res/mipmap-xxhdpi/ic_launcher_round.png delete mode 100644 app/src/main/res/mipmap-xxxhdpi/ic_launcher_round.png diff --git a/app/build.gradle b/app/build.gradle index 331d2d5c..6f577a37 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -77,10 +77,6 @@ dependencies { kapt "androidx.room:room-compiler:$room_version" implementation "androidx.room:room-rxjava2:$room_version" - // Image - implementation "com.github.bumptech.glide:glide:$glide_version" - kapt "com.github.bumptech.glide:compiler:$glide_version" - // Networking implementation "com.squareup.retrofit2:retrofit:$retrofit_version" implementation "com.squareup.retrofit2:converter-gson:$retrofit_version" @@ -116,6 +112,6 @@ dependencies { androidTestImplementation "org.mockito:mockito-core:$mockito_version" kaptAndroidTest "com.google.dagger:dagger-compiler:$dagger_version" - implementation 'androidx.swiperefreshlayout:swiperefreshlayout:1.0.0' - implementation 'com.google.code.gson:gson:2.8.5' + implementation "androidx.swiperefreshlayout:swiperefreshlayout:$refresh_layout_version" + implementation "com.google.code.gson:gson:$gson_version" } diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index acd89c40..b9396c97 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -4,15 +4,18 @@ - + + + + + android:usesCleartextTraffic="true" + android:label="@string/app_name"> + + \ No newline at end of file diff --git a/app/src/main/java/com/sneha/weatherapp/data/local/prefs/UserPreferences.kt b/app/src/main/java/com/sneha/weatherapp/data/local/prefs/UserPreferences.kt index 80b551c2..991c24c9 100644 --- a/app/src/main/java/com/sneha/weatherapp/data/local/prefs/UserPreferences.kt +++ b/app/src/main/java/com/sneha/weatherapp/data/local/prefs/UserPreferences.kt @@ -12,6 +12,8 @@ class UserPreferences @Inject constructor(private val prefs: SharedPreferences) const val KEY_USER_NAME = "PREF_KEY_USER_NAME" const val KEY_USER_EMAIL = "PREF_KEY_USER_EMAIL" const val KEY_ACCESS_TOKEN = "PREF_KEY_ACCESS_TOKEN" + const val KEY_LATITUDE = "PREF_KEY_LATITUDE" + const val KEY_LONGITUDE = "PREF_KEY_LONGITUDE" } fun getUserId(): String? = @@ -49,4 +51,16 @@ class UserPreferences @Inject constructor(private val prefs: SharedPreferences) fun removeAccessToken() = prefs.edit().remove(KEY_ACCESS_TOKEN).apply() + + fun getLatitude(): String? = + prefs.getString(KEY_LATITUDE, null) + + fun setLatitude(latitude: String) = + prefs.edit().putString(KEY_LATITUDE, latitude).apply() + + fun getLongitude(): String? = + prefs.getString(KEY_LONGITUDE, null) + + fun setLongitude(longitude: String) = + prefs.edit().putString(KEY_LONGITUDE, longitude).apply() } \ No newline at end of file diff --git a/app/src/main/java/com/sneha/weatherapp/data/model/DailyForecast.kt b/app/src/main/java/com/sneha/weatherapp/data/model/DailyForecast.kt deleted file mode 100644 index 4c7f88fd..00000000 --- a/app/src/main/java/com/sneha/weatherapp/data/model/DailyForecast.kt +++ /dev/null @@ -1,46 +0,0 @@ -package com.sneha.weatherapp.data.model - -import com.google.gson.annotations.SerializedName -import java.io.Serializable - -/** - * Daily forecast response object - */ -data class DailyForecast( - @SerializedName("cod") - val cod: Int, - - @SerializedName("list") - val forecastList: List -){ - data class ForecastItem( - @SerializedName("dt") - val dt: Long, - - @SerializedName("weather") - val weather: List, - - @SerializedName("temp") - val temp: Temp, - - @SerializedName("humidity") - val humidity: Int, - - @SerializedName("pressure") - val pressure: Int, - - @SerializedName("sunrise") - val sunrise: Long, - - @SerializedName("sunset") - val sunset: Long - ): Serializable - - data class Temp( - @SerializedName("min") - val min: Double, - - @SerializedName("max") - val max: Double - ) -} \ No newline at end of file diff --git a/app/src/main/java/com/sneha/weatherapp/data/model/Dummy.kt b/app/src/main/java/com/sneha/weatherapp/data/model/Dummy.kt deleted file mode 100644 index c7bbde9e..00000000 --- a/app/src/main/java/com/sneha/weatherapp/data/model/Dummy.kt +++ /dev/null @@ -1,14 +0,0 @@ -package com.sneha.weatherapp.data.model - -import com.google.gson.annotations.Expose -import com.google.gson.annotations.SerializedName - -data class Dummy( - @Expose - @SerializedName("time") - val name: String, - - @Expose - @SerializedName("imageUrl") - val imageUrl: String? -) \ No newline at end of file diff --git a/app/src/main/java/com/sneha/weatherapp/data/model/Forecast.kt b/app/src/main/java/com/sneha/weatherapp/data/model/Forecast.kt index c812c710..b7625249 100644 --- a/app/src/main/java/com/sneha/weatherapp/data/model/Forecast.kt +++ b/app/src/main/java/com/sneha/weatherapp/data/model/Forecast.kt @@ -1,26 +1,27 @@ package com.sneha.weatherapp.data.model import com.google.gson.annotations.SerializedName +import java.io.Serializable -/** - * Today forecast response object - */ data class Forecast( + @SerializedName("dt") + val dt: Long, - @SerializedName("list") - val weatherList: List -) { - data class Item( - @SerializedName("main") - val main: Weather.MainData, + @SerializedName("weather") + val weather: List, - @SerializedName("weather") - val weather: List, + @SerializedName("temp") + val temp: Temp, - @SerializedName("dt") - val dt: Long, + @SerializedName("humidity") + val humidity: Int, - @SerializedName("dt_txt") - val dt_txt: String - ) -} \ No newline at end of file + @SerializedName("pressure") + val pressure: Int, + + @SerializedName("sunrise") + val sunrise: Long, + + @SerializedName("sunset") + val sunset: Long +): Serializable \ No newline at end of file diff --git a/app/src/main/java/com/sneha/weatherapp/data/model/ForecastItem.kt b/app/src/main/java/com/sneha/weatherapp/data/model/ForecastItem.kt new file mode 100644 index 00000000..61ae404e --- /dev/null +++ b/app/src/main/java/com/sneha/weatherapp/data/model/ForecastItem.kt @@ -0,0 +1,17 @@ +package com.sneha.weatherapp.data.model + +import com.google.gson.annotations.SerializedName + +data class ForecastItem( + @SerializedName("main") + val main: Weather.MainData, + + @SerializedName("weather") + val weather: List, + + @SerializedName("dt") + val dt: Long, + + @SerializedName("dt_txt") + val dt_txt: String +) \ No newline at end of file diff --git a/app/src/main/java/com/sneha/weatherapp/data/model/LocationData.kt b/app/src/main/java/com/sneha/weatherapp/data/model/LocationData.kt new file mode 100644 index 00000000..02d35e94 --- /dev/null +++ b/app/src/main/java/com/sneha/weatherapp/data/model/LocationData.kt @@ -0,0 +1,6 @@ +package com.sneha.weatherapp.data.model + +data class LocationData( + val longitude: Double, + val latitude: Double +) \ No newline at end of file diff --git a/app/src/main/java/com/sneha/weatherapp/data/model/LocationModel.kt b/app/src/main/java/com/sneha/weatherapp/data/model/LocationModel.kt deleted file mode 100644 index 8041b5dc..00000000 --- a/app/src/main/java/com/sneha/weatherapp/data/model/LocationModel.kt +++ /dev/null @@ -1,7 +0,0 @@ -package com.sneha.weatherapp.data.model - -data class LocationModel( - val longitude: Double, - val latitude: Double, - val cityName: String -) \ No newline at end of file diff --git a/app/src/main/java/com/sneha/weatherapp/data/model/Temp.kt b/app/src/main/java/com/sneha/weatherapp/data/model/Temp.kt new file mode 100644 index 00000000..42f14190 --- /dev/null +++ b/app/src/main/java/com/sneha/weatherapp/data/model/Temp.kt @@ -0,0 +1,12 @@ +package com.sneha.weatherapp.data.model + +import com.google.gson.annotations.SerializedName + + +data class Temp( + @SerializedName("min") + val min: Double, + + @SerializedName("max") + val max: Double +) \ No newline at end of file diff --git a/app/src/main/java/com/sneha/weatherapp/data/remote/NetworkService.kt b/app/src/main/java/com/sneha/weatherapp/data/remote/NetworkService.kt index 3dec188d..0bade630 100644 --- a/app/src/main/java/com/sneha/weatherapp/data/remote/NetworkService.kt +++ b/app/src/main/java/com/sneha/weatherapp/data/remote/NetworkService.kt @@ -1,8 +1,8 @@ package com.sneha.weatherapp.data.remote -import com.sneha.weatherapp.data.model.DailyForecast -import com.sneha.weatherapp.data.model.Forecast import com.sneha.weatherapp.data.model.Weather +import com.sneha.weatherapp.data.remote.response.DailyForecastResponse +import com.sneha.weatherapp.data.remote.response.TodayForecastResponse import io.reactivex.Single import retrofit2.http.GET import retrofit2.http.Query @@ -22,12 +22,12 @@ interface NetworkService { @Query("id") cityId: Long, @Query("cnt") count: Int, @Query(Networking.HEADER_API_KEY) apiKey: String = Networking.API_KEY - ): Single + ): Single @GET(Endpoints.FORECAST_DAILY) fun getDailyForecast( @Query("id") cityId: Long, @Query("cnt") count: Int, @Query(Networking.HEADER_API_KEY) apiKey: String = Networking.API_KEY - ): Single + ): Single } \ No newline at end of file diff --git a/app/src/main/java/com/sneha/weatherapp/data/remote/response/DailyForecastResponse.kt b/app/src/main/java/com/sneha/weatherapp/data/remote/response/DailyForecastResponse.kt new file mode 100644 index 00000000..73cca59b --- /dev/null +++ b/app/src/main/java/com/sneha/weatherapp/data/remote/response/DailyForecastResponse.kt @@ -0,0 +1,15 @@ +package com.sneha.weatherapp.data.remote.response + +import com.google.gson.annotations.SerializedName +import com.sneha.weatherapp.data.model.Forecast + +/** + * Daily forecast response object + */ +data class DailyForecastResponse( + @SerializedName("cod") + val cod: Int, + + @SerializedName("list") + val forecastList: List +) \ No newline at end of file diff --git a/app/src/main/java/com/sneha/weatherapp/data/remote/response/DummyResponse.kt b/app/src/main/java/com/sneha/weatherapp/data/remote/response/DummyResponse.kt deleted file mode 100644 index a6a17706..00000000 --- a/app/src/main/java/com/sneha/weatherapp/data/remote/response/DummyResponse.kt +++ /dev/null @@ -1,19 +0,0 @@ -package com.sneha.weatherapp.data.remote.response - -import com.google.gson.annotations.Expose -import com.google.gson.annotations.SerializedName -import com.sneha.weatherapp.data.model.Dummy - -data class DummyResponse( - @Expose - @SerializedName("statusCode") - var statusCode: String, - - @Expose - @SerializedName("message") - var message: String, - - @Expose - @SerializedName("data") - val data: List -) \ No newline at end of file diff --git a/app/src/main/java/com/sneha/weatherapp/data/remote/response/GeneralResponse.kt b/app/src/main/java/com/sneha/weatherapp/data/remote/response/GeneralResponse.kt deleted file mode 100644 index deb2ad10..00000000 --- a/app/src/main/java/com/sneha/weatherapp/data/remote/response/GeneralResponse.kt +++ /dev/null @@ -1,14 +0,0 @@ -package com.sneha.weatherapp.data.remote.response - -import com.google.gson.annotations.Expose -import com.google.gson.annotations.SerializedName - -data class GeneralResponse( - @Expose - @SerializedName("statusCode") - var statusCode: String, - - @Expose - @SerializedName("message") - var message: String -) \ No newline at end of file diff --git a/app/src/main/java/com/sneha/weatherapp/data/remote/response/TodayForecastResponse.kt b/app/src/main/java/com/sneha/weatherapp/data/remote/response/TodayForecastResponse.kt new file mode 100644 index 00000000..9380556d --- /dev/null +++ b/app/src/main/java/com/sneha/weatherapp/data/remote/response/TodayForecastResponse.kt @@ -0,0 +1,13 @@ +package com.sneha.weatherapp.data.remote.response + +import com.google.gson.annotations.SerializedName +import com.sneha.weatherapp.data.model.ForecastItem + +/** + * Today forecast response object + */ +data class TodayForecastResponse( + + @SerializedName("list") + val forecastList: List +) \ No newline at end of file diff --git a/app/src/main/java/com/sneha/weatherapp/data/repository/UserRepository.kt b/app/src/main/java/com/sneha/weatherapp/data/repository/UserRepository.kt index 1efc4c52..3ec606c2 100644 --- a/app/src/main/java/com/sneha/weatherapp/data/repository/UserRepository.kt +++ b/app/src/main/java/com/sneha/weatherapp/data/repository/UserRepository.kt @@ -2,6 +2,7 @@ package com.sneha.weatherapp.data.repository import com.sneha.weatherapp.data.local.db.DatabaseService import com.sneha.weatherapp.data.local.prefs.UserPreferences +import com.sneha.weatherapp.data.model.LocationData import com.sneha.weatherapp.data.model.User import com.sneha.weatherapp.data.remote.NetworkService import javax.inject.Inject @@ -40,4 +41,18 @@ class UserRepository @Inject constructor( else null } -} \ No newline at end of file + + fun saveLocationData(locationData: LocationData){ + userPreferences.setLatitude(locationData.latitude.toString()) + userPreferences.setLongitude(locationData.longitude.toString()) + } + + fun getLocationData() : LocationData? { + val latitude = userPreferences.getLatitude() + val longitude = userPreferences.getLongitude() + return if(!latitude.isNullOrEmpty() && !longitude.isNullOrEmpty()) { + LocationData(longitude.toDouble(), latitude.toDouble()) + }else + null + } + } \ No newline at end of file diff --git a/app/src/main/java/com/sneha/weatherapp/data/repository/WeatherRepository.kt b/app/src/main/java/com/sneha/weatherapp/data/repository/WeatherRepository.kt index ede4d2bf..e8ee2b52 100644 --- a/app/src/main/java/com/sneha/weatherapp/data/repository/WeatherRepository.kt +++ b/app/src/main/java/com/sneha/weatherapp/data/repository/WeatherRepository.kt @@ -1,10 +1,10 @@ package com.sneha.weatherapp.data.repository import com.sneha.weatherapp.data.local.db.DatabaseService -import com.sneha.weatherapp.data.model.DailyForecast -import com.sneha.weatherapp.data.model.Forecast import com.sneha.weatherapp.data.model.Weather import com.sneha.weatherapp.data.remote.NetworkService +import com.sneha.weatherapp.data.remote.response.DailyForecastResponse +import com.sneha.weatherapp.data.remote.response.TodayForecastResponse import io.reactivex.Single import javax.inject.Inject @@ -16,9 +16,9 @@ class WeatherRepository @Inject constructor( fun fetchWeatherData(cityName: String): Single = networkService.getWeatherData(cityName = cityName) - fun fetchTodayForecast(cityId: Long): Single = + fun fetchTodayForecast(cityId: Long): Single = networkService.getTodayForecast(cityId, 7) - fun fetchDailyForecast(cityId: Long): Single = + fun fetchDailyForecast(cityId: Long): Single = networkService.getDailyForecast(cityId, 7) } \ No newline at end of file diff --git a/app/src/main/java/com/sneha/weatherapp/di/component/ActivityComponent.kt b/app/src/main/java/com/sneha/weatherapp/di/component/ActivityComponent.kt index 72983608..a01c018f 100644 --- a/app/src/main/java/com/sneha/weatherapp/di/component/ActivityComponent.kt +++ b/app/src/main/java/com/sneha/weatherapp/di/component/ActivityComponent.kt @@ -2,6 +2,7 @@ package com.sneha.weatherapp.di.component import com.sneha.weatherapp.di.ActivityScope import com.sneha.weatherapp.di.module.ActivityModule +import com.sneha.weatherapp.ui.location.LocationActivity import com.sneha.weatherapp.ui.weather.WeatherActivity import com.sneha.weatherapp.ui.splash.SplashActivity import com.sneha.weatherapp.ui.weather.SelectedDayForecastActivity diff --git a/app/src/main/java/com/sneha/weatherapp/di/component/ApplicationComponent.kt b/app/src/main/java/com/sneha/weatherapp/di/component/ApplicationComponent.kt index beed7b2b..11b9b283 100644 --- a/app/src/main/java/com/sneha/weatherapp/di/component/ApplicationComponent.kt +++ b/app/src/main/java/com/sneha/weatherapp/di/component/ApplicationComponent.kt @@ -5,6 +5,7 @@ import android.content.Context import android.content.SharedPreferences import android.location.Geocoder import com.google.android.gms.location.FusedLocationProviderClient +import com.google.android.gms.location.LocationRequest import com.sneha.weatherapp.WeatherApplication import com.sneha.weatherapp.data.local.db.DatabaseService import com.sneha.weatherapp.data.remote.NetworkService @@ -60,8 +61,4 @@ interface ApplicationComponent { fun getSchedulerProvider(): SchedulerProvider fun getCompositeDisposable(): CompositeDisposable - - fun getFusedLocationProviderClient() : FusedLocationProviderClient - - fun getGeoCoder() : Geocoder } \ No newline at end of file diff --git a/app/src/main/java/com/sneha/weatherapp/di/module/ApplicationModule.kt b/app/src/main/java/com/sneha/weatherapp/di/module/ApplicationModule.kt index 72a81838..fa4922f4 100644 --- a/app/src/main/java/com/sneha/weatherapp/di/module/ApplicationModule.kt +++ b/app/src/main/java/com/sneha/weatherapp/di/module/ApplicationModule.kt @@ -3,10 +3,7 @@ package com.sneha.weatherapp.di.module import android.app.Application import android.content.Context import android.content.SharedPreferences -import android.location.Geocoder import androidx.room.Room -import com.google.android.gms.location.FusedLocationProviderClient -import com.google.android.gms.location.LocationServices import com.sneha.weatherapp.BuildConfig import com.sneha.weatherapp.WeatherApplication import com.sneha.weatherapp.data.local.db.DatabaseService @@ -19,7 +16,6 @@ import com.sneha.weatherapp.utils.rx.SchedulerProvider import dagger.Module import dagger.Provides import io.reactivex.disposables.CompositeDisposable -import java.util.* import javax.inject.Singleton @Module @@ -74,12 +70,4 @@ class ApplicationModule(private val application: WeatherApplication) { @Singleton @Provides fun provideNetworkHelper(): NetworkHelper = NetworkHelper(application) - - @Singleton - @Provides - fun provideFusedLocationProviderClient() : FusedLocationProviderClient = LocationServices.getFusedLocationProviderClient(application) - - @Singleton - @Provides - fun provideGeoCoder() : Geocoder = Geocoder(application, Locale.getDefault()) } \ No newline at end of file diff --git a/app/src/main/java/com/sneha/weatherapp/ui/location/GpsStatusLiveData.kt b/app/src/main/java/com/sneha/weatherapp/ui/location/GpsStatusLiveData.kt new file mode 100644 index 00000000..7da5dbf0 --- /dev/null +++ b/app/src/main/java/com/sneha/weatherapp/ui/location/GpsStatusLiveData.kt @@ -0,0 +1,65 @@ +package com.sneha.weatherapp.ui.location + +import android.content.BroadcastReceiver +import android.content.Context +import android.content.Intent +import android.content.IntentFilter +import android.location.LocationManager +import android.os.Build +import android.provider.Settings +import android.provider.Settings.Secure.* +import androidx.lifecycle.LiveData +import com.sneha.weatherapp.R +import timber.log.Timber + +/** + * Listens to Gps (location service) which is highly important for tracking to work and then + * responds with appropriate state specified in {@link GpsStatus} + */ +class GpsStatusLiveData(private val context: Context) : LiveData() { + + private val gpsSwitchStateReceiver = object : BroadcastReceiver() { + override fun onReceive(context: Context, intent: Intent) = checkGpsAndReact() + } + + override fun onInactive() = unregisterReceiver() + + override fun onActive() { + registerReceiver() + checkGpsAndReact() + } + + private fun checkGpsAndReact() = if (isLocationEnabled()) { + postValue(GpsStatus.Enabled()) + } else { + postValue(GpsStatus.Disabled()) + } + + private fun isLocationEnabled() = + if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) { + context.getSystemService(LocationManager::class.java) + .isProviderEnabled(LocationManager.GPS_PROVIDER) + } else { + try { + getInt(context.contentResolver, LOCATION_MODE) != LOCATION_MODE_OFF + } catch (e: Settings.SettingNotFoundException) { + Timber.e(e) + false + } + } + + /** + * Broadcast receiver to listen the Location button toggle state in Android. + */ + private fun registerReceiver() = context.registerReceiver( + gpsSwitchStateReceiver, + IntentFilter(LocationManager.PROVIDERS_CHANGED_ACTION) + ) + + private fun unregisterReceiver() = context.unregisterReceiver(gpsSwitchStateReceiver) +} + +sealed class GpsStatus { + data class Enabled(val message: Int = R.string.gps_status_enabled) : GpsStatus() + data class Disabled(val message: Int = R.string.gps_status_disabled) : GpsStatus() +} diff --git a/app/src/main/java/com/sneha/weatherapp/ui/location/LocationActivity.kt b/app/src/main/java/com/sneha/weatherapp/ui/location/LocationActivity.kt new file mode 100644 index 00000000..79dd0a2c --- /dev/null +++ b/app/src/main/java/com/sneha/weatherapp/ui/location/LocationActivity.kt @@ -0,0 +1,150 @@ +package com.sneha.weatherapp.ui.location + +import android.Manifest +import android.annotation.SuppressLint +import android.content.Intent +import android.content.pm.PackageManager +import android.os.Bundle +import android.provider.Settings +import androidx.appcompat.app.AppCompatActivity +import androidx.core.app.ActivityCompat +import androidx.lifecycle.Observer +import androidx.lifecycle.ViewModelProviders +import com.sneha.weatherapp.R +import com.sneha.weatherapp.utils.ViewModelProviderFactory +import kotlinx.android.synthetic.main.activity_location.* + + +const val LOCATION_REQUEST = 100 + +class LocationActivity : AppCompatActivity() { + + lateinit var locationViewModel: LocationViewModel + + private var isGPSEnabled = false + + private val gpsObserver = Observer { status -> + status?.let { + when (status) { + is GpsStatus.Enabled -> { + isGPSEnabled = true + invokeLocationAction() + } + + is GpsStatus.Disabled -> { + isGPSEnabled = false + invokeLocationAction() + } + } + } + } + + override fun onCreate(savedInstanceState: Bundle?) { + super.onCreate(savedInstanceState) + setContentView(R.layout.activity_location) + + tv_locate.setOnClickListener { + when (tv_locate.text) { + getString(R.string.locate) -> ActivityCompat.requestPermissions( + this, + arrayOf( + Manifest.permission.ACCESS_FINE_LOCATION, + Manifest.permission.ACCESS_COARSE_LOCATION + ), + LOCATION_REQUEST + ) + getString(R.string.enable_gps) -> { + val intent = Intent(Settings.ACTION_LOCATION_SOURCE_SETTINGS) + startActivity(intent) + } + else -> { + //DO NOTHING + } + } + } + } + + private fun startLocationUpdate() { + locationViewModel.getLocationData().observe(this, Observer { + // latLong.text = getString(R.string.latLong, it.longitude, it.latitude) + latLong.text = getString(R.string.loading_data) + finish() +// startActivity(Intent(applicationContext, WeatherActivity::class.java)) + }) + } + + private fun isPermissionsGranted() = + ActivityCompat.checkSelfPermission( + this, + Manifest.permission.ACCESS_FINE_LOCATION + ) == PackageManager.PERMISSION_GRANTED && + ActivityCompat.checkSelfPermission( + this, + Manifest.permission.ACCESS_COARSE_LOCATION + ) == PackageManager.PERMISSION_GRANTED + + + private fun shouldShowRequestPermissionRationale() = + ActivityCompat.shouldShowRequestPermissionRationale( + this, + Manifest.permission.ACCESS_FINE_LOCATION + ) && ActivityCompat.shouldShowRequestPermissionRationale( + this, + Manifest.permission.ACCESS_COARSE_LOCATION + ) + + @SuppressLint("MissingPermission") + override fun onRequestPermissionsResult( + requestCode: Int, permissions: Array, + grantResults: IntArray + ) { + super.onRequestPermissionsResult(requestCode, permissions, grantResults) + when (requestCode) { + LOCATION_REQUEST -> { + invokeLocationAction() + } + } + } + + private fun invokeLocationAction() { + when { + !isGPSEnabled -> { + tv_locate_city.text = getString(R.string.turn_gps_on) + tv_locate.text = getString(R.string.enable_gps) + latLong.text = getString(R.string.enable_gps_message) + } + + isPermissionsGranted() -> startLocationUpdate() + + shouldShowRequestPermissionRationale() -> { + tv_locate_city.text = getString(R.string.locate_current_city) + tv_locate.text = getString(R.string.locate) + latLong.text = getString(R.string.permission_request) + } + + else -> { + ActivityCompat.requestPermissions( + this, + arrayOf( + Manifest.permission.ACCESS_FINE_LOCATION, + Manifest.permission.ACCESS_COARSE_LOCATION + ), + LOCATION_REQUEST + ) + } + } + } + + override fun onStart() { + super.onStart() + locationViewModel = ViewModelProviders.of( + this, ViewModelProviderFactory(LocationViewModel::class) { + LocationViewModel(application) + }).get(LocationViewModel::class.java) + locationViewModel.gpsStatusLiveData.observe(this, gpsObserver) + + invokeLocationAction() + } +} + + diff --git a/app/src/main/java/com/sneha/weatherapp/ui/location/LocationLiveData.kt b/app/src/main/java/com/sneha/weatherapp/ui/location/LocationLiveData.kt new file mode 100644 index 00000000..fba1a7df --- /dev/null +++ b/app/src/main/java/com/sneha/weatherapp/ui/location/LocationLiveData.kt @@ -0,0 +1,65 @@ +package com.sneha.weatherapp.ui.location + +import android.annotation.SuppressLint +import android.app.Application +import android.location.Location +import androidx.lifecycle.LiveData +import com.google.android.gms.location.* +import com.sneha.weatherapp.data.model.LocationData + +class LocationLiveData(context: Application) : + LiveData() { + + private var fusedLocationClient = LocationServices.getFusedLocationProviderClient(context) + + override fun onInactive() { + super.onInactive() + fusedLocationClient.removeLocationUpdates(locationCallback) + } + + + @SuppressLint("MissingPermission") + override fun onActive() { + super.onActive() + fusedLocationClient.lastLocation + .addOnSuccessListener { location: Location? -> + location?.also { + setLocationData(it) + } + } + startLocationUpdates() + } + + @SuppressLint("MissingPermission") + private fun startLocationUpdates() { + fusedLocationClient.requestLocationUpdates( + locationRequest, + locationCallback, + null + ) + } + + private val locationCallback = object : LocationCallback() { + override fun onLocationResult(locationResult: LocationResult?) { + locationResult ?: return + for (location in locationResult.locations) { + setLocationData(location) + } + } + } + + private fun setLocationData(location: Location) { + value = LocationData( + longitude = location.longitude, + latitude = location.latitude + ) + } + + companion object { + val locationRequest: LocationRequest = LocationRequest.create().apply { + interval = 10000 + fastestInterval = 5000 + priority = LocationRequest.PRIORITY_HIGH_ACCURACY + } + } +} \ No newline at end of file diff --git a/app/src/main/java/com/sneha/weatherapp/ui/location/LocationViewModel.kt b/app/src/main/java/com/sneha/weatherapp/ui/location/LocationViewModel.kt new file mode 100644 index 00000000..f3d59e98 --- /dev/null +++ b/app/src/main/java/com/sneha/weatherapp/ui/location/LocationViewModel.kt @@ -0,0 +1,21 @@ +package com.sneha.weatherapp.ui.location + +import android.app.Application +import androidx.lifecycle.AndroidViewModel +import com.google.android.gms.location.FusedLocationProviderClient +import com.google.android.gms.location.LocationRequest +import com.sneha.weatherapp.data.local.prefs.UserPreferences +import com.sneha.weatherapp.data.repository.UserRepository +import javax.inject.Inject + +class LocationViewModel( + application: Application +) : AndroidViewModel(application) { + + private val locationData = LocationLiveData(application) + + fun getLocationData() = locationData + + val gpsStatusLiveData = GpsStatusLiveData(application) + +} diff --git a/app/src/main/java/com/sneha/weatherapp/ui/splash/SplashViewModel.kt b/app/src/main/java/com/sneha/weatherapp/ui/splash/SplashViewModel.kt index 61c29a7a..bb880839 100644 --- a/app/src/main/java/com/sneha/weatherapp/ui/splash/SplashViewModel.kt +++ b/app/src/main/java/com/sneha/weatherapp/ui/splash/SplashViewModel.kt @@ -25,7 +25,7 @@ class SplashViewModel( init { GlobalScope.launch { - delay(5000) + delay(3000) } } diff --git a/app/src/main/java/com/sneha/weatherapp/ui/weather/SelectedDayForecastActivity.kt b/app/src/main/java/com/sneha/weatherapp/ui/weather/SelectedDayForecastActivity.kt index a2652f27..acc05b1d 100644 --- a/app/src/main/java/com/sneha/weatherapp/ui/weather/SelectedDayForecastActivity.kt +++ b/app/src/main/java/com/sneha/weatherapp/ui/weather/SelectedDayForecastActivity.kt @@ -2,7 +2,6 @@ package com.sneha.weatherapp.ui.weather import android.os.Bundle import com.sneha.weatherapp.R -import com.sneha.weatherapp.data.model.DailyForecast import com.sneha.weatherapp.di.component.ActivityComponent import com.sneha.weatherapp.ui.base.BaseActivity import com.sneha.weatherapp.utils.common.TimeUtils @@ -11,6 +10,7 @@ import kotlinx.android.synthetic.main.activity_selected_day.* import kotlinx.android.synthetic.main.activity_selected_day.tv_day import kotlinx.android.synthetic.main.activity_selected_day.tv_feels_like import com.google.gson.Gson +import com.sneha.weatherapp.data.model.Forecast class SelectedDayForecastActivity : BaseActivity() { @@ -23,7 +23,7 @@ class SelectedDayForecastActivity : BaseActivity() { Gson().fromJson( intent.getStringExtra("forecast_data"), - DailyForecast.ForecastItem::class.java + Forecast::class.java ).let { tv_day.text = TimeUtils.getTimeInExpectedFormat(it.dt, "EEEE") tv_feels_like.text = it.weather[0].description.capitalize() diff --git a/app/src/main/java/com/sneha/weatherapp/ui/weather/WeatherActivity.kt b/app/src/main/java/com/sneha/weatherapp/ui/weather/WeatherActivity.kt index 08a9a06d..36e1c5b7 100644 --- a/app/src/main/java/com/sneha/weatherapp/ui/weather/WeatherActivity.kt +++ b/app/src/main/java/com/sneha/weatherapp/ui/weather/WeatherActivity.kt @@ -1,6 +1,7 @@ package com.sneha.weatherapp.ui.weather import android.content.Intent +import android.graphics.Color import android.os.Bundle import android.view.View import androidx.lifecycle.Observer @@ -16,7 +17,6 @@ import kotlinx.android.synthetic.main.layout_weather_details.* import javax.inject.Inject import com.sneha.weatherapp.data.model.Weather import com.sneha.weatherapp.ui.weather.adapter.ClickListener -import kotlinx.android.synthetic.main.progress_bar.* import javax.inject.Named @@ -52,10 +52,6 @@ class WeatherActivity : BaseActivity() { override fun setupObservers() { - viewModel.isWeatherFetching().observe(this, Observer { - if (it) layout_progress.visibility = View.VISIBLE - }) - //fetching weather data viewModel.getWeatherData().observe(this, Observer { it?.let { weather -> @@ -65,7 +61,7 @@ class WeatherActivity : BaseActivity() { //get today's forecast viewModel.getForecastData().observe(this, Observer { - it?.weatherList?.let { + it?.forecastList?.let { tv_today_forecast_label.visibility = View.VISIBLE forecastAdapter.appendData(it) } @@ -100,7 +96,6 @@ class WeatherActivity : BaseActivity() { } private fun setWeatherData(weather: Weather) { - layout_progress.visibility = View.GONE tv_today_label.visibility = View.VISIBLE weather_details.visibility = View.VISIBLE tv_today_weather_details.visibility = View.VISIBLE diff --git a/app/src/main/java/com/sneha/weatherapp/ui/weather/WeatherViewModel.kt b/app/src/main/java/com/sneha/weatherapp/ui/weather/WeatherViewModel.kt index ef48e627..05145ec0 100644 --- a/app/src/main/java/com/sneha/weatherapp/ui/weather/WeatherViewModel.kt +++ b/app/src/main/java/com/sneha/weatherapp/ui/weather/WeatherViewModel.kt @@ -3,9 +3,9 @@ package com.sneha.weatherapp.ui.weather import androidx.lifecycle.LiveData import androidx.lifecycle.MutableLiveData import androidx.lifecycle.Transformations -import com.sneha.weatherapp.data.model.DailyForecast -import com.sneha.weatherapp.data.model.Forecast import com.sneha.weatherapp.data.model.Weather +import com.sneha.weatherapp.data.remote.response.DailyForecastResponse +import com.sneha.weatherapp.data.remote.response.TodayForecastResponse import com.sneha.weatherapp.data.repository.WeatherRepository import com.sneha.weatherapp.ui.base.BaseViewModel import com.sneha.weatherapp.utils.common.Resource @@ -23,19 +23,19 @@ class WeatherViewModel( ) : BaseViewModel(schedulerProvider, compositeDisposable, networkHelper) { private val weatherLiveData: MutableLiveData> = MutableLiveData() - private val forecastLiveData: MutableLiveData> = MutableLiveData() - private val dailyForecastLiveData: MutableLiveData> = MutableLiveData() + private val forecastLiveData: MutableLiveData> = MutableLiveData() + private val dailyForecastLiveData: MutableLiveData> = MutableLiveData() fun getWeatherData(): LiveData = Transformations.map(weatherLiveData) { it.data } - fun getForecastData(): LiveData = Transformations.map(forecastLiveData) { + fun getForecastData(): LiveData = Transformations.map(forecastLiveData) { it.data } - fun getDailyForecastData(): LiveData = Transformations.map(dailyForecastLiveData) { + fun getDailyForecastData(): LiveData = Transformations.map(dailyForecastLiveData) { it.data } diff --git a/app/src/main/java/com/sneha/weatherapp/ui/weather/adapter/DailyForecastAdapter.kt b/app/src/main/java/com/sneha/weatherapp/ui/weather/adapter/DailyForecastAdapter.kt index 397471cb..d760b0cb 100644 --- a/app/src/main/java/com/sneha/weatherapp/ui/weather/adapter/DailyForecastAdapter.kt +++ b/app/src/main/java/com/sneha/weatherapp/ui/weather/adapter/DailyForecastAdapter.kt @@ -2,7 +2,7 @@ package com.sneha.weatherapp.ui.weather.adapter import android.view.ViewGroup import androidx.lifecycle.Lifecycle -import com.sneha.weatherapp.data.model.DailyForecast +import com.sneha.weatherapp.data.model.Forecast import com.sneha.weatherapp.ui.base.BaseAdapter interface ClickListener{ @@ -11,9 +11,9 @@ interface ClickListener{ class DailyForecastAdapter( parentLifecycle: Lifecycle, - forecasts: ArrayList, + forecasts: ArrayList, var clickListener: ClickListener? = null -) : BaseAdapter(parentLifecycle, forecasts) { +) : BaseAdapter(parentLifecycle, forecasts) { override fun onCreateViewHolder(parent: ViewGroup, viewType: Int) = DailyForecastItemViewHolder(parent, clickListener) } \ No newline at end of file diff --git a/app/src/main/java/com/sneha/weatherapp/ui/weather/adapter/DailyForecastItemViewHolder.kt b/app/src/main/java/com/sneha/weatherapp/ui/weather/adapter/DailyForecastItemViewHolder.kt index bb77f432..3e9af84e 100644 --- a/app/src/main/java/com/sneha/weatherapp/ui/weather/adapter/DailyForecastItemViewHolder.kt +++ b/app/src/main/java/com/sneha/weatherapp/ui/weather/adapter/DailyForecastItemViewHolder.kt @@ -4,20 +4,21 @@ import android.view.View import android.view.ViewGroup import androidx.lifecycle.Observer import com.sneha.weatherapp.R -import com.sneha.weatherapp.data.model.DailyForecast import com.sneha.weatherapp.di.component.ViewHolderComponent import com.sneha.weatherapp.ui.base.BaseItemViewHolder import kotlinx.android.synthetic.main.item_view_daily_forecast.view.* import kotlinx.android.synthetic.main.item_view_forecast.view.iv_image import java.util.* import com.google.gson.Gson +import com.sneha.weatherapp.data.model.Forecast class DailyForecastItemViewHolder(parent: ViewGroup, var clickListener: ClickListener?) : - BaseItemViewHolder( - R.layout.item_view_daily_forecast, parent) { + BaseItemViewHolder( + R.layout.item_view_daily_forecast, parent + ) { - var forecast: DailyForecast.ForecastItem? = null + var forecast: Forecast? = null override fun injectDependencies(viewHolderComponent: ViewHolderComponent) { viewHolderComponent.inject(this) @@ -25,9 +26,12 @@ class DailyForecastItemViewHolder(parent: ViewGroup, var clickListener: ClickLis override fun setupObservers() { super.setupObservers() - viewModel.time.observe(this, Observer { - itemView.tv_day.text = it + itemView.tv_day.text = when (position) { + 0 -> itemView.context.getString(R.string.today) + 1 -> itemView.context.getString(R.string.tomorrow) + else -> it + } }) viewModel.feelsLike.observe(this, Observer { diff --git a/app/src/main/java/com/sneha/weatherapp/ui/weather/adapter/DailyForecastItemViewModel.kt b/app/src/main/java/com/sneha/weatherapp/ui/weather/adapter/DailyForecastItemViewModel.kt index 3f219b89..9900ca01 100644 --- a/app/src/main/java/com/sneha/weatherapp/ui/weather/adapter/DailyForecastItemViewModel.kt +++ b/app/src/main/java/com/sneha/weatherapp/ui/weather/adapter/DailyForecastItemViewModel.kt @@ -2,9 +2,8 @@ package com.sneha.weatherapp.ui.weather.adapter import androidx.lifecycle.LiveData import androidx.lifecycle.Transformations -import com.sneha.weatherapp.data.model.DailyForecast +import com.sneha.weatherapp.data.model.Forecast import com.sneha.weatherapp.ui.base.BaseItemViewModel -import com.sneha.weatherapp.utils.common.Resource import com.sneha.weatherapp.utils.common.TimeUtils import com.sneha.weatherapp.utils.display.WeatherToImage import com.sneha.weatherapp.utils.log.Logger @@ -17,7 +16,7 @@ class DailyForecastItemViewModel @Inject constructor( schedulerProvider: SchedulerProvider, compositeDisposable: CompositeDisposable, networkHelper: NetworkHelper -) : BaseItemViewModel( +) : BaseItemViewModel( schedulerProvider, compositeDisposable, networkHelper @@ -27,7 +26,7 @@ class DailyForecastItemViewModel @Inject constructor( const val TAG = "DailyForecastItemViewModel" } - val forecastItem: LiveData = Transformations.map(data) {it} + val forecastItem: LiveData = Transformations.map(data) {it} val time: LiveData = Transformations.map(data) { TimeUtils.getTimeInExpectedFormat(it.dt, "EEE") } val feelsLike: LiveData = Transformations.map(data) { it.weather[0].description } diff --git a/app/src/main/java/com/sneha/weatherapp/ui/weather/adapter/ForecastAdapter.kt b/app/src/main/java/com/sneha/weatherapp/ui/weather/adapter/ForecastAdapter.kt index b163d424..ade1848c 100644 --- a/app/src/main/java/com/sneha/weatherapp/ui/weather/adapter/ForecastAdapter.kt +++ b/app/src/main/java/com/sneha/weatherapp/ui/weather/adapter/ForecastAdapter.kt @@ -2,13 +2,13 @@ package com.sneha.weatherapp.ui.weather.adapter import android.view.ViewGroup import androidx.lifecycle.Lifecycle -import com.sneha.weatherapp.data.model.Forecast +import com.sneha.weatherapp.data.model.ForecastItem import com.sneha.weatherapp.ui.base.BaseAdapter class ForecastAdapter( parentLifecycle: Lifecycle, - private val forecasts: ArrayList -) : BaseAdapter(parentLifecycle, forecasts) { + private val forecasts: ArrayList +) : BaseAdapter(parentLifecycle, forecasts) { override fun onCreateViewHolder(parent: ViewGroup, viewType: Int) = ForecastItemViewHolder(parent) diff --git a/app/src/main/java/com/sneha/weatherapp/ui/weather/adapter/ForecastItemViewHolder.kt b/app/src/main/java/com/sneha/weatherapp/ui/weather/adapter/ForecastItemViewHolder.kt index c6963d46..faa9d676 100644 --- a/app/src/main/java/com/sneha/weatherapp/ui/weather/adapter/ForecastItemViewHolder.kt +++ b/app/src/main/java/com/sneha/weatherapp/ui/weather/adapter/ForecastItemViewHolder.kt @@ -4,14 +4,14 @@ import android.view.View import android.view.ViewGroup import androidx.lifecycle.Observer import com.sneha.weatherapp.R -import com.sneha.weatherapp.data.model.Forecast +import com.sneha.weatherapp.data.model.ForecastItem import com.sneha.weatherapp.di.component.ViewHolderComponent import com.sneha.weatherapp.ui.base.BaseItemViewHolder import com.sneha.weatherapp.utils.display.WeatherToImage import kotlinx.android.synthetic.main.item_view_forecast.view.* class ForecastItemViewHolder(parent: ViewGroup) : - BaseItemViewHolder(R.layout.item_view_forecast, parent) { + BaseItemViewHolder(R.layout.item_view_forecast, parent) { override fun injectDependencies(viewHolderComponent: ViewHolderComponent) { viewHolderComponent.inject(this) diff --git a/app/src/main/java/com/sneha/weatherapp/ui/weather/adapter/ForecastItemViewModel.kt b/app/src/main/java/com/sneha/weatherapp/ui/weather/adapter/ForecastItemViewModel.kt index 7395908f..eeb9d752 100644 --- a/app/src/main/java/com/sneha/weatherapp/ui/weather/adapter/ForecastItemViewModel.kt +++ b/app/src/main/java/com/sneha/weatherapp/ui/weather/adapter/ForecastItemViewModel.kt @@ -2,7 +2,7 @@ package com.sneha.weatherapp.ui.weather.adapter import androidx.lifecycle.LiveData import androidx.lifecycle.Transformations -import com.sneha.weatherapp.data.model.Forecast +import com.sneha.weatherapp.data.model.ForecastItem import com.sneha.weatherapp.ui.base.BaseItemViewModel import com.sneha.weatherapp.utils.common.TimeUtils import com.sneha.weatherapp.utils.log.Logger @@ -15,7 +15,7 @@ class ForecastItemViewModel @Inject constructor( schedulerProvider: SchedulerProvider, compositeDisposable: CompositeDisposable, networkHelper: NetworkHelper -) : BaseItemViewModel( +) : BaseItemViewModel( schedulerProvider, compositeDisposable, networkHelper diff --git a/app/src/main/java/com/sneha/weatherapp/utils/common/GlideHelper.kt b/app/src/main/java/com/sneha/weatherapp/utils/common/GlideHelper.kt deleted file mode 100644 index 0479a1dc..00000000 --- a/app/src/main/java/com/sneha/weatherapp/utils/common/GlideHelper.kt +++ /dev/null @@ -1,13 +0,0 @@ -package com.sneha.weatherapp.utils.common - -import com.bumptech.glide.load.model.GlideUrl -import com.bumptech.glide.load.model.LazyHeaders - -object GlideHelper { - - fun getProtectedUrl(url: String, headers: Map): GlideUrl { - val builder = LazyHeaders.Builder() - for (entry in headers) builder.addHeader(entry.key, entry.value) - return GlideUrl(url, builder.build()) - } -} diff --git a/app/src/main/java/com/sneha/weatherapp/utils/common/LiveDataUtils.kt b/app/src/main/java/com/sneha/weatherapp/utils/common/LiveDataUtils.kt new file mode 100644 index 00000000..b374a782 --- /dev/null +++ b/app/src/main/java/com/sneha/weatherapp/utils/common/LiveDataUtils.kt @@ -0,0 +1,46 @@ +package com.sneha.weatherapp.utils.common + +import androidx.lifecycle.LiveData +import androidx.lifecycle.MediatorLiveData +import androidx.lifecycle.MutableLiveData + + +/** + * This function creates a [LiveData] of a [Pair] of the two types provided. The resulting LiveData is updated whenever either input LiveData updates and both LiveData have updated at least once before. + * + * If the combination of A and B is C, and A and B are updated in this pattern: `AABA`, C would be updated twice (once with the second A value and first B value, and once with the third A value and first B value). + * + * @param a the first LiveData + * @param b the second LiveData + * @author Mitchell Skaggs https://gist.github.com/magneticflux-/044c9d7a3cea431aa0e4f4f4950a2898 + */ +fun combineLatest(a: LiveData, b: LiveData): MutableLiveData> { + return MediatorLiveData>().apply { + var lastA: A? = null + var lastB: B? = null + + fun update() { + val localLastA = lastA + val localLastB = lastB + if (localLastA != null && localLastB != null) + this.value = Pair(localLastA, localLastB) + } + + addSource(a) { + lastA = it + update() + } + addSource(b) { + lastB = it + update() + } + } +} + +/** + * This is merely an extension function for [combineLatest]. + * + * @see combineLatest + * @author Mitchell Skaggs + */ +fun LiveData.combineLatestWith(b: LiveData): LiveData> = combineLatest(this, b) \ No newline at end of file diff --git a/app/src/main/res/drawable/box.xml b/app/src/main/res/drawable/box.xml deleted file mode 100644 index cd582cb8..00000000 --- a/app/src/main/res/drawable/box.xml +++ /dev/null @@ -1,12 +0,0 @@ - - - - - - - - - \ No newline at end of file diff --git a/app/src/main/res/drawable/chip.xml b/app/src/main/res/drawable/chip.xml new file mode 100644 index 00000000..e369b5b1 --- /dev/null +++ b/app/src/main/res/drawable/chip.xml @@ -0,0 +1,18 @@ + + + + + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/drawable/ic_location.xml b/app/src/main/res/drawable/ic_location.xml new file mode 100644 index 00000000..88037e0c --- /dev/null +++ b/app/src/main/res/drawable/ic_location.xml @@ -0,0 +1,5 @@ + + + + diff --git a/app/src/main/res/layout/activity_location.xml b/app/src/main/res/layout/activity_location.xml new file mode 100644 index 00000000..ed144af8 --- /dev/null +++ b/app/src/main/res/layout/activity_location.xml @@ -0,0 +1,38 @@ + + + + + + + + + + diff --git a/app/src/main/res/layout/activity_selected_day.xml b/app/src/main/res/layout/activity_selected_day.xml index 351f387b..1bd7f9f3 100644 --- a/app/src/main/res/layout/activity_selected_day.xml +++ b/app/src/main/res/layout/activity_selected_day.xml @@ -10,59 +10,56 @@ android:layout_width="50dp" android:layout_height="50dp" android:layout_gravity="center" + android:layout_marginTop="10dp" android:src="@drawable/ic_cancel" /> - - - - - - - - - - - + android:layout_marginStart="16dp" + android:layout_marginTop="42dp" + android:layout_marginEnd="16dp" + android:layout_marginBottom="30dp" + android:background="@color/blueLight" + android:orientation="vertical"> + + + + + + + + + android:layout_height="wrap_content" + android:layout_margin="12dp"> + android:text="@string/pressure" + android:textAllCaps="false" /> + android:layout_toEndOf="@+id/pressure" /> + android:layout_margin="12dp"> + android:layout_toEndOf="@+id/humidity" /> + android:layout_margin="12dp"> + android:layout_toEndOf="@+id/sunrise" /> + android:layout_margin="12dp"> + android:layout_toEndOf="@+id/sunset" /> \ No newline at end of file diff --git a/app/src/main/res/layout/activity_weather.xml b/app/src/main/res/layout/activity_weather.xml index 839dd6eb..9a783a0a 100644 --- a/app/src/main/res/layout/activity_weather.xml +++ b/app/src/main/res/layout/activity_weather.xml @@ -32,7 +32,7 @@ android:layout_width="match_parent" android:layout_height="wrap_content" android:gravity="center" - android:text="@string/today" + android:text="@string/city_name" android:visibility="gone" /> - - - - \ 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 index 898f3ed59ac9f3248734a00e5902736c9367d455..63ec933b93aa918a14c238724a69a5385699c466 100644 GIT binary patch delta 3175 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 N002ovPDHLkV1ijnBrX5| delta 2958 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 diff --git a/app/src/main/res/mipmap-mdpi/ic_launcher_round.png b/app/src/main/res/mipmap-mdpi/ic_launcher_round.png deleted file mode 100644 index dae5e082342fcdeee5db8a6e0b27028e2d2808f5..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2783 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 bMK1pT4Am#-VQG|600000NkvXXu0mjf0U-3L literal 4490 zcmV;55q0i~P)6rydA(}wUDXPCF_W1vnaRBK zeoR6LNsxyaZGA2++G?*?dRwg0Dq5+E#aFEgnub(`IsNLD^CGWJ)s74L)DOcaT_gD&woh@MDDT7paS^E*rkp>8F->o#K*x;hPkb-{g{@G1-RXg&d5PhrJUf$gT>-Kc2+T~(?$>*Yu zT4h`0W>J$pZ%Azsi;{nVW%G=At*)awy8+_t6`#e`RGh(2zZ43)n*13}cE8;I5R%*` z|5tXk`=>gMs>q*$@(4m8?`JI1Q?{ zRHAd+JgRmHP9yV))rP7q3IO??4XSoJ$5!Su*=~JDub(K$fM<8yf*a-K*Qz zPelO^(`|+V_|-0Wk_vz*qdO0>?1mS)wM$Y29FC;)bEP-uAW0uG0ct9EO#m6#%K0RZ z39?+K6Wk5gE*|+^5I8uFyX{ALNYa2Nz%T`Hn@(}pU9*C57Xtylz}>iUsV2Z#2;ejg zaNoZ2a>iW@1kiDtzFVLPa8^~&DQ^ARm5e)008Ic*fO8jsh19y~Ki*W3-Qpae2p0nv zo(NXL_4n_CukY&uHM^BPt?*wD_pyjn&Gy=Rcfp3fUR68tMLx;5n(a64-U;9T#U52V zit5Q{QE!`~T|s99zY=X$w0cfmaNYW#0DU9B1CnnlE=a4Z9-s@!Y^>p_bSr_8-_-*O#n>*O#n>*O#n>*O#n@Ra~B|fQ*l9(%QQf9xcJEvaY~>ll!7d& zeMy*!>i>NLUU=_aXnXb`eD~hF-~w+IsQDzK^0wEj+D$`WSMKSA3v0K*aIW*wzx){v z|Lq;P{lJ5=b}1e+^O;s(t?biT$yLHOtC&t(07^{x))^Qyf&6nz%;wDIf6##eu8#&sKFHx$9)9f0Z%(CUS$4kJ%h zh7xEzhK3iU_R;u@KbYx|2=~79C&+BFEBd6;PpcBt&P}D2M4-D$&W5VeCtg1)xQ^3! z9dwsT*;DBzpVRTKQar!Iz)wS)Y_}P!pfNfWp?4YK(O3Tre#~%m=I?&-Fr?${tJVhS z>=lrTBvW+|8iS#2`i=IfwE<-R;44R%@X>{!`|u$=e(U6DgfD8a!sD+U6_7w8>_2iC zX4F|kjj91=H`?IFhx(x5cTdB<7oUfx-gpfTz4Im<`TO4(Xq$f9`@-{Je(C_+`S?TZ z4vcpQ8~0gw-iMFABs?!xhr3^RjtMxadO=JCss=`ts28z5FLd@+WjRbPjd{sS);z$b0hGtE^P}he^1i z7>H-yd;^|7eoS~C1QmcUcehUNIDmRU&%AkT#6+Jh?!%J56dPSF5W|cS2~^FD7Wvd} zT-c21)vi6B=%lT`_GJe6+|LDhTUPB z>Kqr7@|jIF1GGeZq0h@xpIiwP1yjb9Y*zKO!2wZMbhJU|{xvrEbS+BPy11i`MdHh_ zU@6%x@Ok(Gv{}~ZjMb!kP=K2@70hm|8K6>-+veseAW{OYUZ4qdx&3t8|MsoFVo&7r zBR|p`^0RB9Ym&QOBA13Klxzr>w7U5`YSn4T7nW@sCeFfg|s|3n!5j{|JLH@6H|aVdjq+q(_^fRXaK3P8tZdo9e@(iRu< zt#-^$ANe`N*~%uK05m~D0gxI2h64{X!b14LJ-fp52WMNa-_Ungz>n!?42H)aRu9tf zZn@BbcY(EZVhL~!%>xXh%jx{h69NHlePI7Nbyew@+aBx-lTRSu!x_l?#;y+Fs_qPn zFzyAQVd36CK07Sp-tGSwzO%a%W;so;wyOnR9>!fGhokSm2Wxk>z$}*;zO!cs^F5s7 zdN4|kx0C?4Z8H;L+zUX*9sl^`u!*Ba_}GaL;N;-QdrRble38%L9&`MolaSM3!@FQJ z6G4Z0_?!g@Oi9v1(0V6LNg6>3G$lEgO-Tm6-~7mZF&SDOz2J<8TOPaz5~@oX5^WXm zRgCN}thFfSJHcV(r^j|mGB%U)4;_7J+>jr_V@F?x)tyaH)Y%AYx|-ou6lC4*?Vr!2 zJS|H}beRSgvSlfiJk7T%A+RjP#kOg-=>Ybx$D05Lj~|1XcHQh<^OqD2_9kucVwoaqihgiFwGD}j~1T8KAq z9 z0*J_$7eGipRXI8<3eY7Ipjr$(pS5fpOv=;6o~r=0)r#cH3Lrr~6QEWsz)#GN7h+$5Xou}0dN}v_c^boY%{;YZ{WV+0(M1QNN9kM;!AOnLO zA!aO<$`pxu4!x90Kzr3RkuIy=J+gW&=9H=qA z_U>+&-|S@9p4AWyTLkr1J{JXz;e*%scI*>vDKlk)jL}tnO0kitDO+6 z?2}J&RYIn-a{R1}qm0E@ZB`_oFkdWy1o&B&jg?@V^{!r@`-SP05aqg;X(mq$fxs-TLGNGl11do^z)ej zbyh|4sl+n@Iva%o$n^8W0w|C#6u>A?ev|-N<5GZdoFLuJoL?^%Ksv}8B7j1W6%fFy zNPbv=Zjk_D@+X75dvA_6E6 zFN6iKm8nL!k^)EsSvqW^!UD*VZ;KXSB0MP{62Yt>fJB5F5ujW(!es*ZyvoB1VF6kp z*=dv~|NIJ2T%dOv2k0&0@pc1G%QTb_ih|Yb=$T%62%3bDw82d2XhH;WDF$Wp8)|TS zO9Yk>O2SA)vS<#MrV(i-iw4q$z#0HWxD;ejKcAgz2+A3z)@+3bosdkEd0g z;D&1#CpZiz#?%|L1R`t^3D6uAKsmytNfdzqGC|f*0VK$e7Qk*e$z8qXvXKiA`1=hV zmpdyx!B&1`%>9K46G0ec(a5T#01`o#KmdgZm-_e-0c6Mz|AmPOGO9|Ba#>%@WZZ2W z>Ho;wdKvvm*|hl5+kCX*InGgW8c#HK{=|ok`9yjeW-XboyKLmQg9WCdk*LNJcD!Wm8!M{^|rzMI;*ms)i5}x+Az2Z&!25I4rWwWL}BX? zEOKufEUd2?%)sM9ARn2w5R42L+weM@-Ge!fsOt>oIm=qnPh6z`_Ydz*&dt4=I7*o{ zE1hu`!$e9>O-f74pc5eSr(Br2T9<$6_jJqiuh$jk6-OgwWnppRih^SC?_wkr78Flg zxdOMJdh#qTEon9)Lx{AD zp})x??JVrlV(c?%q&{ae4u}ilB*0A^Hwr0^^>G9BT>K=*lpq(QLcEr=q$MqBNlRMN c(!@yr22-Ey)4s~&`~Uy|07*qoM6N<$g6%nSQUCw| diff --git a/app/src/main/res/mipmap-xhdpi/ic_launcher_round.png b/app/src/main/res/mipmap-xhdpi/ic_launcher_round.png deleted file mode 100644 index 14ed0af35023e4f1901cf03487b6c524257b8483..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 6895 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 diff --git a/app/src/main/res/mipmap-xxhdpi/ic_launcher.png b/app/src/main/res/mipmap-xxhdpi/ic_launcher.png index b0907cac3bfd8fbfdc46e1108247f0a1055387ec..89da6aacaeeebc3f85acf975751ffefca833d748 100644 GIT binary patch literal 8514 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 diff --git a/app/src/main/res/mipmap-xxhdpi/ic_launcher_round.png b/app/src/main/res/mipmap-xxhdpi/ic_launcher_round.png deleted file mode 100644 index d8ae03154975f397f8ed1b84f2d4bf9783ecfa26..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 10413 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 XdJ+W}DiIkV00000NkvXXu0mjfKBlg6 diff --git a/app/src/main/res/mipmap-xxxhdpi/ic_launcher.png b/app/src/main/res/mipmap-xxxhdpi/ic_launcher.png index 2c18de9e66108411737e910f5c1972476f03ddbf..910a995da603889e6fcf5d0ad52ca03a5f8cf65c 100644 GIT binary patch literal 12173 zcmcIqWmB9@uzeP1vBegDan~fcE)tyJ1a}C5;7)LN4ekVYcUWA4B)A6+F2RDs<^G3z zKg>+cR87}RbyxT4?h~Q%K?Vy<3I+fGOHNiw?RD+>-+_kmI;*XIK?MLRKu$_r!^7~z z2R+{6qv!9Ne^o|jGix(rUr6Pm>EgfCp$9~yCieKls8t<~%Lm?L(r?R)lamN7{sEV< zwVL+8;;D-j$;pHwBLXy-=uA>As1+e#S*zUi`EeIz&Y7=p--i^zo36{>o;NvPQyxx_ zd|Mv6%d2y8+|P8LFFDs=a$g=9ftPLd4K#Hshv2T4p7LL|r#lm|r!y5nJ1!czvvb>F2FlDu>%>F(1nE-}NkzADPUnHo znx*+qg|G#S7mArp%po`L>wDcQEuS(iPCrKHlf#9V$L)pUr0mMxP&5`$bqb$!}k4wP(kf_e|ee{o^FC!v6YWJ`8Nk0*=N8t{->9;8*!|FJS*tc^V{3@qJyi zRRSRL2y2K@?Bzm1kCHtk%ZEq)M;eC6ddPL%&5q8L&e*mI8(i`zDUW`&zLCzg+DWh0~Ow=(+b*>s;ha64b0LEI7j54Hkcz733bE&3vqT^bVjEak>01rGw{ENe+ok#hrSJOif8DOP zp&dCYbB``Ax(vFA4=u|jq+`XBWyo(6>iTa~9DGCKdxM_{Gmfr&kQl}ykX3Lyu}gAi z;NNoaFkr(lHu2penbXI6#xvgxS|n5sfZ(1ugA%s0(4F5Wtmj4xw)E3W7&05uLzLe6{9-8?2S<>KGFEUr9~=~x&L0T zk@Bg%4iMhQZ@US2xlTGbI(yQ?JK3~GBm440(-;A3D)Jc(siz>ogGCPYA&NUiPZSGB zcag1X9HFf!z!N->R*fQJOIWGSQkm$+kBJ)@%wLcxG%(b9UN51Tx-qiyV$-`=PeS!RiFU zAj!Ui>$5t})2=Hes*2MX*u@4k@*o9Z?jutD`zZ#0fWMo&B6~mepI(eP zDJTy4afUJd!T~AJfZuuV59bhTt4a${d+z{EfQmNL?;|KmtqCz9OSxSSvkn#Czjy78 zupw{m{c>xNMk73*iw-LAU$ve0Htl96D4v4e8hP;vlx%V2F;s?}cjnqd2}C@I8o|pO z`YSr$?6}R!1TJ}gJGR`L!x~>b%sqXPQ;aT0R$Eh6tuG}7zfaBSrTSZCgfk9|@FDy2 z54hOFG$-}(0n(?>y_7V-*^|DHI1iCD&0nqmW(P{u7J`D>nz-|Jk-qRS3@S{3Dyr#P zM93&gr;Ayk{xfj-brz_<@Z|_%KwB|T%N6b-&KB^mgbV|AE{5)hcZ-i0?|t^^DD^}- zzdS+r>>Xwe-gO=9Kh@QBhI`tAyy~I)5t-DqC0nfVl?do$?x=8Glhv9ofNt)470@$U z45$zf=mMHLHrHFBK;vJy2}o2AUPuGT7yNLX{`R|JrVuZtND5dlNhDrNlqPBhp8E#h97=N#y zm>~~cn0k~aot9h8HGz~Yl}O{SO~$1@v1~Y`BRdJDM%3rdPP>c$l%Yh+vIF}s;htiE zWV>z}u00cwe@$(CXb{l>9q%iPo0Z4@RN=w%p`G(DMs=A>WwSO_K+TjZ*X3R*%VgNF z5=}(*D5M4k(2HZaMsb|T!LIlS^chfNLj>0<()A&8e#akz1O-xrawM~j#P!)9qi|?` zq@J0a#$ojxDoTF|rO4LR&UwGB1K^4Y)xqLKA^iQ?z!us~2mnD%lgLX!{$;_%Ar;TM z42>yza^(JIH!IV4K8O$GOE{Ol(W_zB=BB62Tgp>38>32IqWQ7hpv{CFb%+kCH6XeV zk=;JZ3g42V*TuAU6LhJC1K+Jr9?QpDR#qvqJ=^w!{<_^4EgJoTTcO7KOuR$Li!6Fi zY@it=`vyLNs20^5029J0knG?qPz^k$mMp%otPzKtk$14ET~Q zazGS=>cai)ymJeqIWAo>wi$Wa@mxys zYrkhxlcLj==GK4Dq%A&jYaq#`B184dILS-IUsuFmo;_TbK3JY7T1_C@R3O@kKGcb4 zc0cEns^Vmw)1o@a>4Lk~ng^>|*(3<EZin3^_A<4`$M z#--A?iWotTqW)EO&^cV16^r51avA;*qrSP}H4M1+y6j+RSirKw&eO-HO;R@H%j`4c z4UtdYq0|*qiyCp1AS|Bq3RbYE0PS4Y1o|+)a61Luf2AGwhebPEOlD7|)m%#@%NtOp z7T~2kA|d#3M|mZQ?ZPubrV&6 z2=UuH?tk@i-^Osiu~N?-i97Fx^WVr)-+wm;aUg99}S69o$KJTV6@Wd|_OQ0~h1B}%l#uYc_7RUpTY4JWYE)qRvDMo_H?(J&zV zQ<`EsFfOIC5m+Tx;IE7WV1A(fd|o=-NS0rNu-i{=s>$#bpsM0w+*v0X+I`S zkEgHw2v*WWQp84S(pCO6!>Lsx~+@RrUedyuF)U%hy?w?~?K#>)2F-I6C< zEV20Ut;G?BM8`z0$-71VyLt+BRvF%BncycZjGm#GB{+#fk8W+3H-b&(_mQ3OZSvDA zB?4ZAkjr0-KR1|(lM5x3b^X7Jnfd((`^Z!nIEy&0T)-QI_?4Jqxfe!b6U>(Ft1F6R zGs8ogGzqr=WyDNBI`00o776b<2Ik#E<3};`>>P5IyQ6;fIH537+L!E)Wf3at0u-Ql zVwaokM~2;ZX4A5z(W7;)m_;`b24bV;0zoLOH~7_ij<0F5P=B#NscnA~pceAYA<@q~ zMKLg(jiS{tr{K)zRR)*3Ea`g(lFNoCMttOPay@aDoYadhilZyRLo%F$O!7#+||Y^1R_6w>(&#mz)CCZfTsHf8Dx+BPFY z3#m-Vjzw1ab!#{LBvc^AkYw>CYYK}yCX3z_ON*Bw+6woMFY1@z$b|a2plB);nBJ*O zx5n{aOatowhmm7>!-Os%GJzU;SurJxt8SJ_EO$mM)ZBiiz@9c+=-N!>r;kKBR}=Y` z{L~A`6q3|lBbCXQwISqC7DUcVY8y-cwpXYQ9XX72#bwb7mN z$7Jc9LKElEQ=7SqOXY(kf^5gvV;`KipLq3-gfXaO{+%#dyHaH;Z~gee9a+TWzGrYP zO{s@oZ>P5yDpn*KLR2r_L={gVbNQt{CRAN>U~S&A5m$a#%S1ZJ)6yaCx=pc&VkM#Sew%>%2{f0fcvLxG+W0GpvO z&NNzq5KCMI8+Szj-Z{-AxsgNRo!<7Q@$=Kj^=AQ@Ri^mgs!G&LM_m8VI5=`(-NX%D z8?X3fZRF|A162+#z!4M~M68yhHOIXhYC45CInH*4bg7r+alodXY3|mo$>m2zb||eW zg_iIXdy7N_RnC(wkVIfqa2GL$!dSEoYk@QBG6+pAbI(YII2A_4Irj%P-GPWQ!tK1s zZ#~6O`ZB(0eBIp`)@1J&!-1z{b{0u0C*YIGAAWFAF}+Ifb1|~U+HHLdg~RfL8$1`C z7YVk5WEE`dLNd>WyQxArGhA&#*A;`URFz-!KJN5uHO{BKmQ1b`*`TDh1fRePo1{_= zS&+k#%rFA+PkF=m>YMyp0Fy!!GbH|_Qh2}|e=oo#*cq{8wg7As7kqn`hrUO>T+#El z+j>4!rNrIYobIo5v;paN@kTUNsRp@g5`XJ*Q6MZ>YCh7zFt(W)DE}yL9I2Q6nY_0QH*%kg+n4Bc%}RGv>73+7$F#2{E?c#tfg8tm!_Y)o9`KuMOhY-{6mj+f$3wonXd`< zpuCi-{6Mrm-rEYmm&g$TQuP*kKBI9e+b-iPnoN6T4* z!X-Y#NSualr!TnOZl;?fi-?5al|aI#*AIm7{S_?rTGDh2MFbzq5-l$7_^BHY0mSLv z$2tedjHKhLs8C>LF$#pi-K+hUn(Lr#&Oo@SHm2xA7)+znash`QN;TmG75^uJTGcWB!WBF+gCKPU|4>~jW-RGs{Eo;<{jrR(Kd2OYtSepFn_-fmPR*B0eyvhXO z&;SBsze8)!NrY0i@|jP9^%#h*t6c7*;m@ttsu7pD|0!%y@F|(Fk?=S?`Fe-LYtz{` zGdZib9+z{RQq`hury$u&nLAJV)Dc9SxyO~fy$v}UFal}!QnsEBo-AVwTLSJ#gF#-W z@TY;%=Sljk`3mjM958%oW6NuvZ^x*5crzo1}*4PblB+6B)vF@EoOr#{)8n=SGxD{#t7k``|WemUOz zPAuEuHzZI=m=`_|R(DdbcHx5KKGoGI%6JFZ=zXtZN-%gYk`Ie4pyPE7i_JogPghf` zxV$}g};4yxluG!M#9+px|ve*LQ ztkoP9Du1D$(OXpu6hgJ(aV$Er=KJ=X)thG=c6qwCUUh84uBFBqRr6@>8Qae>5^vl- zjUbHd;I(!Nn`wM=&^=08=*+%UD&E8b)#_BeI+8Y>zT1Tfj#7K?^bhUj#=g^g#x#Ks zXZ#@=l`Wb2<%%3%V`2F}#m?o0!bVP!|D!X_N!E$i#o~v1fS2^^O>E6MRR-zElp82= z6gJU85KCmRc%H}Si6b6?X3KBv_ROut67OEv$5j)^38;+LoyQ35a>)|T4UBwV`YTp$ z4`&pzh0E}e-`bU`3fK4xrpztc+Ev?ahW{E{v&w+8+@1^O%^a7sqHwX?mav>@Mf$fTe)Ak<5 zL?xEh;7mw{e#qp^IhXIin(y<<=4gKBttssHp{MZ+RZ%ap9B zS~EW;bR$Q(f-?Ngj6wmG;LhQ|>|1Hn%&;}r!)vrRetT$k8S>jXnQ@dJ?LpCX$K8xV z1M41c$UoUm7WLmqS144N`8HE~ZQ0t|ES7Rwx8$%3%+vyI&WC;&ze0d;G^^*+)v_q* z80CMo(ML8}k;=og#LDj-9*()}1VpW}Rxh?nv}(4`@36cd{_w>6Ip;&(y(tTA77$lw zdVjte((pxRYSOiiHU|-7=QBuU>hCU>>u|Mt1IP*SVd4`f72sq!?{d4$@r8W=03xn` zVh*3gatSsBCs%ejZ6(QlzLZR~~I_G!frHe$UoN36jD>gQaq>LD=XNf;6>x*C(+ zT)v4~@qGMAX)x$jJ)mr4_m6Jjc}Kh(O#AXMT{JVYiw~Ws3FgntuBe2UAi?yuSp|{% z4=Az(Kh%q%hw>E3*#zq)O;H(&hy>>fd>t>Hbs!eYY{Prr3X5uOSKnC0`<#2!?@W5k zvXbx}t%hyFwBrEnvS0$mmSW&(!e)yZq_XqrI!`spAD=ceExpw;&1EIq3!N{?U@ccv zC|0i|3^sZB-#m_E@XJ*hvi|b84vXF>PqlUk4^lw_U3aTsfKBGM^mqj$HxU?;|%(DZY}X2qY#E4vBT$XWm+aTR?SH_`$Ihy$t6ETK8@m3Z@dO3p@ref zdUj|}>-S2>wduoMVrY$$+aWDFZMc)~F+pMp8xZ%@KHWHhGP;>sw`r?(uF~xK`5;!x zMOGC4k*~$&Kt}dT%(pc>%0?%Cl^+kQeAXI;JaOAs2y2cQxl1!fxT%iE6g@HFT=4)#{CFjC7ew0l}29 z$iL|8_^9FwkoSMxCLSwmsb|#%z)rG%G$+m10zKm@o4JTOom2kc6n5}h=~pWBU)OjIBoPPaHfiLv*Y*Q~!Gx7YFQ}j1WQE_Za_09; ze*pPi1dT1S$KP5pTD6q80jy+ZL$318&>r)HY!0axjGmIi%SaCYK55Kc#VQT7L@aB; z{^bCjbmYgij!Ej{Z9nGq1jvD(-v!uE*X9=CgiSRe3EI=wB&WYZj9*;LkN(x`C+e-n z11wq=Qpif}(Zi3$+cn$%7|X-&X3`V~KhX>oxDj&#d%s*TbpJb+R|k;XQUqI?fZf!U zQHQGk^uzBx)Bu+^UEXq}$||`uxMQ2rv=kY-zyoQD2EEVmo}JWVyrp;fwDNV^pEU&0 zhucp6rTC>`>NZ%F%YN+39?^m(1?pK_cNpxHNO`<2e5i~h?-WQd8Eq`fnDcOL(n$;qxjmqh)@VTR1V z>@enzC^DJ8*0YJ4UYIb;_sfK*oQ)T;$N41f(xL%qo}8;1@d8tfmGk$gmEfyJAT5F# z4{cj#R2rd;%-G92=JWh>h;>`^@+6DzCVNe<%?G7x*BHN+bm@{VRvV$)e)|`(Syaa3 zh6$3n?ncpoKRmvUtF$&C4X#cn5lZpoFpali4TZv9dCT3?S)W@CP{Zh&XX9722gi*u zDLWsoiDhrKdf15Pbg_(Ho-aKf`$)HFqk&qK6wfkUoUOh-^kWM$=3Tqvs~^F0>d+qS zgcWO)-xvsyQnVIXS?!Sl1XccQr*+>ZsNh`z3)$I2UG|-$VG;~0cNcT6-ha+N)e_0m zWGG&;1DDusjK|X#nDRxTZ_kkdSv*EQ4=y zPn300;Nv`L`JnKrusfdp%P1LF+Lh&|UV8EDlP}-L9>0f7%B`X~io&5-T4MB-oY7+N z7Ynmhf3X4Fd8Xk)p~l!f5fhLusbOKfL4mdx6=FRj1nc99A-Bk;Jm+7eQu8!Xr zli&kvMj+Po^!_Dgm=`Nzh)XRWEn3{@D&QIrvPw=9+PFWYR!U!mlM)W*8x;9 zwh$MKa`Mo@4MCpk<;VPg&yVLNj*b=>`LYC~Q|Q4oZ|v}JIx3gE!Fx61`C1q!7+3ku ze?x&^Q_IKX?L}`sUv5k4rO_7QDdCy9I|~Fz4~|3SzY3KuSckvw^Vp7YZvC@Ew>uOX zFSui(hIiQ6oIQAnQQ`3z!m7RY!~aVuUFa~b(wjRqgk)dOKm7A8(s~MQl*_p;yI3Fx zSuDbspYN#hRS5S!Oa!fxmN}WVZPw0NGo79gO9Z1S`2hfq?Ei8BR4O!M@b)D~`D5d- zw|45Nv(ku%28@5)!nNsk4m7L_&?1w;&Hpa6mlp@`{$T0rt_)4@a>#a3A-He#Z-?U! zr)vCY2oSx3NBvAoO+Tiwk=BfddF0cRkrk)1doPB(r>{w*jcd}yDzcvV zn;N|iCpJY+kK0&%j^p^3ZKC^9OAwkeWA(&yf(F2eOdPpoI#5k#p?gV$Fq1EY? zLLn)Ad2uJ8{p$8|@PKUN_~~9~gfw;-i?r;l+>%s#-Vnbv&ulp%A_vkT55%!vA&jUx zwHf)dy;X&R{#SFi>j%B-L!k*Kp=x{} zEyTtwe#bA+hU64u-IB{e<^J6!0az>)EW3kvN9tB{Z54g0A1iq)l8`JuMb*H_h>Bc z&Px`^k=E|h$GWP#RZCHXRV#vR=uWQ7tr#0rVmbK!Ie25z#x(ih4?hjXSw5&0&53!1 z>*udk`ye?}x{(HwlB<*8FG1+ja(%Pe2OJ$Yk>rzuf<#?dd^iEI8hjMO8b&dqklfSt z*cZP1_bds+uJ16=!dTgPf1S&SYUF;FWm@yc<>Nq6Y+7QrpfJynCWj4ayVMq{uhZ%_@jVR-3;#IISh1h3|VBbzR_ z#P#tC=y1cIJo@-7fdBC6N=J|^qh+e76`BE7DZxZ^ayfRey(0P_&#SxmtGO>ll83L*S-|1Coi!X{E$Zl@v3 zd(09(qhrnq<**ZU(1xj7gXLL3F`u(r33WNyP2|J}eMvTHmLJT9ax?ko>7}tGmwYu? zuC&$40!z@#C=N8DFFIrYK7j|*Hm~f?65e&AlAX28sO3NajNQW4Y?1sX zy{kLm5l_>TI0=0t=A!;)vpTT7!G}*b-2;rc%xDF7L|P?vNlFyAmZ??-uSQw00(6)` z-i*oP`cwP64w%s+Vh^H`C)$Embo{Yn*1xxk;{Trgy`(vEk{^H+c(+Hi7tfm5fAUmz z*M%713%?A+v}Hfq!YJSubBtD2WH+Hoc*i@{KKRSJ-!1m8?L>jT`;z^g$Vg25k^~+d z98O7L_&e+2H$vyr&6*Iz>{I>0iym=S*?(09Z?>ms7-aak1Y3h(wUZjj8w1x$#Bj1o z&cWO9Z2ha?%-EuW4lSB-WhXCQHxx(PZQ=_b=;0MN(qR!W(pc$rRaA98YPn?Pg{r=7 zLv@3_7)oexuH(YyFVWpKz*whF^+z6!^$34)kwU5{j^+)oojTVTg)XA4Q1d@enHai*9K>NDW6aWU2ZP96?F!jvR*J7oKu1f zE1#OUPx`(|VP-m5iYCC6{K0~Yw=>A)Z4lQvRwI}~N7<^(Tp~YEvYIzDLU$0XzM;kw|Kct7%xV-o5A&~?8M~tT0UaMZz^@(5Ad6BfK}KV3k}r- zCLOZz8$oC&!8$3)V(-YW>beAJ>krSHLErlYxsVci$Y>`8(A`I*knZ9j^Fs68LD{m~pKtpMCb~fMFXpy+uwRdB>!Q5>|K_s^1PMe*rC)W z3d~suSQ8SX75~Bf4S(&YV3pDQ$A2XaGG&)#kS3a<5$8L8H)q5V^CW4h5`FCNhB&&R zY$wXRqoR-9XUH42#~*6J`}5&m{ACyUf6V2%GMUDbUr|79V6VocL(WWDmTCpJ)iGDg zcb;pQnSF1(U5aQgaM`hB9_-H) zNsSN0yq}6&vEiQ7-&)9s9Vvvg5>yB7kiVy~km{%3wpW|Xh84qV=j)+6$F^NiqyTQD zj#SpoP)pADm|-d8iXY3yU5R@H`^;mvPwPjQqZv zicYhabwP_VB{s$e9 zcDzuS$8h@4p#oMu1IPolmpjy%>A#a#81i#+CSUV5Keb}fNh>q^N@5!WE1V8oSo+aR zt^m<~Mg6st;16y~GEmi*>|gn4SQuf7jJM#7U8#RxZy){qnI}fGf3aA!Bcf5IgRg%fOmDipp?Q z?7B_DNd(cRhd?Q>sCstEJv}*G0w*W+Bcsyqn8E zFXEgQl=Rhy>qYE;1X1x^;}y1#7{EW~FfKT>pKqRwFTc$rqsUm^Crwi5;}@M=&};On z3WPsTjF12Vz)l`7^R?1x4-I1?nn07>VIzdjGwv~7oj79la>0x;(pa+N z(0`RB_=abeBr0tb9u4U^V*$1B8$y>X3jFd0Re5(s_2(Z(i+-yCW zqE~-qP(Q4>!m}B~(6H9=xO7evibMGrZ!5l?+z1o>w}IqTBYd&p{+cV{Gk~c03MiS7 zz@R*Ycz*W<`!&(0l=a&R2h&!pfD9>{Kg)mlF95WPs&gJquZ0szKA40$gJq{`Z5Ue$Tn)mvOS?XAaLsv?#txMXH^{WPKYYeydevIJG?~;R7 zu?ESZh!S=NQ{$|h_D0XAMlT!iRZp>PAc;mv13){VNESR9LN7*u1^a9JYtikGEBoBe zFSU5@RGe?(qsp&WlS~iaqPF`sUiSSXWb@fmKg)jUP!_X|1aLuA(aO~E|2(q6z(Kfl zU^p^WLLL;8rn^V!>|vUdLg?!aJOXRN3a31?R7r+AtW3eYv8-&ihLr_f(lr^VJrmO&%`HY<@n@5fQ;(2KO?TbF6&I@6a#ZDW39Y zT_u5WE&nE@P=K3aXMdc6Qkc(eP0x=ZF{6{6Kq(6o>3e^DIgX{`S!>4I653=zAqfm; z7mvo0cU24WD|2ekP68eG-zV;dpLY+}{We2(IXF$+e%uoLgY1?Z;KXJdwIKVuhL?%K z*g#Lz60j`u3rVD4VaZAqpBg>!;{$}dn44e(f_fFy6s~uURqg9ykk%8Tr! zb5|svRXkumF0W0TTP$2UG#pYp{u2zaB8lYJuUi?Z`&;;G0i_U?R>`JrolEz@$2GxT zHj6TpPa*!HGG$cp>)&4MW_bu3yW00&gHOFA1jZz(eZ(w4C1D_WmMCnuBD@S_5&ds&zZtV&*K4u9;NST_5t*Lp6`){V<9j{PdrE(8gS~(5=%BN-2 z)&Q*hcHwcn7`F|dngqtKW!D}JXzxk-mF%$~jc^Gy5Alf{|wEdFL){Cef3(!oWhl@rrX1-h}%Q6YBOUF=^I z@!;k8*n6FU&<$K=^!YycD1nTC`~QQp7fQjv&y%)fydtkOdqD2}2dQcaHYT9T?zm$_~>e0H4dIw&!!4C9vSZxNlr9*d^_s#H!1R~WS_6MVYz@X@%G!e zXHz-tb|VivQj`iFZDUWNj>i`*9rwT8VC9f`)ww2)D0tG&WBFX^J|oMigqUy#_eV)Q z<3?;pz6pkr(;Z)thNWZ3Tu^XIU(m2~K2{iFEAS`~Gy5VW_tC>i*Cl0kv`b9xtW+!e zPD_a1*)E4YGCWy+8(ZVrP7}Y9URLg*>8E8fyY^0u;VQCkoBQJ<_5zdXl(d!zb~b;b z)6|dkG)>oK`*erN6Q98nTc z*T4b)onLqyA@?UYxy_MYQjd+D&|e(Pm(0oT&BjWQ4@?kFIoB**?M#(;rSUW9SnG<- zSt-|WaL6iG_P3uZd9eIpr{TtNWC*$Hh2Qz?uBS}bIbRfO#e{zRE!IEy&YexD%F}@N zL-y@k#YdI*GK@^S9Mw$gu9^2z1mSnEkrdxz+MPN|ZNhhS)_oYvhM)cLTYGn3J-&{3 z*gO%dE$+F=!pgEJp;TQOxUvmXY0MZXd)l&aIQ@q%&TOO4FwrA~ak$>;=zXV4zzr%` z=0~OcyNxrVAu`L~2ctf1)jOUXrl5QhI{u_3cR4;2>t?n_c`o(TMz?xA14+Wh$Va%BY0&2$WKO9mM2sYf3h-OCY*=ZOJ$Ngw)1D_iorRZXHQZi4&2K7qT927nQC0Lrg3 z(#lL522bDvLQQ|!4#s}u&v;Yf6v=QytSm1*VR`JzNHPFHGlJ!`WMgHC3lNnE^`=*0 zy?^9tJWsJlLSn+d=%5(DNQYCcv%)omexK}hyZmUHWQF=7JRFKXB_b-*?UD4{x!=dVwazRjll3YN!e1GQ6{ViI{ zhkd)N+MWKT`q_V0)j;tA_oAca{;nI(Y$Pb7t7Zgb7)DUREOEf@igE4Q;TqcgkX-wd zJ;8G+7!?>DALr#bk)GNchOvQs{BBN~iU1F0&RMR&ou$CHl>C|ZrZ@PkAenI@K>Al% zQ7|N8uxRTq4vM*lnm?oa%}HLn-3G$yJC_b75?=65k%LM)%(H@{N`65=i4pdO>Mz+= zLeav25B?f086=X6O6;%!2@%ZP1|;Nvbnj_2aSc+8ZOx$k{x3Drh^ zc*UWh!@lFm$>1}Uo>u2rUqXSar;=W-2Mqo41Pl(rQD;>HWC;@e#W@Z29HUt(caNqC zC&6BqG(7E8;B^rX*m6|Ejm>-6L>RWQs{?%J*!{N&Cn3FMX$DmBS8~(Emio*Dj(^J_ zk~mE@d*561epZk|Er>78iC#q_4Sp0Y3GD6B@JKKrmyoJG4WGBh)HqTZZw>kH>(OJH zlp#iE)N?g*Z@4^*MV+s+H!!1LJlIN*`JxC#o-v0{2|BS}}kDUMqX8%d%;Zo1pF*{G_rVrzNd`M2ya!T0DJTesuRVwL9u7n&PS ze_~l@1G?`(riUCq#<3T)^gi`sw~pk^JSP})C#_iBKTD*{^N7d0$A0wJ3#IRYe;0q4 zA*$YJb_LE1lo-`!M^fB~U00SLiLywh>%-_CXgSb{ju=7v+FzB+78O;y>TeZvRv&RoWxTLP?d+9Zi&Ypua2+{3 z?&P=TOQKt{%~L~p0$j8^;iia9j_>fKovkcwq%sUQ@nh>Z!)%cfJ0$;z4CPrz6I0OU z@+^ZT$qbq`@V*LyaM7l>CZ1ZQo!IplAN5a81(Tt~ztAbYc(d{@u2@?f2YdnGcoX!#60Ixw-Nvix#$k1X*NJg)beTLqL8^6*<{2f@@ns|Q}RjZ!$JIHK8NbS8xrmu#@ z6ulfiVr7xxNb~dV#acSrSX_pQm;bUeyjdV!{OZy#M4(A` zwu81?V`O!?oZ`D{REMi+x!1hB*6Cy(I?k8T%kET=uKQWo39E}=ca$my=uHTEyP8y z54Nz1YH*)(w%#ztIo^C*PQOjte`Hel~gpFN_jZaXoFZnUzuu<)94E6T<5ZU?s4>c zpU3Uo@d?+!hgYmVil!6X(ly;KNm*OwbI8{z3v|%I_4HT>Nt&7^q0@@SPXaA`iAvAR zSr*v1muELwpeL3wqu$P7L5q4m)-N%|J6fE`4!V+xyrOkr+X2!LT$k#tFYksHJH=n z3F!I2Qe4B5pnFmAer;+($yQcgD*uHlDurPx@2dd)1-RjhQe(5`*~SLS`q|S9v+`3~ zQ>IMi+hcTX^%}_YWT=}koWlGSwSH~mOvRNJ&Sfrc>H__ux(6*kTUubhdoQN>V2}J< zR)ymBx4g=I%zlp1J+QjI7joltSLskIt}qG%d@lfB@0(d>+A&l+Glwv&La86NxDmfT zNv>`p7eT?@iBSF8R6M^wCx1D;HRt!F#6s8>2mF;&B-MF;2m~@G4CaiZ!p=4aG-$V0 zYR+PtSNvY$YwW0OPYxL-i+8&!G0&s(?(IcQ&Iv2 z0Nx*-7_~pZT6#2L-so8nF7QMgH5}#22w+dCGMyllm->HAO8q%eYuJ_BHB7343cyG+ zgo9$W05T7{CPl`Zw^P=q+#rx_`T2%M zMCeCJLfZT%fI{csusPnQ7Xv@XSzVNmPU{iX2w134>~=VfgQ82*rq^p^97wA647vgT`a# z85e!NpbSl#8uA*dnopv4RMby4F4MY{UFn^r{Li3l%Ume;QtBh5?8wCixw0*zSQ${* z6)@M`djm|Nz;H2K_j1ACvx90`pqKN#`9b8Cd=@J|$6R{ZYc5yw){(D1GtABWH=Zy` z-HxQuV(8LOB`UjI4iAOJ34LY@KVEmPb@XIC)FfA6m5B&*8T*hQyR{mweAL1#*kA9n z;O}eZUE%DcD;yjrQM!F!8~hPzPrCH2Fvr-ItjJE$$pV*gv9>ye(q2lsB=uQP$h%X% zlekK6q~fP4niGy&O9mR~_I;)G@;?e;L8#rja{}{3_rR(d$+fAsX?PiFx`2ashkOGP zw9A><#);kE3G}H}!W&WxH1$sg*P@*n!{=#L{PK)y~GHI;RsgpA$#8cpY~ zct*9kjG$l!k{*0T43n={dVV!idt6Zw;lPW%!2K;#E>?J>D|V%r^A`&*)MdYZJT>jL z*;x5TTDFevc8OARtqyN`Wyt;0MTTO-DDG|wtNxUqM1$~ye0&&wUtZ&eqI0=0|Y{WT*|Ia1An)J!bjzf9y3P874R^|FamuD zD47YqkS6Zsd3^fEq_zq1i3zN7fM#ldxb7Z@0Y;<&n|qFI`e8q;TO3t$s`geh?U*oK zp&F$0CKJFD-a%BYO^4KA!5J4T1f9rK@Izkpt4qui#^S_s8AE_pvL7$dKQ z*TXfMJYx+MCq$g?pCj@15ZQdjbAm~v`@A?MCg`$$;e!iKvcv423 z^QOF{_mgOGh3-cDZ={Gyr z_&&UYqVw>f(5K`SHp~Mm5XB0N9$~=XOXd$uQNj=bO95ChnZX9K@n&#T?vXPDfqt07xJZVvBuujM>H*4hP6HvbJ~#$K=z-vNQnRCryVz5?3YqR02@1#K{#%aX?h4VQ45b zcmM<+1V?|eCnx}P7(IWh<1mpP1d4*Z4r1WAfB;C4dhrfKPC^**Pz;nD$YOJ0I9i3T zdQ`v*UjtnCM$WL`J8L<$;~1_X+Oyzj(IKG(tLOn!YS8Vny{ z@>lc1XCA-~hhrD7h1@0O)T))gw+GcvsVwxcnaCv{EQzu|qcwKGyiwb`TTP(}njGXHh$KxOryTWq$B1F6I8!hh2O<$rL^FOXZoKME=~3M&0eN93bd- zfpL<(mU)+asMc@#Mvb?Ws^Rw;E;iny$Mb$bu)1ovt0lOm4f(~cAmY<65o0ePN*$EX zrmHUhGI1J_t=@d`{#mmFd?eV^Q&jw>g^;Pf)7JHdLzQB*87{77?Kto0xMvGjC=&M5EOW+c zXpXOY6|Uf)0am19ZLde+hX5J6c11*#mSinvk^A4NWc#m5P)?v~|Bppv*0~T;-^rI9{w3{`~5)bC}`nF?zGx z#@S`#(Q@kl-1Fmze)A@u^#@9=c>MA>$*eslP^G`Zvb5N|sKK{mQ*V?4eX_x+nT?*N zalRRl;P=w1HG57g+d^AJQCZh4&g{?mbJZuj*>jJpGL#!`*C>{MRd4-HML#+BNUG#EHx5`rs8QUMda13u9eMG(lKCYTHCS2gO0L&PIU zkkI-^jv5$aR|blKRsJ6xJ^?au7%A7>eD6+l!ALkEL&*RPl442Nll#UeUv)cn5=YV~ zP)$eQ=SZYMG+hSAy@o*c95}KXP7(~*M%`ovFuZos#RM5t0XkRn?DdjD!7zh+HMGoz6C^Gk*}xdzg{VaE0-2L4An_I# z_)DVjA|u=a+{fkuUkWg+!HA~@f87&ENbQ{u_}}LPin9T}}BZ5K1W#~XT5z0gcc+cy7@$?+tH6Ta*1qVBL@ zBwd%m=LAwRv8~~Cx3MfLmwax@N%=M`ciGYizcDPi#Qug{`#^)V(iZGpR*3ayNFiWv zCT;%Yg?Tn;SO3Pvyu6Dolgt$Pq@8;O(nD{uHM<__6!t9UUP@K#N73GQB){T~9Hpci z<4P6T>Kb;ktBMTne4`e~@)E&sIdENQj5G9OYu`7~bvsRTeRl1z?i^aI{)?VNlekCC zXJKVy+B;Z0|Abe1cpfcW)93y`*4%NW#+1!-OVtut{#3Q5fvBQ-b<*gu4x4f6pmz-x)Q8wc+4G^!kGq??b_{28Zdu9+dS0=wgR`1Va^@f*j96v zE?=;Q{AtjKXi>F3-EkrPfL<`s@S z(Cl$t|NBt^_k;7j{U(%~9iLt{7g5yFfhq?^mE$`_Z>W$9l{seeXUdzmz8$X$3_fz0 zNc_d*naeGkU7&S83}C%)Owd-QTjWCq)4F3puS?Y*tOH3*JX`9t7=HyB%;}BFw)~fX zP3M8Ef?E#|5Tf;EuVktd)#&vh7trJcyxkI{{O|eok{tE^hzi3_4LW$*rN)J?Qmy@$ z@GmJ)5nOLC0(h_C(Ayd(aO3hP5pxuMsRZfvoFgBCNNrsu!(1gLl_W1XDWi)1KiM4& z4TFIN4Z44?71-@F^TGn<^DjNF#jfDTD;qdJ36mB3{oK$>kk1T9x32)H^4{v<&J$?GFZQeeKn zog^e?9JHCkaVAg{99*Xytpn)yWZ-y+!;hT(I=Fwaat_Fckc87LJ*r7!)y;@7k^fUK zxl{eySNWG_U%a8X+L`q+Pwk<%iyJN!iw;Q%=1>$p(4~A8CwtPS13^pt$BA_79TEm3 z!hx@gB4KmstaCTszUdc8*ch3y0f@{;*awP0cxYg(J0u?XLQsFzBA;#(`vHd`I*lBM z;(99!j{626=)R8+$DgEz-MfuzaGI&_b*%9#-BUQaw^>IHgp<=gob@UA0r`@#>-qw0 zpfFP4HZ?#}t^J2jFG?J|6<^ALo3?t>Oz5`IuInteCESw+$NTFo3L77A?}>NbqA$vz z-v81kRTwtLT8^1Hkf#X&iRsn`fKmr-Mu&N{*qwp;$qBXyT}BAQ@L;wB^UWEXX)3_b zh&*ke8czIhFd!IxCi_N!jnrKGIQpfPR2xJo1%*JNF^PvDwB;>G~7@ zQVZ23Q}9_P0C|)?QPY(DS0!&Y!!b^`S|XCy zKNy*Kil!;HIXgI}+mn{ko*V0S7_|JPJm`{p{nOe9Vi^>B;a*toh zNY>_;v-=$AgIA44ebwp@a!75wJN7K9j;+SW z8uoQjVUb03=55d=@#Y_9`Fs=Ut|9xs?0ce>@0mn&q+oSJdb^!tTO8;mb$%l));(4- zKPebA@3lPn z@G1otTd9DCo-AAllf-ruy4anJn=H{RXLG>6j;g|@m(&__Lzek=U-sRZzRO1lOrtOJ zm+5k9slTfFKsku7%a$T6ENphjA3uy9eG=kh6ii90n}D&mc!E$-XY)ycsx6qljq9PY zpDzzbG!`4}xmvrE+7f*Jx351b!!}L5XmvDjt;&0$*g9U$nbVZwscA2!5>S?vG~K*d zPzXIIrnkt|yfEO5^dk>cVc0*&Hh$%zYA8nPL(Hwwk?vVuZpJ+&#LxCsujZ^dalGUq zk8X*2y(traI^+1KZEu-(_j%t<)w?tI>hVd#CUfisw!-|mSM{#>X=67C83>oRW^)Nc z_@hYvV5!q}p#c+`qTV9*kqk5GkA6Z;&)MXHw7m;gzS)ito45k#Ejt_oX>5cfTLfXUX@_N^+#UicK@ zbUwcCAj!Nyi??H{sraN8NiTB?aleSuG-iy_c^*{zg2xn*m1e+7rBnP~o!PuP9z$Gcf(C!4f_G&|`v9JI zHr460gE4qwW4yYiYMyx4c#(d_<1JDCcBZLe=D9DE4fC#q8)2D2Dpnaszf0h1)i*7) zxyKd8y*&dyiKySsH2Uj5(~gfdkoWmaI$)6ycN3CquawfZ+R8$$x+k;L>%Fd*;XYy0 zkq~3{maC~f(~h3ZUsXWo-EodvK!+KO{DW8g|IOnpPq%l@9Ky`Dd0%sz0@6$Ox`Aei I20H400LcNok^lez diff --git a/app/src/main/res/mipmap-xxxhdpi/ic_launcher_round.png b/app/src/main/res/mipmap-xxxhdpi/ic_launcher_round.png deleted file mode 100644 index beed3cdd2c32af5114a7dc70b9ef5b698eb8797e..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 15132 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 diff --git a/app/src/main/res/values/colors.xml b/app/src/main/res/values/colors.xml index 12374adc..7f6e2ab1 100644 --- a/app/src/main/res/values/colors.xml +++ b/app/src/main/res/values/colors.xml @@ -8,6 +8,7 @@ #00acc1 #00acc1 #616161 + #e0e0e0 #FFFFFF diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index 71481bb4..c7f648d5 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -10,15 +10,29 @@ Please log in again Forecast for 7 days Forecast today + Today + Tomorrow Clouds Sunset Sunrise Wind speed Humidity Pressure - Stockholm, SE + Stockholm, SE Updated Expected Weather details Temperature + + + Longitude: %.3f, Latitude: %.3f + The GPS signal is unavailable. Please turn Location on. + App requires location permission to show your city weather + locate + Enable GPS + LOCATE CURRENT CITY + Turn on GPS + GPS Enabled + GPS Disabled + Loading weather data for your city... diff --git a/build.gradle b/build.gradle index d8b64881..d9a6cd5f 100644 --- a/build.gradle +++ b/build.gradle @@ -42,16 +42,10 @@ ext{ // Lifecycle lifecycle_version = '2.0.0' - //Browser - browser_version = '1.2.0' - // Reactive rxjava_version = '2.2.3' rxandroid_version = '2.1.1' - // Image - glide_version = '4.8.0' - // Parser gson_version = '2.8.5' @@ -77,6 +71,12 @@ ext{ //Multidex retrofit_version = '2.0.1' + //RefreshLayout + refresh_layout_version = '1.0.0' + + //Gson + gson_version = '2.8.5' + // Tests junit_version = '4.12' espresso_version = '3.1.0' @@ -85,4 +85,6 @@ ext{ test_runner_version = '1.1.1' test_ext_runner_version = '1.1.0' hamcrest_version = '2.1' + + } From 94f0a4ce33c324e4577ea9a6206dbae403b56216 Mon Sep 17 00:00:00 2001 From: snehak24 Date: Tue, 11 Feb 2020 19:45:12 +0530 Subject: [PATCH 6/6] 1. Set current location of the user. 2. Added app launcher icons. --- README.md | 85 ++------- app/build.gradle | 2 +- app/src/main/AndroidManifest.xml | 2 +- .../weatherapp/data/model/LocationData.kt | 4 +- .../weatherapp/data/remote/NetworkService.kt | 9 +- .../data/repository/UserRepository.kt | 6 +- .../data/repository/WeatherRepository.kt | 20 ++- .../di/component/ApplicationComponent.kt | 6 +- .../weatherapp/di/module/ActivityModule.kt | 6 +- .../ui/location/LocationActivity.kt | 3 +- .../ui/location/LocationLiveData.kt | 8 + .../weatherapp/ui/splash/SplashActivity.kt | 17 +- .../weatherapp/ui/splash/SplashViewModel.kt | 14 +- .../weatherapp/ui/weather/WeatherActivity.kt | 4 +- .../weatherapp/ui/weather/WeatherViewModel.kt | 15 +- .../fragment/WeatherFragmentViewModel.kt | 2 +- app/src/main/res/drawable/ic_humidity.xml | 2 +- .../res/drawable/ic_launcher_background.xml | 170 ------------------ .../main/res/layout/activity_selected_day.xml | 4 + app/src/main/res/layout/activity_weather.xml | 3 +- .../res/layout/layout_weather_details.xml | 3 +- .../res/mipmap-anydpi-v26/ic_launcher.xml | 5 - .../res/mipmap-hdpi/ic_launcher_round.png | Bin 0 -> 5444 bytes .../res/mipmap-mdpi/ic_launcher_round.png | Bin 0 -> 2955 bytes .../res/mipmap-xhdpi/ic_launcher_round.png | Bin 0 -> 7155 bytes .../res/mipmap-xxhdpi/ic_launcher_round.png | Bin 0 -> 14111 bytes .../res/mipmap-xxxhdpi/ic_launcher_round.png | Bin 0 -> 19280 bytes 27 files changed, 94 insertions(+), 296 deletions(-) delete mode 100644 app/src/main/res/drawable/ic_launcher_background.xml delete mode 100644 app/src/main/res/mipmap-anydpi-v26/ic_launcher.xml create mode 100644 app/src/main/res/mipmap-hdpi/ic_launcher_round.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_round.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_round.png diff --git a/README.md b/README.md index b3fe3b4f..8cf1b4b8 100644 --- a/README.md +++ b/README.md @@ -1,84 +1,21 @@ -# Work sample - Application developer +# Weather Application - Android -## Assignment +## About +- Simple android to show weather for your current location. +- App is developed in kotlin, demonstrating the use of RxJava2, Retrofit, Dagger2 and implementing MVVM with LiveData. -- Build an awesome weather app that shows the weather at your current location. -- Code it for the platform (Android, iOS, web) you applied for or the one you prefer. - -## Minimum requirements -- Show the weather for your current location -- Use data from provided API (see API DOCS) -- Good usability -- Be visually appealing and follow platform conventions -- Budget: 8-12 hours - -## Assets -You can find some icon assets at [https://github.com/erikflowers/weather-icons](https://github.com/erikflowers/weather-icons) that you can use if you please. You are more than welcome to use other assets that you feel are better fitted for your solution. We do not expect you to be a designer, but since application development on Daresay most often includes visual interfaces we do expect you to to be well aware of your platforms design guidelines and conventions. - -## Expectations -###### User experience -The feature of the app is simple but we expect you to deliver a solution with a high user experience. Imagine this application is to be used by real user with real needs. Maybe your application won’t be as feature-full as many other applications on the market, but at least make it interesting, fun and intuitive to use. Of course you are allowed to extend your applications functionality. We appreciate solutions that exceed our expectations. - -###### Code -We expect that the code is of high quality and under source control. Expect the solution to be continuously worked on by other developers and should therefore be easy to understand, adjust and extend. True beauty starts on the inside! - -## Delivery -Fork the repository, code in your fork and make a pull request when done. Also send us an e-mail to let us know when you are done! - -### Good luck! - ---- - - -# API DOCS +## General flow of data +- Check if the current location is set for the app, if not set then retrieve lat-long of the user location. +- If the location is set, show the weather for the current location. +- Show weather forecast for the current day and forecast the entire week. +- Show weather details for the selected day of the week. ## Base url http://worksample-api.herokuapp.com - - -http://worksample-api.herokuapp.com is a simple wrapper of some of the endpoints provided on http://openweathermap.org/. - -## Available Endpoints and Documentation -- http://worksample-api.herokuapp.com/weather [documentation](http://openweathermap.org/current) -- http://worksample-api.herokuapp.com/forecast [documentation](http://openweathermap.org/forecast5) -- http://worksample-api.herokuapp.com/forecast/daily [documentation](http://openweathermap.org/forecast16) - -We always respond in JSON and metrics. -We also don’t support these features of the OpenWeatherMap API: - -- Bulk downloading -- Search Accuracy (like/accuracy) -- Limitation of result -- Units format -- Multilingual support -- Callback functions for javascript. -​ - -## You can use these parameters +- It is a simple wrapper of some of the endpoints provided on http://openweathermap.org/. #### API key (mandatory) -The API-key is required for all API calls. It should have been sent to you together with the instructions asking you to do the work sample. - -#### By city name: -City name and country code divided by comma, use ISO 3166 country codes. - -`?q={city name},{country code}` - -`?q={city name}` -​ -#### By city id: -List of city ID:s can be downloaded [here](http://bulk.openweathermap.org/sample/) - -`?id={id}` -​ -#### By geographic coordinates: -Coordinates of the location of your interest - -`?lat={lat}&lon={lon}` -​ -#### By Zip Code -`?zip={zip code},{country code}` +The API-key is required for all API calls. ##An example request: - [http://worksample-api.herokuapp.com/weather?q=Stockholm,SE&key={API_KEY}](http://worksample-api.herokuapp.com/weather?q=Stockholm,SE&key={API_KEY}) diff --git a/app/build.gradle b/app/build.gradle index 6f577a37..25d5fb05 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -24,7 +24,7 @@ android { buildTypes { debug { buildConfigField("String", "BASE_URL", "\"https://worksample-api.herokuapp.com/\"") - buildConfigField("String", "API_KEY", "\"HBNA19QVVAPP\"") + buildConfigField("String", "API_KEY", "\"\"") } release { minifyEnabled false diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index b9396c97..000853eb 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -13,7 +13,7 @@ diff --git a/app/src/main/java/com/sneha/weatherapp/data/model/LocationData.kt b/app/src/main/java/com/sneha/weatherapp/data/model/LocationData.kt index 02d35e94..61952422 100644 --- a/app/src/main/java/com/sneha/weatherapp/data/model/LocationData.kt +++ b/app/src/main/java/com/sneha/weatherapp/data/model/LocationData.kt @@ -1,6 +1,6 @@ package com.sneha.weatherapp.data.model data class LocationData( - val longitude: Double, - val latitude: Double + val longitude: Double?, + val latitude: Double? ) \ No newline at end of file diff --git a/app/src/main/java/com/sneha/weatherapp/data/remote/NetworkService.kt b/app/src/main/java/com/sneha/weatherapp/data/remote/NetworkService.kt index 0bade630..64cf52f4 100644 --- a/app/src/main/java/com/sneha/weatherapp/data/remote/NetworkService.kt +++ b/app/src/main/java/com/sneha/weatherapp/data/remote/NetworkService.kt @@ -13,20 +13,23 @@ interface NetworkService { @GET(Endpoints.WEATHER) fun getWeatherData( - @Query("q") cityName: String, + @Query("lat") latitude: String?, + @Query("lon") longitude: String?, @Query(Networking.HEADER_API_KEY) apiKey: String = Networking.API_KEY // default value set when Networking create is called ): Single @GET(Endpoints.FORECAST) fun getTodayForecast( - @Query("id") cityId: Long, + @Query("lat") latitude: String?, + @Query("lon") longitude: String?, @Query("cnt") count: Int, @Query(Networking.HEADER_API_KEY) apiKey: String = Networking.API_KEY ): Single @GET(Endpoints.FORECAST_DAILY) fun getDailyForecast( - @Query("id") cityId: Long, + @Query("lat") latitude: String?, + @Query("lon") longitude: String?, @Query("cnt") count: Int, @Query(Networking.HEADER_API_KEY) apiKey: String = Networking.API_KEY ): Single diff --git a/app/src/main/java/com/sneha/weatherapp/data/repository/UserRepository.kt b/app/src/main/java/com/sneha/weatherapp/data/repository/UserRepository.kt index 3ec606c2..d0f3dd05 100644 --- a/app/src/main/java/com/sneha/weatherapp/data/repository/UserRepository.kt +++ b/app/src/main/java/com/sneha/weatherapp/data/repository/UserRepository.kt @@ -1,17 +1,15 @@ package com.sneha.weatherapp.data.repository -import com.sneha.weatherapp.data.local.db.DatabaseService import com.sneha.weatherapp.data.local.prefs.UserPreferences import com.sneha.weatherapp.data.model.LocationData import com.sneha.weatherapp.data.model.User -import com.sneha.weatherapp.data.remote.NetworkService import javax.inject.Inject import javax.inject.Singleton @Singleton class UserRepository @Inject constructor( - private val networkService: NetworkService, - private val databaseService: DatabaseService, +// private val networkService: NetworkService, +// private val databaseService: DatabaseService, private val userPreferences: UserPreferences ) { diff --git a/app/src/main/java/com/sneha/weatherapp/data/repository/WeatherRepository.kt b/app/src/main/java/com/sneha/weatherapp/data/repository/WeatherRepository.kt index e8ee2b52..39b6ece7 100644 --- a/app/src/main/java/com/sneha/weatherapp/data/repository/WeatherRepository.kt +++ b/app/src/main/java/com/sneha/weatherapp/data/repository/WeatherRepository.kt @@ -1,6 +1,8 @@ package com.sneha.weatherapp.data.repository import com.sneha.weatherapp.data.local.db.DatabaseService +import com.sneha.weatherapp.data.local.prefs.UserPreferences +import com.sneha.weatherapp.data.model.LocationData import com.sneha.weatherapp.data.model.Weather import com.sneha.weatherapp.data.remote.NetworkService import com.sneha.weatherapp.data.remote.response.DailyForecastResponse @@ -10,15 +12,19 @@ import javax.inject.Inject class WeatherRepository @Inject constructor( private val networkService: NetworkService, - private val databaseService: DatabaseService + private val databaseService: DatabaseService, + private val userPreferences: UserPreferences ) { - fun fetchWeatherData(cityName: String): Single = - networkService.getWeatherData(cityName = cityName) + fun getLocationData () : LocationData = LocationData(userPreferences.getLongitude()?.toDouble(), + userPreferences.getLatitude()?.toDouble()) - fun fetchTodayForecast(cityId: Long): Single = - networkService.getTodayForecast(cityId, 7) + fun fetchWeatherData(): Single = + networkService.getWeatherData(userPreferences.getLatitude(), userPreferences.getLongitude()) - fun fetchDailyForecast(cityId: Long): Single = - networkService.getDailyForecast(cityId, 7) + fun fetchTodayForecast(): Single = + networkService.getTodayForecast(userPreferences.getLatitude(),userPreferences.getLongitude(), 7) + + fun fetchDailyForecast(): Single = + networkService.getDailyForecast(userPreferences.getLatitude(),userPreferences.getLongitude(), 7) } \ No newline at end of file diff --git a/app/src/main/java/com/sneha/weatherapp/di/component/ApplicationComponent.kt b/app/src/main/java/com/sneha/weatherapp/di/component/ApplicationComponent.kt index 11b9b283..954a179b 100644 --- a/app/src/main/java/com/sneha/weatherapp/di/component/ApplicationComponent.kt +++ b/app/src/main/java/com/sneha/weatherapp/di/component/ApplicationComponent.kt @@ -3,13 +3,11 @@ package com.sneha.weatherapp.di.component import android.app.Application import android.content.Context import android.content.SharedPreferences -import android.location.Geocoder -import com.google.android.gms.location.FusedLocationProviderClient -import com.google.android.gms.location.LocationRequest import com.sneha.weatherapp.WeatherApplication import com.sneha.weatherapp.data.local.db.DatabaseService import com.sneha.weatherapp.data.remote.NetworkService import com.sneha.weatherapp.data.repository.UserRepository +import com.sneha.weatherapp.data.repository.WeatherRepository import com.sneha.weatherapp.di.ApplicationContext import com.sneha.weatherapp.di.module.ApplicationModule import com.sneha.weatherapp.utils.network.NetworkHelper @@ -58,6 +56,8 @@ interface ApplicationComponent { */ fun getUserRepository(): UserRepository + fun getWeatherRepository(): WeatherRepository + fun getSchedulerProvider(): SchedulerProvider fun getCompositeDisposable(): CompositeDisposable diff --git a/app/src/main/java/com/sneha/weatherapp/di/module/ActivityModule.kt b/app/src/main/java/com/sneha/weatherapp/di/module/ActivityModule.kt index 16bb2a3c..e621ed13 100644 --- a/app/src/main/java/com/sneha/weatherapp/di/module/ActivityModule.kt +++ b/app/src/main/java/com/sneha/weatherapp/di/module/ActivityModule.kt @@ -2,8 +2,8 @@ package com.sneha.weatherapp.di.module import androidx.lifecycle.ViewModelProviders import androidx.recyclerview.widget.LinearLayoutManager +import com.sneha.weatherapp.data.local.prefs.UserPreferences import com.sneha.weatherapp.data.repository.WeatherRepository -import com.sneha.weatherapp.data.repository.UserRepository import com.sneha.weatherapp.ui.base.BaseActivity import com.sneha.weatherapp.ui.weather.WeatherViewModel import com.sneha.weatherapp.ui.splash.SplashViewModel @@ -31,10 +31,10 @@ class ActivityModule(private val activity: BaseActivity<*>) { schedulerProvider: SchedulerProvider, compositeDisposable: CompositeDisposable, networkHelper: NetworkHelper, - userRepository: UserRepository + weatherRepository: WeatherRepository ): SplashViewModel = ViewModelProviders.of( activity, ViewModelProviderFactory(SplashViewModel::class) { - SplashViewModel(schedulerProvider, compositeDisposable, networkHelper, userRepository) + SplashViewModel(schedulerProvider, compositeDisposable, networkHelper, weatherRepository) //this lambda creates and return SplashViewModel }).get(SplashViewModel::class.java) diff --git a/app/src/main/java/com/sneha/weatherapp/ui/location/LocationActivity.kt b/app/src/main/java/com/sneha/weatherapp/ui/location/LocationActivity.kt index 79dd0a2c..3f0d6623 100644 --- a/app/src/main/java/com/sneha/weatherapp/ui/location/LocationActivity.kt +++ b/app/src/main/java/com/sneha/weatherapp/ui/location/LocationActivity.kt @@ -11,6 +11,7 @@ import androidx.core.app.ActivityCompat import androidx.lifecycle.Observer import androidx.lifecycle.ViewModelProviders import com.sneha.weatherapp.R +import com.sneha.weatherapp.ui.weather.WeatherActivity import com.sneha.weatherapp.utils.ViewModelProviderFactory import kotlinx.android.synthetic.main.activity_location.* @@ -69,7 +70,7 @@ class LocationActivity : AppCompatActivity() { // latLong.text = getString(R.string.latLong, it.longitude, it.latitude) latLong.text = getString(R.string.loading_data) finish() -// startActivity(Intent(applicationContext, WeatherActivity::class.java)) + startActivity(Intent(applicationContext, WeatherActivity::class.java)) }) } diff --git a/app/src/main/java/com/sneha/weatherapp/ui/location/LocationLiveData.kt b/app/src/main/java/com/sneha/weatherapp/ui/location/LocationLiveData.kt index fba1a7df..f95ab148 100644 --- a/app/src/main/java/com/sneha/weatherapp/ui/location/LocationLiveData.kt +++ b/app/src/main/java/com/sneha/weatherapp/ui/location/LocationLiveData.kt @@ -2,15 +2,19 @@ package com.sneha.weatherapp.ui.location import android.annotation.SuppressLint import android.app.Application +import android.content.Context import android.location.Location import androidx.lifecycle.LiveData import com.google.android.gms.location.* +import com.sneha.weatherapp.data.local.prefs.UserPreferences import com.sneha.weatherapp.data.model.LocationData class LocationLiveData(context: Application) : LiveData() { private var fusedLocationClient = LocationServices.getFusedLocationProviderClient(context) + private var sharedPreference = + context.getSharedPreferences("weather-app-prefs", Context.MODE_PRIVATE) override fun onInactive() { super.onInactive() @@ -53,6 +57,10 @@ class LocationLiveData(context: Application) : longitude = location.longitude, latitude = location.latitude ) + + val userPreferences = UserPreferences(sharedPreference) + userPreferences.setLatitude(location.latitude.toString()) + userPreferences.setLongitude(location.longitude.toString()) } companion object { diff --git a/app/src/main/java/com/sneha/weatherapp/ui/splash/SplashActivity.kt b/app/src/main/java/com/sneha/weatherapp/ui/splash/SplashActivity.kt index b6d2892b..2edd906c 100644 --- a/app/src/main/java/com/sneha/weatherapp/ui/splash/SplashActivity.kt +++ b/app/src/main/java/com/sneha/weatherapp/ui/splash/SplashActivity.kt @@ -6,8 +6,8 @@ import androidx.lifecycle.Observer import com.sneha.weatherapp.R import com.sneha.weatherapp.di.component.ActivityComponent import com.sneha.weatherapp.ui.base.BaseActivity +import com.sneha.weatherapp.ui.location.LocationActivity import com.sneha.weatherapp.ui.weather.WeatherActivity -import com.sneha.weatherapp.utils.common.Event class SplashActivity : BaseActivity() { @@ -28,10 +28,19 @@ class SplashActivity : BaseActivity() { override fun setupObservers() { // Event is used by the view model to tell the activity to launch another activity // view model also provided the Bundle in the event that is needed for the Activity - viewModel.launchWeather.observe(this, Observer>> { - it.getIfNotHandled()?.run { - finish() +// viewModel.launchWeather.observe(this, Observer>> { +// it.getIfNotHandled()?.run { +// finish() +// startActivity(Intent(applicationContext, LocationActivity::class.java)) +// } +// }) + + viewModel.locationLiveData.observe(this, Observer { + finish() + if (it.latitude != null && it.longitude != null) { startActivity(Intent(applicationContext, WeatherActivity::class.java)) + } else { + startActivity(Intent(applicationContext, LocationActivity::class.java)) } }) } diff --git a/app/src/main/java/com/sneha/weatherapp/ui/splash/SplashViewModel.kt b/app/src/main/java/com/sneha/weatherapp/ui/splash/SplashViewModel.kt index bb880839..07bd43ca 100644 --- a/app/src/main/java/com/sneha/weatherapp/ui/splash/SplashViewModel.kt +++ b/app/src/main/java/com/sneha/weatherapp/ui/splash/SplashViewModel.kt @@ -1,9 +1,10 @@ package com.sneha.weatherapp.ui.splash import androidx.lifecycle.MutableLiveData -import com.sneha.weatherapp.data.repository.UserRepository +import com.sneha.weatherapp.data.local.prefs.UserPreferences +import com.sneha.weatherapp.data.model.LocationData +import com.sneha.weatherapp.data.repository.WeatherRepository import com.sneha.weatherapp.ui.base.BaseViewModel -import com.sneha.weatherapp.utils.common.Event import com.sneha.weatherapp.utils.network.NetworkHelper import com.sneha.weatherapp.utils.rx.SchedulerProvider import io.reactivex.disposables.CompositeDisposable @@ -16,23 +17,26 @@ class SplashViewModel( schedulerProvider: SchedulerProvider, compositeDisposable: CompositeDisposable, networkHelper: NetworkHelper, - val userRepository: UserRepository + weatherRepository: WeatherRepository ) : BaseViewModel(schedulerProvider, compositeDisposable, networkHelper) { // Event is used by the view model to tell the activity to launch another Activity // view model also provided the Bundle in the event that is needed for the Activity - val launchWeather: MutableLiveData>> = MutableLiveData() +// val launchWeather: MutableLiveData>> = MutableLiveData() + val locationLiveData: MutableLiveData = MutableLiveData() init { GlobalScope.launch { delay(3000) } + + locationLiveData.value = weatherRepository.getLocationData() } override fun onCreate() { // Empty Bundle passed to Activity in Event that is needed by the other Activity // Here in actual application we will decide which screen to open based on // either the user is logged in or not - launchWeather.postValue(Event(emptyMap())) +// launchWeather.postValue(Event(emptyMap())) } } \ No newline at end of file diff --git a/app/src/main/java/com/sneha/weatherapp/ui/weather/WeatherActivity.kt b/app/src/main/java/com/sneha/weatherapp/ui/weather/WeatherActivity.kt index 36e1c5b7..7d32fdc6 100644 --- a/app/src/main/java/com/sneha/weatherapp/ui/weather/WeatherActivity.kt +++ b/app/src/main/java/com/sneha/weatherapp/ui/weather/WeatherActivity.kt @@ -17,6 +17,7 @@ import kotlinx.android.synthetic.main.layout_weather_details.* import javax.inject.Inject import com.sneha.weatherapp.data.model.Weather import com.sneha.weatherapp.ui.weather.adapter.ClickListener +import kotlinx.android.synthetic.main.activity_location.* import javax.inject.Named @@ -96,9 +97,10 @@ class WeatherActivity : BaseActivity() { } private fun setWeatherData(weather: Weather) { - tv_today_label.visibility = View.VISIBLE + tv_city_name.visibility = View.VISIBLE weather_details.visibility = View.VISIBLE tv_today_weather_details.visibility = View.VISIBLE + tv_city_name.text = weather.cityName tv_updated_at.text = getString(R.string.updated).plus(" ").plus(TimeUtils.getTimeAgo(weather.dt)) tv_pressure.text = weather.main.pressure.toString().plus(" ").plus("hpa") tv_humidity.text = weather.main.humidity.toString().plus("%") diff --git a/app/src/main/java/com/sneha/weatherapp/ui/weather/WeatherViewModel.kt b/app/src/main/java/com/sneha/weatherapp/ui/weather/WeatherViewModel.kt index 05145ec0..4ee55708 100644 --- a/app/src/main/java/com/sneha/weatherapp/ui/weather/WeatherViewModel.kt +++ b/app/src/main/java/com/sneha/weatherapp/ui/weather/WeatherViewModel.kt @@ -23,8 +23,10 @@ class WeatherViewModel( ) : BaseViewModel(schedulerProvider, compositeDisposable, networkHelper) { private val weatherLiveData: MutableLiveData> = MutableLiveData() - private val forecastLiveData: MutableLiveData> = MutableLiveData() - private val dailyForecastLiveData: MutableLiveData> = MutableLiveData() + private val forecastLiveData: MutableLiveData> = + MutableLiveData() + private val dailyForecastLiveData: MutableLiveData> = + MutableLiveData() fun getWeatherData(): LiveData = Transformations.map(weatherLiveData) { @@ -35,7 +37,8 @@ class WeatherViewModel( it.data } - fun getDailyForecastData(): LiveData = Transformations.map(dailyForecastLiveData) { + fun getDailyForecastData(): LiveData = + Transformations.map(dailyForecastLiveData) { it.data } @@ -48,7 +51,7 @@ class WeatherViewModel( if (forecastLiveData.value == null && checkInternetConnectionWithMessage()) { forecastLiveData.postValue(Resource.loading()) compositeDisposable.add( - weatherRepository.fetchTodayForecast(2673730) + weatherRepository.fetchTodayForecast() .subscribeOn(schedulerProvider.io()) .subscribe( { forecastLiveData.postValue(Resource.success(it)) }, @@ -62,7 +65,7 @@ class WeatherViewModel( if (dailyForecastLiveData.value == null && checkInternetConnectionWithMessage()) { dailyForecastLiveData.postValue(Resource.loading()) compositeDisposable.add( - weatherRepository.fetchDailyForecast(2673730) + weatherRepository.fetchDailyForecast() .subscribeOn(schedulerProvider.io()) .subscribe( { dailyForecastLiveData.postValue(Resource.success(it)) }, @@ -76,7 +79,7 @@ class WeatherViewModel( private fun callWeatherApi() { compositeDisposable.add( - weatherRepository.fetchWeatherData("Stockholm,SE") + weatherRepository.fetchWeatherData() .subscribeOn(schedulerProvider.io()) .subscribe({ weatherLiveData.postValue(Resource.success(it)) diff --git a/app/src/main/java/com/sneha/weatherapp/ui/weather/fragment/WeatherFragmentViewModel.kt b/app/src/main/java/com/sneha/weatherapp/ui/weather/fragment/WeatherFragmentViewModel.kt index 788fba18..dd15bd8a 100644 --- a/app/src/main/java/com/sneha/weatherapp/ui/weather/fragment/WeatherFragmentViewModel.kt +++ b/app/src/main/java/com/sneha/weatherapp/ui/weather/fragment/WeatherFragmentViewModel.kt @@ -32,7 +32,7 @@ class WeatherFragmentViewModel( if (weatherLiveData.value == null && checkInternetConnectionWithMessage()) { weatherLiveData.postValue(Resource.loading()) compositeDisposable.add( - weatherRepository.fetchWeatherData("Stockholm,SE") + weatherRepository.fetchWeatherData() .subscribeOn(schedulerProvider.io()) .subscribe( { weatherLiveData.postValue(Resource.success(it)) }, diff --git a/app/src/main/res/drawable/ic_humidity.xml b/app/src/main/res/drawable/ic_humidity.xml index 46eb5e26..aa7c4e27 100644 --- a/app/src/main/res/drawable/ic_humidity.xml +++ b/app/src/main/res/drawable/ic_humidity.xml @@ -1,6 +1,6 @@ - + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/app/src/main/res/layout/activity_selected_day.xml b/app/src/main/res/layout/activity_selected_day.xml index 1bd7f9f3..e54acc58 100644 --- a/app/src/main/res/layout/activity_selected_day.xml +++ b/app/src/main/res/layout/activity_selected_day.xml @@ -65,6 +65,7 @@ android:id="@+id/pressure" android:layout_width="35dp" android:layout_height="35dp" + android:tint="@color/textColor" android:src="@drawable/ic_pressure" /> + android:src="@drawable/ic_humidity"/> - - - - \ No newline at end of file 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..129361437e68c22876eb98916a960b8bb2a3818d GIT binary patch literal 5444 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 z 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 d9cb8>`+qK4(|Xic|%WCWIyk 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 D{Pev~ literal 0 HcmV?d00001