mirror of
https://github.com/Novaloop-AG/element-x-ios.git
synced 2026-11-02 12:07:55 +00:00
Share extension (#3506)
* Setup simple share extension * Switch the app url scheme to be the full bundle identifier * Setup a share extension that show a SwiftUI view, uses rust tracing and redirects to the hosting aplication * Move media as json through the custom scheme into the main app and deep link into the media upload preview screen * Fix message forwarding and global search screen room summary provider filtering. * Tweak the message forwarding and global search screen designs. * Add a room selection screen to use after receiving a share request from the share extension * Fix share extension entitlements * Share the temporary directory between the main app and the extensions; rename the caches one. * Remove the no longer needed notification avatar flipping fix. * Extract the placeholder avatar image generator from the NSE * Nest `AvatarSize` within the new `Avatars` enum * Donate an `INSendMessageIntent` to the system every time we send a message so they appear as share suggestions * Support suggestions in the share extension itself * Improve sharing animations and fix presentation when room already on the stack * Clear all routes when sharing without a preselected room. * Fix broken unit tests * Various initial tweaks following code review. * Correctly clean up and dismiss the share extension for all paths. * Move the share extension path to a constants enum * Rename UserSessionFlowCoordinator specific share extension states and events * Add UserSession and Room flow coordinator share route tests * Tweak the share extension logic.
This commit is contained in:
@@ -235,6 +235,12 @@ class AppCoordinator: AppCoordinatorProtocol, AuthenticationFlowCoordinatorDeleg
|
||||
} else {
|
||||
handleAppRoute(.childEventOnRoomAlias(eventID: eventID, alias: alias))
|
||||
}
|
||||
case .share:
|
||||
guard isExternalURL else {
|
||||
MXLog.error("Received unexpected internal share route")
|
||||
break
|
||||
}
|
||||
handleAppRoute(route)
|
||||
default:
|
||||
break
|
||||
}
|
||||
|
||||
@@ -8,7 +8,7 @@
|
||||
import Foundation
|
||||
import MatrixRustSDK
|
||||
|
||||
enum AppRoute: Equatable {
|
||||
enum AppRoute: Equatable, Hashable {
|
||||
/// The app's home screen.
|
||||
case roomList
|
||||
/// A room, shown as the root of the stack (popping any child rooms).
|
||||
@@ -41,6 +41,8 @@ enum AppRoute: Equatable {
|
||||
case settings
|
||||
/// The setting screen for key backup.
|
||||
case chatBackupSettings
|
||||
/// An external share request e.g. from the ShareExtension
|
||||
case share(ShareExtensionPayload)
|
||||
}
|
||||
|
||||
struct AppRouteURLParser {
|
||||
@@ -48,6 +50,7 @@ struct AppRouteURLParser {
|
||||
|
||||
init(appSettings: AppSettings) {
|
||||
urlParsers = [
|
||||
AppGroupURLParser(),
|
||||
MatrixPermalinkParser(),
|
||||
ElementWebURLParser(domains: appSettings.elementWebHosts),
|
||||
ElementCallURLParser()
|
||||
@@ -73,6 +76,30 @@ protocol URLParser {
|
||||
func route(from url: URL) -> AppRoute?
|
||||
}
|
||||
|
||||
struct AppGroupURLParser: URLParser {
|
||||
func route(from url: URL) -> AppRoute? {
|
||||
guard let scheme = url.scheme,
|
||||
scheme == InfoPlistReader.app.appScheme,
|
||||
url.pathComponents.last == ShareExtensionConstants.urlPath else {
|
||||
return nil
|
||||
}
|
||||
|
||||
guard let query = url.query(percentEncoded: false),
|
||||
let queryData = query.data(using: .utf8) else {
|
||||
MXLog.error("Failed processing share parameters")
|
||||
return nil
|
||||
}
|
||||
|
||||
do {
|
||||
let payload = try JSONDecoder().decode(ShareExtensionPayload.self, from: queryData)
|
||||
return .share(payload)
|
||||
} catch {
|
||||
MXLog.error("Failed decoding share payload with error: \(error)")
|
||||
return nil
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
/// The parser for Element Call links. This always returns a `.genericCallLink`.
|
||||
struct ElementCallURLParser: URLParser {
|
||||
private let knownHosts = ["call.element.io"]
|
||||
|
||||
Reference in New Issue
Block a user