Java源码示例:com.facebook.litho.widget.ComponentRenderInfo
示例1
@OnEvent(RenderEvent.class)
static RenderInfo onRender(final SectionContext c, @FromEvent Integer model) {
if (model.intValue() == 1) {
return ViewRenderInfo.create()
.viewBinder(
new SimpleViewBinder<TextView>() {
@Override
public void bind(TextView textView) {
textView.setText("I'm a view in a Litho world");
}
})
.viewCreator(VIEW_CREATOR)
.build();
}
return ComponentRenderInfo.create()
.component(
ListItem.create(c)
.color(model % 2 == 0 ? Color.WHITE : Color.LTGRAY)
.title(model + ". Hello, world!")
.subtitle("Litho tutorial")
.build())
.build();
}
示例2
@OnEvent(RenderEvent.class)
static RenderInfo onRender(ComponentContext c, @FromEvent Object model, @FromEvent int index) {
return ComponentRenderInfo.create()
.component(
Row.create(c)
.justifyContent(YogaJustify.CENTER)
.widthDip(120)
.heightDip(120)
.backgroundColor((int) model)
.child(
Text.create(c)
.textSizeSp(20)
.textColor(Color.LTGRAY)
.text(Integer.toString(index))
.verticalGravity(VerticalGravity.CENTER)))
.build();
}
示例3
@OnEvent(RenderEvent.class)
static RenderInfo onRender(ComponentContext c, @FromEvent int index) {
final int numDemos = 5;
Component component;
// Keep alternating between demos
switch (index % numDemos) {
case 0:
component = StoryFooterComponent.create(c).key("footer").build();
break;
case 1:
component = UpDownBlocksComponent.create(c).build();
break;
case 2:
component = LeftRightBlocksComponent.create(c).build();
break;
case 3:
component = OneByOneLeftRightBlocksComponent.create(c).build();
break;
case 4:
component = LeftRightBlocksSequenceComponent.create(c).build();
break;
default:
throw new RuntimeException("Bad index: " + index);
}
return ComponentRenderInfo.create().component(component).build();
}
示例4
public RenderInfo createComponent(ComponentContext c) {
final Component component =
mIsMe
? ExpandableElementMe.create(c)
.messageText(mMessage)
.timestamp(mTimestamp)
.seen(mSeen)
.forceAnimateOnAppear(mForceAnimateOnAppear)
.build()
: ExpandableElementOther.create(c)
.messageText(mMessage)
.timestamp(mTimestamp)
.seen(mSeen)
.build();
return ComponentRenderInfo.create().component(component).build();
}
示例5
@OnEvent(RenderEvent.class)
static RenderInfo onRender(ComponentContext c, @FromEvent Class<? extends Component> model) {
try {
Method createMethod = model.getMethod("create", ComponentContext.class);
Component.Builder componentBuilder = (Component.Builder) createMethod.invoke(null, c);
return ComponentRenderInfo.create().component(componentBuilder.build()).build();
} catch (NoSuchMethodException
| IllegalAccessException
| IllegalArgumentException
| InvocationTargetException ex) {
return ComponentRenderInfo.create()
.component(Text.create(c).textSizeDip(32).text(ex.getLocalizedMessage()).build())
.build();
}
}
示例6
@Test
public void testConsolidateSequentialInserts() throws Exception {
Change[] ops =
new Change[] {
Change.insert(0, ComponentRenderInfo.createEmpty()),
Change.insert(1, ComponentRenderInfo.createEmpty()),
Change.insert(2, ComponentRenderInfo.createEmpty()),
};
executeOperations(ops);
verify(mMockTarget).insertRange(eq(0), eq(3), mListCaptor.capture());
assertThat(ops[0].getRenderInfo()).isEqualTo(mListCaptor.getValue().get(0));
assertThat(ops[1].getRenderInfo()).isEqualTo(mListCaptor.getValue().get(1));
assertThat(ops[2].getRenderInfo()).isEqualTo(mListCaptor.getValue().get(2));
}
示例7
@Test
public void testOnlyConsolidateInsertsIfSequentialIndexes() throws Exception {
Change[] ops =
new Change[] {
Change.insert(0, ComponentRenderInfo.createEmpty()),
Change.insert(1, ComponentRenderInfo.createEmpty()),
Change.insert(20, ComponentRenderInfo.createEmpty()),
};
executeOperations(ops);
verify(mMockTarget).insertRange(eq(0), eq(2), mListCaptor.capture());
assertThat(ops[0].getRenderInfo()).isEqualTo(mListCaptor.getValue().get(0));
assertThat(ops[1].getRenderInfo()).isEqualTo(mListCaptor.getValue().get(1));
verify(mMockTarget).insert(20, ops[2].getRenderInfo());
}
示例8
@Test
public void testDuplicateIndexInserts() throws Exception {
Change[] ops =
new Change[] {
Change.insert(0, ComponentRenderInfo.createEmpty()),
Change.insert(1, ComponentRenderInfo.createEmpty()),
Change.insert(1, ComponentRenderInfo.createEmpty()),
Change.insert(20, ComponentRenderInfo.createEmpty()),
};
executeOperations(ops);
verify(mMockTarget).insertRange(eq(0), eq(2), mListCaptor.capture());
assertThat(ops[0].getRenderInfo()).isEqualTo(mListCaptor.getValue().get(0));
assertThat(ops[1].getRenderInfo()).isEqualTo(mListCaptor.getValue().get(1));
verify(mMockTarget).insert(1, ops[2].getRenderInfo());
verify(mMockTarget).insert(20, ops[3].getRenderInfo());
}
示例9
@Test
public void testConsolidateSequentialUpdates() throws Exception {
Change[] ops =
new Change[] {
Change.update(2, ComponentRenderInfo.createEmpty()),
Change.update(1, ComponentRenderInfo.createEmpty()),
Change.update(20, ComponentRenderInfo.createEmpty()),
Change.update(21, ComponentRenderInfo.createEmpty()),
};
executeOperations(ops);
verify(mMockTarget).updateRange(eq(1), eq(2), mListCaptor.capture());
assertThat(ops[1].getRenderInfo()).isEqualTo(mListCaptor.getValue().get(0));
assertThat(ops[0].getRenderInfo()).isEqualTo(mListCaptor.getValue().get(1));
verify(mMockTarget).updateRange(eq(20), eq(2), mListCaptor.capture());
assertThat(ops[2].getRenderInfo()).isEqualTo(mListCaptor.getValue().get(0));
assertThat(ops[3].getRenderInfo()).isEqualTo(mListCaptor.getValue().get(1));
}
示例10
@Test
public void testDuplicateSequentialUpdatesUseLastComponentInfo() throws Exception {
Change[] ops =
new Change[] {
Change.update(99, ComponentRenderInfo.createEmpty()),
Change.update(100, ComponentRenderInfo.createEmpty()),
Change.update(101, ComponentRenderInfo.createEmpty()),
Change.update(99, ComponentRenderInfo.createEmpty()),
};
executeOperations(ops);
verify(mMockTarget).updateRange(eq(99), eq(3), mListCaptor.capture());
assertThat(ops[3].getRenderInfo()).isEqualTo(mListCaptor.getValue().get(0));
assertThat(ops[1].getRenderInfo()).isEqualTo(mListCaptor.getValue().get(1));
assertThat(ops[2].getRenderInfo()).isEqualTo(mListCaptor.getValue().get(2));
}
示例11
@Test
public void testConsolidateDifferentTypes() throws Exception {
Change[] ops =
new Change[] {
Change.remove(2),
Change.remove(1),
Change.update(99, ComponentRenderInfo.createEmpty()),
Change.update(100, ComponentRenderInfo.createEmpty()),
Change.insert(0, ComponentRenderInfo.createEmpty()),
Change.insert(1, ComponentRenderInfo.createEmpty()),
Change.update(101, ComponentRenderInfo.createEmpty()),
Change.update(99, ComponentRenderInfo.createEmpty()),
Change.move(14, 55),
};
executeOperations(ops);
verify(mMockTarget).deleteRange(1, 2);
verify(mMockTarget).updateRange(eq(99), eq(2), anyList());
verify(mMockTarget).insertRange(eq(0), eq(2), anyList());
verify(mMockTarget).update(101, ops[6].getRenderInfo());
verify(mMockTarget).update(99, ops[7].getRenderInfo());
verify(mMockTarget).move(14, 55);
}
示例12
@Test
public void testLoggerDelete() throws Exception {
assumeThat(
"Logging is only available in debug mode.",
ComponentsConfiguration.IS_INTERNAL_BUILD,
is(true));
Change[] ops =
new Change[] {
Change.insert(0, ComponentRenderInfo.createEmpty()), Change.remove(0),
};
executeOperations(ops);
verify(mMockSectionsDebugLogger)
.logInsert("", 0, ops[0].getRenderInfo(), Thread.currentThread().getName());
verify(mMockSectionsDebugLogger).logDelete("", 0, Thread.currentThread().getName());
}
示例13
@Test
public void testCreateChangeNullInList() {
final List<RenderInfo> renderInfos = new ArrayList<>();
renderInfos.add(ComponentRenderInfo.createEmpty());
renderInfos.add(null);
final Change change = Change.insertRange(0, 5, renderInfos);
assertThat(change.getRenderInfo()).isNotNull();
final List<RenderInfo> changeRenderInfos = change.getRenderInfos();
assertThat(changeRenderInfos).isNotNull();
assertThat(changeRenderInfos.get(0)).isNotNull();
assertThat(changeRenderInfos.get(1)).isNotNull();
}
示例14
@Test
public void testUpdateRange() {
final List<RenderInfo> renderInfos = new ArrayList<>();
final List<Object> oldData = new ArrayList<>();
final List<Object> newData = new ArrayList<>();
for (int i = 0; i < 5; i++) {
renderInfos.add(ComponentRenderInfo.createEmpty());
oldData.add(new Object());
newData.add(new Object());
}
final Change change = Change.updateRange(0, 5, renderInfos, oldData, newData);
assertThat(change.getRenderInfo()).isNotNull();
assertThat(change.getRenderInfos()).isNotEmpty();
assertThat(change.getPrevData()).isEqualTo(oldData);
assertThat(change.getNextData()).isEqualTo(newData);
}
示例15
@Test
public void testAddChange() {
final ChangeSet changeSet = ChangeSet.acquireChangeSet(null, false);
changeSet.addChange(Change.insert(0, ComponentRenderInfo.createEmpty()));
assertThat(changeSet.getCount()).isEqualTo(1);
changeSet.addChange(Change.remove(0));
assertThat(changeSet.getCount()).isEqualTo(0);
changeSet.addChange(Change.insert(0, ComponentRenderInfo.createEmpty()));
assertThat(changeSet.getCount()).isEqualTo(1);
changeSet.addChange(Change.update(0, ComponentRenderInfo.createEmpty()));
assertThat(changeSet.getCount()).isEqualTo(1);
changeSet.addChange(Change.insert(0, ComponentRenderInfo.createEmpty()));
assertThat(changeSet.getCount()).isEqualTo(2);
changeSet.addChange(Change.move(0, 1));
assertThat(changeSet.getCount()).isEqualTo(2);
}
示例16
@Test
public void firstlayout_noDataAttribution() {
final List<RenderInfo> components = new ArrayList<>();
for (int i = 0; i < 3; i++) {
components.add(
ComponentRenderInfo.create()
.component(
SimpleMountSpecTester.create(mComponentContext)
.widthPx(100)
.heightPx(100)
.build())
.build());
}
mRecyclerBinder.insertRangeAt(0, components);
mRecyclerBinder.measure(
new Size(), makeSizeSpec(1000, EXACTLY), makeSizeSpec(1000, EXACTLY), null);
assertThat(mTestLithoStartupLogger.tracePointCount()).isEqualTo(2);
assertThat(mTestLithoStartupLogger.getTracedPointAt(0)).isEqualTo("litho_ui_firstlayout_start");
assertThat(mTestLithoStartupLogger.getTracedPointAt(1)).isEqualTo("litho_ui_firstlayout_end");
}
示例17
@Test
public void firstlayout_withDataAttribution() {
mTestLithoStartupLogger.setDataAttribution("myquery");
final List<RenderInfo> components = new ArrayList<>();
for (int i = 0; i < 3; i++) {
components.add(
ComponentRenderInfo.create()
.component(
SimpleMountSpecTester.create(mComponentContext)
.widthPx(100)
.heightPx(100)
.build())
.build());
}
mRecyclerBinder.insertRangeAt(0, components);
mRecyclerBinder.notifyChangeSetComplete(true, NO_OP_CHANGE_SET_COMPLETE_CALLBACK);
mRecyclerBinder.measure(
new Size(), makeSizeSpec(1000, EXACTLY), makeSizeSpec(1000, EXACTLY), null);
assertThat(mTestLithoStartupLogger.tracePointCount()).isEqualTo(2);
assertThat(mTestLithoStartupLogger.getTracedPointAt(0))
.isEqualTo("litho_ui_myquery_firstlayout_start");
assertThat(mTestLithoStartupLogger.getTracedPointAt(1))
.isEqualTo("litho_ui_myquery_firstlayout_end");
}
示例18
@Test
public void firstmount_noDataAttribution() {
final RecyclerView recyclerView = new RecyclerView(mComponentContext.getAndroidContext());
final List<RenderInfo> components = new ArrayList<>();
for (int i = 0; i < 3; i++) {
components.add(
ComponentRenderInfo.create()
.component(
SimpleMountSpecTester.create(mComponentContext)
.widthPx(100)
.heightPx(100)
.build())
.build());
}
mRecyclerBinder.mount(recyclerView);
mRecyclerBinder.insertRangeAt(0, components);
mRecyclerBinder.notifyChangeSetComplete(true, NO_OP_CHANGE_SET_COMPLETE_CALLBACK);
createBindAndMountLithoView(recyclerView, 0);
assertThat(mTestLithoStartupLogger.tracePointCount()).isEqualTo(0);
}
示例19
@Test
public void testUniqueGlobalKeys() {
final Section leaf1 =
TestSectionCreator.createChangeSetComponent(
"leaf1",
Change.insert(0, ComponentRenderInfo.createEmpty()),
Change.insert(1, ComponentRenderInfo.createEmpty()),
Change.insert(2, ComponentRenderInfo.createEmpty()));
final Section leaf2 =
TestSectionCreator.createChangeSetComponent(
"leaf1",
Change.insert(0, ComponentRenderInfo.createEmpty()),
Change.insert(1, ComponentRenderInfo.createEmpty()));
final Section root = TestSectionCreator.createSectionComponent("node1", leaf1, leaf2);
final TestTarget changeSetHandler = new TestTarget();
SectionTree tree = SectionTree.create(mSectionContext, changeSetHandler).build();
tree.setRoot(root);
assertThat(leaf1.getGlobalKey()).isEqualTo("node1leaf1");
assertThat(leaf2.getGlobalKey()).isEqualTo("node1leaf10");
}
示例20
private static ComponentRenderInfo.Builder addCustomAttributes(
ComponentRenderInfo.Builder builder,
@Nullable Map<String, Object> attributes,
SectionContext c,
Diff<Component> component) {
if (ComponentsConfiguration.isRenderInfoDebuggingEnabled()) {
builder.debugInfo(SONAR_SECTIONS_DEBUG_INFO_TAG, c.getSectionScope());
builder.debugInfo(SONAR_SINGLE_COMPONENT_SECTION_DATA_PREV, component.getPrevious());
builder.debugInfo(SONAR_SINGLE_COMPONENT_SECTION_DATA_NEXT, component.getNext());
}
if (attributes == null) {
return builder;
}
for (Map.Entry<String, Object> entry : attributes.entrySet()) {
builder.customAttribute(entry.getKey(), entry.getValue());
}
return builder;
}
示例21
@OnEvent(RenderEvent.class)
protected static RenderInfo onRender(
SectionContext c, @FromEvent Object model, @Param ComponentContext context) {
return ComponentRenderInfo.create()
.customAttribute("model", model)
.component(Text.create(context).text(model.toString()).build())
.build();
}
示例22
@Override
public RenderInfo createComponent(ComponentContext c) {
return ComponentRenderInfo.create()
.component(DecadeSeparator.create(c).decade(this).build())
.isSticky(true)
.build();
}
示例23
@OnEvent(RenderEvent.class)
static RenderInfo onRender(SectionContext c, @FromEvent DataModel model) {
return ComponentRenderInfo.create()
.component(
Row.create(c)
.child(Text.create(c).text(model.getData()).textSizeDip(30))
.child(RowItem.create(c))
.build())
.build();
}
示例24
@OnEvent(RenderEvent.class)
static RenderInfo onRender(SectionContext c, @FromEvent DataModel model) {
return ComponentRenderInfo.create()
.component(
Row.create(c)
.child(Text.create(c).text(model.getData()).textSizeDip(30))
.child(RowItem.create(c))
.build())
.build();
}
示例25
@OnEvent(RenderEvent.class)
static RenderInfo onRender(
ComponentContext c,
@Prop int selectedItem,
@FromEvent DataModel model,
@FromEvent int index) {
return ComponentRenderInfo.create()
.component(
Row.create(c)
.child(Text.create(c).text(model.getData()).textSizeDip(30))
.child(FixedRowItem.create(c).favourited(selectedItem == index))
.build())
.build();
}
示例26
@OnEvent(RenderEvent.class)
static RenderInfo onRender(SectionContext c, @FromEvent DataModel model) {
return ComponentRenderInfo.create()
.component(
Row.create(c)
.child(Text.create(c).text(model.getData()).textSizeDip(30))
.child(RowItem.create(c))
.build())
.build();
}
示例27
@OnEvent(RenderEvent.class)
static RenderInfo onRender(ComponentContext c, @FromEvent DataModel model) {
return ComponentRenderInfo.create()
.component(
Row.create(c)
.child(Text.create(c).text(model.getData()).textSizeDip(30))
.child(FixedRowItem.create(c).favourited(model.isSelected()))
.build())
.build();
}
示例28
@OnEvent(RenderEvent.class)
static RenderInfo onRender(
ComponentContext c,
@Prop @Nullable int[] parentIndices,
@FromEvent DemoListActivity.DemoListDataModel model,
@FromEvent int index) {
return ComponentRenderInfo.create()
.component(
DemoListItemComponent.create(c)
.model(model)
.currentIndices(getUpdatedIndices(parentIndices, index))
.build())
.build();
}
示例29
@Test
public void testDoNotConsolidateInsertsIfNotIncreasingSequentialIndexes() throws Exception {
Change[] ops =
new Change[] {
Change.insert(10, ComponentRenderInfo.createEmpty()),
Change.insert(9, ComponentRenderInfo.createEmpty()),
Change.insert(20, ComponentRenderInfo.createEmpty()),
};
executeOperations(ops);
verify(mMockTarget).insert(10, ops[0].getRenderInfo());
verify(mMockTarget).insert(9, ops[1].getRenderInfo());
verify(mMockTarget).insert(20, ops[2].getRenderInfo());
}
示例30
@Test
public void testOnlyConsolidateUpdatesIfSequentialIndexes() throws Exception {
Change[] ops =
new Change[] {
Change.update(2, ComponentRenderInfo.createEmpty()),
Change.update(12, ComponentRenderInfo.createEmpty()),
};
executeOperations(ops);
verify(mMockTarget).update(2, ops[0].getRenderInfo());
verify(mMockTarget).update(12, ops[1].getRenderInfo());
}