preference change listener