Bladeren bron

Fix(mobile): share contents between apps (#12086)

* fix(mobile): share asset file for the db graph

* enhance(android): update manifest and intent handling for asset embedding
Charlie 1 maand geleden
bovenliggende
commit
56b54d5f40
2 gewijzigde bestanden met toevoegingen van 37 en 27 verwijderingen
  1. 12 7
      android/app/src/main/AndroidManifest.xml
  2. 25 20
      src/main/frontend/mobile/intent.cljs

+ 12 - 7
android/app/src/main/AndroidManifest.xml

@@ -11,21 +11,21 @@
     <uses-permission android:name="android.permission.RECORD_AUDIO" />
 
     <application
-        android:networkSecurityConfig="@xml/network_security_config"
         android:allowBackup="true"
         android:icon="@mipmap/ic_launcher"
         android:label="@string/app_name"
+        android:networkSecurityConfig="@xml/network_security_config"
+        android:requestLegacyExternalStorage="true"
         android:roundIcon="@mipmap/ic_launcher_round"
         android:supportsRtl="true"
-        android:requestLegacyExternalStorage="true"
         android:theme="@style/AppTheme">
         <activity
-            android:exported="true"
-            android:configChanges="orientation|keyboardHidden|keyboard|screenSize|locale|smallestScreenSize|screenLayout|uiMode|navigation"
             android:name="com.logseq.app.MainActivity"
+            android:configChanges="orientation|keyboardHidden|keyboard|screenSize|locale|smallestScreenSize|screenLayout|uiMode|navigation"
+            android:exported="true"
             android:label="@string/title_activity_main"
-            android:theme="@style/AppTheme.NoActionBarLaunch"
-            android:launchMode="singleTask">
+            android:launchMode="singleTask"
+            android:theme="@style/AppTheme.NoActionBarLaunch">
             <intent-filter>
                 <action android:name="android.intent.action.MAIN" />
                 <category android:name="android.intent.category.LAUNCHER" />
@@ -34,6 +34,7 @@
             <intent-filter>
                 <action android:name="android.intent.action.SEND" />
                 <category android:name="android.intent.category.DEFAULT" />
+
                 <data android:mimeType="text/plain" />
                 <data android:mimeType="image/*" />
                 <data android:mimeType="application/*" />
@@ -42,8 +43,10 @@
 
             <intent-filter>
                 <action android:name="android.intent.action.VIEW" />
+
                 <category android:name="android.intent.category.DEFAULT" />
                 <category android:name="android.intent.category.BROWSABLE" />
+
                 <data android:scheme="logseq" />
             </intent-filter>
         </activity>
@@ -53,7 +56,9 @@
             android:authorities="${applicationId}.fileprovider"
             android:exported="false"
             android:grantUriPermissions="true">
-            <meta-data android:name="android.support.FILE_PROVIDER_PATHS" android:resource="@xml/file_paths" />
+            <meta-data
+                android:name="android.support.FILE_PROVIDER_PATHS"
+                android:resource="@xml/file_paths" />
         </provider>
     </application>
 </manifest>

+ 25 - 20
src/main/frontend/mobile/intent.cljs

@@ -83,18 +83,20 @@
   (let [args (transform-args args)]
     (state/pub-event! [:editor/quick-capture args])))
 
-(defn- embed-asset-file [url format]
+(defn- embed-asset-file [url _format]
   (p/let [basename (node-path/basename url)
-          label (-> basename util/node-path.name)
+          _label (-> basename util/node-path.name)
+          _path (assets-handler/get-asset-path basename)
           time (date/get-current-time)
           date-ref-name (date/today)
-          path (assets-handler/get-asset-path basename)
-          _file (p/catch
-                 (.copy Filesystem (clj->js {:from url :to path}))
-                 (fn [error]
-                   (log/error :copy-file-error {:error error})))
-          url (util/format "../assets/%s" basename)
-          url (assets-handler/get-asset-file-link format url label true)
+          file (.readFile Filesystem #js {:path url})
+          file-base64-str (some-> file (.-data))
+          file (some-> file-base64-str (util/base64string-to-unit8array)
+                 (vector) (clj->js) (js/File. basename #js {}))
+          asset-entity (editor-handler/db-based-save-assets!
+                         (state/get-current-repo) [file] {})
+          asset-entity (some-> asset-entity (first))
+          url (util/format "[[%s]]" (:block/uuid asset-entity))
           template (get-in (state/get-config)
                            [:quick-capture-templates :media]
                            "**{time}** [[quick capture]]: {url}")]
@@ -182,17 +184,20 @@
                         (common-util/safe-decode-uri-component v)
                         v))])))
 
-(defn- handle-asset-file [url format]
-  (p/let [basename (node-path/basename url)
-          label (-> basename util/node-path.name)
-          path (assets-handler/get-asset-path basename)
-          _file (p/catch
-                 (.copy Filesystem (clj->js {:from url :to path}))
-                 (fn [error]
-                   (log/error :copy-file-error {:error error})))
-          url (util/format "../assets/%s" basename)
-          url-link (assets-handler/get-asset-file-link format url label true)]
-    url-link))
+(defn- handle-asset-file [url _format]
+  (-> (p/let [basename (node-path/basename url)
+              _label (-> basename util/node-path.name)
+              _path (assets-handler/get-asset-path basename)
+              file (.readFile Filesystem #js {:path url})
+              file-base64-str (some-> file (.-data))
+              file (some-> file-base64-str (util/base64string-to-unit8array)
+                     (vector) (clj->js) (js/File. basename #js {}))
+              asset-entity (editor-handler/db-based-save-assets!
+                             (state/get-current-repo) [file] {})
+              asset-entity (some-> asset-entity (first))
+              url-link (util/format "[[%s]]" (:block/uuid asset-entity))]
+        url-link)
+    (p/catch #(js/console.error "Error(handle asset file):" %))))
 
 (defn- handle-payload-resource
   [{:keys [type name ext url] :as resource} format]