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