summaryrefslogtreecommitdiffstats
path: root/packages/PrintSpooler/src/com/android
diff options
context:
space:
mode:
authorSvetoslav Ganov <svetoslavganov@google.com>2013-09-21 20:30:24 -0700
committerSvetoslav <svetoslavganov@google.com>2013-09-25 17:57:07 -0700
commit704697b6197262678e930daa831a1916ddee4dcf (patch)
tree9c486dcdc7e3986004147505c8dc7bc2e030bd02 /packages/PrintSpooler/src/com/android
parent0d38d0b42fba7dc50454d5c0652cf351c58a9db6 (diff)
downloadframeworks_base-704697b6197262678e930daa831a1916ddee4dcf.zip
frameworks_base-704697b6197262678e930daa831a1916ddee4dcf.tar.gz
frameworks_base-704697b6197262678e930daa831a1916ddee4dcf.tar.bz2
Adding hidden APIs for observing the print jobs state.
This is needed for implementing the print job settigns UI. bug:10935736 Change-Id: I63b42cbf4ce6a259fa1af47fa368b148ca5621c1
Diffstat (limited to 'packages/PrintSpooler/src/com/android')
-rw-r--r--packages/PrintSpooler/src/com/android/printspooler/NotificationController.java47
-rw-r--r--packages/PrintSpooler/src/com/android/printspooler/PrintSpoolerService.java100
2 files changed, 101 insertions, 46 deletions
diff --git a/packages/PrintSpooler/src/com/android/printspooler/NotificationController.java b/packages/PrintSpooler/src/com/android/printspooler/NotificationController.java
index 25bb071..dae7770 100644
--- a/packages/PrintSpooler/src/com/android/printspooler/NotificationController.java
+++ b/packages/PrintSpooler/src/com/android/printspooler/NotificationController.java
@@ -32,7 +32,7 @@ import android.print.IPrintManager;
import android.print.PrintJobId;
import android.print.PrintJobInfo;
import android.print.PrintManager;
-import android.text.TextUtils;
+import android.provider.Settings;
import android.util.Log;
/**
@@ -47,9 +47,9 @@ public class NotificationController {
private static final String INTENT_ACTION_CANCEL_PRINTJOB = "INTENT_ACTION_CANCEL_PRINTJOB";
private static final String INTENT_ACTION_RESTART_PRINTJOB = "INTENT_ACTION_RESTART_PRINTJOB";
- private static final String INTENT_EXTRA_PRINTJOB_ID = "INTENT_EXTRA_PRINTJOB_ID";
- private static final String INTENT_EXTRA_PRINTJOB_LABEL = "INTENT_EXTRA_PRINTJOB_LABEL";
- private static final String INTENT_EXTRA_PRINTER_NAME = "INTENT_EXTRA_PRINTER_NAME";
+ private static final String EXTRA_PRINT_JOB_ID = "EXTRA_PRINT_JOB_ID";
+ private static final String EXTRA_PRINTJOB_LABEL = "EXTRA_PRINTJOB_LABEL";
+ private static final String EXTRA_PRINTER_NAME = "EXTRA_PRINTER_NAME";
private final Context mContext;
private final NotificationManager mNotificationManager;
@@ -89,6 +89,7 @@ public class NotificationController {
private void createPrintingNotification(PrintJobInfo printJob) {
Notification.Builder builder = new Notification.Builder(mContext)
+ .setContentIntent(createContentIntent(printJob.getId()))
.setSmallIcon(com.android.internal.R.drawable.ic_print)
.setContentTitle(mContext.getString(R.string.printing_notification_title_template,
printJob.getLabel()))
@@ -102,18 +103,16 @@ public class NotificationController {
}
private void createFailedNotification(PrintJobInfo printJob) {
- String reason = !TextUtils.isEmpty(printJob.getStateReason())
- ? printJob.getStateReason() : mContext.getString(R.string.reason_unknown);
-
Notification.Builder builder = new Notification.Builder(mContext)
- .setSmallIcon(R.drawable.stat_notify_error)
+ .setContentIntent(createContentIntent(printJob.getId()))
+ .setSmallIcon(com.android.internal.R.drawable.ic_print_error)
.setContentTitle(mContext.getString(R.string.failed_notification_title_template,
printJob.getLabel()))
.addAction(R.drawable.stat_notify_cancelling, mContext.getString(R.string.cancel),
createCancelIntent(printJob))
.addAction(android.R.drawable.ic_secure, mContext.getString(R.string.restart),
createRestartIntent(printJob.getId()))
- .setContentText(reason)
+ .setContentText(printJob.getPrinterName())
.setWhen(System.currentTimeMillis())
.setOngoing(true)
.setShowWhen(true);
@@ -121,16 +120,14 @@ public class NotificationController {
}
private void createBlockedNotification(PrintJobInfo printJob) {
- String reason = !TextUtils.isEmpty(printJob.getStateReason())
- ? printJob.getStateReason() : mContext.getString(R.string.reason_unknown);
-
Notification.Builder builder = new Notification.Builder(mContext)
- .setSmallIcon(R.drawable.stat_notify_error)
+ .setContentIntent(createContentIntent(printJob.getId()))
+ .setSmallIcon(com.android.internal.R.drawable.ic_print_error)
.setContentTitle(mContext.getString(R.string.blocked_notification_title_template,
printJob.getLabel()))
.addAction(R.drawable.stat_notify_cancelling, mContext.getString(R.string.cancel),
createCancelIntent(printJob))
- .setContentText(reason)
+ .setContentText(printJob.getPrinterName())
.setWhen(System.currentTimeMillis())
.setOngoing(true)
.setShowWhen(true);
@@ -141,19 +138,25 @@ public class NotificationController {
mNotificationManager.cancel(printJobId.flattenToString(), 0);
}
+ private PendingIntent createContentIntent(PrintJobId printJobId) {
+ Intent intent = new Intent(Settings.ACTION_PRINT_SETTINGS);
+ intent.putExtra(EXTRA_PRINT_JOB_ID, printJobId.flattenToString());
+ return PendingIntent.getActivity(mContext, 0, intent, PendingIntent.FLAG_ONE_SHOT);
+ }
+
private PendingIntent createCancelIntent(PrintJobInfo printJob) {
Intent intent = new Intent(mContext, NotificationBroadcastReceiver.class);
intent.setAction(INTENT_ACTION_CANCEL_PRINTJOB + "_" + printJob.getId().flattenToString());
- intent.putExtra(INTENT_EXTRA_PRINTJOB_ID, printJob.getId());
- intent.putExtra(INTENT_EXTRA_PRINTJOB_LABEL, printJob.getLabel());
- intent.putExtra(INTENT_EXTRA_PRINTER_NAME, printJob.getPrinterName());
+ intent.putExtra(EXTRA_PRINT_JOB_ID, printJob.getId());
+ intent.putExtra(EXTRA_PRINTJOB_LABEL, printJob.getLabel());
+ intent.putExtra(EXTRA_PRINTER_NAME, printJob.getPrinterName());
return PendingIntent.getBroadcast(mContext, 0, intent, PendingIntent.FLAG_ONE_SHOT);
}
private PendingIntent createRestartIntent(PrintJobId printJobId) {
Intent intent = new Intent(mContext, NotificationBroadcastReceiver.class);
intent.setAction(INTENT_ACTION_RESTART_PRINTJOB + "_" + printJobId.flattenToString());
- intent.putExtra(INTENT_EXTRA_PRINTJOB_ID, printJobId);
+ intent.putExtra(EXTRA_PRINT_JOB_ID, printJobId);
return PendingIntent.getBroadcast(mContext, 0, intent, PendingIntent.FLAG_ONE_SHOT);
}
@@ -164,12 +167,12 @@ public class NotificationController {
public void onReceive(Context context, Intent intent) {
String action = intent.getAction();
if (action != null && action.startsWith(INTENT_ACTION_CANCEL_PRINTJOB)) {
- PrintJobId printJobId = intent.getExtras().getParcelable(INTENT_EXTRA_PRINTJOB_ID);
- String printJobLabel = intent.getExtras().getString(INTENT_EXTRA_PRINTJOB_LABEL);
- String printerName = intent.getExtras().getString(INTENT_EXTRA_PRINTER_NAME);
+ PrintJobId printJobId = intent.getExtras().getParcelable(EXTRA_PRINT_JOB_ID);
+ String printJobLabel = intent.getExtras().getString(EXTRA_PRINTJOB_LABEL);
+ String printerName = intent.getExtras().getString(EXTRA_PRINTER_NAME);
handleCancelPrintJob(context, printJobId, printJobLabel, printerName);
} else if (action != null && action.startsWith(INTENT_ACTION_RESTART_PRINTJOB)) {
- PrintJobId printJobId = intent.getExtras().getParcelable(INTENT_EXTRA_PRINTJOB_ID);
+ PrintJobId printJobId = intent.getExtras().getParcelable(EXTRA_PRINT_JOB_ID);
handleRestartPrintJob(context, printJobId);
}
}
diff --git a/packages/PrintSpooler/src/com/android/printspooler/PrintSpoolerService.java b/packages/PrintSpooler/src/com/android/printspooler/PrintSpoolerService.java
index ce1f6ec..62b35fe 100644
--- a/packages/PrintSpooler/src/com/android/printspooler/PrintSpoolerService.java
+++ b/packages/PrintSpooler/src/com/android/printspooler/PrintSpoolerService.java
@@ -155,23 +155,33 @@ public final class PrintSpoolerService extends Service {
@SuppressWarnings("deprecation")
@Override
public void createPrintJob(PrintJobInfo printJob, IPrintClient client,
- IPrintDocumentAdapter printAdapter) throws RemoteException {
- PrintSpoolerService.this.createPrintJob(printJob);
-
- Intent intent = new Intent(printJob.getId().flattenToString());
- intent.setClass(PrintSpoolerService.this, PrintJobConfigActivity.class);
- intent.putExtra(PrintJobConfigActivity.EXTRA_PRINT_DOCUMENT_ADAPTER,
- printAdapter.asBinder());
- intent.putExtra(PrintJobConfigActivity.EXTRA_PRINT_JOB, printJob);
-
- IntentSender sender = PendingIntent.getActivity(
- PrintSpoolerService.this, 0, intent, PendingIntent.FLAG_ONE_SHOT
- | PendingIntent.FLAG_CANCEL_CURRENT).getIntentSender();
-
- Message message = mHandlerCaller.obtainMessageOO(
- HandlerCallerCallback.MSG_START_PRINT_JOB_CONFIG_ACTIVITY,
- client, sender);
- mHandlerCaller.executeOrSendMessage(message);
+ IPrintDocumentAdapter printAdapter) throws RemoteException {
+ PrintSpoolerService.this.createPrintJob(printJob);
+
+ Intent intent = new Intent(printJob.getId().flattenToString());
+ intent.setClass(PrintSpoolerService.this, PrintJobConfigActivity.class);
+ intent.putExtra(PrintJobConfigActivity.EXTRA_PRINT_DOCUMENT_ADAPTER,
+ printAdapter.asBinder());
+ intent.putExtra(PrintJobConfigActivity.EXTRA_PRINT_JOB, printJob);
+
+ IntentSender sender = PendingIntent.getActivity(
+ PrintSpoolerService.this, 0, intent, PendingIntent.FLAG_ONE_SHOT
+ | PendingIntent.FLAG_CANCEL_CURRENT).getIntentSender();
+
+ Message message = mHandlerCaller.obtainMessageIIO(
+ HandlerCallerCallback.MSG_ON_PRINT_JOB_STATE_CHANGED,
+ printJob.getAppId(), 0, printJob.getId());
+ mHandlerCaller.executeOrSendMessage(message);
+
+ message = mHandlerCaller.obtainMessageOO(
+ HandlerCallerCallback.MSG_START_PRINT_JOB_CONFIG_ACTIVITY,
+ client, sender);
+ mHandlerCaller.executeOrSendMessage(message);
+
+ printJob.setCreationTime(System.currentTimeMillis());
+ synchronized (mLock) {
+ mPersistanceManager.writeStateLocked();
+ }
}
@Override
@@ -240,12 +250,13 @@ public final class PrintSpoolerService extends Service {
}
private final class HandlerCallerCallback implements HandlerCaller.Callback {
- public static final int MSG_SET_CLIENT = 9;
- public static final int MSG_START_PRINT_JOB_CONFIG_ACTIVITY = 10;
- public static final int MSG_ON_PRINT_JOB_QUEUED = 11;
- public static final int MSG_ON_ALL_PRINT_JOBS_FOR_SERIVICE_HANDLED = 12;
- public static final int MSG_ON_ALL_PRINT_JOBS_HANDLED = 13;
- public static final int MSG_CHECK_ALL_PRINTJOBS_HANDLED = 14;
+ public static final int MSG_SET_CLIENT = 1;
+ public static final int MSG_START_PRINT_JOB_CONFIG_ACTIVITY = 2;
+ public static final int MSG_ON_PRINT_JOB_QUEUED = 3;
+ public static final int MSG_ON_ALL_PRINT_JOBS_FOR_SERIVICE_HANDLED = 4;
+ public static final int MSG_ON_ALL_PRINT_JOBS_HANDLED = 5;
+ public static final int MSG_CHECK_ALL_PRINTJOBS_HANDLED = 6;
+ public static final int MSG_ON_PRINT_JOB_STATE_CHANGED = 7;
@Override
public void executeMessage(Message message) {
@@ -310,6 +321,18 @@ public final class PrintSpoolerService extends Service {
case MSG_CHECK_ALL_PRINTJOBS_HANDLED: {
checkAllPrintJobsHandled();
} break;
+
+ case MSG_ON_PRINT_JOB_STATE_CHANGED: {
+ if (mClient != null) {
+ PrintJobId printJobId = (PrintJobId) message.obj;
+ final int appId = message.arg1;
+ try {
+ mClient.onPrintJobStateChanged(printJobId, appId);
+ } catch (RemoteException re) {
+ Slog.e(LOG_TAG, "Error notify for print job state change.", re);
+ }
+ }
+ } break;
}
}
}
@@ -511,6 +534,11 @@ public final class PrintSpoolerService extends Service {
synchronized (mLock) {
PrintJobInfo printJob = getPrintJobInfo(printJobId, PrintManager.APP_ID_ANY);
if (printJob != null) {
+ final int oldState = printJob.getState();
+ if (oldState == state) {
+ return false;
+ }
+
success = true;
printJob.setState(state);
@@ -553,6 +581,11 @@ public final class PrintSpoolerService extends Service {
if (!hasActivePrintJobsLocked()) {
notifyOnAllPrintJobsHandled();
}
+
+ Message message = mHandlerCaller.obtainMessageIIO(
+ HandlerCallerCallback.MSG_ON_PRINT_JOB_STATE_CHANGED,
+ printJob.getAppId(), 0, printJob.getId());
+ mHandlerCaller.executeOrSendMessage(message);
}
}
@@ -706,7 +739,10 @@ public final class PrintSpoolerService extends Service {
private static final String ATTR_APP_ID = "appId";
private static final String ATTR_USER_ID = "userId";
private static final String ATTR_TAG = "tag";
+ private static final String ATTR_CREATION_TIME = "creationTime";
private static final String ATTR_COPIES = "copies";
+ private static final String ATTR_PRINTER_NAME = "printerName";
+ private static final String ATTR_STATE_REASON = "stateReason";
private static final String TAG_MEDIA_SIZE = "mediaSize";
private static final String TAG_RESOLUTION = "resolution";
@@ -714,7 +750,7 @@ public final class PrintSpoolerService extends Service {
private static final String ATTR_COLOR_MODE = "colorMode";
- private static final String ATTR_LOCAL_ID = "printerName";
+ private static final String ATTR_LOCAL_ID = "localId";
private static final String ATTR_SERVICE_NAME = "serviceName";
private static final String ATTR_WIDTH_MILS = "widthMils";
@@ -794,7 +830,17 @@ public final class PrintSpoolerService extends Service {
if (tag != null) {
serializer.attribute(null, ATTR_TAG, tag);
}
+ serializer.attribute(null, ATTR_CREATION_TIME, String.valueOf(
+ printJob.getCreationTime()));
serializer.attribute(null, ATTR_COPIES, String.valueOf(printJob.getCopies()));
+ String printerName = printJob.getPrinterName();
+ if (!TextUtils.isEmpty(printerName)) {
+ serializer.attribute(null, ATTR_PRINTER_NAME, printerName);
+ }
+ String stateReason = printJob.getStateReason();
+ if (!TextUtils.isEmpty(stateReason)) {
+ serializer.attribute(null, ATTR_STATE_REASON, stateReason);
+ }
PrinterId printerId = printJob.getPrinterId();
if (printerId != null) {
@@ -979,8 +1025,14 @@ public final class PrintSpoolerService extends Service {
printJob.setUserId(userId);
String tag = parser.getAttributeValue(null, ATTR_TAG);
printJob.setTag(tag);
+ String creationTime = parser.getAttributeValue(null, ATTR_CREATION_TIME);
+ printJob.setCreationTime(Long.parseLong(creationTime));
String copies = parser.getAttributeValue(null, ATTR_COPIES);
printJob.setCopies(Integer.parseInt(copies));
+ String printerName = parser.getAttributeValue(null, ATTR_PRINTER_NAME);
+ printJob.setPrinterName(printerName);
+ String stateReason = parser.getAttributeValue(null, ATTR_STATE_REASON);
+ printJob.setStateReason(stateReason);
parser.next();