)]}'
{
  "log": [
    {
      "commit": "a7e47d5d344674f4174919c4ac51e5b9c74b5802",
      "tree": "34b8d1f8a38225b2386d19e2b2b3a7a30ae06615",
      "parents": [
        "089f95f4483c95873cf0084c11cb23a0f5b32c3c"
      ],
      "author": {
        "name": "Christopher Tate",
        "email": "ctate@google.com",
        "time": "Mon Dec 01 14:37:28 2014 -0800"
      },
      "committer": {
        "name": "Christopher Tate",
        "email": "ctate@google.com",
        "time": "Mon Dec 01 14:37:28 2014 -0800"
      },
      "message": "Don\u0027t crash if a system restore fails before constructing the PMBA\n\nIf a whole-system restore operation failed at just the wrong point,\nwe\u0027d wind up in the teardown code without a certain vital bit of it\nhaving been initialized, and crash on the null pointer.  Now we\nrecognize this failure mode and make sure not to do that.\n\nBug 18574450\n\nChange-Id: Ifa2c10ce16bb3c6bc916ed7151c5fd51b7225691\n"
    },
    {
      "commit": "201caf57f9a9699e04620eac9b1fcdaf4338d2f0",
      "tree": "0012bb1c1dc502ea15beccbdabf684a87401e1fa",
      "parents": [
        "19865ccd44958b0902b9eedd11df279a03ff74c1"
      ],
      "author": {
        "name": "Zoltan Szatmary-Ban",
        "email": "szatmz@google.com",
        "time": "Wed Nov 12 18:03:08 2014 +0000"
      },
      "committer": {
        "name": "Zoltan Szatmary-Ban",
        "email": "szatmz@google.com",
        "time": "Wed Nov 12 23:51:31 2014 +0000"
      },
      "message": "Adding method to query backup manager service activity status\n\nBug: 17367491\nChange-Id: I9920c07d56c4c0ccb1f3dce637c0fb390902d2ff\n"
    },
    {
      "commit": "bbe23b31dcd0eec8af5b5198970de7ff2a9ef79a",
      "tree": "e0f6458989ba16677e19f930fcfd128af6d11d3f",
      "parents": [
        "4b19b7aaff1d1ff972ebe68101c2107454bbe5de"
      ],
      "author": {
        "name": "Christopher Tate",
        "email": "ctate@google.com",
        "time": "Thu Oct 30 13:44:27 2014 -0700"
      },
      "committer": {
        "name": "Christopher Tate",
        "email": "ctate@android.com",
        "time": "Fri Nov 07 18:40:47 2014 +0000"
      },
      "message": "Enable runtime turndown of backup/restore services\n\nThe heavy implementation of the backup manager service is now sitting\nbehind a lightweight trampoline that actually provides the binder\ncall interface.  The indirection allows us now to tear down the\nimplementation on the fly without breaking callers who have cached\nbinder references to the backup services: these callers will simply\nsee their future invocations failing benignly.\n\nIn addition there is now an API for suitably privileged callers such\nas device policy management to effect this turndown.\n\nFinally, there is now a static system property, \"ro.backup.disable\",\nthat a product can use to outright remove backup/restore operation\nfrom the system\u0027s operation.  The public APIs will continue to be\nsafely usable on such products but no data will be moved to or\nfrom the device.\n\nBug 17367491\n\nChange-Id: I8108e386ef3b5c967938fae483366d6978fe4e04\n"
    },
    {
      "commit": "a28b5c51602ccc48f2672274dabda05d3776ccd9",
      "tree": "028943d53b964cbb0f5409cfa9214fa4a0afc109",
      "parents": [
        "60e74b4924dee6d033ca61854cac42768006ced5"
      ],
      "author": {
        "name": "Christopher Tate",
        "email": "ctate@google.com",
        "time": "Thu Oct 16 13:44:00 2014 -0700"
      },
      "committer": {
        "name": "Christopher Tate",
        "email": "ctate@google.com",
        "time": "Thu Oct 16 13:56:45 2014 -0700"
      },
      "message": "Eliminate race condition around backup completion + resumption\n\nEnsure that the callback always sees the current-operation state in sync\nwith the various other bits of internal backup-operation state.  Previously\nonly the current-operation state was managed inside the critical section;\nthis resulted in a slim race window where a callback could see an ongoing\noperation as still valid, but after the internal state on which that\noperation depended had already been cleared.\n\nBug 17931760\n\nChange-Id: Ia032668e7a9d22f1029c57fc98db9e86484d5719\n"
    },
    {
      "commit": "0f32717a17307ee581381d7f8527b686aacb3ac4",
      "tree": "14bacccb9409dcf741f43c55e81aeeeb66175b22",
      "parents": [
        "20de619d66a594fd9e6e76a3a2cb79422aef577c"
      ],
      "author": {
        "name": "Christopher Tate",
        "email": "ctate@google.com",
        "time": "Wed Oct 15 17:49:42 2014 -0700"
      },
      "committer": {
        "name": "Christopher Tate",
        "email": "ctate@android.com",
        "time": "Thu Oct 16 01:34:01 2014 +0000"
      },
      "message": "Fix spurious restore session timeouts\n\nThe restore-session idle timeout should not be ticking while we\u0027re\ndoing legitimate restore work.  We now explicitly stop the timeout\nticker [a delayed message on our handler thread] whenever we undertake\na valid restore operation.  The timer is already correctly resumed\nwhen restore operations conclude.\n\n(In practice we need to suspend the timeout tracking at exactly those\ntimes when we\u0027re entering the wakelock-protected restore flow.  The\ntimeout is reestablished when the wakelock is released; this part\nis already in the code.)\n\nBug 17990544\n\nChange-Id: I7318020ce30fd9c35bc3a644f8c101fd3d063c8b\n"
    },
    {
      "commit": "2aa1d18e3acd269ed7a5f5a4843d447735f0676c",
      "tree": "4c88e5ed43a9a8201dc04e9b6f7dc040cfdb83c0",
      "parents": [
        "2c2cb29a3d7f0a90d753b0fa9c32c1fc5cdbff32"
      ],
      "author": {
        "name": "Christopher Tate",
        "email": "ctate@google.com",
        "time": "Thu Oct 09 15:20:24 2014 -0700"
      },
      "committer": {
        "name": "Christopher Tate",
        "email": "ctate@google.com",
        "time": "Thu Oct 09 15:20:24 2014 -0700"
      },
      "message": "Fix bug 17931760 - spurious timeout leads to mayhem\n\nWe know a priori that the PMBA metadata package\u0027s backup pass\ndoesn\u0027t need to be tracked for timeout, because it\u0027s run inline\nrather than as an asynchronous separate-process operation.\n\nChange-Id: Ifd21ab3a016917f5e557a38c1c88f8d8ac1337d2\n"
    },
    {
      "commit": "6067d79807653172de9772d8cfd5e914557207b7",
      "tree": "64259c4df9e4316f4db12fc4e6821c5e47ba00b0",
      "parents": [
        "3dd06d9005bd572a3b012b3a2b27adfa94533144"
      ],
      "author": {
        "name": "Christopher Tate",
        "email": "ctate@google.com",
        "time": "Wed Oct 08 11:10:49 2014 -0700"
      },
      "committer": {
        "name": "Christopher Tate",
        "email": "ctate@android.com",
        "time": "Wed Oct 08 18:14:02 2014 +0000"
      },
      "message": "Actually tell the widget service that restore is starting\n\nBefore beginning a full-system restore we need to tell the widget service,\nso that it can properly start remapping IDs from the ground state.\n\nBug 17869323\n\nChange-Id: I152257563f5b52cae67244e936bc2c44ced7618d\n"
    },
    {
      "commit": "ecae2116169e4cc7c109fcfc2aa9f5be1d105995",
      "tree": "b568e3afb4969c444aa26d335e4807401962fe49",
      "parents": [
        "7caa51e6ec6443d5c1fdb96f7e42508b074b4278"
      ],
      "author": {
        "name": "Christopher Tate",
        "email": "ctate@google.com",
        "time": "Fri Oct 03 18:26:29 2014 -0700"
      },
      "committer": {
        "name": "Christopher Tate",
        "email": "ctate@google.com",
        "time": "Fri Oct 03 18:26:29 2014 -0700"
      },
      "message": "adb backup/restore fixes\n\nBug 17811327 : teach adb restore about the new widget metadata entries\n\nBug 14165872 : -nosystem should not act like -onlysystem\n\nChange-Id: I39da0ba80df7c5309a78ec1fa38016cebd80aa5f\n"
    },
    {
      "commit": "64f10efab72aa7701a8d292425f4f56f04ca556b",
      "tree": "f77d0794fe803b5219dc34e31b0f2f4d13ee48c4",
      "parents": [
        "48766577d43f708481d0def315f592659d7a51dc"
      ],
      "author": {
        "name": "Christopher Tate",
        "email": "ctate@google.com",
        "time": "Thu Sep 11 15:33:05 2014 -0700"
      },
      "committer": {
        "name": "Christopher Tate",
        "email": "ctate@android.com",
        "time": "Fri Sep 12 22:01:12 2014 +0000"
      },
      "message": "Track enable/disable of transport components\n\nFor fallback / rollback of backup transport selection we need to\nhandle live enable/disable of legacy or superseded transports.\nWe now watch for component enable state changes in packages that\nhost transports, and rebind as needed.\n\nThe semantics for selecting the current transport have also been\nadjusted.  We no longer require that the selected transport be\nlive and currently bound in order to be designated as the active\ninstance.  This prevents nondeterministic races around upgrade\nand replacement.\n\nBug 17136637\n\nChange-Id: Idaf45cf4522a23576444e6b11626ee3f7f47c36c\n"
    },
    {
      "commit": "539b217b764562964c7f11b416da8391cb7cf93f",
      "tree": "171567fd1747991d65a852d9a6889be481dcdba4",
      "parents": [
        "e8f8bc0ad6f7f2c657b4360033d2c7571c800ccb"
      ],
      "author": {
        "name": "Christopher Tate",
        "email": "ctate@google.com",
        "time": "Wed Sep 03 13:50:23 2014 -0700"
      },
      "committer": {
        "name": "Christopher Tate",
        "email": "ctate@google.com",
        "time": "Wed Sep 03 14:12:11 2014 -0700"
      },
      "message": "The transport system API needs to manage binder identity\n\n...around writing settings.  It does its own proper permission check;\nit just needs to make sure not to accidentally crash the caller in\nstrange and wondrous ways because of failing to clear binder identity\nbefore writing the result to secure settings.\n\nBug 16542048\n\nChange-Id: I88d1f2dbeebd24eed5d86989f0ca0d834878b054\n"
    },
    {
      "commit": "674d3e750133efc4b2d575d806596d1f56bda8d9",
      "tree": "2620ebae0d5139ccb4a1df5fb9ad3a651ea2a137",
      "parents": [
        "3e97f9d48b6ef6b5ff5fa4e3c738138c0fe14edc"
      ],
      "author": {
        "name": "Christopher Tate",
        "email": "ctate@google.com",
        "time": "Wed Aug 27 13:54:51 2014 -0700"
      },
      "committer": {
        "name": "Christopher Tate",
        "email": "ctate@google.com",
        "time": "Wed Aug 27 13:54:51 2014 -0700"
      },
      "message": "Do not require device provisioning to do restore-at-install\n\nProvisioning is a milestone used for gating *backup* operation,\nbut it\u0027s important that restores be possible during the setup\nprocess.  In particular, some applications such as home apps may\nbe deliberately pushed for install after platform restore, but\nbefore the end of the setup process.  We need to be able to do\ninstall-time restores of such apps.\n\nBug 17288313\n\nChange-Id: Iaff5d9919e6392b2ca5925be4d63a4116cd11f77\n"
    },
    {
      "commit": "915f1dc785886ecd14a5222778f7d46f0243b1f5",
      "tree": "e1419b3a431e4f62a40a7fa30618972c848b4700",
      "parents": [
        "70613dbff74544c6f537cc3a84392e07ad70859c"
      ],
      "author": {
        "name": "Christopher Tate",
        "email": "ctate@google.com",
        "time": "Tue Aug 26 18:09:05 2014 -0700"
      },
      "committer": {
        "name": "Christopher Tate",
        "email": "ctate@google.com",
        "time": "Tue Aug 26 18:32:55 2014 -0700"
      },
      "message": "Remember having done full-data as well as key/value app backups\n\nThe \"what have we ever succesfully backed up?\" log is used to determine\nwhether we can do an install-time restore from the currently-live dataset\nrather than go back to the ancestral dataset (if any).  We now track\napps that have gotten a successful full-data backup through the transport,\nnot just key/value backups.\n\nBug 17263823\n\nChange-Id: If21350a8dd8aaa4ed02fb74101617e935920e4ae\n"
    },
    {
      "commit": "b8e6838583c9d784a7e8d030999d57eb2e87a561",
      "tree": "9151e5679659f10fb6fb2c57d99db37d10d609fd",
      "parents": [
        "306908f235f9a53e8b68136ccd83cef5aad07fd2",
        "32d06732cdb7ee653a58e49a4dab13a780513db5"
      ],
      "author": {
        "name": "Paul Lawrence",
        "email": "paullawrence@google.com",
        "time": "Sat Aug 23 20:44:29 2014 +0000"
      },
      "committer": {
        "name": "Android (Google) Code Review",
        "email": "android-gerrit@google.com",
        "time": "Sat Aug 23 20:44:30 2014 +0000"
      },
      "message": "Merge \"Fix adb backup for encrypted case\" into lmp-dev"
    },
    {
      "commit": "d1c06753d045ad10e00e7aba53ee2adba0712ccc",
      "tree": "6a1103dfcc0b6db0dfc030aba6cdb4961e2a91c2",
      "parents": [
        "acb570cd84b4e3503e7e96138ea0d9d236ca9b9e"
      ],
      "author": {
        "name": "Matthew Williams",
        "email": "mjwilliams@google.com",
        "time": "Fri Aug 22 14:15:28 2014 -0700"
      },
      "committer": {
        "name": "Matthew Williams",
        "email": "mjwilliams@google.com",
        "time": "Fri Aug 22 16:08:45 2014 -0700"
      },
      "message": "Implement API review feedback for JobScheduler\n\nBUG: 17005336\n\nTook the opportunity to clean up some back-off logic\n\nChange-Id: Ibc8ae34d1d44dd064ba071e4cbad17872f7e38cf\n"
    },
    {
      "commit": "e7bbe47833160d05bc31fa33f6d2e6134f3cb8e9",
      "tree": "a1b9893f417127cf6b70211e6c518625f26bfea4",
      "parents": [
        "37e6cbae59e19bba734e7961620b6a7fb695db58",
        "5684dae9ccceb756c9b44b80931ccac9af198ea6"
      ],
      "author": {
        "name": "Christopher Tate",
        "email": "ctate@google.com",
        "time": "Fri Aug 22 21:11:40 2014 +0000"
      },
      "committer": {
        "name": "Android (Google) Code Review",
        "email": "android-gerrit@google.com",
        "time": "Fri Aug 22 21:11:41 2014 +0000"
      },
      "message": "Merge \"Automatically bind to newly-installed backup transports\" into lmp-dev"
    },
    {
      "commit": "5684dae9ccceb756c9b44b80931ccac9af198ea6",
      "tree": "e92d25b5924fc580504c529b9e4f2a338bea50f7",
      "parents": [
        "b68654ce84cb80cb89bda69a170c8f69dfb3bd77"
      ],
      "author": {
        "name": "Christopher Tate",
        "email": "ctate@google.com",
        "time": "Thu Aug 21 15:45:47 2014 -0700"
      },
      "committer": {
        "name": "Christopher Tate",
        "email": "ctate@google.com",
        "time": "Fri Aug 22 13:29:46 2014 -0700"
      },
      "message": "Automatically bind to newly-installed backup transports\n\nThey\u0027ll be rebound automatically at boot, but need to be brought\nup immediately.  As always they can only be provided by privileged\napps.\n\nBug 16542048\n\nChange-Id: I9f121a5c111a772deb3f0c44166002a2cbb16ad5\n"
    },
    {
      "commit": "32d06732cdb7ee653a58e49a4dab13a780513db5",
      "tree": "e7915fe34e031d09fa3e746f3504b22163b7ef99",
      "parents": [
        "f9220b39533d18b6c79099c32522b3ff712ff89b"
      ],
      "author": {
        "name": "Paul Lawrence",
        "email": "paullawrence@google.com",
        "time": "Thu Aug 21 08:43:41 2014 -0700"
      },
      "committer": {
        "name": "Paul Lawrence",
        "email": "paullawrence@google.com",
        "time": "Fri Aug 22 11:22:43 2014 -0700"
      },
      "message": "Fix adb backup for encrypted case\n\nNew behavior. Backup no longer uses the encryption password. This is in\npart because that is hard with patterns, in part because it is a security\nissue - the off line backup is much easier to brute force than the phone.\n\nInstead, we simply insist on an encryption password if your device is encrypted\nand locked.\n\nBug: 17159330\nChange-Id: Ia22f84722522abf0b569a3ef1e16ead5527c726d\n"
    },
    {
      "commit": "8def5cbb3a1a68bb66fbe7ce63fcc8eadcbb238d",
      "tree": "34f99e0d39f3194f2485018a9f90da1b324eca46",
      "parents": [
        "63859536047e907fbcde87f12511ec3b35bf53dc"
      ],
      "author": {
        "name": "Brian Carlstrom",
        "email": "bdc@google.com",
        "time": "Thu Aug 21 23:15:13 2014 -0700"
      },
      "committer": {
        "name": "Brian Carlstrom",
        "email": "bdc@google.com",
        "time": "Thu Aug 21 23:15:13 2014 -0700"
      },
      "message": "Move SystemBackupAgent from services.jar to frameworks.jar\n\nBug: 17168017\nChange-Id: I89b98ca839a78eeb7fb43930e0699ee235deafad\n"
    },
    {
      "commit": "b2707afb0cbf955952d313e4c75fd3bfd3a35e98",
      "tree": "fce93b3840aae1c6d96558dcef0f7633c2e2052b",
      "parents": [
        "827296b7dd6689c14df1340f21a85e1f2f8d6844"
      ],
      "author": {
        "name": "Christopher Tate",
        "email": "ctate@google.com",
        "time": "Tue Aug 19 17:05:31 2014 -0700"
      },
      "committer": {
        "name": "Christopher Tate",
        "email": "ctate@android.com",
        "time": "Thu Aug 21 00:25:53 2014 +0000"
      },
      "message": "Maintain transport connection through package updates\n\nWhen a package is updated, existing bindings to that package\u0027s\nservices are severed and must be manually re-established.  Now\nthat the transport can be updated outside the system per se,\nmake sure that we detect these cases and rebind as needed.\n\nBug 16139912\n\nChange-Id: I5d6fa75bb86484f8f7d4f8e93c9157773995e6a7\n"
    },
    {
      "commit": "9dbba1b669eeb69316b70dbc9e457f8f8b084ea1",
      "tree": "b61db4521204e67241c2d48f95f000560bb595d4",
      "parents": [
        "dd7930354aaf2baf91810bc7a3e47543dbcc7f28"
      ],
      "author": {
        "name": "Christopher Tate",
        "email": "ctate@google.com",
        "time": "Tue Aug 19 18:24:06 2014 -0700"
      },
      "committer": {
        "name": "Christopher Tate",
        "email": "ctate@google.com",
        "time": "Tue Aug 19 18:24:06 2014 -0700"
      },
      "message": "Don\u0027t crash good-citizen restore session clients\n\nIf an app is trying to do the right thing and end its restore sessions\ncleanly, but winds up being slow and having the session timed out from\nunder them, don\u0027t crash them with an illegal state exception for having\nappeared to end the session twice.\n\nBug 17133115\n\nChange-Id: I0a0989e2067b156569bddb6626ce045e625c6604\n"
    },
    {
      "commit": "10ab095a5be2cc45354266b8fbe642c3facafd55",
      "tree": "6ac510265f3e9ac0c9f312feef8de7d1952a5c81",
      "parents": [
        "71809ee7f63229d0ea4f6169922ddfbfee330fd2"
      ],
      "author": {
        "name": "Christopher Tate",
        "email": "ctate@google.com",
        "time": "Mon Aug 18 14:41:33 2014 -0700"
      },
      "committer": {
        "name": "Di Wu",
        "email": "arete@google.com",
        "time": "Mon Aug 18 22:01:43 2014 +0000"
      },
      "message": "Minor restore fixes\n\n1. We were missing a \u0027break\u0027 in the session-timeout case of\n   message dispatch, so were falling through into a different\n   case.  Oops.  Fortunately it was benign; the other case\u0027s\n   logic was merely logging \"hey it doesn\u0027t look like there\u0027s\n   anything to do here\" and cleanly exiting.\n\n2. After a restore operation finishes we were previously\n   always leaving the session timeout clock running.  However,\n   this was not appropriate in the case of restore-at-install,\n   when the restore was a one-shot kicked off by the package\n   manager rather than an operation on an ongoing RestoreSession.\n   That logic now properly tidies up the session timeout when\n   winding up the restore in either situation.\n\nBug 17080648\n\nChange-Id: I51d4a50db4feefc4c355230a3bfb926ea2fb5944\n"
    },
    {
      "commit": "a63246d6daa02c6f3e4e78d0072d991387e14c87",
      "tree": "69ad9f559a279b83aa610701a39d72a911c0e105",
      "parents": [
        "9fde9a250fffc15c6bcdfc985de12c8646a9813c"
      ],
      "author": {
        "name": "Christopher Tate",
        "email": "ctate@google.com",
        "time": "Fri Aug 15 11:12:13 2014 -0700"
      },
      "committer": {
        "name": "Christopher Tate",
        "email": "ctate@google.com",
        "time": "Fri Aug 15 11:22:01 2014 -0700"
      },
      "message": "Tighten restore-at-install behavior\n\nHarden the guarantee that if we\u0027re asked about a possible restore,\nwe always ALWAYS report back to the package manager.  This involved\nclosing \"should never happen\" edge cases around provisioning/auto-restore\nsetting that nevertheless were happening.\n\nAlso, on the auto-restore setting front, make sure to plumb that\nsystem API through appropriately, since going behind its back and\nmanipulating the secure setting directly would cause things to get\nout of step.\n\nBug 17060654\n\nChange-Id: I52ca9c1ffbfc0bd6b57196157500d0868bfc2989\n"
    },
    {
      "commit": "bf1a4a81ebd340a18583f4ca9b5d562a01f55674",
      "tree": "01fe035e46fd2b4f6632e9102e8bfd1e243f14c4",
      "parents": [
        "7f708ecc2f1dcebd516d9f445ec838a4385512fc"
      ],
      "author": {
        "name": "Christopher Tate",
        "email": "ctate@google.com",
        "time": "Fri Aug 08 15:05:48 2014 -0700"
      },
      "committer": {
        "name": "Christopher Tate",
        "email": "ctate@android.com",
        "time": "Sat Aug 09 00:48:47 2014 +0000"
      },
      "message": "Start using cancelFullBackup() when appropriate\n\nThe API was in place but the framework wasn\u0027t yet calling it.\n\nBug 16524520\n\nChange-Id: Ie368758c830a7d0ad11e7dd3142a0ed896069944\n"
    },
    {
      "commit": "0660244119243928a69e5f21ef5ea339c7f6d008",
      "tree": "903bb725d4767fcdd59737656f66433a62d426e0",
      "parents": [
        "f9b4c2cc6ffbcb21f8e9b015ed3bdab0501bdf65",
        "cce476034388383a6006555a225e2170f3b4dcd9"
      ],
      "author": {
        "name": "Christopher Tate",
        "email": "ctate@google.com",
        "time": "Thu Aug 07 20:57:59 2014 +0000"
      },
      "committer": {
        "name": "Android (Google) Code Review",
        "email": "android-gerrit@google.com",
        "time": "Thu Aug 07 15:00:45 2014 +0000"
      },
      "message": "Merge \"Sanity-check paths of files to be restored\" into lmp-dev"
    },
    {
      "commit": "4cf9f007e6b66c0a970600f66b4229c4ede73f7f",
      "tree": "1e90bfa0ef0a0a0babf3e1005453ee796c4b3f3b",
      "parents": [
        "4565ded1a29f394dffa67b0852eca15ef47bded7"
      ],
      "author": {
        "name": "Christopher Tate",
        "email": "ctate@google.com",
        "time": "Tue Aug 05 16:12:42 2014 -0700"
      },
      "committer": {
        "name": "Christopher Tate",
        "email": "ctate@android.com",
        "time": "Wed Aug 06 19:24:33 2014 +0000"
      },
      "message": "Add event logs for full backup/restore milestones\n\nBug 16689703\n\nChange-Id: If870f1b7b9cb3929ac1edc38affc688a37c2acfd\n"
    },
    {
      "commit": "46db93404b27fe5ec121ab55527712e2a6692c7a",
      "tree": "d56c5250b6cddb252b8912bc93fe413726bfd890",
      "parents": [
        "40b8ef99a5132a970903e33d3c8ee087d0502a93"
      ],
      "author": {
        "name": "Michael Wright",
        "email": "michaelwr@google.com",
        "time": "Tue Jul 29 18:28:47 2014 -0700"
      },
      "committer": {
        "name": "Michael Wright",
        "email": "michaelwr@google.com",
        "time": "Tue Aug 05 19:58:27 2014 +0000"
      },
      "message": "Ensure backup schedule file is closed.\n\nChange-Id: Ie4a62cda74815c67c62fb08e8df25a71d6102d4c\n"
    },
    {
      "commit": "cce476034388383a6006555a225e2170f3b4dcd9",
      "tree": "2475f4269260adf175fbdff03f4f9e8ceeed41ec",
      "parents": [
        "b942035837b5206b232081d724916eabb7dd4c6b"
      ],
      "author": {
        "name": "Christopher Tate",
        "email": "ctate@google.com",
        "time": "Mon Aug 04 14:49:26 2014 -0700"
      },
      "committer": {
        "name": "Christopher Tate",
        "email": "ctate@google.com",
        "time": "Mon Aug 04 15:13:16 2014 -0700"
      },
      "message": "Sanity-check paths of files to be restored\n\nThe duplicated implementations are an artifact of an ongoing\nrefactor of the full-data restore code.  The adb-specific path\nwill be switched to use the FullRestoreEngine [as has already\nbeen done for the \u0027adb backup\u0027 path using the parallel full\nbackup engine], at which point the extra implementation here\nwill be removed, but for now we need to make sure that all\nbases are covered.\n\nBug 16298491\n\nChange-Id: I9cdb8a1c537939a620208df3cf0e921061b981ad\n"
    },
    {
      "commit": "7dfbaf52db6401ae85588e334be5af751bb813a8",
      "tree": "54d722deff37637292c25b3058a13d091874c111",
      "parents": [
        "0615026ba15d7d7a68d0a191d449da47a1ceabea"
      ],
      "author": {
        "name": "Christopher Tate",
        "email": "ctate@google.com",
        "time": "Tue Jul 29 13:47:47 2014 -0700"
      },
      "committer": {
        "name": "Christopher Tate",
        "email": "ctate@android.com",
        "time": "Tue Jul 29 21:06:29 2014 +0000"
      },
      "message": "Make archive metadata idempotent\n\nWe want to make sure that the manifest and widget metadata\nblocks are identical, including their in-stream headers, if\nwe regenerate the archive without underlying filesystem changes.\n\nBug 15968355\n\nChange-Id: I828b264545d19e1d865d98d5723915d02fafc012\n"
    },
    {
      "commit": "c17739d112d8e7076924c7fdd98614abafd58609",
      "tree": "0c10a66c857854501da3a5c39258110896f92273",
      "parents": [
        "cfcdf1270127d9a333cda2b91646713d1f41c6ac"
      ],
      "author": {
        "name": "Christopher Tate",
        "email": "ctate@google.com",
        "time": "Mon Jul 28 15:02:04 2014 -0700"
      },
      "committer": {
        "name": "Christopher Tate",
        "email": "ctate@android.com",
        "time": "Mon Jul 28 23:13:06 2014 +0000"
      },
      "message": "Provide outside-facing API for data management intent+label\n\nBug 16346320\n\nChange-Id: I3f4c2f4b700c77880ba3d8db7c92cdb404763d0d\n"
    },
    {
      "commit": "5eeb59cceb1f95813c548c1c5937f161c1ed3571",
      "tree": "7d8a657bcae2254fa0355c08c71b0846a82bbe3d",
      "parents": [
        "5c8ea084e609ecce17a038eb6b09fe118a81d700"
      ],
      "author": {
        "name": "Christopher Tate",
        "email": "ctate@google.com",
        "time": "Tue Jul 22 10:50:22 2014 -0700"
      },
      "committer": {
        "name": "Christopher Tate",
        "email": "ctate@android.com",
        "time": "Mon Jul 28 01:21:48 2014 +0000"
      },
      "message": "Schedule full backups\n\nInitial policy:  at most daily; backups only run when the\ndevice is idle + charging + on an unmetered network.\n\nBug 16485874\n\nChange-Id: I5665d890a943bac765adcef14be79d7dba6ce078\n"
    },
    {
      "commit": "7ff106c20d403e3217f5f384e63737285e2668a2",
      "tree": "a42b9704925a46ea6e30d6ec33f1eaddc521d3c2",
      "parents": [
        "ccf9fca47149d102293668c2e81febc175e0329e"
      ],
      "author": {
        "name": "Christopher Tate",
        "email": "ctate@google.com",
        "time": "Thu Jul 24 18:58:23 2014 -0700"
      },
      "committer": {
        "name": "Christopher Tate",
        "email": "ctate@google.com",
        "time": "Thu Jul 24 18:58:23 2014 -0700"
      },
      "message": "A couple of restore fixes:\n\n* Fix crasher after transport-level failure attempting to ask for\n  the name of the next package to be restored\n\n* Current-dataset single-package restore path no longer requires\n  that the package have its own backup agent.\n\nBug 16548983\n\nChange-Id: Id37f2f0e6075d53c414d9a997bf738bbf0cfff8b\n"
    },
    {
      "commit": "a4e4d68f08c1d48a3cdcf83617468370366d03d4",
      "tree": "56c91d22372026fe6810e0fe5ece025fd87b4ac6",
      "parents": [
        "8a01b05062e9ad3b262b6473a1122b2ba964210a"
      ],
      "author": {
        "name": "Christopher Tate",
        "email": "ctate@google.com",
        "time": "Tue Jul 22 16:24:28 2014 -0700"
      },
      "committer": {
        "name": "Christopher Tate",
        "email": "ctate@android.com",
        "time": "Tue Jul 22 23:42:48 2014 +0000"
      },
      "message": "Handle single-package restores properly\n\nBug 16346405\n\nChange-Id: I69e3288f5a9d68d818fad6a2cd4b27ad45c1007e\n"
    },
    {
      "commit": "f7cbb1fc25223bbf793f7128280ee4b00d509eb0",
      "tree": "bd2fdb7c021c27112fea10861e7948b4c4519e71",
      "parents": [
        "fcd8b20e09ca066da6d2564935d8dbfff2777547"
      ],
      "author": {
        "name": "Christopher Tate",
        "email": "ctate@google.com",
        "time": "Tue Jul 22 12:54:52 2014 -0700"
      },
      "committer": {
        "name": "Christopher Tate",
        "email": "ctate@google.com",
        "time": "Tue Jul 22 15:12:02 2014 -0700"
      },
      "message": "Always check restore against the latest backend metadata\n\nBug 16484934\n\nChange-Id: I472a7db89a94b9804f6ea94c25da206dd111a497\n"
    },
    {
      "commit": "89101f7fe89134a609459e80f779c1a5114e562a",
      "tree": "1f24d7a91077ef087b8bae0af7df1ca74aaebf9c",
      "parents": [
        "5f7f252b451f94bc09e2e5b880e026c28a9c2d0b"
      ],
      "author": {
        "name": "Christopher Tate",
        "email": "ctate@google.com",
        "time": "Thu Jul 17 19:09:00 2014 -0700"
      },
      "committer": {
        "name": "Christopher Tate",
        "email": "ctate@google.com",
        "time": "Thu Jul 17 19:12:09 2014 -0700"
      },
      "message": "Tear down agents properly at EOD in full restore\n\nThe restore engine wasn\u0027t tearing down the bound agent after reaching\nthe end of data for the app, and furthermore was allowing the restore\noperation to resume running the queue before all data had been delivered\nto the current target.\n\nAlso make LocalTransport deliver data in 2K chunks rather than 32K,\nas a first step towards making its timing characteristics more like\nwe\u0027ll see in networked situations.\n\nFinally, added a bunch of MORE_DEBUG output for finding odd bugs\nlike this.\n\nChange-Id: Icdbe6a070af6cc7c708a938ad044108d40ebce9a\n"
    },
    {
      "commit": "5f7f252b451f94bc09e2e5b880e026c28a9c2d0b",
      "tree": "b662685b871bdf63deb2117cd3d53e6aa70e9509",
      "parents": [
        "f3e85b5bac693780c75935f0d27acf536458702d"
      ],
      "author": {
        "name": "Christopher Tate",
        "email": "ctate@google.com",
        "time": "Thu Jul 17 15:58:12 2014 -0700"
      },
      "committer": {
        "name": "Christopher Tate",
        "email": "ctate@android.com",
        "time": "Thu Jul 17 23:01:04 2014 +0000"
      },
      "message": "Properly end full restore attempt if getNextFullRestoreDataChunk() fails\n\nDon\u0027t just drop the error return on the floor and retry (forever!).\n\nChange-Id: I5f0ef2d09ea286d813add69517f865e474341b43\n"
    },
    {
      "commit": "2e40d115ca4332d88424d1b591fdd8d5f78d1831",
      "tree": "43ff38544c1b7301ce72dde50cff3bd5dcd84964",
      "parents": [
        "738177caf6a755a59ca6b17bb968be0aa4e8e10f"
      ],
      "author": {
        "name": "Christopher Tate",
        "email": "ctate@google.com",
        "time": "Tue Jul 15 12:37:38 2014 -0700"
      },
      "committer": {
        "name": "Christopher Tate",
        "email": "ctate@android.com",
        "time": "Thu Jul 17 17:43:24 2014 +0000"
      },
      "message": "Add BackupAgent.onRestoreFinished() callback\n\nThe agent\u0027s onRestoreFinished() method is called after all available\ndata has been delivered to the app, whether via the key/value restore\nAPI or the full-data file-at-a-time API.  This gives the app a stable\nopportunity to do any postprocessing that might be appropriate.\n\nAlso fixes a lingering bug in the framework\u0027s handling of backup\nagent lifetimes.  In cases where an existing agent instances was\nbeing rebound, the framework was forgetting to notify the dependent\nthat the agent was available.  This was causing timeouts and restore\nfailure.\n\nBug 16241004\n\nChange-Id: I3f52b299312d30d38b0cba63a2cfaeb934991ef2\n"
    },
    {
      "commit": "a176d22110a1670f363ba0f745f127d2b6ca2350",
      "tree": "e29f8208c1d3de0773e7697f049e3a53f6ec8c8a",
      "parents": [
        "ac17c2a8c9ba85efdd35f0262d05a41554eb3775"
      ],
      "author": {
        "name": "Christopher Tate",
        "email": "ctate@google.com",
        "time": "Wed Jul 16 12:15:07 2014 -0700"
      },
      "committer": {
        "name": "Christopher Tate",
        "email": "ctate@google.com",
        "time": "Wed Jul 16 13:10:58 2014 -0700"
      },
      "message": "Always call finishBackup() if performFullBackup() succeeded\n\nEven if we later get an error from sendBackupData() we need to give\nthe transport its teardown callback.  This simplifies the transport\nlogic considerably.\n\nChange-Id: Ib8c0e210d4a876ee6b083a4d619dfccc462da4e5\n"
    },
    {
      "commit": "a7835b6b6b00923b608a6bc3194e7840f67de7a8",
      "tree": "17f914d3a2e608714d3833c90d6c0cf2db6ffc7b",
      "parents": [
        "4ad58a4738048ade35f4bee91554dd84aeab3f88"
      ],
      "author": {
        "name": "Christopher Tate",
        "email": "ctate@google.com",
        "time": "Fri Jul 11 17:25:57 2014 -0700"
      },
      "committer": {
        "name": "Christopher Tate",
        "email": "ctate@android.com",
        "time": "Mon Jul 14 22:56:04 2014 +0000"
      },
      "message": "Add Context.getNoBackupFilesDir()\n\nThis is an app-private filesystem space exactly like the one\nreported by Context.getFilesDir(), with one exception:  files\nplaced here are never backed up by the full-backup infrastructure.\nIf an app attempts to back up any of its contents via the normal\nAPI it\u0027s immediately ignored with a logged warning.\n\nThe restriction is also enforced on the restore side, because\napps using support libraries might wind up creating full backup\narchives containing no_backup subdirs on pre-L devices (via\nadb backup, Helium, \u0026c.).  We check for this before passing the\nrestore data to the app, and drop it if we detect the situation\nso that the app never sees the bits.\n\nBug 16240573\n\nChange-Id: I11216a391f1d32117ec7ce15aafc9cd93d0337de\n"
    },
    {
      "commit": "8f1bb3a0d47a4cb34471464dff2af932772a7ade",
      "tree": "1f6e9901c83aaf866d77f83f0966f02ac3284c17",
      "parents": [
        "8d3cd2c8cf8ec355265941a8457ffd8e2e348648"
      ],
      "author": {
        "name": "Christopher Tate",
        "email": "ctate@google.com",
        "time": "Tue Jul 08 11:08:50 2014 -0700"
      },
      "committer": {
        "name": "Christopher Tate",
        "email": "ctate@google.com",
        "time": "Tue Jul 08 13:00:33 2014 -0700"
      },
      "message": "Fix NPE in platform restore\n\nBug 16061451\n\nChange-Id: I79d7913455886828a493a0c4ea850d259bfeeeab\n"
    },
    {
      "commit": "d746057f2414cba2bdc69257cc5be8cb681bb592",
      "tree": "d25c88f1e3e5406bdb3fa149df0cb596602a302f",
      "parents": [
        "255edb556e289a53d1c62a700028c25dab90010e"
      ],
      "author": {
        "name": "Jeff Sharkey",
        "email": "jsharkey@android.com",
        "time": "Sun Jul 06 20:44:55 2014 -0700"
      },
      "committer": {
        "name": "Jeff Sharkey",
        "email": "jsharkey@android.com",
        "time": "Tue Jul 08 00:38:57 2014 -0700"
      },
      "message": "Change new file installs to be cluster-based!\n\nNow that all the other pieces are in place, we\u0027re ready to start\ninstalling new file-based packages as a cluster (the new unified\ndirectory-based layout).  This greatly simplifies the renaming\nprocess.\n\nAlso add helper methods to ApplicationInfo to give a much clearer\nmapping between it and internal field names, since we can\u0027t change\nthe public API.\n\nAdd recursive restorecon().\n\nBug: 14975160\nChange-Id: I72a63c5ddbc594c2fec4a91dd59f73ef253fbfd7\n"
    },
    {
      "commit": "51fea57e06fcb1dab1d239a5fff6e75ba2b7cee7",
      "tree": "a11647d14f291a4f8bfcfdab2e34cff6c16e8c03",
      "parents": [
        "9a347f199284ad8bcb8a81bfbd306fe0b1a710ba"
      ],
      "author": {
        "name": "Christopher Tate",
        "email": "ctate@google.com",
        "time": "Mon Jun 23 17:01:06 2014 -0700"
      },
      "committer": {
        "name": "Christopher Tate",
        "email": "ctate@google.com",
        "time": "Mon Jun 30 17:43:05 2014 -0700"
      },
      "message": "Refactor restore to deal with heterogeneous datasets\n\nTransport-based restore now handles both key/value and full-data\n(stream) data delivery.\n\nAlso: PMBA now holds metadata for *all* apps, not just those with\nbackup agents.  Since we need to consult this for every restore-\nat-install operation we cache this locally now, tagged per transport\nand per remote dataset, to avoid having to re-download it as part\nof every future restore operation.\n\nAlso fixed a bug in LocalTransport that was preventing restore of\nkey/value datasets, i.e. all of them that were nominally available\nprior to this change.\n\nNOTE: at present there is no automatic full-data backup; if for\ntesting purposes you need to create some to then use for restore,\nyou still need to use \u0027bmgr fullbackup ...\u0027 to push them.\n\nNOTE: at present the unified transport restore uses a refactored\n\"engine\" implementation to handle stream data that encapsulates\nthe existing \"adb restore\" implementation.  However, the adb\nrestore code path has not yet been refactored to wrap the newly-\nextracted engine version; it still contains its own copy of all\nthe relevant logic.  This will change in a future CL, at which\npoint offline/USB archive restore will simply wrap the same\nshared stream-restore engine implementation.\n\nBug 15330073\nBug 15989617\n\nChange-Id: Ieedb18fd7836ad31ba24656ec9feaaf69e164af8\n"
    },
    {
      "commit": "6a49dd087f29cfca82d55dfabeb97439ef84b508",
      "tree": "485b8c340470472482fa8e79ac741f9dc0803543",
      "parents": [
        "6b2df21ecacfa6826a85cabdf8d6fe0e81fe11d9"
      ],
      "author": {
        "name": "Christopher Tate",
        "email": "ctate@google.com",
        "time": "Mon Jun 16 18:49:25 2014 -0700"
      },
      "committer": {
        "name": "Christopher Tate",
        "email": "ctate@google.com",
        "time": "Tue Jun 17 14:29:09 2014 -0700"
      },
      "message": "Tweak restore API\n\nWe need the transport to tell the system not only what package it\u0027s going\nto deliver data for next, but also what format that data is in.\n\nChange-Id: I989cf78febf923a4208acb33ed80ccc7869356f5\n"
    },
    {
      "commit": "9ff53a7100b1a40f5d2df3eb19a2f3f2fff39a46",
      "tree": "162c23a51e116f9506e7d6801236dd2e2c8f3788",
      "parents": [
        "ad60891a6ecaf2a5815677b33e96afe7f49ee113"
      ],
      "author": {
        "name": "Christopher Tate",
        "email": "ctate@google.com",
        "time": "Tue Jun 03 17:20:07 2014 -0700"
      },
      "committer": {
        "name": "Christopher Tate",
        "email": "ctate@google.com",
        "time": "Sun Jun 15 17:35:33 2014 -0700"
      },
      "message": "Implement full data backup through transport\n\nCurrently no timed/scheduled full-data backup operations are\nperformed by the OS, but the plumbing is now in place and can\nbe tested using \u0027adb shell bmgr fullbackup pkg [pkg2 pkg3 ...]\u0027.\n\nThe LocalTransport test transport implementation has been augmented\nto support the new full-data backup API as well.\n\nIn addition, \u0027adb backup\u0027 now takes the -compress/-nocompress\ncommand line options to control whether the resulting archive is\ncompressed before leaving the device.  Previously the archive was\nalways compressed.  (The default is still to compress, as it will\nusually reduce the archive size considerably.)\n\nInternally, the core implementation of gathering the full backup\ndata stream from the target application has been refactored into\nan \"engine\" component that is shared by both \u0027adb backup\u0027 and the\ntransport-oriented full backup task.  The archive file header\ngeneration, encryption, and compression logic are now factored out\nof the engine itself instead of being hardwired into the data\nhandling.\n\nBug 15329632\n\nChange-Id: I4a044faa4070d684ef457bd3e11771198cdf557c\n"
    },
    {
      "commit": "4dd2635bf501ad1a1adc22a6ceb4c66cd61a1a23",
      "tree": "78f87822d8aa88f5213c016feae8e4cd0d515703",
      "parents": [
        "0dcecc1cab9e0586ccc4725a2dab068e78207387"
      ],
      "author": {
        "name": "Christopher Tate",
        "email": "ctate@google.com",
        "time": "Mon Jun 02 18:54:18 2014 -0700"
      },
      "committer": {
        "name": "Christopher Tate",
        "email": "ctate@google.com",
        "time": "Mon Jun 02 18:57:21 2014 -0700"
      },
      "message": "Add full-backup stream API to BackupTransport\n\nAlso started migrating the definition of transport success/failure constants\ninto BackupTransport to make them permanent.\n\nThe new methods are not yet plumbed in; this is just to allow forward\nprogress against a proposed stable API.\n\nBug 15329632\n\nChange-Id: I27472e09b831350c140b9fa548ebda3af334eb1a\n"
    },
    {
      "commit": "f97c63350abcc6715ba9fdc21fd3405d0f7ba716",
      "tree": "9eba371ad46dc3dd0b70e40ad494623421979fab",
      "parents": [
        "54dacbe7ca6d8a8c71d601fcf773e7b27eba3a53"
      ],
      "author": {
        "name": "Elliott Hughes",
        "email": "enh@google.com",
        "time": "Mon Apr 28 16:38:43 2014 -0700"
      },
      "committer": {
        "name": "Elliott Hughes",
        "email": "enh@google.com",
        "time": "Mon Apr 28 16:38:43 2014 -0700"
      },
      "message": "Move internal libcore.os users over to android.system.\n\nChange-Id: I84e1ace19ba3b4e58d7bb24f3ecda1bdf5dc75a5\n"
    },
    {
      "commit": "d4659698fe2c8d854089138000ec24193d8359b8",
      "tree": "3af669b5cd81c555dee196101690f2cf8c0ae004",
      "parents": [
        "121db9e8525163a867915adfd23a08cf1300d4fa"
      ],
      "author": {
        "name": "Christopher Tate",
        "email": "ctate@google.com",
        "time": "Tue Apr 08 16:34:06 2014 -0700"
      },
      "committer": {
        "name": "Christopher Tate",
        "email": "ctate@google.com",
        "time": "Tue Apr 08 17:10:54 2014 -0700"
      },
      "message": "Don\u0027t crash on null installer package bookkeeping.\n\nBug 13906859\n\nChange-Id: I926ccc5620abae8b97bd2b7de21b82b7729e78dd\n"
    },
    {
      "commit": "a99d02170bc0e54f729b2b735571c8eea8d5034d",
      "tree": "daf6ef3f61fa93d3a638616685d6706f04c4f97d",
      "parents": [
        "118d113478a2c58e7997f926a8dd1bc5ca5f5dc8"
      ],
      "author": {
        "name": "Christopher Tate",
        "email": "ctate@google.com",
        "time": "Fri Apr 04 16:58:10 2014 -0700"
      },
      "committer": {
        "name": "Christopher Tate",
        "email": "ctate@google.com",
        "time": "Fri Apr 04 17:40:34 2014 -0700"
      },
      "message": "Back up the preferred home app, if any\n\nIf the user has stated a preference about their home app, make sure we\ncapture that so that a system restore can return them to that preferred\nsituation.  It\u0027s built into the system metadata so that we can, if\nnecessary, fast-path configuration of that home app while the rest of\nthe restore operation is in flight.\n\nChange-Id: I64dfee8f7a2a9e40f556cd19298d7b367c6aa8dc\n"
    },
    {
      "commit": "cba5941c6085dab1566bc047c1ea31f58a2dd4cf",
      "tree": "65f1da5c842078cebbc4db4d547ae80243e66271",
      "parents": [
        "4bb047fa5e6d43a027bfe1dfe23b3541e3910a31"
      ],
      "author": {
        "name": "Christopher Tate",
        "email": "ctate@google.com",
        "time": "Tue Apr 01 10:38:29 2014 -0700"
      },
      "committer": {
        "name": "Christopher Tate",
        "email": "ctate@google.com",
        "time": "Tue Apr 01 16:43:00 2014 -0700"
      },
      "message": "Rejigger the invalid-key checks at backup time\n\nBug 13732002\n\nChange-Id: Ic8f71234d1bbc7420eaa8e1762b999d09f308d46\n"
    },
    {
      "commit": "adfe8b86e9178a553b6db9722340fa4ff5201cf1",
      "tree": "2054d99dc17b0ada61693b97d9f3e306b4fe4d4a",
      "parents": [
        "aef4f6ebc8f8eb1f9fbfbe4ae2556c9f1a26a63c"
      ],
      "author": {
        "name": "Christopher Tate",
        "email": "ctate@google.com",
        "time": "Tue Feb 04 16:23:32 2014 -0800"
      },
      "committer": {
        "name": "Christopher Tate",
        "email": "ctate@google.com",
        "time": "Thu Mar 20 12:30:51 2014 -0700"
      },
      "message": "App widget backup/restore infrastructure\n\nBackup/restore now supports app widgets.\n\nAn application involved with app widgets, either hosting or publishing,\nnow has associated data in its backup dataset related to the state of\nwidget instantiation on the ancestral device.  That data is processed\nby the OS during restore so that the matching widget instances can be\n\"automatically\" regenerated.\n\nTo take advantage of this facility, widget-using apps need to do two\nthings:  first, implement a backup agent and store whatever widget\nstate they need to properly deal with them post-restore (e.g. the\nwidget instance size \u0026 location, for a host); and second, implement\nhandlers for new AppWidgetManager broadcasts that describe how to\ntranslate ancestral-dataset widget id numbers to the post-restore\nworld.  Note that a host or provider doesn\u0027t technically need to\nstore *any* data on its own via its agent; it just needs to opt in\nto the backup/restore process by publishing an agent.  The OS will\nthen store a small amount of data on behalf of each widget-savvy\napp within the backup dataset, and act on that data at restore time.\n\nThe broadcasts are AppWidgetManager.ACTION_APPWIDGET_RESTORED and\nACTION_APPWIDGET_HOST_RESTORED, and have three associated extras:\n\n    EXTRA_APPWIDGET_OLD_IDS\n    EXTRA_APPWIDGET_IDS\n    EXTRA_HOST_ID [for the host-side broadcast]\n\nThe first two are same-sized arrays of integer widget IDs.  The\n_OLD_IDS values are the widget IDs as known to the ancestral device.\nThe _IDS array holds the corresponding widget IDs in the new post-\nrestore environment.  The app should simply update the stored\nwidget IDs in its bookkeeping to the new values, and things are\noff and running.  The HOST_ID extra, as one might expect, is the\napp-defined host ID value of the particular host instance which\nhas just been restored.\n\nThe broadcasts are sent following the conclusion of the overall\nrestore pass.  This is because the restore might have occurred in a\ntightly restricted lifecycle environment without content providers\nor the package\u0027s custom Application class.  The _RESTORED broadcast,\nhowever, is always delivered into a normal application environment,\nso that the app can use its content provider etc as expected.\n\n*All* widget instances that were processed over the course of the\nsystem restore are indicated in the _RESTORED broadcast, even if\nthe backing provider or host is not yet installed.  The widget\nparticipant is responsible for understanding that these are\npromises that might be fulfilled later rather than necessarily\nreflecting the immediate presentable widget state.  (Remember\nthat following a cloud restore, apps may be installed piecemeal\nover a lengthy period of time.)  Telling the hosts up front\nabout all intended widget instances allows them to show placeholder\nUI or similarly useful information rather than surprising the user\nwith piecemeal unexpected appearances.\n\nThe AppWidgetProvider helper class has been updated to add a new\ncallback, onRestored(...), invoked when the _RESTORED broadcast\nis received.  The call to onRestored() is immediately followed by\nan invocation of onUpdate() for the affected widgets because\nthey will need to have their RemoteViews regenerated under the\nnew ID values.\n\nBug 10622506\nBug 10707117\n\nChange-Id: Ie0007cdf809600b880d91989c00c3c3b8a4f988b\n"
    },
    {
      "commit": "cb20740ee171de3e604c07cdd02963d4d08a5fc9",
      "tree": "9692f596099b9fcdc4a25c00051fb443f430329e",
      "parents": [
        "fd2c77ca249ec2d6746ff426d191fb3991b6ea3d"
      ],
      "author": {
        "name": "Christopher Tate",
        "email": "ctate@google.com",
        "time": "Wed Mar 05 17:22:25 2014 -0800"
      },
      "committer": {
        "name": "Christopher Tate",
        "email": "ctate@google.com",
        "time": "Wed Mar 05 17:22:25 2014 -0800"
      },
      "message": "Fix build.  Silly gits.\n\nChange-Id: I8f21b7239621da500d9a73eb17d350e06dda9b20\n"
    },
    {
      "commit": "ff8b037c10a7ce90cbb6130b49c8cb076e1e7c0f",
      "tree": "3fad37a57528bf2fcf29aef1319e368c587559d4",
      "parents": [
        "2665f6e9f5163d27608c21ed029a224d53ede43d"
      ],
      "author": {
        "name": "Christopher Tate",
        "email": "ctate@google.com",
        "time": "Wed Mar 05 22:20:56 2014 +0000"
      },
      "committer": {
        "name": "Christopher Tate",
        "email": "ctate@google.com",
        "time": "Wed Mar 05 16:17:34 2014 -0800"
      },
      "message": "am 777b8a80: am 422b2656: resolved conflicts for merge of c45ff35f to klp-modular-dev\n\n* commit \u0027777b8a808ee76401429f7210ebb7194632040d45\u0027:\n  Adapt to underlying changes in the PBKDF2 implementation\n\nChange-Id: Ia68694a03e52693fceaedc6740dbd8e690e21257\n"
    },
    {
      "commit": "5c38516e83f772fe04176f72f2ab7a1094e17430",
      "tree": "d80c1fbf54725e80a7e53ceaf72ea11890aa71fa",
      "parents": [
        "3651cb7b4a0c3c731905301e868cca1c3af5aa21"
      ],
      "author": {
        "name": "Christopher Tate",
        "email": "ctate@google.com",
        "time": "Mon Mar 03 12:03:09 2014 -0800"
      },
      "committer": {
        "name": "Christopher Tate",
        "email": "ctate@google.com",
        "time": "Mon Mar 03 12:03:09 2014 -0800"
      },
      "message": "Don\u0027t hang installs if the transport disappears\n\nBug 12991308\n\nChange-Id: Ie5d3d27fe565dd4014976f5333e37b5707acb707\n"
    },
    {
      "commit": "091e8d2aefe39cec85f64d74898354fff596735c",
      "tree": "ad2ad9fe0263db49546abed4cdfc6c519d6f1bf9",
      "parents": [
        "cab8617b8ccea3a99b1ee15e15915c512a10c738"
      ],
      "author": {
        "name": "Narayan Kamath",
        "email": "narayan@google.com",
        "time": "Tue Feb 11 09:40:19 2014 +0000"
      },
      "committer": {
        "name": "Narayan Kamath",
        "email": "narayan@google.com",
        "time": "Tue Feb 11 09:40:19 2014 +0000"
      },
      "message": "Fix build.\n\ncom.android.server.SystemServer was no longer imported\non master.\n\nChange-Id: Ie712aa28940953952aa7a99cbb22f74129649249\n"
    },
    {
      "commit": "cab8617b8ccea3a99b1ee15e15915c512a10c738",
      "tree": "48d07ae2e7f69eadd4e7cd8c7d20c4ea6b37bda1",
      "parents": [
        "33fa09b1ffe8d14d146de4b2632103d831ff8988",
        "25df673b849de374cf1de40250dfd8a48b7ac28b"
      ],
      "author": {
        "name": "Jeff Brown",
        "email": "jeffbrown@google.com",
        "time": "Tue Feb 11 08:33:50 2014 +0000"
      },
      "committer": {
        "name": "Android Git Automerger",
        "email": "android-git-automerger@android.com",
        "time": "Tue Feb 11 08:33:50 2014 +0000"
      },
      "message": "am 25df673b: am 1b51c9cb: Merge \"Make SystemService constructor take a Context.\" into klp-modular-dev\n\n* commit \u002725df673b849de374cf1de40250dfd8a48b7ac28b\u0027:\n  Make SystemService constructor take a Context.\n"
    },
    {
      "commit": "b880d880c6cd989eacc28c365fc9a41d31900da1",
      "tree": "660d93bbe7f1b74aa9eac16ac69efe16f67f346e",
      "parents": [
        "d9f9da396b41f394991f676bc74dcfc59c7070a8"
      ],
      "author": {
        "name": "Jeff Brown",
        "email": "jeffbrown@google.com",
        "time": "Mon Feb 10 19:47:07 2014 -0800"
      },
      "committer": {
        "name": "Jeff Brown",
        "email": "jeffbrown@google.com",
        "time": "Mon Feb 10 20:01:43 2014 -0800"
      },
      "message": "Make SystemService constructor take a Context.\n\nThis change simplifies the process of initializing a SystemService\nby folding the onCreate() step back into the constructor.  It removes\nsome ambuiguity about what work should happen in the constructor and\nshould make it possible for services to retain most of their final\nfields after refactoring into the new pattern.\n\nChange-Id: I25f41af0321bc01898658ab44b369f9c5d16800b\n"
    },
    {
      "commit": "9f97de13359662c2709eed227b3fab2ce7d5dabc",
      "tree": "7eb16083cd5fd9d30999dfdead280311084c3e5a",
      "parents": [
        "2b1252ddd2650cb38918cb85d2a3711b2cfa8db5",
        "a5a93f559d337ad5b79716b05ea43707eb779dc8"
      ],
      "author": {
        "name": "Adam Lesinski",
        "email": "adamlesinski@google.com",
        "time": "Thu Feb 06 20:25:51 2014 +0000"
      },
      "committer": {
        "name": "Android Git Automerger",
        "email": "android-git-automerger@android.com",
        "time": "Thu Feb 06 20:25:51 2014 +0000"
      },
      "message": "am a5a93f55: am 7f416631: Merge \"Check feature bits before loading optional services\" into klp-modular-dev\n\n* commit \u0027a5a93f559d337ad5b79716b05ea43707eb779dc8\u0027:\n  Check feature bits before loading optional services\n"
    },
    {
      "commit": "898c13df7b9b12ff10062f3542593e12fbe0c119",
      "tree": "323bc4d7da06b48af2079f44c5f8d346d265e956",
      "parents": [
        "df88d73092c62a1a3cd2b2056ca63ae2e70cc238"
      ],
      "author": {
        "name": "Adam Lesinski",
        "email": "adamlesinski@google.com",
        "time": "Tue Jan 28 15:34:50 2014 -0800"
      },
      "committer": {
        "name": "Adam Lesinski",
        "email": "adamlesinski@google.com",
        "time": "Wed Feb 05 19:26:40 2014 +0000"
      },
      "message": "Check feature bits before loading optional services\n\nAt startup, we check with PackageManager whether a system service is\navailable before attempting to load it. A system service is available\nif its associated feature (similar to hardware features) is present.\nThis does not remove unavailable services from the compiled jar.\n\nChange-Id: I13571805083aa4e65519a74acb52efd17b9fb3d7"
    },
    {
      "commit": "684d6f9f4d1a11069d9c9c1996fbc45cda7e7f04",
      "tree": "7ee6e7589b128dbd4d65c33551976980fe3c76aa",
      "parents": [
        "432005306dc26fcd613ca75b6bfca6c84fc96dcd"
      ],
      "author": {
        "name": "Christopher Tate",
        "email": "ctate@google.com",
        "time": "Mon Jan 13 13:48:22 2014 -0800"
      },
      "committer": {
        "name": "Christopher Tate",
        "email": "ctate@google.com",
        "time": "Thu Jan 16 14:25:43 2014 -0800"
      },
      "message": "Adapt to underlying changes in the PBKDF2 implementation\n\nWe need to specify \"PBKDF2WithHmacSHA1And8bit\" now in order to get precisely\nthe same output as was previously generated with \"PBKDF2WithHmacSHA1\".  We\nalso now try both when it\u0027s ambiguous which was used to generate the archive\nchecksums.\n\nBug 12494407\n\nChange-Id: I5443f31a5e13c24f44445768b6e9a6eea221ede6\n"
    },
    {
      "commit": "e58a49e411327e26b6ad9939833f53c7fa5aef20",
      "tree": "a983bb17f76bcccef7cd94830525e7e7d02ce314",
      "parents": [
        "3c8a529b3c2a0bb1eceb3c1ec7afa58634ace044",
        "817ec49e7991d4cac50b2308cd7cf5f8641e1e29"
      ],
      "author": {
        "name": "Amith Yamasani",
        "email": "yamasani@google.com",
        "time": "Fri Dec 20 16:36:48 2013 -0800"
      },
      "committer": {
        "name": "Amith Yamasani",
        "email": "yamasani@google.com",
        "time": "Fri Dec 20 16:36:48 2013 -0800"
      },
      "message": "Merge commit \u0027817ec49e\u0027 into manualmerge\n\nConflicts:\n\tservices/print/java/com/android/server/print/PrintManagerService.java\n\nChange-Id: I1b9bf364ca50ee3c48f53d87ae0ce23e7f3c2bc2\n"
    },
    {
      "commit": "817ec49e7991d4cac50b2308cd7cf5f8641e1e29",
      "tree": "173ef0eb001119a0d093f0398769a3c0a0f5a369",
      "parents": [
        "9158825f9c41869689d6b1786d7c7aa8bdd524ce"
      ],
      "author": {
        "name": "Amith Yamasani",
        "email": "yamasani@google.com",
        "time": "Fri Dec 20 13:27:30 2013 -0800"
      },
      "committer": {
        "name": "Amith Yamasani",
        "email": "yamasani@google.com",
        "time": "Fri Dec 20 14:46:56 2013 -0800"
      },
      "message": "Wrap some services into a SystemService\n\nThese services can now be excluded by modifying the list of REQUIRED_SERVICES (TB renamed)\n\nChanged appwidget, devicepolicy, backup and print services.\n\nChange-Id: Id8e2855d5c045cd57bdb02dca9ed75172803bce7\n"
    },
    {
      "commit": "49782e46c0eb85a25ae2abcf80880c48dbab5aea",
      "tree": "9fab2a40c41004d78b7001dc766d85f61d24f582",
      "parents": [
        "4dace6f66d498c2d119adf265776aa83b28452af",
        "9158825f9c41869689d6b1786d7c7aa8bdd524ce"
      ],
      "author": {
        "name": "Amith Yamasani",
        "email": "yamasani@google.com",
        "time": "Thu Dec 19 23:30:35 2013 +0000"
      },
      "committer": {
        "name": "Android Git Automerger",
        "email": "android-git-automerger@android.com",
        "time": "Thu Dec 19 23:30:35 2013 +0000"
      },
      "message": "am 9158825f: Move some system services to separate directories\n\n* commit \u00279158825f9c41869689d6b1786d7c7aa8bdd524ce\u0027:\n  Move some system services to separate directories\n"
    },
    {
      "commit": "9158825f9c41869689d6b1786d7c7aa8bdd524ce",
      "tree": "f41944461539f0c70030668b4558296469c307d3",
      "parents": [
        "30d032928a294fbb6f385e9d0367a75b7bf2649b"
      ],
      "author": {
        "name": "Amith Yamasani",
        "email": "yamasani@google.com",
        "time": "Fri Nov 22 08:25:26 2013 -0800"
      },
      "committer": {
        "name": "Amith Yamasani",
        "email": "yamasani@google.com",
        "time": "Thu Dec 19 15:25:37 2013 -0800"
      },
      "message": "Move some system services to separate directories\n\nRefactored the directory structure so that services can be optionally\nexcluded. This is step 1. Will be followed by another change that makes\nit possible to remove services from the build.\n\nChange-Id: Ideacedfd34b5e213217ad3ff4ebb21c4a8e73f85\n"
    }
  ]
}
