add OnStateChangeListener + expose currentState