David PHAM-VAN

Cancel print job in case of layout error

@@ -3,6 +3,7 @@ @@ -3,6 +3,7 @@
3 ## 2.1.6 3 ## 2.1.6
4 4
5 - Add qrcode to example 5 - Add qrcode to example
  6 +- Cancel print job in case of layout error
6 7
7 ## 2.1.5 8 ## 2.1.5
8 9
@@ -149,7 +149,7 @@ public class PrintingPlugin extends PrintDocumentAdapter implements MethodCallHa @@ -149,7 +149,7 @@ public class PrintingPlugin extends PrintDocumentAdapter implements MethodCallHa
149 } 149 }
150 } catch (Exception e) { 150 } catch (Exception e) {
151 HashMap<String, Object> args = new HashMap<>(); 151 HashMap<String, Object> args = new HashMap<>();
152 - args.put("completed", printJob.isCompleted()); 152 + args.put("completed", printJob != null && printJob.isCompleted());
153 args.put("error", e.getMessage()); 153 args.put("error", e.getMessage());
154 channel.invokeMethod("onCompleted", args); 154 channel.invokeMethod("onCompleted", args);
155 } 155 }
@@ -182,6 +182,11 @@ public class PrintingPlugin extends PrintDocumentAdapter implements MethodCallHa @@ -182,6 +182,11 @@ public class PrintingPlugin extends PrintDocumentAdapter implements MethodCallHa
182 182
183 result.success(0); 183 result.success(0);
184 break; 184 break;
  185 + case "cancelJob":
  186 + if (callback != null) callback.onLayoutCancelled();
  187 + if (printJob != null) printJob.cancel();
  188 + result.success(0);
  189 + break;
185 case "sharePdf": 190 case "sharePdf":
186 sharePdf((byte[]) call.argument("doc"), (String) call.argument("name")); 191 sharePdf((byte[]) call.argument("doc"), (String) call.argument("name"));
187 result.success(0); 192 result.success(0);
@@ -40,6 +40,11 @@ class PdfPrintPageRenderer: UIPrintPageRenderer { @@ -40,6 +40,11 @@ class PdfPrintPageRenderer: UIPrintPageRenderer {
40 ctx?.drawPDFPage(page!) 40 ctx?.drawPDFPage(page!)
41 } 41 }
42 42
  43 + func cancelJob() {
  44 + pdfDocument = nil
  45 + lock?.unlock()
  46 + }
  47 +
43 func setDocument(_ data: Data?) { 48 func setDocument(_ data: Data?) {
44 let bytesPointer = UnsafeMutablePointer<UInt8>.allocate(capacity: data?.count ?? 0) 49 let bytesPointer = UnsafeMutablePointer<UInt8>.allocate(capacity: data?.count ?? 0)
45 data?.copyBytes(to: bytesPointer, count: data?.count ?? 0) 50 data?.copyBytes(to: bytesPointer, count: data?.count ?? 0)
@@ -45,6 +45,11 @@ public class SwiftPrintingPlugin: NSObject, FlutterPlugin, UIPrintInteractionCon @@ -45,6 +45,11 @@ public class SwiftPrintingPlugin: NSObject, FlutterPlugin, UIPrintInteractionCon
45 writePdf(object) 45 writePdf(object)
46 } 46 }
47 result(NSNumber(value: 1)) 47 result(NSNumber(value: 1))
  48 + } else if call.method == "cancelJob" {
  49 + renderer?.cancelJob()
  50 + let controller = UIPrintInteractionController.shared
  51 + controller.dismiss(animated: true)
  52 + result(NSNumber(value: 1))
48 } else if call.method == "sharePdf" { 53 } else if call.method == "sharePdf" {
49 if let object = args["doc"] as? FlutterStandardTypedData { 54 if let object = args["doc"] as? FlutterStandardTypedData {
50 sharePdf( 55 sharePdf(
@@ -28,6 +28,7 @@ mixin Printing { @@ -28,6 +28,7 @@ mixin Printing {
28 static Future<void> _handleMethod(MethodCall call) async { 28 static Future<void> _handleMethod(MethodCall call) async {
29 switch (call.method) { 29 switch (call.method) {
30 case 'onLayout': 30 case 'onLayout':
  31 + try {
31 final List<int> bytes = await _onLayout(PdfPageFormat( 32 final List<int> bytes = await _onLayout(PdfPageFormat(
32 call.arguments['width'], 33 call.arguments['width'],
33 call.arguments['height'], 34 call.arguments['height'],
@@ -36,10 +37,19 @@ mixin Printing { @@ -36,10 +37,19 @@ mixin Printing {
36 marginRight: call.arguments['marginRight'], 37 marginRight: call.arguments['marginRight'],
37 marginBottom: call.arguments['marginBottom'], 38 marginBottom: call.arguments['marginBottom'],
38 )); 39 ));
  40 + if (bytes == null) {
  41 + await _channel.invokeMethod<void>('cancelJob', <String, dynamic>{});
  42 + break;
  43 + }
39 final Map<String, dynamic> params = <String, dynamic>{ 44 final Map<String, dynamic> params = <String, dynamic>{
40 'doc': Uint8List.fromList(bytes), 45 'doc': Uint8List.fromList(bytes),
41 }; 46 };
42 - return await _channel.invokeMethod('writePdf', params); 47 + await _channel.invokeMethod<void>('writePdf', params);
  48 + } catch (e) {
  49 + print('Unable to print: $e');
  50 + await _channel.invokeMethod<void>('cancelJob', <String, dynamic>{});
  51 + }
  52 + break;
43 case 'onCompleted': 53 case 'onCompleted':
44 final bool completed = call.arguments['completed']; 54 final bool completed = call.arguments['completed'];
45 final String error = call.arguments['error']; 55 final String error = call.arguments['error'];