• Home
  • History
  • Annotate
  • only in /frameworks/base/core/java/android/print/
History log of /frameworks/base/core/java/android/print/
Revision Date Author Comments (<<< Hide modified files) (Show modified files >>>)
2dcedc1276aee3e4e044b1d4ecafc34462fefb7c 08-Jun-2017 Svetoslav Ganov <svetoslavganov@google.com> Ensure only test print services enabled - framework

Test: cts-tradefed run cts-dev -m CtsPrintTestCas


Change-Id: I1050272586d1c03dc1b1dfdb8b10e258912a249b
d86b8fea43ebb6e5c31691b44d8ceb0d8d3c9072 03-Jun-2017 Jeff Sharkey <jsharkey@android.com> Annotate @SystemApi with required permissions.

Most @SystemApi methods should be protected with system (or higher)
permissions, so annotate common methods with @RequiresPermission to
make automatic verification easier.

Verification is really only relevant when calling into system
services (where permissions checking can happen on the other side of
a Binder call), so annotate managers with the new @SystemService
annotation, which is now automatically documented.

This is purely a docs change; no logic changes are being made.

Test: make -j32 update-api && make -j32 offline-sdk-docs
Bug: 62263906
Change-Id: I2554227202d84465676aa4ab0dd336b5c45fc651
7e01895e6972c0ebc552215b1207a519529af3fd 02-Apr-2017 Philip P. Moltmann <moltmann@google.com> Return inet addr for discoverable printers

... by extending the RecommendationInfo to store the inet addresses not
just the count. Thankfully the recommendation plugins already contained
all the printers, not only the count.

Also expose the print service state as system APIs as they will be used
by the default print service.

Bug: 35765644
Test: Ran AddPrinterActivity on network that had printers to discover
Change-Id: I929a177adb75f6848848ba30a472cf0343d2e67e
8f6feec73f4bc2451d90c55c24029cf244ec42c2 05-Oct-2016 Philip P. Moltmann <moltmann@google.com> Allow print services to read advanced options.

Test: Ran adjusted test that is subitted along side
Change-Id: Ic662c6a6e56c3184611b30947fd715b57df196c0
Fixes: 28913410
c49bf6a63b52ca74a6b3b517e209808037eb04df 07-Jul-2016 Philip P. Moltmann <moltmann@google.com> Fix doc for default print document content type

Since Kitkat the default was always 0 == document.

Change-Id: I9c6236073898f5e62ec80f95a21fd394802fe1dd
127c9715b41e56f9f74066535f52bfaaa76b8cc7 27-Jun-2016 Philip P. Moltmann <moltmann@google.com> Merge \"Merge \\"Do not remove handlers for loaders.\\" into nyc-mr1-dev am: b6ee468b3e\" into nyc-mr1-dev-plus-aosp
am: 1134308842

Change-Id: I80459fe11f37ad937c5855d296a81b2d002370d2
00c3659eca6f9ab9235e7746b6d74702ab90555b 24-Jun-2016 Philip P. Moltmann <moltmann@google.com> Do not remove handlers for loaders.

In rare situations we might trigger a force-load if the handler is

Change-Id: I103744654805dcbe0744b09b5be9da1f505817d3
Fixes: 29581798
2e3012624b703a653fed44d4dc1b8904406c0d99 16-Jun-2016 Philip P. Moltmann <moltmann@google.com> Add event tracking to print UI.

Bug: 29391676
Change-Id: Iec09ac7296e50329e87268bcb70f5e60d566961c
823715d656381a84b8c6c6d63769c663b417274d 22-Apr-2016 Philip P. Moltmann <moltmann@google.com> Rename 'thousands of an inch' to 'thousandths of an inch'in the docs.

Fixes: 28268203
Change-Id: I4246bc7431d1e0ecb75a6d101ba6ccd548567704
c863489e67ffaf8d74de24cf1634d9b9619a2f60 20-Apr-2016 Philip P. Moltmann <moltmann@google.com> Prevent printing from finishing activity.

Bug: 27861927
Change-Id: I00177ca0ec75cc8f7fd422907a2b5827b5db406b
0d1407e60998fc73cf93801de9c637e8d0e19b5b 01-Apr-2016 Philip P. Moltmann <moltmann@google.com> Fix Print CTS tests.

Fixes: 27971210
Change-Id: Ied11b2f1c528fe5e204e683d988b4efbd2562ef0
e680a8db52652830b99d9effce6c04a2a60c142e 30-Mar-2016 Philip P. Moltmann <moltmann@google.com> Make sure PrinterCapabilitiesInfo always have sane values.

Change-Id: I1ae7fe6aabdbe7f9480c4067690338103adaafa2
4723f36d3e93ce4585233de31c72143a46b657f7 30-Mar-2016 Philip P. Moltmann <moltmann@google.com> Make sure PrintDocumentInfo is always sane.

Change-Id: I73cf554d42dc33b7a1f6577088ec53b447f14c8c
aa8a4fed075fdd9faa6c9d5b150fc28e1a834122 30-Mar-2016 Philip P. Moltmann <moltmann@google.com> Make sure PrintAttributes have sane values.

Please note that null and 0 values mean "unset" and that margins
historically allowed negative values.

Change-Id: I1773bc552142345e18c1c31fb25e583d0ed070a2
9dcb86a48d73f399fb1b5c020005d76d350eeac2 14-Mar-2016 Philip P. Moltmann <moltmann@google.com> Add the print service recommendation service

This service connects through the print manager to the print spooler:

PrintSpooler.AddPrintersActivity <-> PrintManager <-> PrintManagerService <-> UserState <-> RemotePrintServiceRecommendationService <-> PrintRecommendationService <-> PrintRecommendationServiceImpl

Hence there is a lot of mindless plumming.

The actual changes are only in the AddPrintersActivity which is extended
to show another list of services: The recommended services.

The PrintServiceRecommendationService is based on the experimenal print
service stubs provider. This provider was contributed the Android by
Mopria. As this services uses Android own network discovery service most
code from the experimental provider goes away. In fact the only logic
left over is the selections of mdns-txt fields to look at and the
printer vendor configuration.

This relies on the Android MDNS to get fixed (Bug: 27696905). This also
does not deal with how to update the recommendation service.

Bug: 24533249
Change-Id: I6edc6e25fc08a50d478b61c71bb8ea158b08624c
456f1e33b808052377a79b91d34091a356652f2c 30-Mar-2016 Philip P. Moltmann <moltmann@google.com> Merge "Update print preview when option is changed and clear ranges when they layout changes" into nyc-dev
d74d1e549168ba521e8009961b76e8718be37aa1 18-Mar-2016 Philip P. Moltmann <moltmann@google.com> Change hasCustomPrintIcon and setStatus as requested by API council.

Bonus: null advanced keys produced a exception deep in the print
spooler. Hence prevent null keys on the surface from now on.

Bug: 27716355
Change-Id: I3c064956f4e670cd7091437ade06605aa8d797b0
4ef83c4647471aa5aefce463ed8abfe37da7fd00 24-Mar-2016 Philip P. Moltmann <moltmann@google.com> Update print preview when option is changed and clear ranges when they
layout changes

Before we updated the print preview when the paper size changed but not
when the page ranges changed. This is not consistent. We always change.

Also if there is a change to the options that changes the layout (i.e.
papersize, orientation, minMargins) then clear the selected ranges as
this does not make sense anymore.

This also fixes a bug that when having pages selected while we reduce
the number of pages in the preview we got a NPE.

Bonus: do not constantly re-update the options UI when range or copies
text is updated.

Bug: 27830850, 27741420
Change-Id: I7abe4a74b44ac5c5ee54d12cc0c1ca1540793f0e
66c96591e2ddb464c67e60dbf4193ef4ec8a620b 24-Feb-2016 Philip P. Moltmann <moltmann@google.com> Add "app printer activity" and always keep the print service state
updated. Also fiddle with the UI to use more standard values.

To be sure the print service state alwasy updated I changed
PrintManager.getPrintServices to return a loader which just wraps a
registerListener/getList/removeListener combo.

I also added a new function to enabled/disable a print service to be
keep all updating logic inside the PrintManagerService->UserState.

Then I changed all code to use this new interface.

Detailed comments:

