From 82f63c059826e6f799ab8b6902eff916224c3ec5 Mon Sep 17 00:00:00 2001 From: Marcel Hibbe Date: Tue, 29 Apr 2025 12:31:42 +0200 Subject: [PATCH 1/3] add dependency verification entries Signed-off-by: Marcel Hibbe --- gradle/verification-keyring.keys | 108 +++++++++++-------------------- gradle/verification-metadata.xml | 9 +++ 2 files changed, 45 insertions(+), 72 deletions(-) diff --git a/gradle/verification-keyring.keys b/gradle/verification-keyring.keys index 5fa784cd0..5aa0a8a96 100644 --- a/gradle/verification-keyring.keys +++ b/gradle/verification-keyring.keys @@ -1383,6 +1383,8 @@ vCeonVI7Q1CkIHt8u7eMgzfEkaiPLZlI0l0RpfT4pnNieqg= -----END PGP PUBLIC KEY BLOCK----- pub BAC30622339994C4 +uid Chris Povirk + sub FC9BDC25FB378008 -----BEGIN PGP PUBLIC KEY BLOCK----- @@ -1391,20 +1393,21 @@ Gyoc9ZmChrhLoim7z4ILqmNo8eegknepQ3dGdUij4NVIhR+m+8irayTbsNHvo3UG 9y7eM5tTSjyNYkyk5fAVuT7OhzIzMA+qtc3GRVxNYRKnaHajt+pOSqr+uoDtMG3n 6eAMHCAnhgh5Nd+dCFcNT+syl3zCwolA1wrzGxxOaif+xi5wwXjmF/lAt4PDIuDT etA2/AqPM4zAC0BtC0iqVgVypjFV3EAexm/g0LNMiG/M/krzwjPq5gf1DY/57jU0 -02FpKd79HmR7bHdc4e2olEf9NlHxfbPXDDsHABEBAAG5AQ0EWUwTFgEIANmMpV3N -K8aLrLgQTyh5++det8C3D3T5tkEdljHOuN31/qdKNge8H6uKH8zXRZsj5pd8adpW -kD4TzIMvzIwzizsGw34O9hf1E2XPoDqvQr39p1sovX3PeDvRJY/7JFNt9DsphVc3 -xWQfNkC7JdMPa6JRiFHd3ynfbQ+wplf4tfaDVn1JXAWp0NSGgMtXfn5i19hHQWjm -RNAKNQLdVn8UczI8XdVM7bS4giDpQMukSyjsjgAo466iRK2+8f8BwIRe1JRvF37B -dnbvTg/dzoi1/E4ukwVJD6YE2LlDwzdGno9KxPlRsuY3nnheVgjbrGJ2XKRJkIk8 -7cMGh41VKw6L4usAEQEAAYkBHwQYAQIACQUCWUwTFgIbDAAKCRC6wwYiM5mUxEiH -CACQViGOHi0BoZ78ZJz6L48YNMx8fSdSv3YJ83Ih1n5DWCJgrDV5S3/edYinkoVI -0Lusy3MdftRg6OWaYOuOTf6MYcddO/mY363jiMByf9Uh3Dqq4sKqVLRnZbAqgD1o -dRoj2NkEQfgEH/H4JRVrxquzAKoWwJh3MhY+kajYJRJyWfc1/Bm3Bj1tcMGlGeIQ -fgWheeMg3kxrxJ9TXPqVi6VVPaPKIU5i8l46S+Wg3uvMs8vC3XzOIvhY6cwguJv9 -UkjZwGDSI952wLqnREMy0gFZ+OAB0qJpYM3nDEekWZP38G80kojnN61tZjRThu9I -i8/b+PwSW+nW3EpQZdLqZtOU -=2H2i +02FpKd79HmR7bHdc4e2olEf9NlHxfbPXDDsHABEBAAG0IUNocmlzIFBvdmlyayA8 +Y3Bvdmlya0Bnb29nbGUuY29tPrkBDQRZTBMWAQgA2YylXc0rxousuBBPKHn75163 +wLcPdPm2QR2WMc643fX+p0o2B7wfq4ofzNdFmyPml3xp2laQPhPMgy/MjDOLOwbD +fg72F/UTZc+gOq9Cvf2nWyi9fc94O9Elj/skU230OymFVzfFZB82QLsl0w9rolGI +Ud3fKd9tD7CmV/i19oNWfUlcBanQ1IaAy1d+fmLX2EdBaOZE0Ao1At1WfxRzMjxd +1UzttLiCIOlAy6RLKOyOACjjrqJErb7x/wHAhF7UlG8XfsF2du9OD93OiLX8Ti6T +BUkPpgTYuUPDN0aej0rE+VGy5jeeeF5WCNusYnZcpEmQiTztwwaHjVUrDovi6wAR +AQABiQEfBBgBAgAJBQJZTBMWAhsMAAoJELrDBiIzmZTESIcIAJBWIY4eLQGhnvxk +nPovjxg0zHx9J1K/dgnzciHWfkNYImCsNXlLf951iKeShUjQu6zLcx1+1GDo5Zpg +645N/oxhx107+ZjfreOIwHJ/1SHcOqriwqpUtGdlsCqAPWh1GiPY2QRB+AQf8fgl +FWvGq7MAqhbAmHcyFj6RqNglEnJZ9zX8GbcGPW1wwaUZ4hB+BaF54yDeTGvEn1Nc ++pWLpVU9o8ohTmLyXjpL5aDe68yzy8LdfM4i+FjpzCC4m/1SSNnAYNIj3nbAuqdE +QzLSAVn44AHSomlgzecMR6RZk/fwbzSSiOc3rW1mNFOG70iLz9v4/BJb6dbcSlBl +0upm05Q= +=Gf3Y -----END PGP PUBLIC KEY BLOCK----- pub BCF4173966770193 @@ -1986,42 +1989,6 @@ BMz7WGdDpEGNGHUq5eWskbuMaMkb+hYbd9dHQmphO4QMkC/E5mc= =0Zos -----END PGP PUBLIC KEY BLOCK----- -pub D2151178A123C97F -uid Kengo TODA - -sub A66A7ADB0B51FECF ------BEGIN PGP PUBLIC KEY BLOCK----- - -mQGNBGfeJOIBDADF0P+wY8d6xbPIOps8ond3glh4u9PXuL3o9TiyC6zopFCwc//L -GjPqKEgseyEzjgyTwU8HJORt+N0Kohn6N2ln8GTv1neqVf2mBMgRucvFLcRSFhgU -ILtJ3r5DLHrITu6JFJwiMyVq1fZQg4XWAAyn9ctAcxW+pjC8x4WmyNsUPUHZN4/P -WEK3kmawx6y4i8+1yH1ebzy16GRVBD5DfAnDzJumyah/HFvr4gXvvUKybIo4pAts -6i2Hffg5A8GAGBRTrKH6Oj47fbVO/2ojy1rj3gq5sFvB7qsFtdgXS2NelOa6mYEa -bsYEH9T13Rsk8Si7OQ83psOG39zXR/2FxgenfO6yrRCX3/2edTDE8YV9Tm0oPRaj -Qlhpx5IUHH9scEqgntG5PPzuT0kG3nsyDkmvensOLOtGgST/VuJduKfSjQbTRJwJ -YCoQqwVAMGQR8zBieCUqDrnIZO8ZvJ866YNfdh6SJPELx2+JSBFJpdNXSl0Mn8QD -UYqQ2eehX1FACo0AEQEAAbQgS2VuZ28gVE9EQSA8c2t5cGVuY2lsQGdtYWlsLmNv -bT65AY0EZ94k4gEMAMUh5TL/MKjm+WAQhyPWk7YeoE0sAUopa19PjpXFfc4Lxo+w -3yzj5f436+3UBEUjlZLS29LnotuaVzm1/aKQ0X/5Dcb2263NxrcMwChaoUWdNoih -gQT8M04BdEA32wPfC0q+IOwb4ifjd/z2ynhs7T/zLpgx7bXSnvRltWQLFjBsyL5T -EusUBwG32srLZ+tGUsi2laF4Al024JIX+5n7OPTHB3lFNd5lSmH/OtXV+Le0LxM4 -R87JgzRpSmizW97ZdLWMcUD+mcEsX+UVvxpO5gV+rbWeo8Ikzwmd9L/kJNfmOSi1 -H22O4xVQQYjSl8DpnO/SS6oXGTe5tcfRD3hWBwwbCmom5kh4Qp4J02mpsV8/Sbeh -P+Vyx9zyN86HvVEOaR+HhIZrAvCkltY22fhfWO/fJgWGFb9xAaLKKki3VAM63L76 -IuTMh9GWOG8yDeazO6ZMuMOKy+N1frnnfhtTxpMa4aIzWLcTXMkNQ5Na4gRgFSU5 -lpwIu6BtDqVCOnVvYQARAQABiQG8BBgBCAAmFiEE2HjUqCPq5zG3KdGo0hUReKEj -yX8FAmfeJOICGwwFCQPCZwAACgkQ0hUReKEjyX+VXwwAv/tNnVZKu4FJu3PKZvog -oh1gJIRvf3PQ9JYdXT9TjChUSgKM/hrzmXBJaYeWLlvcsgutNBxGU+QyvMdmhTjs -fC8I7R8yzJhe8G/fH55qvsvHH84W+ha2IV9Wlo+KnhHXpsIqt8HDGfUADQpREJ+5 -JoVVqvrzpuucEk86w7//olSl68AhH1E/ANsv1Jgc5YeQTMycoGV/ojYe1h2VokCg -I9eS6YCUSJSPW3uRK2zI1Mnt4CUVjZOhaXOyqN1VbFIWwsBs+pnWJ/brNEtjlBWi -L9P66ikq5XtgWD21uwPXacNDrhzKuc3Snsyt344vApQcpuNnMdCY8rlQ54wlpRt6 -OZ0GW4tpzlWxDzDdDWUqYZ8fXUWqLZBqNdfF/faiKWcYLVLxSv+AjXrYBzjsiZRz -k0pIRi3YiAbICiv3wjqUGt1R8SCO2F8XzDKT8bHhPUQlqf5nujd5xb81cD0SU8tw -NINnVCD3nc/mh3Vr0dbJRKF6QoekO3w3iQ7YhpdNkX7f -=+han ------END PGP PUBLIC KEY BLOCK----- - pub D364ABAA39A47320 sub 3F606403DCA455C8 -----BEGIN PGP PUBLIC KEY BLOCK----- @@ -6127,8 +6094,6 @@ c8LNGrDaCFdXnOdlNV/zT9VvBk/RkV+Tl/Lk4g== -----END PGP PUBLIC KEY BLOCK----- pub 7905DE25C78AD456 -uid Protobuf Release - sub DBC5123E2E98FEFE -----BEGIN PGP PUBLIC KEY BLOCK----- @@ -6140,26 +6105,25 @@ Uul7vR3iNRXtbnS31qIgCYWAoX6w0xHf6KUeIPWV21ZIUu5cg6kQr/sPt/OQuGS2 nKk+InYtopDi6d7AUh8WI2TP7qAMIoRkhAeDEQ99DiopwFNPA/7M4g99AQfFSmp3 acPCdeXXAZeDAqoFGFKTlqzg3FLWpGkubI/iXyHkpQfOXv4MtYuPGVNheBXGcWbf XPjbkFYjkGIN2Wx4i7yf43hMCk6ArhswfgCcgoORI+DCVdm7ORID1PjIU2Z71EA2 -qDdFwdoOdEV42YUAEQEAAbQsUHJvdG9idWYgUmVsZWFzZSA8cHJvdG9idWZAZ29v -Z2xlZ3JvdXBzLmNvbT65AY0EZKxkKwEMAK4LeTj1dr8F9E98Up6y4AKHY0Zbeb5v -c/TzsJX6UCudzygYTbQnEcrPIcJ5TJV5leniAlxnqUz/qJxmpBtGCNH63c9+iJNh -VqJEZh9dbupqQn+mqtBvsPABbHU+C46TLebmOK4R99zgtxVlSYabJubuG2Mqnq96 -mutBUWKI3iY5j0JAMLY1DJesAGwAWP8gvUZHhd4LJN3iikNSTWyUE0Hnwm2VKFq4 -cxI/6qaCpztfuSD1y0JplSfmKRd+ecLSqhDvlMZkwigUpjCvF7iSaPvpxWdkFabS -frMeIjwbGU/fLV8ilwtPPb57X6Nrk9NIUdVa6ZbxiuIErIcp3JfgfUfy7wxcI/Uj -Mq1I50NOwizLVprZbmKv1P88bACmdon612pnDhhs84phJmA7fzQ/jAqF1JQ4Crdz -L+6g56Kkx1VlN3dSmPjuycjTzykuNwZ/Fi0Lj9Czg4LVp6peSsPWS+lp9h9tOSzt -lQev+GXiQKZTYt8JxvBPOkm0hd5M30BDbwARAQABiQG8BBgBCgAmFiEEGlXwka0o -wH+DH6RNeQXeJceK1FYFAmSsZCsCGwwFCQPCZwAACgkQeQXeJceK1FbX9wwAmLBK -Q8JljEwk0KqYxawrusWXwaH+1I83urf/WsOJYEkKoiQObsFGTuaolyln6ZHyF+gt -uKeWtlbvG6aXqv9XXcsVQG7NMGdEAy6DTNj77uBAXMWTxVpD09iVeepvWSiz7r7M -gzJfluNgGDOGKpkxxIjS8NnOAsK9uquyvBQa97I+YniarTkpnVWpgSR/7V3HHf6Q -2aCKL3ihdK2uIS4dIrFi+mVCt2zDad8U8N7S2Gv2VO/vBF+hIFCV788hLH9HeX3f -70E99X57hrVCh0MeColOIV1zwK8GLeV7bpr6x11x5cjiv27xky95WteyH5w9w/Xq -Tu0NQ5YyKX/0PUYVX3mLs59H7Wys6ANygWJs59JT4KSwb3pIEV7gWSwp3mWkstlF -m4Tq/d+gVF64ItrHylZg0WpHPv1s+dH6/tWcsBnkgR/OS33PkijQgvMW4imQNRxg -ymOZIduHXX1X+KzlRZTXvv4tSFnIQ0mWY1ySiOJQJS2WABVwFpFc8rECm6eN -=z4dc +qDdFwdoOdEV42YUAEQEAAbkBjQRkrGQrAQwArgt5OPV2vwX0T3xSnrLgAodjRlt5 +vm9z9POwlfpQK53PKBhNtCcRys8hwnlMlXmV6eICXGepTP+onGakG0YI0frdz36I +k2FWokRmH11u6mpCf6aq0G+w8AFsdT4LjpMt5uY4rhH33OC3FWVJhpsm5u4bYyqe +r3qa60FRYojeJjmPQkAwtjUMl6wAbABY/yC9RkeF3gsk3eKKQ1JNbJQTQefCbZUo +WrhzEj/qpoKnO1+5IPXLQmmVJ+YpF355wtKqEO+UxmTCKBSmMK8XuJJo++nFZ2QV +ptJ+sx4iPBsZT98tXyKXC089vntfo2uT00hR1VrplvGK4gSshyncl+B9R/LvDFwj +9SMyrUjnQ07CLMtWmtluYq/U/zxsAKZ2ifrXamcOGGzzimEmYDt/ND+MCoXUlDgK +t3Mv7qDnoqTHVWU3d1KY+O7JyNPPKS43Bn8WLQuP0LODgtWnql5Kw9ZL6Wn2H205 +LO2VB6/4ZeJAplNi3wnG8E86SbSF3kzfQENvABEBAAGJAbwEGAEKACYWIQQaVfCR +rSjAf4MfpE15Bd4lx4rUVgUCZKxkKwIbDAUJA8JnAAAKCRB5Bd4lx4rUVtf3DACY +sEpDwmWMTCTQqpjFrCu6xZfBof7Ujze6t/9aw4lgSQqiJA5uwUZO5qiXKWfpkfIX +6C24p5a2Vu8bppeq/1ddyxVAbs0wZ0QDLoNM2Pvu4EBcxZPFWkPT2JV56m9ZKLPu +vsyDMl+W42AYM4YqmTHEiNLw2c4Cwr26q7K8FBr3sj5ieJqtOSmdVamBJH/tXccd +/pDZoIoveKF0ra4hLh0isWL6ZUK3bMNp3xTw3tLYa/ZU7+8EX6EgUJXvzyEsf0d5 +fd/vQT31fnuGtUKHQx4KiU4hXXPArwYt5XtumvrHXXHlyOK/bvGTL3la17IfnD3D +9epO7Q1DljIpf/Q9RhVfeYuzn0ftbKzoA3KBYmzn0lPgpLBvekgRXuBZLCneZaSy +2UWbhOr936BUXrgi2sfKVmDRakc+/Wz50fr+1ZywGeSBH85Lfc+SKNCC8xbiKZA1 +HGDKY5kh24ddfVf4rOVFlNe+/i1IWchDSZZjXJKI4lAlLZYAFXAWkVzysQKbp40= +=UiVm -----END PGP PUBLIC KEY BLOCK----- pub 79752DB6C966F0B8 diff --git a/gradle/verification-metadata.xml b/gradle/verification-metadata.xml index 0e167932a..d7f8e7616 100644 --- a/gradle/verification-metadata.xml +++ b/gradle/verification-metadata.xml @@ -14,6 +14,7 @@ + @@ -9192,6 +9193,14 @@ + + + + + + + + From c6d1f68442f446b44c798e136ebe13196f2ab8f7 Mon Sep 17 00:00:00 2001 From: Marcel Hibbe Date: Tue, 29 Apr 2025 12:32:36 +0200 Subject: [PATCH 2/3] fix jumping Note to self option in message action dialog. Only get room for Note to Self after clicking on the option.. Signed-off-by: Marcel Hibbe --- .../com/nextcloud/talk/chat/ChatActivity.kt | 82 ++++++++++++------- .../talk/ui/dialog/MessageActionsDialog.kt | 40 ++------- 2 files changed, 60 insertions(+), 62 deletions(-) diff --git a/app/src/main/java/com/nextcloud/talk/chat/ChatActivity.kt b/app/src/main/java/com/nextcloud/talk/chat/ChatActivity.kt index bd3816542..8611cb00f 100644 --- a/app/src/main/java/com/nextcloud/talk/chat/ChatActivity.kt +++ b/app/src/main/java/com/nextcloud/talk/chat/ChatActivity.kt @@ -3295,37 +3295,61 @@ class ChatActivity : } } - fun shareToNotes(message: ChatMessage, roomToken: String) { - var shareUri: Uri? = null - val data: HashMap? - var metaData: String = "" - var objectId: String = "" - if (message.hasFileAttachment()) { - val filename = message.selectedIndividualHashMap!!["name"] - path = applicationContext.cacheDir.absolutePath + "/" + filename - shareUri = FileProvider.getUriForFile( - this, - BuildConfig.APPLICATION_ID, - File(path) - ) + fun shareToNotes(message: ChatMessage) { + val apiVersion = ApiUtils.getConversationApiVersion( + conversationUser!!, + intArrayOf(ApiUtils.API_V4, ApiUtils.API_V3, 1) + ) + chatViewModel.checkForNoteToSelf( + ApiUtils.getCredentials(conversationUser!!.username, conversationUser!!.token)!!, + ApiUtils.getUrlForRooms( + apiVersion, + conversationUser!!.baseUrl + ), + false + ) - this.grantUriPermission( - applicationContext.packageName, - shareUri, - Intent.FLAG_GRANT_WRITE_URI_PERMISSION or Intent.FLAG_GRANT_READ_URI_PERMISSION - ) - } else if (message.hasGeoLocation()) { - data = message.messageParameters?.get("object") - objectId = data?.get("id")!! - val name = data["name"]!! - val lat = data["latitude"]!! - val lon = data["longitude"]!! - metaData = - "{\"type\":\"geo-location\",\"id\":\"geo:$lat,$lon\",\"latitude\":\"$lat\"," + - "\"longitude\":\"$lon\",\"name\":\"$name\"}" + chatViewModel.getNoteToSelfAvailability.observe(this) { state -> + when (state) { + is ChatViewModel.NoteToSelfAvailableState -> { + this.lifecycleScope.launch { + var shareUri: Uri? = null + val data: HashMap? + var metaData: String = "" + var objectId: String = "" + if (message.hasFileAttachment()) { + val filename = message.selectedIndividualHashMap!!["name"] + path = applicationContext.cacheDir.absolutePath + "/" + filename + shareUri = FileProvider.getUriForFile( + context, + BuildConfig.APPLICATION_ID, + File(path) + ) + + grantUriPermission( + applicationContext.packageName, + shareUri, + Intent.FLAG_GRANT_WRITE_URI_PERMISSION or Intent.FLAG_GRANT_READ_URI_PERMISSION + ) + } else if (message.hasGeoLocation()) { + data = message.messageParameters?.get("object") + objectId = data?.get("id")!! + val name = data["name"]!! + val lat = data["latitude"]!! + val lon = data["longitude"]!! + metaData = + "{\"type\":\"geo-location\",\"id\":\"geo:$lat,$lon\",\"latitude\":\"$lat\"," + + "\"longitude\":\"$lon\",\"name\":\"$name\"}" + } + + shareToNotes(shareUri, state.roomToken, message, objectId, metaData) + } + } + else -> { + Snackbar.make(binding.root, R.string.nc_common_error_sorry, Snackbar.LENGTH_LONG).show() + } + } } - - shareToNotes(shareUri, roomToken, message, objectId, metaData) } private fun shareToNotes( diff --git a/app/src/main/java/com/nextcloud/talk/ui/dialog/MessageActionsDialog.kt b/app/src/main/java/com/nextcloud/talk/ui/dialog/MessageActionsDialog.kt index f0c003d39..f9a3c475e 100644 --- a/app/src/main/java/com/nextcloud/talk/ui/dialog/MessageActionsDialog.kt +++ b/app/src/main/java/com/nextcloud/talk/ui/dialog/MessageActionsDialog.kt @@ -25,7 +25,6 @@ import com.nextcloud.talk.R import com.nextcloud.talk.application.NextcloudTalkApplication import com.nextcloud.talk.chat.ChatActivity import com.nextcloud.talk.chat.data.model.ChatMessage -import com.nextcloud.talk.chat.viewmodels.ChatViewModel import com.nextcloud.talk.data.network.NetworkMonitor import com.nextcloud.talk.data.user.model.User import com.nextcloud.talk.databinding.DialogMessageActionsBinding @@ -36,7 +35,6 @@ import com.nextcloud.talk.models.json.capabilities.SpreedCapability import com.nextcloud.talk.models.json.conversations.ConversationEnums import com.nextcloud.talk.repositories.reactions.ReactionsRepository import com.nextcloud.talk.ui.theme.ViewThemeUtils -import com.nextcloud.talk.utils.ApiUtils import com.nextcloud.talk.utils.CapabilitiesUtil import com.nextcloud.talk.utils.CapabilitiesUtil.hasSpreedFeatureCapability import com.nextcloud.talk.utils.ConversationUtils @@ -123,35 +121,6 @@ class MessageActionsDialog( viewThemeUtils.material.colorBottomSheetDragHandle(dialogMessageActionsBinding.bottomSheetDragHandle) initEmojiBar(hasChatPermission) initMenuItemCopy(!message.isDeleted) - val apiVersion = ApiUtils.getConversationApiVersion(user!!, intArrayOf(ApiUtils.API_V4, ApiUtils.API_V3, 1)) - chatActivity.chatViewModel.checkForNoteToSelf( - ApiUtils.getCredentials(user.username, user.token)!!, - ApiUtils.getUrlForRooms( - apiVersion, - user.baseUrl - ), - false - ) - chatActivity.chatViewModel.getNoteToSelfAvailability.observe(this) { state -> - when (state) { - is ChatViewModel.NoteToSelfAvailableState -> { - this.lifecycleScope.launch { - initMenuAddToNote( - !message.isDeleted && - !ConversationUtils.isNoteToSelfConversation(currentConversation) && - networkMonitor.isOnline.value, - state.roomToken - ) - } - } - else -> { - initMenuAddToNote( - false - ) - } - } - } - initMenuItems(networkMonitor.isOnline.value) } @@ -195,6 +164,11 @@ class MessageActionsDialog( isOnline ) initMenuItemSave(message.getCalculateMessageType() == ChatMessage.MessageType.SINGLE_NC_ATTACHMENT_MESSAGE) + initMenuAddToNote( + !message.isDeleted && + !ConversationUtils.isNoteToSelfConversation(currentConversation) && + networkMonitor.isOnline.value + ) } } @@ -472,10 +446,10 @@ class MessageActionsDialog( dialogMessageActionsBinding.menuSaveMessage.visibility = getVisibility(visible) } - private fun initMenuAddToNote(visible: Boolean, roomToken: String = "") { + private fun initMenuAddToNote(visible: Boolean) { if (visible) { dialogMessageActionsBinding.menuShareToNote.setOnClickListener { - chatActivity.shareToNotes(message, roomToken) + chatActivity.shareToNotes(message) dismiss() } } From ab19f631aeb4264e894da4075ce524131f727723 Mon Sep 17 00:00:00 2001 From: Marcel Hibbe Date: Tue, 29 Apr 2025 13:38:06 +0200 Subject: [PATCH 3/3] get Note-to-Self room by endpoint + convert to coroutines Signed-off-by: Marcel Hibbe --- .../com/nextcloud/talk/api/NcApiCoroutines.kt | 3 + .../com/nextcloud/talk/chat/ChatActivity.kt | 83 +++++++++---------- .../data/network/ChatNetworkDataSource.kt | 4 +- .../chat/data/network/RetrofitChatNetwork.kt | 8 +- .../talk/chat/viewmodels/ChatViewModel.kt | 55 +++--------- .../java/com/nextcloud/talk/utils/ApiUtils.kt | 4 + 6 files changed, 62 insertions(+), 95 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 834c575ee..74a49ef53 100644 --- a/app/src/main/java/com/nextcloud/talk/api/NcApiCoroutines.kt +++ b/app/src/main/java/com/nextcloud/talk/api/NcApiCoroutines.kt @@ -251,4 +251,7 @@ interface NcApiCoroutines { @Url url: String, @Query("limit") limit: Int ): ChatOverall + + @GET + suspend fun getNoteToSelfRoom(@Header("Authorization") authorization: String, @Url url: String): RoomOverall } diff --git a/app/src/main/java/com/nextcloud/talk/chat/ChatActivity.kt b/app/src/main/java/com/nextcloud/talk/chat/ChatActivity.kt index 8611cb00f..b09064d65 100644 --- a/app/src/main/java/com/nextcloud/talk/chat/ChatActivity.kt +++ b/app/src/main/java/com/nextcloud/talk/chat/ChatActivity.kt @@ -3300,54 +3300,49 @@ class ChatActivity : conversationUser!!, intArrayOf(ApiUtils.API_V4, ApiUtils.API_V3, 1) ) - chatViewModel.checkForNoteToSelf( - ApiUtils.getCredentials(conversationUser!!.username, conversationUser!!.token)!!, - ApiUtils.getUrlForRooms( - apiVersion, - conversationUser!!.baseUrl - ), - false - ) - chatViewModel.getNoteToSelfAvailability.observe(this) { state -> - when (state) { - is ChatViewModel.NoteToSelfAvailableState -> { - this.lifecycleScope.launch { - var shareUri: Uri? = null - val data: HashMap? - var metaData: String = "" - var objectId: String = "" - if (message.hasFileAttachment()) { - val filename = message.selectedIndividualHashMap!!["name"] - path = applicationContext.cacheDir.absolutePath + "/" + filename - shareUri = FileProvider.getUriForFile( - context, - BuildConfig.APPLICATION_ID, - File(path) - ) + this.lifecycleScope.launch { + val noteToSelfConversation = chatViewModel.checkForNoteToSelf( + ApiUtils.getCredentials(conversationUser!!.username, conversationUser!!.token)!!, + ApiUtils.getUrlForNoteToSelf( + apiVersion, + conversationUser!!.baseUrl + ) + ) - grantUriPermission( - applicationContext.packageName, - shareUri, - Intent.FLAG_GRANT_WRITE_URI_PERMISSION or Intent.FLAG_GRANT_READ_URI_PERMISSION - ) - } else if (message.hasGeoLocation()) { - data = message.messageParameters?.get("object") - objectId = data?.get("id")!! - val name = data["name"]!! - val lat = data["latitude"]!! - val lon = data["longitude"]!! - metaData = - "{\"type\":\"geo-location\",\"id\":\"geo:$lat,$lon\",\"latitude\":\"$lat\"," + - "\"longitude\":\"$lon\",\"name\":\"$name\"}" - } + if (noteToSelfConversation != null) { + var shareUri: Uri? = null + val data: HashMap? + var metaData = "" + var objectId = "" + if (message.hasFileAttachment()) { + val filename = message.selectedIndividualHashMap!!["name"] + path = applicationContext.cacheDir.absolutePath + "/" + filename + shareUri = FileProvider.getUriForFile( + context, + BuildConfig.APPLICATION_ID, + File(path) + ) - shareToNotes(shareUri, state.roomToken, message, objectId, metaData) - } - } - else -> { - Snackbar.make(binding.root, R.string.nc_common_error_sorry, Snackbar.LENGTH_LONG).show() + grantUriPermission( + applicationContext.packageName, + shareUri, + Intent.FLAG_GRANT_WRITE_URI_PERMISSION or Intent.FLAG_GRANT_READ_URI_PERMISSION + ) + } else if (message.hasGeoLocation()) { + data = message.messageParameters?.get("object") + objectId = data?.get("id")!! + val name = data["name"]!! + val lat = data["latitude"]!! + val lon = data["longitude"]!! + metaData = + "{\"type\":\"geo-location\",\"id\":\"geo:$lat,$lon\",\"latitude\":\"$lat\"," + + "\"longitude\":\"$lon\",\"name\":\"$name\"}" } + + shareToNotes(shareUri, noteToSelfConversation.token, message, objectId, metaData) + } else { + Snackbar.make(binding.root, R.string.nc_common_error_sorry, Snackbar.LENGTH_LONG).show() } } } diff --git a/app/src/main/java/com/nextcloud/talk/chat/data/network/ChatNetworkDataSource.kt b/app/src/main/java/com/nextcloud/talk/chat/data/network/ChatNetworkDataSource.kt index 664139d25..a533221dc 100644 --- a/app/src/main/java/com/nextcloud/talk/chat/data/network/ChatNetworkDataSource.kt +++ b/app/src/main/java/com/nextcloud/talk/chat/data/network/ChatNetworkDataSource.kt @@ -12,7 +12,6 @@ import com.nextcloud.talk.models.json.capabilities.SpreedCapability import com.nextcloud.talk.models.json.chat.ChatMessageJson import com.nextcloud.talk.models.json.chat.ChatOverallSingleMessage import com.nextcloud.talk.models.json.conversations.RoomOverall -import com.nextcloud.talk.models.json.conversations.RoomsOverall import com.nextcloud.talk.models.json.generic.GenericOverall import com.nextcloud.talk.models.json.opengraph.Reference import com.nextcloud.talk.models.json.reminder.Reminder @@ -42,7 +41,8 @@ interface ChatNetworkDataSource { displayName: String ): Observable - fun checkForNoteToSelf(credentials: String, url: String, includeStatus: Boolean): Observable + suspend fun checkForNoteToSelf(credentials: String, url: String): RoomOverall + fun shareLocationToNotes( credentials: String, url: String, diff --git a/app/src/main/java/com/nextcloud/talk/chat/data/network/RetrofitChatNetwork.kt b/app/src/main/java/com/nextcloud/talk/chat/data/network/RetrofitChatNetwork.kt index e476d568b..07989ffdb 100644 --- a/app/src/main/java/com/nextcloud/talk/chat/data/network/RetrofitChatNetwork.kt +++ b/app/src/main/java/com/nextcloud/talk/chat/data/network/RetrofitChatNetwork.kt @@ -14,7 +14,6 @@ import com.nextcloud.talk.models.json.capabilities.SpreedCapability import com.nextcloud.talk.models.json.chat.ChatMessageJson import com.nextcloud.talk.models.json.chat.ChatOverallSingleMessage import com.nextcloud.talk.models.json.conversations.RoomOverall -import com.nextcloud.talk.models.json.conversations.RoomsOverall import com.nextcloud.talk.models.json.generic.GenericOverall import com.nextcloud.talk.models.json.opengraph.Reference import com.nextcloud.talk.models.json.reminder.Reminder @@ -124,11 +123,8 @@ class RetrofitChatNetwork( it } - override fun checkForNoteToSelf( - credentials: String, - url: String, - includeStatus: Boolean - ): Observable = ncApi.getRooms(credentials, url, includeStatus).map { it } + override suspend fun checkForNoteToSelf(credentials: String, url: String): RoomOverall = + ncApiCoroutines.getNoteToSelfRoom(credentials, url) override fun shareLocationToNotes( credentials: String, diff --git a/app/src/main/java/com/nextcloud/talk/chat/viewmodels/ChatViewModel.kt b/app/src/main/java/com/nextcloud/talk/chat/viewmodels/ChatViewModel.kt index e72282f56..6a63ecfe1 100644 --- a/app/src/main/java/com/nextcloud/talk/chat/viewmodels/ChatViewModel.kt +++ b/app/src/main/java/com/nextcloud/talk/chat/viewmodels/ChatViewModel.kt @@ -34,14 +34,12 @@ import com.nextcloud.talk.models.json.capabilities.SpreedCapability import com.nextcloud.talk.models.json.chat.ChatMessageJson import com.nextcloud.talk.models.json.chat.ChatOverallSingleMessage import com.nextcloud.talk.models.json.conversations.RoomOverall -import com.nextcloud.talk.models.json.conversations.RoomsOverall import com.nextcloud.talk.models.json.generic.GenericOverall import com.nextcloud.talk.models.json.opengraph.Reference import com.nextcloud.talk.models.json.reminder.Reminder import com.nextcloud.talk.models.json.userAbsence.UserAbsenceData import com.nextcloud.talk.repositories.reactions.ReactionsRepository import com.nextcloud.talk.ui.PlaybackSpeed -import com.nextcloud.talk.utils.ConversationUtils import com.nextcloud.talk.utils.bundle.BundleKeys import com.nextcloud.talk.utils.database.user.CurrentUserProviderNew import com.nextcloud.talk.utils.preferences.AppPreferences @@ -199,13 +197,6 @@ class ChatViewModel @Inject constructor( val getReminderExistState: LiveData get() = _getReminderExistState - object NoteToSelfNotAvailableState : ViewState - open class NoteToSelfAvailableState(val roomToken: String) : ViewState - - private val _getNoteToSelfAvailability: MutableLiveData = MutableLiveData(NoteToSelfNotAvailableState) - val getNoteToSelfAvailability: LiveData - get() = _getNoteToSelfAvailability - object GetRoomStartState : ViewState object GetRoomErrorState : ViewState object GetRoomSuccessState : ViewState @@ -538,10 +529,17 @@ class ChatViewModel @Inject constructor( }) } - fun checkForNoteToSelf(credentials: String, baseUrl: String, includeStatus: Boolean) { - chatNetworkDataSource.checkForNoteToSelf(credentials, baseUrl, includeStatus).subscribeOn(Schedulers.io()) - ?.observeOn(AndroidSchedulers.mainThread()) - ?.subscribe(CheckForNoteToSelfObserver()) + suspend fun checkForNoteToSelf(credentials: String, baseUrl: String): ConversationModel? { + val response = chatNetworkDataSource.checkForNoteToSelf(credentials, baseUrl) + if (response.ocs?.meta?.statusCode == HTTP_CODE_OK) { + val noteToSelfConversation = ConversationModel.mapToConversationModel( + response.ocs?.data!!, + userProvider.currentUser.blockingGet() + ) + return noteToSelfConversation + } else { + return null + } } fun shareLocationToNotes(credentials: String, url: String, objectType: String, objectId: String, metadata: String) { @@ -784,36 +782,6 @@ class ChatViewModel @Inject constructor( } } - inner class CheckForNoteToSelfObserver : Observer { - override fun onSubscribe(d: Disposable) { - disposableSet.add(d) - } - - override fun onNext(roomsOverall: RoomsOverall) { - val rooms = roomsOverall.ocs?.data - rooms?.let { - try { - val noteToSelf = rooms.first { - val model = ConversationModel.mapToConversationModel(it, userProvider.currentUser.blockingGet()) - ConversationUtils.isNoteToSelfConversation(model) - } - _getNoteToSelfAvailability.value = NoteToSelfAvailableState(noteToSelf.token) - } catch (e: NoSuchElementException) { - _getNoteToSelfAvailability.value = NoteToSelfNotAvailableState - Log.e(TAG, "Note to self not found $e") - } - } - } - - override fun onError(e: Throwable) { - Log.d(TAG, "Error when getting rooms for Note to Self Observer $e") - } - - override fun onComplete() { - // unused atm - } - } - @Suppress("Detekt.TooGenericExceptionCaught") fun outOfOfficeStatusOfUser(credentials: String, baseUrl: String, userId: String) { viewModelScope.launch { @@ -875,6 +843,7 @@ class ChatViewModel @Inject constructor( companion object { private val TAG = ChatViewModel::class.simpleName const val JOIN_ROOM_RETRY_COUNT: Long = 3 + const val HTTP_CODE_OK: Int = 200 } sealed class OutOfOfficeUIState { 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 3e0bfd173..2d30c2652 100644 --- a/app/src/main/java/com/nextcloud/talk/utils/ApiUtils.kt +++ b/app/src/main/java/com/nextcloud/talk/utils/ApiUtils.kt @@ -181,6 +181,10 @@ object ApiUtils { return getUrlForApi(version, baseUrl) + "/room" } + fun getUrlForNoteToSelf(version: Int, baseUrl: String?): String { + return getUrlForApi(version, baseUrl) + "/room/note-to-self" + } + @JvmStatic fun getUrlForRoom(version: Int, baseUrl: String?, token: String?): String { return getUrlForRooms(version, baseUrl) + "/" + token