From 8eeca17d86192476f0221a1e107247246bafc0d1 Mon Sep 17 00:00:00 2001 From: rapterjet2004 Date: Fri, 11 Oct 2024 10:51:37 -0500 Subject: [PATCH 1/7] WIP Signed-off-by: rapterjet2004 --- .../java/com/nextcloud/talk/api/NcApi.java | 8 +++++ .../ConversationInfoActivity.kt | 20 ++++++++++++ .../viewmodel/ConversationInfoViewModel.kt | 12 ++++++- .../talk/models/domain/ConversationModel.kt | 4 ++- .../models/json/conversations/Conversation.kt | 5 ++- .../conversations/ConversationsRepository.kt | 5 +++ .../ConversationsRepositoryImpl.kt | 9 ++++++ .../main/res/drawable/outline_archive_24.xml | 18 +++++++++++ .../res/layout/activity_conversation_info.xml | 31 +++++++++++++++++++ app/src/main/res/values/strings.xml | 2 ++ 10 files changed, 111 insertions(+), 3 deletions(-) create mode 100644 app/src/main/res/drawable/outline_archive_24.xml diff --git a/app/src/main/java/com/nextcloud/talk/api/NcApi.java b/app/src/main/java/com/nextcloud/talk/api/NcApi.java index f0957ef4d..c2c8c6386 100644 --- a/app/src/main/java/com/nextcloud/talk/api/NcApi.java +++ b/app/src/main/java/com/nextcloud/talk/api/NcApi.java @@ -727,4 +727,12 @@ public interface NcApi { @DELETE Observable unbanActor(@Header("Authorization") String authorization, @Url String url); + + @POST + Observable archiveConversation(@Header("Authorization") String authorization, + @Url String url); + + @DELETE + Observable unarchiveConversation(@Header("Authorization") String authorization, + @Url String url); } \ No newline at end of file diff --git a/app/src/main/java/com/nextcloud/talk/conversationinfo/ConversationInfoActivity.kt b/app/src/main/java/com/nextcloud/talk/conversationinfo/ConversationInfoActivity.kt index 2005ebdff..e9bf60b64 100644 --- a/app/src/main/java/com/nextcloud/talk/conversationinfo/ConversationInfoActivity.kt +++ b/app/src/main/java/com/nextcloud/talk/conversationinfo/ConversationInfoActivity.kt @@ -179,17 +179,36 @@ class ConversationInfoActivity : databaseStorageModule = DatabaseStorageModule(conversationUser, conversationToken) } + if (!spreedCapabilities.features!!.contains(ARCHIVED_CONVERSATIONS)) { + binding.archiveConversationBtn.visibility = GONE + } + binding.deleteConversationAction.setOnClickListener { showDeleteConversationDialog() } binding.leaveConversationAction.setOnClickListener { leaveConversation() } binding.clearConversationHistory.setOnClickListener { showClearHistoryDialog() } binding.addParticipantsAction.setOnClickListener { addParticipants() } binding.listBansButton.setOnClickListener { listBans() } + binding.archiveConversationBtn.setOnClickListener { + if (conversation!!.isArchived) { + viewModel.unarchiveConversation(conversationUser, conversationToken) + } else { + viewModel.archiveConversation(conversationUser, conversationToken) + } + } viewModel.getRoom(conversationUser, conversationToken) themeTextViews() themeSwitchPreferences() + if (conversation!!.isArchived) { + binding.archiveConversationIcon.setImageDrawable(resources.getDrawable(R.drawable.ic_eye)) + binding.archiveConversationText.text = resources.getString(R.string.unarchive_conversation) + } else { + binding.archiveConversationIcon.setImageDrawable(resources.getDrawable(R.drawable.outline_archive_24)) + binding.archiveConversationText.text = resources.getString(R.string.archive_conversation) + } + binding.addParticipantsAction.visibility = GONE binding.progressBar.let { viewThemeUtils.platform.colorCircularProgressBar(it, ColorRole.PRIMARY) } @@ -1445,6 +1464,7 @@ class ConversationInfoActivity : private const val DEMOTE_OR_PROMOTE = 1 private const val REMOVE_FROM_CONVERSATION = 2 private const val BAN_FROM_CONVERSATION = 3 + private const val ARCHIVED_CONVERSATIONS = "archived-conversations" } /** diff --git a/app/src/main/java/com/nextcloud/talk/conversationinfo/viewmodel/ConversationInfoViewModel.kt b/app/src/main/java/com/nextcloud/talk/conversationinfo/viewmodel/ConversationInfoViewModel.kt index 3a145beeb..afed00c8a 100644 --- a/app/src/main/java/com/nextcloud/talk/conversationinfo/viewmodel/ConversationInfoViewModel.kt +++ b/app/src/main/java/com/nextcloud/talk/conversationinfo/viewmodel/ConversationInfoViewModel.kt @@ -18,6 +18,7 @@ import com.nextcloud.talk.models.domain.ConversationModel import com.nextcloud.talk.models.json.capabilities.SpreedCapability import com.nextcloud.talk.models.json.generic.GenericOverall import com.nextcloud.talk.models.json.participants.TalkBan +import com.nextcloud.talk.repositories.conversations.ConversationsRepository import com.nextcloud.talk.utils.ApiUtils import io.reactivex.Observer import io.reactivex.android.schedulers.AndroidSchedulers @@ -26,7 +27,8 @@ import io.reactivex.schedulers.Schedulers import javax.inject.Inject class ConversationInfoViewModel @Inject constructor( - private val chatNetworkDataSource: ChatNetworkDataSource + private val chatNetworkDataSource: ChatNetworkDataSource, + private val conversationsRepository: ConversationsRepository ) : ViewModel() { object LifeCycleObserver : DefaultLifecycleObserver { @@ -200,6 +202,14 @@ class ConversationInfoViewModel @Inject constructor( }) } + fun archiveConversation(user: User, token: String) { + // TODO + } + + fun unarchiveConversation(user: User, token: String) { + // TODO + } + inner class GetRoomObserver : Observer { override fun onSubscribe(d: Disposable) { // unused atm diff --git a/app/src/main/java/com/nextcloud/talk/models/domain/ConversationModel.kt b/app/src/main/java/com/nextcloud/talk/models/domain/ConversationModel.kt index d653b8098..85e3abed8 100644 --- a/app/src/main/java/com/nextcloud/talk/models/domain/ConversationModel.kt +++ b/app/src/main/java/com/nextcloud/talk/models/domain/ConversationModel.kt @@ -59,6 +59,7 @@ class ConversationModel( var recordingConsentRequired: Int = 0, var remoteServer: String? = null, var remoteToken: String? = null, + var isArchived: Boolean = false, // attributes that don't come from API. This should be changed?! var password: String? = null @@ -120,7 +121,8 @@ class ConversationModel( callStartTime = conversation.callStartTime, recordingConsentRequired = conversation.recordingConsentRequired, remoteServer = conversation.remoteServer, - remoteToken = conversation.remoteToken + remoteToken = conversation.remoteToken, + isArchived = conversation.isArchived ) } } diff --git a/app/src/main/java/com/nextcloud/talk/models/json/conversations/Conversation.kt b/app/src/main/java/com/nextcloud/talk/models/json/conversations/Conversation.kt index 2e48b7c81..f50cb29a5 100644 --- a/app/src/main/java/com/nextcloud/talk/models/json/conversations/Conversation.kt +++ b/app/src/main/java/com/nextcloud/talk/models/json/conversations/Conversation.kt @@ -159,5 +159,8 @@ data class Conversation( var remoteServer: String? = "", @JsonField(name = ["remoteToken"]) - var remoteToken: String? = "" + var remoteToken: String? = "", + + @JsonField(name = ["isArchived"]) + var isArchived: Boolean ) : Parcelable diff --git a/app/src/main/java/com/nextcloud/talk/repositories/conversations/ConversationsRepository.kt b/app/src/main/java/com/nextcloud/talk/repositories/conversations/ConversationsRepository.kt index 80cf47990..04e498053 100644 --- a/app/src/main/java/com/nextcloud/talk/repositories/conversations/ConversationsRepository.kt +++ b/app/src/main/java/com/nextcloud/talk/repositories/conversations/ConversationsRepository.kt @@ -7,6 +7,7 @@ */ package com.nextcloud.talk.repositories.conversations +import com.nextcloud.talk.models.json.generic.GenericOverall import io.reactivex.Observable interface ConversationsRepository { @@ -29,4 +30,8 @@ interface ConversationsRepository { val successful: Boolean ) fun resendInvitations(token: String): Observable + + fun archiveConversation(credentials: String, url: String): Observable + + fun unarchiveConversation(credentials: String, url: String): Observable } diff --git a/app/src/main/java/com/nextcloud/talk/repositories/conversations/ConversationsRepositoryImpl.kt b/app/src/main/java/com/nextcloud/talk/repositories/conversations/ConversationsRepositoryImpl.kt index 4b8972096..e4f8ece5b 100644 --- a/app/src/main/java/com/nextcloud/talk/repositories/conversations/ConversationsRepositoryImpl.kt +++ b/app/src/main/java/com/nextcloud/talk/repositories/conversations/ConversationsRepositoryImpl.kt @@ -11,6 +11,7 @@ import com.bluelinelabs.logansquare.LoganSquare import com.nextcloud.talk.api.NcApi import com.nextcloud.talk.data.user.model.User import com.nextcloud.talk.models.json.conversations.password.PasswordOverall +import com.nextcloud.talk.models.json.generic.GenericOverall import com.nextcloud.talk.repositories.conversations.ConversationsRepository.AllowGuestsResult import com.nextcloud.talk.repositories.conversations.ConversationsRepository.PasswordResult import com.nextcloud.talk.repositories.conversations.ConversationsRepository.ResendInvitationsResult @@ -89,6 +90,14 @@ class ConversationsRepositoryImpl( } } + override fun archiveConversation(credentials: String, url: String): Observable { + return api.archiveConversation(credentials, url) + } + + override fun unarchiveConversation(credentials: String, url: String): Observable { + return api.unarchiveConversation(credentials, url) + } + private fun apiVersion(): Int { return ApiUtils.getConversationApiVersion(user, intArrayOf(ApiUtils.API_V4)) } diff --git a/app/src/main/res/drawable/outline_archive_24.xml b/app/src/main/res/drawable/outline_archive_24.xml new file mode 100644 index 000000000..b94ba5dd9 --- /dev/null +++ b/app/src/main/res/drawable/outline_archive_24.xml @@ -0,0 +1,18 @@ + + + + + + diff --git a/app/src/main/res/layout/activity_conversation_info.xml b/app/src/main/res/layout/activity_conversation_info.xml index 63738ce3d..8168c8531 100644 --- a/app/src/main/res/layout/activity_conversation_info.xml +++ b/app/src/main/res/layout/activity_conversation_info.xml @@ -383,6 +383,37 @@ + + + + + + + + + Show ban reason Error occurred when unbanning participant Connection lost + Archive Conversation + Unarchive Conversation From 94f33c13bc8ffd56a6fdc944ff4a3cbf4de22097 Mon Sep 17 00:00:00 2001 From: rapterjet2004 Date: Mon, 14 Oct 2024 09:00:24 -0500 Subject: [PATCH 2/7] WIP got archived working - still have some todos Signed-off-by: rapterjet2004 --- .../11.json | 12 +++-- .../ConversationInfoActivity.kt | 39 ++++++++-------- .../viewmodel/ConversationInfoViewModel.kt | 46 ++++++++++++++++++- .../ConversationsListActivity.kt | 16 ++++++- .../database/mappers/ConversationMapUtils.kt | 9 ++-- .../data/database/model/ConversationEntity.kt | 3 +- .../talk/models/domain/ConversationModel.kt | 4 +- .../models/json/conversations/Conversation.kt | 2 +- .../ui/dialog/FilterConversationFragment.kt | 12 ++++- .../java/com/nextcloud/talk/utils/ApiUtils.kt | 4 ++ .../res/layout/dialog_filter_conversation.xml | 7 +++ app/src/main/res/values/strings.xml | 1 + 12 files changed, 121 insertions(+), 34 deletions(-) diff --git a/app/schemas/com.nextcloud.talk.data.source.local.TalkDatabase/11.json b/app/schemas/com.nextcloud.talk.data.source.local.TalkDatabase/11.json index 6fa34ab2e..a655cd9f7 100644 --- a/app/schemas/com.nextcloud.talk.data.source.local.TalkDatabase/11.json +++ b/app/schemas/com.nextcloud.talk.data.source.local.TalkDatabase/11.json @@ -2,7 +2,7 @@ "formatVersion": 1, "database": { "version": 11, - "identityHash": "bc802cadfdef41d3eb94ffbb0729eb89", + "identityHash": "7edb537b6987d0de6586a6760c970958", "entities": [ { "tableName": "User", @@ -138,7 +138,7 @@ }, { "tableName": "Conversations", - "createSql": "CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`internalId` TEXT NOT NULL, `accountId` INTEGER NOT NULL, `token` TEXT NOT NULL, `displayName` TEXT NOT NULL, `actorId` TEXT NOT NULL, `actorType` TEXT NOT NULL, `avatarVersion` TEXT NOT NULL, `callFlag` INTEGER NOT NULL, `callRecording` INTEGER NOT NULL, `callStartTime` INTEGER NOT NULL, `canDeleteConversation` INTEGER NOT NULL, `canLeaveConversation` INTEGER NOT NULL, `canStartCall` INTEGER NOT NULL, `description` TEXT NOT NULL, `hasCall` INTEGER NOT NULL, `hasPassword` INTEGER NOT NULL, `isCustomAvatar` INTEGER NOT NULL, `isFavorite` INTEGER NOT NULL, `lastActivity` INTEGER NOT NULL, `lastCommonReadMessage` INTEGER NOT NULL, `lastMessage` TEXT, `lastPing` INTEGER NOT NULL, `lastReadMessage` INTEGER NOT NULL, `lobbyState` TEXT NOT NULL, `lobbyTimer` INTEGER NOT NULL, `messageExpiration` INTEGER NOT NULL, `name` TEXT NOT NULL, `notificationCalls` INTEGER NOT NULL, `notificationLevel` TEXT NOT NULL, `objectType` TEXT NOT NULL, `participantType` TEXT NOT NULL, `permissions` INTEGER NOT NULL, `readOnly` TEXT NOT NULL, `recordingConsent` INTEGER NOT NULL, `remoteServer` TEXT, `remoteToken` TEXT, `sessionId` TEXT NOT NULL, `status` TEXT, `statusClearAt` INTEGER, `statusIcon` TEXT, `statusMessage` TEXT, `type` TEXT NOT NULL, `unreadMention` INTEGER NOT NULL, `unreadMentionDirect` INTEGER NOT NULL, `unreadMessages` INTEGER NOT NULL, PRIMARY KEY(`internalId`), FOREIGN KEY(`accountId`) REFERENCES `User`(`id`) ON UPDATE CASCADE ON DELETE CASCADE )", + "createSql": "CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`internalId` TEXT NOT NULL, `accountId` INTEGER NOT NULL, `token` TEXT NOT NULL, `displayName` TEXT NOT NULL, `actorId` TEXT NOT NULL, `actorType` TEXT NOT NULL, `avatarVersion` TEXT NOT NULL, `callFlag` INTEGER NOT NULL, `callRecording` INTEGER NOT NULL, `callStartTime` INTEGER NOT NULL, `canDeleteConversation` INTEGER NOT NULL, `canLeaveConversation` INTEGER NOT NULL, `canStartCall` INTEGER NOT NULL, `description` TEXT NOT NULL, `hasCall` INTEGER NOT NULL, `hasPassword` INTEGER NOT NULL, `isCustomAvatar` INTEGER NOT NULL, `isFavorite` INTEGER NOT NULL, `lastActivity` INTEGER NOT NULL, `lastCommonReadMessage` INTEGER NOT NULL, `lastMessage` TEXT, `lastPing` INTEGER NOT NULL, `lastReadMessage` INTEGER NOT NULL, `lobbyState` TEXT NOT NULL, `lobbyTimer` INTEGER NOT NULL, `messageExpiration` INTEGER NOT NULL, `name` TEXT NOT NULL, `notificationCalls` INTEGER NOT NULL, `notificationLevel` TEXT NOT NULL, `objectType` TEXT NOT NULL, `participantType` TEXT NOT NULL, `permissions` INTEGER NOT NULL, `readOnly` TEXT NOT NULL, `recordingConsent` INTEGER NOT NULL, `remoteServer` TEXT, `remoteToken` TEXT, `sessionId` TEXT NOT NULL, `status` TEXT, `statusClearAt` INTEGER, `statusIcon` TEXT, `statusMessage` TEXT, `type` TEXT NOT NULL, `unreadMention` INTEGER NOT NULL, `unreadMentionDirect` INTEGER NOT NULL, `unreadMessages` INTEGER NOT NULL, `hasArchived` INTEGER NOT NULL, PRIMARY KEY(`internalId`), FOREIGN KEY(`accountId`) REFERENCES `User`(`id`) ON UPDATE CASCADE ON DELETE CASCADE )", "fields": [ { "fieldPath": "internalId", @@ -409,6 +409,12 @@ "columnName": "unreadMessages", "affinity": "INTEGER", "notNull": true + }, + { + "fieldPath": "hasArchived", + "columnName": "hasArchived", + "affinity": "INTEGER", + "notNull": true } ], "primaryKey": { @@ -713,7 +719,7 @@ "views": [], "setupQueries": [ "CREATE TABLE IF NOT EXISTS room_master_table (id INTEGER PRIMARY KEY,identity_hash TEXT)", - "INSERT OR REPLACE INTO room_master_table (id,identity_hash) VALUES(42, 'bc802cadfdef41d3eb94ffbb0729eb89')" + "INSERT OR REPLACE INTO room_master_table (id,identity_hash) VALUES(42, '7edb537b6987d0de6586a6760c970958')" ] } } \ No newline at end of file diff --git a/app/src/main/java/com/nextcloud/talk/conversationinfo/ConversationInfoActivity.kt b/app/src/main/java/com/nextcloud/talk/conversationinfo/ConversationInfoActivity.kt index e9bf60b64..6dbfca996 100644 --- a/app/src/main/java/com/nextcloud/talk/conversationinfo/ConversationInfoActivity.kt +++ b/app/src/main/java/com/nextcloud/talk/conversationinfo/ConversationInfoActivity.kt @@ -179,36 +179,17 @@ class ConversationInfoActivity : databaseStorageModule = DatabaseStorageModule(conversationUser, conversationToken) } - if (!spreedCapabilities.features!!.contains(ARCHIVED_CONVERSATIONS)) { - binding.archiveConversationBtn.visibility = GONE - } - binding.deleteConversationAction.setOnClickListener { showDeleteConversationDialog() } binding.leaveConversationAction.setOnClickListener { leaveConversation() } binding.clearConversationHistory.setOnClickListener { showClearHistoryDialog() } binding.addParticipantsAction.setOnClickListener { addParticipants() } binding.listBansButton.setOnClickListener { listBans() } - binding.archiveConversationBtn.setOnClickListener { - if (conversation!!.isArchived) { - viewModel.unarchiveConversation(conversationUser, conversationToken) - } else { - viewModel.archiveConversation(conversationUser, conversationToken) - } - } viewModel.getRoom(conversationUser, conversationToken) themeTextViews() themeSwitchPreferences() - if (conversation!!.isArchived) { - binding.archiveConversationIcon.setImageDrawable(resources.getDrawable(R.drawable.ic_eye)) - binding.archiveConversationText.text = resources.getString(R.string.unarchive_conversation) - } else { - binding.archiveConversationIcon.setImageDrawable(resources.getDrawable(R.drawable.outline_archive_24)) - binding.archiveConversationText.text = resources.getString(R.string.archive_conversation) - } - binding.addParticipantsAction.visibility = GONE binding.progressBar.let { viewThemeUtils.platform.colorCircularProgressBar(it, ColorRole.PRIMARY) } @@ -760,6 +741,26 @@ class ConversationInfoActivity : } } + if (!spreedCapabilities.features!!.contains(ARCHIVED_CONVERSATIONS)) { + binding.archiveConversationBtn.visibility = GONE + } + + binding.archiveConversationBtn.setOnClickListener { + if (conversation!!.hasArchived) { + viewModel.unarchiveConversation(conversationUser, conversationToken) + } else { + viewModel.archiveConversation(conversationUser, conversationToken) + } + } + + if (conversation!!.hasArchived) { + binding.archiveConversationIcon.setImageDrawable(resources.getDrawable(R.drawable.ic_eye)) + binding.archiveConversationText.text = resources.getString(R.string.unarchive_conversation) + } else { + binding.archiveConversationIcon.setImageDrawable(resources.getDrawable(R.drawable.outline_archive_24)) + binding.archiveConversationText.text = resources.getString(R.string.archive_conversation) + } + if (!isDestroyed) { binding.dangerZoneOptions.visibility = VISIBLE diff --git a/app/src/main/java/com/nextcloud/talk/conversationinfo/viewmodel/ConversationInfoViewModel.kt b/app/src/main/java/com/nextcloud/talk/conversationinfo/viewmodel/ConversationInfoViewModel.kt index afed00c8a..562e91357 100644 --- a/app/src/main/java/com/nextcloud/talk/conversationinfo/viewmodel/ConversationInfoViewModel.kt +++ b/app/src/main/java/com/nextcloud/talk/conversationinfo/viewmodel/ConversationInfoViewModel.kt @@ -203,11 +203,53 @@ class ConversationInfoViewModel @Inject constructor( } fun archiveConversation(user: User, token: String) { - // TODO + val apiVersion = ApiUtils.getConversationApiVersion(user, intArrayOf(ApiUtils.API_V4, ApiUtils.API_V1)) + val url = ApiUtils.getUrlForArchive(apiVersion, user.baseUrl, token) + conversationsRepository.archiveConversation(user.getCredentials(), url) + .subscribeOn(Schedulers.io()) + ?.observeOn(AndroidSchedulers.mainThread()) + ?.subscribe(object : Observer { + override fun onSubscribe(p0: Disposable) { + // unused + } + + override fun onError(e: Throwable) { + Log.d("Julius", "Error in archive $e") + } + + override fun onComplete() { + // unused atm + } + + override fun onNext(n: GenericOverall) { + Log.d("Julius", "Archived successful") + } + }) } fun unarchiveConversation(user: User, token: String) { - // TODO + val apiVersion = ApiUtils.getConversationApiVersion(user, intArrayOf(ApiUtils.API_V4, ApiUtils.API_V1)) + val url = ApiUtils.getUrlForArchive(apiVersion, user.baseUrl, token) + conversationsRepository.unarchiveConversation(user.getCredentials(), url) + .subscribeOn(Schedulers.io()) + ?.observeOn(AndroidSchedulers.mainThread()) + ?.subscribe(object : Observer { + override fun onSubscribe(p0: Disposable) { + // unused + } + + override fun onError(e: Throwable) { + Log.d("Julius", "Error in unarchive $e") + } + + override fun onComplete() { + // unused atm + } + + override fun onNext(n: GenericOverall) { + Log.d("Julius", "unArchived successful") + } + }) } inner class GetRoomObserver : Observer { diff --git a/app/src/main/java/com/nextcloud/talk/conversationlist/ConversationsListActivity.kt b/app/src/main/java/com/nextcloud/talk/conversationlist/ConversationsListActivity.kt index e3a367f0c..73a6fc939 100644 --- a/app/src/main/java/com/nextcloud/talk/conversationlist/ConversationsListActivity.kt +++ b/app/src/main/java/com/nextcloud/talk/conversationlist/ConversationsListActivity.kt @@ -210,7 +210,8 @@ class ConversationsListActivity : private var filterState = mutableMapOf( FilterConversationFragment.MENTION to false, - FilterConversationFragment.UNREAD to false + FilterConversationFragment.UNREAD to false, + FilterConversationFragment.ARCHIVE to false ) val searchBehaviorSubject = BehaviorSubject.createDefault(false) private lateinit var accountIconBadge: BadgeDrawable @@ -413,9 +414,18 @@ class ConversationsListActivity : ).blockingGet()?.value ?: "" ) == "true" + filterState[FilterConversationFragment.ARCHIVE] = ( + arbitraryStorageManager.getStorageSetting( + accountId, + FilterConversationFragment.ARCHIVE, + "" + ).blockingGet()?.value ?: "" + ) == "true" + val newItems: MutableList> = ArrayList() if (filterState[FilterConversationFragment.UNREAD] == false && - filterState[FilterConversationFragment.MENTION] == false + filterState[FilterConversationFragment.MENTION] == false && + filterState[FilterConversationFragment.ARCHIVE] == false ) { adapter!!.updateDataSet(conversationItems, true) } else { @@ -449,6 +459,8 @@ class ConversationsListActivity : ) FilterConversationFragment.UNREAD -> result = result && (conversation.unreadMessages > 0) + + FilterConversationFragment.ARCHIVE -> result = result && conversation.hasArchived } } } diff --git a/app/src/main/java/com/nextcloud/talk/data/database/mappers/ConversationMapUtils.kt b/app/src/main/java/com/nextcloud/talk/data/database/mappers/ConversationMapUtils.kt index c6c80a485..90acf6117 100644 --- a/app/src/main/java/com/nextcloud/talk/data/database/mappers/ConversationMapUtils.kt +++ b/app/src/main/java/com/nextcloud/talk/data/database/mappers/ConversationMapUtils.kt @@ -59,7 +59,8 @@ fun ConversationModel.asEntity() = callStartTime = callStartTime, recordingConsentRequired = recordingConsentRequired, remoteServer = remoteServer, - remoteToken = remoteToken + remoteToken = remoteToken, + hasArchived = hasArchived ) fun ConversationEntity.asModel() = @@ -109,7 +110,8 @@ fun ConversationEntity.asModel() = callStartTime = callStartTime, recordingConsentRequired = recordingConsentRequired, remoteServer = remoteServer, - remoteToken = remoteToken + remoteToken = remoteToken, + hasArchived = hasArchived ) fun Conversation.asEntity(accountId: Long) = @@ -158,5 +160,6 @@ fun Conversation.asEntity(accountId: Long) = callStartTime = callStartTime, recordingConsentRequired = recordingConsentRequired, remoteServer = remoteServer, - remoteToken = remoteToken + remoteToken = remoteToken, + hasArchived = hasArchived ) diff --git a/app/src/main/java/com/nextcloud/talk/data/database/model/ConversationEntity.kt b/app/src/main/java/com/nextcloud/talk/data/database/model/ConversationEntity.kt index 1c0d067de..4f4652264 100644 --- a/app/src/main/java/com/nextcloud/talk/data/database/model/ConversationEntity.kt +++ b/app/src/main/java/com/nextcloud/talk/data/database/model/ConversationEntity.kt @@ -92,7 +92,8 @@ data class ConversationEntity( @ColumnInfo(name = "type") var type: ConversationEnums.ConversationType, @ColumnInfo(name = "unreadMention") var unreadMention: Boolean = false, @ColumnInfo(name = "unreadMentionDirect") var unreadMentionDirect: Boolean, - @ColumnInfo(name = "unreadMessages") var unreadMessages: Int = 0 + @ColumnInfo(name = "unreadMessages") var unreadMessages: Int = 0, + @ColumnInfo(name = "hasArchived") var hasArchived: Boolean = false // missing/not needed: attendeeId // missing/not needed: attendeePin // missing/not needed: attendeePermissions diff --git a/app/src/main/java/com/nextcloud/talk/models/domain/ConversationModel.kt b/app/src/main/java/com/nextcloud/talk/models/domain/ConversationModel.kt index 85e3abed8..e6a036564 100644 --- a/app/src/main/java/com/nextcloud/talk/models/domain/ConversationModel.kt +++ b/app/src/main/java/com/nextcloud/talk/models/domain/ConversationModel.kt @@ -59,7 +59,7 @@ class ConversationModel( var recordingConsentRequired: Int = 0, var remoteServer: String? = null, var remoteToken: String? = null, - var isArchived: Boolean = false, + var hasArchived: Boolean = false, // attributes that don't come from API. This should be changed?! var password: String? = null @@ -122,7 +122,7 @@ class ConversationModel( recordingConsentRequired = conversation.recordingConsentRequired, remoteServer = conversation.remoteServer, remoteToken = conversation.remoteToken, - isArchived = conversation.isArchived + hasArchived = conversation.hasArchived ) } } diff --git a/app/src/main/java/com/nextcloud/talk/models/json/conversations/Conversation.kt b/app/src/main/java/com/nextcloud/talk/models/json/conversations/Conversation.kt index f50cb29a5..6ef2bd50e 100644 --- a/app/src/main/java/com/nextcloud/talk/models/json/conversations/Conversation.kt +++ b/app/src/main/java/com/nextcloud/talk/models/json/conversations/Conversation.kt @@ -162,5 +162,5 @@ data class Conversation( var remoteToken: String? = "", @JsonField(name = ["isArchived"]) - var isArchived: Boolean + var hasArchived: Boolean = false ) : Parcelable diff --git a/app/src/main/java/com/nextcloud/talk/ui/dialog/FilterConversationFragment.kt b/app/src/main/java/com/nextcloud/talk/ui/dialog/FilterConversationFragment.kt index 486c505af..d077b92a2 100644 --- a/app/src/main/java/com/nextcloud/talk/ui/dialog/FilterConversationFragment.kt +++ b/app/src/main/java/com/nextcloud/talk/ui/dialog/FilterConversationFragment.kt @@ -69,7 +69,8 @@ class FilterConversationFragment : DialogFragment() { binding.run { listOf( unreadFilterChip, - mentionedFilterChip + mentionedFilterChip, + archivedFilterChip ) }.forEach(viewThemeUtils.talk::themeChipFilter) @@ -89,6 +90,12 @@ class FilterConversationFragment : DialogFragment() { processSubmit() } + binding.archivedFilterChip.setOnCheckedChangeListener { _, isChecked -> + filterState[ARCHIVE] = isChecked + binding.archivedFilterChip.isChecked = isChecked + processSubmit() + } + binding.buttonClose.setOnClickListener { dismiss() } @@ -104,9 +111,11 @@ class FilterConversationFragment : DialogFragment() { val accountId = UserIdUtils.getIdForUser(userManager.currentUser.blockingGet()) val mentionValue = filterState[MENTION] == true val unreadValue = filterState[UNREAD] == true + val archivedValue = filterState[ARCHIVE] == true arbitraryStorageManager.storeStorageSetting(accountId, MENTION, mentionValue.toString(), "") arbitraryStorageManager.storeStorageSetting(accountId, UNREAD, unreadValue.toString(), "") + arbitraryStorageManager.storeStorageSetting(accountId, ARCHIVE, archivedValue.toString(), "") (requireActivity() as ConversationsListActivity).filterConversation() } @@ -126,5 +135,6 @@ class FilterConversationFragment : DialogFragment() { val TAG: String = FilterConversationFragment::class.java.simpleName const val MENTION: String = "mention" const val UNREAD: String = "unread" + const val ARCHIVE: String = "archive" } } diff --git a/app/src/main/java/com/nextcloud/talk/utils/ApiUtils.kt b/app/src/main/java/com/nextcloud/talk/utils/ApiUtils.kt index fb4e6a770..557c876fc 100644 --- a/app/src/main/java/com/nextcloud/talk/utils/ApiUtils.kt +++ b/app/src/main/java/com/nextcloud/talk/utils/ApiUtils.kt @@ -588,4 +588,8 @@ object ApiUtils { fun getUrlForUnban(baseUrl: String, token: String, banId: Int): String { return "${getUrlForBans(baseUrl, token)}/$banId" } + + fun getUrlForArchive(version: Int, baseUrl: String?, token: String?): String { + return "${getUrlForRoom(version, baseUrl, token)}/archive" + } } diff --git a/app/src/main/res/layout/dialog_filter_conversation.xml b/app/src/main/res/layout/dialog_filter_conversation.xml index 2fa293fe1..75c1d79d0 100644 --- a/app/src/main/res/layout/dialog_filter_conversation.xml +++ b/app/src/main/res/layout/dialog_filter_conversation.xml @@ -48,6 +48,13 @@ android:layout_height="wrap_content" android:text="@string/mentioned" /> + + Connection lost Archive Conversation Unarchive Conversation + Archived From 39305d7e96f8f74ba59069fae7abd0b149278441 Mon Sep 17 00:00:00 2001 From: rapterjet2004 Date: Tue, 15 Oct 2024 08:15:13 -0500 Subject: [PATCH 3/7] Ironed out the bugs Signed-off-by: rapterjet2004 --- .../ConversationInfoActivity.kt | 4 ++ .../ConversationsListActivity.kt | 49 +++++++++++-------- .../ui/dialog/FilterConversationFragment.kt | 2 + .../res/layout/dialog_filter_conversation.xml | 2 +- 4 files changed, 36 insertions(+), 21 deletions(-) diff --git a/app/src/main/java/com/nextcloud/talk/conversationinfo/ConversationInfoActivity.kt b/app/src/main/java/com/nextcloud/talk/conversationinfo/ConversationInfoActivity.kt index 6dbfca996..7f00539ab 100644 --- a/app/src/main/java/com/nextcloud/talk/conversationinfo/ConversationInfoActivity.kt +++ b/app/src/main/java/com/nextcloud/talk/conversationinfo/ConversationInfoActivity.kt @@ -748,8 +748,12 @@ class ConversationInfoActivity : binding.archiveConversationBtn.setOnClickListener { if (conversation!!.hasArchived) { viewModel.unarchiveConversation(conversationUser, conversationToken) + binding.archiveConversationIcon.setImageDrawable(resources.getDrawable(R.drawable.outline_archive_24)) + binding.archiveConversationText.text = resources.getString(R.string.archive_conversation) } else { viewModel.archiveConversation(conversationUser, conversationToken) + binding.archiveConversationIcon.setImageDrawable(resources.getDrawable(R.drawable.ic_eye)) + binding.archiveConversationText.text = resources.getString(R.string.unarchive_conversation) } } diff --git a/app/src/main/java/com/nextcloud/talk/conversationlist/ConversationsListActivity.kt b/app/src/main/java/com/nextcloud/talk/conversationlist/ConversationsListActivity.kt index 73a6fc939..fcb8ad497 100644 --- a/app/src/main/java/com/nextcloud/talk/conversationlist/ConversationsListActivity.kt +++ b/app/src/main/java/com/nextcloud/talk/conversationlist/ConversationsListActivity.kt @@ -211,7 +211,8 @@ class ConversationsListActivity : mutableMapOf( FilterConversationFragment.MENTION to false, FilterConversationFragment.UNREAD to false, - FilterConversationFragment.ARCHIVE to false + FilterConversationFragment.ARCHIVE to false, + FilterConversationFragment.DEFAULT to true ) val searchBehaviorSubject = BehaviorSubject.createDefault(false) private lateinit var accountIconBadge: BadgeDrawable @@ -381,7 +382,7 @@ class ConversationsListActivity : sortConversations(conversationItemsWithHeader) // Filter Conversations - if (!filterState.containsValue(true)) filterableConversationItems = conversationItems + if (!containsTrue()) filterableConversationItems = conversationItems filterConversation() adapter!!.updateDataSet(filterableConversationItems, false) Handler().postDelayed({ checkToShowUnreadBubble() }, UNREAD_BUBBLE_DELAY.toLong()) @@ -396,6 +397,14 @@ class ConversationsListActivity : } } + private fun containsTrue(): Boolean { + for ((k, v) in filterState) { + if (k != FilterConversationFragment.DEFAULT && v) return true + } + + return false + } + fun filterConversation() { val accountId = UserIdUtils.getIdForUser(userManager.currentUser.blockingGet()) filterState[FilterConversationFragment.UNREAD] = ( @@ -423,22 +432,15 @@ class ConversationsListActivity : ) == "true" val newItems: MutableList> = ArrayList() - if (filterState[FilterConversationFragment.UNREAD] == false && - filterState[FilterConversationFragment.MENTION] == false && - filterState[FilterConversationFragment.ARCHIVE] == false - ) { - adapter!!.updateDataSet(conversationItems, true) - } else { - val items = conversationItems - for (i in items) { - val conversation = (i as ConversationItem).model - if (filter(conversation)) { - newItems.add(i) - } + val items = conversationItems + for (i in items) { + val conversation = (i as ConversationItem).model + if (filter(conversation)) { + newItems.add(i) } - adapter!!.updateDataSet(newItems, true) - setFilterableItems(newItems) } + adapter!!.updateDataSet(newItems, true) + setFilterableItems(newItems) updateFilterConversationButtonColor() } @@ -460,11 +462,18 @@ class ConversationsListActivity : FilterConversationFragment.UNREAD -> result = result && (conversation.unreadMessages > 0) - FilterConversationFragment.ARCHIVE -> result = result && conversation.hasArchived + FilterConversationFragment.DEFAULT -> { + result = if (filterState[FilterConversationFragment.ARCHIVE] == true) { + result && conversation.hasArchived + } else { + result && !conversation.hasArchived + } + } } } } + Log.d("Julius", "Conversation: ${conversation.name} Result: $result") return result } @@ -661,7 +670,7 @@ class ConversationsListActivity : override fun onMenuItemActionExpand(item: MenuItem): Boolean { initSearchDisposable() adapter!!.setHeadersShown(true) - if (!filterState.containsValue(true)) filterableConversationItems = searchableConversationItems + if (!containsTrue()) filterableConversationItems = searchableConversationItems adapter!!.updateDataSet(filterableConversationItems, false) adapter!!.showAllHeaders() binding.swipeRefreshLayoutView?.isEnabled = false @@ -671,7 +680,7 @@ class ConversationsListActivity : override fun onMenuItemActionCollapse(item: MenuItem): Boolean { adapter!!.setHeadersShown(false) - if (!filterState.containsValue(true)) filterableConversationItems = conversationItemsWithHeader + if (!containsTrue()) filterableConversationItems = conversationItemsWithHeader adapter!!.updateDataSet(filterableConversationItems, false) adapter!!.hideAllHeaders() if (searchHelper != null) { @@ -1838,7 +1847,7 @@ class ConversationsListActivity : } fun updateFilterConversationButtonColor() { - if (filterState.containsValue(true)) { + if (containsTrue()) { binding.filterConversationsButton.let { viewThemeUtils.platform.colorImageView(it, ColorRole.PRIMARY) } } else { binding.filterConversationsButton.let { diff --git a/app/src/main/java/com/nextcloud/talk/ui/dialog/FilterConversationFragment.kt b/app/src/main/java/com/nextcloud/talk/ui/dialog/FilterConversationFragment.kt index d077b92a2..6eb3c1719 100644 --- a/app/src/main/java/com/nextcloud/talk/ui/dialog/FilterConversationFragment.kt +++ b/app/src/main/java/com/nextcloud/talk/ui/dialog/FilterConversationFragment.kt @@ -104,6 +104,7 @@ class FilterConversationFragment : DialogFragment() { private fun setUpChips() { binding.unreadFilterChip.isChecked = filterState[UNREAD]!! binding.mentionedFilterChip.isChecked = filterState[MENTION]!! + binding.archivedFilterChip.isChecked = filterState[ARCHIVE]!! } private fun processSubmit() { @@ -136,5 +137,6 @@ class FilterConversationFragment : DialogFragment() { const val MENTION: String = "mention" const val UNREAD: String = "unread" const val ARCHIVE: String = "archive" + const val DEFAULT: String = "default" } } diff --git a/app/src/main/res/layout/dialog_filter_conversation.xml b/app/src/main/res/layout/dialog_filter_conversation.xml index 75c1d79d0..c2e9a029a 100644 --- a/app/src/main/res/layout/dialog_filter_conversation.xml +++ b/app/src/main/res/layout/dialog_filter_conversation.xml @@ -32,7 +32,7 @@ android:layout_marginTop="@dimen/standard_half_margin" android:layout_marginEnd="@dimen/standard_margin" android:layout_marginBottom="@dimen/standard_half_margin" - app:chipSpacingHorizontal="@dimen/standard_margin"> + app:chipSpacingHorizontal="@dimen/standard_half_margin"> Date: Wed, 23 Oct 2024 07:26:20 -0500 Subject: [PATCH 4/7] changes Signed-off-by: rapterjet2004 --- .../ConversationInfoActivity.kt | 7 +++++-- .../viewmodel/ConversationInfoViewModel.kt | 8 ++++---- .../ConversationsListActivity.kt | 12 ++++++------ .../talk/data/source/local/Migrations.kt | 19 +++++++++++++++++++ .../talk/data/source/local/TalkDatabase.kt | 7 ++++--- .../nextcloud/talk/utils/CapabilitiesUtil.kt | 7 ++++++- .../res/layout/activity_conversation_info.xml | 7 +++++++ app/src/main/res/values/strings.xml | 2 ++ 8 files changed, 53 insertions(+), 16 deletions(-) diff --git a/app/src/main/java/com/nextcloud/talk/conversationinfo/ConversationInfoActivity.kt b/app/src/main/java/com/nextcloud/talk/conversationinfo/ConversationInfoActivity.kt index 7f00539ab..1ceb9e553 100644 --- a/app/src/main/java/com/nextcloud/talk/conversationinfo/ConversationInfoActivity.kt +++ b/app/src/main/java/com/nextcloud/talk/conversationinfo/ConversationInfoActivity.kt @@ -741,7 +741,7 @@ class ConversationInfoActivity : } } - if (!spreedCapabilities.features!!.contains(ARCHIVED_CONVERSATIONS)) { + if (!CapabilitiesUtil.isArchiveConversationsAvailable(spreedCapabilities)) { binding.archiveConversationBtn.visibility = GONE } @@ -750,19 +750,23 @@ class ConversationInfoActivity : viewModel.unarchiveConversation(conversationUser, conversationToken) binding.archiveConversationIcon.setImageDrawable(resources.getDrawable(R.drawable.outline_archive_24)) binding.archiveConversationText.text = resources.getString(R.string.archive_conversation) + binding.archiveConversationTextHint.text = resources.getString(R.string.archive_hint) } else { viewModel.archiveConversation(conversationUser, conversationToken) binding.archiveConversationIcon.setImageDrawable(resources.getDrawable(R.drawable.ic_eye)) binding.archiveConversationText.text = resources.getString(R.string.unarchive_conversation) + binding.archiveConversationTextHint.text = resources.getString(R.string.unarchive_hint) } } if (conversation!!.hasArchived) { binding.archiveConversationIcon.setImageDrawable(resources.getDrawable(R.drawable.ic_eye)) binding.archiveConversationText.text = resources.getString(R.string.unarchive_conversation) + binding.archiveConversationTextHint.text = resources.getString(R.string.unarchive_hint) } else { binding.archiveConversationIcon.setImageDrawable(resources.getDrawable(R.drawable.outline_archive_24)) binding.archiveConversationText.text = resources.getString(R.string.archive_conversation) + binding.archiveConversationTextHint.text = resources.getString(R.string.archive_hint) } if (!isDestroyed) { @@ -1469,7 +1473,6 @@ class ConversationInfoActivity : private const val DEMOTE_OR_PROMOTE = 1 private const val REMOVE_FROM_CONVERSATION = 2 private const val BAN_FROM_CONVERSATION = 3 - private const val ARCHIVED_CONVERSATIONS = "archived-conversations" } /** diff --git a/app/src/main/java/com/nextcloud/talk/conversationinfo/viewmodel/ConversationInfoViewModel.kt b/app/src/main/java/com/nextcloud/talk/conversationinfo/viewmodel/ConversationInfoViewModel.kt index 562e91357..f20f02a91 100644 --- a/app/src/main/java/com/nextcloud/talk/conversationinfo/viewmodel/ConversationInfoViewModel.kt +++ b/app/src/main/java/com/nextcloud/talk/conversationinfo/viewmodel/ConversationInfoViewModel.kt @@ -214,7 +214,7 @@ class ConversationInfoViewModel @Inject constructor( } override fun onError(e: Throwable) { - Log.d("Julius", "Error in archive $e") + Log.d(TAG, "Error in archive $e") } override fun onComplete() { @@ -222,7 +222,7 @@ class ConversationInfoViewModel @Inject constructor( } override fun onNext(n: GenericOverall) { - Log.d("Julius", "Archived successful") + Log.d(TAG, "Archived successful") } }) } @@ -239,7 +239,7 @@ class ConversationInfoViewModel @Inject constructor( } override fun onError(e: Throwable) { - Log.d("Julius", "Error in unarchive $e") + Log.d(TAG, "Error in unarchive $e") } override fun onComplete() { @@ -247,7 +247,7 @@ class ConversationInfoViewModel @Inject constructor( } override fun onNext(n: GenericOverall) { - Log.d("Julius", "unArchived successful") + Log.d(TAG, "unArchived successful") } }) } diff --git a/app/src/main/java/com/nextcloud/talk/conversationlist/ConversationsListActivity.kt b/app/src/main/java/com/nextcloud/talk/conversationlist/ConversationsListActivity.kt index fcb8ad497..3a13a7f3f 100644 --- a/app/src/main/java/com/nextcloud/talk/conversationlist/ConversationsListActivity.kt +++ b/app/src/main/java/com/nextcloud/talk/conversationlist/ConversationsListActivity.kt @@ -382,7 +382,7 @@ class ConversationsListActivity : sortConversations(conversationItemsWithHeader) // Filter Conversations - if (!containsTrue()) filterableConversationItems = conversationItems + if (!hasFilterEnabled()) filterableConversationItems = conversationItems filterConversation() adapter!!.updateDataSet(filterableConversationItems, false) Handler().postDelayed({ checkToShowUnreadBubble() }, UNREAD_BUBBLE_DELAY.toLong()) @@ -397,7 +397,7 @@ class ConversationsListActivity : } } - private fun containsTrue(): Boolean { + private fun hasFilterEnabled(): Boolean { for ((k, v) in filterState) { if (k != FilterConversationFragment.DEFAULT && v) return true } @@ -473,7 +473,7 @@ class ConversationsListActivity : } } - Log.d("Julius", "Conversation: ${conversation.name} Result: $result") + Log.d(TAG, "Conversation: ${conversation.name} Result: $result") return result } @@ -670,7 +670,7 @@ class ConversationsListActivity : override fun onMenuItemActionExpand(item: MenuItem): Boolean { initSearchDisposable() adapter!!.setHeadersShown(true) - if (!containsTrue()) filterableConversationItems = searchableConversationItems + if (!hasFilterEnabled()) filterableConversationItems = searchableConversationItems adapter!!.updateDataSet(filterableConversationItems, false) adapter!!.showAllHeaders() binding.swipeRefreshLayoutView?.isEnabled = false @@ -680,7 +680,7 @@ class ConversationsListActivity : override fun onMenuItemActionCollapse(item: MenuItem): Boolean { adapter!!.setHeadersShown(false) - if (!containsTrue()) filterableConversationItems = conversationItemsWithHeader + if (!hasFilterEnabled()) filterableConversationItems = conversationItemsWithHeader adapter!!.updateDataSet(filterableConversationItems, false) adapter!!.hideAllHeaders() if (searchHelper != null) { @@ -1847,7 +1847,7 @@ class ConversationsListActivity : } fun updateFilterConversationButtonColor() { - if (containsTrue()) { + if (hasFilterEnabled()) { binding.filterConversationsButton.let { viewThemeUtils.platform.colorImageView(it, ColorRole.PRIMARY) } } else { binding.filterConversationsButton.let { diff --git a/app/src/main/java/com/nextcloud/talk/data/source/local/Migrations.kt b/app/src/main/java/com/nextcloud/talk/data/source/local/Migrations.kt index 0d357b430..49011f1ca 100644 --- a/app/src/main/java/com/nextcloud/talk/data/source/local/Migrations.kt +++ b/app/src/main/java/com/nextcloud/talk/data/source/local/Migrations.kt @@ -40,6 +40,13 @@ object Migrations { } } + val MIGRATION_11_12 = object : Migration(11, 12) { + override fun migrate(db: SupportSQLiteDatabase) { + Log.i("Migrations", "Migrating 11 to 12") + addArchiveConversations(db) + } + } + fun migrateToRoom(db: SupportSQLiteDatabase) { db.execSQL( "CREATE TABLE User_new (" + @@ -237,4 +244,16 @@ object Migrations { "ON `ChatBlocks` (`internalConversationId`)" ) } + + fun addArchiveConversations(db: SupportSQLiteDatabase) { + + try { + db.execSQL( + "ALTER TABLE Conversations " + + "ADD `hasArchived` INTEGER;" + ) + } catch (e: Exception) { + Log.i("Migrations", "hasArchived already exists") + } + } } diff --git a/app/src/main/java/com/nextcloud/talk/data/source/local/TalkDatabase.kt b/app/src/main/java/com/nextcloud/talk/data/source/local/TalkDatabase.kt index a0d053d90..053ad4766 100644 --- a/app/src/main/java/com/nextcloud/talk/data/source/local/TalkDatabase.kt +++ b/app/src/main/java/com/nextcloud/talk/data/source/local/TalkDatabase.kt @@ -49,9 +49,9 @@ import java.util.Locale ChatMessageEntity::class, ChatBlockEntity::class ], - version = 11, + version = 12, autoMigrations = [ - AutoMigration(from = 9, to = 10) + AutoMigration(from = 9, to = 11) ], exportSchema = true ) @@ -113,7 +113,8 @@ abstract class TalkDatabase : RoomDatabase() { Migrations.MIGRATION_6_8, Migrations.MIGRATION_7_8, Migrations.MIGRATION_8_9, - Migrations.MIGRATION_10_11 + Migrations.MIGRATION_10_11, + Migrations.MIGRATION_11_12 ) .allowMainThreadQueries() .addCallback( diff --git a/app/src/main/java/com/nextcloud/talk/utils/CapabilitiesUtil.kt b/app/src/main/java/com/nextcloud/talk/utils/CapabilitiesUtil.kt index 0a02bd914..996262296 100644 --- a/app/src/main/java/com/nextcloud/talk/utils/CapabilitiesUtil.kt +++ b/app/src/main/java/com/nextcloud/talk/utils/CapabilitiesUtil.kt @@ -55,7 +55,8 @@ enum class SpreedFeatures(val value: String) { FEDERATION_V1("federation-v1"), DELETE_MESSAGES_UNLIMITED("delete-messages-unlimited"), BAN_V1("ban-v1"), - EDIT_MESSAGES_NOTE_TO_SELF("edit-messages-note-to-self") + EDIT_MESSAGES_NOTE_TO_SELF("edit-messages-note-to-self"), + ARCHIVE_CONVERSATIONS("archived-conversations") } @Suppress("TooManyFunctions") @@ -255,6 +256,10 @@ object CapabilitiesUtil { user.capabilities!!.spreedCapability!!.config!!["federation"]!!.containsKey("enabled") } + fun isArchiveConversationsAvailable(spreedCapabilities: SpreedCapability): Boolean { + return hasSpreedFeatureCapability(spreedCapabilities, SpreedFeatures.ARCHIVE_CONVERSATIONS) + } + // endregion //region ThemingCapabilities diff --git a/app/src/main/res/layout/activity_conversation_info.xml b/app/src/main/res/layout/activity_conversation_info.xml index 8168c8531..ded8afea1 100644 --- a/app/src/main/res/layout/activity_conversation_info.xml +++ b/app/src/main/res/layout/activity_conversation_info.xml @@ -414,6 +414,13 @@ + + Archive Conversation Unarchive Conversation Archived + Once a conversation is archived, it will be hidden by default. Select the filter \'Archived\' to view archived conversations. Direct mentions will still be received. + Once a conversation is unarchived, it will be shown by default again. From d464d714fff541615aed75bcb10ef6e1b1877436 Mon Sep 17 00:00:00 2001 From: rapterjet2004 Date: Wed, 23 Oct 2024 08:14:45 -0500 Subject: [PATCH 5/7] uses NcApiCoroutines now Signed-off-by: rapterjet2004 --- .../com/nextcloud/talk/api/NcApiCoroutines.kt | 12 ++++++ .../ConversationInfoActivity.kt | 24 ++++++----- .../viewmodel/ConversationInfoViewModel.kt | 42 +------------------ .../talk/dagger/modules/RepositoryModule.kt | 7 +++- .../conversations/ConversationsRepository.kt | 4 +- .../ConversationsRepositoryImpl.kt | 10 +++-- 6 files changed, 41 insertions(+), 58 deletions(-) diff --git a/app/src/main/java/com/nextcloud/talk/api/NcApiCoroutines.kt b/app/src/main/java/com/nextcloud/talk/api/NcApiCoroutines.kt index 537bdeb14..3a15a0136 100644 --- a/app/src/main/java/com/nextcloud/talk/api/NcApiCoroutines.kt +++ b/app/src/main/java/com/nextcloud/talk/api/NcApiCoroutines.kt @@ -110,4 +110,16 @@ interface NcApiCoroutines { @DELETE suspend fun deleteConversationAvatar(@Header("Authorization") authorization: String, @Url url: String): RoomOverall + + @POST + suspend fun archiveConversation( + @Header("Authorization") authorization: String?, + @Url url: String? + ): GenericOverall + + @DELETE + suspend fun unarchiveConversation( + @Header("Authorization") authorization: String?, + @Url url: String? + ): GenericOverall } diff --git a/app/src/main/java/com/nextcloud/talk/conversationinfo/ConversationInfoActivity.kt b/app/src/main/java/com/nextcloud/talk/conversationinfo/ConversationInfoActivity.kt index 1ceb9e553..401dd114e 100644 --- a/app/src/main/java/com/nextcloud/talk/conversationinfo/ConversationInfoActivity.kt +++ b/app/src/main/java/com/nextcloud/talk/conversationinfo/ConversationInfoActivity.kt @@ -24,6 +24,7 @@ import android.view.View.VISIBLE import androidx.appcompat.app.AlertDialog import androidx.fragment.app.FragmentTransaction import androidx.lifecycle.ViewModelProvider +import androidx.lifecycle.lifecycleScope import androidx.work.Data import androidx.work.OneTimeWorkRequest import androidx.work.WorkManager @@ -85,6 +86,7 @@ import io.reactivex.Observer import io.reactivex.android.schedulers.AndroidSchedulers import io.reactivex.disposables.Disposable import io.reactivex.schedulers.Schedulers +import kotlinx.coroutines.launch import org.greenrobot.eventbus.Subscribe import org.greenrobot.eventbus.ThreadMode import java.util.Calendar @@ -746,16 +748,18 @@ class ConversationInfoActivity : } binding.archiveConversationBtn.setOnClickListener { - if (conversation!!.hasArchived) { - viewModel.unarchiveConversation(conversationUser, conversationToken) - binding.archiveConversationIcon.setImageDrawable(resources.getDrawable(R.drawable.outline_archive_24)) - binding.archiveConversationText.text = resources.getString(R.string.archive_conversation) - binding.archiveConversationTextHint.text = resources.getString(R.string.archive_hint) - } else { - viewModel.archiveConversation(conversationUser, conversationToken) - binding.archiveConversationIcon.setImageDrawable(resources.getDrawable(R.drawable.ic_eye)) - binding.archiveConversationText.text = resources.getString(R.string.unarchive_conversation) - binding.archiveConversationTextHint.text = resources.getString(R.string.unarchive_hint) + this.lifecycleScope.launch { + if (conversation!!.hasArchived) { + viewModel.unarchiveConversation(conversationUser, conversationToken) + binding.archiveConversationIcon.setImageDrawable(resources.getDrawable(R.drawable.outline_archive_24)) + binding.archiveConversationText.text = resources.getString(R.string.archive_conversation) + binding.archiveConversationTextHint.text = resources.getString(R.string.archive_hint) + } else { + viewModel.archiveConversation(conversationUser, conversationToken) + binding.archiveConversationIcon.setImageDrawable(resources.getDrawable(R.drawable.ic_eye)) + binding.archiveConversationText.text = resources.getString(R.string.unarchive_conversation) + binding.archiveConversationTextHint.text = resources.getString(R.string.unarchive_hint) + } } } diff --git a/app/src/main/java/com/nextcloud/talk/conversationinfo/viewmodel/ConversationInfoViewModel.kt b/app/src/main/java/com/nextcloud/talk/conversationinfo/viewmodel/ConversationInfoViewModel.kt index f20f02a91..a84fd4da8 100644 --- a/app/src/main/java/com/nextcloud/talk/conversationinfo/viewmodel/ConversationInfoViewModel.kt +++ b/app/src/main/java/com/nextcloud/talk/conversationinfo/viewmodel/ConversationInfoViewModel.kt @@ -202,54 +202,16 @@ class ConversationInfoViewModel @Inject constructor( }) } - fun archiveConversation(user: User, token: String) { + suspend fun archiveConversation(user: User, token: String) { val apiVersion = ApiUtils.getConversationApiVersion(user, intArrayOf(ApiUtils.API_V4, ApiUtils.API_V1)) val url = ApiUtils.getUrlForArchive(apiVersion, user.baseUrl, token) conversationsRepository.archiveConversation(user.getCredentials(), url) - .subscribeOn(Schedulers.io()) - ?.observeOn(AndroidSchedulers.mainThread()) - ?.subscribe(object : Observer { - override fun onSubscribe(p0: Disposable) { - // unused - } - - override fun onError(e: Throwable) { - Log.d(TAG, "Error in archive $e") - } - - override fun onComplete() { - // unused atm - } - - override fun onNext(n: GenericOverall) { - Log.d(TAG, "Archived successful") - } - }) } - fun unarchiveConversation(user: User, token: String) { + suspend fun unarchiveConversation(user: User, token: String) { val apiVersion = ApiUtils.getConversationApiVersion(user, intArrayOf(ApiUtils.API_V4, ApiUtils.API_V1)) val url = ApiUtils.getUrlForArchive(apiVersion, user.baseUrl, token) conversationsRepository.unarchiveConversation(user.getCredentials(), url) - .subscribeOn(Schedulers.io()) - ?.observeOn(AndroidSchedulers.mainThread()) - ?.subscribe(object : Observer { - override fun onSubscribe(p0: Disposable) { - // unused - } - - override fun onError(e: Throwable) { - Log.d(TAG, "Error in unarchive $e") - } - - override fun onComplete() { - // unused atm - } - - override fun onNext(n: GenericOverall) { - Log.d(TAG, "unArchived successful") - } - }) } inner class GetRoomObserver : Observer { diff --git a/app/src/main/java/com/nextcloud/talk/dagger/modules/RepositoryModule.kt b/app/src/main/java/com/nextcloud/talk/dagger/modules/RepositoryModule.kt index f00c502ba..4127f2dc3 100644 --- a/app/src/main/java/com/nextcloud/talk/dagger/modules/RepositoryModule.kt +++ b/app/src/main/java/com/nextcloud/talk/dagger/modules/RepositoryModule.kt @@ -70,8 +70,11 @@ import okhttp3.OkHttpClient class RepositoryModule { @Provides - fun provideConversationsRepository(ncApi: NcApi, userProvider: CurrentUserProviderNew): ConversationsRepository { - return ConversationsRepositoryImpl(ncApi, userProvider) + fun provideConversationsRepository( + ncApi: NcApi, ncApiCoroutines: NcApiCoroutines, userProvider: + CurrentUserProviderNew + ): ConversationsRepository { + return ConversationsRepositoryImpl(ncApi, ncApiCoroutines, userProvider) } @Provides diff --git a/app/src/main/java/com/nextcloud/talk/repositories/conversations/ConversationsRepository.kt b/app/src/main/java/com/nextcloud/talk/repositories/conversations/ConversationsRepository.kt index 04e498053..2905da2e6 100644 --- a/app/src/main/java/com/nextcloud/talk/repositories/conversations/ConversationsRepository.kt +++ b/app/src/main/java/com/nextcloud/talk/repositories/conversations/ConversationsRepository.kt @@ -31,7 +31,7 @@ interface ConversationsRepository { ) fun resendInvitations(token: String): Observable - fun archiveConversation(credentials: String, url: String): Observable + suspend fun archiveConversation(credentials: String, url: String): GenericOverall - fun unarchiveConversation(credentials: String, url: String): Observable + suspend fun unarchiveConversation(credentials: String, url: String): GenericOverall } diff --git a/app/src/main/java/com/nextcloud/talk/repositories/conversations/ConversationsRepositoryImpl.kt b/app/src/main/java/com/nextcloud/talk/repositories/conversations/ConversationsRepositoryImpl.kt index e4f8ece5b..3f0549612 100644 --- a/app/src/main/java/com/nextcloud/talk/repositories/conversations/ConversationsRepositoryImpl.kt +++ b/app/src/main/java/com/nextcloud/talk/repositories/conversations/ConversationsRepositoryImpl.kt @@ -9,6 +9,7 @@ package com.nextcloud.talk.repositories.conversations import com.bluelinelabs.logansquare.LoganSquare import com.nextcloud.talk.api.NcApi +import com.nextcloud.talk.api.NcApiCoroutines import com.nextcloud.talk.data.user.model.User import com.nextcloud.talk.models.json.conversations.password.PasswordOverall import com.nextcloud.talk.models.json.generic.GenericOverall @@ -21,6 +22,7 @@ import io.reactivex.Observable class ConversationsRepositoryImpl( private val api: NcApi, + private val coroutineApi: NcApiCoroutines, private val userProvider: CurrentUserProviderNew ) : ConversationsRepository { @@ -90,12 +92,12 @@ class ConversationsRepositoryImpl( } } - override fun archiveConversation(credentials: String, url: String): Observable { - return api.archiveConversation(credentials, url) + override suspend fun archiveConversation(credentials: String, url: String): GenericOverall { + return coroutineApi.archiveConversation(credentials, url) } - override fun unarchiveConversation(credentials: String, url: String): Observable { - return api.unarchiveConversation(credentials, url) + override suspend fun unarchiveConversation(credentials: String, url: String): GenericOverall { + return coroutineApi.unarchiveConversation(credentials, url) } private fun apiVersion(): Int { From 3d9f8366c86984cfd13d7439f983c4de21ae2435 Mon Sep 17 00:00:00 2001 From: rapterjet2004 Date: Wed, 23 Oct 2024 08:26:44 -0500 Subject: [PATCH 6/7] linter Signed-off-by: rapterjet2004 --- .../java/com/nextcloud/talk/api/NcApiCoroutines.kt | 10 ++-------- .../talk/conversationinfo/ConversationInfoActivity.kt | 3 ++- .../nextcloud/talk/dagger/modules/RepositoryModule.kt | 5 +++-- .../com/nextcloud/talk/data/source/local/Migrations.kt | 1 - 4 files changed, 7 insertions(+), 12 deletions(-) diff --git a/app/src/main/java/com/nextcloud/talk/api/NcApiCoroutines.kt b/app/src/main/java/com/nextcloud/talk/api/NcApiCoroutines.kt index 3a15a0136..8d399f1ec 100644 --- a/app/src/main/java/com/nextcloud/talk/api/NcApiCoroutines.kt +++ b/app/src/main/java/com/nextcloud/talk/api/NcApiCoroutines.kt @@ -112,14 +112,8 @@ interface NcApiCoroutines { suspend fun deleteConversationAvatar(@Header("Authorization") authorization: String, @Url url: String): RoomOverall @POST - suspend fun archiveConversation( - @Header("Authorization") authorization: String?, - @Url url: String? - ): GenericOverall + suspend fun archiveConversation(@Header("Authorization") authorization: String, @Url url: String): GenericOverall @DELETE - suspend fun unarchiveConversation( - @Header("Authorization") authorization: String?, - @Url url: String? - ): GenericOverall + suspend fun unarchiveConversation(@Header("Authorization") authorization: String, @Url url: String): GenericOverall } diff --git a/app/src/main/java/com/nextcloud/talk/conversationinfo/ConversationInfoActivity.kt b/app/src/main/java/com/nextcloud/talk/conversationinfo/ConversationInfoActivity.kt index 401dd114e..8d21c21e9 100644 --- a/app/src/main/java/com/nextcloud/talk/conversationinfo/ConversationInfoActivity.kt +++ b/app/src/main/java/com/nextcloud/talk/conversationinfo/ConversationInfoActivity.kt @@ -751,7 +751,8 @@ class ConversationInfoActivity : this.lifecycleScope.launch { if (conversation!!.hasArchived) { viewModel.unarchiveConversation(conversationUser, conversationToken) - binding.archiveConversationIcon.setImageDrawable(resources.getDrawable(R.drawable.outline_archive_24)) + binding.archiveConversationIcon + .setImageDrawable(resources.getDrawable(R.drawable.outline_archive_24)) binding.archiveConversationText.text = resources.getString(R.string.archive_conversation) binding.archiveConversationTextHint.text = resources.getString(R.string.archive_hint) } else { diff --git a/app/src/main/java/com/nextcloud/talk/dagger/modules/RepositoryModule.kt b/app/src/main/java/com/nextcloud/talk/dagger/modules/RepositoryModule.kt index 4127f2dc3..1926cbf0e 100644 --- a/app/src/main/java/com/nextcloud/talk/dagger/modules/RepositoryModule.kt +++ b/app/src/main/java/com/nextcloud/talk/dagger/modules/RepositoryModule.kt @@ -71,8 +71,9 @@ class RepositoryModule { @Provides fun provideConversationsRepository( - ncApi: NcApi, ncApiCoroutines: NcApiCoroutines, userProvider: - CurrentUserProviderNew + ncApi: NcApi, + ncApiCoroutines: NcApiCoroutines, + userProvider: CurrentUserProviderNew ): ConversationsRepository { return ConversationsRepositoryImpl(ncApi, ncApiCoroutines, userProvider) } diff --git a/app/src/main/java/com/nextcloud/talk/data/source/local/Migrations.kt b/app/src/main/java/com/nextcloud/talk/data/source/local/Migrations.kt index 49011f1ca..5b93f34ca 100644 --- a/app/src/main/java/com/nextcloud/talk/data/source/local/Migrations.kt +++ b/app/src/main/java/com/nextcloud/talk/data/source/local/Migrations.kt @@ -246,7 +246,6 @@ object Migrations { } fun addArchiveConversations(db: SupportSQLiteDatabase) { - try { db.execSQL( "ALTER TABLE Conversations " + From 7285c0ae44a7f808a1abdb6119939acb80c3c4be Mon Sep 17 00:00:00 2001 From: rapterjet2004 Date: Wed, 23 Oct 2024 08:54:18 -0500 Subject: [PATCH 7/7] codacy and analysis Signed-off-by: rapterjet2004 --- app/src/main/java/com/nextcloud/talk/api/NcApi.java | 8 -------- .../conversationinfo/ConversationInfoActivity.kt | 12 ++++++++---- .../nextcloud/talk/data/source/local/Migrations.kt | 3 ++- 3 files changed, 10 insertions(+), 13 deletions(-) diff --git a/app/src/main/java/com/nextcloud/talk/api/NcApi.java b/app/src/main/java/com/nextcloud/talk/api/NcApi.java index c2c8c6386..f0957ef4d 100644 --- a/app/src/main/java/com/nextcloud/talk/api/NcApi.java +++ b/app/src/main/java/com/nextcloud/talk/api/NcApi.java @@ -727,12 +727,4 @@ public interface NcApi { @DELETE Observable unbanActor(@Header("Authorization") String authorization, @Url String url); - - @POST - Observable archiveConversation(@Header("Authorization") String authorization, - @Url String url); - - @DELETE - Observable unarchiveConversation(@Header("Authorization") String authorization, - @Url String url); } \ No newline at end of file diff --git a/app/src/main/java/com/nextcloud/talk/conversationinfo/ConversationInfoActivity.kt b/app/src/main/java/com/nextcloud/talk/conversationinfo/ConversationInfoActivity.kt index 8d21c21e9..9d93852bd 100644 --- a/app/src/main/java/com/nextcloud/talk/conversationinfo/ConversationInfoActivity.kt +++ b/app/src/main/java/com/nextcloud/talk/conversationinfo/ConversationInfoActivity.kt @@ -22,6 +22,7 @@ import android.view.View import android.view.View.GONE import android.view.View.VISIBLE import androidx.appcompat.app.AlertDialog +import androidx.core.content.res.ResourcesCompat import androidx.fragment.app.FragmentTransaction import androidx.lifecycle.ViewModelProvider import androidx.lifecycle.lifecycleScope @@ -752,12 +753,13 @@ class ConversationInfoActivity : if (conversation!!.hasArchived) { viewModel.unarchiveConversation(conversationUser, conversationToken) binding.archiveConversationIcon - .setImageDrawable(resources.getDrawable(R.drawable.outline_archive_24)) + .setImageDrawable(ResourcesCompat.getDrawable(resources, R.drawable.outline_archive_24, null)) binding.archiveConversationText.text = resources.getString(R.string.archive_conversation) binding.archiveConversationTextHint.text = resources.getString(R.string.archive_hint) } else { viewModel.archiveConversation(conversationUser, conversationToken) - binding.archiveConversationIcon.setImageDrawable(resources.getDrawable(R.drawable.ic_eye)) + binding.archiveConversationIcon + .setImageDrawable(ResourcesCompat.getDrawable(resources, R.drawable.ic_eye, null)) binding.archiveConversationText.text = resources.getString(R.string.unarchive_conversation) binding.archiveConversationTextHint.text = resources.getString(R.string.unarchive_hint) } @@ -765,11 +767,13 @@ class ConversationInfoActivity : } if (conversation!!.hasArchived) { - binding.archiveConversationIcon.setImageDrawable(resources.getDrawable(R.drawable.ic_eye)) + binding.archiveConversationIcon + .setImageDrawable(ResourcesCompat.getDrawable(resources, R.drawable.ic_eye, null)) binding.archiveConversationText.text = resources.getString(R.string.unarchive_conversation) binding.archiveConversationTextHint.text = resources.getString(R.string.unarchive_hint) } else { - binding.archiveConversationIcon.setImageDrawable(resources.getDrawable(R.drawable.outline_archive_24)) + binding.archiveConversationIcon + .setImageDrawable(ResourcesCompat.getDrawable(resources, R.drawable.outline_archive_24, null)) binding.archiveConversationText.text = resources.getString(R.string.archive_conversation) binding.archiveConversationTextHint.text = resources.getString(R.string.archive_hint) } diff --git a/app/src/main/java/com/nextcloud/talk/data/source/local/Migrations.kt b/app/src/main/java/com/nextcloud/talk/data/source/local/Migrations.kt index 5b93f34ca..e255357cb 100644 --- a/app/src/main/java/com/nextcloud/talk/data/source/local/Migrations.kt +++ b/app/src/main/java/com/nextcloud/talk/data/source/local/Migrations.kt @@ -9,6 +9,7 @@ package com.nextcloud.talk.data.source.local import android.util.Log import androidx.room.migration.Migration import androidx.sqlite.db.SupportSQLiteDatabase +import java.sql.SQLException @Suppress("MagicNumber") object Migrations { @@ -251,7 +252,7 @@ object Migrations { "ALTER TABLE Conversations " + "ADD `hasArchived` INTEGER;" ) - } catch (e: Exception) { + } catch (e: SQLException) { Log.i("Migrations", "hasArchived already exists") } }