You cannot select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
95 lines
3.8 KiB
Swift
95 lines
3.8 KiB
Swift
import Foundation
|
|
import FLAnimatedImage
|
|
|
|
|
|
var flutterMethodChannelPenguinIn:FlutterMethodChannel? = nil
|
|
fileprivate var mainViewController:MainFlutterVC!
|
|
|
|
class HMGPenguinInPlatformBridge{
|
|
|
|
private let channelName = "launch_penguin_ui"
|
|
private static var shared_:HMGPenguinInPlatformBridge?
|
|
|
|
class func initialize(flutterViewController:MainFlutterVC){
|
|
shared_ = HMGPenguinInPlatformBridge()
|
|
mainViewController = flutterViewController
|
|
shared_?.openChannel()
|
|
}
|
|
|
|
func shared() -> HMGPenguinInPlatformBridge{
|
|
assert((HMGPenguinInPlatformBridge.shared_ != nil), "HMGPenguinInPlatformBridge is not initialized, call initialize(mainViewController:MainFlutterVC) function first.")
|
|
return HMGPenguinInPlatformBridge.shared_!
|
|
}
|
|
|
|
private func openChannel(){
|
|
flutterMethodChannelPenguinIn = FlutterMethodChannel(name: channelName, binaryMessenger: mainViewController.binaryMessenger)
|
|
|
|
flutterMethodChannelPenguinIn?.setMethodCallHandler { (methodCall, result) in
|
|
print("Called function \(methodCall.method)")
|
|
|
|
if let arguments = methodCall.arguments as Any? {
|
|
if methodCall.method == "launchPenguin"{
|
|
print("====== launchPenguinView Launched =========")
|
|
self.launchPenguinView(arguments: arguments, result: result)
|
|
}
|
|
} else {
|
|
result(FlutterError(code: "INVALID_ARGUMENT", message: "Storyboard name is required", details: nil))
|
|
}
|
|
}
|
|
}
|
|
|
|
private func launchPenguinView(arguments: Any, result: @escaping FlutterResult) {
|
|
|
|
let penguinView = PenguinView(
|
|
frame: CGRect(x: 0, y: 0, width: UIScreen.main.bounds.width, height: UIScreen.main.bounds.height),
|
|
viewIdentifier: 0,
|
|
arguments: arguments,
|
|
binaryMessenger: mainViewController.binaryMessenger
|
|
)
|
|
|
|
let penguinUIView = penguinView.view()
|
|
penguinUIView.frame = mainViewController.view.bounds
|
|
penguinUIView.autoresizingMask = [.flexibleWidth, .flexibleHeight]
|
|
|
|
mainViewController.view.addSubview(penguinUIView)
|
|
|
|
guard let args = arguments as? [String: Any],
|
|
let loaderImageData = args["loaderImage"] as? FlutterStandardTypedData else {
|
|
print("loaderImage data not found in arguments")
|
|
result(FlutterError(code: "ARGUMENT_ERROR", message: "Missing loaderImage data", details: nil))
|
|
return
|
|
}
|
|
|
|
let loadingOverlay = UIView(frame: UIScreen.main.bounds)
|
|
loadingOverlay.backgroundColor = UIColor.black.withAlphaComponent(0.5) // Semi-transparent overlay
|
|
loadingOverlay.autoresizingMask = [.flexibleWidth, .flexibleHeight]
|
|
|
|
// Display the GIF using FLAnimatedImage
|
|
let animatedImage = FLAnimatedImage(animatedGIFData: loaderImageData.data)
|
|
let gifImageView = FLAnimatedImageView()
|
|
gifImageView.animatedImage = animatedImage
|
|
gifImageView.frame = CGRect(x: 0, y: 0, width: UIScreen.main.bounds.width, height: UIScreen.main.bounds.height)
|
|
gifImageView.center = loadingOverlay.center
|
|
gifImageView.contentMode = .scaleAspectFit
|
|
loadingOverlay.addSubview(gifImageView)
|
|
|
|
|
|
if let window = UIApplication.shared.windows.first {
|
|
window.addSubview(loadingOverlay)
|
|
|
|
} else {
|
|
print("Error: Main window not found")
|
|
}
|
|
|
|
penguinView.onSuccess = {
|
|
// Hide and remove the loader
|
|
DispatchQueue.main.async {
|
|
loadingOverlay.removeFromSuperview()
|
|
|
|
}
|
|
}
|
|
|
|
result(nil)
|
|
}
|
|
}
|