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