David PHAM-VAN

Fix Android compilation issues

1 # Changelog 1 # Changelog
2 2
  3 +## 3.6.3
  4 +
  5 +- Fix Android compilation issues
  6 +
3 ## 3.6.2 7 ## 3.6.2
4 8
5 - Added theme color to dropdown item in pageFormat selector in page preview 9 - Added theme color to dropdown item in pageFormat selector in page preview
@@ -35,16 +35,6 @@ for documentation. @@ -35,16 +35,6 @@ for documentation.
35 use_frameworks! # <-- Add this line 35 use_frameworks! # <-- Add this line
36 ``` 36 ```
37 37
38 -4. Set minimum Android version in `android/app/build.gradle`:  
39 -  
40 - ```java  
41 - defaultConfig {  
42 - ...  
43 - minSdkVersion 21 // <-- Change this line to 21 or more  
44 - ...  
45 - }  
46 - ```  
47 -  
48 ## Examples 38 ## Examples
49 39
50 ```dart 40 ```dart
@@ -17,16 +17,20 @@ @@ -17,16 +17,20 @@
17 package android.print; 17 package android.print;
18 18
19 import android.content.Context; 19 import android.content.Context;
  20 +import android.os.Build;
20 import android.os.CancellationSignal; 21 import android.os.CancellationSignal;
21 import android.os.ParcelFileDescriptor; 22 import android.os.ParcelFileDescriptor;
22 import android.util.Log; 23 import android.util.Log;
23 24
  25 +import androidx.annotation.RequiresApi;
  26 +
24 import java.io.File; 27 import java.io.File;
25 import java.io.FileInputStream; 28 import java.io.FileInputStream;
26 import java.io.FileNotFoundException; 29 import java.io.FileNotFoundException;
27 import java.io.IOException; 30 import java.io.IOException;
28 import java.io.InputStream; 31 import java.io.InputStream;
29 32
  33 +@RequiresApi(api = Build.VERSION_CODES.KITKAT)
