MyPrintService.java revision f3a7b10c0f43acf2fd76b0a52b322b2e2c3572d3
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;
300fb6959ad364ee84e83c435d671228fb365f2084Svetoslavimport android.print.PrintJobInfo;
311274de1ce4243d6ebb3e12b12b75daf8b466c39cSvetoslav Ganovimport android.print.PrinterCapabilitiesInfo;
320fb6959ad364ee84e83c435d671228fb365f2084Svetoslavimport android.print.PrinterId;
330fb6959ad364ee84e83c435d671228fb365f2084Svetoslavimport android.print.PrinterInfo;
340fb6959ad364ee84e83c435d671228fb365f2084Svetoslavimport android.printservice.PrintJob;
350fb6959ad364ee84e83c435d671228fb365f2084Svetoslavimport android.printservice.PrintService;
361274de1ce4243d6ebb3e12b12b75daf8b466c39cSvetoslav Ganovimport android.printservice.PrinterDiscoverySession;
370fb6959ad364ee84e83c435d671228fb365f2084Svetoslavimport android.util.Log;
386fc52023a04fe45b6f59212fc716cbbcf76f35fcSvetoslavimport android.util.SparseArray;
39ecaec06dfbaa011676c37f5f6170b984da5c6a5eSvetoslav Ganov
400fb6959ad364ee84e83c435d671228fb365f2084Svetoslavimport java.io.BufferedInputStream;
410fb6959ad364ee84e83c435d671228fb365f2084Svetoslavimport java.io.BufferedOutputStream;
420fb6959ad364ee84e83c435d671228fb365f2084Svetoslavimport java.io.File;
430fb6959ad364ee84e83c435d671228fb365f2084Svetoslavimport java.io.FileInputStream;
440fb6959ad364ee84e83c435d671228fb365f2084Svetoslavimport java.io.FileOutputStream;
450fb6959ad364ee84e83c435d671228fb365f2084Svetoslavimport java.io.IOException;
460fb6959ad364ee84e83c435d671228fb365f2084Svetoslavimport java.io.InputStream;
470fb6959ad364ee84e83c435d671228fb365f2084Svetoslavimport java.io.OutputStream;
480fb6959ad364ee84e83c435d671228fb365f2084Svetoslavimport java.util.ArrayList;
490fb6959ad364ee84e83c435d671228fb365f2084Svetoslavimport java.util.List;
500fb6959ad364ee84e83c435d671228fb365f2084Svetoslav
510fb6959ad364ee84e83c435d671228fb365f2084Svetoslavpublic class MyPrintService extends PrintService {
520fb6959ad364ee84e83c435d671228fb365f2084Svetoslav
538dea95de32a43b110a10a445a6dfd8fba4232073Svetoslav Ganov    private static final String LOG_TAG = "MyPrintService";
540fb6959ad364ee84e83c435d671228fb365f2084Svetoslav
556fc52023a04fe45b6f59212fc716cbbcf76f35fcSvetoslav    private static final long STANDARD_DELAY_MILLIS = 10000;
566fc52023a04fe45b6f59212fc716cbbcf76f35fcSvetoslav
576fc52023a04fe45b6f59212fc716cbbcf76f35fcSvetoslav    static final String INTENT_EXTRA_ACTION_TYPE = "INTENT_EXTRA_ACTION_TYPE";
586fc52023a04fe45b6f59212fc716cbbcf76f35fcSvetoslav    static final String INTENT_EXTRA_PRINT_JOB_ID = "INTENT_EXTRA_PRINT_JOB_ID";
596fc52023a04fe45b6f59212fc716cbbcf76f35fcSvetoslav
606fc52023a04fe45b6f59212fc716cbbcf76f35fcSvetoslav    static final int ACTION_TYPE_ON_PRINT_JOB_PENDING = 1;
616fc52023a04fe45b6f59212fc716cbbcf76f35fcSvetoslav    static final int ACTION_TYPE_ON_REQUEST_CANCEL_PRINT_JOB = 2;
626fc52023a04fe45b6f59212fc716cbbcf76f35fcSvetoslav
636fc52023a04fe45b6f59212fc716cbbcf76f35fcSvetoslav    private static final Object sLock = new Object();
646fc52023a04fe45b6f59212fc716cbbcf76f35fcSvetoslav
656fc52023a04fe45b6f59212fc716cbbcf76f35fcSvetoslav    private static MyPrintService sInstance;
666fc52023a04fe45b6f59212fc716cbbcf76f35fcSvetoslav
670fb6959ad364ee84e83c435d671228fb365f2084Svetoslav    private Handler mHandler;
680fb6959ad364ee84e83c435d671228fb365f2084Svetoslav
693bb4d60425207dad4241d0565ff0c4a20dca119dSvetoslav Ganov    private AsyncTask<ParcelFileDescriptor, Void, Void> mFakePrintTask;
708dea95de32a43b110a10a445a6dfd8fba4232073Svetoslav Ganov
717ae2878f5219d55e842348eb44ffb5070b9d708dSvetoslav Ganov    private FakePrinterDiscoverySession mSession;
726fc52023a04fe45b6f59212fc716cbbcf76f35fcSvetoslav
736fc52023a04fe45b6f59212fc716cbbcf76f35fcSvetoslav    private final SparseArray<PrintJob> mProcessedPrintJobs = new SparseArray<PrintJob>();
746fc52023a04fe45b6f59212fc716cbbcf76f35fcSvetoslav
756fc52023a04fe45b6f59212fc716cbbcf76f35fcSvetoslav    public static MyPrintService peekInstance() {
766fc52023a04fe45b6f59212fc716cbbcf76f35fcSvetoslav        synchronized (sLock) {
776fc52023a04fe45b6f59212fc716cbbcf76f35fcSvetoslav            return sInstance;
786fc52023a04fe45b6f59212fc716cbbcf76f35fcSvetoslav        }
796fc52023a04fe45b6f59212fc716cbbcf76f35fcSvetoslav    }
801274de1ce4243d6ebb3e12b12b75daf8b466c39cSvetoslav Ganov
81282209e42c32d712fd5685f283047d84e813297eSvetoslav Ganov    @Override
820fb6959ad364ee84e83c435d671228fb365f2084Svetoslav    protected void onConnected() {
830fb6959ad364ee84e83c435d671228fb365f2084Svetoslav        Log.i(LOG_TAG, "#onConnected()");
841274de1ce4243d6ebb3e12b12b75daf8b466c39cSvetoslav Ganov        mHandler = new MyHandler(getMainLooper());
856fc52023a04fe45b6f59212fc716cbbcf76f35fcSvetoslav        synchronized (sLock) {
866fc52023a04fe45b6f59212fc716cbbcf76f35fcSvetoslav            sInstance = this;
876fc52023a04fe45b6f59212fc716cbbcf76f35fcSvetoslav        }
880fb6959ad364ee84e83c435d671228fb365f2084Svetoslav    }
890fb6959ad364ee84e83c435d671228fb365f2084Svetoslav
900fb6959ad364ee84e83c435d671228fb365f2084Svetoslav    @Override
910fb6959ad364ee84e83c435d671228fb365f2084Svetoslav    protected void onDisconnected() {
920fb6959ad364ee84e83c435d671228fb365f2084Svetoslav        Log.i(LOG_TAG, "#onDisconnected()");
931274de1ce4243d6ebb3e12b12b75daf8b466c39cSvetoslav Ganov        if (mSession != null) {
941274de1ce4243d6ebb3e12b12b75daf8b466c39cSvetoslav Ganov            mSession.cancellAddingFakePrinters();
951274de1ce4243d6ebb3e12b12b75daf8b466c39cSvetoslav Ganov        }
966fc52023a04fe45b6f59212fc716cbbcf76f35fcSvetoslav        synchronized (sLock) {
976fc52023a04fe45b6f59212fc716cbbcf76f35fcSvetoslav            sInstance = null;
986fc52023a04fe45b6f59212fc716cbbcf76f35fcSvetoslav        }
990fb6959ad364ee84e83c435d671228fb365f2084Svetoslav    }
1000fb6959ad364ee84e83c435d671228fb365f2084Svetoslav
1010fb6959ad364ee84e83c435d671228fb365f2084Svetoslav    @Override
1021274de1ce4243d6ebb3e12b12b75daf8b466c39cSvetoslav Ganov    protected PrinterDiscoverySession onCreatePrinterDiscoverySession() {
1037ae2878f5219d55e842348eb44ffb5070b9d708dSvetoslav Ganov        Log.i(LOG_TAG, "#onCreatePrinterDiscoverySession()");
1047ae2878f5219d55e842348eb44ffb5070b9d708dSvetoslav Ganov        return new FakePrinterDiscoverySession();
1050fb6959ad364ee84e83c435d671228fb365f2084Svetoslav    }
1060fb6959ad364ee84e83c435d671228fb365f2084Svetoslav
1070fb6959ad364ee84e83c435d671228fb365f2084Svetoslav    @Override
1086fc52023a04fe45b6f59212fc716cbbcf76f35fcSvetoslav    protected void onRequestCancelPrintJob(final PrintJob printJob) {
1096fc52023a04fe45b6f59212fc716cbbcf76f35fcSvetoslav        Log.i(LOG_TAG, "#onRequestCancelPrintJob()");
1106fc52023a04fe45b6f59212fc716cbbcf76f35fcSvetoslav        mProcessedPrintJobs.put(printJob.getId(), printJob);
1116fc52023a04fe45b6f59212fc716cbbcf76f35fcSvetoslav        Intent intent = new Intent(this, MyDialogActivity.class);
1126fc52023a04fe45b6f59212fc716cbbcf76f35fcSvetoslav        intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
1136fc52023a04fe45b6f59212fc716cbbcf76f35fcSvetoslav        intent.putExtra(INTENT_EXTRA_PRINT_JOB_ID, printJob.getId());
1146fc52023a04fe45b6f59212fc716cbbcf76f35fcSvetoslav        intent.putExtra(INTENT_EXTRA_ACTION_TYPE, ACTION_TYPE_ON_REQUEST_CANCEL_PRINT_JOB);
1156fc52023a04fe45b6f59212fc716cbbcf76f35fcSvetoslav        startActivity(intent);
1168dea95de32a43b110a10a445a6dfd8fba4232073Svetoslav Ganov    }
1178dea95de32a43b110a10a445a6dfd8fba4232073Svetoslav Ganov
1188dea95de32a43b110a10a445a6dfd8fba4232073Svetoslav Ganov    @Override
1190fb6959ad364ee84e83c435d671228fb365f2084Svetoslav    public void onPrintJobQueued(final PrintJob printJob) {
120c6c630d5c2b70440d433aa19bcf50c115d9cf39aSvetoslav Ganov        Log.i(LOG_TAG, "#onPrintJobQueued()");
1216fc52023a04fe45b6f59212fc716cbbcf76f35fcSvetoslav        mProcessedPrintJobs.put(printJob.getId(), printJob);
1223bb4d60425207dad4241d0565ff0c4a20dca119dSvetoslav Ganov        if (printJob.isQueued()) {
1233bb4d60425207dad4241d0565ff0c4a20dca119dSvetoslav Ganov            printJob.start();
1243bb4d60425207dad4241d0565ff0c4a20dca119dSvetoslav Ganov        }
1256fc52023a04fe45b6f59212fc716cbbcf76f35fcSvetoslav        Intent intent = new Intent(this, MyDialogActivity.class);
1266fc52023a04fe45b6f59212fc716cbbcf76f35fcSvetoslav        intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
1276fc52023a04fe45b6f59212fc716cbbcf76f35fcSvetoslav        intent.putExtra(INTENT_EXTRA_PRINT_JOB_ID, printJob.getId());
1286fc52023a04fe45b6f59212fc716cbbcf76f35fcSvetoslav        intent.putExtra(INTENT_EXTRA_ACTION_TYPE, ACTION_TYPE_ON_PRINT_JOB_PENDING);
1296fc52023a04fe45b6f59212fc716cbbcf76f35fcSvetoslav        startActivity(intent);
1308dea95de32a43b110a10a445a6dfd8fba4232073Svetoslav Ganov    }
1318dea95de32a43b110a10a445a6dfd8fba4232073Svetoslav Ganov
1326fc52023a04fe45b6f59212fc716cbbcf76f35fcSvetoslav    void handleRequestCancelPrintJob(int printJobId) {
1336fc52023a04fe45b6f59212fc716cbbcf76f35fcSvetoslav        PrintJob printJob = mProcessedPrintJobs.get(printJobId);
1346fc52023a04fe45b6f59212fc716cbbcf76f35fcSvetoslav        if (printJob == null) {
1356fc52023a04fe45b6f59212fc716cbbcf76f35fcSvetoslav            return;
1366fc52023a04fe45b6f59212fc716cbbcf76f35fcSvetoslav        }
1376fc52023a04fe45b6f59212fc716cbbcf76f35fcSvetoslav        mProcessedPrintJobs.remove(printJobId);
1386fc52023a04fe45b6f59212fc716cbbcf76f35fcSvetoslav        if (printJob.isQueued() || printJob.isStarted()) {
1396fc52023a04fe45b6f59212fc716cbbcf76f35fcSvetoslav            mHandler.removeMessages(MyHandler.MSG_HANDLE_DO_PRINT_JOB);
1406fc52023a04fe45b6f59212fc716cbbcf76f35fcSvetoslav            mHandler.removeMessages(MyHandler.MSG_HANDLE_FAIL_PRINT_JOB);
1416fc52023a04fe45b6f59212fc716cbbcf76f35fcSvetoslav            printJob.cancel();
1426fc52023a04fe45b6f59212fc716cbbcf76f35fcSvetoslav        }
1436fc52023a04fe45b6f59212fc716cbbcf76f35fcSvetoslav    }
1446fc52023a04fe45b6f59212fc716cbbcf76f35fcSvetoslav
1456fc52023a04fe45b6f59212fc716cbbcf76f35fcSvetoslav    void handleFailPrintJobDelayed(int printJobId) {
1466fc52023a04fe45b6f59212fc716cbbcf76f35fcSvetoslav        Message message = mHandler.obtainMessage(
1476fc52023a04fe45b6f59212fc716cbbcf76f35fcSvetoslav                MyHandler.MSG_HANDLE_FAIL_PRINT_JOB, printJobId, 0);
1486fc52023a04fe45b6f59212fc716cbbcf76f35fcSvetoslav        mHandler.sendMessageDelayed(message, STANDARD_DELAY_MILLIS);
1496fc52023a04fe45b6f59212fc716cbbcf76f35fcSvetoslav    }
1506fc52023a04fe45b6f59212fc716cbbcf76f35fcSvetoslav
1516fc52023a04fe45b6f59212fc716cbbcf76f35fcSvetoslav    void handleFailPrintJob(int printJobId) {
1526fc52023a04fe45b6f59212fc716cbbcf76f35fcSvetoslav        PrintJob printJob = mProcessedPrintJobs.get(printJobId);
1536fc52023a04fe45b6f59212fc716cbbcf76f35fcSvetoslav        if (printJob == null) {
1546fc52023a04fe45b6f59212fc716cbbcf76f35fcSvetoslav            return;
1556fc52023a04fe45b6f59212fc716cbbcf76f35fcSvetoslav        }
1566fc52023a04fe45b6f59212fc716cbbcf76f35fcSvetoslav        mProcessedPrintJobs.remove(printJobId);
1576fc52023a04fe45b6f59212fc716cbbcf76f35fcSvetoslav        if (printJob.isQueued() || printJob.isStarted()) {
1586fc52023a04fe45b6f59212fc716cbbcf76f35fcSvetoslav            printJob.fail(getString(R.string.fail_reason));
1596fc52023a04fe45b6f59212fc716cbbcf76f35fcSvetoslav        }
1606fc52023a04fe45b6f59212fc716cbbcf76f35fcSvetoslav    }
1616fc52023a04fe45b6f59212fc716cbbcf76f35fcSvetoslav
1623bb4d60425207dad4241d0565ff0c4a20dca119dSvetoslav Ganov    void handleBlockPrintJobDelayed(int printJobId) {
1633bb4d60425207dad4241d0565ff0c4a20dca119dSvetoslav Ganov        Message message = mHandler.obtainMessage(
1643bb4d60425207dad4241d0565ff0c4a20dca119dSvetoslav Ganov                MyHandler.MSG_HANDLE_BLOCK_PRINT_JOB, printJobId, 0);
1653bb4d60425207dad4241d0565ff0c4a20dca119dSvetoslav Ganov        mHandler.sendMessageDelayed(message, STANDARD_DELAY_MILLIS);
1663bb4d60425207dad4241d0565ff0c4a20dca119dSvetoslav Ganov    }
1673bb4d60425207dad4241d0565ff0c4a20dca119dSvetoslav Ganov
1683bb4d60425207dad4241d0565ff0c4a20dca119dSvetoslav Ganov    void handleBlockPrintJob(int printJobId) {
1693bb4d60425207dad4241d0565ff0c4a20dca119dSvetoslav Ganov        final PrintJob printJob = mProcessedPrintJobs.get(printJobId);
1703bb4d60425207dad4241d0565ff0c4a20dca119dSvetoslav Ganov        if (printJob == null) {
1713bb4d60425207dad4241d0565ff0c4a20dca119dSvetoslav Ganov            return;
1723bb4d60425207dad4241d0565ff0c4a20dca119dSvetoslav Ganov        }
1733bb4d60425207dad4241d0565ff0c4a20dca119dSvetoslav Ganov
1743bb4d60425207dad4241d0565ff0c4a20dca119dSvetoslav Ganov        if (printJob.isStarted()) {
1753bb4d60425207dad4241d0565ff0c4a20dca119dSvetoslav Ganov            printJob.block("Gimme some reset, dude");
1763bb4d60425207dad4241d0565ff0c4a20dca119dSvetoslav Ganov        }
1773bb4d60425207dad4241d0565ff0c4a20dca119dSvetoslav Ganov    }
1783bb4d60425207dad4241d0565ff0c4a20dca119dSvetoslav Ganov
1793bb4d60425207dad4241d0565ff0c4a20dca119dSvetoslav Ganov    void handleBlockAndDelayedUnblockPrintJob(int printJobId) {
1803bb4d60425207dad4241d0565ff0c4a20dca119dSvetoslav Ganov        handleBlockPrintJob(printJobId);
1813bb4d60425207dad4241d0565ff0c4a20dca119dSvetoslav Ganov
1823bb4d60425207dad4241d0565ff0c4a20dca119dSvetoslav Ganov        Message message = mHandler.obtainMessage(
1833bb4d60425207dad4241d0565ff0c4a20dca119dSvetoslav Ganov                MyHandler.MSG_HANDLE_UNBLOCK_PRINT_JOB, printJobId, 0);
1843bb4d60425207dad4241d0565ff0c4a20dca119dSvetoslav Ganov        mHandler.sendMessageDelayed(message, STANDARD_DELAY_MILLIS);
1853bb4d60425207dad4241d0565ff0c4a20dca119dSvetoslav Ganov    }
1863bb4d60425207dad4241d0565ff0c4a20dca119dSvetoslav Ganov
1873bb4d60425207dad4241d0565ff0c4a20dca119dSvetoslav Ganov    void handleUnblockPrintJob(int printJobId) {
1883bb4d60425207dad4241d0565ff0c4a20dca119dSvetoslav Ganov        final PrintJob printJob = mProcessedPrintJobs.get(printJobId);
1893bb4d60425207dad4241d0565ff0c4a20dca119dSvetoslav Ganov        if (printJob == null) {
1903bb4d60425207dad4241d0565ff0c4a20dca119dSvetoslav Ganov            return;
1913bb4d60425207dad4241d0565ff0c4a20dca119dSvetoslav Ganov        }
1923bb4d60425207dad4241d0565ff0c4a20dca119dSvetoslav Ganov
1933bb4d60425207dad4241d0565ff0c4a20dca119dSvetoslav Ganov        if (printJob.isBlocked()) {
1943bb4d60425207dad4241d0565ff0c4a20dca119dSvetoslav Ganov            printJob.start();
1953bb4d60425207dad4241d0565ff0c4a20dca119dSvetoslav Ganov        }
1963bb4d60425207dad4241d0565ff0c4a20dca119dSvetoslav Ganov    }
1973bb4d60425207dad4241d0565ff0c4a20dca119dSvetoslav Ganov
1986fc52023a04fe45b6f59212fc716cbbcf76f35fcSvetoslav    void handleQueuedPrintJobDelayed(int printJobId) {
1993bb4d60425207dad4241d0565ff0c4a20dca119dSvetoslav Ganov        final PrintJob printJob = mProcessedPrintJobs.get(printJobId);
2003bb4d60425207dad4241d0565ff0c4a20dca119dSvetoslav Ganov        if (printJob == null) {
2013bb4d60425207dad4241d0565ff0c4a20dca119dSvetoslav Ganov            return;
2023bb4d60425207dad4241d0565ff0c4a20dca119dSvetoslav Ganov        }
2033bb4d60425207dad4241d0565ff0c4a20dca119dSvetoslav Ganov
2043bb4d60425207dad4241d0565ff0c4a20dca119dSvetoslav Ganov        if (printJob.isQueued()) {
2053bb4d60425207dad4241d0565ff0c4a20dca119dSvetoslav Ganov            printJob.start();
2063bb4d60425207dad4241d0565ff0c4a20dca119dSvetoslav Ganov        }
2076fc52023a04fe45b6f59212fc716cbbcf76f35fcSvetoslav        Message message = mHandler.obtainMessage(
2086fc52023a04fe45b6f59212fc716cbbcf76f35fcSvetoslav                MyHandler.MSG_HANDLE_DO_PRINT_JOB, printJobId, 0);
2096fc52023a04fe45b6f59212fc716cbbcf76f35fcSvetoslav        mHandler.sendMessageDelayed(message, STANDARD_DELAY_MILLIS);
2106fc52023a04fe45b6f59212fc716cbbcf76f35fcSvetoslav    }
2116fc52023a04fe45b6f59212fc716cbbcf76f35fcSvetoslav
2126fc52023a04fe45b6f59212fc716cbbcf76f35fcSvetoslav    void handleQueuedPrintJob(int printJobId) {
2136fc52023a04fe45b6f59212fc716cbbcf76f35fcSvetoslav        final PrintJob printJob = mProcessedPrintJobs.get(printJobId);
2146fc52023a04fe45b6f59212fc716cbbcf76f35fcSvetoslav        if (printJob == null) {
2156fc52023a04fe45b6f59212fc716cbbcf76f35fcSvetoslav            return;
2166fc52023a04fe45b6f59212fc716cbbcf76f35fcSvetoslav        }
2176fc52023a04fe45b6f59212fc716cbbcf76f35fcSvetoslav
2188dea95de32a43b110a10a445a6dfd8fba4232073Svetoslav Ganov        if (printJob.isQueued()) {
2198dea95de32a43b110a10a445a6dfd8fba4232073Svetoslav Ganov            printJob.start();
2200fb6959ad364ee84e83c435d671228fb365f2084Svetoslav        }
2218dea95de32a43b110a10a445a6dfd8fba4232073Svetoslav Ganov
2228dea95de32a43b110a10a445a6dfd8fba4232073Svetoslav Ganov        final PrintJobInfo info = printJob.getInfo();
2238dea95de32a43b110a10a445a6dfd8fba4232073Svetoslav Ganov        final File file = new File(getFilesDir(), info.getLabel() + ".pdf");
2248dea95de32a43b110a10a445a6dfd8fba4232073Svetoslav Ganov
2253bb4d60425207dad4241d0565ff0c4a20dca119dSvetoslav Ganov        mFakePrintTask = new AsyncTask<ParcelFileDescriptor, Void, Void>() {
2260fb6959ad364ee84e83c435d671228fb365f2084Svetoslav            @Override
2273bb4d60425207dad4241d0565ff0c4a20dca119dSvetoslav Ganov            protected Void doInBackground(ParcelFileDescriptor... params) {
2283bb4d60425207dad4241d0565ff0c4a20dca119dSvetoslav Ganov                InputStream in = new BufferedInputStream(new FileInputStream(
2293bb4d60425207dad4241d0565ff0c4a20dca119dSvetoslav Ganov                        params[0].getFileDescriptor()));
2300fb6959ad364ee84e83c435d671228fb365f2084Svetoslav                OutputStream out = null;
2310fb6959ad364ee84e83c435d671228fb365f2084Svetoslav                try {
2320fb6959ad364ee84e83c435d671228fb365f2084Svetoslav                    out = new BufferedOutputStream(new FileOutputStream(file));
2330fb6959ad364ee84e83c435d671228fb365f2084Svetoslav                    final byte[] buffer = new byte[8192];
2340fb6959ad364ee84e83c435d671228fb365f2084Svetoslav                    while (true) {
2358dea95de32a43b110a10a445a6dfd8fba4232073Svetoslav Ganov                        if (isCancelled()) {
2368dea95de32a43b110a10a445a6dfd8fba4232073Svetoslav Ganov                            break;
2378dea95de32a43b110a10a445a6dfd8fba4232073Svetoslav Ganov                        }
2380fb6959ad364ee84e83c435d671228fb365f2084Svetoslav                        final int readByteCount = in.read(buffer);
2390fb6959ad364ee84e83c435d671228fb365f2084Svetoslav                        if (readByteCount < 0) {
2400fb6959ad364ee84e83c435d671228fb365f2084Svetoslav                            break;
2410fb6959ad364ee84e83c435d671228fb365f2084Svetoslav                        }
2420fb6959ad364ee84e83c435d671228fb365f2084Svetoslav                        out.write(buffer, 0, readByteCount);
2430fb6959ad364ee84e83c435d671228fb365f2084Svetoslav                    }
2440fb6959ad364ee84e83c435d671228fb365f2084Svetoslav                } catch (IOException ioe) {
2457ae2878f5219d55e842348eb44ffb5070b9d708dSvetoslav Ganov                    throw new RuntimeException(ioe);
2460fb6959ad364ee84e83c435d671228fb365f2084Svetoslav                } finally {
2473bb4d60425207dad4241d0565ff0c4a20dca119dSvetoslav Ganov                    if (in != null) {
2483bb4d60425207dad4241d0565ff0c4a20dca119dSvetoslav Ganov                        try {
2493bb4d60425207dad4241d0565ff0c4a20dca119dSvetoslav Ganov                            in.close();
2503bb4d60425207dad4241d0565ff0c4a20dca119dSvetoslav Ganov                        } catch (IOException ioe) {
2513bb4d60425207dad4241d0565ff0c4a20dca119dSvetoslav Ganov                            /* ignore */
2523bb4d60425207dad4241d0565ff0c4a20dca119dSvetoslav Ganov                        }
2533bb4d60425207dad4241d0565ff0c4a20dca119dSvetoslav Ganov                    }
2543bb4d60425207dad4241d0565ff0c4a20dca119dSvetoslav Ganov                    if (out != null) {
2553bb4d60425207dad4241d0565ff0c4a20dca119dSvetoslav Ganov                        try {
2563bb4d60425207dad4241d0565ff0c4a20dca119dSvetoslav Ganov                            out.close();
2573bb4d60425207dad4241d0565ff0c4a20dca119dSvetoslav Ganov                        } catch (IOException ioe) {
2583bb4d60425207dad4241d0565ff0c4a20dca119dSvetoslav Ganov                            /* ignore */
2593bb4d60425207dad4241d0565ff0c4a20dca119dSvetoslav Ganov                        }
2603bb4d60425207dad4241d0565ff0c4a20dca119dSvetoslav Ganov                    }
2618dea95de32a43b110a10a445a6dfd8fba4232073Svetoslav Ganov                    if (isCancelled()) {
2628dea95de32a43b110a10a445a6dfd8fba4232073Svetoslav Ganov                        file.delete();
2638dea95de32a43b110a10a445a6dfd8fba4232073Svetoslav Ganov                    }
2640fb6959ad364ee84e83c435d671228fb365f2084Svetoslav                }
2650fb6959ad364ee84e83c435d671228fb365f2084Svetoslav                return null;
2660fb6959ad364ee84e83c435d671228fb365f2084Svetoslav            }
2670fb6959ad364ee84e83c435d671228fb365f2084Svetoslav
2680fb6959ad364ee84e83c435d671228fb365f2084Svetoslav            @Override
2690fb6959ad364ee84e83c435d671228fb365f2084Svetoslav            protected void onPostExecute(Void result) {
2708dea95de32a43b110a10a445a6dfd8fba4232073Svetoslav Ganov                if (printJob.isStarted()) {
2718dea95de32a43b110a10a445a6dfd8fba4232073Svetoslav Ganov                    printJob.complete();
2720fb6959ad364ee84e83c435d671228fb365f2084Svetoslav                }
2730fb6959ad364ee84e83c435d671228fb365f2084Svetoslav
2748dea95de32a43b110a10a445a6dfd8fba4232073Svetoslav Ganov                file.setReadable(true, false);
275ecaec06dfbaa011676c37f5f6170b984da5c6a5eSvetoslav Ganov
2766fc52023a04fe45b6f59212fc716cbbcf76f35fcSvetoslav                // Quick and dirty to show the file - use a content provider instead.
2778dea95de32a43b110a10a445a6dfd8fba4232073Svetoslav Ganov                Intent intent = new Intent(Intent.ACTION_VIEW);
2788dea95de32a43b110a10a445a6dfd8fba4232073Svetoslav Ganov                intent.setDataAndType(Uri.fromFile(file), "application/pdf");
2798dea95de32a43b110a10a445a6dfd8fba4232073Svetoslav Ganov                intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
2808dea95de32a43b110a10a445a6dfd8fba4232073Svetoslav Ganov                startActivity(intent, null);
2810fb6959ad364ee84e83c435d671228fb365f2084Svetoslav
2828dea95de32a43b110a10a445a6dfd8fba4232073Svetoslav Ganov                mFakePrintTask = null;
2830fb6959ad364ee84e83c435d671228fb365f2084Svetoslav            }
2847ae2878f5219d55e842348eb44ffb5070b9d708dSvetoslav Ganov
2857ae2878f5219d55e842348eb44ffb5070b9d708dSvetoslav Ganov            @Override
2867ae2878f5219d55e842348eb44ffb5070b9d708dSvetoslav Ganov            protected void onCancelled(Void result) {
2877ae2878f5219d55e842348eb44ffb5070b9d708dSvetoslav Ganov                if (printJob.isStarted()) {
2887ae2878f5219d55e842348eb44ffb5070b9d708dSvetoslav Ganov                    printJob.cancel();
2897ae2878f5219d55e842348eb44ffb5070b9d708dSvetoslav Ganov                }
2907ae2878f5219d55e842348eb44ffb5070b9d708dSvetoslav Ganov            }
2910fb6959ad364ee84e83c435d671228fb365f2084Svetoslav        };
2927ae2878f5219d55e842348eb44ffb5070b9d708dSvetoslav Ganov        mFakePrintTask.executeOnExecutor(AsyncTask.SERIAL_EXECUTOR,
2937ae2878f5219d55e842348eb44ffb5070b9d708dSvetoslav Ganov                printJob.getDocument().getData());
2940fb6959ad364ee84e83c435d671228fb365f2084Svetoslav    }
2950fb6959ad364ee84e83c435d671228fb365f2084Svetoslav
2960fb6959ad364ee84e83c435d671228fb365f2084Svetoslav    private final class MyHandler extends Handler {
2976fc52023a04fe45b6f59212fc716cbbcf76f35fcSvetoslav        public static final int MSG_HANDLE_DO_PRINT_JOB = 1;
2986fc52023a04fe45b6f59212fc716cbbcf76f35fcSvetoslav        public static final int MSG_HANDLE_FAIL_PRINT_JOB = 2;
2993bb4d60425207dad4241d0565ff0c4a20dca119dSvetoslav Ganov        public static final int MSG_HANDLE_BLOCK_PRINT_JOB = 3;
3003bb4d60425207dad4241d0565ff0c4a20dca119dSvetoslav Ganov        public static final int MSG_HANDLE_UNBLOCK_PRINT_JOB = 4;
3010fb6959ad364ee84e83c435d671228fb365f2084Svetoslav
3020fb6959ad364ee84e83c435d671228fb365f2084Svetoslav        public MyHandler(Looper looper) {
3033bb4d60425207dad4241d0565ff0c4a20dca119dSvetoslav Ganov            super(looper);
3040fb6959ad364ee84e83c435d671228fb365f2084Svetoslav        }
3050fb6959ad364ee84e83c435d671228fb365f2084Svetoslav
3060fb6959ad364ee84e83c435d671228fb365f2084Svetoslav        @Override
3070fb6959ad364ee84e83c435d671228fb365f2084Svetoslav        public void handleMessage(Message message) {
3080fb6959ad364ee84e83c435d671228fb365f2084Svetoslav            switch (message.what) {
3096fc52023a04fe45b6f59212fc716cbbcf76f35fcSvetoslav                case MSG_HANDLE_DO_PRINT_JOB: {
3106fc52023a04fe45b6f59212fc716cbbcf76f35fcSvetoslav                    final int printJobId = message.arg1;
3116fc52023a04fe45b6f59212fc716cbbcf76f35fcSvetoslav                    handleQueuedPrintJob(printJobId);
3126fc52023a04fe45b6f59212fc716cbbcf76f35fcSvetoslav                } break;
3136fc52023a04fe45b6f59212fc716cbbcf76f35fcSvetoslav
3146fc52023a04fe45b6f59212fc716cbbcf76f35fcSvetoslav                case MSG_HANDLE_FAIL_PRINT_JOB: {
3156fc52023a04fe45b6f59212fc716cbbcf76f35fcSvetoslav                    final int printJobId = message.arg1;
3166fc52023a04fe45b6f59212fc716cbbcf76f35fcSvetoslav                    handleFailPrintJob(printJobId);
3178dea95de32a43b110a10a445a6dfd8fba4232073Svetoslav Ganov                } break;
3183bb4d60425207dad4241d0565ff0c4a20dca119dSvetoslav Ganov
3193bb4d60425207dad4241d0565ff0c4a20dca119dSvetoslav Ganov                case MSG_HANDLE_BLOCK_PRINT_JOB: {
3203bb4d60425207dad4241d0565ff0c4a20dca119dSvetoslav Ganov                    final int printJobId = message.arg1;
3213bb4d60425207dad4241d0565ff0c4a20dca119dSvetoslav Ganov                    handleBlockPrintJob(printJobId);
3223bb4d60425207dad4241d0565ff0c4a20dca119dSvetoslav Ganov                } break;
3233bb4d60425207dad4241d0565ff0c4a20dca119dSvetoslav Ganov
3243bb4d60425207dad4241d0565ff0c4a20dca119dSvetoslav Ganov                case MSG_HANDLE_UNBLOCK_PRINT_JOB: {
3253bb4d60425207dad4241d0565ff0c4a20dca119dSvetoslav Ganov                    final int printJobId = message.arg1;
3263bb4d60425207dad4241d0565ff0c4a20dca119dSvetoslav Ganov                    handleUnblockPrintJob(printJobId);
3273bb4d60425207dad4241d0565ff0c4a20dca119dSvetoslav Ganov                } break;
3280fb6959ad364ee84e83c435d671228fb365f2084Svetoslav            }
3290fb6959ad364ee84e83c435d671228fb365f2084Svetoslav        }
3300fb6959ad364ee84e83c435d671228fb365f2084Svetoslav    }
3311274de1ce4243d6ebb3e12b12b75daf8b466c39cSvetoslav Ganov
3327ae2878f5219d55e842348eb44ffb5070b9d708dSvetoslav Ganov    private final class FakePrinterDiscoverySession extends  PrinterDiscoverySession {
3331274de1ce4243d6ebb3e12b12b75daf8b466c39cSvetoslav Ganov        private final Handler mSesionHandler = new SessionHandler(getMainLooper());
3341274de1ce4243d6ebb3e12b12b75daf8b466c39cSvetoslav Ganov
3357ae2878f5219d55e842348eb44ffb5070b9d708dSvetoslav Ganov        private final List<PrinterInfo> mFakePrinters = new ArrayList<PrinterInfo>();
3367ae2878f5219d55e842348eb44ffb5070b9d708dSvetoslav Ganov
3377ae2878f5219d55e842348eb44ffb5070b9d708dSvetoslav Ganov        public FakePrinterDiscoverySession() {
3387ae2878f5219d55e842348eb44ffb5070b9d708dSvetoslav Ganov            for (int i = 0; i < 1000; i++) {
339a3eee78c0e6d279a2c1d91742960549864d17d03Svetoslav Ganov                String name = "Printer " + i;
3403bb4d60425207dad4241d0565ff0c4a20dca119dSvetoslav Ganov                PrinterInfo printer = new PrinterInfo
3413bb4d60425207dad4241d0565ff0c4a20dca119dSvetoslav Ganov                        .Builder(generatePrinterId(name), name, PrinterInfo.STATUS_IDLE)
3423bb4d60425207dad4241d0565ff0c4a20dca119dSvetoslav Ganov                        .create();
3437ae2878f5219d55e842348eb44ffb5070b9d708dSvetoslav Ganov                mFakePrinters.add(printer);
3447ae2878f5219d55e842348eb44ffb5070b9d708dSvetoslav Ganov            }
3457ae2878f5219d55e842348eb44ffb5070b9d708dSvetoslav Ganov        }
3467ae2878f5219d55e842348eb44ffb5070b9d708dSvetoslav Ganov
3477ae2878f5219d55e842348eb44ffb5070b9d708dSvetoslav Ganov        @Override
3487ae2878f5219d55e842348eb44ffb5070b9d708dSvetoslav Ganov        public void onDestroy() {
3497ae2878f5219d55e842348eb44ffb5070b9d708dSvetoslav Ganov            Log.i(LOG_TAG, "FakePrinterDiscoverySession#onDestroy()");
3507ae2878f5219d55e842348eb44ffb5070b9d708dSvetoslav Ganov            mSesionHandler.removeMessages(SessionHandler.MSG_ADD_FIRST_BATCH_FAKE_PRINTERS);
3517ae2878f5219d55e842348eb44ffb5070b9d708dSvetoslav Ganov            mSesionHandler.removeMessages(SessionHandler.MSG_ADD_SECOND_BATCH_FAKE_PRINTERS);
3521274de1ce4243d6ebb3e12b12b75daf8b466c39cSvetoslav Ganov        }
3531274de1ce4243d6ebb3e12b12b75daf8b466c39cSvetoslav Ganov
3541274de1ce4243d6ebb3e12b12b75daf8b466c39cSvetoslav Ganov        @Override
3557ae2878f5219d55e842348eb44ffb5070b9d708dSvetoslav Ganov        public void onStartPrinterDiscovery(List<PrinterId> priorityList) {
3567ae2878f5219d55e842348eb44ffb5070b9d708dSvetoslav Ganov            Log.i(LOG_TAG, "FakePrinterDiscoverySession#onStartPrinterDiscovery()");
3571274de1ce4243d6ebb3e12b12b75daf8b466c39cSvetoslav Ganov            Message message1 = mSesionHandler.obtainMessage(
3587ae2878f5219d55e842348eb44ffb5070b9d708dSvetoslav Ganov                    SessionHandler.MSG_ADD_FIRST_BATCH_FAKE_PRINTERS, this);
3591274de1ce4243d6ebb3e12b12b75daf8b466c39cSvetoslav Ganov            mSesionHandler.sendMessageDelayed(message1, 0);
3601274de1ce4243d6ebb3e12b12b75daf8b466c39cSvetoslav Ganov
3611274de1ce4243d6ebb3e12b12b75daf8b466c39cSvetoslav Ganov            Message message2 = mSesionHandler.obtainMessage(
3627ae2878f5219d55e842348eb44ffb5070b9d708dSvetoslav Ganov                    SessionHandler.MSG_ADD_SECOND_BATCH_FAKE_PRINTERS, this);
3631274de1ce4243d6ebb3e12b12b75daf8b466c39cSvetoslav Ganov            mSesionHandler.sendMessageDelayed(message2, 10000);
3641274de1ce4243d6ebb3e12b12b75daf8b466c39cSvetoslav Ganov        }
3651274de1ce4243d6ebb3e12b12b75daf8b466c39cSvetoslav Ganov
3661274de1ce4243d6ebb3e12b12b75daf8b466c39cSvetoslav Ganov        @Override
3677ae2878f5219d55e842348eb44ffb5070b9d708dSvetoslav Ganov        public void onStopPrinterDiscovery() {
3687ae2878f5219d55e842348eb44ffb5070b9d708dSvetoslav Ganov            Log.i(LOG_TAG, "FakePrinterDiscoverySession#onStopPrinterDiscovery()");
3691274de1ce4243d6ebb3e12b12b75daf8b466c39cSvetoslav Ganov            cancellAddingFakePrinters();
3701274de1ce4243d6ebb3e12b12b75daf8b466c39cSvetoslav Ganov        }
3711274de1ce4243d6ebb3e12b12b75daf8b466c39cSvetoslav Ganov
3721274de1ce4243d6ebb3e12b12b75daf8b466c39cSvetoslav Ganov        @Override
3733bb4d60425207dad4241d0565ff0c4a20dca119dSvetoslav Ganov        public void onStartPrinterStateTracking(PrinterId printerId) {
3743bb4d60425207dad4241d0565ff0c4a20dca119dSvetoslav Ganov            Log.i(LOG_TAG, "FakePrinterDiscoverySession#onStartPrinterStateTracking()");
3757ae2878f5219d55e842348eb44ffb5070b9d708dSvetoslav Ganov            PrinterInfo printer = findPrinterInfo(printerId);
3767ae2878f5219d55e842348eb44ffb5070b9d708dSvetoslav Ganov            if (printer != null) {
3771274de1ce4243d6ebb3e12b12b75daf8b466c39cSvetoslav Ganov                PrinterCapabilitiesInfo capabilities =
3781274de1ce4243d6ebb3e12b12b75daf8b466c39cSvetoslav Ganov                        new PrinterCapabilitiesInfo.Builder(printerId)
3791274de1ce4243d6ebb3e12b12b75daf8b466c39cSvetoslav Ganov                    .setMinMargins(new Margins(0, 0, 0, 0), new Margins(0, 0, 0, 0))
380f3a7b10c0f43acf2fd76b0a52b322b2e2c3572d3Svetoslav                    .addMediaSize(MediaSize.ISO_A4, true)
381f3a7b10c0f43acf2fd76b0a52b322b2e2c3572d3Svetoslav                    .addMediaSize(MediaSize.ISO_A5, false)
3821274de1ce4243d6ebb3e12b12b75daf8b466c39cSvetoslav Ganov                    .addResolution(new Resolution("R1", getString(
383f3a7b10c0f43acf2fd76b0a52b322b2e2c3572d3Svetoslav                            R.string.resolution_200x200), 200, 200), false)
3841274de1ce4243d6ebb3e12b12b75daf8b466c39cSvetoslav Ganov                    .addResolution(new Resolution("R2", getString(
385f3a7b10c0f43acf2fd76b0a52b322b2e2c3572d3Svetoslav                            R.string.resolution_300x300), 300, 300), true)
3861274de1ce4243d6ebb3e12b12b75daf8b466c39cSvetoslav Ganov                    .setColorModes(PrintAttributes.COLOR_MODE_COLOR
3871274de1ce4243d6ebb3e12b12b75daf8b466c39cSvetoslav Ganov                            | PrintAttributes.COLOR_MODE_MONOCHROME,
3881274de1ce4243d6ebb3e12b12b75daf8b466c39cSvetoslav Ganov                            PrintAttributes.COLOR_MODE_MONOCHROME)
3891274de1ce4243d6ebb3e12b12b75daf8b466c39cSvetoslav Ganov                    .create();
3901274de1ce4243d6ebb3e12b12b75daf8b466c39cSvetoslav Ganov
3917ae2878f5219d55e842348eb44ffb5070b9d708dSvetoslav Ganov                printer = new PrinterInfo.Builder(printer)
3921274de1ce4243d6ebb3e12b12b75daf8b466c39cSvetoslav Ganov                    .setCapabilities(capabilities)
3931274de1ce4243d6ebb3e12b12b75daf8b466c39cSvetoslav Ganov                    .create();
3941274de1ce4243d6ebb3e12b12b75daf8b466c39cSvetoslav Ganov
3951274de1ce4243d6ebb3e12b12b75daf8b466c39cSvetoslav Ganov                List<PrinterInfo> printers = new ArrayList<PrinterInfo>();
3961274de1ce4243d6ebb3e12b12b75daf8b466c39cSvetoslav Ganov                printers.add(printer);
397f3a7b10c0f43acf2fd76b0a52b322b2e2c3572d3Svetoslav                addPrinters(printers);
3981274de1ce4243d6ebb3e12b12b75daf8b466c39cSvetoslav Ganov            }
3991274de1ce4243d6ebb3e12b12b75daf8b466c39cSvetoslav Ganov        }
4001274de1ce4243d6ebb3e12b12b75daf8b466c39cSvetoslav Ganov
4013bb4d60425207dad4241d0565ff0c4a20dca119dSvetoslav Ganov        @Override
4023bb4d60425207dad4241d0565ff0c4a20dca119dSvetoslav Ganov        public void onValidatePrinters(List<PrinterId> printerIds) {
4033bb4d60425207dad4241d0565ff0c4a20dca119dSvetoslav Ganov            Log.i(LOG_TAG, "FakePrinterDiscoverySession#onValidatePrinters()");
4043bb4d60425207dad4241d0565ff0c4a20dca119dSvetoslav Ganov        }
4053bb4d60425207dad4241d0565ff0c4a20dca119dSvetoslav Ganov
4063bb4d60425207dad4241d0565ff0c4a20dca119dSvetoslav Ganov        @Override
4073bb4d60425207dad4241d0565ff0c4a20dca119dSvetoslav Ganov        public void onStopPrinterStateTracking(PrinterId printerId) {
4083bb4d60425207dad4241d0565ff0c4a20dca119dSvetoslav Ganov            Log.i(LOG_TAG, "FakePrinterDiscoverySession#onStopPrinterStateTracking()");
4093bb4d60425207dad4241d0565ff0c4a20dca119dSvetoslav Ganov        }
4103bb4d60425207dad4241d0565ff0c4a20dca119dSvetoslav Ganov
4117ae2878f5219d55e842348eb44ffb5070b9d708dSvetoslav Ganov        private void addFirstBatchFakePrinters() {
4127ae2878f5219d55e842348eb44ffb5070b9d708dSvetoslav Ganov            List<PrinterInfo> printers = mFakePrinters.subList(0, mFakePrinters.size() / 2);
4137ae2878f5219d55e842348eb44ffb5070b9d708dSvetoslav Ganov            addPrinters(printers);
4147ae2878f5219d55e842348eb44ffb5070b9d708dSvetoslav Ganov        }
4157ae2878f5219d55e842348eb44ffb5070b9d708dSvetoslav Ganov
4167ae2878f5219d55e842348eb44ffb5070b9d708dSvetoslav Ganov        private void addSecondBatchFakePrinters() {
4177ae2878f5219d55e842348eb44ffb5070b9d708dSvetoslav Ganov            List<PrinterInfo> printers = mFakePrinters.subList(mFakePrinters.size() / 2,
4187ae2878f5219d55e842348eb44ffb5070b9d708dSvetoslav Ganov                    mFakePrinters.size());
4197ae2878f5219d55e842348eb44ffb5070b9d708dSvetoslav Ganov            addPrinters(printers);
4201274de1ce4243d6ebb3e12b12b75daf8b466c39cSvetoslav Ganov        }
4211274de1ce4243d6ebb3e12b12b75daf8b466c39cSvetoslav Ganov
4227ae2878f5219d55e842348eb44ffb5070b9d708dSvetoslav Ganov        private PrinterInfo findPrinterInfo(PrinterId printerId) {
4237ae2878f5219d55e842348eb44ffb5070b9d708dSvetoslav Ganov            List<PrinterInfo> printers = getPrinters();
4247ae2878f5219d55e842348eb44ffb5070b9d708dSvetoslav Ganov            final int printerCount = getPrinters().size();
4257ae2878f5219d55e842348eb44ffb5070b9d708dSvetoslav Ganov            for (int i = 0; i < printerCount; i++) {
4267ae2878f5219d55e842348eb44ffb5070b9d708dSvetoslav Ganov                PrinterInfo printer = printers.get(i);
4277ae2878f5219d55e842348eb44ffb5070b9d708dSvetoslav Ganov                if (printer.getId().equals(printerId)) {
4287ae2878f5219d55e842348eb44ffb5070b9d708dSvetoslav Ganov                    return printer;
4297ae2878f5219d55e842348eb44ffb5070b9d708dSvetoslav Ganov                }
4307ae2878f5219d55e842348eb44ffb5070b9d708dSvetoslav Ganov            }
4317ae2878f5219d55e842348eb44ffb5070b9d708dSvetoslav Ganov            return null;
4321274de1ce4243d6ebb3e12b12b75daf8b466c39cSvetoslav Ganov        }
4331274de1ce4243d6ebb3e12b12b75daf8b466c39cSvetoslav Ganov
4341274de1ce4243d6ebb3e12b12b75daf8b466c39cSvetoslav Ganov        private void cancellAddingFakePrinters() {
4357ae2878f5219d55e842348eb44ffb5070b9d708dSvetoslav Ganov            mSesionHandler.removeMessages(SessionHandler.MSG_ADD_FIRST_BATCH_FAKE_PRINTERS);
4367ae2878f5219d55e842348eb44ffb5070b9d708dSvetoslav Ganov            mSesionHandler.removeMessages(SessionHandler.MSG_ADD_SECOND_BATCH_FAKE_PRINTERS);
4371274de1ce4243d6ebb3e12b12b75daf8b466c39cSvetoslav Ganov        }
4381274de1ce4243d6ebb3e12b12b75daf8b466c39cSvetoslav Ganov
4391274de1ce4243d6ebb3e12b12b75daf8b466c39cSvetoslav Ganov        final class SessionHandler extends Handler {
4407ae2878f5219d55e842348eb44ffb5070b9d708dSvetoslav Ganov            public static final int MSG_ADD_FIRST_BATCH_FAKE_PRINTERS = 1;
4417ae2878f5219d55e842348eb44ffb5070b9d708dSvetoslav Ganov            public static final int MSG_ADD_SECOND_BATCH_FAKE_PRINTERS = 2;
4421274de1ce4243d6ebb3e12b12b75daf8b466c39cSvetoslav Ganov
4431274de1ce4243d6ebb3e12b12b75daf8b466c39cSvetoslav Ganov            public SessionHandler(Looper looper) {
4443bb4d60425207dad4241d0565ff0c4a20dca119dSvetoslav Ganov                super(looper);
4451274de1ce4243d6ebb3e12b12b75daf8b466c39cSvetoslav Ganov            }
4461274de1ce4243d6ebb3e12b12b75daf8b466c39cSvetoslav Ganov
4471274de1ce4243d6ebb3e12b12b75daf8b466c39cSvetoslav Ganov            @Override
4481274de1ce4243d6ebb3e12b12b75daf8b466c39cSvetoslav Ganov            public void handleMessage(Message message) {
4491274de1ce4243d6ebb3e12b12b75daf8b466c39cSvetoslav Ganov                switch (message.what) {
4507ae2878f5219d55e842348eb44ffb5070b9d708dSvetoslav Ganov                    case MSG_ADD_FIRST_BATCH_FAKE_PRINTERS: {
4517ae2878f5219d55e842348eb44ffb5070b9d708dSvetoslav Ganov                        addFirstBatchFakePrinters();
4521274de1ce4243d6ebb3e12b12b75daf8b466c39cSvetoslav Ganov                    } break;
4531274de1ce4243d6ebb3e12b12b75daf8b466c39cSvetoslav Ganov
4547ae2878f5219d55e842348eb44ffb5070b9d708dSvetoslav Ganov                    case MSG_ADD_SECOND_BATCH_FAKE_PRINTERS: {
4557ae2878f5219d55e842348eb44ffb5070b9d708dSvetoslav Ganov                        addSecondBatchFakePrinters();
4561274de1ce4243d6ebb3e12b12b75daf8b466c39cSvetoslav Ganov                    } break;
4571274de1ce4243d6ebb3e12b12b75daf8b466c39cSvetoslav Ganov                }
4581274de1ce4243d6ebb3e12b12b75daf8b466c39cSvetoslav Ganov            }
4591274de1ce4243d6ebb3e12b12b75daf8b466c39cSvetoslav Ganov        }
4601274de1ce4243d6ebb3e12b12b75daf8b466c39cSvetoslav Ganov    }
4610fb6959ad364ee84e83c435d671228fb365f2084Svetoslav}
462