]> git.eshelyaron.com Git - emacs.git/commitdiff
Facilitate opening multiple files through DND under Android
authorPo Lu <luangruo@yahoo.com>
Sat, 21 Oct 2023 06:24:25 +0000 (14:24 +0800)
committerPo Lu <luangruo@yahoo.com>
Sat, 21 Oct 2023 06:25:02 +0000 (14:25 +0800)
* java/org/gnu/emacs/EmacsWindow.java (onDragEvent): Agglomerate
each provided content URI into a text/uri list.

java/org/gnu/emacs/EmacsWindow.java

index 386eaca8c41aed16f548ffe0d9f7f9a728067ae2..7662186a0ebb6471fcc7229f6065f3b4c5c82490 100644 (file)
@@ -1605,6 +1605,7 @@ public final class EmacsWindow extends EmacsHandleObject
     String type;
     Uri uri;
     EmacsActivity activity;
+    StringBuilder builder;
 
     x = (int) event.getX ();
     y = (int) event.getY ();
@@ -1659,38 +1660,54 @@ public final class EmacsWindow extends EmacsHandleObject
                EmacsNative.sendDndUri (handle, x, y, type);
                return true;
              }
-           else
-             {
-               /* If the item dropped is a URI, send it to the main
-                  thread.  */
-
-               uri = data.getItemAt (0).getUri ();
+         }
 
-               /* Attempt to acquire permissions for this URI;
-                  failing which, insert it as text instead.  */
+       /* There's no plain text data within this clipboard item, so
+          each item within should be treated as a content URI
+          designating a file.  */
 
-               if (uri != null
-                   && uri.getScheme () != null
-                   && uri.getScheme ().equals ("content")
-                   && (activity = EmacsActivity.lastFocusedActivity) != null)
-                 {
-                   if (activity.requestDragAndDropPermissions (event) == null)
-                     uri = null;
-                 }
+       /* Collect the URIs into a string with each suffixed
+          by newlines, much as in a text/uri-list.  */
+       builder = new StringBuilder ();
 
-               if (uri != null)
-                 EmacsNative.sendDndUri (handle, x, y, uri.toString ());
-               else
-                 {
-                   type = (data.getItemAt (0)
-                           .coerceToText (EmacsService.SERVICE)
-                           .toString ());
-                   EmacsNative.sendDndText (handle, x, y, type);
-                 }
+       for (i = 0; i < itemCount; ++i)
+         {
+           /* If the item dropped is a URI, send it to the
+              main thread.  */
+
+           uri = data.getItemAt (i).getUri ();
+
+           /* Attempt to acquire permissions for this URI;
+              failing which, insert it as text instead.  */
+                   
+           if (uri != null
+               && uri.getScheme () != null
+               && uri.getScheme ().equals ("content")
+               && (activity = EmacsActivity.lastFocusedActivity) != null)
+             {
+               if ((activity.requestDragAndDropPermissions (event) == null))
+                 uri = null;
+             }
 
-               return true;
+           if (uri != null)
+             builder.append (uri.toString ()).append ("\n");
+           else
+             {
+               /* Treat each URI that Emacs cannot secure
+                  permissions for as plain text.  */
+               type = (data.getItemAt (i)
+                       .coerceToText (EmacsService.SERVICE)
+                       .toString ());
+               EmacsNative.sendDndText (handle, x, y, type);
              }
          }
+
+       /* Now send each URI to Emacs.  */
+
+       if (builder.length () > 0)
+         EmacsNative.sendDndUri (handle, x, y, builder.toString ());
+
+       return true;
       }
 
     return true;