30 public class PdfConvert { 34 public class PdfConvert {
31 public static void print(final Context context, final PrintDocumentAdapter adapter, 35 public static void print(final Context context, final PrintDocumentAdapter adapter,
32 final PrintAttributes attributes, final Result result) { 36 final PrintAttributes attributes, final Result result) {
1 package net.nfet.flutter.printing; 1 package net.nfet.flutter.printing;
2 2
3 import android.app.Activity; 3 import android.app.Activity;
  4 +import android.os.Build;
4 import android.print.PrintAttributes; 5 import android.print.PrintAttributes;
5 6
6 import androidx.annotation.NonNull; 7 import androidx.annotation.NonNull;
  8 +import androidx.annotation.RequiresApi;
7 9
8 import java.util.HashMap; 10 import java.util.HashMap;
9 11
@@ -21,91 +23,91 @@ public class PrintingHandler implements MethodChannel.MethodCallHandler { @@ -21,91 +23,91 @@ public class PrintingHandler implements MethodChannel.MethodCallHandler {
21 23
22 @Override 24 @Override
23 public void onMethodCall(@NonNull MethodCall call, @NonNull MethodChannel.Result result) { 25 public void onMethodCall(@NonNull MethodCall call, @NonNull MethodChannel.Result result) {
24 - switch (call.method) {  
25 - case "printPdf": {  
26 - final String name = call.argument("name");  
27 - final Double width = call.argument("width");  
28 - final Double height = call.argument("height");  
29 - final Double marginLeft = call.argument("marginLeft");  
30 - final Double marginTop = call.argument("marginTop");  
31 - final Double marginRight = call.argument("marginRight");  
32 - final Double marginBottom = call.argument("marginBottom");  
33 -  
34 - final PrintingJob printJob =  
35 - new PrintingJob(activity, this, (int) call.argument("job"));  
36 - assert name != null;  
37 - printJob.printPdf(name);  
38 -  
39 - result.success(1);  
40 - break;  
41 - }  
42 - case "cancelJob": {  
43 - final PrintingJob printJob =  
44 - new PrintingJob(activity, this, (int) call.argument("job"));  
45 - printJob.cancelJob(null);  
46 - result.success(1);  
47 - break;  
48 - }  
49 - case "sharePdf": {  
50 - final byte[] document = call.argument("doc");  
51 - final String name = call.argument("name");  
52 - PrintingJob.sharePdf(activity, document, name);  
53 - result.success(1);  
54 - break;  
55 - }  
56 - case "convertHtml": {  
57 - Double width = call.argument("width");  
58 - Double height = call.argument("height");  
59 - Double marginLeft = call.argument("marginLeft");  
60 - Double marginTop = call.argument("marginTop");  
61 - Double marginRight = call.argument("marginRight");  
62 - Double marginBottom = call.argument("marginBottom");  
63 - final PrintingJob printJob =  
64 - new PrintingJob(activity, this, (int) call.argument("job"));  
65 -  
66 - assert width != null;  
67 - assert height != null;  
68 - assert marginLeft != null;  
69 - assert marginTop != null;  
70 - assert marginRight != null;  
71 - assert marginBottom != null;  
72 -  
73 - PrintAttributes.Margins margins =  
74 - new PrintAttributes.Margins(Double.valueOf(marginLeft * 1000.0).intValue(),  
75 - Double.valueOf(marginTop * 1000.0 / 72.0).intValue(),  
76 - Double.valueOf(marginRight * 1000.0 / 72.0).intValue(),  
77 - Double.valueOf(marginBottom * 1000.0 / 72.0).intValue());  
78 -  
79 - PrintAttributes.MediaSize size = new PrintAttributes.MediaSize("flutter_printing",  
80 - "Provided size", Double.valueOf(width * 1000.0 / 72.0).intValue(),  
81 - Double.valueOf(height * 1000.0 / 72.0).intValue());  
82 -  
83 - printJob.convertHtml((String) call.argument("html"), size, margins,  
84 - (String) call.argument("baseUrl"));  
85 - result.success(1);  
86 - break;  
87 - }  
88 - case "printingInfo": {  
89 - result.success(PrintingJob.printingInfo());  
90 - break;  
91 - }  
92 - case "rasterPdf": {  
93 - final byte[] document = call.argument("doc");  
94 - final int[] pages = call.argument("pages");  
95 - Double scale = call.argument("scale");  
96 - final PrintingJob printJob =  
97 - new PrintingJob(activity, this, (int) call.argument("job"));  
98 - printJob.rasterPdf(document, pages, scale);  
99 - result.success(1);  
100 - break; 26 + if (android.os.Build.VERSION.SDK_INT >= android.os.Build.VERSION_CODES.KITKAT) {
  27 + switch (call.method) {
  28 + case "printPdf": {
  29 + final String name = call.argument("name");
  30 +
  31 + final PrintingJob printJob =
  32 + new PrintingJob(activity, this, (int) call.argument("job"));
  33 + assert name != null;
  34 + printJob.printPdf(name);
  35 +
  36 + result.success(1);
  37 + break;
  38 + }
  39 + case "cancelJob": {
  40 + final PrintingJob printJob =
  41 + new PrintingJob(activity, this, (int) call.argument("job"));
  42 + printJob.cancelJob(null);
  43 + result.success(1);
  44 + break;
  45 + }
  46 + case "sharePdf": {
  47 + final byte[] document = call.argument("doc");
  48 + final String name = call.argument("name");
  49 + PrintingJob.sharePdf(activity, document, name);
  50 + result.success(1);
  51 + break;
  52 + }
  53 + case "convertHtml": {
  54 + Double width = call.argument("width");
  55 + Double height = call.argument("height");
  56 + Double marginLeft = call.argument("marginLeft");
  57 + Double marginTop = call.argument("marginTop");
  58 + Double marginRight = call.argument("marginRight");
  59 + Double marginBottom = call.argument("marginBottom");
  60 + final PrintingJob printJob =
  61 + new PrintingJob(activity, this, (int) call.argument("job"));
  62 +
  63 + assert width != null;
  64 + assert height != null;
  65 + assert marginLeft != null;
  66 + assert marginTop != null;
  67 + assert marginRight != null;
  68 + assert marginBottom != null;
  69 +
  70 + PrintAttributes.Margins margins = new PrintAttributes.Margins(
  71 + Double.valueOf(marginLeft * 1000.0).intValue(),
  72 + Double.valueOf(marginTop * 1000.0 / 72.0).intValue(),
  73 + Double.valueOf(marginRight * 1000.0 / 72.0).intValue(),
  74 + Double.valueOf(marginBottom * 1000.0 / 72.0).intValue());
  75 +
  76 + PrintAttributes.MediaSize size =
  77 + new PrintAttributes.MediaSize("flutter_printing", "Provided size",
  78 + Double.valueOf(width * 1000.0 / 72.0).intValue(),
  79 + Double.valueOf(height * 1000.0 / 72.0).intValue());
  80 +
  81 + printJob.convertHtml((String) call.argument("html"), size, margins,
  82 + (String) call.argument("baseUrl"));
  83 + result.success(1);
  84 + break;
  85 + }
  86 + case "printingInfo": {
  87 + result.success(PrintingJob.printingInfo());
  88 + break;
  89 + }
  90 + case "rasterPdf": {
  91 + final byte[] document = call.argument("doc");
  92 + final int[] pages = call.argument("pages");
  93 + Double scale = call.argument("scale");
  94 + final PrintingJob printJob =
  95 + new PrintingJob(activity, this, (int) call.argument("job"));
  96 + printJob.rasterPdf(document, pages, scale);
  97 + result.success(1);
  98 + break;
  99 + }
  100 + default:
  101 + result.notImplemented();
  102 + break;
101 } 103 }
102 - default:  
103 - result.notImplemented();  
104 - break; 104 + } else {
  105 + result.notImplemented();
105 } 106 }
106 } 107 }
107 108
108 /// Request the Pdf document from flutter 109 /// Request the Pdf document from flutter
  110 + @RequiresApi(api = Build.VERSION_CODES.KITKAT)
109 void onLayout(final PrintingJob printJob, Double width, double height, double marginLeft, 111 void onLayout(final PrintingJob printJob, Double width, double height, double marginLeft,
110 double marginTop, double marginRight, double marginBottom) { 112 double marginTop, double marginRight, double marginBottom) {
111 HashMap<String, Object> args = new HashMap<>(); 113 HashMap<String, Object> args = new HashMap<>();
@@ -141,6 +143,7 @@ public class PrintingHandler implements MethodChannel.MethodCallHandler { @@ -141,6 +143,7 @@ public class PrintingHandler implements MethodChannel.MethodCallHandler {
141 } 143 }
142 144
143 /// send completion status to flutter 145 /// send completion status to flutter
  146 + @RequiresApi(api = Build.VERSION_CODES.KITKAT)
144 void onCompleted(PrintingJob printJob, boolean completed, String error) { 147 void onCompleted(PrintingJob printJob, boolean completed, String error) {
145 HashMap<String, Object> args = new HashMap<>(); 148 HashMap<String, Object> args = new HashMap<>();
146 args.put("completed", completed); 149 args.put("completed", completed);
@@ -152,6 +155,7 @@ public class PrintingHandler implements MethodChannel.MethodCallHandler { @@ -152,6 +155,7 @@ public class PrintingHandler implements MethodChannel.MethodCallHandler {
152 } 155 }
153 156
154 /// send html to pdf data result to flutter 157 /// send html to pdf data result to flutter
  158 + @RequiresApi(api = Build.VERSION_CODES.KITKAT)
155 void onHtmlRendered(PrintingJob printJob, byte[] pdfData) { 159 void onHtmlRendered(PrintingJob printJob, byte[] pdfData) {
156 HashMap<String, Object> args = new HashMap<>(); 160 HashMap<String, Object> args = new HashMap<>();
157 args.put("doc", pdfData); 161 args.put("doc", pdfData);
@@ -161,6 +165,7 @@ public class PrintingHandler implements MethodChannel.MethodCallHandler { @@ -161,6 +165,7 @@ public class PrintingHandler implements MethodChannel.MethodCallHandler {
161 } 165 }
162 166
163 /// send html to pdf conversion error to flutter 167 /// send html to pdf conversion error to flutter
  168 + @RequiresApi(api = Build.VERSION_CODES.KITKAT)
164 void onHtmlError(PrintingJob printJob, String error) { 169 void onHtmlError(PrintingJob printJob, String error) {
165 HashMap<String, Object> args = new HashMap<>(); 170 HashMap<String, Object> args = new HashMap<>();
166 args.put("error", error); 171 args.put("error", error);
@@ -170,6 +175,7 @@ public class PrintingHandler implements MethodChannel.MethodCallHandler { @@ -170,6 +175,7 @@ public class PrintingHandler implements MethodChannel.MethodCallHandler {
170 } 175 }
171 176
172 /// send pdf to raster data result to flutter 177 /// send pdf to raster data result to flutter
  178 + @RequiresApi(api = Build.VERSION_CODES.KITKAT)
173 void onPageRasterized(PrintingJob printJob, byte[] imageData, int width, int height) { 179 void onPageRasterized(PrintingJob printJob, byte[] imageData, int width, int height) {
174 HashMap<String, Object> args = new HashMap<>(); 180 HashMap<String, Object> args = new HashMap<>();
175 args.put("image", imageData); 181 args.put("image", imageData);
@@ -180,6 +186,8 @@ public class PrintingHandler implements MethodChannel.MethodCallHandler { @@ -180,6 +186,8 @@ public class PrintingHandler implements MethodChannel.MethodCallHandler {
180 channel.invokeMethod("onPageRasterized", args); 186 channel.invokeMethod("onPageRasterized", args);
181 } 187 }
182 188
  189 + /// The page has been converted to an image
  190 + @RequiresApi(api = Build.VERSION_CODES.KITKAT)
183 void onPageRasterEnd(PrintingJob printJob) { 191 void onPageRasterEnd(PrintingJob printJob) {
184 HashMap<String, Object> args = new HashMap<>(); 192 HashMap<String, Object> args = new HashMap<>();
185 args.put("job", printJob.index); 193 args.put("job", printJob.index);
@@ -18,20 +18,35 @@ package net.nfet.flutter.printing; @@ -18,20 +18,35 @@ package net.nfet.flutter.printing;
18 18
19 import android.content.Context; 19 import android.content.Context;
20 import android.content.Intent; 20 import android.content.Intent;
  21 +import android.content.pm.PackageManager;
  22 +import android.content.pm.ResolveInfo;
21 import android.content.res.Configuration; 23 import android.content.res.Configuration;
  24 +import android.graphics.Bitmap;
  25 +import android.graphics.Matrix;
  26 +import android.graphics.pdf.PdfRenderer;
22 import android.net.Uri; 27 import android.net.Uri;
  28 +import android.os.Build;
23 import android.os.Bundle; 29 import android.os.Bundle;
24 import android.os.CancellationSignal; 30 import android.os.CancellationSignal;
  31 +import android.os.Handler;
  32 +import android.os.Looper;
25 import android.os.ParcelFileDescriptor; 33 import android.os.ParcelFileDescriptor;
26 import android.print.PageRange; 34 import android.print.PageRange;
27 import android.print.PdfConvert; 35 import android.print.PdfConvert;
28 import android.print.PrintAttributes; 36 import android.print.PrintAttributes;
  37 +import android.print.PrintDocumentAdapter;
  38 +import android.print.PrintDocumentInfo;
29 import android.print.PrintJob; 39 import android.print.PrintJob;
  40 +import android.print.PrintJobInfo;
30 import android.print.PrintManager; 41 import android.print.PrintManager;
  42 +import android.util.Log;
31 import android.webkit.WebView; 43 import android.webkit.WebView;
32 import android.webkit.WebViewClient; 44 import android.webkit.WebViewClient;
  45 +
33 import androidx.annotation.NonNull; 46 import androidx.annotation.NonNull;
  47 +import androidx.annotation.RequiresApi;
34 import androidx.core.content.FileProvider; 48 import androidx.core.content.FileProvider;
  49 +
35 import java.io.File; 50 import java.io.File;
36 import java.io.FileInputStream; 51 import java.io.FileInputStream;
37 import java.io.FileOutputStream; 52 import java.io.FileOutputStream;
@@ -39,16 +54,12 @@ import java.io.IOException; @@ -39,16 +54,12 @@ import java.io.IOException;
39 import java.io.OutputStream; 54 import java.io.OutputStream;
40 import java.nio.ByteBuffer; 55 import java.nio.ByteBuffer;
41 import java.util.HashMap; 56 import java.util.HashMap;
42 -import android.content.pm.PackageManager;  
43 -import android.content.pm.ProviderInfo;  
44 -import android.content.pm.ResolveInfo;  
45 import java.util.List; 57 import java.util.List;
46 58
47 -  
48 -  
49 /** 59 /**
50 * PrintJob 60 * PrintJob
51 */ 61 */
  62 +@RequiresApi(api = Build.VERSION_CODES.KITKAT)
52 public class PrintingJob extends PrintDocumentAdapter { 63 public class PrintingJob extends PrintDocumentAdapter {
53 private static PrintManager printManager; 64 private static PrintManager printManager;
54 private final Context context; 65 private final Context context;
@@ -216,11 +227,14 @@ public class PrintingJob extends PrintDocumentAdapter { @@ -216,11 +227,14 @@ public class PrintingJob extends PrintDocumentAdapter {
216 shareIntent.putExtra(Intent.EXTRA_STREAM, apkURI); 227 shareIntent.putExtra(Intent.EXTRA_STREAM, apkURI);
217 shareIntent.addFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION); 228 shareIntent.addFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION);
218 Intent chooserIntent = Intent.createChooser(shareIntent, null); 229 Intent chooserIntent = Intent.createChooser(shareIntent, null);
219 - List<ResolveInfo> resInfoList = context.getPackageManager().queryIntentActivities(chooserIntent, PackageManager.MATCH_DEFAULT_ONLY); 230 + List<ResolveInfo> resInfoList = context.getPackageManager().queryIntentActivities(
  231 + chooserIntent, PackageManager.MATCH_DEFAULT_ONLY);
220 232
221 for (ResolveInfo resolveInfo : resInfoList) { 233 for (ResolveInfo resolveInfo : resInfoList) {
222 String packageName = resolveInfo.activityInfo.packageName; 234 String packageName = resolveInfo.activityInfo.packageName;
223 - context.grantUriPermission(packageName, apkURI, Intent.FLAG_GRANT_WRITE_URI_PERMISSION | Intent.FLAG_GRANT_READ_URI_PERMISSION); 235 + context.grantUriPermission(packageName, apkURI,
  236 + Intent.FLAG_GRANT_WRITE_URI_PERMISSION
  237 + | Intent.FLAG_GRANT_READ_URI_PERMISSION);
224 } 238 }
225 context.startActivity(chooserIntent); 239 context.startActivity(chooserIntent);
226 shareFile.deleteOnExit(); 240 shareFile.deleteOnExit();
@@ -4,7 +4,7 @@ description: Plugin that allows Flutter apps to generate and print documents to @@ -4,7 +4,7 @@ description: Plugin that allows Flutter apps to generate and print documents to
4 homepage: https://github.com/DavBfr/dart_pdf/tree/master/printing 4 homepage: https://github.com/DavBfr/dart_pdf/tree/master/printing
5 repository: https://github.com/DavBfr/dart_pdf 5 repository: https://github.com/DavBfr/dart_pdf
6 issue_tracker: https://github.com/DavBfr/dart_pdf/issues 6 issue_tracker: https://github.com/DavBfr/dart_pdf/issues
7 -version: 3.6.2 7 +version: 3.6.3
8 8
9 environment: 9 environment:
10 sdk: ">=2.3.0 <3.0.0" 10 sdk: ">=2.3.0 <3.0.0"