-
Notifications
You must be signed in to change notification settings - Fork 1.9k
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
Merge branch 'bluesky-social:main' into main
- Loading branch information
Showing
131 changed files
with
7,094 additions
and
1,712 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1 @@ | ||
18 |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
|
@@ -65,8 +65,6 @@ If you discover any security issues, please send an email to [email protected]. | |
|
||
Bluesky is an open social network built on the AT Protocol, a flexible technology that will never lock developers out of the ecosystems that they help build. With atproto, third-party can be as seamless as first-party through custom feeds, federated services, clients, and more. | ||
|
||
If you're a developer interested in building on atproto, we'd love to email you a Bluesky invite code. Simply share your GitHub (or similar) profile with us via [this form](https://forms.gle/BF21oxVNZiDjDhXF9). | ||
|
||
## License (MIT) | ||
|
||
See [./LICENSE](./LICENSE) for the full license. | ||
|
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,41 @@ | ||
<?xml version="1.0" encoding="UTF-8"?> | ||
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd"> | ||
<plist version="1.0"> | ||
<dict> | ||
<key>NSExtension</key> | ||
<dict> | ||
<key>NSExtensionPrincipalClass</key> | ||
<string>$(PRODUCT_MODULE_NAME).ShareViewController</string> | ||
<key>NSExtensionAttributes</key> | ||
<dict> | ||
<key>NSExtensionActivationRule</key> | ||
<dict> | ||
<key>NSExtensionActivationSupportsText</key> | ||
<true/> | ||
<key>NSExtensionActivationSupportsWebURLWithMaxCount</key> | ||
<integer>1</integer> | ||
<key>NSExtensionActivationSupportsImageWithMaxCount</key> | ||
<integer>10</integer> | ||
</dict> | ||
</dict> | ||
<key>NSExtensionPointIdentifier</key> | ||
<string>com.apple.share-services</string> | ||
</dict> | ||
<key>MainAppScheme</key> | ||
<string>bluesky</string> | ||
<key>CFBundleName</key> | ||
<string>$(PRODUCT_NAME)</string> | ||
<key>CFBundleDisplayName</key> | ||
<string>Extension</string> | ||
<key>CFBundleIdentifier</key> | ||
<string>$(PRODUCT_BUNDLE_IDENTIFIER)</string> | ||
<key>CFBundleVersion</key> | ||
<string>$(CURRENT_PROJECT_VERSION)</string> | ||
<key>CFBundleExecutable</key> | ||
<string>$(EXECUTABLE_NAME)</string> | ||
<key>CFBundlePackageType</key> | ||
<string>$(PRODUCT_BUNDLE_PACKAGE_TYPE)</string> | ||
<key>CFBundleShortVersionString</key> | ||
<string>$(MARKETING_VERSION)</string> | ||
</dict> | ||
</plist> |
10 changes: 10 additions & 0 deletions
10
modules/Share-with-Bluesky/Share-with-Bluesky.entitlements
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,10 @@ | ||
<?xml version="1.0" encoding="UTF-8"?> | ||
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd"> | ||
<plist version="1.0"> | ||
<dict> | ||
<key>com.apple.security.application-groups</key> | ||
<array> | ||
<string>group.app.bsky</string> | ||
</array> | ||
</dict> | ||
</plist> |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,153 @@ | ||
import UIKit | ||
|
||
class ShareViewController: UIViewController { | ||
// This allows other forks to use this extension while also changing their | ||
// scheme. | ||
let appScheme = Bundle.main.object(forInfoDictionaryKey: "MainAppScheme") as? String ?? "bluesky" | ||
|
||
// | ||
override func viewDidAppear(_ animated: Bool) { | ||
super.viewDidAppear(animated) | ||
|
||
guard let extensionItem = extensionContext?.inputItems.first as? NSExtensionItem, | ||
let attachments = extensionItem.attachments, | ||
let firstAttachment = extensionItem.attachments?.first | ||
else { | ||
self.completeRequest() | ||
return | ||
} | ||
|
||
Task { | ||
if firstAttachment.hasItemConformingToTypeIdentifier("public.text") { | ||
await self.handleText(item: firstAttachment) | ||
} else if firstAttachment.hasItemConformingToTypeIdentifier("public.url") { | ||
await self.handleUrl(item: firstAttachment) | ||
} else if firstAttachment.hasItemConformingToTypeIdentifier("public.image") { | ||
await self.handleImages(items: attachments) | ||
} else { | ||
self.completeRequest() | ||
} | ||
} | ||
} | ||
|
||
private func handleText(item: NSItemProvider) async -> Void { | ||
do { | ||
if let data = try await item.loadItem(forTypeIdentifier: "public.text") as? String { | ||
if let encoded = data.addingPercentEncoding(withAllowedCharacters: .urlHostAllowed), | ||
let url = URL(string: "\(self.appScheme)://intent/compose?text=\(encoded)") | ||
{ | ||
_ = self.openURL(url) | ||
} | ||
} | ||
self.completeRequest() | ||
} catch { | ||
self.completeRequest() | ||
} | ||
} | ||
|
||
private func handleUrl(item: NSItemProvider) async -> Void { | ||
do { | ||
if let data = try await item.loadItem(forTypeIdentifier: "public.url") as? URL { | ||
if let encoded = data.absoluteString.addingPercentEncoding(withAllowedCharacters: .urlHostAllowed), | ||
let url = URL(string: "\(self.appScheme)://intent/compose?text=\(encoded)") | ||
{ | ||
_ = self.openURL(url) | ||
} | ||
} | ||
self.completeRequest() | ||
} catch { | ||
self.completeRequest() | ||
} | ||
} | ||
|
||
private func handleImages(items: [NSItemProvider]) async -> Void { | ||
let firstFourItems: [NSItemProvider] | ||
if items.count < 4 { | ||
firstFourItems = items | ||
} else { | ||
firstFourItems = Array(items[0...3]) | ||
} | ||
|
||
var valid = true | ||
var imageUris = "" | ||
|
||
for (index, item) in firstFourItems.enumerated() { | ||
var imageUriInfo: String? = nil | ||
|
||
do { | ||
if let dataUri = try await item.loadItem(forTypeIdentifier: "public.image") as? URL { | ||
// We need to duplicate this image, since we don't have access to the outgoing temp directory | ||
// We also will get the image dimensions here, sinze RN makes it difficult to get those dimensions for local files | ||
let data = try Data(contentsOf: dataUri) | ||
let image = UIImage(data: data) | ||
imageUriInfo = self.saveImageWithInfo(image) | ||
} else if let image = try await item.loadItem(forTypeIdentifier: "public.image") as? UIImage { | ||
imageUriInfo = self.saveImageWithInfo(image) | ||
} | ||
} catch { | ||
valid = false | ||
} | ||
|
||
if let imageUriInfo = imageUriInfo { | ||
imageUris.append(imageUriInfo) | ||
if index < items.count - 1 { | ||
imageUris.append(",") | ||
} | ||
} else { | ||
valid = false | ||
} | ||
} | ||
|
||
if valid, | ||
let encoded = imageUris.addingPercentEncoding(withAllowedCharacters: .urlHostAllowed), | ||
let url = URL(string: "\(self.appScheme)://intent/compose?imageUris=\(encoded)") | ||
{ | ||
_ = self.openURL(url) | ||
} | ||
|
||
self.completeRequest() | ||
} | ||
|
||
private func saveImageWithInfo(_ image: UIImage?) -> String? { | ||
guard let image = image else { | ||
return nil | ||
} | ||
|
||
do { | ||
// Saving this file to the bundle group's directory lets us access it from | ||
// inside of the app. Otherwise, we wouldn't have access even though the | ||
// extension does. | ||
if let dir = FileManager() | ||
.containerURL( | ||
forSecurityApplicationGroupIdentifier: "group.app.bsky") | ||
{ | ||
let filePath = "\(dir.absoluteString)\(ProcessInfo.processInfo.globallyUniqueString).jpeg" | ||
|
||
if let newUri = URL(string: filePath), | ||
let jpegData = image.jpegData(compressionQuality: 1) | ||
{ | ||
try jpegData.write(to: newUri) | ||
return "\(newUri.absoluteString)|\(image.size.width)|\(image.size.height)" | ||
} | ||
} | ||
return nil | ||
} catch { | ||
return nil | ||
} | ||
} | ||
|
||
private func completeRequest() -> Void { | ||
self.extensionContext?.completeRequest(returningItems: nil) | ||
} | ||
|
||
@objc func openURL(_ url: URL) -> Bool { | ||
var responder: UIResponder? = self | ||
while responder != nil { | ||
if let application = responder as? UIApplication { | ||
return application.perform(#selector(openURL(_:)), with: url) != nil | ||
} | ||
responder = responder?.next | ||
} | ||
return false | ||
} | ||
} |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,8 @@ | ||
# Expo Receive Android Intents | ||
|
||
This module handles incoming intents on Android. Handled intents are `text/plain` and `image/*` (single or multiple). | ||
The module handles saving images to the app's filesystem for access within the app, limiting the selection of images | ||
to a max of four, and handling intent types. No JS code is required for this module, and it is no-op on non-android | ||
platforms. | ||
|
||
No installation is required. Gradle will automatically add this module on build. |
Oops, something went wrong.