)]}'
{
  "log": [
    {
      "commit": "3a44f3f1b446315ef894e01d2ab9b5388c2bd8c4",
      "tree": "2d640524ab41be6368e3a5e911efc1bc0cd1255a",
      "parents": [
        "89b77cded638cab56a002c28da4d09f144f7c6cb"
      ],
      "author": {
        "name": "Jeff Sharkey",
        "email": "jsharkey@android.com",
        "time": "Mon Apr 28 17:36:31 2014 -0700"
      },
      "committer": {
        "name": "Jeff Sharkey",
        "email": "jsharkey@android.com",
        "time": "Wed May 14 18:12:24 2014 -0700"
      },
      "message": "Initial support for split APKs, PackageInstaller.\n\nDefines a new PackageInstaller class that will be used for installing\nand upgrading packages.  An application desiring to install an\napplication creates a session, stages one or more package files in\nthat session, and then kicks off the install.\n\nPreviously, PackageManager would always make its own copy of a package\nbefore inspecting it, to ensure the data could be trusted.  This new\nsession concept allows the installer to write package data directly to\nits final resting place on disk, reducing disk I/O and footprint\nrequirements.  Writes are directed through an intermediate pipe\nto ensure we can prevent mutations once an install has been initiated.\nAlso uses fallocate() internally to support optimal ext4 block\nallocation using extents to reduce fragmentation.\n\nSessions are also the way we support installing multiple \"split\" APKs\nin a single atomic operation.  For a set of packages to form a valid\napplication, they must have exactly the same package name, version\ncode, and certificates.  A session can also be used to add a small\nhandful of splits to an application by inheriting existing packages\nwhen not performing a full install.\n\nAdd PackageParser support for extracting split names and certificates.\n\nBug: 14975160\nChange-Id: I23d1bf4fbeb9f99a8c83be0c458900a0f0d1bccc\n"
    },
    {
      "commit": "c79586ede6dcd6a167bc8360f058cb5cc655b33d",
      "tree": "06b4111aa0d02dabb8f4ee6e738ae4e17ee2a2fc",
      "parents": [
        "6fee7d4cf991a8d39bdefb782937250c87f60f25"
      ],
      "author": {
        "name": "Nicolas Prevot",
        "email": "nprevot@google.com",
        "time": "Tue May 06 12:47:57 2014 +0100"
      },
      "committer": {
        "name": "Nicolas Prevot",
        "email": "nprevot@google.com",
        "time": "Tue May 06 13:54:48 2014 +0100"
      },
      "message": "Cleaning code related to the forwarding intent filters.\n\nChecking for INTERACT_ACROSS_USERS_FULL\nAdding equivalent methods in the PackageManager\n\nChange-Id: Iaa1328fa666613a78e67ca669ea045144275e895\n"
    },
    {
      "commit": "68b9d97593d2ec79892813ab06f1b89c41de64b0",
      "tree": "90d86ee22188e6d44850508eecd1f6fdd940f9ba",
      "parents": [
        "ae3f7cca5235b9c3da080e7f8210a21ecf48285b",
        "9e99cab7d9a0ec2315140c21bb1958eb7ff76a09"
      ],
      "author": {
        "name": "Jose Lima",
        "email": "joselima@google.com",
        "time": "Fri Apr 11 19:01:21 2014 +0000"
      },
      "committer": {
        "name": "Android Git Automerger",
        "email": "android-git-automerger@android.com",
        "time": "Fri Apr 11 19:01:21 2014 +0000"
      },
      "message": "am 9e99cab7: am 970417c7: Added getLeanbackLaunchIntentForPackage()\n\n* commit \u00279e99cab7d9a0ec2315140c21bb1958eb7ff76a09\u0027:\n  Added getLeanbackLaunchIntentForPackage()\n"
    },
    {
      "commit": "970417c7d3e33ccbd6918e28d9bc5da24651f5b3",
      "tree": "749f3b107192ceec97ac39d534138f4298303928",
      "parents": [
        "3d9a3b589af661f980a7c03f208915b54521639f"
      ],
      "author": {
        "name": "Jose Lima",
        "email": "joselima@google.com",
        "time": "Thu Apr 10 10:42:19 2014 -0700"
      },
      "committer": {
        "name": "Jose Lima",
        "email": "joselima@google.com",
        "time": "Fri Apr 11 10:54:39 2014 -0700"
      },
      "message": "Added getLeanbackLaunchIntentForPackage()\n\nChange-Id: I23be3bfa59be812a915adc37e08fdf59be8ad90f\n"
    },
    {
      "commit": "f1977b4500e82b72ea6aa5c46d97406a20017caf",
      "tree": "9d6b4e63bc4b4c70eb9fbd5eb2cff9587ba45485",
      "parents": [
        "9ad8a5331ca5eb6390c702ec57952043b56170bf"
      ],
      "author": {
        "name": "Christopher Tate",
        "email": "ctate@google.com",
        "time": "Mon Mar 24 16:25:51 2014 -0700"
      },
      "committer": {
        "name": "Christopher Tate",
        "email": "ctate@google.com",
        "time": "Thu Mar 27 12:37:47 2014 -0700"
      },
      "message": "Expand install observer semantics\n\n...and now fail conservatively when two apps both attempt to define\nthe same permission.  Apps signed with the same certificate are\npermitted to redefine permissions.\n\nWe also finally have a (hidden) interface class for observing package\ninstallation so that we can now rev the interface without breaking\nexisting callers.\n\nBug 13551375\n\nChange-Id: Ifa4e59154dcccbb286ee46a35a6f25e4ad0f0f01\n"
    },
    {
      "commit": "7629a18a3f190368e6268d3f2827824905683268",
      "tree": "392b2bde32c959d39d7a37bc0f3c46d7fbe3a55b",
      "parents": [
        "ab8a501f255b272af887acb0e66eb71cdf24c755"
      ],
      "author": {
        "name": "Glenn Kasten",
        "email": "gkasten@google.com",
        "time": "Wed Mar 26 19:59:48 2014 +0000"
      },
      "committer": {
        "name": "Glenn Kasten",
        "email": "gkasten@google.com",
        "time": "Wed Mar 26 19:59:48 2014 +0000"
      },
      "message": "Revert \"Expand install observer semantics\"\n\nThis reverts commit ab8a501f255b272af887acb0e66eb71cdf24c755.\n\nChange-Id: I4ab4ae1a96efa2adf9d5a513793d8b84eef38b4e\n"
    },
    {
      "commit": "ab8a501f255b272af887acb0e66eb71cdf24c755",
      "tree": "4428aa0f60d4a2a309e8882d27fab9c5b20ad5c3",
      "parents": [
        "48a5dbd3cc5dd8a919983455757dc4c7b82500ab"
      ],
      "author": {
        "name": "Christopher Tate",
        "email": "ctate@google.com",
        "time": "Mon Mar 24 16:25:51 2014 -0700"
      },
      "committer": {
        "name": "Christopher Tate",
        "email": "ctate@google.com",
        "time": "Tue Mar 25 19:28:54 2014 -0700"
      },
      "message": "Expand install observer semantics\n\n...and now fail conservatively when two apps both attempt to define\nthe same permission.\n\nWe also finally have a (hidden) interface class for observing package\ninstallation so that we can now rev the interface without breaking\nexisting callers.\n\nBug 13551375\n\nChange-Id: I3a286d024a30e812ee4b098f345401df3c00e178\n"
    },
    {
      "commit": "92703e62c1dc88a410a32b05c2d44f391c193140",
      "tree": "c9f7cebda5c808598132dd832dbd91706f18e4dc",
      "parents": [
        "87dbf308fcde409a73921a6da95d93bcb5e8c106",
        "4882ddfae2301f53f0bb1478d2e6d5ddefd66848"
      ],
      "author": {
        "name": "Jose Lima",
        "email": "joselima@google.com",
        "time": "Thu Mar 13 21:26:48 2014 -0700"
      },
      "committer": {
        "name": "Jose Lima",
        "email": "joselima@google.com",
        "time": "Thu Mar 13 21:26:48 2014 -0700"
      },
      "message": "resolved conflicts for merge of 4882ddfa to master\n\nChange-Id: I179899697c148ac34a67b195e2dbd3df2f9138de\n"
    },
    {
      "commit": "f78e312db2aa7653ddc021e7dc58ce48f95ba047",
      "tree": "07941001d36f2239dc9e283c1eeec126282ab64f",
      "parents": [
        "d23d916e0fc573ccde8a622aaa42ccfae9d31f82"
      ],
      "author": {
        "name": "Jose Lima",
        "email": "joselima@google.com",
        "time": "Thu Mar 06 12:13:15 2014 -0800"
      },
      "committer": {
        "name": "Jose Lima",
        "email": "joselima@google.com",
        "time": "Wed Mar 12 18:07:38 2014 -0700"
      },
      "message": "Add banner attribute to app manifest\n\nChange-Id: I28b0dc6dee9623ec7534bb0e741b88f439b48c9f\n"
    },
    {
      "commit": "8a985d24ce9a38f40ed88fecbdcd0e75e3a68f44",
      "tree": "a71a241bf554a157a25d54dce66364d7881c3579",
      "parents": [
        "875e2101d71afe7e4acf10b061c942fbf7294775"
      ],
      "author": {
        "name": "John Spurlock",
        "email": "jspurlock@google.com",
        "time": "Tue Feb 25 09:40:05 2014 -0500"
      },
      "committer": {
        "name": "John Spurlock",
        "email": "jspurlock@google.com",
        "time": "Tue Feb 25 09:49:29 2014 -0500"
      },
      "message": "Tabs -\u003e spaces in frameworks/base.\n\nChange-Id: I5a84e8e93ac99b5ed0212b37bf66efa5e53864be\n"
    },
    {
      "commit": "ac6b332764264b1a940a3037434934582b9a9f68",
      "tree": "2060521aa89b5c38a0aab2dd4dd3e2c45f98ff37",
      "parents": [
        "f5749ac4efd154ff8cf4c8a7fdbb2c361e753edb",
        "e014eb6368f380545113fc115a6002da2d124726"
      ],
      "author": {
        "name": "quddusc",
        "email": "quddusc@google.com",
        "time": "Thu Jan 16 00:47:37 2014 +0000"
      },
      "committer": {
        "name": "Android Git Automerger",
        "email": "android-git-automerger@android.com",
        "time": "Thu Jan 16 00:47:37 2014 +0000"
      },
      "message": "am e014eb63: am fc6b772f: am bf6d0797: am 2f1c2e32: am 3126ce6e: Merge \"docs: Fixed typo in InstrumentationTestRunner page. Bug: 11386360\" into klp-docs\n\n* commit \u0027e014eb6368f380545113fc115a6002da2d124726\u0027:\n  docs: Fixed typo in InstrumentationTestRunner page. Bug: 11386360\n"
    },
    {
      "commit": "e8df6f4d53f150edca32bd8fcb7d576f837fe9e0",
      "tree": "50ed906a02c10663890825ae35034243f80abbaa",
      "parents": [
        "cbc5f5410ff7c2b91e13f80a930f22944ce2ed88"
      ],
      "author": {
        "name": "quddusc",
        "email": "quddusc@google.com",
        "time": "Mon Jan 06 16:28:03 2014 -0800"
      },
      "committer": {
        "name": "quddusc",
        "email": "quddusc@google.com",
        "time": "Tue Jan 14 12:47:34 2014 -0800"
      },
      "message": "docs: Fixed typo in InstrumentationTestRunner page.\nBug: 11386360\n\nChange-Id: I7626fe6fe1a22e223a8929ed3e5178c8df8966c9\n"
    },
    {
      "commit": "6090995951c6e2e4dcf38102f01793f8a94166e1",
      "tree": "37f32f4b269fc26a18e3249a18459a476c473266",
      "parents": [
        "266f48cc042dda828109eb135088cdb6f0f7c1d5"
      ],
      "author": {
        "name": "John Spurlock",
        "email": "jspurlock@google.com",
        "time": "Tue Nov 19 16:54:46 2013 -0500"
      },
      "committer": {
        "name": "John Spurlock",
        "email": "jspurlock@google.com",
        "time": "Wed Nov 20 11:31:47 2013 -0500"
      },
      "message": "Remove unused imports from frameworks/base.\n\nChange-Id: Ia1f99bd2c1105b0b0f70aa614f1f4a67b2840906\n"
    },
    {
      "commit": "1804e258fa8f8eb3d5d04e6e773c2f7cb026d9e0",
      "tree": "61f5f56c7a0506ea32280102defaf13c8fe9959e",
      "parents": [
        "e9293c1a1f9ac72b1ff1c47d41465eee39d44c1b"
      ],
      "author": {
        "name": "Mathew Inwood",
        "email": "mathewi@google.com",
        "time": "Tue Oct 22 17:39:37 2013 +0100"
      },
      "committer": {
        "name": "Mathew Inwood",
        "email": "mathewi@google.com",
        "time": "Tue Oct 22 17:39:37 2013 +0100"
      },
      "message": "Set mServiceCreated to false when onDestroy().\n\nIf tests call shutdownService() themselves, we should not call onDestroy()\nagain from tearDown(). Set mServiceCreated to false when we call onDestroy\nto prevent this.\n\nChange-Id: I618cb770cb43072273abdd2fdffd3390911203a1\n"
    },
    {
      "commit": "85f5f8132015d8a5043ea4413702420d0d157c9f",
      "tree": "08493f51fca4a3ebd4eaf584e8c0fa03b373be9c",
      "parents": [
        "ca25db0cb3d6b9686a42c9cb99d90dc095f20cd8"
      ],
      "author": {
        "name": "Jeff Sharkey",
        "email": "jsharkey@android.com",
        "time": "Mon Oct 07 10:16:12 2013 -0700"
      },
      "committer": {
        "name": "Jeff Sharkey",
        "email": "jsharkey@android.com",
        "time": "Mon Oct 07 14:19:13 2013 -0700"
      },
      "message": "Add \u003cintent-filter\u003e support to \u003cprovider\u003e.\n\nFor the new documents work, we\u0027re only interested in the subset of\nContentProviders that actually implement DocumentsContract.  Instead\nof returning all providers, add \u003cintent-filter\u003e support to make it\neasier to limit the set of returned ProviderInfo.\n\nDefine a well-known action for DocumentsProviders, and start using it\nwhen querying for roots.  Continue supporting the old \u003cmeta-data\u003e\napproach until all apps have been updated.\n\nBug: 8599233\nChange-Id: I05f049bba21311f5421738002f99ee214447c909\n"
    },
    {
      "commit": "a2a0850de8e7324db37e0595d5374bb9c9903461",
      "tree": "2c772f6c774385b6f254885ccb2c38dc3b7a23d4",
      "parents": [
        "9210bc85545f31973c957b5179e6a82d05f473c6"
      ],
      "author": {
        "name": "Christopher Tate",
        "email": "ctate@google.com",
        "time": "Thu Sep 05 16:38:58 2013 -0700"
      },
      "committer": {
        "name": "Christopher Tate",
        "email": "ctate@google.com",
        "time": "Fri Sep 13 12:16:00 2013 -0700"
      },
      "message": "Add hidden API for querying available \u0027home\u0027 activities\n\nTo support improved home-app selection UX in Settings.\n\nBug 9958444\n\nChange-Id: I106090784618bf7bea6fce28f4f9b9fb8480d310\n"
    },
    {
      "commit": "95d785346b4dae808a2d8f77356175e55a572d96",
      "tree": "821f4566c90d25c624d6c85539bfbb6a0142754c",
      "parents": [
        "ec7a6ea84578be91e04a54331ea4ca63e7fb69e1"
      ],
      "author": {
        "name": "Dianne Hackborn",
        "email": "hackbod@google.com",
        "time": "Wed Sep 11 09:51:14 2013 -0700"
      },
      "committer": {
        "name": "Dianne Hackborn",
        "email": "hackbod@google.com",
        "time": "Wed Sep 11 09:59:47 2013 -0700"
      },
      "message": "Fix issue #10688644: Java crash in com.android.phone:\n\njava.lang.SecurityException: Operation not allowed\n\nThere was a situation I wasn\u0027t taking into account -- components\ndeclared by the system has a special ability to run in the processes\nof other uids.  This means that if that code loaded into another\nprocess tries to do anything needing an app op verification, it will\nfail, because it will say it is calling as the system package name but\nit is not actually coming from the system uid.\n\nTo fix this, we add a new Context.getOpPackageName() to go along-side\ngetBasePackageName().  This is a special call for use by all app ops\nverification, which will be initialized with either the base package\nname, the actual package name, or now the default package name of the\nprocess if we are creating a context for system code being loaded into\na non-system process.\n\nI had to update all of the code doing app ops checks to switch to this\nmethod to get the calling package name.\n\nAlso improve the security exception throw to have a more descriptive\nerror message.\n\nChange-Id: Ic04f77b3938585b02fccabbc12d2f0dc62b9ef25\n"
    },
    {
      "commit": "38ed2a471a2291383821fb187bfa18450f0581c2",
      "tree": "31a7ac96e520056689aa78c91c2bb244233305a8",
      "parents": [
        "c8fb093a8970b78084f2b4505fc283ac9e24317b"
      ],
      "author": {
        "name": "Dianne Hackborn",
        "email": "hackbod@google.com",
        "time": "Fri Sep 06 16:17:22 2013 -0700"
      },
      "committer": {
        "name": "Dianne Hackborn",
        "email": "hackbod@google.com",
        "time": "Fri Sep 06 16:39:59 2013 -0700"
      },
      "message": "Work on issue #10130785: Restore silence and vibrate settings...\n\n...in settings \u003e sound\n\nAdd a new ContentProvider API to canonicalize URIs, so they can\nbe transported across backup/restore.\n\nChange-Id: Ie5af3662f6822a32310e49c7f1e1ff084986c56e\n"
    },
    {
      "commit": "bd3b902567b09379e1b62c60b3319ad82102efad",
      "tree": "c179f95abfe89e2029e099c1dba50dcefc6dfe7b",
      "parents": [
        "b4f6a01d51612b9e50dffd95905e9c9add79b5d8"
      ],
      "author": {
        "name": "Jeff Sharkey",
        "email": "jsharkey@android.com",
        "time": "Tue Aug 20 15:20:04 2013 -0700"
      },
      "committer": {
        "name": "Jeff Sharkey",
        "email": "jsharkey@android.com",
        "time": "Fri Aug 23 11:27:25 2013 -0700"
      },
      "message": "Add CancellationSignal support to file operations.\n\nSince ContentProvider file operations can end up doing substantial\nnetwork I/O before returning the file, allow clients to cancel their\nfile requests with CancellationSignal.\n\nIdeally this would only be needed for openFile(), but ContentResolver\nheavily relies on openAssetFile() and openTypedAssetFile() for common\ncases.\n\nAlso improve documentation to mention reliable ParcelFileDescriptors\nand encourage developers to move away from \"rw\" combination modes,\nsince they restrict provider flexibility.  Mention more about places\nwhere pipes or socket pairs could be returned.\n\nImprove DocumentsContract documentation.\n\nBug: 10329944\nChange-Id: I49b2825ea433eb051624c4da3b77612fe3ffc99c\n"
    },
    {
      "commit": "7f392defccfae54dc8169e5ad82c2616e0713c8e",
      "tree": "3d647e7c869d6cb60f08c3ddaabff33aa12d4906",
      "parents": [
        "1abdb7123025e52512b2ed7a518f8c754c35f50a"
      ],
      "author": {
        "name": "Jeff Sharkey",
        "email": "jsharkey@android.com",
        "time": "Sun Aug 11 17:42:17 2013 -0700"
      },
      "committer": {
        "name": "Jeff Sharkey",
        "email": "jsharkey@android.com",
        "time": "Sun Aug 11 17:42:17 2013 -0700"
      },
      "message": "Catch a few extra users of UserEnvironment.\n\nChange-Id: I3112773b72c329893e4118ef1c4f4087d899139e\n"
    },
    {
      "commit": "655d0e2029e6ae77a47e922dce4c4989818b8dd1",
      "tree": "67a9e2261c5e61f5a1b8f7f4f8cfcca5b433046c",
      "parents": [
        "bf991a8f426921c26e21e54e493781e1d5eb39ff"
      ],
      "author": {
        "name": "Amith Yamasani",
        "email": "yamasani@google.com",
        "time": "Wed Jun 12 14:19:10 2013 -0700"
      },
      "committer": {
        "name": "Amith Yamasani",
        "email": "yamasani@google.com",
        "time": "Tue Jun 25 16:03:55 2013 -0700"
      },
      "message": "Single-user restrictions\n\nIntroduces a new \"blocked\" state for each package. This is used to temporarily\ndisable an app via Settings-\u003eRestrictions.\n\nPIN creation and challenge activities for use by Settings and other apps. PIN\nis stored by the User Manager and it manages the interval for retry attempts\nacross reboots.\n\nChange-Id: I4915329d1f72399bbcaf93a9ca9c0d2e69d098dd\n"
    },
    {
      "commit": "48d0d1886731ff19ed3fb47a5997be5df0d1bba8",
      "tree": "5e0b5e9bc6899bf5c772a4ebab5b8df4015411cd",
      "parents": [
        "b1c5945a5598263fe63f3d665f575ba736eb26d2"
      ],
      "author": {
        "name": "Craig Mautner",
        "email": "cmautner@google.com",
        "time": "Tue Jun 11 07:53:06 2013 -0700"
      },
      "committer": {
        "name": "Craig Mautner",
        "email": "cmautner@google.com",
        "time": "Sat Jun 22 15:30:13 2013 -0700"
      },
      "message": "Add activity token to display system.\n\nFirst step in adding activity specific information to displays.\nReplace CompatibilityInfoHolder with DisplayAdjustmentsHolder that\nholds an activity token in addition to the CompatibilityInfo.\n\nChange-Id: Ie113cd8dd9c62e0b5311204e039a4829096bea68\n"
    },
    {
      "commit": "c87c92e079b9aff771ac0810fc86def81654dbda",
      "tree": "b2a7ddb67c64c18769e60c6453e4821bcf3cbd28",
      "parents": [
        "f27796cbbea78b01467a5a35f20be573815c1b5b"
      ],
      "author": {
        "name": "Dianne Hackborn",
        "email": "hackbod@google.com",
        "time": "Tue May 14 13:44:29 2013 -0700"
      },
      "committer": {
        "name": "Dianne Hackborn",
        "email": "hackbod@google.com",
        "time": "Wed May 15 15:39:47 2013 -0700"
      },
      "message": "Add API to retrieve cursor notification URI.\n\nChange-Id: I89f6c4d6ee6ef3675eff62ff6bca691b54c69f75\n"
    },
    {
      "commit": "334d9aebc28f7d5213b1671997488b3e3f118e29",
      "tree": "b6fc253e257b391ac5055162c042bd90711444ed",
      "parents": [
        "d0d209ed4d6280b6e1203eebe823f04f9db766c0"
      ],
      "author": {
        "name": "Dianne Hackborn",
        "email": "hackbod@google.com",
        "time": "Tue Feb 26 15:02:06 2013 -0800"
      },
      "committer": {
        "name": "Dianne Hackborn",
        "email": "hackbod@google.com",
        "time": "Tue Feb 26 16:16:14 2013 -0800"
      },
      "message": "New ContentProvider initialization for testing.\n\nUsing this turns off app ops checks.\n\nChange-Id: If29d4ca2fe9ddf1a1663d3a824b2f0afe7375862\n"
    },
    {
      "commit": "a75a883fe9ea1790803148f0a561473073e3f264",
      "tree": "a76a69d684a9643db3e22b72155aeb849c85a7f5",
      "parents": [
        "7a60c43d874bd047ea4b93b94c9b8771ea5739cc"
      ],
      "author": {
        "name": "Jim Miller",
        "email": "jaggies@google.com",
        "time": "Thu Feb 07 16:53:32 2013 -0800"
      },
      "committer": {
        "name": "Jim Miller",
        "email": "jaggies@google.com",
        "time": "Wed Feb 20 15:41:14 2013 -0800"
      },
      "message": "Add explicit userId to AppWidget binder calls\n\nKeyguard currently relies on being in the system process to grab the\ngiven user\u0027s widgets.  When we split keyguard into a new process,\nit will need to have access to user-specific info to instantiate a\nspecific user\u0027s widgets.  In order to accomplish this, we add an\nexplicit userid to each binder call as well as new permission\ncheck to allow keyguard access.\n\nThis also fixes a potential race condition of having an incorrect user id\ndue to an async call to change the user.  Every binder call now has a specific\nuser id. The user id is either the calling process user\u0027s id or an explicit\none passed by applications like keyguard. It is created once when an\nAppWidgetManager is instantiated and remains for the lifetime of the object.\n\nFixed bug where widgets sometimes didn\u0027t show up for secondary users.\n\nMoved permission check in AppWidgetService into getImplForUser()\n\nRefactored to use userid from context associated AppWidgetManager instance.\n\nClean up AppWidgetHost to use userId from Context.\n\nRemove redundant userId check in checkPermission since it\u0027s handled by\nActivityManager.handleIncomingUser()\n\nRemoved redundant userid check.\n\nUpload after rebase...\n\nChange-Id: Iae3e20f2b342c323bb58768b3d22051510f8268b\n"
    },
    {
      "commit": "f51f61269aacdfcf737b2c32b6b216c48ab61e65",
      "tree": "33839b315b97323df81f9638c8bb085241f017cc",
      "parents": [
        "b86147910877f1aae0733f05a9a93b91101e67e2"
      ],
      "author": {
        "name": "Dianne Hackborn",
        "email": "hackbod@google.com",
        "time": "Mon Feb 04 18:23:34 2013 -0800"
      },
      "committer": {
        "name": "Dianne Hackborn",
        "email": "hackbod@google.com",
        "time": "Tue Feb 05 11:56:12 2013 -0800"
      },
      "message": "App ops: new operations for SMS.\n\nImplementation required a new framework feature\nto associate an app op with a broadcast.\n\nChange-Id: I4ff41a52f7ad4ee8fd80cbf7b394f04d6c4315b3\n"
    },
    {
      "commit": "3a34d17412a5a304e39be1966a16627677d2136f",
      "tree": "6f4cb2c0fab6282f1c0318b05200487191cc1021",
      "parents": [
        "91488eed1745ea0426a73306f133e02d62580f1a"
      ],
      "author": {
        "name": "Svetoslav",
        "email": "svetoslavganov@google.com",
        "time": "Mon Jan 28 19:55:35 2013 -0800"
      },
      "committer": {
        "name": "Svetoslav",
        "email": "svetoslavganov@google.com",
        "time": "Mon Jan 28 19:55:35 2013 -0800"
      },
      "message": "Fixing the build\n\nChange-Id: Ief7654775307c829a60e65217ae821aa6801303c\n"
    },
    {
      "commit": "80943d8daa6ab31ab5c486d57aea406aa0730d58",
      "tree": "cb7738eff465941484aac3eb6ba15ba365aea576",
      "parents": [
        "64cae1a608c196c2bd1d9e7cfd2a1632fd0e5b83"
      ],
      "author": {
        "name": "Svetoslav Ganov",
        "email": "svetoslavganov@google.com",
        "time": "Wed Jan 02 10:25:37 2013 -0800"
      },
      "committer": {
        "name": "Svetoslav",
        "email": "svetoslavganov@google.com",
        "time": "Tue Jan 22 17:56:53 2013 -0800"
      },
      "message": "Adding UI test automation APIs.\n\nThis change adds APIs support for implementing UI tests. Such tests do\nnot rely on internal application structure and can span across application\nboundaries. UI automation APIs are encapsulated in the UiAutomation object\nthat is provided by an Instrumentation object. It is initialized by the\nsystem and can be used for both introspecting the screen and performing\ninteractions simulating a user. UI test are normal instrumentation tests\nand are executed on the device.\n\nUiAutomation uses the accessibility APIs to introspect the screen and\na special delegate object to perform privileged operations such as\ninjecting input events. Since instrumentation tests are invoked by a shell\ncommand, the shell program launching the tests creates a delegate object and\npasses it as an argument to started instrumentation. This delegate\nallows the APK that runs the tests to access some privileged operations\nprotected by a signature level permissions which are explicitly granted\nto the shell user.\n\nThe UiAutomation object also supports running tests in the legacy way\nwhere the tests are run as a Java shell program. This enables existing\nUiAutomator tests to keep working while the new ones should be implemented\nusing the new APIs. The UiAutomation object exposes lower level APIs which\nallow simulation of arbitrary user interactions and writing complete UI test\ncases. Clients, such as UiAutomator, are encouraged to implement higher-\nlevel APIs which minimize development effort and can be used as a helper\nlibrary by the test developer.\n\nThe benefit of this change is decoupling UiAutomator from the system\nsince the former was calling hidden APIs which required that it is\nbundled in the system image. This prevented UiAutomator from being\nevolved separately from the system. Also UiAutomator was creating\nadditional API surface in the system image. Another benefit of the new\ndesign is that now test cases have access to a context and can use\npublic platform APIs in addition to the UiAutomator ones. Further,\nthird-parties can develop their own higher level test APIs on top\nof the lower level ones exposes by UiAutomation.\n\nbug:8028258\n\nAlso this change adds the fully qualified resource name of the view\u0027s\nid in the emitted AccessibilityNodeInfo if a special flag is set while\nconfiguring the accessibility service. Also added is API for looking\nup node infos by this id. The id resource name is relatively more stable\ncompared to the generaed id number which may change from one build to\nanother. This API facilitate reuing the already defined ids for UI\nautomation.\n\nbug:7678973\n\nChange-Id: I589ad14790320dec8a33095953926c2a2dd0228b\n"
    },
    {
      "commit": "d8e1dbb6bc1fbaf4f2e38c3ba92ced94270deaac",
      "tree": "5f6d8b2c0e66c99289ae085cb6a6a3be168eb000",
      "parents": [
        "f25febf01453733e8bdd1ac241ecd9d3bcbef475"
      ],
      "author": {
        "name": "Dianne Hackborn",
        "email": "hackbod@google.com",
        "time": "Thu Jan 17 17:47:37 2013 -0800"
      },
      "committer": {
        "name": "Dianne Hackborn",
        "email": "hackbod@google.com",
        "time": "Fri Jan 18 13:02:26 2013 -0800"
      },
      "message": "Rework ParceledListSlice to be much easier to use.\n\nTake advantage of this to return better information about\npackages filtered by permissions -- include the permissions\nthey have in the requested array.\n\nAlso fix issue #8026793 (Contact picture shows default pic\nwhile searching for a contact in qsb) by using the base\npackage name of the Context when reporting the app name\nof an operation.  Otherwise you could make a resource-only\ncontext for another application and do calls through that\nand get reported as the wrong app.\n\nChange-Id: I5e0488bf773acea5a3d22f245641828e1a106fb8\n"
    },
    {
      "commit": "66a017b63461a22842b3678c9520f803d5ddadfc",
      "tree": "07a0d63d0b362628ecbf6083aadf726d0ae02636",
      "parents": [
        "54781207d31fd0fb33c6038b6999ba649fc488b2"
      ],
      "author": {
        "name": "Jeff Sharkey",
        "email": "jsharkey@android.com",
        "time": "Thu Jan 17 18:18:22 2013 -0800"
      },
      "committer": {
        "name": "Jeff Sharkey",
        "email": "jsharkey@android.com",
        "time": "Thu Jan 17 18:25:47 2013 -0800"
      },
      "message": "Always give ContentResolver a valid Context.\n\nAlso add MockContentResolver constructor to provide a Context, and\nmove to singleton ActivityThread, since there is only one inside\neach process.  This makes ActivityThread accessible from threads like\nInstrumentationThread.\n\nChange-Id: Ib8b18f1b9bba8820ff412d782a43511066eabf24\n"
    },
    {
      "commit": "2125dd57cc3c1c43da9793a2ee4bb8a7bf19f083",
      "tree": "fbe39f761d3b18199de133332bbabdaacc766f49",
      "parents": [
        "b2efa40bc37bc83410ef38652f708ea7ef6ab845",
        "e799175b6ba3aadd972f4b861758d675d1f93987"
      ],
      "author": {
        "name": "Dianne Hackborn",
        "email": "hackbod@google.com",
        "time": "Thu Jan 17 02:51:09 2013 +0000"
      },
      "committer": {
        "name": "Android (Google) Code Review",
        "email": "android-gerrit@google.com",
        "time": "Thu Jan 17 02:51:11 2013 +0000"
      },
      "message": "Merge \"AppOps: fix nested op tracking, new API to get apps using permissions.\""
    },
    {
      "commit": "e799175b6ba3aadd972f4b861758d675d1f93987",
      "tree": "2468fd79769eecff660a7c2d2163fb8ae0a11fca",
      "parents": [
        "35654b61e8fe7bc85afcb076ddbb590d51c5865f"
      ],
      "author": {
        "name": "Dianne Hackborn",
        "email": "hackbod@google.com",
        "time": "Wed Jan 16 17:56:46 2013 -0800"
      },
      "committer": {
        "name": "Dianne Hackborn",
        "email": "hackbod@google.com",
        "time": "Wed Jan 16 18:10:40 2013 -0800"
      },
      "message": "AppOps: fix nested op tracking, new API to get apps using\npermissions.\n\nChange-Id: I20c7bd58febc01d6911a90440867eaacd133c464\n"
    },
    {
      "commit": "d4fe37bee7c7433f32c23cee100c6e05ba0f3b2b",
      "tree": "76ea7e540dfa63062ae6fa6e4920dccb40c0aa14",
      "parents": [
        "d05efe727b61e321a6c2720166988d52629c050c",
        "27b89e6658a0d233a53f5d7ca20dc57fec82d955"
      ],
      "author": {
        "name": "Amith Yamasani",
        "email": "yamasani@google.com",
        "time": "Wed Jan 16 23:26:30 2013 +0000"
      },
      "committer": {
        "name": "Android (Google) Code Review",
        "email": "android-gerrit@google.com",
        "time": "Wed Jan 16 23:26:30 2013 +0000"
      },
      "message": "Merge \"Rename bindService to bindServiceAsUser to follow convention.\""
    },
    {
      "commit": "27b89e6658a0d233a53f5d7ca20dc57fec82d955",
      "tree": "3bc24a15905546e7ea38fb37994d67414349b3db",
      "parents": [
        "57b59e025bc10056daf42cd741b626843ff344f5"
      ],
      "author": {
        "name": "Amith Yamasani",
        "email": "yamasani@google.com",
        "time": "Wed Jan 16 12:30:11 2013 -0800"
      },
      "committer": {
        "name": "Amith Yamasani",
        "email": "yamasani@google.com",
        "time": "Wed Jan 16 12:30:11 2013 -0800"
      },
      "message": "Rename bindService to bindServiceAsUser to follow convention.\n\nThis is for the multi-user version of bindService, not the original.\n\nChange-Id: Ib2de35941196accf387b1a276a77e6f9af805ec0\n"
    },
    {
      "commit": "35654b61e8fe7bc85afcb076ddbb590d51c5865f",
      "tree": "0f42a90b4deaa0156d84df5d79b78cd6f2ac8807",
      "parents": [
        "8a8b047f2d28f6b2d728731a7e71eeaf16f89700"
      ],
      "author": {
        "name": "Dianne Hackborn",
        "email": "hackbod@google.com",
        "time": "Mon Jan 14 17:38:02 2013 -0800"
      },
      "committer": {
        "name": "Dianne Hackborn",
        "email": "hackbod@google.com",
        "time": "Wed Jan 16 12:11:01 2013 -0800"
      },
      "message": "More work on App Ops service.\n\nImplemented reading and writing state to retain information\nacross boots, API to retrieve state from it, improved location\nmanager interaction to monitor both coarse and fine access\nand only note operations when location data is being delivered\nback to app (not when it is just registering to get the data at\nsome time in the future).\n\nAlso implement tracking of read/write ops on contacts and the\ncall log.  This involved tweaking the content provider protocol\nto pass over the name of the calling package, and some\ninfrastructure in the ContentProvider transport to note incoming\ncalls with the app ops service.  The contacts provider and call\nlog provider turn this on for themselves.\n\nThis also implements some of the mechanics of being able to ignore\nincoming provider calls...  all that is left are some new APIs for\nthe real content provider implementation to be involved with\nproviding the correct behavior for query() (return an empty\ncursor with the right columns) and insert() (need to figure out\nwhat URI to return).\n\nChange-Id: I36ebbcd63dee58264a480f3d3786891ca7cbdb4c\n"
    },
    {
      "commit": "a06de0f29b58df9246779cc4bfd8f06f7205ddb6",
      "tree": "c8ecd3323c1112dd46a9470600eab5df022ca85c",
      "parents": [
        "2e9f65f978397d112dbfb134d374588515bb644a"
      ],
      "author": {
        "name": "Dianne Hackborn",
        "email": "hackbod@google.com",
        "time": "Tue Dec 11 16:34:47 2012 -0800"
      },
      "committer": {
        "name": "Dianne Hackborn",
        "email": "hackbod@google.com",
        "time": "Wed Jan 09 12:47:47 2013 -0800"
      },
      "message": "New \"app ops\" service.\n\nInitial implementation, tracking use of the vibrator, GPS,\nand location reports.\n\nAlso includes an update to battery stats to also keep track of\nvibrator usage (since I had to be in the vibrator code anyway\nto instrument it).\n\nThe service itself is only half-done.  Currently no API to\nretrieve the data (which once there will allow us to show you\nwhich apps are currently causing the GPS to run and who has\nrecently accessed your location), it doesn\u0027t persist its data\nlike it should, and no way to tell it to reject app requests\nfor various operations.\n\nBut hey, it\u0027s a start!\n\nChange-Id: I05b8d76cc4a4f7f37bc758c1701f51f9e0550e15\n"
    },
    {
      "commit": "7b172a49a90ea6784dbfe0002474f9d4fd4ace1a",
      "tree": "05db15b0b2b922fa644199d48d8769624bacbe34",
      "parents": [
        "e4d08f11c49ff4c554df80c12fa2b5b04831e2f5",
        "58ed5d748c0b9b64845975ef5844ad313de7c3f6"
      ],
      "author": {
        "name": "Kenny Root",
        "email": "kroot@google.com",
        "time": "Wed Nov 07 13:08:25 2012 -0800"
      },
      "committer": {
        "name": "Android Git Automerger",
        "email": "android-git-automerger@android.com",
        "time": "Wed Nov 07 13:08:25 2012 -0800"
      },
      "message": "am 58ed5d74: am 768d9e1a: Merge \"Correct executable bit for source files\"\n\n* commit \u002758ed5d748c0b9b64845975ef5844ad313de7c3f6\u0027:\n  Correct executable bit for source files\n"
    },
    {
      "commit": "58ed5d748c0b9b64845975ef5844ad313de7c3f6",
      "tree": "507af3879bc894eb854712a1fe6c0953805a895c",
      "parents": [
        "9197d170b770f2b87abd0cd0e13dcf71e5a181c2",
        "768d9e1a72ceee7d4a5f608776b87b62d6ce4a04"
      ],
      "author": {
        "name": "Kenny Root",
        "email": "kroot@google.com",
        "time": "Wed Nov 07 11:52:12 2012 -0800"
      },
      "committer": {
        "name": "Android Git Automerger",
        "email": "android-git-automerger@android.com",
        "time": "Wed Nov 07 11:52:12 2012 -0800"
      },
      "message": "am 768d9e1a: Merge \"Correct executable bit for source files\"\n\n* commit \u0027768d9e1a72ceee7d4a5f608776b87b62d6ce4a04\u0027:\n  Correct executable bit for source files\n"
    },
    {
      "commit": "3a084af2e90849aaa8beb3a610189e3399c63ea0",
      "tree": "ba4b87d227674fd68f9ea395649fde32778620f0",
      "parents": [
        "9d547d6934f64189e368c0b190fb4cf49c95a557"
      ],
      "author": {
        "name": "Kenny Root",
        "email": "kroot@google.com",
        "time": "Wed Nov 07 10:19:47 2012 -0800"
      },
      "committer": {
        "name": "Kenny Root",
        "email": "kroot@google.com",
        "time": "Wed Nov 07 10:27:31 2012 -0800"
      },
      "message": "Correct executable bit for source files\n\nMany media files and source code files were marked as executable in Git.\nRemove those.\n\nAlso a shell script and python script were not marked as executable.\n\nChange-Id: Ieb51bafb46c895a21d2e83696f5a901ba752b2c5\n"
    },
    {
      "commit": "41e173d4cb19a0eca95fe0d79dd05f501333b786",
      "tree": "0d99b2134eeebd10569e59f78ff900cb277f8225",
      "parents": [
        "f2e005aa240ce888735af1988932004660cbee71"
      ],
      "author": {
        "name": "Brett Chabot",
        "email": "brettchabot@google.com",
        "time": "Wed Oct 24 14:34:07 2012 -0700"
      },
      "committer": {
        "name": "Brett Chabot",
        "email": "brettchabot@google.com",
        "time": "Wed Oct 24 14:51:21 2012 -0700"
      },
      "message": "Remove erroneous override of package-private method.\n\nChange-Id: I8d473c1eb32f2513d01b3f7f14f0001286a6a9ca\n"
    },
    {
      "commit": "98edc951712823dbf5db2b7e9c203a0e98fc616b",
      "tree": "4f0e85972328438729323ab5c032d4b36ff90904",
      "parents": [
        "b1c4ab5c2afea1f0797ee397df6512366128d980"
      ],
      "author": {
        "name": "Amith Yamasani",
        "email": "yamasani@google.com",
        "time": "Tue Sep 25 14:09:27 2012 -0700"
      },
      "committer": {
        "name": "Amith Yamasani",
        "email": "yamasani@google.com",
        "time": "Tue Sep 25 15:45:27 2012 -0700"
      },
      "message": "Load resources for the correct user\n\nFor apps that are only installed on secondary users, the SystemUI is\nunable to see them by default. Added some methods to explicitly pass the\nuserId of the user the resources are requested for by the StatusBarIcon\n\nBug: 7214384\n\nAlso fix binding to remote views\n\nBug: 7192802\n\nChange-Id: I5d6c5f624aa37fb231f3467f9764c8d99077a91d\n"
    },
    {
      "commit": "11820f7386ce86fd89e9e6b49d9231dce6e1ed07",
      "tree": "9437ce9ba5b311f4b95c05121a9df6ec7f062379",
      "parents": [
        "b939e35274334d1f5e71a526efe8d235eb6d7387",
        "6d51571835737c7502a2e111ee9dc2527ebad984"
      ],
      "author": {
        "name": "Jeff Sharkey",
        "email": "jsharkey@android.com",
        "time": "Sun Sep 23 13:22:26 2012 -0700"
      },
      "committer": {
        "name": "Android (Google) Code Review",
        "email": "android-gerrit@google.com",
        "time": "Sun Sep 23 13:22:27 2012 -0700"
      },
      "message": "Merge \"Allow acquiring ContentProviders across users.\" into jb-mr1-dev"
    },
    {
      "commit": "6d51571835737c7502a2e111ee9dc2527ebad984",
      "tree": "8298f3a36bdfbdb95a4fdd52681f82e7f396d31b",
      "parents": [
        "08681adda06f4699f85838861170fbb062c9fdfe"
      ],
      "author": {
        "name": "Jeff Sharkey",
        "email": "jsharkey@android.com",
        "time": "Thu Sep 20 16:06:08 2012 -0700"
      },
      "committer": {
        "name": "Jeff Sharkey",
        "email": "jsharkey@android.com",
        "time": "Fri Sep 21 19:49:43 2012 -0700"
      },
      "message": "Allow acquiring ContentProviders across users.\n\nOtherwise services like SystemUI will always open content://-style\nUris as USER_OWNER.  Surfaces through createPackageContextAsUser()\nwhich points all ContentResolver operations towards a given user.\n\nStart using in RemoteViews, so that Notifications correctly resolve\nimage Uris to the sending user.  Also add user support for \"content\"\nshell tool.\n\nBug: 7202982\nChange-Id: I8cb7fb8a812e825bb0b5833799dba87055ff8699\n"
    },
    {
      "commit": "58d37b55bd228032355360ea3303e46a804e0516",
      "tree": "7a931f0e6054ef5835f2935dd8d2faa52a93ff53",
      "parents": [
        "059aedf808c8b9b3da1457eef52f3d477878d50b"
      ],
      "author": {
        "name": "Svetoslav Ganov",
        "email": "svetoslavganov@google.com",
        "time": "Tue Sep 18 12:04:19 2012 -0700"
      },
      "committer": {
        "name": "Svetoslav Ganov",
        "email": "svetoslavganov@google.com",
        "time": "Fri Sep 21 16:48:07 2012 -0700"
      },
      "message": "Multi-user support for the accessibility layer.\n\n1. This change converts the accessibility manager service to\n   maintain a state per user. When the user changes the services\n   for the user that is going away are disconnected, the local\n   accessibility managers in the processes for this user are\n   disabled, the state is swapped with the new user\u0027s one, and\n   the new user state is refreshed.\n\n   This change updates all calls into the system to use their\n   user specific versions when applicable. For example, regisetring\n   content observers, package monitors, calls into other system\n   services, etc.\n\n   There are some components that are shared across users such\n   as UI created by the system process and the SystemUI package.\n   Such components are managed as a global state shared across\n   all users and are updated accordingly on a user switch. Since\n   the SystemUI is running in a normal app process this change\n   adds hidden APIs on the local window manager to allow the\n   SystemUI to notify the accessibility layer that it will run\n   accross users.\n\n   Calls to AccessibiltyManager\u0027s isEnabled(), isTouchExplorationEnabled()\n   and sendAccessibilityEvent return false or a are a nop for a\n   background user sice he should not send accessibility events,\n   and should not perform touch exploration.\n\n   Update the internal accessibility tests due to changes in the\n   AccessibilityManager.\n\n   This change also fixes several issues that were encountered\n   such as calling out the accessibility manager service with a\n   lock held.\n\n   Removed some incorrect debugging code from the TouchExplorer\n   that was leading to a system crash.\n\nbug:6967373\n\nChange-Id: I2cf32ffdee1d827a8197ae4ce717dc0ff798b259\n"
    },
    {
      "commit": "151ec4c9f8ca34625733730a4551a23eb97cda23",
      "tree": "9a0ab8bed19904dce51ae3d23f5ff72c0581b7e2",
      "parents": [
        "4aacf93d40b4be82aa35bf164d6fd6536c8b2a50"
      ],
      "author": {
        "name": "Amith Yamasani",
        "email": "yamasani@google.com",
        "time": "Fri Sep 07 19:25:16 2012 -0700"
      },
      "committer": {
        "name": "Amith Yamasani",
        "email": "yamasani@google.com",
        "time": "Sat Sep 08 19:14:00 2012 -0700"
      },
      "message": "More multi-user methods in PM\n\npm can list installed packages by user now.\n\nBug: 6926465\n\nChange-Id: I822311bfd6e7e2d6fb315fc484739fbf953c9bb6\n"
    },
    {
      "commit": "20e809870d8ac1e5b848f2daf51b2272ef89bdfc",
      "tree": "c863b6c684d1d3b21752880bc9f52bd749545d01",
      "parents": [
        "2701f325a6d4acd920637d2ff6fd6972a9cf836b"
      ],
      "author": {
        "name": "Dianne Hackborn",
        "email": "hackbod@google.com",
        "time": "Fri Aug 31 19:00:44 2012 -0700"
      },
      "committer": {
        "name": "Dianne Hackborn",
        "email": "hackbod@google.com",
        "time": "Tue Sep 04 10:39:21 2012 -0700"
      },
      "message": "Add registering for explicit users.\n\nNew API to register as an explicit user, which allows you to\nalso select ALL to see broadcasts for all users.\n\nNew BroadcastReceiver API to find out which user the broadcast\nwas sent to.\n\nUse this in app widget service to handle per-user package broadcasts\nand boot completed broadcasts correctly.\n\nChange-Id: Ibbe28993bd4aa93900c79e412026c27863019eb8\n"
    },
    {
      "commit": "a492c3a7b2c18426fd0cb4d017eacbc368195dc5",
      "tree": "67744a8d91519d997cb761a697600041d74165fa",
      "parents": [
        "00453e7a0182b50cf01e65c97650b526284fe084"
      ],
      "author": {
        "name": "Jeff Brown",
        "email": "jeffbrown@google.com",
        "time": "Thu Aug 23 19:48:44 2012 -0700"
      },
      "committer": {
        "name": "Jeff Brown",
        "email": "jeffbrown@google.com",
        "time": "Fri Aug 31 15:42:45 2012 -0700"
      },
      "message": "Initial draft of high-level multi-display APIs.\n\nThis patch introduces the ability to create a Context that\nis bound to a Display.  The context gets its configuration and\nmetrics from that display and is able to provide a WindowManager\nthat is bound to the display.\n\nTo make it easier to use, we also add a new kind of Dialog\ncalled a Presentation.  Presentation takes care of setting\nup the context as needed and watches for significant changes\nin the display configuration.  If the display is removed,\nthen the presentation simply dismisses itself.\n\nChange-Id: Idc54b4ec84b1ff91505cfb78910cf8cd09696d7d\n"
    },
    {
      "commit": "f203aeef993b0f4ce65c9630d06bbd50a504e89f",
      "tree": "f1624ae664c7f882e9f320dadbab4eea52b6a4ad",
      "parents": [
        "b2dd4e87ae8ac6a0402b7a0ed37201f27bcb1b9c"
      ],
      "author": {
        "name": "Amith Yamasani",
        "email": "yamasani@google.com",
        "time": "Wed Aug 29 18:41:53 2012 -0700"
      },
      "committer": {
        "name": "Amith Yamasani",
        "email": "yamasani@google.com",
        "time": "Thu Aug 30 16:08:23 2012 -0700"
      },
      "message": "Enforce permissions for calls with specified userId\n\nFix a couple of places where incorrect userIds were being passed in.\n\nChange-Id: I398c676e0488ff7e584be96e96c8b32652134238\n"
    },
    {
      "commit": "5ac72a29593ab9a20337a2225df52bdf4754be02",
      "tree": "dc5310e556b3662cb5f097b30e700a26d50a4db5",
      "parents": [
        "e217ee4d7a8223289a1af7363627c69956c46d41"
      ],
      "author": {
        "name": "Dianne Hackborn",
        "email": "hackbod@google.com",
        "time": "Wed Aug 29 18:32:08 2012 -0700"
      },
      "committer": {
        "name": "Dianne Hackborn",
        "email": "hackbod@google.com",
        "time": "Thu Aug 30 14:33:22 2012 -0700"
      },
      "message": "Improve multi-user broadcasts.\n\nYou can now use ALL and CURRENT when sending broadcasts, to specify\nwhere the broadcast goes.\n\nSticky broadcasts are now correctly separated per user, and registered\nreceivers are filtered based on the requested target user.\n\nNew Context APIs for more kinds of sending broadcasts as users.\n\nUpdating a bunch of system code that sends broadcasts to explicitly\nspecify which user the broadcast goes to.\n\nMade a single version of the code for interpreting the requested\ntarget user ID that all entries to activity manager (start activity,\nsend broadcast, start service) use.\n\nChange-Id: Ie29f02dd5242ef8c8fa56c54593a315cd2574e1c\n"
    },
    {
      "commit": "7767eac3232ba2fb9828766813cdb481d6a97584",
      "tree": "41cc717fb9f11190e9da3dc12d61faf23a22861d",
      "parents": [
        "1552586283f329253edc4786a6cf40c5bb69ea36"
      ],
      "author": {
        "name": "Dianne Hackborn",
        "email": "hackbod@google.com",
        "time": "Thu Aug 23 18:25:40 2012 -0700"
      },
      "committer": {
        "name": "Dianne Hackborn",
        "email": "hackbod@google.com",
        "time": "Fri Aug 24 13:53:13 2012 -0700"
      },
      "message": "Keep track of whether an app is installed for each user.\n\nThis add a new per-user state for an app, indicating whether\nit is installed for that user.\n\nAll system apps are always installed for all users (we still\nuse disable to \"uninstall\" them).\n\nNow when you call into the package manager to install an app,\nit will only install the app for that user unless you supply\na flag saying to install for all users.  Only being installed\nfor the user is just the normal install state, but all other\nusers have marked in their state for that app that it is not\ninstalled.\n\nWhen you call the package manager APIs for information about\napps, uninstalled apps are treated as really being not visible\n(somewhat more-so than disabled apps), unless you use the\nGET_UNINSTALLED_PACKAGES flag.\n\nIf another user calls to install an app that is already installed,\njust not for them, then the normal install process takes place\nbut in addition that user\u0027s installed state is toggled on.\n\nThe package manager will not send PACKAGE_ADDED, PACKAGE_REMOVED,\nPACKAGE_REPLACED etc broadcasts to users who don\u0027t have a package\ninstalled or not being involved in a change in the install state.\nThere are a few things that are not quite right with this -- for\nexample if you go through a full install (with a new apk) of an\napp for one user who doesn\u0027t have it already installed, you will\nstill get the PACKAGED_REPLACED messages even though this is\ntechnically the first install for your user.  I\u0027m not sure how\nmuch of an issue this is.\n\nWhen you call the existing API to uninstall an app, this toggles\nthe installed state of the app for that user to be off.  Only if\nthat is the last user user that has the app uinstalled will it\nactually be removed from the device.  Again there is a new flag\nyou can pass in to force the app to be uninstalled for all users.\n\nAlso fixed issues with cleaning external storage of apps, which\nwas not dealing with multiple users.  We now keep track of cleaning\neach user for each package.\n\nChange-Id: I00e66452b149defc08c5e0183fa673f532465ed5\n"
    },
    {
      "commit": "d9ef3e5495db1c46bcfcc1a2d4386af8db6deb0c",
      "tree": "9b78fc4eb2e237ee7ad49eb70cc558f871ff9a48",
      "parents": [
        "bb121d569cd6bc7bf4018ef12756247009988863"
      ],
      "author": {
        "name": "rich cannings",
        "email": "richc@google.com",
        "time": "Wed Aug 22 14:28:05 2012 -0700"
      },
      "committer": {
        "name": "rich cannings",
        "email": "richc@google.com",
        "time": "Thu Aug 23 15:39:02 2012 -0700"
      },
      "message": "Allow verifiers to extend timeout\n\nCreate a new verifier API to extend the timeout for a giving package,\nincluding the resulting action (allow or deny) upon the timeout occuring.\n\nBug: 6901038\nChange-Id: I351f7944327f863aff1d7dd1227be74652fa1511\n"
    },
    {
      "commit": "0c3804950236fe170ebf6cc7a5f1e3e305b8f315",
      "tree": "832ea4ab2c17fe568df894aa3ed7438a01d97533",
      "parents": [
        "a5d5d608ccd885d8328879dde782a8cc93b7cf4f"
      ],
      "author": {
        "name": "Dianne Hackborn",
        "email": "hackbod@google.com",
        "time": "Mon Aug 20 17:23:30 2012 -0700"
      },
      "committer": {
        "name": "Dianne Hackborn",
        "email": "hackbod@google.com",
        "time": "Tue Aug 21 10:34:20 2012 -0700"
      },
      "message": "Improve multi-user app management.\n\nIntroduce API to get per-user storage information, keep track\nof services associated with users, and various small cleanup.\n\nChange-Id: I5d4e784e7ff3cccfed627d66a090d2f464202634\n"
    },
    {
      "commit": "706e8ba26bf0de19ad5f736516dae40c4c88c2d7",
      "tree": "2c45b61e1420f9a7442de8517b1eca6802d507c0",
      "parents": [
        "99de2459e200e0c86d55d5eee7ea000fd030990f"
      ],
      "author": {
        "name": "rich cannings",
        "email": "richc@google.com",
        "time": "Mon Aug 20 13:20:14 2012 -0700"
      },
      "committer": {
        "name": "rich cannings",
        "email": "richc@google.com",
        "time": "Mon Aug 20 13:20:14 2012 -0700"
      },
      "message": "Pass URLs to package verifiers\n\nThis change passes the originating URL and accompanied referrer to\npackage verifiers, when available.\n\nBug: 6544677\nChange-Id: I9ebc71bc13f549bd88267e444816151a99bda000\n"
    },
    {
      "commit": "98365d7663cbd82979a5700faf0050220b01084d",
      "tree": "8a4ff3e0a8afd814ed29609b26aa1c6ade2367f6",
      "parents": [
        "848c2dc93b6795e171f3dd6f64ea0be65e2762ca"
      ],
      "author": {
        "name": "Jeff Brown",
        "email": "jeffbrown@google.com",
        "time": "Sun Aug 19 20:30:52 2012 -0700"
      },
      "committer": {
        "name": "Jeff Brown",
        "email": "jeffbrown@google.com",
        "time": "Sun Aug 19 22:42:08 2012 -0700"
      },
      "message": "Refactor for multi-display support.\n\nSplit WindowManagerImpl into two parts, the WindowManager\ninterface implementation remains where it is but the global\ncommunications with the window manager are now handled by\nthe WindowManagerGlobal class.  This change greatly simplifies\nthe challenge of having separate WindowManager instances\nfor each Context.\n\nRemoved WindowManagerImpl.getDefault().  This represents the\nbulk of this change.  Most of the usages of this method were\neither to perform global functions (now handled by WindowManagerGlobal)\nor to obtain the default display (now handled by DisplayManager).\n\nExplicitly associate each new window with a display and make\nthe Display object available to the View hierarchy.\n\nAdd stubs for some new display manager API features.\n\nStart to split apart the concepts of display id and layer stack.\nsince they operate at different layers of abstraction.\nWhile it\u0027s true that each logical display uniquely corresponds to a\nsurface flinger layer stack, it is not necessarily the case that\nthey must use the same ids.  Added Display.getLayerStack()\nand started using it in places where it was relatively easy to do.\n\nChange-Id: I29ed909114dec86807c4d3a5059c3fa0358bea61\n"
    },
    {
      "commit": "79af1dd54c16cde063152922b42c96d72ae9eca8",
      "tree": "142abf0037d20841712e88d65febcbbd92dd5561",
      "parents": [
        "f1b995f9d049cb5c7225b3b17f09369237a83ca2"
      ],
      "author": {
        "name": "Dianne Hackborn",
        "email": "hackbod@google.com",
        "time": "Thu Aug 16 16:42:52 2012 -0700"
      },
      "committer": {
        "name": "Dianne Hackborn",
        "email": "hackbod@google.com",
        "time": "Fri Aug 17 10:36:08 2012 -0700"
      },
      "message": "Switch public APIs to use new UserHandle class for identifying users.\n\nGets rid of \"yet another integer\" confusion.\n\nChange-Id: Id07ea7307aea7c62f0087c6663a1f1c08e2e5dee\n"
    },
    {
      "commit": "756220bd1912535840388a6743830d2e59ad4964",
      "tree": "ee97c666d4bb1f015fd3e89463af09c712ce47e4",
      "parents": [
        "863b19bc8fcfa436011781b67a237fcce3cb703a"
      ],
      "author": {
        "name": "Dianne Hackborn",
        "email": "hackbod@google.com",
        "time": "Tue Aug 14 16:45:30 2012 -0700"
      },
      "committer": {
        "name": "Dianne Hackborn",
        "email": "hackbod@google.com",
        "time": "Tue Aug 14 16:51:38 2012 -0700"
      },
      "message": "Add API to create new contexts with custom configurations.\n\nThis allows you to, say, make a Context whose configuration\nis set to a different density than the actual density of the device.\n\nThe main API is Context.createConfigurationContext().  There is\nalso a new API on ContextThemeWrapper that allows you to apply\nan override context before its resources are retrieved, which\naddresses some feature requests from developers to be able to\ncustomize the context their app is running in.\n\nChange-Id: I88364986660088521e24b567e2fda22fb7042819\n"
    },
    {
      "commit": "258848d2ae04f447ff1c18023fa76b139fcc0862",
      "tree": "8736421f4007d81206d0f0ea8b32a2013508976a",
      "parents": [
        "75f0fac91bd7fa67fa76cfdd4e163b9f35be0432"
      ],
      "author": {
        "name": "Amith Yamasani",
        "email": "yamasani@google.com",
        "time": "Fri Aug 10 17:06:33 2012 -0700"
      },
      "committer": {
        "name": "Amith Yamasani",
        "email": "yamasani@google.com",
        "time": "Sat Aug 11 18:24:07 2012 -0700"
      },
      "message": "User Manager service to manage users and query user details\n\nMoved a bunch of methods from PackageManager to UserManager.\n\nFix launching of activities from recents to correct user.\n\nGuest creation APIs\n\nChange-Id: I0733405e6eb2829675665e225c759d6baa2b708f\n"
    },
    {
      "commit": "a56d9cecee8a34e0554770ac6253dd3a76b9199c",
      "tree": "3e617e7c34c9dafec25b373af7cd392154881b19",
      "parents": [
        "f007bd3cf8cacd75287781c1bb37fe4167c79cba",
        "e1d7c711df3e3a2d2f195457882aa4ddb5626167"
      ],
      "author": {
        "name": "Rich Cannings",
        "email": "richc@google.com",
        "time": "Wed Aug 08 13:50:55 2012 -0700"
      },
      "committer": {
        "name": "Android (Google) Code Review",
        "email": "android-gerrit@google.com",
        "time": "Wed Aug 08 13:50:56 2012 -0700"
      },
      "message": "Merge \"Revert \"Pass URLs to package verifiers\"\" into jb-mr1-dev"
    },
    {
      "commit": "e1d7c711df3e3a2d2f195457882aa4ddb5626167",
      "tree": "d27b6e508c1bdbd29028034471ee46acfe5d6cf8",
      "parents": [
        "24713907fe4632d263aea82f7a35c8fb08918a09"
      ],
      "author": {
        "name": "Rich Cannings",
        "email": "richc@google.com",
        "time": "Wed Aug 08 12:46:06 2012 -0700"
      },
      "committer": {
        "name": "Android (Google) Code Review",
        "email": "android-gerrit@google.com",
        "time": "Wed Aug 08 12:46:06 2012 -0700"
      },
      "message": "Revert \"Pass URLs to package verifiers\"\n\nThis reverts commit 24713907fe4632d263aea82f7a35c8fb08918a09\n\nChange-Id: Ie04ba73475b813635c4a74915c45e83250801b6b\n"
    },
    {
      "commit": "537915828b45693e846a126292e026c5b4f05152",
      "tree": "6c47dca99eda5792f1fc006e0f20088ad4048db1",
      "parents": [
        "ec0feefd4422db1151aee722732d8c9528f6dfa8",
        "7d19e0242faac8017033dabb872cdf1542fa184c"
      ],
      "author": {
        "name": "Dianne Hackborn",
        "email": "hackbod@google.com",
        "time": "Wed Aug 08 10:22:48 2012 -0700"
      },
      "committer": {
        "name": "Android (Google) Code Review",
        "email": "android-gerrit@google.com",
        "time": "Wed Aug 08 10:22:49 2012 -0700"
      },
      "message": "Merge \"More mult-user API work.\" into jb-mr1-dev"
    },
    {
      "commit": "7d19e0242faac8017033dabb872cdf1542fa184c",
      "tree": "ab12d3c6597bc42bc7c0dca10ded546192c5c249",
      "parents": [
        "03ad783c5078c7bd487e47bb2a2af67dfbe89f1a"
      ],
      "author": {
        "name": "Dianne Hackborn",
        "email": "hackbod@google.com",
        "time": "Tue Aug 07 19:12:33 2012 -0700"
      },
      "committer": {
        "name": "Dianne Hackborn",
        "email": "hackbod@google.com",
        "time": "Tue Aug 07 19:19:22 2012 -0700"
      },
      "message": "More mult-user API work.\n\n- You can now use android:singleUser with receivers and providers.\n- New API to send ordered broadcasts as a user.\n- New Process.myUserHandle() API.\n\nFor now I am trying out \"user handle\" as the name for the numbers\nrepresenting users.\n\nChange-Id: I754c713ab172494bb4251bc7a37a17324a2e235e\n"
    },
    {
      "commit": "b53e9b42c302a5c5ccd837aece6bfffdf0cb5bf2",
      "tree": "78387317c5d39b36b1fabce81eacde277adcd109",
      "parents": [
        "4224790ffac80b7777ebeeed7474c3111a7add49",
        "a8583c2934836572632bb82d1fe7607392d4ca72"
      ],
      "author": {
        "name": "Scott Main",
        "email": "smain@google.com",
        "time": "Tue Aug 07 14:05:28 2012 -0700"
      },
      "committer": {
        "name": "Android Git Automerger",
        "email": "android-git-automerger@android.com",
        "time": "Tue Aug 07 14:05:28 2012 -0700"
      },
      "message": "am a8583c29: am 40eee61e: docs: fix broken links and update sitemap text file\n\n* commit \u0027a8583c2934836572632bb82d1fe7607392d4ca72\u0027:\n  docs: fix broken links and update sitemap text file\n"
    },
    {
      "commit": "40eee61e25fb887f5267686f8a0a7c5bd9f95769",
      "tree": "8ba762d17f536f0914f9fe13311be8838ff44834",
      "parents": [
        "ea8375617e0d9099dc156a12989277d320eab1ca"
      ],
      "author": {
        "name": "Scott Main",
        "email": "smain@google.com",
        "time": "Mon Aug 06 17:48:37 2012 -0700"
      },
      "committer": {
        "name": "Scott Main",
        "email": "smain@google.com",
        "time": "Mon Aug 06 18:04:23 2012 -0700"
      },
      "message": "docs: fix broken links\nand update sitemap text file\n\nChange-Id: I6982c3f029c46135ae856b8484d906c2882bad3a\n"
    },
    {
      "commit": "329465c6b2407ee086a171cac1a3581f83dbb048",
      "tree": "0d69eee745692b133e3f2c955561c0e09807ffb5",
      "parents": [
        "478923885da8fac0c1e0a8b7d85b98d1988504bc",
        "b4163a6e12ee7100c758c6d3d062ade1f2843fce"
      ],
      "author": {
        "name": "Dianne Hackborn",
        "email": "hackbod@google.com",
        "time": "Thu Aug 02 19:14:39 2012 -0700"
      },
      "committer": {
        "name": "Android (Google) Code Review",
        "email": "android-gerrit@google.com",
        "time": "Thu Aug 02 19:14:39 2012 -0700"
      },
      "message": "Merge \"Add APIs for interacting across users.\" into jb-mr1-dev"
    },
    {
      "commit": "b4163a6e12ee7100c758c6d3d062ade1f2843fce",
      "tree": "2948e83dec184906f2c44ee332431f219b78359d",
      "parents": [
        "b1758cf8cd007bfffb3d8adceca25f3b0c82bd77"
      ],
      "author": {
        "name": "Dianne Hackborn",
        "email": "hackbod@google.com",
        "time": "Thu Aug 02 18:31:26 2012 -0700"
      },
      "committer": {
        "name": "Dianne Hackborn",
        "email": "hackbod@google.com",
        "time": "Thu Aug 02 19:07:57 2012 -0700"
      },
      "message": "Add APIs for interacting across users.\n\n- Expose the existing Context.sendBroadcast() as\n  Context.sendBroadcastAsUser().\n- Add new android:singleUser attribute for services.\n- Add new INTERACT_ACROSS_USERS_FULL permission for full\n  system-level access to cross-user interface (allows\n  sendBroadcastAsUser() to send to any receiver).\n- Add new INTERACT_ACROSS_USERS_FULL permission for\n  more restricted cross-user interaction: this is required\n  for android:singleUser, and allows you to use\n  sendBroadcastAsUser() but only to send to your own\n  receivers.\n\nChange-Id: I0de88f6718e9505f4de72e3f45d29c0f503b76e9\n"
    },
    {
      "commit": "24713907fe4632d263aea82f7a35c8fb08918a09",
      "tree": "fbf80caed2388c579d64b20b86b9b9f2586b1640",
      "parents": [
        "26ea2e5df58edfd14717c86854f6bb99975b6a77"
      ],
      "author": {
        "name": "rich cannings",
        "email": "richc@google.com",
        "time": "Thu Jul 26 14:07:53 2012 -0700"
      },
      "committer": {
        "name": "rich cannings",
        "email": "richc@google.com",
        "time": "Thu Aug 02 11:26:47 2012 -0700"
      },
      "message": "Pass URLs to package verifiers\n\nThis change passes the originating URL and accompanied referrer to\npackage verifiers, when available.\n\nBug: 6544677\nChange-Id: If9ff6663ad7f3426b7aea2aceb1413b689788138\n"
    },
    {
      "commit": "54da5b5d683e27924eb6573f544616bc217c6c37",
      "tree": "4119fcb5207d036ed1b5e19d7edc7cdf8e289781",
      "parents": [
        "08b7e78597b06b3801d909c9e9ca1538ed9fc355",
        "dd4448ef6807f096cdfdf632857baefd7cbc85ec"
      ],
      "author": {
        "name": "Scott Main",
        "email": "smain@google.com",
        "time": "Wed Jul 25 15:05:39 2012 -0700"
      },
      "committer": {
        "name": "Android Git Automerger",
        "email": "android-git-automerger@android.com",
        "time": "Wed Jul 25 15:05:39 2012 -0700"
      },
      "message": "am dd4448ef: am 32189e26: Merge \"misc doc bug fixes\" into jb-dev\n\n* commit \u0027dd4448ef6807f096cdfdf632857baefd7cbc85ec\u0027:\n  misc doc bug fixes\n"
    },
    {
      "commit": "ddd88726a247e4100cb62b3dc9d0887ca2ae2ec4",
      "tree": "30361d5e73963eaea11100a01fbc7f6e69daae90",
      "parents": [
        "75bea2e8d35044233ba892bedf102ed08406d653",
        "71930dd77e4dc6f6be5c648019d2ab0da5f0584c"
      ],
      "author": {
        "name": "Jeff Smith",
        "email": "whydoubt@yahoo.com",
        "time": "Wed Jul 25 15:05:23 2012 -0700"
      },
      "committer": {
        "name": "Android Git Automerger",
        "email": "android-git-automerger@android.com",
        "time": "Wed Jul 25 15:05:23 2012 -0700"
      },
      "message": "am 71930dd7: am a45746ef: Fix several cases of broken droiddoc syntax external issue 35214\n\n* commit \u002771930dd77e4dc6f6be5c648019d2ab0da5f0584c\u0027:\n  Fix several cases of broken droiddoc syntax external issue 35214\n"
    },
    {
      "commit": "32189e260c8dee27d561bf67c0333c9b9927636b",
      "tree": "74a4554bc31dd755c575aef22bf3328c58f724b7",
      "parents": [
        "c524ca275add1c84ef4e1e5c105058f44cac5efb",
        "fe3b1cb27dd7ded1358bf3c4cc047de97158ed1e"
      ],
      "author": {
        "name": "Scott Main",
        "email": "smain@google.com",
        "time": "Wed Jul 25 11:52:51 2012 -0700"
      },
      "committer": {
        "name": "Android (Google) Code Review",
        "email": "android-gerrit@google.com",
        "time": "Wed Jul 25 11:52:51 2012 -0700"
      },
      "message": "Merge \"misc doc bug fixes\" into jb-dev"
    },
    {
      "commit": "a45746efadd11bb7dfab026fb3c81a25fae74ca4",
      "tree": "9875e997b80cf5a43b7e6ba8bb3615a17bda6c8f",
      "parents": [
        "2f5b61a750e36169e37788a645f422cc8a8f7091"
      ],
      "author": {
        "name": "Jeff Smith",
        "email": "whydoubt@yahoo.com",
        "time": "Thu Jul 19 14:19:24 2012 -0500"
      },
      "committer": {
        "name": "Scott Main",
        "email": "smain@google.com",
        "time": "Wed Jul 25 10:49:25 2012 -0700"
      },
      "message": "Fix several cases of broken droiddoc syntax\nexternal issue 35214\n\npatch contributed by Jeff Smith \u003cwhydoubt@yahoo.com\u003e\n\nChange-Id: I70dcee88a140699bf3e1ab369bed6dcd2fdd3d83\n"
    },
    {
      "commit": "fe3b1cb27dd7ded1358bf3c4cc047de97158ed1e",
      "tree": "d9c73abd71705a5b2f57e47593ce1e18b7109164",
      "parents": [
        "4eb6973bc1f8cd51a2466708b227fb51314ad0c1"
      ],
      "author": {
        "name": "Scott Main",
        "email": "smain@google.com",
        "time": "Tue Jul 24 18:13:11 2012 -0700"
      },
      "committer": {
        "name": "Scott Main",
        "email": "smain@google.com",
        "time": "Tue Jul 24 18:13:11 2012 -0700"
      },
      "message": "misc doc bug fixes\n\nChange-Id: I68963d79422e5cedb1726e91e9639860b13a2471\n"
    },
    {
      "commit": "adba6ffbb949e3644f0effdaffee349b0b49688a",
      "tree": "ee6332da1ea3b485161d1572fce290476bfd0976",
      "parents": [
        "a72d0dd4446c14ea7803244f99454cad841084ba",
        "101a120c27f68fb7d44e6221244cb9441dfc4285"
      ],
      "author": {
        "name": "Scott Main",
        "email": "smain@google.com",
        "time": "Fri Jun 22 13:35:52 2012 -0700"
      },
      "committer": {
        "name": "Android Git Automerger",
        "email": "android-git-automerger@android.com",
        "time": "Fri Jun 22 13:35:52 2012 -0700"
      },
      "message": "am 101a120c: am 9be0105f: docs: fix several links\n\n* commit \u0027101a120c27f68fb7d44e6221244cb9441dfc4285\u0027:\n  docs: fix several links\n"
    },
    {
      "commit": "9be0105fbc56eb1b1813bb7c5fe258a144867a43",
      "tree": "964727f4694bb224eacdaaa68320292aab85ffd3",
      "parents": [
        "3cd4624448dcaddecc75461ef645da72e7e5c098"
      ],
      "author": {
        "name": "Scott Main",
        "email": "smain@google.com",
        "time": "Fri Jun 22 12:35:08 2012 -0700"
      },
      "committer": {
        "name": "Scott Main",
        "email": "smain@google.com",
        "time": "Fri Jun 22 12:35:08 2012 -0700"
      },
      "message": "docs: fix several links\n\nChange-Id: I89d9fd64dc22c90680bb05415cc966c255165af9\n"
    },
    {
      "commit": "b8151ecd6ef4faa5c16d0a4c3abb45ec84d1f97a",
      "tree": "18d849f66b9abbe1519eeb2f4901ada5c5a80cbc",
      "parents": [
        "1c1ca050e19b98c21d5b964930c4fc6f0d9ae567"
      ],
      "author": {
        "name": "Amith Yamasani",
        "email": "yamasani@google.com",
        "time": "Wed Apr 18 18:02:48 2012 -0700"
      },
      "committer": {
        "name": "Amith Yamasani",
        "email": "yamasani@google.com",
        "time": "Tue Jun 12 18:18:29 2012 -0700"
      },
      "message": "Add an icon to the user information.\n\nStore the icon in the user folder under /data/system,\nsimilar to how the wallpaper is stored.\n\nChange-Id: Id8ccb55b9e2ba7b4c557505a7f69f04eca1518cf\n"
    },
    {
      "commit": "ce783749b191a58e4fed9a397066376915c1db65",
      "tree": "fe7bbae9d9db880b5e69d82d96cdffa5d4040ed9",
      "parents": [
        "b042f2d9908e20852e4077878e50a0c07b8eee79",
        "f3b4c93e0da9af2db9e16864faa734cf70fecfe3"
      ],
      "author": {
        "name": "Dianne Hackborn",
        "email": "hackbod@google.com",
        "time": "Tue May 29 15:57:52 2012 -0700"
      },
      "committer": {
        "name": "Android Git Automerger",
        "email": "android-git-automerger@android.com",
        "time": "Tue May 29 15:57:52 2012 -0700"
      },
      "message": "am f3b4c93e: am ae5811c7: Merge \"Fix (mostly) issue #5109947: Race condition between retrieving a...\" into jb-dev\n\n* commit \u0027f3b4c93e0da9af2db9e16864faa734cf70fecfe3\u0027:\n  Fix (mostly) issue #5109947: Race condition between retrieving a...\n"
    },
    {
      "commit": "6ae8d1821822296df0606c9cd1c46708cc21cb58",
      "tree": "eb4b17b255b1f0e78078923474afcaad67755f12",
      "parents": [
        "3dac02265e42bf176e26b83da430ce15d6fd06df"
      ],
      "author": {
        "name": "Dianne Hackborn",
        "email": "hackbod@google.com",
        "time": "Wed May 23 13:12:42 2012 -0700"
      },
      "committer": {
        "name": "Dianne Hackborn",
        "email": "hackbod@google.com",
        "time": "Tue May 29 13:33:09 2012 -0700"
      },
      "message": "Fix (mostly) issue #5109947: Race condition between retrieving a...\n\n...content provider and updating its oom adj\n\nThis introduces the concept of an \"unstable\" reference on a content\nprovider.  When holding such a reference (and no normal stable ref),\nthe content provider dying will not cause the client process to be\nkilled.\n\nThis is used in ContentResolver.query(), .openAssetFileDescriptor(),\nand .openTypedAssetFileDescriptor() to first access the provider\nwith an unstable reference, and if at the point of calling into the\nprovider we find it is dead then acquiring a new stable reference\nand doing the operation again.  Thus if the provider process dies\nat any point until we get the result back, our own process will not\nbe killed and we can safely retry the operation.\n\nArguably there is still the potential for a race -- if somehow the\nprovider is killed way late by the OOM killer after the query or\nopen has returned -- but this should now be *extremely* unlikely.\nWe also continue to have the issue with the other calls, but these\nare much less critical, and the same model can\u0027t be used there (we\nwouldn\u0027t want to execute two insert operations for example).\n\nThe implementation of this required some significant changes to the\nunderlying plumbing of content providers, now keeping track of the\ntwo different reference counts, and managing them appropriately.  To\nfacilitate this, the activity manager now has a formal connection\nobject for a client reference on a content provider, which hands to\nthe application when opening the provider.\n\nThese changes have allowed a lot of the code to be cleaned up and\nsubtle issues closed.  For example, when a process is crashing, we\nnow have a much better idea of the state of content provider clients\n(olding a stable ref, unstable ref, or waiting for it to launch), so\nthat we can correctly handle each of these.\n\nThe client side code is also a fair amount cleaner, though in the\nfuture there is more than should be done.  In particular, the two\nProviderClientRecord and ProviderRefCount classes should be combined\ninto one, part of which is exposed to the ContentResolver internal\nAPI as a reference on a content provider with methods for updating\nreference counts and such.  Some day we\u0027ll do that.\n\nChange-Id: I87b10d1b67573ab899e09ca428f1b556fd669c8c\n"
    },
    {
      "commit": "1b953b8fbfb510a968259ad78d86399bde8bc292",
      "tree": "f933e98e804af3f72bf6525e9029512555271e32",
      "parents": [
        "be2dca02c4bcb4a86df8ab279724e63213b4e034",
        "a0b2786304a83f6083423b1996f675dc08e48a56"
      ],
      "author": {
        "name": "Brett Chabot",
        "email": "brettchabot@android.com",
        "time": "Fri May 11 11:14:42 2012 -0700"
      },
      "committer": {
        "name": "Android (Google) Code Review",
        "email": "android-gerrit@google.com",
        "time": "Fri May 11 11:14:42 2012 -0700"
      },
      "message": "Merge \"Delete duplicate copies of junit source.\""
    },
    {
      "commit": "652b6d1e591f6684cda4b93d4712920f287991b4",
      "tree": "5ffe183aa2cbe66c8b8b89e8f3a809e4e7f4c603",
      "parents": [
        "a53de0629f3b94472c0f160f5bbe1090b020feab"
      ],
      "author": {
        "name": "Dianne Hackborn",
        "email": "hackbod@google.com",
        "time": "Wed May 09 18:18:40 2012 -0700"
      },
      "committer": {
        "name": "Dianne Hackborn",
        "email": "hackbod@google.com",
        "time": "Wed May 09 18:18:40 2012 -0700"
      },
      "message": "Add infrastructure for accessing \"unstable\" content providers.\n\nWe have an API and some stuff that purports to this, but no real\nimplementation yet.\n\nChange-Id: I93555440014a50fdf79fa3f65318d90fb82265b4\n"
    },
    {
      "commit": "a0b2786304a83f6083423b1996f675dc08e48a56",
      "tree": "83bf908483a73dfe174c4ecafb1e4f4060607afb",
      "parents": [
        "aaee2e77256882874806d4d1cd46b0a649e7c40f"
      ],
      "author": {
        "name": "Brett Chabot",
        "email": "brettchabot@android.com",
        "time": "Wed May 09 18:08:31 2012 -0700"
      },
      "committer": {
        "name": "Brett Chabot",
        "email": "brettchabot@android.com",
        "time": "Wed May 09 18:08:31 2012 -0700"
      },
      "message": "Delete duplicate copies of junit source.\n\nBug 5826326\n\nChange-Id: Ie361b3778076686c5a59d8392aadb8c86a9ae981\n"
    },
    {
      "commit": "947f1c8db00bd3805838ff49a5f4d220df507b47",
      "tree": "706e6101ae3e5bfb31b505d11e429256e33580cd",
      "parents": [
        "6d6d186cd1a5df5fff73c8a731a81a9da3fea13b",
        "a7771df3696954f0e279407e8894a916a7cb26cc"
      ],
      "author": {
        "name": "Jeff Brown",
        "email": "jeffbrown@google.com",
        "time": "Tue May 08 10:51:12 2012 -0700"
      },
      "committer": {
        "name": "Android (Google) Code Review",
        "email": "android-gerrit@google.com",
        "time": "Tue May 08 10:51:12 2012 -0700"
      },
      "message": "Merge \"Move CancellationSignal to android.os package.\" into jb-dev"
    },
    {
      "commit": "a7771df3696954f0e279407e8894a916a7cb26cc",
      "tree": "3615be79c515fad41808d2b84ac0221ba5a7e299",
      "parents": [
        "507f5586fb48f59f7b4f2fa0ca5387e4d4f2bd8d"
      ],
      "author": {
        "name": "Jeff Brown",
        "email": "jeffbrown@google.com",
        "time": "Mon May 07 20:06:46 2012 -0700"
      },
      "committer": {
        "name": "Jeff Brown",
        "email": "jeffbrown@google.com",
        "time": "Mon May 07 20:06:46 2012 -0700"
      },
      "message": "Move CancellationSignal to android.os package.\n\nBug: 6427830\nChange-Id: I39451bb1e1d4a8d976ed1c671234f0c8c61658dd\n"
    },
    {
      "commit": "ceb1b0bfaea56251796b08c07b963de7403d84eb",
      "tree": "fea73b05f6b4d47da174eca362693958cf5d785a",
      "parents": [
        "476b03b0c0d5cae4d1b114c6f80858d59ba36cad"
      ],
      "author": {
        "name": "Anonymous Coward",
        "email": "nobody@android.com",
        "time": "Tue Apr 24 10:35:16 2012 -0700"
      },
      "committer": {
        "name": "Kenny Root",
        "email": "kroot@google.com",
        "time": "Mon May 07 16:34:49 2012 -0700"
      },
      "message": "Add encryption parameters to package installation\n\nChange-Id: Ic9f8ab9f8110f08bb3c00725cfce5b8ee7b766f3\n"
    },
    {
      "commit": "f1253cd68a1ef45f4bb0c15d3e2834ca8f91e03f",
      "tree": "5a3201faabf8ba048dcf5fb371900c15b4077f22",
      "parents": [
        "9766937ba57ca80977a68c681fdd4e46b6e1fd81"
      ],
      "author": {
        "name": "Brett Chabot",
        "email": "brettchabot@android.com",
        "time": "Mon Jan 30 11:29:54 2012 -0800"
      },
      "committer": {
        "name": "Brett Chabot",
        "email": "brettchabot@android.com",
        "time": "Wed Apr 11 19:01:30 2012 -0700"
      },
      "message": "Upgrade junit.runner classes to their JUnit4.10 implementation.\n\nBug 5826326\n\nChange-Id: If7e4c48a4369c1056dee5a2049c891bb6ab7d8d0\n"
    },
    {
      "commit": "87571b75e6560d33b8de7ca04801612a20a04d98",
      "tree": "34168684a354f369557dc324f440269aa220f1b9",
      "parents": [
        "5eeee5e0bbf5aba0097a510b3e9dbb286b2b30cd"
      ],
      "author": {
        "name": "Brian Muramatsu",
        "email": "btmura@google.com",
        "time": "Tue Apr 03 11:46:56 2012 -0700"
      },
      "committer": {
        "name": "Brian Muramatsu",
        "email": "btmura@google.com",
        "time": "Tue Apr 03 11:46:56 2012 -0700"
      },
      "message": "Try Alternate Constructor for Single Method Tests\n\nSome tests do not have a no argument constructor. If they don\u0027t\nhave one, then try a constructor with a String argument. A lot\nof CTS tests from open source projects have different practices\nand may not have a no arg constructor.\n\nChange-Id: I87c490c22347a2f4b03c3125308be0d2259f9208\n"
    },
    {
      "commit": "135936072b24b090fb63940aea41b408d855a4f3",
      "tree": "c10e6a7642df4246937bb6fbd7277b642daf3eee",
      "parents": [
        "0c44525a4888de321c9497204d59c8515f828499"
      ],
      "author": {
        "name": "Amith Yamasani",
        "email": "yamasani@google.com",
        "time": "Thu Mar 22 16:16:17 2012 -0700"
      },
      "committer": {
        "name": "Amith Yamasani",
        "email": "yamasani@google.com",
        "time": "Tue Mar 27 11:23:01 2012 -0700"
      },
      "message": "User management and switching\n\nBroadcast intents that get sent out when users are added/removed/switched.\n\nMore work on generating user-specific information in package manager queries.\nAPIs to update user name and query a user by id.\nRemoved Package.mSetStopped and mSetEnabled, since they\u0027re not user specific.\n\nUser removal:\n- Cleanup ActivityManager, PackageManager, WallpaperManager, AppWidgetService\n  and AccountManager.\n- Shutdown processes belonging to the user.\n\nDon\u0027t show vibrate option in long-press power if there\u0027s no vibrator.\n\nLock the screen when switching users, to force unlocking.\n\nChange-Id: Ib23a721cb75285eef5fd6ba8c7272462764038fa\n"
    },
    {
      "commit": "b2e822fc2ac87703ac12d062add62408574cbf7c",
      "tree": "97331fe0183386e7081355a5879c44ed5697d025",
      "parents": [
        "60c116e2a6dcc4cbdf5f5f168c57e2dea0839779"
      ],
      "author": {
        "name": "David Hu",
        "email": "hud@google.com",
        "time": "Mon Mar 19 21:03:35 2012 -0700"
      },
      "committer": {
        "name": "David Hu",
        "email": "hud@google.com",
        "time": "Mon Mar 19 21:03:35 2012 -0700"
      },
      "message": "Remove unused BandwidthTestRunner\n\nChange-Id: I5d77682cf662cc88e3d182501c78bb77805e74d1\n"
    },
    {
      "commit": "ca4aab9cd724708af30abb4bfcb2f9b45087f449",
      "tree": "b39154026ba138251e979556f83810965e0f17c9",
      "parents": [
        "bf02b984738f6be5cc2e2d66b12aff7af99eb79e"
      ],
      "author": {
        "name": "David Hu",
        "email": "hud@google.com",
        "time": "Wed Mar 14 15:43:46 2012 -0700"
      },
      "committer": {
        "name": "David Hu",
        "email": "hud@google.com",
        "time": "Mon Mar 19 18:33:58 2012 -0700"
      },
      "message": "BandwidthTestCase\n\nA test case that measures bandwidth metrics when annotated with\nandroid.test.BandwidthTest and adds the metrics to the status bundle\n\nChange-Id: I085110c66c7fcf651aefeeac3d4cdf5bd438ff67\n"
    },
    {
      "commit": "a4972e951bf2bdb7afdafee95b3ab0c15b8bacae",
      "tree": "9800a9dcd62d945a8ad71549ebcef70393ef5442",
      "parents": [
        "89ea4ca9c26f3c7e365525a0b83500e85517a457"
      ],
      "author": {
        "name": "Dianne Hackborn",
        "email": "hackbod@google.com",
        "time": "Wed Mar 14 10:38:05 2012 -0700"
      },
      "committer": {
        "name": "Dianne Hackborn",
        "email": "hackbod@google.com",
        "time": "Wed Mar 14 12:57:14 2012 -0700"
      },
      "message": "Add new \"options\" argument to all startActivity APIs.\n\nThis will be used to allow new features to be requested...  such as,\nsay, a special kind of animation.  Right now there are no options\ndefined.\n\nChange-Id: I4eb6f27275cdd4bf186f6da316ab93a2372ad4b7\n"
    },
    {
      "commit": "e639da7baa23121e35aa06d6e182558e0e755696",
      "tree": "7d956fc301eb1988a8646ff3a62786639a843da0",
      "parents": [
        "b8678d76c3e09d0d65255f3971b6112a48e19099"
      ],
      "author": {
        "name": "Dianne Hackborn",
        "email": "hackbod@google.com",
        "time": "Tue Feb 21 15:11:13 2012 -0800"
      },
      "committer": {
        "name": "Dianne Hackborn",
        "email": "hackbod@google.com",
        "time": "Thu Feb 23 16:39:15 2012 -0800"
      },
      "message": "New development permissions.\n\nThese are permissions that an application can request, but won\u0027t\nnormally be granted.  To have the permission granted, the user\nmust explicitly do so through a new \"adb shell pm grant\" command.\n\nI put these permissions in the \"development tools\" permission\ngroup.  Looking at the stuff there, I think all of the permissions\nwe already had in that group should be turned to development\npermissions; I don\u0027t think any of them are protecting public APIs,\nand they are really not things normal applications should use.\n\nThe support this, the protectionLevel of a permission has been\nmodified to consist of a base protection type with additional\nflags.  The signatureOrSystem permission has thus been converted\nto a signature base type with a new \"system\" flag; you can use\n\"system\" and/or \"dangerous\" flags with signature permissions as\ndesired.\n\nThe permissions UI has been updated to understand these new types\nof permissions and know when to display them.  Along with doing\nthat, it also now shows you which permissions are new when updating\nan existing application.\n\nThis also starts laying the ground-work for \"optional\" permissions\n(which development permissions are a certain specialized form of).\nCompleting that work requires some more features in the package\nmanager to understand generic optional permissions (having a\nfacility to not apply them when installing), along with the\nappropriate UI for the app and user to manage those permissions.\n\nChange-Id: I6571785c6bb5f6b291862b7a9be584885f88f3a5\n"
    },
    {
      "commit": "67cf7d314b5b94db1a9f1c57140b6615b0ea8291",
      "tree": "2de67be8b686a2909a93f2aca89ec7e2328597bc",
      "parents": [
        "8181201c6e55765fd58d2ff07921a143b879edd9"
      ],
      "author": {
        "name": "Amith Yamasani",
        "email": "yamasani@google.com",
        "time": "Thu Feb 16 14:31:23 2012 -0800"
      },
      "committer": {
        "name": "Amith Yamasani",
        "email": "yamasani@google.com",
        "time": "Thu Feb 16 15:03:42 2012 -0800"
      },
      "message": "Fix Power Control widget\n\nSome changes in AppWidgetService were interfering with widget permissions.\n\nAdded some hidden methods in Context to communicate the requesting user\ninformation instead of using the calling uid.\n\nBug: 6019296\nChange-Id: I5e519fd3fbbfa5b3fcc5c297b729c671dac8e7c7\n"
    },
    {
      "commit": "37ce3a8af6faab675319d0803b288ab1dddc76be",
      "tree": "4619ebc854dc7c5ebe641bc915599ab6715deed9",
      "parents": [
        "11ca31729c05a5c82aa298fb52ddebbe08a26627"
      ],
      "author": {
        "name": "Amith Yamasani",
        "email": "yamasani@google.com",
        "time": "Mon Feb 06 12:04:42 2012 -0800"
      },
      "committer": {
        "name": "Amith Yamasani",
        "email": "yamasani@google.com",
        "time": "Fri Feb 10 14:34:07 2012 -0800"
      },
      "message": "Multi-user - wallpaper service\n\n- Allow each user to have their own wallpaper (live or static).\n- Migrate old wallpaper on upgrade.\n- Update SystemBackupAgent to backup/restore from primary user\u0027s\n  new wallpaper directory.\n\nReduce dependency on Binder.getOrigCallingUser() by passing the\nuserId for bindService.\n\nChange-Id: I19c8c3296d3d2efa7f28f951d4b84407489e2166\n"
    },
    {
      "commit": "4c1241df8f8b7fd5ec3dff6c7e0f66271248e76e",
      "tree": "36df1bce8fe7295d0ab778ca519232a291a3294f",
      "parents": [
        "8ca8a69d5801ad4b809e7b9dbf53bd728820924b"
      ],
      "author": {
        "name": "Jeff Brown",
        "email": "jeffbrown@google.com",
        "time": "Thu Feb 02 17:05:00 2012 -0800"
      },
      "committer": {
        "name": "Jeff Brown",
        "email": "jeffbrown@google.com",
        "time": "Thu Feb 02 18:02:16 2012 -0800"
      },
      "message": "Rename CancellationSignal using preferred spelling.\n\nBug: 5943637\nChange-Id: I12a339f285f4db58e79acb5fd8ec2fc1acda5265\n"
    },
    {
      "commit": "75ea64fc54f328d37b115cfb1ded1e45c30380ed",
      "tree": "4254a5d2d0662de8b606b38fea6987da17c130e3",
      "parents": [
        "ebc016c01ea9d5707287cfc19ccc59b21a486c00"
      ],
      "author": {
        "name": "Jeff Brown",
        "email": "jeffbrown@google.com",
        "time": "Wed Jan 25 19:37:13 2012 -0800"
      },
      "committer": {
        "name": "Jeff Brown",
        "email": "jeffbrown@google.com",
        "time": "Fri Jan 27 17:33:21 2012 -0800"
      },
      "message": "Implement a cancelation mechanism for queries.\n\nAdded new API to enable cancelation of SQLite and content provider\nqueries by means of a CancelationSignal object.  The application\ncreates a CancelationSignal object and passes it as an argument\nto the query.  The cancelation signal can then be used to cancel\nthe query while it is executing.\n\nIf the cancelation signal is raised before the query is executed,\nthen it is immediately terminated.\n\nChange-Id: If2c76e9a7e56ea5e98768b6d4f225f0a1ca61c61\n"
    },
    {
      "commit": "0df0ed5814a83c4cf0dd3d6d6e177f5ed9003863",
      "tree": "6bae98f9f7102bfa2866db8a10f0c28e826a5db9",
      "parents": [
        "4b4d00e7149f11c84614d8cc98ae7bff21dbd960",
        "8cc9a8e132ebbf852e055ed17ab91f35b02fd974"
      ],
      "author": {
        "name": "David Hu",
        "email": "hud@google.com",
        "time": "Thu Jan 05 14:39:45 2012 -0800"
      },
      "committer": {
        "name": "Android (Google) Code Review",
        "email": "android-gerrit@google.com",
        "time": "Thu Jan 05 14:39:45 2012 -0800"
      },
      "message": "Merge \"BandwidthTestRunner\""
    },
    {
      "commit": "3aef8e1d1b2f0b87d470bcccf37ba4ebb6560c45",
      "tree": "7600f58de48f6764d476cc9d6a92ed0a5dddf278",
      "parents": [
        "8f04ae361cd34fdaea41fbedefb85cff2c684e36"
      ],
      "author": {
        "name": "Joe Fernandez",
        "email": "joefernandez@google.com",
        "time": "Tue Dec 20 10:38:34 2011 -0800"
      },
      "committer": {
        "name": "Joe Fernandez",
        "email": "joefernandez@google.com",
        "time": "Thu Dec 22 15:08:23 2011 -0800"
      },
      "message": "docs: Add developer guide cross-references, Project ACRE, round 4\n\nChange-Id: I1b43414aaec8ea217b39a0d780c80a25409d0991\n"
    },
    {
      "commit": "8cc9a8e132ebbf852e055ed17ab91f35b02fd974",
      "tree": "2f696bc3ca9dd9bd7b2e1317306ed57aa6bba0ee",
      "parents": [
        "b2bf2471b1f0b4a76660e63f91a8de84cc643da8"
      ],
      "author": {
        "name": "David Hu",
        "email": "hud@google.com",
        "time": "Tue Dec 13 15:57:42 2011 -0800"
      },
      "committer": {
        "name": "David Hu",
        "email": "hud@google.com",
        "time": "Wed Dec 14 22:43:58 2011 -0800"
      },
      "message": "BandwidthTestRunner\n\nAdded BandwidthTest annotation and BandwidthTestRunner to start\nand stop the network traffic profiler\n\nChange-Id: Id29ac21ab99ff36bd864121276db59b61eb6e154\n"
    },
    {
      "commit": "d2183654e03d589b120467f4e98da1b178ceeadb",
      "tree": "c52368d929521fd0d7182dc3cf53f8e4b37ed25f",
      "parents": [
        "1d8e7d640ad5ed6fe82bca017293dd89169f1c2e"
      ],
      "author": {
        "name": "Jeff Brown",
        "email": "jeffbrown@google.com",
        "time": "Sun Oct 09 12:39:53 2011 -0700"
      },
      "committer": {
        "name": "Jeff Brown",
        "email": "jeffbrown@google.com",
        "time": "Sun Oct 09 22:10:36 2011 -0700"
      },
      "message": "Fix ownership of CursorWindows across processes.\nBug: 5332296\n\nEnsure that there is always an owner for each CursorWindow\nand that references to each window are acquired/released\nappropriately at all times.\n\nAdded synchronization to CursorToBulkCursorAdaptor to\nprevent the underlying Cursor and CursorWindow from being\nremotely accessed in ways that might violate invariants,\nresulting in leaks or other problems.\n\nEnsured that CursorToBulkCursorAdaptor promptly releases\nits references to the Cursor and CursorWindow when closed\nso they don\u0027t stick around longer than they should, even\nif the remote end hangs onto the IBulkCursor for some reason.\n\nCursorWindow respects Parcelable.FLAG_WRITE_RETURN_VALUE\nas an indication that one reference to the CursorWindow is\nbeing released.  Correspondingly, CursorToBulkCursorAdaptor\nacquires a reference to the CursorWindow before returning\nit to the caller.  This change also prevents races from\nresulting in the transfer of an invalid CursorWindow over\nthe wire.\n\nEnsured that BulkCursorToCursorAdaptor promptly releases\nits reference to the IBulkCursor when closed and throws\non attempts to access the cursor while closed.\n\nModified ContentProviderNative to handle both parts of\nthe wrapping and unwrapping of Cursors into IBulkCursors.\nThis makes it a lot easier to ensure that the right\nthings happen on both ends.  Also, it turns out that\nthe only caller of IContentProvider.bulkQuery was\nContentProviderNative itself so there was no need\nto support bulkQuery on ContentProviderProxy and it was\njust getting in the way.\n\nImplement CloseGuard on CursorWindow.\n\nChange-Id: Ib3c8305d3cc62322f38a06698d404a2989bb6ef9\n"
    },
    {
      "commit": "05ca4c90644921df9193d92b2abdc81ef77e4a62",
      "tree": "94c9e61b0c3d364f68a194c0a65199451410fc35",
      "parents": [
        "15bbaeb0753f5336a5e8ee07e6f796657ecefb73"
      ],
      "author": {
        "name": "Kenny Root",
        "email": "kroot@google.com",
        "time": "Thu Sep 15 10:36:25 2011 -0700"
      },
      "committer": {
        "name": "Kenny Root",
        "email": "kroot@google.com",
        "time": "Fri Sep 23 16:03:03 2011 -0700"
      },
      "message": "Allow non-required package verifiers\n\n* Verifiers can be specified in the AndroidManifest.xml\n\n* Those verifiers can respond to the new Intent action\n\n* PackageManager API for those verifiers: verifyPendingInstall\n\nChange-Id: I4892bce2e6984871e6e93c60a1ca0dae145f5df5\n"
    },
    {
      "commit": "0d3647dc00849872ec5e18cce8ffe0e6ae02dd47",
      "tree": "96f042c5efd1667b326065c0b348215ca43e633f",
      "parents": [
        "67ceaf3e83d29ca69708a3ae94f5e7797bef4ca6",
        "9c711282ad234e104c34eb4408d85fc1bb149ded"
      ],
      "author": {
        "name": "Kenny Root",
        "email": "kroot@google.com",
        "time": "Wed Sep 21 18:56:52 2011 -0700"
      },
      "committer": {
        "name": "Android Git Automerger",
        "email": "android-git-automerger@android.com",
        "time": "Wed Sep 21 18:56:52 2011 -0700"
      },
      "message": "am 9c711282: Merge \"Unhide new PackageManager APIs for API 14\" into ics-factoryrom\n\n* commit \u00279c711282ad234e104c34eb4408d85fc1bb149ded\u0027:\n  Unhide new PackageManager APIs for API 14\n"
    },
    {
      "commit": "3a9b5fbb97e65019abec97f172b4cbf2100d1225",
      "tree": "7cc787f92fc2071fd8e1050df13c351c616757be",
      "parents": [
        "ee0835b95de225fdc34d45b777b4595d01727a40"
      ],
      "author": {
        "name": "Kenny Root",
        "email": "kroot@google.com",
        "time": "Tue Sep 20 14:15:38 2011 -0700"
      },
      "committer": {
        "name": "Kenny Root",
        "email": "kroot@google.com",
        "time": "Tue Sep 20 14:35:10 2011 -0700"
      },
      "message": "Unhide new PackageManager APIs for API 14\n\nChange-Id: I83110285ccee39a4cd872a1c2af8357f541833d4\n"
    }
  ],
  "next": "97567340a4194070ffefe6249e3ae5ba4e458e70"
}
