Skip to content

Commit

Permalink
[Android] Add onPreRenderFragmentState callback. (#404)
Browse files Browse the repository at this point in the history
  • Loading branch information
Laimiux committed Dec 5, 2024
1 parent 26d544e commit 94aebd8
Show file tree
Hide file tree
Showing 3 changed files with 8 additions and 1 deletion.
Original file line number Diff line number Diff line change
Expand Up @@ -5,6 +5,7 @@ import android.view.ViewGroup
import androidx.compose.runtime.Composable
import androidx.compose.runtime.rxjava3.subscribeAsState
import androidx.compose.ui.platform.ComposeView
import androidx.compose.ui.platform.ViewCompositionStrategy
import com.instacart.formula.android.FeatureView
import com.instacart.formula.android.ViewFactory
import com.jakewharton.rxrelay3.BehaviorRelay
Expand All @@ -14,6 +15,9 @@ abstract class ComposeViewFactory<RenderModel : Any> : ViewFactory<RenderModel>

override fun create(inflater: LayoutInflater, container: ViewGroup?): FeatureView<RenderModel> {
val view = ComposeView(inflater.context)
// Based-on: https://developer.android.com/develop/ui/compose/migrate/interoperability-apis/compose-in-views#compose-in-fragments
view.setViewCompositionStrategy(ViewCompositionStrategy.DisposeOnViewTreeLifecycleDestroyed)

val outputRelay = BehaviorRelay.create<RenderModel>()
view.setContent {
val model = outputRelay.subscribeAsState(null).value
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -14,13 +14,15 @@ import io.reactivex.rxjava3.disposables.Disposable
* configuration changes. Check [com.instacart.formula.android.StreamConfigurator] for utility methods.
* @param configureActivity This is invoked as part of [com.instacart.formula.FormulaAndroid.onPreCreate]. You can
* use this callback to inject the activity.
* @param onRenderFragmentState This is invoked after [FragmentState] has been updated.
* @param onPreRenderFragmentState This is invoked before [FragmentState] is applied.
* @param onRenderFragmentState This is invoked after [FragmentState] has been applied.
* @param onFragmentLifecycleEvent This is callback for when a fragment is added or removed.
*/
class ActivityStore<Activity : FragmentActivity>(
val fragmentStore: FragmentStore = FragmentStore.EMPTY,
val streams: (StreamConfigurator<Activity>.() -> Disposable)? = null,
val configureActivity: ((Activity) -> Unit)? = null,
val onPreRenderFragmentState: ((Activity, FragmentState) -> Unit)? = null,
val onRenderFragmentState: ((Activity, FragmentState) -> Unit)? = null,
val onFragmentLifecycleEvent: ((FragmentLifecycleEvent) -> Unit)? = null
)
Original file line number Diff line number Diff line change
Expand Up @@ -57,6 +57,7 @@ internal class ActivityManager<Activity : FragmentActivity>(
val renderView = fragmentRenderView ?: throw callOnPreCreateException(activity)

uiSubscription = delegate.fragmentState().subscribe {
store.onPreRenderFragmentState?.invoke(activity, it)
renderView.render(it)
store.onRenderFragmentState?.invoke(activity, it)
}
Expand Down

0 comments on commit 94aebd8

Please sign in to comment.