add preference change listener