)]}'
{
  "log": [
    {
      "commit": "3a34befc6fb04a4945a849e8bda8b84e4bf973fe",
      "tree": "80dee67385fb78763b2c25f6dce9ed122bfd9aee",
      "parents": [
        "a1f10e8959cd4656aedb2613e855342102e59555"
      ],
      "author": {
        "name": "Marco Nelissen",
        "email": "marcone@google.com",
        "time": "Tue Aug 02 13:33:41 2011 -0700"
      },
      "committer": {
        "name": "Marco Nelissen",
        "email": "marcone@google.com",
        "time": "Tue Aug 09 10:21:10 2011 -0700"
      },
      "message": "Keep effects sessions active when the caller dies.\n\nDon\u0027t remove effects until the session they are in goes away or all\nAudioEffects have been explicitly released. This allows the control\npanel process to die without stopping the effects.\n\nChange-Id: I4496e5df080230ca1af149dec95c1309ab8ea888\n"
    },
    {
      "commit": "0d255b2d9061ba31f13ada3fc0f7e51916407176",
      "tree": "4df26e48710542386bddab7a0d1cbfa5d6835ac0",
      "parents": [
        "65580f9adf6c4d98449ad0716488f9fe3869aa5a"
      ],
      "author": {
        "name": "Jean-Michel Trivi",
        "email": "jmtrivi@google.com",
        "time": "Tue May 24 15:53:33 2011 -0700"
      },
      "committer": {
        "name": "Jean-Michel Trivi",
        "email": "jmtrivi@google.com",
        "time": "Wed Jun 01 10:55:29 2011 -0700"
      },
      "message": "Use channel mask instead of channel count for track creation\n\nRecord and playback objects (resp AudioRecord and AudioTrack)\nare created using a channel mask, but this information is lost\nin the mixer because only the channel count is known to\nAudioFlinger. A channel count can always be derived from a\nchannel mask.\n\nThe change consists in:\n- disambiguiting variable names for channel masks and counts\n- passing the mask information from the client to AudioFlinger\n and the mixer.\n- when using the DIRECT ouput, only verifying the format of\n the track is compatible with the output\u0027s for PCM.\n\nChange-Id: I50d87bfb7d7afcabdf5f12d4ab75ef3a54132c0e\n"
    },
    {
      "commit": "65580f9adf6c4d98449ad0716488f9fe3869aa5a",
      "tree": "71432ddbf09fcc122be1ef5781bbc2d87f725ad8",
      "parents": [
        "e1315cf0b63b4c14a77046519e6b01f6f60d74b0"
      ],
      "author": {
        "name": "Eric Laurent",
        "email": "elaurent@google.com",
        "time": "Fri May 27 17:51:52 2011 -0700"
      },
      "committer": {
        "name": "Eric Laurent",
        "email": "elaurent@google.com",
        "time": "Fri May 27 17:51:52 2011 -0700"
      },
      "message": "Removed interface to load audio effects libraries\n\nRemoved unused functions allowing dynamic loading of audio effects libraries\nfrom effects factory API.\n\nChange-Id: I06cc5a51dc10aca87c7a8687bbb874babd711eca\n"
    },
    {
      "commit": "eda6c364c253ba97ee45a3adeb8c2b45db1f81db",
      "tree": "7e8011600b617e524645928514e5eaf3f867bb75",
      "parents": [
        "ab8a0badb8fb1e294dacf2eb6a891439f348aff9"
      ],
      "author": {
        "name": "Eric Laurent",
        "email": "elaurent@google.com",
        "time": "Wed Feb 02 09:33:30 2011 -0800"
      },
      "committer": {
        "name": "Eric Laurent",
        "email": "elaurent@google.com",
        "time": "Thu Feb 03 09:26:24 2011 -0800"
      },
      "message": "Fix issue 3371080\n\nModified default volume control logic in AudioService:\n1 IN_CALL volume if in video/audio chat\n2 NOTIFICATION if notification is playing or was playing less than 5s ago.\n3 MUSIC\n\nModified silent mode:\n- now also affect MUSIC stream type\n- entering silent mode when VOL- hard key is pressed once while selected\nstream volume is already at 0 (except for VOICE_CALL stream).\n- exiting silent mode when pressing VOL+ hard key while in silent mode\n\nPlay sound FX (audible selections, keyboard clicks) at a fixed volume.\n\nModified audio framework:\n- isStreamActive() method now implemented in AudioPolicyManagerBase (previously AudioFlinger)\n- iStreamActive() now specifies a time window during which the stream is considered\nactive after it actually stopped.\n\nChange-Id: I7e5a0724099450b9fc90825224180ac97322785f\n"
    },
    {
      "commit": "de070137f11d346fba77605bd76a44c040a618fc",
      "tree": "ba741240b391a66899514061ccda38254e539013",
      "parents": [
        "f997cabca292d70d078ae828e21c28e6df62995f"
      ],
      "author": {
        "name": "Eric Laurent",
        "email": "elaurent@google.com",
        "time": "Tue Jul 13 04:45:46 2010 -0700"
      },
      "committer": {
        "name": "Eric Laurent",
        "email": "elaurent@google.com",
        "time": "Tue Jul 20 10:31:57 2010 -0700"
      },
      "message": "Audio policy manager changes for audio effects\n\nAdded methods for audio effects management by audio policy manager.\n- control of total CPU load and memory used by effect engines\n- selection of output stream for global effects\n- added audio session id in parameter list for startOutput() and stopOutput().\nthis is not used in default audio policy manager implementation.\n\nModifications of audio effect framework in AudioFlinger to allow moving and reconfiguring\neffect engines from one output mixer thread to another when audio tracks in the same session\nare moved or when requested by audio policy manager.\nAlso fixed mutex deadlock problem with effect chains locks.\n\nChange-Id: Ida43484b06e9b890d6b9e53c13958d042720ebdb\n"
    },
    {
      "commit": "ffe9c25ce85e1af55d58ec025adc6367d70db7e8",
      "tree": "664f0a33a690b4d020417a9ecc81b32f696d0f0e",
      "parents": [
        "2439a8d6d99864ba0c2d94f428e6c9ee258cdd45"
      ],
      "author": {
        "name": "Eric Laurent",
        "email": "elaurent@google.com",
        "time": "Wed Jun 23 17:38:20 2010 -0700"
      },
      "committer": {
        "name": "Eric Laurent",
        "email": "elaurent@google.com",
        "time": "Fri Jun 25 11:59:35 2010 -0700"
      },
      "message": "Various fixes and improvements in audio effects implementation\n\nEffect API:\n- Use different definitions for audio device, channels, formats... in AudioSystem and EffectApi:\n  Removed media/AudioCommon.h file created for initial version of EffectApi\n- Indicate audio session and output ID to effect library when calling EffectCreate(). Session ID can be useful to optimize\nthe implementation of effect chains in the same audio session. Output ID can be used for effects implemented in audio hardware.\n- Renamed EffectQueryNext() function to EffectQueryEffect() and changed operating mode:\n  now an index is passed for the queried effect instead of implicitly querying the next one.\n- Added CPU load and memory usage indication in effects descriptor\n- Added flags and commands to indicate changes in audio mode (ring tone, in call...) to effect engine\n- Added flag to indicate hardware accelerated effect implementation.\n- Renamed EffectFactoryApi.h to EffectsFactoryApi.h for consistency with EffectsFactory.c/h\n\nEffect libraries:\n- Reflected changes in Effect API\n- Several fixes in reverb implementation\n- Added build option TEST_EFFECT_LIBRARIES in makefile to prepare integration of actual effect library.\n- Replaced pointer by integer identifier for library handle returned by effects factory\n\nAudio effect framework:\n- Added support for audio session -1 in preparation of output stage effects configuration.\n- Reflected changes in Effect API\n- Removed volume ramp up/down when effect is inserted/removed: this has to be taken care of by effect engines.\n- Added some overflow verification on indexes used for deferred parameter updates via shared memory\n- Added hardcoded CPU and memory limit check when creating a new effect instance\n\nChange-Id: I43fee5182ee201384ea3479af6d0acb95092901d\n"
    },
    {
      "commit": "be916aa1267e2e6b1c148f51d11bcbbc79cb864c",
      "tree": "7e2be6182cde7d023ae9afec28463d69d231d7bc",
      "parents": [
        "c282e3eee921453fc9188705b4879d6289b71f9c"
      ],
      "author": {
        "name": "Eric Laurent",
        "email": "elaurent@google.com",
        "time": "Tue Jun 01 23:49:17 2010 -0700"
      },
      "committer": {
        "name": "Eric Laurent",
        "email": "elaurent@google.com",
        "time": "Thu Jun 03 03:21:53 2010 -0700"
      },
      "message": "Issue 2667801: [Audio Effect Framework] AudioFlinger, AudioMixer AudioTrack modifications.\n\nFirst drop of audio framework modifications for audio effects support.\n\n- AudioTrack/AudioRecord:\nAdded support for auxiliary effects in AudioTrack\nAdded support for audio sessions\nFixed left right channel inversion in setVolume()\n\n- IAudioFlinger:\nAdded interface methods for effect enumeraiton and instantiation\nAdded support for audio sessions.\n\n- IAudioTrack:\nAdded method to attach auxiliary effect.\n\n- AudioFlinger\nCreated new classes to control effect engines in effect library and manage effect connections to tracks or\noutput mix:\n  EffectModule: wrapper object controlling the effect engine implementation in the effect library. There\n\tis one EffectModule per instance of an effect in a given audio session\n  EffectChain: group of effects associated to one audio session. There is one EffectChain per audio session.\n\tEffectChain for session 0 is for output mix effects, other chains are attached to audio tracks\n\twith same session ID. Each chain contains a variable number of EffectModules\n  EffectHandle: implements the IEffect interface. There is one EffectHandle object for each application\n\tcontrolling (or using) an effect module. THe EffectModule maintians a list of EffectHandles.\n\nAdded support for effect modules and effect chains creation in PlaybackThread.\nmodified mixer thread loop to allow track volume control by effect modules and call effect processing.\n\n-AudioMixer\nEach track now specifies its output buffer used by mixer for accumulation\nModified mixer process functions to process tracks by groups of tracks with same buffer\nModified track process functions to support accumulation to auxiliary channel\n\nChange-Id: I26d5f7c9e070a89bdd383e1a659f8b7ca150379c\n"
    },
    {
      "commit": "05bca2fde53bfe3063d2a0a877f2b6bfdd6052cf",
      "tree": "7f99a6ebacbc1f76b561b95a04808636486b48ba",
      "parents": [
        "949c5037a6e019ff575bd481d286908c2eaa1e34"
      ],
      "author": {
        "name": "Eric Laurent",
        "email": "elaurent@google.com",
        "time": "Fri Feb 26 02:47:27 2010 -0800"
      },
      "committer": {
        "name": "Eric Laurent",
        "email": "elaurent@google.com",
        "time": "Tue Mar 02 08:20:13 2010 -0800"
      },
      "message": "Issue 2071329: audio track is shorter than video track for video capture on sholes\n\nAdd API to retrieve number of frames dropped by audio input kernel driver.\n\nSubmitted on behalf of Masaki Sato \u003cmasaki.sato@motorola.com\u003e\n"
    },
    {
      "commit": "342e9cf388cceb807def720e40e8b0a217f4bcaa",
      "tree": "2d443e1de1a10b628016a5ceffb4b5a1cb031dd7",
      "parents": [
        "2dce41ad26cb3e9e15c9e456a84bcf5309548ca0"
      ],
      "author": {
        "name": "Eric Laurent",
        "email": "elaurent@google.com",
        "time": "Tue Jan 19 17:37:09 2010 -0800"
      },
      "committer": {
        "name": "Eric Laurent",
        "email": "elaurent@google.com",
        "time": "Tue Jan 26 18:40:39 2010 -0800"
      },
      "message": "Fix issue 2285561: New AudioFlinger and audio driver API needed for A/V sync\n\nAdded getRenderPosition() API to IAudioFlinger to retreive number of audio frames\nwritten by AudioFlinger to audio HAL and by DSP to DAC.\n\nAdded getRenderPosition() API to AudioHardwareInterface to retreive number of audio frames\nwritten by DSP to DAC.\n\nExposed AudioTrack::getPosition() to AudioSink() to make it available to media player.\n\nRemoved excessive log in AudioHardwareGeneric.\n"
    },
    {
      "commit": "b72a396826da8bd934b9531bbd40f86d7509e71c",
      "tree": "7eab39ce31d2609e7c0281e1f0541a8425d6e5e2",
      "parents": [
        "6c009eb5ff5f999b1d9bc6978d3213f9f797903f"
      ],
      "author": {
        "name": "Eric Laurent",
        "email": "elaurent@google.com",
        "time": "Mon Jan 25 08:49:09 2010 -0800"
      },
      "committer": {
        "name": "Eric Laurent",
        "email": "elaurent@google.com",
        "time": "Mon Jan 25 14:00:10 2010 -0800"
      },
      "message": "Fix issue 2378022: AudioService should direct volume control to STREAM_VOICE_CALL stream when STREAM_VOICE_CALL stream is active.\n\nModified AudioService.getActiveStreamType() so that STREAM_VOICE_CALL is selected when a track using this stream\ntype is playing.\n\nChanded isMusicActive() for a more generic isStreamActive(stream) method in AudioSystem, IAudioFlinger and AudioFlinger.\n"
    },
    {
      "commit": "f0ee6f4055e26fb35d9c526a596668a4dc9da5ba",
      "tree": "9eaa1f520448a3c83ec724cc4d02e9d4838c203f",
      "parents": [
        "66d1e82ce5d5e189442285b6225977137b65c608"
      ],
      "author": {
        "name": "Eric Laurent",
        "email": "elaurent@google.com",
        "time": "Wed Oct 21 08:14:22 2009 -0700"
      },
      "committer": {
        "name": "Eric Laurent",
        "email": "elaurent@google.com",
        "time": "Wed Oct 21 12:29:37 2009 -0700"
      },
      "message": "Fix issue 2192181: AudioFlinger must provide separated methods to set VOICE_CALL stream volume and down link audio volume.\n\nAdded setVoiceVolume() method to AudioSystem, AudioFlinger, IAudioFlinger, AudioPolicyService.\nRemoved call to AudioHardwareInterface::setVoiceVolume() from AudioFlinger::setStreamVolume().\n"
    },
    {
      "commit": "5841db78dff14898538200287d246577b1fc37e2",
      "tree": "3d3cd806d443584a23a4ac3b3731ca3ba761c58e",
      "parents": [
        "85fa14d35468acca07ce0085d67b909f673fae07"
      ],
      "author": {
        "name": "Eric Laurent",
        "email": "elaurent@google.com",
        "time": "Wed Sep 09 05:16:08 2009 -0700"
      },
      "committer": {
        "name": "Eric Laurent",
        "email": "elaurent@google.com",
        "time": "Wed Sep 09 05:16:08 2009 -0700"
      },
      "message": "Fix issue 2107584: media server crash when AudioFlinger fails to allocate memory for track control block.\n\nAudioFlinger: verify that mCblk is not null before using it in Track and RecordTrack contructors.\nIAudioFlinger: check result of remote transaction before reading IAudioTrack and IAudioRecord.\nIAudioTrack and IAudioRecord: check result of remote transaction before reading IMemory.\n"
    },
    {
      "commit": "fa2877b9ea48baed934b866d2ab3658b69c4c869",
      "tree": "df0324b64c7dba6cdd6b1f0baa8c14c4f4db09a9",
      "parents": [
        "285ead29c9eee092d367effd89f1c9f4f0bb9d6c"
      ],
      "author": {
        "name": "Eric Laurent",
        "email": "elaurent@google.com",
        "time": "Tue Jul 28 08:44:33 2009 -0700"
      },
      "committer": {
        "name": "Eric Laurent",
        "email": "elaurent@google.com",
        "time": "Fri Aug 07 00:27:19 2009 -0700"
      },
      "message": "Fix issue 2001214: AudioFlinger and AudioPolicyService interfaces should not use pointers as handles to inputs and outputs.\n\nUse integers instead of void* as input/output handles at IAudioFlinger and IAudioPolicyService interfaces.\nAudioFlinger maintains an always increasing count of opened inputs or outputs as unique ID.\n"
    },
    {
      "commit": "c2f1f07084818942352c6bbfb36af9b6b330eb4e",
      "tree": "88ac93be41edadd8cbfe6448e1421d5165883f59",
      "parents": [
        "a64c8c79af1a15911c55306d83a797fa50969f77"
      ],
      "author": {
        "name": "Eric Laurent",
        "email": "elaurent@google.com",
        "time": "Fri Jul 17 12:17:14 2009 -0700"
      },
      "committer": {
        "name": "Eric Laurent",
        "email": "elaurent@google.com",
        "time": "Thu Jul 23 06:03:39 2009 -0700"
      },
      "message": "Fix issue 1795088       Improve audio routing code\n\nInitial commit for review.\nIntegrated comments after patch set 1 review.\nFixed lockup in AudioFlinger::ThreadBase::exit()\nFixed lockup when playing tone with AudioPlocyService startTone()\n"
    },
    {
      "commit": "b7056fc8525e0515c6f46676e3307088f8b64cdc",
      "tree": "d29743e9a55aa4f77fa25018e6248b459434bbbe",
      "parents": [
        "95634c8b6ad5419e310a5196bcc37f5988ed82da"
      ],
      "author": {
        "name": "Mathias Agopian",
        "email": "mathias@google.com",
        "time": "Fri May 22 19:00:22 2009 -0700"
      },
      "committer": {
        "name": "Mathias Agopian",
        "email": "mathias@google.com",
        "time": "Tue May 26 16:12:20 2009 -0700"
      },
      "message": "some work to try to reduce the code size of some native libraries\n\n- make sure that all binder Bn classes define a ctor and dtor in their respective library.\n  This avoids duplication of the ctor/dtor in libraries where these objects are instantiated.\n  This is also cleaner, should we want these ctor/dtor to do something one day.\n\n- same change as above for some Bp classes and various other non-binder classes\n\n- moved the definition of CHECK_INTERFACE() in IInterface.h instead of having it everywhere.\n\n- improved the CHECK_INTERFACE() macro so it calls a single method in Parcel, instead of inlining its code everywhere\n\n- IBinder::getInterfaceDescriptor() now returns a \"const String16\u0026\" instead of String16, which saves calls to String16 and ~String16\n\n- implemented a cache for BpBinder::getInterfaceDescriptor(), since this does an IPC. HOWEVER, this method never seems to be called.\n  The cache makes BpBinder bigger, so we need to figure out if we need this method at all.\n"
    },
    {
      "commit": "95634c8b6ad5419e310a5196bcc37f5988ed82da",
      "tree": "ea712e322c480a83965f8f51946eda3263bdd080",
      "parents": [
        "0058db5fae0fecf66ee47aa1c35ddd6e11b6c66f",
        "f5879c1448cc6aebc51b26d3ec2399d66144f8f4"
      ],
      "author": {
        "name": "Android (Google) Code Review",
        "email": "android-gerrit@google.com",
        "time": "Tue May 26 10:11:44 2009 -0700"
      },
      "committer": {
        "name": "The Android Open Source Project",
        "email": "initial-contribution@android.com",
        "time": "Tue May 26 10:11:44 2009 -0700"
      },
      "message": "am de8268d6: Merge change 2331 into donut\n\nMerge commit \u0027de8268d6d1cd168510c490b17e93154d2eab767c\u0027\n\n* commit \u0027de8268d6d1cd168510c490b17e93154d2eab767c\u0027:\n  Fix issue 1846343 - part 1\n"
    },
    {
      "commit": "f5879c1448cc6aebc51b26d3ec2399d66144f8f4",
      "tree": "d5ef576af674468ebff2b7d39c60ca0c9a53a39e",
      "parents": [
        "260b80b02d35a29c7010b10e5bea504164441665"
      ],
      "author": {
        "name": "Eric Laurent",
        "email": "elaurent@google.com",
        "time": "Fri May 22 09:18:15 2009 -0700"
      },
      "committer": {
        "name": "Eric Laurent",
        "email": "elaurent@google.com",
        "time": "Tue May 26 07:44:28 2009 -0700"
      },
      "message": "Fix issue 1846343 - part 1\n\nThis change is the first part of a fix for issue 1846343, :\n- Added new enum values for input sources in AudioRecord and MediaRecorder for voice uplink, downlink and uplink+downlink sources.\n- renamed streamType to inputSource in all native functions handling audio record.\n\nA second change is required in opencore author driver and android audio input to completely fix the issue.\n"
    },
    {
      "commit": "7562408b2261d38415453378b6188f74fda99d88",
      "tree": "6b2ac284c1b721385d695045357d9e1d60ece03a",
      "parents": [
        "615a9bfbd98b90e09d868c128db84836feb658e4"
      ],
      "author": {
        "name": "Mathias Agopian",
        "email": "mathias@google.com",
        "time": "Tue May 19 19:08:10 2009 -0700"
      },
      "committer": {
        "name": "Mathias Agopian",
        "email": "mathias@google.com",
        "time": "Wed May 20 12:55:03 2009 -0700"
      },
      "message": "move libbinder\u0027s header files under includes/binder\n"
    },
    {
      "commit": "1dd70b9f04961a06fcb73a97fca10a53b3245d3c",
      "tree": "a2704fd75e6de04107a7d40bd3e56f6f7acfa51b",
      "parents": [
        "ce80c82f58378da72d8a36f520c781cc5cac18a1"
      ],
      "author": {
        "name": "Eric Laurent",
        "email": "elaurent@google.com",
        "time": "Tue Apr 21 07:56:33 2009 -0700"
      },
      "committer": {
        "name": "Eric Laurent",
        "email": "elaurent@google.com",
        "time": "Tue Apr 21 07:56:33 2009 -0700"
      },
      "message": "Fix issue 1745312: Various cleanups in media framework\n\nAudioTrack, AudioRecord:\n  - remove useless mAudioFlinger member of AudioTrack and AudioRecord.\n  - signal cblk.cv condition in stop() method to speed up stop completion.\n  - extend wait condition timeout in obtainBuffer() when waitCount is -1 to avoid waking up callback thread unnecessarily\n\nAudioFlinger:\n  - remove some warnings in AudioFlinger.cpp.\n  - remove function AudioFlinger::MixerThread::removetrack_l()  as its content is never executed.\n  - remove useless call to setMasterVolume in AudioFlinger::handleForcedSpeakerRoute().\n  - Offset VOICE_CALL stream volume to reflect actual volume that is never 0 in hardware (this fix has been made in the open source): 0.01 + v * 0.99.\n\nAudioSystem.java:\n  - correct typo in comment\n\nIAudioflinger, IAudioFlingerClient:\n  - make AudioFlinger binder interfaces used for callbacks ONEWAY.\n\nAudioHardwareInterface:\n  - correct routeStrings[] table in AudioHardwareInteface.cpp\n"
    },
    {
      "commit": "89fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5",
      "tree": "28d26f7b71e943e25c7da6e8043d79b7b8d9cf7b",
      "parents": [
        "15f767b960b38059a74a42a33e16d8df2aec8bc1"
      ],
      "author": {
        "name": "The Android Open Source Project",
        "email": "initial-contribution@android.com",
        "time": "Tue Mar 03 19:31:44 2009 -0800"
      },
      "committer": {
        "name": "The Android Open Source Project",
        "email": "initial-contribution@android.com",
        "time": "Tue Mar 03 19:31:44 2009 -0800"
      },
      "message": "auto import from //depot/cupcake/@135843\n"
    },
    {
      "commit": "15f767b960b38059a74a42a33e16d8df2aec8bc1",
      "tree": "4b825dc642cb6eb9a060e54bf8d69288fbee4904",
      "parents": [
        "ad04d9201452001dbaac4349f084cc9316190b89"
      ],
      "author": {
        "name": "The Android Open Source Project",
        "email": "initial-contribution@android.com",
        "time": "Tue Mar 03 18:28:45 2009 -0800"
      },
      "committer": {
        "name": "The Android Open Source Project",
        "email": "initial-contribution@android.com",
        "time": "Tue Mar 03 18:28:45 2009 -0800"
      },
      "message": "auto import from //depot/cupcake/@135843\n"
    },
    {
      "commit": "7a2146d5807030b2629f347736be5301b61e8811",
      "tree": "50ca10276a614287673aeefe08f3d8c5eafdad33",
      "parents": [
        "5e07b5774c8b376776caa4f5b0a193767697e97e"
      ],
      "author": {
        "name": "The Android Open Source Project",
        "email": "initial-contribution@android.com",
        "time": "Fri Feb 13 12:57:50 2009 -0800"
      },
      "committer": {
        "name": "The Android Open Source Project",
        "email": "initial-contribution@android.com",
        "time": "Fri Feb 13 12:57:50 2009 -0800"
      },
      "message": "auto import from //branches/cupcake/...@131421\n"
    },
    {
      "commit": "5e07b5774c8b376776caa4f5b0a193767697e97e",
      "tree": "3260f49c6f0c5b4699ac6b80b4dc505566af17e8",
      "parents": [
        "e5198b620a9a208ec59ea8457282404725f8ff6e"
      ],
      "author": {
        "name": "The Android Open Source Project",
        "email": "initial-contribution@android.com",
        "time": "Tue Feb 10 15:44:00 2009 -0800"
      },
      "committer": {
        "name": "The Android Open Source Project",
        "email": "initial-contribution@android.com",
        "time": "Tue Feb 10 15:44:00 2009 -0800"
      },
      "message": "auto import from //branches/cupcake/...@130745\n"
    },
    {
      "commit": "7b5eb023f8d87cca6d830ae6c11c6aadbe02aca8",
      "tree": "d9838a098f868ee2fcffc20627a8c9a33cb23377",
      "parents": [
        "2729ea9262ca60d93047e984739887cfc89e82eb"
      ],
      "author": {
        "name": "The Android Open Source Project",
        "email": "initial-contribution@android.com",
        "time": "Wed Dec 17 18:05:43 2008 -0800"
      },
      "committer": {
        "name": "The Android Open Source Project",
        "email": "initial-contribution@android.com",
        "time": "Wed Dec 17 18:05:43 2008 -0800"
      },
      "message": "Code drop from //branches/cupcake/...@124589\n"
    },
    {
      "commit": "2729ea9262ca60d93047e984739887cfc89e82eb",
      "tree": "25962a3f1c5f70586af45c926c037e03c643857f",
      "parents": [],
      "author": {
        "name": "The Android Open Source Project",
        "email": "initial-contribution@android.com",
        "time": "Tue Oct 21 07:00:00 2008 -0700"
      },
      "committer": {
        "name": "The Android Open Source Project",
        "email": "initial-contribution@android.com",
        "time": "Tue Oct 21 07:00:00 2008 -0700"
      },
      "message": "Initial Contribution\n"
    }
  ]
}
