diff --git a/app/src/main/java/com/nextcloud/talk/controllers/ChatController.kt b/app/src/main/java/com/nextcloud/talk/controllers/ChatController.kt index acadd3098..416e39025 100644 --- a/app/src/main/java/com/nextcloud/talk/controllers/ChatController.kt +++ b/app/src/main/java/com/nextcloud/talk/controllers/ChatController.kt @@ -265,6 +265,7 @@ class ChatController(args: Bundle) : var futurePreconditionFailed = false val filesToUpload: MutableList = ArrayList() + var sharedText: String init { setHasOptionsMenu(true) @@ -273,6 +274,7 @@ class ChatController(args: Bundle) : this.conversationUser = args.getParcelable(BundleKeys.KEY_USER_ENTITY) this.roomId = args.getString(BundleKeys.KEY_ROOM_ID, "") this.roomToken = args.getString(BundleKeys.KEY_ROOM_TOKEN, "") + this.sharedText = args.getString(BundleKeys.KEY_SHARED_TEXT, "") if (args.containsKey(BundleKeys.KEY_ACTIVE_CONVERSATION)) { this.currentConversation = @@ -550,7 +552,7 @@ class ChatController(args: Bundle) : override fun onTextChanged(s: CharSequence, start: Int, before: Int, count: Int) { if (s.length >= lengthFilter) { messageInput?.error = String.format( - Objects.requireNonNull (resources).getString(R.string.nc_limit_hit), + Objects.requireNonNull(resources).getString(R.string.nc_limit_hit), Integer.toString(lengthFilter) ) } else { @@ -583,6 +585,7 @@ class ChatController(args: Bundle) : } }) + messageInput?.setText(sharedText) messageInputView?.setAttachmentsListener { activity?.let { AttachmentDialog(it, this).show() } } @@ -741,7 +744,7 @@ class ChatController(args: Bundle) : } } - override fun onRequestPermissionsResult(requestCode: Int, permissions: Array, grantResults: IntArray) { + override fun onRequestPermissionsResult(requestCode: Int, permissions: Array, grantResults: IntArray) { if (requestCode == UploadAndShareFilesWorker.REQUEST_PERMISSION && grantResults.isNotEmpty() && grantResults[0] == PackageManager.PERMISSION_GRANTED) { Log.d(ConversationsListController.TAG, "upload starting after permissions were granted") uploadFiles(filesToUpload) @@ -1324,9 +1327,9 @@ class ChatController(args: Bundle) : TextUtils.isEmpty(chatMessageList[i + 1].systemMessage) && chatMessageList[i + 1].actorId == chatMessageList[i].actorId && countGroupedMessages < 4 && DateFormatter.isSameDay( - chatMessageList[i].createdAt, - chatMessageList[i + 1].createdAt - ) + chatMessageList[i].createdAt, + chatMessageList[i + 1].createdAt + ) ) { chatMessageList[i].isGrouped = true countGroupedMessages++ @@ -1637,7 +1640,8 @@ class ChatController(args: Bundle) : true } R.id.action_reply_privately -> { - val apiVersion = ApiUtils.getConversationApiVersion(conversationUser, intArrayOf(ApiUtils.APIv4, 1)) + val apiVersion = + ApiUtils.getConversationApiVersion(conversationUser, intArrayOf(ApiUtils.APIv4, 1)) val retrofitBucket = ApiUtils.getRetrofitBucketForCreateRoom( apiVersion, conversationUser?.baseUrl, @@ -1686,6 +1690,7 @@ class ChatController(args: Bundle) : override fun onError(e: Throwable) { Log.e(TAG, e.message, e) } + override fun onComplete() {} }) } @@ -1693,6 +1698,7 @@ class ChatController(args: Bundle) : override fun onError(e: Throwable) { Log.e(TAG, e.message, e) } + override fun onComplete() {} }) true diff --git a/app/src/main/java/com/nextcloud/talk/controllers/ConversationsListController.java b/app/src/main/java/com/nextcloud/talk/controllers/ConversationsListController.java index efe354432..5956af9f0 100644 --- a/app/src/main/java/com/nextcloud/talk/controllers/ConversationsListController.java +++ b/app/src/main/java/com/nextcloud/talk/controllers/ConversationsListController.java @@ -25,6 +25,7 @@ package com.nextcloud.talk.controllers; import android.animation.AnimatorInflater; import android.annotation.SuppressLint; import android.app.SearchManager; +import android.content.ClipData; import android.content.Context; import android.content.Intent; import android.content.pm.PackageManager; @@ -58,7 +59,6 @@ import com.facebook.imagepipeline.core.ImagePipeline; import com.facebook.imagepipeline.datasource.BaseBitmapDataSubscriber; import com.facebook.imagepipeline.image.CloseableImage; import com.facebook.imagepipeline.request.ImageRequest; -import com.google.android.material.appbar.AppBarLayout; import com.google.android.material.button.MaterialButton; import com.google.android.material.floatingactionbutton.FloatingActionButton; import com.kennyc.bottomsheet.BottomSheet; @@ -98,13 +98,11 @@ import org.apache.commons.lang3.builder.CompareToBuilder; import org.greenrobot.eventbus.EventBus; import org.greenrobot.eventbus.Subscribe; import org.greenrobot.eventbus.ThreadMode; -import org.jetbrains.annotations.NotNull; import org.parceler.Parcels; import java.util.ArrayList; import java.util.Collections; import java.util.List; -import java.util.Objects; import javax.inject.Inject; @@ -202,6 +200,8 @@ public class ConversationsListController extends BaseController implements Searc private ArrayList filesToShare; private Conversation selectedConversation; + private String textToPaste = ""; + public ConversationsListController() { super(); setHasOptionsMenu(true); @@ -391,7 +391,7 @@ public class ConversationsListController extends BaseController implements Searc activity.binding.appBar.setStateListAnimator(AnimatorInflater.loadStateListAnimator( activity.binding.appBar.getContext(), R.animator.appbar_elevation_off) - ); + ); activity.binding.toolbar.setVisibility(View.GONE); activity.binding.searchToolbar.setVisibility(View.VISIBLE); if (getResources() != null) { @@ -749,7 +749,7 @@ public class ConversationsListController extends BaseController implements Searc if (selectedConversation != null && getActivity() != null) { if (showShareToScreen) { shareToScreenWasShown = true; - showShareToConfirmDialog(); + handleSharedData(); } else { openConversation(); } @@ -757,10 +757,19 @@ public class ConversationsListController extends BaseController implements Searc return true; } - private void showShareToConfirmDialog() { - if (UploadAndShareFilesWorker.Companion.isStoragePermissionGranted(context)) { - collectFilesToShareFromIntent(); + private void handleSharedData() { + collectDataFromIntent(); + if (!textToPaste.isEmpty()) { + openConversation(textToPaste); + } else if (filesToShare != null && !filesToShare.isEmpty()) { + showSendFilesConfirmDialog(); + } else { + Toast.makeText(context, context.getResources().getString(R.string.nc_common_error_sorry), Toast.LENGTH_LONG).show(); + } + } + private void showSendFilesConfirmDialog() { + if (UploadAndShareFilesWorker.Companion.isStoragePermissionGranted(context)) { StringBuilder fileNamesWithLineBreaks = new StringBuilder("\n"); for (String file : filesToShare) { @@ -824,21 +833,33 @@ public class ConversationsListController extends BaseController implements Searc } } - private void collectFilesToShareFromIntent() { + private void collectDataFromIntent() { filesToShare = new ArrayList<>(); if (getActivity() != null && getActivity().getIntent() != null) { Intent intent = getActivity().getIntent(); if (Intent.ACTION_SEND.equals(intent.getAction()) || Intent.ACTION_SEND_MULTIPLE.equals(intent.getAction())) { - if (intent.getClipData() != null) { - for (int i = 0; i < intent.getClipData().getItemCount(); i++) { - filesToShare.add(intent.getClipData().getItemAt(i).getUri().toString()); + try { + if (intent.getClipData() != null) { + for (int i = 0; i < intent.getClipData().getItemCount(); i++) { + ClipData.Item item = intent.getClipData().getItemAt(i); + if (item.getUri() != null) { + filesToShare.add(intent.getClipData().getItemAt(i).getUri().toString()); + } else if (item.getText() != null) { + textToPaste = intent.getClipData().getItemAt(i).getText().toString(); + break; + } else { + Log.w(TAG, "datatype not yet implemented for share-to"); + } + } + } else { + filesToShare.add(intent.getData().toString()); } - } else { - filesToShare.add(intent.getData().toString()); - } - if (filesToShare.isEmpty()) { - Log.e(TAG, "failed to get files from intent"); + if (filesToShare.isEmpty() && textToPaste.isEmpty()) { + Log.e(TAG, "failed to get data from intent"); + } + } catch (Exception e) { + Log.e(TAG, "Something went wrong when extracting data from intent"); } } } @@ -881,17 +902,22 @@ public class ConversationsListController extends BaseController implements Searc grantResults.length > 0 && grantResults[0] == PackageManager.PERMISSION_GRANTED) { Log.d(TAG, "upload starting after permissions were granted"); - showShareToConfirmDialog(); + showSendFilesConfirmDialog(); } else { Toast.makeText(context, context.getString(R.string.read_storage_no_permission), Toast.LENGTH_LONG).show(); } } private void openConversation() { + openConversation(""); + } + + private void openConversation(String textToPaste) { Bundle bundle = new Bundle(); bundle.putParcelable(BundleKeys.INSTANCE.getKEY_USER_ENTITY(), currentUser); bundle.putString(BundleKeys.INSTANCE.getKEY_ROOM_TOKEN(), selectedConversation.getToken()); bundle.putString(BundleKeys.INSTANCE.getKEY_ROOM_ID(), selectedConversation.getRoomId()); + bundle.putString(BundleKeys.INSTANCE.getKEY_SHARED_TEXT(), textToPaste); if (selectedConversation.hasPassword && selectedConversation.participantType == Participant.ParticipantType.GUEST || 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 7b9f0f9d9..67df52a0d 100644 --- a/app/src/main/java/com/nextcloud/talk/jobs/UploadAndShareFilesWorker.kt +++ b/app/src/main/java/com/nextcloud/talk/jobs/UploadAndShareFilesWorker.kt @@ -75,10 +75,10 @@ class UploadAndShareFilesWorker(val context: Context, workerParameters: WorkerPa if (!isStoragePermissionGranted(context)) { 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" + 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" ) } diff --git a/app/src/main/java/com/nextcloud/talk/utils/bundle/BundleKeys.kt b/app/src/main/java/com/nextcloud/talk/utils/bundle/BundleKeys.kt index bb8c6c42e..39ea5d998 100644 --- a/app/src/main/java/com/nextcloud/talk/utils/bundle/BundleKeys.kt +++ b/app/src/main/java/com/nextcloud/talk/utils/bundle/BundleKeys.kt @@ -65,4 +65,5 @@ object BundleKeys { val KEY_ACCOUNT = "KEY_ACCOUNT" val KEY_FILE_ID = "KEY_FILE_ID" val KEY_NOTIFICATION_ID = "KEY_NOTIFICATION_ID" + val KEY_SHARED_TEXT = "KEY_SHARED_TEXT" }