...
(which I believe also requires an onActivate event on the brick for it to even be called)
...
and some sort of vector that I'm not sure what it means
Did a bit of testing, and with freshly placed, event-free blocks, onActivate was indeed called, and the last argument appeared to the the player's eye vector at the time.
After a few more quick tests, it appears that onActivate is called every time (though I may be missing an obscure corner case or two. Unlikely.), but ProcessInputEvent is only called if the block has at least one input event, which does the actual work of checking any quotas and if there even is a matching event on the block.
So, from my limited empirical evidence, onActivate is reliable regardless of what events the brick actually has.