Skip to content

Commit 73aaf07

Browse files
committed
started on "data" related arch
1 parent 2b2de08 commit 73aaf07

33 files changed

+324
-45
lines changed

app/build.gradle

Lines changed: 40 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -2,11 +2,13 @@ plugins {
22
id 'com.android.application'
33
id 'kotlin-android'
44
id 'kotlin-kapt'
5+
id 'org.jetbrains.kotlin.plugin.serialization' version '1.4.20'
56
}
67

78
android {
89
compileSdkVersion 30
910
buildToolsVersion "30.0.2"
11+
flavorDimensions "default"
1012

1113
defaultConfig {
1214
applicationId "com.monstarlab"
@@ -26,25 +28,53 @@ android {
2628
proguardFiles getDefaultProguardFile('proguard-android-optimize.txt'), 'proguard-rules.pro'
2729
}
2830
}
31+
32+
productFlavors {
33+
dev {
34+
dimension "default"
35+
applicationIdSuffix ".dev"
36+
manifestPlaceholders = [
37+
APP_NAME: "MonstarlabDev"
38+
]
39+
buildConfigField "String", "API_URL", "\"https://jsonplaceholder.typicode.com\""
40+
}
41+
staging {
42+
dimension "default"
43+
applicationIdSuffix ".staging"
44+
//signingConfig signingConfigs.staging
45+
manifestPlaceholders = [
46+
APP_NAME: "MonstarlabStaging"
47+
]
48+
buildConfigField "String", "API_URL", "\"https://jsonplaceholder.typicode.com\""
49+
}
50+
production {
51+
dimension "default"
52+
//signingConfig signingConfigs.production
53+
manifestPlaceholders = [
54+
APP_NAME: "Monstarlab",
55+
]
56+
buildConfigField "String", "API_URL", "\"https://jsonplaceholder.typicode.com\""
57+
}
58+
}
59+
2960
compileOptions {
3061
sourceCompatibility JavaVersion.VERSION_1_8
3162
targetCompatibility JavaVersion.VERSION_1_8
3263
}
3364
kotlinOptions {
3465
jvmTarget = '1.8'
35-
freeCompilerArgs += [
36-
'-Xuse-experimental=kotlinx.coroutines.ExperimentalCoroutinesApi'
37-
]
3866
}
3967
}
4068

