Quellcode durchsuchen

Moved Features to different Modules

Carles Sentis vor 1 Jahr
Ursprung
Commit
d65b2427a0
100 geänderte Dateien mit 668 neuen und 267 gelöschten Zeilen
  1. 3 14
      app/build.gradle.kts
  2. 11 7
      app/src/main/java/com/example/weather/app/ui/MainActivity.kt
  3. 0 25
      app/src/main/java/com/example/weather/di/AppModule.kt
  4. 0 27
      app/src/main/java/com/example/weather/feature/weather/data/repository/WeatherRepositoryImpl.kt
  5. 0 20
      app/src/main/java/com/example/weather/feature/weather/di/LocationModule.kt
  6. 0 23
      app/src/main/java/com/example/weather/feature/weather/di/RepositoryModule.kt
  7. 0 9
      app/src/main/java/com/example/weather/feature/weather/domain/repository/WeatherRepository.kt
  8. 0 10
      app/src/main/java/com/example/weather/feature/weather/presentation/mvi/WeatherEvent.kt
  9. 2 1
      build.gradle.kts
  10. 1 0
      feature/common/.gitignore
  11. 69 0
      feature/common/build.gradle.kts
  12. 0 0
      feature/common/consumer-rules.pro
  13. 21 0
      feature/common/proguard-rules.pro
  14. 24 0
      feature/common/src/androidTest/java/com/trifork/feature/common/ExampleInstrumentedTest.kt
  15. 4 0
      feature/common/src/main/AndroidManifest.xml
  16. 20 0
      feature/common/src/main/java/com/trifork/feature/common/di/FeatureModule.kt
  17. 1 1
      feature/common/src/main/java/com/trifork/feature/common/dispatcher/DispatcherProvider.kt
  18. 1 1
      feature/common/src/main/java/com/trifork/feature/common/dispatcher/StandardDispatcherProvider.kt
  19. 1 1
      feature/common/src/main/java/com/trifork/feature/common/dispatcher/TestDispatcherProvider.kt
  20. 1 1
      feature/common/src/main/java/com/trifork/feature/common/mvi/StateReducerFlow.kt
  21. 1 1
      feature/common/src/main/java/com/trifork/feature/common/navigation/Screen.kt
  22. 1 1
      feature/common/src/main/java/com/trifork/feature/common/util/Resouce.kt
  23. 17 0
      feature/common/src/test/java/com/trifork/feature/common/ExampleUnitTest.kt
  24. 1 0
      feature/geocoding/.gitignore
  25. 85 0
      feature/geocoding/build.gradle.kts
  26. 0 0
      feature/geocoding/consumer-rules.pro
  27. 21 0
      feature/geocoding/proguard-rules.pro
  28. 24 0
      feature/geocoding/src/androidTest/java/com/trifork/feature/geocoding/ExampleInstrumentedTest.kt
  29. 4 0
      feature/geocoding/src/main/AndroidManifest.xml
  30. 1 1
      feature/geocoding/src/main/java/com/trifork/feature/geocoding/data/local/GeoLocationEntity.kt
  31. 1 1
      feature/geocoding/src/main/java/com/trifork/feature/geocoding/data/local/GeocodingDB.kt
  32. 1 3
      feature/geocoding/src/main/java/com/trifork/feature/geocoding/data/local/GeocodingDao.kt
  33. 4 4
      feature/geocoding/src/main/java/com/trifork/feature/geocoding/data/mappers/GeocodingMappers.kt
  34. 1 1
      feature/geocoding/src/main/java/com/trifork/feature/geocoding/data/remote/GeoLocationDto.kt
  35. 1 1
      feature/geocoding/src/main/java/com/trifork/feature/geocoding/data/remote/GeocodingApi.kt
  36. 1 1
      feature/geocoding/src/main/java/com/trifork/feature/geocoding/data/remote/GeocodingDto.kt
  37. 8 8
      feature/geocoding/src/main/java/com/trifork/feature/geocoding/data/repository/GeocodingRepositoryImpl.kt
  38. 3 5
      feature/geocoding/src/main/java/com/trifork/feature/geocoding/di/FeatureModule.kt
  39. 3 4
      feature/geocoding/src/main/java/com/trifork/feature/geocoding/di/RepositoryModule.kt
  40. 1 1
      feature/geocoding/src/main/java/com/trifork/feature/geocoding/domain/model/GeoLocation.kt
  41. 3 3
      feature/geocoding/src/main/java/com/trifork/feature/geocoding/domain/repository/GeocodingRepository.kt
  42. 10 9
      feature/geocoding/src/main/java/com/trifork/feature/geocoding/presentation/GeocodingViewModel.kt
  43. 5 5
      feature/geocoding/src/main/java/com/trifork/feature/geocoding/presentation/components/GeocodingScreen.kt
  44. 1 1
      feature/geocoding/src/main/java/com/trifork/feature/geocoding/presentation/mvi/GeoAction.kt
  45. 2 2
      feature/geocoding/src/main/java/com/trifork/feature/geocoding/presentation/mvi/GeoEvent.kt
  46. 2 2
      feature/geocoding/src/main/java/com/trifork/feature/geocoding/presentation/mvi/GeoState.kt
  47. 17 0
      feature/geocoding/src/test/java/com/trifork/feature/geocoding/ExampleUnitTest.kt
  48. 1 0
      feature/weather/.gitignore
  49. 91 0
      feature/weather/build.gradle.kts
  50. 0 0
      feature/weather/consumer-rules.pro
  51. 21 0
      feature/weather/proguard-rules.pro
  52. 24 0
      feature/weather/src/androidTest/java/com/trifork/feature/weather/ExampleInstrumentedTest.kt
  53. 5 0
      feature/weather/src/main/AndroidManifest.xml
  54. 2 2
      feature/weather/src/main/java/com/trifork/feature/weather/data/location/DefaultLocationTracker.kt
  55. 20 16
      feature/weather/src/main/java/com/trifork/feature/weather/data/mappers/WeatherMappers.kt
  56. 1 1
      feature/weather/src/main/java/com/trifork/feature/weather/data/remote/SunDataDto.kt
  57. 1 1
      feature/weather/src/main/java/com/trifork/feature/weather/data/remote/WeatherApi.kt
  58. 1 1
      feature/weather/src/main/java/com/trifork/feature/weather/data/remote/WeatherDataDto.kt
  59. 1 1
      feature/weather/src/main/java/com/trifork/feature/weather/data/remote/WeatherDto.kt
  60. 23 0
      feature/weather/src/main/java/com/trifork/feature/weather/data/repository/WeatherRepositoryImpl.kt
  61. 2 4
      feature/weather/src/main/java/com/trifork/feature/weather/di/FeatureModule.kt
  62. 17 0
      feature/weather/src/main/java/com/trifork/feature/weather/di/LocationModule.kt
  63. 17 0
      feature/weather/src/main/java/com/trifork/feature/weather/di/RepositoryModule.kt
  64. 1 1
      feature/weather/src/main/java/com/trifork/feature/weather/domain/location/LocationTracker.kt
  65. 1 1
      feature/weather/src/main/java/com/trifork/feature/weather/domain/model/SunData.kt
  66. 1 1
      feature/weather/src/main/java/com/trifork/feature/weather/domain/model/WeatherData.kt
  67. 1 1
      feature/weather/src/main/java/com/trifork/feature/weather/domain/model/WeatherInfo.kt
  68. 1 1
      feature/weather/src/main/java/com/trifork/feature/weather/domain/model/WeatherLocation.kt
  69. 2 2
      feature/weather/src/main/java/com/trifork/feature/weather/domain/model/WeatherType.kt
  70. 10 0
      feature/weather/src/main/java/com/trifork/feature/weather/domain/repository/WeatherRepository.kt
  71. 10 10
      feature/weather/src/main/java/com/trifork/feature/weather/presentation/WeatherViewModel.kt
  72. 2 2
      feature/weather/src/main/java/com/trifork/feature/weather/presentation/components/HourlyWeatherDisplay.kt
  73. 10 6
      feature/weather/src/main/java/com/trifork/feature/weather/presentation/components/WeatherCard.kt
  74. 1 1
      feature/weather/src/main/java/com/trifork/feature/weather/presentation/components/WeatherDataDisplay.kt
  75. 5 7
      feature/weather/src/main/java/com/trifork/feature/weather/presentation/components/WeatherForecast.kt
  76. 7 10
      feature/weather/src/main/java/com/trifork/feature/weather/presentation/components/WeatherScreen.kt
  77. 9 0
      feature/weather/src/main/java/com/trifork/feature/weather/presentation/mvi/WeatherEvent.kt
  78. 2 4
      feature/weather/src/main/java/com/trifork/feature/weather/presentation/mvi/WeatherState.kt
  79. 0 0
      feature/weather/src/main/res/drawable/ic_clear_day.xml
  80. 0 0
      feature/weather/src/main/res/drawable/ic_clear_night.xml
  81. 0 0
      feature/weather/src/main/res/drawable/ic_dense_drizzel_day.xml
  82. 0 0
      feature/weather/src/main/res/drawable/ic_dense_drizzel_night.xml
  83. 0 0
      feature/weather/src/main/res/drawable/ic_drop.xml
  84. 0 0
      feature/weather/src/main/res/drawable/ic_fog_day.xml
  85. 0 0
      feature/weather/src/main/res/drawable/ic_fog_night.xml
  86. 0 0
      feature/weather/src/main/res/drawable/ic_foggy.xml
  87. 0 0
      feature/weather/src/main/res/drawable/ic_frost_day.xml
  88. 0 0
      feature/weather/src/main/res/drawable/ic_frost_night.xml
  89. 0 0
      feature/weather/src/main/res/drawable/ic_heavy_rain.xml
  90. 0 0
      feature/weather/src/main/res/drawable/ic_heavy_snow.xml
  91. 0 0
      feature/weather/src/main/res/drawable/ic_heavy_snow_day.xml
  92. 0 0
      feature/weather/src/main/res/drawable/ic_heavy_snow_night.xml
  93. 0 0
      feature/weather/src/main/res/drawable/ic_heavy_thunderstorm.xml
  94. 0 0
      feature/weather/src/main/res/drawable/ic_light_drizzel_day.xml
  95. 0 0
      feature/weather/src/main/res/drawable/ic_light_drizzel_night.xml
  96. 0 0
      feature/weather/src/main/res/drawable/ic_light_rain.xml
  97. 0 0
      feature/weather/src/main/res/drawable/ic_light_snow.xml
  98. 0 0
      feature/weather/src/main/res/drawable/ic_light_snow_day.xml
  99. 0 0
      feature/weather/src/main/res/drawable/ic_mainly_clear_day.xml
  100. 0 0
      feature/weather/src/main/res/drawable/ic_mainly_clear_night.xml