- I had to add the enabled state to the PrintServiceInfo as some users
of PrintManager.getPrintServices want all services but then display
different data depending on the enabled state. Of course I could have
created two PrintManager.getPrintServices-loaders to load the two
separate list of services. I think it is much easier to add this
property though. It is updated every time new data is returned to the

- This is shown as a dialog-style overlay to indicate that the user will
return to the select-printers activity. It contains of three list that
are updated via separate loaders.
- The recommended services will be added later to keep this path set

- There are two small places where we have to update the data when we
get a new list of print services.
- In very, very rare conditions it can happen that the print service
of the current printer gains or looses the "advancedOptions"
- If we have no enabled print services we want to show "Add printer"
instead of "All printers...".
- Also the print registry is not the only loader anymore, hence we have
to assign loader ids to it to not conflict with the other loaders in
this activity.
- Small bug in onPrintersChanged: If a printer is selected and the print
service of this printer gets disabled the holder goes into "removed"
state which disables the printer. When the print service is then
enabled again, we forgot to re-enable the holder.

- The registry assumed that the FusedPrinterProvider was the only loader
in the activity. This is not true anymore, hence it has to assign the
appropriate loader ids.
- The FusedPrinterProvider has an internal loader, hence we have to
forward a loader Id into it.
- The PrintRegistry is only called backed for a single loader, hence no
need to check the loader-id.

- The AddPrinterDialog was removed as we now have the
- Added a loader for the enabled services to update the empty state.
- Added dedicated loader Id for the PrinterRegistry again.
- If we have no enabled services, the SelectPrinterActivity chainloads
the AddPrinterActivity as this is the only thing the user can do
anyway. "Save a click". This should only happen when the activity is
create the first time.
- Moved the "add printer" from the menu item to the list of printers as
suggested by UX and Zach.

PrintManagerService, UserState and IPrintManagerParamtersTest:
- As the only place where the print service state is updated is now the
userstate, we have no more sychronization problems. Whohoo.
- The users can now register for changes to the print services similar
as they can register for changes to the print jobs.
- UserState.getPrintServices is the only function can exposes any
knowledge of the print services to the outside world.

Change-Id: I9be2c7300431e06aaff9bdf7eb36120d869b56ac
f8880561e67e1da246970b49b14285efd4164ab1 26-Feb-2016 Jeff Sharkey <jsharkey@android.com> When system server goes down, crash apps more.

Similar to first patch, but now using new "rethrowFromSystemServer()"
method which internally translates DeadObjectException into
DeadSystemException. New logic over in Log.printlns() now
suppresses the DeadSystemException stack traces, since they're
misleading and just added pressure to the precious log buffer space.

Add some extra RuntimeInit checks to suppress logging-about-logging
when the system server is dead.

Bug: 27364859
Change-Id: I05316b3e8e42416b30a56a76c09cd3113a018123
e93cf151fbb0ed1e42d14b767f5f8798ab6876e7 02-Feb-2016 Philip P. Moltmann <moltmann@google.com> Merge "Allow the PDF Printer to "print" non-locale-default paper sizes."
e33b954165595acec9cf9fe2bc14f4586f541f73 26-Jan-2016 Philip P. Moltmann <moltmann@google.com> Merge "Check parameters for callers of IPrintManager"
5ddbc2af0c248e73c5b8f7c37c7a24775798326b 26-Jan-2016 Philip P. Moltmann <moltmann@google.com> Merge "Correctly deal with non-null ness of PrintJobId."
4959caf149c49f0a58c6a89ec01b909baf3fa579 21-Jan-2016 Philip P. Moltmann <moltmann@google.com> Allow the PDF Printer to "print" non-locale-default paper sizes.

The MediaSizeComparator already sorts the media sizes correctly.

Bug: 12675943
Change-Id: I6fa4b1a8885a60704bc175ec849ea483ffb4bcd8
22f86b4e77c77312e8b3f08fc598be00c323f750 15-Jan-2016 Philip P. Moltmann <moltmann@google.com> Correct nullability in PrintJob.

Unfoturnately printJobInfo.getId() can be legitimately null. Maybe that
can be fixed, but until this is addressed we have to deal with it.

Change-Id: I2bf816dfde49e85d51523beba2c3401f5a6ee55e
76d7e3ee70c4299b22b1a03505d2b4f108716c75 15-Jan-2016 Philip P. Moltmann <moltmann@google.com> Check parameters for callers of IPrintManager

- Propagate nullness and non-null-ness up and down from the interfaces.
- Add non-CTS print tests for IPrintManager binder.

Change-Id: I0c310d9cea8aefba5ce386931521ffaf19712bbb
1c8f1e06a609507533609b4e04161c1c4fcb2849 21-Jan-2016 Philip P. Moltmann <moltmann@google.com> Shorten LOG_TAGs to fit in 23 characters as commented on by lint.

Change-Id: Ie9415fc3de642493bc36c0159b773d8ce2436df5
cdf2b400349ca22fedfeb5a2deb8a043791b22ef 14-Jan-2016 Philip P. Moltmann <moltmann@google.com> Enforce non-nullness in PrinterId and exploit it.

Change-Id: Ifdf3b2329548a665d609dd66b738baab5c765b54
fdb2b7644fc8b0ef968b5c7a2345c17a58287fd9 15-Jan-2016 Philip P. Moltmann <moltmann@google.com> Correctly deal with non-null ness of PrintJobId.

Change-Id: I217885247467e3900b53f8a2ab32306a50351154
c2ad22663ba8cbd0ceb35e760c5f3c4084fb5033 13-Jan-2016 Philip P. Moltmann <moltmann@google.com> Clean up API for PrinterInfo.

- Make immutable
- Check parameters
- Check state while unparcelling

Change-Id: I13959845ca508936331488506380e894f49abf25
8141bdfa56f13c3946bed12ba7801e492ec25c11 22-Dec-2015 Philip P. Moltmann <moltmann@google.com> Store which print services are disabled instead of which are enabled

This make services that appreared while the print manager was not active
by default enabled.

In the case we upgrade from pre-N we convert the enabled-list into a

Bug: 26249649
Change-Id: Iae783a8dd19f1a9d75d675710ea4348fdfbd34f3
b8c1a02adb1e55bae04bde3f5046fe324abed9e9 06-Jan-2016 Philip P. Moltmann <moltmann@google.com> Fix wrong annotation for PrintInfo.Builder.setStatus

Change-Id: I11fd68497c6229d16c0827f4753f485e9095649d
bb36206f08797156caed236671d36b5a34682f95 23-Dec-2015 Philip P. Moltmann <moltmann@google.com> Rename variable that hides the contatining classes name.

Change-Id: Iad0a9b341a866d33d10b7a389d243e677a65057c
c43639c3067dda5df189fb3cbf14f256c17e677d 18-Dec-2015 Philip P. Moltmann <moltmann@google.com> Clean up print subsystem

