)]}'
{
  "log": [
    {
      "commit": "68e6b5055b916f70ba81790603636168f444c6db",
      "tree": "0406277cf4e53bbc8192209f9a938f7531638c8b",
      "parents": [
        "558907f702ab21d4166d5d7f7986cb18c4a993bd"
      ],
      "author": {
        "name": "Svet Ganov",
        "email": "svetoslavganov@google.com",
        "time": "Mon Apr 20 08:28:30 2015 -0700"
      },
      "committer": {
        "name": "Svetoslav Ganov",
        "email": "svetoslavganov@google.com",
        "time": "Mon Apr 20 17:16:38 2015 +0000"
      },
      "message": "DO NOT MERGE Don\u0027t take flags when creating app widget config activity.\n\nbug:19618745\n\nChange-Id: I7973ebfc67ebf52f14890dda9eb891a7b8a5a095\n"
    },
    {
      "commit": "ad870c3d9c58a9ee31cdf4a9807a4cec2e68ab04",
      "tree": "bec53bccf9bf24f48911cdd77282250267db6529",
      "parents": [
        "d76f80bd3a38e11d27935cbe461c3a9d4243dd76"
      ],
      "author": {
        "name": "Svetoslav",
        "email": "svetoslavganov@google.com",
        "time": "Tue Oct 07 19:26:28 2014 -0700"
      },
      "committer": {
        "name": "Svetoslav Ganov",
        "email": "svetoslavganov@google.com",
        "time": "Wed Oct 08 03:13:06 2014 +0000"
      },
      "message": "Restored widget provider id not properly updated.\n\nDuring restore first the provider records and then the applications\nare restored. Therefore, we keep the restored provider records in a\nzombie state and once we get the package install broadcasts from the\npackage manager we update the zombie providers to be real ones. The\nbug was that while doing this we were not updating the provider id\nfrom one with an undefined UID to the one with the UID under which\nits package now runs.\n\nbug:17869323\n\nChange-Id: I20b7cbfd2f90e2f5bf3a6b858d8da99cc1c82841"
    },
    {
      "commit": "d00bb5edcfc8ee5c2026f66785b703b388314b22",
      "tree": "8eca016216872e5aaf34f33e690b83ca96d619aa",
      "parents": [
        "a80aba70728c2843df94474dbd7829dadb77855f"
      ],
      "author": {
        "name": "Adam Lesinski",
        "email": "adamlesinski@google.com",
        "time": "Tue Oct 07 12:14:45 2014 -0700"
      },
      "committer": {
        "name": "Adam Lesinski",
        "email": "adamlesinski@google.com",
        "time": "Tue Oct 07 12:14:45 2014 -0700"
      },
      "message": "Load shared library dependencies for AppWidgets\n\nPackageManager and AppWidgetHostServiceImpl should\nbe loading the resources of any shared libraries being\nused by the app, as they have references in their Widgets\nor application icons/labels, etc.\n\nBug:17668152\nChange-Id: I359662334edb125d7570089916727df4eeba02bb\n"
    },
    {
      "commit": "c616b3e2f16c99c51e0543256c219e799ff32232",
      "tree": "db5b88f1804acd20d3028f870db395c251fa5052",
      "parents": [
        "fdb35f0526e63dc4d6882d86029d9beacc6a2d07"
      ],
      "author": {
        "name": "Svetoslav",
        "email": "svetoslavganov@google.com",
        "time": "Mon Sep 22 12:25:24 2014 -0700"
      },
      "committer": {
        "name": "Svetoslav",
        "email": "svetoslavganov@google.com",
        "time": "Mon Sep 22 12:31:04 2014 -0700"
      },
      "message": "Fix a bug in parsing app widget state XML.\n\nWhen restoring app widget state from XML we read all providers,\nhosts, and widgets and only after reading all hosts and providers\nfor all members of the group we hookup the widgets as they may\ncross profile boundary. To esntablish the host-widget and provider-\nwidget relation we use a tag for the host and the provider that\nare assigned before saving the state to XML. When restoring we\nare using the tags to match widgets with hosts and providers. The\nbug was that we were not clearing the tag of all hosts and providers\nbefore reading from XML as we want the only tags that are defined\nto be the ones we are reading. This resulted in wrong app widget\nrestore for a secondary user.\n\nbug:17505027\n\nChange-Id: I035d8f13142c6b9dbc9d658b82390f9cd8d75e0d\n"
    },
    {
      "commit": "9ce72731f22caa07d90dcd016c6441bfeb90225c",
      "tree": "ebf7e6ee6d6e988c58245ff90595f7b596a6bbe5",
      "parents": [
        "8d223eb3f92a521f22acc4639a6d1999f7fe26ba",
        "75d8c0b8bc28f61658c62b870ae8705e0be191cb"
      ],
      "author": {
        "name": "Nick Kralevich",
        "email": "nnk@google.com",
        "time": "Thu Sep 04 23:35:54 2014 +0000"
      },
      "committer": {
        "name": "Android (Google) Code Review",
        "email": "android-gerrit@google.com",
        "time": "Thu Sep 04 23:36:00 2014 +0000"
      },
      "message": "Merge \"AppWidgetServiceImpl: Use enforceCallingOrSelfPermission for checking DUMP\" into lmp-dev"
    },
    {
      "commit": "75d8c0b8bc28f61658c62b870ae8705e0be191cb",
      "tree": "eee16c54e985c4d5d47ac819048cf5db010486de",
      "parents": [
        "191cbad91f19c14316810c806c4b0560d9386c8c"
      ],
      "author": {
        "name": "Nick Kralevich",
        "email": "nnk@google.com",
        "time": "Thu Sep 04 15:07:18 2014 -0700"
      },
      "committer": {
        "name": "Nick Kralevich",
        "email": "nnk@google.com",
        "time": "Thu Sep 04 15:07:18 2014 -0700"
      },
      "message": "AppWidgetServiceImpl: Use enforceCallingOrSelfPermission for checking DUMP\n\nUse enforceCallingOrSelfPermission() for throwing a security exception\nrather than creating the security exception ourselves. This has the\nadvantage that the exception is in a well known format expected by\nthe CTS test android.security.cts.ServicePermissionsTest#testDumpProtected\n\nBug: 17165920\nChange-Id: I7d3c2d2a0852a490fe1d553cd81d1efc79d2fec3\n"
    },
    {
      "commit": "298a6c6b29798647b3d8f12d0723b1e49fc8b8da",
      "tree": "dacf488c92b865c119bb0ef033c69195ee8affec",
      "parents": [
        "def58cbffc32d12445b60ed1a0d8bb81d8dc6625"
      ],
      "author": {
        "name": "Svetoslav",
        "email": "svetoslavganov@google.com",
        "time": "Thu Sep 04 11:20:18 2014 -0700"
      },
      "committer": {
        "name": "Svetoslav",
        "email": "svetoslavganov@google.com",
        "time": "Thu Sep 04 11:20:25 2014 -0700"
      },
      "message": "Fix collection iteration index.\n\nbug:17387880\n\nChange-Id: Ic637ce8fa2da87d6f21a222bd70bf627953f57e3\n"
    },
    {
      "commit": "5771ad7bc7533f4a9bc72ac1ecabfdf6ca493b16",
      "tree": "5455da198b3ee47217a07fe12844f37cf5a27d3d",
      "parents": [
        "63859536047e907fbcde87f12511ec3b35bf53dc"
      ],
      "author": {
        "name": "Svet Ganov",
        "email": "svetoslavganov@google.com",
        "time": "Sat Aug 23 21:10:29 2014 -0700"
      },
      "committer": {
        "name": "Svet Ganov",
        "email": "svetoslavganov@google.com",
        "time": "Sun Aug 24 20:02:47 2014 -0700"
      },
      "message": "RemoteViews service not unbound.\n\nWe are checking whether an app can access an app widget\nbased on the calling uid and the package name. The package\nis mostly to make sure that hosts in different apps do\nnot accidentally interfere whereas the security is enforced\nby the uid.\n\nWhen remote views adapter binds and unbinds to a remote\nviews serivce it was passing the package of the context we\ncreate to load resources for the widget instead the package\nof the host. Now it is passing the host package and also\nwe are checking if the caller of bind remove serivce API\nis in uid that has the host package - this makes it\nconsistent with elsewhere.\n\nbug:17226052\n\nChange-Id: I2b0b6669e3dc027037b7481c2871cedabd642433\n"
    },
    {
      "commit": "3de01b2e3474ac2eaccbcf72b6693bb19d254824",
      "tree": "7143e9241725f79a1b26ca1e98b224b40f9d13e4",
      "parents": [
        "e4be1bf2bed48afd234ea1f2558c60beffe3fa18"
      ],
      "author": {
        "name": "Svet Ganov",
        "email": "svetoslavganov@google.com",
        "time": "Thu Aug 21 08:31:55 2014 -0700"
      },
      "committer": {
        "name": "Svetoslav Ganov",
        "email": "svetoslavganov@google.com",
        "time": "Thu Aug 21 15:47:08 2014 +0000"
      },
      "message": "Fix a regression in partially updading app widgets.\n\nApp widgets can be partially updated where only the actions delta\nis delivered to the client. There was a regression where instead\nof sending the delta, the merged remote views were sent. This was\nproblematic because certain actions are ignored when merging to\navoid clutter (specifically showNext and showPrevious), hence these\nactions never reached the client.\n\nbug:16844814\n\nChange-Id: I88ab58e610cda24154985165e6d6d93a1baa9c79\n"
    },
    {
      "commit": "6bd702538d90005add1cfc33746da19404090dc1",
      "tree": "7e2c16fbd334aff123794f7d1788f85adb61cc18",
      "parents": [
        "4746bc78ec242c29171a1963c4f3f9cac73f2084"
      ],
      "author": {
        "name": "Svet Ganov",
        "email": "svetoslavganov@google.com",
        "time": "Wed Aug 20 09:47:47 2014 -0700"
      },
      "committer": {
        "name": "Svetoslav Ganov",
        "email": "svetoslavganov@google.com",
        "time": "Wed Aug 20 20:25:10 2014 +0000"
      },
      "message": "Notify app widget hosts when cross-profile providers change.\n\n1. Notify the hosts in the group if a package gets white-listed or\n   un-white-listed for providing widgets across profiles.\n\n2. Notify hosts in the group for provider changes when a profile\n   is deleted.\n\nbug:17126070\n\nChange-Id: Ic719c1c68e45842d50decc95603f1d61583b8f02\n"
    },
    {
      "commit": "29564cd24589867f653cd22cabbaac6493cfc530",
      "tree": "c5ee0b88f293d292d95012844097acd172a7a72a",
      "parents": [
        "bdc78678dedc6b66b9584948b908cd8cf77c6b30"
      ],
      "author": {
        "name": "Narayan Kamath",
        "email": "narayan@google.com",
        "time": "Thu Aug 07 10:57:40 2014 +0100"
      },
      "committer": {
        "name": "Narayan Kamath",
        "email": "narayan@google.com",
        "time": "Fri Aug 15 13:37:03 2014 +0100"
      },
      "message": "Remove system_server classes from the boot image.\n\nWe set the system_server classpath in the environment\n(like we do with BOOTCLASSPATH). After the zygote forks\nthe system_server, we dexopt the classpath (if needed)\nand then launch the system server with the correct\nPathClassLoader. This needed several small / medium\nrefactorings :\n\n- The logic for connecting to installd is now in a separate\n  class and belongs in the system_server.\n- SystemService / SystemServiceManager have now moved to\n  classes.jar. They are only used from there, and since they\n  use Class.forName, we want them to be loaded by the\n  system_server classloader, and not the bootclassloader.\n- BootReceiver now moves to frameworks.jar, because it is\n  used by ActivityThread and friends.\n\nbug: 16555230\n\nChange-Id: Ic84f0b2baf611eeedff6d123cb7191bb0259e600\n"
    },
    {
      "commit": "8e1d299da27da534b508b1da51ebe351a689cefa",
      "tree": "9e83a2646024f422190d0e9ddfee54aa913b9f66",
      "parents": [
        "5c8ea2c369deab75719fe7c7301846a8ef955702"
      ],
      "author": {
        "name": "Svetoslav",
        "email": "svetoslavganov@google.com",
        "time": "Fri Aug 08 12:48:06 2014 -0700"
      },
      "committer": {
        "name": "Svetoslav Ganov",
        "email": "svetoslavganov@google.com",
        "time": "Fri Aug 08 20:35:59 2014 +0000"
      },
      "message": "Polish the new cross-profile app widget APIs\n\nbug:14991269\n\nChange-Id: I5996f8c69a3d151ff1ecd8f19403dd606f588150\n"
    },
    {
      "commit": "985e566ceca9c11d2f740499053f37dfaeb9033d",
      "tree": "b6dc8b3ba3543e9c3df516bfe5b07bb08313e368",
      "parents": [
        "14b7c54eeae4285f3c5084787c0607dd3103f20c"
      ],
      "author": {
        "name": "Svetoslav",
        "email": "svetoslavganov@google.com",
        "time": "Wed Aug 06 22:05:48 2014 -0700"
      },
      "committer": {
        "name": "Svetoslav Ganov",
        "email": "svetoslavganov@google.com",
        "time": "Thu Aug 07 05:14:36 2014 +0000"
      },
      "message": "Fix cross-user talk.\n\nAn app can access widgets hosted or provided by its uid and package.\nAccess is also allowed if the caller has the bind app widgets permission\nbut this caller can be in the wrong user. Now the caller should not\nonly have the bind app widget permission but also be in the same user\nas the host or the provider of the widget.\n\nbug:16834230\n\nChange-Id: I5ddb6309f63f2b4ba95360446c2b9584350fb66f\n"
    },
    {
      "commit": "c71c42fdb2ee54a419dc8eb0a5f4f82532b16c0c",
      "tree": "87aed5a3e13bd4ea8afbc811948e09b72dd98909",
      "parents": [
        "bc2fef0b2a065aafacebe69bae53bd0e0fb9ef67"
      ],
      "author": {
        "name": "Svetoslav",
        "email": "svetoslavganov@google.com",
        "time": "Tue Aug 05 18:57:05 2014 -0700"
      },
      "committer": {
        "name": "Svetoslav Ganov",
        "email": "svetoslavganov@google.com",
        "time": "Thu Aug 07 00:12:27 2014 +0000"
      },
      "message": "Polish of the app widgets cross-profiles feature.\n\n1. Added API for badging an arbitrary drawable at a given location.\n\n2. Updated the icon and previewImage deprecation as they are no longer\n   returning a badged drawable. The methods to load the icon and the\n   preview are now just making it easier for a developer to get the\n   drawables.\n\n3. Fixed a bug in AppWidgetServiceImpl leading to a crash when a user\n   is removed.\n\n4. Fixed a bug in AppWidgetHost which was unnecessarily caching its\n   package name and having code paths where the cached value was not\n   populated when calling into the system.\n\nbug:14991269\n\nChange-Id: I50d011a6597d88814715d5ec04ee67815e8ce0bd\n"
    },
    {
      "commit": "976e8bd2017d0263216c62111454438cc0f130e3",
      "tree": "5cf592fb85841f9e41d3bf6b43422641c3609ab2",
      "parents": [
        "c79eabcd3c6306bb2ec75f9584b79e661f265127"
      ],
      "author": {
        "name": "Svetoslav",
        "email": "svetoslavganov@google.com",
        "time": "Wed Jul 16 15:12:03 2014 -0700"
      },
      "committer": {
        "name": "Svetoslav Ganov",
        "email": "svetoslavganov@google.com",
        "time": "Tue Aug 05 20:57:20 2014 +0000"
      },
      "message": "Allow adding widgets from user profiles.\n\nThe goal of this change is to enable support for appwidget from\nuser profiles to the user main profile. A user profile is a user\nwhich is associated as a child of the main user profile. For example,\na user may have a personal (parent) and corporate (child) profile.\nThe device policy should be able to control whether adding a widget\nfrom a child profile and given packages is allowed. This change\nassumes that all packages from managed profiles are white listed.\nAnother change will add the device policy changes.\n\nChange-Id: I267260b55d74c48b112a29979a9f59eef7a8194e\n"
    },
    {
      "commit": "1c5bffbf5bae6762c8df07350abca61e460653bb",
      "tree": "d0cbf5bd3cdcc31ebb5b1990662a150218ae1c94",
      "parents": [
        "1218c3134c9d72523d5f1fe456a163670bfa4435"
      ],
      "author": {
        "name": "Adam Cohen",
        "email": "adamcohen@google.com",
        "time": "Tue May 27 16:53:03 2014 -0700"
      },
      "committer": {
        "name": "Adam Cohen",
        "email": "adamcohen@google.com",
        "time": "Tue May 27 17:23:58 2014 -0700"
      },
      "message": "Fix security issue in bindRemoteViewsService\n\n-\u003e Enforce that the passed intent\u0027s component belongs to the same package as the\n   passed AppWidget id.\n\nissue 15287902\n\nChange-Id: Ic85c38d399fe1cbb6f7efa844ae0f5367a1906ed\n"
    },
    {
      "commit": "d83a096f299abd9c7fe5e441ef1bb169c314b575",
      "tree": "2c3e1c45bc81fb6660fd306d71e72a1cc5775772",
      "parents": [
        "5d84bce12204072bc7ab296ce0cdea7efb5cf17c"
      ],
      "author": {
        "name": "Dianne Hackborn",
        "email": "hackbod@google.com",
        "time": "Fri May 02 16:28:33 2014 -0700"
      },
      "committer": {
        "name": "Dianne Hackborn",
        "email": "hackbod@google.com",
        "time": "Fri May 02 16:29:10 2014 -0700"
      },
      "message": "Bump up priority of system receiving BOOT_COMPLETED.\n\nChange-Id: I5166f88f11f781914312e867cb653c8ecbefa705\n"
    },
    {
      "commit": "96472bec7886b54cf7b52e2833bd1b4cf2e730a1",
      "tree": "a85c478572b24d9e2f36c9b828e5c4668854c377",
      "parents": [
        "23af77a3cd1febc740d885ff03ead09837df269c"
      ],
      "author": {
        "name": "Elliott Hughes",
        "email": "enh@google.com",
        "time": "Thu Apr 24 19:05:43 2014 -0700"
      },
      "committer": {
        "name": "Elliott Hughes",
        "email": "enh@google.com",
        "time": "Thu Apr 24 19:05:43 2014 -0700"
      },
      "message": "Track package change.\n\nChange-Id: I6a8123d8e69367fc1ce27bac46c4bcec489d73ba\n"
    },
    {
      "commit": "132933dc2e0e67012e6022b04a744a52344b1285",
      "tree": "59de02abb93f23086ef78df7b4255c8ad291be48",
      "parents": [
        "5454ac6b3754685210ac4dd790d24dad70bc2801"
      ],
      "author": {
        "name": "Christopher Tate",
        "email": "ctate@google.com",
        "time": "Thu Mar 27 13:10:50 2014 -0700"
      },
      "committer": {
        "name": "Christopher Tate",
        "email": "ctate@google.com",
        "time": "Thu Mar 27 13:22:26 2014 -0700"
      },
      "message": "Unlinked providers STILL shouldn\u0027t cause crashes\n\nBug 13651057\n\nChange-Id: Id7e5ba521ac3f201b1a44f122358ca5af2929e06\n"
    },
    {
      "commit": "95ead2c58989c89b7037de377e990ad19d8db3e0",
      "tree": "fad99b3d673d8eac98a50b8192f0b6e3cdd6585a",
      "parents": [
        "0046b16ec7af940049344803afbb52953f100df3"
      ],
      "author": {
        "name": "Christopher Tate",
        "email": "ctate@google.com",
        "time": "Wed Mar 26 14:42:56 2014 -0700"
      },
      "committer": {
        "name": "Christopher Tate",
        "email": "ctate@google.com",
        "time": "Wed Mar 26 14:42:56 2014 -0700"
      },
      "message": "Don\u0027t crash when handling unlinked widget bindings\n\nA host can have an \u0027instance\u0027 the other end of which is still\nunlinked to a concrete provider.  Don\u0027t crash when we hit those.\n\nBug 13651057\n\nChange-Id: I5a29afb0e6a7ab30976862aee04bd33f609543fa\n"
    },
    {
      "commit": "adfe8b86e9178a553b6db9722340fa4ff5201cf1",
      "tree": "2054d99dc17b0ada61693b97d9f3e306b4fe4d4a",
      "parents": [
        "aef4f6ebc8f8eb1f9fbfbe4ae2556c9f1a26a63c"
      ],
      "author": {
        "name": "Christopher Tate",
        "email": "ctate@google.com",
        "time": "Tue Feb 04 16:23:32 2014 -0800"
      },
      "committer": {
        "name": "Christopher Tate",
        "email": "ctate@google.com",
        "time": "Thu Mar 20 12:30:51 2014 -0700"
      },
      "message": "App widget backup/restore infrastructure\n\nBackup/restore now supports app widgets.\n\nAn application involved with app widgets, either hosting or publishing,\nnow has associated data in its backup dataset related to the state of\nwidget instantiation on the ancestral device.  That data is processed\nby the OS during restore so that the matching widget instances can be\n\"automatically\" regenerated.\n\nTo take advantage of this facility, widget-using apps need to do two\nthings:  first, implement a backup agent and store whatever widget\nstate they need to properly deal with them post-restore (e.g. the\nwidget instance size \u0026 location, for a host); and second, implement\nhandlers for new AppWidgetManager broadcasts that describe how to\ntranslate ancestral-dataset widget id numbers to the post-restore\nworld.  Note that a host or provider doesn\u0027t technically need to\nstore *any* data on its own via its agent; it just needs to opt in\nto the backup/restore process by publishing an agent.  The OS will\nthen store a small amount of data on behalf of each widget-savvy\napp within the backup dataset, and act on that data at restore time.\n\nThe broadcasts are AppWidgetManager.ACTION_APPWIDGET_RESTORED and\nACTION_APPWIDGET_HOST_RESTORED, and have three associated extras:\n\n    EXTRA_APPWIDGET_OLD_IDS\n    EXTRA_APPWIDGET_IDS\n    EXTRA_HOST_ID [for the host-side broadcast]\n\nThe first two are same-sized arrays of integer widget IDs.  The\n_OLD_IDS values are the widget IDs as known to the ancestral device.\nThe _IDS array holds the corresponding widget IDs in the new post-\nrestore environment.  The app should simply update the stored\nwidget IDs in its bookkeeping to the new values, and things are\noff and running.  The HOST_ID extra, as one might expect, is the\napp-defined host ID value of the particular host instance which\nhas just been restored.\n\nThe broadcasts are sent following the conclusion of the overall\nrestore pass.  This is because the restore might have occurred in a\ntightly restricted lifecycle environment without content providers\nor the package\u0027s custom Application class.  The _RESTORED broadcast,\nhowever, is always delivered into a normal application environment,\nso that the app can use its content provider etc as expected.\n\n*All* widget instances that were processed over the course of the\nsystem restore are indicated in the _RESTORED broadcast, even if\nthe backing provider or host is not yet installed.  The widget\nparticipant is responsible for understanding that these are\npromises that might be fulfilled later rather than necessarily\nreflecting the immediate presentable widget state.  (Remember\nthat following a cloud restore, apps may be installed piecemeal\nover a lengthy period of time.)  Telling the hosts up front\nabout all intended widget instances allows them to show placeholder\nUI or similarly useful information rather than surprising the user\nwith piecemeal unexpected appearances.\n\nThe AppWidgetProvider helper class has been updated to add a new\ncallback, onRestored(...), invoked when the _RESTORED broadcast\nis received.  The call to onRestored() is immediately followed by\nan invocation of onUpdate() for the affected widgets because\nthey will need to have their RemoteViews regenerated under the\nnew ID values.\n\nBug 10622506\nBug 10707117\n\nChange-Id: Ie0007cdf809600b880d91989c00c3c3b8a4f988b\n"
    },
    {
      "commit": "cab8617b8ccea3a99b1ee15e15915c512a10c738",
      "tree": "48d07ae2e7f69eadd4e7cd8c7d20c4ea6b37bda1",
      "parents": [
        "33fa09b1ffe8d14d146de4b2632103d831ff8988",
        "25df673b849de374cf1de40250dfd8a48b7ac28b"
      ],
      "author": {
        "name": "Jeff Brown",
        "email": "jeffbrown@google.com",
        "time": "Tue Feb 11 08:33:50 2014 +0000"
      },
      "committer": {
        "name": "Android Git Automerger",
        "email": "android-git-automerger@android.com",
        "time": "Tue Feb 11 08:33:50 2014 +0000"
      },
      "message": "am 25df673b: am 1b51c9cb: Merge \"Make SystemService constructor take a Context.\" into klp-modular-dev\n\n* commit \u002725df673b849de374cf1de40250dfd8a48b7ac28b\u0027:\n  Make SystemService constructor take a Context.\n"
    },
    {
      "commit": "b880d880c6cd989eacc28c365fc9a41d31900da1",
      "tree": "660d93bbe7f1b74aa9eac16ac69efe16f67f346e",
      "parents": [
        "d9f9da396b41f394991f676bc74dcfc59c7070a8"
      ],
      "author": {
        "name": "Jeff Brown",
        "email": "jeffbrown@google.com",
        "time": "Mon Feb 10 19:47:07 2014 -0800"
      },
      "committer": {
        "name": "Jeff Brown",
        "email": "jeffbrown@google.com",
        "time": "Mon Feb 10 20:01:43 2014 -0800"
      },
      "message": "Make SystemService constructor take a Context.\n\nThis change simplifies the process of initializing a SystemService\nby folding the onCreate() step back into the constructor.  It removes\nsome ambuiguity about what work should happen in the constructor and\nshould make it possible for services to retain most of their final\nfields after refactoring into the new pattern.\n\nChange-Id: I25f41af0321bc01898658ab44b369f9c5d16800b\n"
    },
    {
      "commit": "9f97de13359662c2709eed227b3fab2ce7d5dabc",
      "tree": "7eb16083cd5fd9d30999dfdead280311084c3e5a",
      "parents": [
        "2b1252ddd2650cb38918cb85d2a3711b2cfa8db5",
        "a5a93f559d337ad5b79716b05ea43707eb779dc8"
      ],
      "author": {
        "name": "Adam Lesinski",
        "email": "adamlesinski@google.com",
        "time": "Thu Feb 06 20:25:51 2014 +0000"
      },
      "committer": {
        "name": "Android Git Automerger",
        "email": "android-git-automerger@android.com",
        "time": "Thu Feb 06 20:25:51 2014 +0000"
      },
      "message": "am a5a93f55: am 7f416631: Merge \"Check feature bits before loading optional services\" into klp-modular-dev\n\n* commit \u0027a5a93f559d337ad5b79716b05ea43707eb779dc8\u0027:\n  Check feature bits before loading optional services\n"
    },
    {
      "commit": "898c13df7b9b12ff10062f3542593e12fbe0c119",
      "tree": "323bc4d7da06b48af2079f44c5f8d346d265e956",
      "parents": [
        "df88d73092c62a1a3cd2b2056ca63ae2e70cc238"
      ],
      "author": {
        "name": "Adam Lesinski",
        "email": "adamlesinski@google.com",
        "time": "Tue Jan 28 15:34:50 2014 -0800"
      },
      "committer": {
        "name": "Adam Lesinski",
        "email": "adamlesinski@google.com",
        "time": "Wed Feb 05 19:26:40 2014 +0000"
      },
      "message": "Check feature bits before loading optional services\n\nAt startup, we check with PackageManager whether a system service is\navailable before attempting to load it. A system service is available\nif its associated feature (similar to hardware features) is present.\nThis does not remove unavailable services from the compiled jar.\n\nChange-Id: I13571805083aa4e65519a74acb52efd17b9fb3d7"
    },
    {
      "commit": "e58a49e411327e26b6ad9939833f53c7fa5aef20",
      "tree": "a983bb17f76bcccef7cd94830525e7e7d02ce314",
      "parents": [
        "3c8a529b3c2a0bb1eceb3c1ec7afa58634ace044",
        "817ec49e7991d4cac50b2308cd7cf5f8641e1e29"
      ],
      "author": {
        "name": "Amith Yamasani",
        "email": "yamasani@google.com",
        "time": "Fri Dec 20 16:36:48 2013 -0800"
      },
      "committer": {
        "name": "Amith Yamasani",
        "email": "yamasani@google.com",
        "time": "Fri Dec 20 16:36:48 2013 -0800"
      },
      "message": "Merge commit \u0027817ec49e\u0027 into manualmerge\n\nConflicts:\n\tservices/print/java/com/android/server/print/PrintManagerService.java\n\nChange-Id: I1b9bf364ca50ee3c48f53d87ae0ce23e7f3c2bc2\n"
    },
    {
      "commit": "817ec49e7991d4cac50b2308cd7cf5f8641e1e29",
      "tree": "173ef0eb001119a0d093f0398769a3c0a0f5a369",
      "parents": [
        "9158825f9c41869689d6b1786d7c7aa8bdd524ce"
      ],
      "author": {
        "name": "Amith Yamasani",
        "email": "yamasani@google.com",
        "time": "Fri Dec 20 13:27:30 2013 -0800"
      },
      "committer": {
        "name": "Amith Yamasani",
        "email": "yamasani@google.com",
        "time": "Fri Dec 20 14:46:56 2013 -0800"
      },
      "message": "Wrap some services into a SystemService\n\nThese services can now be excluded by modifying the list of REQUIRED_SERVICES (TB renamed)\n\nChanged appwidget, devicepolicy, backup and print services.\n\nChange-Id: Id8e2855d5c045cd57bdb02dca9ed75172803bce7\n"
    },
    {
      "commit": "49782e46c0eb85a25ae2abcf80880c48dbab5aea",
      "tree": "9fab2a40c41004d78b7001dc766d85f61d24f582",
      "parents": [
        "4dace6f66d498c2d119adf265776aa83b28452af",
        "9158825f9c41869689d6b1786d7c7aa8bdd524ce"
      ],
      "author": {
        "name": "Amith Yamasani",
        "email": "yamasani@google.com",
        "time": "Thu Dec 19 23:30:35 2013 +0000"
      },
      "committer": {
        "name": "Android Git Automerger",
        "email": "android-git-automerger@android.com",
        "time": "Thu Dec 19 23:30:35 2013 +0000"
      },
      "message": "am 9158825f: Move some system services to separate directories\n\n* commit \u00279158825f9c41869689d6b1786d7c7aa8bdd524ce\u0027:\n  Move some system services to separate directories\n"
    },
    {
      "commit": "9158825f9c41869689d6b1786d7c7aa8bdd524ce",
      "tree": "f41944461539f0c70030668b4558296469c307d3",
      "parents": [
        "30d032928a294fbb6f385e9d0367a75b7bf2649b"
      ],
      "author": {
        "name": "Amith Yamasani",
        "email": "yamasani@google.com",
        "time": "Fri Nov 22 08:25:26 2013 -0800"
      },
      "committer": {
        "name": "Amith Yamasani",
        "email": "yamasani@google.com",
        "time": "Thu Dec 19 15:25:37 2013 -0800"
      },
      "message": "Move some system services to separate directories\n\nRefactored the directory structure so that services can be optionally\nexcluded. This is step 1. Will be followed by another change that makes\nit possible to remove services from the build.\n\nChange-Id: Ideacedfd34b5e213217ad3ff4ebb21c4a8e73f85\n"
    }
  ]
}
