Browse Source

add ability to share plain text

Signed-off-by: Marcel Hibbe <dev@mhibbe.de>
Marcel Hibbe 4 years ago
parent
commit
59ccc19ebe

+ 12 - 6
app/src/main/java/com/nextcloud/talk/controllers/ChatController.kt

@@ -265,6 +265,7 @@ class ChatController(args: Bundle) :
     var futurePreconditionFailed = false
 
     val filesToUpload: MutableList<String> = 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> (resources).getString(R.string.nc_limit_hit),
+                        Objects.requireNonNull<Resources>(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<out String>, grantResults: IntArray) {
+    override fun onRequestPermissionsResult(requestCode: Int, permissions: Array<out String>, 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

+ 44 - 18
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<String> 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 ||

+ 4 - 4
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"
             )
         }
 

+ 1 - 0
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"
 }