- Stop using deprecated APIs
- Fix all public and some internal javadoc
- Add @Decorations to public APIs
- Some minor cleanup, e.g. don't use variables with overlapping names in same scope
- remove unnecessary properties from manifest (they are set by the build

Change-Id: I0ce8849a516414763fe9de76c3a18ce17d896816
bb9f686b40743df2642b7d3b7778dbf7284ae665 01-Dec-2015 Philip P. Moltmann <moltmann@google.com> Allow a print service to specify per printer icons, description and

The icon is loaded from the discovery session only when it is displayed
to avoid having to store too many icons in memory.

Also the icons are not maintained in the historical printers. Only if
the printers are available nice icons are shown. A historical printer is
updated with the appropriate properties (including icon) once it becomes

Bug: 24135005
Change-Id: Iec389bab514b024634be8fb5fc8928371cba8740
b3078c235e7674fd61be75fb469105ba6174aba5 24-Nov-2015 Philip P. Moltmann <moltmann@google.com> Allow print service to specify progress of print and status

The status has always been there in error cases, it is now also visible
in non-error cases.

If the progress is not set, no progress bar is shown.

Bug: 24135025
Change-Id: Iea23f45d236365433c6f6739597833d236ed6d19
b4efdb4726a442eef38bb6417d5acb8eb68b912d 10-Nov-2015 Philip P. Moltmann <moltmann@google.com> Deal correctly with suggested print attributes

An app might suggest certain attribute for an print job. This patch

- PrintActivity should not silently overwrite the attributes with
the default values
- Handle duplex mode in PrintAttributes similar to the other attributes.
I.e. have an "unset" value (0). This is an API change. But the only
use case for PrintAttributes was to pass them to print() and thereby
the PrintActivity. This was broken (see above), hence we are changing
and API that could have never been used.

Bug: 23629618
Change-Id: I43c25704497c799352fb806126dc93f6db4879f5
853a6f564abaf8acbd88c6704008c5d150d00471 03-Nov-2015 Philip P. Moltmann <moltmann@google.com> Add a alert that allows the user to approve a print service when
we print using it the first time.

This warning used to be shown when the print settings app was used
to enable a service.

If two warning as shown for the same print service we automcatially
dismiss all dialogs once one dialog is confirmed. Please note that
we are not confirming the printjob as it is unexpeced to have a
single click to confirm multiple print jobs.

Change-Id: I8bb0a49bac2063c1c55e2f24bd34df2c44e2df89
Bug: 24135353
b95d079c8036279c52a76e02c5bd5f99d58a8402 17-Mar-2015 Andreas Gampe <agampe@google.com> am e4bdf3c1: am be549f9b: Merge "Frameworks/base: Fix precedence bug"

* commit 'e4bdf3c1c9e7be06b68cc32f9a492d512bf87528':
Frameworks/base: Fix precedence bug
869d26fda0d612c15eac64f7d7bc6d7a28073498 15-Mar-2015 Andreas Gampe <agampe@google.com> Frameworks/base: Fix precedence bug

Explicit cast has higher precedence than shift.

Bug: 19797138
Change-Id: Ifcf569bf774fbf65ee50c078f736ad167bcc6b8c
948c9a6393e0995a4d988d5d164998aa0e12b25d 03-Feb-2015 Svetoslav <svetoslavganov@google.com> Add duplex mode support.

This change adds support for duplex printing. The print UI now has a duplex
option which allows the user to choose one of the supported duplex options
by the currently selected printer. The chosen duplex mode is propaged to the
print service that manages this printer.

Change-Id: I807ba9da2723531535c0e1e33f2f4e1b503a54b0
fce84f035c35606c5707e735f503f7bdcfd5b2a1 01-Nov-2014 Svet Ganov <svetoslavganov@google.com> Crash apps that print malformed or password protected PDFs.

If apps are writing malformed content (typically not a PDF file) or if the
PDF content they provide to the print system is password protected, are now
crashed as both of these are app bugs.


Change-Id: Ifce6a3199e587448dd38f6a84290a965c24b698b
6552bf3da60159607d9266eb295ee3c448f6c3de 04-Sep-2014 Svetoslav <svetoslavganov@google.com> Print spooler UI polish and bug fixes.

1. Added an empty state for pages that are being rendered.

2. Fixed a NPA on a binder thread when destoroying the
remote print adapter.

3. Fixed a rare crash when the print activity gets an
activity class callback while initializing.

4. Changed the preview pages on phone in land to four.

5. Fixed a flicker from a list of pages to an empty state
and then back to the list of pages.


Change-Id: I0eea2f30a102d8fefcbf90187fa6d8612fb19434

15cbc8a03250eafdf947cd8ad4e77f34444d5ba4 11-Jul-2014 Svetoslav <svetoslavganov@google.com> Addressing comments for the print preview feature.

Change-Id: Ib72140a912e22f859258d970e0d1c4ef06e807d5
0c126a478b4b1891b275fe424c9f7e37adcdb758 11-Jul-2014 Svetoslav <svetoslavganov@google.com> Fix print document with zero pages backwards compatibility.

Historically, we were allowing an app that prints to specify that
the printed document has zero pages. While this does not make any
sense we should keep the behavior as people may have apps that do
that. This change fixes this issue and now we treat zero the same
way as undefined page count and ask the app to write all pages to
check the written PDF for the page count.


Change-Id: I4e7de66b669e9f783db0252244a6c1e5b24ffe28
525a66b2bb5abf844aff2109bdc9ed819566bece 15-Jun-2014 Svet Ganov <svetoslavganov@google.com> Adding print preview.

This change adds the pring preview part of the new print UX. The
UI has two parts, the top section is the print options and the
bottom section print preview with a list of pages. The user can
interact only with one of them. When print options are expanded
they cover the preview content and a scrim is laid out on top of
the preview. Tapping the scrim collapses the print options. When
the user types in page ranges and closes the options to look at
the preview, the latter is updated to show only these pages. In
the list of pages the user can further prune pages by deselecting

Change-Id: I0b23d2c598afe2a34400ccfa43e4e935af83c72f
a798c0a984f29f7180883a61839f68d2cbf0c6ce 15-May-2014 Svetoslav <svetoslavganov@google.com> Refactor printing

Change-Id: I19850154ef2798afff511e4490a268ce38e8cbae
2235a1772fc3c72b5c1795310e221d613cae01da 08-May-2014 Svetoslav <svetoslavganov@google.com> PrintManager should not crash if print fueature is not available.

Printing is one of the optional software features. If the device does not
have the feature, then the print APIs should do nothing. Before, a NPE
crash was happening.


Change-Id: I63efa75be51e8957ca6854b2b439918f01c0f154
fcf3b103f0fc275aeefbe548804b51c26f4385a5 18-Mar-2014 Svetoslav <svetoslavganov@google.com> Merge "Update print docs"
85a85a0ed775999533b14a415fd79b50fe63e6d2 18-Mar-2014 Svetoslav <svetoslavganov@google.com> Update print docs

Change-Id: I671ad776968ca2802f05f94f7cc96959fb50fa4b
73832594b31fe110a24329aad9bf611412600e71 18-Mar-2014 Svetoslav <svetoslavganov@google.com> Merge "Updated print docs."
81f14b96899afa90330e2652acb629345acf17b1 18-Mar-2014 Svetoslav <svetoslavganov@google.com> Updated print docs.

Added an explanation why the system cannot maintain print UI
state on rotation.

Change-Id: I370158ba4be929b67a4b5476ccacad5335d18b34
b628dd825b319704f8a8135addef766ec892ce84 02-Jan-2014 Svetoslav <svetoslavganov@google.com> PrintSpooler crash if printer is reported to have only one color mode.


Change-Id: I4932cf1b5b9b89f0cbf97011782ede037e7d814c
(cherry picked from commit b0d97b87ba5f23ee867f381a4e5916ebb2e5f762)
afd19675030801fb64d32ff101d1da651edf87bc 14-Nov-2013 Svetoslav <svetoslavganov@google.com> Avoid NPE and add a warning log if a printing app misbehaves.

An app can print only from an activity. If the activity is finished
before printing completes we destroy the PrintDocumentAdapter. The
app may however invoke some of the print callbacks after destruction
resulting in a NPE. This change checks if the adapter is destroyed
and if so does not crash while printing a meaningful log error with
the mistake of the app developer.


Change-Id: I66539cfbd7583f52cb863a84ef8e40856f92ceed
57b296f5a9b547e5a5aad2f19f082f2b9400d88a 13-Nov-2013 Svetoslav <svetoslavganov@google.com> Update the PrintDocumentAdapter docs.

This change adds some clarification when a cancellation will be
requested during a layout or write. It also clarifies from which
thread the layout and write callbacks can be invoked.

Change-Id: Id20ff04c6fca8315849ed4a6c329da1b12bb6836
d270cb9264f762257d1aadbeba9c4b38866e171c 31-Oct-2013 Svetoslav <svetoslavganov@google.com> Cancel current work in PrintDocumentAdatper if printing is cancelled.

Layout and write may take some time during which the user can
cancel printing. Currently we wait for the last operation,
being write or layout, to complete before closing the print
dialog. Now in such a scenario we request a cancellation of
the ongoing operation.


Change-Id: Ia9d747163cc73509369a86c8b5afc83b7ee54859
b4fda134761c9521a7e127db3806a07a18763b77 26-Oct-2013 Svetoslav <svetoslavganov@google.com> Complete implementation of the advanced print options.

1. Implemented the advanced printer options integration. Now a print service
may declare an advanced print options activity which may be launched by
the user if the current printer supports advanced print options. These options
are visible only to the print service that added them and it is the only party
that will interpret the options.

2. Fixed a couple of bugs in the saved print jobs parsing. One was that if there
are more than one page range, a half of the print job properties was not
properly parsed. The other was that the media size constructor was using
incorrect argument order, thus creating a media size with wring width.

3. Fixed and edge case where old print jobs and their docs can get stuck in
the spooler. If the app did not write the requested pages we were not showing
an error message, rather just finish the activity without canceling the print
job and this print job is stuck in the spooler. Now we show an error message
and the user may retry, cancel. If the user cancels the print job is also
cancelled, thus no leftover in the spooler.

4. Fixed the background color of the print dialog to meet UX spec.


Change-Id: I352440bc86aec824a805883fc9579d96a06d11e6
4d4c66dd38e940082e385b49a33f4022ab04c738 25-Oct-2013 Svetoslav Ganov <svetoslavganov@google.com> Update the documentaton of the android.print package.


Change-Id: I46ceb66a69b6d32d6b417356178f67f2e25e891a
858a1850e2e1c4516129d27ecdf54aaeade606ca 18-Oct-2013 Svetoslav Ganov <svetoslavganov@google.com> Hide the print dialog if the printing activity is destroyed.

1. For an app to print it creates a PrintDocumentAdapter implementation
which is passed to the print dialog activity. If the activity that
created the adapter is destroyed then the adapter, which may rely on
the activity state, may be in an invalid state. For example, an app
creates an adapter and calls print resuting in the app activity and
the print dialog activity being stacked. Now the user rotates the
device which triggers the recreating of the activity stack (assume the
app does not handle rotation). The recreated print dialog activity
receives the intent that originally created it with containing the
adapter that was constructed in the context of the old, now destroyed,
app activity instance.

To handle this we are limiting an app to be able to print only from
and activity and when this activity is destroyed we mark the adapter
as invalid which will result in hiding the print dialog activity. Note
that if the app process is killed we already handle this in the print
dialog activiy by registering a death recipient on the adapter binder.

2. In the PrintManager.PrintDocumentAdapterDelegate some of the state is
accessed only on the main thread and some from miltiple threads. The
code was trying to avoid locking for state that is not accessed by
multiple threads but this is error prone and the benefit does not
justify the complexity and added fragility. Now grabbing a lock all
the time.

3. The PrintJobConfigActivity waits for it to bind to the print spooler
service before instantiating its print controller and editor. However,
these can be accessed by invoking some of the activity cycle callbacks.
This change is adding null checks for the case where the activity
callbacks are called before the binding to the spooler is completed.


Change-Id: Id906b3170e4f0a0553772dfa62686f06fdca0eaf
1c43fceaaa5f9aa6e29e2670f44f312632241007 16-Oct-2013 Svetoslav <svetoslavganov@google.com> Add APIs for an advanced print options activity.

This is the API part needed to implement support for custom print
options by a print service. Some printers have quite fancy options
and we want users to benefit using them.


Change-Id: I3a9df771c0ded559b61c597c686795840d702b27
d91cb3ea61ea5096637c5d2b5e3e6147d0d2cce3 13-Oct-2013 Svetoslav Ganov <svetoslavganov@google.com> The list of active print jobs in print service retunring wrong result.

1. The getActivePrintJobs() method in print service is designed to return
the active print job i.e. ones scheduled to be processed by the print
service. Now the correct list is returned.

2. The listeners for observing the state of print jobs may be called even
after being unregistered. Ex: state change occurs and we schedule a
message on the app's main thread to make the notificaion. Now the app
unregisretes the callback and on the next loop the notification message
is handled.


Change-Id: I4a497b5c9a7287a22023cafe41ce966d14300ca6
7d7888d1c7daa78ee0ad24a24c8dd54b01749259 12-Oct-2013 Svetoslav Ganov <svetoslavganov@google.com> Printed document size not persisted.

We persist ongoing print jobs so they can be restarted if the device
dies. The data size of the printed document was not persisted to disc.


Change-Id: I53ef1ee285aa4808917dd6a5c7335226aba1ef0a
9b6d3a153f44010a75907c6a9742c89a57d4e5ee 12-Oct-2013 Svetoslav Ganov <svetoslavganov@google.com> Fail only scheduled print jobs, i.e. handed to a service, if the service is disabled.

When a print service is disabled we assume all print jobs for it failed as we have
no way to know what happens to them. However we are also failing created print jobs,
i.e. ones not given to the service. Such jobs are in process of construction and
the print dialog is up. We should not fail such jobs as the dialog can still modify
their state and potentially select a print from a different service. Therefore, we
leave them alone and they will be failed if when constructed are passed to a
disabled/uninstalled service.


Change-Id: Ie4fe54327e3e25776b1dd572be2dfafdd700c2e5
54adee86af495311fc9ef62d65e035605043413f 11-Oct-2013 Svetoslav <svetoslavganov@google.com> Print spooler not starting.

1. In my previous change I fixed a typo in the Java constant with
intent action to launch the print dialog but failed to updated
the print spooler manifest.

2. Removed dead code - the user id is no longer needed since the
spooler is an app that runs per user. Every user has its spooler.
This code was not referenced from anywhere.

3. Added a default icon to the print spooler.

4. Fixed a bug where if the print history is empty the UI goes
to the all pritners activity.


Change-Id: If74c23b418a8c67620ba14435ee7f3b2c4527099
7bfbbcb04bf4ba8f3069b2df136f708c9849bacf 10-Oct-2013 Svetoslav <svetoslavganov@google.com> Refactor how the print dialog activity is started.

1. Before the print job activity was started asyncronously with
respect to the print call on to the print manager. This was
creating a situation where the starting activity may finish
before the print dialog appears which may lead to an orphaned
print document adapter with no data to print (as the UI is
is gone), or strange behaviors where the print dialog starts
on as a separate task.

To address this the pending intent for starting the print
dialog is not started by the print spooler since we cannot
call into it synchronously as we have to start its process
and bind to the spooler service which leads to jankyness in
the client app. Now the pending intent is created by the
print manager service in the synchronous print call so
from an app's perspective calling print starts the activity.

The side effect of this design is that the print dialog
activity may start before the system is bound to the spooler
service. In such a case the print activity cannot start
poking the print spooler state as the system registers
callback to observe the spooler state. To address this
the print spooler activity disables the UI and also binds
to the spooler service which happenes immediately after it
is started. As soon as the print dialog binds to the
service it starts the UI.

2. Fixed an bug in the printer adapter of the print dialog that
was leading to a crash if the only item in the adater is the
all pritners option and it is selected.

3. Piping the package name that started the printing so we can
pass it to the storage UI as a hint to open the last location
the app used.


Change-Id: Ia93820bdae0b0e7600a0930b1f10d9708bd86b68
a18661d5922e5ae24ccce8e815aeba437a2fba82 10-Oct-2013 Svetoslav Ganov <svetoslavganov@google.com> Coalescing multiple print job notifications.

1. We used to show a single notificaiton for every print job but
this is against th UX guidelines. Since we have to lead by
example, this change adds coalescing of multiple notifications.


2. Print job state callback in the PrintManager now correctly
invoked on the main thread.


Change-Id: I906e9e62198fa37cb4d2f71fce07ed475d61e1bd
ef4a6f866241852f60a25b7c0bca41750dee816e 08-Oct-2013 Svetoslav Ganov <svetoslavganov@google.com> Merge "Do not do a layout and write while a cancellation is in progress." into klp-dev
db63677c7c02cad7c25627533e5add5ed46870f8 07-Oct-2013 Svetoslav Ganov <svetoslavganov@google.com> Do not do a layout and write while a cancellation is in progress.

While printing the app gets callbacks to do a layout and a write. Since
these operations can take a very long time they are implemented in a async
fashion. For example, if there is a layout request while we are still doing
a layout, we ask the application to cancel the previous layout. The problem
was that we were not waiting for the cancellation result before calling
the subsequent layout. Hence, the app ends up having to do two layouts at
the same time which breaks the printing contract. Same for write.


Change-Id: If7b191c44387d88d5cec195d1785a47f986965ba
b2420c917bf4092f44a2270d7e88ee2380f72080 07-Oct-2013 Svetoslav Ganov <svetoslavganov@google.com> The undefined media sizes for both orientations not properly constructed.

We have constants for an app to specify an undefined media size in portrait
and such in landscape. The constants for these media sizes had the width and
height dimesions swapped.


Change-Id: Ic09227c3a03429fc5a4a157abc15fea87d3ad8be
19565ad1a19bf8e400d04a3a64cf6455ddca81ca 05-Oct-2013 Svetoslav <svetoslavganov@google.com> Merge "Small print API tweaks" into klp-dev
b450d0d4d7fca16674fea02f15e21dc737352c40 05-Oct-2013 Svetoslav <svetoslavganov@google.com> Small print API tweaks

1. Removed an unused public constant

2. Hide PrintFileDocumentAdapter which makes doing the wring
thing easy.

3. We allow a print service to set a tag of a print job which is
an arbitrary string it only knows how to interpret. Typically,
this is the id of a remote print job. This tag was visible to
applications which is wrong - this is data that should be
private to the print service. Now the print service is the
only one to see that.


Change-Id: I763ea9ff0fdf647805bc36e1737d72263090714d
7be27acac922b5ea66ec6b464ded6f057bd6f1e5 30-Sep-2013 Svetoslav Ganov <svetoslavganov@google.com> Print attributes hint not honored.

1. Initially we have a single printer, the fake PDF printer, and
wait for printers to be discovered. This printer was handling
only a couple of media sizes. Hence, if the app provides a
media size hint and the PDF printer does not support it, we
were essentially ignoring the suggested media size since it
was not supported by the selected printer and we fell back to
the default paper size for that printer. The fake PDF printer
should support all predefined media sizes.

2. The list of available paper sizes was shown in the order they
are added ignoring the current locale. It is much better user
experience if the media sizes used in the current locale are
shown at the top and all others after that. Also the media
sizes for the current locale should be alphabetically ordered
so the user can quickly find the desired one.

3. The orientation was reset on media size or printer change.


Change-Id: Iaa0d42242730ce69cea3effd4d0f4bc087068804
cfab2457f2c140a2356bb45ec25f51a0a5866556 28-Sep-2013 Svetoslav Ganov <svetoslavganov@google.com> Printers in the list of printers change position.

While the logic was correct the array map that holds the list of pritners
does not keep the position of the items constant. Switched to linked hash
map which gives this guarantee.


Change-Id: Idbbe14d753e6a1ad1002f2289b10cb62d7f9f040
d8dbc13b47bec3248a86a505a30af9d0474240dc 28-Sep-2013 Svetoslav <svetoslavganov@google.com> Ignore historical printer records for installed services

When loading historical records for previously used printers we
now ignore the ones whose target print service is not installed.


Change-Id: Ib295e7d88ed3c308ef6d8a11bdc1792ebbb6d526
b415525a16074b6dc8e295655648b7c7c1074bbb 28-Sep-2013 Svetoslav Ganov <svetoslavganov@google.com> Merge "Print job files and print job records not always cleaned up." into klp-dev
dd68da2741fa63070d5ad206020dcccb9f429a5a 27-Sep-2013 Svetoslav Ganov <svetoslavganov@google.com> Print job files and print job records not always cleaned up.

1. We want the files for a print job to be removed as early as possible
typically because the print job was cancelled, completed, the app
or the spooler crashed during print job construction. We were keeping
around in the spooler and hence to disc infos for jobs that are in
final state since the app that created them may hold a reference to
a local print job objec whose info it can access to get the latest
print job state potentially after the job reached final state. The
issue was that we were persisting to disc created print jobs which
were during construction which requires careful handling for the
various cases above. This is tricky and error prone.

We used to tell the spooler to forget the print jobs infos when the
app that created them died. The implementation to forget a print
job was not careful and was nuking currently running print jobs in
addition to the ones in a terminal state. Further, if the app dies
before a print job is completed we were left with a stale print
job in the spooler since we missed the signal to forget it (assuming
we forget only inactive jobs). These issues suggest that the approach
is problematic.

Now we have a cache of print job infos for the jobs an app created.
This cache is updated when the state of a print jobs changes using
the new print job state observation code. When the app dies we
remove the cached jobs for that app. Now if the app calls to get
the print jobs it gets the cached ones, i.e. the print jobs it
created during its lifetime, plus the print jobs that are still
active fetched from the spooler. Note that transient state cannot
be kept in the spooler since we unbind from it if there is no
work and it may get killed.

2. Improved the print sub-system logging code to show the cached
print job infos for apps and also dump the print job PDF file


Change-Id: I6f7c1968b6b7ba5be182a10df044ff7ea1fc3a61
c335eb411503154cf475903eb6c5c67575769112 27-Sep-2013 Svetoslav <svetoslavganov@google.com> Printers in the list of printers change position.

1. The printers in the printers list of settings change position if
they are updated. The settings app is using hidden platform APIs
the this change fixes.

2. Enable ProGuard for the PrintSpooler.

3. Added icons on the list of printers so the user knows which
print service used the printer. Now the user can know when
he is using cloud print and maybe incurring data costs vs
local printer discovered by a vendor plug in.


Change-Id: I292f48b424cb561218fdb424d0388f4d786d8339
704697b6197262678e930daa831a1916ddee4dcf 22-Sep-2013 Svetoslav Ganov <svetoslavganov@google.com> Adding hidden APIs for observing the print jobs state.

This is needed for implementing the print job settigns UI.


Change-Id: I63b42cbf4ce6a259fa1af47fa368b148ca5621c1
678e907e09388dff8b2955bb524c2706f067a6ef 21-Sep-2013 Svetoslav Ganov <svetoslavganov@google.com> Merge "Update android.print.PrintAttributes documentation" into klp-dev
d8f391b4e0e8d876ec7216d34f86a9b3e8bab7e5 21-Sep-2013 Svetoslav <svetoslavganov@google.com> Offer to enable a print service after it is installed.

The user has to explicitly enable a print service from the settings UI
before using it. Usually, users very rarely if at all interact with print
services, therefore all print service management task are performed from
the print settings. We also have to get user consent warning that the
user's data is about to be given to a third-party app. We now post a
notification allowing the user to go directly to the settings screen to
turn the service on.


Change-Id: Iea56c0825f0bf38328ad94912f0ea5576e9339b3
22cb9170d33eb6da54fc36b783fcb93fd6057749 30-Aug-2013 Svetoslav Ganov <svetoslavganov@google.com> Update android.print.PrintAttributes documentation


Change-Id: Ic1bbb2cb6ab55826eb66242f6002b7165aff37a4

facc08c7757cef56da6d10e78ce99ef7949700e3 20-Sep-2013 Svetoslav <svetoslavganov@google.com> Merge "Move PdfDocument to android.graphics.pdf" into klp-dev
6811f4e92cbb64e72a0d13eb9b99b5894bd59c76 19-Sep-2013 Svetoslav <svetoslavganov@google.com> Move PdfDocument to android.graphics.pdf

1. Move PdfDocument to android.graphics.pdf.

2. Changed the PdfDocument as per API concil request.

3. Updated the documentation.


Change-Id: I08e15b34cf37bb064248c887e6f59808019cafe8
81d4014c59d2c6cf23b0465e9b8c94b6bfe428e2 18-Sep-2013 Svetoslav <svetoslavganov@google.com> Hiding a method that was never meant to be public.

The hide javadoc annotation had a type, thus leaking the API.


Change-Id: Iec4e203d0786efbe6afbd9b6995f11642935336c
013b816ac7d723a0116c039e6266d93d13851fe1 18-Sep-2013 Svetoslav <svetoslavganov@google.com> Update the print dialog.

1. The print dialog was resizable and as a result when printers
come and go its size changes which looks bad. The dialog is
now trying to be maximally large limited by a max size or the
screen - whichever is smaller. This required moving from
GridLayout to several LinearLayouts since the former does not
support distribution of empty space evently between the items
in a row. Also we want all items in a column of inputs to be
of equal size (the spinners specifically).

2. Added labeledBy attribute to associate a view with another one
that serves as its label for accessibility purposes. We have
lebelFor attribute but it is not useful in most layout files
since it has to refer the auto-generated id of a view which
usually appears later in the layout file, thus generating a
compilation error. This was needed for the accessibility support
of the print dialog.


2. Disabling the spinners or the print button did not produce
visual feedback leading to user frustration.


Change-Id: I0c12eddabc4035bc7becd1b86c1f1b8fdcf4289c
22d2575c3eb5e2154bcb344372711bafc2e0b3d3 17-Sep-2013 Svetoslav Ganov <svetoslavganov@google.com> Merge "Adding more standard media sizes." into klp-dev
fa77ece25a98810b6f56130d4a83c62b2e34c4f5 17-Sep-2013 Svetoslav Ganov <svetoslavganov@google.com> Adding more standard media sizes.

Added more North America media sizes as well as Chinese and Japanese.


Change-Id: I74869c13d1412780b0053ef665845d65e972e526
2fbd2a7f070f246ddafd9de94efa9a98861e9136 17-Sep-2013 Svetoslav <svetoslavganov@google.com> App UI freezes when printing. API clean up.

1. The UI of a printing app was freezing a little when calling the print
method since the print manager service was waiting for it to bind to the
print spooler which generated the print job id (and the initial print
job info really). Now the print manager service is responsible for job
id generation and does not not wait for the print spooler to spin. Hence,
the app UI is not blocked at all. Note that the print manager initiates
the binding to the spooler and as soon as it completes the spooler shows
the print UI which is hosted in its process. It is not possible to show
the print UI before the system is bound to the spooler since during this
binding the system passes a callback to the spooler so the latter can
talk to the system.

2. Changed the print job id to be an opaque class allowing us to vary the
way we generate print job ids in the future.

3. The queued print job state was hidden but the print job returned by the
print method of the print manager is in that state. Now now hidden.

4. We were incorrecly removing print job infos if they are completed or
cancelled. Doing that is problematic since the print job returned by
the print method allows the app to query for the job info after the
job has been say completed. Hence, an app can initiate printing and
get a print job whose state is "created" and hold onto it until after
the job is completed, now if the app asks for the print job info it
will get an info in "created" state even though the job is "completed"
since the spooler was not retaining the completed jobs. Now the spooler
removes the PDF files for the completed and cancelled print jobs but
keeps around the infos (also persisting them to disc) so it can answer
questions about them. On first boot or switch to a user we purge the
persisted print jobs in completed/cancelled state since they
are obsolete - no app can have a handle to them.

5. Removed the print method that takes a file since we have a public
PrintDocumentAdapter implementation for printing files. Once can
instantiate a PrintFileDocumentAdapter and pass it to the print
method. This class also allows overriding of the finish method to
know when the data is spooled and deleted the file if desired, etc.

6. Replaced the wrong code to slice a large list of parcelables to
use ParceledListSlice class.


Change-Id: I1ebeeb47576e88fce550851cdd3e401fcede6e2b
860f8a6b663ca96d30d17da09eca8caf065aae62 14-Sep-2013 Svetoslav Ganov <svetoslavganov@google.com> Spooler should not crash if print service config activities are not exported.

1. If a print service does not export its activities for settings and
adding printers the print spooler ignores them instead of crashing.
Also if the service is not enabled its activities are now ignored.

2. Added a dedicated permission for a print service to optionally
protect its settings and add printer activities such that only the
system can bind to them.

3. Fixed a crash in the print dialog if its content is detached
from the window and animators are running.


Change-Id: I20b57d6622a15f9b2352ba78d04c44e67b316a15
651dd4e6ee6510caf9f15c51094a11121af17ec2 12-Sep-2013 Svetoslav <svetoslavganov@google.com> Remove unneeded print APIs and update the min margins APIs.

1. Removed unneeded code in Resolution that was storing its
label as resource and package name. We do not have predefined
resolutions, therefore we always persist the label.

2. Renamed the print attribute margins to minMargins to reflect
that these are the minimal margins the printer support. Updated
the docs as well.

3. Renamed the create method of all builder to build.


Change-Id: Ie72ab8aaa5215b8bd2853885011b3b4efa4deb2e
cc65b0c325b88c466763712f76148a6f5b8a5b3f 11-Sep-2013 Svetoslav <svetoslavganov@google.com> Not change the print options on printer change if possible.

If the user selects some print options from the dialog and then
changes the printer to one that has the same capabilities the
selections in the UI should not change.


Change-Id: Ia76ce58c446815e3498d2f4b4739dee62d11d96a
c6066799ad130140159230d14451b429eb828755 11-Sep-2013 Svetoslav <svetoslavganov@google.com> Handle print serivce crashes.

1. Now after a print service crashes we are bringing it to the same
state of its lifecycle. For example, if a service does a discovery
and crashes we recreate the discovery session call the start
discovery method and so on.

2. Turned off debugging logs since we have fully fledged state dump.


Change-Id: Id790537461428e96b197eef12258996bda2bd1ce
4e4518383f9212618cafa6c9ce2120becc6f6204 06-Sep-2013 Svetoslav Ganov <svetoslavganov@google.com> Printers for a disappearing print serivce incorrectly removed.

The code that removes printers for a disappearing print serivice was
using printer infos instead printer ids and also wrong map methods.


Change-Id: Idb9ccdaad9a59b3b6d16b079b33afad56bc45255
a36285f3f2f74b1d2d5d0336ffe519ab9f6e062a 05-Sep-2013 Svetoslav <svetoslavganov@google.com> Bug fixes in the print dialog

1. Read/write async tasks of the persistence manger used by
the FusedPrintersProvider could be run more that once, so
create a new one every time.

2. The fake printer used to save to PDF should not be added
to printer history.

3. Removed print preview leftover code from the print dialog.

4. Save to PDF was not working on the second consecutive attempt.

5. The fisrt time the orientation change was ignored - regression

Change-Id: I8960ef2cf92dfeeec22fa8751ba8475092b5b65c
2def61485413084e68233c89ba956a2282fbacd1 05-Sep-2013 Svetoslav <svetoslavganov@google.com> Merge "Hiding some unneeded APIs," into klp-dev
a76233ae845da4bc9e3bcd89821701a747215e7b 05-Sep-2013 Svetoslav <svetoslavganov@google.com> Hiding some unneeded APIs,

1. Hide the MediaSize and Resolution constructors that take
package and resource Id.

2. Fix a bug and docs in creating portrait and landscape media

Change-Id: If59992e355391de6ad6d14d4f7b3be8c8b6cc0e0
c5c203d6ef8eea46f1c06f52e3ebfcc59c304760 05-Sep-2013 Svetoslav <svetoslavganov@google.com> Merge "Print API updated." into klp-dev
773f54de3de9bce7b6f915aa47ed686b161d77aa 03-Sep-2013 Svetoslav <svetoslavganov@google.com> Print API updated.

1. Removed the updatePrinters API on PrinterDiscoverySession.
Now re-adding a printer updates it.

2. Added getTrackedPrinters() API to allow a print service to
figure out which printers' state should be tracked by the

3. Removed the APIs on PrintDocumentInfo that describe the
layout of the content as they are not needed. For example,
if the print attributes passed in layout require landscape
mode, the the app should just create a PDF page with the
wider side up and draw its content in portrait. The printer
will then rotate the page.

Change-Id: Idd72c6e9c129e8b17eef1236573a99773f8ff0a2
19fba5d34a444ce145ab0d3a12c578d9d5d3f38c 31-Aug-2013 Svetoslav Ganov <svetoslavganov@google.com> KLP API Review: PrintDocumentAdapter documentation


Change-Id: I755cc1827ed950b8481b8b260ea3cde83bcdd418
d26d4898fcc9b78f4b66118895c375384098205e 28-Aug-2013 Svetoslav Ganov <svetoslavganov@google.com> Print spooler security and some new print service facing APIs.

1. Updated the security mode of the print spooler. Now the spooler
is not signed with the system key, it is not a privileged app so if
it gets compromised (PDF rendering is a potential attack vector)
it cannot access dangerous permissions. Also only the system
can bind to the spooler.

2. Added APIs for asking a print service to start and stop tracking
a given printer. This is need for the case when the user selects
the printer and the print service should do a best effort to keep
the system updated for the current state of the printer.

3. Added APIs for putting a print job in a blocked state. A print
service would report the print job as blocked if for some reason
the printer cannot proceed, e.g. 99 pages are printed but there
is no paper for the last one. The user has to add more paper
and the print service can resume the job.

4. Changed the read/write APIs to use ParcelFileDescriptor instead
of FileDescriptor since the latter does not have a clean API for
detaching the wrapped Linux file descriptor when one wants to
push it to native.

5. Added API for getting the size of the printed document so the
print service can avoid handling big filed over cellular network
or ask the user if needed.

6. Now the print services that are preinstalled on the system image
are automatically enabled.

Change-Id: Ia06c311d3d21cabb9e1368f13928e11cd0030918
aec1417ca9eb63209668ac17da90cf8a07c6076c 27-Aug-2013 Svetoslav Ganov <svetoslavganov@google.com> Print APIs update.

1. Added scale to fit and scale to fill fitting modes.

2. Added APIs for a print app to specify which constraints imposed
by the print attributes were satsified during a layout so they
are not handled by the printer again, e.g. if the content is to
be in landscape the the app generated such content the printer
should rotate the content again.

3. Added some printer statuses.

4. Added a helper class that generates PDF documents with correct
size based on the passed in print attributes.

5. Exposed a ctor for PageRange which was hidden by mistake and apps
could not create page ranges. Added API for changing the printer

Change-Id: If1334a61d2d931027b98075f653018d456b1b768
44720af55a8fdf991929983dad5d53c02851dd1e 21-Aug-2013 Svetoslav Ganov <svetoslavganov@google.com> Print UI bug fixing and printer discovery refactoring.

1. Added support for selecting a printer from the all printers activity
that is not in the initial printer selection drop down. The user
initially sees a sub set of the printers in the drop down and the
last option is to see all printers in a separate activity. Some
of the printers in the all printers activity are not shown in the
initial drop down.

2. Refactored printer discovery by adding (private for now) printer
discovery app facing APIs. These APIs are needed to support multiple
printer selection activities (print dialog and all printers activities)
and also the settings for showing all printers for a service.

Now multiple apps can request observing for printers and there is
a centralized mediator that ensures the same printer discovery
session is used. The mediator dispatches printer discovery specific
requests to print services. It also aggregates discovered printers
and delivers them to the interested apps. The mediator minimizes
printer discovery session creation and starting and stopping discovery
by sharing the same discovery session and discovery window with
multiple apps. Lastly, the mediator takes care of print services
enabled during discovery by bringing them up to the current
discovery state (create discovery session and start discovery if
needed). The mediator also reports disappearing of the printers
of a service removed during discovery and notifies a newly
registered observers for the currnet printers if the observers are
added during an active printer discovery session.

3. Fixed bugs in the print UI and implemented some UX tweaks.

Change-Id: I4d0b0c5a6c6f1809b2ba5dbc8e9d63ab3d48f1ef
269403b032f965ff3847eb982c2f697229dc5a92 15-Aug-2013 Svetoslav <svetoslavganov@google.com> Implemented advanced printer selection and API refactoring.

1. Added past printer history tracking and merging favorite printers
with discovered printers.

2. Added save as PDF support.

3. Added all printers activity with search capability and optional
add printers chooser (if any print service provides add printers

4. Refactored the printer discovery session APIs. Now one session
can have multiple window discovery windows and the session stores
the printers found during past discovery periods.

5. Merged the print spooler and the print spooler service - much
simpler and easier to maintain.

Change-Id: I4830b0eb6367e1c748b768a5ea9ea11baf36cfad
9abf735387329758ca310acad3baa70eee1dba42 12-Aug-2013 Svetoslav <svetoslavganov@google.com> Make PrintFileDocumentAdapter non-final.

Change-Id: I89a46bf766f5270dfaba7482b7b7cd997e19821a
798bed6cc7d273e72b0253288605db9cd2b57740 11-Aug-2013 Svetoslav Ganov <svetoslavganov@google.com> Refinement of the print service APIs.

1. Factored out the printer discovery APIs of a print service in a
dedicated session object that is created by the print service on
demand. This ensures that added/removed/updated printers from
one session do not interfere with another session.

2. Updated the app facing APIs to pass in a document info along
with a printed file. Also exposed the print file adapter so
apps that create a temporary file for printing can intercept
when it is read by the system so the file can be deleted.

3. Updated the print service documentation.

Change-Id: I3473d586c26d8bda1cf7e2bdacb441aa9df982ed
14db9654f6c31e94fe9272776f1f1b8602a17fdc 06-Aug-2013 Svetoslav Ganov <svetoslavganov@google.com> Print UI polish (a.k.a. just the next iteration))

1. Added a dialog to show a spinner while the app is writing the
printed content.

2. Fixed print job config acitivity leaking.

3. Updated the notifications a bit.

Change-Id: I8314390135a49605ee11ab4ed14b210a29566745
835835ee6f913408ac91678d6056896a2c5b25e3 05-Aug-2013 Svetoslav Ganov <svetoslavganov@google.com> Polish the print spooler loading of stored print jobs.

1. The singleton print spooler isntance is created when the print spooler
service gets a connection to the system and is destroyed when this
connection is removed. Note that if the spooler has work, then the
connection to the system will not be removed.

When the spooler is created, it reads the stored state and notifies the
system which in turn dispatches this to the print services.

When the system connects to the spooler and passes it a connection, we
schedule a delayed check whether there is work for the spooler. We do
not handle this immediately to avoid intermitted spinning on and off
of the spooler process if a client makes a sequence of queries while
the spooler has really no work.

2. Fixed a bug in the NotificationManagerService where adding a notification
and removing it immediately after that does not remove the notification.
The code that is adding a notification is run on a handler thread while
the code to remove it on the calling thread. This creates a race and
erroneous results. Now the removal is also scheduled on the handler.

3. Many small fixes here and there.

Change-Id: I6415c253139fa6616393fbe23c659d031a29e1f6
8c43376ea83a67414bd6823a472b76d41160239e 02-Aug-2013 Svetoslav Ganov <svetoslavganov@google.com> First cut of the print notifications.

1. Added notifications for a queued print job, for a started print job,
for ongoing canceling a print job, and for a failed print job. The
notifications for queued and started state have a cancel action. The
notification for failed print job has a cancel and a restart action.

2. Propagating failure message from the print service to the notifications.

3. PrintJobConfigActivity was not setting the initial value for the
print job copies and was not updating the UI immediately after creation.

4. Refactored PrintJobConfigActivity to avoid using the hack to avoid
reaction for item selection change in a spinner for an event that
happened before the callback was registered.

5. Removed the label attribute from PrinterInfo and now PrinterId is
composed of the printer name and the service component name. This
is nice since for restarting print jobs we do not need to store
information about the printer except the printer id which is
already part of the PrintJobInfo's data. Also the printer name
is not expected to change anyway.

6. Allowing cancellation of a queued print job. Also no print job is
cancelled without asking the managing print service to do that.
Before we were immediately canceling print jobs in queued state
but it was possible for a buggy print service to not set the
print job state to started before starting to do expensive work
that will not be canceled.

7. PrintServiceInfo was throwing an exception the the meta-data
XML for the print service was not well-formed which would crash
the system process. Now we just ignore not well-formed meta-data.

8. Removed unused permissions from the PrintSpooler's manifest.

Change-Id: Iba2dd14b487f56e137b90d1da17c3033422ab5e6
55b409a97cf6376399a0940313ea852368727d6f 01-Aug-2013 Svetoslav Ganov <svetoslavganov@google.com> Iteration of the print sub-system.

1. Added APIs for adding partially initialized PrintInfo objects
enabling light-weight lookps for print serivces that want to
populate the list of available printers without querying each
of them for its capabilities. This includes APIs for the system
to request from a print service to update certain printers.

2. Fixed a bug in PrinterId#equals().

3. Added equals and hasCode implementaion to PrinterInfo. Also
the defaul in PrinterInfo are now an array instead of a
SparseArray - cheaper.

4. Now PrintJobConfigActivity works with partially specified
printers. Specifically, if such a printer is selected the
activity is requesting from the print service to update
the printer. We are currently not handling the timeout case.
It also handles udpated pritners.

Change-Id: I5e83e924ef597c9e22cbd06a971d4f4d3bd3a9c1
85b1f883056a1d74473fd9ce774948878f389ab6 25-Jul-2013 Svetoslav Ganov <svetoslavganov@google.com> Iteration on the print sub-system.

1. API changes: Moved copies API from PrintAttributes to PrintJobInfo;
Changed the PageRange list to an array in PrintDocumentAdapter#onWrite;
Added onCancelled method to the layout and write callbacks.

2. Refactored the serialization of remote layout and write commands. Now
the commands are serialized by the code in the client instead in the spooler.
The benefit is simple code since the client has to do a serialization to delegate
to the main thread anyway. The increased IPC found is fine since these calls
are quite unfrequent.

3. Removed an unused file: IPrintSpoolerObserver.aidl

4. Added equals and hasCode implementation to PageRange, PrintAttributes,
MediaSize, Resolution, Margins, Tray, PrintDocumentInfo.

5. Added shortcut path for query APIs on PrintJob that return cached values
if the print job is in a uncuttable state, i.e. completed or cancelled. Failed
print jobs can be restarted.

6. PrintJobInfo was not properly serialized.

7. Updated the look of the print dialog to be stable if there is and there isn't
currently selected printer.

8. PrintJobCOnfigActivity now calls onLayout on every print attributes change
but requests a write only on print preview or print button press. Also if the
layout did not change the content and it is already written no subsequent
call is made. Also if the selected pages change and we already have them
no subsequent call to write is made. Also the app is called with print preview
attribute set when performing layout and with it cleared after the print button
is pressed. A lot of changes making sure that only valid actions are enabled
in the activity (looks like a dialog) at a given time frame. The print job config
activity is also hidden after we got all the data, i.e. layout and write are done.

9. The callback from the print spooler to the system are scheduled via messages
to avoid lock being held during the call. It was hard to guarantee that since a
method holding a lock may be calling one that would like to release the lock
at some point to make the callbacks.

10. Print spooler state is persisted only if something changes in a completed
print job, i.e. not one that is being constructed due the print job config dialog.

11. Fixed a potential race in the RemotePrintSpooler where it was possible that
a client that got a handle to the remote spooler calls into an unbound spooler.
E.g: the client gets the remote interface with a lock held, now the client releases
the lock to avoid IPC with a lock, during the IPC scheduling the spooler has
notified the system that it is done and the system unbinds from it, now the
client's IPC is made to a spooler that is disconnected.

Change-Id: Ie9c42255940a27ecaed21a4d326a663a4788ac9d
0d1daa50f6d180c57f92596501e2e5c0b5ef9997 23-Jul-2013 Svetoslav Ganov <svetoslavganov@google.com> Updating the print dialog and its interactinos with the printing app.

1. Added support for reporting the old print attributes during layout.
Now we keep track of the old print attributes, so the app can
compute the delta and decide whether re-layout work is needed.

2. Fixed PrintDocumentAdapter callback interleavings. Layout callbacks
were intermixing with write ones - a mess. Now we make an attempt
to cancel layout and write if they respond to cancellation, otherwise
we wait but do not interleave them.

3. Refactored the PrintJobConfigActivity for easier maintenance and
to have a single update UI method that does the minimal amount
of work.

Change-Id: I31ada1a0550882e6185018e6f17f923aed165d15
88d199130d44c6bacb383a7757e782cf97483c68 22-Jul-2013 Svetoslav Ganov <svetoslavganov@google.com> Implement persistence/restoring of print spooler state.

1. Implemented the persistence and restoring of the print spooler state.
The print spooler state is saved as an XML on every print job change
and is restored when we bind to the spooler. The system does not
unbind from the spooler until the state persistence completes. We
are now storing the entire state, i.e. all print jobs, when a single
one changes. This is not optimal but we are not expecting to have
many such at the same time, so for now we err for simplicity of

2. Enforcing a non-empty print job name.

3. Hidden the STATE_CREATED print job state which should never be visible to a
client since this is the state of a print job during construction, i.e. the
print dialog is up and we are doing back and forth with the app.

4. Fixed some PrintAttributes APIs that were incorrectly taking in a PackageManager

5. Updated the PrintSpooler build file due to splitting the framework into multiple

Change-Id: I52c88eaa1ec9c64920359cc143c79832a4c3d25b
6283608e0bd40548742839f5a8b02f7e5c9c5c7c 17-Jul-2013 Svetoslav <svetoslavganov@google.com> Tweak the print APIs.

1. Adding bundle with metadata to PrintDocumentAdapter#onLayout
with one key for now to specify whether this is for a preview.

2. Cleaned up docs.

Change-Id: I89380781bf3ae41aa89f8a0347d74516a210394c
17b7f6e6d4ec9f5e9597bfd283f1c017b6c66275 25-Jun-2013 Svetoslav <svetoslavganov@google.com> Clean up of the print APIs.

1. Fixed a case in which the onPrintCompleted callback may not be invoked.

2. Added string resulrces for the different error messages for failed
printing in OnPrintCompletedCallback

3. Fixed the string comments for the MediaSize constants.

4. Added APIs to create certain print attributes by passing in a
string label instead of resource and package name since in some cases
a print service may be getting already internationalized lables
or it may not know all possible values.

5. Fixed a crash in PrintJobConfigActivity if there is no input or
output tray.

Change-Id: Ie877b7dc669051606394aa290e6d2b979a42db4c
a00271533f639c8ed36429c663889ac9f654bc72 25-Jun-2013 Svetoslav Ganov <svetoslavganov@google.com> Refactoring of the print sub-system and API clean up.

1. Now a user state has ins own spooler since the spooler app is
running per user. The user state registers an observer for the state
of the spooler to get information needed to orchestrate unbinding
from print serivces that have no work and eventually unbinding from
the spooler when all no service has any work.

2. Abstracted a remote print service from the perspective of the system
in a class that is transparently managing binding and unbinding to
the remote instance.

3. Abstracted the remote print spooler to transparently manage binding
and unbinding to the remote instance when there is work and when
there is no work, respectively.

4. Cleaned up the print document adapter (ex-PrintAdapter) APIs to
enable implementing the all callbacks on a thread of choice. If
the document is really small, using the main thread makes sense.

Now if an app that does not need the UI state to layout the printed
content, it can schedule all the work for allocating resources, laying
out, writing, and releasing resources on a dedicated thread.

5. Added info class for the printed document that is now propagated
the the print services. A print service gets an instance of a
new document class that encapsulates the document info and a method
to access the document's data.

6. Added APIs for describing the type of a document to the new document
info class. This allows a print service to do smarts based on the
doc type. For now we have only photo and document types.

7. Renamed the systemReady method for system services that implement
it with different semantics to systemRunning. Such methods assume
the the service can run third-party code which is not the same as

8. Cleaned up the print job configuration activity.

9. Sigh... code clean up here and there. Factoring out classes to
improve readability.

Change-Id: I637ba28412793166cbf519273fdf022241159a92
fd90651cfcc7e2b75254666fd6861038b72fb4ac 24-Jun-2013 Svetoslav <svetoslavganov@google.com> Print APIs documentation update

Change-Id: I0df438e45ef540cc42c9ee5baafc816ebafa1c7b
53f57d162b0553102fbd5c4ccdda87dbfce5b763 22-Jun-2013 Svetoslav <svetoslavganov@google.com> Print API tweaks.

Change-Id: I4fcf93f17495740e8b8d0dc4e425a89862716b42
4b9a4d16872bbb50712e007b419ac0b35ff1582d 12-Jun-2013 Svetoslav Ganov <svetoslavganov@google.com> Print - platform APIs

Related changes:
Skia (inlcude PDF APIs): https://googleplex-android-review.googlesource.com/#/c/305814/
Canvas to PDF: https://googleplex-android-review.googlesource.com/#/c/319367/
Settings (initial version): https://googleplex-android-review.googlesource.com/#/c/306077/
Build: https://googleplex-android-review.googlesource.com/#/c/292437/
Sample print services: https://googleplex-android-review.googlesource.com/#/c/281785/

Change-Id: I104d12efd12577f05c7b9b2a5e5e49125c0f09da
ff4adde5737be08d3e2d03fbe588c591d27d4a74 10-Jun-2013 Svetoslav Ganov <svetoslavganov@google.com> Generate PDF from Canvas.

This change adds simple APIs that enable an Android application
to generate a PDF document by drawing content on a canvas.

Change-Id: Ibac93d7c37b01a376ce7c48238657d8c7698d588
7a56be0915b4ff7cecfbc88fc0a7d567dc58ee58 13-Jun-2013 Svetoslav Ganov <svetoslavganov@google.com> Revert "Generate PDF from Canvas."

This reverts commit 923c633ccfda45312fec5a3484b6cc1308cc71ab

Change-Id: Ie49f593ec702c1ecf96a5cc1fafa680c1db08747
923c633ccfda45312fec5a3484b6cc1308cc71ab 10-Jun-2013 Svetoslav Ganov <svetoslavganov@google.com> Generate PDF from Canvas.

This change adds simple APIs that enable an Android application
to generate a PDF document by drawing content on a canvas.

Change-Id: Iddcd126b3af37c73d99262f6b276caa07b998c1d