+ 3 - 14
app/build.gradle.kts

@@ -55,6 +55,9 @@ android {
 }
 
 dependencies {
+    implementation(project(mapOf("path" to ":feature:common")))
+    implementation(project(mapOf("path" to ":feature:geocoding")))
+    implementation(project(mapOf("path" to ":feature:weather")))
 
     implementation(libs.androidx.core.ktx)
     implementation(libs.androidx.lifecycle.runtime.ktx)
@@ -68,25 +71,11 @@ dependencies {
     implementation("androidx.compose.ui:ui-tooling-preview")
     implementation("androidx.compose.material3:material3")
 
-    implementation(libs.kotlinx.collections.immutable)
-
     //Dagger - Hilt
     implementation(libs.hilt.android)
     implementation(libs.androidx.constraintlayout)
     ksp(libs.hilt.android.compiler)
 
-    // Location Services
-    implementation(libs.android.play.services.location)
-
-    // Retrofit
-    implementation(libs.retrofit.retrofit)
-    implementation(libs.retrofit.converter.moshi)
-
-    // Room
-    implementation(libs.room.runtime)
-    annotationProcessor(libs.room.compiler)
-    ksp(libs.room.compiler)
-
     testImplementation(libs.junit.junit)
     androidTestImplementation(libs.androidx.junit)
     androidTestImplementation(libs.espresso.core)

+ 11 - 7
app/src/main/java/com/example/weather/app/ui/MainActivity.kt

@@ -9,13 +9,13 @@ import androidx.navigation.compose.NavHost
 import androidx.navigation.compose.composable
 import androidx.navigation.compose.rememberNavController
 import androidx.navigation.navArgument
-import com.example.weather.app.navigation.Screen
 import com.example.weather.app.ui.theme.WeatherTheme
-import com.example.weather.feature.geocoding.presentation.GeocodingViewModel
-import com.example.weather.feature.geocoding.presentation.components.GeocodingScreen
-import com.example.weather.feature.weather.domain.model.WeatherLocation
-import com.example.weather.feature.weather.presentation.WeatherViewModel
-import com.example.weather.feature.weather.presentation.components.WeatherScreen
+import com.trifork.feature.common.navigation.Screen
+import com.trifork.feature.geocoding.presentation.GeocodingViewModel
+import com.trifork.feature.geocoding.presentation.components.GeocodingScreen
+import com.trifork.feature.weather.domain.model.WeatherLocation
+import com.trifork.feature.weather.presentation.WeatherViewModel
+import com.trifork.feature.weather.presentation.components.WeatherScreen
 import dagger.hilt.android.AndroidEntryPoint
 
 @AndroidEntryPoint
@@ -51,7 +51,11 @@ class MainActivity : ComponentActivity() {
                             )
                         }
                         val viewModel by viewModels<WeatherViewModel>()
-                        WeatherScreen(navController, viewModel, geoLocation)
+                        WeatherScreen(
+                            navController,
+                            viewModel,
+                            geoLocation
+                        )
                     }
                     composable(Screen.Geocoding.route) {
                         val viewModel by viewModels<GeocodingViewModel>()

+ 0 - 25
app/src/main/java/com/example/weather/di/AppModule.kt

@@ -1,25 +0,0 @@
-package com.example.weather.di
-
-import com.example.weather.feature.common.dispatcher.DispatcherProvider
-import com.example.weather.feature.common.dispatcher.StandardDispatcherProvider
-import com.example.weather.feature.weather.data.remote.WeatherApi
-import dagger.Binds
-import dagger.Module
-import dagger.Provides
-import dagger.hilt.InstallIn
-import dagger.hilt.components.SingletonComponent
-import retrofit2.Retrofit
-import retrofit2.converter.moshi.MoshiConverterFactory
-import retrofit2.create
-import javax.inject.Singleton
-
-@Module
-@InstallIn(SingletonComponent::class)
-object AppModule {
-
-    @Provides
-    @Singleton
-    fun providesDispatcherProvider(): DispatcherProvider {
-        return StandardDispatcherProvider()
-    }
-}

+ 0 - 27
app/src/main/java/com/example/weather/feature/weather/data/repository/WeatherRepositoryImpl.kt

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

+ 0 - 20
app/src/main/java/com/example/weather/feature/weather/di/LocationModule.kt

@@ -1,20 +0,0 @@
-package com.example.weather.feature.weather.di
-
-import com.example.weather.feature.weather.data.location.DefaultLocationTracker
-import com.example.weather.feature.weather.domain.location.LocationTracker
-import dagger.Binds
-import dagger.Module
-import dagger.hilt.InstallIn
-import dagger.hilt.android.components.ViewModelComponent
-import dagger.hilt.components.SingletonComponent
-import javax.inject.Singleton
-
-@Module
-@InstallIn(ViewModelComponent::class)
-abstract class LocationModule {
-
-    @Binds
-    abstract fun bindsLocationTracker(
-        defaultLocationTracker: DefaultLocationTracker
-    ): LocationTracker
-}

+ 0 - 23
app/src/main/java/com/example/weather/feature/weather/di/RepositoryModule.kt

@@ -1,23 +0,0 @@
-package com.example.weather.feature.weather.di
-
-import com.example.weather.feature.weather.data.repository.WeatherRepositoryImpl
-import com.example.weather.feature.weather.domain.repository.WeatherRepository
-import dagger.Binds
-import dagger.Module
-import dagger.hilt.InstallIn
-import dagger.hilt.android.components.ViewModelComponent
-import dagger.hilt.android.internal.lifecycle.HiltViewModelMap
-import dagger.hilt.components.SingletonComponent
-import dagger.multibindings.IntoMap
-import dagger.multibindings.StringKey
-import javax.inject.Singleton
-
-@Module
-@InstallIn(ViewModelComponent::class)
-abstract class RepositoryModule {
-
-    @Binds
-    abstract fun bindsWeatherRepository(
-        weatherRepositoryIml: WeatherRepositoryImpl
-    ): WeatherRepository
-}

+ 0 - 9
app/src/main/java/com/example/weather/feature/weather/domain/repository/WeatherRepository.kt

@@ -1,9 +0,0 @@
-package com.example.weather.feature.weather.domain.repository
-
-import com.example.weather.core.domain.util.Resource
-import com.example.weather.feature.weather.domain.model.WeatherInfo
-
-interface WeatherRepository {
-
-    suspend fun getWeatherData(lat: Double, long: Double): Resource<WeatherInfo>
-}

+ 0 - 10
app/src/main/java/com/example/weather/feature/weather/presentation/mvi/WeatherEvent.kt

@@ -1,10 +0,0 @@
-package com.example.weather.feature.weather.presentation.mvi
-
-import com.example.weather.feature.weather.domain.model.WeatherInfo
-import com.example.weather.feature.weather.domain.model.WeatherLocation
-
-sealed interface WeatherEvent {
-    data class LoadWeatherInfo(val geoLocation: WeatherLocation) : WeatherEvent
-    data class UpdateHourlyInfo(val weatherInfo: WeatherInfo) : WeatherEvent
-    data class Error(val message: String) : WeatherEvent
-}

+ 2 - 1
build.gradle.kts

@@ -1,4 +1,4 @@
-// Top-level build file where you can add configuration options common to all sub-projects/modules.
+ // Top-level build file where you can add configuration options common to all sub-projects/modules.
 buildscript {
     dependencies {
         classpath(libs.hilt.android.gradle.plugin)
@@ -8,6 +8,7 @@ plugins {
     id("com.android.application") version "8.1.2" apply false
     id("org.jetbrains.kotlin.android") version "1.9.10" apply false
     id("com.google.devtools.ksp") version "1.9.0-1.0.12" apply false
+    id("com.android.library") version "8.1.2" apply false
 }
 
 tasks.register("clean", Delete::class) {

+ 1 - 0
feature/common/.gitignore

@@ -0,0 +1 @@
+/build

+ 69 - 0
feature/common/build.gradle.kts

@@ -0,0 +1,69 @@
+
+plugins {
+    id("com.android.library")
+    id("org.jetbrains.kotlin.android")
+    id("com.google.devtools.ksp")
+    id("dagger.hilt.android.plugin")
+}
+
+android {
+    namespace = "com.trifork.feature.common"
+    compileSdk = 34
+
+    defaultConfig {
+        minSdk = 26
+
+        testInstrumentationRunner = "androidx.test.runner.AndroidJUnitRunner"
+    }
+
+    buildTypes {
+        release {
+            isMinifyEnabled = false
+            proguardFiles(
+                getDefaultProguardFile("proguard-android-optimize.txt"),
+                "proguard-rules.pro"
+            )
+        }
+    }
+    compileOptions {
+        sourceCompatibility = JavaVersion.VERSION_17
+        targetCompatibility = JavaVersion.VERSION_17
+    }
+    kotlinOptions {
+        jvmTarget = "17"
+    }
+    buildFeatures {
+        compose = true
+    }
+    composeOptions {
+        kotlinCompilerExtensionVersion = "1.5.3"
+    }
+    packaging {
+        resources {
+            excludes += "/META-INF/{AL2.0,LGPL2.1}"
+        }
+    }
+    hilt {
+        enableAggregatingTask = true
+    }
+}
+
+dependencies {
+
+    implementation(libs.androidx.core.ktx)
+    implementation(libs.appcompat)
+    implementation(libs.material)
+
+    implementation(libs.androidx.activity.compose)
+
+    //Dagger - Hilt
+    implementation(libs.hilt.android)
+    implementation(libs.androidx.constraintlayout)
+    ksp(libs.hilt.android.compiler)
+
+    testImplementation(libs.junit.junit)
+    androidTestImplementation(libs.androidx.junit)
+    androidTestImplementation(libs.espresso.core)
+
+    implementation(libs.coroutines.test)
+}

+ 0 - 0
feature/common/consumer-rules.pro


+ 21 - 0
feature/common/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

+ 24 - 0
feature/common/src/androidTest/java/com/trifork/feature/common/ExampleInstrumentedTest.kt

@@ -0,0 +1,24 @@
+package com.trifork.feature.common
+
+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.trifork.feature.common.test", appContext.packageName)
+    }
+}

+ 4 - 0
feature/common/src/main/AndroidManifest.xml

@@ -0,0 +1,4 @@
+<?xml version="1.0" encoding="utf-8"?>
+<manifest xmlns:android="http://schemas.android.com/apk/res/android">
+
+</manifest>

+ 20 - 0
feature/common/src/main/java/com/trifork/feature/common/di/FeatureModule.kt

@@ -0,0 +1,20 @@
+package com.trifork.feature.common.di
+
+import com.trifork.feature.common.dispatcher.DispatcherProvider
+import com.trifork.feature.common.dispatcher.StandardDispatcherProvider
+import dagger.Module
+import dagger.Provides
+import dagger.hilt.InstallIn
+import dagger.hilt.components.SingletonComponent
+import javax.inject.Singleton
+
+@Module
+@InstallIn(SingletonComponent::class)
+object FeatureModule {
+
+    @Provides
+    @Singleton
+    fun providesDispatcherProvider(): DispatcherProvider {
+        return StandardDispatcherProvider()
+    }
+}

+ 1 - 1
app/src/main/java/com/example/weather/feature/common/dispatcher/DispatcherProvider.kt → feature/common/src/main/java/com/trifork/feature/common/dispatcher/DispatcherProvider.kt

@@ -1,4 +1,4 @@
-package com.example.weather.feature.common.dispatcher
+package com.trifork.feature.common.dispatcher
 
 import kotlinx.coroutines.CoroutineDispatcher
 

+ 1 - 1
app/src/main/java/com/example/weather/feature/common/dispatcher/StandardDispatcherProvider.kt → feature/common/src/main/java/com/trifork/feature/common/dispatcher/StandardDispatcherProvider.kt

@@ -1,4 +1,4 @@
-package com.example.weather.feature.common.dispatcher
+package com.trifork.feature.common.dispatcher
 
 import kotlinx.coroutines.CoroutineDispatcher
 import kotlinx.coroutines.Dispatchers

+ 1 - 1
app/src/main/java/com/example/weather/feature/common/dispatcher/TestDispatcherProvider.kt → feature/common/src/main/java/com/trifork/feature/common/dispatcher/TestDispatcherProvider.kt

@@ -1,4 +1,4 @@
-package com.example.weather.feature.common.dispatcher
+package com.trifork.feature.common.dispatcher
 
 import kotlinx.coroutines.CoroutineDispatcher
 import kotlinx.coroutines.test.StandardTestDispatcher

+ 1 - 1
app/src/main/java/com/example/weather/feature/common/mvi/StateReducerFlow.kt → feature/common/src/main/java/com/trifork/feature/common/mvi/StateReducerFlow.kt

@@ -1,4 +1,4 @@
-package com.example.weather.feature.common.mvi
+package com.trifork.feature.common.mvi
 
 import androidx.lifecycle.ViewModel
 import androidx.lifecycle.viewModelScope

+ 1 - 1
app/src/main/java/com/example/weather/app/navigation/Screen.kt → feature/common/src/main/java/com/trifork/feature/common/navigation/Screen.kt

@@ -1,4 +1,4 @@
-package com.example.weather.app.navigation
+package com.trifork.feature.common.navigation
 
 sealed class Screen(val route: String) {
     data object Weather : Screen("weather/{name}/{lat}/{long}") {

+ 1 - 1
app/src/main/java/com/example/weather/core/domain/util/Resouce.kt → feature/common/src/main/java/com/trifork/feature/common/util/Resouce.kt

@@ -1,4 +1,4 @@
-package com.example.weather.core.domain.util
+package com.trifork.feature.common.util
 
 sealed class Resource<T>(val data: T? = null, val message: String? = null) {
     class Success<T>(data: T?): Resource<T>(data)

+ 17 - 0
feature/common/src/test/java/com/trifork/feature/common/ExampleUnitTest.kt

@@ -0,0 +1,17 @@
+package com.trifork.feature.common
+
+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)
+    }
+}

+ 1 - 0
feature/geocoding/.gitignore

@@ -0,0 +1 @@
+/build

+ 85 - 0
feature/geocoding/build.gradle.kts

@@ -0,0 +1,85 @@
+plugins {
+    id("com.android.library")
+    id("org.jetbrains.kotlin.android")
+    id("com.google.devtools.ksp")
+    id("dagger.hilt.android.plugin")
+}
+
+android {
+    namespace = "com.trifork.feature.geocoding"
+    compileSdk = 34
+
+    defaultConfig {
+        minSdk = 26
+
+        testInstrumentationRunner = "androidx.test.runner.AndroidJUnitRunner"
+        vectorDrawables {
+            useSupportLibrary = true
+        }
+    }
+
+    buildTypes {
+        release {
+            isMinifyEnabled = false
+            proguardFiles(
+                getDefaultProguardFile("proguard-android-optimize.txt"),
+                "proguard-rules.pro"
+            )
+        }
+    }
+    compileOptions {
+        sourceCompatibility = JavaVersion.VERSION_17
+        targetCompatibility = JavaVersion.VERSION_17
+    }
+    kotlinOptions {
+        jvmTarget = "17"
+    }
+    buildFeatures {
+        compose = true
+    }
+    composeOptions {
+        kotlinCompilerExtensionVersion = "1.5.3"
+    }
+    packaging {
+        resources {
+            excludes += "/META-INF/{AL2.0,LGPL2.1}"
+        }
+    }
+    hilt {
+        enableAggregatingTask = true
+    }
+}
+
+dependencies {
+    implementation(project(mapOf("path" to ":feature:common")))
+
+    implementation(libs.androidx.core.ktx)
+    implementation(libs.androidx.lifecycle.runtime.ktx)
+    implementation(libs.androidx.activity.compose)
+    implementation(libs.androidx.navigation.compose)
+    implementation(libs.androidx.lifecycle.runtime.compose)
+    implementation(libs.android.compose.material)
+    implementation(platform("androidx.compose:compose-bom:2023.10.00"))
+    implementation("androidx.compose.ui:ui")
+    implementation("androidx.compose.ui:ui-graphics")
+    implementation("androidx.compose.ui:ui-tooling-preview")
+    implementation("androidx.compose.material3:material3")
+
+    //Dagger - Hilt
+    implementation(libs.hilt.android)
+    implementation(libs.androidx.constraintlayout)
+    ksp(libs.hilt.android.compiler)
+
+    // Retrofit
+    implementation(libs.retrofit.retrofit)
+    implementation(libs.retrofit.converter.moshi)
+
+    // Room
+    implementation(libs.room.runtime)
+    annotationProcessor(libs.room.compiler)
+    ksp(libs.room.compiler)
+
+    testImplementation(libs.junit.junit)
+    androidTestImplementation(libs.androidx.junit)
+    androidTestImplementation(libs.espresso.core)
+}

+ 0 - 0
feature/geocoding/consumer-rules.pro


+ 21 - 0
feature/geocoding/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

+ 24 - 0
feature/geocoding/src/androidTest/java/com/trifork/feature/geocoding/ExampleInstrumentedTest.kt

@@ -0,0 +1,24 @@
+package com.trifork.feature.geocoding
+
+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.trifork.feature.geocoding.test", appContext.packageName)
+    }
+}

