)]}'
{
  "log": [
    {
      "commit": "b5f180608db6de123b54ae94de569ff1ebca705c",
      "tree": "a6e8f452458e30c3cf86d942131185c44cdc6e19",
      "parents": [
        "89e1fec9af78b94cbafc21fe22a69213ae31a6fa"
      ],
      "author": {
        "name": "Svetoslav",
        "email": "svetoslavganov@google.com",
        "time": "Mon Sep 23 18:48:34 2013 -0700"
      },
      "committer": {
        "name": "Svetoslav Ganov",
        "email": "svetoslavganov@google.com",
        "time": "Mon Sep 23 23:41:12 2013 -0700"
      },
      "message": "Multiple printer discovery session instances and other bugs.\n\n1. The fused printers provider was dropping on the floor received printers\n    if it was not active. It is in fact a loaded and if not active it should compute\n    the printers and not deliver them until activated. This fixes an issue where\n    opening the print dialog, then enabling a print service results in the printers\n    reported by the service not showing up in the print dialog.\n\n2. Printer discovery session was created twice which leads to incorrect behavior\n    as the pint system is designed around the contract that there is a single\n    printer discovery session per service at a time. This was possible due to an\n    incorrect initialization of a member variable resulting in double session creation\n    when the print service is connected.\n\n3. When a print service is enabled during discovery we did not use the correct\n    condition to start printer discovery resulting in starting it all the time even if\n    not needed. Also if some of the printers that had to be tracked are reported\n    by the service just enabled (typically historical printers) we did not ask the\n    service to start tracking them.\n\n4. Removed some logging.\n\nbug:10903343\n\nChange-Id: I46c049471a4b099fc668df3aee2aaedc8d7786ac\n"
    },
    {
      "commit": "5dfccc3c0d142765b04f9cd8b2513a6b9db22426",
      "tree": "337e648e54a66b7624e66cea2223bca18f3aeeca",
      "parents": [
        "e9b0dd899a715531b7960909744fcf874c761118",
        "307a0d4db23d8d9705fb2d87d304cb7e9a90f476"
      ],
      "author": {
        "name": "Svetoslav Ganov",
        "email": "svetoslavganov@google.com",
        "time": "Mon Sep 23 23:04:31 2013 +0000"
      },
      "committer": {
        "name": "Android (Google) Code Review",
        "email": "android-gerrit@google.com",
        "time": "Mon Sep 23 23:04:32 2013 +0000"
      },
      "message": "Merge \"The current is printer not refreshed when selected.\" into klp-dev"
    },
    {
      "commit": "307a0d4db23d8d9705fb2d87d304cb7e9a90f476",
      "tree": "0f8175c6a5fd87bb40b59b931982c5ce35ea7ade",
      "parents": [
        "6c025eaf29634d248bf067c2d9967e1905863f0c"
      ],
      "author": {
        "name": "Svetoslav Ganov",
        "email": "svetoslavganov@google.com",
        "time": "Mon Sep 23 15:51:03 2013 -0700"
      },
      "committer": {
        "name": "Svetoslav Ganov",
        "email": "svetoslavganov@google.com",
        "time": "Mon Sep 23 15:51:06 2013 -0700"
      },
      "message": "The current is printer not refreshed when selected.\n\nEvery time a printer is selected we have to refresh it by telling\nthe print service to stop tracking the previously selected printer\nif such and start tracking the current one. As a result of start\ntracking the print service has to give us the capabilities too. A\nprevious patch caused a regression and we do not refresh printers\nwhen needed.\n\nbug:10898968\n\nChange-Id: I9d5413e324fdb8856ef61849d36a161470eb204d\n"
    },
    {
      "commit": "a4f6409c974363a6bb1eddd5c88048d88e868640",
      "tree": "a2087819375a301d6042bcd1aa8b0f359cf058b9",
      "parents": [
        "6c025eaf29634d248bf067c2d9967e1905863f0c"
      ],
      "author": {
        "name": "Svetoslav",
        "email": "svetoslavganov@google.com",
        "time": "Fri Sep 20 18:57:21 2013 -0700"
      },
      "committer": {
        "name": "Svetoslav Ganov",
        "email": "svetoslavganov@google.com",
        "time": "Sat Sep 21 11:25:36 2013 -0700"
      },
      "message": "Page ranges not correct in come cases.\n\n1. The algorithm that determines whether a page range contains\n   another one had a bug and in some cases misbehaved.\n\n2. When print is pressed we do a final layout and if nothing\n   changes and we have the requeted pages we skip the final\n   write. However, in this case we did not update the print\n   job with the pages to be printed but we have to since in\n   the previous write we did not ask for all selected pages,\n   rather for the first one to be shown as a preview. Now if\n   we have all pages and nothing changed we update the print\n   job pages.\n\nbug:10530142\n\nChange-Id: I10fb62ae5ae07b8e54d547fd4dca555a12451bc5\n"
    },
    {
      "commit": "b39ce63d2807c9d5c68d3be052dee7e9da7ec3be",
      "tree": "d3efd28d821a6a7edabfa2e91af5fa5e896ca522",
      "parents": [
        "d8a84a8609951826135a2e41a1cdd6b7cf680e27",
        "d8f391b4e0e8d876ec7216d34f86a9b3e8bab7e5"
      ],
      "author": {
        "name": "Svetoslav",
        "email": "svetoslavganov@google.com",
        "time": "Sat Sep 21 01:15:47 2013 +0000"
      },
      "committer": {
        "name": "Android (Google) Code Review",
        "email": "android-gerrit@google.com",
        "time": "Sat Sep 21 01:15:47 2013 +0000"
      },
      "message": "Merge \"Offer to enable a print service after it is installed.\" into klp-dev"
    },
    {
      "commit": "d8f391b4e0e8d876ec7216d34f86a9b3e8bab7e5",
      "tree": "cdee4f705fd859ef54c1c286b2896192287f50bb",
      "parents": [
        "5006eb75e6d42ac107734fa8134a726158d768d8"
      ],
      "author": {
        "name": "Svetoslav",
        "email": "svetoslavganov@google.com",
        "time": "Fri Sep 20 16:25:52 2013 -0700"
      },
      "committer": {
        "name": "Svetoslav",
        "email": "svetoslavganov@google.com",
        "time": "Fri Sep 20 17:40:25 2013 -0700"
      },
      "message": "Offer to enable a print service after it is installed.\n\nThe user has to explicitly enable a print service from the settings UI\nbefore using it. Usually, users very rarely if at all interact with print\nservices, therefore all print service management task are performed from\nthe print settings. We also have to get user consent warning that the\nuser\u0027s data is about to be given to a third-party app. We now post a\nnotification allowing the user to go directly to the settings screen to\nturn the service on.\n\nbug:10447510\n\nChange-Id: Iea56c0825f0bf38328ad94912f0ea5576e9339b3\n"
    },
    {
      "commit": "5559c368a96c56d55c581c88d9978c59c5212bf1",
      "tree": "330fec8337554c2d00a7bfb7cced7b6588fcd294",
      "parents": [
        "5006eb75e6d42ac107734fa8134a726158d768d8"
      ],
      "author": {
        "name": "Svetoslav",
        "email": "svetoslavganov@google.com",
        "time": "Fri Sep 20 11:58:55 2013 -0700"
      },
      "committer": {
        "name": "Svetoslav",
        "email": "svetoslavganov@google.com",
        "time": "Fri Sep 20 12:15:22 2013 -0700"
      },
      "message": "PrintDocumentAdapter contract not followed on print.\n\n1. Layout was not called after pressing the print button if the\n   print attributes did not change. This is not correct since the\n   previous layout calls were for preview purposes and the one\n   after pressing print is not for preview. Hence, we always have\n   to do this layout.\n\n2. After layout we decide whether to ask the app to write some\n   pages. We ask for a write if we do not have the pages selected\n   by the user or the document changed (if the page count changed,\n   the document type changed, or the app told us that the content\n   changed). We were not computing correctly whether the document\n   changed since we compared the size but the document info the\n   app passes in after a layout does not have the size yet. We set\n   the size after a write. So for layout purposes we should ignore\n   the size. We only care if the page count, document type, or\n   content changed where the latter is reported by the app in\n   the layout callback.\n\n3. We were not updating the PrintJob after setting the data\n   size of the printed document.\n\n4. Disabled debugging.\n\nbug:10835370\n\nChange-Id: Ic3b2871b4e954cdf610f8cf806de5fc6588a6bec\n"
    },
    {
      "commit": "b206f1271d17164c3f2f65219eee7a0b4b4fa6dc",
      "tree": "3f3b2e8800855c4aba72110e0314477fd3ec704a",
      "parents": [
        "562ce888af21fc18d1610545ff6373ee2ecbbb13"
      ],
      "author": {
        "name": "Svetoslav",
        "email": "svetoslavganov@google.com",
        "time": "Fri Sep 20 10:43:24 2013 -0700"
      },
      "committer": {
        "name": "Svetoslav",
        "email": "svetoslavganov@google.com",
        "time": "Fri Sep 20 10:43:29 2013 -0700"
      },
      "message": "Null not handled when parsing media size resource id attribute.\n\nbug:10835715\n\nChange-Id: I0c9c1120c26e68b4c582599bbda3753d0e443d8c\n"
    },
    {
      "commit": "6811f4e92cbb64e72a0d13eb9b99b5894bd59c76",
      "tree": "5b0ebddf52a449b1ea84d91d6313e897a03e2b3e",
      "parents": [
        "f95c9aa7e1229963a4cb92eed46eafc205b03cb3"
      ],
      "author": {
        "name": "Svetoslav",
        "email": "svetoslavganov@google.com",
        "time": "Wed Sep 18 15:58:28 2013 -0700"
      },
      "committer": {
        "name": "Svetoslav",
        "email": "svetoslavganov@google.com",
        "time": "Thu Sep 19 17:12:47 2013 -0700"
      },
      "message": "Move PdfDocument to android.graphics.pdf\n\n1. Move PdfDocument to android.graphics.pdf.\n\n2. Changed the PdfDocument as per API concil request.\n\n3. Updated the documentation.\n\nbug:10461180\nbug:10552565\nbug:10681585\nbug:10552336\n\nChange-Id: I08e15b34cf37bb064248c887e6f59808019cafe8\n"
    },
    {
      "commit": "ac7297bdc04e2097e39b791064e5ed6ee92680ea",
      "tree": "b63307f9eec941b48a8a95319204eda4a7fafd9a",
      "parents": [
        "0972ae156b2e7f033baaf551e26b425e90faa895",
        "f0c48a72fd8476afd063d4ef593b473b8cf9a9d0"
      ],
      "author": {
        "name": "Svetoslav",
        "email": "svetoslavganov@google.com",
        "time": "Thu Sep 19 02:16:10 2013 +0000"
      },
      "committer": {
        "name": "Android (Google) Code Review",
        "email": "android-gerrit@google.com",
        "time": "Thu Sep 19 02:16:11 2013 +0000"
      },
      "message": "Merge \"Fixes in the page range selection and verification logic.\" into klp-dev"
    },
    {
      "commit": "f0c48a72fd8476afd063d4ef593b473b8cf9a9d0",
      "tree": "1cbd75c1f53303ad6a3f156025080372ffd18a5d",
      "parents": [
        "013b816ac7d723a0116c039e6266d93d13851fe1"
      ],
      "author": {
        "name": "Svetoslav",
        "email": "svetoslavganov@google.com",
        "time": "Wed Sep 18 14:09:47 2013 -0700"
      },
      "committer": {
        "name": "Svetoslav",
        "email": "svetoslavganov@google.com",
        "time": "Wed Sep 18 14:13:06 2013 -0700"
      },
      "message": "Fixes in the page range selection and verification logic.\n\n1. Typing a range where the start is greater than the end was\n   leading to a crash.\n\n2. Typing the same single range, e.g. \"2,2\", was leading to a crash.\n\n3. If two ranges are non-overlapping but consecutive they were\n   not merged\n\n4. Typing multiple times a digit that is less than the page count,\n   e.g. page count \"2\" and typing \"11\", was not caught by the input\n   verification.\n\nbug:10812904\n\nChange-Id: I754715b5d792a1a6c3a4f9f644edfa9aea7ac127\n"
    },
    {
      "commit": "7b3990ec81fc218f655d44624758e15ce378968e",
      "tree": "8952e4bde2e480dccf1390cd63bb2b5101db0a4d",
      "parents": [
        "f5293b6bc0567be58ac3039691ec1cf9455dc28e",
        "013b816ac7d723a0116c039e6266d93d13851fe1"
      ],
      "author": {
        "name": "Svetoslav",
        "email": "svetoslavganov@google.com",
        "time": "Wed Sep 18 21:08:49 2013 +0000"
      },
      "committer": {
        "name": "Android (Google) Code Review",
        "email": "android-gerrit@google.com",
        "time": "Wed Sep 18 21:08:49 2013 +0000"
      },
      "message": "Merge \"Update the print dialog.\" into klp-dev"
    },
    {
      "commit": "013b816ac7d723a0116c039e6266d93d13851fe1",
      "tree": "a2faa290343c9992fa049f45c3e5bfcf6848bedc",
      "parents": [
        "01fc088462d05478bcdf416fb02532d53e85dd6a"
      ],
      "author": {
        "name": "Svetoslav",
        "email": "svetoslavganov@google.com",
        "time": "Wed Sep 18 12:31:23 2013 -0700"
      },
      "committer": {
        "name": "Svetoslav",
        "email": "svetoslavganov@google.com",
        "time": "Wed Sep 18 12:31:26 2013 -0700"
      },
      "message": "Update the print dialog.\n\n1. The print dialog was resizable and as a result when printers\n   come and go its size changes which looks bad. The dialog is\n   now trying to be maximally large limited by a max size or the\n   screen - whichever is smaller. This required moving from\n   GridLayout to several LinearLayouts since the former does not\n   support distribution of empty space evently between the items\n   in a row. Also we want all items in a column of inputs to be\n   of equal size (the spinners specifically).\n\n2. Added labeledBy attribute to associate a view with another one\n   that serves as its label for accessibility purposes. We have\n   lebelFor attribute but it is not useful in most layout files\n   since it has to refer the auto-generated id of a view which\n   usually appears later in the layout file, thus generating a\n   compilation error. This was needed for the accessibility support\n   of the print dialog.\n\nbug:10631660\n\n2. Disabling the spinners or the print button did not produce\n   visual feedback leading to user frustration.\n\nbug:10741907\n\nChange-Id: I0c12eddabc4035bc7becd1b86c1f1b8fdcf4289c\n"
    },
    {
      "commit": "10ee84ba18255f259edf6fa2e3aa33c02ac5340d",
      "tree": "842b0cef2af2e6730fa14b990c78c51cf6af98a1",
      "parents": [
        "e23ce3b1fccd605ab696c120f86bd3912651731c"
      ],
      "author": {
        "name": "Svetoslav Ganov",
        "email": "svetoslavganov@google.com",
        "time": "Wed Sep 18 10:02:42 2013 -0700"
      },
      "committer": {
        "name": "Svetoslav",
        "email": "svetoslavganov@google.com",
        "time": "Wed Sep 18 11:34:24 2013 -0700"
      },
      "message": "The printers in print dialog should not change position.\n\nThe FusedPrintersProvider was not ensuring the existing printers\nare at the same position when a new dataset is loaded. As a result\nthe printers were moving in the UI and sometimes the currently\nselected one changed. Now the provider makes sure printers are in\nthe same position.\n\nbug:10748884\n\nChange-Id: I7c6cd5b1b38fdb615ceaae87806b413272ffba18\n"
    },
    {
      "commit": "0cfebec522539722f294a99bc32437b5d9e4b27d",
      "tree": "2756220c37a2e28c04601c8efed1568dc98de7dd",
      "parents": [
        "22d2575c3eb5e2154bcb344372711bafc2e0b3d3",
        "c3484024e1117b518f06b39c406ba20f961d592e"
      ],
      "author": {
        "name": "Svetoslav",
        "email": "svetoslavganov@google.com",
        "time": "Tue Sep 17 20:46:35 2013 +0000"
      },
      "committer": {
        "name": "Android (Google) Code Review",
        "email": "android-gerrit@google.com",
        "time": "Tue Sep 17 20:46:35 2013 +0000"
      },
      "message": "Merge \"Print pooler crashes for some page ranges.\" into klp-dev"
    },
    {
      "commit": "c3484024e1117b518f06b39c406ba20f961d592e",
      "tree": "a7522008782fbd6ff30464c2cd49856a505d8942",
      "parents": [
        "3fb53d8238c0ccec275237cf4f4962f2a00eab7e"
      ],
      "author": {
        "name": "Svetoslav",
        "email": "svetoslavganov@google.com",
        "time": "Mon Sep 16 19:03:39 2013 -0700"
      },
      "committer": {
        "name": "Svetoslav",
        "email": "svetoslavganov@google.com",
        "time": "Mon Sep 16 19:13:25 2013 -0700"
      },
      "message": "Print pooler crashes for some page ranges.\n\n1. The print spooler fails to parse page ranges that end with\n   a dash, e,g, \"1-\", which are however valid inputs since the\n   user can continue typing to end up with a well-fromed range.\n\n2. After a layout we are asking for the first selected page\n   to be written emulating print preview, thus increasing the\n   changes that apps will correctly implement the APIs.\n\nbug:10743632\n\nChange-Id: Ia74172d4fa6bce6ad93a0bc53da1aaa3fe8bef42\n"
    },
    {
      "commit": "2fbd2a7f070f246ddafd9de94efa9a98861e9136",
      "tree": "2a918b4226106a2350277ae8fa73a9e2ce79d697",
      "parents": [
        "3fb53d8238c0ccec275237cf4f4962f2a00eab7e"
      ],
      "author": {
        "name": "Svetoslav",
        "email": "svetoslavganov@google.com",
        "time": "Mon Sep 16 17:53:51 2013 -0700"
      },
      "committer": {
        "name": "Svetoslav",
        "email": "svetoslavganov@google.com",
        "time": "Mon Sep 16 17:55:14 2013 -0700"
      },
      "message": "App UI freezes when printing. API clean up.\n\n1. The UI of a printing app was freezing a little when calling the print\n   method since the print manager service was waiting for it to bind to the\n   print spooler which generated the print job id (and the initial print\n   job info really). Now the print manager service is responsible for job\n   id generation and does not not wait for the print spooler to spin. Hence,\n   the app UI is not blocked at all. Note that the print manager initiates\n   the binding to the spooler and as soon as it completes the spooler shows\n   the print UI which is hosted in its process. It is not possible to show\n   the print UI before the system is bound to the spooler since during this\n   binding the system passes a callback to the spooler so the latter can\n   talk to the system.\n\n2. Changed the print job id to be an opaque class allowing us to vary the\n   way we generate print job ids in the future.\n\n3. The queued print job state was hidden but the print job returned by the\n   print method of the print manager is in that state. Now now hidden.\n\n4. We were incorrecly removing print job infos if they are completed or\n   cancelled. Doing that is problematic since the print job returned by\n   the print method allows the app to query for the job info after the\n   job has been say completed. Hence, an app can initiate printing and\n   get a print job whose state is \"created\" and hold onto it until after\n   the job is completed, now if the app asks for the print job info it\n   will get an info in \"created\" state even though the job is \"completed\"\n   since the spooler was not retaining the completed jobs. Now the spooler\n   removes the PDF files for the completed and cancelled print jobs but\n   keeps around the infos (also persisting them to disc) so it can answer\n   questions about them. On first boot or switch to a user we purge the\n   persisted print jobs in completed/cancelled state since they\n   are obsolete - no app can have a handle to them.\n\n5. Removed the print method that takes a file since we have a public\n   PrintDocumentAdapter implementation for printing files. Once can\n   instantiate a PrintFileDocumentAdapter and pass it to the print\n   method. This class also allows overriding of the finish method to\n   know when the data is spooled and deleted the file if desired, etc.\n\n6. Replaced the wrong code to slice a large list of parcelables to\n   use ParceledListSlice class.\n\nbug:10748093\n\nChange-Id: I1ebeeb47576e88fce550851cdd3e401fcede6e2b\n"
    },
    {
      "commit": "860f8a6b663ca96d30d17da09eca8caf065aae62",
      "tree": "380a1f552c7584ac4a7c7bc0713c07473b696dfb",
      "parents": [
        "c8db445e42f1b60b9af036cb0d793ee11ae4c9c6"
      ],
      "author": {
        "name": "Svetoslav Ganov",
        "email": "svetoslavganov@google.com",
        "time": "Sat Sep 14 00:59:03 2013 -0700"
      },
      "committer": {
        "name": "Svetoslav Ganov",
        "email": "svetoslavganov@google.com",
        "time": "Sat Sep 14 01:00:55 2013 -0700"
      },
      "message": "Spooler should not crash if print service config activities are not exported.\n\n1. If a print service does not export its activities for settings and\n   adding printers the print spooler ignores them instead of crashing.\n   Also if the service is not enabled its activities are now ignored.\n\n2. Added a dedicated permission for a print service to optionally\n   protect its settings and add printer activities such that only the\n   system can bind to them.\n\n3. Fixed a crash in the print dialog if its content is detached\n   from the window and animators are running.\n\nbug:10680224\n\nChange-Id: I20b57d6622a15f9b2352ba78d04c44e67b316a15\n"
    },
    {
      "commit": "651dd4e6ee6510caf9f15c51094a11121af17ec2",
      "tree": "f86f1c4b313f425e5b1864c51a98710e3016ea39",
      "parents": [
        "5fbfb81d31d452f75bc088d380711642993fef1c"
      ],
      "author": {
        "name": "Svetoslav",
        "email": "svetoslavganov@google.com",
        "time": "Thu Sep 12 14:37:47 2013 -0700"
      },
      "committer": {
        "name": "Svetoslav",
        "email": "svetoslavganov@google.com",
        "time": "Thu Sep 12 16:58:58 2013 -0700"
      },
      "message": "Remove unneeded print APIs and update the min margins APIs.\n\n1. Removed unneeded code in Resolution that was storing its\n   label as resource and package name. We do not have predefined\n   resolutions, therefore we always persist the label.\n\n2. Renamed the print attribute margins to minMargins to reflect\n   that these are the minimal margins the printer support. Updated\n   the docs as well.\n\n3. Renamed the create method of all builder to build.\n\nbug:10727487\n\nChange-Id: Ie72ab8aaa5215b8bd2853885011b3b4efa4deb2e\n"
    },
    {
      "commit": "cc65b0c325b88c466763712f76148a6f5b8a5b3f",
      "tree": "7fa5afc4cd63434bf577516112449858bd2a7f66",
      "parents": [
        "26267660957a4428a66d8f142e2bdfa6ce6fe12f"
      ],
      "author": {
        "name": "Svetoslav",
        "email": "svetoslavganov@google.com",
        "time": "Tue Sep 10 21:08:32 2013 -0700"
      },
      "committer": {
        "name": "Svetoslav",
        "email": "svetoslavganov@google.com",
        "time": "Thu Sep 12 14:29:53 2013 -0700"
      },
      "message": "Not change the print options on printer change if possible.\n\nIf the user selects some print options from the dialog and then\nchanges the printer to one that has the same capabilities the\nselections in the UI should not change.\n\nbug:10631856\n\nChange-Id: Ia76ce58c446815e3498d2f4b4739dee62d11d96a\n"
    },
    {
      "commit": "c6066799ad130140159230d14451b429eb828755",
      "tree": "43145c16aae37124e167c1edde05c4376e0b69e2",
      "parents": [
        "16dae5997bb0ff7f03d5a0ccfdc4be94aa35ba51"
      ],
      "author": {
        "name": "Svetoslav",
        "email": "svetoslavganov@google.com",
        "time": "Tue Sep 10 21:08:32 2013 -0700"
      },
      "committer": {
        "name": "Svetoslav",
        "email": "svetoslavganov@google.com",
        "time": "Thu Sep 12 10:52:26 2013 -0700"
      },
      "message": "Handle print serivce crashes.\n\n1. Now after a print service crashes we are bringing it to the same\n    state of its lifecycle. For example, if a service does a discovery\n    and crashes we recreate the discovery session call the start\n    discovery method and so on.\n\n2. Turned off debugging logs since we have fully fledged state dump.\n\nbug:10697779\n\nChange-Id: Id790537461428e96b197eef12258996bda2bd1ce\n"
    },
    {
      "commit": "a36285f3f2f74b1d2d5d0336ffe519ab9f6e062a",
      "tree": "ec4de38e0c8c64793090e89293b4e3a5acdc64c4",
      "parents": [
        "b402fb2fddbee48ef3b518358dc5c86db63f7780"
      ],
      "author": {
        "name": "Svetoslav",
        "email": "svetoslavganov@google.com",
        "time": "Thu Sep 05 11:27:45 2013 -0700"
      },
      "committer": {
        "name": "Svetoslav",
        "email": "svetoslavganov@google.com",
        "time": "Thu Sep 05 11:34:32 2013 -0700"
      },
      "message": "Bug fixes in the print dialog\n\n1. Read/write async tasks of the persistence manger used by\n   the FusedPrintersProvider could be run more that once, so\n   create a new one every time.\n\n2. The fake printer used to save to PDF should not be added\n   to printer history.\n\n3. Removed print preview leftover code from the print dialog.\n\n4. Save to PDF was not working on the second consecutive attempt.\n\n5. The fisrt time the orientation change was ignored - regression\n\nChange-Id: I8960ef2cf92dfeeec22fa8751ba8475092b5b65c\n"
    },
    {
      "commit": "a76233ae845da4bc9e3bcd89821701a747215e7b",
      "tree": "d74d079330fe51f0a80658943ce642ec0d2fb465",
      "parents": [
        "773f54de3de9bce7b6f915aa47ed686b161d77aa"
      ],
      "author": {
        "name": "Svetoslav",
        "email": "svetoslavganov@google.com",
        "time": "Thu Sep 05 09:38:02 2013 -0700"
      },
      "committer": {
        "name": "Svetoslav",
        "email": "svetoslavganov@google.com",
        "time": "Thu Sep 05 09:50:28 2013 -0700"
      },
      "message": "Hiding some unneeded APIs,\n\n1. Hide the MediaSize and Resolution constructors that take\n   package and resource Id.\n\n2. Fix a bug and docs in creating portrait and landscape media\n   size.\n\nChange-Id: If59992e355391de6ad6d14d4f7b3be8c8b6cc0e0\n"
    },
    {
      "commit": "773f54de3de9bce7b6f915aa47ed686b161d77aa",
      "tree": "f5849053ebf63d993ff9e3c629b1f8df6e95f4b9",
      "parents": [
        "ad0ec16fbe27e69e22b90ad9f1b9e322d8c20e8d"
      ],
      "author": {
        "name": "Svetoslav",
        "email": "svetoslavganov@google.com",
        "time": "Tue Sep 03 14:01:43 2013 -0700"
      },
      "committer": {
        "name": "Svetoslav",
        "email": "svetoslavganov@google.com",
        "time": "Wed Sep 04 21:06:12 2013 -0700"
      },
      "message": "Print API updated.\n\n1. Removed the updatePrinters API on PrinterDiscoverySession.\n   Now re-adding a printer updates it.\n\n2. Added getTrackedPrinters() API to allow a print service to\n   figure out which printers\u0027 state should be tracked by the\n   service.\n\n3. Removed the APIs on PrintDocumentInfo that describe the\n   layout of the content as they are not needed. For example,\n   if the print attributes passed in layout require landscape\n   mode, the the app should just create a PDF page with the\n   wider side up and draw its content in portrait. The printer\n   will then rotate the page.\n\nChange-Id: Idd72c6e9c129e8b17eef1236573a99773f8ff0a2\n"
    },
    {
      "commit": "9186d0cb2bd325d9b52da15dbd513937c1e42caa",
      "tree": "8237bc1c648c916b670935d3f9bc0cd6c9d56965",
      "parents": [
        "6bd20bc46c762860cac852888df5adf718f2be24"
      ],
      "author": {
        "name": "Svetoslav Ganov",
        "email": "svetoslavganov@google.com",
        "time": "Tue Sep 03 00:11:58 2013 -0700"
      },
      "committer": {
        "name": "Svetoslav Ganov",
        "email": "svetoslavganov@google.com",
        "time": "Tue Sep 03 08:42:17 2013 -0700"
      },
      "message": "Bug fixes in the printer dialog activity and fused printer loader.\n\n1. Fused printers loader was not using the discovered printers to update the\n    historical ones. Now if a historical printer is discovered we update its state\n    with the discovered, i.e. most recent, information.\n\n2. Fixed a bug in the destination adapter of the print job config dialog that\n    was leading to a crash if all printers item is selected when there are no\n    discovered printers.\n\n3.  Updated the add printers asset in the all printers screen.\n\n4. Historical printers were not persisted by the print dialog activity.\n\n5. Reduced the number of printers we send per transation to avoid the binder\n   transaction size limit. Added sending of printers in chunks in a place\n   this was missing.\n\nChange-Id: I88b54888360bc0e53b06bd260c2b832d0d6454b6\n"
    },
    {
      "commit": "d26d4898fcc9b78f4b66118895c375384098205e",
      "tree": "2cd9d5b5403013eaf0ea998960c6ae1c9b37bc53",
      "parents": [
        "7be3a138d57713bbe6d624998620081807e65b71"
      ],
      "author": {
        "name": "Svetoslav Ganov",
        "email": "svetoslavganov@google.com",
        "time": "Wed Aug 28 14:37:54 2013 -0700"
      },
      "committer": {
        "name": "Svetoslav Ganov",
        "email": "svetoslavganov@google.com",
        "time": "Thu Aug 29 15:39:44 2013 -0700"
      },
      "message": "Print spooler security and some new print service facing APIs.\n\n1. Updated the security mode of the print spooler. Now the spooler\n   is not signed with the system key, it is not a privileged app so if\n   it gets compromised (PDF rendering is a potential attack vector)\n   it cannot access dangerous permissions. Also only the system\n   can bind to the spooler.\n\n2. Added APIs for asking a print service to start and stop tracking\n   a given printer. This is need for the case when the user selects\n   the printer and the print service should do a best effort to keep\n   the system updated for the current state of the printer.\n\n3. Added APIs for putting a print job in a blocked state. A print\n   service would report the print job as blocked if for some reason\n   the printer cannot proceed, e.g. 99 pages are printed but there\n   is no paper for the last one. The user has to add more paper\n   and the print service can resume the job.\n\n4. Changed the read/write APIs to use ParcelFileDescriptor instead\n   of FileDescriptor since the latter does not have a clean API for\n   detaching the wrapped Linux file descriptor when one wants to\n   push it to native.\n\n5. Added API for getting the size of the printed document so the\n   print service can avoid handling big filed over cellular network\n   or ask the user if needed.\n\n6. Now the print services that are preinstalled on the system image\n   are automatically enabled.\n\nChange-Id: Ia06c311d3d21cabb9e1368f13928e11cd0030918\n"
    },
    {
      "commit": "aec1417ca9eb63209668ac17da90cf8a07c6076c",
      "tree": "d4f7c0653ed95cca27541092c4c27b0d39337e0f",
      "parents": [
        "94366313331a789440a3c077173aafcb85cabe78"
      ],
      "author": {
        "name": "Svetoslav Ganov",
        "email": "svetoslavganov@google.com",
        "time": "Tue Aug 27 00:30:54 2013 -0700"
      },
      "committer": {
        "name": "Svetoslav Ganov",
        "email": "svetoslavganov@google.com",
        "time": "Tue Aug 27 11:56:18 2013 -0700"
      },
      "message": "Print APIs update.\n\n1. Added scale to fit and scale to fill fitting modes.\n\n2. Added APIs for a print app to specify which constraints imposed\n   by the print attributes were satsified during a layout so they\n   are not handled by the printer again, e.g. if the content is to\n   be in landscape the the app generated such content the printer\n   should rotate the content again.\n\n3. Added some printer statuses.\n\n4. Added a helper class that generates PDF documents with correct\n   size based on the passed in print attributes.\n\n5. Exposed a ctor for PageRange which was hidden by mistake and apps\n   could not create page ranges. Added API for changing the printer\n   status.\n\nChange-Id: If1334a61d2d931027b98075f653018d456b1b768\n"
    },
    {
      "commit": "44720af55a8fdf991929983dad5d53c02851dd1e",
      "tree": "a8d00a35c432ab3f5fc19afe21e4492d28578645",
      "parents": [
        "4359d56420b114f433ba4187c2d1f341bb35c938"
      ],
      "author": {
        "name": "Svetoslav Ganov",
        "email": "svetoslavganov@google.com",
        "time": "Tue Aug 20 16:32:53 2013 -0700"
      },
      "committer": {
        "name": "Svetoslav Ganov",
        "email": "svetoslavganov@google.com",
        "time": "Fri Aug 23 18:36:33 2013 +0000"
      },
      "message": "Print UI bug fixing and printer discovery refactoring.\n\n1. Added support for selecting a printer from the all printers activity\n   that is not in the initial printer selection drop down. The user\n   initially sees a sub set of the printers in the drop down and the\n   last option is to see all printers in a separate activity. Some\n   of the printers in the all printers activity are not shown in the\n   initial drop down.\n\n2. Refactored printer discovery by adding (private for now) printer\n   discovery app facing APIs. These APIs are needed to support multiple\n   printer selection activities (print dialog and all printers activities)\n   and also the settings for showing all printers for a service.\n\n   Now multiple apps can request observing for printers and there is\n   a centralized mediator that ensures the same printer discovery\n   session is used. The mediator dispatches printer discovery specific\n   requests to print services. It also aggregates discovered printers\n   and delivers them to the interested apps. The mediator minimizes\n   printer discovery session creation and starting and stopping discovery\n   by sharing the same discovery session and discovery window with\n   multiple apps. Lastly, the mediator takes care of print services\n   enabled during discovery by bringing them up to the current\n   discovery state (create discovery session and start discovery if\n   needed). The mediator also reports disappearing of the printers\n   of a service removed during discovery and notifies a newly\n   registered observers for the currnet printers if the observers are\n   added during an active printer discovery session.\n\n3. Fixed bugs in the print UI and implemented some UX tweaks.\n\nChange-Id: I4d0b0c5a6c6f1809b2ba5dbc8e9d63ab3d48f1ef\n"
    },
    {
      "commit": "269403b032f965ff3847eb982c2f697229dc5a92",
      "tree": "96ef6d8d99f7cbd56d78c63bf5e4da78a42831c1",
      "parents": [
        "b93489270d41bbaf513f0018164ab8b6d6ca9519"
      ],
      "author": {
        "name": "Svetoslav",
        "email": "svetoslavganov@google.com",
        "time": "Wed Aug 14 17:31:04 2013 -0700"
      },
      "committer": {
        "name": "Svetoslav Ganov",
        "email": "svetoslavganov@google.com",
        "time": "Mon Aug 19 13:24:11 2013 -0700"
      },
      "message": "Implemented advanced printer selection and API refactoring.\n\n1. Added past printer history tracking and merging favorite printers\n   with discovered printers.\n\n2. Added save as PDF support.\n\n3. Added all printers activity with search capability and optional\n   add printers chooser (if any print service provides add printers\n   activity)\n\n4. Refactored the printer discovery session APIs. Now one session\n   can have multiple window discovery windows and the session stores\n   the printers found during past discovery periods.\n\n5. Merged the print spooler and the print spooler service - much\n   simpler and easier to maintain.\n\nChange-Id: I4830b0eb6367e1c748b768a5ea9ea11baf36cfad\n"
    },
    {
      "commit": "66160bb881470a691005c8ad4e9c31c41fd5f810",
      "tree": "f6d08dcb111ec41626cf8ce4c9ccda7c61ae57db",
      "parents": [
        "18d9c3cc6c7d69f7c5b36dafc4b66f0722b98a89"
      ],
      "author": {
        "name": "Svetoslav",
        "email": "svetoslavganov@google.com",
        "time": "Mon Aug 12 22:36:50 2013 -0700"
      },
      "committer": {
        "name": "Svetoslav Ganov",
        "email": "svetoslavganov@google.com",
        "time": "Wed Aug 14 00:06:53 2013 -0700"
      },
      "message": "Partial implementation for the favorite and available printer tracking.\n\n1. Added a dedicated class that keeps track of the user\u0027s favorite printers\n   based on past usage. We keep the last 50 uses and assign a decreasing weight\n   to older historical use records. The printer whose records\u0027 sum is the\n   largest is considered the favorite for the user and so on.\n\n2. Factored out the printer discovery logic from the print job config activity\n   into a separate available printers provider class. It encapsulates all the\n   logic to communicated with the remote print services to discover printers,\n   keep track of added, updated, and removed printers.\n\n3. Preliminary scetch of the printer chooser acitivty that will show all the\n   printers.\n\nChange-Id: I5524665f2a9a565f186db85214d5e41a44f4812e\n"
    },
    {
      "commit": "55daead3c53a83ac300d76200dd4144f154e07d3",
      "tree": "f8938760298f2e59c95cd30f474486a947299c8c",
      "parents": [
        "798bed6cc7d273e72b0253288605db9cd2b57740"
      ],
      "author": {
        "name": "Svetoslav Ganov",
        "email": "svetoslavganov@google.com",
        "time": "Sun Aug 11 15:26:13 2013 -0700"
      },
      "committer": {
        "name": "Svetoslav Ganov",
        "email": "svetoslavganov@google.com",
        "time": "Sun Aug 11 15:26:13 2013 -0700"
      },
      "message": "Fix the build\n\nChange-Id: Icf3b339f7b300cc8673443fa8afd38ce78964683\n"
    },
    {
      "commit": "798bed6cc7d273e72b0253288605db9cd2b57740",
      "tree": "b4278847c40cf910b69773c6205395ada02543ed",
      "parents": [
        "5893a97cbf398ca3e1bff5444454343d94e25a4c"
      ],
      "author": {
        "name": "Svetoslav Ganov",
        "email": "svetoslavganov@google.com",
        "time": "Sun Aug 11 12:29:39 2013 -0700"
      },
      "committer": {
        "name": "Svetoslav Ganov",
        "email": "svetoslavganov@google.com",
        "time": "Sun Aug 11 14:40:05 2013 -0700"
      },
      "message": "Refinement of the print service APIs.\n\n1. Factored out the printer discovery APIs of a print service in a\n   dedicated session object that is created by the print service on\n   demand. This ensures that added/removed/updated printers from\n   one session do not interfere with another session.\n\n2. Updated the app facing APIs to pass in a document info along\n   with a printed file. Also exposed the print file adapter so\n   apps that create a temporary file for printing can intercept\n   when it is read by the system so the file can be deleted.\n\n3. Updated the print service documentation.\n\nChange-Id: I3473d586c26d8bda1cf7e2bdacb441aa9df982ed\n"
    },
    {
      "commit": "695c7fa7a320f1e5b4b56aa7ed6a64c6220f6502",
      "tree": "44e7f1a928b2de735967ab73b0ffb116d2c3bde6",
      "parents": [
        "32c5eb3bf89938ba2221e67362571628e1efd520"
      ],
      "author": {
        "name": "Svetoslav Ganov",
        "email": "svetoslavganov@google.com",
        "time": "Wed Aug 07 19:29:42 2013 -0700"
      },
      "committer": {
        "name": "Svetoslav Ganov",
        "email": "svetoslavganov@google.com",
        "time": "Wed Aug 07 19:47:05 2013 -0700"
      },
      "message": "Print UI polish based on UX feedback.\n\n1. Refreshed the print UI based on UX redlines.\n\n2. Implemented tap outside cancel for the print job config activity\n   which is full-screen but pretends to be a dialog.\n\nChange-Id: I5afc7cd40c696109d70af31536898cfcad91b2ab\n"
    },
    {
      "commit": "32c5eb3bf89938ba2221e67362571628e1efd520",
      "tree": "924db5a2172ca2a05076d981f1052f013aed93ab",
      "parents": [
        "2275c6c8bfab76d1db8bc11d2b56b7ff913da4e0"
      ],
      "author": {
        "name": "Svetoslav Ganov",
        "email": "svetoslavganov@google.com",
        "time": "Tue Aug 06 23:49:25 2013 -0700"
      },
      "committer": {
        "name": "Svetoslav Ganov",
        "email": "svetoslavganov@google.com",
        "time": "Tue Aug 06 23:52:38 2013 -0700"
      },
      "message": "Update the print job dialog and added notification assets.\n\n1. Update the transition between the print job edit dialog and the\n   generating print job dialog. Now the former shrinks into the\n   latter.\n\n2. Added most of the notification assets.\n\nChange-Id: I84f35df5cb4f71b86a103c16ab87fd4d108b055b\n"
    },
    {
      "commit": "14db9654f6c31e94fe9272776f1f1b8602a17fdc",
      "tree": "fad51f4badc7de342f4b32a3b246e76febed4a33",
      "parents": [
        "614b4c4cd42699161b0c801117416ec517b2afe2"
      ],
      "author": {
        "name": "Svetoslav Ganov",
        "email": "svetoslavganov@google.com",
        "time": "Tue Aug 06 14:40:46 2013 -0700"
      },
      "committer": {
        "name": "Svetoslav Ganov",
        "email": "svetoslavganov@google.com",
        "time": "Tue Aug 06 15:07:17 2013 -0700"
      },
      "message": "Print UI polish (a.k.a. just the next iteration))\n\n1. Added a dialog to show a spinner while the app is writing the\n   printed content.\n\n2. Fixed print job config acitivity leaking.\n\n3. Updated the notifications a bit.\n\nChange-Id: I8314390135a49605ee11ab4ed14b210a29566745\n"
    },
    {
      "commit": "55b5f8028a72d1da58835b6766798d781ad92b97",
      "tree": "c8ecbe11beb62edabf7db5bfc2eb6e2bd3363ce0",
      "parents": [
        "835835ee6f913408ac91678d6056896a2c5b25e3"
      ],
      "author": {
        "name": "Svetoslav Ganov",
        "email": "svetoslavganov@google.com",
        "time": "Mon Aug 05 11:26:16 2013 -0700"
      },
      "committer": {
        "name": "Svetoslav Ganov",
        "email": "svetoslavganov@google.com",
        "time": "Mon Aug 05 11:26:16 2013 -0700"
      },
      "message": "Disable print dialog spinners if there is only one option.\n\nChange-Id: Ic9a46c737b592aeb6f78c962a7f9d53391a2b164\n"
    },
    {
      "commit": "835835ee6f913408ac91678d6056896a2c5b25e3",
      "tree": "16f82a42cd1a8d032502adf963912856c9b297a8",
      "parents": [
        "14617a83a64fe982d01450a881a1b4f1ec29e28b"
      ],
      "author": {
        "name": "Svetoslav Ganov",
        "email": "svetoslavganov@google.com",
        "time": "Sun Aug 04 20:17:52 2013 -0700"
      },
      "committer": {
        "name": "Svetoslav Ganov",
        "email": "svetoslavganov@google.com",
        "time": "Sun Aug 04 20:45:10 2013 -0700"
      },
      "message": "Polish the print spooler loading of stored print jobs.\n\n1. The singleton print spooler isntance is created when the print spooler\n   service gets a connection to the system and is destroyed when this\n   connection is removed. Note that if the spooler has work, then the\n   connection to the system will not be removed.\n\n   When the spooler is created, it reads the stored state and notifies the\n   system which in turn dispatches this to the print services.\n\n   When the system connects to the spooler and passes it a connection, we\n   schedule a delayed check whether there is work for the spooler. We do\n   not handle this immediately to avoid intermitted spinning on and off\n   of the spooler process if a client makes a sequence of queries while\n   the spooler has really no work.\n\n2. Fixed a bug in the NotificationManagerService where adding a notification\n   and removing it immediately after that does not remove the notification.\n   The code that is adding a notification is run on a handler thread while\n   the code to remove it on the calling thread. This creates a race and\n   erroneous results. Now the removal is also scheduled on the handler.\n\n3. Many small fixes here and there.\n\nChange-Id: I6415c253139fa6616393fbe23c659d031a29e1f6\n"
    },
    {
      "commit": "8c43376ea83a67414bd6823a472b76d41160239e",
      "tree": "05ee0b02f711058ce5443a8bbee33edd19df2d8f",
      "parents": [
        "55b409a97cf6376399a0940313ea852368727d6f"
      ],
      "author": {
        "name": "Svetoslav Ganov",
        "email": "svetoslavganov@google.com",
        "time": "Fri Aug 02 14:22:19 2013 -0700"
      },
      "committer": {
        "name": "Svetoslav Ganov",
        "email": "svetoslavganov@google.com",
        "time": "Fri Aug 02 14:22:22 2013 -0700"
      },
      "message": "    First cut of the print notifications.\n\n    1. Added notifications for a queued print job, for a started print job,\n       for ongoing canceling a print job, and for a failed print job. The\n       notifications for queued and started state have a cancel action. The\n       notification for failed print job has a cancel and a restart action.\n\n    2. Propagating failure message from the print service to the notifications.\n\n    3. PrintJobConfigActivity was not setting the initial value for the\n       print job copies and was not updating the UI immediately after creation.\n\n    4. Refactored PrintJobConfigActivity to avoid using the hack to avoid\n       reaction for item selection change in a spinner for an event that\n       happened before the callback was registered.\n\n    5. Removed the label attribute from PrinterInfo and now PrinterId is\n       composed of the printer name and the service component name. This\n       is nice since for restarting print jobs we do not need to store\n       information about the printer except the printer id which is\n       already part of the PrintJobInfo\u0027s data. Also the printer name\n       is not expected to change anyway.\n\n    6. Allowing cancellation of a queued print job. Also no print job is\n       cancelled without asking the managing print service to do that.\n       Before we were immediately canceling print jobs in queued state\n       but it was possible for a buggy print service to not set the\n       print job state to started before starting to do expensive work\n       that will not be canceled.\n\n    7. PrintServiceInfo was throwing an exception the the meta-data\n       XML for the print service was not well-formed which would crash\n       the system process. Now we just ignore not well-formed meta-data.\n\n    8. Removed unused permissions from the PrintSpooler\u0027s manifest.\n\nChange-Id: Iba2dd14b487f56e137b90d1da17c3033422ab5e6\n"
    },
    {
      "commit": "55b409a97cf6376399a0940313ea852368727d6f",
      "tree": "9a919b2d64c469e11d94d6205d44cdd9ab553802",
      "parents": [
        "85b1f883056a1d74473fd9ce774948878f389ab6"
      ],
      "author": {
        "name": "Svetoslav Ganov",
        "email": "svetoslavganov@google.com",
        "time": "Wed Jul 31 17:25:13 2013 -0700"
      },
      "committer": {
        "name": "Svetoslav Ganov",
        "email": "svetoslavganov@google.com",
        "time": "Wed Jul 31 18:59:53 2013 -0700"
      },
      "message": "Iteration of the print sub-system.\n\n1. Added APIs for adding partially initialized PrintInfo objects\n   enabling light-weight lookps for print serivces that want to\n   populate the list of available printers without querying each\n   of them for its capabilities. This includes APIs for the system\n   to request from a print service to update certain printers.\n\n2. Fixed a bug in PrinterId#equals().\n\n3. Added equals and hasCode implementaion to PrinterInfo. Also\n   the defaul in PrinterInfo are now an array instead of a\n   SparseArray - cheaper.\n\n4. Now PrintJobConfigActivity works with partially specified\n   printers. Specifically, if such a printer is selected the\n   activity is requesting from the print service to update\n   the printer. We are currently not handling the timeout case.\n   It also handles udpated pritners.\n\nChange-Id: I5e83e924ef597c9e22cbd06a971d4f4d3bd3a9c1\n"
    },
    {
      "commit": "85b1f883056a1d74473fd9ce774948878f389ab6",
      "tree": "7417d396a98766611636e0123102154f60726737",
      "parents": [
        "0d1daa50f6d180c57f92596501e2e5c0b5ef9997"
      ],
      "author": {
        "name": "Svetoslav Ganov",
        "email": "svetoslavganov@google.com",
        "time": "Wed Jul 24 17:00:06 2013 -0700"
      },
      "committer": {
        "name": "Svetoslav Ganov",
        "email": "svetoslavganov@google.com",
        "time": "Tue Jul 30 17:15:11 2013 -0700"
      },
      "message": "Iteration on the print sub-system.\n\n1.  API changes: Moved copies API from PrintAttributes to PrintJobInfo;\n    Changed the PageRange list to an array in PrintDocumentAdapter#onWrite;\n    Added onCancelled method to the layout and write callbacks.\n\n2.  Refactored the serialization of remote layout and write commands. Now\n    the commands are serialized by the code in the client instead in the spooler.\n    The benefit is simple code since the client has to do a serialization to delegate\n    to the main thread anyway. The increased IPC found is fine since these calls\n    are quite unfrequent.\n\n3.  Removed an unused file: IPrintSpoolerObserver.aidl\n\n4.  Added equals and hasCode implementation to PageRange, PrintAttributes,\n    MediaSize, Resolution, Margins, Tray, PrintDocumentInfo.\n\n5.  Added shortcut path for query APIs on PrintJob that return cached values\n    if the print job is in a uncuttable state, i.e. completed or cancelled. Failed\n    print jobs can be restarted.\n\n6.  PrintJobInfo was not properly serialized.\n\n7.  Updated the look of the print dialog to be stable if there is and there isn\u0027t\n    currently selected printer.\n\n8.  PrintJobCOnfigActivity now calls onLayout on every print attributes change\n    but requests a write only on print preview or print button press. Also if the\n    layout did not change the content and it is already written no subsequent\n    call is made. Also if the selected pages change and we already have them\n    no subsequent call to write is made. Also the app is called with print preview\n    attribute set when performing layout and with it cleared after the print button\n    is pressed. A lot of changes making sure that only valid actions are enabled\n    in the activity (looks like a dialog) at a given time frame. The print job config\n    activity is also hidden after we got all the data, i.e. layout and write are done.\n\n9.  The callback from the print spooler to the system are scheduled via messages\n    to avoid lock being held during the call. It was hard to guarantee that since a\n    method holding a lock may be calling one that would like to release the lock\n    at some point to make the callbacks.\n\n10. Print spooler state is persisted only if something changes in a completed\n    print job, i.e. not one that is being constructed due the print job config dialog.\n\n11. Fixed a potential race in the RemotePrintSpooler where it was possible that\n    a client that got a handle to the remote spooler calls into an unbound spooler.\n    E.g: the client gets the remote interface with a lock held, now the client releases\n    the lock to avoid IPC with a lock, during the IPC scheduling the spooler has\n    notified the system that it is done and the system unbinds from it, now the\n    client\u0027s IPC is made to a spooler that is disconnected.\n\nChange-Id: Ie9c42255940a27ecaed21a4d326a663a4788ac9d\n"
    },
    {
      "commit": "0d1daa50f6d180c57f92596501e2e5c0b5ef9997",
      "tree": "130ab8cf87d8762783a121c7e01f1fbd88f2a258",
      "parents": [
        "88d199130d44c6bacb383a7757e782cf97483c68"
      ],
      "author": {
        "name": "Svetoslav Ganov",
        "email": "svetoslavganov@google.com",
        "time": "Tue Jul 23 13:29:31 2013 -0700"
      },
      "committer": {
        "name": "Svetoslav Ganov",
        "email": "svetoslavganov@google.com",
        "time": "Tue Jul 23 18:05:53 2013 -0700"
      },
      "message": "Updating the print dialog and its interactinos with the printing app.\n\n1. Added support for reporting the old print attributes during layout.\n   Now we keep track of the old print attributes, so the app can\n   compute the delta and decide whether re-layout work is needed.\n\n2. Fixed PrintDocumentAdapter callback interleavings. Layout callbacks\n   were intermixing with write ones - a mess. Now we make an attempt\n   to cancel layout and write if they respond to cancellation, otherwise\n   we wait but do not interleave them.\n\n3. Refactored the PrintJobConfigActivity for easier maintenance and\n   to have a single update UI method that does the minimal amount\n   of work.\n\nChange-Id: I31ada1a0550882e6185018e6f17f923aed165d15\n"
    },
    {
      "commit": "88d199130d44c6bacb383a7757e782cf97483c68",
      "tree": "454e94ec561afdb80a9ed209e12540c70e5df8eb",
      "parents": [
        "597945fd3a6b52ac70bb9afc5ec8c59039fffd77"
      ],
      "author": {
        "name": "Svetoslav Ganov",
        "email": "svetoslavganov@google.com",
        "time": "Mon Jul 22 12:32:03 2013 -0700"
      },
      "committer": {
        "name": "Svetoslav Ganov",
        "email": "svetoslavganov@google.com",
        "time": "Mon Jul 22 13:07:09 2013 -0700"
      },
      "message": "Implement persistence/restoring of print spooler state.\n\n1. Implemented the persistence and restoring of the print spooler state.\n   The print spooler state is saved as an XML on every print job change\n   and is restored when we bind to the spooler. The system does not\n   unbind from the spooler until the state persistence completes. We\n   are now storing the entire state, i.e. all print jobs, when a single\n   one changes. This is not optimal but we are not expecting to have\n   many such at the same time, so for now we err for simplicity of\n   implementation.\n\n2. Enforcing a non-empty print job name.\n\n3. Hidden the STATE_CREATED print job state which should never be visible to a\n   client since this is the state of a print job during construction, i.e. the\n   print dialog is up and we are doing back and forth with the app.\n\n4. Fixed some PrintAttributes APIs that were incorrectly taking in a PackageManager\n   instance.\n\n5. Updated the PrintSpooler build file due to splitting the framework into multiple\n   jars.\n\nChange-Id: I52c88eaa1ec9c64920359cc143c79832a4c3d25b\n"
    },
    {
      "commit": "597945fd3a6b52ac70bb9afc5ec8c59039fffd77",
      "tree": "1e44c6e0c34deba26033b46878bbbfd010a3f8d9",
      "parents": [
        "7a5480d6d74eb64a360ed20062c66926c9eef9bc"
      ],
      "author": {
        "name": "Svetoslav",
        "email": "svetoslavganov@google.com",
        "time": "Wed Jul 17 18:37:36 2013 -0700"
      },
      "committer": {
        "name": "Svetoslav Ganov",
        "email": "svetoslavganov@google.com",
        "time": "Fri Jul 19 16:23:12 2013 -0700"
      },
      "message": "First pass of the print dialog UX\n\nChange-Id: I315a16d7f68c73ca180c76e722847b4b1bdea55b\n"
    },
    {
      "commit": "6283608e0bd40548742839f5a8b02f7e5c9c5c7c",
      "tree": "77dac4aaf04f2b2727289d2ee4bfefe06322e32e",
      "parents": [
        "17b7f6e6d4ec9f5e9597bfd283f1c017b6c66275"
      ],
      "author": {
        "name": "Svetoslav",
        "email": "svetoslavganov@google.com",
        "time": "Wed Jul 17 14:52:35 2013 -0700"
      },
      "committer": {
        "name": "Svetoslav",
        "email": "svetoslavganov@google.com",
        "time": "Wed Jul 17 14:55:15 2013 -0700"
      },
      "message": "Tweak the print APIs.\n\n1. Adding bundle with metadata to PrintDocumentAdapter#onLayout\n   with one key for now to specify whether this is for a preview.\n\n2. Cleaned up docs.\n\nChange-Id: I89380781bf3ae41aa89f8a0347d74516a210394c\n"
    },
    {
      "commit": "17b7f6e6d4ec9f5e9597bfd283f1c017b6c66275",
      "tree": "2cd220ff7f122c9aeb0648089ec2b98f289b6cde",
      "parents": [
        "29b173ae072cd486ca91940eef7a6ed2298e55d0"
      ],
      "author": {
        "name": "Svetoslav",
        "email": "svetoslavganov@google.com",
        "time": "Mon Jun 24 18:29:33 2013 -0700"
      },
      "committer": {
        "name": "Svetoslav",
        "email": "svetoslavganov@google.com",
        "time": "Tue Jul 16 14:39:32 2013 -0700"
      },
      "message": "Clean up of the print APIs.\n\n1. Fixed a case in which the onPrintCompleted callback may not be invoked.\n\n2. Added string resulrces for the different error messages for failed\n   printing in OnPrintCompletedCallback\n\n3. Fixed the string comments for the MediaSize constants.\n\n4. Added APIs to create certain print attributes by passing in a\n   string label instead of resource and package name since in some cases\n   a print service may be getting already internationalized lables\n   or it may not know all possible values.\n\n5. Fixed a crash in PrintJobConfigActivity if there is no input or\n   output tray.\n\nChange-Id: Ie877b7dc669051606394aa290e6d2b979a42db4c\n"
    },
    {
      "commit": "a00271533f639c8ed36429c663889ac9f654bc72",
      "tree": "7f0c8045126bc0493c1fa018a114f803d34fa7ef",
      "parents": [
        "15ecbdd2e373195ef920faefa349a6e62200d1f1"
      ],
      "author": {
        "name": "Svetoslav Ganov",
        "email": "svetoslavganov@google.com",
        "time": "Tue Jun 25 14:59:53 2013 -0700"
      },
      "committer": {
        "name": "Svetoslav Ganov",
        "email": "svetoslavganov@google.com",
        "time": "Tue Jul 16 12:59:59 2013 -0700"
      },
      "message": "Refactoring of the print sub-system and API clean up.\n\n1. Now a user state has ins own spooler since the spooler app is\n   running per user. The user state registers an observer for the state\n   of the spooler to get information needed to orchestrate unbinding\n   from print serivces that have no work and eventually unbinding from\n   the spooler when all no service has any work.\n\n2. Abstracted a remote print service from the perspective of the system\n   in a class that is transparently managing binding and unbinding to\n   the remote instance.\n\n3. Abstracted the remote print spooler to transparently manage binding\n   and unbinding to the remote instance when there is work and when\n   there is no work, respectively.\n\n4. Cleaned up the print document adapter (ex-PrintAdapter) APIs to\n   enable implementing the all callbacks on a thread of choice. If\n   the document is really small, using the main thread makes sense.\n\n   Now if an app that does not need the UI state to layout the printed\n   content, it can schedule all the work for allocating resources, laying\n   out, writing, and releasing resources on a dedicated thread.\n\n5. Added info class for the printed document that is now propagated\n   the the print services. A print service gets an instance of a\n   new document class that encapsulates the document info and a method\n   to access the document\u0027s data.\n\n6. Added APIs for describing the type of a document to the new document\n   info class. This allows a print service to do smarts based on the\n   doc type. For now we have only photo and document types.\n\n7. Renamed the systemReady method for system services that implement\n   it with different semantics to systemRunning. Such methods assume\n   the the service can run third-party code which is not the same as\n   systemReady.\n\n8. Cleaned up the print job configuration activity.\n\n9. Sigh... code clean up here and there. Factoring out classes to\n   improve readability.\n\nChange-Id: I637ba28412793166cbf519273fdf022241159a92\n"
    },
    {
      "commit": "fd90651cfcc7e2b75254666fd6861038b72fb4ac",
      "tree": "353b9d16b7a1ca29ba3eff59529f08f822cd941a",
      "parents": [
        "53f57d162b0553102fbd5c4ccdda87dbfce5b763"
      ],
      "author": {
        "name": "Svetoslav",
        "email": "svetoslavganov@google.com",
        "time": "Mon Jun 24 09:04:48 2013 -0700"
      },
      "committer": {
        "name": "Svetoslav",
        "email": "svetoslavganov@google.com",
        "time": "Mon Jun 24 09:05:38 2013 -0700"
      },
      "message": "Print APIs documentation update\n\nChange-Id: I0df438e45ef540cc42c9ee5baafc816ebafa1c7b\n"
    },
    {
      "commit": "4b9a4d16872bbb50712e007b419ac0b35ff1582d",
      "tree": "5799cec302adb4db9311bd7a9a889cbd217553a5",
      "parents": [
        "142dd91583f429db43017ada2497d0ecfdc2b392"
      ],
      "author": {
        "name": "Svetoslav Ganov",
        "email": "svetoslavganov@google.com",
        "time": "Tue Jun 11 15:20:06 2013 -0700"
      },
      "committer": {
        "name": "Svetoslav Ganov",
        "email": "svetoslavganov@google.com",
        "time": "Fri Jun 21 18:43:17 2013 -0700"
      },
      "message": "Print - platform  APIs\n\nRelated changes:\n    Skia (inlcude PDF APIs): https://googleplex-android-review.googlesource.com/#/c/305814/\n    Canvas to PDF: https://googleplex-android-review.googlesource.com/#/c/319367/\n    Settings (initial version): https://googleplex-android-review.googlesource.com/#/c/306077/\n    Build: https://googleplex-android-review.googlesource.com/#/c/292437/\n    Sample print services: https://googleplex-android-review.googlesource.com/#/c/281785/\n\nChange-Id: I104d12efd12577f05c7b9b2a5e5e49125c0f09da\n"
    }
  ]
}
