MyPrintService.java revision d01dcca2d759fb4044cbb72206b1caae722d8c89
17ae2878f5219d55e842348eb44ffb5070b9d708dSvetoslav Ganov/*
27ae2878f5219d55e842348eb44ffb5070b9d708dSvetoslav Ganov * Copyright (C) 2013 The Android Open Source Project
37ae2878f5219d55e842348eb44ffb5070b9d708dSvetoslav Ganov *
47ae2878f5219d55e842348eb44ffb5070b9d708dSvetoslav Ganov * Licensed under the Apache License, Version 2.0 (the "License");
57ae2878f5219d55e842348eb44ffb5070b9d708dSvetoslav Ganov * you may not use this file except in compliance with the License.
67ae2878f5219d55e842348eb44ffb5070b9d708dSvetoslav Ganov * You may obtain a copy of the License at
77ae2878f5219d55e842348eb44ffb5070b9d708dSvetoslav Ganov *
87ae2878f5219d55e842348eb44ffb5070b9d708dSvetoslav Ganov *      http://www.apache.org/licenses/LICENSE-2.0
97ae2878f5219d55e842348eb44ffb5070b9d708dSvetoslav Ganov *
107ae2878f5219d55e842348eb44ffb5070b9d708dSvetoslav Ganov * Unless required by applicable law or agreed to in writing, software
117ae2878f5219d55e842348eb44ffb5070b9d708dSvetoslav Ganov * distributed under the License is distributed on an "AS IS" BASIS,
127ae2878f5219d55e842348eb44ffb5070b9d708dSvetoslav Ganov * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
137ae2878f5219d55e842348eb44ffb5070b9d708dSvetoslav Ganov * See the License for the specific language governing permissions and
147ae2878f5219d55e842348eb44ffb5070b9d708dSvetoslav Ganov * limitations under the License.
157ae2878f5219d55e842348eb44ffb5070b9d708dSvetoslav Ganov */
167ae2878f5219d55e842348eb44ffb5070b9d708dSvetoslav Ganov
170fb6959ad364ee84e83c435d671228fb365f2084Svetoslavpackage foo.bar.printservice;
180fb6959ad364ee84e83c435d671228fb365f2084Svetoslav
199981caa9c40383230c2e08fade7cbe03e2d96125Philip P. Moltmannimport android.annotation.NonNull;
205a2dc1db96c25efda213b44e5f479b5725fce16dPhilip P. Moltmannimport android.app.PendingIntent;
210fb6959ad364ee84e83c435d671228fb365f2084Svetoslavimport android.content.Intent;
225a2dc1db96c25efda213b44e5f479b5725fce16dPhilip P. Moltmannimport android.graphics.BitmapFactory;
235a2dc1db96c25efda213b44e5f479b5725fce16dPhilip P. Moltmannimport android.graphics.drawable.Icon;
240fb6959ad364ee84e83c435d671228fb365f2084Svetoslavimport android.net.Uri;
250fb6959ad364ee84e83c435d671228fb365f2084Svetoslavimport android.os.AsyncTask;
269dac8ebb191a10f37933a7893ecb0317de002d99Philip P. Moltmannimport android.os.Build;
270fb6959ad364ee84e83c435d671228fb365f2084Svetoslavimport android.os.Handler;
280fb6959ad364ee84e83c435d671228fb365f2084Svetoslavimport android.os.Looper;
290fb6959ad364ee84e83c435d671228fb365f2084Svetoslavimport android.os.Message;
303bb4d60425207dad4241d0565ff0c4a20dca119dSvetoslav Ganovimport android.os.ParcelFileDescriptor;
310fb6959ad364ee84e83c435d671228fb365f2084Svetoslavimport android.print.PrintAttributes;
320fb6959ad364ee84e83c435d671228fb365f2084Svetoslavimport android.print.PrintAttributes.Margins;
33c6c630d5c2b70440d433aa19bcf50c115d9cf39aSvetoslav Ganovimport android.print.PrintAttributes.MediaSize;
340fb6959ad364ee84e83c435d671228fb365f2084Svetoslavimport android.print.PrintAttributes.Resolution;
35f11598332008fd706ed17be975a0ff73ba7f6a21Svetoslav Ganovimport android.print.PrintJobId;
361274de1ce4243d6ebb3e12b12b75daf8b466c39cSvetoslav Ganovimport android.print.PrinterCapabilitiesInfo;
370fb6959ad364ee84e83c435d671228fb365f2084Svetoslavimport android.print.PrinterId;
380fb6959ad364ee84e83c435d671228fb365f2084Svetoslavimport android.print.PrinterInfo;
395a2dc1db96c25efda213b44e5f479b5725fce16dPhilip P. Moltmannimport android.printservice.CustomPrinterIconCallback;
400fb6959ad364ee84e83c435d671228fb365f2084Svetoslavimport android.printservice.PrintJob;
410fb6959ad364ee84e83c435d671228fb365f2084Svetoslavimport android.printservice.PrintService;
421274de1ce4243d6ebb3e12b12b75daf8b466c39cSvetoslav Ganovimport android.printservice.PrinterDiscoverySession;
43f11598332008fd706ed17be975a0ff73ba7f6a21Svetoslav Ganovimport android.util.ArrayMap;
440fb6959ad364ee84e83c435d671228fb365f2084Svetoslavimport android.util.Log;
45ecaec06dfbaa011676c37f5f6170b984da5c6a5eSvetoslav Ganov
460fb6959ad364ee84e83c435d671228fb365f2084Svetoslavimport java.io.BufferedInputStream;
470fb6959ad364ee84e83c435d671228fb365f2084Svetoslavimport java.io.BufferedOutputStream;
480fb6959ad364ee84e83c435d671228fb365f2084Svetoslavimport java.io.File;
490fb6959ad364ee84e83c435d671228fb365f2084Svetoslavimport java.io.FileInputStream;
500fb6959ad364ee84e83c435d671228fb365f2084Svetoslavimport java.io.FileOutputStream;
510fb6959ad364ee84e83c435d671228fb365f2084Svetoslavimport java.io.IOException;
520fb6959ad364ee84e83c435d671228fb365f2084Svetoslavimport java.io.InputStream;
530fb6959ad364ee84e83c435d671228fb365f2084Svetoslavimport java.io.OutputStream;
540fb6959ad364ee84e83c435d671228fb365f2084Svetoslavimport java.util.ArrayList;
550fb6959ad364ee84e83c435d671228fb365f2084Svetoslavimport java.util.List;
56f11598332008fd706ed17be975a0ff73ba7f6a21Svetoslav Ganovimport java.util.Map;
570fb6959ad364ee84e83c435d671228fb365f2084Svetoslav
580fb6959ad364ee84e83c435d671228fb365f2084Svetoslavpublic class MyPrintService extends PrintService {
590fb6959ad364ee84e83c435d671228fb365f2084Svetoslav
608dea95de32a43b110a10a445a6dfd8fba4232073Svetoslav Ganov    private static final String LOG_TAG = "MyPrintService";
610fb6959ad364ee84e83c435d671228fb365f2084Svetoslav
62482f8b86361308b90af05c2a3b16eebb0e778882Svetoslav Ganov    private static final long STANDARD_DELAY_MILLIS = 10000000;
636fc52023a04fe45b6f59212fc716cbbcf76f35fcSvetoslav
646fc52023a04fe45b6f59212fc716cbbcf76f35fcSvetoslav    static final String INTENT_EXTRA_ACTION_TYPE = "INTENT_EXTRA_ACTION_TYPE";
656fc52023a04fe45b6f59212fc716cbbcf76f35fcSvetoslav    static final String INTENT_EXTRA_PRINT_JOB_ID = "INTENT_EXTRA_PRINT_JOB_ID";
666fc52023a04fe45b6f59212fc716cbbcf76f35fcSvetoslav
676fc52023a04fe45b6f59212fc716cbbcf76f35fcSvetoslav    static final int ACTION_TYPE_ON_PRINT_JOB_PENDING = 1;
686fc52023a04fe45b6f59212fc716cbbcf76f35fcSvetoslav    static final int ACTION_TYPE_ON_REQUEST_CANCEL_PRINT_JOB = 2;
696fc52023a04fe45b6f59212fc716cbbcf76f35fcSvetoslav
706fc52023a04fe45b6f59212fc716cbbcf76f35fcSvetoslav    private static final Object sLock = new Object();
716fc52023a04fe45b6f59212fc716cbbcf76f35fcSvetoslav
726fc52023a04fe45b6f59212fc716cbbcf76f35fcSvetoslav    private static MyPrintService sInstance;
736fc52023a04fe45b6f59212fc716cbbcf76f35fcSvetoslav
740fb6959ad364ee84e83c435d671228fb365f2084Svetoslav    private Handler mHandler;
750fb6959ad364ee84e83c435d671228fb365f2084Svetoslav
763bb4d60425207dad4241d0565ff0c4a20dca119dSvetoslav Ganov    private AsyncTask<ParcelFileDescriptor, Void, Void> mFakePrintTask;
778dea95de32a43b110a10a445a6dfd8fba4232073Svetoslav Ganov
787ae2878f5219d55e842348eb44ffb5070b9d708dSvetoslav Ganov    private FakePrinterDiscoverySession mSession;
796fc52023a04fe45b6f59212fc716cbbcf76f35fcSvetoslav
80f11598332008fd706ed17be975a0ff73ba7f6a21Svetoslav Ganov    private final Map<PrintJobId, PrintJob> mProcessedPrintJobs =
81f11598332008fd706ed17be975a0ff73ba7f6a21Svetoslav Ganov            new ArrayMap<PrintJobId, PrintJob>();
826fc52023a04fe45b6f59212fc716cbbcf76f35fcSvetoslav
836fc52023a04fe45b6f59212fc716cbbcf76f35fcSvetoslav    public static MyPrintService peekInstance() {
846fc52023a04fe45b6f59212fc716cbbcf76f35fcSvetoslav        synchronized (sLock) {
856fc52023a04fe45b6f59212fc716cbbcf76f35fcSvetoslav            return sInstance;
866fc52023a04fe45b6f59212fc716cbbcf76f35fcSvetoslav        }
876fc52023a04fe45b6f59212fc716cbbcf76f35fcSvetoslav    }
881274de1ce4243d6ebb3e12b12b75daf8b466c39cSvetoslav Ganov
89282209e42c32d712fd5685f283047d84e813297eSvetoslav Ganov    @Override
900fb6959ad364ee84e83c435d671228fb365f2084Svetoslav    protected void onConnected() {
910fb6959ad364ee84e83c435d671228fb365f2084Svetoslav        Log.i(LOG_TAG, "#onConnected()");
921274de1ce4243d6ebb3e12b12b75daf8b466c39cSvetoslav Ganov        mHandler = new MyHandler(getMainLooper());
936fc52023a04fe45b6f59212fc716cbbcf76f35fcSvetoslav        synchronized (sLock) {
946fc52023a04fe45b6f59212fc716cbbcf76f35fcSvetoslav            sInstance = this;
956fc52023a04fe45b6f59212fc716cbbcf76f35fcSvetoslav        }
960fb6959ad364ee84e83c435d671228fb365f2084Svetoslav    }
970fb6959ad364ee84e83c435d671228fb365f2084Svetoslav
980fb6959ad364ee84e83c435d671228fb365f2084Svetoslav    @Override
990fb6959ad364ee84e83c435d671228fb365f2084Svetoslav    protected void onDisconnected() {
1000fb6959ad364ee84e83c435d671228fb365f2084Svetoslav        Log.i(LOG_TAG, "#onDisconnected()");
1011274de1ce4243d6ebb3e12b12b75daf8b466c39cSvetoslav Ganov        if (mSession != null) {
1021274de1ce4243d6ebb3e12b12b75daf8b466c39cSvetoslav Ganov            mSession.cancellAddingFakePrinters();
1031274de1ce4243d6ebb3e12b12b75daf8b466c39cSvetoslav Ganov        }
1046fc52023a04fe45b6f59212fc716cbbcf76f35fcSvetoslav        synchronized (sLock) {
1056fc52023a04fe45b6f59212fc716cbbcf76f35fcSvetoslav            sInstance = null;
1066fc52023a04fe45b6f59212fc716cbbcf76f35fcSvetoslav        }
1070fb6959ad364ee84e83c435d671228fb365f2084Svetoslav    }
1080fb6959ad364ee84e83c435d671228fb365f2084Svetoslav
1090fb6959ad364ee84e83c435d671228fb365f2084Svetoslav    @Override
1101274de1ce4243d6ebb3e12b12b75daf8b466c39cSvetoslav Ganov    protected PrinterDiscoverySession onCreatePrinterDiscoverySession() {
1117ae2878f5219d55e842348eb44ffb5070b9d708dSvetoslav Ganov        Log.i(LOG_TAG, "#onCreatePrinterDiscoverySession()");
1127ae2878f5219d55e842348eb44ffb5070b9d708dSvetoslav Ganov        return new FakePrinterDiscoverySession();
1130fb6959ad364ee84e83c435d671228fb365f2084Svetoslav    }
1140fb6959ad364ee84e83c435d671228fb365f2084Svetoslav
1150fb6959ad364ee84e83c435d671228fb365f2084Svetoslav    @Override
1166fc52023a04fe45b6f59212fc716cbbcf76f35fcSvetoslav    protected void onRequestCancelPrintJob(final PrintJob printJob) {
1176fc52023a04fe45b6f59212fc716cbbcf76f35fcSvetoslav        Log.i(LOG_TAG, "#onRequestCancelPrintJob()");
1186fc52023a04fe45b6f59212fc716cbbcf76f35fcSvetoslav        mProcessedPrintJobs.put(printJob.getId(), printJob);
1196fc52023a04fe45b6f59212fc716cbbcf76f35fcSvetoslav        Intent intent = new Intent(this, MyDialogActivity.class);
1206fc52023a04fe45b6f59212fc716cbbcf76f35fcSvetoslav        intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
1216fc52023a04fe45b6f59212fc716cbbcf76f35fcSvetoslav        intent.putExtra(INTENT_EXTRA_PRINT_JOB_ID, printJob.getId());
1226fc52023a04fe45b6f59212fc716cbbcf76f35fcSvetoslav        intent.putExtra(INTENT_EXTRA_ACTION_TYPE, ACTION_TYPE_ON_REQUEST_CANCEL_PRINT_JOB);
1236fc52023a04fe45b6f59212fc716cbbcf76f35fcSvetoslav        startActivity(intent);
1248dea95de32a43b110a10a445a6dfd8fba4232073Svetoslav Ganov    }
1258dea95de32a43b110a10a445a6dfd8fba4232073Svetoslav Ganov
1268dea95de32a43b110a10a445a6dfd8fba4232073Svetoslav Ganov    @Override
1270fb6959ad364ee84e83c435d671228fb365f2084Svetoslav    public void onPrintJobQueued(final PrintJob printJob) {
128c6c630d5c2b70440d433aa19bcf50c115d9cf39aSvetoslav Ganov        Log.i(LOG_TAG, "#onPrintJobQueued()");
1296fc52023a04fe45b6f59212fc716cbbcf76f35fcSvetoslav        mProcessedPrintJobs.put(printJob.getId(), printJob);
1303bb4d60425207dad4241d0565ff0c4a20dca119dSvetoslav Ganov        if (printJob.isQueued()) {
1313bb4d60425207dad4241d0565ff0c4a20dca119dSvetoslav Ganov            printJob.start();
1323bb4d60425207dad4241d0565ff0c4a20dca119dSvetoslav Ganov        }
1338fa1c1973dd8659e52462103b21a926ee9747351Svetoslav
1346fc52023a04fe45b6f59212fc716cbbcf76f35fcSvetoslav        Intent intent = new Intent(this, MyDialogActivity.class);
1356fc52023a04fe45b6f59212fc716cbbcf76f35fcSvetoslav        intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
1366fc52023a04fe45b6f59212fc716cbbcf76f35fcSvetoslav        intent.putExtra(INTENT_EXTRA_PRINT_JOB_ID, printJob.getId());
1376fc52023a04fe45b6f59212fc716cbbcf76f35fcSvetoslav        intent.putExtra(INTENT_EXTRA_ACTION_TYPE, ACTION_TYPE_ON_PRINT_JOB_PENDING);
1386fc52023a04fe45b6f59212fc716cbbcf76f35fcSvetoslav        startActivity(intent);
1398dea95de32a43b110a10a445a6dfd8fba4232073Svetoslav Ganov    }
1408dea95de32a43b110a10a445a6dfd8fba4232073Svetoslav Ganov
141f11598332008fd706ed17be975a0ff73ba7f6a21Svetoslav Ganov    void handleRequestCancelPrintJob(PrintJobId printJobId) {
1426fc52023a04fe45b6f59212fc716cbbcf76f35fcSvetoslav        PrintJob printJob = mProcessedPrintJobs.get(printJobId);
1436fc52023a04fe45b6f59212fc716cbbcf76f35fcSvetoslav        if (printJob == null) {
1446fc52023a04fe45b6f59212fc716cbbcf76f35fcSvetoslav            return;
1456fc52023a04fe45b6f59212fc716cbbcf76f35fcSvetoslav        }
1466fc52023a04fe45b6f59212fc716cbbcf76f35fcSvetoslav        mProcessedPrintJobs.remove(printJobId);
147482f8b86361308b90af05c2a3b16eebb0e778882Svetoslav Ganov        if (printJob.isQueued() || printJob.isStarted() || printJob.isBlocked()) {
1486fc52023a04fe45b6f59212fc716cbbcf76f35fcSvetoslav            mHandler.removeMessages(MyHandler.MSG_HANDLE_DO_PRINT_JOB);
1496fc52023a04fe45b6f59212fc716cbbcf76f35fcSvetoslav            mHandler.removeMessages(MyHandler.MSG_HANDLE_FAIL_PRINT_JOB);
1506fc52023a04fe45b6f59212fc716cbbcf76f35fcSvetoslav            printJob.cancel();
1516fc52023a04fe45b6f59212fc716cbbcf76f35fcSvetoslav        }
1526fc52023a04fe45b6f59212fc716cbbcf76f35fcSvetoslav    }
1536fc52023a04fe45b6f59212fc716cbbcf76f35fcSvetoslav
154f11598332008fd706ed17be975a0ff73ba7f6a21Svetoslav Ganov    void handleFailPrintJobDelayed(PrintJobId printJobId) {
1556fc52023a04fe45b6f59212fc716cbbcf76f35fcSvetoslav        Message message = mHandler.obtainMessage(
156f11598332008fd706ed17be975a0ff73ba7f6a21Svetoslav Ganov                MyHandler.MSG_HANDLE_FAIL_PRINT_JOB, printJobId);
1576fc52023a04fe45b6f59212fc716cbbcf76f35fcSvetoslav        mHandler.sendMessageDelayed(message, STANDARD_DELAY_MILLIS);
1586fc52023a04fe45b6f59212fc716cbbcf76f35fcSvetoslav    }
1596fc52023a04fe45b6f59212fc716cbbcf76f35fcSvetoslav
160f11598332008fd706ed17be975a0ff73ba7f6a21Svetoslav Ganov    void handleFailPrintJob(PrintJobId printJobId) {
1616fc52023a04fe45b6f59212fc716cbbcf76f35fcSvetoslav        PrintJob printJob = mProcessedPrintJobs.get(printJobId);
1626fc52023a04fe45b6f59212fc716cbbcf76f35fcSvetoslav        if (printJob == null) {
1636fc52023a04fe45b6f59212fc716cbbcf76f35fcSvetoslav            return;
1646fc52023a04fe45b6f59212fc716cbbcf76f35fcSvetoslav        }
1656fc52023a04fe45b6f59212fc716cbbcf76f35fcSvetoslav        mProcessedPrintJobs.remove(printJobId);
1666fc52023a04fe45b6f59212fc716cbbcf76f35fcSvetoslav        if (printJob.isQueued() || printJob.isStarted()) {
1676fc52023a04fe45b6f59212fc716cbbcf76f35fcSvetoslav            printJob.fail(getString(R.string.fail_reason));
1686fc52023a04fe45b6f59212fc716cbbcf76f35fcSvetoslav        }
1696fc52023a04fe45b6f59212fc716cbbcf76f35fcSvetoslav    }
1706fc52023a04fe45b6f59212fc716cbbcf76f35fcSvetoslav
171f11598332008fd706ed17be975a0ff73ba7f6a21Svetoslav Ganov    void handleBlockPrintJobDelayed(PrintJobId printJobId) {
1723bb4d60425207dad4241d0565ff0c4a20dca119dSvetoslav Ganov        Message message = mHandler.obtainMessage(
173f11598332008fd706ed17be975a0ff73ba7f6a21Svetoslav Ganov                MyHandler.MSG_HANDLE_BLOCK_PRINT_JOB, printJobId);
1743bb4d60425207dad4241d0565ff0c4a20dca119dSvetoslav Ganov        mHandler.sendMessageDelayed(message, STANDARD_DELAY_MILLIS);
1753bb4d60425207dad4241d0565ff0c4a20dca119dSvetoslav Ganov    }
1763bb4d60425207dad4241d0565ff0c4a20dca119dSvetoslav Ganov
177f11598332008fd706ed17be975a0ff73ba7f6a21Svetoslav Ganov    void handleBlockPrintJob(PrintJobId printJobId) {
1783bb4d60425207dad4241d0565ff0c4a20dca119dSvetoslav Ganov        final PrintJob printJob = mProcessedPrintJobs.get(printJobId);
1793bb4d60425207dad4241d0565ff0c4a20dca119dSvetoslav Ganov        if (printJob == null) {
1803bb4d60425207dad4241d0565ff0c4a20dca119dSvetoslav Ganov            return;
1813bb4d60425207dad4241d0565ff0c4a20dca119dSvetoslav Ganov        }
1823bb4d60425207dad4241d0565ff0c4a20dca119dSvetoslav Ganov
1833bb4d60425207dad4241d0565ff0c4a20dca119dSvetoslav Ganov        if (printJob.isStarted()) {
184f11598332008fd706ed17be975a0ff73ba7f6a21Svetoslav Ganov            printJob.block("Gimme some rest, dude");
1853bb4d60425207dad4241d0565ff0c4a20dca119dSvetoslav Ganov        }
1863bb4d60425207dad4241d0565ff0c4a20dca119dSvetoslav Ganov    }
1873bb4d60425207dad4241d0565ff0c4a20dca119dSvetoslav Ganov
188f11598332008fd706ed17be975a0ff73ba7f6a21Svetoslav Ganov    void handleBlockAndDelayedUnblockPrintJob(PrintJobId printJobId) {
1893bb4d60425207dad4241d0565ff0c4a20dca119dSvetoslav Ganov        handleBlockPrintJob(printJobId);
1903bb4d60425207dad4241d0565ff0c4a20dca119dSvetoslav Ganov
1913bb4d60425207dad4241d0565ff0c4a20dca119dSvetoslav Ganov        Message message = mHandler.obtainMessage(
192f11598332008fd706ed17be975a0ff73ba7f6a21Svetoslav Ganov                MyHandler.MSG_HANDLE_UNBLOCK_PRINT_JOB, printJobId);
1933bb4d60425207dad4241d0565ff0c4a20dca119dSvetoslav Ganov        mHandler.sendMessageDelayed(message, STANDARD_DELAY_MILLIS);
1943bb4d60425207dad4241d0565ff0c4a20dca119dSvetoslav Ganov    }
1953bb4d60425207dad4241d0565ff0c4a20dca119dSvetoslav Ganov
196f11598332008fd706ed17be975a0ff73ba7f6a21Svetoslav Ganov    void handleUnblockPrintJob(PrintJobId printJobId) {
1973bb4d60425207dad4241d0565ff0c4a20dca119dSvetoslav Ganov        final PrintJob printJob = mProcessedPrintJobs.get(printJobId);
1983bb4d60425207dad4241d0565ff0c4a20dca119dSvetoslav Ganov        if (printJob == null) {
1993bb4d60425207dad4241d0565ff0c4a20dca119dSvetoslav Ganov            return;
2003bb4d60425207dad4241d0565ff0c4a20dca119dSvetoslav Ganov        }
2013bb4d60425207dad4241d0565ff0c4a20dca119dSvetoslav Ganov
2023bb4d60425207dad4241d0565ff0c4a20dca119dSvetoslav Ganov        if (printJob.isBlocked()) {
2033bb4d60425207dad4241d0565ff0c4a20dca119dSvetoslav Ganov            printJob.start();
2043bb4d60425207dad4241d0565ff0c4a20dca119dSvetoslav Ganov        }
2053bb4d60425207dad4241d0565ff0c4a20dca119dSvetoslav Ganov    }
2063bb4d60425207dad4241d0565ff0c4a20dca119dSvetoslav Ganov
207f11598332008fd706ed17be975a0ff73ba7f6a21Svetoslav Ganov    void handleQueuedPrintJobDelayed(PrintJobId printJobId) {
2083bb4d60425207dad4241d0565ff0c4a20dca119dSvetoslav Ganov        final PrintJob printJob = mProcessedPrintJobs.get(printJobId);
2093bb4d60425207dad4241d0565ff0c4a20dca119dSvetoslav Ganov        if (printJob == null) {
2103bb4d60425207dad4241d0565ff0c4a20dca119dSvetoslav Ganov            return;
2113bb4d60425207dad4241d0565ff0c4a20dca119dSvetoslav Ganov        }
2123bb4d60425207dad4241d0565ff0c4a20dca119dSvetoslav Ganov
2133bb4d60425207dad4241d0565ff0c4a20dca119dSvetoslav Ganov        if (printJob.isQueued()) {
2143bb4d60425207dad4241d0565ff0c4a20dca119dSvetoslav Ganov            printJob.start();
2153bb4d60425207dad4241d0565ff0c4a20dca119dSvetoslav Ganov        }
2166fc52023a04fe45b6f59212fc716cbbcf76f35fcSvetoslav        Message message = mHandler.obtainMessage(
217f11598332008fd706ed17be975a0ff73ba7f6a21Svetoslav Ganov                MyHandler.MSG_HANDLE_DO_PRINT_JOB, printJobId);
2186fc52023a04fe45b6f59212fc716cbbcf76f35fcSvetoslav        mHandler.sendMessageDelayed(message, STANDARD_DELAY_MILLIS);
2196fc52023a04fe45b6f59212fc716cbbcf76f35fcSvetoslav    }
2206fc52023a04fe45b6f59212fc716cbbcf76f35fcSvetoslav
2219981caa9c40383230c2e08fade7cbe03e2d96125Philip P. Moltmann    /**
2229981caa9c40383230c2e08fade7cbe03e2d96125Philip P. Moltmann     * Pretend that the print job has progressed.
2239981caa9c40383230c2e08fade7cbe03e2d96125Philip P. Moltmann     *
2249981caa9c40383230c2e08fade7cbe03e2d96125Philip P. Moltmann     * @param printJobId ID of the print job to progress
2259981caa9c40383230c2e08fade7cbe03e2d96125Philip P. Moltmann     * @param progress the new value to progress to
2269981caa9c40383230c2e08fade7cbe03e2d96125Philip P. Moltmann     */
2279981caa9c40383230c2e08fade7cbe03e2d96125Philip P. Moltmann    void handlePrintJobProgress(@NonNull PrintJobId printJobId, int progress) {
2289981caa9c40383230c2e08fade7cbe03e2d96125Philip P. Moltmann        final PrintJob printJob = mProcessedPrintJobs.get(printJobId);
2299981caa9c40383230c2e08fade7cbe03e2d96125Philip P. Moltmann        if (printJob == null) {
2309981caa9c40383230c2e08fade7cbe03e2d96125Philip P. Moltmann            return;
2319981caa9c40383230c2e08fade7cbe03e2d96125Philip P. Moltmann        }
2329981caa9c40383230c2e08fade7cbe03e2d96125Philip P. Moltmann
2339981caa9c40383230c2e08fade7cbe03e2d96125Philip P. Moltmann        if (printJob.isQueued()) {
2349981caa9c40383230c2e08fade7cbe03e2d96125Philip P. Moltmann            printJob.start();
2359981caa9c40383230c2e08fade7cbe03e2d96125Philip P. Moltmann        }
2369981caa9c40383230c2e08fade7cbe03e2d96125Philip P. Moltmann
2379981caa9c40383230c2e08fade7cbe03e2d96125Philip P. Moltmann        if (progress == 100) {
2389981caa9c40383230c2e08fade7cbe03e2d96125Philip P. Moltmann            handleQueuedPrintJob(printJobId);
2399981caa9c40383230c2e08fade7cbe03e2d96125Philip P. Moltmann        } else {
2409dac8ebb191a10f37933a7893ecb0317de002d99Philip P. Moltmann            if (Build.VERSION.SDK_INT >= 24) {
2419dac8ebb191a10f37933a7893ecb0317de002d99Philip P. Moltmann                printJob.setProgress((float) progress / 100);
2429dac8ebb191a10f37933a7893ecb0317de002d99Philip P. Moltmann                printJob.setStatus("Printing progress: " + progress + "%");
2439dac8ebb191a10f37933a7893ecb0317de002d99Philip P. Moltmann            }
2449981caa9c40383230c2e08fade7cbe03e2d96125Philip P. Moltmann
2459981caa9c40383230c2e08fade7cbe03e2d96125Philip P. Moltmann            Message message = mHandler.obtainMessage(
2469981caa9c40383230c2e08fade7cbe03e2d96125Philip P. Moltmann                    MyHandler.MSG_HANDLE_PRINT_JOB_PROGRESS, progress + 10, 0, printJobId);
2479981caa9c40383230c2e08fade7cbe03e2d96125Philip P. Moltmann            mHandler.sendMessageDelayed(message, 1000);
2489981caa9c40383230c2e08fade7cbe03e2d96125Philip P. Moltmann        }
2499981caa9c40383230c2e08fade7cbe03e2d96125Philip P. Moltmann    }
2509981caa9c40383230c2e08fade7cbe03e2d96125Philip P. Moltmann
251f11598332008fd706ed17be975a0ff73ba7f6a21Svetoslav Ganov    void handleQueuedPrintJob(PrintJobId printJobId) {
2526fc52023a04fe45b6f59212fc716cbbcf76f35fcSvetoslav        final PrintJob printJob = mProcessedPrintJobs.get(printJobId);
2536fc52023a04fe45b6f59212fc716cbbcf76f35fcSvetoslav        if (printJob == null) {
2546fc52023a04fe45b6f59212fc716cbbcf76f35fcSvetoslav            return;
2556fc52023a04fe45b6f59212fc716cbbcf76f35fcSvetoslav        }
2566fc52023a04fe45b6f59212fc716cbbcf76f35fcSvetoslav
2578dea95de32a43b110a10a445a6dfd8fba4232073Svetoslav Ganov        if (printJob.isQueued()) {
2588dea95de32a43b110a10a445a6dfd8fba4232073Svetoslav Ganov            printJob.start();
2590fb6959ad364ee84e83c435d671228fb365f2084Svetoslav        }
2608dea95de32a43b110a10a445a6dfd8fba4232073Svetoslav Ganov
261f885d1211c6356a1978df6b99778b6caad75c8eaPhilip P. Moltmann        try {
262f885d1211c6356a1978df6b99778b6caad75c8eaPhilip P. Moltmann            final File file = File.createTempFile(this.getClass().getSimpleName(), ".pdf",
263f885d1211c6356a1978df6b99778b6caad75c8eaPhilip P. Moltmann                    getFilesDir());
264f885d1211c6356a1978df6b99778b6caad75c8eaPhilip P. Moltmann            mFakePrintTask = new AsyncTask<ParcelFileDescriptor, Void, Void>() {
265f885d1211c6356a1978df6b99778b6caad75c8eaPhilip P. Moltmann                @Override
266f885d1211c6356a1978df6b99778b6caad75c8eaPhilip P. Moltmann                protected Void doInBackground(ParcelFileDescriptor... params) {
267f885d1211c6356a1978df6b99778b6caad75c8eaPhilip P. Moltmann                    InputStream in = new BufferedInputStream(new FileInputStream(
268f885d1211c6356a1978df6b99778b6caad75c8eaPhilip P. Moltmann                            params[0].getFileDescriptor()));
269f885d1211c6356a1978df6b99778b6caad75c8eaPhilip P. Moltmann                    OutputStream out = null;
270f885d1211c6356a1978df6b99778b6caad75c8eaPhilip P. Moltmann                    try {
271f885d1211c6356a1978df6b99778b6caad75c8eaPhilip P. Moltmann                        out = new BufferedOutputStream(new FileOutputStream(file));
272f885d1211c6356a1978df6b99778b6caad75c8eaPhilip P. Moltmann                        final byte[] buffer = new byte[8192];
273f885d1211c6356a1978df6b99778b6caad75c8eaPhilip P. Moltmann                        while (true) {
274f885d1211c6356a1978df6b99778b6caad75c8eaPhilip P. Moltmann                            if (isCancelled()) {
275f885d1211c6356a1978df6b99778b6caad75c8eaPhilip P. Moltmann                                break;
276f885d1211c6356a1978df6b99778b6caad75c8eaPhilip P. Moltmann                            }
277f885d1211c6356a1978df6b99778b6caad75c8eaPhilip P. Moltmann                            final int readByteCount = in.read(buffer);
278f885d1211c6356a1978df6b99778b6caad75c8eaPhilip P. Moltmann                            if (readByteCount < 0) {
279f885d1211c6356a1978df6b99778b6caad75c8eaPhilip P. Moltmann                                break;
280f885d1211c6356a1978df6b99778b6caad75c8eaPhilip P. Moltmann                            }
281f885d1211c6356a1978df6b99778b6caad75c8eaPhilip P. Moltmann                            out.write(buffer, 0, readByteCount);
2828dea95de32a43b110a10a445a6dfd8fba4232073Svetoslav Ganov                        }
283f885d1211c6356a1978df6b99778b6caad75c8eaPhilip P. Moltmann                    } catch (IOException ioe) {
284f885d1211c6356a1978df6b99778b6caad75c8eaPhilip P. Moltmann                        throw new RuntimeException(ioe);
285f885d1211c6356a1978df6b99778b6caad75c8eaPhilip P. Moltmann                    } finally {
286f885d1211c6356a1978df6b99778b6caad75c8eaPhilip P. Moltmann                        if (in != null) {
287f885d1211c6356a1978df6b99778b6caad75c8eaPhilip P. Moltmann                            try {
288f885d1211c6356a1978df6b99778b6caad75c8eaPhilip P. Moltmann                                in.close();
289f885d1211c6356a1978df6b99778b6caad75c8eaPhilip P. Moltmann                            } catch (IOException ioe) {
290f885d1211c6356a1978df6b99778b6caad75c8eaPhilip P. Moltmann                                /* ignore */
291f885d1211c6356a1978df6b99778b6caad75c8eaPhilip P. Moltmann                            }
2920fb6959ad364ee84e83c435d671228fb365f2084Svetoslav                        }
293f885d1211c6356a1978df6b99778b6caad75c8eaPhilip P. Moltmann                        if (out != null) {
294f885d1211c6356a1978df6b99778b6caad75c8eaPhilip P. Moltmann                            try {
295f885d1211c6356a1978df6b99778b6caad75c8eaPhilip P. Moltmann                                out.close();
296f885d1211c6356a1978df6b99778b6caad75c8eaPhilip P. Moltmann                            } catch (IOException ioe) {
297f885d1211c6356a1978df6b99778b6caad75c8eaPhilip P. Moltmann                                /* ignore */
298f885d1211c6356a1978df6b99778b6caad75c8eaPhilip P. Moltmann                            }
2993bb4d60425207dad4241d0565ff0c4a20dca119dSvetoslav Ganov                        }
300f885d1211c6356a1978df6b99778b6caad75c8eaPhilip P. Moltmann                        if (isCancelled()) {
301f885d1211c6356a1978df6b99778b6caad75c8eaPhilip P. Moltmann                            file.delete();
3023bb4d60425207dad4241d0565ff0c4a20dca119dSvetoslav Ganov                        }
3033bb4d60425207dad4241d0565ff0c4a20dca119dSvetoslav Ganov                    }
304f885d1211c6356a1978df6b99778b6caad75c8eaPhilip P. Moltmann                    return null;
3050fb6959ad364ee84e83c435d671228fb365f2084Svetoslav                }
3060fb6959ad364ee84e83c435d671228fb365f2084Svetoslav
307f885d1211c6356a1978df6b99778b6caad75c8eaPhilip P. Moltmann                @Override
308f885d1211c6356a1978df6b99778b6caad75c8eaPhilip P. Moltmann                protected void onPostExecute(Void result) {
309f885d1211c6356a1978df6b99778b6caad75c8eaPhilip P. Moltmann                    if (printJob.isStarted()) {
310f885d1211c6356a1978df6b99778b6caad75c8eaPhilip P. Moltmann                        printJob.complete();
311f885d1211c6356a1978df6b99778b6caad75c8eaPhilip P. Moltmann                    }
3120fb6959ad364ee84e83c435d671228fb365f2084Svetoslav
313f885d1211c6356a1978df6b99778b6caad75c8eaPhilip P. Moltmann                    file.setReadable(true, false);
314ecaec06dfbaa011676c37f5f6170b984da5c6a5eSvetoslav Ganov
315f885d1211c6356a1978df6b99778b6caad75c8eaPhilip P. Moltmann                    // Quick and dirty to show the file - use a content provider instead.
316f885d1211c6356a1978df6b99778b6caad75c8eaPhilip P. Moltmann                    Intent intent = new Intent(Intent.ACTION_VIEW);
317f885d1211c6356a1978df6b99778b6caad75c8eaPhilip P. Moltmann                    intent.setDataAndType(Uri.fromFile(file), "application/pdf");
318f885d1211c6356a1978df6b99778b6caad75c8eaPhilip P. Moltmann                    intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
319f885d1211c6356a1978df6b99778b6caad75c8eaPhilip P. Moltmann                    startActivity(intent, null);
3200fb6959ad364ee84e83c435d671228fb365f2084Svetoslav
321f885d1211c6356a1978df6b99778b6caad75c8eaPhilip P. Moltmann                    mFakePrintTask = null;
322f885d1211c6356a1978df6b99778b6caad75c8eaPhilip P. Moltmann                }
3237ae2878f5219d55e842348eb44ffb5070b9d708dSvetoslav Ganov
324f885d1211c6356a1978df6b99778b6caad75c8eaPhilip P. Moltmann                @Override
325f885d1211c6356a1978df6b99778b6caad75c8eaPhilip P. Moltmann                protected void onCancelled(Void result) {
326f885d1211c6356a1978df6b99778b6caad75c8eaPhilip P. Moltmann                    if (printJob.isStarted()) {
327f885d1211c6356a1978df6b99778b6caad75c8eaPhilip P. Moltmann                        printJob.cancel();
328f885d1211c6356a1978df6b99778b6caad75c8eaPhilip P. Moltmann                    }
3297ae2878f5219d55e842348eb44ffb5070b9d708dSvetoslav Ganov                }
330f885d1211c6356a1978df6b99778b6caad75c8eaPhilip P. Moltmann            };
331f885d1211c6356a1978df6b99778b6caad75c8eaPhilip P. Moltmann            mFakePrintTask.executeOnExecutor(AsyncTask.SERIAL_EXECUTOR,
332f885d1211c6356a1978df6b99778b6caad75c8eaPhilip P. Moltmann                    printJob.getDocument().getData());
333f885d1211c6356a1978df6b99778b6caad75c8eaPhilip P. Moltmann        } catch (IOException e) {
334f885d1211c6356a1978df6b99778b6caad75c8eaPhilip P. Moltmann            Log.e(LOG_TAG, "Could not create temporary file: %s", e);
335f885d1211c6356a1978df6b99778b6caad75c8eaPhilip P. Moltmann            return;
336f885d1211c6356a1978df6b99778b6caad75c8eaPhilip P. Moltmann        }
3370fb6959ad364ee84e83c435d671228fb365f2084Svetoslav    }
3380fb6959ad364ee84e83c435d671228fb365f2084Svetoslav
3390fb6959ad364ee84e83c435d671228fb365f2084Svetoslav    private final class MyHandler extends Handler {
3406fc52023a04fe45b6f59212fc716cbbcf76f35fcSvetoslav        public static final int MSG_HANDLE_DO_PRINT_JOB = 1;
3416fc52023a04fe45b6f59212fc716cbbcf76f35fcSvetoslav        public static final int MSG_HANDLE_FAIL_PRINT_JOB = 2;
3423bb4d60425207dad4241d0565ff0c4a20dca119dSvetoslav Ganov        public static final int MSG_HANDLE_BLOCK_PRINT_JOB = 3;
3433bb4d60425207dad4241d0565ff0c4a20dca119dSvetoslav Ganov        public static final int MSG_HANDLE_UNBLOCK_PRINT_JOB = 4;
3449981caa9c40383230c2e08fade7cbe03e2d96125Philip P. Moltmann        public static final int MSG_HANDLE_PRINT_JOB_PROGRESS = 5;
3450fb6959ad364ee84e83c435d671228fb365f2084Svetoslav
3460fb6959ad364ee84e83c435d671228fb365f2084Svetoslav        public MyHandler(Looper looper) {
3473bb4d60425207dad4241d0565ff0c4a20dca119dSvetoslav Ganov            super(looper);
3480fb6959ad364ee84e83c435d671228fb365f2084Svetoslav        }
3490fb6959ad364ee84e83c435d671228fb365f2084Svetoslav
3500fb6959ad364ee84e83c435d671228fb365f2084Svetoslav        @Override
3510fb6959ad364ee84e83c435d671228fb365f2084Svetoslav        public void handleMessage(Message message) {
3520fb6959ad364ee84e83c435d671228fb365f2084Svetoslav            switch (message.what) {
3536fc52023a04fe45b6f59212fc716cbbcf76f35fcSvetoslav                case MSG_HANDLE_DO_PRINT_JOB: {
354f11598332008fd706ed17be975a0ff73ba7f6a21Svetoslav Ganov                    PrintJobId printJobId = (PrintJobId) message.obj;
3556fc52023a04fe45b6f59212fc716cbbcf76f35fcSvetoslav                    handleQueuedPrintJob(printJobId);
3566fc52023a04fe45b6f59212fc716cbbcf76f35fcSvetoslav                } break;
3576fc52023a04fe45b6f59212fc716cbbcf76f35fcSvetoslav
3586fc52023a04fe45b6f59212fc716cbbcf76f35fcSvetoslav                case MSG_HANDLE_FAIL_PRINT_JOB: {
359f11598332008fd706ed17be975a0ff73ba7f6a21Svetoslav Ganov                    PrintJobId printJobId = (PrintJobId) message.obj;
3606fc52023a04fe45b6f59212fc716cbbcf76f35fcSvetoslav                    handleFailPrintJob(printJobId);
3618dea95de32a43b110a10a445a6dfd8fba4232073Svetoslav Ganov                } break;
3623bb4d60425207dad4241d0565ff0c4a20dca119dSvetoslav Ganov
3633bb4d60425207dad4241d0565ff0c4a20dca119dSvetoslav Ganov                case MSG_HANDLE_BLOCK_PRINT_JOB: {
364f11598332008fd706ed17be975a0ff73ba7f6a21Svetoslav Ganov                    PrintJobId printJobId = (PrintJobId) message.obj;
3653bb4d60425207dad4241d0565ff0c4a20dca119dSvetoslav Ganov                    handleBlockPrintJob(printJobId);
3663bb4d60425207dad4241d0565ff0c4a20dca119dSvetoslav Ganov                } break;
3673bb4d60425207dad4241d0565ff0c4a20dca119dSvetoslav Ganov
3683bb4d60425207dad4241d0565ff0c4a20dca119dSvetoslav Ganov                case MSG_HANDLE_UNBLOCK_PRINT_JOB: {
369f11598332008fd706ed17be975a0ff73ba7f6a21Svetoslav Ganov                    PrintJobId printJobId = (PrintJobId) message.obj;
3703bb4d60425207dad4241d0565ff0c4a20dca119dSvetoslav Ganov                    handleUnblockPrintJob(printJobId);
3713bb4d60425207dad4241d0565ff0c4a20dca119dSvetoslav Ganov                } break;
3729981caa9c40383230c2e08fade7cbe03e2d96125Philip P. Moltmann
3739981caa9c40383230c2e08fade7cbe03e2d96125Philip P. Moltmann                case MSG_HANDLE_PRINT_JOB_PROGRESS: {
3749981caa9c40383230c2e08fade7cbe03e2d96125Philip P. Moltmann                    PrintJobId printJobId = (PrintJobId) message.obj;
3759981caa9c40383230c2e08fade7cbe03e2d96125Philip P. Moltmann                    handlePrintJobProgress(printJobId, message.arg1);
3769981caa9c40383230c2e08fade7cbe03e2d96125Philip P. Moltmann                } break;
3770fb6959ad364ee84e83c435d671228fb365f2084Svetoslav            }
3780fb6959ad364ee84e83c435d671228fb365f2084Svetoslav        }
3790fb6959ad364ee84e83c435d671228fb365f2084Svetoslav    }
3801274de1ce4243d6ebb3e12b12b75daf8b466c39cSvetoslav Ganov
3817ae2878f5219d55e842348eb44ffb5070b9d708dSvetoslav Ganov    private final class FakePrinterDiscoverySession extends  PrinterDiscoverySession {
3821274de1ce4243d6ebb3e12b12b75daf8b466c39cSvetoslav Ganov        private final Handler mSesionHandler = new SessionHandler(getMainLooper());
3831274de1ce4243d6ebb3e12b12b75daf8b466c39cSvetoslav Ganov
3847ae2878f5219d55e842348eb44ffb5070b9d708dSvetoslav Ganov        private final List<PrinterInfo> mFakePrinters = new ArrayList<PrinterInfo>();
3857ae2878f5219d55e842348eb44ffb5070b9d708dSvetoslav Ganov
3867ae2878f5219d55e842348eb44ffb5070b9d708dSvetoslav Ganov        public FakePrinterDiscoverySession() {
387c02ac3775cd61bba799dbf70a707507410b3ff13Philip P. Moltmann            for (int i = 0; i < 6; i++) {
388a3eee78c0e6d279a2c1d91742960549864d17d03Svetoslav Ganov                String name = "Printer " + i;
3895a2dc1db96c25efda213b44e5f479b5725fce16dPhilip P. Moltmann
3905a2dc1db96c25efda213b44e5f479b5725fce16dPhilip P. Moltmann                PrinterInfo.Builder builder = new PrinterInfo.Builder(generatePrinterId(name), name,
391c02ac3775cd61bba799dbf70a707507410b3ff13Philip P. Moltmann                        (i == 1 || i == 2) ? PrinterInfo.STATUS_UNAVAILABLE
392c02ac3775cd61bba799dbf70a707507410b3ff13Philip P. Moltmann                                : PrinterInfo.STATUS_IDLE);
393c02ac3775cd61bba799dbf70a707507410b3ff13Philip P. Moltmann
394c02ac3775cd61bba799dbf70a707507410b3ff13Philip P. Moltmann                if (i != 3) {
395c02ac3775cd61bba799dbf70a707507410b3ff13Philip P. Moltmann                    builder.setDescription("Launch a menu to select behavior.");
396c02ac3775cd61bba799dbf70a707507410b3ff13Philip P. Moltmann                }
397c02ac3775cd61bba799dbf70a707507410b3ff13Philip P. Moltmann
398c02ac3775cd61bba799dbf70a707507410b3ff13Philip P. Moltmann                if (i != 4) {
3999dac8ebb191a10f37933a7893ecb0317de002d99Philip P. Moltmann                    if (Build.VERSION.SDK_INT >= 24) {
4009dac8ebb191a10f37933a7893ecb0317de002d99Philip P. Moltmann                        builder.setIconResourceId(R.drawable.printer);
4019dac8ebb191a10f37933a7893ecb0317de002d99Philip P. Moltmann                    }
402c02ac3775cd61bba799dbf70a707507410b3ff13Philip P. Moltmann                }
403c02ac3775cd61bba799dbf70a707507410b3ff13Philip P. Moltmann
404c02ac3775cd61bba799dbf70a707507410b3ff13Philip P. Moltmann                if (i % 2 == 0) {
4059dac8ebb191a10f37933a7893ecb0317de002d99Philip P. Moltmann                    if (Build.VERSION.SDK_INT >= 24) {
4069dac8ebb191a10f37933a7893ecb0317de002d99Philip P. Moltmann                        Intent infoIntent = new Intent(MyPrintService.this, InfoActivity.class);
4079dac8ebb191a10f37933a7893ecb0317de002d99Philip P. Moltmann                        infoIntent.putExtra(InfoActivity.PRINTER_NAME, name);
408c02ac3775cd61bba799dbf70a707507410b3ff13Philip P. Moltmann
4099dac8ebb191a10f37933a7893ecb0317de002d99Philip P. Moltmann                        PendingIntent infoPendingIntent = PendingIntent.getActivity(
4109dac8ebb191a10f37933a7893ecb0317de002d99Philip P. Moltmann                                getApplicationContext(),
4119dac8ebb191a10f37933a7893ecb0317de002d99Philip P. Moltmann                                i, infoIntent, PendingIntent.FLAG_UPDATE_CURRENT);
4129dac8ebb191a10f37933a7893ecb0317de002d99Philip P. Moltmann
4139dac8ebb191a10f37933a7893ecb0317de002d99Philip P. Moltmann                        builder.setInfoIntent(infoPendingIntent);
4149dac8ebb191a10f37933a7893ecb0317de002d99Philip P. Moltmann                    }
415c02ac3775cd61bba799dbf70a707507410b3ff13Philip P. Moltmann                }
416c02ac3775cd61bba799dbf70a707507410b3ff13Philip P. Moltmann
417c02ac3775cd61bba799dbf70a707507410b3ff13Philip P. Moltmann                if (i == 5) {
4189dac8ebb191a10f37933a7893ecb0317de002d99Philip P. Moltmann                    if (Build.VERSION.SDK_INT >= 24) {
419d01dcca2d759fb4044cbb72206b1caae722d8c89Philip P. Moltmann                        builder.setHasCustomPrinterIcon(true);
4209dac8ebb191a10f37933a7893ecb0317de002d99Philip P. Moltmann                    }
421c02ac3775cd61bba799dbf70a707507410b3ff13Philip P. Moltmann                }
422c02ac3775cd61bba799dbf70a707507410b3ff13Philip P. Moltmann
4235a2dc1db96c25efda213b44e5f479b5725fce16dPhilip P. Moltmann                mFakePrinters.add(builder.build());
4247ae2878f5219d55e842348eb44ffb5070b9d708dSvetoslav Ganov            }
4257ae2878f5219d55e842348eb44ffb5070b9d708dSvetoslav Ganov        }
4267ae2878f5219d55e842348eb44ffb5070b9d708dSvetoslav Ganov
4277ae2878f5219d55e842348eb44ffb5070b9d708dSvetoslav Ganov        @Override
4287ae2878f5219d55e842348eb44ffb5070b9d708dSvetoslav Ganov        public void onDestroy() {
4297ae2878f5219d55e842348eb44ffb5070b9d708dSvetoslav Ganov            Log.i(LOG_TAG, "FakePrinterDiscoverySession#onDestroy()");
4307ae2878f5219d55e842348eb44ffb5070b9d708dSvetoslav Ganov            mSesionHandler.removeMessages(SessionHandler.MSG_ADD_FIRST_BATCH_FAKE_PRINTERS);
4311274de1ce4243d6ebb3e12b12b75daf8b466c39cSvetoslav Ganov        }
4321274de1ce4243d6ebb3e12b12b75daf8b466c39cSvetoslav Ganov
4331274de1ce4243d6ebb3e12b12b75daf8b466c39cSvetoslav Ganov        @Override
4347ae2878f5219d55e842348eb44ffb5070b9d708dSvetoslav Ganov        public void onStartPrinterDiscovery(List<PrinterId> priorityList) {
4357ae2878f5219d55e842348eb44ffb5070b9d708dSvetoslav Ganov            Log.i(LOG_TAG, "FakePrinterDiscoverySession#onStartPrinterDiscovery()");
4361274de1ce4243d6ebb3e12b12b75daf8b466c39cSvetoslav Ganov            Message message1 = mSesionHandler.obtainMessage(
4377ae2878f5219d55e842348eb44ffb5070b9d708dSvetoslav Ganov                    SessionHandler.MSG_ADD_FIRST_BATCH_FAKE_PRINTERS, this);
4381274de1ce4243d6ebb3e12b12b75daf8b466c39cSvetoslav Ganov            mSesionHandler.sendMessageDelayed(message1, 0);
4391274de1ce4243d6ebb3e12b12b75daf8b466c39cSvetoslav Ganov        }
4401274de1ce4243d6ebb3e12b12b75daf8b466c39cSvetoslav Ganov
4411274de1ce4243d6ebb3e12b12b75daf8b466c39cSvetoslav Ganov        @Override
4427ae2878f5219d55e842348eb44ffb5070b9d708dSvetoslav Ganov        public void onStopPrinterDiscovery() {
4437ae2878f5219d55e842348eb44ffb5070b9d708dSvetoslav Ganov            Log.i(LOG_TAG, "FakePrinterDiscoverySession#onStopPrinterDiscovery()");
4441274de1ce4243d6ebb3e12b12b75daf8b466c39cSvetoslav Ganov            cancellAddingFakePrinters();
4451274de1ce4243d6ebb3e12b12b75daf8b466c39cSvetoslav Ganov        }
4461274de1ce4243d6ebb3e12b12b75daf8b466c39cSvetoslav Ganov
4471274de1ce4243d6ebb3e12b12b75daf8b466c39cSvetoslav Ganov        @Override
4483bb4d60425207dad4241d0565ff0c4a20dca119dSvetoslav Ganov        public void onStartPrinterStateTracking(PrinterId printerId) {
4493bb4d60425207dad4241d0565ff0c4a20dca119dSvetoslav Ganov            Log.i(LOG_TAG, "FakePrinterDiscoverySession#onStartPrinterStateTracking()");
4505a2dc1db96c25efda213b44e5f479b5725fce16dPhilip P. Moltmann
4515a2dc1db96c25efda213b44e5f479b5725fce16dPhilip P. Moltmann            final int printerCount = mFakePrinters.size();
4525a2dc1db96c25efda213b44e5f479b5725fce16dPhilip P. Moltmann            for (int i = printerCount - 1; i >= 0; i--) {
4535a2dc1db96c25efda213b44e5f479b5725fce16dPhilip P. Moltmann                PrinterInfo printer = mFakePrinters.remove(i);
4545a2dc1db96c25efda213b44e5f479b5725fce16dPhilip P. Moltmann
4555a2dc1db96c25efda213b44e5f479b5725fce16dPhilip P. Moltmann                if (printer.getId().equals(printerId)) {
4569dac8ebb191a10f37933a7893ecb0317de002d99Philip P. Moltmann                    PrinterCapabilitiesInfo.Builder b = new PrinterCapabilitiesInfo.Builder(
4575a2dc1db96c25efda213b44e5f479b5725fce16dPhilip P. Moltmann                            printerId)
4585a2dc1db96c25efda213b44e5f479b5725fce16dPhilip P. Moltmann                                    .setMinMargins(new Margins(200, 200, 200, 200))
4595a2dc1db96c25efda213b44e5f479b5725fce16dPhilip P. Moltmann                                    .addMediaSize(MediaSize.ISO_A4, true)
4605a2dc1db96c25efda213b44e5f479b5725fce16dPhilip P. Moltmann                                    .addMediaSize(MediaSize.NA_GOVT_LETTER, false)
4615a2dc1db96c25efda213b44e5f479b5725fce16dPhilip P. Moltmann                                    .addMediaSize(MediaSize.JPN_YOU4, false)
4625a2dc1db96c25efda213b44e5f479b5725fce16dPhilip P. Moltmann                                    .addResolution(new Resolution("R1", getString(
4635a2dc1db96c25efda213b44e5f479b5725fce16dPhilip P. Moltmann                                            R.string.resolution_200x200), 200, 200), false)
4645a2dc1db96c25efda213b44e5f479b5725fce16dPhilip P. Moltmann                                    .addResolution(new Resolution("R2", getString(
4655a2dc1db96c25efda213b44e5f479b5725fce16dPhilip P. Moltmann                                            R.string.resolution_300x300), 300, 300), true)
4665a2dc1db96c25efda213b44e5f479b5725fce16dPhilip P. Moltmann                                    .setColorModes(PrintAttributes.COLOR_MODE_COLOR
4675a2dc1db96c25efda213b44e5f479b5725fce16dPhilip P. Moltmann                                            | PrintAttributes.COLOR_MODE_MONOCHROME,
4689dac8ebb191a10f37933a7893ecb0317de002d99Philip P. Moltmann                                            PrintAttributes.COLOR_MODE_MONOCHROME);
4699dac8ebb191a10f37933a7893ecb0317de002d99Philip P. Moltmann
4709dac8ebb191a10f37933a7893ecb0317de002d99Philip P. Moltmann                    if (Build.VERSION.SDK_INT >= 23) {
4719dac8ebb191a10f37933a7893ecb0317de002d99Philip P. Moltmann                        b.setDuplexModes(PrintAttributes.DUPLEX_MODE_LONG_EDGE
4729dac8ebb191a10f37933a7893ecb0317de002d99Philip P. Moltmann                                        | PrintAttributes.DUPLEX_MODE_NONE,
4739dac8ebb191a10f37933a7893ecb0317de002d99Philip P. Moltmann                                PrintAttributes.DUPLEX_MODE_LONG_EDGE);
4749dac8ebb191a10f37933a7893ecb0317de002d99Philip P. Moltmann                    }
4759dac8ebb191a10f37933a7893ecb0317de002d99Philip P. Moltmann
4769dac8ebb191a10f37933a7893ecb0317de002d99Philip P. Moltmann                    PrinterCapabilitiesInfo capabilities = b.build();
4775a2dc1db96c25efda213b44e5f479b5725fce16dPhilip P. Moltmann
4785a2dc1db96c25efda213b44e5f479b5725fce16dPhilip P. Moltmann                    printer = new PrinterInfo.Builder(printer)
4795a2dc1db96c25efda213b44e5f479b5725fce16dPhilip P. Moltmann                            .setCapabilities(capabilities)
4805a2dc1db96c25efda213b44e5f479b5725fce16dPhilip P. Moltmann                            .build();
4815a2dc1db96c25efda213b44e5f479b5725fce16dPhilip P. Moltmann                }
4825a2dc1db96c25efda213b44e5f479b5725fce16dPhilip P. Moltmann
4835a2dc1db96c25efda213b44e5f479b5725fce16dPhilip P. Moltmann                mFakePrinters.add(printer);
4841274de1ce4243d6ebb3e12b12b75daf8b466c39cSvetoslav Ganov            }
4855a2dc1db96c25efda213b44e5f479b5725fce16dPhilip P. Moltmann
4865a2dc1db96c25efda213b44e5f479b5725fce16dPhilip P. Moltmann            addPrinters(mFakePrinters);
4875a2dc1db96c25efda213b44e5f479b5725fce16dPhilip P. Moltmann        }
4885a2dc1db96c25efda213b44e5f479b5725fce16dPhilip P. Moltmann
4895a2dc1db96c25efda213b44e5f479b5725fce16dPhilip P. Moltmann        @Override
4905a2dc1db96c25efda213b44e5f479b5725fce16dPhilip P. Moltmann        public void onRequestCustomPrinterIcon(final PrinterId printerId,
4915a2dc1db96c25efda213b44e5f479b5725fce16dPhilip P. Moltmann                final CustomPrinterIconCallback callbacks) {
4925a2dc1db96c25efda213b44e5f479b5725fce16dPhilip P. Moltmann            Log.i(LOG_TAG, "FakePrinterDiscoverySession#onRequestCustomPrinterIcon() " + printerId);
4935a2dc1db96c25efda213b44e5f479b5725fce16dPhilip P. Moltmann
4945a2dc1db96c25efda213b44e5f479b5725fce16dPhilip P. Moltmann            // Pretend the bitmap icon takes 5 seconds to load
4955a2dc1db96c25efda213b44e5f479b5725fce16dPhilip P. Moltmann            mSesionHandler.postDelayed(new Runnable() {
4965a2dc1db96c25efda213b44e5f479b5725fce16dPhilip P. Moltmann                @Override
4975a2dc1db96c25efda213b44e5f479b5725fce16dPhilip P. Moltmann                public void run() {
4985a2dc1db96c25efda213b44e5f479b5725fce16dPhilip P. Moltmann                    final int printerCount = mFakePrinters.size();
4995a2dc1db96c25efda213b44e5f479b5725fce16dPhilip P. Moltmann                    for (int i = printerCount - 1; i >= 0; i--) {
5005a2dc1db96c25efda213b44e5f479b5725fce16dPhilip P. Moltmann                        callbacks.onCustomPrinterIconLoaded(Icon.createWithBitmap(
5015a2dc1db96c25efda213b44e5f479b5725fce16dPhilip P. Moltmann                                BitmapFactory.decodeResource(getResources(), R.raw.red_printer)));
5025a2dc1db96c25efda213b44e5f479b5725fce16dPhilip P. Moltmann                    }
5035a2dc1db96c25efda213b44e5f479b5725fce16dPhilip P. Moltmann                }
5045a2dc1db96c25efda213b44e5f479b5725fce16dPhilip P. Moltmann            }, 5000);
5051274de1ce4243d6ebb3e12b12b75daf8b466c39cSvetoslav Ganov        }
5061274de1ce4243d6ebb3e12b12b75daf8b466c39cSvetoslav Ganov
5073bb4d60425207dad4241d0565ff0c4a20dca119dSvetoslav Ganov        @Override
5083bb4d60425207dad4241d0565ff0c4a20dca119dSvetoslav Ganov        public void onValidatePrinters(List<PrinterId> printerIds) {
509e4a7362e628701bc71289888f6241cc94c9a4fbcSvet Ganov            Log.i(LOG_TAG, "FakePrinterDiscoverySession#onValidatePrinters() " + printerIds);
5103bb4d60425207dad4241d0565ff0c4a20dca119dSvetoslav Ganov        }
5113bb4d60425207dad4241d0565ff0c4a20dca119dSvetoslav Ganov
5123bb4d60425207dad4241d0565ff0c4a20dca119dSvetoslav Ganov        @Override
5133bb4d60425207dad4241d0565ff0c4a20dca119dSvetoslav Ganov        public void onStopPrinterStateTracking(PrinterId printerId) {
5143bb4d60425207dad4241d0565ff0c4a20dca119dSvetoslav Ganov            Log.i(LOG_TAG, "FakePrinterDiscoverySession#onStopPrinterStateTracking()");
5153bb4d60425207dad4241d0565ff0c4a20dca119dSvetoslav Ganov        }
5163bb4d60425207dad4241d0565ff0c4a20dca119dSvetoslav Ganov
5177ae2878f5219d55e842348eb44ffb5070b9d708dSvetoslav Ganov        private void addFirstBatchFakePrinters() {
5185a2dc1db96c25efda213b44e5f479b5725fce16dPhilip P. Moltmann            List<PrinterInfo> printers = mFakePrinters.subList(0, mFakePrinters.size());
5198fa1c1973dd8659e52462103b21a926ee9747351Svetoslav            addPrinters(printers);
5201274de1ce4243d6ebb3e12b12b75daf8b466c39cSvetoslav Ganov        }
5211274de1ce4243d6ebb3e12b12b75daf8b466c39cSvetoslav Ganov
5221274de1ce4243d6ebb3e12b12b75daf8b466c39cSvetoslav Ganov        private void cancellAddingFakePrinters() {
5237ae2878f5219d55e842348eb44ffb5070b9d708dSvetoslav Ganov            mSesionHandler.removeMessages(SessionHandler.MSG_ADD_FIRST_BATCH_FAKE_PRINTERS);
5241274de1ce4243d6ebb3e12b12b75daf8b466c39cSvetoslav Ganov        }
5251274de1ce4243d6ebb3e12b12b75daf8b466c39cSvetoslav Ganov
5261274de1ce4243d6ebb3e12b12b75daf8b466c39cSvetoslav Ganov        final class SessionHandler extends Handler {
5277ae2878f5219d55e842348eb44ffb5070b9d708dSvetoslav Ganov            public static final int MSG_ADD_FIRST_BATCH_FAKE_PRINTERS = 1;
5281274de1ce4243d6ebb3e12b12b75daf8b466c39cSvetoslav Ganov
5291274de1ce4243d6ebb3e12b12b75daf8b466c39cSvetoslav Ganov            public SessionHandler(Looper looper) {
5303bb4d60425207dad4241d0565ff0c4a20dca119dSvetoslav Ganov                super(looper);
5311274de1ce4243d6ebb3e12b12b75daf8b466c39cSvetoslav Ganov            }
5321274de1ce4243d6ebb3e12b12b75daf8b466c39cSvetoslav Ganov
5331274de1ce4243d6ebb3e12b12b75daf8b466c39cSvetoslav Ganov            @Override
5341274de1ce4243d6ebb3e12b12b75daf8b466c39cSvetoslav Ganov            public void handleMessage(Message message) {
5351274de1ce4243d6ebb3e12b12b75daf8b466c39cSvetoslav Ganov                switch (message.what) {
5367ae2878f5219d55e842348eb44ffb5070b9d708dSvetoslav Ganov                    case MSG_ADD_FIRST_BATCH_FAKE_PRINTERS: {
5377ae2878f5219d55e842348eb44ffb5070b9d708dSvetoslav Ganov                        addFirstBatchFakePrinters();
5381274de1ce4243d6ebb3e12b12b75daf8b466c39cSvetoslav Ganov                    } break;
5391274de1ce4243d6ebb3e12b12b75daf8b466c39cSvetoslav Ganov                }
5401274de1ce4243d6ebb3e12b12b75daf8b466c39cSvetoslav Ganov            }
5411274de1ce4243d6ebb3e12b12b75daf8b466c39cSvetoslav Ganov        }
5421274de1ce4243d6ebb3e12b12b75daf8b466c39cSvetoslav Ganov    }
5430fb6959ad364ee84e83c435d671228fb365f2084Svetoslav}
544