PrintSpoolerService.java revision 8c43376ea83a67414bd6823a472b76d41160239e
1/* 2 * Copyright (C) 2013 The Android Open Source Project 3 * 4 * Licensed under the Apache License, Version 2.0 (the "License"); 5 * you may not use this file except in compliance with the License. 6 * You may obtain a copy of the License at 7 * 8 * http://www.apache.org/licenses/LICENSE-2.0 9 * 10 * Unless required by applicable law or agreed to in writing, software 11 * distributed under the License is distributed on an "AS IS" BASIS, 12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13 * See the License for the specific language governing permissions and 14 * limitations under the License. 15 */ 16 17package com.android.printspooler; 18 19import java.util.List; 20 21import android.app.PendingIntent; 22import android.app.Service; 23import android.content.ComponentName; 24import android.content.Intent; 25import android.content.IntentSender; 26import android.os.Handler; 27import android.os.IBinder; 28import android.os.Looper; 29import android.os.Message; 30import android.os.ParcelFileDescriptor; 31import android.os.RemoteException; 32import android.print.IPrintDocumentAdapter; 33import android.print.IPrintClient; 34import android.print.IPrintSpoolerClient; 35import android.print.IPrintSpooler; 36import android.print.IPrintSpoolerCallbacks; 37import android.print.PrintAttributes; 38import android.print.PrintJobInfo; 39import android.util.Slog; 40 41import com.android.internal.os.SomeArgs; 42 43/** 44 * Service for exposing some of the {@link PrintSpooler} functionality to 45 * another process. 46 */ 47public final class PrintSpoolerService extends Service { 48 49 private static final String LOG_TAG = "PrintSpoolerService"; 50 51 private Intent mStartPrintJobConfigActivityIntent; 52 53 private PrintSpooler mSpooler; 54 55 private Handler mHanlder; 56 57 @Override 58 public void onCreate() { 59 super.onCreate(); 60 mStartPrintJobConfigActivityIntent = new Intent(PrintSpoolerService.this, 61 PrintJobConfigActivity.class); 62 mSpooler = PrintSpooler.getInstance(this); 63 mHanlder = new MyHandler(getMainLooper()); 64 } 65 66 @Override 67 public IBinder onBind(Intent intent) { 68 mSpooler.restorePersistedState(); 69 70 return new IPrintSpooler.Stub() { 71 @Override 72 public void getPrintJobInfos(IPrintSpoolerCallbacks callback, 73 ComponentName componentName, int state, int appId, int sequence) 74 throws RemoteException { 75 List<PrintJobInfo> printJobs = null; 76 try { 77 printJobs = mSpooler.getPrintJobInfos(componentName, state, appId); 78 } finally { 79 callback.onGetPrintJobInfosResult(printJobs, sequence); 80 } 81 } 82 83 @Override 84 public void getPrintJobInfo(int printJobId, IPrintSpoolerCallbacks callback, 85 int appId, int sequence) throws RemoteException { 86 PrintJobInfo printJob = null; 87 try { 88 printJob = mSpooler.getPrintJobInfo(printJobId, appId); 89 } finally { 90 callback.onGetPrintJobInfoResult(printJob, sequence); 91 } 92 } 93 94 @SuppressWarnings("deprecation") 95 @Override 96 public void createPrintJob(String printJobName, IPrintClient client, 97 IPrintDocumentAdapter printAdapter, PrintAttributes attributes, 98 IPrintSpoolerCallbacks callback, int appId, int sequence) 99 throws RemoteException { 100 PrintJobInfo printJob = null; 101 try { 102 printJob = mSpooler.createPrintJob(printJobName, client, 103 attributes, appId); 104 if (printJob != null) { 105 Intent intent = mStartPrintJobConfigActivityIntent; 106 intent.putExtra(PrintJobConfigActivity.EXTRA_PRINT_DOCUMENT_ADAPTER, 107 printAdapter.asBinder()); 108 intent.putExtra(PrintJobConfigActivity.EXTRA_PRINT_JOB_ID, 109 printJob.getId()); 110 intent.putExtra(PrintJobConfigActivity.EXTRA_PRINT_ATTRIBUTES, attributes); 111 112 IntentSender sender = PendingIntent.getActivity( 113 PrintSpoolerService.this, 0, intent, PendingIntent.FLAG_ONE_SHOT 114 | PendingIntent.FLAG_CANCEL_CURRENT).getIntentSender(); 115 116 SomeArgs args = SomeArgs.obtain(); 117 args.arg1 = client; 118 args.arg2 = sender; 119 mHanlder.obtainMessage(0, args).sendToTarget(); 120 } 121 } finally { 122 callback.onCreatePrintJobResult(printJob, sequence); 123 } 124 } 125 126 @Override 127 public void setPrintJobState(int printJobId, int state, CharSequence error, 128 IPrintSpoolerCallbacks callback, int sequece) throws RemoteException { 129 boolean success = false; 130 try { 131 success = mSpooler.setPrintJobState(printJobId, state, error); 132 } finally { 133 callback.onSetPrintJobStateResult(success, sequece); 134 } 135 } 136 137 @Override 138 public void setPrintJobTag(int printJobId, String tag, 139 IPrintSpoolerCallbacks callback, int sequece) 140 throws RemoteException { 141 boolean success = false; 142 try { 143 success = mSpooler.setPrintJobTag(printJobId, tag); 144 } finally { 145 callback.onSetPrintJobTagResult(success, sequece); 146 } 147 } 148 149 @Override 150 public void writePrintJobData(ParcelFileDescriptor fd, int printJobId) { 151 mSpooler.writePrintJobData(fd, printJobId); 152 } 153 154 @Override 155 public void setClient(IPrintSpoolerClient client) { 156 mSpooler.setCleint(client); 157 } 158 159 @Override 160 public void notifyClientForActivteJobs() { 161 mSpooler.notifyClientForActivteJobs(); 162 } 163 }; 164 } 165 166 private static final class MyHandler extends Handler { 167 168 public MyHandler(Looper looper) { 169 super(looper, null, true); 170 } 171 172 @Override 173 public void handleMessage(Message message) { 174 SomeArgs args = (SomeArgs) message.obj; 175 IPrintClient client = (IPrintClient) args.arg1; 176 IntentSender sender = (IntentSender) args.arg2; 177 args.recycle(); 178 try { 179 client.startPrintJobConfigActivity(sender); 180 } catch (RemoteException re) { 181 Slog.i(LOG_TAG, "Error starting print job config activity!", re); 182 } 183 } 184 } 185} 186