From c122314e76b120344eb74af8c26ceaf10065acdb Mon Sep 17 00:00:00 2001 From: Laimonas Turauskas Date: Wed, 4 Sep 2024 13:48:27 -0400 Subject: [PATCH] Construct ActivityStore directly. --- docs/Formula-Android.md | 20 ++++++++------ docs/index.md | 2 +- .../formula/ActivityLifecycleEventTest.kt | 3 ++- .../instacart/formula/ActivityUpdateTest.kt | 3 ++- .../formula/ActivityUpdateTimingTest.kt | 3 ++- .../formula/FragmentAndroidEventTest.kt | 5 ++-- .../formula/FragmentFlowRenderViewTest.kt | 9 ++++--- .../formula/FragmentLifecycleStateTest.kt | 5 ++-- .../formula/FragmentLifecycleTest.kt | 7 ++--- .../formula/android/ActivityStore.kt | 2 +- .../formula/android/ActivityStoreContext.kt | 27 ------------------- .../android/ActivityStoreFactoryTest.kt | 2 +- .../formula/compose/stopwatch/StopwatchApp.kt | 3 ++- .../main/java/com/examples/todoapp/TodoApp.kt | 3 ++- 14 files changed, 40 insertions(+), 54 deletions(-) diff --git a/docs/Formula-Android.md b/docs/Formula-Android.md index 7c28720ed..09571554a 100644 --- a/docs/Formula-Android.md +++ b/docs/Formula-Android.md @@ -215,9 +215,11 @@ class MyApp : Application() { FormulaAndroid.init(this) { activity(MyActivity::class) { - store(MyActivityComponent(this)) { - bind(CounterFeatureFactory()) - } + ActivityStore( + fragmentStore = FragmentFlowStore.init(MyActivityComponent(this)) { + bind(CounterFeatureFactory()) + } + ) } } } @@ -357,9 +359,11 @@ Now that we have our dependencies configured, let's bind the flow factory to our val appComponent = AppComponent() FormulaAndroid.init(this) { activity(MyActivity::class) { - store(appComponent) { - bind(AuthFlowFactory()) - } + ActivityStore( + fragmentStore = FragmentFlowStore.init(appComponent) { + bind(AuthFlowFactory()) + } + ) } } ``` @@ -393,7 +397,7 @@ class MyApp : Application() { FormulaAndroid.init(this) { activity { - store( + ActivityStore( streams = { // You can subscribe to your RxJava streams here. val timerState = Observable @@ -453,7 +457,7 @@ FormulaAndroid.init(this) { // This component will survive configuration changes. val activityComponent = appComponent.createMyActivityComponent() - store( + ActivityStore( configureActivity = { // in this callback `this` is the instance of MyActivity // so we can use it to inject dependencies diff --git a/docs/index.md b/docs/index.md index cc8315372..10ddd5ea5 100755 --- a/docs/index.md +++ b/docs/index.md @@ -169,7 +169,7 @@ class MyApp : Application() { FormulaAndroid.init(this) { activity { - store( + ActivityStore( streams = { val formula = CounterFormula() update(formula.toObservable(), MyActivity::render) diff --git a/formula-android-tests/src/test/java/com/instacart/formula/ActivityLifecycleEventTest.kt b/formula-android-tests/src/test/java/com/instacart/formula/ActivityLifecycleEventTest.kt index 19dd4929a..2b097bd86 100644 --- a/formula-android-tests/src/test/java/com/instacart/formula/ActivityLifecycleEventTest.kt +++ b/formula-android-tests/src/test/java/com/instacart/formula/ActivityLifecycleEventTest.kt @@ -6,6 +6,7 @@ import androidx.test.core.app.ActivityScenario import androidx.test.ext.junit.rules.ActivityScenarioRule import androidx.test.ext.junit.runners.AndroidJUnit4 import com.google.common.truth.Truth.assertThat +import com.instacart.formula.android.ActivityStore import com.instacart.formula.android.FormulaAppCompatActivity import org.junit.Before import org.junit.Rule @@ -25,7 +26,7 @@ class ActivityLifecycleEventTest { FormulaAndroid.init(app) { activity { events = mutableListOf() - store( + ActivityStore( streams = { activityLifecycleState().subscribe { events.add(it) diff --git a/formula-android-tests/src/test/java/com/instacart/formula/ActivityUpdateTest.kt b/formula-android-tests/src/test/java/com/instacart/formula/ActivityUpdateTest.kt index 2758fbd58..349d296a4 100644 --- a/formula-android-tests/src/test/java/com/instacart/formula/ActivityUpdateTest.kt +++ b/formula-android-tests/src/test/java/com/instacart/formula/ActivityUpdateTest.kt @@ -5,6 +5,7 @@ import androidx.test.core.app.ActivityScenario import androidx.test.ext.junit.rules.ActivityScenarioRule import androidx.test.ext.junit.runners.AndroidJUnit4 import com.google.common.truth.Truth.assertThat +import com.instacart.formula.android.ActivityStore import com.instacart.formula.android.FormulaAppCompatActivity import com.jakewharton.rxrelay3.PublishRelay import org.junit.Before @@ -35,7 +36,7 @@ class ActivityUpdateTest { initFormula = { app -> FormulaAndroid.init(app) { activity { - store( + ActivityStore( streams = { update(updateRelay, TestActivity::applyUpdate) } diff --git a/formula-android-tests/src/test/java/com/instacart/formula/ActivityUpdateTimingTest.kt b/formula-android-tests/src/test/java/com/instacart/formula/ActivityUpdateTimingTest.kt index abfd6e663..1b3b2b5b1 100644 --- a/formula-android-tests/src/test/java/com/instacart/formula/ActivityUpdateTimingTest.kt +++ b/formula-android-tests/src/test/java/com/instacart/formula/ActivityUpdateTimingTest.kt @@ -5,6 +5,7 @@ import androidx.test.core.app.ActivityScenario import androidx.test.ext.junit.rules.ActivityScenarioRule import androidx.test.ext.junit.runners.AndroidJUnit4 import com.google.common.truth.Truth.assertThat +import com.instacart.formula.android.ActivityStore import com.instacart.formula.android.FormulaAppCompatActivity import io.reactivex.rxjava3.core.Observable import org.junit.Before @@ -38,7 +39,7 @@ class ActivityUpdateTimingTest { initFormula = { app -> FormulaAndroid.init(app) { activity { - store( + ActivityStore( streams = { update(updateRelay, TestActivity::applyUpdate) } diff --git a/formula-android-tests/src/test/java/com/instacart/formula/FragmentAndroidEventTest.kt b/formula-android-tests/src/test/java/com/instacart/formula/FragmentAndroidEventTest.kt index 2f487fa84..771f94825 100644 --- a/formula-android-tests/src/test/java/com/instacart/formula/FragmentAndroidEventTest.kt +++ b/formula-android-tests/src/test/java/com/instacart/formula/FragmentAndroidEventTest.kt @@ -4,6 +4,7 @@ import androidx.test.core.app.ActivityScenario import androidx.test.ext.junit.rules.ActivityScenarioRule import androidx.test.ext.junit.runners.AndroidJUnit4 import com.google.common.truth.Truth.assertThat +import com.instacart.formula.android.ActivityStore import com.instacart.formula.android.Feature import com.instacart.formula.android.FeatureFactory import com.instacart.formula.android.FragmentFlowStore @@ -26,9 +27,9 @@ class FragmentAndroidEventTest { initFormula = { app -> FormulaAndroid.init(app) { activity { - store( + ActivityStore( configureActivity = { - initialContract = TestLifecycleKey() + it.initialContract = TestLifecycleKey() }, fragmentStore = FragmentFlowStore.init { val featureFactory = object : FeatureFactory { diff --git a/formula-android-tests/src/test/java/com/instacart/formula/FragmentFlowRenderViewTest.kt b/formula-android-tests/src/test/java/com/instacart/formula/FragmentFlowRenderViewTest.kt index 6520c38c7..85912ff0f 100644 --- a/formula-android-tests/src/test/java/com/instacart/formula/FragmentFlowRenderViewTest.kt +++ b/formula-android-tests/src/test/java/com/instacart/formula/FragmentFlowRenderViewTest.kt @@ -7,6 +7,7 @@ import androidx.test.core.app.ActivityScenario import androidx.test.ext.junit.rules.ActivityScenarioRule import androidx.test.ext.junit.runners.AndroidJUnit4 import com.google.common.truth.Truth.assertThat +import com.instacart.formula.android.ActivityStore import com.instacart.formula.android.FragmentFlowState import com.instacart.formula.android.FragmentKey import com.instacart.formula.android.BackCallback @@ -40,10 +41,10 @@ class FragmentFlowRenderViewTest { initFormula = { app -> FormulaAndroid.init(app) { activity { - store( - configureActivity = { - initialContract = TestKey() - onPreCreated(this) + ActivityStore( + configureActivity = { activity -> + activity.initialContract = TestKey() + onPreCreated(activity) }, onRenderFragmentState = { a, state -> lastState = state diff --git a/formula-android-tests/src/test/java/com/instacart/formula/FragmentLifecycleStateTest.kt b/formula-android-tests/src/test/java/com/instacart/formula/FragmentLifecycleStateTest.kt index 1125d2620..1aeeab506 100644 --- a/formula-android-tests/src/test/java/com/instacart/formula/FragmentLifecycleStateTest.kt +++ b/formula-android-tests/src/test/java/com/instacart/formula/FragmentLifecycleStateTest.kt @@ -4,6 +4,7 @@ import androidx.test.core.app.ActivityScenario import androidx.test.ext.junit.rules.ActivityScenarioRule import androidx.test.ext.junit.runners.AndroidJUnit4 import com.google.common.truth.Truth.assertThat +import com.instacart.formula.android.ActivityStore import com.instacart.formula.android.FormulaFragment import com.instacart.formula.android.ActivityStoreContext import com.instacart.formula.android.FeatureFactory @@ -33,9 +34,9 @@ class FragmentLifecycleStateTest { started = mutableListOf() resumed = mutableListOf() - store( + ActivityStore( configureActivity = { - initialContract = TestKey() + it.initialContract = TestKey() }, fragmentStore = FragmentFlowStore.init { bind(featureFactory(this@activity)) diff --git a/formula-android-tests/src/test/java/com/instacart/formula/FragmentLifecycleTest.kt b/formula-android-tests/src/test/java/com/instacart/formula/FragmentLifecycleTest.kt index 7939fe90b..fedb82b5e 100644 --- a/formula-android-tests/src/test/java/com/instacart/formula/FragmentLifecycleTest.kt +++ b/formula-android-tests/src/test/java/com/instacart/formula/FragmentLifecycleTest.kt @@ -6,6 +6,7 @@ import android.os.Bundle import androidx.test.core.app.ApplicationProvider import androidx.test.ext.junit.runners.AndroidJUnit4 import com.google.common.truth.Truth.assertThat +import com.instacart.formula.android.ActivityStore import com.instacart.formula.android.Feature import com.instacart.formula.android.FeatureFactory import com.instacart.formula.android.FragmentFlowStore @@ -31,11 +32,11 @@ class FragmentLifecycleTest { @get:Rule val formulaRule = TestFormulaRule(initFormula = { app -> FormulaAndroid.init(app) { activity { - store( - configureActivity = { + ActivityStore( + configureActivity = { activity -> lifecycleCallback = TestFragmentLifecycleCallback() contract = TestLifecycleKey() - initialContract = contract + activity.initialContract = contract }, fragmentStore = FragmentFlowStore.init { val featureFactory = object : FeatureFactory { diff --git a/formula-android/src/main/java/com/instacart/formula/android/ActivityStore.kt b/formula-android/src/main/java/com/instacart/formula/android/ActivityStore.kt index ee44fb7e2..0bc9f0cd6 100644 --- a/formula-android/src/main/java/com/instacart/formula/android/ActivityStore.kt +++ b/formula-android/src/main/java/com/instacart/formula/android/ActivityStore.kt @@ -18,7 +18,7 @@ import io.reactivex.rxjava3.disposables.Disposable * @param onFragmentLifecycleEvent This is callback for when a fragment is added or removed. */ class ActivityStore( - val fragmentStore: FragmentFlowStore, + val fragmentStore: FragmentFlowStore = FragmentFlowStore.EMPTY, val streams: (StreamConfigurator.() -> Disposable)? = null, val configureActivity: ((Activity) -> Unit)? = null, val onRenderFragmentState: ((Activity, FragmentFlowState) -> Unit)? = null, diff --git a/formula-android/src/main/java/com/instacart/formula/android/ActivityStoreContext.kt b/formula-android/src/main/java/com/instacart/formula/android/ActivityStoreContext.kt index b3e5b66c5..c3141800c 100644 --- a/formula-android/src/main/java/com/instacart/formula/android/ActivityStoreContext.kt +++ b/formula-android/src/main/java/com/instacart/formula/android/ActivityStoreContext.kt @@ -69,31 +69,4 @@ abstract class ActivityStoreContext { * it will do nothing. */ abstract fun send(effect: Activity.() -> Unit) - - /** - * Creates an [ActivityStore]. - * - * @param configureActivity This is called when activity is created before view inflation. You can use this to - * configure / inject the activity. - * @param onRenderFragmentState This is called after [FragmentFlowState] is applied to UI. - * @param onFragmentLifecycleEvent This is called after each [FragmentLifecycleEvent]. - * @param streams This provides ability to configure arbitrary RxJava streams that survive - * configuration changes. Check [StreamConfigurator] for utility methods. - * @param fragmentStore [FragmentFlowStore] used to provide state management for individual screens. - */ - fun store( - configureActivity: (ActivityT.() -> Unit)? = null, - onRenderFragmentState: ((ActivityT, FragmentFlowState) -> Unit)? = null, - onFragmentLifecycleEvent: ((FragmentLifecycleEvent) -> Unit)? = null, - streams: (StreamConfigurator.() -> Disposable)? = null, - fragmentStore: FragmentFlowStore = FragmentFlowStore.EMPTY, - ): ActivityStore { - return ActivityStore( - fragmentStore = fragmentStore, - configureActivity = configureActivity, - onFragmentLifecycleEvent = onFragmentLifecycleEvent, - onRenderFragmentState = onRenderFragmentState, - streams = streams - ) - } } diff --git a/formula-android/src/test/java/com/instacart/formula/android/ActivityStoreFactoryTest.kt b/formula-android/src/test/java/com/instacart/formula/android/ActivityStoreFactoryTest.kt index df7b7f086..13414be72 100644 --- a/formula-android/src/test/java/com/instacart/formula/android/ActivityStoreFactoryTest.kt +++ b/formula-android/src/test/java/com/instacart/formula/android/ActivityStoreFactoryTest.kt @@ -18,7 +18,7 @@ class ActivityStoreFactoryTest { environment = FragmentEnvironment(), activities = { activity(FakeActivity::class) { - store() + ActivityStore() } } ) diff --git a/samples/stopwatch-compose/src/main/java/com/instacart/formula/compose/stopwatch/StopwatchApp.kt b/samples/stopwatch-compose/src/main/java/com/instacart/formula/compose/stopwatch/StopwatchApp.kt index c263decbe..21e2fdc49 100644 --- a/samples/stopwatch-compose/src/main/java/com/instacart/formula/compose/stopwatch/StopwatchApp.kt +++ b/samples/stopwatch-compose/src/main/java/com/instacart/formula/compose/stopwatch/StopwatchApp.kt @@ -3,6 +3,7 @@ package com.instacart.formula.compose.stopwatch import android.app.Application import android.util.Log import com.instacart.formula.FormulaAndroid +import com.instacart.formula.android.ActivityStore import com.instacart.formula.android.FragmentEnvironment import com.instacart.formula.android.FragmentFlowStore @@ -20,7 +21,7 @@ class StopwatchApp : Application() { ), activities = { activity { - store( + ActivityStore( fragmentStore = FragmentFlowStore.init(Unit) { bind(StopwatchFeatureFactory()) } diff --git a/samples/todoapp/src/main/java/com/examples/todoapp/TodoApp.kt b/samples/todoapp/src/main/java/com/examples/todoapp/TodoApp.kt index ae4a785f9..b6e983f63 100644 --- a/samples/todoapp/src/main/java/com/examples/todoapp/TodoApp.kt +++ b/samples/todoapp/src/main/java/com/examples/todoapp/TodoApp.kt @@ -4,6 +4,7 @@ import android.app.Application import android.util.Log import com.examples.todoapp.tasks.TaskListFeatureFactory import com.instacart.formula.FormulaAndroid +import com.instacart.formula.android.ActivityStore import com.instacart.formula.android.FragmentEnvironment import com.instacart.formula.android.FragmentFlowStore @@ -23,7 +24,7 @@ class TodoApp : Application() { activity { val component = TodoAppComponent(this) - store( + ActivityStore( fragmentStore = FragmentFlowStore.init(component) { bind(TaskListFeatureFactory()) }