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;
27f369a120cc6037a0765bb7b4922fbce1c86f1ee2Philip P. Moltmannimport android.os.CancellationSignal;
280fb6959ad364ee84e83c435d671228fb365f2084Svetoslavimport android.os.Handler;
290fb6959ad364ee84e83c435d671228fb365f2084Svetoslavimport android.os.Looper;
300fb6959ad364ee84e83c435d671228fb365f2084Svetoslavimport android.os.Message;
313bb4d60425207dad4241d0565ff0c4a20dca119dSvetoslav Ganovimport android.os.ParcelFileDescriptor;
320fb6959ad364ee84e83c435d671228fb365f2084Svetoslavimport android.print.PrintAttributes;
330fb6959ad364ee84e83c435d671228fb365f2084Svetoslavimport android.print.PrintAttributes.Margins;
34c6c630d5c2b70440d433aa19bcf50c115d9cf39aSvetoslav Ganovimport android.print.PrintAttributes.MediaSize;
350fb6959ad364ee84e83c435d671228fb365f2084Svetoslavimport android.print.PrintAttributes.Resolution;
36f11598332008fd706ed17be975a0ff73ba7f6a21Svetoslav Ganovimport android.print.PrintJobId;
371274de1ce4243d6ebb3e12b12b75daf8b466c39cSvetoslav Ganovimport android.print.PrinterCapabilitiesInfo;
380fb6959ad364ee84e83c435d671228fb365f2084Svetoslavimport android.print.PrinterId;
390fb6959ad364ee84e83c435d671228fb365f2084Svetoslavimport android.print.PrinterInfo;
405a2dc1db96c25efda213b44e5f479b5725fce16dPhilip P. Moltmannimport android.printservice.CustomPrinterIconCallback;
410fb6959ad364ee84e83c435d671228fb365f2084Svetoslavimport android.printservice.PrintJob;
420fb6959ad364ee84e83c435d671228fb365f2084Svetoslavimport android.printservice.PrintService;
431274de1ce4243d6ebb3e12b12b75daf8b466c39cSvetoslav Ganovimport android.printservice.PrinterDiscoverySession;
44f11598332008fd706ed17be975a0ff73ba7f6a21Svetoslav Ganovimport android.util.ArrayMap;
450fb6959ad364ee84e83c435d671228fb365f2084Svetoslavimport android.util.Log;
46f369a120cc6037a0765bb7b4922fbce1c86f1ee2Philip P. Moltmannimport com.android.internal.os.SomeArgs;
47ecaec06dfbaa011676c37f5f6170b984da5c6a5eSvetoslav Ganov
480fb6959ad364ee84e83c435d671228fb365f2084Svetoslavimport java.io.BufferedInputStream;
490fb6959ad364ee84e83c435d671228fb365f2084Svetoslavimport java.io.BufferedOutputStream;
500fb6959ad364ee84e83c435d671228fb365f2084Svetoslavimport java.io.File;
510fb6959ad364ee84e83c435d671228fb365f2084Svetoslavimport java.io.FileInputStream;
520fb6959ad364ee84e83c435d671228fb365f2084Svetoslavimport java.io.FileOutputStream;
530fb6959ad364ee84e83c435d671228fb365f2084Svetoslavimport java.io.IOException;
540fb6959ad364ee84e83c435d671228fb365f2084Svetoslavimport java.io.InputStream;
550fb6959ad364ee84e83c435d671228fb365f2084Svetoslavimport java.io.OutputStream;
560fb6959ad364ee84e83c435d671228fb365f2084Svetoslavimport java.util.ArrayList;
570fb6959ad364ee84e83c435d671228fb365f2084Svetoslavimport java.util.List;
58f11598332008fd706ed17be975a0ff73ba7f6a21Svetoslav Ganovimport java.util.Map;
590fb6959ad364ee84e83c435d671228fb365f2084Svetoslav
600fb6959ad364ee84e83c435d671228fb365f2084Svetoslavpublic class MyPrintService extends PrintService {
610fb6959ad364ee84e83c435d671228fb365f2084Svetoslav
628dea95de32a43b110a10a445a6dfd8fba4232073Svetoslav Ganov    private static final String LOG_TAG = "MyPrintService";
630fb6959ad364ee84e83c435d671228fb365f2084Svetoslav
64482f8b86361308b90af05c2a3b16eebb0e778882Svetoslav Ganov    private static final long STANDARD_DELAY_MILLIS = 10000000;
656fc52023a04fe45b6f59212fc716cbbcf76f35fcSvetoslav
666fc52023a04fe45b6f59212fc716cbbcf76f35fcSvetoslav    static final String INTENT_EXTRA_ACTION_TYPE = "INTENT_EXTRA_ACTION_TYPE";
676fc52023a04fe45b6f59212fc716cbbcf76f35fcSvetoslav    static final String INTENT_EXTRA_PRINT_JOB_ID = "INTENT_EXTRA_PRINT_JOB_ID";
686fc52023a04fe45b6f59212fc716cbbcf76f35fcSvetoslav
696fc52023a04fe45b6f59212fc716cbbcf76f35fcSvetoslav    static final int ACTION_TYPE_ON_PRINT_JOB_PENDING = 1;
70002df26c21a78353d33705bb076ac61a09400095Philip P. Moltmann    private static final int ACTION_TYPE_ON_REQUEST_CANCEL_PRINT_JOB = 2;
716fc52023a04fe45b6f59212fc716cbbcf76f35fcSvetoslav
726fc52023a04fe45b6f59212fc716cbbcf76f35fcSvetoslav    private static final Object sLock = new Object();
736fc52023a04fe45b6f59212fc716cbbcf76f35fcSvetoslav
746fc52023a04fe45b6f59212fc716cbbcf76f35fcSvetoslav    private static MyPrintService sInstance;
756fc52023a04fe45b6f59212fc716cbbcf76f35fcSvetoslav
760fb6959ad364ee84e83c435d671228fb365f2084Svetoslav    private Handler mHandler;
770fb6959ad364ee84e83c435d671228fb365f2084Svetoslav
783bb4d60425207dad4241d0565ff0c4a20dca119dSvetoslav Ganov    private AsyncTask<ParcelFileDescriptor, Void, Void> mFakePrintTask;
798dea95de32a43b110a10a445a6dfd8fba4232073Svetoslav Ganov
80f11598332008fd706ed17be975a0ff73ba7f6a21Svetoslav Ganov    private final Map<PrintJobId, PrintJob> mProcessedPrintJobs =
81002df26c21a78353d33705bb076ac61a09400095Philip P. Moltmann            new ArrayMap<>();
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()");
1016fc52023a04fe45b6f59212fc716cbbcf76f35fcSvetoslav        synchronized (sLock) {
1026fc52023a04fe45b6f59212fc716cbbcf76f35fcSvetoslav            sInstance = null;
1036fc52023a04fe45b6f59212fc716cbbcf76f35fcSvetoslav        }
1040fb6959ad364ee84e83c435d671228fb365f2084Svetoslav    }
1050fb6959ad364ee84e83c435d671228fb365f2084Svetoslav
1060fb6959ad364ee84e83c435d671228fb365f2084Svetoslav    @Override
1071274de1ce4243d6ebb3e12b12b75daf8b466c39cSvetoslav Ganov    protected PrinterDiscoverySession onCreatePrinterDiscoverySession() {
1087ae2878f5219d55e842348eb44ffb5070b9d708dSvetoslav Ganov        Log.i(LOG_TAG, "#onCreatePrinterDiscoverySession()");
1097ae2878f5219d55e842348eb44ffb5070b9d708dSvetoslav Ganov        return new FakePrinterDiscoverySession();
1100fb6959ad364ee84e83c435d671228fb365f2084Svetoslav    }
1110fb6959ad364ee84e83c435d671228fb365f2084Svetoslav
1120fb6959ad364ee84e83c435d671228fb365f2084Svetoslav    @Override
1136fc52023a04fe45b6f59212fc716cbbcf76f35fcSvetoslav    protected void onRequestCancelPrintJob(final PrintJob printJob) {
1146fc52023a04fe45b6f59212fc716cbbcf76f35fcSvetoslav        Log.i(LOG_TAG, "#onRequestCancelPrintJob()");
1156fc52023a04fe45b6f59212fc716cbbcf76f35fcSvetoslav        mProcessedPrintJobs.put(printJob.getId(), printJob);
1166fc52023a04fe45b6f59212fc716cbbcf76f35fcSvetoslav        Intent intent = new Intent(this, MyDialogActivity.class);
1176fc52023a04fe45b6f59212fc716cbbcf76f35fcSvetoslav        intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
1186fc52023a04fe45b6f59212fc716cbbcf76f35fcSvetoslav        intent.putExtra(INTENT_EXTRA_PRINT_JOB_ID, printJob.getId());
1196fc52023a04fe45b6f59212fc716cbbcf76f35fcSvetoslav        intent.putExtra(INTENT_EXTRA_ACTION_TYPE, ACTION_TYPE_ON_REQUEST_CANCEL_PRINT_JOB);
1206fc52023a04fe45b6f59212fc716cbbcf76f35fcSvetoslav        startActivity(intent);
1218dea95de32a43b110a10a445a6dfd8fba4232073Svetoslav Ganov    }
1228dea95de32a43b110a10a445a6dfd8fba4232073Svetoslav Ganov
1238dea95de32a43b110a10a445a6dfd8fba4232073Svetoslav Ganov    @Override
1240fb6959ad364ee84e83c435d671228fb365f2084Svetoslav    public void onPrintJobQueued(final PrintJob printJob) {
125c6c630d5c2b70440d433aa19bcf50c115d9cf39aSvetoslav Ganov        Log.i(LOG_TAG, "#onPrintJobQueued()");
1266fc52023a04fe45b6f59212fc716cbbcf76f35fcSvetoslav        mProcessedPrintJobs.put(printJob.getId(), printJob);
1273bb4d60425207dad4241d0565ff0c4a20dca119dSvetoslav Ganov        if (printJob.isQueued()) {
1283bb4d60425207dad4241d0565ff0c4a20dca119dSvetoslav Ganov            printJob.start();
1293bb4d60425207dad4241d0565ff0c4a20dca119dSvetoslav Ganov        }
1308fa1c1973dd8659e52462103b21a926ee9747351Svetoslav
1316fc52023a04fe45b6f59212fc716cbbcf76f35fcSvetoslav        Intent intent = new Intent(this, MyDialogActivity.class);
1326fc52023a04fe45b6f59212fc716cbbcf76f35fcSvetoslav        intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
1336fc52023a04fe45b6f59212fc716cbbcf76f35fcSvetoslav        intent.putExtra(INTENT_EXTRA_PRINT_JOB_ID, printJob.getId());
1346fc52023a04fe45b6f59212fc716cbbcf76f35fcSvetoslav        intent.putExtra(INTENT_EXTRA_ACTION_TYPE, ACTION_TYPE_ON_PRINT_JOB_PENDING);
1356fc52023a04fe45b6f59212fc716cbbcf76f35fcSvetoslav        startActivity(intent);
1368dea95de32a43b110a10a445a6dfd8fba4232073Svetoslav Ganov    }
1378dea95de32a43b110a10a445a6dfd8fba4232073Svetoslav Ganov
138f11598332008fd706ed17be975a0ff73ba7f6a21Svetoslav Ganov    void handleRequestCancelPrintJob(PrintJobId printJobId) {
1396fc52023a04fe45b6f59212fc716cbbcf76f35fcSvetoslav        PrintJob printJob = mProcessedPrintJobs.get(printJobId);
1406fc52023a04fe45b6f59212fc716cbbcf76f35fcSvetoslav        if (printJob == null) {
1416fc52023a04fe45b6f59212fc716cbbcf76f35fcSvetoslav            return;
1426fc52023a04fe45b6f59212fc716cbbcf76f35fcSvetoslav        }
1436fc52023a04fe45b6f59212fc716cbbcf76f35fcSvetoslav        mProcessedPrintJobs.remove(printJobId);
144482f8b86361308b90af05c2a3b16eebb0e778882Svetoslav Ganov        if (printJob.isQueued() || printJob.isStarted() || printJob.isBlocked()) {
1456fc52023a04fe45b6f59212fc716cbbcf76f35fcSvetoslav            mHandler.removeMessages(MyHandler.MSG_HANDLE_DO_PRINT_JOB);
1466fc52023a04fe45b6f59212fc716cbbcf76f35fcSvetoslav            mHandler.removeMessages(MyHandler.MSG_HANDLE_FAIL_PRINT_JOB);
1476fc52023a04fe45b6f59212fc716cbbcf76f35fcSvetoslav            printJob.cancel();
1486fc52023a04fe45b6f59212fc716cbbcf76f35fcSvetoslav        }
1496fc52023a04fe45b6f59212fc716cbbcf76f35fcSvetoslav    }
1506fc52023a04fe45b6f59212fc716cbbcf76f35fcSvetoslav
151f11598332008fd706ed17be975a0ff73ba7f6a21Svetoslav Ganov    void handleFailPrintJobDelayed(PrintJobId printJobId) {
1526fc52023a04fe45b6f59212fc716cbbcf76f35fcSvetoslav        Message message = mHandler.obtainMessage(
153f11598332008fd706ed17be975a0ff73ba7f6a21Svetoslav Ganov                MyHandler.MSG_HANDLE_FAIL_PRINT_JOB, printJobId);
1546fc52023a04fe45b6f59212fc716cbbcf76f35fcSvetoslav        mHandler.sendMessageDelayed(message, STANDARD_DELAY_MILLIS);
1556fc52023a04fe45b6f59212fc716cbbcf76f35fcSvetoslav    }
1566fc52023a04fe45b6f59212fc716cbbcf76f35fcSvetoslav
157f11598332008fd706ed17be975a0ff73ba7f6a21Svetoslav Ganov    void handleFailPrintJob(PrintJobId printJobId) {
1586fc52023a04fe45b6f59212fc716cbbcf76f35fcSvetoslav        PrintJob printJob = mProcessedPrintJobs.get(printJobId);
1596fc52023a04fe45b6f59212fc716cbbcf76f35fcSvetoslav        if (printJob == null) {
1606fc52023a04fe45b6f59212fc716cbbcf76f35fcSvetoslav            return;
1616fc52023a04fe45b6f59212fc716cbbcf76f35fcSvetoslav        }
1626fc52023a04fe45b6f59212fc716cbbcf76f35fcSvetoslav        mProcessedPrintJobs.remove(printJobId);
1636fc52023a04fe45b6f59212fc716cbbcf76f35fcSvetoslav        if (printJob.isQueued() || printJob.isStarted()) {
1646fc52023a04fe45b6f59212fc716cbbcf76f35fcSvetoslav            printJob.fail(getString(R.string.fail_reason));
1656fc52023a04fe45b6f59212fc716cbbcf76f35fcSvetoslav        }
1666fc52023a04fe45b6f59212fc716cbbcf76f35fcSvetoslav    }
1676fc52023a04fe45b6f59212fc716cbbcf76f35fcSvetoslav
168f11598332008fd706ed17be975a0ff73ba7f6a21Svetoslav Ganov    void handleBlockPrintJobDelayed(PrintJobId printJobId) {
1693bb4d60425207dad4241d0565ff0c4a20dca119dSvetoslav Ganov        Message message = mHandler.obtainMessage(
170f11598332008fd706ed17be975a0ff73ba7f6a21Svetoslav Ganov                MyHandler.MSG_HANDLE_BLOCK_PRINT_JOB, printJobId);
1713bb4d60425207dad4241d0565ff0c4a20dca119dSvetoslav Ganov        mHandler.sendMessageDelayed(message, STANDARD_DELAY_MILLIS);
1723bb4d60425207dad4241d0565ff0c4a20dca119dSvetoslav Ganov    }
1733bb4d60425207dad4241d0565ff0c4a20dca119dSvetoslav Ganov
174f11598332008fd706ed17be975a0ff73ba7f6a21Svetoslav Ganov    void handleBlockPrintJob(PrintJobId printJobId) {
1753bb4d60425207dad4241d0565ff0c4a20dca119dSvetoslav Ganov        final PrintJob printJob = mProcessedPrintJobs.get(printJobId);
1763bb4d60425207dad4241d0565ff0c4a20dca119dSvetoslav Ganov        if (printJob == null) {
1773bb4d60425207dad4241d0565ff0c4a20dca119dSvetoslav Ganov            return;
1783bb4d60425207dad4241d0565ff0c4a20dca119dSvetoslav Ganov        }
1793bb4d60425207dad4241d0565ff0c4a20dca119dSvetoslav Ganov
1803bb4d60425207dad4241d0565ff0c4a20dca119dSvetoslav Ganov        if (printJob.isStarted()) {
181f11598332008fd706ed17be975a0ff73ba7f6a21Svetoslav Ganov            printJob.block("Gimme some rest, dude");
1823bb4d60425207dad4241d0565ff0c4a20dca119dSvetoslav Ganov        }
1833bb4d60425207dad4241d0565ff0c4a20dca119dSvetoslav Ganov    }
1843bb4d60425207dad4241d0565ff0c4a20dca119dSvetoslav Ganov
185f11598332008fd706ed17be975a0ff73ba7f6a21Svetoslav Ganov    void handleBlockAndDelayedUnblockPrintJob(PrintJobId printJobId) {
1863bb4d60425207dad4241d0565ff0c4a20dca119dSvetoslav Ganov        handleBlockPrintJob(printJobId);
1873bb4d60425207dad4241d0565ff0c4a20dca119dSvetoslav Ganov
1883bb4d60425207dad4241d0565ff0c4a20dca119dSvetoslav Ganov        Message message = mHandler.obtainMessage(
189f11598332008fd706ed17be975a0ff73ba7f6a21Svetoslav Ganov                MyHandler.MSG_HANDLE_UNBLOCK_PRINT_JOB, printJobId);
1903bb4d60425207dad4241d0565ff0c4a20dca119dSvetoslav Ganov        mHandler.sendMessageDelayed(message, STANDARD_DELAY_MILLIS);
1913bb4d60425207dad4241d0565ff0c4a20dca119dSvetoslav Ganov    }
1923bb4d60425207dad4241d0565ff0c4a20dca119dSvetoslav Ganov
193002df26c21a78353d33705bb076ac61a09400095Philip P. Moltmann    private void handleUnblockPrintJob(PrintJobId printJobId) {
1943bb4d60425207dad4241d0565ff0c4a20dca119dSvetoslav Ganov        final PrintJob printJob = mProcessedPrintJobs.get(printJobId);
1953bb4d60425207dad4241d0565ff0c4a20dca119dSvetoslav Ganov        if (printJob == null) {
1963bb4d60425207dad4241d0565ff0c4a20dca119dSvetoslav Ganov            return;
1973bb4d60425207dad4241d0565ff0c4a20dca119dSvetoslav Ganov        }
1983bb4d60425207dad4241d0565ff0c4a20dca119dSvetoslav Ganov
1993bb4d60425207dad4241d0565ff0c4a20dca119dSvetoslav Ganov        if (printJob.isBlocked()) {
2003bb4d60425207dad4241d0565ff0c4a20dca119dSvetoslav Ganov            printJob.start();
2013bb4d60425207dad4241d0565ff0c4a20dca119dSvetoslav Ganov        }
2023bb4d60425207dad4241d0565ff0c4a20dca119dSvetoslav Ganov    }
2033bb4d60425207dad4241d0565ff0c4a20dca119dSvetoslav Ganov
204f11598332008fd706ed17be975a0ff73ba7f6a21Svetoslav Ganov    void handleQueuedPrintJobDelayed(PrintJobId printJobId) {
2053bb4d60425207dad4241d0565ff0c4a20dca119dSvetoslav Ganov        final PrintJob printJob = mProcessedPrintJobs.get(printJobId);
2063bb4d60425207dad4241d0565ff0c4a20dca119dSvetoslav Ganov        if (printJob == null) {
2073bb4d60425207dad4241d0565ff0c4a20dca119dSvetoslav Ganov            return;
2083bb4d60425207dad4241d0565ff0c4a20dca119dSvetoslav Ganov        }
2093bb4d60425207dad4241d0565ff0c4a20dca119dSvetoslav Ganov
2103bb4d60425207dad4241d0565ff0c4a20dca119dSvetoslav Ganov        if (printJob.isQueued()) {
2113bb4d60425207dad4241d0565ff0c4a20dca119dSvetoslav Ganov            printJob.start();
2123bb4d60425207dad4241d0565ff0c4a20dca119dSvetoslav Ganov        }
2136fc52023a04fe45b6f59212fc716cbbcf76f35fcSvetoslav        Message message = mHandler.obtainMessage(
214f11598332008fd706ed17be975a0ff73ba7f6a21Svetoslav Ganov                MyHandler.MSG_HANDLE_DO_PRINT_JOB, printJobId);
2156fc52023a04fe45b6f59212fc716cbbcf76f35fcSvetoslav        mHandler.sendMessageDelayed(message, STANDARD_DELAY_MILLIS);
2166fc52023a04fe45b6f59212fc716cbbcf76f35fcSvetoslav    }
2176fc52023a04fe45b6f59212fc716cbbcf76f35fcSvetoslav
2189981caa9c40383230c2e08fade7cbe03e2d96125Philip P. Moltmann    /**
2199981caa9c40383230c2e08fade7cbe03e2d96125Philip P. Moltmann     * Pretend that the print job has progressed.
2209981caa9c40383230c2e08fade7cbe03e2d96125Philip P. Moltmann     *
2219981caa9c40383230c2e08fade7cbe03e2d96125Philip P. Moltmann     * @param printJobId ID of the print job to progress
2229981caa9c40383230c2e08fade7cbe03e2d96125Philip P. Moltmann     * @param progress the new value to progress to
2239981caa9c40383230c2e08fade7cbe03e2d96125Philip P. Moltmann     */
2249981caa9c40383230c2e08fade7cbe03e2d96125Philip P. Moltmann    void handlePrintJobProgress(@NonNull PrintJobId printJobId, int progress) {
2259981caa9c40383230c2e08fade7cbe03e2d96125Philip P. Moltmann        final PrintJob printJob = mProcessedPrintJobs.get(printJobId);
2269981caa9c40383230c2e08fade7cbe03e2d96125Philip P. Moltmann        if (printJob == null) {
2279981caa9c40383230c2e08fade7cbe03e2d96125Philip P. Moltmann            return;
2289981caa9c40383230c2e08fade7cbe03e2d96125Philip P. Moltmann        }
2299981caa9c40383230c2e08fade7cbe03e2d96125Philip P. Moltmann
2309981caa9c40383230c2e08fade7cbe03e2d96125Philip P. Moltmann        if (printJob.isQueued()) {
2319981caa9c40383230c2e08fade7cbe03e2d96125Philip P. Moltmann            printJob.start();
2329981caa9c40383230c2e08fade7cbe03e2d96125Philip P. Moltmann        }
2339981caa9c40383230c2e08fade7cbe03e2d96125Philip P. Moltmann
2349981caa9c40383230c2e08fade7cbe03e2d96125Philip P. Moltmann        if (progress == 100) {
2359981caa9c40383230c2e08fade7cbe03e2d96125Philip P. Moltmann            handleQueuedPrintJob(printJobId);
2369981caa9c40383230c2e08fade7cbe03e2d96125Philip P. Moltmann        } else {
2379dac8ebb191a10f37933a7893ecb0317de002d99Philip P. Moltmann            if (Build.VERSION.SDK_INT >= 24) {
2389dac8ebb191a10f37933a7893ecb0317de002d99Philip P. Moltmann                printJob.setProgress((float) progress / 100);
2399dac8ebb191a10f37933a7893ecb0317de002d99Philip P. Moltmann                printJob.setStatus("Printing progress: " + progress + "%");
2409dac8ebb191a10f37933a7893ecb0317de002d99Philip P. Moltmann            }
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 {
283002df26c21a78353d33705bb076ac61a09400095Philip P. Moltmann                        try {
284002df26c21a78353d33705bb076ac61a09400095Philip P. Moltmann                            in.close();
285002df26c21a78353d33705bb076ac61a09400095Philip P. Moltmann                        } catch (IOException ioe) {
286002df26c21a78353d33705bb076ac61a09400095Philip P. Moltmann                            /* ignore */
2870fb6959ad364ee84e83c435d671228fb365f2084Svetoslav                        }
288f885d1211c6356a1978df6b99778b6caad75c8eaPhilip P. Moltmann                        if (out != null) {
289f885d1211c6356a1978df6b99778b6caad75c8eaPhilip P. Moltmann                            try {
290f885d1211c6356a1978df6b99778b6caad75c8eaPhilip P. Moltmann                                out.close();
291f885d1211c6356a1978df6b99778b6caad75c8eaPhilip P. Moltmann                            } catch (IOException ioe) {
292f885d1211c6356a1978df6b99778b6caad75c8eaPhilip P. Moltmann                                /* ignore */
293f885d1211c6356a1978df6b99778b6caad75c8eaPhilip P. Moltmann                            }
2943bb4d60425207dad4241d0565ff0c4a20dca119dSvetoslav Ganov                        }
295f885d1211c6356a1978df6b99778b6caad75c8eaPhilip P. Moltmann                        if (isCancelled()) {
296f885d1211c6356a1978df6b99778b6caad75c8eaPhilip P. Moltmann                            file.delete();
2973bb4d60425207dad4241d0565ff0c4a20dca119dSvetoslav Ganov                        }
2983bb4d60425207dad4241d0565ff0c4a20dca119dSvetoslav Ganov                    }
299f885d1211c6356a1978df6b99778b6caad75c8eaPhilip P. Moltmann                    return null;
3000fb6959ad364ee84e83c435d671228fb365f2084Svetoslav                }
3010fb6959ad364ee84e83c435d671228fb365f2084Svetoslav
302f885d1211c6356a1978df6b99778b6caad75c8eaPhilip P. Moltmann                @Override
303f885d1211c6356a1978df6b99778b6caad75c8eaPhilip P. Moltmann                protected void onPostExecute(Void result) {
304f885d1211c6356a1978df6b99778b6caad75c8eaPhilip P. Moltmann                    if (printJob.isStarted()) {
305f885d1211c6356a1978df6b99778b6caad75c8eaPhilip P. Moltmann                        printJob.complete();
306f885d1211c6356a1978df6b99778b6caad75c8eaPhilip P. Moltmann                    }
3070fb6959ad364ee84e83c435d671228fb365f2084Svetoslav
308f885d1211c6356a1978df6b99778b6caad75c8eaPhilip P. Moltmann                    file.setReadable(true, false);
309ecaec06dfbaa011676c37f5f6170b984da5c6a5eSvetoslav Ganov
310f885d1211c6356a1978df6b99778b6caad75c8eaPhilip P. Moltmann                    // Quick and dirty to show the file - use a content provider instead.
311f885d1211c6356a1978df6b99778b6caad75c8eaPhilip P. Moltmann                    Intent intent = new Intent(Intent.ACTION_VIEW);
312f885d1211c6356a1978df6b99778b6caad75c8eaPhilip P. Moltmann                    intent.setDataAndType(Uri.fromFile(file), "application/pdf");
313f885d1211c6356a1978df6b99778b6caad75c8eaPhilip P. Moltmann                    intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
314f885d1211c6356a1978df6b99778b6caad75c8eaPhilip P. Moltmann                    startActivity(intent, null);
3150fb6959ad364ee84e83c435d671228fb365f2084Svetoslav
316f885d1211c6356a1978df6b99778b6caad75c8eaPhilip P. Moltmann                    mFakePrintTask = null;
317f885d1211c6356a1978df6b99778b6caad75c8eaPhilip P. Moltmann                }
3187ae2878f5219d55e842348eb44ffb5070b9d708dSvetoslav Ganov
319f885d1211c6356a1978df6b99778b6caad75c8eaPhilip P. Moltmann                @Override
320f885d1211c6356a1978df6b99778b6caad75c8eaPhilip P. Moltmann                protected void onCancelled(Void result) {
321f885d1211c6356a1978df6b99778b6caad75c8eaPhilip P. Moltmann                    if (printJob.isStarted()) {
322f885d1211c6356a1978df6b99778b6caad75c8eaPhilip P. Moltmann                        printJob.cancel();
323f885d1211c6356a1978df6b99778b6caad75c8eaPhilip P. Moltmann                    }
3247ae2878f5219d55e842348eb44ffb5070b9d708dSvetoslav Ganov                }
325f885d1211c6356a1978df6b99778b6caad75c8eaPhilip P. Moltmann            };
326f885d1211c6356a1978df6b99778b6caad75c8eaPhilip P. Moltmann            mFakePrintTask.executeOnExecutor(AsyncTask.SERIAL_EXECUTOR,
327f885d1211c6356a1978df6b99778b6caad75c8eaPhilip P. Moltmann                    printJob.getDocument().getData());
328f885d1211c6356a1978df6b99778b6caad75c8eaPhilip P. Moltmann        } catch (IOException e) {
329f885d1211c6356a1978df6b99778b6caad75c8eaPhilip P. Moltmann            Log.e(LOG_TAG, "Could not create temporary file: %s", e);
330f885d1211c6356a1978df6b99778b6caad75c8eaPhilip P. Moltmann        }
3310fb6959ad364ee84e83c435d671228fb365f2084Svetoslav    }
3320fb6959ad364ee84e83c435d671228fb365f2084Svetoslav
3330fb6959ad364ee84e83c435d671228fb365f2084Svetoslav    private final class MyHandler extends Handler {
334002df26c21a78353d33705bb076ac61a09400095Philip P. Moltmann        static final int MSG_HANDLE_DO_PRINT_JOB = 1;
335002df26c21a78353d33705bb076ac61a09400095Philip P. Moltmann        static final int MSG_HANDLE_FAIL_PRINT_JOB = 2;
336002df26c21a78353d33705bb076ac61a09400095Philip P. Moltmann        static final int MSG_HANDLE_BLOCK_PRINT_JOB = 3;
337002df26c21a78353d33705bb076ac61a09400095Philip P. Moltmann        static final int MSG_HANDLE_UNBLOCK_PRINT_JOB = 4;
338002df26c21a78353d33705bb076ac61a09400095Philip P. Moltmann        static final int MSG_HANDLE_PRINT_JOB_PROGRESS = 5;
3390fb6959ad364ee84e83c435d671228fb365f2084Svetoslav
3400fb6959ad364ee84e83c435d671228fb365f2084Svetoslav        public MyHandler(Looper looper) {
3413bb4d60425207dad4241d0565ff0c4a20dca119dSvetoslav Ganov            super(looper);
3420fb6959ad364ee84e83c435d671228fb365f2084Svetoslav        }
3430fb6959ad364ee84e83c435d671228fb365f2084Svetoslav
3440fb6959ad364ee84e83c435d671228fb365f2084Svetoslav        @Override
3450fb6959ad364ee84e83c435d671228fb365f2084Svetoslav        public void handleMessage(Message message) {
3460fb6959ad364ee84e83c435d671228fb365f2084Svetoslav            switch (message.what) {
3476fc52023a04fe45b6f59212fc716cbbcf76f35fcSvetoslav                case MSG_HANDLE_DO_PRINT_JOB: {
348f11598332008fd706ed17be975a0ff73ba7f6a21Svetoslav Ganov                    PrintJobId printJobId = (PrintJobId) message.obj;
3496fc52023a04fe45b6f59212fc716cbbcf76f35fcSvetoslav                    handleQueuedPrintJob(printJobId);
3506fc52023a04fe45b6f59212fc716cbbcf76f35fcSvetoslav                } break;
3516fc52023a04fe45b6f59212fc716cbbcf76f35fcSvetoslav
3526fc52023a04fe45b6f59212fc716cbbcf76f35fcSvetoslav                case MSG_HANDLE_FAIL_PRINT_JOB: {
353f11598332008fd706ed17be975a0ff73ba7f6a21Svetoslav Ganov                    PrintJobId printJobId = (PrintJobId) message.obj;
3546fc52023a04fe45b6f59212fc716cbbcf76f35fcSvetoslav                    handleFailPrintJob(printJobId);
3558dea95de32a43b110a10a445a6dfd8fba4232073Svetoslav Ganov                } break;
3563bb4d60425207dad4241d0565ff0c4a20dca119dSvetoslav Ganov
3573bb4d60425207dad4241d0565ff0c4a20dca119dSvetoslav Ganov                case MSG_HANDLE_BLOCK_PRINT_JOB: {
358f11598332008fd706ed17be975a0ff73ba7f6a21Svetoslav Ganov                    PrintJobId printJobId = (PrintJobId) message.obj;
3593bb4d60425207dad4241d0565ff0c4a20dca119dSvetoslav Ganov                    handleBlockPrintJob(printJobId);
3603bb4d60425207dad4241d0565ff0c4a20dca119dSvetoslav Ganov                } break;
3613bb4d60425207dad4241d0565ff0c4a20dca119dSvetoslav Ganov
3623bb4d60425207dad4241d0565ff0c4a20dca119dSvetoslav Ganov                case MSG_HANDLE_UNBLOCK_PRINT_JOB: {
363f11598332008fd706ed17be975a0ff73ba7f6a21Svetoslav Ganov                    PrintJobId printJobId = (PrintJobId) message.obj;
3643bb4d60425207dad4241d0565ff0c4a20dca119dSvetoslav Ganov                    handleUnblockPrintJob(printJobId);
3653bb4d60425207dad4241d0565ff0c4a20dca119dSvetoslav Ganov                } break;
3669981caa9c40383230c2e08fade7cbe03e2d96125Philip P. Moltmann
3679981caa9c40383230c2e08fade7cbe03e2d96125Philip P. Moltmann                case MSG_HANDLE_PRINT_JOB_PROGRESS: {
3689981caa9c40383230c2e08fade7cbe03e2d96125Philip P. Moltmann                    PrintJobId printJobId = (PrintJobId) message.obj;
3699981caa9c40383230c2e08fade7cbe03e2d96125Philip P. Moltmann                    handlePrintJobProgress(printJobId, message.arg1);
3709981caa9c40383230c2e08fade7cbe03e2d96125Philip P. Moltmann                } break;
3710fb6959ad364ee84e83c435d671228fb365f2084Svetoslav            }
3720fb6959ad364ee84e83c435d671228fb365f2084Svetoslav        }
3730fb6959ad364ee84e83c435d671228fb365f2084Svetoslav    }
3741274de1ce4243d6ebb3e12b12b75daf8b466c39cSvetoslav Ganov
3757ae2878f5219d55e842348eb44ffb5070b9d708dSvetoslav Ganov    private final class FakePrinterDiscoverySession extends  PrinterDiscoverySession {
3761274de1ce4243d6ebb3e12b12b75daf8b466c39cSvetoslav Ganov        private final Handler mSesionHandler = new SessionHandler(getMainLooper());
3771274de1ce4243d6ebb3e12b12b75daf8b466c39cSvetoslav Ganov
378002df26c21a78353d33705bb076ac61a09400095Philip P. Moltmann        private final List<PrinterInfo> mFakePrinters = new ArrayList<>();
3797ae2878f5219d55e842348eb44ffb5070b9d708dSvetoslav Ganov
380002df26c21a78353d33705bb076ac61a09400095Philip P. Moltmann        FakePrinterDiscoverySession() {
381c02ac3775cd61bba799dbf70a707507410b3ff13Philip P. Moltmann            for (int i = 0; i < 6; i++) {
382a3eee78c0e6d279a2c1d91742960549864d17d03Svetoslav Ganov                String name = "Printer " + i;
3835a2dc1db96c25efda213b44e5f479b5725fce16dPhilip P. Moltmann
3845a2dc1db96c25efda213b44e5f479b5725fce16dPhilip P. Moltmann                PrinterInfo.Builder builder = new PrinterInfo.Builder(generatePrinterId(name), name,
385c02ac3775cd61bba799dbf70a707507410b3ff13Philip P. Moltmann                        (i == 1 || i == 2) ? PrinterInfo.STATUS_UNAVAILABLE
386c02ac3775cd61bba799dbf70a707507410b3ff13Philip P. Moltmann                                : PrinterInfo.STATUS_IDLE);
387c02ac3775cd61bba799dbf70a707507410b3ff13Philip P. Moltmann
388c02ac3775cd61bba799dbf70a707507410b3ff13Philip P. Moltmann                if (i != 3) {
389c02ac3775cd61bba799dbf70a707507410b3ff13Philip P. Moltmann                    builder.setDescription("Launch a menu to select behavior.");
390c02ac3775cd61bba799dbf70a707507410b3ff13Philip P. Moltmann                }
391c02ac3775cd61bba799dbf70a707507410b3ff13Philip P. Moltmann
392c02ac3775cd61bba799dbf70a707507410b3ff13Philip P. Moltmann                if (i != 4) {
3939dac8ebb191a10f37933a7893ecb0317de002d99Philip P. Moltmann                    if (Build.VERSION.SDK_INT >= 24) {
3949dac8ebb191a10f37933a7893ecb0317de002d99Philip P. Moltmann                        builder.setIconResourceId(R.drawable.printer);
3959dac8ebb191a10f37933a7893ecb0317de002d99Philip P. Moltmann                    }
396c02ac3775cd61bba799dbf70a707507410b3ff13Philip P. Moltmann                }
397c02ac3775cd61bba799dbf70a707507410b3ff13Philip P. Moltmann
398c02ac3775cd61bba799dbf70a707507410b3ff13Philip P. Moltmann                if (i % 2 == 0) {
3999dac8ebb191a10f37933a7893ecb0317de002d99Philip P. Moltmann                    if (Build.VERSION.SDK_INT >= 24) {
4009dac8ebb191a10f37933a7893ecb0317de002d99Philip P. Moltmann                        Intent infoIntent = new Intent(MyPrintService.this, InfoActivity.class);
4019dac8ebb191a10f37933a7893ecb0317de002d99Philip P. Moltmann                        infoIntent.putExtra(InfoActivity.PRINTER_NAME, name);
402c02ac3775cd61bba799dbf70a707507410b3ff13Philip P. Moltmann
4039dac8ebb191a10f37933a7893ecb0317de002d99Philip P. Moltmann                        PendingIntent infoPendingIntent = PendingIntent.getActivity(
4049dac8ebb191a10f37933a7893ecb0317de002d99Philip P. Moltmann                                getApplicationContext(),
4059dac8ebb191a10f37933a7893ecb0317de002d99Philip P. Moltmann                                i, infoIntent, PendingIntent.FLAG_UPDATE_CURRENT);
4069dac8ebb191a10f37933a7893ecb0317de002d99Philip P. Moltmann
4079dac8ebb191a10f37933a7893ecb0317de002d99Philip P. Moltmann                        builder.setInfoIntent(infoPendingIntent);
4089dac8ebb191a10f37933a7893ecb0317de002d99Philip P. Moltmann                    }
409c02ac3775cd61bba799dbf70a707507410b3ff13Philip P. Moltmann                }
410c02ac3775cd61bba799dbf70a707507410b3ff13Philip P. Moltmann
411c02ac3775cd61bba799dbf70a707507410b3ff13Philip P. Moltmann                if (i == 5) {
4129dac8ebb191a10f37933a7893ecb0317de002d99Philip P. Moltmann                    if (Build.VERSION.SDK_INT >= 24) {
413d01dcca2d759fb4044cbb72206b1caae722d8c89Philip P. Moltmann                        builder.setHasCustomPrinterIcon(true);
4149dac8ebb191a10f37933a7893ecb0317de002d99Philip P. Moltmann                    }
415c02ac3775cd61bba799dbf70a707507410b3ff13Philip P. Moltmann                }
416c02ac3775cd61bba799dbf70a707507410b3ff13Philip P. Moltmann
4175a2dc1db96c25efda213b44e5f479b5725fce16dPhilip P. Moltmann                mFakePrinters.add(builder.build());
4187ae2878f5219d55e842348eb44ffb5070b9d708dSvetoslav Ganov            }
4197ae2878f5219d55e842348eb44ffb5070b9d708dSvetoslav Ganov        }
4207ae2878f5219d55e842348eb44ffb5070b9d708dSvetoslav Ganov
4217ae2878f5219d55e842348eb44ffb5070b9d708dSvetoslav Ganov        @Override
4227ae2878f5219d55e842348eb44ffb5070b9d708dSvetoslav Ganov        public void onDestroy() {
4237ae2878f5219d55e842348eb44ffb5070b9d708dSvetoslav Ganov            Log.i(LOG_TAG, "FakePrinterDiscoverySession#onDestroy()");
4247ae2878f5219d55e842348eb44ffb5070b9d708dSvetoslav Ganov            mSesionHandler.removeMessages(SessionHandler.MSG_ADD_FIRST_BATCH_FAKE_PRINTERS);
4251274de1ce4243d6ebb3e12b12b75daf8b466c39cSvetoslav Ganov        }
4261274de1ce4243d6ebb3e12b12b75daf8b466c39cSvetoslav Ganov
4271274de1ce4243d6ebb3e12b12b75daf8b466c39cSvetoslav Ganov        @Override
4287ae2878f5219d55e842348eb44ffb5070b9d708dSvetoslav Ganov        public void onStartPrinterDiscovery(List<PrinterId> priorityList) {
4297ae2878f5219d55e842348eb44ffb5070b9d708dSvetoslav Ganov            Log.i(LOG_TAG, "FakePrinterDiscoverySession#onStartPrinterDiscovery()");
4301274de1ce4243d6ebb3e12b12b75daf8b466c39cSvetoslav Ganov            Message message1 = mSesionHandler.obtainMessage(
4317ae2878f5219d55e842348eb44ffb5070b9d708dSvetoslav Ganov                    SessionHandler.MSG_ADD_FIRST_BATCH_FAKE_PRINTERS, this);
4321274de1ce4243d6ebb3e12b12b75daf8b466c39cSvetoslav Ganov            mSesionHandler.sendMessageDelayed(message1, 0);
4331274de1ce4243d6ebb3e12b12b75daf8b466c39cSvetoslav Ganov        }
4341274de1ce4243d6ebb3e12b12b75daf8b466c39cSvetoslav Ganov
4351274de1ce4243d6ebb3e12b12b75daf8b466c39cSvetoslav Ganov        @Override
4367ae2878f5219d55e842348eb44ffb5070b9d708dSvetoslav Ganov        public void onStopPrinterDiscovery() {
4377ae2878f5219d55e842348eb44ffb5070b9d708dSvetoslav Ganov            Log.i(LOG_TAG, "FakePrinterDiscoverySession#onStopPrinterDiscovery()");
4381274de1ce4243d6ebb3e12b12b75daf8b466c39cSvetoslav Ganov            cancellAddingFakePrinters();
4391274de1ce4243d6ebb3e12b12b75daf8b466c39cSvetoslav Ganov        }
4401274de1ce4243d6ebb3e12b12b75daf8b466c39cSvetoslav Ganov
4411274de1ce4243d6ebb3e12b12b75daf8b466c39cSvetoslav Ganov        @Override
4423bb4d60425207dad4241d0565ff0c4a20dca119dSvetoslav Ganov        public void onStartPrinterStateTracking(PrinterId printerId) {
4433bb4d60425207dad4241d0565ff0c4a20dca119dSvetoslav Ganov            Log.i(LOG_TAG, "FakePrinterDiscoverySession#onStartPrinterStateTracking()");
4445a2dc1db96c25efda213b44e5f479b5725fce16dPhilip P. Moltmann
4455a2dc1db96c25efda213b44e5f479b5725fce16dPhilip P. Moltmann            final int printerCount = mFakePrinters.size();
4465a2dc1db96c25efda213b44e5f479b5725fce16dPhilip P. Moltmann            for (int i = printerCount - 1; i >= 0; i--) {
4475a2dc1db96c25efda213b44e5f479b5725fce16dPhilip P. Moltmann                PrinterInfo printer = mFakePrinters.remove(i);
4485a2dc1db96c25efda213b44e5f479b5725fce16dPhilip P. Moltmann
4495a2dc1db96c25efda213b44e5f479b5725fce16dPhilip P. Moltmann                if (printer.getId().equals(printerId)) {
4509dac8ebb191a10f37933a7893ecb0317de002d99Philip P. Moltmann                    PrinterCapabilitiesInfo.Builder b = new PrinterCapabilitiesInfo.Builder(
4515a2dc1db96c25efda213b44e5f479b5725fce16dPhilip P. Moltmann                            printerId)
4525a2dc1db96c25efda213b44e5f479b5725fce16dPhilip P. Moltmann                                    .setMinMargins(new Margins(200, 200, 200, 200))
4535a2dc1db96c25efda213b44e5f479b5725fce16dPhilip P. Moltmann                                    .addMediaSize(MediaSize.ISO_A4, true)
4545a2dc1db96c25efda213b44e5f479b5725fce16dPhilip P. Moltmann                                    .addMediaSize(MediaSize.NA_GOVT_LETTER, false)
4555a2dc1db96c25efda213b44e5f479b5725fce16dPhilip P. Moltmann                                    .addMediaSize(MediaSize.JPN_YOU4, false)
4565a2dc1db96c25efda213b44e5f479b5725fce16dPhilip P. Moltmann                                    .addResolution(new Resolution("R1", getString(
4575a2dc1db96c25efda213b44e5f479b5725fce16dPhilip P. Moltmann                                            R.string.resolution_200x200), 200, 200), false)
4585a2dc1db96c25efda213b44e5f479b5725fce16dPhilip P. Moltmann                                    .addResolution(new Resolution("R2", getString(
4595a2dc1db96c25efda213b44e5f479b5725fce16dPhilip P. Moltmann                                            R.string.resolution_300x300), 300, 300), true)
4605a2dc1db96c25efda213b44e5f479b5725fce16dPhilip P. Moltmann                                    .setColorModes(PrintAttributes.COLOR_MODE_COLOR
4615a2dc1db96c25efda213b44e5f479b5725fce16dPhilip P. Moltmann                                            | PrintAttributes.COLOR_MODE_MONOCHROME,
4629dac8ebb191a10f37933a7893ecb0317de002d99Philip P. Moltmann                                            PrintAttributes.COLOR_MODE_MONOCHROME);
4639dac8ebb191a10f37933a7893ecb0317de002d99Philip P. Moltmann
4649dac8ebb191a10f37933a7893ecb0317de002d99Philip P. Moltmann                    if (Build.VERSION.SDK_INT >= 23) {
4659dac8ebb191a10f37933a7893ecb0317de002d99Philip P. Moltmann                        b.setDuplexModes(PrintAttributes.DUPLEX_MODE_LONG_EDGE
4669dac8ebb191a10f37933a7893ecb0317de002d99Philip P. Moltmann                                        | PrintAttributes.DUPLEX_MODE_NONE,
4679dac8ebb191a10f37933a7893ecb0317de002d99Philip P. Moltmann                                PrintAttributes.DUPLEX_MODE_LONG_EDGE);
4689dac8ebb191a10f37933a7893ecb0317de002d99Philip P. Moltmann                    }
4699dac8ebb191a10f37933a7893ecb0317de002d99Philip P. Moltmann
4709dac8ebb191a10f37933a7893ecb0317de002d99Philip P. Moltmann                    PrinterCapabilitiesInfo capabilities = b.build();
4715a2dc1db96c25efda213b44e5f479b5725fce16dPhilip P. Moltmann
4725a2dc1db96c25efda213b44e5f479b5725fce16dPhilip P. Moltmann                    printer = new PrinterInfo.Builder(printer)
4735a2dc1db96c25efda213b44e5f479b5725fce16dPhilip P. Moltmann                            .setCapabilities(capabilities)
4745a2dc1db96c25efda213b44e5f479b5725fce16dPhilip P. Moltmann                            .build();
4755a2dc1db96c25efda213b44e5f479b5725fce16dPhilip P. Moltmann                }
4765a2dc1db96c25efda213b44e5f479b5725fce16dPhilip P. Moltmann
4775a2dc1db96c25efda213b44e5f479b5725fce16dPhilip P. Moltmann                mFakePrinters.add(printer);
4781274de1ce4243d6ebb3e12b12b75daf8b466c39cSvetoslav Ganov            }
4795a2dc1db96c25efda213b44e5f479b5725fce16dPhilip P. Moltmann
4805a2dc1db96c25efda213b44e5f479b5725fce16dPhilip P. Moltmann            addPrinters(mFakePrinters);
4815a2dc1db96c25efda213b44e5f479b5725fce16dPhilip P. Moltmann        }
4825a2dc1db96c25efda213b44e5f479b5725fce16dPhilip P. Moltmann
4835a2dc1db96c25efda213b44e5f479b5725fce16dPhilip P. Moltmann        @Override
4845a2dc1db96c25efda213b44e5f479b5725fce16dPhilip P. Moltmann        public void onRequestCustomPrinterIcon(final PrinterId printerId,
485f369a120cc6037a0765bb7b4922fbce1c86f1ee2Philip P. Moltmann                final CancellationSignal cancellationSignal,
4865a2dc1db96c25efda213b44e5f479b5725fce16dPhilip P. Moltmann                final CustomPrinterIconCallback callbacks) {
4875a2dc1db96c25efda213b44e5f479b5725fce16dPhilip P. Moltmann            Log.i(LOG_TAG, "FakePrinterDiscoverySession#onRequestCustomPrinterIcon() " + printerId);
4885a2dc1db96c25efda213b44e5f479b5725fce16dPhilip P. Moltmann
489f369a120cc6037a0765bb7b4922fbce1c86f1ee2Philip P. Moltmann            SomeArgs args = SomeArgs.obtain();
490f369a120cc6037a0765bb7b4922fbce1c86f1ee2Philip P. Moltmann            args.arg1 = cancellationSignal;
491f369a120cc6037a0765bb7b4922fbce1c86f1ee2Philip P. Moltmann            args.arg2 = callbacks;
492f369a120cc6037a0765bb7b4922fbce1c86f1ee2Philip P. Moltmann
493f369a120cc6037a0765bb7b4922fbce1c86f1ee2Philip P. Moltmann            Message msg = mSesionHandler.obtainMessage(
494f369a120cc6037a0765bb7b4922fbce1c86f1ee2Philip P. Moltmann                    SessionHandler.MSG_SUPPLY_CUSTOM_PRINTER_ICON, args);
495f369a120cc6037a0765bb7b4922fbce1c86f1ee2Philip P. Moltmann
4965a2dc1db96c25efda213b44e5f479b5725fce16dPhilip P. Moltmann            // Pretend the bitmap icon takes 5 seconds to load
497f369a120cc6037a0765bb7b4922fbce1c86f1ee2Philip P. Moltmann            mSesionHandler.sendMessageDelayed(msg, 5000);
4981274de1ce4243d6ebb3e12b12b75daf8b466c39cSvetoslav Ganov        }
4991274de1ce4243d6ebb3e12b12b75daf8b466c39cSvetoslav Ganov
5003bb4d60425207dad4241d0565ff0c4a20dca119dSvetoslav Ganov        @Override
5013bb4d60425207dad4241d0565ff0c4a20dca119dSvetoslav Ganov        public void onValidatePrinters(List<PrinterId> printerIds) {
502e4a7362e628701bc71289888f6241cc94c9a4fbcSvet Ganov            Log.i(LOG_TAG, "FakePrinterDiscoverySession#onValidatePrinters() " + printerIds);
5033bb4d60425207dad4241d0565ff0c4a20dca119dSvetoslav Ganov        }
5043bb4d60425207dad4241d0565ff0c4a20dca119dSvetoslav Ganov
5053bb4d60425207dad4241d0565ff0c4a20dca119dSvetoslav Ganov        @Override
5063bb4d60425207dad4241d0565ff0c4a20dca119dSvetoslav Ganov        public void onStopPrinterStateTracking(PrinterId printerId) {
5073bb4d60425207dad4241d0565ff0c4a20dca119dSvetoslav Ganov            Log.i(LOG_TAG, "FakePrinterDiscoverySession#onStopPrinterStateTracking()");
5083bb4d60425207dad4241d0565ff0c4a20dca119dSvetoslav Ganov        }
5093bb4d60425207dad4241d0565ff0c4a20dca119dSvetoslav Ganov
5107ae2878f5219d55e842348eb44ffb5070b9d708dSvetoslav Ganov        private void addFirstBatchFakePrinters() {
5115a2dc1db96c25efda213b44e5f479b5725fce16dPhilip P. Moltmann            List<PrinterInfo> printers = mFakePrinters.subList(0, mFakePrinters.size());
5128fa1c1973dd8659e52462103b21a926ee9747351Svetoslav            addPrinters(printers);
5131274de1ce4243d6ebb3e12b12b75daf8b466c39cSvetoslav Ganov        }
5141274de1ce4243d6ebb3e12b12b75daf8b466c39cSvetoslav Ganov
5151274de1ce4243d6ebb3e12b12b75daf8b466c39cSvetoslav Ganov        private void cancellAddingFakePrinters() {
5167ae2878f5219d55e842348eb44ffb5070b9d708dSvetoslav Ganov            mSesionHandler.removeMessages(SessionHandler.MSG_ADD_FIRST_BATCH_FAKE_PRINTERS);
5171274de1ce4243d6ebb3e12b12b75daf8b466c39cSvetoslav Ganov        }
5181274de1ce4243d6ebb3e12b12b75daf8b466c39cSvetoslav Ganov
5191274de1ce4243d6ebb3e12b12b75daf8b466c39cSvetoslav Ganov        final class SessionHandler extends Handler {
520002df26c21a78353d33705bb076ac61a09400095Philip P. Moltmann            static final int MSG_ADD_FIRST_BATCH_FAKE_PRINTERS = 1;
521002df26c21a78353d33705bb076ac61a09400095Philip P. Moltmann            static final int MSG_SUPPLY_CUSTOM_PRINTER_ICON = 2;
5221274de1ce4243d6ebb3e12b12b75daf8b466c39cSvetoslav Ganov
5231274de1ce4243d6ebb3e12b12b75daf8b466c39cSvetoslav Ganov            public SessionHandler(Looper looper) {
5243bb4d60425207dad4241d0565ff0c4a20dca119dSvetoslav Ganov                super(looper);
5251274de1ce4243d6ebb3e12b12b75daf8b466c39cSvetoslav Ganov            }
5261274de1ce4243d6ebb3e12b12b75daf8b466c39cSvetoslav Ganov
5271274de1ce4243d6ebb3e12b12b75daf8b466c39cSvetoslav Ganov            @Override
5281274de1ce4243d6ebb3e12b12b75daf8b466c39cSvetoslav Ganov            public void handleMessage(Message message) {
5291274de1ce4243d6ebb3e12b12b75daf8b466c39cSvetoslav Ganov                switch (message.what) {
5307ae2878f5219d55e842348eb44ffb5070b9d708dSvetoslav Ganov                    case MSG_ADD_FIRST_BATCH_FAKE_PRINTERS: {
5317ae2878f5219d55e842348eb44ffb5070b9d708dSvetoslav Ganov                        addFirstBatchFakePrinters();
5321274de1ce4243d6ebb3e12b12b75daf8b466c39cSvetoslav Ganov                    } break;
533f369a120cc6037a0765bb7b4922fbce1c86f1ee2Philip P. Moltmann                    case MSG_SUPPLY_CUSTOM_PRINTER_ICON: {
534f369a120cc6037a0765bb7b4922fbce1c86f1ee2Philip P. Moltmann                        SomeArgs args = (SomeArgs) message.obj;
535f369a120cc6037a0765bb7b4922fbce1c86f1ee2Philip P. Moltmann                        CancellationSignal cancellationSignal = (CancellationSignal) args.arg1;
536f369a120cc6037a0765bb7b4922fbce1c86f1ee2Philip P. Moltmann                        CustomPrinterIconCallback callbacks = (CustomPrinterIconCallback) args.arg2;
537f369a120cc6037a0765bb7b4922fbce1c86f1ee2Philip P. Moltmann                        args.recycle();
538f369a120cc6037a0765bb7b4922fbce1c86f1ee2Philip P. Moltmann
539f369a120cc6037a0765bb7b4922fbce1c86f1ee2Philip P. Moltmann                        if (!cancellationSignal.isCanceled()) {
540f369a120cc6037a0765bb7b4922fbce1c86f1ee2Philip P. Moltmann                            callbacks.onCustomPrinterIconLoaded(Icon.createWithBitmap(
541f369a120cc6037a0765bb7b4922fbce1c86f1ee2Philip P. Moltmann                                    BitmapFactory.decodeResource(getResources(),
542f369a120cc6037a0765bb7b4922fbce1c86f1ee2Philip P. Moltmann                                    R.raw.red_printer)));
543f369a120cc6037a0765bb7b4922fbce1c86f1ee2Philip P. Moltmann                        }
544f369a120cc6037a0765bb7b4922fbce1c86f1ee2Philip P. Moltmann                    } break;
5451274de1ce4243d6ebb3e12b12b75daf8b466c39cSvetoslav Ganov                }
5461274de1ce4243d6ebb3e12b12b75daf8b466c39cSvetoslav Ganov            }
5471274de1ce4243d6ebb3e12b12b75daf8b466c39cSvetoslav Ganov        }
5481274de1ce4243d6ebb3e12b12b75daf8b466c39cSvetoslav Ganov    }
5490fb6959ad364ee84e83c435d671228fb365f2084Svetoslav}
550