about summary refs log tree commit diff
diff options
context:
space:
mode:
authorHailey <me@haileyok.com>2024-10-07 14:09:47 -0700
committerGitHub <noreply@github.com>2024-10-07 14:09:47 -0700
commitee25b89801c7038a95eb95500082dbccccb5cba9 (patch)
tree265b9380950ffa95d6fbfc8763cb5d6abc3500da
parent94e7bfbe40ba6766361caaba99feff74a187613a (diff)
downloadvoidsky-ee25b89801c7038a95eb95500082dbccccb5cba9.tar.zst
[Video] Add dimension info to share intent (#5639)
-rw-r--r--modules/Share-with-Bluesky/ShareViewController.swift30
-rw-r--r--modules/expo-receive-android-intents/android/src/main/java/xyz/blueskyweb/app/exporeceiveandroidintents/ExpoReceiveAndroidIntentsModule.kt24
-rw-r--r--src/lib/hooks/useIntentHandler.ts3
-rw-r--r--src/state/shell/composer/index.tsx2
-rw-r--r--src/view/com/composer/Composer.tsx2
5 files changed, 47 insertions, 14 deletions
diff --git a/modules/Share-with-Bluesky/ShareViewController.swift b/modules/Share-with-Bluesky/ShareViewController.swift
index 2acbb6187..79f081737 100644
--- a/modules/Share-with-Bluesky/ShareViewController.swift
+++ b/modules/Share-with-Bluesky/ShareViewController.swift
@@ -1,4 +1,5 @@
 import UIKit
+import AVKit
 
 let IMAGE_EXTENSIONS: [String] = ["png", "jpg", "jpeg", "gif", "heic"]
 let MOVIE_EXTENSIONS: [String] = ["mov", "mp4", "m4v"]
@@ -119,16 +120,11 @@ class ShareViewController: UIViewController {
   private func handleVideos(items: [NSItemProvider]) async {
     let firstItem = items.first
 
-    if let dataUri = try? await firstItem?.loadItem(forTypeIdentifier: "public.movie") as? URL {
-      let ext = String(dataUri.lastPathComponent.split(separator: ".").last ?? "mp4")
-      if let tempUrl = getTempUrl(ext: ext) {
-        let data = try? Data(contentsOf: dataUri)
-        try? data?.write(to: tempUrl)
-
-        if let encoded = tempUrl.absoluteString.addingPercentEncoding(withAllowedCharacters: .urlHostAllowed),
-           let url = URL(string: "\(self.appScheme)://intent/compose?videoUri=\(encoded)") {
-          _ = self.openURL(url)
-        }
+    if let dataUrl = try? await firstItem?.loadItem(forTypeIdentifier: "public.movie") as? URL {
+      let ext = String(dataUrl.lastPathComponent.split(separator: ".").last ?? "mp4")
+      if let videoUriInfo = saveVideoWithInfo(dataUrl),
+         let url = URL(string: "\(self.appScheme)://intent/compose?videoUri=\(videoUriInfo)") {
+        _ = self.openURL(url)
       }
     }
 
@@ -152,6 +148,20 @@ class ShareViewController: UIViewController {
     } catch {}
     return nil
   }
+  
+  private func saveVideoWithInfo(_ dataUrl: URL) -> String? {
+    let ext = String(dataUrl.lastPathComponent.split(separator: ".").last ?? "mp4")
+    guard let tempUrl = getTempUrl(ext: ext),
+          let track = AVURLAsset(url: dataUrl).tracks(withMediaType: AVMediaType.video).first else {
+      return nil
+    }
+    let size = track.naturalSize.applying(track.preferredTransform)
+    
+    let data = try? Data(contentsOf: dataUrl)
+    try? data?.write(to: tempUrl)
+    
+    return "\(tempUrl.absoluteString)|\(size.width)||\(size.height)"
+  }
 
   private func completeRequest() {
     self.extensionContext?.completeRequest(returningItems: nil)
diff --git a/modules/expo-receive-android-intents/android/src/main/java/xyz/blueskyweb/app/exporeceiveandroidintents/ExpoReceiveAndroidIntentsModule.kt b/modules/expo-receive-android-intents/android/src/main/java/xyz/blueskyweb/app/exporeceiveandroidintents/ExpoReceiveAndroidIntentsModule.kt
index c88442057..abae882b4 100644
--- a/modules/expo-receive-android-intents/android/src/main/java/xyz/blueskyweb/app/exporeceiveandroidintents/ExpoReceiveAndroidIntentsModule.kt
+++ b/modules/expo-receive-android-intents/android/src/main/java/xyz/blueskyweb/app/exporeceiveandroidintents/ExpoReceiveAndroidIntentsModule.kt
@@ -2,6 +2,7 @@ package xyz.blueskyweb.app.exporeceiveandroidintents
 
 import android.content.Intent
 import android.graphics.Bitmap
+import android.media.MediaMetadataRetriever
 import android.net.Uri
 import android.os.Build
 import android.provider.MediaStore
@@ -143,7 +144,10 @@ class ExpoReceiveAndroidIntentsModule : Module() {
     appContext.currentActivity?.contentResolver?.openInputStream(uri)?.use {
       it.copyTo(out)
     }
-    "bluesky://intent/compose?videoUri=${URLEncoder.encode(file.path, "UTF-8")}".toUri().let {
+
+    val info = getVideoInfo(uri) ?: return
+
+    "bluesky://intent/compose?videoUri=${URLEncoder.encode(file.path, "UTF-8")}|${info["width"]}|${info["height"]}".toUri().let {
       val newIntent = Intent(Intent.ACTION_VIEW, it)
       appContext.currentActivity?.startActivity(newIntent)
     }
@@ -166,6 +170,24 @@ class ExpoReceiveAndroidIntentsModule : Module() {
     )
   }
 
+  private fun getVideoInfo(uri: Uri): Map<String, Any>? {
+    val retriever = MediaMetadataRetriever()
+    retriever.setDataSource(appContext.currentActivity, uri)
+
+    val width = retriever.extractMetadata(MediaMetadataRetriever.METADATA_KEY_VIDEO_WIDTH)?.toIntOrNull()
+    val height = retriever.extractMetadata(MediaMetadataRetriever.METADATA_KEY_VIDEO_HEIGHT)?.toIntOrNull()
+
+    if (width == null || height == null) {
+      return null
+    }
+
+    return mapOf(
+      "width" to width,
+      "height" to height,
+      "path" to uri.path.toString(),
+    )
+  }
+
   private fun createFile(extension: String): File = File.createTempFile(extension, "temp.$extension", appContext.currentActivity?.cacheDir)
 
   // We will pas the width and height to the app here, since getting measurements
diff --git a/src/lib/hooks/useIntentHandler.ts b/src/lib/hooks/useIntentHandler.ts
index ce1d474d3..98ba4ec02 100644
--- a/src/lib/hooks/useIntentHandler.ts
+++ b/src/lib/hooks/useIntentHandler.ts
@@ -93,9 +93,10 @@ export function useComposeIntent() {
 
       // Whenever a video URI is present, we don't support adding images right now.
       if (videoUri) {
+        const [uri, width, height] = videoUri.split('|')
         openComposer({
           text: text ?? undefined,
-          videoUri,
+          videoUri: {uri, width: Number(width), height: Number(height)},
         })
         return
       }
diff --git a/src/state/shell/composer/index.tsx b/src/state/shell/composer/index.tsx
index 1c3aa6a81..770b0789e 100644
--- a/src/state/shell/composer/index.tsx
+++ b/src/state/shell/composer/index.tsx
@@ -38,7 +38,7 @@ export interface ComposerOpts {
   openEmojiPicker?: (pos: DOMRect | undefined) => void
   text?: string
   imageUris?: {uri: string; width: number; height: number; altText?: string}[]
-  videoUri?: string
+  videoUri?: {uri: string; width: number; height: number}
 }
 
 type StateContext = ComposerOpts | undefined
diff --git a/src/view/com/composer/Composer.tsx b/src/view/com/composer/Composer.tsx
index 94c02767e..0189ca9a8 100644
--- a/src/view/com/composer/Composer.tsx
+++ b/src/view/com/composer/Composer.tsx
@@ -218,7 +218,7 @@ export const ComposePost = ({
   // Whenever we receive an initial video uri, we should immediately run compression if necessary
   useEffect(() => {
     if (initVideoUri) {
-      selectVideo({uri: initVideoUri} as ImagePickerAsset)
+      selectVideo(initVideoUri)
     }
   }, [initVideoUri, selectVideo])