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());
}