Skip to content

Commit 907f4c3

Browse files
authored
Merge pull request #4 from hadilq/cool-reactive-feature-flags
Feature Flags
2 parents ad08b9e + bc424ac commit 907f4c3

File tree

68 files changed

+736
-312
lines changed

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

68 files changed

+736
-312
lines changed

.gitignore

-10
Original file line numberDiff line numberDiff line change
@@ -1,16 +1,6 @@
11
*.iml
22
.gradle
33
/local.properties
4-
/.idea/caches
5-
/.idea/libraries
6-
/.idea/modules.xml
7-
/.idea/workspace.xml
8-
/.idea/navEditor.xml
9-
/.idea/assetWizardSettings.xml
10-
.idea/gradle.xml
11-
.idea/misc.xml
12-
.idea/runConfigurations.xml
13-
.idea/vcs.xml
144
.DS_Store
155
/build
166
/captures

.idea/.gitignore

+11
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

.idea/jarRepositories.xml

-30
This file was deleted.

README.md

+1-1
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
# Clean Architecture
22

3-
This is a sample app to show best practices up to authors's knowledge by trying to
3+
This is a sample app to show best practices up to author's knowledge by trying to
44
stay close to standard technologies for a highly scalable, maintainable, and testable
55
Android app.
66

app/build.gradle.kts

+10-4
Original file line numberDiff line numberDiff line change
@@ -13,6 +13,10 @@
1313
* See the License for the specific language governing permissions and
1414
* limitations under the License.
1515
*/
16+
import featureflags.installScenario
17+
import featureflags.loadScenarioFromLocal
18+
import featureflags.scenarios
19+
1620

1721
plugins {
1822
id("com.android.application")
@@ -53,20 +57,22 @@ android {
5357
}
5458

5559
packagingOptions {
56-
exclude("META-INF/public_release.kotlin_module")
57-
exclude("META-INF/impl_release.kotlin_module")
60+
exclude("META-INF/*.kotlin_module")
5861
}
5962
}
6063

6164
dependencies {
65+
installScenario(scenarios, project.loadScenarioFromLocal())
66+
6267
implementation(project(Modules.corePublic))
6368
implementation(project(Modules.coreImpl))
69+
implementation(project(Modules.diPublic))
6470
implementation(project(Modules.singleActivityPublic))
6571
implementation(project(Modules.singleActivityImpl))
6672
implementation(project(Modules.guidomiaPublic))
67-
implementation(project(Modules.guidomiaImpl))
6873
implementation(project(Modules.databasePublic))
69-
implementation(project(Modules.databaseImpl))
74+
implementation(project(Modules.featureFlagsPublic))
75+
implementation(project(Modules.featureFlagsImpl))
7076

7177
kapt(Depends.daggerCompiler)
7278

app/src/main/java/com/hadilq/guidomia/CustomApplication.kt

+21-2
Original file line numberDiff line numberDiff line change
@@ -16,12 +16,15 @@
1616
package com.hadilq.guidomia
1717

1818
import android.app.Application
19-
import com.hadilq.guidomia.core.api.di.AppScope
20-
import com.hadilq.guidomia.core.api.di.SingleIn
19+
import com.github.hadilq.commandku.api.CommandHook
20+
import com.github.hadilq.commandku.api.CommandRegister
2121
import com.hadilq.guidomia.di.AppComponent
2222
import com.hadilq.guidomia.di.DaggerAppComponent
23+
import com.hadilq.guidomia.di.api.AppScope
24+
import com.hadilq.guidomia.di.api.SingleIn
2325
import com.hadilq.guidomia.singleactivity.impl.di.SingleActivityComponent
2426
import com.hadilq.guidomia.singleactivity.impl.di.SingleActivityComponentProvider
27+
import javax.inject.Inject
2528

2629
@SingleIn(AppScope::class)
2730
class CustomApplication : Application(), SingleActivityComponentProvider {
@@ -34,4 +37,20 @@ class CustomApplication : Application(), SingleActivityComponentProvider {
3437

3538
override val singleActivityComponentProvider: SingleActivityComponent.Builder
3639
get() = component.singleActivityComponentBuilder()
40+
41+
@Inject
42+
protected lateinit var commandHookSet: Set<@JvmSuppressWildcards CommandHook>
43+
44+
@Inject
45+
protected lateinit var commandRegister: CommandRegister
46+
47+
override fun onCreate() {
48+
super.onCreate()
49+
component.inject(this)
50+
hookUpFeatureFlags()
51+
}
52+
53+
private fun hookUpFeatureFlags() {
54+
commandHookSet.forEach { it.hookUp(commandRegister) }
55+
}
3756
}

app/src/main/java/com/hadilq/guidomia/di/AppComponent.kt

+4-4
Original file line numberDiff line numberDiff line change
@@ -16,8 +16,8 @@
1616
package com.hadilq.guidomia.di
1717

1818
import com.hadilq.guidomia.CustomApplication
19-
import com.hadilq.guidomia.core.api.di.AppScope
20-
import com.hadilq.guidomia.core.api.di.SingleIn
19+
import com.hadilq.guidomia.di.api.AppScope
20+
import com.hadilq.guidomia.di.api.SingleIn
2121
import com.hadilq.guidomia.singleactivity.impl.di.SingleActivityComponent
2222
import com.squareup.anvil.annotations.MergeComponent
2323
import dagger.BindsInstance
@@ -39,7 +39,7 @@ interface AppComponent {
3939
fun build(): AppComponent
4040
}
4141

42+
fun inject(app: CustomApplication)
43+
4244
fun singleActivityComponentBuilder(): SingleActivityComponent.Builder
43-
fun fragmentComponentBuilder(): FragmentComponent.Builder
44-
fun retainComponentBuilder(): RetainComponent.Builder
4545
}

app/src/main/java/com/hadilq/guidomia/di/AppModule.kt

+11
Original file line numberDiff line numberDiff line change
@@ -16,13 +16,24 @@
1616
package com.hadilq.guidomia.di
1717

1818
import android.content.Context
19+
import com.github.hadilq.commandku.api.CommandHook
20+
import com.github.hadilq.commandku.api.CommandRegister
1921
import com.hadilq.guidomia.CustomApplication
22+
import com.hadilq.guidomia.di.api.AppScope
23+
import com.squareup.anvil.annotations.ContributesMultibinding
2024
import dagger.Binds
2125
import dagger.Module
26+
import javax.inject.Inject
2227

2328
@Module
2429
interface AppModule {
2530

2631
@Binds
2732
fun provideContext(app: CustomApplication): Context
2833
}
34+
35+
@ContributesMultibinding(AppScope::class)
36+
class EmptyHook @Inject constructor() : CommandHook {
37+
override fun hookUp(commandRegister: CommandRegister) {
38+
}
39+
}

app/src/main/java/com/hadilq/guidomia/di/fragment/FragmentFactoryImpl.kt

+1-1
Original file line numberDiff line numberDiff line change
@@ -18,7 +18,7 @@ package com.hadilq.guidomia.di.fragment
1818
import androidx.fragment.app.Fragment
1919
import com.hadilq.guidomia.core.api.FragmentFactory
2020
import com.hadilq.guidomia.core.api.SimpleFragmentFactory
21-
import com.hadilq.guidomia.core.api.di.AppScope
21+
import com.hadilq.guidomia.di.api.AppScope
2222
import com.squareup.anvil.annotations.ContributesBinding
2323
import javax.inject.Inject
2424
import kotlin.reflect.KClass

app/src/main/java/com/hadilq/guidomia/di/fragment/GuidomiaFragmentFactory.kt

-34
This file was deleted.

app/src/main/java/com/hadilq/guidomia/di/viewmodel/GuidomiaViewModelFactory.kt

-34
This file was deleted.

app/src/main/java/com/hadilq/guidomia/di/viewmodel/ViewModelFactoryImpl.kt

+1-1
Original file line numberDiff line numberDiff line change
@@ -18,7 +18,7 @@ package com.hadilq.guidomia.di.viewmodel
1818
import androidx.lifecycle.ViewModel
1919
import com.hadilq.guidomia.core.api.SimpleViewModelFactory
2020
import com.hadilq.guidomia.core.api.ViewModelFactory
21-
import com.hadilq.guidomia.core.api.di.AppScope
21+
import com.hadilq.guidomia.di.api.AppScope
2222
import com.squareup.anvil.annotations.ContributesBinding
2323
import javax.inject.Inject
2424

build.gradle.kts

+1-1
Original file line numberDiff line numberDiff line change
@@ -30,4 +30,4 @@ allprojects {
3030
google()
3131
mavenCentral()
3232
}
33-
}
33+
}

