From 0856fb4e31a98b7f14f50006d95c89e23c19503d Mon Sep 17 00:00:00 2001 From: Jules Aguillon Date: Sat, 29 Jul 2023 18:31:26 +0200 Subject: Refactor: Split out ListGroupPreference Split out the implementation of a string-list preference from CustomExtraKeysPreference. Allows to share the implementation with future preferences. --- srcs/juloo.keyboard2/ListGroupPreference.java | 193 ++++++++++++++++++++++++++ 1 file changed, 193 insertions(+) create mode 100644 srcs/juloo.keyboard2/ListGroupPreference.java (limited to 'srcs/juloo.keyboard2/ListGroupPreference.java') diff --git a/srcs/juloo.keyboard2/ListGroupPreference.java b/srcs/juloo.keyboard2/ListGroupPreference.java new file mode 100644 index 0000000..b7f2259 --- /dev/null +++ b/srcs/juloo.keyboard2/ListGroupPreference.java @@ -0,0 +1,193 @@ +package juloo.keyboard2; + +import android.content.Context; +import android.content.SharedPreferences; +import android.preference.Preference; +import android.preference.PreferenceGroup; +import android.util.AttributeSet; +import android.view.View; +import android.view.ViewGroup; +import java.util.ArrayList; +import java.util.List; +import org.json.JSONArray; +import org.json.JSONException; + +/** A list of preferences where the users can add items to the end and modify + and remove items. Backed by a string list. Implement user selection in + [select()]. */ +public abstract class ListGroupPreference extends PreferenceGroup +{ + boolean _attached = false; + List _values; + + public ListGroupPreference(Context context, AttributeSet attrs) + { + super(context, attrs); + setOrderingAsAdded(true); + setLayoutResource(R.layout.pref_listgroup_group); + _values = new ArrayList(); + } + + /** Overrideable */ + + /** The label to display on the item for a given value. */ + String label_of_value(String value, int i) + { + return value; + } + + /** Called when an item is added or modified. Returns [null] to cancel the + action. */ + abstract void select(SelectionCallback callback); + + /** Load/save utils */ + + /** Read a value saved by preference from a [SharedPreferences] object. + Returns [null] on error. */ + static List load_from_preferences(String key, + SharedPreferences prefs, List def) + { + String s = prefs.getString(key, null); + return (s != null) ? load_from_string(s) : def; + } + + /** Decode a list of string previously encoded with [save_to_string]. Returns + [null] on error. */ + static List load_from_string(String inp) + { + try + { + List l = new ArrayList(); + JSONArray arr = new JSONArray(inp); + for (int i = 0; i < arr.length(); i++) + l.add(arr.getString(i)); + return l; + } + catch (JSONException e) + { + return null; + } + } + + /** Encode a list of string so it can be passed to + [Preference.persistString()]. Decode with [load_from_string]. */ + static String save_to_string(List l) + { + return (new JSONArray(l)).toString(); + } + + /** Protected API */ + + /** Set the values. If [persist] is [true], persist into the store. */ + void set_values(List vs, boolean persist) + { + _values = vs; + reattach(); + if (persist) + persistString(save_to_string(vs)); + } + + void add_item(String v) + { + _values.add(v); + set_values(_values, true); + } + + void remove_item(String v) + { + _values.remove(v); + set_values(_values, true); + } + + /** Internal */ + + @Override + protected void onSetInitialValue(boolean restoreValue, Object defaultValue) + { + String input = (restoreValue) ? getPersistedString(null) : (String)defaultValue; + if (input != null) + { + List values = load_from_string(input); + if (values != null) + set_values(values, false); + } + } + + @Override + protected void onAttachedToActivity() + { + super.onAttachedToActivity(); + if (_attached) + return; + _attached = true; + reattach(); + } + + void reattach() + { + removeAll(); + int i = 0; + for (String v : _values) + { + Item item = this.new Item(getContext(), v); + item.setTitle(label_of_value(v, i)); + addPreference(item); + i++; + } + addPreference(this.new AddButton(getContext())); + } + + class Item extends Preference + { + final String _value; + + public Item(Context ctx, String value) + { + super(ctx); + _value = value; + setPersistent(false); + setWidgetLayoutResource(R.layout.pref_listgroup_item_widget); + } + + @Override + protected View onCreateView(ViewGroup parent) + { + View v = super.onCreateView(parent); + v.findViewById(R.id.pref_listgroup_remove_btn) + .setOnClickListener(new View.OnClickListener() { + @Override + public void onClick(View _v) + { + remove_item(_value); + } + }); + return v; + } + } + + final class AddButton extends Preference + { + public AddButton(Context ctx) + { + super(ctx); + setPersistent(false); + setLayoutResource(R.layout.pref_listgroup_add_btn); + } + + @Override + protected void onClick() + { + select(new SelectionCallback() { + public void select(String value) + { + add_item(value); + } + }); + } + } + + public interface SelectionCallback + { + public void select(String value); + } +} -- cgit v1.2.3