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