From 6e2bed6779d0c3633e4008ae59931377e2f00447 Mon Sep 17 00:00:00 2001 From: Phillip Thelen Date: Mon, 12 Nov 2018 15:13:11 +0100 Subject: [PATCH] Fix deleting inbox messages. Fix es #1050 --- .../habitrpg/android/habitica/api/ApiService.java | 3 +++ .../habitrpg/android/habitica/data/ApiClient.kt | 1 + .../habitica/data/implementation/ApiClientImpl.kt | 4 ++++ .../data/implementation/SocialRepositoryImpl.kt | 9 ++++++--- .../habitica/data/local/SocialLocalRepository.kt | 1 + .../implementation/RealmSocialLocalRepository.kt | 15 +++++++++++++++ .../ui/adapter/social/ChatRecyclerViewAdapter.kt | 2 +- 7 files changed, 31 insertions(+), 4 deletions(-) diff --git a/Habitica/src/main/java/com/habitrpg/android/habitica/api/ApiService.java b/Habitica/src/main/java/com/habitrpg/android/habitica/api/ApiService.java index 32abe2941..233696894 100644 --- a/Habitica/src/main/java/com/habitrpg/android/habitica/api/ApiService.java +++ b/Habitica/src/main/java/com/habitrpg/android/habitica/api/ApiService.java @@ -218,6 +218,9 @@ public interface ApiService { @DELETE("groups/{gid}/chat/{messageId}") Flowable> deleteMessage(@Path("gid") String groupId, @Path("messageId") String messageId); + @DELETE("inbox/messages/{messageId}") + Flowable> deleteInboxMessage(@Path("messageId") String messageId); + @GET("groups/{gid}/members") Flowable>> getGroupMembers(@Path("gid") String groupId, @Query("includeAllPublicFields") Boolean includeAllPublicFields); diff --git a/Habitica/src/main/java/com/habitrpg/android/habitica/data/ApiClient.kt b/Habitica/src/main/java/com/habitrpg/android/habitica/data/ApiClient.kt index 6d833aad9..be11897c2 100644 --- a/Habitica/src/main/java/com/habitrpg/android/habitica/data/ApiClient.kt +++ b/Habitica/src/main/java/com/habitrpg/android/habitica/data/ApiClient.kt @@ -138,6 +138,7 @@ interface ApiClient { fun postGroupChat(groupId: String, message: Map): Flowable fun deleteMessage(groupId: String, messageId: String): Flowable + fun deleteInboxMessage(id: String): Flowable fun getGroupMembers(groupId: String, includeAllPublicFields: Boolean?): Flowable> diff --git a/Habitica/src/main/java/com/habitrpg/android/habitica/data/implementation/ApiClientImpl.kt b/Habitica/src/main/java/com/habitrpg/android/habitica/data/implementation/ApiClientImpl.kt index 04177d7f9..12afeefd5 100644 --- a/Habitica/src/main/java/com/habitrpg/android/habitica/data/implementation/ApiClientImpl.kt +++ b/Habitica/src/main/java/com/habitrpg/android/habitica/data/implementation/ApiClientImpl.kt @@ -61,6 +61,7 @@ import javax.net.ssl.SSLException class ApiClientImpl//private OnHabitsAPIResult mResultListener; //private HostConfig mConfig; (private val gsonConverter: GsonConverterFactory, override val hostConfig: HostConfig, private val crashlyticsProxy: CrashlyticsProxy, private val popupNotificationsManager: PopupNotificationsManager, private val context: Context) : Consumer, ApiClient { + private val retrofitAdapter: Retrofit // I think we don't need the ApiClientImpl anymore we could just use ApiService @@ -473,6 +474,9 @@ class ApiClientImpl//private OnHabitsAPIResult mResultListener; override fun deleteMessage(groupId: String, messageId: String): Flowable { return apiService.deleteMessage(groupId, messageId).compose(configureApiCallObserver()) } + override fun deleteInboxMessage(id: String): Flowable { + return apiService.deleteInboxMessage(id).compose(configureApiCallObserver()) + } override fun getGroupMembers(groupId: String, includeAllPublicFields: Boolean?): Flowable> { return apiService.getGroupMembers(groupId, includeAllPublicFields).compose(configureApiCallObserver()) diff --git a/Habitica/src/main/java/com/habitrpg/android/habitica/data/implementation/SocialRepositoryImpl.kt b/Habitica/src/main/java/com/habitrpg/android/habitica/data/implementation/SocialRepositoryImpl.kt index ccde0977b..a2776b7a6 100644 --- a/Habitica/src/main/java/com/habitrpg/android/habitica/data/implementation/SocialRepositoryImpl.kt +++ b/Habitica/src/main/java/com/habitrpg/android/habitica/data/implementation/SocialRepositoryImpl.kt @@ -65,8 +65,11 @@ class SocialRepositoryImpl(localRepository: SocialLocalRepository, apiClient: Ap } override fun deleteMessage(chatMessage: ChatMessage): Flowable { - return apiClient.deleteMessage(chatMessage.groupId ?: "", chatMessage.id) - .doOnNext { localRepository.deleteMessage(chatMessage.id) } + return if (chatMessage.isInboxMessage) { + apiClient.deleteInboxMessage(chatMessage.id) + } else { + apiClient.deleteMessage(chatMessage.groupId ?: "", chatMessage.id) + }.doOnNext { localRepository.deleteMessage(chatMessage.id) } } override fun postGroupChat(groupId: String, messageObject: HashMap): Flowable { @@ -169,7 +172,7 @@ class SocialRepositoryImpl(localRepository: SocialLocalRepository, apiClient: Ap messages.forEach { it.isInboxMessage = true } - localRepository.save(messages) + localRepository.saveInboxMessages(userID, messages) } } diff --git a/Habitica/src/main/java/com/habitrpg/android/habitica/data/local/SocialLocalRepository.kt b/Habitica/src/main/java/com/habitrpg/android/habitica/data/local/SocialLocalRepository.kt index 200915a85..735a0358a 100644 --- a/Habitica/src/main/java/com/habitrpg/android/habitica/data/local/SocialLocalRepository.kt +++ b/Habitica/src/main/java/com/habitrpg/android/habitica/data/local/SocialLocalRepository.kt @@ -45,4 +45,5 @@ interface SocialLocalRepository : BaseLocalRepository { fun getInboxOverviewList(userId: String): Flowable> fun saveGroupMemberships(userID: String?, memberships: List) + fun saveInboxMessages(userID: String, messages: List) } diff --git a/Habitica/src/main/java/com/habitrpg/android/habitica/data/local/implementation/RealmSocialLocalRepository.kt b/Habitica/src/main/java/com/habitrpg/android/habitica/data/local/implementation/RealmSocialLocalRepository.kt index dd9c96474..ed70e77f0 100644 --- a/Habitica/src/main/java/com/habitrpg/android/habitica/data/local/implementation/RealmSocialLocalRepository.kt +++ b/Habitica/src/main/java/com/habitrpg/android/habitica/data/local/implementation/RealmSocialLocalRepository.kt @@ -45,6 +45,21 @@ class RealmSocialLocalRepository(realm: Realm) : RealmBaseLocalRepository(realm) } } + override fun saveInboxMessages(userID: String, messages: List) { + realm.executeTransaction { realm.insertOrUpdate(messages) } + val existingMessages = realm.where(ChatMessage::class.java).equalTo("isInboxMessage", true).findAll() + val messagesToRemove = ArrayList() + for (existingMessage in existingMessages) { + val isStillMember = messages.any { existingMessage.id == it.id } + if (!isStillMember) { + messagesToRemove.add(existingMessage) + } + } + realm.executeTransaction { + messagesToRemove.forEach { it.deleteFromRealm() } + } + } + override fun saveGroupMemberships(userID: String?, memberships: List) { realm.executeTransaction { realm.insertOrUpdate(memberships) } if (userID != null) { diff --git a/Habitica/src/main/java/com/habitrpg/android/habitica/ui/adapter/social/ChatRecyclerViewAdapter.kt b/Habitica/src/main/java/com/habitrpg/android/habitica/ui/adapter/social/ChatRecyclerViewAdapter.kt index 97b8e4ee9..8d05fdce5 100644 --- a/Habitica/src/main/java/com/habitrpg/android/habitica/ui/adapter/social/ChatRecyclerViewAdapter.kt +++ b/Habitica/src/main/java/com/habitrpg/android/habitica/ui/adapter/social/ChatRecyclerViewAdapter.kt @@ -274,7 +274,7 @@ class ChatRecyclerViewAdapter(data: OrderedRealmCollection?, autoUp } private fun shouldShowDelete(): Boolean { - return chatMessage?.isSystemMessage != true && (chatMessage?.uuid == userId || user?.contributor?.admin == true) + return chatMessage?.isSystemMessage != true && (chatMessage?.uuid == userId || user?.contributor?.admin == true || chatMessage?.isInboxMessage == true) } private fun expandMessage() {