diff --git a/.idea/gradle.xml b/.idea/gradle.xml
index ac6b0ae..6cba290 100644
--- a/.idea/gradle.xml
+++ b/.idea/gradle.xml
@@ -12,6 +12,7 @@
+
diff --git a/app/build.gradle b/app/build.gradle
index 6f96edd..f339cab 100644
--- a/app/build.gradle
+++ b/app/build.gradle
@@ -11,12 +11,8 @@ android {
applicationId "com.akash.newzz_compose"
minSdkVersion 21
targetSdkVersion 29
- versionCode 1
- versionName "1.0"
- Properties properties = new Properties()
- properties.load(project.rootProject.file('local.properties').newDataInputStream())
- def apiKey = properties.getProperty("api_key")
- buildConfigField("String", "API_KEY", apiKey)
+ versionCode 2
+ versionName "0.0.2"
testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner"
}
@@ -45,6 +41,7 @@ android {
dependencies {
implementation fileTree(dir: "libs", include: ["*.jar"])
+ implementation project(':data')
implementation "org.jetbrains.kotlin:kotlin-stdlib:$kotlin_version"
implementation 'androidx.core:core-ktx:1.3.0'
implementation 'androidx.appcompat:appcompat:1.1.0'
@@ -60,19 +57,6 @@ dependencies {
/* ---------------------LifeCycle Extension-----------------------------*/
implementation "androidx.lifecycle:lifecycle-extensions:2.2.0"
-
- /* ---------------------Kotlin-coroutines---------------------------*/
- implementation "org.jetbrains.kotlinx:kotlinx-coroutines-core:$coroutines_version"
- implementation "org.jetbrains.kotlinx:kotlinx-coroutines-android:$coroutines_version"
-
- /*---------------------Network and Moshi----------------------------*/
- implementation 'com.squareup.retrofit2:retrofit:2.6.2'
- implementation 'com.squareup.okhttp3:okhttp:4.2.1'
- implementation 'com.squareup.retrofit2:converter-moshi:2.6.2'
- implementation 'com.squareup.moshi:moshi:1.9.1'
- kapt 'com.squareup.moshi:moshi-kotlin-codegen:1.9.1'
-
-
/*-----------------------Koin-------------------------------------*/
implementation "org.koin:koin-android:$koin_version"
implementation "org.koin:koin-android-viewmodel:$koin_version"
@@ -83,6 +67,10 @@ dependencies {
/*---------------------CoilImageLoader------------------------------*/
implementation "dev.chrisbanes.accompanist:accompanist-coil:0.1.6"
+ /*----------------------------Moshi-------------------------------------*/
+ implementation 'com.squareup.moshi:moshi:1.9.1'
+
+
testImplementation 'junit:junit:4.12'
androidTestImplementation 'androidx.test.ext:junit:1.1.1'
androidTestImplementation 'androidx.test.espresso:espresso-core:3.2.0'
diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml
index 490acac..3161f24 100644
--- a/app/src/main/AndroidManifest.xml
+++ b/app/src/main/AndroidManifest.xml
@@ -11,7 +11,7 @@
android:label="@string/app_name"
android:roundIcon="@mipmap/ic_launcher_round"
android:supportsRtl="true"
- android:name=".NewsApplication"
+ android:name=".NewzzApplication"
android:theme="@style/AppTheme">
, onClick: () -> Unit
Column {
if (!article.source.name.isNullOrEmpty()) {
Text(
- text = article.source.name,
+ text = article.source.name!!,
style = if (isDark.value) sourceTextStyle.copy(color = sourceTextColorDark) else sourceTextStyle
)
HeightSpacer(value = 4.dp)
diff --git a/app/src/main/java/com/akash/newzz_compose/viewmodel/NewzzViewModel.kt b/app/src/main/java/com/akash/newzz_compose/viewmodel/NewzzViewModel.kt
index 54dc04d..a05d49a 100644
--- a/app/src/main/java/com/akash/newzz_compose/viewmodel/NewzzViewModel.kt
+++ b/app/src/main/java/com/akash/newzz_compose/viewmodel/NewzzViewModel.kt
@@ -3,10 +3,10 @@ package com.akash.newzz_compose.viewmodel
import androidx.lifecycle.LiveData
import androidx.lifecycle.MutableLiveData
import androidx.lifecycle.ViewModel
+import com.akash.newzz.data.Result
+import com.akash.newzz.data.repository.NewsRepository
+import com.akash.newzz.data.response.NewsArticle
import com.akash.newzz_compose.Category
-import com.akash.newzz_compose.data.repository.NewsRepository
-import com.akash.newzz_compose.data.response.NewsArticle
-import com.akash.newzz_compose.utils.Result
import kotlinx.coroutines.CoroutineScope
import kotlinx.coroutines.Dispatchers
import kotlinx.coroutines.SupervisorJob
diff --git a/data/.gitignore b/data/.gitignore
new file mode 100644
index 0000000..42afabf
--- /dev/null
+++ b/data/.gitignore
@@ -0,0 +1 @@
+/build
\ No newline at end of file
diff --git a/data/build.gradle b/data/build.gradle
new file mode 100644
index 0000000..0275e43
--- /dev/null
+++ b/data/build.gradle
@@ -0,0 +1,56 @@
+apply plugin: 'com.android.library'
+apply plugin: 'kotlin-android'
+apply plugin: 'kotlin-android-extensions'
+apply plugin: 'kotlin-kapt'
+
+android {
+ compileSdkVersion 29
+
+ defaultConfig {
+ minSdkVersion 21
+ targetSdkVersion 29
+ versionCode 1
+ versionName "1.0"
+ Properties properties = new Properties()
+ properties.load(project.rootProject.file('local.properties').newDataInputStream())
+ def apiKey = properties.getProperty("api_key")
+ buildConfigField("String", "API_KEY", apiKey)
+ testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner"
+ consumerProguardFiles "consumer-rules.pro"
+ }
+
+ buildTypes {
+ release {
+ minifyEnabled false
+ proguardFiles getDefaultProguardFile('proguard-android-optimize.txt'), 'proguard-rules.pro'
+ }
+ }
+ compileOptions {
+ sourceCompatibility JavaVersion.VERSION_1_8
+ targetCompatibility JavaVersion.VERSION_1_8
+ }
+ kotlinOptions {
+ jvmTarget = '1.8'
+ }
+}
+
+dependencies {
+ implementation fileTree(dir: "libs", include: ["*.jar"])
+ implementation "org.jetbrains.kotlin:kotlin-stdlib:$kotlin_version"
+
+ /* ---------------------Kotlin-coroutines---------------------------*/
+ implementation "org.jetbrains.kotlinx:kotlinx-coroutines-core:$coroutines_version"
+ implementation "org.jetbrains.kotlinx:kotlinx-coroutines-android:$coroutines_version"
+
+ /*---------------------Network and Moshi----------------------------*/
+ implementation 'com.squareup.retrofit2:retrofit:2.6.2'
+ implementation 'com.squareup.okhttp3:okhttp:4.2.1'
+ implementation 'com.squareup.retrofit2:converter-moshi:2.6.2'
+ implementation 'com.squareup.moshi:moshi:1.9.1'
+ kapt 'com.squareup.moshi:moshi-kotlin-codegen:1.9.1'
+
+ testImplementation 'junit:junit:4.12'
+ androidTestImplementation 'androidx.test.ext:junit:1.1.1'
+ androidTestImplementation 'androidx.test.espresso:espresso-core:3.2.0'
+
+}
\ No newline at end of file
diff --git a/data/consumer-rules.pro b/data/consumer-rules.pro
new file mode 100644
index 0000000..e69de29
diff --git a/data/proguard-rules.pro b/data/proguard-rules.pro
new file mode 100644
index 0000000..481bb43
--- /dev/null
+++ b/data/proguard-rules.pro
@@ -0,0 +1,21 @@
+# Add project specific ProGuard rules here.
+# You can control the set of applied configuration files using the
+# proguardFiles setting in build.gradle.
+#
+# For more details, see
+# http://developer.android.com/guide/developing/tools/proguard.html
+
+# If your project uses WebView with JS, uncomment the following
+# and specify the fully qualified class name to the JavaScript interface
+# class:
+#-keepclassmembers class fqcn.of.javascript.interface.for.webview {
+# public *;
+#}
+
+# Uncomment this to preserve the line number information for
+# debugging stack traces.
+#-keepattributes SourceFile,LineNumberTable
+
+# If you keep the line number information, uncomment this to
+# hide the original source file name.
+#-renamesourcefileattribute SourceFile
\ No newline at end of file
diff --git a/data/src/androidTest/java/com/akash/newzz/data/ExampleInstrumentedTest.kt b/data/src/androidTest/java/com/akash/newzz/data/ExampleInstrumentedTest.kt
new file mode 100644
index 0000000..b9a28ac
--- /dev/null
+++ b/data/src/androidTest/java/com/akash/newzz/data/ExampleInstrumentedTest.kt
@@ -0,0 +1,22 @@
+package com.akash.newzz.data
+
+import androidx.test.ext.junit.runners.AndroidJUnit4
+import androidx.test.platform.app.InstrumentationRegistry
+import org.junit.Assert.assertEquals
+import org.junit.Test
+import org.junit.runner.RunWith
+
+/**
+ * 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.akash.newzz.data.test", appContext.packageName)
+ }
+}
diff --git a/data/src/main/AndroidManifest.xml b/data/src/main/AndroidManifest.xml
new file mode 100644
index 0000000..3ccab62
--- /dev/null
+++ b/data/src/main/AndroidManifest.xml
@@ -0,0 +1,6 @@
+
+
+ /
+
+
\ No newline at end of file
diff --git a/app/src/main/java/com/akash/newzz_compose/NewsApplication.kt b/data/src/main/java/com/akash/newzz/data/BaseApplication.kt
similarity index 54%
rename from app/src/main/java/com/akash/newzz_compose/NewsApplication.kt
rename to data/src/main/java/com/akash/newzz/data/BaseApplication.kt
index d49b3a0..f11ff0f 100644
--- a/app/src/main/java/com/akash/newzz_compose/NewsApplication.kt
+++ b/data/src/main/java/com/akash/newzz/data/BaseApplication.kt
@@ -1,30 +1,22 @@
-package com.akash.newzz_compose
+package com.akash.newzz.data
import android.app.Application
import android.content.Context
import android.net.ConnectivityManager
-import com.akash.newzz_compose.di.appModule
-import org.koin.android.ext.koin.androidContext
-import org.koin.android.ext.koin.androidLogger
-import org.koin.core.context.startKoin
/**
- * Created by Akash on 06/06/20
+ * Created by Akash on 02/07/20
*/
-class NewsApplication : Application() {
+
+open class BaseApplication : Application() {
override fun onCreate() {
super.onCreate()
instances = this
- startKoin {
- androidLogger()
- androidContext(this@NewsApplication)
- modules(appModule)
- }
}
companion object {
- lateinit var instances: NewsApplication
+ lateinit var instances: BaseApplication
fun isNetworkConnected(): Boolean {
val connectivityManager =
diff --git a/app/src/main/java/com/akash/newzz_compose/Constants.kt b/data/src/main/java/com/akash/newzz/data/Constants.kt
similarity index 83%
rename from app/src/main/java/com/akash/newzz_compose/Constants.kt
rename to data/src/main/java/com/akash/newzz/data/Constants.kt
index 90addbc..01fb2af 100644
--- a/app/src/main/java/com/akash/newzz_compose/Constants.kt
+++ b/data/src/main/java/com/akash/newzz/data/Constants.kt
@@ -1,4 +1,4 @@
-package com.akash.newzz_compose
+package com.akash.newzz.data
/**
* Created by Akash on 06/06/20
diff --git a/app/src/main/java/com/akash/newzz_compose/utils/Result.kt b/data/src/main/java/com/akash/newzz/data/Result.kt
similarity index 73%
rename from app/src/main/java/com/akash/newzz_compose/utils/Result.kt
rename to data/src/main/java/com/akash/newzz/data/Result.kt
index e30bb3a..e7710cd 100644
--- a/app/src/main/java/com/akash/newzz_compose/utils/Result.kt
+++ b/data/src/main/java/com/akash/newzz/data/Result.kt
@@ -1,7 +1,7 @@
-package com.akash.newzz_compose.utils
+package com.akash.newzz.data
/**
- * Created by Akash on 06/06/20
+ * Created by Akash on 02/07/20
*/
sealed class Result {
diff --git a/app/src/main/java/com/akash/newzz_compose/data/apiservice/NewsApiService.kt b/data/src/main/java/com/akash/newzz/data/apiservice/NewzzApiService.kt
similarity index 85%
rename from app/src/main/java/com/akash/newzz_compose/data/apiservice/NewsApiService.kt
rename to data/src/main/java/com/akash/newzz/data/apiservice/NewzzApiService.kt
index 2b1b73b..e21a2d9 100644
--- a/app/src/main/java/com/akash/newzz_compose/data/apiservice/NewsApiService.kt
+++ b/data/src/main/java/com/akash/newzz/data/apiservice/NewzzApiService.kt
@@ -1,11 +1,8 @@
-package com.akash.newzz_compose.data.apiservice
+package com.akash.newzz.data.apiservice
-/**
- * Created by Akash on 06/06/20
- */
-import com.akash.newzz_compose.Constants
-import com.akash.newzz_compose.NewsApplication
-import com.akash.newzz_compose.data.response.NewsResponse
+import com.akash.newzz.data.BaseApplication
+import com.akash.newzz.data.Constants
+import com.akash.newzz.data.response.NewsResponse
import java.io.File
import java.util.concurrent.TimeUnit
import okhttp3.Cache
@@ -18,8 +15,10 @@ import retrofit2.converter.moshi.MoshiConverterFactory
import retrofit2.http.GET
import retrofit2.http.Query
-interface NewsApiService {
-
+/**
+ * Created by Akash on 02/07/20
+ */
+interface NewzzApiService {
@GET("top-headlines?sortBy=publishedAt&pageSize=50")
suspend fun getArticlesByCateGoryAsync(
@Query("category") category: String,
@@ -32,7 +31,7 @@ interface NewsApiService {
private const val HEADER_PRAGMA = "Pragma"
private const val cacheSize = (5 * 1024 * 1024).toLong() // 5 MB
- operator fun invoke(): NewsApiService {
+ operator fun invoke(): NewzzApiService {
val requestInterceptor = Interceptor { chain ->
val response = chain.proceed(chain.request())
@@ -49,7 +48,7 @@ interface NewsApiService {
}
val cache = Cache(
- File(NewsApplication.instances.cacheDir, "networkCache"),
+ File(BaseApplication.instances.cacheDir, "networkCache"),
cacheSize
)
@@ -63,7 +62,7 @@ interface NewsApiService {
var request = chain.request()
- if (NewsApplication.isNetworkConnected()) {
+ if (BaseApplication.isNetworkConnected()) {
request = request
.newBuilder()
@@ -98,7 +97,7 @@ interface NewsApiService {
.client(okHttpClient)
.addConverterFactory(MoshiConverterFactory.create())
.build()
- .create(NewsApiService::class.java)
+ .create(NewzzApiService::class.java)
}
}
}
diff --git a/app/src/main/java/com/akash/newzz_compose/data/repository/NewsRepository.kt b/data/src/main/java/com/akash/newzz/data/repository/NewsRepository.kt
similarity index 52%
rename from app/src/main/java/com/akash/newzz_compose/data/repository/NewsRepository.kt
rename to data/src/main/java/com/akash/newzz/data/repository/NewsRepository.kt
index 30aa8be..1a06d00 100644
--- a/app/src/main/java/com/akash/newzz_compose/data/repository/NewsRepository.kt
+++ b/data/src/main/java/com/akash/newzz/data/repository/NewsRepository.kt
@@ -1,7 +1,7 @@
-package com.akash.newzz_compose.data.repository
+package com.akash.newzz.data.repository
-import com.akash.newzz_compose.data.response.NewsResponse
-import com.akash.newzz_compose.utils.Result
+import com.akash.newzz.data.Result
+import com.akash.newzz.data.response.NewsResponse
/**
* Created by Akash on 06/06/20
diff --git a/app/src/main/java/com/akash/newzz_compose/data/repository/NewsRepositoryImpl.kt b/data/src/main/java/com/akash/newzz/data/repository/NewsRepositoryImpl.kt
similarity index 79%
rename from app/src/main/java/com/akash/newzz_compose/data/repository/NewsRepositoryImpl.kt
rename to data/src/main/java/com/akash/newzz/data/repository/NewsRepositoryImpl.kt
index 6583959..d3f4b35 100644
--- a/app/src/main/java/com/akash/newzz_compose/data/repository/NewsRepositoryImpl.kt
+++ b/data/src/main/java/com/akash/newzz/data/repository/NewsRepositoryImpl.kt
@@ -1,9 +1,9 @@
-package com.akash.newzz_compose.data.repository
+package com.akash.newzz.data.repository
-import com.akash.newzz_compose.data.apiservice.NewsApiService
-import com.akash.newzz_compose.data.response.NewsError
-import com.akash.newzz_compose.data.response.NewsResponse
-import com.akash.newzz_compose.utils.Result
+import com.akash.newzz.data.Result
+import com.akash.newzz.data.apiservice.NewzzApiService
+import com.akash.newzz.data.response.NewsError
+import com.akash.newzz.data.response.NewsResponse
import com.squareup.moshi.JsonAdapter
import com.squareup.moshi.Moshi
import kotlinx.coroutines.Dispatchers
@@ -14,10 +14,13 @@ import kotlinx.coroutines.withContext
*/
class NewsRepositoryImpl constructor(
- private val newsApiService: NewsApiService,
+ private val newsApiService: NewzzApiService,
private val moshi: Moshi
) : NewsRepository {
- override suspend fun getArticlesByCategoryAsync(category: String, page: Int): Result {
+ override suspend fun getArticlesByCategoryAsync(
+ category: String,
+ page: Int
+ ): Result {
try {
val response = newsApiService.getArticlesByCateGoryAsync(category)
return if (response.isSuccessful) {
diff --git a/app/src/main/java/com/akash/newzz_compose/data/response/NewsArticle.kt b/data/src/main/java/com/akash/newzz/data/response/NewsArticle.kt
similarity index 87%
rename from app/src/main/java/com/akash/newzz_compose/data/response/NewsArticle.kt
rename to data/src/main/java/com/akash/newzz/data/response/NewsArticle.kt
index e7d7319..4ebee26 100644
--- a/app/src/main/java/com/akash/newzz_compose/data/response/NewsArticle.kt
+++ b/data/src/main/java/com/akash/newzz/data/response/NewsArticle.kt
@@ -1,4 +1,4 @@
-package com.akash.newzz_compose.data.response
+package com.akash.newzz.data.response
import com.squareup.moshi.JsonClass
diff --git a/app/src/main/java/com/akash/newzz_compose/data/response/NewsError.kt b/data/src/main/java/com/akash/newzz/data/response/NewsError.kt
similarity index 82%
rename from app/src/main/java/com/akash/newzz_compose/data/response/NewsError.kt
rename to data/src/main/java/com/akash/newzz/data/response/NewsError.kt
index 51d657e..57d6538 100644
--- a/app/src/main/java/com/akash/newzz_compose/data/response/NewsError.kt
+++ b/data/src/main/java/com/akash/newzz/data/response/NewsError.kt
@@ -1,4 +1,4 @@
-package com.akash.newzz_compose.data.response
+package com.akash.newzz.data.response
import com.squareup.moshi.JsonClass
diff --git a/app/src/main/java/com/akash/newzz_compose/data/response/NewsResponse.kt b/data/src/main/java/com/akash/newzz/data/response/NewsResponse.kt
similarity index 83%
rename from app/src/main/java/com/akash/newzz_compose/data/response/NewsResponse.kt
rename to data/src/main/java/com/akash/newzz/data/response/NewsResponse.kt
index 8a9c6a1..f60cd6b 100644
--- a/app/src/main/java/com/akash/newzz_compose/data/response/NewsResponse.kt
+++ b/data/src/main/java/com/akash/newzz/data/response/NewsResponse.kt
@@ -1,4 +1,4 @@
-package com.akash.newzz_compose.data.response
+package com.akash.newzz.data.response
import com.squareup.moshi.JsonClass
diff --git a/app/src/main/java/com/akash/newzz_compose/data/response/NewsSource.kt b/data/src/main/java/com/akash/newzz/data/response/NewsSource.kt
similarity index 77%
rename from app/src/main/java/com/akash/newzz_compose/data/response/NewsSource.kt
rename to data/src/main/java/com/akash/newzz/data/response/NewsSource.kt
index 3d3a2b3..67403ac 100644
--- a/app/src/main/java/com/akash/newzz_compose/data/response/NewsSource.kt
+++ b/data/src/main/java/com/akash/newzz/data/response/NewsSource.kt
@@ -1,4 +1,4 @@
-package com.akash.newzz_compose.data.response
+package com.akash.newzz.data.response
import com.squareup.moshi.JsonClass
diff --git a/data/src/test/java/com/akash/newzz/data/ExampleUnitTest.kt b/data/src/test/java/com/akash/newzz/data/ExampleUnitTest.kt
new file mode 100644
index 0000000..0bc6b3e
--- /dev/null
+++ b/data/src/test/java/com/akash/newzz/data/ExampleUnitTest.kt
@@ -0,0 +1,16 @@
+package com.akash.newzz.data
+
+import org.junit.Assert.assertEquals
+import org.junit.Test
+
+/**
+ * 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/settings.gradle b/settings.gradle
index dd98e84..3715cd6 100644
--- a/settings.gradle
+++ b/settings.gradle
@@ -1,2 +1,3 @@
+include ':data'
include ':app'
rootProject.name = "Newzz-Compose"
\ No newline at end of file