buildSrc/src/main/kotlin/Depends.kt

+3
Original file line numberDiff line numberDiff line change
@@ -15,6 +15,7 @@
1515
*/
1616
object Depends {
1717
const val kotlinStdLib = "org.jetbrains.kotlin:kotlin-stdlib:${Versions.kotlin}"
18+
const val kotlinTest = "org.jetbrains.kotlin:kotlin-test:${Versions.kotlin}"
1819
const val coreKtx = "androidx.core:core-ktx:${Versions.coreKtx}"
1920
const val appCompat = "androidx.appcompat:appcompat:${Versions.appCompat}"
2021
const val material = "com.google.android.material:material:${Versions.material}"
@@ -32,6 +33,8 @@ object Depends {
3233
const val roomRuntime = "androidx.room:room-runtime:${Versions.room}"
3334
const val roomCompiler = "androidx.room:room-compiler:${Versions.room}"
3435
const val roomKtx = "androidx.room:room-ktx:${Versions.room}"
36+
const val commandKuApi = "com.github.hadilq:command-ku-api:${Versions.commandKu}"
37+
const val commandKuImpl = "com.github.hadilq:command-ku-impl:${Versions.commandKu}"
3538

3639
const val junit = "junit:junit:${Versions.junit}"
3740
const val junitJupiterApi = "org.junit.jupiter:junit-jupiter-api:${Versions.junitJupiter}"

buildSrc/src/main/kotlin/Modules.kt

+3
Original file line numberDiff line numberDiff line change
@@ -16,10 +16,13 @@
1616
object Modules {
1717
const val corePublic = ":core:public"
1818
const val coreImpl = ":core:impl"
19+
const val diPublic = ":di:public"
1920
const val singleActivityPublic = ":single-activity:public"
2021
const val singleActivityImpl = ":single-activity:impl"
2122
const val guidomiaPublic = ":guidomia:public"
2223
const val guidomiaImpl = ":guidomia:impl"
2324
const val databaseImpl = ":database:impl"
2425
const val databasePublic = ":database:public"
26+
const val featureFlagsImpl = ":feature-flags:impl"
27+
const val featureFlagsPublic = ":feature-flags:public"
2528
}

buildSrc/src/main/kotlin/Versions.kt

+1
Original file line numberDiff line numberDiff line change
@@ -33,6 +33,7 @@ object Versions {
3333
const val serialization = "1.4.30"
3434
const val jsonSerialization = "1.1.0"
3535
const val room = "2.2.6"
36+
const val commandKu = "0.0.1"
3637

3738
const val junit = "4.13.2"
3839
const val junitJupiter = "5.7.1"

0 commit comments

Comments
 (0)