public static int extractWrappedViewType(long packedViewType) { final int segment = (int)(packedViewType >>> 32) & 0xFFFF; final int viewType = (int) (packedViewType & 0xFFFFFFFFL); return ItemViewTypeComposer.composeSegment(segment, viewType); }
/** * Gets group view type from a raw view type. * * @param rawViewType raw view type value (return value of {@link androidx.recyclerview.widget.RecyclerView.ViewHolder#getItemViewType()}) * @return Group view type for the given raw view type. */ public static int getGroupViewType(int rawViewType) { return ItemViewTypeComposer.extractWrappedViewTypePart(rawViewType); }
/** * Checks whether the passed view type is a group's one. * * @param rawViewType raw view type value (return value of {@link androidx.recyclerview.widget.RecyclerView.ViewHolder#getItemViewType()}) * @return True for the a group view type, otherwise false */ public static boolean isGroupViewType(int rawViewType) { return ItemViewTypeComposer.isExpandableGroup(rawViewType); }
public int wrapItemViewType(int segment, int viewType) { final int packedSegments = (segment << 16) | ItemViewTypeComposer.extractSegmentPart(viewType); final int flattenSegments; final int index = mWrapSegmentMap.indexOfKey(packedSegments); if (index >= 0) { flattenSegments = mWrapSegmentMap.valueAt(index); } else { flattenSegments = mWrapSegmentMap.size() + 1; if (flattenSegments > ItemViewTypeComposer.MAX_SEGMENT) { throw new IllegalStateException("Failed to allocate a new wrapped view type."); } mWrapSegmentMap.put(packedSegments, flattenSegments); mUnwrapSegmentMap.put(flattenSegments, packedSegments); } return ItemViewTypeComposer.composeSegment(flattenSegments, viewType); }
public long unwrapViewType(int viewType) { final int flattenSegment = ItemViewTypeComposer.extractSegmentPart(viewType); final int index = mUnwrapSegmentMap.indexOfKey(flattenSegment); if (index < 0) { throw new IllegalStateException("Corresponding wrapped view type is not found!"); } final int packedSegments = mUnwrapSegmentMap.valueAt(index); //noinspection BooleanMethodIsAlwaysInverted final long packedViewType = (((long) packedSegments) << 32) | (((long) viewType) & 0xFFFFFFFFL); return packedViewType; }
@Test public void extractSegmentPart() throws Exception { // zero assertThat(ItemViewTypeComposer.extractSegmentPart(0), is(0)); // one assertThat(ItemViewTypeComposer.extractSegmentPart(1 << ItemViewTypeComposer.BIT_OFFSET_SEGMENT), is(1)); // min assertThat(ItemViewTypeComposer.extractSegmentPart(ItemViewTypeComposer.MIN_SEGMENT << ItemViewTypeComposer.BIT_OFFSET_SEGMENT), is(ItemViewTypeComposer.MIN_SEGMENT)); // max assertThat(ItemViewTypeComposer.extractSegmentPart(ItemViewTypeComposer.MAX_SEGMENT << ItemViewTypeComposer.BIT_OFFSET_SEGMENT), is(ItemViewTypeComposer.MAX_SEGMENT)); // etc - 1 assertThat(ItemViewTypeComposer.extractSegmentPart(ItemViewTypeComposer.BIT_MASK_EXPANDABLE_FLAG | ItemViewTypeComposer.BIT_MASK_WRAPPED_VIEW_TYPE), is(0)); // etc - 2 assertThat(ItemViewTypeComposer.extractSegmentPart(ItemViewTypeComposer.BIT_MASK_SEGMENT), is(ItemViewTypeComposer.MAX_SEGMENT)); }
@Test public void composeSegment() throws Exception { // zero assertThat(ItemViewTypeComposer.composeSegment(0, 0), is(0)); // one assertThat(ItemViewTypeComposer.composeSegment(1, 0), is(1 << ItemViewTypeComposer.BIT_OFFSET_SEGMENT)); // min assertThat(ItemViewTypeComposer.composeSegment(ItemViewTypeComposer.MIN_SEGMENT, 0), is(ItemViewTypeComposer.MIN_SEGMENT << ItemViewTypeComposer.BIT_OFFSET_SEGMENT)); // max assertThat(ItemViewTypeComposer.composeSegment(ItemViewTypeComposer.MAX_SEGMENT, 0), is(ItemViewTypeComposer.MAX_SEGMENT << ItemViewTypeComposer.BIT_OFFSET_SEGMENT)); }
/** * Gets child view type from a raw view type. * * @param rawViewType raw view type value (return value of {@link androidx.recyclerview.widget.RecyclerView.ViewHolder#getItemViewType()}) * @return Child view type for the given raw view type. */ public static int getChildViewType(int rawViewType) { return ItemViewTypeComposer.extractWrappedViewTypePart(rawViewType); }
/** * {@inheritDoc} */ @Override public long getItemId(int position) { final long segmentedPosition = getSegmentedPosition(position); final int segment = AdaptersSet.extractSegment(segmentedPosition); final int offset = AdaptersSet.extractSegmentOffset(segmentedPosition); final RecyclerView.Adapter adapter = mAdaptersSet.getAdapter(segment); final int rawViewType = adapter.getItemViewType(offset); final long rawId = adapter.getItemId(offset); final int wrappedViewType = mViewTypeTranslator.wrapItemViewType(segment, rawViewType); final int wrappedSegment = ItemViewTypeComposer.extractSegmentPart(wrappedViewType); return ItemIdComposer.composeSegment(wrappedSegment, rawId); }
@Test public void isExpandableGroup() throws Exception { // zero assertThat(ItemViewTypeComposer.isExpandableGroup(0), is(false)); // not group - 1 assertThat(ItemViewTypeComposer.isExpandableGroup(ItemViewTypeComposer.BIT_MASK_SEGMENT), is(false)); // not group - 2 assertThat(ItemViewTypeComposer.isExpandableGroup(ItemViewTypeComposer.BIT_MASK_WRAPPED_VIEW_TYPE), is(false)); // is group - 1 assertThat(ItemViewTypeComposer.isExpandableGroup(ItemViewTypeComposer.BIT_MASK_EXPANDABLE_FLAG), is(true)); // is group - 2 assertThat(ItemViewTypeComposer.isExpandableGroup(ItemViewTypeComposer.BIT_MASK_EXPANDABLE_FLAG | ItemViewTypeComposer.BIT_MASK_SEGMENT | ItemViewTypeComposer.BIT_MASK_WRAPPED_VIEW_TYPE), is(true)); }
@Test public void composeSegment_MinOutOfRange() throws Exception { thrown.expect(IllegalArgumentException.class); //noinspection Range ItemViewTypeComposer.composeSegment(ItemViewTypeComposer.MIN_SEGMENT - 1, 0); }
@Test public void extractWrappedViewTypePart() throws Exception { // zero assertThat(ItemViewTypeComposer.extractWrappedViewTypePart(0), is(0)); // one assertThat(ItemViewTypeComposer.extractWrappedViewTypePart(1 << ItemViewTypeComposer.BIT_OFFSET_WRAPPED_VIEW_TYPE), is(1)); // full bits assertThat(ItemViewTypeComposer.extractWrappedViewTypePart(ItemViewTypeComposer.BIT_MASK_WRAPPED_VIEW_TYPE), is(-1)); // min assertThat(ItemViewTypeComposer.extractWrappedViewTypePart(ItemViewTypeComposer.MIN_WRAPPED_VIEW_TYPE << ItemViewTypeComposer.BIT_OFFSET_WRAPPED_VIEW_TYPE), is(ItemViewTypeComposer.MIN_WRAPPED_VIEW_TYPE)); // max assertThat(ItemViewTypeComposer.extractWrappedViewTypePart(ItemViewTypeComposer.MAX_WRAPPED_VIEW_TYPE << ItemViewTypeComposer.BIT_OFFSET_WRAPPED_VIEW_TYPE), is(ItemViewTypeComposer.MAX_WRAPPED_VIEW_TYPE)); // etc - 1 assertThat(ItemViewTypeComposer.extractWrappedViewTypePart(ItemViewTypeComposer.BIT_MASK_EXPANDABLE_FLAG), is(0)); // etc - 2 assertThat(ItemViewTypeComposer.extractWrappedViewTypePart(ItemViewTypeComposer.BIT_MASK_SEGMENT), is(0)); }
@Test public void composeSegment_MaxOutOfRange() throws Exception { thrown.expect(IllegalArgumentException.class); //noinspection Range ItemViewTypeComposer.composeSegment(ItemViewTypeComposer.MAX_SEGMENT + 1, 0); }