I wonder there's too many avoidable HardwareButtonXXXXState instantiation.

We could do this: Let HardwareButtonManager to instantiate the state and let the state to send an event to let manager to update them (setState).