diff --git a/app/ios/ActerPushServiceExtension/acter.swift b/app/ios/ActerPushServiceExtension/acter.swift index 3041954476fa..f1c893ce9868 100644 --- a/app/ios/ActerPushServiceExtension/acter.swift +++ b/app/ios/ActerPushServiceExtension/acter.swift @@ -1,5 +1,7 @@ // This file was autogenerated by some hot garbage in the `uniffi` crate. // Trust me, you don't want to mess with it! + +// swiftlint:disable all import Foundation // Depending on the consumer's build setup, the low-level FFI code @@ -18,6 +20,10 @@ fileprivate extension RustBuffer { self.init(capacity: rbuf.capacity, len: rbuf.len, data: rbuf.data) } + static func empty() -> RustBuffer { + RustBuffer(capacity: 0, len:0, data: nil) + } + static func from(_ ptr: UnsafeBufferPointer) -> RustBuffer { try! rustCall { ffi_acter_rustbuffer_from_bytes(ForeignBytes(bufferPointer: ptr), $0) } } @@ -44,9 +50,11 @@ fileprivate extension ForeignBytes { fileprivate extension Data { init(rustBuffer: RustBuffer) { - // TODO: This copies the buffer. Can we read directly from a - // Rust buffer? - self.init(bytes: rustBuffer.data!, count: Int(rustBuffer.len)) + self.init( + bytesNoCopy: rustBuffer.data!, + count: Int(rustBuffer.len), + deallocator: .none + ) } } @@ -147,7 +155,7 @@ fileprivate func writeDouble(_ writer: inout [UInt8], _ value: Double) { } // Protocol for types that transfer other types across the FFI. This is -// analogous go the Rust trait of the same name. +// analogous to the Rust trait of the same name. fileprivate protocol FfiConverter { associatedtype FfiType associatedtype SwiftType @@ -162,10 +170,16 @@ fileprivate protocol FfiConverter { fileprivate protocol FfiConverterPrimitive: FfiConverter where FfiType == SwiftType { } extension FfiConverterPrimitive { +#if swift(>=5.8) + @_documentation(visibility: private) +#endif public static func lift(_ value: FfiType) throws -> SwiftType { return value } +#if swift(>=5.8) + @_documentation(visibility: private) +#endif public static func lower(_ value: SwiftType) -> FfiType { return value } @@ -176,6 +190,9 @@ extension FfiConverterPrimitive { fileprivate protocol FfiConverterRustBuffer: FfiConverter where FfiType == RustBuffer {} extension FfiConverterRustBuffer { +#if swift(>=5.8) + @_documentation(visibility: private) +#endif public static func lift(_ buf: RustBuffer) throws -> SwiftType { var reader = createReader(data: Data(rustBuffer: buf)) let value = try read(from: &reader) @@ -186,6 +203,9 @@ extension FfiConverterRustBuffer { return value } +#if swift(>=5.8) + @_documentation(visibility: private) +#endif public static func lower(_ value: SwiftType) -> RustBuffer { var writer = createWriter() write(value, into: &writer) @@ -220,9 +240,17 @@ fileprivate enum UniffiInternalError: LocalizedError { } } +fileprivate extension NSLock { + func withLock(f: () throws -> T) rethrows -> T { + self.lock() + defer { self.unlock() } + return try f() + } +} + fileprivate let CALL_SUCCESS: Int8 = 0 fileprivate let CALL_ERROR: Int8 = 1 -fileprivate let CALL_PANIC: Int8 = 2 +fileprivate let CALL_UNEXPECTED_ERROR: Int8 = 2 fileprivate let CALL_CANCELLED: Int8 = 3 fileprivate extension RustCallStatus { @@ -239,18 +267,19 @@ fileprivate extension RustCallStatus { } private func rustCall(_ callback: (UnsafeMutablePointer) -> T) throws -> T { - try makeRustCall(callback, errorHandler: nil) + let neverThrow: ((RustBuffer) throws -> Never)? = nil + return try makeRustCall(callback, errorHandler: neverThrow) } -private func rustCallWithError( - _ errorHandler: @escaping (RustBuffer) throws -> Error, +private func rustCallWithError( + _ errorHandler: @escaping (RustBuffer) throws -> E, _ callback: (UnsafeMutablePointer) -> T) throws -> T { try makeRustCall(callback, errorHandler: errorHandler) } -private func makeRustCall( +private func makeRustCall( _ callback: (UnsafeMutablePointer) -> T, - errorHandler: ((RustBuffer) throws -> Error)? + errorHandler: ((RustBuffer) throws -> E)? ) throws -> T { uniffiEnsureInitialized() var callStatus = RustCallStatus.init() @@ -259,9 +288,9 @@ private func makeRustCall( return returnedVal } -private func uniffiCheckCallStatus( +private func uniffiCheckCallStatus( callStatus: RustCallStatus, - errorHandler: ((RustBuffer) throws -> Error)? + errorHandler: ((RustBuffer) throws -> E)? ) throws { switch callStatus.code { case CALL_SUCCESS: @@ -275,7 +304,7 @@ private func uniffiCheckCallStatus( throw UniffiInternalError.unexpectedRustCallError } - case CALL_PANIC: + case CALL_UNEXPECTED_ERROR: // When the rust code sees a panic, it tries to construct a RustBuffer // with the message. But if that code panics, then it just sends back // an empty buffer. @@ -294,9 +323,82 @@ private func uniffiCheckCallStatus( } } +private func uniffiTraitInterfaceCall( + callStatus: UnsafeMutablePointer, + makeCall: () throws -> T, + writeReturn: (T) -> () +) { + do { + try writeReturn(makeCall()) + } catch let error { + callStatus.pointee.code = CALL_UNEXPECTED_ERROR + callStatus.pointee.errorBuf = FfiConverterString.lower(String(describing: error)) + } +} + +private func uniffiTraitInterfaceCallWithError( + callStatus: UnsafeMutablePointer, + makeCall: () throws -> T, + writeReturn: (T) -> (), + lowerError: (E) -> RustBuffer +) { + do { + try writeReturn(makeCall()) + } catch let error as E { + callStatus.pointee.code = CALL_ERROR + callStatus.pointee.errorBuf = lowerError(error) + } catch { + callStatus.pointee.code = CALL_UNEXPECTED_ERROR + callStatus.pointee.errorBuf = FfiConverterString.lower(String(describing: error)) + } +} +fileprivate class UniffiHandleMap { + private var map: [UInt64: T] = [:] + private let lock = NSLock() + private var currentHandle: UInt64 = 1 + + func insert(obj: T) -> UInt64 { + lock.withLock { + let handle = currentHandle + currentHandle += 1 + map[handle] = obj + return handle + } + } + + func get(handle: UInt64) throws -> T { + try lock.withLock { + guard let obj = map[handle] else { + throw UniffiInternalError.unexpectedStaleHandle + } + return obj + } + } + + @discardableResult + func remove(handle: UInt64) throws -> T { + try lock.withLock { + guard let obj = map.removeValue(forKey: handle) else { + throw UniffiInternalError.unexpectedStaleHandle + } + return obj + } + } + + var count: Int { + get { + map.count + } + } +} + + // Public interface members begin here. +#if swift(>=5.8) +@_documentation(visibility: private) +#endif fileprivate struct FfiConverterBool : FfiConverter { typealias FfiType = Int8 typealias SwiftType = Bool @@ -318,6 +420,9 @@ fileprivate struct FfiConverterBool : FfiConverter { } } +#if swift(>=5.8) +@_documentation(visibility: private) +#endif fileprivate struct FfiConverterString: FfiConverter { typealias SwiftType = String typealias FfiType = RustBuffer @@ -357,7 +462,136 @@ fileprivate struct FfiConverterString: FfiConverter { } -public struct NotificationItem { + + +public protocol UniffiClientProtocol : AnyObject { + + func cloned() -> UniffiClient + + func userId() throws -> String + +} + +open class UniffiClient: + UniffiClientProtocol { + fileprivate let pointer: UnsafeMutableRawPointer! + + /// Used to instantiate a [FFIObject] without an actual pointer, for fakes in tests, mostly. +#if swift(>=5.8) + @_documentation(visibility: private) +#endif + public struct NoPointer { + public init() {} + } + + // TODO: We'd like this to be `private` but for Swifty reasons, + // we can't implement `FfiConverter` without making this `required` and we can't + // make it `required` without making it `public`. + required public init(unsafeFromRawPointer pointer: UnsafeMutableRawPointer) { + self.pointer = pointer + } + + // This constructor can be used to instantiate a fake object. + // - Parameter noPointer: Placeholder value so we can have a constructor separate from the default empty one that may be implemented for classes extending [FFIObject]. + // + // - Warning: + // Any object instantiated with this constructor cannot be passed to an actual Rust-backed object. Since there isn't a backing [Pointer] the FFI lower functions will crash. +#if swift(>=5.8) + @_documentation(visibility: private) +#endif + public init(noPointer: NoPointer) { + self.pointer = nil + } + +#if swift(>=5.8) + @_documentation(visibility: private) +#endif + public func uniffiClonePointer() -> UnsafeMutableRawPointer { + return try! rustCall { uniffi_acter_fn_clone_unifficlient(self.pointer, $0) } + } + // No primary constructor declared for this class. + + deinit { + guard let pointer = pointer else { + return + } + + try! rustCall { uniffi_acter_fn_free_unifficlient(pointer, $0) } + } + + + + +open func cloned() -> UniffiClient { + return try! FfiConverterTypeUniffiClient.lift(try! rustCall() { + uniffi_acter_fn_method_unifficlient_cloned(self.uniffiClonePointer(),$0 + ) +}) +} + +open func userId()throws -> String { + return try FfiConverterString.lift(try rustCallWithError(FfiConverterTypeActerError.lift) { + uniffi_acter_fn_method_unifficlient_user_id(self.uniffiClonePointer(),$0 + ) +}) +} + + +} + +#if swift(>=5.8) +@_documentation(visibility: private) +#endif +public struct FfiConverterTypeUniffiClient: FfiConverter { + + typealias FfiType = UnsafeMutableRawPointer + typealias SwiftType = UniffiClient + + public static func lift(_ pointer: UnsafeMutableRawPointer) throws -> UniffiClient { + return UniffiClient(unsafeFromRawPointer: pointer) + } + + public static func lower(_ value: UniffiClient) -> UnsafeMutableRawPointer { + return value.uniffiClonePointer() + } + + public static func read(from buf: inout (data: Data, offset: Data.Index)) throws -> UniffiClient { + let v: UInt64 = try readInt(&buf) + // The Rust code won't compile if a pointer won't fit in a UInt64. + // We have to go via `UInt` because that's the thing that's the size of a pointer. + let ptr = UnsafeMutableRawPointer(bitPattern: UInt(truncatingIfNeeded: v)) + if (ptr == nil) { + throw UniffiInternalError.unexpectedNullPointer + } + return try lift(ptr!) + } + + public static func write(_ value: UniffiClient, into buf: inout [UInt8]) { + // This fiddling is because `Int` is the thing that's the same size as a pointer. + // The Rust code won't compile if a pointer won't fit in a `UInt64`. + writeInt(&buf, UInt64(bitPattern: Int64(Int(bitPattern: lower(value))))) + } +} + + + + +#if swift(>=5.8) +@_documentation(visibility: private) +#endif +public func FfiConverterTypeUniffiClient_lift(_ pointer: UnsafeMutableRawPointer) throws -> UniffiClient { + return try FfiConverterTypeUniffiClient.lift(pointer) +} + +#if swift(>=5.8) +@_documentation(visibility: private) +#endif +public func FfiConverterTypeUniffiClient_lower(_ value: UniffiClient) -> UnsafeMutableRawPointer { + return FfiConverterTypeUniffiClient.lower(value) +} + + +public struct UniffiNotificationItem { public var title: String public var pushStyle: String public var targetUrl: String @@ -374,20 +608,13 @@ public struct NotificationItem { // Default memberwise initializers are never public by default, so we // declare one manually. - public init( - title: String, - pushStyle: String, - targetUrl: String, - body: String?, - threadId: String?, - imagePath: String?, + public init(title: String, pushStyle: String, targetUrl: String, body: String?, threadId: String?, imagePath: String?, /** * Is it a noisy notification? (i.e. does any push action contain a sound * action) * * It is set if and only if the push actions could be determined. - */ - isNoisy: Bool?) { + */isNoisy: Bool?) { self.title = title self.pushStyle = pushStyle self.targetUrl = targetUrl @@ -399,8 +626,9 @@ public struct NotificationItem { } -extension NotificationItem: Equatable, Hashable { - public static func ==(lhs: NotificationItem, rhs: NotificationItem) -> Bool { + +extension UniffiNotificationItem: Equatable, Hashable { + public static func ==(lhs: UniffiNotificationItem, rhs: UniffiNotificationItem) -> Bool { if lhs.title != rhs.title { return false } @@ -437,10 +665,13 @@ extension NotificationItem: Equatable, Hashable { } -public struct FfiConverterTypeNotificationItem: FfiConverterRustBuffer { - public static func read(from buf: inout (data: Data, offset: Data.Index)) throws -> NotificationItem { +#if swift(>=5.8) +@_documentation(visibility: private) +#endif +public struct FfiConverterTypeUniffiNotificationItem: FfiConverterRustBuffer { + public static func read(from buf: inout (data: Data, offset: Data.Index)) throws -> UniffiNotificationItem { return - try NotificationItem( + try UniffiNotificationItem( title: FfiConverterString.read(from: &buf), pushStyle: FfiConverterString.read(from: &buf), targetUrl: FfiConverterString.read(from: &buf), @@ -451,7 +682,7 @@ public struct FfiConverterTypeNotificationItem: FfiConverterRustBuffer { ) } - public static func write(_ value: NotificationItem, into buf: inout [UInt8]) { + public static func write(_ value: UniffiNotificationItem, into buf: inout [UInt8]) { FfiConverterString.write(value.title, into: &buf) FfiConverterString.write(value.pushStyle, into: &buf) FfiConverterString.write(value.targetUrl, into: &buf) @@ -463,12 +694,18 @@ public struct FfiConverterTypeNotificationItem: FfiConverterRustBuffer { } -public func FfiConverterTypeNotificationItem_lift(_ buf: RustBuffer) throws -> NotificationItem { - return try FfiConverterTypeNotificationItem.lift(buf) +#if swift(>=5.8) +@_documentation(visibility: private) +#endif +public func FfiConverterTypeUniffiNotificationItem_lift(_ buf: RustBuffer) throws -> UniffiNotificationItem { + return try FfiConverterTypeUniffiNotificationItem.lift(buf) } -public func FfiConverterTypeNotificationItem_lower(_ value: NotificationItem) -> RustBuffer { - return FfiConverterTypeNotificationItem.lower(value) +#if swift(>=5.8) +@_documentation(visibility: private) +#endif +public func FfiConverterTypeUniffiNotificationItem_lower(_ value: UniffiNotificationItem) -> RustBuffer { + return FfiConverterTypeUniffiNotificationItem.lower(value) } @@ -482,13 +719,12 @@ public enum ActerError { case Anyhow(message: String) - - fileprivate static func uniffiErrorHandler(_ error: RustBuffer) throws -> Error { - return try FfiConverterTypeActerError.lift(error) - } } +#if swift(>=5.8) +@_documentation(visibility: private) +#endif public struct FfiConverterTypeActerError: FfiConverterRustBuffer { typealias SwiftType = ActerError @@ -537,8 +773,15 @@ public struct FfiConverterTypeActerError: FfiConverterRustBuffer { extension ActerError: Equatable, Hashable {} -extension ActerError: Error { } +extension ActerError: Foundation.LocalizedError { + public var errorDescription: String? { + String(reflecting: self) + } +} +#if swift(>=5.8) +@_documentation(visibility: private) +#endif fileprivate struct FfiConverterOptionBool: FfiConverterRustBuffer { typealias SwiftType = Bool? @@ -560,6 +803,9 @@ fileprivate struct FfiConverterOptionBool: FfiConverterRustBuffer { } } +#if swift(>=5.8) +@_documentation(visibility: private) +#endif fileprivate struct FfiConverterOptionString: FfiConverterRustBuffer { typealias SwiftType = String? @@ -583,13 +829,15 @@ fileprivate struct FfiConverterOptionString: FfiConverterRustBuffer { private let UNIFFI_RUST_FUTURE_POLL_READY: Int8 = 0 private let UNIFFI_RUST_FUTURE_POLL_MAYBE_READY: Int8 = 1 +fileprivate let uniffiContinuationHandleMap = UniffiHandleMap>() + fileprivate func uniffiRustCallAsync( - rustFutureFunc: () -> UnsafeMutableRawPointer, - pollFunc: (UnsafeMutableRawPointer, @escaping UniFfiRustFutureContinuation, UnsafeMutableRawPointer) -> (), - completeFunc: (UnsafeMutableRawPointer, UnsafeMutablePointer) -> F, - freeFunc: (UnsafeMutableRawPointer) -> (), + rustFutureFunc: () -> UInt64, + pollFunc: (UInt64, @escaping UniffiRustFutureContinuationCallback, UInt64) -> (), + completeFunc: (UInt64, UnsafeMutablePointer) -> F, + freeFunc: (UInt64) -> (), liftFunc: (F) throws -> T, - errorHandler: ((RustBuffer) throws -> Error)? + errorHandler: ((RustBuffer) throws -> Swift.Error)? ) async throws -> T { // Make sure to call uniffiEnsureInitialized() since future creation doesn't have a // RustCallStatus param, so doesn't use makeRustCall() @@ -601,7 +849,11 @@ fileprivate func uniffiRustCallAsync( var pollResult: Int8; repeat { pollResult = await withUnsafeContinuation { - pollFunc(rustFuture, uniffiFutureContinuationCallback, ContinuationHolder($0).toOpaque()) + pollFunc( + rustFuture, + uniffiFutureContinuationCallback, + uniffiContinuationHandleMap.insert(obj: $0) + ) } } while pollResult != UNIFFI_RUST_FUTURE_POLL_READY @@ -613,74 +865,55 @@ fileprivate func uniffiRustCallAsync( // Callback handlers for an async calls. These are invoked by Rust when the future is ready. They // lift the return value or error and resume the suspended function. -fileprivate func uniffiFutureContinuationCallback(ptr: UnsafeMutableRawPointer, pollResult: Int8) { - ContinuationHolder.fromOpaque(ptr).resume(pollResult) -} - -// Wraps UnsafeContinuation in a class so that we can use reference counting when passing it across -// the FFI -fileprivate class ContinuationHolder { - let continuation: UnsafeContinuation - - init(_ continuation: UnsafeContinuation) { - self.continuation = continuation - } - - func resume(_ pollResult: Int8) { - self.continuation.resume(returning: pollResult) - } - - func toOpaque() -> UnsafeMutableRawPointer { - return Unmanaged.passRetained(self).toOpaque() - } - - static func fromOpaque(_ ptr: UnsafeRawPointer) -> ContinuationHolder { - return Unmanaged.fromOpaque(ptr).takeRetainedValue() - } -} -public func getNotificationItem(_ basePath: String, _ mediaCachePath: String, _ tempDir: String, _ restoreToken: String, _ roomId: String, _ eventId: String) async throws -> NotificationItem { - return try await uniffiRustCallAsync( - rustFutureFunc: { - uniffi_acter_fn_func_get_notification_item( - FfiConverterString.lower(basePath), - FfiConverterString.lower(mediaCachePath), - FfiConverterString.lower(tempDir), - FfiConverterString.lower(restoreToken), - FfiConverterString.lower(roomId), - FfiConverterString.lower(eventId) - ) - }, - pollFunc: ffi_acter_rust_future_poll_rust_buffer, - completeFunc: ffi_acter_rust_future_complete_rust_buffer, - freeFunc: ffi_acter_rust_future_free_rust_buffer, - liftFunc: FfiConverterTypeNotificationItem.lift, - errorHandler: FfiConverterTypeActerError.lift - ) +fileprivate func uniffiFutureContinuationCallback(handle: UInt64, pollResult: Int8) { + if let continuation = try? uniffiContinuationHandleMap.remove(handle: handle) { + continuation.resume(returning: pollResult) + } else { + print("uniffiFutureContinuationCallback invalid handle") + } +} +public func getNotificationItem(_ basePath: String, _ mediaCachePath: String, _ tempDir: String, _ restoreToken: String, _ roomId: String, _ eventId: String)async throws -> UniffiNotificationItem { + return + try await uniffiRustCallAsync( + rustFutureFunc: { + uniffi_acter_fn_func_get_notification_item(FfiConverterString.lower(basePath),FfiConverterString.lower(mediaCachePath),FfiConverterString.lower(tempDir),FfiConverterString.lower(restoreToken),FfiConverterString.lower(roomId),FfiConverterString.lower(eventId) + ) + }, + pollFunc: ffi_acter_rust_future_poll_rust_buffer, + completeFunc: ffi_acter_rust_future_complete_rust_buffer, + freeFunc: ffi_acter_rust_future_free_rust_buffer, + liftFunc: FfiConverterTypeUniffiNotificationItem.lift, + errorHandler: FfiConverterTypeActerError.lift + ) } - - private enum InitializationResult { case ok case contractVersionMismatch case apiChecksumMismatch } -// Use a global variables to perform the versioning checks. Swift ensures that +// Use a global variable to perform the versioning checks. Swift ensures that // the code inside is only computed once. -private var initializationResult: InitializationResult { +private var initializationResult: InitializationResult = { // Get the bindings contract version from our ComponentInterface - let bindings_contract_version = 25 + let bindings_contract_version = 26 // Get the scaffolding contract version by calling the into the dylib let scaffolding_contract_version = ffi_acter_uniffi_contract_version() if bindings_contract_version != scaffolding_contract_version { return InitializationResult.contractVersionMismatch } - if (uniffi_acter_checksum_func_get_notification_item() != 5899) { + if (uniffi_acter_checksum_func_get_notification_item() != 20285) { + return InitializationResult.apiChecksumMismatch + } + if (uniffi_acter_checksum_method_unifficlient_cloned() != 14372) { + return InitializationResult.apiChecksumMismatch + } + if (uniffi_acter_checksum_method_unifficlient_user_id() != 57780) { return InitializationResult.apiChecksumMismatch } return InitializationResult.ok -} +}() private func uniffiEnsureInitialized() { switch initializationResult { @@ -691,4 +924,6 @@ private func uniffiEnsureInitialized() { case .apiChecksumMismatch: fatalError("UniFFI API checksum mismatch: try cleaning and rebuilding your project") } -} \ No newline at end of file +} + +// swiftlint:enable all \ No newline at end of file diff --git a/app/ios/Podfile.lock b/app/ios/Podfile.lock index d43813c28d70..e1bd4fc4e83d 100644 --- a/app/ios/Podfile.lock +++ b/app/ios/Podfile.lock @@ -108,9 +108,9 @@ PODS: - Flutter - push_ios (0.0.1): - Flutter - - SDWebImage (5.21.0): - - SDWebImage/Core (= 5.21.0) - - SDWebImage/Core (5.21.0) + - SDWebImage (5.21.1): + - SDWebImage/Core (= 5.21.1) + - SDWebImage/Core (5.21.1) - sensors_plus (0.0.1): - Flutter - Sentry/HybridSDK (8.46.0) @@ -268,53 +268,53 @@ EXTERNAL SOURCES: :path: ".symlinks/plugins/wakelock_plus/ios" SPEC CHECKSUMS: - acter_flutter_sdk: b60dabd77979100055ae2e3a1f8eda19ec1dffd7 - app_badge_plus: 0e3470f993dd08094e16463f57a7e0db04c6b587 - app_links: 76b66b60cc809390ca1ad69bfd66b998d2387ac7 - app_settings: 5127ae0678de1dcc19f2293271c51d37c89428b2 - appcheck: 3c94d0ffc94bd639938cac7427d5b13df2795404 - audioplayers_darwin: 4f9ca89d92d3d21cec7ec580e78ca888e5fb68bd - camera_avfoundation: be3be85408cd4126f250386828e9b1dfa40ab436 - connectivity_plus: cb623214f4e1f6ef8fe7403d580fdad517d2f7dd - device_calendar: b55b2c5406cfba45c95a59f9059156daee1f74ed - device_info_plus: 21fcca2080fbcd348be798aa36c3e5ed849eefbe + acter_flutter_sdk: e60481171e46975418babb7d0ec8809eaacaaa03 + app_badge_plus: 73079d53b6a318c723de4d8aded465fbc4e92897 + app_links: f3e17e4ee5e357b39d8b95290a9b2c299fca71c6 + app_settings: 58017cd26b604ae98c3e65acbdd8ba173703cc82 + appcheck: 3a298b7b76bd61517fe8f2fa6b7a8ba328afb736 + audioplayers_darwin: 4027b33a8f471d996c13f71cb77f0b1583b5d923 + camera_avfoundation: adb0207d868b2d873e895371d88448399ab78d87 + connectivity_plus: 2a701ffec2c0ae28a48cf7540e279787e77c447d + device_calendar: 9cb33f88a02e19652ec7b8b122ca778f751b1f7b + device_info_plus: bf2e3232933866d73fe290f2942f2156cdd10342 DKImagePickerController: 946cec48c7873164274ecc4624d19e3da4c1ef3c DKPhotoGallery: b3834fecb755ee09a593d7c9e389d8b5d6deed60 - emoji_picker_flutter: ece213fc274bdddefb77d502d33080dc54e616cc - fc_native_video_thumbnail: ea75aa9d0f7e7b58215d2ad99ac9dddafc038bc9 - file_picker: a0560bc09d61de87f12d246fc47d2119e6ef37be + emoji_picker_flutter: 8e50ec5caac456a23a78637e02c6293ea0ac8771 + fc_native_video_thumbnail: ded291371a8a82c449f28bf1ff84f576de8b65c5 + file_picker: b159e0c068aef54932bb15dc9fd1571818edaf49 Firebase: 3435bc66b4d494c2f22c79fd3aae4c1db6662327 - firebase_core: 700bac7ed92bb754fd70fbf01d72b36ecdd6d450 + firebase_core: a861be150c0e7c6aecedde077968eb92cbf790b9 FirebaseCore: c692c7f1c75305ab6aff2b367f25e11d73aa8bd0 FirebaseCoreInternal: 29d7b3af4aaf0b8f3ed20b568c13df399b06f68c Flutter: e0871f40cf51350855a761d2e70bf5af5b9b5de7 - flutter_keyboard_visibility: 4625131e43015dbbe759d9b20daaf77e0e3f6619 - flutter_local_notifications: ad39620c743ea4c15127860f4b5641649a988100 - flutter_secure_storage: 1ed9476fba7e7a782b22888f956cce43e2c62f13 + flutter_keyboard_visibility: 0339d06371254c3eb25eeb90ba8d17dca8f9c069 + flutter_local_notifications: 4cde75091f6327eb8517fa068a0a5950212d2086 + flutter_secure_storage: d33dac7ae2ea08509be337e775f6b59f1ff45f12 GoogleUtilities: 00c88b9a86066ef77f0da2fab05f65d7768ed8e1 - image_picker_ios: 7fe1ff8e34c1790d6fff70a32484959f563a928a - integration_test: 4a889634ef21a45d28d50d622cf412dc6d9f586e - keyboard_height_plugin: ef70a8181b29f27670e9e2450814ca6b6dc05b05 - media_kit_libs_ios_video: 5a18affdb97d1f5d466dc79988b13eff6c5e2854 - media_kit_video: 1746e198cb697d1ffb734b1d05ec429d1fcd1474 - open_filex: 432f3cd11432da3e39f47fcc0df2b1603854eff1 - package_info_plus: af8e2ca6888548050f16fa2f1938db7b5a5df499 - path_provider_foundation: 080d55be775b7414fd5a5ef3ac137b97b097e564 - permission_handler_apple: 4ed2196e43d0651e8ff7ca3483a069d469701f2d - pointer_interceptor_ios: ec847ef8b0915778bed2b2cef636f4d177fa8eed - push_ios: d8edf21b48ecb1ee9e384dd0cd9c1b049fd1ca11 - SDWebImage: f84b0feeb08d2d11e6a9b843cb06d75ebf5b8868 - sensors_plus: 6a11ed0c2e1d0bd0b20b4029d3bad27d96e0c65b + image_picker_ios: c560581cceedb403a6ff17f2f816d7fea1421fc1 + integration_test: 252f60fa39af5e17c3aa9899d35d908a0721b573 + keyboard_height_plugin: 43fa8bba20fd5c4fdeed5076466b8b9d43cc6b86 + media_kit_libs_ios_video: a5fe24bc7875ccd6378a0978c13185e1344651c1 + media_kit_video: 5da63f157170e5bf303bf85453b7ef6971218a2e + open_filex: 6e26e659846ec990262224a12ef1c528bb4edbe4 + package_info_plus: c0502532a26c7662a62a356cebe2692ec5fe4ec4 + path_provider_foundation: 2b6b4c569c0fb62ec74538f866245ac84301af46 + permission_handler_apple: 9878588469a2b0d0fc1e048d9f43605f92e6cec2 + pointer_interceptor_ios: 508241697ff0947f853c061945a8b822463947c1 + push_ios: 2bd1b4d3f782209da1f571db1250af236957e807 + SDWebImage: f29024626962457f3470184232766516dee8dfea + sensors_plus: 7229095999f30740798f0eeef5cd120357a8f4f2 Sentry: da60d980b197a46db0b35ea12cb8f39af48d8854 - sentry_flutter: 27892878729f42701297c628eb90e7c6529f3684 - share_plus: 50da8cb520a8f0f65671c6c6a99b3617ed10a58a - shared_preferences_foundation: 9e1978ff2562383bd5676f64ec4e9aa8fa06a6f7 - sqflite_darwin: 20b2a3a3b70e43edae938624ce550a3cbf66a3d0 + sentry_flutter: 2df8b0aab7e4aba81261c230cbea31c82a62dd1b + share_plus: 8b6f8b3447e494cca5317c8c3073de39b3600d1f + shared_preferences_foundation: fcdcbc04712aee1108ac7fda236f363274528f78 + sqflite_darwin: 5a7236e3b501866c1c9befc6771dfd73ffb8702d SwiftyGif: 706c60cf65fa2bc5ee0313beece843c8eb8194d4 - url_launcher_ios: 694010445543906933d732453a59da0a173ae33d - video_player_avfoundation: 2cef49524dd1f16c5300b9cd6efd9611ce03639b - volume_controller: 3657a1f65bedb98fa41ff7dc5793537919f31b12 - wakelock_plus: e29112ab3ef0b318e58cfa5c32326458be66b556 + url_launcher_ios: 5334b05cef931de560670eeae103fd3e431ac3fe + video_player_avfoundation: 7c6c11d8470e1675df7397027218274b6d2360b3 + volume_controller: 2e3de73d6e7e81a0067310d17fb70f2f86d71ac7 + wakelock_plus: 76957ab028e12bfa4e66813c99e46637f367fc7e PODFILE CHECKSUM: fcb1d6a8b69ef1614eadff3ce844375007098b37 diff --git a/app/ios/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme b/app/ios/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme index c53e2b314e9b..9c12df59c622 100644 --- a/app/ios/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme +++ b/app/ios/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme @@ -26,6 +26,7 @@ buildConfiguration = "Debug" selectedDebuggerIdentifier = "Xcode.DebuggerFoundation.Debugger.LLDB" selectedLauncherIdentifier = "Xcode.DebuggerFoundation.Launcher.LLDB" + customLLDBInitFile = "$(SRCROOT)/Flutter/ephemeral/flutter_lldbinit" shouldUseLaunchSchemeArgsEnv = "YES"> Bool { + return true + } } diff --git a/app/pubspec.lock b/app/pubspec.lock index ef88bfe69f8e..202e31d8abad 100644 --- a/app/pubspec.lock +++ b/app/pubspec.lock @@ -2568,10 +2568,10 @@ packages: dependency: transitive description: name: string_validator - sha256: a278d038104aa2df15d0e09c47cb39a49f907260732067d0034dc2f2e4e2ac94 + sha256: "240f4c98027dfbe8639c8271ef18cc9de735b47067aa15a720cfed9576a512b1" url: "https://pub.dev" source: hosted - version: "1.1.0" + version: "1.2.0" swipe_to: dependency: "direct main" description: