From 88ac65916ee497edd00180ed29bbd76824f7bb47 Mon Sep 17 00:00:00 2001
From: Pierre Nicolas <pierre.nicolas@savoirfairelinux.com>
Date: Tue, 1 Oct 2024 15:34:17 -0400
Subject: [PATCH] details: connect delete contact (one:one)

Show `delete contact` option for one to one conversation.
Connect the button to logic.

GitLab: #1723
Change-Id: Id38f77d086116ec405690d53e3ca418ebb2e63e2
---
 .../fragments/ConversationActionsFragment.kt  | 26 +++++++++++++++----
 .../cx/ring/fragments/ConversationFragment.kt | 12 +++++++--
 .../main/java/cx/ring/utils/ActionHelper.kt   | 13 ++++++++++
 3 files changed, 44 insertions(+), 7 deletions(-)

diff --git a/jami-android/app/src/main/java/cx/ring/fragments/ConversationActionsFragment.kt b/jami-android/app/src/main/java/cx/ring/fragments/ConversationActionsFragment.kt
index a30295c0f..111360e4a 100644
--- a/jami-android/app/src/main/java/cx/ring/fragments/ConversationActionsFragment.kt
+++ b/jami-android/app/src/main/java/cx/ring/fragments/ConversationActionsFragment.kt
@@ -16,6 +16,7 @@
  */
 package cx.ring.fragments
 
+import android.app.Activity
 import android.content.Intent
 import android.os.Bundle
 import android.view.*
@@ -31,12 +32,14 @@ import cx.ring.databinding.DialogSwarmTitleBinding
 import cx.ring.databinding.FragConversationActionsBinding
 import cx.ring.services.SharedPreferencesServiceImpl.Companion.getConversationColor
 import cx.ring.services.SharedPreferencesServiceImpl.Companion.getConversationSymbol
+import cx.ring.utils.ActionHelper
 import cx.ring.utils.ConversationPath
 import cx.ring.utils.DeviceUtils
 import cx.ring.utils.TextUtils.copyAndShow
 import dagger.hilt.android.AndroidEntryPoint
 import io.reactivex.rxjava3.core.Single
 import io.reactivex.rxjava3.disposables.CompositeDisposable
+import net.jami.model.Contact
 import net.jami.model.Conversation
 import net.jami.model.Uri
 import net.jami.qrcode.QRCodePresenter
