package mil.nga.giat.mage.map.preference; import android.content.Context; import android.content.SharedPreferences; import android.os.Parcel; import android.os.Parcelable; import android.support.v7.preference.Preference; import android.util.AttributeSet; import java.util.ArrayList; import java.util.HashSet; import java.util.List; import java.util.Set; public class OverlayPreference extends Preference { private Set<String> overlays = new HashSet<>(); public OverlayPreference(Context context) { super(context); } public OverlayPreference(Context context, AttributeSet attrs) { super(context, attrs); } /** * Sets the value of the key. * * @param values * The values to set for the key. */ public void setValues(Set<String> values) { overlays.clear(); overlays.addAll(values); persistStringSet(values); } /** * Retrieves the current value of the key. */ public Set<String> getValues() { return overlays; } @Override protected void onSetInitialValue(boolean restoreValue, Object defaultValue) { setValues(restoreValue ? getPersistedStringSet(overlays) : (Set<String>) defaultValue); } private Set<String> getPersistedStringSet(Set<String> defaultReturnValue) { if (!shouldPersist()) { return defaultReturnValue; } return getPreferenceManager().getSharedPreferences().getStringSet(getKey(), defaultReturnValue); } private boolean persistStringSet(Set<String> values) { if (shouldPersist()) { // Shouldn't store null if (values.equals(getPersistedStringSet(null))) { // It's already there, so the same as persisting return true; } SharedPreferences.Editor editor = getPreferenceManager().getSharedPreferences().edit(); editor.putStringSet(getKey(), values); editor.apply(); return true; } return false; } @Override protected Parcelable onSaveInstanceState() { final Parcelable superState = super.onSaveInstanceState(); if (isPersistent()) { // No need to save instance state return superState; } final SavedState myState = new SavedState(superState); myState.values = getValues(); return myState; } private static class SavedState extends BaseSavedState { Set<String> values; SavedState(Parcel source) { super(source); values = new HashSet<>(); int length = source.readInt(); if (length >= 0) { List<String> strings = new ArrayList<String>(length); for (int i = 0 ; i < length ; i++) { strings.add(source.readString()); } values.addAll(strings); } } SavedState(Parcelable superState) { super(superState); } @Override public void writeToParcel(Parcel dest, int flags) { super.writeToParcel(dest, flags); dest.writeStringArray(values.toArray(new String[values.size()])); } public static final Parcelable.Creator<SavedState> CREATOR = new Parcelable.Creator<SavedState>() { public SavedState createFromParcel(Parcel in) { return new SavedState(in); } public SavedState[] newArray(int size) { return new SavedState[size]; } }; } }