David PHAM-VAN

Temporary fix for iOS 13

... ... @@ -3,6 +3,7 @@
## 2.1.7
- Add iOS Direct Print
- Fix iOS 13 bug
## 2.1.6
... ...
... ... @@ -24,12 +24,17 @@ class PdfPrintPageRenderer: UIPrintPageRenderer {
private var channel: FlutterMethodChannel?
private var pdfDocument: CGPDFDocument?
private var lock: NSLock?
private var mustLayout: Bool = true
init(_ channel: FlutterMethodChannel?) {
init(_ channel: FlutterMethodChannel?, data: Data?) {
super.init()
self.channel = channel
lock = NSLock()
pdfDocument = nil
if data != nil {
setDocument(data)
mustLayout = false
}
lock = NSLock()
}
override func drawPage(at pageIndex: Int, in _: CGRect) {
... ... @@ -72,10 +77,12 @@ class PdfPrintPageRenderer: UIPrintPageRenderer {
"marginBottom": marginBottom,
]
lock?.lock()
channel?.invokeMethod("onLayout", arguments: arg)
lock?.lock()
lock?.unlock()
if mustLayout {
lock?.lock()
channel?.invokeMethod("onLayout", arguments: arg)
lock?.lock()
lock?.unlock()
}
let pages = pdfDocument?.numberOfPages ?? 0
... ...
... ... @@ -39,7 +39,8 @@ public class SwiftPrintingPlugin: NSObject, FlutterPlugin, UIPrintInteractionCon
let args = call.arguments! as! [String: Any]
if call.method == "printPdf" {
let name = args["name"] as? String ?? ""
printPdf(name)
let object = args["doc"] as? FlutterStandardTypedData
printPdf(name, data: object?.data)
result(NSNumber(value: 1))
} else if call.method == "directPrintPdf" {
let name = args["name"] as? String ?? ""
... ... @@ -49,7 +50,7 @@ public class SwiftPrintingPlugin: NSObject, FlutterPlugin, UIPrintInteractionCon
result(NSNumber(value: 1))
} else if call.method == "writePdf" {
if let object = args["doc"] as? FlutterStandardTypedData {
writePdf(object)
writePdf(object.data)
}
result(NSNumber(value: 1))
} else if call.method == "cancelJob" {
... ... @@ -97,6 +98,11 @@ public class SwiftPrintingPlugin: NSObject, FlutterPlugin, UIPrintInteractionCon
width: CGFloat((args["w"] as? NSNumber)?.floatValue ?? 0.0),
height: CGFloat((args["h"] as? NSNumber)?.floatValue ?? 0.0)
))
} else if call.method == "printingInfo" {
let data: NSDictionary = [
"iosVersion": UIDevice.current.systemVersion,
]
result(data)
} else {
result(FlutterMethodNotImplemented)
}
... ... @@ -150,7 +156,7 @@ public class SwiftPrintingPlugin: NSObject, FlutterPlugin, UIPrintInteractionCon
controller.print(to: printer, completionHandler: completionHandler)
}
func printPdf(_ name: String) {
func printPdf(_ name: String, data: Data?) {
let printing = UIPrintInteractionController.isPrintingAvailable
if !printing {
let data: NSDictionary = [
... ... @@ -168,13 +174,13 @@ public class SwiftPrintingPlugin: NSObject, FlutterPlugin, UIPrintInteractionCon
printInfo.jobName = name
printInfo.outputType = .general
controller.printInfo = printInfo
renderer = PdfPrintPageRenderer(channel)
renderer = PdfPrintPageRenderer(channel, data: data)
controller.printPageRenderer = renderer
controller.present(animated: true, completionHandler: completionHandler)
}
func writePdf(_ data: FlutterStandardTypedData) {
renderer?.setDocument(data.data)
func writePdf(_ data: Data) {
renderer?.setDocument(data)
}
func sharePdf(_ data: FlutterStandardTypedData, withSourceRect rect: CGRect, andName name: String?) {
... ...
... ... @@ -96,15 +96,35 @@ mixin Printing {
static Future<bool> layoutPdf({
@required LayoutCallback onLayout,
String name = 'Document',
PdfPageFormat format = PdfPageFormat.standard,
}) async {
_onCompleted = Completer<bool>();
_onLayout = onLayout;
_channel.setMethodCallHandler(_handleMethod);
final Map<String, dynamic> params = <String, dynamic>{'name': name};
try {
final Map<dynamic, dynamic> info = await printingInfo();
if (int.parse(info['iosVersion'].toString().split('.').first) >= 13) {
final List<int> bytes = await onLayout(format);
if (bytes == null) {
return false;
}
params['doc'] = Uint8List.fromList(bytes);
}
} catch (e) {
e.toString();
}
await _channel.invokeMethod<int>('printPdf', params);
return _onCompleted.future;
}
static Future<Map<dynamic, dynamic>> printingInfo() async {
return await _channel.invokeMethod<Map<dynamic, dynamic>>(
'printingInfo',
<String, dynamic>{},
);
}
/// Opens the native printer picker interface, and returns the URL of the selected printer.
static Future<Printer> pickPrinter({Rect bounds}) async {
_channel.setMethodCallHandler(_handleMethod);
... ... @@ -117,7 +137,6 @@ mixin Printing {
};
final Map<dynamic, dynamic> printer = await _channel
.invokeMethod<Map<dynamic, dynamic>>('pickPrinter', params);
print(printer);
if (printer == null) {
return null;
}
... ... @@ -138,10 +157,11 @@ mixin Printing {
@required Printer printer,
@required LayoutCallback onLayout,
String name = 'Document',
PdfPageFormat format = PdfPageFormat.standard,
}) async {
_onCompleted = Completer<bool>();
_channel.setMethodCallHandler(_handleMethod);
final List<int> bytes = await onLayout(PdfPageFormat.standard);
final List<int> bytes = await onLayout(format);
if (bytes == null) {
return false;
}
... ...