diff options
Diffstat (limited to 'PrintService/src/foo/bar/printservice')
3 files changed, 257 insertions, 0 deletions
diff --git a/PrintService/src/foo/bar/printservice/AddPrintersActivity.java b/PrintService/src/foo/bar/printservice/AddPrintersActivity.java new file mode 100644 index 0000000..1a0bc18 --- /dev/null +++ b/PrintService/src/foo/bar/printservice/AddPrintersActivity.java @@ -0,0 +1,13 @@ +package foo.bar.printservice; + +import android.app.Activity; +import android.os.Bundle; + +public class AddPrintersActivity extends Activity { + + @Override + protected void onCreate(Bundle savedInstanceState) { + super.onCreate(savedInstanceState); + setContentView(R.layout.activity_main); + } +} diff --git a/PrintService/src/foo/bar/printservice/MyPrintService.java b/PrintService/src/foo/bar/printservice/MyPrintService.java new file mode 100644 index 0000000..010c987 --- /dev/null +++ b/PrintService/src/foo/bar/printservice/MyPrintService.java @@ -0,0 +1,231 @@ +package foo.bar.printservice; + +import android.content.Intent; +import android.net.Uri; +import android.os.AsyncTask; +import android.os.Handler; +import android.os.Looper; +import android.os.Message; +import android.print.PrintAttributes; +import android.print.PrintAttributes.Margins; +import android.print.PrintAttributes.Resolution; +import android.print.PrintAttributes.Tray; +import android.print.PrintJobInfo; +import android.print.PrinterId; +import android.print.PrinterInfo; +import android.printservice.PrintJob; +import android.printservice.PrintService; +import android.util.Log; +import android.widget.Toast; + +import java.io.BufferedInputStream; +import java.io.BufferedOutputStream; +import java.io.File; +import java.io.FileInputStream; +import java.io.FileOutputStream; +import java.io.IOException; +import java.io.InputStream; +import java.io.OutputStream; +import java.util.ArrayList; +import java.util.List; + +public class MyPrintService extends PrintService { + + private static final String LOG_TAG = MyPrintService.class.getSimpleName(); + + private Handler mHandler; + + @Override + protected void onConnected() { + mHandler = new MyHandler(getMainLooper()); + Log.i(LOG_TAG, "#onConnected()"); + } + + @Override + protected void onDisconnected() { + Log.i(LOG_TAG, "#onDisconnected()"); + } + + @Override + protected void onStartPrinterDiscovery() { + Log.i(LOG_TAG, "#onStartDiscoverPrinters()"); + Message message1 = mHandler.obtainMessage(MyHandler.MESSAGE_ADD_FIRST_FAKE_PRINTER); + mHandler.sendMessageDelayed(message1, 0); + + Message message2 = mHandler.obtainMessage(MyHandler.MESSAGE_ADD_SECOND_FAKE_PRINTER); + mHandler.sendMessageDelayed(message2, 10000); + } + + @Override + protected void onStopPrinterDiscovery() { + Log.i(LOG_TAG, "#onStopDiscoverPrinters()"); + } + + @Override + public void onPrintJobQueued(final PrintJob printJob) { + Log.i(LOG_TAG, "#onPrintJobPending()"); + PrintJobInfo info = printJob.getInfo(); + final File file = new File(getFilesDir(), info.getLabel() + ".pdf"); + if (file.exists()) { + file.delete(); + } + AsyncTask<Void, Void, Void> task = new AsyncTask<Void, Void, Void>() { + @Override + protected Void doInBackground(Void... params) { + InputStream in = new BufferedInputStream( + new FileInputStream(printJob.getData())); + OutputStream out = null; + try { + out = new BufferedOutputStream(new FileOutputStream(file)); + final byte[] buffer = new byte[8192]; + while (true) { + final int readByteCount = in.read(buffer); + if (readByteCount < 0) { + break; + } + out.write(buffer, 0, readByteCount); + } + } catch (IOException ioe) { + /* ignore */ + } finally { + try { + in.close(); + } catch (IOException ioe) { + /* ignore */ + } + if (out != null) { + try { + out.close(); + } catch (IOException ioe) { + /* ignore */ + } + } + } + return null; + } + + @Override + protected void onPostExecute(Void result) { + file.setExecutable(true, false); + file.setWritable(true, false); + file.setReadable(true, false); + + Intent intent = new Intent(Intent.ACTION_VIEW); + intent.setDataAndType(Uri.fromFile(file), "application/pdf"); + intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK); + startActivity(intent, null); + + if (printJob.isQueued()) { + printJob.start(); + } + + PrintJobInfo info = printJob.getInfo(); + Toast.makeText(MyPrintService.this, + "Printer: " + info.getPrinterId().getLocalId() + + " copies: " + info.getAttributes().getCopies(), + Toast.LENGTH_SHORT).show(); + + if (printJob.isStarted()) { + printJob.complete(); + } + } + }; + task.executeOnExecutor(AsyncTask.SERIAL_EXECUTOR, (Void[]) null); + } + + private void addFirstFakePrinter() { + PrinterId printerId = generatePrinterId("1"); + PrinterInfo printer = new PrinterInfo.Builder(printerId, "Printer 1") + .setStatus(PrinterInfo.STATUS_READY) + .setMinMargins(new Margins(0, 0, 0, 0), new Margins(0, 0, 0, 0)) + .addMediaSize(PrintAttributes.MediaSize.ISO_A2, false) + .addMediaSize(PrintAttributes.MediaSize.ISO_A3, false) + .addMediaSize(PrintAttributes.MediaSize.ISO_A4, false) + .addMediaSize(PrintAttributes.MediaSize.ISO_A5, false) + .addMediaSize(PrintAttributes.MediaSize.ISO_A6, false) + .addMediaSize(PrintAttributes.MediaSize.NA_LETTER, true) + .addResolution(new Resolution("R1", getPackageName(), + R.string.resolution_600x600, 600, 600), true) + .addInputTray(new Tray("FirstInputTray", getPackageName(), + R.string.input_tray_first), false) + .addOutputTray(new Tray("FirstOutputTray", getPackageName(), + R.string.output_tray_first), false) + .setDuplexModes(PrintAttributes.DUPLEX_MODE_NONE + | PrintAttributes.DUPLEX_MODE_LONG_EDGE + | PrintAttributes.DUPLEX_MODE_SHORT_EDGE, + PrintAttributes.DUPLEX_MODE_NONE) + .setColorModes(PrintAttributes.COLOR_MODE_COLOR + | PrintAttributes.COLOR_MODE_MONOCHROME, + PrintAttributes.COLOR_MODE_COLOR) + .setFittingModes(PrintAttributes.FITTING_MODE_NONE + | PrintAttributes.FITTING_MODE_FIT_TO_PAGE, + PrintAttributes.FITTING_MODE_NONE) + .setOrientations(PrintAttributes.ORIENTATION_PORTRAIT + | PrintAttributes.ORIENTATION_LANDSCAPE, + PrintAttributes.ORIENTATION_PORTRAIT) + .create(); + List<PrinterInfo> printers = new ArrayList<PrinterInfo>(); + printers.add(printer); + addDiscoveredPrinters(printers); + } + + private void addSecondFakePrinter() { + PrinterId printerId = generatePrinterId("2"); + PrinterInfo printer = new PrinterInfo.Builder(printerId, "Printer 2") + .setStatus(PrinterInfo.STATUS_READY) + .setMinMargins(new Margins(0, 0, 0, 0), new Margins(0, 0, 0, 0)) + .addMediaSize(PrintAttributes.MediaSize.ISO_A4, true) + .addMediaSize(PrintAttributes.MediaSize.ISO_A5, false) + .addResolution(new Resolution("R1", getPackageName(), + R.string.resolution_200x200, 200, 200), true) + .addResolution(new Resolution("R2", getPackageName(), + R.string.resolution_300x300, 300, 300), false) + .addInputTray(new Tray("FirstInputTray", getPackageName(), + R.string.input_tray_first), false) + .addInputTray(new Tray("SecondInputTray", getPackageName(), + R.string.input_tray_second), true) + .addOutputTray(new Tray("FirstOutputTray", getPackageName(), + R.string.output_tray_first), false) + .addOutputTray(new Tray("SecondOutputTray", getPackageName(), + R.string.output_tray_second), true) + .setDuplexModes(PrintAttributes.DUPLEX_MODE_NONE + | PrintAttributes.DUPLEX_MODE_LONG_EDGE + | PrintAttributes.DUPLEX_MODE_SHORT_EDGE, + PrintAttributes.DUPLEX_MODE_SHORT_EDGE) + .setColorModes(PrintAttributes.COLOR_MODE_COLOR + | PrintAttributes.COLOR_MODE_MONOCHROME, + PrintAttributes.COLOR_MODE_MONOCHROME) + .setFittingModes(PrintAttributes.FITTING_MODE_FIT_TO_PAGE + | PrintAttributes.FITTING_MODE_NONE, + PrintAttributes.FITTING_MODE_FIT_TO_PAGE) + .setOrientations(PrintAttributes.ORIENTATION_PORTRAIT + | PrintAttributes.ORIENTATION_LANDSCAPE, + PrintAttributes.ORIENTATION_LANDSCAPE) + .create(); + List<PrinterInfo> printers = new ArrayList<PrinterInfo>(); + printers.add(printer); + addDiscoveredPrinters(printers); + } + + private final class MyHandler extends Handler { + + public static final int MESSAGE_ADD_FIRST_FAKE_PRINTER = 1; + public static final int MESSAGE_ADD_SECOND_FAKE_PRINTER = 2; + + public MyHandler(Looper looper) { + super(looper, null, true); + } + + @Override + public void handleMessage(Message message) { + switch (message.what) { + case MESSAGE_ADD_FIRST_FAKE_PRINTER: { + addFirstFakePrinter(); + } break; + case MESSAGE_ADD_SECOND_FAKE_PRINTER: { + addSecondFakePrinter(); + } break; + } + } + } +} diff --git a/PrintService/src/foo/bar/printservice/SettingsActivity.java b/PrintService/src/foo/bar/printservice/SettingsActivity.java new file mode 100644 index 0000000..21ab419 --- /dev/null +++ b/PrintService/src/foo/bar/printservice/SettingsActivity.java @@ -0,0 +1,13 @@ +package foo.bar.printservice; + +import android.app.Activity; +import android.os.Bundle; + +public class SettingsActivity extends Activity { + + @Override + protected void onCreate(Bundle savedInstanceState) { + super.onCreate(savedInstanceState); + setContentView(R.layout.activity_main); + } +} |