+ 4 - 0
feature/geocoding/src/main/AndroidManifest.xml

@@ -0,0 +1,4 @@
+<?xml version="1.0" encoding="utf-8"?>
+<manifest xmlns:android="http://schemas.android.com/apk/res/android">
+
+</manifest>

+ 1 - 1
app/src/main/java/com/example/weather/feature/geocoding/data/local/GeoLocationEntity.kt → feature/geocoding/src/main/java/com/trifork/feature/geocoding/data/local/GeoLocationEntity.kt

@@ -1,4 +1,4 @@
-package com.example.weather.feature.geocoding.data.local
+package com.trifork.feature.geocoding.data.local
 
 import androidx.room.Entity
 import androidx.room.PrimaryKey

+ 1 - 1
app/src/main/java/com/example/weather/feature/geocoding/data/local/GeocodingDB.kt → feature/geocoding/src/main/java/com/trifork/feature/geocoding/data/local/GeocodingDB.kt

@@ -1,4 +1,4 @@
-package com.example.weather.feature.geocoding.data.local
+package com.trifork.feature.geocoding.data.local
 
 import androidx.room.Database
 import androidx.room.RoomDatabase

+ 1 - 3
app/src/main/java/com/example/weather/feature/geocoding/data/local/GeocodingDao.kt → feature/geocoding/src/main/java/com/trifork/feature/geocoding/data/local/GeocodingDao.kt

