MyPrintService.java revision c02ac3775cd61bba799dbf70a707507410b3ff13
17ae2878f5219d55e842348eb44ffb5070b9d708dSvetoslav Ganov/*
27ae2878f5219d55e842348eb44ffb5070b9d708dSvetoslav Ganov * Copyright (C) 2013 The Android Open Source Project
37ae2878f5219d55e842348eb44ffb5070b9d708dSvetoslav Ganov *
47ae2878f5219d55e842348eb44ffb5070b9d708dSvetoslav Ganov * Licensed under the Apache License, Version 2.0 (the "License");
57ae2878f5219d55e842348eb44ffb5070b9d708dSvetoslav Ganov * you may not use this file except in compliance with the License.
67ae2878f5219d55e842348eb44ffb5070b9d708dSvetoslav Ganov * You may obtain a copy of the License at
77ae2878f5219d55e842348eb44ffb5070b9d708dSvetoslav Ganov *
87ae2878f5219d55e842348eb44ffb5070b9d708dSvetoslav Ganov *      http://www.apache.org/licenses/LICENSE-2.0
97ae2878f5219d55e842348eb44ffb5070b9d708dSvetoslav Ganov *
107ae2878f5219d55e842348eb44ffb5070b9d708dSvetoslav Ganov * Unless required by applicable law or agreed to in writing, software
117ae2878f5219d55e842348eb44ffb5070b9d708dSvetoslav Ganov * distributed under the License is distributed on an "AS IS" BASIS,
127ae2878f5219d55e842348eb44ffb5070b9d708dSvetoslav Ganov * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
137ae2878f5219d55e842348eb44ffb5070b9d708dSvetoslav Ganov * See the License for the specific language governing permissions and
147ae2878f5219d55e842348eb44ffb5070b9d708dSvetoslav Ganov * limitations under the License.
157ae2878f5219d55e842348eb44ffb5070b9d708dSvetoslav Ganov */
167ae2878f5219d55e842348eb44ffb5070b9d708dSvetoslav Ganov
170fb6959ad364ee84e83c435d671228fb365f2084Svetoslavpackage foo.bar.printservice;
180fb6959ad364ee84e83c435d671228fb365f2084Svetoslav
199981caa9c40383230c2e08fade7cbe03e2d96125Philip P. Moltmannimport android.annotation.NonNull;
205a2dc1db96c25efda213b44e5f479b5725fce16dPhilip P. Moltmannimport android.app.PendingIntent;
210fb6959ad364ee84e83c435d671228fb365f2084Svetoslavimport android.content.Intent;
225a2dc1db96c25efda213b44e5f479b5725fce16dPhilip P. Moltmannimport android.graphics.BitmapFactory;
235a2dc1db96c25efda213b44e5f479b5725fce16dPhilip P. Moltmannimport android.graphics.drawable.Icon;
240fb6959ad364ee84e83c435d671228fb365f2084Svetoslavimport android.net.Uri;
250fb6959ad364ee84e83c435d671228fb365f2084Svetoslavimport android.os.AsyncTask;
260fb6959ad364ee84e83c435d671228fb365f2084Svetoslavimport android.os.Handler;
270fb6959ad364ee84e83c435d671228fb365f2084Svetoslavimport android.os.Looper;
280fb6959ad364ee84e83c435d671228fb365f2084Svetoslavimport android.os.Message;
293bb4d60425207dad4241d0565ff0c4a20dca119dSvetoslav Ganovimport android.os.ParcelFileDescriptor;
300fb6959ad364ee84e83c435d671228fb365f2084Svetoslavimport android.print.PrintAttributes;
310fb6959ad364ee84e83c435d671228fb365f2084Svetoslavimport android.print.PrintAttributes.Margins;
32c6c630d5c2b70440d433aa19bcf50c115d9cf39aSvetoslav Ganovimport android.print.PrintAttributes.MediaSize;
330fb6959ad364ee84e83c435d671228fb365f2084Svetoslavimport android.print.PrintAttributes.Resolution;
34f11598332008fd706ed17be975a0ff73ba7f6a21Svetoslav Ganovimport android.print.PrintJobId;
351274de1ce4243d6ebb3e12b12b75daf8b466c39cSvetoslav Ganovimport android.print.PrinterCapabilitiesInfo;
360fb6959ad364ee84e83c435d671228fb365f2084Svetoslavimport android.print.PrinterId;
370fb6959ad364ee84e83c435d671228fb365f2084Svetoslavimport android.print.PrinterInfo;
385a2dc1db96c25efda213b44e5f479b5725fce16dPhilip P. Moltmannimport android.printservice.CustomPrinterIconCallback;
390fb6959ad364ee84e83c435d671228fb365f2084Svetoslavimport android.printservice.PrintJob;
400fb6959ad364ee84e83c435d671228fb365f2084Svetoslavimport android.printservice.PrintService;
411274de1ce4243d6ebb3e12b12b75daf8b466c39cSvetoslav Ganovimport android.printservice.PrinterDiscoverySession;
42f11598332008fd706ed17be975a0ff73ba7f6a21Svetoslav Ganovimport android.util.ArrayMap;
430fb6959ad364ee84e83c435d671228fb365f2084Svetoslavimport android.util.Log;
44ecaec06dfbaa011676c37f5f6170b984da5c6a5eSvetoslav Ganov
450fb6959ad364ee84e83c435d671228fb365f2084Svetoslavimport java.io.BufferedInputStream;
460fb6959ad364ee84e83c435d671228fb365f2084Svetoslavimport java.io.BufferedOutputStream;
470fb6959ad364ee84e83c435d671228fb365f2084Svetoslavimport java.io.File;
480fb6959ad364ee84e83c435d671228fb365f2084Svetoslavimport java.io.FileInputStream;
490fb6959ad364ee84e83c435d671228fb365f2084Svetoslavimport java.io.FileOutputStream;
500fb6959ad364ee84e83c435d671228fb365f2084Svetoslavimport java.io.IOException;
510fb6959ad364ee84e83c435d671228fb365f2084Svetoslavimport java.io.InputStream;
520fb6959ad364ee84e83c435d671228fb365f2084Svetoslavimport java.io.OutputStream;
530fb6959ad364ee84e83c435d671228fb365f2084Svetoslavimport java.util.ArrayList;
540fb6959ad364ee84e83c435d671228fb365f2084Svetoslavimport java.util.List;
55f11598332008fd706ed17be975a0ff73ba7f6a21Svetoslav Ganovimport java.util.Map;
560fb6959ad364ee84e83c435d671228fb365f2084Svetoslav
570fb6959ad364ee84e83c435d671228fb365f2084Svetoslavpublic class MyPrintService extends PrintService {
580fb6959ad364ee84e83c435d671228fb365f2084Svetoslav
598dea95de32a43b110a10a445a6dfd8fba4232073Svetoslav Ganov    private static final String LOG_TAG = "MyPrintService";
600fb6959ad364ee84e83c435d671228fb365f2084Svetoslav
61482f8b86361308b90af05c2a3b16eebb0e778882Svetoslav Ganov    private static final long STANDARD_DELAY_MILLIS = 10000000;
626fc52023a04fe45b6f59212fc716cbbcf76f35fcSvetoslav
636fc52023a04fe45b6f59212fc716cbbcf76f35fcSvetoslav    static final String INTENT_EXTRA_ACTION_TYPE = "INTENT_EXTRA_ACTION_TYPE";
646fc52023a04fe45b6f59212fc716cbbcf76f35fcSvetoslav    static final String INTENT_EXTRA_PRINT_JOB_ID = "INTENT_EXTRA_PRINT_JOB_ID";
656fc52023a04fe45b6f59212fc716cbbcf76f35fcSvetoslav
666fc52023a04fe45b6f59212fc716cbbcf76f35fcSvetoslav    static final int ACTION_TYPE_ON_PRINT_JOB_PENDING = 1;
676fc52023a04fe45b6f59212fc716cbbcf76f35fcSvetoslav    static final int ACTION_TYPE_ON_REQUEST_CANCEL_PRINT_JOB = 2;
686fc52023a04fe45b6f59212fc716cbbcf76f35fcSvetoslav
696fc52023a04fe45b6f59212fc716cbbcf76f35fcSvetoslav    private static final Object sLock = new Object();
706fc52023a04fe45b6f59212fc716cbbcf76f35fcSvetoslav
716fc52023a04fe45b6f59212fc716cbbcf76f35fcSvetoslav    private static MyPrintService sInstance;
726fc52023a04fe45b6f59212fc716cbbcf76f35fcSvetoslav
730fb6959ad364ee84e83c435d671228fb365f2084Svetoslav    private Handler mHandler;
740fb6959ad364ee84e83c435d671228fb365f2084Svetoslav
753bb4d60425207dad4241d0565ff0c4a20dca119dSvetoslav Ganov    private AsyncTask<ParcelFileDescriptor, Void, Void> mFakePrintTask;
768dea95de32a43b110a10a445a6dfd8fba4232073Svetoslav Ganov
777ae2878f5219d55e842348eb44ffb5070b9d708dSvetoslav Ganov    private FakePrinterDiscoverySession mSession;
786fc52023a04fe45b6f59212fc716cbbcf76f35fcSvetoslav
79f11598332008fd706ed17be975a0ff73ba7f6a21Svetoslav Ganov    private final Map<PrintJobId, PrintJob> mProcessedPrintJobs =
80f11598332008fd706ed17be975a0ff73ba7f6a21Svetoslav Ganov            new ArrayMap<PrintJobId, PrintJob>();
816fc52023a04fe45b6f59212fc716cbbcf76f35fcSvetoslav
826fc52023a04fe45b6f59212fc716cbbcf76f35fcSvetoslav    public static MyPrintService peekInstance() {
836fc52023a04fe45b6f59212fc716cbbcf76f35fcSvetoslav        synchronized (sLock) {
846fc52023a04fe45b6f59212fc716cbbcf76f35fcSvetoslav            return sInstance;
856fc52023a04fe45b6f59212fc716cbbcf76f35fcSvetoslav        }
866fc52023a04fe45b6f59212fc716cbbcf76f35fcSvetoslav    }
871274de1ce4243d6ebb3e12b12b75daf8b466c39cSvetoslav Ganov
88282209e42c32d712fd5685f283047d84e813297eSvetoslav Ganov    @Override
890fb6959ad364ee84e83c435d671228fb365f2084Svetoslav    protected void onConnected() {
900fb6959ad364ee84e83c435d671228fb365f2084Svetoslav        Log.i(LOG_TAG, "#onConnected()");
911274de1ce4243d6ebb3e12b12b75daf8b466c39cSvetoslav Ganov        mHandler = new MyHandler(getMainLooper());
926fc52023a04fe45b6f59212fc716cbbcf76f35fcSvetoslav        synchronized (sLock) {
936fc52023a04fe45b6f59212fc716cbbcf76f35fcSvetoslav            sInstance = this;
946fc52023a04fe45b6f59212fc716cbbcf76f35fcSvetoslav        }
950fb6959ad364ee84e83c435d671228fb365f2084Svetoslav    }
960fb6959ad364ee84e83c435d671228fb365f2084Svetoslav
970fb6959ad364ee84e83c435d671228fb365f2084Svetoslav    @Override
980fb6959ad364ee84e83c435d671228fb365f2084Svetoslav    protected void onDisconnected() {
990fb6959ad364ee84e83c435d671228fb365f2084Svetoslav        Log.i(LOG_TAG, "#onDisconnected()");
1001274de1ce4243d6ebb3e12b12b75daf8b466c39cSvetoslav Ganov        if (mSession != null) {
1011274de1ce4243d6ebb3e12b12b75daf8b466c39cSvetoslav Ganov            mSession.cancellAddingFakePrinters();
1021274de1ce4243d6ebb3e12b12b75daf8b466c39cSvetoslav Ganov        }
1036fc52023a04fe45b6f59212fc716cbbcf76f35fcSvetoslav        synchronized (sLock) {
1046fc52023a04fe45b6f59212fc716cbbcf76f35fcSvetoslav            sInstance = null;
1056fc52023a04fe45b6f59212fc716cbbcf76f35fcSvetoslav        }
1060fb6959ad364ee84e83c435d671228fb365f2084Svetoslav    }
1070fb6959ad364ee84e83c435d671228fb365f2084Svetoslav
1080fb6959ad364ee84e83c435d671228fb365f2084Svetoslav    @Override
1091274de1ce4243d6ebb3e12b12b75daf8b466c39cSvetoslav Ganov    protected PrinterDiscoverySession onCreatePrinterDiscoverySession() {
1107ae2878f5219d55e842348eb44ffb5070b9d708dSvetoslav Ganov        Log.i(LOG_TAG, "#onCreatePrinterDiscoverySession()");
1117ae2878f5219d55e842348eb44ffb5070b9d708dSvetoslav Ganov        return new FakePrinterDiscoverySession();
1120fb6959ad364ee84e83c435d671228fb365f2084Svetoslav    }
1130fb6959ad364ee84e83c435d671228fb365f2084Svetoslav
1140fb6959ad364ee84e83c435d671228fb365f2084Svetoslav    @Override
1156fc52023a04fe45b6f59212fc716cbbcf76f35fcSvetoslav    protected void onRequestCancelPrintJob(final PrintJob printJob) {
1166fc52023a04fe45b6f59212fc716cbbcf76f35fcSvetoslav        Log.i(LOG_TAG, "#onRequestCancelPrintJob()");
1176fc52023a04fe45b6f59212fc716cbbcf76f35fcSvetoslav        mProcessedPrintJobs.put(printJob.getId(), printJob);
1186fc52023a04fe45b6f59212fc716cbbcf76f35fcSvetoslav        Intent intent = new Intent(this, MyDialogActivity.class);
1196fc52023a04fe45b6f59212fc716cbbcf76f35fcSvetoslav        intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
1206fc52023a04fe45b6f59212fc716cbbcf76f35fcSvetoslav        intent.putExtra(INTENT_EXTRA_PRINT_JOB_ID, printJob.getId());
1216fc52023a04fe45b6f59212fc716cbbcf76f35fcSvetoslav        intent.putExtra(INTENT_EXTRA_ACTION_TYPE, ACTION_TYPE_ON_REQUEST_CANCEL_PRINT_JOB);
1226fc52023a04fe45b6f59212fc716cbbcf76f35fcSvetoslav        startActivity(intent);
1238dea95de32a43b110a10a445a6dfd8fba4232073Svetoslav Ganov    }
1248dea95de32a43b110a10a445a6dfd8fba4232073Svetoslav Ganov
1258dea95de32a43b110a10a445a6dfd8fba4232073Svetoslav Ganov    @Override
1260fb6959ad364ee84e83c435d671228fb365f2084Svetoslav    public void onPrintJobQueued(final PrintJob printJob) {
127c6c630d5c2b70440d433aa19bcf50c115d9cf39aSvetoslav Ganov        Log.i(LOG_TAG, "#onPrintJobQueued()");
1286fc52023a04fe45b6f59212fc716cbbcf76f35fcSvetoslav        mProcessedPrintJobs.put(printJob.getId(), printJob);
1293bb4d60425207dad4241d0565ff0c4a20dca119dSvetoslav Ganov        if (printJob.isQueued()) {
1303bb4d60425207dad4241d0565ff0c4a20dca119dSvetoslav Ganov            printJob.start();
1313bb4d60425207dad4241d0565ff0c4a20dca119dSvetoslav Ganov        }
1328fa1c1973dd8659e52462103b21a926ee9747351Svetoslav
1336fc52023a04fe45b6f59212fc716cbbcf76f35fcSvetoslav        Intent intent = new Intent(this, MyDialogActivity.class);
1346fc52023a04fe45b6f59212fc716cbbcf76f35fcSvetoslav        intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
1356fc52023a04fe45b6f59212fc716cbbcf76f35fcSvetoslav        intent.putExtra(INTENT_EXTRA_PRINT_JOB_ID, printJob.getId());
1366fc52023a04fe45b6f59212fc716cbbcf76f35fcSvetoslav        intent.putExtra(INTENT_EXTRA_ACTION_TYPE, ACTION_TYPE_ON_PRINT_JOB_PENDING);
1376fc52023a04fe45b6f59212fc716cbbcf76f35fcSvetoslav        startActivity(intent);
1388dea95de32a43b110a10a445a6dfd8fba4232073Svetoslav Ganov    }
1398dea95de32a43b110a10a445a6dfd8fba4232073Svetoslav Ganov
140f11598332008fd706ed17be975a0ff73ba7f6a21Svetoslav Ganov    void handleRequestCancelPrintJob(PrintJobId printJobId) {
1416fc52023a04fe45b6f59212fc716cbbcf76f35fcSvetoslav        PrintJob printJob = mProcessedPrintJobs.get(printJobId);
1426fc52023a04fe45b6f59212fc716cbbcf76f35fcSvetoslav        if (printJob == null) {
1436fc52023a04fe45b6f59212fc716cbbcf76f35fcSvetoslav            return;
1446fc52023a04fe45b6f59212fc716cbbcf76f35fcSvetoslav        }
1456fc52023a04fe45b6f59212fc716cbbcf76f35fcSvetoslav        mProcessedPrintJobs.remove(printJobId);
146482f8b86361308b90af05c2a3b16eebb0e778882Svetoslav Ganov        if (printJob.isQueued() || printJob.isStarted() || printJob.isBlocked()) {
1476fc52023a04fe45b6f59212fc716cbbcf76f35fcSvetoslav            mHandler.removeMessages(MyHandler.MSG_HANDLE_DO_PRINT_JOB);
1486fc52023a04fe45b6f59212fc716cbbcf76f35fcSvetoslav            mHandler.removeMessages(MyHandler.MSG_HANDLE_FAIL_PRINT_JOB);
1496fc52023a04fe45b6f59212fc716cbbcf76f35fcSvetoslav            printJob.cancel();
1506fc52023a04fe45b6f59212fc716cbbcf76f35fcSvetoslav        }
1516fc52023a04fe45b6f59212fc716cbbcf76f35fcSvetoslav    }
1526fc52023a04fe45b6f59212fc716cbbcf76f35fcSvetoslav
153f11598332008fd706ed17be975a0ff73ba7f6a21Svetoslav Ganov    void handleFailPrintJobDelayed(PrintJobId printJobId) {
1546fc52023a04fe45b6f59212fc716cbbcf76f35fcSvetoslav        Message message = mHandler.obtainMessage(
155f11598332008fd706ed17be975a0ff73ba7f6a21Svetoslav Ganov                MyHandler.MSG_HANDLE_FAIL_PRINT_JOB, printJobId);
1566fc52023a04fe45b6f59212fc716cbbcf76f35fcSvetoslav        mHandler.sendMessageDelayed(message, STANDARD_DELAY_MILLIS);
1576fc52023a04fe45b6f59212fc716cbbcf76f35fcSvetoslav    }
1586fc52023a04fe45b6f59212fc716cbbcf76f35fcSvetoslav
159f11598332008fd706ed17be975a0ff73ba7f6a21Svetoslav Ganov    void handleFailPrintJob(PrintJobId printJobId) {
1606fc52023a04fe45b6f59212fc716cbbcf76f35fcSvetoslav        PrintJob printJob = mProcessedPrintJobs.get(printJobId);
1616fc52023a04fe45b6f59212fc716cbbcf76f35fcSvetoslav        if (printJob == null) {
1626fc52023a04fe45b6f59212fc716cbbcf76f35fcSvetoslav            return;
1636fc52023a04fe45b6f59212fc716cbbcf76f35fcSvetoslav        }
1646fc52023a04fe45b6f59212fc716cbbcf76f35fcSvetoslav        mProcessedPrintJobs.remove(printJobId);
1656fc52023a04fe45b6f59212fc716cbbcf76f35fcSvetoslav        if (printJob.isQueued() || printJob.isStarted()) {
1666fc52023a04fe45b6f59212fc716cbbcf76f35fcSvetoslav            printJob.fail(getString(R.string.fail_reason));
1676fc52023a04fe45b6f59212fc716cbbcf76f35fcSvetoslav        }
1686fc52023a04fe45b6f59212fc716cbbcf76f35fcSvetoslav    }
1696fc52023a04fe45b6f59212fc716cbbcf76f35fcSvetoslav
170f11598332008fd706ed17be975a0ff73ba7f6a21Svetoslav Ganov    void handleBlockPrintJobDelayed(PrintJobId printJobId) {
1713bb4d60425207dad4241d0565ff0c4a20dca119dSvetoslav Ganov        Message message = mHandler.obtainMessage(
172f11598332008fd706ed17be975a0ff73ba7f6a21Svetoslav Ganov                MyHandler.MSG_HANDLE_BLOCK_PRINT_JOB, printJobId);
1733bb4d60425207dad4241d0565ff0c4a20dca119dSvetoslav Ganov        mHandler.sendMessageDelayed(message, STANDARD_DELAY_MILLIS);
1743bb4d60425207dad4241d0565ff0c4a20dca119dSvetoslav Ganov    }
1753bb4d60425207dad4241d0565ff0c4a20dca119dSvetoslav Ganov
176f11598332008fd706ed17be975a0ff73ba7f6a21Svetoslav Ganov    void handleBlockPrintJob(PrintJobId printJobId) {
1773bb4d60425207dad4241d0565ff0c4a20dca119dSvetoslav Ganov        final PrintJob printJob = mProcessedPrintJobs.get(printJobId);
1783bb4d60425207dad4241d0565ff0c4a20dca119dSvetoslav Ganov        if (printJob == null) {
1793bb4d60425207dad4241d0565ff0c4a20dca119dSvetoslav Ganov            return;
1803bb4d60425207dad4241d0565ff0c4a20dca119dSvetoslav Ganov        }
1813bb4d60425207dad4241d0565ff0c4a20dca119dSvetoslav Ganov
1823bb4d60425207dad4241d0565ff0c4a20dca119dSvetoslav Ganov        if (printJob.isStarted()) {
183f11598332008fd706ed17be975a0ff73ba7f6a21Svetoslav Ganov            printJob.block("Gimme some rest, dude");
1843bb4d60425207dad4241d0565ff0c4a20dca119dSvetoslav Ganov        }
1853bb4d60425207dad4241d0565ff0c4a20dca119dSvetoslav Ganov    }
1863bb4d60425207dad4241d0565ff0c4a20dca119dSvetoslav Ganov
187f11598332008fd706ed17be975a0ff73ba7f6a21Svetoslav Ganov    void handleBlockAndDelayedUnblockPrintJob(PrintJobId printJobId) {
1883bb4d60425207dad4241d0565ff0c4a20dca119dSvetoslav Ganov        handleBlockPrintJob(printJobId);
1893bb4d60425207dad4241d0565ff0c4a20dca119dSvetoslav Ganov
1903bb4d60425207dad4241d0565ff0c4a20dca119dSvetoslav Ganov        Message message = mHandler.obtainMessage(
191f11598332008fd706ed17be975a0ff73ba7f6a21Svetoslav Ganov                MyHandler.MSG_HANDLE_UNBLOCK_PRINT_JOB, printJobId);
1923bb4d60425207dad4241d0565ff0c4a20dca119dSvetoslav Ganov        mHandler.sendMessageDelayed(message, STANDARD_DELAY_MILLIS);
1933bb4d60425207dad4241d0565ff0c4a20dca119dSvetoslav Ganov    }
1943bb4d60425207dad4241d0565ff0c4a20dca119dSvetoslav Ganov
195f11598332008fd706ed17be975a0ff73ba7f6a21Svetoslav Ganov    void handleUnblockPrintJob(PrintJobId printJobId) {
1963bb4d60425207dad4241d0565ff0c4a20dca119dSvetoslav Ganov        final PrintJob printJob = mProcessedPrintJobs.get(printJobId);
1973bb4d60425207dad4241d0565ff0c4a20dca119dSvetoslav Ganov        if (printJob == null) {
1983bb4d60425207dad4241d0565ff0c4a20dca119dSvetoslav Ganov            return;
1993bb4d60425207dad4241d0565ff0c4a20dca119dSvetoslav Ganov        }
2003bb4d60425207dad4241d0565ff0c4a20dca119dSvetoslav Ganov
2013bb4d60425207dad4241d0565ff0c4a20dca119dSvetoslav Ganov        if (printJob.isBlocked()) {
2023bb4d60425207dad4241d0565ff0c4a20dca119dSvetoslav Ganov            printJob.start();
2033bb4d60425207dad4241d0565ff0c4a20dca119dSvetoslav Ganov        }
2043bb4d60425207dad4241d0565ff0c4a20dca119dSvetoslav Ganov    }
2053bb4d60425207dad4241d0565ff0c4a20dca119dSvetoslav Ganov
206f11598332008fd706ed17be975a0ff73ba7f6a21Svetoslav Ganov    void handleQueuedPrintJobDelayed(PrintJobId printJobId) {
2073bb4d60425207dad4241d0565ff0c4a20dca119dSvetoslav Ganov        final PrintJob printJob = mProcessedPrintJobs.get(printJobId);
2083bb4d60425207dad4241d0565ff0c4a20dca119dSvetoslav Ganov        if (printJob == null) {
2093bb4d60425207dad4241d0565ff0c4a20dca119dSvetoslav Ganov            return;
2103bb4d60425207dad4241d0565ff0c4a20dca119dSvetoslav Ganov        }
2113bb4d60425207dad4241d0565ff0c4a20dca119dSvetoslav Ganov
2123bb4d60425207dad4241d0565ff0c4a20dca119dSvetoslav Ganov        if (printJob.isQueued()) {
2133bb4d60425207dad4241d0565ff0c4a20dca119dSvetoslav Ganov            printJob.start();
2143bb4d60425207dad4241d0565ff0c4a20dca119dSvetoslav Ganov        }
2156fc52023a04fe45b6f59212fc716cbbcf76f35fcSvetoslav        Message message = mHandler.obtainMessage(
216f11598332008fd706ed17be975a0ff73ba7f6a21Svetoslav Ganov                MyHandler.MSG_HANDLE_DO_PRINT_JOB, printJobId);
2176fc52023a04fe45b6f59212fc716cbbcf76f35fcSvetoslav        mHandler.sendMessageDelayed(message, STANDARD_DELAY_MILLIS);
2186fc52023a04fe45b6f59212fc716cbbcf76f35fcSvetoslav    }
2196fc52023a04fe45b6f59212fc716cbbcf76f35fcSvetoslav
2209981caa9c40383230c2e08fade7cbe03e2d96125Philip P. Moltmann    /**
2219981caa9c40383230c2e08fade7cbe03e2d96125Philip P. Moltmann     * Pretend that the print job has progressed.
2229981caa9c40383230c2e08fade7cbe03e2d96125Philip P. Moltmann     *
2239981caa9c40383230c2e08fade7cbe03e2d96125Philip P. Moltmann     * @param printJobId ID of the print job to progress
2249981caa9c40383230c2e08fade7cbe03e2d96125Philip P. Moltmann     * @param progress the new value to progress to
2259981caa9c40383230c2e08fade7cbe03e2d96125Philip P. Moltmann     */
2269981caa9c40383230c2e08fade7cbe03e2d96125Philip P. Moltmann    void handlePrintJobProgress(@NonNull PrintJobId printJobId, int progress) {
2279981caa9c40383230c2e08fade7cbe03e2d96125Philip P. Moltmann        final PrintJob printJob = mProcessedPrintJobs.get(printJobId);
2289981caa9c40383230c2e08fade7cbe03e2d96125Philip P. Moltmann        if (printJob == null) {
2299981caa9c40383230c2e08fade7cbe03e2d96125Philip P. Moltmann            return;
2309981caa9c40383230c2e08fade7cbe03e2d96125Philip P. Moltmann        }
2319981caa9c40383230c2e08fade7cbe03e2d96125Philip P. Moltmann
2329981caa9c40383230c2e08fade7cbe03e2d96125Philip P. Moltmann        if (printJob.isQueued()) {
2339981caa9c40383230c2e08fade7cbe03e2d96125Philip P. Moltmann            printJob.start();
2349981caa9c40383230c2e08fade7cbe03e2d96125Philip P. Moltmann        }
2359981caa9c40383230c2e08fade7cbe03e2d96125Philip P. Moltmann
2369981caa9c40383230c2e08fade7cbe03e2d96125Philip P. Moltmann        if (progress == 100) {
2379981caa9c40383230c2e08fade7cbe03e2d96125Philip P. Moltmann            handleQueuedPrintJob(printJobId);
2389981caa9c40383230c2e08fade7cbe03e2d96125Philip P. Moltmann        } else {
2399981caa9c40383230c2e08fade7cbe03e2d96125Philip P. Moltmann            printJob.setProgress((float)progress / 100);
2409981caa9c40383230c2e08fade7cbe03e2d96125Philip P. Moltmann            printJob.setStatus("Printing progress: " + progress + "%");
2419981caa9c40383230c2e08fade7cbe03e2d96125Philip P. Moltmann
2429981caa9c40383230c2e08fade7cbe03e2d96125Philip P. Moltmann            Message message = mHandler.obtainMessage(
2439981caa9c40383230c2e08fade7cbe03e2d96125Philip P. Moltmann                    MyHandler.MSG_HANDLE_PRINT_JOB_PROGRESS, progress + 10, 0, printJobId);
2449981caa9c40383230c2e08fade7cbe03e2d96125Philip P. Moltmann            mHandler.sendMessageDelayed(message, 1000);
2459981caa9c40383230c2e08fade7cbe03e2d96125Philip P. Moltmann        }
2469981caa9c40383230c2e08fade7cbe03e2d96125Philip P. Moltmann    }
2479981caa9c40383230c2e08fade7cbe03e2d96125Philip P. Moltmann
248f11598332008fd706ed17be975a0ff73ba7f6a21Svetoslav Ganov    void handleQueuedPrintJob(PrintJobId printJobId) {
2496fc52023a04fe45b6f59212fc716cbbcf76f35fcSvetoslav        final PrintJob printJob = mProcessedPrintJobs.get(printJobId);
2506fc52023a04fe45b6f59212fc716cbbcf76f35fcSvetoslav        if (printJob == null) {
2516fc52023a04fe45b6f59212fc716cbbcf76f35fcSvetoslav            return;
2526fc52023a04fe45b6f59212fc716cbbcf76f35fcSvetoslav        }
2536fc52023a04fe45b6f59212fc716cbbcf76f35fcSvetoslav
2548dea95de32a43b110a10a445a6dfd8fba4232073Svetoslav Ganov        if (printJob.isQueued()) {
2558dea95de32a43b110a10a445a6dfd8fba4232073Svetoslav Ganov            printJob.start();
2560fb6959ad364ee84e83c435d671228fb365f2084Svetoslav        }
2578dea95de32a43b110a10a445a6dfd8fba4232073Svetoslav Ganov
258f885d1211c6356a1978df6b99778b6caad75c8eaPhilip P. Moltmann        try {
259f885d1211c6356a1978df6b99778b6caad75c8eaPhilip P. Moltmann            final File file = File.createTempFile(this.getClass().getSimpleName(), ".pdf",
260f885d1211c6356a1978df6b99778b6caad75c8eaPhilip P. Moltmann                    getFilesDir());
261f885d1211c6356a1978df6b99778b6caad75c8eaPhilip P. Moltmann            mFakePrintTask = new AsyncTask<ParcelFileDescriptor, Void, Void>() {
262f885d1211c6356a1978df6b99778b6caad75c8eaPhilip P. Moltmann                @Override
263f885d1211c6356a1978df6b99778b6caad75c8eaPhilip P. Moltmann                protected Void doInBackground(ParcelFileDescriptor... params) {
264f885d1211c6356a1978df6b99778b6caad75c8eaPhilip P. Moltmann                    InputStream in = new BufferedInputStream(new FileInputStream(
265f885d1211c6356a1978df6b99778b6caad75c8eaPhilip P. Moltmann                            params[0].getFileDescriptor()));
266f885d1211c6356a1978df6b99778b6caad75c8eaPhilip P. Moltmann                    OutputStream out = null;
267f885d1211c6356a1978df6b99778b6caad75c8eaPhilip P. Moltmann                    try {
268f885d1211c6356a1978df6b99778b6caad75c8eaPhilip P. Moltmann                        out = new BufferedOutputStream(new FileOutputStream(file));
269f885d1211c6356a1978df6b99778b6caad75c8eaPhilip P. Moltmann                        final byte[] buffer = new byte[8192];
270f885d1211c6356a1978df6b99778b6caad75c8eaPhilip P. Moltmann                        while (true) {
271f885d1211c6356a1978df6b99778b6caad75c8eaPhilip P. Moltmann                            if (isCancelled()) {
272f885d1211c6356a1978df6b99778b6caad75c8eaPhilip P. Moltmann                                break;
273f885d1211c6356a1978df6b99778b6caad75c8eaPhilip P. Moltmann                            }
274f885d1211c6356a1978df6b99778b6caad75c8eaPhilip P. Moltmann                            final int readByteCount = in.read(buffer);
275f885d1211c6356a1978df6b99778b6caad75c8eaPhilip P. Moltmann                            if (readByteCount < 0) {
276f885d1211c6356a1978df6b99778b6caad75c8eaPhilip P. Moltmann                                break;
277f885d1211c6356a1978df6b99778b6caad75c8eaPhilip P. Moltmann                            }
278f885d1211c6356a1978df6b99778b6caad75c8eaPhilip P. Moltmann                            out.write(buffer, 0, readByteCount);
2798dea95de32a43b110a10a445a6dfd8fba4232073Svetoslav Ganov                        }
280f885d1211c6356a1978df6b99778b6caad75c8eaPhilip P. Moltmann                    } catch (IOException ioe) {
281f885d1211c6356a1978df6b99778b6caad75c8eaPhilip P. Moltmann                        throw new RuntimeException(ioe);
282f885d1211c6356a1978df6b99778b6caad75c8eaPhilip P. Moltmann                    } finally {
283f885d1211c6356a1978df6b99778b6caad75c8eaPhilip P. Moltmann                        if (in != null) {
284f885d1211c6356a1978df6b99778b6caad75c8eaPhilip P. Moltmann                            try {
285f885d1211c6356a1978df6b99778b6caad75c8eaPhilip P. Moltmann                                in.close();
286f885d1211c6356a1978df6b99778b6caad75c8eaPhilip P. Moltmann                            } catch (IOException ioe) {
287f885d1211c6356a1978df6b99778b6caad75c8eaPhilip P. Moltmann                                /* ignore */
288f885d1211c6356a1978df6b99778b6caad75c8eaPhilip P. Moltmann                            }
2890fb6959ad364ee84e83c435d671228fb365f2084Svetoslav                        }
290f885d1211c6356a1978df6b99778b6caad75c8eaPhilip P. Moltmann                        if (out != null) {
291f885d1211c6356a1978df6b99778b6caad75c8eaPhilip P. Moltmann                            try {
292f885d1211c6356a1978df6b99778b6caad75c8eaPhilip P. Moltmann                                out.close();
293f885d1211c6356a1978df6b99778b6caad75c8eaPhilip P. Moltmann                            } catch (IOException ioe) {
294f885d1211c6356a1978df6b99778b6caad75c8eaPhilip P. Moltmann                                /* ignore */
295f885d1211c6356a1978df6b99778b6caad75c8eaPhilip P. Moltmann                            }
2963bb4d60425207dad4241d0565ff0c4a20dca119dSvetoslav Ganov                        }
297f885d1211c6356a1978df6b99778b6caad75c8eaPhilip P. Moltmann                        if (isCancelled()) {
298f885d1211c6356a1978df6b99778b6caad75c8eaPhilip P. Moltmann                            file.delete();
2993bb4d60425207dad4241d0565ff0c4a20dca119dSvetoslav Ganov                        }
3003bb4d60425207dad4241d0565ff0c4a20dca119dSvetoslav Ganov                    }
301f885d1211c6356a1978df6b99778b6caad75c8eaPhilip P. Moltmann                    return null;
3020fb6959ad364ee84e83c435d671228fb365f2084Svetoslav                }
3030fb6959ad364ee84e83c435d671228fb365f2084Svetoslav
304f885d1211c6356a1978df6b99778b6caad75c8eaPhilip P. Moltmann                @Override
305f885d1211c6356a1978df6b99778b6caad75c8eaPhilip P. Moltmann                protected void onPostExecute(Void result) {
306f885d1211c6356a1978df6b99778b6caad75c8eaPhilip P. Moltmann                    if (printJob.isStarted()) {
307f885d1211c6356a1978df6b99778b6caad75c8eaPhilip P. Moltmann                        printJob.complete();
308f885d1211c6356a1978df6b99778b6caad75c8eaPhilip P. Moltmann                    }
3090fb6959ad364ee84e83c435d671228fb365f2084Svetoslav
310f885d1211c6356a1978df6b99778b6caad75c8eaPhilip P. Moltmann                    file.setReadable(true, false);
311ecaec06dfbaa011676c37f5f6170b984da5c6a5eSvetoslav Ganov
312f885d1211c6356a1978df6b99778b6caad75c8eaPhilip P. Moltmann                    // Quick and dirty to show the file - use a content provider instead.
313f885d1211c6356a1978df6b99778b6caad75c8eaPhilip P. Moltmann                    Intent intent = new Intent(Intent.ACTION_VIEW);
314f885d1211c6356a1978df6b99778b6caad75c8eaPhilip P. Moltmann                    intent.setDataAndType(Uri.fromFile(file), "application/pdf");
315f885d1211c6356a1978df6b99778b6caad75c8eaPhilip P. Moltmann                    intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
316f885d1211c6356a1978df6b99778b6caad75c8eaPhilip P. Moltmann                    startActivity(intent, null);
3170fb6959ad364ee84e83c435d671228fb365f2084Svetoslav
318f885d1211c6356a1978df6b99778b6caad75c8eaPhilip P. Moltmann                    mFakePrintTask = null;
319f885d1211c6356a1978df6b99778b6caad75c8eaPhilip P. Moltmann                }
3207ae2878f5219d55e842348eb44ffb5070b9d708dSvetoslav Ganov
321f885d1211c6356a1978df6b99778b6caad75c8eaPhilip P. Moltmann                @Override
322f885d1211c6356a1978df6b99778b6caad75c8eaPhilip P. Moltmann                protected void onCancelled(Void result) {
323f885d1211c6356a1978df6b99778b6caad75c8eaPhilip P. Moltmann                    if (printJob.isStarted()) {
324f885d1211c6356a1978df6b99778b6caad75c8eaPhilip P. Moltmann                        printJob.cancel();
325f885d1211c6356a1978df6b99778b6caad75c8eaPhilip P. Moltmann                    }
3267ae2878f5219d55e842348eb44ffb5070b9d708dSvetoslav Ganov                }
327f885d1211c6356a1978df6b99778b6caad75c8eaPhilip P. Moltmann            };
328f885d1211c6356a1978df6b99778b6caad75c8eaPhilip P. Moltmann            mFakePrintTask.executeOnExecutor(AsyncTask.SERIAL_EXECUTOR,
329f885d1211c6356a1978df6b99778b6caad75c8eaPhilip P. Moltmann                    printJob.getDocument().getData());
330f885d1211c6356a1978df6b99778b6caad75c8eaPhilip P. Moltmann        } catch (IOException e) {
331f885d1211c6356a1978df6b99778b6caad75c8eaPhilip P. Moltmann            Log.e(LOG_TAG, "Could not create temporary file: %s", e);
332f885d1211c6356a1978df6b99778b6caad75c8eaPhilip P. Moltmann            return;
333f885d1211c6356a1978df6b99778b6caad75c8eaPhilip P. Moltmann        }
3340fb6959ad364ee84e83c435d671228fb365f2084Svetoslav    }
3350fb6959ad364ee84e83c435d671228fb365f2084Svetoslav
3360fb6959ad364ee84e83c435d671228fb365f2084Svetoslav    private final class MyHandler extends Handler {
3376fc52023a04fe45b6f59212fc716cbbcf76f35fcSvetoslav        public static final int MSG_HANDLE_DO_PRINT_JOB = 1;
3386fc52023a04fe45b6f59212fc716cbbcf76f35fcSvetoslav        public static final int MSG_HANDLE_FAIL_PRINT_JOB = 2;
3393bb4d60425207dad4241d0565ff0c4a20dca119dSvetoslav Ganov        public static final int MSG_HANDLE_BLOCK_PRINT_JOB = 3;
3403bb4d60425207dad4241d0565ff0c4a20dca119dSvetoslav Ganov        public static final int MSG_HANDLE_UNBLOCK_PRINT_JOB = 4;
3419981caa9c40383230c2e08fade7cbe03e2d96125Philip P. Moltmann        public static final int MSG_HANDLE_PRINT_JOB_PROGRESS = 5;
3420fb6959ad364ee84e83c435d671228fb365f2084Svetoslav
3430fb6959ad364ee84e83c435d671228fb365f2084Svetoslav        public MyHandler(Looper looper) {
3443bb4d60425207dad4241d0565ff0c4a20dca119dSvetoslav Ganov            super(looper);
3450fb6959ad364ee84e83c435d671228fb365f2084Svetoslav        }
3460fb6959ad364ee84e83c435d671228fb365f2084Svetoslav
3470fb6959ad364ee84e83c435d671228fb365f2084Svetoslav        @Override
3480fb6959ad364ee84e83c435d671228fb365f2084Svetoslav        public void handleMessage(Message message) {
3490fb6959ad364ee84e83c435d671228fb365f2084Svetoslav            switch (message.what) {
3506fc52023a04fe45b6f59212fc716cbbcf76f35fcSvetoslav                case MSG_HANDLE_DO_PRINT_JOB: {
351f11598332008fd706ed17be975a0ff73ba7f6a21Svetoslav Ganov                    PrintJobId printJobId = (PrintJobId) message.obj;
3526fc52023a04fe45b6f59212fc716cbbcf76f35fcSvetoslav                    handleQueuedPrintJob(printJobId);
3536fc52023a04fe45b6f59212fc716cbbcf76f35fcSvetoslav                } break;
3546fc52023a04fe45b6f59212fc716cbbcf76f35fcSvetoslav
3556fc52023a04fe45b6f59212fc716cbbcf76f35fcSvetoslav                case MSG_HANDLE_FAIL_PRINT_JOB: {
356f11598332008fd706ed17be975a0ff73ba7f6a21Svetoslav Ganov                    PrintJobId printJobId = (PrintJobId) message.obj;
3576fc52023a04fe45b6f59212fc716cbbcf76f35fcSvetoslav                    handleFailPrintJob(printJobId);
3588dea95de32a43b110a10a445a6dfd8fba4232073Svetoslav Ganov                } break;
3593bb4d60425207dad4241d0565ff0c4a20dca119dSvetoslav Ganov
3603bb4d60425207dad4241d0565ff0c4a20dca119dSvetoslav Ganov                case MSG_HANDLE_BLOCK_PRINT_JOB: {
361f11598332008fd706ed17be975a0ff73ba7f6a21Svetoslav Ganov                    PrintJobId printJobId = (PrintJobId) message.obj;
3623bb4d60425207dad4241d0565ff0c4a20dca119dSvetoslav Ganov                    handleBlockPrintJob(printJobId);
3633bb4d60425207dad4241d0565ff0c4a20dca119dSvetoslav Ganov                } break;
3643bb4d60425207dad4241d0565ff0c4a20dca119dSvetoslav Ganov
3653bb4d60425207dad4241d0565ff0c4a20dca119dSvetoslav Ganov                case MSG_HANDLE_UNBLOCK_PRINT_JOB: {
366f11598332008fd706ed17be975a0ff73ba7f6a21Svetoslav Ganov                    PrintJobId printJobId = (PrintJobId) message.obj;
3673bb4d60425207dad4241d0565ff0c4a20dca119dSvetoslav Ganov                    handleUnblockPrintJob(printJobId);
3683bb4d60425207dad4241d0565ff0c4a20dca119dSvetoslav Ganov                } break;
3699981caa9c40383230c2e08fade7cbe03e2d96125Philip P. Moltmann
3709981caa9c40383230c2e08fade7cbe03e2d96125Philip P. Moltmann                case MSG_HANDLE_PRINT_JOB_PROGRESS: {
3719981caa9c40383230c2e08fade7cbe03e2d96125Philip P. Moltmann                    PrintJobId printJobId = (PrintJobId) message.obj;
3729981caa9c40383230c2e08fade7cbe03e2d96125Philip P. Moltmann                    handlePrintJobProgress(printJobId, message.arg1);
3739981caa9c40383230c2e08fade7cbe03e2d96125Philip P. Moltmann                } break;
3740fb6959ad364ee84e83c435d671228fb365f2084Svetoslav            }
3750fb6959ad364ee84e83c435d671228fb365f2084Svetoslav        }
3760fb6959ad364ee84e83c435d671228fb365f2084Svetoslav    }
3771274de1ce4243d6ebb3e12b12b75daf8b466c39cSvetoslav Ganov
3787ae2878f5219d55e842348eb44ffb5070b9d708dSvetoslav Ganov    private final class FakePrinterDiscoverySession extends  PrinterDiscoverySession {
3791274de1ce4243d6ebb3e12b12b75daf8b466c39cSvetoslav Ganov        private final Handler mSesionHandler = new SessionHandler(getMainLooper());
3801274de1ce4243d6ebb3e12b12b75daf8b466c39cSvetoslav Ganov
3817ae2878f5219d55e842348eb44ffb5070b9d708dSvetoslav Ganov        private final List<PrinterInfo> mFakePrinters = new ArrayList<PrinterInfo>();
3827ae2878f5219d55e842348eb44ffb5070b9d708dSvetoslav Ganov
3837ae2878f5219d55e842348eb44ffb5070b9d708dSvetoslav Ganov        public FakePrinterDiscoverySession() {
384c02ac3775cd61bba799dbf70a707507410b3ff13Philip P. Moltmann            for (int i = 0; i < 6; i++) {
385a3eee78c0e6d279a2c1d91742960549864d17d03Svetoslav Ganov                String name = "Printer " + i;
3865a2dc1db96c25efda213b44e5f479b5725fce16dPhilip P. Moltmann
3875a2dc1db96c25efda213b44e5f479b5725fce16dPhilip P. Moltmann                PrinterInfo.Builder builder = new PrinterInfo.Builder(generatePrinterId(name), name,
388c02ac3775cd61bba799dbf70a707507410b3ff13Philip P. Moltmann                        (i == 1 || i == 2) ? PrinterInfo.STATUS_UNAVAILABLE
389c02ac3775cd61bba799dbf70a707507410b3ff13Philip P. Moltmann                                : PrinterInfo.STATUS_IDLE);
390c02ac3775cd61bba799dbf70a707507410b3ff13Philip P. Moltmann
391c02ac3775cd61bba799dbf70a707507410b3ff13Philip P. Moltmann                if (i != 3) {
392c02ac3775cd61bba799dbf70a707507410b3ff13Philip P. Moltmann                    builder.setDescription("Launch a menu to select behavior.");
393c02ac3775cd61bba799dbf70a707507410b3ff13Philip P. Moltmann                }
394c02ac3775cd61bba799dbf70a707507410b3ff13Philip P. Moltmann
395c02ac3775cd61bba799dbf70a707507410b3ff13Philip P. Moltmann                if (i != 4) {
396c02ac3775cd61bba799dbf70a707507410b3ff13Philip P. Moltmann                    builder.setIconResourceId(R.drawable.printer);
397c02ac3775cd61bba799dbf70a707507410b3ff13Philip P. Moltmann                }
398c02ac3775cd61bba799dbf70a707507410b3ff13Philip P. Moltmann
399c02ac3775cd61bba799dbf70a707507410b3ff13Philip P. Moltmann                if (i % 2 == 0) {
400c02ac3775cd61bba799dbf70a707507410b3ff13Philip P. Moltmann                    Intent infoIntent = new Intent(MyPrintService.this, InfoActivity.class);
401c02ac3775cd61bba799dbf70a707507410b3ff13Philip P. Moltmann                    infoIntent.putExtra(InfoActivity.PRINTER_NAME, name);
402c02ac3775cd61bba799dbf70a707507410b3ff13Philip P. Moltmann                    PendingIntent infoPendingIntent = PendingIntent.getActivity(
403c02ac3775cd61bba799dbf70a707507410b3ff13Philip P. Moltmann                            getApplicationContext(),
404c02ac3775cd61bba799dbf70a707507410b3ff13Philip P. Moltmann                            i, infoIntent, PendingIntent.FLAG_UPDATE_CURRENT);
405c02ac3775cd61bba799dbf70a707507410b3ff13Philip P. Moltmann
406c02ac3775cd61bba799dbf70a707507410b3ff13Philip P. Moltmann                    builder.setInfoIntent(infoPendingIntent);
407c02ac3775cd61bba799dbf70a707507410b3ff13Philip P. Moltmann                }
408c02ac3775cd61bba799dbf70a707507410b3ff13Philip P. Moltmann
409c02ac3775cd61bba799dbf70a707507410b3ff13Philip P. Moltmann                if (i == 5) {
410c02ac3775cd61bba799dbf70a707507410b3ff13Philip P. Moltmann                    builder.setHasCustomPrinterIcon();
411c02ac3775cd61bba799dbf70a707507410b3ff13Philip P. Moltmann                }
412c02ac3775cd61bba799dbf70a707507410b3ff13Philip P. Moltmann
4135a2dc1db96c25efda213b44e5f479b5725fce16dPhilip P. Moltmann                mFakePrinters.add(builder.build());
4147ae2878f5219d55e842348eb44ffb5070b9d708dSvetoslav Ganov            }
4157ae2878f5219d55e842348eb44ffb5070b9d708dSvetoslav Ganov        }
4167ae2878f5219d55e842348eb44ffb5070b9d708dSvetoslav Ganov
4177ae2878f5219d55e842348eb44ffb5070b9d708dSvetoslav Ganov        @Override
4187ae2878f5219d55e842348eb44ffb5070b9d708dSvetoslav Ganov        public void onDestroy() {
4197ae2878f5219d55e842348eb44ffb5070b9d708dSvetoslav Ganov            Log.i(LOG_TAG, "FakePrinterDiscoverySession#onDestroy()");
4207ae2878f5219d55e842348eb44ffb5070b9d708dSvetoslav Ganov            mSesionHandler.removeMessages(SessionHandler.MSG_ADD_FIRST_BATCH_FAKE_PRINTERS);
4211274de1ce4243d6ebb3e12b12b75daf8b466c39cSvetoslav Ganov        }
4221274de1ce4243d6ebb3e12b12b75daf8b466c39cSvetoslav Ganov
4231274de1ce4243d6ebb3e12b12b75daf8b466c39cSvetoslav Ganov        @Override
4247ae2878f5219d55e842348eb44ffb5070b9d708dSvetoslav Ganov        public void onStartPrinterDiscovery(List<PrinterId> priorityList) {
4257ae2878f5219d55e842348eb44ffb5070b9d708dSvetoslav Ganov            Log.i(LOG_TAG, "FakePrinterDiscoverySession#onStartPrinterDiscovery()");
4261274de1ce4243d6ebb3e12b12b75daf8b466c39cSvetoslav Ganov            Message message1 = mSesionHandler.obtainMessage(
4277ae2878f5219d55e842348eb44ffb5070b9d708dSvetoslav Ganov                    SessionHandler.MSG_ADD_FIRST_BATCH_FAKE_PRINTERS, this);
4281274de1ce4243d6ebb3e12b12b75daf8b466c39cSvetoslav Ganov            mSesionHandler.sendMessageDelayed(message1, 0);
4291274de1ce4243d6ebb3e12b12b75daf8b466c39cSvetoslav Ganov        }
4301274de1ce4243d6ebb3e12b12b75daf8b466c39cSvetoslav Ganov
4311274de1ce4243d6ebb3e12b12b75daf8b466c39cSvetoslav Ganov        @Override
4327ae2878f5219d55e842348eb44ffb5070b9d708dSvetoslav Ganov        public void onStopPrinterDiscovery() {
4337ae2878f5219d55e842348eb44ffb5070b9d708dSvetoslav Ganov            Log.i(LOG_TAG, "FakePrinterDiscoverySession#onStopPrinterDiscovery()");
4341274de1ce4243d6ebb3e12b12b75daf8b466c39cSvetoslav Ganov            cancellAddingFakePrinters();
4351274de1ce4243d6ebb3e12b12b75daf8b466c39cSvetoslav Ganov        }
4361274de1ce4243d6ebb3e12b12b75daf8b466c39cSvetoslav Ganov
4371274de1ce4243d6ebb3e12b12b75daf8b466c39cSvetoslav Ganov        @Override
4383bb4d60425207dad4241d0565ff0c4a20dca119dSvetoslav Ganov        public void onStartPrinterStateTracking(PrinterId printerId) {
4393bb4d60425207dad4241d0565ff0c4a20dca119dSvetoslav Ganov            Log.i(LOG_TAG, "FakePrinterDiscoverySession#onStartPrinterStateTracking()");
4405a2dc1db96c25efda213b44e5f479b5725fce16dPhilip P. Moltmann
4415a2dc1db96c25efda213b44e5f479b5725fce16dPhilip P. Moltmann            final int printerCount = mFakePrinters.size();
4425a2dc1db96c25efda213b44e5f479b5725fce16dPhilip P. Moltmann            for (int i = printerCount - 1; i >= 0; i--) {
4435a2dc1db96c25efda213b44e5f479b5725fce16dPhilip P. Moltmann                PrinterInfo printer = mFakePrinters.remove(i);
4445a2dc1db96c25efda213b44e5f479b5725fce16dPhilip P. Moltmann
4455a2dc1db96c25efda213b44e5f479b5725fce16dPhilip P. Moltmann                if (printer.getId().equals(printerId)) {
4465a2dc1db96c25efda213b44e5f479b5725fce16dPhilip P. Moltmann                    PrinterCapabilitiesInfo capabilities = new PrinterCapabilitiesInfo.Builder(
4475a2dc1db96c25efda213b44e5f479b5725fce16dPhilip P. Moltmann                            printerId)
4485a2dc1db96c25efda213b44e5f479b5725fce16dPhilip P. Moltmann                                    .setMinMargins(new Margins(200, 200, 200, 200))
4495a2dc1db96c25efda213b44e5f479b5725fce16dPhilip P. Moltmann                                    .addMediaSize(MediaSize.ISO_A4, true)
4505a2dc1db96c25efda213b44e5f479b5725fce16dPhilip P. Moltmann                                    .addMediaSize(MediaSize.NA_GOVT_LETTER, false)
4515a2dc1db96c25efda213b44e5f479b5725fce16dPhilip P. Moltmann                                    .addMediaSize(MediaSize.JPN_YOU4, false)
4525a2dc1db96c25efda213b44e5f479b5725fce16dPhilip P. Moltmann                                    .addResolution(new Resolution("R1", getString(
4535a2dc1db96c25efda213b44e5f479b5725fce16dPhilip P. Moltmann                                            R.string.resolution_200x200), 200, 200), false)
4545a2dc1db96c25efda213b44e5f479b5725fce16dPhilip P. Moltmann                                    .addResolution(new Resolution("R2", getString(
4555a2dc1db96c25efda213b44e5f479b5725fce16dPhilip P. Moltmann                                            R.string.resolution_300x300), 300, 300), true)
4565a2dc1db96c25efda213b44e5f479b5725fce16dPhilip P. Moltmann                                    .setColorModes(PrintAttributes.COLOR_MODE_COLOR
4575a2dc1db96c25efda213b44e5f479b5725fce16dPhilip P. Moltmann                                            | PrintAttributes.COLOR_MODE_MONOCHROME,
4585a2dc1db96c25efda213b44e5f479b5725fce16dPhilip P. Moltmann                                            PrintAttributes.COLOR_MODE_MONOCHROME)
4595a2dc1db96c25efda213b44e5f479b5725fce16dPhilip P. Moltmann                                    .setDuplexModes(PrintAttributes.DUPLEX_MODE_LONG_EDGE
4605a2dc1db96c25efda213b44e5f479b5725fce16dPhilip P. Moltmann                                            | PrintAttributes.DUPLEX_MODE_NONE,
4615a2dc1db96c25efda213b44e5f479b5725fce16dPhilip P. Moltmann                                            PrintAttributes.DUPLEX_MODE_LONG_EDGE)
4625a2dc1db96c25efda213b44e5f479b5725fce16dPhilip P. Moltmann                                    .build();
4635a2dc1db96c25efda213b44e5f479b5725fce16dPhilip P. Moltmann
4645a2dc1db96c25efda213b44e5f479b5725fce16dPhilip P. Moltmann                    printer = new PrinterInfo.Builder(printer)
4655a2dc1db96c25efda213b44e5f479b5725fce16dPhilip P. Moltmann                            .setCapabilities(capabilities)
4665a2dc1db96c25efda213b44e5f479b5725fce16dPhilip P. Moltmann                            .build();
4675a2dc1db96c25efda213b44e5f479b5725fce16dPhilip P. Moltmann                }
4685a2dc1db96c25efda213b44e5f479b5725fce16dPhilip P. Moltmann
4695a2dc1db96c25efda213b44e5f479b5725fce16dPhilip P. Moltmann                mFakePrinters.add(printer);
4701274de1ce4243d6ebb3e12b12b75daf8b466c39cSvetoslav Ganov            }
4715a2dc1db96c25efda213b44e5f479b5725fce16dPhilip P. Moltmann
4725a2dc1db96c25efda213b44e5f479b5725fce16dPhilip P. Moltmann            addPrinters(mFakePrinters);
4735a2dc1db96c25efda213b44e5f479b5725fce16dPhilip P. Moltmann        }
4745a2dc1db96c25efda213b44e5f479b5725fce16dPhilip P. Moltmann
4755a2dc1db96c25efda213b44e5f479b5725fce16dPhilip P. Moltmann        @Override
4765a2dc1db96c25efda213b44e5f479b5725fce16dPhilip P. Moltmann        public void onRequestCustomPrinterIcon(final PrinterId printerId,
4775a2dc1db96c25efda213b44e5f479b5725fce16dPhilip P. Moltmann                final CustomPrinterIconCallback callbacks) {
4785a2dc1db96c25efda213b44e5f479b5725fce16dPhilip P. Moltmann            Log.i(LOG_TAG, "FakePrinterDiscoverySession#onRequestCustomPrinterIcon() " + printerId);
4795a2dc1db96c25efda213b44e5f479b5725fce16dPhilip P. Moltmann
4805a2dc1db96c25efda213b44e5f479b5725fce16dPhilip P. Moltmann            // Pretend the bitmap icon takes 5 seconds to load
4815a2dc1db96c25efda213b44e5f479b5725fce16dPhilip P. Moltmann            mSesionHandler.postDelayed(new Runnable() {
4825a2dc1db96c25efda213b44e5f479b5725fce16dPhilip P. Moltmann                @Override
4835a2dc1db96c25efda213b44e5f479b5725fce16dPhilip P. Moltmann                public void run() {
4845a2dc1db96c25efda213b44e5f479b5725fce16dPhilip P. Moltmann                    final int printerCount = mFakePrinters.size();
4855a2dc1db96c25efda213b44e5f479b5725fce16dPhilip P. Moltmann                    for (int i = printerCount - 1; i >= 0; i--) {
4865a2dc1db96c25efda213b44e5f479b5725fce16dPhilip P. Moltmann                        callbacks.onCustomPrinterIconLoaded(Icon.createWithBitmap(
4875a2dc1db96c25efda213b44e5f479b5725fce16dPhilip P. Moltmann                                BitmapFactory.decodeResource(getResources(), R.raw.red_printer)));
4885a2dc1db96c25efda213b44e5f479b5725fce16dPhilip P. Moltmann                    }
4895a2dc1db96c25efda213b44e5f479b5725fce16dPhilip P. Moltmann                }
4905a2dc1db96c25efda213b44e5f479b5725fce16dPhilip P. Moltmann            }, 5000);
4911274de1ce4243d6ebb3e12b12b75daf8b466c39cSvetoslav Ganov        }
4921274de1ce4243d6ebb3e12b12b75daf8b466c39cSvetoslav Ganov
4933bb4d60425207dad4241d0565ff0c4a20dca119dSvetoslav Ganov        @Override
4943bb4d60425207dad4241d0565ff0c4a20dca119dSvetoslav Ganov        public void onValidatePrinters(List<PrinterId> printerIds) {
495e4a7362e628701bc71289888f6241cc94c9a4fbcSvet Ganov            Log.i(LOG_TAG, "FakePrinterDiscoverySession#onValidatePrinters() " + printerIds);
4963bb4d60425207dad4241d0565ff0c4a20dca119dSvetoslav Ganov        }
4973bb4d60425207dad4241d0565ff0c4a20dca119dSvetoslav Ganov
4983bb4d60425207dad4241d0565ff0c4a20dca119dSvetoslav Ganov        @Override
4993bb4d60425207dad4241d0565ff0c4a20dca119dSvetoslav Ganov        public void onStopPrinterStateTracking(PrinterId printerId) {
5003bb4d60425207dad4241d0565ff0c4a20dca119dSvetoslav Ganov            Log.i(LOG_TAG, "FakePrinterDiscoverySession#onStopPrinterStateTracking()");
5013bb4d60425207dad4241d0565ff0c4a20dca119dSvetoslav Ganov        }
5023bb4d60425207dad4241d0565ff0c4a20dca119dSvetoslav Ganov
5037ae2878f5219d55e842348eb44ffb5070b9d708dSvetoslav Ganov        private void addFirstBatchFakePrinters() {
5045a2dc1db96c25efda213b44e5f479b5725fce16dPhilip P. Moltmann            List<PrinterInfo> printers = mFakePrinters.subList(0, mFakePrinters.size());
5058fa1c1973dd8659e52462103b21a926ee9747351Svetoslav            addPrinters(printers);
5061274de1ce4243d6ebb3e12b12b75daf8b466c39cSvetoslav Ganov        }
5071274de1ce4243d6ebb3e12b12b75daf8b466c39cSvetoslav Ganov
5081274de1ce4243d6ebb3e12b12b75daf8b466c39cSvetoslav Ganov        private void cancellAddingFakePrinters() {
5097ae2878f5219d55e842348eb44ffb5070b9d708dSvetoslav Ganov            mSesionHandler.removeMessages(SessionHandler.MSG_ADD_FIRST_BATCH_FAKE_PRINTERS);
5101274de1ce4243d6ebb3e12b12b75daf8b466c39cSvetoslav Ganov        }
5111274de1ce4243d6ebb3e12b12b75daf8b466c39cSvetoslav Ganov
5121274de1ce4243d6ebb3e12b12b75daf8b466c39cSvetoslav Ganov        final class SessionHandler extends Handler {
5137ae2878f5219d55e842348eb44ffb5070b9d708dSvetoslav Ganov            public static final int MSG_ADD_FIRST_BATCH_FAKE_PRINTERS = 1;
5141274de1ce4243d6ebb3e12b12b75daf8b466c39cSvetoslav Ganov
5151274de1ce4243d6ebb3e12b12b75daf8b466c39cSvetoslav Ganov            public SessionHandler(Looper looper) {
5163bb4d60425207dad4241d0565ff0c4a20dca119dSvetoslav Ganov                super(looper);
5171274de1ce4243d6ebb3e12b12b75daf8b466c39cSvetoslav Ganov            }
5181274de1ce4243d6ebb3e12b12b75daf8b466c39cSvetoslav Ganov
5191274de1ce4243d6ebb3e12b12b75daf8b466c39cSvetoslav Ganov            @Override
5201274de1ce4243d6ebb3e12b12b75daf8b466c39cSvetoslav Ganov            public void handleMessage(Message message) {
5211274de1ce4243d6ebb3e12b12b75daf8b466c39cSvetoslav Ganov                switch (message.what) {
5227ae2878f5219d55e842348eb44ffb5070b9d708dSvetoslav Ganov                    case MSG_ADD_FIRST_BATCH_FAKE_PRINTERS: {
5237ae2878f5219d55e842348eb44ffb5070b9d708dSvetoslav Ganov                        addFirstBatchFakePrinters();
5241274de1ce4243d6ebb3e12b12b75daf8b466c39cSvetoslav Ganov                    } break;
5251274de1ce4243d6ebb3e12b12b75daf8b466c39cSvetoslav Ganov                }
5261274de1ce4243d6ebb3e12b12b75daf8b466c39cSvetoslav Ganov            }
5271274de1ce4243d6ebb3e12b12b75daf8b466c39cSvetoslav Ganov        }
5281274de1ce4243d6ebb3e12b12b75daf8b466c39cSvetoslav Ganov    }
5290fb6959ad364ee84e83c435d671228fb365f2084Svetoslav}
530