)]}'
{
  "log": [
    {
      "commit": "203be491ef479deea1f39f8b63f3e1916501a37a",
      "tree": "62bfe5fed03c6b46aeb5c1bf7a53ca1bf4277a00",
      "parents": [
        "1ce83f009ea6d51b7c03772343f54827c7dd9dd5"
      ],
      "author": {
        "name": "Daichi Hirono",
        "email": "hirono@google.com",
        "time": "Mon Apr 03 12:20:42 2017 +0900"
      },
      "committer": {
        "name": "Daichi Hirono",
        "email": "hirono@google.com",
        "time": "Fri Apr 07 11:13:56 2017 +0900"
      },
      "message": "Use Context#startForegroundService in MTP provider\n\nNotificationManager.startServiceInForeground() was moved to\nContext#startForegroundService. MtpDocumentsProvider should use new one.\n\nBug: 36794559\nTest: MtpDocumentsProviderTests\nChange-Id: I84723ee8c3f0f8bfe4d5ea8ad035c01c42ce8bab\n"
    },
    {
      "commit": "964244785db55ce720b0d4da99090254084f8172",
      "tree": "fc217b7405be9c2cf2b2c9a45e0594cb9bb73664",
      "parents": [
        "76fe8c1eda76bb252f7bd0f48a30902e885df4a1",
        "4e4ec1628daf638a978508f3a98b8ab041f70c9e"
      ],
      "author": {
        "name": "TreeHugger Robot",
        "email": "treehugger-gerrit@google.com",
        "time": "Thu Mar 23 00:46:00 2017 +0000"
      },
      "committer": {
        "name": "Android (Google) Code Review",
        "email": "android-gerrit@google.com",
        "time": "Thu Mar 23 00:46:06 2017 +0000"
      },
      "message": "Merge \"Fix MtpDocumentsProvider test.\""
    },
    {
      "commit": "4e4ec1628daf638a978508f3a98b8ab041f70c9e",
      "tree": "390bf69688defcdb229971fb9a07b381b37d4439",
      "parents": [
        "daa61d45dacde440e3569d25ccf17ca4e2ba5d1a"
      ],
      "author": {
        "name": "Daichi Hirono",
        "email": "hirono@google.com",
        "time": "Wed Mar 22 15:57:48 2017 +0900"
      },
      "committer": {
        "name": "Daichi Hirono",
        "email": "hirono@google.com",
        "time": "Wed Mar 22 15:57:48 2017 +0900"
      },
      "message": "Fix MtpDocumentsProvider test.\n\nag/2008770 fixed the flag value for root document.\nWe also need to update expected value for MtpDocumentsProviderTest.\n\nBug: 35855598\nTest: adb shell am instrument -w \\\n    com.android.mtp.tests/com.android.mtp.TestResultInstrumentation\n\nChange-Id: I3ca7f08dc8f14b84c350dbc3ddd5a0ba5ff7d04f\n"
    },
    {
      "commit": "7f2afd2dffb232e9ace7e2b50ec0b3dc84a81f08",
      "tree": "c9c5884a5619b0d85663ee2c62d37f70020f5108",
      "parents": [
        "9d755c046af15a126abd6020f46c82241d1263f8"
      ],
      "author": {
        "name": "Dan Shi",
        "email": "dshi@google.com",
        "time": "Fri Mar 17 10:21:28 2017 -0700"
      },
      "committer": {
        "name": "Dan Shi",
        "email": "dshi@google.com",
        "time": "Tue Mar 21 00:05:14 2017 -0700"
      },
      "message": "Add test configs to apct tests under frameworks/base\n\nTouchLatency is needed by test TouchLatencyJankTestWear\nUiBench is needed by test UiBenchJankTests\n\nDetails about test configs changes are tracked in doc\nhttps://docs.google.com/document/d/1EWUjJ7fjy8ge_Nk0YQbFdRp8DSHo3z6GU0R8jLgrAcw/edit#\n\nBug: 35882476\nTest: local test\nmake -j32 TouchLatency TouchLatencyJankTestWear  \u0026\u0026 \\\ntradefed.sh run template/local --template:map test\u003dTouchLatencyJankTestWear \\\n      --test-tag testname --log-level-display VERBOSE\nmake -j32 UiBenchJankTests UiBench  \u0026\u0026 \\\ntradefed.sh run template/local --template:map test\u003dUiBenchJankTests \\\n      --test-tag testname --log-level-display VERBOSE\n\nChange-Id: I63f23e3a21ad1343607953958fb7bb0a5fb8c343\n"
    },
    {
      "commit": "473a16e492f0e0b0f726d4351214783458466d2c",
      "tree": "b0b5a4f903cde7685aa25da4cad10ff23beb3d31",
      "parents": [
        "123a34f1936983f1b59da9b5609485e1f64347ff"
      ],
      "author": {
        "name": "Simran Basi",
        "email": "sbasi@google.com",
        "time": "Wed Mar 15 14:43:58 2017 -0700"
      },
      "committer": {
        "name": "Simran Basi",
        "email": "sbasi@google.com",
        "time": "Wed Mar 15 14:46:27 2017 -0700"
      },
      "message": "frameworks/base: Add APCT tests to the device-tests suite.\n\nThis CL adds the APCT tests within this project to\na similar suite as CTS known as device-tests.\n\nThe current method of running APCT tests in the infrastructure\nis unaffected.\n\nBug: 35882476\nTest: `make dist device-tests -j` and local builds of\n      continuous_instrumentation_tests \u0026 continuous_native_tests\n\nChange-Id: Ifa382fe691842c1cd76897775b9e2a1653449eb5\n"
    },
    {
      "commit": "b690b4de06385a821aed3442e10058986c03badc",
      "tree": "0e23c6df416d3a327c9e8b676f6a9d764c63127d",
      "parents": [
        "85d0eee1a840ae78f31f2f02a41714803ab41e7b"
      ],
      "author": {
        "name": "Garfield Tan",
        "email": "xutan@google.com",
        "time": "Wed Mar 01 16:05:23 2017 -0800"
      },
      "committer": {
        "name": "Garfield Tan",
        "email": "xutan@google.com",
        "time": "Thu Mar 02 12:48:13 2017 -0800"
      },
      "message": "Address comments from API council.\n\nTest: Code builds and tests pass. Also some manual tests around ESP.\nBug: 35813037\nBug: 35812990\nChange-Id: Ia9d3a3964e9a83d0c1c08e5db4c2e231504aa99a\n"
    },
    {
      "commit": "d3c6dd1522dc9b08476b70c4f6923f4debff78ee",
      "tree": "9e4b62ec737ad3608007631f90727e0f7440fb6e",
      "parents": [
        "881ba34ba75be2e4f653e0dc77a1daacea3c5d4e"
      ],
      "author": {
        "name": "Daichi Hirono",
        "email": "hirono@google.com",
        "time": "Thu Jan 26 14:40:19 2017 +0900"
      },
      "committer": {
        "name": "Daichi Hirono",
        "email": "hirono@google.com",
        "time": "Thu Feb 02 00:13:08 2017 +0000"
      },
      "message": "Start MtpDocumentsService as foreground service.\n\nPrevously MtpDocumentsService was started as background service, then it\nturns into a foreground service by calling Service#startForeground.\n\nThe workflow did not work until this, because now background activity\ncannot launch a background service.\n\nThe CL starts using NotificationManager#startForegroundService to launch\nMtpDocumentsService so that the service can be started as foreground\nservice directly.\n\nBug: 34468813\nTest: MtpDocumentsProviderTests\nTest: manual testing with connecting MTP device to Android\nChange-Id: Ic35d3e92f234881846e5d82ed04d6681a83035f7\n"
    },
    {
      "commit": "648abd31e84ab46173d92351526fe81a48af037d",
      "tree": "ca7b78cbc62623dd7991ca03f4056175261d36b0",
      "parents": [
        "b5fe748c69df170dddea6529c80956fede61d59d",
        "8aeb59ebcd50a510d024dc082fa17b192074c63d"
      ],
      "author": {
        "name": "Paul Duffin",
        "email": "paulduffin@google.com",
        "time": "Thu Jan 19 09:34:15 2017 +0000"
      },
      "committer": {
        "name": "Android (Google) Code Review",
        "email": "android-gerrit@google.com",
        "time": "Thu Jan 19 09:34:19 2017 +0000"
      },
      "message": "Merge \"Prepare for removal of legacy-test from default targets\""
    },
    {
      "commit": "e80ea38489a7fca0e5a8cf2f663704058c782d63",
      "tree": "32cf64be719abe1caf51d8fadfdd00eeb04d422b",
      "parents": [
        "11ec801a9f0b0d31f3c2ea2d97780fbda097cba2"
      ],
      "author": {
        "name": "Daichi Hirono",
        "email": "hirono@google.com",
        "time": "Tue Nov 15 13:07:01 2016 +0900"
      },
      "committer": {
        "name": "Daichi Hirono",
        "email": "hirono@google.com",
        "time": "Thu Jan 19 14:14:00 2017 +0900"
      },
      "message": "Use public version of AppFuse in MtpDocumentsProvider.\n\nAppFuse is now a public API. The CL removes the private version from\nMtpDocuemntsProvider package and switches to the public version.\n\nBug: 32891253\nTest: MtpDocumentsProviderTest\nChange-Id: Ibdf67309bc0678e2f70ac2dddb920125d9e0760e\n"
    },
    {
      "commit": "8aeb59ebcd50a510d024dc082fa17b192074c63d",
      "tree": "b7f3e92f4eebc63df03fd63d35b0eafc18ccc81c",
      "parents": [
        "57b8eb3da0c4692ac4f39a9c73aa090af475d14a"
      ],
      "author": {
        "name": "Paul Duffin",
        "email": "paulduffin@google.com",
        "time": "Tue Jan 10 12:08:23 2017 +0000"
      },
      "committer": {
        "name": "Paul Duffin",
        "email": "paulduffin@google.com",
        "time": "Wed Jan 18 16:39:34 2017 +0000"
      },
      "message": "Prepare for removal of legacy-test from default targets\n\nIn preparation for removing junit classes from the Android API\nthe legacy-test target will be removed from the\nTARGET_DEFAULT_JAVA_LIBRARIES. This change adds explicit\ndependencies on junit and/or legacy-android-test to ensure that\nmodules will compile properly once it is removed.\n\nBug: 30188076\nTest: make checkbuild\nChange-Id: I13e88297731253420e4e5f5291d503f13a39a156\n"
    },
    {
      "commit": "29c3f68cfab3dd4f7f96e54be8eabd9a4d677c5e",
      "tree": "9da646f2f6690f35e9e3acdda23bb199af3dc10a",
      "parents": [
        "f5393c8a50c85f86e12d9a388fe3d4ced1f3eeb9"
      ],
      "author": {
        "name": "Steve McKay",
        "email": "smckay@google.com",
        "time": "Fri Dec 16 14:52:59 2016 -0800"
      },
      "committer": {
        "name": "Steve McKay",
        "email": "smckay@google.com",
        "time": "Wed Jan 11 15:01:50 2017 -0800"
      },
      "message": "Add structured sort data to ContentResolver.query.\n\nUpdate DocumentsProvider to override\n    ContentProvider#query(Uri, String[], Bundle, CancellationSignal);\nAdded an otherwise unneeded import to pass doc check\n    on DocumentsProvider.\n\nBug: 30927484\nChange-Id: I295c21f53901d567455286f22439f21d22a8a25a\nTest: Build and run. Test from DocsUi.\n"
    },
    {
      "commit": "29de7693f4fab188e695b9ecda1de0345496bd10",
      "tree": "b483f67b13269872983f9fd50a81332c29672fd1",
      "parents": [
        "2cf7c483a8049e2c657d5f4c138132167fa71ae9"
      ],
      "author": {
        "name": "Daichi Hirono",
        "email": "hirono@google.com",
        "time": "Mon Nov 07 10:58:50 2016 +0900"
      },
      "committer": {
        "name": "Daichi Hirono",
        "email": "hirono@google.com",
        "time": "Tue Nov 08 09:09:18 2016 +0900"
      },
      "message": "Add isChildDocument to MtpDocumentsProvider.\n\nBug: 32687127\nTest: adb shell am instrument -w -e class com.android.mtp.MtpDocumentsProviderTest#testIsChildDocument com.android.mtp.tests/com.android.mtp.TestResultInstrumentation\nChange-Id: I44ded3c73443735229a8b3465122f7e10c4da178\n"
    },
    {
      "commit": "2cf7c483a8049e2c657d5f4c138132167fa71ae9",
      "tree": "e12011f6aa71f749cec81e0d4a857af2796a7926",
      "parents": [
        "4b5617742903aeec0c924c298bc42fe0ffa9e5bc",
        "35b2ec551f670562a779925fe152307f20ad67cd"
      ],
      "author": {
        "name": "TreeHugger Robot",
        "email": "treehugger-gerrit@google.com",
        "time": "Mon Nov 07 06:21:43 2016 +0000"
      },
      "committer": {
        "name": "Android (Google) Code Review",
        "email": "android-gerrit@google.com",
        "time": "Mon Nov 07 06:21:48 2016 +0000"
      },
      "message": "Merge \"Not create document under the device.\""
    },
    {
      "commit": "35b2ec551f670562a779925fe152307f20ad67cd",
      "tree": "5c6cc803df17c31ae892ea631313798cbd6bd69c",
      "parents": [
        "03c8e3f7714f33d19164b2349051a50900b3060c"
      ],
      "author": {
        "name": "Daichi Hirono",
        "email": "hirono@google.com",
        "time": "Wed Nov 02 14:51:26 2016 +0900"
      },
      "committer": {
        "name": "Daichi Hirono",
        "email": "hirono@google.com",
        "time": "Mon Nov 07 10:29:09 2016 +0900"
      },
      "message": "Not create document under the device.\n\nThe structure of files in MtpDocumentsProvider looks like\n/device/storage/files. But MtpDocumentsProvider shows files\njust under the device if the device has only single storage.\n\nIt causes a problem that MtpDocumentsProvider tries to create a file\nunder the device. Previously it tries to create a file with storageId \u003d\n0, which means MTP device choose a storage to store the file.\n\nBecause it only happens when the device has a single storage, the file\nis properly written to the device. But the database in\nMtpDocumentsProvider goes into the illegal state where the file is\nplaced just under the device.\n\nBug: 32561572\nTest: adb shell am instrument -w -e class com.android.mtp.MtpDocumentsProviderTest com.android.mtp.tests/com.android.mtp.TestResultInstrumentation\nChange-Id: I47a373ceee8a64ba9995934317693e79d2497ee0\n"
    },
    {
      "commit": "f46a463e414a9c79db49a272c79320d688494842",
      "tree": "9907a899170855115f22d398e7a3485d1981004a",
      "parents": [
        "aa2a530e64926d6b3a6e3c471a4b65f1ec9fe436"
      ],
      "author": {
        "name": "Garfield Tan",
        "email": "xutan@google.com",
        "time": "Wed Nov 02 16:00:17 2016 -0700"
      },
      "committer": {
        "name": "Garfield Tan",
        "email": "xutan@google.com",
        "time": "Wed Nov 02 16:18:33 2016 -0700"
      },
      "message": "Change findPath() to findDocumentPath() in MtpDocumentsProvider.\n\nTest: It builds.\nChange-Id: If474e766b5680d49a7557f0e7ee1c039eb4efae0\n"
    },
    {
      "commit": "b9ffa2a1d2cfd0b182629c849a22f2efa832892e",
      "tree": "4dc310a3a4d7c0d71989f42ad416d303629fea61",
      "parents": [
        "03c8e3f7714f33d19164b2349051a50900b3060c"
      ],
      "author": {
        "name": "Daichi Hirono",
        "email": "hirono@google.com",
        "time": "Tue Nov 01 18:41:43 2016 +0900"
      },
      "committer": {
        "name": "Daichi Hirono",
        "email": "hirono@google.com",
        "time": "Wed Nov 02 12:33:45 2016 +0900"
      },
      "message": "Add findPath method to MtpDocumentsProvider.\n\nBug: 32515515\nTest: adb shell am instrument -w -e class com.android.mtp.MtpDocumentsProviderTest com.android.mtp.tests/com.android.mtp.TestResultInstrumentation\nChange-Id: Ib87e8f5258de8fd48a099adbf077b3b9ff85773c\n"
    },
    {
      "commit": "83c679e7221460fc50e91402a34787e1866d94ef",
      "tree": "aaacb4abaeedebde771c1beaa5f3d116a41e4ead",
      "parents": [
        "2987af70714ba807722f4548bcf71370b94ec20d"
      ],
      "author": {
        "name": "Daichi Hirono",
        "email": "hirono@google.com",
        "time": "Thu Aug 18 15:13:36 2016 +0900"
      },
      "committer": {
        "name": "Steve McKay",
        "email": "smckay@google.com",
        "time": "Thu Aug 18 16:55:02 2016 +0000"
      },
      "message": "Set Root.FLAG_LOCAL_ONLY for MTP roots.\n\nThe flag indicate whether the root needs network access or not. MTP\nshould be LOCAL_ONLY root.\n\nBug: 30867267\n\nChange-Id: Ia272d4a389cc1ca628d7b963caa37f3dbb6747e3\n"
    },
    {
      "commit": "daa61d45dacde440e3569d25ccf17ca4e2ba5d1a",
      "tree": "63872ccf92c3bdd1ccbfecf98ac719a77b810489",
      "parents": [
        "16c01b0435b55af3d59574b5c708868fc685fe79"
      ],
      "author": {
        "name": "Daichi Hirono",
        "email": "hirono@google.com",
        "time": "Wed Aug 10 14:59:18 2016 +0900"
      },
      "committer": {
        "name": "Daichi Hirono",
        "email": "hirono@google.com",
        "time": "Wed Aug 10 14:59:18 2016 +0900"
      },
      "message": "Fix MtpDatabaseTest#testFormatCodeForMpeg.\n\nag/1241051 explicitly specified the primary mime type for MTP format\ncode. And it changes mime type for MtpConstants.FORMAT_MPEG from\nvideo/mp4 to video/mpeg.\n\nFIX\u003d30266226\n\nChange-Id: I362bd7d651140b9928aa76e0d54e4769296d9498\n"
    },
    {
      "commit": "f20e49ecb954ffc3cb93499cb789a567125998ce",
      "tree": "eef3c97c151e0fa6a662f4004e5564194598698c",
      "parents": [
        "22dcbc3e26c247f6a4d3953a454be12bf136cb67"
      ],
      "author": {
        "name": "Daichi Hirono",
        "email": "hirono@google.com",
        "time": "Wed Jun 08 16:20:00 2016 +0900"
      },
      "committer": {
        "name": "Daichi Hirono",
        "email": "hirono@google.com",
        "time": "Wed Jun 08 16:21:06 2016 +0900"
      },
      "message": "Fix warning from error prone.\n\nBUG\u003d29146585\n\nChange-Id: Ic54caecf1abd74affcd902a9561adcdaa8f10c59\n"
    },
    {
      "commit": "86c1a9bf6081d23c82f05f7293aded3266f61368",
      "tree": "67a02eeb4b3558d5b47bd3313fec4003efa74fe9",
      "parents": [
        "7f0dae94914fdfa2922505375c0e9459043c3738"
      ],
      "author": {
        "name": "Daichi Hirono",
        "email": "hirono@google.com",
        "time": "Thu May 26 14:07:24 2016 +0900"
      },
      "committer": {
        "name": "Daichi Hirono",
        "email": "hirono@google.com",
        "time": "Thu May 26 16:39:21 2016 +0900"
      },
      "message": "Remove MTP API marked as @removed.\n\nBUG\u003d28146379\n\nChange-Id: I4f0a380941663eac423f8a5633447f1eceb516cb\n"
    },
    {
      "commit": "3edcde295326db07520ed5eedde087c24c16dfd0",
      "tree": "490462e02fde86a1945a8c433e28fa8cc299b217",
      "parents": [
        "76be46f4d9314fd7daca0985a0a7e02126d85975"
      ],
      "author": {
        "name": "Daichi Hirono",
        "email": "hirono@google.com",
        "time": "Tue Apr 12 11:29:07 2016 +0900"
      },
      "committer": {
        "name": "Daichi Hirono",
        "email": "hirono@google.com",
        "time": "Tue Apr 12 12:38:03 2016 +0900"
      },
      "message": "Fix flakiness DocumentLoader#testCancelTask.\n\nFor testing, we use blockDocument and unblockDocument test mehtods to\ncontrol flow of DocumentLoader\u0027s background thread.\nPreviously testCancelTask may exit before the background thread goes\nback from blocking, which causes InterruptedException.\n\nFixes: 28125289\nChange-Id: Id03826733c5b6f1da66b9280838eb1d2897ed5fc\n"
    },
    {
      "commit": "76be46f4d9314fd7daca0985a0a7e02126d85975",
      "tree": "b3228c65ebc11dbf03924e62c3acea52b1f6d0f6",
      "parents": [
        "75aee0a681a763b8de67cb078ca3e520f65c8efe"
      ],
      "author": {
        "name": "Daichi Hirono",
        "email": "hirono@google.com",
        "time": "Fri Apr 08 09:48:02 2016 +0900"
      },
      "committer": {
        "name": "Daichi Hirono",
        "email": "hirono@google.com",
        "time": "Mon Apr 11 14:32:03 2016 +0900"
      },
      "message": "Fix crash when deleting multiple files.\n\nWhen deleting files, MtpDocumentsProvider clears LoadingTask in\nDocumentsLoader to update directory contents list. Previously it can\nclear ongoing task, and it skips calling Mapper#stopAddingDocuments.\nSince Mapper#startAddingDocuments and Mapper#stopAddingDocuments must be\ncalled 1 to 1, it causes precondition check failure at the next call of\nMapper#startAddingDocuments.\n\nChange-Id: I23e2b117da826297e45404be4db4cc29f96e5510\nFix: 28076320\n"
    },
    {
      "commit": "f4e7fa80384ac72d0228ca5de6e949a9162cefbf",
      "tree": "2b5af7e4c38762527a8f3b4013c4e7e5f88d3f19",
      "parents": [
        "9194f344b922cd04e5e44206ada6191865631daa"
      ],
      "author": {
        "name": "Daichi Hirono",
        "email": "hirono@google.com",
        "time": "Mon Mar 28 16:07:45 2016 +0900"
      },
      "committer": {
        "name": "Daichi Hirono",
        "email": "hirono@google.com",
        "time": "Tue Mar 29 16:27:59 2016 +0900"
      },
      "message": "Use AppFuse to write document.\n\nPreviously MtpDocumentsProvider used pipes to transfer bytes from an\napplication to the provider when writing a document.  The problem was\napplication could not ensure that the last chunk of bytes was\nsuccessfully written to MTP device, since pipes had been already closed\nwhen the provider transferred bytes to MTP device. Though the provider\nencountered an error, the provider could not report the error to an\napplication.\n\nThe CL switches the method to transfer bytes from pipes to AppFuse. Now\napplication can flush() bytes on the file descriptor, and flush will not\ncomplete until the provider completes writing bytes to MTP device.\n\nFixed: 23093747\nChange-Id: I4e28f8cbf19d6c97e591943349a7535241d768f7\n"
    },
    {
      "commit": "1c431625b38480a146ae2bbaf118753e912061a8",
      "tree": "ee1ecce88bb3424e505d67359df407af79eeadf7",
      "parents": [
        "57e1539a8f8c09c8fbf9676c310f0d210cec734a",
        "64111e08d905525c7f4fe27e69953eb71bd62511"
      ],
      "author": {
        "name": "Daichi Hirono",
        "email": "hirono@google.com",
        "time": "Mon Mar 28 04:36:00 2016 +0000"
      },
      "committer": {
        "name": "Android (Google) Code Review",
        "email": "android-gerrit@google.com",
        "time": "Mon Mar 28 04:36:01 2016 +0000"
      },
      "message": "Merge \"Get object size that is more than 4GB.\" into nyc-dev"
    },
    {
      "commit": "64111e08d905525c7f4fe27e69953eb71bd62511",
      "tree": "e1ffe9c4ba5a31829e7c69076db90c79012d8c27",
      "parents": [
        "787821bce4a07f9b9434180210bf99e6bd2639c9"
      ],
      "author": {
        "name": "Daichi Hirono",
        "email": "hirono@google.com",
        "time": "Thu Mar 24 21:07:38 2016 +0900"
      },
      "committer": {
        "name": "Daichi Hirono",
        "email": "hirono@google.com",
        "time": "Mon Mar 28 13:34:03 2016 +0900"
      },
      "message": "Get object size that is more than 4GB.\n\nMtpObjectInfo contains object size as 32-bit integer and the provider\nneeds to invoke MtpDevice#getObjectSizeLong hidden API to get 64-bit\nobject size.\n\nThe CL switches to use MtpDevice#getObjectSizeLong hidden API if\nMtpObjectInfo#getCompressedSize() returns 0xffffffffL, which means the\nobject size is more than 4GB.\n\nBUG\u003d27805369\n\nChange-Id: I87ea02c09aa784246cf016def309d1f39ed20e90\n"
    },
    {
      "commit": "09ece6c68bdaf3a04b517f04dff6a3272b54b2b2",
      "tree": "be9ab18294ca97e21db90c14ec372ca81a160031",
      "parents": [
        "fe952f3a0b0ad5c481fa3e52385866f777a4d6e2"
      ],
      "author": {
        "name": "Daichi Hirono",
        "email": "hirono@google.com",
        "time": "Wed Jan 20 19:09:25 2016 +0900"
      },
      "committer": {
        "name": "Daichi Hirono",
        "email": "hirono@google.com",
        "time": "Fri Mar 25 11:18:44 2016 +0900"
      },
      "message": "Implement FUSE_WRITE command in app fuse.\n\nThe CL adds a handler for FUSE_WRITE command which invokes a Java\nhandler.\n\nBUG\u003d23093747\n\nChange-Id: I1903fca6b5663e6241ad540a89fe812310ba6810\n(cherry picked from commit 35693da25af11583053d4af6a70d4acbf446978d)\n"
    },
    {
      "commit": "b3383fdac0a6e1419541985f5880f632a0c6bfee",
      "tree": "7f532fd1262a0f4947826a607ce541adb214c5b3",
      "parents": [
        "678ed36bebb7b0f5ff342e9da30d693bffb8aeb2"
      ],
      "author": {
        "name": "Daichi Hirono",
        "email": "hirono@google.com",
        "time": "Fri Mar 18 15:25:00 2016 +0900"
      },
      "committer": {
        "name": "Daichi Hirono",
        "email": "hirono@google.com",
        "time": "Tue Mar 22 13:42:21 2016 +0900"
      },
      "message": "Add root flag correctly.\n\nBUG\u003d27369570\n\nChange-Id: I93b9b662667009a374d879c7ab667b10fb7cbf7c\n"
    },
    {
      "commit": "678ed36bebb7b0f5ff342e9da30d693bffb8aeb2",
      "tree": "e8c86a9a32e4ec59e93d58dcc28db80e01e98520",
      "parents": [
        "07db6f3969287c2fea714d81a12b1ccd71434e99"
      ],
      "author": {
        "name": "Daichi Hirono",
        "email": "hirono@google.com",
        "time": "Fri Mar 18 15:05:53 2016 +0900"
      },
      "committer": {
        "name": "Daichi Hirono",
        "email": "hirono@google.com",
        "time": "Tue Mar 22 13:41:05 2016 +0900"
      },
      "message": "Count error document to complete adding documents to the database.\n\nPreviously DocumentLoader#LoaderTask had a counter to count loaded\ndocuments and completes adding documents to the database.  However it\ndoes not count documents where a MTP device returns an error for\ngetObjectInfo. The CL fixes the problem to ensure we complete documents\nloading.\n\nBUG\u003d27729653\n\nChange-Id: I696eac790a6535f1bd7a1855dc2d6f932e32eae5\n"
    },
    {
      "commit": "1360868de8a2eb724bd82bc30858c2e345c83482",
      "tree": "c9a65a1f06c87ad5856e55eb715885ab74334aef",
      "parents": [
        "ffaf94459a5042cd0881c7764c267a34aa5b60f0",
        "fc7fb7533f46b53247d1e6e6edca6e6c9ac676fe"
      ],
      "author": {
        "name": "Daichi Hirono",
        "email": "hirono@google.com",
        "time": "Thu Mar 17 04:53:34 2016 +0000"
      },
      "committer": {
        "name": "Android (Google) Code Review",
        "email": "android-gerrit@google.com",
        "time": "Thu Mar 17 04:53:35 2016 +0000"
      },
      "message": "Merge \"Add suffix number when copying a file.\" into nyc-dev"
    },
    {
      "commit": "fc7fb7533f46b53247d1e6e6edca6e6c9ac676fe",
      "tree": "06d72fc6a765384e2c78c4e277413c0ee2d7e4ea",
      "parents": [
        "62006a72a66ddc5849b28d7ceaaa304b66aa3dc9"
      ],
      "author": {
        "name": "Daichi Hirono",
        "email": "hirono@google.com",
        "time": "Tue Mar 15 19:19:31 2016 +0900"
      },
      "committer": {
        "name": "Daichi Hirono",
        "email": "hirono@google.com",
        "time": "Thu Mar 17 13:52:21 2016 +0900"
      },
      "message": "Add suffix number when copying a file.\n\nIf we have an existing file in the destination directory, which has the\nsame name with the source file, adding suffix number is\nDocumentsProvider\u0027s responsibility.\n\nBecause MTP does not provide a way to check existance of files with\ngiven name, the logic is implemented as try-and error strategy. The CL\nlets If we MtpDocumentsProvider assume we have a file that shares the\nsame name with the source file if it failed to invoke\nMtpDevice#sendObjectInfo. In this case MtpDocumentsProvider retry to\ninvoke sendObjectInfo with new name with suffix number.\n\nBUG\u003d26991190\n\nChange-Id: I223ac5031f079bc91eb27709b0356f621a1ed55b\n"
    },
    {
      "commit": "aa0fa38432abca1c8d3b88754eb60a45e75a65ef",
      "tree": "846f4e3463bbbb6821d468e2b0eaaf718e3a89ba",
      "parents": [
        "32d1a1a9110921dc043e4103e3ef1d075e1cf518",
        "acb0e27bb33e373f1c42d6e2ef9344169cae96f0"
      ],
      "author": {
        "name": "Daichi Hirono",
        "email": "hirono@google.com",
        "time": "Tue Mar 15 02:36:44 2016 +0000"
      },
      "committer": {
        "name": "Android (Google) Code Review",
        "email": "android-gerrit@google.com",
        "time": "Tue Mar 15 02:36:46 2016 +0000"
      },
      "message": "Merge \"Regard timeout as an error in the MtpDocumentsProvider test.\" into nyc-dev"
    },
    {
      "commit": "acb0e27bb33e373f1c42d6e2ef9344169cae96f0",
      "tree": "24dbae73fd22691b26f12cfe364d4d9c47f10fda",
      "parents": [
        "62006a72a66ddc5849b28d7ceaaa304b66aa3dc9"
      ],
      "author": {
        "name": "Daichi Hirono",
        "email": "hirono@google.com",
        "time": "Mon Mar 14 21:49:14 2016 +0900"
      },
      "committer": {
        "name": "Daichi Hirono",
        "email": "hirono@google.com",
        "time": "Tue Mar 15 11:35:34 2016 +0900"
      },
      "message": "Regard timeout as an error in the MtpDocumentsProvider test.\n\nPreviously if DocumentsProvider found timeout when terminatnig\nRootScanner\u0027s background thread, it just output it in error log. Thus\nthe timeout is not regarded as an error in MtpDocumentsProviderTest, and\nit makes flaky PipeManagerTest which runs just after\nMtpDocumentsProviderTest.\n\nThe CL\n\n * lets MtpDocumentsProvider throw TimeoutException for timeout.\n * removes redundant resumeRootScanner calls to avoid timeout of\n   RootScanner#pause.\n\nAlso the CL did cleanup the logic that pauses RootScanner when we don\u0027t\nfind any devices. Previously the logic was in\nMtpDocumentsProvider#closeInternal but it is not efficient because we\ninvokes RootScanner#resume just after\nMtpDocumentsProvider#closeInternal. Now the CL moves the logic to\nRootScanner so that it can pause itself automatically.\n\nBUG\u003d27638500\n\nChange-Id: Ic11bca67c099cbb0f46679db2f035988045d67d6\n"
    },
    {
      "commit": "497b473b8a6c898b3c05aeb8d3b80c611d7e78b0",
      "tree": "32f23f88b5bf1673698607e2cffdc12720a1831c",
      "parents": [
        "62006a72a66ddc5849b28d7ceaaa304b66aa3dc9"
      ],
      "author": {
        "name": "Daichi Hirono",
        "email": "hirono@google.com",
        "time": "Mon Mar 14 14:46:37 2016 +0900"
      },
      "committer": {
        "name": "Daichi Hirono",
        "email": "hirono@google.com",
        "time": "Mon Mar 14 15:30:37 2016 +0900"
      },
      "message": "MtpDocumentsProvider returns mime type from file extension.\n\nFile extensions contain more information to determine mime type than MTP\nformat codes. The CL lets MtpDocumentsProvider return mime type from\nfile extensions if it\u0027s not inconsitent with format code.\n\nBUG\u003d27004954\n\nChange-Id: I08a4a91235b1d3f48e77b70b28c8c5aedf8d601d\n"
    },
    {
      "commit": "3bb37e7ff0a7b0a8086007633ad927fec59a6e94",
      "tree": "e31baaa45fbe34e05efa1d4121381942104bdcba",
      "parents": [
        "713be06f7aa70288b4bf811d7cf9c0220c09e9c0"
      ],
      "author": {
        "name": "Daichi Hirono",
        "email": "hirono@google.com",
        "time": "Mon Feb 29 15:30:56 2016 +0900"
      },
      "committer": {
        "name": "Daichi Hirono",
        "email": "hirono@google.com",
        "time": "Wed Mar 09 12:32:22 2016 +0900"
      },
      "message": "Cleans up the metadata in MtpDatabase at the first launch after booting.\n\nWhen rebooting a device, applicaitons lose temporary URI permissions so\nwe don\u0027t need to keep document ID that are not granted persistent URI\npermissions.\n\n 1. Check Settings.Global.BOOT_COUNT to find out if it\u0027s first time to\n    launch MtpDocumentsProvider since booting.\n 2. If so, invokes clean up method of MtpDatabase.\n\nBUG\u003d26212981\nChange-Id: Ic9a8ca7e7a9cac1ed91fdfb01e9dce14ce819243\n"
    },
    {
      "commit": "37a655aac1d61ce2fe346531f78cbcfbf51388e9",
      "tree": "1f3d0e8f6927ff703cc998cb1875a20bdd14fc5e",
      "parents": [
        "566b303365078fac9a454f1595add19e02631db3"
      ],
      "author": {
        "name": "Daichi Hirono",
        "email": "hirono@google.com",
        "time": "Fri Mar 04 18:43:21 2016 +0900"
      },
      "committer": {
        "name": "Daichi Hirono",
        "email": "hirono@google.com",
        "time": "Mon Mar 07 19:41:10 2016 +0900"
      },
      "message": "Fix null pointer exception in DocumentLoader.\n\nBUG\u003d27489909\n\nChange-Id: I1ebc9953f6db6639241d0c46257d110c5b0eb5b0\n"
    },
    {
      "commit": "24ab92a5f7492f116ae82f354f406de60a0d912c",
      "tree": "7da93ec2f926955bbd8442542bdba96976705b11",
      "parents": [
        "840c617c3869222132748fb54f4126f19605de0e"
      ],
      "author": {
        "name": "Daichi Hirono",
        "email": "hirono@google.com",
        "time": "Fri Mar 04 17:53:03 2016 +0900"
      },
      "committer": {
        "name": "Daichi Hirono",
        "email": "hirono@google.com",
        "time": "Fri Mar 04 17:53:03 2016 +0900"
      },
      "message": "Ensure to complete background thread of PipeManager.\n\nBUG\u003d27488803\n\nChange-Id: Ib540ab42f6263e1aea4c1bb184a4f88aa1454a14\n"
    },
    {
      "commit": "61ba923ca0cb5c928a16729d0aa67b6bf4b2f027",
      "tree": "670610d311ba14d76faae4454c8a814cf6449a13",
      "parents": [
        "0f32537e40ee2662d4f0b7b625ee280ca9c02066"
      ],
      "author": {
        "name": "Daichi Hirono",
        "email": "hirono@google.com",
        "time": "Fri Feb 26 12:58:39 2016 +0900"
      },
      "committer": {
        "name": "Daichi Hirono",
        "email": "hirono@google.com",
        "time": "Fri Feb 26 16:23:30 2016 +0900"
      },
      "message": "Set document flag by referring MTP supported operations.\n\nBUG\u003d26147375\n\nChange-Id: I6c4244f1f1153c1bbbf21ea9d608dc1a92ca70cd\n"
    },
    {
      "commit": "0f32537e40ee2662d4f0b7b625ee280ca9c02066",
      "tree": "ab2693d13a6149ed9c593634adff9c51cbbe5323",
      "parents": [
        "52cdc1593aab9336ad06cfe54cd06ca42ab3837e"
      ],
      "author": {
        "name": "Daichi Hirono",
        "email": "hirono@google.com",
        "time": "Sun Feb 21 15:50:30 2016 +0900"
      },
      "committer": {
        "name": "Daichi Hirono",
        "email": "hirono@google.com",
        "time": "Fri Feb 26 16:20:02 2016 +0900"
      },
      "message": "Stops performing operations that does not supported by MTP device.\n\nMTP devices can return supported operation list. The CL sets root flag\nby referring it.\n\nBUG\u003d26147375\n\nChange-Id: I02397821e208cf5a8fcf7457aa279d2818ce24c7\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": "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": "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": "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": "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": "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": "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": "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": "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": "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": "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": "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": "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": "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": "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"
    }
  ],
  "next": "18d70d5b7c46d2a35f66a6a76ba319eacf62e6c6"
}
