Commit Graph

111 Commits

Author SHA1 Message Date
Philip P. Moltmann
0d1407e609 Fix Print CTS tests.
Fixes: 27971210
Change-Id: Ied11b2f1c528fe5e204e683d988b4efbd2562ef0
2016-04-01 12:22:13 -07:00
Philip P. Moltmann
e680a8db52 Make sure PrinterCapabilitiesInfo always have sane values.
Change-Id: I1ae7fe6aabdbe7f9480c4067690338103adaafa2
2016-03-31 10:26:26 -07:00
Philip P. Moltmann
4723f36d3e Make sure PrintDocumentInfo is always sane.
Change-Id: I73cf554d42dc33b7a1f6577088ec53b447f14c8c
2016-03-31 10:26:25 -07:00
Philip P. Moltmann
aa8a4fed07 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
2016-03-31 10:26:25 -07:00
Philip P. Moltmann
9dcb86a48d 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
2016-03-30 17:21:07 -07:00
Philip P. Moltmann
456f1e33b8 Merge "Update print preview when option is changed and clear ranges when they layout changes" into nyc-dev 2016-03-30 21:44:19 +00:00
Philip P. Moltmann
d74d1e5491 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
2016-03-24 16:53:36 -07:00
Philip P. Moltmann
4ef83c4647 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
2016-03-24 16:20:20 -07:00
Philip P. Moltmann
66c96591e2 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:

PrintServiceInfo:
- 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
  PrintManager.getPrintServices-loader.

AddPrinterActivity:
- 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
  small.

PrintActivity:
- 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"
    activity
  - 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.

PrinterRegistry:
- 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.

SelectPrinterActivity:
- The AddPrinterDialog was removed as we now have the
  AddPrinterActivity.
- 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
2016-03-07 09:58:08 -08:00
Jeff Sharkey
f8880561e6 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
2016-02-27 17:17:01 -07:00
Philip P. Moltmann
e93cf151fb Merge "Allow the PDF Printer to "print" non-locale-default paper sizes." 2016-02-02 16:34:48 +00:00
Philip P. Moltmann
e33b954165 Merge "Check parameters for callers of IPrintManager" 2016-01-26 22:52:58 +00:00
Philip P. Moltmann
5ddbc2af0c Merge "Correctly deal with non-null ness of PrintJobId." 2016-01-26 18:25:23 +00:00
Philip P. Moltmann
4959caf149 Allow the PDF Printer to "print" non-locale-default paper sizes.
The MediaSizeComparator already sorts the media sizes correctly.

Bug: 12675943
Change-Id: I6fa4b1a8885a60704bc175ec849ea483ffb4bcd8
2016-01-21 15:10:29 -08:00
Philip P. Moltmann
22f86b4e77 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
2016-01-21 13:42:37 -08:00
Philip P. Moltmann
76d7e3ee70 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
2016-01-21 13:27:30 -08:00
Philip P. Moltmann
1c8f1e06a6 Shorten LOG_TAGs to fit in 23 characters as commented on by lint.
Change-Id: Ie9415fc3de642493bc36c0159b773d8ce2436df5
2016-01-20 15:16:48 -08:00
Philip P. Moltmann
cdf2b40034 Enforce non-nullness in PrinterId and exploit it.
Change-Id: Ifdf3b2329548a665d609dd66b738baab5c765b54
2016-01-14 15:59:44 -08:00
Philip P. Moltmann
fdb2b7644f Correctly deal with non-null ness of PrintJobId.
Change-Id: I217885247467e3900b53f8a2ab32306a50351154
2016-01-14 15:37:11 -08:00
Philip P. Moltmann
c2ad22663b Clean up API for PrinterInfo.
- Make immutable
- Check parameters
- Check state while unparcelling

Change-Id: I13959845ca508936331488506380e894f49abf25
2016-01-14 12:48:31 -08:00
Philip P. Moltmann
8141bdfa56 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
disabled-list.

Bug: 26249649
Change-Id: Iae783a8dd19f1a9d75d675710ea4348fdfbd34f3
2016-01-07 09:30:43 -08:00
Philip P. Moltmann
b8c1a02adb Fix wrong annotation for PrintInfo.Builder.setStatus
Change-Id: I11fd68497c6229d16c0827f4753f485e9095649d
2016-01-06 21:42:31 +00:00
Philip P. Moltmann
bb36206f08 Rename variable that hides the contatining classes name.
Change-Id: Iad0a9b341a866d33d10b7a389d243e677a65057c
2015-12-22 20:24:58 -08:00
Philip P. Moltmann
c43639c306 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
  system)

Change-Id: I0ce8849a516414763fe9de76c3a18ce17d896816
2015-12-22 17:27:27 -08:00
Philip P. Moltmann
bb9f686b40 Allow a print service to specify per printer icons, description and
info-activities

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
available.

