diff options
author | Svetoslav Ganov <svetoslavganov@google.com> | 2013-09-21 20:30:24 -0700 |
---|---|---|
committer | Svetoslav <svetoslavganov@google.com> | 2013-09-25 17:57:07 -0700 |
commit | 704697b6197262678e930daa831a1916ddee4dcf (patch) | |
tree | 9c486dcdc7e3986004147505c8dc7bc2e030bd02 /packages/PrintSpooler/src/com/android | |
parent | 0d38d0b42fba7dc50454d5c0652cf351c58a9db6 (diff) | |
download | frameworks_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.java | 47 | ||||
-rw-r--r-- | packages/PrintSpooler/src/com/android/printspooler/PrintSpoolerService.java | 100 |
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(); |