17ae2878f5219d55e842348eb44ffb5070b9d708dSvetoslav Ganov/* 27ae2878f5219d55e842348eb44ffb5070b9d708dSvetoslav Ganov * Copyright (C) 2013 The Android Open Source Project 37ae2878f5219d55e842348eb44ffb5070b9d708dSvetoslav Ganov * 47ae2878f5219d55e842348eb44ffb5070b9d708dSvetoslav Ganov * Licensed under the Apache License, Version 2.0 (the "License"); 57ae2878f5219d55e842348eb44ffb5070b9d708dSvetoslav Ganov * you may not use this file except in compliance with the License. 67ae2878f5219d55e842348eb44ffb5070b9d708dSvetoslav Ganov * You may obtain a copy of the License at 77ae2878f5219d55e842348eb44ffb5070b9d708dSvetoslav Ganov * 87ae2878f5219d55e842348eb44ffb5070b9d708dSvetoslav Ganov * http://www.apache.org/licenses/LICENSE-2.0 97ae2878f5219d55e842348eb44ffb5070b9d708dSvetoslav Ganov * 107ae2878f5219d55e842348eb44ffb5070b9d708dSvetoslav Ganov * Unless required by applicable law or agreed to in writing, software 117ae2878f5219d55e842348eb44ffb5070b9d708dSvetoslav Ganov * distributed under the License is distributed on an "AS IS" BASIS, 127ae2878f5219d55e842348eb44ffb5070b9d708dSvetoslav Ganov * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 137ae2878f5219d55e842348eb44ffb5070b9d708dSvetoslav Ganov * See the License for the specific language governing permissions and 147ae2878f5219d55e842348eb44ffb5070b9d708dSvetoslav Ganov * limitations under the License. 157ae2878f5219d55e842348eb44ffb5070b9d708dSvetoslav Ganov */ 167ae2878f5219d55e842348eb44ffb5070b9d708dSvetoslav Ganov 170fb6959ad364ee84e83c435d671228fb365f2084Svetoslavpackage foo.bar.printservice; 180fb6959ad364ee84e83c435d671228fb365f2084Svetoslav 199981caa9c40383230c2e08fade7cbe03e2d96125Philip P. Moltmannimport android.annotation.NonNull; 205a2dc1db96c25efda213b44e5f479b5725fce16dPhilip P. Moltmannimport android.app.PendingIntent; 210fb6959ad364ee84e83c435d671228fb365f2084Svetoslavimport android.content.Intent; 225a2dc1db96c25efda213b44e5f479b5725fce16dPhilip P. Moltmannimport android.graphics.BitmapFactory; 235a2dc1db96c25efda213b44e5f479b5725fce16dPhilip P. Moltmannimport android.graphics.drawable.Icon; 240fb6959ad364ee84e83c435d671228fb365f2084Svetoslavimport android.net.Uri; 250fb6959ad364ee84e83c435d671228fb365f2084Svetoslavimport android.os.AsyncTask; 269dac8ebb191a10f37933a7893ecb0317de002d99Philip P. Moltmannimport android.os.Build; 27f369a120cc6037a0765bb7b4922fbce1c86f1ee2Philip P. Moltmannimport android.os.CancellationSignal; 280fb6959ad364ee84e83c435d671228fb365f2084Svetoslavimport android.os.Handler; 290fb6959ad364ee84e83c435d671228fb365f2084Svetoslavimport android.os.Looper; 300fb6959ad364ee84e83c435d671228fb365f2084Svetoslavimport android.os.Message; 313bb4d60425207dad4241d0565ff0c4a20dca119dSvetoslav Ganovimport android.os.ParcelFileDescriptor; 320fb6959ad364ee84e83c435d671228fb365f2084Svetoslavimport android.print.PrintAttributes; 330fb6959ad364ee84e83c435d671228fb365f2084Svetoslavimport android.print.PrintAttributes.Margins; 34c6c630d5c2b70440d433aa19bcf50c115d9cf39aSvetoslav Ganovimport android.print.PrintAttributes.MediaSize; 350fb6959ad364ee84e83c435d671228fb365f2084Svetoslavimport android.print.PrintAttributes.Resolution; 36f11598332008fd706ed17be975a0ff73ba7f6a21Svetoslav Ganovimport android.print.PrintJobId; 371274de1ce4243d6ebb3e12b12b75daf8b466c39cSvetoslav Ganovimport android.print.PrinterCapabilitiesInfo; 380fb6959ad364ee84e83c435d671228fb365f2084Svetoslavimport android.print.PrinterId; 390fb6959ad364ee84e83c435d671228fb365f2084Svetoslavimport android.print.PrinterInfo; 405a2dc1db96c25efda213b44e5f479b5725fce16dPhilip P. Moltmannimport android.printservice.CustomPrinterIconCallback; 410fb6959ad364ee84e83c435d671228fb365f2084Svetoslavimport android.printservice.PrintJob; 420fb6959ad364ee84e83c435d671228fb365f2084Svetoslavimport android.printservice.PrintService; 431274de1ce4243d6ebb3e12b12b75daf8b466c39cSvetoslav Ganovimport android.printservice.PrinterDiscoverySession; 44f11598332008fd706ed17be975a0ff73ba7f6a21Svetoslav Ganovimport android.util.ArrayMap; 450fb6959ad364ee84e83c435d671228fb365f2084Svetoslavimport android.util.Log; 46f369a120cc6037a0765bb7b4922fbce1c86f1ee2Philip P. Moltmannimport com.android.internal.os.SomeArgs; 47ecaec06dfbaa011676c37f5f6170b984da5c6a5eSvetoslav Ganov 480fb6959ad364ee84e83c435d671228fb365f2084Svetoslavimport java.io.BufferedInputStream; 490fb6959ad364ee84e83c435d671228fb365f2084Svetoslavimport java.io.BufferedOutputStream; 500fb6959ad364ee84e83c435d671228fb365f2084Svetoslavimport java.io.File; 510fb6959ad364ee84e83c435d671228fb365f2084Svetoslavimport java.io.FileInputStream; 520fb6959ad364ee84e83c435d671228fb365f2084Svetoslavimport java.io.FileOutputStream; 530fb6959ad364ee84e83c435d671228fb365f2084Svetoslavimport java.io.IOException; 540fb6959ad364ee84e83c435d671228fb365f2084Svetoslavimport java.io.InputStream; 550fb6959ad364ee84e83c435d671228fb365f2084Svetoslavimport java.io.OutputStream; 560fb6959ad364ee84e83c435d671228fb365f2084Svetoslavimport java.util.ArrayList; 570fb6959ad364ee84e83c435d671228fb365f2084Svetoslavimport java.util.List; 58f11598332008fd706ed17be975a0ff73ba7f6a21Svetoslav Ganovimport java.util.Map; 590fb6959ad364ee84e83c435d671228fb365f2084Svetoslav 600fb6959ad364ee84e83c435d671228fb365f2084Svetoslavpublic class MyPrintService extends PrintService { 610fb6959ad364ee84e83c435d671228fb365f2084Svetoslav 628dea95de32a43b110a10a445a6dfd8fba4232073Svetoslav Ganov private static final String LOG_TAG = "MyPrintService"; 630fb6959ad364ee84e83c435d671228fb365f2084Svetoslav 64482f8b86361308b90af05c2a3b16eebb0e778882Svetoslav Ganov private static final long STANDARD_DELAY_MILLIS = 10000000; 656fc52023a04fe45b6f59212fc716cbbcf76f35fcSvetoslav 666fc52023a04fe45b6f59212fc716cbbcf76f35fcSvetoslav static final String INTENT_EXTRA_ACTION_TYPE = "INTENT_EXTRA_ACTION_TYPE"; 676fc52023a04fe45b6f59212fc716cbbcf76f35fcSvetoslav static final String INTENT_EXTRA_PRINT_JOB_ID = "INTENT_EXTRA_PRINT_JOB_ID"; 686fc52023a04fe45b6f59212fc716cbbcf76f35fcSvetoslav 696fc52023a04fe45b6f59212fc716cbbcf76f35fcSvetoslav static final int ACTION_TYPE_ON_PRINT_JOB_PENDING = 1; 70002df26c21a78353d33705bb076ac61a09400095Philip P. Moltmann private static final int ACTION_TYPE_ON_REQUEST_CANCEL_PRINT_JOB = 2; 716fc52023a04fe45b6f59212fc716cbbcf76f35fcSvetoslav 726fc52023a04fe45b6f59212fc716cbbcf76f35fcSvetoslav private static final Object sLock = new Object(); 736fc52023a04fe45b6f59212fc716cbbcf76f35fcSvetoslav 746fc52023a04fe45b6f59212fc716cbbcf76f35fcSvetoslav private static MyPrintService sInstance; 756fc52023a04fe45b6f59212fc716cbbcf76f35fcSvetoslav 760fb6959ad364ee84e83c435d671228fb365f2084Svetoslav private Handler mHandler; 770fb6959ad364ee84e83c435d671228fb365f2084Svetoslav 783bb4d60425207dad4241d0565ff0c4a20dca119dSvetoslav Ganov private AsyncTask<ParcelFileDescriptor, Void, Void> mFakePrintTask; 798dea95de32a43b110a10a445a6dfd8fba4232073Svetoslav Ganov 80f11598332008fd706ed17be975a0ff73ba7f6a21Svetoslav Ganov private final Map<PrintJobId, PrintJob> mProcessedPrintJobs = 81002df26c21a78353d33705bb076ac61a09400095Philip P. Moltmann new ArrayMap<>(); 826fc52023a04fe45b6f59212fc716cbbcf76f35fcSvetoslav 836fc52023a04fe45b6f59212fc716cbbcf76f35fcSvetoslav public static MyPrintService peekInstance() { 846fc52023a04fe45b6f59212fc716cbbcf76f35fcSvetoslav synchronized (sLock) { 856fc52023a04fe45b6f59212fc716cbbcf76f35fcSvetoslav return sInstance; 866fc52023a04fe45b6f59212fc716cbbcf76f35fcSvetoslav } 876fc52023a04fe45b6f59212fc716cbbcf76f35fcSvetoslav } 881274de1ce4243d6ebb3e12b12b75daf8b466c39cSvetoslav Ganov 89282209e42c32d712fd5685f283047d84e813297eSvetoslav Ganov @Override 900fb6959ad364ee84e83c435d671228fb365f2084Svetoslav protected void onConnected() { 910fb6959ad364ee84e83c435d671228fb365f2084Svetoslav Log.i(LOG_TAG, "#onConnected()"); 921274de1ce4243d6ebb3e12b12b75daf8b466c39cSvetoslav Ganov mHandler = new MyHandler(getMainLooper()); 936fc52023a04fe45b6f59212fc716cbbcf76f35fcSvetoslav synchronized (sLock) { 946fc52023a04fe45b6f59212fc716cbbcf76f35fcSvetoslav sInstance = this; 956fc52023a04fe45b6f59212fc716cbbcf76f35fcSvetoslav } 960fb6959ad364ee84e83c435d671228fb365f2084Svetoslav } 970fb6959ad364ee84e83c435d671228fb365f2084Svetoslav 980fb6959ad364ee84e83c435d671228fb365f2084Svetoslav @Override 990fb6959ad364ee84e83c435d671228fb365f2084Svetoslav protected void onDisconnected() { 1000fb6959ad364ee84e83c435d671228fb365f2084Svetoslav Log.i(LOG_TAG, "#onDisconnected()"); 1016fc52023a04fe45b6f59212fc716cbbcf76f35fcSvetoslav synchronized (sLock) { 1026fc52023a04fe45b6f59212fc716cbbcf76f35fcSvetoslav sInstance = null; 1036fc52023a04fe45b6f59212fc716cbbcf76f35fcSvetoslav } 1040fb6959ad364ee84e83c435d671228fb365f2084Svetoslav } 1050fb6959ad364ee84e83c435d671228fb365f2084Svetoslav 1060fb6959ad364ee84e83c435d671228fb365f2084Svetoslav @Override 1071274de1ce4243d6ebb3e12b12b75daf8b466c39cSvetoslav Ganov protected PrinterDiscoverySession onCreatePrinterDiscoverySession() { 1087ae2878f5219d55e842348eb44ffb5070b9d708dSvetoslav Ganov Log.i(LOG_TAG, "#onCreatePrinterDiscoverySession()"); 1097ae2878f5219d55e842348eb44ffb5070b9d708dSvetoslav Ganov return new FakePrinterDiscoverySession(); 1100fb6959ad364ee84e83c435d671228fb365f2084Svetoslav } 1110fb6959ad364ee84e83c435d671228fb365f2084Svetoslav 1120fb6959ad364ee84e83c435d671228fb365f2084Svetoslav @Override 1136fc52023a04fe45b6f59212fc716cbbcf76f35fcSvetoslav protected void onRequestCancelPrintJob(final PrintJob printJob) { 1146fc52023a04fe45b6f59212fc716cbbcf76f35fcSvetoslav Log.i(LOG_TAG, "#onRequestCancelPrintJob()"); 1156fc52023a04fe45b6f59212fc716cbbcf76f35fcSvetoslav mProcessedPrintJobs.put(printJob.getId(), printJob); 1166fc52023a04fe45b6f59212fc716cbbcf76f35fcSvetoslav Intent intent = new Intent(this, MyDialogActivity.class); 1176fc52023a04fe45b6f59212fc716cbbcf76f35fcSvetoslav intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK); 1186fc52023a04fe45b6f59212fc716cbbcf76f35fcSvetoslav intent.putExtra(INTENT_EXTRA_PRINT_JOB_ID, printJob.getId()); 1196fc52023a04fe45b6f59212fc716cbbcf76f35fcSvetoslav intent.putExtra(INTENT_EXTRA_ACTION_TYPE, ACTION_TYPE_ON_REQUEST_CANCEL_PRINT_JOB); 1206fc52023a04fe45b6f59212fc716cbbcf76f35fcSvetoslav startActivity(intent); 1218dea95de32a43b110a10a445a6dfd8fba4232073Svetoslav Ganov } 1228dea95de32a43b110a10a445a6dfd8fba4232073Svetoslav Ganov 1238dea95de32a43b110a10a445a6dfd8fba4232073Svetoslav Ganov @Override 1240fb6959ad364ee84e83c435d671228fb365f2084Svetoslav public void onPrintJobQueued(final PrintJob printJob) { 125c6c630d5c2b70440d433aa19bcf50c115d9cf39aSvetoslav Ganov Log.i(LOG_TAG, "#onPrintJobQueued()"); 1266fc52023a04fe45b6f59212fc716cbbcf76f35fcSvetoslav mProcessedPrintJobs.put(printJob.getId(), printJob); 1273bb4d60425207dad4241d0565ff0c4a20dca119dSvetoslav Ganov if (printJob.isQueued()) { 1283bb4d60425207dad4241d0565ff0c4a20dca119dSvetoslav Ganov printJob.start(); 1293bb4d60425207dad4241d0565ff0c4a20dca119dSvetoslav Ganov } 1308fa1c1973dd8659e52462103b21a926ee9747351Svetoslav 1316fc52023a04fe45b6f59212fc716cbbcf76f35fcSvetoslav Intent intent = new Intent(this, MyDialogActivity.class); 1326fc52023a04fe45b6f59212fc716cbbcf76f35fcSvetoslav intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK); 1336fc52023a04fe45b6f59212fc716cbbcf76f35fcSvetoslav intent.putExtra(INTENT_EXTRA_PRINT_JOB_ID, printJob.getId()); 1346fc52023a04fe45b6f59212fc716cbbcf76f35fcSvetoslav intent.putExtra(INTENT_EXTRA_ACTION_TYPE, ACTION_TYPE_ON_PRINT_JOB_PENDING); 1356fc52023a04fe45b6f59212fc716cbbcf76f35fcSvetoslav startActivity(intent); 1368dea95de32a43b110a10a445a6dfd8fba4232073Svetoslav Ganov } 1378dea95de32a43b110a10a445a6dfd8fba4232073Svetoslav Ganov 138f11598332008fd706ed17be975a0ff73ba7f6a21Svetoslav Ganov void handleRequestCancelPrintJob(PrintJobId printJobId) { 1396fc52023a04fe45b6f59212fc716cbbcf76f35fcSvetoslav PrintJob printJob = mProcessedPrintJobs.get(printJobId); 1406fc52023a04fe45b6f59212fc716cbbcf76f35fcSvetoslav if (printJob == null) { 1416fc52023a04fe45b6f59212fc716cbbcf76f35fcSvetoslav return; 1426fc52023a04fe45b6f59212fc716cbbcf76f35fcSvetoslav } 1436fc52023a04fe45b6f59212fc716cbbcf76f35fcSvetoslav mProcessedPrintJobs.remove(printJobId); 144482f8b86361308b90af05c2a3b16eebb0e778882Svetoslav Ganov if (printJob.isQueued() || printJob.isStarted() || printJob.isBlocked()) { 1456fc52023a04fe45b6f59212fc716cbbcf76f35fcSvetoslav mHandler.removeMessages(MyHandler.MSG_HANDLE_DO_PRINT_JOB); 1466fc52023a04fe45b6f59212fc716cbbcf76f35fcSvetoslav mHandler.removeMessages(MyHandler.MSG_HANDLE_FAIL_PRINT_JOB); 1476fc52023a04fe45b6f59212fc716cbbcf76f35fcSvetoslav printJob.cancel(); 1486fc52023a04fe45b6f59212fc716cbbcf76f35fcSvetoslav } 1496fc52023a04fe45b6f59212fc716cbbcf76f35fcSvetoslav } 1506fc52023a04fe45b6f59212fc716cbbcf76f35fcSvetoslav 151f11598332008fd706ed17be975a0ff73ba7f6a21Svetoslav Ganov void handleFailPrintJobDelayed(PrintJobId printJobId) { 1526fc52023a04fe45b6f59212fc716cbbcf76f35fcSvetoslav Message message = mHandler.obtainMessage( 153f11598332008fd706ed17be975a0ff73ba7f6a21Svetoslav Ganov MyHandler.MSG_HANDLE_FAIL_PRINT_JOB, printJobId); 1546fc52023a04fe45b6f59212fc716cbbcf76f35fcSvetoslav mHandler.sendMessageDelayed(message, STANDARD_DELAY_MILLIS); 1556fc52023a04fe45b6f59212fc716cbbcf76f35fcSvetoslav } 1566fc52023a04fe45b6f59212fc716cbbcf76f35fcSvetoslav 157f11598332008fd706ed17be975a0ff73ba7f6a21Svetoslav Ganov void handleFailPrintJob(PrintJobId printJobId) { 1586fc52023a04fe45b6f59212fc716cbbcf76f35fcSvetoslav PrintJob printJob = mProcessedPrintJobs.get(printJobId); 1596fc52023a04fe45b6f59212fc716cbbcf76f35fcSvetoslav if (printJob == null) { 1606fc52023a04fe45b6f59212fc716cbbcf76f35fcSvetoslav return; 1616fc52023a04fe45b6f59212fc716cbbcf76f35fcSvetoslav } 1626fc52023a04fe45b6f59212fc716cbbcf76f35fcSvetoslav mProcessedPrintJobs.remove(printJobId); 1636fc52023a04fe45b6f59212fc716cbbcf76f35fcSvetoslav if (printJob.isQueued() || printJob.isStarted()) { 1646fc52023a04fe45b6f59212fc716cbbcf76f35fcSvetoslav printJob.fail(getString(R.string.fail_reason)); 1656fc52023a04fe45b6f59212fc716cbbcf76f35fcSvetoslav } 1666fc52023a04fe45b6f59212fc716cbbcf76f35fcSvetoslav } 1676fc52023a04fe45b6f59212fc716cbbcf76f35fcSvetoslav 168f11598332008fd706ed17be975a0ff73ba7f6a21Svetoslav Ganov void handleBlockPrintJobDelayed(PrintJobId printJobId) { 1693bb4d60425207dad4241d0565ff0c4a20dca119dSvetoslav Ganov Message message = mHandler.obtainMessage( 170f11598332008fd706ed17be975a0ff73ba7f6a21Svetoslav Ganov MyHandler.MSG_HANDLE_BLOCK_PRINT_JOB, printJobId); 1713bb4d60425207dad4241d0565ff0c4a20dca119dSvetoslav Ganov mHandler.sendMessageDelayed(message, STANDARD_DELAY_MILLIS); 1723bb4d60425207dad4241d0565ff0c4a20dca119dSvetoslav Ganov } 1733bb4d60425207dad4241d0565ff0c4a20dca119dSvetoslav Ganov 174f11598332008fd706ed17be975a0ff73ba7f6a21Svetoslav Ganov void handleBlockPrintJob(PrintJobId printJobId) { 1753bb4d60425207dad4241d0565ff0c4a20dca119dSvetoslav Ganov final PrintJob printJob = mProcessedPrintJobs.get(printJobId); 1763bb4d60425207dad4241d0565ff0c4a20dca119dSvetoslav Ganov if (printJob == null) { 1773bb4d60425207dad4241d0565ff0c4a20dca119dSvetoslav Ganov return; 1783bb4d60425207dad4241d0565ff0c4a20dca119dSvetoslav Ganov } 1793bb4d60425207dad4241d0565ff0c4a20dca119dSvetoslav Ganov 1803bb4d60425207dad4241d0565ff0c4a20dca119dSvetoslav Ganov if (printJob.isStarted()) { 181f11598332008fd706ed17be975a0ff73ba7f6a21Svetoslav Ganov printJob.block("Gimme some rest, dude"); 1823bb4d60425207dad4241d0565ff0c4a20dca119dSvetoslav Ganov } 1833bb4d60425207dad4241d0565ff0c4a20dca119dSvetoslav Ganov } 1843bb4d60425207dad4241d0565ff0c4a20dca119dSvetoslav Ganov 185f11598332008fd706ed17be975a0ff73ba7f6a21Svetoslav Ganov void handleBlockAndDelayedUnblockPrintJob(PrintJobId printJobId) { 1863bb4d60425207dad4241d0565ff0c4a20dca119dSvetoslav Ganov handleBlockPrintJob(printJobId); 1873bb4d60425207dad4241d0565ff0c4a20dca119dSvetoslav Ganov 1883bb4d60425207dad4241d0565ff0c4a20dca119dSvetoslav Ganov Message message = mHandler.obtainMessage( 189f11598332008fd706ed17be975a0ff73ba7f6a21Svetoslav Ganov MyHandler.MSG_HANDLE_UNBLOCK_PRINT_JOB, printJobId); 1903bb4d60425207dad4241d0565ff0c4a20dca119dSvetoslav Ganov mHandler.sendMessageDelayed(message, STANDARD_DELAY_MILLIS); 1913bb4d60425207dad4241d0565ff0c4a20dca119dSvetoslav Ganov } 1923bb4d60425207dad4241d0565ff0c4a20dca119dSvetoslav Ganov 193002df26c21a78353d33705bb076ac61a09400095Philip P. Moltmann private void handleUnblockPrintJob(PrintJobId printJobId) { 1943bb4d60425207dad4241d0565ff0c4a20dca119dSvetoslav Ganov final PrintJob printJob = mProcessedPrintJobs.get(printJobId); 1953bb4d60425207dad4241d0565ff0c4a20dca119dSvetoslav Ganov if (printJob == null) { 1963bb4d60425207dad4241d0565ff0c4a20dca119dSvetoslav Ganov return; 1973bb4d60425207dad4241d0565ff0c4a20dca119dSvetoslav Ganov } 1983bb4d60425207dad4241d0565ff0c4a20dca119dSvetoslav Ganov 1993bb4d60425207dad4241d0565ff0c4a20dca119dSvetoslav Ganov if (printJob.isBlocked()) { 2003bb4d60425207dad4241d0565ff0c4a20dca119dSvetoslav Ganov printJob.start(); 2013bb4d60425207dad4241d0565ff0c4a20dca119dSvetoslav Ganov } 2023bb4d60425207dad4241d0565ff0c4a20dca119dSvetoslav Ganov } 2033bb4d60425207dad4241d0565ff0c4a20dca119dSvetoslav Ganov 204f11598332008fd706ed17be975a0ff73ba7f6a21Svetoslav Ganov void handleQueuedPrintJobDelayed(PrintJobId printJobId) { 2053bb4d60425207dad4241d0565ff0c4a20dca119dSvetoslav Ganov final PrintJob printJob = mProcessedPrintJobs.get(printJobId); 2063bb4d60425207dad4241d0565ff0c4a20dca119dSvetoslav Ganov if (printJob == null) { 2073bb4d60425207dad4241d0565ff0c4a20dca119dSvetoslav Ganov return; 2083bb4d60425207dad4241d0565ff0c4a20dca119dSvetoslav Ganov } 2093bb4d60425207dad4241d0565ff0c4a20dca119dSvetoslav Ganov 2103bb4d60425207dad4241d0565ff0c4a20dca119dSvetoslav Ganov if (printJob.isQueued()) { 2113bb4d60425207dad4241d0565ff0c4a20dca119dSvetoslav Ganov printJob.start(); 2123bb4d60425207dad4241d0565ff0c4a20dca119dSvetoslav Ganov } 2136fc52023a04fe45b6f59212fc716cbbcf76f35fcSvetoslav Message message = mHandler.obtainMessage( 214f11598332008fd706ed17be975a0ff73ba7f6a21Svetoslav Ganov MyHandler.MSG_HANDLE_DO_PRINT_JOB, printJobId); 2156fc52023a04fe45b6f59212fc716cbbcf76f35fcSvetoslav mHandler.sendMessageDelayed(message, STANDARD_DELAY_MILLIS); 2166fc52023a04fe45b6f59212fc716cbbcf76f35fcSvetoslav } 2176fc52023a04fe45b6f59212fc716cbbcf76f35fcSvetoslav 2189981caa9c40383230c2e08fade7cbe03e2d96125Philip P. Moltmann /** 2199981caa9c40383230c2e08fade7cbe03e2d96125Philip P. Moltmann * Pretend that the print job has progressed. 2209981caa9c40383230c2e08fade7cbe03e2d96125Philip P. Moltmann * 2219981caa9c40383230c2e08fade7cbe03e2d96125Philip P. Moltmann * @param printJobId ID of the print job to progress 2229981caa9c40383230c2e08fade7cbe03e2d96125Philip P. Moltmann * @param progress the new value to progress to 2239981caa9c40383230c2e08fade7cbe03e2d96125Philip P. Moltmann */ 2249981caa9c40383230c2e08fade7cbe03e2d96125Philip P. Moltmann void handlePrintJobProgress(@NonNull PrintJobId printJobId, int progress) { 2259981caa9c40383230c2e08fade7cbe03e2d96125Philip P. Moltmann final PrintJob printJob = mProcessedPrintJobs.get(printJobId); 2269981caa9c40383230c2e08fade7cbe03e2d96125Philip P. Moltmann if (printJob == null) { 2279981caa9c40383230c2e08fade7cbe03e2d96125Philip P. Moltmann return; 2289981caa9c40383230c2e08fade7cbe03e2d96125Philip P. Moltmann } 2299981caa9c40383230c2e08fade7cbe03e2d96125Philip P. Moltmann 2309981caa9c40383230c2e08fade7cbe03e2d96125Philip P. Moltmann if (printJob.isQueued()) { 2319981caa9c40383230c2e08fade7cbe03e2d96125Philip P. Moltmann printJob.start(); 2329981caa9c40383230c2e08fade7cbe03e2d96125Philip P. Moltmann } 2339981caa9c40383230c2e08fade7cbe03e2d96125Philip P. Moltmann 2349981caa9c40383230c2e08fade7cbe03e2d96125Philip P. Moltmann if (progress == 100) { 2359981caa9c40383230c2e08fade7cbe03e2d96125Philip P. Moltmann handleQueuedPrintJob(printJobId); 2369981caa9c40383230c2e08fade7cbe03e2d96125Philip P. Moltmann } else { 2379dac8ebb191a10f37933a7893ecb0317de002d99Philip P. Moltmann if (Build.VERSION.SDK_INT >= 24) { 2389dac8ebb191a10f37933a7893ecb0317de002d99Philip P. Moltmann printJob.setProgress((float) progress / 100); 2399dac8ebb191a10f37933a7893ecb0317de002d99Philip P. Moltmann printJob.setStatus("Printing progress: " + progress + "%"); 2409dac8ebb191a10f37933a7893ecb0317de002d99Philip P. Moltmann } 2419981caa9c40383230c2e08fade7cbe03e2d96125Philip P. Moltmann 2429981caa9c40383230c2e08fade7cbe03e2d96125Philip P. Moltmann Message message = mHandler.obtainMessage( 2439981caa9c40383230c2e08fade7cbe03e2d96125Philip P. Moltmann MyHandler.MSG_HANDLE_PRINT_JOB_PROGRESS, progress + 10, 0, printJobId); 2449981caa9c40383230c2e08fade7cbe03e2d96125Philip P. Moltmann mHandler.sendMessageDelayed(message, 1000); 2459981caa9c40383230c2e08fade7cbe03e2d96125Philip P. Moltmann } 2469981caa9c40383230c2e08fade7cbe03e2d96125Philip P. Moltmann } 2479981caa9c40383230c2e08fade7cbe03e2d96125Philip P. Moltmann 248f11598332008fd706ed17be975a0ff73ba7f6a21Svetoslav Ganov void handleQueuedPrintJob(PrintJobId printJobId) { 2496fc52023a04fe45b6f59212fc716cbbcf76f35fcSvetoslav final PrintJob printJob = mProcessedPrintJobs.get(printJobId); 2506fc52023a04fe45b6f59212fc716cbbcf76f35fcSvetoslav if (printJob == null) { 2516fc52023a04fe45b6f59212fc716cbbcf76f35fcSvetoslav return; 2526fc52023a04fe45b6f59212fc716cbbcf76f35fcSvetoslav } 2536fc52023a04fe45b6f59212fc716cbbcf76f35fcSvetoslav 2548dea95de32a43b110a10a445a6dfd8fba4232073Svetoslav Ganov if (printJob.isQueued()) { 2558dea95de32a43b110a10a445a6dfd8fba4232073Svetoslav Ganov printJob.start(); 2560fb6959ad364ee84e83c435d671228fb365f2084Svetoslav } 2578dea95de32a43b110a10a445a6dfd8fba4232073Svetoslav Ganov 258f885d1211c6356a1978df6b99778b6caad75c8eaPhilip P. Moltmann try { 259f885d1211c6356a1978df6b99778b6caad75c8eaPhilip P. Moltmann final File file = File.createTempFile(this.getClass().getSimpleName(), ".pdf", 260f885d1211c6356a1978df6b99778b6caad75c8eaPhilip P. Moltmann getFilesDir()); 261f885d1211c6356a1978df6b99778b6caad75c8eaPhilip P. Moltmann mFakePrintTask = new AsyncTask<ParcelFileDescriptor, Void, Void>() { 262f885d1211c6356a1978df6b99778b6caad75c8eaPhilip P. Moltmann @Override 263f885d1211c6356a1978df6b99778b6caad75c8eaPhilip P. Moltmann protected Void doInBackground(ParcelFileDescriptor... params) { 264f885d1211c6356a1978df6b99778b6caad75c8eaPhilip P. Moltmann InputStream in = new BufferedInputStream(new FileInputStream( 265f885d1211c6356a1978df6b99778b6caad75c8eaPhilip P. Moltmann params[0].getFileDescriptor())); 266f885d1211c6356a1978df6b99778b6caad75c8eaPhilip P. Moltmann OutputStream out = null; 267f885d1211c6356a1978df6b99778b6caad75c8eaPhilip P. Moltmann try { 268f885d1211c6356a1978df6b99778b6caad75c8eaPhilip P. Moltmann out = new BufferedOutputStream(new FileOutputStream(file)); 269f885d1211c6356a1978df6b99778b6caad75c8eaPhilip P. Moltmann final byte[] buffer = new byte[8192]; 270f885d1211c6356a1978df6b99778b6caad75c8eaPhilip P. Moltmann while (true) { 271f885d1211c6356a1978df6b99778b6caad75c8eaPhilip P. Moltmann if (isCancelled()) { 272f885d1211c6356a1978df6b99778b6caad75c8eaPhilip P. Moltmann break; 273f885d1211c6356a1978df6b99778b6caad75c8eaPhilip P. Moltmann } 274f885d1211c6356a1978df6b99778b6caad75c8eaPhilip P. Moltmann final int readByteCount = in.read(buffer); 275f885d1211c6356a1978df6b99778b6caad75c8eaPhilip P. Moltmann if (readByteCount < 0) { 276f885d1211c6356a1978df6b99778b6caad75c8eaPhilip P. Moltmann break; 277f885d1211c6356a1978df6b99778b6caad75c8eaPhilip P. Moltmann } 278f885d1211c6356a1978df6b99778b6caad75c8eaPhilip P. Moltmann out.write(buffer, 0, readByteCount); 2798dea95de32a43b110a10a445a6dfd8fba4232073Svetoslav Ganov } 280f885d1211c6356a1978df6b99778b6caad75c8eaPhilip P. Moltmann } catch (IOException ioe) { 281f885d1211c6356a1978df6b99778b6caad75c8eaPhilip P. Moltmann throw new RuntimeException(ioe); 282f885d1211c6356a1978df6b99778b6caad75c8eaPhilip P. Moltmann } finally { 283002df26c21a78353d33705bb076ac61a09400095Philip P. Moltmann try { 284002df26c21a78353d33705bb076ac61a09400095Philip P. Moltmann in.close(); 285002df26c21a78353d33705bb076ac61a09400095Philip P. Moltmann } catch (IOException ioe) { 286002df26c21a78353d33705bb076ac61a09400095Philip P. Moltmann /* ignore */ 2870fb6959ad364ee84e83c435d671228fb365f2084Svetoslav } 288f885d1211c6356a1978df6b99778b6caad75c8eaPhilip P. Moltmann if (out != null) { 289f885d1211c6356a1978df6b99778b6caad75c8eaPhilip P. Moltmann try { 290f885d1211c6356a1978df6b99778b6caad75c8eaPhilip P. Moltmann out.close(); 291f885d1211c6356a1978df6b99778b6caad75c8eaPhilip P. Moltmann } catch (IOException ioe) { 292f885d1211c6356a1978df6b99778b6caad75c8eaPhilip P. Moltmann /* ignore */ 293f885d1211c6356a1978df6b99778b6caad75c8eaPhilip P. Moltmann } 2943bb4d60425207dad4241d0565ff0c4a20dca119dSvetoslav Ganov } 295f885d1211c6356a1978df6b99778b6caad75c8eaPhilip P. Moltmann if (isCancelled()) { 296f885d1211c6356a1978df6b99778b6caad75c8eaPhilip P. Moltmann file.delete(); 2973bb4d60425207dad4241d0565ff0c4a20dca119dSvetoslav Ganov } 2983bb4d60425207dad4241d0565ff0c4a20dca119dSvetoslav Ganov } 299f885d1211c6356a1978df6b99778b6caad75c8eaPhilip P. Moltmann return null; 3000fb6959ad364ee84e83c435d671228fb365f2084Svetoslav } 3010fb6959ad364ee84e83c435d671228fb365f2084Svetoslav 302f885d1211c6356a1978df6b99778b6caad75c8eaPhilip P. Moltmann @Override 303f885d1211c6356a1978df6b99778b6caad75c8eaPhilip P. Moltmann protected void onPostExecute(Void result) { 304f885d1211c6356a1978df6b99778b6caad75c8eaPhilip P. Moltmann if (printJob.isStarted()) { 305f885d1211c6356a1978df6b99778b6caad75c8eaPhilip P. Moltmann printJob.complete(); 306f885d1211c6356a1978df6b99778b6caad75c8eaPhilip P. Moltmann } 3070fb6959ad364ee84e83c435d671228fb365f2084Svetoslav 308f885d1211c6356a1978df6b99778b6caad75c8eaPhilip P. Moltmann file.setReadable(true, false); 309ecaec06dfbaa011676c37f5f6170b984da5c6a5eSvetoslav Ganov 310f885d1211c6356a1978df6b99778b6caad75c8eaPhilip P. Moltmann // Quick and dirty to show the file - use a content provider instead. 311f885d1211c6356a1978df6b99778b6caad75c8eaPhilip P. Moltmann Intent intent = new Intent(Intent.ACTION_VIEW); 312f885d1211c6356a1978df6b99778b6caad75c8eaPhilip P. Moltmann intent.setDataAndType(Uri.fromFile(file), "application/pdf"); 313f885d1211c6356a1978df6b99778b6caad75c8eaPhilip P. Moltmann intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK); 314f885d1211c6356a1978df6b99778b6caad75c8eaPhilip P. Moltmann startActivity(intent, null); 3150fb6959ad364ee84e83c435d671228fb365f2084Svetoslav 316f885d1211c6356a1978df6b99778b6caad75c8eaPhilip P. Moltmann mFakePrintTask = null; 317f885d1211c6356a1978df6b99778b6caad75c8eaPhilip P. Moltmann } 3187ae2878f5219d55e842348eb44ffb5070b9d708dSvetoslav Ganov 319f885d1211c6356a1978df6b99778b6caad75c8eaPhilip P. Moltmann @Override 320f885d1211c6356a1978df6b99778b6caad75c8eaPhilip P. Moltmann protected void onCancelled(Void result) { 321f885d1211c6356a1978df6b99778b6caad75c8eaPhilip P. Moltmann if (printJob.isStarted()) { 322f885d1211c6356a1978df6b99778b6caad75c8eaPhilip P. Moltmann printJob.cancel(); 323f885d1211c6356a1978df6b99778b6caad75c8eaPhilip P. Moltmann } 3247ae2878f5219d55e842348eb44ffb5070b9d708dSvetoslav Ganov } 325f885d1211c6356a1978df6b99778b6caad75c8eaPhilip P. Moltmann }; 326f885d1211c6356a1978df6b99778b6caad75c8eaPhilip P. Moltmann mFakePrintTask.executeOnExecutor(AsyncTask.SERIAL_EXECUTOR, 327f885d1211c6356a1978df6b99778b6caad75c8eaPhilip P. Moltmann printJob.getDocument().getData()); 328f885d1211c6356a1978df6b99778b6caad75c8eaPhilip P. Moltmann } catch (IOException e) { 329f885d1211c6356a1978df6b99778b6caad75c8eaPhilip P. Moltmann Log.e(LOG_TAG, "Could not create temporary file: %s", e); 330f885d1211c6356a1978df6b99778b6caad75c8eaPhilip P. Moltmann } 3310fb6959ad364ee84e83c435d671228fb365f2084Svetoslav } 3320fb6959ad364ee84e83c435d671228fb365f2084Svetoslav 3330fb6959ad364ee84e83c435d671228fb365f2084Svetoslav private final class MyHandler extends Handler { 334002df26c21a78353d33705bb076ac61a09400095Philip P. Moltmann static final int MSG_HANDLE_DO_PRINT_JOB = 1; 335002df26c21a78353d33705bb076ac61a09400095Philip P. Moltmann static final int MSG_HANDLE_FAIL_PRINT_JOB = 2; 336002df26c21a78353d33705bb076ac61a09400095Philip P. Moltmann static final int MSG_HANDLE_BLOCK_PRINT_JOB = 3; 337002df26c21a78353d33705bb076ac61a09400095Philip P. Moltmann static final int MSG_HANDLE_UNBLOCK_PRINT_JOB = 4; 338002df26c21a78353d33705bb076ac61a09400095Philip P. Moltmann static final int MSG_HANDLE_PRINT_JOB_PROGRESS = 5; 3390fb6959ad364ee84e83c435d671228fb365f2084Svetoslav 3400fb6959ad364ee84e83c435d671228fb365f2084Svetoslav public MyHandler(Looper looper) { 3413bb4d60425207dad4241d0565ff0c4a20dca119dSvetoslav Ganov super(looper); 3420fb6959ad364ee84e83c435d671228fb365f2084Svetoslav } 3430fb6959ad364ee84e83c435d671228fb365f2084Svetoslav 3440fb6959ad364ee84e83c435d671228fb365f2084Svetoslav @Override 3450fb6959ad364ee84e83c435d671228fb365f2084Svetoslav public void handleMessage(Message message) { 3460fb6959ad364ee84e83c435d671228fb365f2084Svetoslav switch (message.what) { 3476fc52023a04fe45b6f59212fc716cbbcf76f35fcSvetoslav case MSG_HANDLE_DO_PRINT_JOB: { 348f11598332008fd706ed17be975a0ff73ba7f6a21Svetoslav Ganov PrintJobId printJobId = (PrintJobId) message.obj; 3496fc52023a04fe45b6f59212fc716cbbcf76f35fcSvetoslav handleQueuedPrintJob(printJobId); 3506fc52023a04fe45b6f59212fc716cbbcf76f35fcSvetoslav } break; 3516fc52023a04fe45b6f59212fc716cbbcf76f35fcSvetoslav 3526fc52023a04fe45b6f59212fc716cbbcf76f35fcSvetoslav case MSG_HANDLE_FAIL_PRINT_JOB: { 353f11598332008fd706ed17be975a0ff73ba7f6a21Svetoslav Ganov PrintJobId printJobId = (PrintJobId) message.obj; 3546fc52023a04fe45b6f59212fc716cbbcf76f35fcSvetoslav handleFailPrintJob(printJobId); 3558dea95de32a43b110a10a445a6dfd8fba4232073Svetoslav Ganov } break; 3563bb4d60425207dad4241d0565ff0c4a20dca119dSvetoslav Ganov 3573bb4d60425207dad4241d0565ff0c4a20dca119dSvetoslav Ganov case MSG_HANDLE_BLOCK_PRINT_JOB: { 358f11598332008fd706ed17be975a0ff73ba7f6a21Svetoslav Ganov PrintJobId printJobId = (PrintJobId) message.obj; 3593bb4d60425207dad4241d0565ff0c4a20dca119dSvetoslav Ganov handleBlockPrintJob(printJobId); 3603bb4d60425207dad4241d0565ff0c4a20dca119dSvetoslav Ganov } break; 3613bb4d60425207dad4241d0565ff0c4a20dca119dSvetoslav Ganov 3623bb4d60425207dad4241d0565ff0c4a20dca119dSvetoslav Ganov case MSG_HANDLE_UNBLOCK_PRINT_JOB: { 363f11598332008fd706ed17be975a0ff73ba7f6a21Svetoslav Ganov PrintJobId printJobId = (PrintJobId) message.obj; 3643bb4d60425207dad4241d0565ff0c4a20dca119dSvetoslav Ganov handleUnblockPrintJob(printJobId); 3653bb4d60425207dad4241d0565ff0c4a20dca119dSvetoslav Ganov } break; 3669981caa9c40383230c2e08fade7cbe03e2d96125Philip P. Moltmann 3679981caa9c40383230c2e08fade7cbe03e2d96125Philip P. Moltmann case MSG_HANDLE_PRINT_JOB_PROGRESS: { 3689981caa9c40383230c2e08fade7cbe03e2d96125Philip P. Moltmann PrintJobId printJobId = (PrintJobId) message.obj; 3699981caa9c40383230c2e08fade7cbe03e2d96125Philip P. Moltmann handlePrintJobProgress(printJobId, message.arg1); 3709981caa9c40383230c2e08fade7cbe03e2d96125Philip P. Moltmann } break; 3710fb6959ad364ee84e83c435d671228fb365f2084Svetoslav } 3720fb6959ad364ee84e83c435d671228fb365f2084Svetoslav } 3730fb6959ad364ee84e83c435d671228fb365f2084Svetoslav } 3741274de1ce4243d6ebb3e12b12b75daf8b466c39cSvetoslav Ganov 3757ae2878f5219d55e842348eb44ffb5070b9d708dSvetoslav Ganov private final class FakePrinterDiscoverySession extends PrinterDiscoverySession { 3761274de1ce4243d6ebb3e12b12b75daf8b466c39cSvetoslav Ganov private final Handler mSesionHandler = new SessionHandler(getMainLooper()); 3771274de1ce4243d6ebb3e12b12b75daf8b466c39cSvetoslav Ganov 378002df26c21a78353d33705bb076ac61a09400095Philip P. Moltmann private final List<PrinterInfo> mFakePrinters = new ArrayList<>(); 3797ae2878f5219d55e842348eb44ffb5070b9d708dSvetoslav Ganov 380002df26c21a78353d33705bb076ac61a09400095Philip P. Moltmann FakePrinterDiscoverySession() { 381c02ac3775cd61bba799dbf70a707507410b3ff13Philip P. Moltmann for (int i = 0; i < 6; i++) { 382a3eee78c0e6d279a2c1d91742960549864d17d03Svetoslav Ganov String name = "Printer " + i; 3835a2dc1db96c25efda213b44e5f479b5725fce16dPhilip P. Moltmann 3845a2dc1db96c25efda213b44e5f479b5725fce16dPhilip P. Moltmann PrinterInfo.Builder builder = new PrinterInfo.Builder(generatePrinterId(name), name, 385c02ac3775cd61bba799dbf70a707507410b3ff13Philip P. Moltmann (i == 1 || i == 2) ? PrinterInfo.STATUS_UNAVAILABLE 386c02ac3775cd61bba799dbf70a707507410b3ff13Philip P. Moltmann : PrinterInfo.STATUS_IDLE); 387c02ac3775cd61bba799dbf70a707507410b3ff13Philip P. Moltmann 388c02ac3775cd61bba799dbf70a707507410b3ff13Philip P. Moltmann if (i != 3) { 389c02ac3775cd61bba799dbf70a707507410b3ff13Philip P. Moltmann builder.setDescription("Launch a menu to select behavior."); 390c02ac3775cd61bba799dbf70a707507410b3ff13Philip P. Moltmann } 391c02ac3775cd61bba799dbf70a707507410b3ff13Philip P. Moltmann 392c02ac3775cd61bba799dbf70a707507410b3ff13Philip P. Moltmann if (i != 4) { 3939dac8ebb191a10f37933a7893ecb0317de002d99Philip P. Moltmann if (Build.VERSION.SDK_INT >= 24) { 3949dac8ebb191a10f37933a7893ecb0317de002d99Philip P. Moltmann builder.setIconResourceId(R.drawable.printer); 3959dac8ebb191a10f37933a7893ecb0317de002d99Philip P. Moltmann } 396c02ac3775cd61bba799dbf70a707507410b3ff13Philip P. Moltmann } 397c02ac3775cd61bba799dbf70a707507410b3ff13Philip P. Moltmann 398c02ac3775cd61bba799dbf70a707507410b3ff13Philip P. Moltmann if (i % 2 == 0) { 3999dac8ebb191a10f37933a7893ecb0317de002d99Philip P. Moltmann if (Build.VERSION.SDK_INT >= 24) { 4009dac8ebb191a10f37933a7893ecb0317de002d99Philip P. Moltmann Intent infoIntent = new Intent(MyPrintService.this, InfoActivity.class); 4019dac8ebb191a10f37933a7893ecb0317de002d99Philip P. Moltmann infoIntent.putExtra(InfoActivity.PRINTER_NAME, name); 402c02ac3775cd61bba799dbf70a707507410b3ff13Philip P. Moltmann 4039dac8ebb191a10f37933a7893ecb0317de002d99Philip P. Moltmann PendingIntent infoPendingIntent = PendingIntent.getActivity( 4049dac8ebb191a10f37933a7893ecb0317de002d99Philip P. Moltmann getApplicationContext(), 4059dac8ebb191a10f37933a7893ecb0317de002d99Philip P. Moltmann i, infoIntent, PendingIntent.FLAG_UPDATE_CURRENT); 4069dac8ebb191a10f37933a7893ecb0317de002d99Philip P. Moltmann 4079dac8ebb191a10f37933a7893ecb0317de002d99Philip P. Moltmann builder.setInfoIntent(infoPendingIntent); 4089dac8ebb191a10f37933a7893ecb0317de002d99Philip P. Moltmann } 409c02ac3775cd61bba799dbf70a707507410b3ff13Philip P. Moltmann } 410c02ac3775cd61bba799dbf70a707507410b3ff13Philip P. Moltmann 411c02ac3775cd61bba799dbf70a707507410b3ff13Philip P. Moltmann if (i == 5) { 4129dac8ebb191a10f37933a7893ecb0317de002d99Philip P. Moltmann if (Build.VERSION.SDK_INT >= 24) { 413d01dcca2d759fb4044cbb72206b1caae722d8c89Philip P. Moltmann builder.setHasCustomPrinterIcon(true); 4149dac8ebb191a10f37933a7893ecb0317de002d99Philip P. Moltmann } 415c02ac3775cd61bba799dbf70a707507410b3ff13Philip P. Moltmann } 416c02ac3775cd61bba799dbf70a707507410b3ff13Philip P. Moltmann 4175a2dc1db96c25efda213b44e5f479b5725fce16dPhilip P. Moltmann mFakePrinters.add(builder.build()); 4187ae2878f5219d55e842348eb44ffb5070b9d708dSvetoslav Ganov } 4197ae2878f5219d55e842348eb44ffb5070b9d708dSvetoslav Ganov } 4207ae2878f5219d55e842348eb44ffb5070b9d708dSvetoslav Ganov 4217ae2878f5219d55e842348eb44ffb5070b9d708dSvetoslav Ganov @Override 4227ae2878f5219d55e842348eb44ffb5070b9d708dSvetoslav Ganov public void onDestroy() { 4237ae2878f5219d55e842348eb44ffb5070b9d708dSvetoslav Ganov Log.i(LOG_TAG, "FakePrinterDiscoverySession#onDestroy()"); 4247ae2878f5219d55e842348eb44ffb5070b9d708dSvetoslav Ganov mSesionHandler.removeMessages(SessionHandler.MSG_ADD_FIRST_BATCH_FAKE_PRINTERS); 4251274de1ce4243d6ebb3e12b12b75daf8b466c39cSvetoslav Ganov } 4261274de1ce4243d6ebb3e12b12b75daf8b466c39cSvetoslav Ganov 4271274de1ce4243d6ebb3e12b12b75daf8b466c39cSvetoslav Ganov @Override 4287ae2878f5219d55e842348eb44ffb5070b9d708dSvetoslav Ganov public void onStartPrinterDiscovery(List<PrinterId> priorityList) { 4297ae2878f5219d55e842348eb44ffb5070b9d708dSvetoslav Ganov Log.i(LOG_TAG, "FakePrinterDiscoverySession#onStartPrinterDiscovery()"); 4301274de1ce4243d6ebb3e12b12b75daf8b466c39cSvetoslav Ganov Message message1 = mSesionHandler.obtainMessage( 4317ae2878f5219d55e842348eb44ffb5070b9d708dSvetoslav Ganov SessionHandler.MSG_ADD_FIRST_BATCH_FAKE_PRINTERS, this); 4321274de1ce4243d6ebb3e12b12b75daf8b466c39cSvetoslav Ganov mSesionHandler.sendMessageDelayed(message1, 0); 4331274de1ce4243d6ebb3e12b12b75daf8b466c39cSvetoslav Ganov } 4341274de1ce4243d6ebb3e12b12b75daf8b466c39cSvetoslav Ganov 4351274de1ce4243d6ebb3e12b12b75daf8b466c39cSvetoslav Ganov @Override 4367ae2878f5219d55e842348eb44ffb5070b9d708dSvetoslav Ganov public void onStopPrinterDiscovery() { 4377ae2878f5219d55e842348eb44ffb5070b9d708dSvetoslav Ganov Log.i(LOG_TAG, "FakePrinterDiscoverySession#onStopPrinterDiscovery()"); 4381274de1ce4243d6ebb3e12b12b75daf8b466c39cSvetoslav Ganov cancellAddingFakePrinters(); 4391274de1ce4243d6ebb3e12b12b75daf8b466c39cSvetoslav Ganov } 4401274de1ce4243d6ebb3e12b12b75daf8b466c39cSvetoslav Ganov 4411274de1ce4243d6ebb3e12b12b75daf8b466c39cSvetoslav Ganov @Override 4423bb4d60425207dad4241d0565ff0c4a20dca119dSvetoslav Ganov public void onStartPrinterStateTracking(PrinterId printerId) { 4433bb4d60425207dad4241d0565ff0c4a20dca119dSvetoslav Ganov Log.i(LOG_TAG, "FakePrinterDiscoverySession#onStartPrinterStateTracking()"); 4445a2dc1db96c25efda213b44e5f479b5725fce16dPhilip P. Moltmann 4455a2dc1db96c25efda213b44e5f479b5725fce16dPhilip P. Moltmann final int printerCount = mFakePrinters.size(); 4465a2dc1db96c25efda213b44e5f479b5725fce16dPhilip P. Moltmann for (int i = printerCount - 1; i >= 0; i--) { 4475a2dc1db96c25efda213b44e5f479b5725fce16dPhilip P. Moltmann PrinterInfo printer = mFakePrinters.remove(i); 4485a2dc1db96c25efda213b44e5f479b5725fce16dPhilip P. Moltmann 4495a2dc1db96c25efda213b44e5f479b5725fce16dPhilip P. Moltmann if (printer.getId().equals(printerId)) { 4509dac8ebb191a10f37933a7893ecb0317de002d99Philip P. Moltmann PrinterCapabilitiesInfo.Builder b = new PrinterCapabilitiesInfo.Builder( 4515a2dc1db96c25efda213b44e5f479b5725fce16dPhilip P. Moltmann printerId) 4525a2dc1db96c25efda213b44e5f479b5725fce16dPhilip P. Moltmann .setMinMargins(new Margins(200, 200, 200, 200)) 4535a2dc1db96c25efda213b44e5f479b5725fce16dPhilip P. Moltmann .addMediaSize(MediaSize.ISO_A4, true) 4545a2dc1db96c25efda213b44e5f479b5725fce16dPhilip P. Moltmann .addMediaSize(MediaSize.NA_GOVT_LETTER, false) 4555a2dc1db96c25efda213b44e5f479b5725fce16dPhilip P. Moltmann .addMediaSize(MediaSize.JPN_YOU4, false) 4565a2dc1db96c25efda213b44e5f479b5725fce16dPhilip P. Moltmann .addResolution(new Resolution("R1", getString( 4575a2dc1db96c25efda213b44e5f479b5725fce16dPhilip P. Moltmann R.string.resolution_200x200), 200, 200), false) 4585a2dc1db96c25efda213b44e5f479b5725fce16dPhilip P. Moltmann .addResolution(new Resolution("R2", getString( 4595a2dc1db96c25efda213b44e5f479b5725fce16dPhilip P. Moltmann R.string.resolution_300x300), 300, 300), true) 4605a2dc1db96c25efda213b44e5f479b5725fce16dPhilip P. Moltmann .setColorModes(PrintAttributes.COLOR_MODE_COLOR 4615a2dc1db96c25efda213b44e5f479b5725fce16dPhilip P. Moltmann | PrintAttributes.COLOR_MODE_MONOCHROME, 4629dac8ebb191a10f37933a7893ecb0317de002d99Philip P. Moltmann PrintAttributes.COLOR_MODE_MONOCHROME); 4639dac8ebb191a10f37933a7893ecb0317de002d99Philip P. Moltmann 4649dac8ebb191a10f37933a7893ecb0317de002d99Philip P. Moltmann if (Build.VERSION.SDK_INT >= 23) { 4659dac8ebb191a10f37933a7893ecb0317de002d99Philip P. Moltmann b.setDuplexModes(PrintAttributes.DUPLEX_MODE_LONG_EDGE 4669dac8ebb191a10f37933a7893ecb0317de002d99Philip P. Moltmann | PrintAttributes.DUPLEX_MODE_NONE, 4679dac8ebb191a10f37933a7893ecb0317de002d99Philip P. Moltmann PrintAttributes.DUPLEX_MODE_LONG_EDGE); 4689dac8ebb191a10f37933a7893ecb0317de002d99Philip P. Moltmann } 4699dac8ebb191a10f37933a7893ecb0317de002d99Philip P. Moltmann 4709dac8ebb191a10f37933a7893ecb0317de002d99Philip P. Moltmann PrinterCapabilitiesInfo capabilities = b.build(); 4715a2dc1db96c25efda213b44e5f479b5725fce16dPhilip P. Moltmann 4725a2dc1db96c25efda213b44e5f479b5725fce16dPhilip P. Moltmann printer = new PrinterInfo.Builder(printer) 4735a2dc1db96c25efda213b44e5f479b5725fce16dPhilip P. Moltmann .setCapabilities(capabilities) 4745a2dc1db96c25efda213b44e5f479b5725fce16dPhilip P. Moltmann .build(); 4755a2dc1db96c25efda213b44e5f479b5725fce16dPhilip P. Moltmann } 4765a2dc1db96c25efda213b44e5f479b5725fce16dPhilip P. Moltmann 4775a2dc1db96c25efda213b44e5f479b5725fce16dPhilip P. Moltmann mFakePrinters.add(printer); 4781274de1ce4243d6ebb3e12b12b75daf8b466c39cSvetoslav Ganov } 4795a2dc1db96c25efda213b44e5f479b5725fce16dPhilip P. Moltmann 4805a2dc1db96c25efda213b44e5f479b5725fce16dPhilip P. Moltmann addPrinters(mFakePrinters); 4815a2dc1db96c25efda213b44e5f479b5725fce16dPhilip P. Moltmann } 4825a2dc1db96c25efda213b44e5f479b5725fce16dPhilip P. Moltmann 4835a2dc1db96c25efda213b44e5f479b5725fce16dPhilip P. Moltmann @Override 4845a2dc1db96c25efda213b44e5f479b5725fce16dPhilip P. Moltmann public void onRequestCustomPrinterIcon(final PrinterId printerId, 485f369a120cc6037a0765bb7b4922fbce1c86f1ee2Philip P. Moltmann final CancellationSignal cancellationSignal, 4865a2dc1db96c25efda213b44e5f479b5725fce16dPhilip P. Moltmann final CustomPrinterIconCallback callbacks) { 4875a2dc1db96c25efda213b44e5f479b5725fce16dPhilip P. Moltmann Log.i(LOG_TAG, "FakePrinterDiscoverySession#onRequestCustomPrinterIcon() " + printerId); 4885a2dc1db96c25efda213b44e5f479b5725fce16dPhilip P. Moltmann 489f369a120cc6037a0765bb7b4922fbce1c86f1ee2Philip P. Moltmann SomeArgs args = SomeArgs.obtain(); 490f369a120cc6037a0765bb7b4922fbce1c86f1ee2Philip P. Moltmann args.arg1 = cancellationSignal; 491f369a120cc6037a0765bb7b4922fbce1c86f1ee2Philip P. Moltmann args.arg2 = callbacks; 492f369a120cc6037a0765bb7b4922fbce1c86f1ee2Philip P. Moltmann 493f369a120cc6037a0765bb7b4922fbce1c86f1ee2Philip P. Moltmann Message msg = mSesionHandler.obtainMessage( 494f369a120cc6037a0765bb7b4922fbce1c86f1ee2Philip P. Moltmann SessionHandler.MSG_SUPPLY_CUSTOM_PRINTER_ICON, args); 495f369a120cc6037a0765bb7b4922fbce1c86f1ee2Philip P. Moltmann 4965a2dc1db96c25efda213b44e5f479b5725fce16dPhilip P. Moltmann // Pretend the bitmap icon takes 5 seconds to load 497f369a120cc6037a0765bb7b4922fbce1c86f1ee2Philip P. Moltmann mSesionHandler.sendMessageDelayed(msg, 5000); 4981274de1ce4243d6ebb3e12b12b75daf8b466c39cSvetoslav Ganov } 4991274de1ce4243d6ebb3e12b12b75daf8b466c39cSvetoslav Ganov 5003bb4d60425207dad4241d0565ff0c4a20dca119dSvetoslav Ganov @Override 5013bb4d60425207dad4241d0565ff0c4a20dca119dSvetoslav Ganov public void onValidatePrinters(List<PrinterId> printerIds) { 502e4a7362e628701bc71289888f6241cc94c9a4fbcSvet Ganov Log.i(LOG_TAG, "FakePrinterDiscoverySession#onValidatePrinters() " + printerIds); 5033bb4d60425207dad4241d0565ff0c4a20dca119dSvetoslav Ganov } 5043bb4d60425207dad4241d0565ff0c4a20dca119dSvetoslav Ganov 5053bb4d60425207dad4241d0565ff0c4a20dca119dSvetoslav Ganov @Override 5063bb4d60425207dad4241d0565ff0c4a20dca119dSvetoslav Ganov public void onStopPrinterStateTracking(PrinterId printerId) { 5073bb4d60425207dad4241d0565ff0c4a20dca119dSvetoslav Ganov Log.i(LOG_TAG, "FakePrinterDiscoverySession#onStopPrinterStateTracking()"); 5083bb4d60425207dad4241d0565ff0c4a20dca119dSvetoslav Ganov } 5093bb4d60425207dad4241d0565ff0c4a20dca119dSvetoslav Ganov 5107ae2878f5219d55e842348eb44ffb5070b9d708dSvetoslav Ganov private void addFirstBatchFakePrinters() { 5115a2dc1db96c25efda213b44e5f479b5725fce16dPhilip P. Moltmann List<PrinterInfo> printers = mFakePrinters.subList(0, mFakePrinters.size()); 5128fa1c1973dd8659e52462103b21a926ee9747351Svetoslav addPrinters(printers); 5131274de1ce4243d6ebb3e12b12b75daf8b466c39cSvetoslav Ganov } 5141274de1ce4243d6ebb3e12b12b75daf8b466c39cSvetoslav Ganov 5151274de1ce4243d6ebb3e12b12b75daf8b466c39cSvetoslav Ganov private void cancellAddingFakePrinters() { 5167ae2878f5219d55e842348eb44ffb5070b9d708dSvetoslav Ganov mSesionHandler.removeMessages(SessionHandler.MSG_ADD_FIRST_BATCH_FAKE_PRINTERS); 5171274de1ce4243d6ebb3e12b12b75daf8b466c39cSvetoslav Ganov } 5181274de1ce4243d6ebb3e12b12b75daf8b466c39cSvetoslav Ganov 5191274de1ce4243d6ebb3e12b12b75daf8b466c39cSvetoslav Ganov final class SessionHandler extends Handler { 520002df26c21a78353d33705bb076ac61a09400095Philip P. Moltmann static final int MSG_ADD_FIRST_BATCH_FAKE_PRINTERS = 1; 521002df26c21a78353d33705bb076ac61a09400095Philip P. Moltmann static final int MSG_SUPPLY_CUSTOM_PRINTER_ICON = 2; 5221274de1ce4243d6ebb3e12b12b75daf8b466c39cSvetoslav Ganov 5231274de1ce4243d6ebb3e12b12b75daf8b466c39cSvetoslav Ganov public SessionHandler(Looper looper) { 5243bb4d60425207dad4241d0565ff0c4a20dca119dSvetoslav Ganov super(looper); 5251274de1ce4243d6ebb3e12b12b75daf8b466c39cSvetoslav Ganov } 5261274de1ce4243d6ebb3e12b12b75daf8b466c39cSvetoslav Ganov 5271274de1ce4243d6ebb3e12b12b75daf8b466c39cSvetoslav Ganov @Override 5281274de1ce4243d6ebb3e12b12b75daf8b466c39cSvetoslav Ganov public void handleMessage(Message message) { 5291274de1ce4243d6ebb3e12b12b75daf8b466c39cSvetoslav Ganov switch (message.what) { 5307ae2878f5219d55e842348eb44ffb5070b9d708dSvetoslav Ganov case MSG_ADD_FIRST_BATCH_FAKE_PRINTERS: { 5317ae2878f5219d55e842348eb44ffb5070b9d708dSvetoslav Ganov addFirstBatchFakePrinters(); 5321274de1ce4243d6ebb3e12b12b75daf8b466c39cSvetoslav Ganov } break; 533f369a120cc6037a0765bb7b4922fbce1c86f1ee2Philip P. Moltmann case MSG_SUPPLY_CUSTOM_PRINTER_ICON: { 534f369a120cc6037a0765bb7b4922fbce1c86f1ee2Philip P. Moltmann SomeArgs args = (SomeArgs) message.obj; 535f369a120cc6037a0765bb7b4922fbce1c86f1ee2Philip P. Moltmann CancellationSignal cancellationSignal = (CancellationSignal) args.arg1; 536f369a120cc6037a0765bb7b4922fbce1c86f1ee2Philip P. Moltmann CustomPrinterIconCallback callbacks = (CustomPrinterIconCallback) args.arg2; 537f369a120cc6037a0765bb7b4922fbce1c86f1ee2Philip P. Moltmann args.recycle(); 538f369a120cc6037a0765bb7b4922fbce1c86f1ee2Philip P. Moltmann 539f369a120cc6037a0765bb7b4922fbce1c86f1ee2Philip P. Moltmann if (!cancellationSignal.isCanceled()) { 540f369a120cc6037a0765bb7b4922fbce1c86f1ee2Philip P. Moltmann callbacks.onCustomPrinterIconLoaded(Icon.createWithBitmap( 541f369a120cc6037a0765bb7b4922fbce1c86f1ee2Philip P. Moltmann BitmapFactory.decodeResource(getResources(), 542f369a120cc6037a0765bb7b4922fbce1c86f1ee2Philip P. Moltmann R.raw.red_printer))); 543f369a120cc6037a0765bb7b4922fbce1c86f1ee2Philip P. Moltmann } 544f369a120cc6037a0765bb7b4922fbce1c86f1ee2Philip P. Moltmann } break; 5451274de1ce4243d6ebb3e12b12b75daf8b466c39cSvetoslav Ganov } 5461274de1ce4243d6ebb3e12b12b75daf8b466c39cSvetoslav Ganov } 5471274de1ce4243d6ebb3e12b12b75daf8b466c39cSvetoslav Ganov } 5481274de1ce4243d6ebb3e12b12b75daf8b466c39cSvetoslav Ganov } 5490fb6959ad364ee84e83c435d671228fb365f2084Svetoslav} 550