From 8009cc1013468474c4d50f7967251582d7a35d56 Mon Sep 17 00:00:00 2001 From: Marcel Hibbe Date: Thu, 27 Mar 2025 23:59:08 +0100 Subject: [PATCH 1/4] Add new photo picker Signed-off-by: Marcel Hibbe --- .../com/nextcloud/talk/chat/ChatActivity.kt | 43 ++++++++++++++++--- .../talk/chat/MessageInputFragment.kt | 5 +++ .../talk/ui/dialog/AttachmentDialog.kt | 7 ++- .../drawable/baseline_photo_library_24.xml | 15 +++++++ app/src/main/res/layout/dialog_attachment.xml | 33 ++++++++++++++ 5 files changed, 96 insertions(+), 7 deletions(-) create mode 100644 app/src/main/res/drawable/baseline_photo_library_24.xml 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 6b8df2beb..1dc84bf10 100644 --- a/app/src/main/java/com/nextcloud/talk/chat/ChatActivity.kt +++ b/app/src/main/java/com/nextcloud/talk/chat/ChatActivity.kt @@ -47,6 +47,8 @@ import android.widget.PopupMenu import android.widget.TextView import androidx.activity.OnBackPressedCallback import androidx.activity.result.ActivityResult +import androidx.activity.result.ActivityResultLauncher +import androidx.activity.result.PickVisualMediaRequest import androidx.activity.result.contract.ActivityResultContracts import androidx.appcompat.view.ContextThemeWrapper import androidx.cardview.widget.CardView @@ -213,6 +215,7 @@ import java.util.concurrent.ExecutionException import javax.inject.Inject import kotlin.collections.set import kotlin.math.roundToInt +import androidx.activity.result.contract.ActivityResultContracts.PickVisualMedia @AutoInjector(NextcloudTalkApplication::class) class ChatActivity : @@ -334,6 +337,8 @@ class ChatActivity : private var videoURI: Uri? = null + private lateinit var pickMultipleMedia: ActivityResultLauncher + private val onBackPressedCallback = object : OnBackPressedCallback(true) { override fun handleOnBackPressed() { val intent = Intent(this@ChatActivity, ConversationsListActivity::class.java) @@ -429,6 +434,14 @@ class ChatActivity : onBackPressedDispatcher.addCallback(this, onBackPressedCallback) initObservers() + + pickMultipleMedia = registerForActivityResult( + ActivityResultContracts.PickMultipleVisualMedia(5) + ) { uris -> + if (uris.isNotEmpty()) { + onChooseFileResult(uris) + } + } } private fun getMessageInputFragment(): MessageInputFragment { @@ -1943,33 +1956,47 @@ class ChatActivity : } } - @Throws(IllegalStateException::class) private fun onChooseFileResult(intent: Intent?) { try { checkNotNull(intent) - filesToUpload.clear() + val fileUris = mutableListOf() intent.clipData?.let { for (index in 0 until it.itemCount) { - filesToUpload.add(it.getItemAt(index).uri.toString()) + fileUris.add(it.getItemAt(index).uri) } } ?: run { checkNotNull(intent.data) intent.data.let { - filesToUpload.add(intent.data.toString()) + fileUris.add(intent.data!!) } } + onChooseFileResult(fileUris) + } catch (e: IllegalStateException) { + context.resources?.getString(R.string.nc_upload_failed)?.let { + Snackbar.make( + binding.root, + it, + Snackbar.LENGTH_LONG + ).show() + } + Log.e(javaClass.simpleName, "Something went wrong when trying to upload file", e) + } + } + + private fun onChooseFileResult(filesToUpload: List) { + try { require(filesToUpload.isNotEmpty()) val filenamesWithLineBreaks = StringBuilder("\n") for (file in filesToUpload) { - val filename = FileUtils.getFileName(file.toUri(), context) + val filename = FileUtils.getFileName(file, context) filenamesWithLineBreaks.append(filename).append("\n") } val newFragment = FileAttachmentPreviewFragment.newInstance( filenamesWithLineBreaks.toString(), - filesToUpload + filesToUpload.map { it.toString() }.toMutableList() ) newFragment.setListener { files, caption -> uploadFiles(files, caption) @@ -2223,6 +2250,10 @@ class ChatActivity : chatViewModel.uploadFile(fileUri, room, currentConversation?.displayName!!, metaData) } + fun showGalleryPicker() { + pickMultipleMedia.launch(PickVisualMediaRequest(PickVisualMedia.ImageAndVideo)) + } + private fun showLocalFilePicker() { val action = Intent(Intent.ACTION_OPEN_DOCUMENT).apply { type = "*/*" diff --git a/app/src/main/java/com/nextcloud/talk/chat/MessageInputFragment.kt b/app/src/main/java/com/nextcloud/talk/chat/MessageInputFragment.kt index a9f9b30e3..754bae7c5 100644 --- a/app/src/main/java/com/nextcloud/talk/chat/MessageInputFragment.kt +++ b/app/src/main/java/com/nextcloud/talk/chat/MessageInputFragment.kt @@ -402,6 +402,11 @@ class MessageInputFragment : Fragment() { AttachmentDialog(requireActivity(), requireActivity() as ChatActivity).show() } + binding.fragmentMessageInputView.attachmentButton.setOnLongClickListener { + chatActivity.showGalleryPicker() + true + } + binding.fragmentMessageInputView.button?.setOnClickListener { submitMessage(false) } diff --git a/app/src/main/java/com/nextcloud/talk/ui/dialog/AttachmentDialog.kt b/app/src/main/java/com/nextcloud/talk/ui/dialog/AttachmentDialog.kt index db794df32..a094058b5 100644 --- a/app/src/main/java/com/nextcloud/talk/ui/dialog/AttachmentDialog.kt +++ b/app/src/main/java/com/nextcloud/talk/ui/dialog/AttachmentDialog.kt @@ -20,8 +20,8 @@ import com.nextcloud.talk.application.NextcloudTalkApplication import com.nextcloud.talk.chat.ChatActivity import com.nextcloud.talk.databinding.DialogAttachmentBinding import com.nextcloud.talk.ui.theme.ViewThemeUtils -import com.nextcloud.talk.utils.SpreedFeatures import com.nextcloud.talk.utils.CapabilitiesUtil +import com.nextcloud.talk.utils.SpreedFeatures import javax.inject.Inject @AutoInjector(NextcloudTalkApplication::class) @@ -92,6 +92,11 @@ class AttachmentDialog(val activity: Activity, var chatActivity: ChatActivity) : dismiss() } + dialogAttachmentBinding.menuAttachFileFromGallery.setOnClickListener { + chatActivity.showGalleryPicker() + dismiss() + } + dialogAttachmentBinding.menuAttachFileFromLocal.setOnClickListener { chatActivity.sendSelectLocalFileIntent() dismiss() diff --git a/app/src/main/res/drawable/baseline_photo_library_24.xml b/app/src/main/res/drawable/baseline_photo_library_24.xml new file mode 100644 index 000000000..f1711dc0a --- /dev/null +++ b/app/src/main/res/drawable/baseline_photo_library_24.xml @@ -0,0 +1,15 @@ + + + + diff --git a/app/src/main/res/layout/dialog_attachment.xml b/app/src/main/res/layout/dialog_attachment.xml index 8348e8360..536b54de8 100644 --- a/app/src/main/res/layout/dialog_attachment.xml +++ b/app/src/main/res/layout/dialog_attachment.xml @@ -196,6 +196,39 @@ + + + + + + + + Date: Fri, 28 Mar 2025 14:07:12 +0100 Subject: [PATCH 2/4] remove permission checks for new photo picker The new photo picker does not need files permission. For other features, the permissions are already checked elsewhere Signed-off-by: Marcel Hibbe --- .../nextcloud/talk/jobs/UploadAndShareFilesWorker.kt | 10 ---------- .../talk/ui/dialog/FileAttachmentPreviewFragment.kt | 9 ++------- 2 files changed, 2 insertions(+), 17 deletions(-) diff --git a/app/src/main/java/com/nextcloud/talk/jobs/UploadAndShareFilesWorker.kt b/app/src/main/java/com/nextcloud/talk/jobs/UploadAndShareFilesWorker.kt index 0161003f3..5a3526de9 100644 --- a/app/src/main/java/com/nextcloud/talk/jobs/UploadAndShareFilesWorker.kt +++ b/app/src/main/java/com/nextcloud/talk/jobs/UploadAndShareFilesWorker.kt @@ -89,16 +89,6 @@ class UploadAndShareFilesWorker(val context: Context, workerParameters: WorkerPa override fun doWork(): Result { NextcloudTalkApplication.sharedApplication!!.componentApplication.inject(this) - if (!platformPermissionUtil.isFilesPermissionGranted()) { - Log.w( - TAG, - "Storage permission is not granted. As a developer please make sure you check for" + - "permissions via UploadAndShareFilesWorker.isStoragePermissionGranted() and " + - "UploadAndShareFilesWorker.requestStoragePermission() beforehand. If you already " + - "did but end up with this warning, the user most likely revoked the permission" - ) - } - return try { currentUser = currentUserProvider.currentUser.blockingGet() val sourceFile = inputData.getString(DEVICE_SOURCE_FILE) diff --git a/app/src/main/java/com/nextcloud/talk/ui/dialog/FileAttachmentPreviewFragment.kt b/app/src/main/java/com/nextcloud/talk/ui/dialog/FileAttachmentPreviewFragment.kt index 0be7ecb1e..c23bba00a 100644 --- a/app/src/main/java/com/nextcloud/talk/ui/dialog/FileAttachmentPreviewFragment.kt +++ b/app/src/main/java/com/nextcloud/talk/ui/dialog/FileAttachmentPreviewFragment.kt @@ -17,7 +17,6 @@ import com.google.android.material.dialog.MaterialAlertDialogBuilder import com.nextcloud.talk.R import com.nextcloud.talk.application.NextcloudTalkApplication import com.nextcloud.talk.databinding.DialogFileAttachmentPreviewBinding -import com.nextcloud.talk.jobs.UploadAndShareFilesWorker import com.nextcloud.talk.ui.theme.ViewThemeUtils import com.nextcloud.talk.utils.permissions.PlatformPermissionUtil import javax.inject.Inject @@ -70,12 +69,8 @@ class FileAttachmentPreviewFragment : DialogFragment() { } binding.buttonSend.setOnClickListener { - if (permissionUtil.isFilesPermissionGranted()) { - val caption: String = binding.dialogFileAttachmentPreviewCaption.text.toString() - uploadFiles(filesList, caption) - } else { - UploadAndShareFilesWorker.requestStoragePermission(requireActivity()) - } + val caption: String = binding.dialogFileAttachmentPreviewCaption.text.toString() + uploadFiles(filesList, caption) dismiss() } } From 7bf53e69dd511a6e36f7863d0fa717b607db14aa Mon Sep 17 00:00:00 2001 From: Marcel Hibbe Date: Fri, 28 Mar 2025 14:49:54 +0100 Subject: [PATCH 3/4] reorder attachment dialog items ... to match order from iOS talk. Also add a divider Signed-off-by: Marcel Hibbe --- app/src/main/res/layout/dialog_attachment.xml | 205 +++++++++--------- 1 file changed, 106 insertions(+), 99 deletions(-) diff --git a/app/src/main/res/layout/dialog_attachment.xml b/app/src/main/res/layout/dialog_attachment.xml index 536b54de8..607060b4b 100644 --- a/app/src/main/res/layout/dialog_attachment.xml +++ b/app/src/main/res/layout/dialog_attachment.xml @@ -31,105 +31,6 @@ android:textColor="@color/medium_emphasis_text" android:textSize="@dimen/bottom_sheet_text_size" /> - - - - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + + + + + From 180d674e64301eb9f1158fb48cbe03dd94e68067 Mon Sep 17 00:00:00 2001 From: Marcel Hibbe Date: Fri, 28 Mar 2025 14:53:55 +0100 Subject: [PATCH 4/4] add string "Gallery" Signed-off-by: Marcel Hibbe --- app/src/main/res/layout/dialog_attachment.xml | 2 +- app/src/main/res/values/strings.xml | 1 + 2 files changed, 2 insertions(+), 1 deletion(-) diff --git a/app/src/main/res/layout/dialog_attachment.xml b/app/src/main/res/layout/dialog_attachment.xml index 607060b4b..a19460144 100644 --- a/app/src/main/res/layout/dialog_attachment.xml +++ b/app/src/main/res/layout/dialog_attachment.xml @@ -123,7 +123,7 @@ android:layout_gravity="start|center_vertical" android:paddingStart="@dimen/standard_double_padding" android:paddingEnd="@dimen/zero" - android:text="Gallery" + android:text="@string/nc_gallery" android:textAlignment="viewStart" android:textColor="@color/high_emphasis_text" android:textSize="@dimen/bottom_sheet_text_size" /> diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index dcbfa5238..47ca02e69 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -541,6 +541,7 @@ How to translate with transifex: Send this file to %1$s? Uploading Upload from device + Gallery %1$s to %2$s - %3$s\%% Failure