@@ -1,11 +1,9 @@
-package com.example.weather.feature.geocoding.data.local
+package com.trifork.feature.geocoding.data.local
 
 import androidx.room.Dao
 import androidx.room.Delete
-import androidx.room.Insert
 import androidx.room.Query
 import androidx.room.Upsert
-import com.example.weather.feature.geocoding.domain.model.GeoLocation
 
 @Dao
 interface GeocodingDao {

+ 4 - 4
app/src/main/java/com/example/weather/feature/geocoding/data/mappers/GeocodingMappers.kt → feature/geocoding/src/main/java/com/trifork/feature/geocoding/data/mappers/GeocodingMappers.kt

@@ -1,8 +1,8 @@
-package com.example.weather.feature.geocoding.data.mappers
+package com.trifork.feature.geocoding.data.mappers
 
-import com.example.weather.feature.geocoding.data.local.GeoLocationEntity
-import com.example.weather.feature.geocoding.data.remote.GeocodingDto
-import com.example.weather.feature.geocoding.domain.model.GeoLocation
+import com.trifork.feature.geocoding.data.local.GeoLocationEntity
+import com.trifork.feature.geocoding.data.remote.GeocodingDto
+import com.trifork.feature.geocoding.domain.model.GeoLocation
 import kotlin.random.Random
 
 fun GeocodingDto.toGeocoding(): List<GeoLocation> {

+ 1 - 1
app/src/main/java/com/example/weather/feature/geocoding/data/remote/GeoLocationDto.kt → feature/geocoding/src/main/java/com/trifork/feature/geocoding/data/remote/GeoLocationDto.kt

@@ -1,4 +1,4 @@
-package com.example.weather.feature.geocoding.data.remote
+package com.trifork.feature.geocoding.data.remote
 
 data class GeoLocationDto(
     val name: String,

+ 1 - 1
app/src/main/java/com/example/weather/feature/geocoding/data/remote/GeocodingApi.kt → feature/geocoding/src/main/java/com/trifork/feature/geocoding/data/remote/GeocodingApi.kt

@@ -1,4 +1,4 @@
-package com.example.weather.feature.geocoding.data.remote
+package com.trifork.feature.geocoding.data.remote
 
 import retrofit2.http.GET
 import retrofit2.http.Query

+ 1 - 1
app/src/main/java/com/example/weather/feature/geocoding/data/remote/GeocodingDto.kt → feature/geocoding/src/main/java/com/trifork/feature/geocoding/data/remote/GeocodingDto.kt

@@ -1,4 +1,4 @@
-package com.example.weather.feature.geocoding.data.remote
+package com.trifork.feature.geocoding.data.remote
 
 data class GeocodingDto(
     val results: List<GeoLocationDto>

+ 8 - 8
app/src/main/java/com/example/weather/feature/geocoding/data/repository/GeocodingRepositoryImpl.kt → feature/geocoding/src/main/java/com/trifork/feature/geocoding/data/repository/GeocodingRepositoryImpl.kt

@@ -1,12 +1,12 @@
-package com.example.weather.feature.geocoding.data.repository
+package com.trifork.feature.geocoding.data.repository
 
-import com.example.weather.feature.geocoding.data.mappers.toGeocoding
-import com.example.weather.feature.geocoding.data.remote.GeocodingApi
-import com.example.weather.feature.geocoding.domain.model.GeoLocation
-import com.example.weather.feature.geocoding.domain.repository.GeocodingRepository
-import com.example.weather.core.domain.util.Resource
-import com.example.weather.feature.geocoding.data.local.GeocodingDB
-import com.example.weather.feature.geocoding.data.mappers.toGeoLocationEntity
+import com.trifork.feature.common.util.Resource
+import com.trifork.feature.geocoding.data.local.GeocodingDB
+import com.trifork.feature.geocoding.data.mappers.toGeoLocationEntity
+import com.trifork.feature.geocoding.data.mappers.toGeocoding
+import com.trifork.feature.geocoding.data.remote.GeocodingApi
+import com.trifork.feature.geocoding.domain.model.GeoLocation
+import com.trifork.feature.geocoding.domain.repository.GeocodingRepository
 import javax.inject.Inject
 
 class GeocodingRepositoryImpl @Inject constructor(

+ 3 - 5
app/src/main/java/com/example/weather/feature/geocoding/di/FeatureModule.kt → feature/geocoding/src/main/java/com/trifork/feature/geocoding/di/FeatureModule.kt

@@ -1,18 +1,16 @@
-package com.example.weather.feature.geocoding.di
+package com.trifork.feature.geocoding.di
 
 import android.app.Application
 import androidx.room.Room
-import com.example.weather.feature.geocoding.data.local.GeocodingDB
-import com.example.weather.feature.geocoding.data.remote.GeocodingApi
+import com.trifork.feature.geocoding.data.local.GeocodingDB
+import com.trifork.feature.geocoding.data.remote.GeocodingApi
 import dagger.Module
 import dagger.Provides
 import dagger.hilt.InstallIn
 import dagger.hilt.android.components.ViewModelComponent
-import dagger.hilt.components.SingletonComponent
 import retrofit2.Retrofit
 import retrofit2.converter.moshi.MoshiConverterFactory
 import retrofit2.create
-import javax.inject.Singleton
 
 @Module
 @InstallIn(ViewModelComponent::class)

+ 3 - 4
app/src/main/java/com/example/weather/feature/geocoding/di/RepositoryModule.kt → feature/geocoding/src/main/java/com/trifork/feature/geocoding/di/RepositoryModule.kt

@@ -1,12 +1,11 @@
-package com.example.weather.feature.geocoding.di
+package com.trifork.feature.geocoding.di
 
-import com.example.weather.feature.geocoding.data.repository.GeocodingRepositoryImpl
-import com.example.weather.feature.geocoding.domain.repository.GeocodingRepository
+import com.trifork.feature.geocoding.data.repository.GeocodingRepositoryImpl
+import com.trifork.feature.geocoding.domain.repository.GeocodingRepository
 import dagger.Binds
 import dagger.Module
 import dagger.hilt.InstallIn
 import dagger.hilt.android.components.ViewModelComponent
-import javax.inject.Singleton
 
 @Module
 @InstallIn(ViewModelComponent::class)

+ 1 - 1
app/src/main/java/com/example/weather/feature/geocoding/domain/model/GeoLocation.kt → feature/geocoding/src/main/java/com/trifork/feature/geocoding/domain/model/GeoLocation.kt

@@ -1,4 +1,4 @@
-package com.example.weather.feature.geocoding.domain.model
+package com.trifork.feature.geocoding.domain.model
 
 data class GeoLocation(
     val name: String,

+ 3 - 3
app/src/main/java/com/example/weather/feature/geocoding/domain/repository/GeocodingRepository.kt → feature/geocoding/src/main/java/com/trifork/feature/geocoding/domain/repository/GeocodingRepository.kt

@@ -1,7 +1,7 @@
-package com.example.weather.feature.geocoding.domain.repository
+package com.trifork.feature.geocoding.domain.repository
 
-import com.example.weather.core.domain.util.Resource
-import com.example.weather.feature.geocoding.domain.model.GeoLocation
+import com.trifork.feature.common.util.Resource
+import com.trifork.feature.geocoding.domain.model.GeoLocation
 
 interface GeocodingRepository {
 

+ 10 - 9
app/src/main/java/com/example/weather/feature/geocoding/presentation/GeocodingViewModel.kt → feature/geocoding/src/main/java/com/trifork/feature/geocoding/presentation/GeocodingViewModel.kt

@@ -1,15 +1,16 @@
-package com.example.weather.feature.geocoding.presentation
+package com.trifork.feature.geocoding.presentation
 
 import androidx.lifecycle.ViewModel
 import androidx.lifecycle.viewModelScope
-import com.example.weather.core.domain.util.Resource
-import com.example.weather.feature.common.dispatcher.DispatcherProvider
-import com.example.weather.feature.common.mvi.StateReducerFlow
-import com.example.weather.feature.geocoding.domain.model.GeoLocation
-import com.example.weather.feature.geocoding.domain.repository.GeocodingRepository
-import com.example.weather.feature.geocoding.presentation.mvi.GeoAction
-import com.example.weather.feature.geocoding.presentation.mvi.GeoEvent
-import com.example.weather.feature.geocoding.presentation.mvi.GeoState
+
+import com.trifork.feature.common.dispatcher.DispatcherProvider
+import com.trifork.feature.common.mvi.StateReducerFlow
+import com.trifork.feature.common.util.Resource
+import com.trifork.feature.geocoding.domain.model.GeoLocation
+import com.trifork.feature.geocoding.domain.repository.GeocodingRepository
+import com.trifork.feature.geocoding.presentation.mvi.GeoAction
+import com.trifork.feature.geocoding.presentation.mvi.GeoEvent
+import com.trifork.feature.geocoding.presentation.mvi.GeoState
 import dagger.hilt.android.lifecycle.HiltViewModel
 import kotlinx.coroutines.flow.MutableSharedFlow
 import kotlinx.coroutines.flow.asSharedFlow

+ 5 - 5
app/src/main/java/com/example/weather/feature/geocoding/presentation/components/GeocodingScreen.kt → feature/geocoding/src/main/java/com/trifork/feature/geocoding/presentation/components/GeocodingScreen.kt

@@ -1,4 +1,4 @@
-package com.example.weather.feature.geocoding.presentation.components
+package com.trifork.feature.geocoding.presentation.components
 
 import android.widget.Toast
 import androidx.compose.foundation.background
@@ -50,10 +50,10 @@ import androidx.compose.ui.text.style.TextOverflow
 import androidx.compose.ui.unit.dp
 import androidx.lifecycle.compose.LifecycleResumeEffect
 import androidx.navigation.NavController
-import com.example.weather.app.navigation.Screen
-import com.example.weather.feature.geocoding.presentation.GeocodingViewModel
-import com.example.weather.feature.geocoding.presentation.mvi.GeoAction
-import com.example.weather.feature.geocoding.presentation.mvi.GeoEvent
+import com.trifork.feature.common.navigation.Screen
+import com.trifork.feature.geocoding.presentation.GeocodingViewModel
+import com.trifork.feature.geocoding.presentation.mvi.GeoAction
+import com.trifork.feature.geocoding.presentation.mvi.GeoEvent
 
 @OptIn(ExperimentalMaterial3Api::class, ExperimentalComposeUiApi::class)
 @Composable

+ 1 - 1
app/src/main/java/com/example/weather/feature/geocoding/presentation/mvi/GeoAction.kt → feature/geocoding/src/main/java/com/trifork/feature/geocoding/presentation/mvi/GeoAction.kt

@@ -1,4 +1,4 @@
-package com.example.weather.feature.geocoding.presentation.mvi
+package com.trifork.feature.geocoding.presentation.mvi
 
 sealed interface GeoAction {
     data class ShowToast(val message: String) : GeoAction

+ 2 - 2
app/src/main/java/com/example/weather/feature/geocoding/presentation/mvi/GeoEvent.kt → feature/geocoding/src/main/java/com/trifork/feature/geocoding/presentation/mvi/GeoEvent.kt

@@ -1,6 +1,6 @@
-package com.example.weather.feature.geocoding.presentation.mvi
+package com.trifork.feature.geocoding.presentation.mvi
 
-import com.example.weather.feature.geocoding.domain.model.GeoLocation
+import com.trifork.feature.geocoding.domain.model.GeoLocation
 
 sealed interface GeoEvent {
     data class Search(val query: String) : GeoEvent

+ 2 - 2
app/src/main/java/com/example/weather/feature/geocoding/presentation/mvi/GeoState.kt → feature/geocoding/src/main/java/com/trifork/feature/geocoding/presentation/mvi/GeoState.kt

@@ -1,6 +1,6 @@
-package com.example.weather.feature.geocoding.presentation.mvi
+package com.trifork.feature.geocoding.presentation.mvi
 
-import com.example.weather.feature.geocoding.domain.model.GeoLocation
+import com.trifork.feature.geocoding.domain.model.GeoLocation
 
 data class GeoState(
     val geoLocations: List<GeoLocation>,

+ 17 - 0
feature/geocoding/src/test/java/com/trifork/feature/geocoding/ExampleUnitTest.kt

@@ -0,0 +1,17 @@
+package com.trifork.feature.geocoding
+
+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)
+    }
+}

+ 1 - 0
feature/weather/.gitignore

@@ -0,0 +1 @@
+/build

+ 91 - 0
feature/weather/build.gradle.kts

@@ -0,0 +1,91 @@
+plugins {
+    id("com.android.library")
+    id("org.jetbrains.kotlin.android")
+    id("com.google.devtools.ksp")
+    id("dagger.hilt.android.plugin")
+}
+
+android {
+    namespace = "com.trifork.feature.weather"
+    compileSdk = 34
+
+    defaultConfig {
+        minSdk = 26
+
+        testInstrumentationRunner = "androidx.test.runner.AndroidJUnitRunner"
+        vectorDrawables {
+            useSupportLibrary = true
+        }
+    }
+
+    buildTypes {
+        release {
+            isMinifyEnabled = false
+            proguardFiles(
+                getDefaultProguardFile("proguard-android-optimize.txt"),
+                "proguard-rules.pro"
+            )
+        }
+    }
+    compileOptions {
+        sourceCompatibility = JavaVersion.VERSION_17
+        targetCompatibility = JavaVersion.VERSION_17
+    }
+    kotlinOptions {
+        jvmTarget = "17"
+    }
+    buildFeatures {
+        compose = true
+    }
+    composeOptions {
+        kotlinCompilerExtensionVersion = "1.5.3"
+    }
+    packaging {
+        resources {
+            excludes += "/META-INF/{AL2.0,LGPL2.1}"
+        }
+    }
+    hilt {
+        enableAggregatingTask = true
+    }
+}
+
+dependencies {
+    implementation(project(mapOf("path" to ":feature:common")))
+
+    implementation(libs.androidx.core.ktx)
+    implementation(libs.androidx.lifecycle.runtime.ktx)
+    implementation(libs.androidx.activity.compose)
+    implementation(libs.androidx.navigation.compose)
+    implementation(libs.androidx.lifecycle.runtime.compose)
+    implementation(libs.android.compose.material)
+    implementation(platform("androidx.compose:compose-bom:2023.10.00"))
+    implementation("androidx.compose.ui:ui")
+    implementation("androidx.compose.ui:ui-graphics")
+    implementation("androidx.compose.ui:ui-tooling-preview")
+    implementation("androidx.compose.material3:material3")
+
+    implementation(libs.kotlinx.collections.immutable)
+
+    //Dagger - Hilt
+    implementation(libs.hilt.android)
+    implementation(libs.androidx.constraintlayout)
+    ksp(libs.hilt.android.compiler)
+
+    // Location Services
+    implementation(libs.android.play.services.location)
+
+    // Retrofit
+    implementation(libs.retrofit.retrofit)
+    implementation(libs.retrofit.converter.moshi)
+
+
+    testImplementation(libs.junit.junit)
+    androidTestImplementation(libs.androidx.junit)
+    androidTestImplementation(libs.espresso.core)
+    androidTestImplementation(platform("androidx.compose:compose-bom:2023.10.00"))
+    androidTestImplementation("androidx.compose.ui:ui-test-junit4")
+    debugImplementation("androidx.compose.ui:ui-tooling")
+    debugImplementation("androidx.compose.ui:ui-test-manifest")
+    implementation(libs.coroutines.test)
+}

+ 0 - 0
feature/weather/consumer-rules.pro


+ 21 - 0
feature/weather/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

+ 24 - 0
feature/weather/src/androidTest/java/com/trifork/feature/weather/ExampleInstrumentedTest.kt

@@ -0,0 +1,24 @@
+package com.trifork.feature.weather
+
+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.trifork.feature.weather.test", appContext.packageName)
+    }
+}

+ 5 - 0
feature/weather/src/main/AndroidManifest.xml

@@ -0,0 +1,5 @@
+<?xml version="1.0" encoding="utf-8"?>
+<manifest xmlns:android="http://schemas.android.com/apk/res/android">
+
+    <uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION" />
+</manifest>

+ 2 - 2
app/src/main/java/com/example/weather/feature/weather/data/location/DefaultLocationTracker.kt → feature/weather/src/main/java/com/trifork/feature/weather/data/location/DefaultLocationTracker.kt

@@ -1,4 +1,4 @@
-package com.example.weather.feature.weather.data.location
+package com.trifork.feature.weather.data.location
 
 import android.app.Application
 import android.location.Location
@@ -7,8 +7,8 @@ import android.Manifest
 import android.content.Context
 import android.content.pm.PackageManager
 import android.location.LocationManager
-import com.example.weather.feature.weather.domain.location.LocationTracker
 import com.google.android.gms.location.FusedLocationProviderClient
+import com.trifork.feature.weather.domain.location.LocationTracker
 import kotlinx.coroutines.suspendCancellableCoroutine
 import javax.inject.Inject
 import kotlin.coroutines.resume

+ 20 - 16
app/src/main/java/com/example/weather/feature/weather/data/mappers/WeatherMappers.kt → feature/weather/src/main/java/com/trifork/feature/weather/data/mappers/WeatherMappers.kt

@@ -1,12 +1,12 @@
-package com.example.weather.feature.weather.data.mappers
+package com.trifork.feature.weather.data.mappers
 
-import com.example.weather.feature.weather.data.remote.SunDataDto
-import com.example.weather.feature.weather.data.remote.WeatherDataDto
-import com.example.weather.feature.weather.data.remote.WeatherDto
-import com.example.weather.feature.weather.domain.model.SunData
-import com.example.weather.feature.weather.domain.model.WeatherData
-import com.example.weather.feature.weather.domain.model.WeatherInfo
-import com.example.weather.feature.weather.domain.model.WeatherType
+import com.trifork.feature.weather.data.remote.SunDataDto
+import com.trifork.feature.weather.data.remote.WeatherDataDto
+import com.trifork.feature.weather.data.remote.WeatherDto
+import com.trifork.feature.weather.domain.model.SunData
+import com.trifork.feature.weather.domain.model.WeatherData
+import com.trifork.feature.weather.domain.model.WeatherInfo
+import com.trifork.feature.weather.domain.model.WeatherType
 import kotlinx.collections.immutable.ImmutableList
 import kotlinx.collections.immutable.ImmutableMap
 import kotlinx.collections.immutable.toImmutableList
@@ -16,10 +16,10 @@ import java.time.format.DateTimeFormatter
 
 private data class IndexWeatherData(
     val index: Int,
-    val data: WeatherData
+    val data: com.trifork.feature.weather.domain.model.WeatherData
 )
 
-fun WeatherDataDto.toWeatherDataMap(sunData: SunData): ImmutableMap<Int, ImmutableList<WeatherData>> {
+fun WeatherDataDto.toWeatherDataMap(sunData: com.trifork.feature.weather.domain.model.SunData): ImmutableMap<Int, ImmutableList<com.trifork.feature.weather.domain.model.WeatherData>> {
     return time.mapIndexed { index, time ->
         val localDateTime = LocalDateTime.parse(time, DateTimeFormatter.ISO_DATE_TIME)
         val weatherCode = weatherCodes[index]
@@ -31,13 +31,17 @@ fun WeatherDataDto.toWeatherDataMap(sunData: SunData): ImmutableMap<Int, Immutab
 
         IndexWeatherData(
             index = index,
-            data = WeatherData(
+            data = com.trifork.feature.weather.domain.model.WeatherData(
                 time = localDateTime,
                 temperatureCelsius = temperature,
                 pressure = pressures[index],
                 windSpeed = windSpeeds[index],
                 humidity = humidities[index],
-                weatherType = WeatherType.fromWMO(weatherCode, isDay, isFreezing),
+                weatherType = com.trifork.feature.weather.domain.model.WeatherType.fromWMO(
+                    weatherCode,
+                    isDay,
+                    isFreezing
+                ),
                 sunrise = sunrise,
                 sunset = sunset
             )
@@ -57,21 +61,21 @@ private fun isFreezing(temperature: Double): Boolean {
     return temperature < 0
 }
 
-private fun SunDataDto.sunData(): SunData {
-    return SunData(
+private fun SunDataDto.sunData(): com.trifork.feature.weather.domain.model.SunData {
+    return com.trifork.feature.weather.domain.model.SunData(
         sunrise = sunrise.map { LocalDateTime.parse(it, DateTimeFormatter.ISO_DATE_TIME) },
         sunset = sunset.map { LocalDateTime.parse(it, DateTimeFormatter.ISO_DATE_TIME) },
     )
 }
 
-fun WeatherDto.toWeatherInfo(): WeatherInfo {
+fun WeatherDto.toWeatherInfo(): com.trifork.feature.weather.domain.model.WeatherInfo {
     val weatherDataMap = weatherData.toWeatherDataMap(sunData.sunData())
     val now = LocalDateTime.now()
     val currentWeatherData = weatherDataMap[0]?.find {
         val hour = if (now.minute < 30) now.hour else now.hour + 1
         it.time.hour == hour
     }
-    return WeatherInfo(
+    return com.trifork.feature.weather.domain.model.WeatherInfo(
         geoLocation = "",
         weatherDataPerDay = weatherDataMap,
         currentWeatherData = currentWeatherData

+ 1 - 1
app/src/main/java/com/example/weather/feature/weather/data/remote/SunDataDto.kt → feature/weather/src/main/java/com/trifork/feature/weather/data/remote/SunDataDto.kt

@@ -1,4 +1,4 @@
-package com.example.weather.feature.weather.data.remote
+package com.trifork.feature.weather.data.remote
 
 data class SunDataDto(
     val sunrise: List<String>,

+ 1 - 1
app/src/main/java/com/example/weather/feature/weather/data/remote/WeatherApi.kt → feature/weather/src/main/java/com/trifork/feature/weather/data/remote/WeatherApi.kt

@@ -1,4 +1,4 @@
-package com.example.weather.feature.weather.data.remote
+package com.trifork.feature.weather.data.remote
 
 import retrofit2.http.GET
 import retrofit2.http.Query

+ 1 - 1
app/src/main/java/com/example/weather/feature/weather/data/remote/WeatherDataDto.kt → feature/weather/src/main/java/com/trifork/feature/weather/data/remote/WeatherDataDto.kt

@@ -1,4 +1,4 @@
-package com.example.weather.feature.weather.data.remote
+package com.trifork.feature.weather.data.remote
 
 import com.squareup.moshi.Json
 

+ 1 - 1
app/src/main/java/com/example/weather/feature/weather/data/remote/WeatherDto.kt → feature/weather/src/main/java/com/trifork/feature/weather/data/remote/WeatherDto.kt

@@ -1,4 +1,4 @@
-package com.example.weather.feature.weather.data.remote
+package com.trifork.feature.weather.data.remote
 
 import com.squareup.moshi.Json
 

+ 23 - 0
feature/weather/src/main/java/com/trifork/feature/weather/data/repository/WeatherRepositoryImpl.kt

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

+ 2 - 4
app/src/main/java/com/example/weather/feature/weather/di/FeatureModule.kt → feature/weather/src/main/java/com/trifork/feature/weather/di/FeatureModule.kt

@@ -1,18 +1,16 @@
-package com.example.weather.feature.weather.di
+package com.trifork.feature.weather.di
 
 import android.app.Application
-import com.example.weather.feature.weather.data.remote.WeatherApi
 import com.google.android.gms.location.FusedLocationProviderClient
 import com.google.android.gms.location.LocationServices
+import com.trifork.feature.weather.data.remote.WeatherApi
 import dagger.Module
 import dagger.Provides
 import dagger.hilt.InstallIn
 import dagger.hilt.android.components.ViewModelComponent
-import dagger.hilt.components.SingletonComponent
 import retrofit2.Retrofit
 import retrofit2.converter.moshi.MoshiConverterFactory
 import retrofit2.create
-import javax.inject.Singleton
 
 @Module
 @InstallIn(ViewModelComponent::class)

+ 17 - 0
feature/weather/src/main/java/com/trifork/feature/weather/di/LocationModule.kt

@@ -0,0 +1,17 @@
+package com.trifork.feature.weather.di
+
+import com.trifork.feature.weather.domain.location.LocationTracker
+import dagger.Binds
+import dagger.Module
+import dagger.hilt.InstallIn
+import dagger.hilt.android.components.ViewModelComponent
+
+@Module
+@InstallIn(ViewModelComponent::class)
+abstract class LocationModule {
+
+    @Binds
+    abstract fun bindsLocationTracker(
+        defaultLocationTracker: com.trifork.feature.weather.data.location.DefaultLocationTracker
+    ): LocationTracker
+}

+ 17 - 0
feature/weather/src/main/java/com/trifork/feature/weather/di/RepositoryModule.kt

@@ -0,0 +1,17 @@
+package com.trifork.feature.weather.di
+
+import com.trifork.feature.weather.data.repository.WeatherRepositoryImpl
+import dagger.Binds
+import dagger.Module
+import dagger.hilt.InstallIn
+import dagger.hilt.android.components.ViewModelComponent
+
+@Module
+@InstallIn(ViewModelComponent::class)
+abstract class RepositoryModule {
+
+    @Binds
+    abstract fun bindsWeatherRepository(
+        weatherRepositoryIml: WeatherRepositoryImpl
+    ): com.trifork.feature.weather.domain.repository.WeatherRepository
+}

+ 1 - 1
app/src/main/java/com/example/weather/feature/weather/domain/location/LocationTracker.kt → feature/weather/src/main/java/com/trifork/feature/weather/domain/location/LocationTracker.kt

@@ -1,4 +1,4 @@
-package com.example.weather.feature.weather.domain.location
+package com.trifork.feature.weather.domain.location
 
 import android.location.Location
 

+ 1 - 1
app/src/main/java/com/example/weather/feature/weather/domain/model/SunData.kt → feature/weather/src/main/java/com/trifork/feature/weather/domain/model/SunData.kt

@@ -1,4 +1,4 @@
-package com.example.weather.feature.weather.domain.model
+package com.trifork.feature.weather.domain.model
 
 import java.time.LocalDateTime
 

+ 1 - 1
app/src/main/java/com/example/weather/feature/weather/domain/model/WeatherData.kt → feature/weather/src/main/java/com/trifork/feature/weather/domain/model/WeatherData.kt

@@ -1,4 +1,4 @@
-package com.example.weather.feature.weather.domain.model
+package com.trifork.feature.weather.domain.model
 
 import java.time.LocalDateTime
 

+ 1 - 1
app/src/main/java/com/example/weather/feature/weather/domain/model/WeatherInfo.kt → feature/weather/src/main/java/com/trifork/feature/weather/domain/model/WeatherInfo.kt

@@ -1,4 +1,4 @@
-package com.example.weather.feature.weather.domain.model
+package com.trifork.feature.weather.domain.model
 
 import kotlinx.collections.immutable.ImmutableList
 import kotlinx.collections.immutable.ImmutableMap

+ 1 - 1
app/src/main/java/com/example/weather/feature/weather/domain/model/WeatherLocation.kt → feature/weather/src/main/java/com/trifork/feature/weather/domain/model/WeatherLocation.kt

@@ -1,4 +1,4 @@
-package com.example.weather.feature.weather.domain.model
+package com.trifork.feature.weather.domain.model
 
 data class WeatherLocation(
     val name: String = "Current Location",

+ 2 - 2
app/src/main/java/com/example/weather/feature/weather/domain/model/WeatherType.kt → feature/weather/src/main/java/com/trifork/feature/weather/domain/model/WeatherType.kt

@@ -1,7 +1,7 @@
-package com.example.weather.feature.weather.domain.model
+package com.trifork.feature.weather.domain.model
 
 import androidx.annotation.DrawableRes
-import com.example.weather.R
+import com.trifork.feature.weather.R
 
 sealed class WeatherType(
     val weatherDesc: String,

+ 10 - 0
feature/weather/src/main/java/com/trifork/feature/weather/domain/repository/WeatherRepository.kt

@@ -0,0 +1,10 @@
+package com.trifork.feature.weather.domain.repository
+
+
+import com.trifork.feature.common.util.Resource
+import com.trifork.feature.weather.domain.model.WeatherInfo
+
+interface WeatherRepository {
+
+    suspend fun getWeatherData(lat: Double, long: Double): Resource<WeatherInfo>
+}

+ 10 - 10
app/src/main/java/com/example/weather/feature/weather/presentation/WeatherViewModel.kt → feature/weather/src/main/java/com/trifork/feature/weather/presentation/WeatherViewModel.kt

@@ -1,16 +1,16 @@
-package com.example.weather.feature.weather.presentation
+package com.trifork.feature.weather.presentation
 
 import androidx.lifecycle.ViewModel
 import androidx.lifecycle.viewModelScope
-import com.example.weather.core.domain.util.Resource
-import com.example.weather.feature.common.dispatcher.DispatcherProvider
-import com.example.weather.feature.common.mvi.StateReducerFlow
-import com.example.weather.feature.weather.domain.location.LocationTracker
-import com.example.weather.feature.weather.domain.model.WeatherInfo
-import com.example.weather.feature.weather.domain.model.WeatherLocation
-import com.example.weather.feature.weather.domain.repository.WeatherRepository
-import com.example.weather.feature.weather.presentation.mvi.WeatherEvent
-import com.example.weather.feature.weather.presentation.mvi.WeatherState
+import com.trifork.feature.common.dispatcher.DispatcherProvider
+import com.trifork.feature.common.mvi.StateReducerFlow
+import com.trifork.feature.common.util.Resource
+import com.trifork.feature.weather.domain.location.LocationTracker
+import com.trifork.feature.weather.domain.model.WeatherInfo
+import com.trifork.feature.weather.domain.model.WeatherLocation
+import com.trifork.feature.weather.domain.repository.WeatherRepository
+import com.trifork.feature.weather.presentation.mvi.WeatherEvent
+import com.trifork.feature.weather.presentation.mvi.WeatherState
 import dagger.hilt.android.lifecycle.HiltViewModel
 import kotlinx.coroutines.launch
 import javax.inject.Inject

+ 2 - 2
app/src/main/java/com/example/weather/feature/weather/presentation/components/HourlyWeatherDisplay.kt → feature/weather/src/main/java/com/trifork/feature/weather/presentation/components/HourlyWeatherDisplay.kt

@@ -1,4 +1,4 @@
-package com.example.weather.feature.weather.presentation.components
+package com.trifork.feature.weather.presentation.components
 
 import androidx.compose.foundation.Image
 import androidx.compose.foundation.layout.Arrangement
@@ -14,7 +14,7 @@ import androidx.compose.ui.graphics.Color
 import androidx.compose.ui.res.painterResource
 import androidx.compose.ui.text.font.FontWeight
 import androidx.compose.ui.unit.dp
-import com.example.weather.feature.weather.domain.model.WeatherData
+import com.trifork.feature.weather.domain.model.WeatherData
 import java.time.format.DateTimeFormatter
 
 @Composable

+ 10 - 6
app/src/main/java/com/example/weather/feature/weather/presentation/components/WeatherCard.kt → feature/weather/src/main/java/com/trifork/feature/weather/presentation/components/WeatherCard.kt

@@ -1,4 +1,4 @@
-package com.example.weather.feature.weather.presentation.components
+package com.trifork.feature.weather.presentation.components
 
 import androidx.compose.foundation.Image
 import androidx.compose.foundation.layout.Arrangement
@@ -25,9 +25,9 @@ import androidx.compose.ui.text.TextStyle
 import androidx.compose.ui.tooling.preview.Preview
 import androidx.compose.ui.unit.dp
 import androidx.compose.ui.unit.sp
-import com.example.weather.R
-import com.example.weather.feature.weather.domain.model.WeatherData
-import com.example.weather.feature.weather.domain.model.WeatherType
+import com.trifork.feature.weather.R
+import com.trifork.feature.weather.domain.model.WeatherData
+import com.trifork.feature.weather.domain.model.WeatherType
 import java.time.LocalDateTime
 import java.time.format.DateTimeFormatter
 import kotlin.math.roundToInt
@@ -42,7 +42,11 @@ fun WeatherCardPreview() {
             pressure = 1022.toDouble(),
             windSpeed = 6.toDouble(),
             humidity = 62.toDouble(),
-            weatherType = WeatherType.fromWMO(code = 0, isDay = true, isFreezing = false),
+            weatherType = WeatherType.fromWMO(
+                code = 0,
+                isDay = true,
+                isFreezing = false
+            ),
             sunrise = LocalDateTime.now(),
             sunset = LocalDateTime.now()
         ),
@@ -53,7 +57,7 @@ fun WeatherCardPreview() {
 
 @Composable
 fun WeatherCard(
-    data: WeatherData,
+    data: com.trifork.feature.weather.domain.model.WeatherData,
     backgroundColor: Color,
     modifier: Modifier = Modifier
 ) {

+ 1 - 1
app/src/main/java/com/example/weather/feature/weather/presentation/components/WeatherDataDisplay.kt → feature/weather/src/main/java/com/trifork/feature/weather/presentation/components/WeatherDataDisplay.kt

@@ -1,4 +1,4 @@
-package com.example.weather.feature.weather.presentation.components
+package com.trifork.feature.weather.presentation.components
 
 import androidx.compose.foundation.layout.Row
 import androidx.compose.foundation.layout.Spacer

+ 5 - 7
app/src/main/java/com/example/weather/feature/weather/presentation/components/WeatherForecast.kt → feature/weather/src/main/java/com/trifork/feature/weather/presentation/components/WeatherForecast.kt

@@ -1,4 +1,4 @@
-package com.example.weather.feature.weather.presentation.components
+package com.trifork.feature.weather.presentation.components
 
 import androidx.compose.foundation.clickable
 import androidx.compose.foundation.layout.Arrangement
@@ -18,10 +18,8 @@ import androidx.compose.ui.Alignment
 import androidx.compose.ui.Modifier
 import androidx.compose.ui.unit.dp
 import androidx.compose.ui.unit.sp
-import com.example.weather.feature.weather.domain.model.WeatherData
-import com.example.weather.feature.weather.domain.model.WeatherInfo
-import com.example.weather.feature.weather.presentation.WeatherViewModel
-import com.example.weather.feature.weather.presentation.mvi.WeatherEvent
+import com.trifork.feature.weather.domain.model.WeatherInfo
+import com.trifork.feature.weather.presentation.mvi.WeatherEvent
 import kotlinx.collections.immutable.ImmutableList
 import java.time.LocalDateTime
 import java.util.Locale
@@ -29,8 +27,8 @@ import java.util.Locale
 @Composable
 fun WeatherForecast(
     weatherInfo: WeatherInfo,
-    perDay: ImmutableList<WeatherData>,
-    viewModel: WeatherViewModel,
+    perDay: ImmutableList<com.trifork.feature.weather.domain.model.WeatherData>,
+    viewModel: com.trifork.feature.weather.presentation.WeatherViewModel,
     modifier: Modifier = Modifier,
 ) {
     Column(

+ 7 - 10
app/src/main/java/com/example/weather/feature/weather/presentation/components/WeatherScreen.kt → feature/weather/src/main/java/com/trifork/feature/weather/presentation/components/WeatherScreen.kt

@@ -1,4 +1,4 @@
-package com.example.weather.feature.weather.presentation.components
+package com.trifork.feature.weather.presentation.components
 
 import android.Manifest
 import androidx.activity.compose.rememberLauncherForActivityResult
@@ -38,17 +38,14 @@ import androidx.compose.ui.Modifier
 import androidx.compose.ui.text.style.TextAlign
 import androidx.compose.ui.unit.dp
 import androidx.navigation.NavController
-import com.example.weather.app.navigation.Screen
-import com.example.weather.feature.weather.domain.model.WeatherLocation
-import com.example.weather.feature.weather.presentation.WeatherViewModel
-import com.example.weather.feature.weather.presentation.mvi.WeatherEvent
+import com.trifork.feature.common.navigation.Screen
 
 @OptIn(ExperimentalMaterial3Api::class, ExperimentalMaterialApi::class)
 @Composable
 fun WeatherScreen(
     navController: NavController,
-    viewModel: WeatherViewModel,
-    geoLocation: WeatherLocation
+    viewModel: com.trifork.feature.weather.presentation.WeatherViewModel,
+    geoLocation: com.trifork.feature.weather.domain.model.WeatherLocation
 ) {
     val state by viewModel.state.collectAsState()
 
@@ -56,14 +53,14 @@ fun WeatherScreen(
         ActivityResultContracts.RequestMultiplePermissions()
     ) { map ->
         if (map.values.filter { it }.size > 1) {
-            viewModel.state.handleEvent(WeatherEvent.LoadWeatherInfo(geoLocation))
+            viewModel.state.handleEvent(com.trifork.feature.weather.presentation.mvi.WeatherEvent.LoadWeatherInfo(geoLocation))
         }
     }
 
     val isLoading = state.isLoading
     val pullRefreshState = rememberPullRefreshState(isLoading, {
         viewModel.state.handleEvent(
-            WeatherEvent.LoadWeatherInfo(
+            com.trifork.feature.weather.presentation.mvi.WeatherEvent.LoadWeatherInfo(
                 geoLocation
             )
         )
@@ -100,7 +97,7 @@ fun WeatherScreen(
                 actions = {
                     IconButton(onClick = {
                         viewModel.state.handleEvent(
-                            WeatherEvent.LoadWeatherInfo(WeatherLocation())
+                            com.trifork.feature.weather.presentation.mvi.WeatherEvent.LoadWeatherInfo(com.trifork.feature.weather.domain.model.WeatherLocation())
                         )
                     }) {
                         Icon(

+ 9 - 0
feature/weather/src/main/java/com/trifork/feature/weather/presentation/mvi/WeatherEvent.kt

@@ -0,0 +1,9 @@
+package com.trifork.feature.weather.presentation.mvi
+
+sealed interface WeatherEvent {
+    data class LoadWeatherInfo(val geoLocation: com.trifork.feature.weather.domain.model.WeatherLocation) :
+        WeatherEvent
+    data class UpdateHourlyInfo(val weatherInfo: com.trifork.feature.weather.domain.model.WeatherInfo) :
+        WeatherEvent
+    data class Error(val message: String) : WeatherEvent
+}

+ 2 - 4
app/src/main/java/com/example/weather/feature/weather/presentation/mvi/WeatherState.kt → feature/weather/src/main/java/com/trifork/feature/weather/presentation/mvi/WeatherState.kt

@@ -1,11 +1,9 @@
-package com.example.weather.feature.weather.presentation.mvi
-
-import com.example.weather.feature.weather.domain.model.WeatherInfo
+package com.trifork.feature.weather.presentation.mvi
 
 data class WeatherState(
     val isLoading: Boolean,
     val error: String?,
-    val weatherInfo: WeatherInfo?
+    val weatherInfo: com.trifork.feature.weather.domain.model.WeatherInfo?
 ) {
     companion object {
         val initial = WeatherState(

+ 0 - 0
app/src/main/res/drawable/ic_clear_day.xml → feature/weather/src/main/res/drawable/ic_clear_day.xml


+ 0 - 0
app/src/main/res/drawable/ic_clear_night.xml → feature/weather/src/main/res/drawable/ic_clear_night.xml


+ 0 - 0
app/src/main/res/drawable/ic_dense_drizzel_day.xml → feature/weather/src/main/res/drawable/ic_dense_drizzel_day.xml


+ 0 - 0
app/src/main/res/drawable/ic_dense_drizzel_night.xml → feature/weather/src/main/res/drawable/ic_dense_drizzel_night.xml


+ 0 - 0
app/src/main/res/drawable/ic_drop.xml → feature/weather/src/main/res/drawable/ic_drop.xml


+ 0 - 0
app/src/main/res/drawable/ic_fog_day.xml → feature/weather/src/main/res/drawable/ic_fog_day.xml


+ 0 - 0
app/src/main/res/drawable/ic_fog_night.xml → feature/weather/src/main/res/drawable/ic_fog_night.xml


+ 0 - 0
app/src/main/res/drawable/ic_foggy.xml → feature/weather/src/main/res/drawable/ic_foggy.xml


+ 0 - 0
app/src/main/res/drawable/ic_frost_day.xml → feature/weather/src/main/res/drawable/ic_frost_day.xml


+ 0 - 0
app/src/main/res/drawable/ic_frost_night.xml → feature/weather/src/main/res/drawable/ic_frost_night.xml


+ 0 - 0
app/src/main/res/drawable/ic_heavy_rain.xml → feature/weather/src/main/res/drawable/ic_heavy_rain.xml


+ 0 - 0
app/src/main/res/drawable/ic_heavy_snow.xml → feature/weather/src/main/res/drawable/ic_heavy_snow.xml


+ 0 - 0
app/src/main/res/drawable/ic_heavy_snow_day.xml → feature/weather/src/main/res/drawable/ic_heavy_snow_day.xml


+ 0 - 0
app/src/main/res/drawable/ic_heavy_snow_night.xml → feature/weather/src/main/res/drawable/ic_heavy_snow_night.xml


+ 0 - 0
app/src/main/res/drawable/ic_heavy_thunderstorm.xml → feature/weather/src/main/res/drawable/ic_heavy_thunderstorm.xml


+ 0 - 0
app/src/main/res/drawable/ic_light_drizzel_day.xml → feature/weather/src/main/res/drawable/ic_light_drizzel_day.xml


+ 0 - 0
app/src/main/res/drawable/ic_light_drizzel_night.xml → feature/weather/src/main/res/drawable/ic_light_drizzel_night.xml


+ 0 - 0
app/src/main/res/drawable/ic_light_rain.xml → feature/weather/src/main/res/drawable/ic_light_rain.xml


+ 0 - 0
app/src/main/res/drawable/ic_light_snow.xml → feature/weather/src/main/res/drawable/ic_light_snow.xml


+ 0 - 0
app/src/main/res/drawable/ic_light_snow_day.xml → feature/weather/src/main/res/drawable/ic_light_snow_day.xml


+ 0 - 0
app/src/main/res/drawable/ic_mainly_clear_day.xml → feature/weather/src/main/res/drawable/ic_mainly_clear_day.xml


+ 0 - 0
app/src/main/res/drawable/ic_mainly_clear_night.xml → feature/weather/src/main/res/drawable/ic_mainly_clear_night.xml


Einige Dateien werden nicht angezeigt, da zu viele Dateien in diesem Diff geändert wurden.