From c4967a287144547de8bcba6ea77fa8cdf887530d Mon Sep 17 00:00:00 2001 From: ariskotsomitopoulos Date: Thu, 25 Nov 2021 17:59:28 +0200 Subject: [PATCH] Handle chunks merging with thread summary Add animation to fragment transition with offset for recyclerview initialization Support threads on deleted events --- .../database/helper/ChunkEntityHelper.kt | 13 +++++ .../database/query/EventEntityQueries.kt | 7 +++ .../room/timeline/TokenChunkEventPersistor.kt | 49 ------------------- .../timeline/factory/MessageItemFactory.kt | 12 ++--- .../detail/timeline/item/AbsMessageItem.kt | 15 +++--- ...readSummaryModel.kt => ThreadListModel.kt} | 5 +- ...yController.kt => ThreadListController.kt} | 10 ++-- ...aryViewModel.kt => ThreadListViewModel.kt} | 14 +++--- ...aryViewState.kt => ThreadListViewState.kt} | 2 +- .../list/views/ThreadListBottomSheet.kt | 25 +++------- .../threads/list/views/ThreadListFragment.kt | 22 ++++----- .../main/res/anim/animation_slide_in_left.xml | 3 +- .../res/anim/animation_slide_in_right.xml | 4 +- .../res/anim/animation_slide_out_left.xml | 4 +- .../res/anim/animation_slide_out_right.xml | 3 +- .../main/res/layout/fragment_thread_list.xml | 2 +- ...hread_summary.xml => item_thread_list.xml} | 0 17 files changed, 80 insertions(+), 110 deletions(-) rename vector/src/main/java/im/vector/app/features/home/room/threads/list/model/{ThreadSummaryModel.kt => ThreadListModel.kt} (95%) rename vector/src/main/java/im/vector/app/features/home/room/threads/list/viewmodel/{ThreadSummaryController.kt => ThreadListController.kt} (92%) rename vector/src/main/java/im/vector/app/features/home/room/threads/list/viewmodel/{ThreadSummaryViewModel.kt => ThreadListViewModel.kt} (81%) rename vector/src/main/java/im/vector/app/features/home/room/threads/list/viewmodel/{ThreadSummaryViewState.kt => ThreadListViewState.kt} (97%) rename vector/src/main/res/layout/{item_thread_summary.xml => item_thread_list.xml} (100%) diff --git a/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/database/helper/ChunkEntityHelper.kt b/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/database/helper/ChunkEntityHelper.kt index f74e4b0f4c..b0d15ce8da 100644 --- a/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/database/helper/ChunkEntityHelper.kt +++ b/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/database/helper/ChunkEntityHelper.kt @@ -34,6 +34,7 @@ import org.matrix.android.sdk.internal.database.model.TimelineEventEntityFields import org.matrix.android.sdk.internal.database.query.find import org.matrix.android.sdk.internal.database.query.getOrCreate import org.matrix.android.sdk.internal.database.query.where +import org.matrix.android.sdk.internal.database.query.whereRoomId import org.matrix.android.sdk.internal.extensions.assertIsManaged import org.matrix.android.sdk.internal.session.room.timeline.PaginationDirection import timber.log.Timber @@ -157,9 +158,21 @@ private fun ChunkEntity.addTimelineEventFromMerge(realm: Realm, timelineEventEnt this.senderName = timelineEventEntity.senderName this.isUniqueDisplayName = timelineEventEntity.isUniqueDisplayName } + handleThreadSummary(realm, eventId, copied) timelineEvents.add(copied) } +/** + * Upon copy of the timeline events we should update the latestMessage TimelineEventEntity with the new one + */ +private fun handleThreadSummary(realm: Realm, oldEventId: String, newTimelineEventEntity: TimelineEventEntity) { + EventEntity + .whereRoomId(realm, newTimelineEventEntity.roomId) + .equalTo(EventEntityFields.IS_ROOT_THREAD, true) + .equalTo(EventEntityFields.THREAD_SUMMARY_LATEST_MESSAGE.EVENT_ID, oldEventId) + .findFirst()?.threadSummaryLatestMessage = newTimelineEventEntity +} + private fun handleReadReceipts(realm: Realm, roomId: String, eventEntity: EventEntity, senderId: String): ReadReceiptsSummaryEntity { val readReceiptsSummaryEntity = ReadReceiptsSummaryEntity.where(realm, eventEntity.eventId).findFirst() ?: realm.createObject(eventEntity.eventId).apply { diff --git a/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/database/query/EventEntityQueries.kt b/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/database/query/EventEntityQueries.kt index e27130442d..a439d6aae7 100644 --- a/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/database/query/EventEntityQueries.kt +++ b/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/database/query/EventEntityQueries.kt @@ -49,6 +49,13 @@ internal fun EventEntity.Companion.where(realm: Realm, eventId: String): RealmQu .equalTo(EventEntityFields.EVENT_ID, eventId) } + +internal fun EventEntity.Companion.whereRoomId(realm: Realm, roomId: String): RealmQuery { + return realm.where() + .equalTo(EventEntityFields.ROOM_ID, roomId) +} + + internal fun EventEntity.Companion.where(realm: Realm, eventIds: List): RealmQuery { return realm.where() .`in`(EventEntityFields.EVENT_ID, eventIds.toTypedArray()) diff --git a/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/session/room/timeline/TokenChunkEventPersistor.kt b/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/session/room/timeline/TokenChunkEventPersistor.kt index ba34e88ff7..f6441c9d60 100644 --- a/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/session/room/timeline/TokenChunkEventPersistor.kt +++ b/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/session/room/timeline/TokenChunkEventPersistor.kt @@ -270,53 +270,4 @@ internal class TokenChunkEventPersistor @Inject constructor(@SessionDatabase pri optimizedThreadSummaryMap.updateThreadSummaryIfNeeded() } - -// /** -// * Mark or update the thread root event accordingly. If the Threading is disabled -// * no action is done -// */ -// private fun updateRootThreadEventIfNeeded(realm: Realm, eventEntity: EventEntity) { -// -// if (!BuildConfig.THREADING_ENABLED) return -// -// val rootThreadEventId = eventEntity.rootThreadEventId -// -// if (eventEntity.isThread && rootThreadEventId != null) { -// markEventAsRootEvent(realm, rootThreadEventId) -// } else { -// markAsRootEventIfNeeded(realm, eventEntity.eventId) -// } -// } - -// /** -// * Finds the event with rootThreadEventId and marks it as a root thread -// */ -// private fun markEventAsRootEvent(realm: Realm, rootThreadEventId: String) { -// val rootThreadEvent = EventEntity -// .where(realm, rootThreadEventId) -// .equalTo(EventEntityFields.IS_THREAD, false).findFirst() ?: return -// rootThreadEvent.isThread = true -// } -// -// /** -// * Also check if there is at least one thread message for that rootThreadEventId, -// * that means it is a root thread so it should be updated accordingly -// */ -// private fun markAsRootEventIfNeeded(realm: Realm, candidateIdRootThread: String) { -// EventEntity -// .whereRootThreadEventId(realm, candidateIdRootThread) -// .findFirst() ?: return -// -// markEventAsRootEvent(realm, candidateIdRootThread) -// } - -// /** -// * Returns the chunk for the current room if exists, otherwise it creates a new ChunkEntity -// */ -// private fun getOrCreateThreadChunk(realm: Realm, roomId: String, rootThreadEventId: String): ChunkEntity { -// return ChunkEntity.findThreadChunkOfRoom(realm, roomId, rootThreadEventId) -// ?: realm.createObject().apply { -// this.rootThreadEventId = rootThreadEventId -// } -// } } diff --git a/vector/src/main/java/im/vector/app/features/home/room/detail/timeline/factory/MessageItemFactory.kt b/vector/src/main/java/im/vector/app/features/home/room/detail/timeline/factory/MessageItemFactory.kt index 5e25b52473..57de9d7233 100644 --- a/vector/src/main/java/im/vector/app/features/home/room/detail/timeline/factory/MessageItemFactory.kt +++ b/vector/src/main/java/im/vector/app/features/home/room/detail/timeline/factory/MessageItemFactory.kt @@ -125,19 +125,19 @@ class MessageItemFactory @Inject constructor( pillsPostProcessorFactory.create(roomId) } - - - fun create(params: TimelineItemFactoryParams): VectorEpoxyModel<*>? { + val event = params.event val highlight = params.isHighlighted val callback = params.callback event.root.eventId ?: return null roomId = event.roomId val informationData = messageInformationDataFactory.create(params) + val threadDetails = if (params.isFromThreadTimeline()) null else event.root.threadDetails + if (event.root.isRedacted()) { // message is redacted - val attributes = messageItemAttributesFactory.create(null, informationData, callback) + val attributes = messageItemAttributesFactory.create(null, informationData, callback, threadDetails) return buildRedactedItem(attributes, highlight) } @@ -154,7 +154,6 @@ class MessageItemFactory @Inject constructor( } // always hide summary when we are on thread timeline - val threadDetails = if(params.isFromThreadTimeline()) null else event.root.threadDetails val attributes = messageItemAttributesFactory.create(messageContent, informationData, callback, threadDetails) // val all = event.root.toContent() @@ -180,9 +179,10 @@ class MessageItemFactory @Inject constructor( } } - private fun isFromThreadTimeline(params: TimelineItemFactoryParams){ + private fun isFromThreadTimeline(params: TimelineItemFactoryParams) { params.rootThreadEventId } + private fun buildOptionsMessageItem(messageContent: MessageOptionsContent, informationData: MessageInformationData, highlight: Boolean, diff --git a/vector/src/main/java/im/vector/app/features/home/room/detail/timeline/item/AbsMessageItem.kt b/vector/src/main/java/im/vector/app/features/home/room/detail/timeline/item/AbsMessageItem.kt index 977a5b426a..903a650786 100644 --- a/vector/src/main/java/im/vector/app/features/home/room/detail/timeline/item/AbsMessageItem.kt +++ b/vector/src/main/java/im/vector/app/features/home/room/detail/timeline/item/AbsMessageItem.kt @@ -72,6 +72,7 @@ abstract class AbsMessageItem : AbsBaseMessageItem attributes.threadCallback?.onThreadSummaryClicked(attributes.informationData.eventId, attributes.threadDetails?.isRootThread ?: false) } } + override fun bind(holder: H) { super.bind(holder) if (attributes.informationData.showInformation) { @@ -111,26 +112,28 @@ abstract class AbsMessageItem : AbsBaseMessageItem holder.eventSendingIndicator.isVisible = attributes.informationData.sendStateDecoration == SendStateDecoration.SENDING_MEDIA // Threads - if(BuildConfig.THREADING_ENABLED) { + if (BuildConfig.THREADING_ENABLED) { holder.threadSummaryConstraintLayout.onClick(_threadClickListener) attributes.threadDetails?.let { threadDetails -> holder.threadSummaryConstraintLayout.isVisible = threadDetails.isRootThread holder.threadSummaryCounterTextView.text = threadDetails.numberOfThreads.toString() holder.threadSummaryInfoTextView.text = threadDetails.threadSummaryLatestTextMessage - threadDetails.threadSummarySenderInfo?.let { senderInfo -> - attributes.avatarRenderer.render(MatrixItem.UserItem(senderInfo.userId, senderInfo.displayName, senderInfo.avatarUrl), holder.threadSummaryAvatarImageView) - } - } ?: run{holder.threadSummaryConstraintLayout.isVisible = false} + + val userId = threadDetails.threadSummarySenderInfo?.userId ?: return@let + val displayName = threadDetails.threadSummarySenderInfo?.displayName + val avatarUrl = threadDetails.threadSummarySenderInfo?.avatarUrl + attributes.avatarRenderer.render(MatrixItem.UserItem(userId, displayName, avatarUrl), holder.threadSummaryAvatarImageView) + } ?: run { holder.threadSummaryConstraintLayout.isVisible = false } } } - override fun unbind(holder: H) { attributes.avatarRenderer.clear(holder.avatarImageView) holder.avatarImageView.setOnClickListener(null) holder.avatarImageView.setOnLongClickListener(null) holder.memberNameView.setOnClickListener(null) holder.memberNameView.setOnLongClickListener(null) + attributes.avatarRenderer.clear(holder.threadSummaryAvatarImageView) holder.threadSummaryConstraintLayout.setOnClickListener(null) super.unbind(holder) } diff --git a/vector/src/main/java/im/vector/app/features/home/room/threads/list/model/ThreadSummaryModel.kt b/vector/src/main/java/im/vector/app/features/home/room/threads/list/model/ThreadListModel.kt similarity index 95% rename from vector/src/main/java/im/vector/app/features/home/room/threads/list/model/ThreadSummaryModel.kt rename to vector/src/main/java/im/vector/app/features/home/room/threads/list/model/ThreadListModel.kt index 8ed19a97c8..887a6acb4b 100644 --- a/vector/src/main/java/im/vector/app/features/home/room/threads/list/model/ThreadSummaryModel.kt +++ b/vector/src/main/java/im/vector/app/features/home/room/threads/list/model/ThreadListModel.kt @@ -16,7 +16,6 @@ package im.vector.app.features.home.room.threads.list.model -import android.view.ViewGroup import android.widget.ImageView import android.widget.TextView import androidx.constraintlayout.widget.ConstraintLayout @@ -31,8 +30,8 @@ import im.vector.app.features.displayname.getBestName import im.vector.app.features.home.AvatarRenderer import org.matrix.android.sdk.api.util.MatrixItem -@EpoxyModelClass(layout = R.layout.item_thread_summary) -abstract class ThreadSummaryModel : VectorEpoxyModel() { +@EpoxyModelClass(layout = R.layout.item_thread_list) +abstract class ThreadListModel : VectorEpoxyModel() { @EpoxyAttribute lateinit var avatarRenderer: AvatarRenderer @EpoxyAttribute lateinit var matrixItem: MatrixItem diff --git a/vector/src/main/java/im/vector/app/features/home/room/threads/list/viewmodel/ThreadSummaryController.kt b/vector/src/main/java/im/vector/app/features/home/room/threads/list/viewmodel/ThreadListController.kt similarity index 92% rename from vector/src/main/java/im/vector/app/features/home/room/threads/list/viewmodel/ThreadSummaryController.kt rename to vector/src/main/java/im/vector/app/features/home/room/threads/list/viewmodel/ThreadListController.kt index 2e3b58bb77..f0f9d1e9a2 100644 --- a/vector/src/main/java/im/vector/app/features/home/room/threads/list/viewmodel/ThreadSummaryController.kt +++ b/vector/src/main/java/im/vector/app/features/home/room/threads/list/viewmodel/ThreadListController.kt @@ -20,21 +20,21 @@ import com.airbnb.epoxy.EpoxyController import im.vector.app.core.date.DateFormatKind import im.vector.app.core.date.VectorDateFormatter import im.vector.app.features.home.AvatarRenderer -import im.vector.app.features.home.room.threads.list.model.threadSummary +import im.vector.app.features.home.room.threads.list.model.threadList import org.matrix.android.sdk.api.session.room.timeline.TimelineEvent import org.matrix.android.sdk.api.util.toMatrixItem import javax.inject.Inject -class ThreadSummaryController @Inject constructor( +class ThreadListController @Inject constructor( private val avatarRenderer: AvatarRenderer, private val dateFormatter: VectorDateFormatter ) : EpoxyController() { var listener: Listener? = null - private var viewState: ThreadSummaryViewState? = null + private var viewState: ThreadListViewState? = null - fun update(viewState: ThreadSummaryViewState) { + fun update(viewState: ThreadListViewState) { this.viewState = viewState requestModelBuild() } @@ -46,7 +46,7 @@ class ThreadSummaryController @Inject constructor( safeViewState.rootThreadEventList.invoke() ?.forEach { timelineEvent -> val date = dateFormatter.format(timelineEvent.root.originServerTs, DateFormatKind.ROOM_LIST) - threadSummary { + threadList { id(timelineEvent.eventId) avatarRenderer(host.avatarRenderer) matrixItem(timelineEvent.senderInfo.toMatrixItem()) diff --git a/vector/src/main/java/im/vector/app/features/home/room/threads/list/viewmodel/ThreadSummaryViewModel.kt b/vector/src/main/java/im/vector/app/features/home/room/threads/list/viewmodel/ThreadListViewModel.kt similarity index 81% rename from vector/src/main/java/im/vector/app/features/home/room/threads/list/viewmodel/ThreadSummaryViewModel.kt rename to vector/src/main/java/im/vector/app/features/home/room/threads/list/viewmodel/ThreadListViewModel.kt index 449090cc73..715478cec3 100644 --- a/vector/src/main/java/im/vector/app/features/home/room/threads/list/viewmodel/ThreadSummaryViewModel.kt +++ b/vector/src/main/java/im/vector/app/features/home/room/threads/list/viewmodel/ThreadListViewModel.kt @@ -31,23 +31,23 @@ import kotlinx.coroutines.flow.map import org.matrix.android.sdk.api.session.Session import org.matrix.android.sdk.flow.flow -class ThreadSummaryViewModel @AssistedInject constructor(@Assisted val initialState: ThreadSummaryViewState, - private val session: Session) : - VectorViewModel(initialState) { +class ThreadListViewModel @AssistedInject constructor(@Assisted val initialState: ThreadListViewState, + private val session: Session) : + VectorViewModel(initialState) { private val room = session.getRoom(initialState.roomId) @AssistedFactory interface Factory { - fun create(initialState: ThreadSummaryViewState): ThreadSummaryViewModel + fun create(initialState: ThreadListViewState): ThreadListViewModel } - companion object : MavericksViewModelFactory { + companion object : MavericksViewModelFactory { @JvmStatic - override fun create(viewModelContext: ViewModelContext, state: ThreadSummaryViewState): ThreadSummaryViewModel? { + override fun create(viewModelContext: ViewModelContext, state: ThreadListViewState): ThreadListViewModel? { val fragment: ThreadListFragment = (viewModelContext as FragmentViewModelContext).fragment() - return fragment.threadSummaryViewModelFactory.create(state) + return fragment.threadListViewModelFactory.create(state) } } diff --git a/vector/src/main/java/im/vector/app/features/home/room/threads/list/viewmodel/ThreadSummaryViewState.kt b/vector/src/main/java/im/vector/app/features/home/room/threads/list/viewmodel/ThreadListViewState.kt similarity index 97% rename from vector/src/main/java/im/vector/app/features/home/room/threads/list/viewmodel/ThreadSummaryViewState.kt rename to vector/src/main/java/im/vector/app/features/home/room/threads/list/viewmodel/ThreadListViewState.kt index 13f1189708..01a5239aac 100644 --- a/vector/src/main/java/im/vector/app/features/home/room/threads/list/viewmodel/ThreadSummaryViewState.kt +++ b/vector/src/main/java/im/vector/app/features/home/room/threads/list/viewmodel/ThreadListViewState.kt @@ -22,7 +22,7 @@ import com.airbnb.mvrx.Uninitialized import im.vector.app.features.home.room.threads.arguments.ThreadListArgs import org.matrix.android.sdk.api.session.room.timeline.TimelineEvent -data class ThreadSummaryViewState( +data class ThreadListViewState( val rootThreadEventList: Async> = Uninitialized, val shouldFilterThreads: Boolean = false, val roomId: String diff --git a/vector/src/main/java/im/vector/app/features/home/room/threads/list/views/ThreadListBottomSheet.kt b/vector/src/main/java/im/vector/app/features/home/room/threads/list/views/ThreadListBottomSheet.kt index b3938a10a8..a4f40a820a 100644 --- a/vector/src/main/java/im/vector/app/features/home/room/threads/list/views/ThreadListBottomSheet.kt +++ b/vector/src/main/java/im/vector/app/features/home/room/threads/list/views/ThreadListBottomSheet.kt @@ -20,14 +20,13 @@ import android.os.Bundle import android.view.LayoutInflater import android.view.View import android.view.ViewGroup -import androidx.appcompat.content.res.AppCompatResources.getDrawable import androidx.core.content.ContextCompat import com.airbnb.mvrx.parentFragmentViewModel import im.vector.app.R import im.vector.app.core.platform.VectorBaseBottomSheetDialogFragment import im.vector.app.databinding.BottomSheetThreadListBinding -import im.vector.app.features.home.room.threads.list.viewmodel.ThreadSummaryViewModel -import im.vector.app.features.home.room.threads.list.viewmodel.ThreadSummaryViewState +import im.vector.app.features.home.room.threads.list.viewmodel.ThreadListViewModel +import im.vector.app.features.home.room.threads.list.viewmodel.ThreadListViewState class ThreadListBottomSheet : VectorBaseBottomSheetDialogFragment() { @@ -35,13 +34,12 @@ class ThreadListBottomSheet : VectorBaseBottomSheetDialogFragment(), - ThreadSummaryController.Listener { + ThreadListController.Listener { - private val threadSummaryViewModel: ThreadSummaryViewModel by fragmentViewModel() + private val threadListViewModel: ThreadListViewModel by fragmentViewModel() private val threadListArgs: ThreadListArgs by args() @@ -74,13 +74,13 @@ class ThreadListFragment @Inject constructor( override fun onViewCreated(view: View, savedInstanceState: Bundle?) { super.onViewCreated(view, savedInstanceState) initToolbar() - views.threadListRecyclerView.configureWith(threadSummaryController, TimelineItemAnimator(), hasFixedSize = false) - threadSummaryController.listener = this + views.threadListRecyclerView.configureWith(threadListController, TimelineItemAnimator(), hasFixedSize = false) + threadListController.listener = this } override fun onDestroyView() { views.threadListRecyclerView.cleanup() - threadSummaryController.listener = null + threadListController.listener = null super.onDestroyView() } @@ -89,8 +89,8 @@ class ThreadListFragment @Inject constructor( renderToolbar() } - override fun invalidate() = withState(threadSummaryViewModel) { state -> - threadSummaryController.update(state) + override fun invalidate() = withState(threadListViewModel) { state -> + threadListController.update(state) } private fun renderToolbar() { diff --git a/vector/src/main/res/anim/animation_slide_in_left.xml b/vector/src/main/res/anim/animation_slide_in_left.xml index 46547c691d..77861c99f6 100644 --- a/vector/src/main/res/anim/animation_slide_in_left.xml +++ b/vector/src/main/res/anim/animation_slide_in_left.xml @@ -1,5 +1,6 @@ - \ No newline at end of file diff --git a/vector/src/main/res/anim/animation_slide_in_right.xml b/vector/src/main/res/anim/animation_slide_in_right.xml index d0366bc633..cf7488cc1a 100644 --- a/vector/src/main/res/anim/animation_slide_in_right.xml +++ b/vector/src/main/res/anim/animation_slide_in_right.xml @@ -1,5 +1,7 @@ - \ No newline at end of file diff --git a/vector/src/main/res/anim/animation_slide_out_left.xml b/vector/src/main/res/anim/animation_slide_out_left.xml index 3d734533df..2afa66ceab 100644 --- a/vector/src/main/res/anim/animation_slide_out_left.xml +++ b/vector/src/main/res/anim/animation_slide_out_left.xml @@ -1,5 +1,7 @@ - \ No newline at end of file diff --git a/vector/src/main/res/anim/animation_slide_out_right.xml b/vector/src/main/res/anim/animation_slide_out_right.xml index 60a3f22721..49348f1dac 100644 --- a/vector/src/main/res/anim/animation_slide_out_right.xml +++ b/vector/src/main/res/anim/animation_slide_out_right.xml @@ -1,5 +1,6 @@ - \ No newline at end of file diff --git a/vector/src/main/res/layout/fragment_thread_list.xml b/vector/src/main/res/layout/fragment_thread_list.xml index 25dd200737..be042a7bce 100644 --- a/vector/src/main/res/layout/fragment_thread_list.xml +++ b/vector/src/main/res/layout/fragment_thread_list.xml @@ -34,7 +34,7 @@ app:layout_constraintEnd_toEndOf="parent" app:layout_constraintBottom_toBottomOf="parent" android:background="?android:colorBackground" - tools:listitem="@layout/item_thread_summary" /> + tools:listitem="@layout/item_thread_list" /> \ No newline at end of file diff --git a/vector/src/main/res/layout/item_thread_summary.xml b/vector/src/main/res/layout/item_thread_list.xml similarity index 100% rename from vector/src/main/res/layout/item_thread_summary.xml rename to vector/src/main/res/layout/item_thread_list.xml