diff --git a/app/src/main/java/com/nextcloud/talk/adapters/items/ConversationItem.java b/app/src/main/java/com/nextcloud/talk/adapters/items/ConversationItem.java index a6ec18743..6b6f835f6 100644 --- a/app/src/main/java/com/nextcloud/talk/adapters/items/ConversationItem.java +++ b/app/src/main/java/com/nextcloud/talk/adapters/items/ConversationItem.java @@ -50,6 +50,7 @@ import eu.davidea.flexibleadapter.items.IFlexible; import eu.davidea.flexibleadapter.utils.FlexibleUtils; import eu.davidea.viewholders.FlexibleViewHolder; import java.util.List; +import java.util.Objects; import java.util.regex.Pattern; public class ConversationItem @@ -71,7 +72,23 @@ public class ConversationItem public boolean equals(Object o) { if (o instanceof ConversationItem) { ConversationItem inItem = (ConversationItem) o; - return conversation.getConversationId().equals(inItem.getModel().getConversationId()); + Conversation comparedConversation = inItem.conversation; + return (conversation.getConversationId().equals(comparedConversation.getConversationId()) + && Objects.equals(conversation.getToken(), comparedConversation.getToken()) + && Objects.equals(conversation.getName(), comparedConversation.getName()) + && Objects.equals(conversation.getDisplayName(), comparedConversation.getDisplayName()) + && Objects.equals(conversation.getType(), comparedConversation.getType()) + && Objects.equals(conversation.getLastMessage(), comparedConversation.getLastMessage()) + && Objects.equals(conversation.getFavorite(), comparedConversation.getFavorite()) + && Objects.equals(conversation.getHasPassword(), comparedConversation.getHasPassword()) + && Objects.equals(conversation.getUnreadMessages(), + comparedConversation.getUnreadMessages()) + && Objects.equals(conversation.getUnreadMention(), + comparedConversation.getUnreadMention()) + && Objects.equals(conversation.getObjectType(), comparedConversation.getObjectType()) + && Objects.equals(conversation.getChanging(), comparedConversation.getChanging()) + && Objects.equals(userEntity.getId(), inItem.userEntity.getId()) + ); } return false; } @@ -82,7 +99,8 @@ public class ConversationItem @Override public int hashCode() { - return conversation.hashCode(); + return Objects.hash(conversation.getConversationId(), conversation.getToken(), + userEntity.getId()); } @Override diff --git a/app/src/main/java/com/nextcloud/talk/newarch/features/conversationsList/ConversationsListView.kt b/app/src/main/java/com/nextcloud/talk/newarch/features/conversationsList/ConversationsListView.kt index f378cbbb0..d3a5257fd 100644 --- a/app/src/main/java/com/nextcloud/talk/newarch/features/conversationsList/ConversationsListView.kt +++ b/app/src/main/java/com/nextcloud/talk/newarch/features/conversationsList/ConversationsListView.kt @@ -86,7 +86,7 @@ class ConversationsListView : BaseView(), OnQueryTextListener, lateinit var viewModel: ConversationsListViewModel val factory: ConversationListViewModelFactory by inject() - private val recyclerViewAdapter = FlexibleAdapter(mutableListOf()) + private val recyclerViewAdapter = FlexibleAdapter(mutableListOf(), null, true) private var searchItem: MenuItem? = null private var settingsItem: MenuItem? = null @@ -246,7 +246,7 @@ class ConversationsListView : BaseView(), OnQueryTextListener, }) conversationsLiveData.observe(this@ConversationsListView, Observer { - if (it.size == 0) { + if (it.isEmpty()) { viewState.value = LOADED_EMPTY } else { viewState.value = LOADED @@ -270,7 +270,7 @@ class ConversationsListView : BaseView(), OnQueryTextListener, ) } - recyclerViewAdapter.updateDataSet(newConversations as List>?) + recyclerViewAdapter.updateDataSet(newConversations as List>?, false) }) searchQuery.observe(this@ConversationsListView, Observer { @@ -320,16 +320,17 @@ class ConversationsListView : BaseView(), OnQueryTextListener, override fun onAttach(view: View) { super.onAttach(view) view.recyclerView.initRecyclerView( - SmoothScrollLinearLayoutManager(view.context), recyclerViewAdapter + SmoothScrollLinearLayoutManager(view.context), recyclerViewAdapter, false ) - view.swipeRefreshLayoutView.setOnRefreshListener { viewModel.loadConversations() } - view.swipeRefreshLayoutView.setColorSchemeResources(R.color.colorPrimary) - recyclerViewAdapter.fastScroller = view.fast_scroller recyclerViewAdapter.mItemClickListener = this recyclerViewAdapter.mItemLongClickListener = this + view.swipeRefreshLayoutView.setOnRefreshListener { viewModel.loadConversations() } + view.swipeRefreshLayoutView.setColorSchemeResources(R.color.colorPrimary) + + view.fast_scroller.setBubbleTextCreator { position -> var displayName = (recyclerViewAdapter.getItem(position) as ConversationItem).model.displayName diff --git a/app/src/main/java/com/nextcloud/talk/newarch/features/conversationsList/ConversationsListViewModel.kt b/app/src/main/java/com/nextcloud/talk/newarch/features/conversationsList/ConversationsListViewModel.kt index 0968d52ec..afd713726 100644 --- a/app/src/main/java/com/nextcloud/talk/newarch/features/conversationsList/ConversationsListViewModel.kt +++ b/app/src/main/java/com/nextcloud/talk/newarch/features/conversationsList/ConversationsListViewModel.kt @@ -103,6 +103,9 @@ class ConversationsListViewModel constructor( override fun onError(errorModel: ErrorModel?) { messageData = errorModel?.getErrorMessage() + if (errorModel?.code == 400) { + // couldn't leave because we're last moderator + } viewModelScope.launch { setConversationUpdateStatus(conversation, false) } diff --git a/app/src/main/java/com/nextcloud/talk/newarch/local/dao/ConversationsDao.kt b/app/src/main/java/com/nextcloud/talk/newarch/local/dao/ConversationsDao.kt index 11a5747b4..611e1d154 100644 --- a/app/src/main/java/com/nextcloud/talk/newarch/local/dao/ConversationsDao.kt +++ b/app/src/main/java/com/nextcloud/talk/newarch/local/dao/ConversationsDao.kt @@ -50,8 +50,7 @@ abstract class ConversationsDao { abstract suspend fun saveConversations(vararg conversations: ConversationEntity) @Query( - "UPDATE conversations SET changing = :changing WHERE user = :userId AND " + - "'conversation_id' = :conversationId" + "UPDATE conversations SET changing = :changing WHERE user = :userId AND conversation_id = :conversationId" ) abstract suspend fun updateChangingValueForConversation( userId: Long, @@ -60,7 +59,7 @@ abstract class ConversationsDao { ) @Query( - "UPDATE conversations SET favorite = :favorite, changing = 0 WHERE user = :userId AND 'conversation_id' = :conversationId" + "UPDATE conversations SET favorite = :favorite, changing = 0 WHERE user = :userId AND conversation_id = :conversationId" ) abstract suspend fun updateFavoriteValueForConversation( userId: Long, @@ -68,7 +67,7 @@ abstract class ConversationsDao { favorite: Boolean ) - @Query("DELETE FROM conversations WHERE user = :userId AND 'conversation_id' = :conversationId") + @Query("DELETE FROM conversations WHERE user = :userId AND conversation_id = :conversationId") abstract suspend fun deleteConversation( userId: Long, conversationId: String @@ -77,7 +76,7 @@ abstract class ConversationsDao { @Delete abstract suspend fun deleteConversations(vararg conversation: ConversationEntity) - @Query("DELETE FROM conversations WHERE user = :userId AND 'modified_at' < :timestamp") + @Query("DELETE FROM conversations WHERE user = :userId AND modified_at < :timestamp") abstract suspend fun deleteConversationsForUserWithTimestamp( userId: Long, timestamp: Long diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index 98a01a533..1e098bc06 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -317,5 +317,7 @@ General Allow guests + Could not leave conversation + You need to promote a new moderator before you can leave %1$s.