)]}'
{
  "log": [
    {
      "commit": "1bc289c92c94855b208204974016cfd0dfd83fad",
      "tree": "d458889c4ff1b68620353358912088cfb2285105",
      "parents": [
        "c92a7d12e345e05272f3e84d49d75c77dc6e3edc",
        "4e94b8deaa646f176bad9b80d5924ce64142743e"
      ],
      "author": {
        "name": "Daichi Hirono",
        "email": "hirono@google.com",
        "time": "Thu Feb 25 08:37:13 2016 +0000"
      },
      "committer": {
        "name": "Android (Google) Code Review",
        "email": "android-gerrit@google.com",
        "time": "Thu Feb 25 08:37:14 2016 +0000"
      },
      "message": "Merge \"Resolve unmapped document when the device is connected.\" into nyc-dev"
    },
    {
      "commit": "5c690557cce825024f5dc9e5e686f256155691a3",
      "tree": "c0d7697ff2dfbf6dd0f80ee1e8662338a730970e",
      "parents": [
        "073f5aaec7256a693dbe09489ddd433ea8267898"
      ],
      "author": {
        "name": "Daichi Hirono",
        "email": "hirono@google.com",
        "time": "Sun Feb 21 16:00:03 2016 +0900"
      },
      "committer": {
        "name": "Daichi Hirono",
        "email": "hirono@google.com",
        "time": "Tue Feb 23 16:45:42 2016 +0900"
      },
      "message": "Delete disconnected row when the corresponding remote file is deleted in a\nMTP device.\n\nThe CL has MtpDatabase remove file metadata for the case.\n\n1. Files app opens a MTP device. MtpDocumentsProvider stores the\n   metadata of files in MtpDatabase.\n2. A user disconnects the MTP device. MtpDatabase marks the files\n   metadata as disconnected.\n3. A user operates the MTP device and deletes a file in the MTP device.\n4. A user connects the MTP device to Android again, and opens the MTP\n   device again in Files app.\n5. MtpDocumentsProvider updates the metadata of files, it should delete\n   metadata of a file that was deleted at step 3.\n\nBUG\u003d27280143\n\nChange-Id: I79b8df2457cd5b36d1706a9c6e3827c8e7d16208\n"
    },
    {
      "commit": "4e94b8deaa646f176bad9b80d5924ce64142743e",
      "tree": "94547d55b4aa4363ef6cbe7e8f10c9da5e0d84c4",
      "parents": [
        "073f5aaec7256a693dbe09489ddd433ea8267898"
      ],
      "author": {
        "name": "Daichi Hirono",
        "email": "hirono@google.com",
        "time": "Sun Feb 21 22:42:41 2016 +0900"
      },
      "committer": {
        "name": "Daichi Hirono",
        "email": "hirono@google.com",
        "time": "Tue Feb 23 14:39:08 2016 +0900"
      },
      "message": "Resolve unmapped document when the device is connected.\n\nOnce MTP device is disconnected from Android, the files on MTP device\nare marked as \u0027DISCONNECTED\u0027 in metadata database. These metadata will\nbe back when MtpDocumentsProvider finds the reconnected MTP device and\nfetches the files again.\n\nPreviously the \u0027DISCONNECTED\u0027 files are not automatically\nrefetched. User needs to see files in Documents UI again to reuse\ndocument ID of \u0027DISCONNECTED\u0027 files. The CL changes DocumentLoader so\nthat it automatically refetches disconnected documents.\n\nBUG\u003d26212981\n\nChange-Id: I5cb2cc9c11af72632e481c59a505794f43ed62ea\n"
    },
    {
      "commit": "f578fa275a535016f5322c88ad7a92e517d04a12",
      "tree": "5086c2749a77d45f940ec8a42cff8a3740ac028a",
      "parents": [
        "dd6e4c19842c83778efda0e4887854fc121e9faa"
      ],
      "author": {
        "name": "Daichi Hirono",
        "email": "hirono@google.com",
        "time": "Fri Feb 19 18:05:42 2016 +0900"
      },
      "committer": {
        "name": "Daichi Hirono",
        "email": "hirono@google.com",
        "time": "Fri Feb 19 18:05:42 2016 +0900"
      },
      "message": "Update object info when writing a file.\n\nThe MTP spec does not offer a way to update bytes of exisitng files, so\nour provider implementation creates a new file with new bytes and\nremoves old one.\n\nPreviously the new file uses new document ID and the exising document ID\nis expired. Also the provider does not update the metadata\ndatabase. Thus users see the old flie in DocumentsUI but actually the\nfiles is not accessible.\n\nThe CL updates the database with exisitng document ID, so that we can\naccess the new file with exisiting document ID.\n\nBUG\u003d26549400\n\nChange-Id: I629b707a2e662b34625e8b28857ef818d8933996\n"
    },
    {
      "commit": "ebd24051599280443435606cab220de33b9356ad",
      "tree": "8440a0fe7e871346bf728e3b9be0f27543d31b26",
      "parents": [
        "7d37da7086fbd60477a70a9fec79ddc444dfe8b8"
      ],
      "author": {
        "name": "Daichi Hirono",
        "email": "hirono@google.com",
        "time": "Sat Feb 06 21:05:57 2016 +0900"
      },
      "committer": {
        "name": "Daichi Hirono",
        "email": "hirono@google.com",
        "time": "Wed Feb 17 08:18:13 2016 +0000"
      },
      "message": "Use device key to map device documents.\n\nThe CL introduces MAPPING_KEY column to the database and lets Mapper use\nthe column to map IDs of devices.\n\nIt also removes the concept of mapping mode from Mapper for\nsimplyfing. Now Mapper just tries to multiple mapping keys (MTP\nidentifier, display name, and mapping key) to find candidate of ID\nmapping.\n\nBUG\u003d26212981\n\nChange-Id: I19f6c7dac146047e9978de4eb33d5076406037ad\n(cherry picked from commit 637a2010f4a0c0484b13c4cb87aa2858bdf079b2)\n"
    },
    {
      "commit": "0abde68519f62d001aa075235c6da2e594ffc186",
      "tree": "be9aaa0fff328be2dd05e2488c76bb57d39c3b21",
      "parents": [
        "46d537716e00878073a740101f1e1e088f728817",
        "2965776ba403ef1f6d9a0e870ebf3c44ee5d8373"
      ],
      "author": {
        "name": "Daichi Hirono",
        "email": "hirono@google.com",
        "time": "Fri Feb 12 02:51:16 2016 +0000"
      },
      "committer": {
        "name": "Android (Google) Code Review",
        "email": "android-gerrit@google.com",
        "time": "Fri Feb 12 02:51:17 2016 +0000"
      },
      "message": "Merge \"Add error message for locked device.\" into nyc-dev"
    },
    {
      "commit": "2965776ba403ef1f6d9a0e870ebf3c44ee5d8373",
      "tree": "4e765b96b917247646a9e2d2c85c9c8d2bed2a4a",
      "parents": [
        "c18f8076ebdb2cda8842cfda2583897aa2c388e1"
      ],
      "author": {
        "name": "Daichi Hirono",
        "email": "hirono@google.com",
        "time": "Wed Feb 10 16:55:37 2016 -0800"
      },
      "committer": {
        "name": "Daichi Hirono",
        "email": "hirono@google.com",
        "time": "Thu Feb 11 18:45:30 2016 -0800"
      },
      "message": "Add error message for locked device.\n\nIf the remote MTP device is a smartphone, it does not provide files\nuntil a user unlocks the device. The CL adds specific error message for\nthe situation.\n\nBUG\u003d26318917\n\nChange-Id: Ic4c34609c55ec9c99b7b8a9143d6dae3835784e3\n"
    },
    {
      "commit": "46d537716e00878073a740101f1e1e088f728817",
      "tree": "43a94c261824c8b1a0a9c88d38bd53dd52568b20",
      "parents": [
        "f77d612568efddc0e865fb50e52b94ac06500746",
        "1e3744441a1e4ead0a3c752644bee930be020698"
      ],
      "author": {
        "name": "Daichi Hirono",
        "email": "hirono@google.com",
        "time": "Fri Feb 12 02:38:29 2016 +0000"
      },
      "committer": {
        "name": "Android (Google) Code Review",
        "email": "android-gerrit@google.com",
        "time": "Fri Feb 12 02:38:29 2016 +0000"
      },
      "message": "Merge \"Open the connected device in Files app when tapping notification.\" into nyc-dev"
    },
    {
      "commit": "90b345138faee4a9c06df6b003f4a5186b55597a",
      "tree": "bb36006655e56751bc15b52c40517edada0f8ec8",
      "parents": [
        "f4fe20ad71fe35f628929dd3f1456811fb20e762",
        "c18f8076ebdb2cda8842cfda2583897aa2c388e1"
      ],
      "author": {
        "name": "Daichi Hirono",
        "email": "hirono@google.com",
        "time": "Fri Feb 12 01:02:52 2016 +0000"
      },
      "committer": {
        "name": "Android (Google) Code Review",
        "email": "android-gerrit@google.com",
        "time": "Fri Feb 12 01:02:53 2016 +0000"
      },
      "message": "Merge \"Show specific error message for busy device.\" into nyc-dev"
    },
    {
      "commit": "1e3744441a1e4ead0a3c752644bee930be020698",
      "tree": "206928f7b1d513a1c2268e2f2618925f011f702b",
      "parents": [
        "db338c2e907acb8a93d0519940a1c21125f6db1b"
      ],
      "author": {
        "name": "Daichi Hirono",
        "email": "hirono@google.com",
        "time": "Thu Feb 11 10:08:21 2016 -0800"
      },
      "committer": {
        "name": "Daichi Hirono",
        "email": "hirono@google.com",
        "time": "Thu Feb 11 16:36:49 2016 -0800"
      },
      "message": "Open the connected device in Files app when tapping notification.\n\nPreviously when tapping the MTP devce notification, MtpDocumentsProvider\nopens home direcotry in Files app. The CL adds data URI of connected\ndevice to the intent so that MtpDocumentsProvider can open the connected\ndevice\u0027s root in Files app.\n\nBUG\u003d26611224\nChange-Id: I97ecd6669852cd2fc875294cbcbf5660fbfaa0da\n"
    },
    {
      "commit": "c18f8076ebdb2cda8842cfda2583897aa2c388e1",
      "tree": "c44d12ee7e06966b6ac3ea5e1198c35753306a88",
      "parents": [
        "db338c2e907acb8a93d0519940a1c21125f6db1b"
      ],
      "author": {
        "name": "Daichi Hirono",
        "email": "hirono@google.com",
        "time": "Wed Feb 10 14:59:52 2016 -0800"
      },
      "committer": {
        "name": "Daichi Hirono",
        "email": "hirono@google.com",
        "time": "Thu Feb 11 12:45:55 2016 -0800"
      },
      "message": "Show specific error message for busy device.\n\nWhen MTP device is busy (e.g. used by other application),\nMtpDocumentsProvider cannot open the device. The CL introduces specific\nerror message for the case.\n\nBUG\u003d26694828\n\nChange-Id: Iffee2e1c554e4089601186469ff0eac2fd04decd\n"
    },
    {
      "commit": "ef2feefab704c07a7efd5fd3e6cbe83d0930b4f9",
      "tree": "30601060ab42976b1a32802af80fa5e0297e10f4",
      "parents": [
        "db338c2e907acb8a93d0519940a1c21125f6db1b"
      ],
      "author": {
        "name": "Daichi Hirono",
        "email": "hirono@google.com",
        "time": "Thu Feb 11 11:40:47 2016 -0800"
      },
      "committer": {
        "name": "Daichi Hirono",
        "email": "hirono@google.com",
        "time": "Thu Feb 11 12:41:39 2016 -0800"
      },
      "message": "Returns \"application/octet-stream\" for unknown types of MTP files.\n\nAccording to DocumentsContract mime type field is required.\nMtpDocumentsProvider should returns mime type for unknown types of MTP\nfiles as well.\n\nBUG\u003d27148801\n\nChange-Id: I7e4b832f6c00f438cf90190c074f204fdedceef5\n"
    },
    {
      "commit": "8e87364a67ada7ce92730182719f7820886c13bd",
      "tree": "f1792d1d9294f0b40d74874e50350376ce1abfdd",
      "parents": [
        "66a320d368e93a03d5aee33eac85807a227c0a3c"
      ],
      "author": {
        "name": "Daichi Hirono",
        "email": "hirono@google.com",
        "time": "Sun Feb 07 15:17:16 2016 +0900"
      },
      "committer": {
        "name": "Daichi Hirono",
        "email": "hirono@google.com",
        "time": "Wed Feb 10 16:59:22 2016 +0000"
      },
      "message": "Keep metadata of documents as disconnected status after the device is\ndisconnected.\n\nTo restore Document IDs when the device is reconnected, we need to keep\nthe metadata in database so that we can use it as hint to remap document\nID with new MTP IDs.\n\nBUG\u003d26212981\n\nChange-Id: Idcc93c41c09d082a709281022c56188dabc80515\n(cherry picked from commit 53f5af3f2ba1328d301a0f8a4ae3f574ccc5da65)\n"
    },
    {
      "commit": "619afdaae1ec7dcbd71bb1f698a0901a1fa290fe",
      "tree": "d596d5cda2b8e665b9148492adcd201c56cf19ea",
      "parents": [
        "65d9a51afa792226478600a205b5c764714e226c"
      ],
      "author": {
        "name": "Daichi Hirono",
        "email": "hirono@google.com",
        "time": "Sun Feb 07 14:23:43 2016 +0900"
      },
      "committer": {
        "name": "Daichi Hirono",
        "email": "hirono@google.com",
        "time": "Wed Feb 10 02:17:28 2016 +0000"
      },
      "message": "Check parent existance when adding/removing documents.\n\nBUG\u003d26212981\nChange-Id: I8109e2324c027ec2182c6f521d57f3fe078a8660\n(cherry picked from commit df803ec6ebd47ddc7f97ea8ef13aa359ecc7fb95)\n"
    },
    {
      "commit": "9fca541ab8acb06bb390319251526fa9807b846f",
      "tree": "a06e25412bdfb31007e717d37d4db03a9a218508",
      "parents": [
        "8b67c1697e87b77750301e59cb57e8b4f76feeda"
      ],
      "author": {
        "name": "Daichi Hirono",
        "email": "hirono@google.com",
        "time": "Sun Feb 07 13:20:22 2016 +0900"
      },
      "committer": {
        "name": "Daichi Hirono",
        "email": "hirono@google.com",
        "time": "Tue Feb 09 18:36:27 2016 +0000"
      },
      "message": "Relax mapping rule to make the mapping logic simple.\n\nMtpDocumentsProvider remembers the mapping between SAF\u0027s ID and MTP\u0027s\nID. Sometimes we need to do heuristic to restore the mapping when MTP\ndevice is reconnected.\n\nPreviously we do the mapping files that shares the same name more\nstrictly. For example,\n\n1. Found file name \"test.txt\". Assign document ID \"1\".\n2. MTP device is disconnected and the MTP ID of \"1\" is lost.\n3. Found two files that have same name \"test.txt\" in the same directory.\n\nPreviously we don\u0027t reuse existing document ID \"1\" for neither of two\n\"test.txt\" because it\u0027s not 1-to-1 mapping and we cannot determine which\none should be mapped with existing document ID. It means we need the\ncomplete list of files in a directory to remap IDs. It takes long time\nto fetch all file names in a directory when a directory has 100+\nfiles. It\u0027s rare that a MTP device has the two files sharing the same\nname in the same directory. Also the strict rule makes the mapping code\nmore complex.\n\nThe CL relax the rule of mapping, and it allows to reuse existing\ndocument ID even if it is not 1-to-1 mapping. For the previous example,\nit assigns \"1\" for either of \"test.txt\".\n\nBUG\u003d27053734\nChange-Id: I19406fafc21f13ab94ba99411ce5e7f55ce7f658\n(cherry picked from commit acdbc6e740ffbd465488b6eb0cf9388d43ae860a)\n"
    },
    {
      "commit": "bf1c50130612b20c904124cbb86d98289ebbdb5a",
      "tree": "4edd4b776f402ff0659d61bcd691ba6c8313075f",
      "parents": [
        "6213cefbc06170f9463abf40c240322be11047bc",
        "cfaab20c24ab1790a6aa353d9a1005b5850a7144"
      ],
      "author": {
        "name": "Daichi Hirono",
        "email": "hirono@google.com",
        "time": "Fri Feb 05 09:14:37 2016 +0000"
      },
      "committer": {
        "name": "Android (Google) Code Review",
        "email": "android-gerrit@google.com",
        "time": "Fri Feb 05 09:14:37 2016 +0000"
      },
      "message": "Merge \"Fix NullPointerException around getObjectInfo.\""
    },
    {
      "commit": "6213cefbc06170f9463abf40c240322be11047bc",
      "tree": "6f5f93821ca52bafdd11181fa8dea92eb81110bc",
      "parents": [
        "9640477e3cc075b0f303e817a3ebcc72d7bc878b"
      ],
      "author": {
        "name": "Daichi Hirono",
        "email": "hirono@google.com",
        "time": "Fri Feb 05 17:21:13 2016 +0900"
      },
      "committer": {
        "name": "Daichi Hirono",
        "email": "hirono@google.com",
        "time": "Fri Feb 05 17:21:13 2016 +0900"
      },
      "message": "Fetch mime type from file name when format code does not help.\n\nMTP spec defines format code as a file type of object, but we don\u0027t have\nformat code for some file types like PDF. This CL adds fallback that\ntries to obtain mime type from file name in such case.\n\nBUG\u003d27004957\n\nChange-Id: Id61352bf4726f4e044e57edadcefbf179fe3f882\n"
    },
    {
      "commit": "cfaab20c24ab1790a6aa353d9a1005b5850a7144",
      "tree": "b1fd5613a944ba002a6fb7d20e936fd4823465a8",
      "parents": [
        "9640477e3cc075b0f303e817a3ebcc72d7bc878b"
      ],
      "author": {
        "name": "Daichi Hirono",
        "email": "hirono@google.com",
        "time": "Fri Feb 05 16:04:19 2016 +0900"
      },
      "committer": {
        "name": "Daichi Hirono",
        "email": "hirono@google.com",
        "time": "Fri Feb 05 16:04:19 2016 +0900"
      },
      "message": "Fix NullPointerException around getObjectInfo.\n\nBUG\u003d27000341\n\nChange-Id: I8888b627c62e9baaf91c19194dc89d95c65b8225\n"
    },
    {
      "commit": "f83ccbd7edd32e728785fb7aad44f11886e79645",
      "tree": "c07f9472cc653670a6435909dce19650f882c934",
      "parents": [
        "19aa93249edc5dac01025456ce3bb1881f1b11d1"
      ],
      "author": {
        "name": "Daichi Hirono",
        "email": "hirono@google.com",
        "time": "Thu Feb 04 16:58:55 2016 +0900"
      },
      "committer": {
        "name": "Daichi Hirono",
        "email": "hirono@google.com",
        "time": "Thu Feb 04 17:27:52 2016 +0900"
      },
      "message": "Drop device name from storage document name.\n\nWhen device has multiple storages, storage are shown as directory under\nthe device root. In this case, we would not like to add device name to\nstorage.\n\nNote that we still use \"device name + storage name\" for root name if the\ndevice has a single storage because we skip storage directory in this\ncase and shows storage\u0027s contents directly under the device.\n\nBUG\u003d26625708\n\nChange-Id: Ie13b044e71ae9b5131c4a01ee9d605023d05f168\n"
    },
    {
      "commit": "19aa93249edc5dac01025456ce3bb1881f1b11d1",
      "tree": "79244126812d2c8d12fdcd3a10b0a8234f80b8d4",
      "parents": [
        "fda7474c5faae1e36a9274d8a5fe83e42ec6503b"
      ],
      "author": {
        "name": "Daichi Hirono",
        "email": "hirono@google.com",
        "time": "Thu Feb 04 14:19:52 2016 +0900"
      },
      "committer": {
        "name": "Daichi Hirono",
        "email": "hirono@google.com",
        "time": "Thu Feb 04 14:19:52 2016 +0900"
      },
      "message": "Fix Identifier.equals method.\n\nPreviously the string was compared by \u003d\u003d.\n\nBUG\u003d26970351\n\nChange-Id: If88b74392955388c9bf59002f2d2a186c2dff71a\n"
    },
    {
      "commit": "fda7474c5faae1e36a9274d8a5fe83e42ec6503b",
      "tree": "6c5c102a9293f2ba4524cd4355f3cae1fa910ebd",
      "parents": [
        "6a5ea7eae8a70bced97ceef051c965c27cb642ca"
      ],
      "author": {
        "name": "Daichi Hirono",
        "email": "hirono@google.com",
        "time": "Mon Feb 01 13:00:31 2016 +0900"
      },
      "committer": {
        "name": "Daichi Hirono",
        "email": "hirono@google.com",
        "time": "Thu Feb 04 12:45:58 2016 +0900"
      },
      "message": "Open MTP device on demand.\n\nPreviously MtpDocumentsProvider opens a device just after device is\nconnected to Android. But MtpDocumentsProvider should open MTP device on\ndemand so that other applications can open device if user starts to use\nthe application before using MtpDocumentsProvider.\n\nBUG\u003d26625708\n\nChange-Id: I6083b8c7cef49ee6e9fb0d15ca4adc129734f3eb\n"
    },
    {
      "commit": "6a5ea7eae8a70bced97ceef051c965c27cb642ca",
      "tree": "ac67beb44254506b4097e9e925ec24948d18a414",
      "parents": [
        "b8bcd19975e5b1de26297682d214f2f2c216e20b"
      ],
      "author": {
        "name": "Daichi Hirono",
        "email": "hirono@google.com",
        "time": "Tue Feb 02 16:35:03 2016 +0900"
      },
      "committer": {
        "name": "Daichi Hirono",
        "email": "hirono@google.com",
        "time": "Wed Feb 03 15:53:48 2016 +0900"
      },
      "message": "Move logic to skip single storage.\n\nThe tree structure of MTP model looks like /device/storage/objects. But\nalmost all MTP device has only single storage, so it\u0027s redundant to show\na single storage as a child of device in UI.\n\nMtpDocumentsProvider has a special logic to skip single storage, and\nshows storage\u0027s object as a children of device in such case. Previously\nthe logic was applied when MtpDocumentsProvider returned a root\nlist. The provider returns a storage as a Documents.Root, instead of\ndevice if the device has only one storage.\n\nHowever the number of root cannot be obtain for closed device. Thus the\nprevious logic did not work for closed devices that have a single\nstorage. The CL moves the logic from queryRoot to\nqueryChildDocuments. Now MtpDocumentsProvider always returns a device as\nroot, then it returns storage\u0027s objects as the device\u0027s children, where\nwe has already opened the device.\n\nBUG\u003d26481574\n\nChange-Id: I25af0fc220410e321a378d67f226798ec4bba19c\n"
    },
    {
      "commit": "163e4b6ae8a51421c8a9cccfdc2fe872afd09971",
      "tree": "460fde26da7d9c6fa1641223c7b987341bf5d218",
      "parents": [
        "7fa765a40e98ac77d79867b2109779728d9df5a7"
      ],
      "author": {
        "name": "Daichi Hirono",
        "email": "hirono@google.com",
        "time": "Mon Jan 18 18:05:17 2016 +0900"
      },
      "committer": {
        "name": "Daichi Hirono",
        "email": "hirono@google.com",
        "time": "Mon Feb 01 13:28:01 2016 +0900"
      },
      "message": "Add launch notification for MTP devices.\n\nThe CL adds launch notification that are shown after MTP/PTP device is\nconnected to Android device. By tapping the notification, Users can\nlaunch an applicaiton that can handle USB_DEVICE_ATTACHED intent of MTP\ndevice.\n\nBUG\u003d26611224\n\nChange-Id: I6fd179ccd436531dfff6ff9a50dc2b754c20f190\n"
    },
    {
      "commit": "f11f14cbdeef707e0e0f9e1825d1b1d621722130",
      "tree": "ce9e02e5b26f2a43bb7f9e44ba4e10f2eaa61e51",
      "parents": [
        "2d8d083dc7e194ff3d634d0df6d8a4af7bee97c0",
        "83983d75cb075be201a53eaf01057931512e2917"
      ],
      "author": {
        "name": "Daichi Hirono",
        "email": "hirono@google.com",
        "time": "Fri Jan 29 09:17:07 2016 +0000"
      },
      "committer": {
        "name": "Android (Google) Code Review",
        "email": "android-gerrit@google.com",
        "time": "Fri Jan 29 09:17:07 2016 +0000"
      },
      "message": "Merge \"Return NULL available bytes when the MTP device is closed.\""
    },
    {
      "commit": "83983d75cb075be201a53eaf01057931512e2917",
      "tree": "8d0e62522f57a6843a6e2830b6236072d5c83ee2",
      "parents": [
        "3842e318b2175888e2fe1665d106b5653be5470b"
      ],
      "author": {
        "name": "Daichi Hirono",
        "email": "hirono@google.com",
        "time": "Fri Jan 29 17:37:36 2016 +0900"
      },
      "committer": {
        "name": "Daichi Hirono",
        "email": "hirono@google.com",
        "time": "Fri Jan 29 17:37:36 2016 +0900"
      },
      "message": "Return NULL available bytes when the MTP device is closed.\n\nBefore MtpDocumentsProvider opens a device, it cannot fetch the storage\nsize. Currently it says 0 bytes available. But actually it is unknown.\n\nBUG\u003d26866812\n\nChange-Id: I3f24773da8e76fe1092c11f1335aac9703f1b3f9\n"
    },
    {
      "commit": "2f310f6d5d352817f42384394b50a660ad6e0bf8",
      "tree": "0ca47d05e81949f6443b3a5d30c2eb747506dcd3",
      "parents": [
        "5012919bc3a75d1de972d29f70ae4a493f3493ed"
      ],
      "author": {
        "name": "Daichi Hirono",
        "email": "hirono@google.com",
        "time": "Wed Jan 27 12:34:29 2016 +0900"
      },
      "committer": {
        "name": "Daichi Hirono",
        "email": "hirono@google.com",
        "time": "Thu Jan 28 14:09:26 2016 +0900"
      },
      "message": "Reuse buffer when reading bytes from files.\n\nPreviously AppFuse getObjectBytes returns byte array and the array\u0027s\nlength needs to equals to the exact number of bytes the method read.\n\nThe CL change the function signature so that it can return the number of\nread bytes. And reuse a buffer array instead of slicing the array with\nvalid length.\n\nBUG\u003dNone\n\nChange-Id: I78b714554cac9ae71b895cb8929bc98969f5a8ca\n"
    },
    {
      "commit": "a4d207cf649af273f25f5e1f6207fd71711d3610",
      "tree": "3e8da6f4c47ac0e5ca80e073504e2c9da6dc691e",
      "parents": [
        "a68cf3c4a74fc9939fcdaae0df4e3a0711293739",
        "b36b15586a5d3d0de590773ce4392fa3a82af66a"
      ],
      "author": {
        "name": "Daichi Hirono",
        "email": "hirono@google.com",
        "time": "Tue Jan 26 07:51:49 2016 +0000"
      },
      "committer": {
        "name": "Android (Google) Code Review",
        "email": "android-gerrit@google.com",
        "time": "Tue Jan 26 07:51:49 2016 +0000"
      },
      "message": "Merge \"Fix bugs that prevent from using AppFuse.\""
    },
    {
      "commit": "b36b15586a5d3d0de590773ce4392fa3a82af66a",
      "tree": "128296a8e0d77083fabab15bd3c79a802fb52640",
      "parents": [
        "e76958297a52de290e8d985a8a5d56c12ba8c779"
      ],
      "author": {
        "name": "Daichi Hirono",
        "email": "hirono@google.com",
        "time": "Mon Jan 25 14:26:14 2016 +0900"
      },
      "committer": {
        "name": "Daichi Hirono",
        "email": "hirono@google.com",
        "time": "Tue Jan 26 16:30:08 2016 +0900"
      },
      "message": "Fix bugs that prevent from using AppFuse.\n\n * Allow buffer size that is greater than requested read size in JNI,\n   because we reuse fixed-size buffer among multiple requests.\n * Fix condition to check if the file size is greater than 4GB or\n   not. We need to use 0xffffffffl instead of 0xffffffff because\n   0xffffffff is int and its value is -1.\n\nBUG\u003dNone\nChange-Id: I155916e139353b15dc1ab535234faf50d942996d\n"
    },
    {
      "commit": "7d1ca068a229191653f66e440f4209a2a2c3f05e",
      "tree": "091dba57919821cd8638878de586bacb0e02c174",
      "parents": [
        "e76958297a52de290e8d985a8a5d56c12ba8c779",
        "e6bffff9d944390a7656f003fac4d47359fae0db"
      ],
      "author": {
        "name": "Daichi Hirono",
        "email": "hirono@google.com",
        "time": "Mon Jan 25 08:28:23 2016 +0000"
      },
      "committer": {
        "name": "Android (Google) Code Review",
        "email": "android-gerrit@google.com",
        "time": "Mon Jan 25 08:28:23 2016 +0000"
      },
      "message": "Merge \"Update \"accessing files\" notification resources.\""
    },
    {
      "commit": "e6bffff9d944390a7656f003fac4d47359fae0db",
      "tree": "de59810e2841ea6a913f84e7830b2ecb0a0faf18",
      "parents": [
        "69c8cc2930a657d68a3b0365f6aa9e7524889c70"
      ],
      "author": {
        "name": "Daichi Hirono",
        "email": "hirono@google.com",
        "time": "Mon Jan 25 16:06:57 2016 +0900"
      },
      "committer": {
        "name": "Daichi Hirono",
        "email": "hirono@google.com",
        "time": "Mon Jan 25 16:27:19 2016 +0900"
      },
      "message": "Update \"accessing files\" notification resources.\n\n * Replace tentative resources with real ones.\n * Show the notification for each device as per request from UX.\n\nBUG\u003d26625702\n\nChange-Id: Ibcfe7075e4827d5aee216ce5c0007f6dd4572efe\n"
    },
    {
      "commit": "148954a657941ea95ef17da5b3ce40b9145f8755",
      "tree": "d722a324fb10f334526bccdb07a82a06c09e2e94",
      "parents": [
        "69c8cc2930a657d68a3b0365f6aa9e7524889c70"
      ],
      "author": {
        "name": "Daichi Hirono",
        "email": "hirono@google.com",
        "time": "Thu Jan 21 19:55:45 2016 +0900"
      },
      "committer": {
        "name": "Daichi Hirono",
        "email": "hirono@google.com",
        "time": "Mon Jan 25 10:47:01 2016 +0900"
      },
      "message": "Add eventsSupported property to MtpDeviceInfo.\n\nThe property provides the set of event code that are supported by\nMtpDevice.\n\nBUG\u003d26147375\n\nChange-Id: I54be75e4bb52ddfe9aba8630538ddd32d1a641c8\n"
    },
    {
      "commit": "af6b66529e8d053b5d8ffdfe886dc32b7f6ed30e",
      "tree": "c066a88ca80ae8d0d9ab581af59543fb36132676",
      "parents": [
        "5becd423385b849af26b0575fc5b69f10734f0a1"
      ],
      "author": {
        "name": "Daichi Hirono",
        "email": "hirono@google.com",
        "time": "Wed Jan 20 19:01:57 2016 +0900"
      },
      "committer": {
        "name": "Daichi Hirono",
        "email": "hirono@google.com",
        "time": "Thu Jan 21 11:07:48 2016 +0900"
      },
      "message": "Ensure to release local reference in AppFuse JNI.\n\nPreviously get_object_bytes() leaked local reference of Java buffer\narray.\n\nBUG\u003dNone\n\nChange-Id: Ic27e57281f984fee4aa285ad21de522ccb0fe4ed\n"
    },
    {
      "commit": "e6054c0ff07005c73bd10a362f039933dc00f8bd",
      "tree": "5c5aec5928d4dfdac9dcfa9e1885342b4a5f3dfa",
      "parents": [
        "97084b4bda6d42e9fb40a705a3d6e2c14dd078be"
      ],
      "author": {
        "name": "Daichi Hirono",
        "email": "hirono@google.com",
        "time": "Wed Jan 20 15:36:04 2016 +0900"
      },
      "committer": {
        "name": "Daichi Hirono",
        "email": "hirono@google.com",
        "time": "Thu Jan 21 10:51:25 2016 +0900"
      },
      "message": "Fix race in AppFuseTest.\n\nPreviously IllegalStateException is thrown in app fuse main loop, if the\nloop thread starts just after closing device FD.\n\nBUG\u003dNone\n\nChange-Id: Ia5232857d29f9f324446aa38acf3c062f359d406\n"
    },
    {
      "commit": "f52ef008c76566f7118a80bf28f599ba48d7c578",
      "tree": "adddec52c915a7c4a17627e3a38754cde31a1c6e",
      "parents": [
        "90131a9189edf8089d6696f5539d49c16bf5adec"
      ],
      "author": {
        "name": "Daichi Hirono",
        "email": "hirono@google.com",
        "time": "Mon Jan 11 18:07:01 2016 +0900"
      },
      "committer": {
        "name": "Daichi Hirono",
        "email": "hirono@google.com",
        "time": "Tue Jan 19 11:20:59 2016 +0900"
      },
      "message": "Start to use app fuse in MtpDocumentsProvider.\n\nBUG\u003d25756419\n\nChange-Id: I050e7cf7523926710291875737602e95c47be088\n"
    },
    {
      "commit": "35fb36b222d8eeaec25ff1bd3f8b4f892c3d0820",
      "tree": "3af13ed52173dada59081635d0991868d857313b",
      "parents": [
        "1c78b60a4969ae46fde459e9b2848c641ba7aa64",
        "3a6212ae558c945d6f24ace8fd38ab043a7697d1"
      ],
      "author": {
        "name": "Daichi Hirono",
        "email": "hirono@google.com",
        "time": "Tue Jan 19 00:48:28 2016 +0000"
      },
      "committer": {
        "name": "Android (Google) Code Review",
        "email": "android-gerrit@google.com",
        "time": "Tue Jan 19 00:48:28 2016 +0000"
      },
      "message": "Merge \"Clean MtpManagerTest code.\""
    },
    {
      "commit": "3a6212ae558c945d6f24ace8fd38ab043a7697d1",
      "tree": "441f4ffc8f6c59fcf14e08ee0fac16c048cd1a07",
      "parents": [
        "537427bdda177bca1bb9fdd6aa4e583dc27448bb"
      ],
      "author": {
        "name": "Daichi Hirono",
        "email": "hirono@google.com",
        "time": "Mon Jan 18 10:31:25 2016 +0900"
      },
      "committer": {
        "name": "Daichi Hirono",
        "email": "hirono@google.com",
        "time": "Mon Jan 18 10:31:25 2016 +0900"
      },
      "message": "Clean MtpManagerTest code.\n\n * Use try-with-resource block to ensure close auto-closeable stream.\n * Define local variables just above the place where they are used.\n\nBUG\u003dNone\n\nChange-Id: I9d6c952ebac096c51567a4a787b2bc9fff6502de\n"
    },
    {
      "commit": "fab4a97a7964020d76ebcb6d13817b6985cb3744",
      "tree": "b24d782e4b8f1fe8117f8159acf1055c8db7141e",
      "parents": [
        "2153e822eeb77b64288abf824551afa63491c0ea"
      ],
      "author": {
        "name": "Daichi Hirono",
        "email": "hirono@google.com",
        "time": "Fri Jan 15 16:54:24 2016 +0900"
      },
      "committer": {
        "name": "Daichi Hirono",
        "email": "hirono@google.com",
        "time": "Fri Jan 15 16:54:24 2016 +0900"
      },
      "message": "Fix compile error introduced by ag/842950.\n\nBUG\u003d25756419\n\nChange-Id: I8ac270946b3915c02b21a07cf0a9c5b62d69effc\n"
    },
    {
      "commit": "2153e822eeb77b64288abf824551afa63491c0ea",
      "tree": "83065dfbfab51ec14f993bcf1221b92f09dff301",
      "parents": [
        "537427bdda177bca1bb9fdd6aa4e583dc27448bb"
      ],
      "author": {
        "name": "Daichi Hirono",
        "email": "hirono@google.com",
        "time": "Mon Jan 11 17:43:55 2016 +0900"
      },
      "committer": {
        "name": "Daichi Hirono",
        "email": "hirono@google.com",
        "time": "Fri Jan 15 13:45:47 2016 +0900"
      },
      "message": "Fix AppFuse JNI.\n\n * Return attributes for all files as well as root.\n * Fix buffer size for reading and add a check for reading size.\n\nBUG\u003d25756419\n\nChange-Id: I572f718bc01d96616ec94f85d800b8b57eedd2ea\n"
    },
    {
      "commit": "d426ed27857a444c5328613769e4c9b1e7a24c81",
      "tree": "0e8cb58970063eb0e2976302d0aa73f078614f64",
      "parents": [
        "44859db74bb1cc2341524c5484cc3e765ec42c42"
      ],
      "author": {
        "name": "Daichi Hirono",
        "email": "hirono@google.com",
        "time": "Mon Jan 11 17:14:41 2016 +0900"
      },
      "committer": {
        "name": "Daichi Hirono",
        "email": "hirono@google.com",
        "time": "Thu Jan 14 14:23:48 2016 +0900"
      },
      "message": "Add a test for createDocument and getPartialObject.\n\nBUG\u003d26482337\n\nChange-Id: Ifda5055b422c3960f7c3c5275a1697f96e36bd06\n"
    },
    {
      "commit": "0ec431247587cfd98b1f8963fdc3c1c469ae3114",
      "tree": "3f2c84fee32de694ce13ee81a5c7f2304b399975",
      "parents": [
        "f5afe6ab8d0572fc407d0af8c154ba1a4a30dd20",
        "a12e7d1ba67d5874a00a50bef0ab30a3747776b2"
      ],
      "author": {
        "name": "Daichi Hirono",
        "email": "hirono@google.com",
        "time": "Tue Jan 12 04:23:07 2016 +0000"
      },
      "committer": {
        "name": "Android (Google) Code Review",
        "email": "android-gerrit@google.com",
        "time": "Tue Jan 12 04:23:07 2016 +0000"
      },
      "message": "Merge \"Remove unused lines in MtpDocumentsProvider.\""
    },
    {
      "commit": "2a9a43369b4717bcf6b372f6798f72e80e938e30",
      "tree": "5b0050d6d96ca7c9153acd304cd466b91e16a60f",
      "parents": [
        "df7a1d69eab05f643bc7ec8bc43e93b441a5b7ad"
      ],
      "author": {
        "name": "Daichi Hirono",
        "email": "hirono@google.com",
        "time": "Mon Jan 11 13:33:41 2016 +0900"
      },
      "committer": {
        "name": "Daichi Hirono",
        "email": "hirono@google.com",
        "time": "Tue Jan 12 12:14:30 2016 +0900"
      },
      "message": "Reland \"Add event parameters to MtpEvent.\"\n\nThe CL was previously reviewed at ag/842930.\n\n\u003e We can obtain detailed information of MtpEvent from devices. e.g. object\n\u003e handle of changed object.  The CL adds the detailed information as\n\u003e properties of MtpEvent class.\n\u003e\n\u003e BUG\u003d26480986\n\nChange-Id: I93afad9caf118d74cd0923d70242133c4fb2a648\n"
    },
    {
      "commit": "a12e7d1ba67d5874a00a50bef0ab30a3747776b2",
      "tree": "ad06a8a502993618e3fa222007bbf1a53e75d3fb",
      "parents": [
        "df7a1d69eab05f643bc7ec8bc43e93b441a5b7ad"
      ],
      "author": {
        "name": "Daichi Hirono",
        "email": "hirono@google.com",
        "time": "Mon Jan 11 17:30:03 2016 +0900"
      },
      "committer": {
        "name": "Daichi Hirono",
        "email": "hirono@google.com",
        "time": "Mon Jan 11 17:30:03 2016 +0900"
      },
      "message": "Remove unused lines in MtpDocumentsProvider.\n\nChange-Id: I8de1b50441003648547829a3e8dd78153e6f8f31\n"
    },
    {
      "commit": "ab03cb1b469940ab672850e0d2de3c78025260d3",
      "tree": "a194ccf525da3cdda46dfd4eedf48e0fd18602a2",
      "parents": [
        "263ce2b52a332dc9336280fda47fa6a060f5512e"
      ],
      "author": {
        "name": "Daichi Hirono",
        "email": "hirono@google.com",
        "time": "Mon Jan 11 15:47:21 2016 +0900"
      },
      "committer": {
        "name": "Daichi Hirono",
        "email": "hirono@google.com",
        "time": "Mon Jan 11 16:32:57 2016 +0900"
      },
      "message": "Clean up TestUtil.\n\n * Integrate two while loops waiting for valid device.\n * Try to open a device just after getting an device ownership so that\n   other applicaitons do not steal device ownership before TestUtil\n   opens a device.\n\nChange-Id: Ia273cfb2a47fe630efd8c54b22d6ef5823a402b8\n"
    },
    {
      "commit": "1d4779c29a95114c89ec353a8899c0cc8eee3ba5",
      "tree": "53918eaeb0ccd0a0d89e9d5d232f0aee0062e404",
      "parents": [
        "359a8ae0af2a103975464bbd6594eec4f166fe47"
      ],
      "author": {
        "name": "Daichi Hirono",
        "email": "hirono@google.com",
        "time": "Wed Jan 06 16:43:32 2016 +0900"
      },
      "committer": {
        "name": "Daichi Hirono",
        "email": "hirono@google.com",
        "time": "Fri Jan 08 16:58:24 2016 +0900"
      },
      "message": "Add operationsSupported to device info.\n\nBecause not all MTP devices support getPartialObject, we need to check\nsupported operation of MTP devices. The CL adds operationsSupported\nfield to MtpDeviceInfo class.\n\nBUG\u003d26147375\n\nChange-Id: Iaad968fb4497a5ad11bf6489097abea99c3cbac7\n"
    },
    {
      "commit": "af5ea38b8c51f0878e4070671e240f693f3ad796",
      "tree": "195e210383f4f66a80796a1d0ab1c334fec93cfa",
      "parents": [
        "76774af11097f860b95ff503de895ee3bb7724e0"
      ],
      "author": {
        "name": "Daichi Hirono",
        "email": "hirono@google.com",
        "time": "Thu Jan 07 18:24:59 2016 +0900"
      },
      "committer": {
        "name": "Daichi Hirono",
        "email": "hirono@google.com",
        "time": "Thu Jan 07 18:24:59 2016 +0900"
      },
      "message": "RealDeviceTest for MTP does not need to ask device permission.\n\nMtpDocumentsProvider can obtain permission itself now because it\u0027s\nsystem component.\n\nBUG\u003d26415299\n\nChange-Id: Ia2cd275e57cffadbaefd0f1bf3cb99cde12e5e33\n"
    },
    {
      "commit": "fff12cd70a4d3b88d0bd063ac2943f4b3e446a17",
      "tree": "41cbc82327f015cd31823559ca78f5666ad7624e",
      "parents": [
        "1830c2aa55c1565f8075dad39f7aafcbc2a63f6a",
        "cc9a7d78d519aa25b4afbc96afd401be75696dda"
      ],
      "author": {
        "name": "Daichi Hirono",
        "email": "hirono@google.com",
        "time": "Thu Jan 07 01:21:07 2016 +0000"
      },
      "committer": {
        "name": "Android (Google) Code Review",
        "email": "android-gerrit@google.com",
        "time": "Thu Jan 07 01:21:07 2016 +0000"
      },
      "message": "Merge \"Implement FUSE operations in AppFuse JNI.\""
    },
    {
      "commit": "b596175d808d2e4ae0fa3843da67da1e0f7d2c92",
      "tree": "51ed2b9debc2a6df1475e65ccd49d437fda96fc6",
      "parents": [
        "f4ea850c515c1f675f9203c5f88b6995b8539c16",
        "8e3b9db5448ff3c00e8670ba80105b9304cd7cb0"
      ],
      "author": {
        "name": "Daichi Hirono",
        "email": "hirono@google.com",
        "time": "Fri Dec 25 07:09:38 2015 +0000"
      },
      "committer": {
        "name": "Android (Google) Code Review",
        "email": "android-gerrit@google.com",
        "time": "Fri Dec 25 07:09:38 2015 +0000"
      },
      "message": "Merge \"Stop to remove device rows at MtpDocumentsProvider.\""
    },
    {
      "commit": "8e3b9db5448ff3c00e8670ba80105b9304cd7cb0",
      "tree": "8e5558b609a5ddcfc3a761147200213a19d114a1",
      "parents": [
        "e442872eaa1684d6aa7461642911f12931b2e7b5"
      ],
      "author": {
        "name": "Daichi Hirono",
        "email": "hirono@google.com",
        "time": "Fri Dec 25 15:59:47 2015 +0900"
      },
      "committer": {
        "name": "Daichi Hirono",
        "email": "hirono@google.com",
        "time": "Fri Dec 25 15:59:47 2015 +0900"
      },
      "message": "Stop to remove device rows at MtpDocumentsProvider.\n\nPreviously MtpDocumentsProvider used to remove device info in the\ndatabase when the device is closed. It loses a chance that RootScanner\nhandles the removal of roots. As a result, notifications for root cursor\ndoes not issued.\n\nThe CL stops removing device info at MtpDocumentsProvider, and let\nRootScanner remove it.\n\nBUG\u003d26321346\n\nChange-Id: I6aec0cf843a1e5c93e7f67a718cabd26841d9799\n"
    },
    {
      "commit": "4c4061210e52b7b1786ecb26a2dd7f8c1298e752",
      "tree": "2a9449b1bcf37a452d9cb3bd26607efee8c9ed97",
      "parents": [
        "e442872eaa1684d6aa7461642911f12931b2e7b5"
      ],
      "author": {
        "name": "Daichi Hirono",
        "email": "hirono@google.com",
        "time": "Thu Dec 24 12:43:12 2015 +0900"
      },
      "committer": {
        "name": "Daichi Hirono",
        "email": "hirono@google.com",
        "time": "Thu Dec 24 12:45:03 2015 +0900"
      },
      "message": "Fix flakiness MtpManagerTest test.\n\nThe test for readEvent cancelling was flakiness because it can\nsuccessfully receives an event before the test tries to cancel it.\n\nChange-Id: Ie7625dff53e07b8bc9888da03e78155e683a6d46\n"
    },
    {
      "commit": "cc9a7d78d519aa25b4afbc96afd401be75696dda",
      "tree": "6aed72d5e8dbe7f39691f2b816602721dd76a3b0",
      "parents": [
        "e442872eaa1684d6aa7461642911f12931b2e7b5"
      ],
      "author": {
        "name": "Daichi Hirono",
        "email": "hirono@google.com",
        "time": "Wed Oct 28 09:43:48 2015 +0900"
      },
      "committer": {
        "name": "Daichi Hirono",
        "email": "hirono@google.com",
        "time": "Thu Dec 24 11:11:27 2015 +0900"
      },
      "message": "Implement FUSE operations in AppFuse JNI.\n\nThe CL adds the following operations.\n\n * FUSE_LOOKUP\n * FUSE_OPEN\n * FUSE_READ\n * FUSE_RELEASE\n * FUSE_FLUSH\n\nBUG\u003d25756145\n\nChange-Id: Ib57d7d0ade3343a604a1c40e4b2c2a2d089f3715\n"
    },
    {
      "commit": "e442872eaa1684d6aa7461642911f12931b2e7b5",
      "tree": "7510a994640bc14459caebfdab6eee801e8e4bd4",
      "parents": [
        "bdb5a45f8da3d8c74ec1804bd77b1c93e1131ac6",
        "91e3b50636f48f0860fa7576f185fb36ec4e6dc7"
      ],
      "author": {
        "name": "Daichi Hirono",
        "email": "hirono@google.com",
        "time": "Tue Dec 22 05:31:57 2015 +0000"
      },
      "committer": {
        "name": "Android (Google) Code Review",
        "email": "android-gerrit@google.com",
        "time": "Tue Dec 22 05:31:57 2015 +0000"
      },
      "message": "Merge \"Unmount appfuse when the device FD is closed.\""
    },
    {
      "commit": "91e3b50636f48f0860fa7576f185fb36ec4e6dc7",
      "tree": "be34adb71b749726bb4ddb73d22fbb973b6cb8b7",
      "parents": [
        "01cf378e045dafe136cda39f5559ae1c36119f5b"
      ],
      "author": {
        "name": "Daichi Hirono",
        "email": "hirono@google.com",
        "time": "Wed Dec 16 09:24:16 2015 +0900"
      },
      "committer": {
        "name": "Daichi Hirono",
        "email": "hirono@google.com",
        "time": "Tue Dec 22 13:41:33 2015 +0900"
      },
      "message": "Unmount appfuse when the device FD is closed.\n\nThe CL lets MountService to observe device FD, and request unmount to\nvold when the device FD was closed, or remote application providing\nappfuse is crashed.\n\nBUG\u003d25756420\n\nChange-Id: I7990694d32affa7f89e3f40badb25098d74d744d\n"
    },
    {
      "commit": "bdb5a45f8da3d8c74ec1804bd77b1c93e1131ac6",
      "tree": "f22ea3fcccb8be429665cd7d91027d155e15c1bd",
      "parents": [
        "e824f8287b012dccc3a0376afc497bc3e4393563",
        "2bdb388d8fba211b02874531885d2eec76417c8b"
      ],
      "author": {
        "name": "Daichi Hirono",
        "email": "hirono@google.com",
        "time": "Tue Dec 22 04:03:27 2015 +0000"
      },
      "committer": {
        "name": "Android (Google) Code Review",
        "email": "android-gerrit@google.com",
        "time": "Tue Dec 22 04:03:27 2015 +0000"
      },
      "message": "Merge \"Break while loop when the thread interuppted.\""
    },
    {
      "commit": "2bdb388d8fba211b02874531885d2eec76417c8b",
      "tree": "4c1903d940c829b506262e09e301e5de6d354bd7",
      "parents": [
        "9dcbdcd50f09dfe82601dc697da7bd3f91347e94"
      ],
      "author": {
        "name": "Daichi Hirono",
        "email": "hirono@google.com",
        "time": "Tue Dec 22 12:57:47 2015 +0900"
      },
      "committer": {
        "name": "Daichi Hirono",
        "email": "hirono@google.com",
        "time": "Tue Dec 22 12:57:47 2015 +0900"
      },
      "message": "Break while loop when the thread interuppted.\n\nPreviously the while loop condition refers to Thread.interrupted()\nwrongly. The Thread.interrupted() flag is cleared when the\nInterupptedException is thrown.\n\nBUG\u003d26297698\n\nChange-Id: I113d5c88389d54a4a6e29af2cf9515b1693b59dc\n"
    },
    {
      "commit": "492253fb89accd3f23869c0f8d48b185e727e525",
      "tree": "ba8463036a79eded796a13ecd42b8b39a5cb860f",
      "parents": [
        "6348654ab09848f9bfde695f2b0d8aa0d6492773",
        "01cf378e045dafe136cda39f5559ae1c36119f5b"
      ],
      "author": {
        "name": "Daichi Hirono",
        "email": "hirono@google.com",
        "time": "Mon Dec 21 04:32:36 2015 +0000"
      },
      "committer": {
        "name": "Android (Google) Code Review",
        "email": "android-gerrit@google.com",
        "time": "Mon Dec 21 04:32:36 2015 +0000"
      },
      "message": "Merge \"Fix compiler error on com_android_mtp_AppFuse.cpp.\""
    },
    {
      "commit": "01cf378e045dafe136cda39f5559ae1c36119f5b",
      "tree": "3492e889f14a5fa1d493a3ed73d3c5bcb9920179",
      "parents": [
        "bee50c05439191d88df37f20749fff1c700d9684"
      ],
      "author": {
        "name": "Daichi Hirono",
        "email": "hirono@google.com",
        "time": "Mon Dec 21 13:13:57 2015 +0900"
      },
      "committer": {
        "name": "Daichi Hirono",
        "email": "hirono@google.com",
        "time": "Mon Dec 21 13:13:57 2015 +0900"
      },
      "message": "Fix compiler error on com_android_mtp_AppFuse.cpp.\n\nThe CL adds explicit assigning for reply_size to prevent \u0027unused\u0027\ncompiler error.\n\nChange-Id: I307758debb23b5bf56ddf71d54813b8cd81d8f49\n"
    },
    {
      "commit": "6348654ab09848f9bfde695f2b0d8aa0d6492773",
      "tree": "40c58197def9f95d1d046cb743e494c1c5258dd0",
      "parents": [
        "224bb73f9f40ab47c9b854885c3aec9fb02fd41a",
        "bee50c05439191d88df37f20749fff1c700d9684"
      ],
      "author": {
        "name": "Daichi Hirono",
        "email": "hirono@google.com",
        "time": "Mon Dec 21 03:10:37 2015 +0000"
      },
      "committer": {
        "name": "Android (Google) Code Review",
        "email": "android-gerrit@google.com",
        "time": "Mon Dec 21 03:10:37 2015 +0000"
      },
      "message": "Merge \"Add AppFuse class and its JNI module.\""
    },
    {
      "commit": "bee50c05439191d88df37f20749fff1c700d9684",
      "tree": "3b5b445dc2ec25d19775f7c3f4f4adb61922054d",
      "parents": [
        "9dcbdcd50f09dfe82601dc697da7bd3f91347e94"
      ],
      "author": {
        "name": "Daichi Hirono",
        "email": "hirono@google.com",
        "time": "Mon Dec 14 11:00:54 2015 +0900"
      },
      "committer": {
        "name": "Daichi Hirono",
        "email": "hirono@google.com",
        "time": "Mon Dec 21 12:07:13 2015 +0900"
      },
      "message": "Add AppFuse class and its JNI module.\n\nBUG\u003d25756145\n\nChange-Id: I10597e3377cf860412e006a118cd979b6f108af3\n"
    },
    {
      "commit": "81d48536aef702d301cdc3a339008de767b51f99",
      "tree": "f0194957eb8e9a6ebbdb370fd1b4f69c67ec7781",
      "parents": [
        "9dcbdcd50f09dfe82601dc697da7bd3f91347e94"
      ],
      "author": {
        "name": "Daichi Hirono",
        "email": "hirono@google.com",
        "time": "Wed Dec 16 15:03:19 2015 +0900"
      },
      "committer": {
        "name": "Daichi Hirono",
        "email": "hirono@google.com",
        "time": "Fri Dec 18 14:12:35 2015 +0900"
      },
      "message": "Show MTP device as root when it has multiple/zero storages.\n\nThe CL updates MtpDocumentsProvider#queryRoots so that it fetches\ndevices from Database as well as storages when we don\u0027t have storages\nunder the device, or when we have multiple storages under the device.\n\nBUG\u003d26120019\nChange-Id: Id2b140f00a1d49fa4da7e17d2564dbbaa1795e1e\n"
    },
    {
      "commit": "20754c5a112e418c11cc88176283db2c4bf2efd6",
      "tree": "6c3c1688d7ff2e99f8c123460c8f74adb8db27cd",
      "parents": [
        "d5f94468bae6813c9ab559de9a166f7cf87a7a77"
      ],
      "author": {
        "name": "Daichi Hirono",
        "email": "hirono@google.com",
        "time": "Tue Dec 15 18:52:26 2015 +0900"
      },
      "committer": {
        "name": "Daichi Hirono",
        "email": "hirono@google.com",
        "time": "Wed Dec 16 09:52:56 2015 +0900"
      },
      "message": "Store device document even if the device is not opened.\n\nBUG\u003d26197156\n\nChange-Id: I2a80bb3e85310cf63253173b1110a155ee1391ba\n"
    },
    {
      "commit": "61e7c647f15ce34d10e1f2b907dfa9be43021fbb",
      "tree": "aa33993fd5c767a021d9f4e220a8e33e12195f6a",
      "parents": [
        "d0be161b89f8d657cfcfdc50943e7960535e39dc",
        "b3fe72bfb288a509a953e5586264ca1c4460d2df"
      ],
      "author": {
        "name": "Daichi Hirono",
        "email": "hirono@google.com",
        "time": "Tue Dec 15 08:19:29 2015 +0000"
      },
      "committer": {
        "name": "Android (Google) Code Review",
        "email": "android-gerrit@google.com",
        "time": "Tue Dec 15 08:19:29 2015 +0000"
      },
      "message": "Merge \"Revert \"Revert \"Add device document to MtpDatabase.\"\"\""
    },
    {
      "commit": "b3fe72bfb288a509a953e5586264ca1c4460d2df",
      "tree": "21495d918eb65e59e52c89069df891628bd2de1c",
      "parents": [
        "b63e8c6ccc1425d56f8b9c801f4bddf906d694e5"
      ],
      "author": {
        "name": "Daichi Hirono",
        "email": "hirono@google.com",
        "time": "Tue Dec 15 07:45:06 2015 +0000"
      },
      "committer": {
        "name": "Daichi Hirono",
        "email": "hirono@google.com",
        "time": "Tue Dec 15 07:45:06 2015 +0000"
      },
      "message": "Revert \"Revert \"Add device document to MtpDatabase.\"\"\n\nI suspected that the commit was conflicted with ag/833494, but actually it wasn\u0027t. Let me reland this CL again.\n\nThis reverts commit b63e8c6ccc1425d56f8b9c801f4bddf906d694e5.\n\nChange-Id: I4e734422ce10ef93ee7c4ef3b8b72a81beaa769b\n"
    },
    {
      "commit": "d0be161b89f8d657cfcfdc50943e7960535e39dc",
      "tree": "9b3395266c85ccaceb3bd07d9c2743633bfec4c7",
      "parents": [
        "cfb96e77b341d386abfab32e7968770ba6077d03",
        "b63e8c6ccc1425d56f8b9c801f4bddf906d694e5"
      ],
      "author": {
        "name": "Daichi Hirono",
        "email": "hirono@google.com",
        "time": "Tue Dec 15 07:34:53 2015 +0000"
      },
      "committer": {
        "name": "Android (Google) Code Review",
        "email": "android-gerrit@google.com",
        "time": "Tue Dec 15 07:34:53 2015 +0000"
      },
      "message": "Merge \"Revert \"Add device document to MtpDatabase.\"\""
    },
    {
      "commit": "b63e8c6ccc1425d56f8b9c801f4bddf906d694e5",
      "tree": "49d77590624f442c7f672fd53d56d7e221b55829",
      "parents": [
        "c0ae45be046b1aed005589791e1ee483c399ab1c"
      ],
      "author": {
        "name": "Daichi Hirono",
        "email": "hirono@google.com",
        "time": "Tue Dec 15 07:34:26 2015 +0000"
      },
      "committer": {
        "name": "Daichi Hirono",
        "email": "hirono@google.com",
        "time": "Tue Dec 15 07:34:26 2015 +0000"
      },
      "message": "Revert \"Add device document to MtpDatabase.\"\n\nThis reverts commit c0ae45be046b1aed005589791e1ee483c399ab1c.\n\nChange-Id: I03337324e768c509bdcf94c89f7abe7ca00c8a18\n"
    },
    {
      "commit": "b702547e54a68eb9909b13a4f451718192c2ba8a",
      "tree": "bc9247de6b2c1b875960c45161eda16f700908a5",
      "parents": [
        "f4f09b1adaf721b949b5c8f5edfbc9409acba7f2",
        "c0ae45be046b1aed005589791e1ee483c399ab1c"
      ],
      "author": {
        "name": "Daichi Hirono",
        "email": "hirono@google.com",
        "time": "Tue Dec 15 07:27:19 2015 +0000"
      },
      "committer": {
        "name": "Android (Google) Code Review",
        "email": "android-gerrit@google.com",
        "time": "Tue Dec 15 07:27:19 2015 +0000"
      },
      "message": "Merge \"Add device document to MtpDatabase.\""
    },
    {
      "commit": "c0ae45be046b1aed005589791e1ee483c399ab1c",
      "tree": "21495d918eb65e59e52c89069df891628bd2de1c",
      "parents": [
        "7d0b3cdd70fbba2145321c6104be9b149dc1411e"
      ],
      "author": {
        "name": "Daichi Hirono",
        "email": "hirono@google.com",
        "time": "Tue Dec 15 12:39:04 2015 +0900"
      },
      "committer": {
        "name": "Daichi Hirono",
        "email": "hirono@google.com",
        "time": "Tue Dec 15 16:16:50 2015 +0900"
      },
      "message": "Add device document to MtpDatabase.\n\nBUG\u003d26175081\n\nChange-Id: Ida91c50f7e33d7b300a32ee318b6f3837edf6606\n"
    },
    {
      "commit": "9984ebd6d3b88866fbffff1b1a58b7690cb415ce",
      "tree": "bab5d0ae7366c0bd588e12f2a3f24a5c85b032a8",
      "parents": [
        "7d0b3cdd70fbba2145321c6104be9b149dc1411e"
      ],
      "author": {
        "name": "Daichi Hirono",
        "email": "hirono@google.com",
        "time": "Tue Dec 15 16:02:27 2015 +0900"
      },
      "committer": {
        "name": "Daichi Hirono",
        "email": "hirono@google.com",
        "time": "Tue Dec 15 16:02:27 2015 +0900"
      },
      "message": "Use column name instead of index in MtpDatabaseTest for readability.\n\nBUG\u003d26194040\n\nChange-Id: I58a6e59f4784fcc81988093bb113e721e36e46d0\n"
    },
    {
      "commit": "7d0b3cdd70fbba2145321c6104be9b149dc1411e",
      "tree": "49d77590624f442c7f672fd53d56d7e221b55829",
      "parents": [
        "42a5e0e3a4ba13a3c15d74ea0b410ff8667fdfa4",
        "be38848969c91ba9bc3ec8eee31017a34905acfc"
      ],
      "author": {
        "name": "Daichi Hirono",
        "email": "hirono@google.com",
        "time": "Tue Dec 15 02:12:31 2015 +0000"
      },
      "committer": {
        "name": "Android (Google) Code Review",
        "email": "android-gerrit@google.com",
        "time": "Tue Dec 15 02:12:31 2015 +0000"
      },
      "message": "Merge \"Stop reopening MTP devices.\""
    },
    {
      "commit": "be38848969c91ba9bc3ec8eee31017a34905acfc",
      "tree": "ce07622c1cc613fcbd63ba08847ffc6c55285e5c",
      "parents": [
        "026688070c8002911dc0a8f1fb487bf5bfed52d4"
      ],
      "author": {
        "name": "Daichi Hirono",
        "email": "hirono@google.com",
        "time": "Mon Dec 14 16:20:14 2015 +0900"
      },
      "committer": {
        "name": "Daichi Hirono",
        "email": "hirono@google.com",
        "time": "Tue Dec 15 11:10:37 2015 +0900"
      },
      "message": "Stop reopening MTP devices.\n\nBUG\u003d26175809\n\nChange-Id: I45a51c0623b349f12e7d3cf787a89b089f230bc1\n"
    },
    {
      "commit": "42a5e0e3a4ba13a3c15d74ea0b410ff8667fdfa4",
      "tree": "3e65ead076954f2a720827ab6c3e088b28f0bce9",
      "parents": [
        "5a0fed684150f53d2d4293408f445f6092c24183",
        "7a375c407f2759f21fb4ca7215034f056b4ade1c"
      ],
      "author": {
        "name": "Daichi Hirono",
        "email": "hirono@google.com",
        "time": "Tue Dec 15 02:08:50 2015 +0000"
      },
      "committer": {
        "name": "Android (Google) Code Review",
        "email": "android-gerrit@google.com",
        "time": "Tue Dec 15 02:08:50 2015 +0000"
      },
      "message": "Merge \"Integerate mapping methods for root/child documents into the same methods.\""
    },
    {
      "commit": "7a375c407f2759f21fb4ca7215034f056b4ade1c",
      "tree": "0c8478d4218770bbf0f24662d400e3071dd91471",
      "parents": [
        "026688070c8002911dc0a8f1fb487bf5bfed52d4"
      ],
      "author": {
        "name": "Daichi Hirono",
        "email": "hirono@google.com",
        "time": "Mon Dec 14 17:14:29 2015 +0900"
      },
      "committer": {
        "name": "Daichi Hirono",
        "email": "hirono@google.com",
        "time": "Tue Dec 15 11:06:20 2015 +0900"
      },
      "message": "Integerate mapping methods for root/child documents into the same\nmethods.\n\nThe integrated methods will be used to add device documents as well as\nroot/child documents.\n\nBUG\u003d26175081\n\nChange-Id: Ibf474cfbc41df402a2958e9efcdd0061f07f5ced\n"
    },
    {
      "commit": "4b54e036ef958947d6347a0971d32c08774e3495",
      "tree": "37ff5a2e9306c7108f097523482c6e7bc7eba0c3",
      "parents": [
        "026688070c8002911dc0a8f1fb487bf5bfed52d4"
      ],
      "author": {
        "name": "Daichi Hirono",
        "email": "hirono@google.com",
        "time": "Fri Dec 11 15:24:53 2015 +0900"
      },
      "committer": {
        "name": "Daichi Hirono",
        "email": "hirono@google.com",
        "time": "Fri Dec 11 17:13:53 2015 +0900"
      },
      "message": "Add document type to MtpDatabase.\n\nCurrently all document roots represent MTP storage, but we will not have\nthis assumption after starting show MTP devices (not storage) as\ndocument roots.\n\nTo distinguish these two types of roots, the CL adds document type\ncolumn to the document table in MtpDatabase.\n\nBUG\u003d26120019\n\nChange-Id: I6ee930008aea0b43c1c42b21a198b07eccbd443d\n"
    },
    {
      "commit": "dc89e079ced39978cf916f9b7c135da727ff40d9",
      "tree": "16b355780dcc84d67b73ffcbc5911cefedc61295",
      "parents": [
        "3899902fe751d841e0dc6c7e5c2700bd85f4fb44",
        "4751880a4d770e8916320b5908b58f389d6552de"
      ],
      "author": {
        "name": "Daichi Hirono",
        "email": "hirono@google.com",
        "time": "Wed Dec 09 04:04:47 2015 +0000"
      },
      "committer": {
        "name": "Android (Google) Code Review",
        "email": "android-gerrit@google.com",
        "time": "Wed Dec 09 04:04:47 2015 +0000"
      },
      "message": "Merge \"Grant USB device permission by using system permission.\""
    },
    {
      "commit": "b863990a010ca5a71cfe924e536c00a113ba19d2",
      "tree": "48928faffaa7a3967b85587f7fe3f522398f4014",
      "parents": [
        "7ed26b10e73ee40751f3e20579868d2c8babb0d9"
      ],
      "author": {
        "name": "Daichi Hirono",
        "email": "hirono@google.com",
        "time": "Wed Dec 09 10:04:13 2015 +0900"
      },
      "committer": {
        "name": "Daichi Hirono",
        "email": "hirono@google.com",
        "time": "Wed Dec 09 11:18:32 2015 +0900"
      },
      "message": "Enable MtpDocumentsProvider by default.\n\nBUG\u003d20274999\n\nChange-Id: I35941df66fea4ab703f8f1de3c69b6f4dd2be9a0\n"
    },
    {
      "commit": "4751880a4d770e8916320b5908b58f389d6552de",
      "tree": "46b972dda5a83be16457c13fc98f7074dc4f21e2",
      "parents": [
        "7ed26b10e73ee40751f3e20579868d2c8babb0d9"
      ],
      "author": {
        "name": "Daichi Hirono",
        "email": "hirono@google.com",
        "time": "Tue Dec 08 09:51:19 2015 +0900"
      },
      "committer": {
        "name": "Daichi Hirono",
        "email": "hirono@google.com",
        "time": "Wed Dec 09 11:15:25 2015 +0900"
      },
      "message": "Grant USB device permission by using system permission.\n\nPreviously it skips the device permission check by referring package\nname. The CL removes the special case and use general MANAGE_USB\nsystem-only permission to skip USB device permission dialog.\n\nBUG\u003d26048722\n\nChange-Id: I3702393a50696209499d1e5f6549dab9fb2cefe4\n"
    },
    {
      "commit": "a57d9ed09003acd8b2beb0494a2bd32f7030cc11",
      "tree": "e8d7571ccf885d3485346e77ac09766e44deaba7",
      "parents": [
        "a99fce54d0db51d6141e810d7c9afc058091ea6d"
      ],
      "author": {
        "name": "Daichi Hirono",
        "email": "hirono@google.com",
        "time": "Mon Dec 07 10:52:42 2015 +0900"
      },
      "committer": {
        "name": "Daichi Hirono",
        "email": "hirono@google.com",
        "time": "Tue Dec 08 17:27:04 2015 +0900"
      },
      "message": "Turn MtpDocumentsService foreground when devices are opend.\n\nBUG\u003d26047393\n\nChange-Id: I70f69c5ddec500ed61d1a76fb9e2e296813b2a4e\n"
    },
    {
      "commit": "99b58052f85c18272e63047b471edfd8089c09d3",
      "tree": "4d9c9086bb55cd635b61ca413111b4947799f39f",
      "parents": [
        "56e086f5da39e64240464cad2a260f3e9389d939"
      ],
      "author": {
        "name": "Daichi Hirono",
        "email": "hirono@google.com",
        "time": "Thu Dec 03 18:09:16 2015 +0900"
      },
      "committer": {
        "name": "Daichi Hirono",
        "email": "hirono@google.com",
        "time": "Fri Dec 04 12:32:41 2015 +0900"
      },
      "message": "Polish MtpManagerTest.\n\nChange-Id: Ibadd209ee1cb752f0e55694d0f1f631c558f1370\n"
    },
    {
      "commit": "56e086f5da39e64240464cad2a260f3e9389d939",
      "tree": "747364e08a62fdb70b3de5665326bcdaa59a7ff6",
      "parents": [
        "ed2f8503303eb17edf332e880a2c603ed5744d81",
        "b255f58904d7a2aa64ba9f03ed0ede3759fd03c5"
      ],
      "author": {
        "name": "Daichi Hirono",
        "email": "hirono@google.com",
        "time": "Wed Dec 02 03:53:46 2015 +0000"
      },
      "committer": {
        "name": "Android (Google) Code Review",
        "email": "android-gerrit@google.com",
        "time": "Wed Dec 02 03:53:46 2015 +0000"
      },
      "message": "Merge \"Extract test utility class.\""
    },
    {
      "commit": "ed2f8503303eb17edf332e880a2c603ed5744d81",
      "tree": "361496b1675086298e6648850d9772988cbd6f64",
      "parents": [
        "e03d5e4973baa122d329bc24dc0a6b8b779c0223",
        "39795da4c948536c4a9d9ceadece5b03fd395d89"
      ],
      "author": {
        "name": "Daichi Hirono",
        "email": "hirono@google.com",
        "time": "Wed Dec 02 03:53:08 2015 +0000"
      },
      "committer": {
        "name": "Android (Google) Code Review",
        "email": "android-gerrit@google.com",
        "time": "Wed Dec 02 03:53:08 2015 +0000"
      },
      "message": "Merge \"Add storage icon for MTP roots.\""
    },
    {
      "commit": "b255f58904d7a2aa64ba9f03ed0ede3759fd03c5",
      "tree": "e00c6992e5d0109d9205976bf23f5a3b4bbd643a",
      "parents": [
        "f26af124e3552f18f127eabf88ebcb9e13a80855"
      ],
      "author": {
        "name": "Daichi Hirono",
        "email": "hirono@google.com",
        "time": "Wed Dec 02 12:20:25 2015 +0900"
      },
      "committer": {
        "name": "Daichi Hirono",
        "email": "hirono@google.com",
        "time": "Wed Dec 02 12:38:49 2015 +0900"
      },
      "message": "Extract test utility class.\n\nChange-Id: I8505ab13ceccf32e7a9b6817f84a66766098b09e\n"
    },
    {
      "commit": "39795da4c948536c4a9d9ceadece5b03fd395d89",
      "tree": "c5afb25cfab63353a927e70f2dae6a5e97a2bdd8",
      "parents": [
        "259ce80132d55774fe599c60b53a9d9dfc1efa65"
      ],
      "author": {
        "name": "Daichi Hirono",
        "email": "hirono@google.com",
        "time": "Wed Dec 02 10:56:44 2015 +0900"
      },
      "committer": {
        "name": "Daichi Hirono",
        "email": "hirono@google.com",
        "time": "Wed Dec 02 11:08:40 2015 +0900"
      },
      "message": "Add storage icon for MTP roots.\n\nBUG\u003d22545807\n\nChange-Id: I714b26d52e00b0f9a5c95dea1508be0d617482e3\n"
    },
    {
      "commit": "1b8f619480814866f112c84c03b8db83319c2270",
      "tree": "a745c2c96dea1012883a0e6fcd5ef7434ccead62",
      "parents": [
        "30be970a8ecd984ace75354e00a8d969577d18e9",
        "f26af124e3552f18f127eabf88ebcb9e13a80855"
      ],
      "author": {
        "name": "Daichi Hirono",
        "email": "hirono@google.com",
        "time": "Tue Dec 01 07:42:12 2015 +0000"
      },
      "committer": {
        "name": "Android (Google) Code Review",
        "email": "android-gerrit@google.com",
        "time": "Tue Dec 01 07:42:12 2015 +0000"
      },
      "message": "Merge \"Handle Android M as a MTP device in MtpManagerTest.\""
    },
    {
      "commit": "f26af124e3552f18f127eabf88ebcb9e13a80855",
      "tree": "2732b51467a05cd56cafa68b152733ed4e293e2c",
      "parents": [
        "259ce80132d55774fe599c60b53a9d9dfc1efa65"
      ],
      "author": {
        "name": "Daichi Hirono",
        "email": "hirono@google.com",
        "time": "Tue Dec 01 13:51:58 2015 +0900"
      },
      "committer": {
        "name": "Daichi Hirono",
        "email": "hirono@google.com",
        "time": "Tue Dec 01 15:58:29 2015 +0900"
      },
      "message": "Handle Android M as a MTP device in MtpManagerTest.\n\nMtpManagerTest uses real MTP device to test functionallity, but\npreviously it did not handle Android M\u0027s USB client behavior.\n\nBUG\u003d25939006\n\nChange-Id: I53fa8c08c41c3adacf85f24694afdea5ec0781ca\n"
    },
    {
      "commit": "e0282dd7d409dce7738173162e766ce9317ef804",
      "tree": "a5f2b6e981154e21c49294ef5a50c82919a5b357",
      "parents": [
        "259ce80132d55774fe599c60b53a9d9dfc1efa65"
      ],
      "author": {
        "name": "Daichi Hirono",
        "email": "hirono@google.com",
        "time": "Thu Nov 26 15:20:08 2015 +0900"
      },
      "committer": {
        "name": "Daichi Hirono",
        "email": "hirono@google.com",
        "time": "Mon Nov 30 10:06:56 2015 +0900"
      },
      "message": "Reopen MTP devices when the provider is created.\n\nWhen the provider is created, it reopens MTP devices that are recorded\nin the database. It enables the provider to resume MTP session after the\nprovider process is killed by the system.\n\nBUG\u003d25704854\nChange-Id: I58ae80fdb2e02cb0f045c63c4ade8943e2baae06\n"
    },
    {
      "commit": "259ce80132d55774fe599c60b53a9d9dfc1efa65",
      "tree": "2a8bcedb3cb6a113f0867b7c5d2cb49fbc626b06",
      "parents": [
        "9e8a4fa78f5b9e3964dca84ad4047210d35c4013"
      ],
      "author": {
        "name": "Daichi Hirono",
        "email": "hirono@google.com",
        "time": "Fri Nov 20 17:51:53 2015 +0900"
      },
      "committer": {
        "name": "Daichi Hirono",
        "email": "hirono@google.com",
        "time": "Thu Nov 26 15:55:15 2015 +0900"
      },
      "message": "Extract mapping operations to partial class of MtpDatabase.\n\nChange-Id: I5fda6d5754206528ad5953bcc179a0ffe0b4982d\n"
    },
    {
      "commit": "9e8a4fa78f5b9e3964dca84ad4047210d35c4013",
      "tree": "e9a6c4dd743c1f86daaddc88366118ae880f44b4",
      "parents": [
        "74bfa271993cc78248dc238cd697a1f3de814bec"
      ],
      "author": {
        "name": "Daichi Hirono",
        "email": "hirono@google.com",
        "time": "Thu Nov 19 16:13:38 2015 +0900"
      },
      "committer": {
        "name": "Daichi Hirono",
        "email": "hirono@google.com",
        "time": "Thu Nov 26 11:09:46 2015 +0900"
      },
      "message": "Change ID format of MtpDocumentsProvider.\n\nBUG\u003d25704562\n\nChange-Id: I5d9fc167512eee06964650e07206e226173611b2\n"
    },
    {
      "commit": "49f920fbde1dce6f789c2d0ad2df014c12e7e3ac",
      "tree": "d510f8ac2a11f4a85742ef07533cc30a0dd4be99",
      "parents": [
        "e1d57710fb38dae2747aadca0e5b6f98a84a0514"
      ],
      "author": {
        "name": "Daichi Hirono",
        "email": "hirono@google.com",
        "time": "Thu Nov 19 10:19:52 2015 +0900"
      },
      "committer": {
        "name": "Daichi Hirono",
        "email": "hirono@google.com",
        "time": "Thu Nov 19 16:00:10 2015 +0900"
      },
      "message": "Add new methods to MtpDatabase.\n\n * deleteDocument\n * getParentId\n * queryDocument\n * putNewDocument\n\nBUG\u003d25756881\n\nChange-Id: Ie223b37e04586b3e2b0448d09e14562fedbb652a\n"
    },
    {
      "commit": "e1d57710fb38dae2747aadca0e5b6f98a84a0514",
      "tree": "14897cf3be6805623997e555b258d8861fe4f372",
      "parents": [
        "26398b91bee2c35c407a3599c438c3745edaa67d"
      ],
      "author": {
        "name": "Daichi Hirono",
        "email": "hirono@google.com",
        "time": "Tue Nov 17 10:55:45 2015 +0900"
      },
      "committer": {
        "name": "Daichi Hirono",
        "email": "hirono@google.com",
        "time": "Thu Nov 19 14:16:42 2015 +0900"
      },
      "message": "Don\u0027t close database when all devices have been detached.\n\nContentProvider is a singleton of the process. So it may live longer\nthan Service. We could not close database when the service is destroyed.\n\nBUG\u003d25730042\n\nChange-Id: I591250c1a1e7c5705eb2585c71cac2598c0c0fb9\n"
    },
    {
      "commit": "47eb192b2704e27272ca94a95680cac40b6bff3f",
      "tree": "12a79c9cff90afdfd4879fa88b64581531a7facb",
      "parents": [
        "9c5ac7bf5ba1c5649ccc0357e570f504100e2cfb"
      ],
      "author": {
        "name": "Daichi Hirono",
        "email": "hirono@google.com",
        "time": "Mon Nov 16 13:01:31 2015 +0900"
      },
      "committer": {
        "name": "Daichi Hirono",
        "email": "hirono@google.com",
        "time": "Tue Nov 17 15:46:40 2015 +0900"
      },
      "message": "Start using MtpDatabase in DocumentLoader.\n\nBUG\u003d25704514\n\nChange-Id: I4d9247c148679ee7e40a1a03443e4c0299b1e44d\n"
    },
    {
      "commit": "4604b74603ea951c0f0d0fc2d9b6bd46ae54e245",
      "tree": "593621dfd0e229d2c2160a521262aa3fd62ad488",
      "parents": [
        "484d009cf6fda0ef34ab274e3dd556bb67d87d43"
      ],
      "author": {
        "name": "Daichi Hirono",
        "email": "hirono@google.com",
        "time": "Thu Nov 12 12:12:48 2015 +0900"
      },
      "committer": {
        "name": "Daichi Hirono",
        "email": "hirono@google.com",
        "time": "Tue Nov 17 08:30:41 2015 +0900"
      },
      "message": "Prepare for adding MtpDocumentsProvider tests to APCT.\n\nBUG\u003d25093356\n\nChange-Id: I0c194e6bf3abeb632171e9be49471b9d94a0cb4c\n"
    },
    {
      "commit": "dc47344660035b27a564ab6d9c9a9b58ec340347",
      "tree": "e76d9b6650131279253cb08de51f827eec8c8bdb",
      "parents": [
        "18d70d5b7c46d2a35f66a6a76ba319eacf62e6c6"
      ],
      "author": {
        "name": "Daichi Hirono",
        "email": "hirono@google.com",
        "time": "Fri Nov 13 15:42:28 2015 +0900"
      },
      "committer": {
        "name": "Daichi Hirono",
        "email": "hirono@google.com",
        "time": "Mon Nov 16 17:49:20 2015 +0900"
      },
      "message": "Start to use MtpDatabase in RootScanner.\n\nChange-Id: Id99cb61ad8680529b5ee502ca5bb2b3cdd143235\n"
    },
    {
      "commit": "18d70d5b7c46d2a35f66a6a76ba319eacf62e6c6",
      "tree": "b055829115fb43e5302af2c2acfa4c12cec68348",
      "parents": [
        "cfcb0c007dea5f5798b7b4bd13b206ef12e8db6c"
      ],
      "author": {
        "name": "Daichi Hirono",
        "email": "hirono@google.com",
        "time": "Fri Nov 13 15:19:47 2015 +0900"
      },
      "committer": {
        "name": "Daichi Hirono",
        "email": "hirono@google.com",
        "time": "Fri Nov 13 16:42:50 2015 +0900"
      },
      "message": "Split MtpDatabase class into three classes.\n\nBUG\u003d25162822\n\nChange-Id: Id64b6d9fa11a3214bb855ea8e1344af45fb415ff\n"
    },
    {
      "commit": "cfcb0c007dea5f5798b7b4bd13b206ef12e8db6c",
      "tree": "74288016d3f99b0f14f600d5bc8368186379bd91",
      "parents": [
        "0c89a3a991b42dfd1de08748295fc61a0504b266"
      ],
      "author": {
        "name": "Daichi Hirono",
        "email": "hirono@google.com",
        "time": "Tue Nov 10 12:52:59 2015 +0900"
      },
      "committer": {
        "name": "Daichi Hirono",
        "email": "hirono@google.com",
        "time": "Fri Nov 13 14:50:48 2015 +0900"
      },
      "message": "Adds new method to update existing documents in MtpDatabase.\n\nBUG\u003d25162822\n\nChange-Id: I7aa63fc272aa7b57d6a9672565f842774e898a00\n"
    },
    {
      "commit": "0378da48c42387b5e6d04a5d89e95a366873ad4a",
      "tree": "712973338b5c76dea473f0d69b342e2de41de780",
      "parents": [
        "5d7e9516861b8248f728641d7ae7a54b82a1255d"
      ],
      "author": {
        "name": "Daichi Hirono",
        "email": "hirono@google.com",
        "time": "Thu Nov 05 11:56:12 2015 +0900"
      },
      "committer": {
        "name": "Daichi Hirono",
        "email": "hirono@google.com",
        "time": "Tue Nov 10 10:32:42 2015 +0900"
      },
      "message": "Add root information to MtpDatabase.\n\nThe CLs adds new table to MtpDatabase that contains additional\ninformation to provide DocumentContract.Roots.COLUMN_*. Client code can\nobtain these information by using the newly added queryRoots method.\n\nBUG\u003d25162822\nChange-Id: Ib6596d38cbb4a42b689c75fffbd73585c0fb524c\n"
    },
    {
      "commit": "a8a3722e7ac80e68df532ee024ce97a07d4fe7c2",
      "tree": "4e47968ec91db48de87200d0bfe383cf1a9a6167",
      "parents": [
        "6de8a0e51f0cf8c52a4de672d4b2d8f2d78d143e"
      ],
      "author": {
        "name": "Daichi Hirono",
        "email": "hirono@google.com",
        "time": "Mon Oct 26 16:39:54 2015 +0900"
      },
      "committer": {
        "name": "Daichi Hirono",
        "email": "hirono@google.com",
        "time": "Wed Nov 04 12:58:20 2015 +0900"
      },
      "message": "Extends MtpDatabase so that it can handle child documents.\n\nThe CL extracts common routines for root documents and child documents,\nadds new methods for child documents, and let the common routines from\nthe new methods.\n\nBUG\u003d25162822\n\nChange-Id: Ie6f0092e584ae12c89d43593701debeb76f6f3cb\n"
    },
    {
      "commit": "6de8a0e51f0cf8c52a4de672d4b2d8f2d78d143e",
      "tree": "ef3139aee1cfc05ad406577616898829ba0e5dc5",
      "parents": [
        "01a46f4e257010a98eedfc6d0e0c2eca570ed724"
      ],
      "author": {
        "name": "Daichi Hirono",
        "email": "hirono@google.com",
        "time": "Tue Oct 27 16:18:17 2015 +0900"
      },
      "committer": {
        "name": "Daichi Hirono",
        "email": "hirono@google.com",
        "time": "Mon Nov 02 11:30:47 2015 +0900"
      },
      "message": "Implement ID mapping for root documents.\n\nMTP identifiers like object handle is unstable over MTP sessions.  The\nCL introduce two methods to MtpDatabase that enables the provider to\nremap exisitng document ID with new MTP identifiers when the provider\nreopen the MTP session.\n\n * MtpDatabase#clearMtpIdentifier invalidates old MTP identifiers\n * MtpDatabase#resolveRootDocuments remaps invalidated documents with\n   new MTP identifier.\n\nBUG\u003d25162822\n\nChange-Id: Iadb668ae5932da81aba2b2731d0d185da5656f16\n"
    },
    {
      "commit": "59686f6c352fd70fec5ce8c7a2a867d6ecf15ff0",
      "tree": "3bc634809fceb4f9b6c0faf22a329857b8b82e3e",
      "parents": [
        "85a808bf96d57589bbce720a242e87f4610cc665"
      ],
      "author": {
        "name": "Daichi Hirono",
        "email": "hirono@google.com",
        "time": "Wed Oct 28 16:43:32 2015 +0900"
      },
      "committer": {
        "name": "Daichi Hirono",
        "email": "hirono@google.com",
        "time": "Wed Oct 28 16:43:32 2015 +0900"
      },
      "message": "Update JavaDoc in MtpDatabase.\n\nBUG\u003d25162822\n\nChange-Id: Icfd9391daa01846f5ec12d5ea7448ebc7444a05c\n"
    },
    {
      "commit": "85a808bf96d57589bbce720a242e87f4610cc665",
      "tree": "1ebaa3ec0e1dc5fb67189cc185f030db2e9622a7",
      "parents": [
        "88d2f781f0597129f5003d3768023c19cf6a3676"
      ],
      "author": {
        "name": "Daichi Hirono",
        "email": "hirono@google.com",
        "time": "Tue Oct 27 17:22:13 2015 +0900"
      },
      "committer": {
        "name": "Daichi Hirono",
        "email": "hirono@google.com",
        "time": "Tue Oct 27 17:27:16 2015 +0900"
      },
      "message": "Let MtpDatabase add device name to storage root.\n\nWe have added device name to storage root by ag/790395.\nBut the change was not added to MtpDatabase class.\n\nBUG\u003d25162822\n\nChange-Id: I019a9cf770a91c43b4e2f4e81e74b40175fd4872\n"
    },
    {
      "commit": "88d2f781f0597129f5003d3768023c19cf6a3676",
      "tree": "da12411318d73122880c84e9099b5e8653fde845",
      "parents": [
        "b999b0cb0f6cb1e63d4f77dcf87fa05a33960cf2"
      ],
      "author": {
        "name": "Daichi Hirono",
        "email": "hirono@google.com",
        "time": "Tue Oct 27 16:41:06 2015 +0900"
      },
      "committer": {
        "name": "Daichi Hirono",
        "email": "hirono@google.com",
        "time": "Tue Oct 27 17:14:50 2015 +0900"
      },
      "message": "Remove fullpath from MtpDatabase.\n\nIf the remote MTP device is backed by typical file system, the file name\nis unique among files in a directory. However, MTP protocol itself does\nnot guarantee the uniqueness of name so we cannot use fullpath as ID.\n\nInstead of fullpath, we use artifical ID generated by MtpDatabase\nitself. So we don\u0027t need to store fullpath in the database.\n\nBUG\u003d25162822\n\nChange-Id: I06598ce631a3221ed72e11734dbdaefef4c6349c\n"
    },
    {
      "commit": "b999b0cb0f6cb1e63d4f77dcf87fa05a33960cf2",
      "tree": "5f6fffcf9f3872fe66e157adbf125b47905300ba",
      "parents": [
        "0c4a76959a27918adf29b440cb6e3ce2d14c0497"
      ],
      "author": {
        "name": "Daichi Hirono",
        "email": "hirono@google.com",
        "time": "Tue Oct 27 16:29:18 2015 +0900"
      },
      "committer": {
        "name": "Daichi Hirono",
        "email": "hirono@google.com",
        "time": "Tue Oct 27 17:08:20 2015 +0900"
      },
      "message": "Move TestResources class to the outside of MtpDocumentProviderTest.\n\nTestResources class will be used in MtpDatabaseTest.\n\nBUG\u003d25162822\n\nChange-Id: I4f51b517532bbc111e95e7ebd96787a2e6f0f87a\n"
    }
  ],
  "next": "9678f60633e19579736c3e59787326a8e82fae0f"
}