Bug: 24135005
Change-Id: Iec389bab514b024634be8fb5fc8928371cba8740
2015-12-21 09:54:57 -08:00
Philip P. Moltmann
b3078c235e 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
2015-12-01 15:42:49 -08:00
Philip P. Moltmann
b4efdb4726 Deal correctly with suggested print attributes
An app might suggest certain attribute for an print job. This patch
fixes

- 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
2015-11-10 17:09:30 -08:00
Philip P. Moltmann
853a6f564a 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
2015-11-09 09:49:26 -08:00
Andreas Gampe
b95d079c80 am e4bdf3c1: am be549f9b: Merge "Frameworks/base: Fix precedence bug"
* commit 'e4bdf3c1c9e7be06b68cc32f9a492d512bf87528':
  Frameworks/base: Fix precedence bug
2015-03-17 20:56:02 +00:00
Andreas Gampe
869d26fda0 Frameworks/base: Fix precedence bug
Explicit cast has higher precedence than shift.

Bug: 19797138
Change-Id: Ifcf569bf774fbf65ee50c078f736ad167bcc6b8c
2015-03-17 20:31:22 +00:00
Svetoslav
948c9a6393 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
2015-02-04 05:48:48 +00:00
Svet Ganov
fce84f035c 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.

bug:17636435

Change-Id: Ifce6a3199e587448dd38f6a84290a965c24b698b
2014-11-01 00:06:08 +00:00
Svetoslav
6552bf3da6 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.

bug:15704969
bug:16966145

Change-Id: I0eea2f30a102d8fefcbf90187fa6d8612fb19434

Conflicts:
	packages/PrintSpooler/src/com/android/printspooler/widget/PageContentView.java
2014-09-05 15:21:50 -07:00
Svetoslav
15cbc8a032 Addressing comments for the print preview feature.
Change-Id: Ib72140a912e22f859258d970e0d1c4ef06e807d5
2014-07-11 16:46:46 +00:00
Svetoslav
0c126a478b 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.

bug:16199127

Change-Id: I4e7de66b669e9f783db0252244a6c1e5b24ffe28
2014-07-11 00:43:28 +00:00
Svet Ganov
525a66b2bb 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
them.

Change-Id: I0b23d2c598afe2a34400ccfa43e4e935af83c72f
2014-07-09 18:43:38 +00:00
Svetoslav
a798c0a984 Refactor printing
Change-Id: I19850154ef2798afff511e4490a268ce38e8cbae
2014-06-06 13:33:16 -07:00
Svetoslav
2235a1772f 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.

bug:14651902

Change-Id: I63efa75be51e8957ca6854b2b439918f01c0f154
2014-05-08 14:25:51 -07:00
Svetoslav
fcf3b103f0 Merge "Update print docs" 2014-03-18 18:00:01 +00:00
Svetoslav
85a85a0ed7 Update print docs
Change-Id: I671ad776968ca2802f05f94f7cc96959fb50fa4b
2014-03-18 10:48:51 -07:00
Svetoslav
73832594b3 Merge "Updated print docs." 2014-03-18 17:43:13 +00:00
Svetoslav
81f14b9689 Updated print docs.
Added an explanation why the system cannot maintain print UI
state on rotation.

Change-Id: I370158ba4be929b67a4b5476ccacad5335d18b34
2014-03-18 10:42:16 -07:00
Svetoslav
b628dd825b PrintSpooler crash if printer is reported to have only one color mode.
bug:11993304

Change-Id: I4932cf1b5b9b89f0cbf97011782ede037e7d814c
(cherry picked from commit b0d97b87ba)
2014-03-12 14:20:27 -07:00
Svetoslav
afd1967503 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.

bug:11675274

Change-Id: I66539cfbd7583f52cb863a84ef8e40856f92ceed
2013-11-13 17:31:15 -08:00
Svetoslav
57b296f5a9 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
2013-11-12 16:21:00 -08:00
Svetoslav
d270cb9264 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.

bug:11329523

Change-Id: Ia9d747163cc73509369a86c8b5afc83b7ee54859
2013-10-31 14:30:58 -07:00
Svetoslav
b4fda13476 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.

bug:11241800

Change-Id: I352440bc86aec824a805883fc9579d96a06d11e6
2013-10-28 11:44:07 -07:00
Svetoslav Ganov
4d4c66dd38 Update the documentaton of the android.print package.
bug:10551786
bug:10551697
bug:10705082
bug:10741641
bug:11318976
bug:10550979
bug:10551761

Change-Id: I46ceb66a69b6d32d6b417356178f67f2e25e891a
2013-10-25 11:33:34 -07:00
Svetoslav Ganov
858a1850e2 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.

bug:11242661

Change-Id: Id906b3170e4f0a0553772dfa62686f06fdca0eaf
2013-10-18 13:12:06 -07:00
Svetoslav
1c43fceaaa 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.

bug:11241800

Change-Id: I3a9df771c0ded559b61c597c686795840d702b27
2013-10-16 15:47:44 -07:00