package com.stardust.util; import android.content.SharedPreferences; import android.support.v7.widget.SwitchCompat; import java.lang.ref.WeakReference; import java.util.HashMap; import java.util.List; import java.util.Map; import java.util.concurrent.CopyOnWriteArrayList; /** * Created by Stardust on 2017/2/3. */ public class StateObserver { public interface OnStateChangedListener { void onStateChanged(boolean newState); void initState(boolean state); } public static abstract class SimpleOnStateChangedListener<T> implements OnStateChangedListener { @Override public void initState(boolean state) { onStateChanged(state); } } private final Map<String, List<OnStateChangedListener>> mKeyStateListenersMap = new HashMap<>(); private SharedPreferences mSharedPreferences; public StateObserver(SharedPreferences sharedPreferences) { mSharedPreferences = sharedPreferences; } public void register(final String key, SwitchCompat switchCompat) { final WeakReference<SwitchCompat> switchCompatWeakReference = new WeakReference<>(switchCompat); register(key, new SimpleOnStateChangedListener() { @Override public void onStateChanged(boolean newState) { if (switchCompatWeakReference.get() != null) { switchCompatWeakReference.get().setChecked(newState); } else { unregister(key, this); } } }); } public void register(String key, OnStateChangedListener listener) { initState(key, listener); synchronized (mKeyStateListenersMap) { List<OnStateChangedListener> listeners = getListenerListOrCreateIfNotExists(key); listeners.add(listener); } } private void unregister(String key, OnStateChangedListener stateChangedListener) { synchronized (mKeyStateListenersMap) { List<OnStateChangedListener> listeners = mKeyStateListenersMap.get(key); if (listeners == null) { return; } listeners.remove(stateChangedListener); } } public void setState(String key, boolean state) { synchronized (mKeyStateListenersMap) { List<OnStateChangedListener> listeners = mKeyStateListenersMap.get(key); if (listeners == null || listeners.isEmpty()) return; mSharedPreferences.edit().putBoolean(key, state).apply(); notifyBooleanStateChanged(listeners, state); } } private void notifyBooleanStateChanged(List<OnStateChangedListener> listeners, boolean state) { for (OnStateChangedListener listener : listeners) { listener.onStateChanged(state); } } private void initState(String key, OnStateChangedListener listener) { if (mSharedPreferences.contains(key)) { listener.initState(mSharedPreferences.getBoolean(key, false)); } } private List<OnStateChangedListener> getListenerListOrCreateIfNotExists(String key) { List<OnStateChangedListener> listeners = mKeyStateListenersMap.get(key); if (listeners == null) { listeners = new CopyOnWriteArrayList<>(); mKeyStateListenersMap.put(key, listeners); } return listeners; } }