@@ -163,13 +166,14 @@ class ConversationActionsFragment : Fragment() {
         if (conversationMode == Conversation.Mode.OneToOne) {
             mDisposableBag.add(
                 conversation.contactUpdates
-                    .observeOn(DeviceUtils.uiScheduler)
                     // Filter out the user.
-                    .map { contacts -> contacts.filterNot { it.isUser }[0] }
+                    .map { contacts -> contacts.filterNot { it.isUser } }
+                    .filter(List<Contact>::isNotEmpty)
+                    .map { it.first() }
                     .flatMapSingle { contact ->
                         contact.username?.map { username -> Pair(username, contact.uri) }
                             ?: Single.just(Pair("", contact.uri))
-                    }
+                    }.observeOn(DeviceUtils.uiScheduler)
                     .subscribe { (registeredName, identifier) ->
                         userNamePanel.isVisible = registeredName.isNotEmpty()
                         userName.text = registeredName
@@ -184,8 +188,20 @@ class ConversationActionsFragment : Fragment() {
                         qrCode.setOnClickListener { showContactQRCode(identifier) }
                     }
             )
-            conversationDelete.text = resources.getString(R.string.leave_conversation)
-            conversationDelete.setOnClickListener {  }
+            conversationDelete.text = resources.getString(R.string.delete_contact)
+            conversationDelete.setOnClickListener {
+                ActionHelper.launchDeleteSwarmOneToOneAction(
+                    context = requireContext(),
+                    accountId = mAccountService.currentAccount!!.accountId,
+                    uri = conversation.uri,
+                    callback = { accountId: String, conversationUri: Uri ->
+                        mConversationFacade.removeConversation(accountId, conversationUri)
+                            .subscribe().apply { mDisposableBag.add(this) }
+                        // Result is OK, should be interpreted to go back to home.
+                        requireActivity().setResult(Activity.RESULT_OK)
+                        requireActivity().finish()
+                    })
+            }
 
             descriptionPanel.isVisible = false  // Disable description edit for 1-to-1 conversation
             // Description being hidden, we put the rounded background on the secureP2pConnection.
diff --git a/jami-android/app/src/main/java/cx/ring/fragments/ConversationFragment.kt b/jami-android/app/src/main/java/cx/ring/fragments/ConversationFragment.kt
index 61940841f..33ba07476 100644
--- a/jami-android/app/src/main/java/cx/ring/fragments/ConversationFragment.kt
+++ b/jami-android/app/src/main/java/cx/ring/fragments/ConversationFragment.kt
@@ -42,6 +42,7 @@ import androidx.activity.result.contract.ActivityResultContracts
 import androidx.annotation.ColorInt
 import androidx.appcompat.widget.PopupMenu
 import androidx.appcompat.widget.SearchView
+import androidx.core.app.ActivityOptionsCompat
 import androidx.core.view.*
 import androidx.recyclerview.widget.DefaultItemAnimator
 import androidx.recyclerview.widget.LinearLayoutManager
@@ -924,12 +925,19 @@ class ConversationFragment : BaseSupportFragment<ConversationPresenter, Conversa
         }
     }
 
+    private val conversationDetailsActivityLauncher =
+        registerForActivityResult(ActivityResultContracts.StartActivityForResult()) { result ->
+            // Let's interpret result code to the fact that user was banned or blocked.
+            if (result.resultCode == Activity.RESULT_OK) goToHome()
+        }
+
     override fun goToDetailsActivity(accountId: String, uri: net.jami.model.Uri) {
         val logo = binding!!.conversationAvatar
+        val options = ActivityOptionsCompat
+            .makeSceneTransitionAnimation(requireActivity(), logo, "conversationIcon")
         val intent = Intent(Intent.ACTION_VIEW, ConversationPath.toUri(accountId, uri))
             .setClass(requireContext().applicationContext, ConversationDetailsActivity::class.java)
-        startActivity(intent,
-            ActivityOptions.makeSceneTransitionAnimation(activity, logo, "conversationIcon").toBundle())
+        conversationDetailsActivityLauncher.launch(intent, options)
     }
 
     override fun goToCallActivity(conferenceId: String, withCamera: Boolean) {
diff --git a/jami-android/app/src/main/java/cx/ring/utils/ActionHelper.kt b/jami-android/app/src/main/java/cx/ring/utils/ActionHelper.kt
index 66adff8ac..3321ff330 100644
--- a/jami-android/app/src/main/java/cx/ring/utils/ActionHelper.kt
+++ b/jami-android/app/src/main/java/cx/ring/utils/ActionHelper.kt
@@ -103,6 +103,19 @@ object ActionHelper {
             .show()
     }
 
+    fun launchDeleteSwarmOneToOneAction(
+        context: Context,
+        accountId: String,
+        uri: Uri,
+        callback: (accountId: String, uri: Uri) -> Unit,
+    ) {
+        MaterialAlertDialogBuilder(context)
+            .setTitle(R.string.conversation_action_remove_this_title)
+            .setMessage(R.string.conversation_action_remove_this_message)
+            .setPositiveButton(android.R.string.ok) { _, _ -> callback(accountId, uri) }
+            .setNegativeButton(android.R.string.cancel) { _, _ -> }.show()
+    }
+
     fun launchDeleteSwarmGroupAction(
         context: Context, accountId: String, uri: Uri, callback: ConversationActionCallback,
     ) {
-- 
GitLab