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 190fb6959ad364ee84e83c435d671228fb365f2084Svetoslavimport android.content.Intent; 200fb6959ad364ee84e83c435d671228fb365f2084Svetoslavimport android.net.Uri; 210fb6959ad364ee84e83c435d671228fb365f2084Svetoslavimport android.os.AsyncTask; 220fb6959ad364ee84e83c435d671228fb365f2084Svetoslavimport android.os.Handler; 230fb6959ad364ee84e83c435d671228fb365f2084Svetoslavimport android.os.Looper; 240fb6959ad364ee84e83c435d671228fb365f2084Svetoslavimport android.os.Message; 253bb4d60425207dad4241d0565ff0c4a20dca119dSvetoslav Ganovimport android.os.ParcelFileDescriptor; 260fb6959ad364ee84e83c435d671228fb365f2084Svetoslavimport android.print.PrintAttributes; 270fb6959ad364ee84e83c435d671228fb365f2084Svetoslavimport android.print.PrintAttributes.Margins; 28c6c630d5c2b70440d433aa19bcf50c115d9cf39aSvetoslav Ganovimport android.print.PrintAttributes.MediaSize; 290fb6959ad364ee84e83c435d671228fb365f2084Svetoslavimport android.print.PrintAttributes.Resolution; 30f11598332008fd706ed17be975a0ff73ba7f6a21Svetoslav Ganovimport android.print.PrintJobId; 310fb6959ad364ee84e83c435d671228fb365f2084Svetoslavimport android.print.PrintJobInfo; 321274de1ce4243d6ebb3e12b12b75daf8b466c39cSvetoslav Ganovimport android.print.PrinterCapabilitiesInfo; 330fb6959ad364ee84e83c435d671228fb365f2084Svetoslavimport android.print.PrinterId; 340fb6959ad364ee84e83c435d671228fb365f2084Svetoslavimport android.print.PrinterInfo; 350fb6959ad364ee84e83c435d671228fb365f2084Svetoslavimport android.printservice.PrintJob; 360fb6959ad364ee84e83c435d671228fb365f2084Svetoslavimport android.printservice.PrintService; 371274de1ce4243d6ebb3e12b12b75daf8b466c39cSvetoslav Ganovimport android.printservice.PrinterDiscoverySession; 38f11598332008fd706ed17be975a0ff73ba7f6a21Svetoslav Ganovimport android.util.ArrayMap; 390fb6959ad364ee84e83c435d671228fb365f2084Svetoslavimport android.util.Log; 40ecaec06dfbaa011676c37f5f6170b984da5c6a5eSvetoslav Ganov 410fb6959ad364ee84e83c435d671228fb365f2084Svetoslavimport java.io.BufferedInputStream; 420fb6959ad364ee84e83c435d671228fb365f2084Svetoslavimport java.io.BufferedOutputStream; 430fb6959ad364ee84e83c435d671228fb365f2084Svetoslavimport java.io.File; 440fb6959ad364ee84e83c435d671228fb365f2084Svetoslavimport java.io.FileInputStream; 450fb6959ad364ee84e83c435d671228fb365f2084Svetoslavimport java.io.FileOutputStream; 460fb6959ad364ee84e83c435d671228fb365f2084Svetoslavimport java.io.IOException; 470fb6959ad364ee84e83c435d671228fb365f2084Svetoslavimport java.io.InputStream; 480fb6959ad364ee84e83c435d671228fb365f2084Svetoslavimport java.io.OutputStream; 490fb6959ad364ee84e83c435d671228fb365f2084Svetoslavimport java.util.ArrayList; 500fb6959ad364ee84e83c435d671228fb365f2084Svetoslavimport java.util.List; 51f11598332008fd706ed17be975a0ff73ba7f6a21Svetoslav Ganovimport java.util.Map; 520fb6959ad364ee84e83c435d671228fb365f2084Svetoslav 530fb6959ad364ee84e83c435d671228fb365f2084Svetoslavpublic class MyPrintService extends PrintService { 540fb6959ad364ee84e83c435d671228fb365f2084Svetoslav 558dea95de32a43b110a10a445a6dfd8fba4232073Svetoslav Ganov private static final String LOG_TAG = "MyPrintService"; 560fb6959ad364ee84e83c435d671228fb365f2084Svetoslav 57482f8b86361308b90af05c2a3b16eebb0e778882Svetoslav Ganov private static final long STANDARD_DELAY_MILLIS = 10000000; 586fc52023a04fe45b6f59212fc716cbbcf76f35fcSvetoslav 596fc52023a04fe45b6f59212fc716cbbcf76f35fcSvetoslav static final String INTENT_EXTRA_ACTION_TYPE = "INTENT_EXTRA_ACTION_TYPE"; 606fc52023a04fe45b6f59212fc716cbbcf76f35fcSvetoslav static final String INTENT_EXTRA_PRINT_JOB_ID = "INTENT_EXTRA_PRINT_JOB_ID"; 616fc52023a04fe45b6f59212fc716cbbcf76f35fcSvetoslav 626fc52023a04fe45b6f59212fc716cbbcf76f35fcSvetoslav static final int ACTION_TYPE_ON_PRINT_JOB_PENDING = 1; 636fc52023a04fe45b6f59212fc716cbbcf76f35fcSvetoslav static final int ACTION_TYPE_ON_REQUEST_CANCEL_PRINT_JOB = 2; 646fc52023a04fe45b6f59212fc716cbbcf76f35fcSvetoslav 656fc52023a04fe45b6f59212fc716cbbcf76f35fcSvetoslav private static final Object sLock = new Object(); 666fc52023a04fe45b6f59212fc716cbbcf76f35fcSvetoslav 676fc52023a04fe45b6f59212fc716cbbcf76f35fcSvetoslav private static MyPrintService sInstance; 686fc52023a04fe45b6f59212fc716cbbcf76f35fcSvetoslav 690fb6959ad364ee84e83c435d671228fb365f2084Svetoslav private Handler mHandler; 700fb6959ad364ee84e83c435d671228fb365f2084Svetoslav 713bb4d60425207dad4241d0565ff0c4a20dca119dSvetoslav Ganov private AsyncTask<ParcelFileDescriptor, Void, Void> mFakePrintTask; 728dea95de32a43b110a10a445a6dfd8fba4232073Svetoslav Ganov 737ae2878f5219d55e842348eb44ffb5070b9d708dSvetoslav Ganov private FakePrinterDiscoverySession mSession; 746fc52023a04fe45b6f59212fc716cbbcf76f35fcSvetoslav 75f11598332008fd706ed17be975a0ff73ba7f6a21Svetoslav Ganov private final Map<PrintJobId, PrintJob> mProcessedPrintJobs = 76f11598332008fd706ed17be975a0ff73ba7f6a21Svetoslav Ganov new ArrayMap<PrintJobId, PrintJob>(); 776fc52023a04fe45b6f59212fc716cbbcf76f35fcSvetoslav 786fc52023a04fe45b6f59212fc716cbbcf76f35fcSvetoslav public static MyPrintService peekInstance() { 796fc52023a04fe45b6f59212fc716cbbcf76f35fcSvetoslav synchronized (sLock) { 806fc52023a04fe45b6f59212fc716cbbcf76f35fcSvetoslav return sInstance; 816fc52023a04fe45b6f59212fc716cbbcf76f35fcSvetoslav } 826fc52023a04fe45b6f59212fc716cbbcf76f35fcSvetoslav } 831274de1ce4243d6ebb3e12b12b75daf8b466c39cSvetoslav Ganov 84282209e42c32d712fd5685f283047d84e813297eSvetoslav Ganov @Override 850fb6959ad364ee84e83c435d671228fb365f2084Svetoslav protected void onConnected() { 860fb6959ad364ee84e83c435d671228fb365f2084Svetoslav Log.i(LOG_TAG, "#onConnected()"); 871274de1ce4243d6ebb3e12b12b75daf8b466c39cSvetoslav Ganov mHandler = new MyHandler(getMainLooper()); 886fc52023a04fe45b6f59212fc716cbbcf76f35fcSvetoslav synchronized (sLock) { 896fc52023a04fe45b6f59212fc716cbbcf76f35fcSvetoslav sInstance = this; 906fc52023a04fe45b6f59212fc716cbbcf76f35fcSvetoslav } 910fb6959ad364ee84e83c435d671228fb365f2084Svetoslav } 920fb6959ad364ee84e83c435d671228fb365f2084Svetoslav 930fb6959ad364ee84e83c435d671228fb365f2084Svetoslav @Override 940fb6959ad364ee84e83c435d671228fb365f2084Svetoslav protected void onDisconnected() { 950fb6959ad364ee84e83c435d671228fb365f2084Svetoslav Log.i(LOG_TAG, "#onDisconnected()"); 961274de1ce4243d6ebb3e12b12b75daf8b466c39cSvetoslav Ganov if (mSession != null) { 971274de1ce4243d6ebb3e12b12b75daf8b466c39cSvetoslav Ganov mSession.cancellAddingFakePrinters(); 981274de1ce4243d6ebb3e12b12b75daf8b466c39cSvetoslav Ganov } 996fc52023a04fe45b6f59212fc716cbbcf76f35fcSvetoslav synchronized (sLock) { 1006fc52023a04fe45b6f59212fc716cbbcf76f35fcSvetoslav sInstance = null; 1016fc52023a04fe45b6f59212fc716cbbcf76f35fcSvetoslav } 1020fb6959ad364ee84e83c435d671228fb365f2084Svetoslav } 1030fb6959ad364ee84e83c435d671228fb365f2084Svetoslav 1040fb6959ad364ee84e83c435d671228fb365f2084Svetoslav @Override 1051274de1ce4243d6ebb3e12b12b75daf8b466c39cSvetoslav Ganov protected PrinterDiscoverySession onCreatePrinterDiscoverySession() { 1067ae2878f5219d55e842348eb44ffb5070b9d708dSvetoslav Ganov Log.i(LOG_TAG, "#onCreatePrinterDiscoverySession()"); 1077ae2878f5219d55e842348eb44ffb5070b9d708dSvetoslav Ganov return new FakePrinterDiscoverySession(); 1080fb6959ad364ee84e83c435d671228fb365f2084Svetoslav } 1090fb6959ad364ee84e83c435d671228fb365f2084Svetoslav 1100fb6959ad364ee84e83c435d671228fb365f2084Svetoslav @Override 1116fc52023a04fe45b6f59212fc716cbbcf76f35fcSvetoslav protected void onRequestCancelPrintJob(final PrintJob printJob) { 1126fc52023a04fe45b6f59212fc716cbbcf76f35fcSvetoslav Log.i(LOG_TAG, "#onRequestCancelPrintJob()"); 1136fc52023a04fe45b6f59212fc716cbbcf76f35fcSvetoslav mProcessedPrintJobs.put(printJob.getId(), printJob); 1146fc52023a04fe45b6f59212fc716cbbcf76f35fcSvetoslav Intent intent = new Intent(this, MyDialogActivity.class); 1156fc52023a04fe45b6f59212fc716cbbcf76f35fcSvetoslav intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK); 1166fc52023a04fe45b6f59212fc716cbbcf76f35fcSvetoslav intent.putExtra(INTENT_EXTRA_PRINT_JOB_ID, printJob.getId()); 1176fc52023a04fe45b6f59212fc716cbbcf76f35fcSvetoslav intent.putExtra(INTENT_EXTRA_ACTION_TYPE, ACTION_TYPE_ON_REQUEST_CANCEL_PRINT_JOB); 1186fc52023a04fe45b6f59212fc716cbbcf76f35fcSvetoslav startActivity(intent); 1198dea95de32a43b110a10a445a6dfd8fba4232073Svetoslav Ganov } 1208dea95de32a43b110a10a445a6dfd8fba4232073Svetoslav Ganov 1218dea95de32a43b110a10a445a6dfd8fba4232073Svetoslav Ganov @Override 1220fb6959ad364ee84e83c435d671228fb365f2084Svetoslav public void onPrintJobQueued(final PrintJob printJob) { 123c6c630d5c2b70440d433aa19bcf50c115d9cf39aSvetoslav Ganov Log.i(LOG_TAG, "#onPrintJobQueued()"); 1246fc52023a04fe45b6f59212fc716cbbcf76f35fcSvetoslav mProcessedPrintJobs.put(printJob.getId(), printJob); 1253bb4d60425207dad4241d0565ff0c4a20dca119dSvetoslav Ganov if (printJob.isQueued()) { 1263bb4d60425207dad4241d0565ff0c4a20dca119dSvetoslav Ganov printJob.start(); 1273bb4d60425207dad4241d0565ff0c4a20dca119dSvetoslav Ganov } 1288fa1c1973dd8659e52462103b21a926ee9747351Svetoslav 1296fc52023a04fe45b6f59212fc716cbbcf76f35fcSvetoslav Intent intent = new Intent(this, MyDialogActivity.class); 1306fc52023a04fe45b6f59212fc716cbbcf76f35fcSvetoslav intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK); 1316fc52023a04fe45b6f59212fc716cbbcf76f35fcSvetoslav intent.putExtra(INTENT_EXTRA_PRINT_JOB_ID, printJob.getId()); 1326fc52023a04fe45b6f59212fc716cbbcf76f35fcSvetoslav intent.putExtra(INTENT_EXTRA_ACTION_TYPE, ACTION_TYPE_ON_PRINT_JOB_PENDING); 1336fc52023a04fe45b6f59212fc716cbbcf76f35fcSvetoslav startActivity(intent); 1348dea95de32a43b110a10a445a6dfd8fba4232073Svetoslav Ganov } 1358dea95de32a43b110a10a445a6dfd8fba4232073Svetoslav Ganov 136f11598332008fd706ed17be975a0ff73ba7f6a21Svetoslav Ganov void handleRequestCancelPrintJob(PrintJobId printJobId) { 1376fc52023a04fe45b6f59212fc716cbbcf76f35fcSvetoslav PrintJob printJob = mProcessedPrintJobs.get(printJobId); 1386fc52023a04fe45b6f59212fc716cbbcf76f35fcSvetoslav if (printJob == null) { 1396fc52023a04fe45b6f59212fc716cbbcf76f35fcSvetoslav return; 1406fc52023a04fe45b6f59212fc716cbbcf76f35fcSvetoslav } 1416fc52023a04fe45b6f59212fc716cbbcf76f35fcSvetoslav mProcessedPrintJobs.remove(printJobId); 142482f8b86361308b90af05c2a3b16eebb0e778882Svetoslav Ganov if (printJob.isQueued() || printJob.isStarted() || printJob.isBlocked()) { 1436fc52023a04fe45b6f59212fc716cbbcf76f35fcSvetoslav mHandler.removeMessages(MyHandler.MSG_HANDLE_DO_PRINT_JOB); 1446fc52023a04fe45b6f59212fc716cbbcf76f35fcSvetoslav mHandler.removeMessages(MyHandler.MSG_HANDLE_FAIL_PRINT_JOB); 1456fc52023a04fe45b6f59212fc716cbbcf76f35fcSvetoslav printJob.cancel(); 1466fc52023a04fe45b6f59212fc716cbbcf76f35fcSvetoslav } 1476fc52023a04fe45b6f59212fc716cbbcf76f35fcSvetoslav } 1486fc52023a04fe45b6f59212fc716cbbcf76f35fcSvetoslav 149f11598332008fd706ed17be975a0ff73ba7f6a21Svetoslav Ganov void handleFailPrintJobDelayed(PrintJobId printJobId) { 1506fc52023a04fe45b6f59212fc716cbbcf76f35fcSvetoslav Message message = mHandler.obtainMessage( 151f11598332008fd706ed17be975a0ff73ba7f6a21Svetoslav Ganov MyHandler.MSG_HANDLE_FAIL_PRINT_JOB, printJobId); 1526fc52023a04fe45b6f59212fc716cbbcf76f35fcSvetoslav mHandler.sendMessageDelayed(message, STANDARD_DELAY_MILLIS); 1536fc52023a04fe45b6f59212fc716cbbcf76f35fcSvetoslav } 1546fc52023a04fe45b6f59212fc716cbbcf76f35fcSvetoslav 155f11598332008fd706ed17be975a0ff73ba7f6a21Svetoslav Ganov void handleFailPrintJob(PrintJobId printJobId) { 1566fc52023a04fe45b6f59212fc716cbbcf76f35fcSvetoslav PrintJob printJob = mProcessedPrintJobs.get(printJobId); 1576fc52023a04fe45b6f59212fc716cbbcf76f35fcSvetoslav if (printJob == null) { 1586fc52023a04fe45b6f59212fc716cbbcf76f35fcSvetoslav return; 1596fc52023a04fe45b6f59212fc716cbbcf76f35fcSvetoslav } 1606fc52023a04fe45b6f59212fc716cbbcf76f35fcSvetoslav mProcessedPrintJobs.remove(printJobId); 1616fc52023a04fe45b6f59212fc716cbbcf76f35fcSvetoslav if (printJob.isQueued() || printJob.isStarted()) { 1626fc52023a04fe45b6f59212fc716cbbcf76f35fcSvetoslav printJob.fail(getString(R.string.fail_reason)); 1636fc52023a04fe45b6f59212fc716cbbcf76f35fcSvetoslav } 1646fc52023a04fe45b6f59212fc716cbbcf76f35fcSvetoslav } 1656fc52023a04fe45b6f59212fc716cbbcf76f35fcSvetoslav 166f11598332008fd706ed17be975a0ff73ba7f6a21Svetoslav Ganov void handleBlockPrintJobDelayed(PrintJobId printJobId) { 1673bb4d60425207dad4241d0565ff0c4a20dca119dSvetoslav Ganov Message message = mHandler.obtainMessage( 168f11598332008fd706ed17be975a0ff73ba7f6a21Svetoslav Ganov MyHandler.MSG_HANDLE_BLOCK_PRINT_JOB, printJobId); 1693bb4d60425207dad4241d0565ff0c4a20dca119dSvetoslav Ganov mHandler.sendMessageDelayed(message, STANDARD_DELAY_MILLIS); 1703bb4d60425207dad4241d0565ff0c4a20dca119dSvetoslav Ganov } 1713bb4d60425207dad4241d0565ff0c4a20dca119dSvetoslav Ganov 172f11598332008fd706ed17be975a0ff73ba7f6a21Svetoslav Ganov void handleBlockPrintJob(PrintJobId printJobId) { 1733bb4d60425207dad4241d0565ff0c4a20dca119dSvetoslav Ganov final PrintJob printJob = mProcessedPrintJobs.get(printJobId); 1743bb4d60425207dad4241d0565ff0c4a20dca119dSvetoslav Ganov if (printJob == null) { 1753bb4d60425207dad4241d0565ff0c4a20dca119dSvetoslav Ganov return; 1763bb4d60425207dad4241d0565ff0c4a20dca119dSvetoslav Ganov } 1773bb4d60425207dad4241d0565ff0c4a20dca119dSvetoslav Ganov 1783bb4d60425207dad4241d0565ff0c4a20dca119dSvetoslav Ganov if (printJob.isStarted()) { 179f11598332008fd706ed17be975a0ff73ba7f6a21Svetoslav Ganov printJob.block("Gimme some rest, dude"); 1803bb4d60425207dad4241d0565ff0c4a20dca119dSvetoslav Ganov } 1813bb4d60425207dad4241d0565ff0c4a20dca119dSvetoslav Ganov } 1823bb4d60425207dad4241d0565ff0c4a20dca119dSvetoslav Ganov 183f11598332008fd706ed17be975a0ff73ba7f6a21Svetoslav Ganov void handleBlockAndDelayedUnblockPrintJob(PrintJobId printJobId) { 1843bb4d60425207dad4241d0565ff0c4a20dca119dSvetoslav Ganov handleBlockPrintJob(printJobId); 1853bb4d60425207dad4241d0565ff0c4a20dca119dSvetoslav Ganov 1863bb4d60425207dad4241d0565ff0c4a20dca119dSvetoslav Ganov Message message = mHandler.obtainMessage( 187f11598332008fd706ed17be975a0ff73ba7f6a21Svetoslav Ganov MyHandler.MSG_HANDLE_UNBLOCK_PRINT_JOB, printJobId); 1883bb4d60425207dad4241d0565ff0c4a20dca119dSvetoslav Ganov mHandler.sendMessageDelayed(message, STANDARD_DELAY_MILLIS); 1893bb4d60425207dad4241d0565ff0c4a20dca119dSvetoslav Ganov } 1903bb4d60425207dad4241d0565ff0c4a20dca119dSvetoslav Ganov 191f11598332008fd706ed17be975a0ff73ba7f6a21Svetoslav Ganov void handleUnblockPrintJob(PrintJobId printJobId) { 1923bb4d60425207dad4241d0565ff0c4a20dca119dSvetoslav Ganov final PrintJob printJob = mProcessedPrintJobs.get(printJobId); 1933bb4d60425207dad4241d0565ff0c4a20dca119dSvetoslav Ganov if (printJob == null) { 1943bb4d60425207dad4241d0565ff0c4a20dca119dSvetoslav Ganov return; 1953bb4d60425207dad4241d0565ff0c4a20dca119dSvetoslav Ganov } 1963bb4d60425207dad4241d0565ff0c4a20dca119dSvetoslav Ganov 1973bb4d60425207dad4241d0565ff0c4a20dca119dSvetoslav Ganov if (printJob.isBlocked()) { 1983bb4d60425207dad4241d0565ff0c4a20dca119dSvetoslav Ganov printJob.start(); 1993bb4d60425207dad4241d0565ff0c4a20dca119dSvetoslav Ganov } 2003bb4d60425207dad4241d0565ff0c4a20dca119dSvetoslav Ganov } 2013bb4d60425207dad4241d0565ff0c4a20dca119dSvetoslav Ganov 202f11598332008fd706ed17be975a0ff73ba7f6a21Svetoslav Ganov void handleQueuedPrintJobDelayed(PrintJobId printJobId) { 2033bb4d60425207dad4241d0565ff0c4a20dca119dSvetoslav Ganov final PrintJob printJob = mProcessedPrintJobs.get(printJobId); 2043bb4d60425207dad4241d0565ff0c4a20dca119dSvetoslav Ganov if (printJob == null) { 2053bb4d60425207dad4241d0565ff0c4a20dca119dSvetoslav Ganov return; 2063bb4d60425207dad4241d0565ff0c4a20dca119dSvetoslav Ganov } 2073bb4d60425207dad4241d0565ff0c4a20dca119dSvetoslav Ganov 2083bb4d60425207dad4241d0565ff0c4a20dca119dSvetoslav Ganov if (printJob.isQueued()) { 2093bb4d60425207dad4241d0565ff0c4a20dca119dSvetoslav Ganov printJob.start(); 2103bb4d60425207dad4241d0565ff0c4a20dca119dSvetoslav Ganov } 2116fc52023a04fe45b6f59212fc716cbbcf76f35fcSvetoslav Message message = mHandler.obtainMessage( 212f11598332008fd706ed17be975a0ff73ba7f6a21Svetoslav Ganov MyHandler.MSG_HANDLE_DO_PRINT_JOB, printJobId); 2136fc52023a04fe45b6f59212fc716cbbcf76f35fcSvetoslav mHandler.sendMessageDelayed(message, STANDARD_DELAY_MILLIS); 2146fc52023a04fe45b6f59212fc716cbbcf76f35fcSvetoslav } 2156fc52023a04fe45b6f59212fc716cbbcf76f35fcSvetoslav 216f11598332008fd706ed17be975a0ff73ba7f6a21Svetoslav Ganov void handleQueuedPrintJob(PrintJobId printJobId) { 2176fc52023a04fe45b6f59212fc716cbbcf76f35fcSvetoslav final PrintJob printJob = mProcessedPrintJobs.get(printJobId); 2186fc52023a04fe45b6f59212fc716cbbcf76f35fcSvetoslav if (printJob == null) { 2196fc52023a04fe45b6f59212fc716cbbcf76f35fcSvetoslav return; 2206fc52023a04fe45b6f59212fc716cbbcf76f35fcSvetoslav } 2216fc52023a04fe45b6f59212fc716cbbcf76f35fcSvetoslav 2228dea95de32a43b110a10a445a6dfd8fba4232073Svetoslav Ganov if (printJob.isQueued()) { 2238dea95de32a43b110a10a445a6dfd8fba4232073Svetoslav Ganov printJob.start(); 2240fb6959ad364ee84e83c435d671228fb365f2084Svetoslav } 2258dea95de32a43b110a10a445a6dfd8fba4232073Svetoslav Ganov 2268dea95de32a43b110a10a445a6dfd8fba4232073Svetoslav Ganov final PrintJobInfo info = printJob.getInfo(); 2278dea95de32a43b110a10a445a6dfd8fba4232073Svetoslav Ganov final File file = new File(getFilesDir(), info.getLabel() + ".pdf"); 2288dea95de32a43b110a10a445a6dfd8fba4232073Svetoslav Ganov 2293bb4d60425207dad4241d0565ff0c4a20dca119dSvetoslav Ganov mFakePrintTask = new AsyncTask<ParcelFileDescriptor, Void, Void>() { 2300fb6959ad364ee84e83c435d671228fb365f2084Svetoslav @Override 2313bb4d60425207dad4241d0565ff0c4a20dca119dSvetoslav Ganov protected Void doInBackground(ParcelFileDescriptor... params) { 2323bb4d60425207dad4241d0565ff0c4a20dca119dSvetoslav Ganov InputStream in = new BufferedInputStream(new FileInputStream( 2333bb4d60425207dad4241d0565ff0c4a20dca119dSvetoslav Ganov params[0].getFileDescriptor())); 2340fb6959ad364ee84e83c435d671228fb365f2084Svetoslav OutputStream out = null; 2350fb6959ad364ee84e83c435d671228fb365f2084Svetoslav try { 2360fb6959ad364ee84e83c435d671228fb365f2084Svetoslav out = new BufferedOutputStream(new FileOutputStream(file)); 2370fb6959ad364ee84e83c435d671228fb365f2084Svetoslav final byte[] buffer = new byte[8192]; 2380fb6959ad364ee84e83c435d671228fb365f2084Svetoslav while (true) { 2398dea95de32a43b110a10a445a6dfd8fba4232073Svetoslav Ganov if (isCancelled()) { 2408dea95de32a43b110a10a445a6dfd8fba4232073Svetoslav Ganov break; 2418dea95de32a43b110a10a445a6dfd8fba4232073Svetoslav Ganov } 2420fb6959ad364ee84e83c435d671228fb365f2084Svetoslav final int readByteCount = in.read(buffer); 2430fb6959ad364ee84e83c435d671228fb365f2084Svetoslav if (readByteCount < 0) { 2440fb6959ad364ee84e83c435d671228fb365f2084Svetoslav break; 2450fb6959ad364ee84e83c435d671228fb365f2084Svetoslav } 2460fb6959ad364ee84e83c435d671228fb365f2084Svetoslav out.write(buffer, 0, readByteCount); 2470fb6959ad364ee84e83c435d671228fb365f2084Svetoslav } 2480fb6959ad364ee84e83c435d671228fb365f2084Svetoslav } catch (IOException ioe) { 2497ae2878f5219d55e842348eb44ffb5070b9d708dSvetoslav Ganov throw new RuntimeException(ioe); 2500fb6959ad364ee84e83c435d671228fb365f2084Svetoslav } finally { 2513bb4d60425207dad4241d0565ff0c4a20dca119dSvetoslav Ganov if (in != null) { 2523bb4d60425207dad4241d0565ff0c4a20dca119dSvetoslav Ganov try { 2533bb4d60425207dad4241d0565ff0c4a20dca119dSvetoslav Ganov in.close(); 2543bb4d60425207dad4241d0565ff0c4a20dca119dSvetoslav Ganov } catch (IOException ioe) { 2553bb4d60425207dad4241d0565ff0c4a20dca119dSvetoslav Ganov /* ignore */ 2563bb4d60425207dad4241d0565ff0c4a20dca119dSvetoslav Ganov } 2573bb4d60425207dad4241d0565ff0c4a20dca119dSvetoslav Ganov } 2583bb4d60425207dad4241d0565ff0c4a20dca119dSvetoslav Ganov if (out != null) { 2593bb4d60425207dad4241d0565ff0c4a20dca119dSvetoslav Ganov try { 2603bb4d60425207dad4241d0565ff0c4a20dca119dSvetoslav Ganov out.close(); 2613bb4d60425207dad4241d0565ff0c4a20dca119dSvetoslav Ganov } catch (IOException ioe) { 2623bb4d60425207dad4241d0565ff0c4a20dca119dSvetoslav Ganov /* ignore */ 2633bb4d60425207dad4241d0565ff0c4a20dca119dSvetoslav Ganov } 2643bb4d60425207dad4241d0565ff0c4a20dca119dSvetoslav Ganov } 2658dea95de32a43b110a10a445a6dfd8fba4232073Svetoslav Ganov if (isCancelled()) { 2668dea95de32a43b110a10a445a6dfd8fba4232073Svetoslav Ganov file.delete(); 2678dea95de32a43b110a10a445a6dfd8fba4232073Svetoslav Ganov } 2680fb6959ad364ee84e83c435d671228fb365f2084Svetoslav } 2690fb6959ad364ee84e83c435d671228fb365f2084Svetoslav return null; 2700fb6959ad364ee84e83c435d671228fb365f2084Svetoslav } 2710fb6959ad364ee84e83c435d671228fb365f2084Svetoslav 2720fb6959ad364ee84e83c435d671228fb365f2084Svetoslav @Override 2730fb6959ad364ee84e83c435d671228fb365f2084Svetoslav protected void onPostExecute(Void result) { 2748dea95de32a43b110a10a445a6dfd8fba4232073Svetoslav Ganov if (printJob.isStarted()) { 2758dea95de32a43b110a10a445a6dfd8fba4232073Svetoslav Ganov printJob.complete(); 2760fb6959ad364ee84e83c435d671228fb365f2084Svetoslav } 2770fb6959ad364ee84e83c435d671228fb365f2084Svetoslav 2788dea95de32a43b110a10a445a6dfd8fba4232073Svetoslav Ganov file.setReadable(true, false); 279ecaec06dfbaa011676c37f5f6170b984da5c6a5eSvetoslav Ganov 2806fc52023a04fe45b6f59212fc716cbbcf76f35fcSvetoslav // Quick and dirty to show the file - use a content provider instead. 2818dea95de32a43b110a10a445a6dfd8fba4232073Svetoslav Ganov Intent intent = new Intent(Intent.ACTION_VIEW); 2828dea95de32a43b110a10a445a6dfd8fba4232073Svetoslav Ganov intent.setDataAndType(Uri.fromFile(file), "application/pdf"); 2838dea95de32a43b110a10a445a6dfd8fba4232073Svetoslav Ganov intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK); 2848dea95de32a43b110a10a445a6dfd8fba4232073Svetoslav Ganov startActivity(intent, null); 2850fb6959ad364ee84e83c435d671228fb365f2084Svetoslav 2868dea95de32a43b110a10a445a6dfd8fba4232073Svetoslav Ganov mFakePrintTask = null; 2870fb6959ad364ee84e83c435d671228fb365f2084Svetoslav } 2887ae2878f5219d55e842348eb44ffb5070b9d708dSvetoslav Ganov 2897ae2878f5219d55e842348eb44ffb5070b9d708dSvetoslav Ganov @Override 2907ae2878f5219d55e842348eb44ffb5070b9d708dSvetoslav Ganov protected void onCancelled(Void result) { 2917ae2878f5219d55e842348eb44ffb5070b9d708dSvetoslav Ganov if (printJob.isStarted()) { 2927ae2878f5219d55e842348eb44ffb5070b9d708dSvetoslav Ganov printJob.cancel(); 2937ae2878f5219d55e842348eb44ffb5070b9d708dSvetoslav Ganov } 2947ae2878f5219d55e842348eb44ffb5070b9d708dSvetoslav Ganov } 2950fb6959ad364ee84e83c435d671228fb365f2084Svetoslav }; 2967ae2878f5219d55e842348eb44ffb5070b9d708dSvetoslav Ganov mFakePrintTask.executeOnExecutor(AsyncTask.SERIAL_EXECUTOR, 2977ae2878f5219d55e842348eb44ffb5070b9d708dSvetoslav Ganov printJob.getDocument().getData()); 2980fb6959ad364ee84e83c435d671228fb365f2084Svetoslav } 2990fb6959ad364ee84e83c435d671228fb365f2084Svetoslav 3000fb6959ad364ee84e83c435d671228fb365f2084Svetoslav private final class MyHandler extends Handler { 3016fc52023a04fe45b6f59212fc716cbbcf76f35fcSvetoslav public static final int MSG_HANDLE_DO_PRINT_JOB = 1; 3026fc52023a04fe45b6f59212fc716cbbcf76f35fcSvetoslav public static final int MSG_HANDLE_FAIL_PRINT_JOB = 2; 3033bb4d60425207dad4241d0565ff0c4a20dca119dSvetoslav Ganov public static final int MSG_HANDLE_BLOCK_PRINT_JOB = 3; 3043bb4d60425207dad4241d0565ff0c4a20dca119dSvetoslav Ganov public static final int MSG_HANDLE_UNBLOCK_PRINT_JOB = 4; 3050fb6959ad364ee84e83c435d671228fb365f2084Svetoslav 3060fb6959ad364ee84e83c435d671228fb365f2084Svetoslav public MyHandler(Looper looper) { 3073bb4d60425207dad4241d0565ff0c4a20dca119dSvetoslav Ganov super(looper); 3080fb6959ad364ee84e83c435d671228fb365f2084Svetoslav } 3090fb6959ad364ee84e83c435d671228fb365f2084Svetoslav 3100fb6959ad364ee84e83c435d671228fb365f2084Svetoslav @Override 3110fb6959ad364ee84e83c435d671228fb365f2084Svetoslav public void handleMessage(Message message) { 3120fb6959ad364ee84e83c435d671228fb365f2084Svetoslav switch (message.what) { 3136fc52023a04fe45b6f59212fc716cbbcf76f35fcSvetoslav case MSG_HANDLE_DO_PRINT_JOB: { 314f11598332008fd706ed17be975a0ff73ba7f6a21Svetoslav Ganov PrintJobId printJobId = (PrintJobId) message.obj; 3156fc52023a04fe45b6f59212fc716cbbcf76f35fcSvetoslav handleQueuedPrintJob(printJobId); 3166fc52023a04fe45b6f59212fc716cbbcf76f35fcSvetoslav } break; 3176fc52023a04fe45b6f59212fc716cbbcf76f35fcSvetoslav 3186fc52023a04fe45b6f59212fc716cbbcf76f35fcSvetoslav case MSG_HANDLE_FAIL_PRINT_JOB: { 319f11598332008fd706ed17be975a0ff73ba7f6a21Svetoslav Ganov PrintJobId printJobId = (PrintJobId) message.obj; 3206fc52023a04fe45b6f59212fc716cbbcf76f35fcSvetoslav handleFailPrintJob(printJobId); 3218dea95de32a43b110a10a445a6dfd8fba4232073Svetoslav Ganov } break; 3223bb4d60425207dad4241d0565ff0c4a20dca119dSvetoslav Ganov 3233bb4d60425207dad4241d0565ff0c4a20dca119dSvetoslav Ganov case MSG_HANDLE_BLOCK_PRINT_JOB: { 324f11598332008fd706ed17be975a0ff73ba7f6a21Svetoslav Ganov PrintJobId printJobId = (PrintJobId) message.obj; 3253bb4d60425207dad4241d0565ff0c4a20dca119dSvetoslav Ganov handleBlockPrintJob(printJobId); 3263bb4d60425207dad4241d0565ff0c4a20dca119dSvetoslav Ganov } break; 3273bb4d60425207dad4241d0565ff0c4a20dca119dSvetoslav Ganov 3283bb4d60425207dad4241d0565ff0c4a20dca119dSvetoslav Ganov case MSG_HANDLE_UNBLOCK_PRINT_JOB: { 329f11598332008fd706ed17be975a0ff73ba7f6a21Svetoslav Ganov PrintJobId printJobId = (PrintJobId) message.obj; 3303bb4d60425207dad4241d0565ff0c4a20dca119dSvetoslav Ganov handleUnblockPrintJob(printJobId); 3313bb4d60425207dad4241d0565ff0c4a20dca119dSvetoslav Ganov } break; 3320fb6959ad364ee84e83c435d671228fb365f2084Svetoslav } 3330fb6959ad364ee84e83c435d671228fb365f2084Svetoslav } 3340fb6959ad364ee84e83c435d671228fb365f2084Svetoslav } 3351274de1ce4243d6ebb3e12b12b75daf8b466c39cSvetoslav Ganov 3367ae2878f5219d55e842348eb44ffb5070b9d708dSvetoslav Ganov private final class FakePrinterDiscoverySession extends PrinterDiscoverySession { 3371274de1ce4243d6ebb3e12b12b75daf8b466c39cSvetoslav Ganov private final Handler mSesionHandler = new SessionHandler(getMainLooper()); 3381274de1ce4243d6ebb3e12b12b75daf8b466c39cSvetoslav Ganov 3397ae2878f5219d55e842348eb44ffb5070b9d708dSvetoslav Ganov private final List<PrinterInfo> mFakePrinters = new ArrayList<PrinterInfo>(); 3407ae2878f5219d55e842348eb44ffb5070b9d708dSvetoslav Ganov 3417ae2878f5219d55e842348eb44ffb5070b9d708dSvetoslav Ganov public FakePrinterDiscoverySession() { 342e0f2c75acb900962dca7ac7c6a325ee845e22ccaSvetoslav for (int i = 0; i < 10; i++) { 343a3eee78c0e6d279a2c1d91742960549864d17d03Svetoslav Ganov String name = "Printer " + i; 3443bb4d60425207dad4241d0565ff0c4a20dca119dSvetoslav Ganov PrinterInfo printer = new PrinterInfo 345482f8b86361308b90af05c2a3b16eebb0e778882Svetoslav Ganov .Builder(generatePrinterId(name), name, (i % 2 == 1) 3468fa1c1973dd8659e52462103b21a926ee9747351Svetoslav ? PrinterInfo.STATUS_UNAVAILABLE : PrinterInfo.STATUS_IDLE) 347f11598332008fd706ed17be975a0ff73ba7f6a21Svetoslav Ganov .build(); 3487ae2878f5219d55e842348eb44ffb5070b9d708dSvetoslav Ganov mFakePrinters.add(printer); 3497ae2878f5219d55e842348eb44ffb5070b9d708dSvetoslav Ganov } 3507ae2878f5219d55e842348eb44ffb5070b9d708dSvetoslav Ganov } 3517ae2878f5219d55e842348eb44ffb5070b9d708dSvetoslav Ganov 3527ae2878f5219d55e842348eb44ffb5070b9d708dSvetoslav Ganov @Override 3537ae2878f5219d55e842348eb44ffb5070b9d708dSvetoslav Ganov public void onDestroy() { 3547ae2878f5219d55e842348eb44ffb5070b9d708dSvetoslav Ganov Log.i(LOG_TAG, "FakePrinterDiscoverySession#onDestroy()"); 3557ae2878f5219d55e842348eb44ffb5070b9d708dSvetoslav Ganov mSesionHandler.removeMessages(SessionHandler.MSG_ADD_FIRST_BATCH_FAKE_PRINTERS); 3567ae2878f5219d55e842348eb44ffb5070b9d708dSvetoslav Ganov mSesionHandler.removeMessages(SessionHandler.MSG_ADD_SECOND_BATCH_FAKE_PRINTERS); 3571274de1ce4243d6ebb3e12b12b75daf8b466c39cSvetoslav Ganov } 3581274de1ce4243d6ebb3e12b12b75daf8b466c39cSvetoslav Ganov 3591274de1ce4243d6ebb3e12b12b75daf8b466c39cSvetoslav Ganov @Override 3607ae2878f5219d55e842348eb44ffb5070b9d708dSvetoslav Ganov public void onStartPrinterDiscovery(List<PrinterId> priorityList) { 3617ae2878f5219d55e842348eb44ffb5070b9d708dSvetoslav Ganov Log.i(LOG_TAG, "FakePrinterDiscoverySession#onStartPrinterDiscovery()"); 3621274de1ce4243d6ebb3e12b12b75daf8b466c39cSvetoslav Ganov Message message1 = mSesionHandler.obtainMessage( 3637ae2878f5219d55e842348eb44ffb5070b9d708dSvetoslav Ganov SessionHandler.MSG_ADD_FIRST_BATCH_FAKE_PRINTERS, this); 3641274de1ce4243d6ebb3e12b12b75daf8b466c39cSvetoslav Ganov mSesionHandler.sendMessageDelayed(message1, 0); 3651274de1ce4243d6ebb3e12b12b75daf8b466c39cSvetoslav Ganov 3661274de1ce4243d6ebb3e12b12b75daf8b466c39cSvetoslav Ganov Message message2 = mSesionHandler.obtainMessage( 3677ae2878f5219d55e842348eb44ffb5070b9d708dSvetoslav Ganov SessionHandler.MSG_ADD_SECOND_BATCH_FAKE_PRINTERS, this); 3681274de1ce4243d6ebb3e12b12b75daf8b466c39cSvetoslav Ganov mSesionHandler.sendMessageDelayed(message2, 10000); 3691274de1ce4243d6ebb3e12b12b75daf8b466c39cSvetoslav Ganov } 3701274de1ce4243d6ebb3e12b12b75daf8b466c39cSvetoslav Ganov 3711274de1ce4243d6ebb3e12b12b75daf8b466c39cSvetoslav Ganov @Override 3727ae2878f5219d55e842348eb44ffb5070b9d708dSvetoslav Ganov public void onStopPrinterDiscovery() { 3737ae2878f5219d55e842348eb44ffb5070b9d708dSvetoslav Ganov Log.i(LOG_TAG, "FakePrinterDiscoverySession#onStopPrinterDiscovery()"); 3741274de1ce4243d6ebb3e12b12b75daf8b466c39cSvetoslav Ganov cancellAddingFakePrinters(); 3751274de1ce4243d6ebb3e12b12b75daf8b466c39cSvetoslav Ganov } 3761274de1ce4243d6ebb3e12b12b75daf8b466c39cSvetoslav Ganov 3771274de1ce4243d6ebb3e12b12b75daf8b466c39cSvetoslav Ganov @Override 3783bb4d60425207dad4241d0565ff0c4a20dca119dSvetoslav Ganov public void onStartPrinterStateTracking(PrinterId printerId) { 3793bb4d60425207dad4241d0565ff0c4a20dca119dSvetoslav Ganov Log.i(LOG_TAG, "FakePrinterDiscoverySession#onStartPrinterStateTracking()"); 3807ae2878f5219d55e842348eb44ffb5070b9d708dSvetoslav Ganov PrinterInfo printer = findPrinterInfo(printerId); 3817ae2878f5219d55e842348eb44ffb5070b9d708dSvetoslav Ganov if (printer != null) { 3821274de1ce4243d6ebb3e12b12b75daf8b466c39cSvetoslav Ganov PrinterCapabilitiesInfo capabilities = 3831274de1ce4243d6ebb3e12b12b75daf8b466c39cSvetoslav Ganov new PrinterCapabilitiesInfo.Builder(printerId) 384e0f2c75acb900962dca7ac7c6a325ee845e22ccaSvetoslav .setMinMargins(new Margins(200, 200, 200, 200)) 385f3a7b10c0f43acf2fd76b0a52b322b2e2c3572d3Svetoslav .addMediaSize(MediaSize.ISO_A4, true) 386f3a7b10c0f43acf2fd76b0a52b322b2e2c3572d3Svetoslav .addMediaSize(MediaSize.ISO_A5, false) 3871274de1ce4243d6ebb3e12b12b75daf8b466c39cSvetoslav Ganov .addResolution(new Resolution("R1", getString( 388f3a7b10c0f43acf2fd76b0a52b322b2e2c3572d3Svetoslav R.string.resolution_200x200), 200, 200), false) 3891274de1ce4243d6ebb3e12b12b75daf8b466c39cSvetoslav Ganov .addResolution(new Resolution("R2", getString( 390f3a7b10c0f43acf2fd76b0a52b322b2e2c3572d3Svetoslav R.string.resolution_300x300), 300, 300), true) 3911274de1ce4243d6ebb3e12b12b75daf8b466c39cSvetoslav Ganov .setColorModes(PrintAttributes.COLOR_MODE_COLOR 3921274de1ce4243d6ebb3e12b12b75daf8b466c39cSvetoslav Ganov | PrintAttributes.COLOR_MODE_MONOCHROME, 3931274de1ce4243d6ebb3e12b12b75daf8b466c39cSvetoslav Ganov PrintAttributes.COLOR_MODE_MONOCHROME) 394f11598332008fd706ed17be975a0ff73ba7f6a21Svetoslav Ganov .build(); 3951274de1ce4243d6ebb3e12b12b75daf8b466c39cSvetoslav Ganov 3967ae2878f5219d55e842348eb44ffb5070b9d708dSvetoslav Ganov printer = new PrinterInfo.Builder(printer) 3971274de1ce4243d6ebb3e12b12b75daf8b466c39cSvetoslav Ganov .setCapabilities(capabilities) 398f11598332008fd706ed17be975a0ff73ba7f6a21Svetoslav Ganov .build(); 3991274de1ce4243d6ebb3e12b12b75daf8b466c39cSvetoslav Ganov 4001274de1ce4243d6ebb3e12b12b75daf8b466c39cSvetoslav Ganov List<PrinterInfo> printers = new ArrayList<PrinterInfo>(); 4011274de1ce4243d6ebb3e12b12b75daf8b466c39cSvetoslav Ganov printers.add(printer); 402f3a7b10c0f43acf2fd76b0a52b322b2e2c3572d3Svetoslav addPrinters(printers); 4031274de1ce4243d6ebb3e12b12b75daf8b466c39cSvetoslav Ganov } 4041274de1ce4243d6ebb3e12b12b75daf8b466c39cSvetoslav Ganov } 4051274de1ce4243d6ebb3e12b12b75daf8b466c39cSvetoslav Ganov 4063bb4d60425207dad4241d0565ff0c4a20dca119dSvetoslav Ganov @Override 4073bb4d60425207dad4241d0565ff0c4a20dca119dSvetoslav Ganov public void onValidatePrinters(List<PrinterId> printerIds) { 4083bb4d60425207dad4241d0565ff0c4a20dca119dSvetoslav Ganov Log.i(LOG_TAG, "FakePrinterDiscoverySession#onValidatePrinters()"); 4093bb4d60425207dad4241d0565ff0c4a20dca119dSvetoslav Ganov } 4103bb4d60425207dad4241d0565ff0c4a20dca119dSvetoslav Ganov 4113bb4d60425207dad4241d0565ff0c4a20dca119dSvetoslav Ganov @Override 4123bb4d60425207dad4241d0565ff0c4a20dca119dSvetoslav Ganov public void onStopPrinterStateTracking(PrinterId printerId) { 4133bb4d60425207dad4241d0565ff0c4a20dca119dSvetoslav Ganov Log.i(LOG_TAG, "FakePrinterDiscoverySession#onStopPrinterStateTracking()"); 4143bb4d60425207dad4241d0565ff0c4a20dca119dSvetoslav Ganov } 4153bb4d60425207dad4241d0565ff0c4a20dca119dSvetoslav Ganov 4167ae2878f5219d55e842348eb44ffb5070b9d708dSvetoslav Ganov private void addFirstBatchFakePrinters() { 417482f8b86361308b90af05c2a3b16eebb0e778882Svetoslav Ganov List<PrinterInfo> printers = mFakePrinters.subList(0, mFakePrinters.size() / 2); 4187ae2878f5219d55e842348eb44ffb5070b9d708dSvetoslav Ganov addPrinters(printers); 4197ae2878f5219d55e842348eb44ffb5070b9d708dSvetoslav Ganov } 4207ae2878f5219d55e842348eb44ffb5070b9d708dSvetoslav Ganov 4217ae2878f5219d55e842348eb44ffb5070b9d708dSvetoslav Ganov private void addSecondBatchFakePrinters() { 4228fa1c1973dd8659e52462103b21a926ee9747351Svetoslav List<PrinterInfo> printers = mFakePrinters.subList(0, mFakePrinters.size() / 2 4238fa1c1973dd8659e52462103b21a926ee9747351Svetoslav /* mFakePrinters.size() / 2, mFakePrinters.size()*/); 4248fa1c1973dd8659e52462103b21a926ee9747351Svetoslav final int printerCount = mFakePrinters.size(); 4258fa1c1973dd8659e52462103b21a926ee9747351Svetoslav for (int i = printerCount - 1; i >= 0; i--) { 4268fa1c1973dd8659e52462103b21a926ee9747351Svetoslav PrinterInfo printer = new PrinterInfo.Builder(mFakePrinters.get(i)) 4278fa1c1973dd8659e52462103b21a926ee9747351Svetoslav .setStatus(PrinterInfo.STATUS_UNAVAILABLE).build(); 4288fa1c1973dd8659e52462103b21a926ee9747351Svetoslav printers.add(printer); 4298fa1c1973dd8659e52462103b21a926ee9747351Svetoslav } 4308fa1c1973dd8659e52462103b21a926ee9747351Svetoslav addPrinters(printers); 4311274de1ce4243d6ebb3e12b12b75daf8b466c39cSvetoslav Ganov } 4321274de1ce4243d6ebb3e12b12b75daf8b466c39cSvetoslav Ganov 4337ae2878f5219d55e842348eb44ffb5070b9d708dSvetoslav Ganov private PrinterInfo findPrinterInfo(PrinterId printerId) { 4347ae2878f5219d55e842348eb44ffb5070b9d708dSvetoslav Ganov List<PrinterInfo> printers = getPrinters(); 4357ae2878f5219d55e842348eb44ffb5070b9d708dSvetoslav Ganov final int printerCount = getPrinters().size(); 4367ae2878f5219d55e842348eb44ffb5070b9d708dSvetoslav Ganov for (int i = 0; i < printerCount; i++) { 4377ae2878f5219d55e842348eb44ffb5070b9d708dSvetoslav Ganov PrinterInfo printer = printers.get(i); 4387ae2878f5219d55e842348eb44ffb5070b9d708dSvetoslav Ganov if (printer.getId().equals(printerId)) { 4397ae2878f5219d55e842348eb44ffb5070b9d708dSvetoslav Ganov return printer; 4407ae2878f5219d55e842348eb44ffb5070b9d708dSvetoslav Ganov } 4417ae2878f5219d55e842348eb44ffb5070b9d708dSvetoslav Ganov } 4427ae2878f5219d55e842348eb44ffb5070b9d708dSvetoslav Ganov return null; 4431274de1ce4243d6ebb3e12b12b75daf8b466c39cSvetoslav Ganov } 4441274de1ce4243d6ebb3e12b12b75daf8b466c39cSvetoslav Ganov 4451274de1ce4243d6ebb3e12b12b75daf8b466c39cSvetoslav Ganov private void cancellAddingFakePrinters() { 4467ae2878f5219d55e842348eb44ffb5070b9d708dSvetoslav Ganov mSesionHandler.removeMessages(SessionHandler.MSG_ADD_FIRST_BATCH_FAKE_PRINTERS); 4477ae2878f5219d55e842348eb44ffb5070b9d708dSvetoslav Ganov mSesionHandler.removeMessages(SessionHandler.MSG_ADD_SECOND_BATCH_FAKE_PRINTERS); 4481274de1ce4243d6ebb3e12b12b75daf8b466c39cSvetoslav Ganov } 4491274de1ce4243d6ebb3e12b12b75daf8b466c39cSvetoslav Ganov 4501274de1ce4243d6ebb3e12b12b75daf8b466c39cSvetoslav Ganov final class SessionHandler extends Handler { 4517ae2878f5219d55e842348eb44ffb5070b9d708dSvetoslav Ganov public static final int MSG_ADD_FIRST_BATCH_FAKE_PRINTERS = 1; 4527ae2878f5219d55e842348eb44ffb5070b9d708dSvetoslav Ganov public static final int MSG_ADD_SECOND_BATCH_FAKE_PRINTERS = 2; 4531274de1ce4243d6ebb3e12b12b75daf8b466c39cSvetoslav Ganov 4541274de1ce4243d6ebb3e12b12b75daf8b466c39cSvetoslav Ganov public SessionHandler(Looper looper) { 4553bb4d60425207dad4241d0565ff0c4a20dca119dSvetoslav Ganov super(looper); 4561274de1ce4243d6ebb3e12b12b75daf8b466c39cSvetoslav Ganov } 4571274de1ce4243d6ebb3e12b12b75daf8b466c39cSvetoslav Ganov 4581274de1ce4243d6ebb3e12b12b75daf8b466c39cSvetoslav Ganov @Override 4591274de1ce4243d6ebb3e12b12b75daf8b466c39cSvetoslav Ganov public void handleMessage(Message message) { 4601274de1ce4243d6ebb3e12b12b75daf8b466c39cSvetoslav Ganov switch (message.what) { 4617ae2878f5219d55e842348eb44ffb5070b9d708dSvetoslav Ganov case MSG_ADD_FIRST_BATCH_FAKE_PRINTERS: { 4627ae2878f5219d55e842348eb44ffb5070b9d708dSvetoslav Ganov addFirstBatchFakePrinters(); 4631274de1ce4243d6ebb3e12b12b75daf8b466c39cSvetoslav Ganov } break; 4641274de1ce4243d6ebb3e12b12b75daf8b466c39cSvetoslav Ganov 4657ae2878f5219d55e842348eb44ffb5070b9d708dSvetoslav Ganov case MSG_ADD_SECOND_BATCH_FAKE_PRINTERS: { 4667ae2878f5219d55e842348eb44ffb5070b9d708dSvetoslav Ganov addSecondBatchFakePrinters(); 4671274de1ce4243d6ebb3e12b12b75daf8b466c39cSvetoslav Ganov } break; 4681274de1ce4243d6ebb3e12b12b75daf8b466c39cSvetoslav Ganov } 4691274de1ce4243d6ebb3e12b12b75daf8b466c39cSvetoslav Ganov } 4701274de1ce4243d6ebb3e12b12b75daf8b466c39cSvetoslav Ganov } 4711274de1ce4243d6ebb3e12b12b75daf8b466c39cSvetoslav Ganov } 4720fb6959ad364ee84e83c435d671228fb365f2084Svetoslav} 473