bin / mupdf / mupdf-1.7 / platform / android / src / com / artifex / mupdfdemo / PrintDialogActivity.java
7859 viewspackage com.artifex.mupdfdemo;12import java.io.ByteArrayOutputStream;3import java.io.InputStream;45import android.app.Activity;6import android.content.ActivityNotFoundException;7import android.content.ContentResolver;8import android.content.Intent;9import android.os.Bundle;10import android.util.Base64;11import android.webkit.WebSettings;12import android.webkit.WebView;13import android.webkit.WebViewClient;1415public class PrintDialogActivity extends Activity {16private static final String PRINT_DIALOG_URL = "https://www.google.com/cloudprint/dialog.html";17private static final String JS_INTERFACE = "AndroidPrintDialog";18private static final String CONTENT_TRANSFER_ENCODING = "base64";1920private static final String ZXING_URL = "http://zxing.appspot.com";21private static final int ZXING_SCAN_REQUEST = 65743;2223/**24* Post message that is sent by Print Dialog web page when the printing dialog25* needs to be closed.26*/27private static final String CLOSE_POST_MESSAGE_NAME = "cp-dialog-on-close";2829/**30* Web view element to show the printing dialog in.31*/32private WebView dialogWebView;3334/**35* Intent that started the action.36*/37Intent cloudPrintIntent;3839private int resultCode;4041@Override42public void onCreate(Bundle icicle) {43super.onCreate(icicle);4445resultCode = RESULT_OK;46setContentView(R.layout.print_dialog);47dialogWebView = (WebView) findViewById(R.id.webview);48cloudPrintIntent = this.getIntent();4950WebSettings settings = dialogWebView.getSettings();51settings.setJavaScriptEnabled(true);5253dialogWebView.setWebViewClient(new PrintDialogWebClient());54dialogWebView.addJavascriptInterface(55new PrintDialogJavaScriptInterface(), JS_INTERFACE);5657dialogWebView.loadUrl(PRINT_DIALOG_URL);58}5960@Override61public void onActivityResult(int requestCode, int resultCode, Intent intent) {62if (requestCode == ZXING_SCAN_REQUEST && resultCode == RESULT_OK) {63dialogWebView.loadUrl(intent.getStringExtra("SCAN_RESULT"));64}65}6667final class PrintDialogJavaScriptInterface {68public String getType() {69return cloudPrintIntent.getType();70}7172public String getTitle() {73return cloudPrintIntent.getExtras().getString("title");74}7576public String getContent() {77try {78ContentResolver contentResolver = getContentResolver();79InputStream is = contentResolver.openInputStream(cloudPrintIntent.getData());80ByteArrayOutputStream baos = new ByteArrayOutputStream();8182byte[] buffer = new byte[4096];83int n = is.read(buffer);84while (n >= 0) {85baos.write(buffer, 0, n);86n = is.read(buffer);87}88is.close();89baos.flush();9091return Base64.encodeToString(baos.toByteArray(), Base64.DEFAULT);92} catch (Throwable e) {93resultCode = RESULT_CANCELED;94setResult(resultCode);95finish();96e.printStackTrace();97}98return "";99}100101public String getEncoding() {102return CONTENT_TRANSFER_ENCODING;103}104105public void onPostMessage(String message) {106if (message.startsWith(CLOSE_POST_MESSAGE_NAME)) {107setResult(resultCode);108finish();109}110}111}112113private final class PrintDialogWebClient extends WebViewClient {114@Override115public boolean shouldOverrideUrlLoading(WebView view, String url) {116if (url.startsWith(ZXING_URL)) {117Intent intentScan = new Intent("com.google.zxing.client.android.SCAN");118intentScan.putExtra("SCAN_MODE", "QR_CODE_MODE");119try {120startActivityForResult(intentScan, ZXING_SCAN_REQUEST);121} catch (ActivityNotFoundException error) {122view.loadUrl(url);123}124} else {125view.loadUrl(url);126}127return false;128}129130@Override131public void onPageFinished(WebView view, String url) {132if (PRINT_DIALOG_URL.equals(url)) {133// Submit print document.134view.loadUrl("javascript:printDialog.setPrintDocument(printDialog.createPrintDocument("135+ "window." + JS_INTERFACE + ".getType(),window." + JS_INTERFACE + ".getTitle(),"136+ "window." + JS_INTERFACE + ".getContent(),window." + JS_INTERFACE + ".getEncoding()))");137138// Add post messages listener.139view.loadUrl("javascript:window.addEventListener('message',"140+ "function(evt){window." + JS_INTERFACE + ".onPostMessage(evt.data)}, false)");141}142}143}144}145146147