)]}'
{
  "log": [
    {
      "commit": "fb552905c92c5b6bec1089ada87f1d2999f7f8d2",
      "tree": "06b7e09ddd3b942d3a6a4dce463c86f41d416302",
      "parents": [
        "58144273809dc92c36f901190cc825e1739de2bd"
      ],
      "author": {
        "name": "Chris Ye",
        "email": "lzye@google.com",
        "time": "Wed Feb 03 17:18:37 2021 -0800"
      },
      "committer": {
        "name": "Chris Ye",
        "email": "lzye@google.com",
        "time": "Thu Feb 04 22:20:38 2021 -0800"
      },
      "message": "Add vibrator state listener support for input device vibrator\n\nExtend Vibrator state and listener support to InputDevice vibrator.\nInputDevice users can use the Vibrator listener API to register listener\nto vibrator for state change.\n\nBug: 161634264\nTest: atest InputDeviceVibratorTest\nChange-Id: I8823fb861a35ef8f4bbbb0dd48bdc5d49bc1eef9\n"
    },
    {
      "commit": "f59a2f484d4765edd74c9bb3f911f66c4eb7a3f4",
      "tree": "b91d1eb60a4d61bf4a7bc44f2f170633f61b176f",
      "parents": [
        "ef7705d5695070d62ed58047021af5318d91d494"
      ],
      "author": {
        "name": "Chris Ye",
        "email": "lzye@google.com",
        "time": "Fri Oct 16 12:55:26 2020 -0700"
      },
      "committer": {
        "name": "Chris Ye",
        "email": "lzye@google.com",
        "time": "Wed Dec 16 15:42:57 2020 -0800"
      },
      "message": "Add SensorManager support in inputflinger.\n\nAdd sensor device, sensor input mapper, sens event dispatcher support\ninto inputflinger.\n\nBug: 161634265\nTest: atest inputflinger_tests\n\nChange-Id: I2dcb2c35d9dccefc4cd8d939b79cf340931a9410\n"
    },
    {
      "commit": "7e186182c8181458ec9d0072bc1f3d7f34ba88a6",
      "tree": "4ef0441528924b08046b8cdfacb237b398de9ee0",
      "parents": [
        "b8871072670285c34d18c762d483b553c5473557"
      ],
      "author": {
        "name": "Prabir Pradhan",
        "email": "prabirmsp@google.com",
        "time": "Tue Nov 10 13:56:45 2020 -0800"
      },
      "committer": {
        "name": "Prabir Pradhan",
        "email": "prabirmsp@google.com",
        "time": "Tue Nov 17 11:52:02 2020 -0800"
      },
      "message": "SyncPointerCapture (1/n): Notify PointerCaptureChanged through InputListener\n\nThis CL adds notifyPointerCaptureChanged(NotifyPointerCaptureChangedArgs)\nto the InputListener interface so that InputReader can notify the Dispatcher\nabout changes in its PointerCapture state synchronously with the\nprocessing of input events.\n\nNotifying the Dispatcher about the pointer capture state through the\nInputListener interface will synchronize the state change notification\nwith input events that are reported through the same interface.\n\nBug: 141749603\nTest: atest inputflinger_tests\nChange-Id: I7bfd45334fa70eccdd5a0f002cbb00e7a1de8d14\n"
    },
    {
      "commit": "c9ac19eb3d3c3f185fea95906541249dd4c3baf8",
      "tree": "7a69829cc69cbd4cb6d58c5c77b9fd9408382111",
      "parents": [
        "8a7cf5d50ed3ddbc59917f2c21316c2c9957a536"
      ],
      "author": {
        "name": "Siarhei Vishniakou",
        "email": "svv@google.com",
        "time": "Thu Mar 19 11:55:01 2020 -0700"
      },
      "committer": {
        "name": "Siarhei Vishniakou",
        "email": "svv@google.com",
        "time": "Fri Mar 20 12:00:45 2020 -0700"
      },
      "message": "Disable deep press when long press timeout is long\n\nIf the user sets the long press timeout to anything \u003e default value,\nthen we should disable deep press. That means, if the user is triggering\nlong press too easily, it is likely that the user will trigger deep\npress too easily as well.\nTo prevent unwanted long press invocations, we disable deep press in\nsuch situations.\n\nBug: 148311342\nTest: Add logging to both cases where deep press is enabled and\ndisabled. Go to accessibility -\u003e touch \u0026 hold delay, and change the\nvalue. Ensure that the logging matches expectation (short -\u003e enable,\nmedium/long -\u003e disable). The state should persist across the reboot.\n\nChange-Id: Ic631c684609c4436e9eaa6f9389939c5a6e4e1cd\n"
    },
    {
      "commit": "1652397ab77904092509a0315ad026f0b4f10a18",
      "tree": "b103ca2c2fb3540ca0ceec2cb4ca0c4096a61860",
      "parents": [
        "2c728339cdbf856c34d93e9418d2a2f4a1cac8aa"
      ],
      "author": {
        "name": "Siarhei Vishniakou",
        "email": "svv@google.com",
        "time": "Wed Mar 04 17:48:39 2020 -0800"
      },
      "committer": {
        "name": "Siarhei Vishniakou",
        "email": "svv@google.com",
        "time": "Wed Mar 18 03:15:39 2020 +0000"
      },
      "message": "Properly initialize MotionClassifier\n\nInputClassifier will now play a more active role in managing the\nlifecycle of MotionClassifier.\n\nIn the previous version of the code, we had a circular reference:\nMotionClassifier owned a wp\u003cInputClassifier\u003e, that sometimes got\npromoted to sp\u003c\u003e.\nBut the InputClassifier was the official owner of MotionClassifier, and\nowned a unique_ptr\u003cMotionClassifier\u003e.\n\nThe owner of InputClassifier in real code is InputManager, and in test\ncode, it\u0027s the test class. When the owner of InputClassifier destroyed\nInputClassifier, this could sometimes happen at the time when the\nMotionClassifier also held a reference to the InputClassifier. That\nmeant that the proper owner of InputClassifier was not invoking the\ndestructor.\nInstead, the MotionClassifier was invoking the InputClassifier\ndestructor.\n\nTo fix the situation, we now do the following:\n\n1. InputClassifier will never die before MotionClassifier.\n\n2. MotionClassifier constructor is now allowed to block. It would block\nfor some time because calling getService takes a while. To account for\nthis, InputClassifier launches a new thread to create MotionClassifier.\n\n3. When MotionClassifier is ready to process events, InputClassifier\nupdates mMotionClassifier, which makes it non-null.\n\n4. We now create a separate death recipient, which is co-owned by\nInputClassifier and MotionClassifier. This is done so that the refcount\nof the deathrecipient does not affect the refcount of InputClassifier,\nand thus enforces the ownership of InputClassifier by the InputManager.\nNow, no one can call ~InputClassifier except for its real owner.\n\n5. MotionClassifier will subscribe the death recipient to the death of the\nHAL. InputClassifier will delete MotionClassifier if HAL dies.\nMotionClassifier no longer holds on to the death recipient.\n\n6. We move the loop of the MotionClassifier thread to focus only on\nprocessing events. That thread will no longer do any initialization.\n\n7. Remove the thread check inside MotionClassifier. It isn\u0027t really\nuseful, now that there\u0027s only 1 function for the entire thread.\n\nOwnership summary: Both InputClassifier and MotionClassifier own\nDeathRecipient. DeathRecipient has a reference to InputClassifier. Thus,\nwe must guarantee that DeathRecipient dies before InputClassifier.\nInputClassifier owns MotionClassifier. This is OK, since even if\nInputClassifier dies, it will first delete MotionClassifier. That will\ncause MotionClassifier to release 1 refCount from DeathRecipient. That\nmeans the only reference remaining to DeathRecipient will be inside\nInputClassifier, so InputClassifier will always be alive until\nDeathRecipient is dead. Similar argument applies if MotionClassifier and\nDeathRecipient die in different order (as observed from\nInputClassifier).\n\nTests:\n1) Manually running inputflinger_tests on cuttlefish:\nbuild/launch cuttlefish using go/acloud\nm inputflinger_tests\nadb push out/target/product/vsoc_x86/data/nativetest/inputflinger_tests/inputflinger_tests /data/nativetest/inputflinger_tests/inputflinger_tests\nadb shell\n/data/nativetest/inputflinger_tests # ./inputflinger_tests --gtest_filter\u003d*InputClassifierTest* --gtest_repeat\u003d1000 --gtest_break_on_failure\n2) Boot flame and open logcat. Observe in logcat:\nStartInputManagerService took to complete: 2ms\nPreviously, in synchronous approach ( b/130184032) it was\nabout 100 ms (so we did not regress).\n3) Kill the HAL while system_server is running, and dumpsys input before\nand after:\nadb shell dumpsys input (observe that MotionClassifier is non-null on flame)\nadb shell -t killall android.hardware.input.classifier@1.0-service\nadb shell dumpsys input (observe that MotionCLassifier is null)\n\nBug: 149155998\nTest: see \"Tests\" section above\nChange-Id: Ic76b82bd5f2cd374e3b001400eb495ca36de7353\n"
    },
    {
      "commit": "e3021d703130f9f28a94bef0e7179e75794a59cf",
      "tree": "76e8376aeabeb154edbdbd3bc18dfc1bf1ebc568",
      "parents": [
        "7e221c91cd753edff6c59e61fea7619842a9addb"
      ],
      "author": {
        "name": "Siarhei Vishniakou",
        "email": "svv@google.com",
        "time": "Fri Feb 28 15:25:41 2020 -0800"
      },
      "committer": {
        "name": "Siarhei Vishniakou",
        "email": "svv@google.com",
        "time": "Mon Mar 02 20:42:08 2020 +0000"
      },
      "message": "Remove device state when device is reset\n\nWhen device reset is received in MotionClassifier, don\u0027t just set the\nclassification for that device to \u0027none\u0027.\nInstead, remove all state related to that device.\n\nThis prevents growing indefinitely the unordered_maps\nthat contain device-related state.\n\nAlso, log the feature state to the InputClassifier dump.\n\nBug: 150419367\nTest: run several touch integration tests several times, and then do\n\u0027dumpsys input\u0027. Ensure that the list doesn\u0027t grow as the tests are\nexecuted multiple times.\n\nChange-Id: I2e1ac359458a321f87e4599bb19350623afc9b2b\n"
    },
    {
      "commit": "f39cef4e3381f63ba9620a49940a9e98c17177e0",
      "tree": "eb7541dd3d6f51141b253cbe002ddbbf04f480fe",
      "parents": [
        "d6a3f6e8f651efcfc247140665019fc988296de5",
        "2581ccb1a5142a383a4c71d63994addcacf3bdaa"
      ],
      "author": {
        "name": "Automerger Merge Worker",
        "email": "android-build-automerger-merge-worker@system.gserviceaccount.com",
        "time": "Wed Dec 11 04:04:42 2019 +0000"
      },
      "committer": {
        "name": "Automerger Merge Worker",
        "email": "android-build-automerger-merge-worker@system.gserviceaccount.com",
        "time": "Wed Dec 11 04:04:42 2019 +0000"
      },
      "message": "Merge \"Enable deep press by default.\" into qt-qpr1-dev am: a785d00d11 am: 2581ccb1a5\n\nChange-Id: Ifa78027e5f7df0a6693d7ea23b563a08c81cb434\n"
    },
    {
      "commit": "64f1c16f4ef982fb183490321ddfdeca5a9de2e0",
      "tree": "a480f1a81cb6d6faa1da637721642a20e36f0af7",
      "parents": [
        "5b8a4109f5195e3ca626ab1e6ce9bfd2d1c3f2a8"
      ],
      "author": {
        "name": "Philip Quinn",
        "email": "pquinn@google.com",
        "time": "Mon Dec 09 12:08:44 2019 -0800"
      },
      "committer": {
        "name": "Philip Quinn",
        "email": "pquinn@google.com",
        "time": "Mon Dec 09 12:10:44 2019 -0800"
      },
      "message": "Enable deep press by default.\n\nBug: 140582282\nTest: deep press events propagate on a clean F2 device\n\nChange-Id: I4aa94b50d1619e614b8fa9b1d1518335007d0bc9\n"
    },
    {
      "commit": "9b5a821d1e214cac16a7d03b590964375fd2614a",
      "tree": "dd92e4c4b3ef09726e1fa4752a8619e4e840f817",
      "parents": [
        "b51f8a3489baa67dd92f58761b2355398baf97a4"
      ],
      "author": {
        "name": "Siarhei Vishniakou",
        "email": "svv@google.com",
        "time": "Mon Jul 01 14:25:40 2019 -0700"
      },
      "committer": {
        "name": "Siarhei Vishniakou",
        "email": "svv@google.com",
        "time": "Mon Jul 01 14:25:40 2019 -0700"
      },
      "message": "Do not use moved-from object\n\nWe are currently reading a field from a moved-from object.\nRemove this read.\n\nBug: none\nTest: none\nChange-Id: I0d33636f653b7f7ae0b98e4645ee8779bf9da2ea\n"
    },
    {
      "commit": "ff17048c9109c817337251e3afca2cce95891835",
      "tree": "ce60afda1ea09787fb9b48e8f34b6c4ebddc5f9a",
      "parents": [
        "0ea5b103d7133f53743cdf1da2a280f098e013b7"
      ],
      "author": {
        "name": "Siarhei Vishniakou",
        "email": "svv@google.com",
        "time": "Fri Jun 07 07:43:35 2019 -0700"
      },
      "committer": {
        "name": "Siarhei Vishniakou",
        "email": "svv@google.com",
        "time": "Fri Jun 07 07:43:35 2019 -0700"
      },
      "message": "Disable deep press by default\n\nUnless a google3 flag is specified to enable deep press, do not\nautomatically enable this feature on the device.\n\nTest: adb logcat | grep -i \"deep press\"\nTest: dumpsys input\n\nBug: 134702173\nChange-Id: I239ec1d0768d6fca23286c69ee42f19afc34c535\n"
    },
    {
      "commit": "a47a4d4f1032e2e013d1051eb34b966a9a92faae",
      "tree": "2684099223ceafa162115e2b5ec8272bdf86f0d5",
      "parents": [
        "f96a67700e6bfcb3dcac35e93417c0da08aa0240"
      ],
      "author": {
        "name": "Siarhei Vishniakou",
        "email": "svv@google.com",
        "time": "Mon May 06 17:14:11 2019 -0700"
      },
      "committer": {
        "name": "Siarhei Vishniakou",
        "email": "svv@google.com",
        "time": "Tue May 14 13:25:30 2019 -0700"
      },
      "message": "Use bitset api in InputClassifier\n\nWe are currently doing some custom manipulations with bits in\nInputClassifier. But the manipulations are making incorrect assumptions\nabout the behaviour of the bitset apis.\n\nTo maximize consistency, extend the use of bitset apis to\nInputClassifier. This allows the same apis to be used in the HAL in\norder to read the axis values.\n\nBug: 131927078\nTest: atest inputflinger_tests\n\nChange-Id: Icab062c695ca07d5cc404082d3de7b334cbc0e19\n"
    },
    {
      "commit": "4bdbb6ae90238834229ac20184a1c8c7bcb71ce0",
      "tree": "db5e2116eeeac9fbdccd17d18868d580f26e955d",
      "parents": [
        "b18c5aa296c3b88d393ebdeb0f391394ef971127"
      ],
      "author": {
        "name": "Siarhei Vishniakou",
        "email": "svv@google.com",
        "time": "Thu Apr 11 09:42:09 2019 -0700"
      },
      "committer": {
        "name": "Siarhei Vishniakou",
        "email": "svv@google.com",
        "time": "Fri Apr 26 14:58:59 2019 -0500"
      },
      "message": "Initialize MotionClassifier from a separate thread\n\nWe are currently calling getService directly from the thread that calls\nInputManager constructor. That means, the function call directly affects\nthe start-up time of the system.\nBut InputClassifier HAL is not mission-critical, and the system can\nfunction perfectly fine without it. Moreover, we are already allowing\nfor mMotionClassifier to be null in our code.\n\nIn this change, mMotionClassifier will become non-null right away, but\nmay not be initialized when it is first created. The initialization will\nhappen in a separate thread. Once initialized, MotionClassifier may\nbecome null inside InputClassifier if the latter receives a HAL death\ncallback.\n\nTo account for the possibility of the MotionClassifier not being valid\nright away, we are allowing mService variable in the MotionClassifier to\nbe nullable.\n\nThe contract for mService is as follows: mService is null by default. If\nMotionClassifier initializes successfully (may take ~ 100 ms), then\nmService will become non-null. Once non-null, it stays non-null.\nThis allows MotionClassifier\u0027s separate thread to not have to check the\nnullness of mService.\nOther threads, however, must assume that mService can be null. They are\nchecking the value with a lock held.\n\nIf MotionClassifier init fails, it will also call the deathRecipient\u0027s\nserviceDied call, to signal that it is no longer useful. This should\nprompt the owner of MotionClassifier to dispose it.\n\nBug: 130184032\nTest: atest google/perf/boottime/boottime-test\nTest: atest libinput_tests inputflinger_tests\nChange-Id: Id4f9c316ef6725d96abebc55a96079946647eb39\n"
    },
    {
      "commit": "15b66d1475adfa0d31a9aac8c76b124f6f4dfeda",
      "tree": "910035199ae7aae7369c5aa23ab21a7604fc22b2",
      "parents": [
        "3d694145126c794a1d47f4d05164756307a79cf8"
      ],
      "author": {
        "name": "Siarhei Vishniakou",
        "email": "svv@google.com",
        "time": "Mon Feb 04 14:27:29 2019 -0800"
      },
      "committer": {
        "name": "Siarhei Vishniakou",
        "email": "svv@google.com",
        "time": "Fri Mar 08 15:50:38 2019 -0800"
      },
      "message": "Do not crash if InputClassifier HAL crashes\n\nIf InputClassifier HAL crashes for some reason, we don\u0027t have to crash\nthe system. Instead, just check return type and move on. The\nInputClassifier stage is not critical to input dispatch, and the phone\ncan remain perfectly functional without this stage.\nLog an error message instead.\n\nWe are also assuming in InputClassifier that HAL is always present.\n\nThere are 2 lines of defense here:\n1) MotionClassifier always checks the returns from the HAL. If any of\nthe returns are not OK, then MotionClassifier thread exits. This is safe\nto do always, but a downside of this is that logspam will occur if\nevents are not able to be added to the queue (since the thread that is\nto be consuming them is no longer running).\n\n2) Register HAL death recipient in InputClassifier. When the HAL death\noccurs, mMotionClassifier will be set to null, thus\npreventing further events from going into the queue. This will avoid the\nlogspam from 1).\n\nTest: ps -A | grep -i input. Then interact with the phone. Then kill the\nHAL process, \u0027killall\nandroid.hardware.input.classifier@1.0-service-example\u0027. Then make sure\nthat phone remains functional.\nBug: 117935272\n\nChange-Id: I7e8f676d3baa0703198f0731273678c3575bdf60\n"
    },
    {
      "commit": "f2320abad7787cf57830bf6ace932954c107f176",
      "tree": "0a26e6ce25d49828c795f7d5e5a847acfe78bae5",
      "parents": [
        "a028c449a64a98b62a0553418fd817ec1392e6cc"
      ],
      "author": {
        "name": "Siarhei Vishniakou",
        "email": "svv@google.com",
        "time": "Mon Feb 11 12:37:09 2019 -0800"
      },
      "committer": {
        "name": "Siarhei Vishniakou",
        "email": "svv@google.com",
        "time": "Mon Feb 11 12:40:44 2019 -0800"
      },
      "message": "Fix use after free in InputClassifier\n\nDo not send address of a variable outside of the scope of the variable.\n\nTest: presubmit\nBug: 124232816\nChange-Id: I18b4e27ef333f3a8354bdeba89ea2a912106cdaa\n"
    },
    {
      "commit": "a028c449a64a98b62a0553418fd817ec1392e6cc",
      "tree": "f80e7e5da91b7fcd292311f9558c0e8c2746d15d",
      "parents": [
        "3ddb9b47fd96040c5a7240b40177caf6935c4652"
      ],
      "author": {
        "name": "Siarhei Vishniakou",
        "email": "svv@google.com",
        "time": "Mon Feb 04 14:33:23 2019 -0800"
      },
      "committer": {
        "name": "Siarhei Vishniakou",
        "email": "svv@google.com",
        "time": "Fri Feb 08 18:00:43 2019 -0800"
      },
      "message": "Add dump to Input Classifier\n\nCurrently, the InputClassifier stage that is positioned between\nInputReader and InputDispatcher is not accounted for when doing a\n\u0027dumpsys input\u0027. But that stage may contain important information about\nthe operation and the InputClassifier HAL. Add the dump(..) command to\nboth InputClassifier and MotionClassifier.\n\nTest: dumpsys input and inspect the resulting text\nNext, crash the InputClassifier HAL (killall android.hardware.input.classifier@1.0-service\nThen again \u0027dumpsys input\u0027 to check that the HAL status is \u0027not\nresponding\u0027\nBug: 117935272\nChange-Id: Ie7ddca2e355e094f93236a9bc667faad7a99ee70\n"
    },
    {
      "commit": "6dbc3f6c686adbcbb4eff28aec2f2018664e261b",
      "tree": "f808eabe6d109efb093481f5da5e5f4cacf75e77",
      "parents": [
        "4b70146acb7c810721ecf541631d2523224ba465"
      ],
      "author": {
        "name": "Siarhei Vishniakou",
        "email": "svv@google.com",
        "time": "Mon Feb 04 14:30:11 2019 -0800"
      },
      "committer": {
        "name": "Siarhei Vishniakou",
        "email": "svv@google.com",
        "time": "Tue Feb 05 01:23:06 2019 +0000"
      },
      "message": "Reset InputClassifier HAL when system starts\n\nUnder normal operation, the system and the HAL will both start at the\nsame time, and will have initial state. However, since they are in\nseparate, and independent, processes, one can crash while another would\nremain functional. For example, if the system crashes, the HAL may still\nbe operational.\nTo account for these situations, send a complete reset to the HAL when\nthe system loads. This would help ensure that HAL has consistent state\nevery time the system starts.\n\nTest: none\nBug: 117935272\nChange-Id: I90e53fd4205f018c87af8eb8ac16d54fe9a62011\n"
    },
    {
      "commit": "473174ea68fa5703ef162d85fe2805d7d313e41a",
      "tree": "5465308d144960995702d28259c2dd70efbd9189",
      "parents": [
        "57ba2f1942f1fae1bd195b8c0f7fda8adbf9c41e"
      ],
      "author": {
        "name": "Siarhei Vishniakou",
        "email": "svv@google.com",
        "time": "Wed Dec 27 16:44:42 2017 -0800"
      },
      "committer": {
        "name": "Siarhei Vishniakou",
        "email": "svv@google.com",
        "time": "Mon Jan 28 11:55:38 2019 -0800"
      },
      "message": "Add a new InputClassifier stage\n\nThe new InputClassifier stage could be used for additional processing\nof input events prior to sending them to InputDispatcher. The new flow\nof events will be InputReader -\u003e InputClassifier -\u003e InputDispatcher.\n\nHere, we are calling the InputClassifier HAL and setting the MotionEvent\nclassification appropriately.\n\nBug: 62940136\nTest: override notifyMotion to add extra flags to NotifyMotionArgs for\ncertain types of input events.\nTest: atest inputflinger_tests\n\nChange-Id: I2f390dc69f587ea25a3be8e4b8d5a207a5d529bf\n"
    }
  ]
}
