Add new photo picker

Signed-off-by: Marcel Hibbe <dev@mhibbe.de>
This commit is contained in:
Marcel Hibbe 2025-03-27 23:59:08 +01:00
parent e40c172c33
commit 8009cc1013
No known key found for this signature in database
GPG Key ID: C793F8B59F43CE7B
5 changed files with 96 additions and 7 deletions

View File

@ -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<PickVisualMediaRequest>
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<Uri>()
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<Uri>) {
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 = "*/*"

View File

@ -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)
}

View File

@ -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()

View File

@ -0,0 +1,15 @@
<!--
~ Nextcloud Talk - Android Client
~
~ SPDX-FileCopyrightText: 2025 Your Name <your@email.com>
~ SPDX-License-Identifier: GPL-3.0-or-later
-->
<vector xmlns:android="http://schemas.android.com/apk/res/android"
android:width="24dp"
android:height="24dp"
android:tint="#000000"
android:viewportWidth="24"
android:viewportHeight="24">
<path android:fillColor="@android:color/white"
android:pathData="M22,16L22,4c0,-1.1 -0.9,-2 -2,-2L8,2c-1.1,0 -2,0.9 -2,2v12c0,1.1 0.9,2 2,2h12c1.1,0 2,-0.9 2,-2zM11,12l2.03,2.71L16,11l4,5L8,16l3,-4zM2,6v14c0,1.1 0.9,2 2,2h14v-2L4,20L4,6L2,6z"/>
</vector>

View File

@ -196,6 +196,39 @@
</LinearLayout>
<LinearLayout
android:id="@+id/menu_attach_file_from_gallery"
android:layout_width="match_parent"
android:layout_height="@dimen/bottom_sheet_item_height"
android:background="?android:attr/selectableItemBackground"
android:gravity="center_vertical"
android:orientation="horizontal"
android:paddingStart="@dimen/standard_padding"
android:paddingEnd="@dimen/standard_padding"
tools:ignore="UseCompoundDrawables">
<ImageView
android:id="@+id/menu_icon_attach_file_from_gallery"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:contentDescription="@null"
android:src="@drawable/baseline_photo_library_24"
app:tint="@color/high_emphasis_menu_icon" />
<androidx.appcompat.widget.AppCompatTextView
android:id="@+id/txt_attach_file_from_gallery"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_gravity="start|center_vertical"
android:paddingStart="@dimen/standard_double_padding"
android:paddingEnd="@dimen/zero"
android:text="Gallery"
android:textAlignment="viewStart"
android:textColor="@color/high_emphasis_text"
android:textSize="@dimen/bottom_sheet_text_size" />
</LinearLayout>
<LinearLayout
android:id="@+id/menu_attach_file_from_local"
android:layout_width="match_parent"