Remove LayoutViewFactory + refactor FeatureView to make it compose-first#1
Remove LayoutViewFactory + refactor FeatureView to make it compose-first#1iantybo wants to merge 8 commits into
Conversation
|
@coderabbitai full review |
✅ Action performedFull review finished. |
📝 WalkthroughWalkthroughThe ChangesCompose-first rendering migration
Sequence DiagramsequenceDiagram
participant FormulaFragment
participant ComposeView
participant RouteDelegate
participant ComposeViewFactory
FormulaFragment->>ComposeView: onCreateView returns ComposeView
ComposeView->>RouteDelegate: setContent calls Content(routeId, viewFactory, model)
RouteDelegate->>ComposeViewFactory: dispatch → Content(model)
Note over ComposeViewFactory: `@Composable` Content renders UI
FormulaFragment->>RouteDelegate: setState(newState) → setOutput(model) callback
RouteDelegate-->>FormulaFragment: outputState.value updated (MutableState recompose)
Important Pre-merge checks failedPlease resolve all errors before merging. Addressing warnings is optional. ❌ Failed checks (1 error, 1 warning)
✅ Passed checks (5 passed)
✨ Finishing Touches📝 Generate docstrings
🧪 Generate unit tests (beta)
Comment |
There was a problem hiding this comment.
🧹 Nitpick comments (1)
formula-android/src/main/java/com/instacart/formula/android/compose/ComposeViewFactory.kt (1)
16-16: 💤 Low valueType parameter constraint mismatch with target class.
The typealias uses
<R>without the: Anyconstraint, while the targetComposeViewFactoryrequires<RenderModel : Any>. This compiles because the constraint is enforced at the target, but the inconsistency may confuse consumers reviewing the deprecated API.Not in the production outage path - this is a deprecation bridge that will be removed.
Suggested fix
-typealias ComposeViewFactory<R> = com.instacart.formula.android.ComposeViewFactory<R> +typealias ComposeViewFactory<R : Any> = com.instacart.formula.android.ComposeViewFactory<R>🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the rest with a brief reason, keep changes minimal, and validate. In `@formula-android/src/main/java/com/instacart/formula/android/compose/ComposeViewFactory.kt` at line 16, The typealias ComposeViewFactory is missing the type parameter constraint that exists on the target class. Add the `: Any` constraint to the type parameter `R` in the typealias definition to match the target ComposeViewFactory class's type parameter constraint `RenderModel : Any`. This ensures consistency for API consumers and clarifies the expected behavior of the deprecated typealias.
🤖 Prompt for all review comments with AI agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.
Nitpick comments:
In
`@formula-android/src/main/java/com/instacart/formula/android/compose/ComposeViewFactory.kt`:
- Line 16: The typealias ComposeViewFactory is missing the type parameter
constraint that exists on the target class. Add the `: Any` constraint to the
type parameter `R` in the typealias definition to match the target
ComposeViewFactory class's type parameter constraint `RenderModel : Any`. This
ensures consistency for API consumers and clarifies the expected behavior of the
deprecated typealias.
ℹ️ Review info
⚙️ Run configuration
Configuration used: Organization UI
Review profile: CHILL
Plan: Enterprise
Run ID: c18720ee-c39b-468a-b5d3-9c5c906c071a
📒 Files selected for processing (42)
.buildscript/upload_archives.sh.github/workflows/build-workflow.yml.github/workflows/publish.ymlAGENTS.mddocs/Formula-Android.mdformula-android-compose/.gitignoreformula-android-compose/build.gradle.ktsformula-android-compose/gradle.propertiesformula-android-compose/src/main/AndroidManifest.xmlformula-android-compose/src/main/java/com/instacart/formula/android/compose/ComposeViewFactory.ktformula-android-tests/src/test/java/com/instacart/formula/FormulaFragmentTest.ktformula-android-tests/src/test/java/com/instacart/formula/TestFeatureFactory.ktformula-android/build.gradle.ktsformula-android/src/main/java/com/instacart/formula/android/ComposeViewFactory.ktformula-android/src/main/java/com/instacart/formula/android/FeatureFactory.ktformula-android/src/main/java/com/instacart/formula/android/FeatureView.ktformula-android/src/main/java/com/instacart/formula/android/FormulaFragment.ktformula-android/src/main/java/com/instacart/formula/android/LayoutViewFactory.ktformula-android/src/main/java/com/instacart/formula/android/RouteEnvironment.ktformula-android/src/main/java/com/instacart/formula/android/ViewFactory.ktformula-android/src/main/java/com/instacart/formula/android/ViewInstance.ktformula-android/src/main/java/com/instacart/formula/android/compose/ComposeViewFactory.ktformula-android/src/main/java/com/instacart/formula/android/views/DelegateLayoutViewFactory.ktformula-android/src/main/java/com/instacart/formula/android/views/InflatedViewInstance.ktformula-android/src/test/java/com/instacart/formula/android/ViewFactoryTest.ktformula-android/src/test/java/com/instacart/formula/android/views/ViewInstanceTest.ktsamples/navigation-fragments/build.gradle.ktssamples/navigation-fragments/src/main/java/com/instacart/formula/navigation/CounterFragmentViewFactory.ktsamples/stopwatch-compose/build.gradle.ktssamples/stopwatch-compose/src/main/java/com/instacart/formula/compose/stopwatch/StopwatchFeatureFactory.ktsamples/todoapp/build.gradle.ktssamples/todoapp/src/main/java/com/examples/todoapp/data/TaskRepoImpl.ktsamples/todoapp/src/main/java/com/examples/todoapp/tasks/TaskListFeatureFactory.ktsamples/todoapp/src/main/java/com/examples/todoapp/tasks/TaskListRenderView.ktsamples/todoapp/src/main/java/com/examples/todoapp/tasks/TaskListScreen.ktsamples/todoapp/src/main/res/layout/task_item.xmlsamples/todoapp/src/main/res/layout/task_list.xmlsamples/todoapp/src/main/res/menu/tasks_list_menu.xmlsettings.gradle.ktstest-utils/android/build.gradle.ktstest-utils/android/src/main/java/com/instacart/testutils/android/TestViewFactory.kttest-utils/android/src/main/res/layout/test_fragment_layout.xml
💤 Files with no reviewable changes (22)
- samples/todoapp/src/main/res/layout/task_item.xml
- formula-android-compose/.gitignore
- .github/workflows/publish.yml
- samples/todoapp/src/main/res/layout/task_list.xml
- test-utils/android/src/main/res/layout/test_fragment_layout.xml
- formula-android/src/main/java/com/instacart/formula/android/views/InflatedViewInstance.kt
- formula-android-compose/src/main/AndroidManifest.xml
- formula-android/src/test/java/com/instacart/formula/android/ViewFactoryTest.kt
- formula-android/src/main/java/com/instacart/formula/android/FeatureView.kt
- formula-android-compose/gradle.properties
- formula-android/src/test/java/com/instacart/formula/android/views/ViewInstanceTest.kt
- formula-android/src/main/java/com/instacart/formula/android/LayoutViewFactory.kt
- .buildscript/upload_archives.sh
- formula-android-compose/build.gradle.kts
- formula-android/src/main/java/com/instacart/formula/android/ViewInstance.kt
- formula-android/src/main/java/com/instacart/formula/android/views/DelegateLayoutViewFactory.kt
- samples/todoapp/src/main/java/com/examples/todoapp/tasks/TaskListRenderView.kt
- samples/todoapp/src/main/res/menu/tasks_list_menu.xml
- samples/stopwatch-compose/build.gradle.kts
- samples/navigation-fragments/build.gradle.kts
- settings.gradle.kts
- formula-android-compose/src/main/java/com/instacart/formula/android/compose/ComposeViewFactory.kt
Mirror of instacart/formula#511 for CodeRabbit review.
Runs the changes from instacart/formula PR #511 against the same base commit (
f8f1aa3) the original ran against.Original PR: instacart/formula#511
Risk Score: High - Possible Team Escalation Required
Summary
This PR performs a large breaking refactor of the Formula Android framework to a Jetpack Compose-first rendering model. It removes the separate
formula-android-composemodule and consolidates compose rendering intoformula-android, while eliminating the legacy XML/layout-based rendering abstractions (LayoutViewFactory,FeatureView,ViewInstance, andViewFactory.Params/fromLayout).Core Changes
RouteEnvironment.RouteDelegatenow renders via an@Composable Content(...)hook (instead of an imperativecreateView(...)).FormulaFragmentnow uses aComposeView+MutableState(outputState) and wiresrouteDelegate.setOutput(...)to update state.ViewFactorychanged to asealed interface(marker/dispatch surface) and removescreate(...)/Paramsand layout inflation helpers.formula-android.ComposeViewFactorybase class introduced in the main module with@Composable Content(model)and optionalinitialModel().formula-androidsymbol.LayoutViewFactory,FeatureView,ViewInstance, plus related internal classes and tests around those components.Ecosystem / Usage Updates
:formula-android(not:formula-android-compose) and implement@Composable Content(...)instead of XML/layout factory patterns.TestViewFactorynow extendsComposeViewFactoryand drives rendering through Compose).:formula-android-compose.Notable Follow-up Risk
docs/index.mdcontains animplementation 'com.instacart.formula:formula-android-compose:0.7.1'line, which may now be outdated or incorrect relative to the module removal.Impact Assessment
ComposeViewFactory+RouteDelegate.Content(...).