4169
dependencies {
4270

4371
implementation "org.jetbrains.kotlin:kotlin-stdlib:$versions.kotlin"
44-
def coroutinesVersion = "1.3.9"
72+
def coroutinesVersion = "1.4.2"
4573

4674
implementation "org.jetbrains.kotlinx:kotlinx-coroutines-android:$coroutinesVersion"
4775
implementation "org.jetbrains.kotlinx:kotlinx-coroutines-jdk8:$coroutinesVersion"
76+
implementation "org.jetbrains.kotlinx:kotlinx-serialization-json:1.0.1"
77+
4878
implementation 'androidx.core:core-ktx:1.3.2'
4979
implementation 'androidx.appcompat:appcompat:1.2.0'
5080
implementation 'com.google.android.material:material:1.2.1'
@@ -58,8 +88,12 @@ dependencies {
5888
kapt "com.google.dagger:dagger-compiler:${versions.dagger}"
5989
kapt "com.google.dagger:dagger-android-processor:${versions.dagger}"
6090

61-
implementation("androidx.navigation:navigation-fragment-ktx:2.3.1")
62-
implementation("androidx.navigation:navigation-ui-ktx:2.3.1")
91+
implementation("com.jakewharton.retrofit:retrofit2-kotlinx-serialization-converter:0.8.0")
92+
implementation("com.squareup.retrofit2:retrofit:2.9.0")
93+
implementation("com.squareup.okhttp3:logging-interceptor:4.9.0")
94+
95+
implementation("androidx.navigation:navigation-fragment-ktx:2.3.2")
96+
implementation("androidx.navigation:navigation-ui-ktx:2.3.2")
6397

6498
def lifecycle = "2.2.0"
6599
implementation("androidx.lifecycle:lifecycle-livedata-core-ktx:$lifecycle")

app/src/main/java/com/monstarlab/base/BaseActivity.kt renamed to app/src/main/java/com/monstarlab/arch/base/BaseActivity.kt

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,12 +1,12 @@
1-
package com.monstarlab.base
1+
package com.monstarlab.arch.base
22

33
import android.os.Bundle
44
import androidx.annotation.LayoutRes
55
import androidx.appcompat.app.AppCompatActivity
66
import androidx.lifecycle.ViewModel
77
import androidx.lifecycle.ViewModelProvider
8-
import com.monstarlab.extensions.getViewModel
9-
import com.monstarlab.extensions.lifecycleAwareLazy
8+
import com.monstarlab.arch.extensions.getViewModel
9+
import com.monstarlab.arch.extensions.lifecycleAwareLazy
1010
import dagger.android.AndroidInjection
1111
import dagger.android.DispatchingAndroidInjector
1212
import dagger.android.HasAndroidInjector

app/src/main/java/com/monstarlab/base/BaseFragment.kt renamed to app/src/main/java/com/monstarlab/arch/base/BaseFragment.kt

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
package com.monstarlab.base
1+
package com.monstarlab.arch.base
22

33
import android.content.Context
44
import android.os.Bundle
@@ -10,9 +10,9 @@ import dagger.android.DispatchingAndroidInjector
1010
import dagger.android.HasAndroidInjector
1111
import dagger.android.support.AndroidSupportInjection
1212
import com.google.android.material.transition.MaterialFadeThrough
13-
import com.monstarlab.extensions.getSharedViewModel
14-
import com.monstarlab.extensions.getViewModel
15-
import com.monstarlab.extensions.lifecycleAwareLazy
13+
import com.monstarlab.arch.extensions.getSharedViewModel
14+
import com.monstarlab.arch.extensions.getViewModel
15+
import com.monstarlab.arch.extensions.lifecycleAwareLazy
1616
import javax.inject.Inject
1717

1818
abstract class BaseFragment : Fragment, HasAndroidInjector {
Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,8 @@
1+
package com.monstarlab.arch.data
2+
3+
interface DataSource<T> {
4+
fun getAll(): List<T>
5+
fun add(item: T)
6+
fun addAll(items: List<T>)
7+
fun clear()
8+
}
Lines changed: 21 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,21 @@
1+
package com.monstarlab.arch.data
2+
3+
import java.util.concurrent.TimeUnit
4+
5+
abstract class Repository constructor(
6+
private val expirationInSeconds: Long = 30
7+
) {
8+
9+
private var lastFetch = 0L
10+
11+
protected val shouldFetch: Boolean
12+
get() {
13+
return TimeUnit.MILLISECONDS.toSeconds(System.currentTimeMillis() - lastFetch) >= expirationInSeconds
14+
}
15+
16+
protected fun fetched() {
17+
lastFetch = System.currentTimeMillis()
18+
}
19+
20+
21+
}
Lines changed: 43 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,43 @@
1+
package com.monstarlab.arch.data
2+
3+
import android.content.SharedPreferences
4+
import kotlinx.serialization.decodeFromString
5+
import kotlinx.serialization.encodeToString
6+
import kotlinx.serialization.json.Json
7+
import java.lang.Exception
8+
9+
abstract class SharedPreferenceDataStore<T> constructor(
10+
private val sharedPreferences: SharedPreferences
11+
): DataSource<T> {
12+
13+
private val key = this.javaClass.simpleName
14+
15+
override fun getAll(): List<T> {
16+
return try {
17+
val json = sharedPreferences.getString(key, "") ?: ""
18+
val entries = Json.decodeFromString<List<T>>(json)
19+
entries
20+
} catch (e: Exception) {
21+
emptyList()
22+
}
23+
}
24+
25+
override fun add(item: T) {
26+
val list = getAll().toMutableList()
27+
list.add(item)
28+
addAll(list)
29+
}
30+
31+
override fun addAll(items: List<T>) {
32+
try {
33+
val json = Json.encodeToString(items)
34+
sharedPreferences.edit().putString(key, json).apply()
35+
} catch (e: Exception) {
36+
37+
}
38+
}
39+
40+
override fun clear() {
41+
sharedPreferences.edit().remove(key).apply()
42+
}
43+
}

app/src/main/java/com/monstarlab/extensions/ActivityViewBindingDelegate.kt renamed to app/src/main/java/com/monstarlab/arch/extensions/ActivityViewBindingDelegate.kt

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
package com.monstarlab.extensions
1+
package com.monstarlab.arch.extensions
22

33
import android.view.LayoutInflater
44
import androidx.appcompat.app.AppCompatActivity

app/src/main/java/com/monstarlab/extensions/FlowExtensions.kt renamed to app/src/main/java/com/monstarlab/arch/extensions/FlowExtensions.kt

Lines changed: 1 addition & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,5 @@
1-
package com.monstarlab.extensions
1+
package com.monstarlab.arch.extensions
22

3-
import androidx.fragment.app.Fragment
4-
import androidx.lifecycle.LifecycleCoroutineScope
5-
import androidx.lifecycle.lifecycleScope
63
import kotlinx.coroutines.CoroutineScope
74
import kotlinx.coroutines.flow.Flow
85
import kotlinx.coroutines.flow.collect

app/src/main/java/com/monstarlab/extensions/FragmentViewBindingDelegate.kt renamed to app/src/main/java/com/monstarlab/arch/extensions/FragmentViewBindingDelegate.kt

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
package com.monstarlab.extensions
1+
package com.monstarlab.arch.extensions
22

33
import android.view.View
44
import androidx.fragment.app.Fragment

app/src/main/java/com/monstarlab/extensions/GlobalViewBindingDelegate.kt renamed to app/src/main/java/com/monstarlab/arch/extensions/GlobalViewBindingDelegate.kt

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
package com.monstarlab.extensions
1+
package com.monstarlab.arch.extensions
22

33
import android.view.View
44
import androidx.viewbinding.ViewBinding

0 commit comments

Comments
 (0)