diff options
| author | Jules Aguillon | 2023-07-29 18:31:26 +0200 |
|---|---|---|
| committer | Jules Aguillon | 2023-07-29 18:42:36 +0200 |
| commit | 0856fb4e31a98b7f14f50006d95c89e23c19503d (patch) | |
| tree | 1c81fcb97af653d3c3214bd22e11f133d01312f6 /srcs | |
| parent | 0a114bd2bc0fabf204190457d671f2a719acf6e9 (diff) | |
| download | unexpected-keyboard-0856fb4e31a98b7f14f50006d95c89e23c19503d.tar.gz unexpected-keyboard-0856fb4e31a98b7f14f50006d95c89e23c19503d.zip | |
Refactor: Split out ListGroupPreference
Split out the implementation of a string-list preference from
CustomExtraKeysPreference.
Allows to share the implementation with future preferences.
Diffstat (limited to 'srcs')
| -rw-r--r-- | srcs/juloo.keyboard2/CustomExtraKeysPreference.java | 162 | ||||
| -rw-r--r-- | srcs/juloo.keyboard2/ListGroupPreference.java | 193 | ||||
| -rw-r--r-- | srcs/juloo.keyboard2/Logs.java | 5 |
3 files changed, 216 insertions, 144 deletions
diff --git a/srcs/juloo.keyboard2/CustomExtraKeysPreference.java b/srcs/juloo.keyboard2/CustomExtraKeysPreference.java index 668e6f1..7bbc449 100644 --- a/srcs/juloo.keyboard2/CustomExtraKeysPreference.java +++ b/srcs/juloo.keyboard2/CustomExtraKeysPreference.java @@ -17,161 +17,45 @@ import org.json.JSONException; /** Allows to enter custom keys to be added to the keyboard. This shows up at the top of the "Add keys to the keyboard" option. */ -public class CustomExtraKeysPreference extends PreferenceCategory +public class CustomExtraKeysPreference extends ListGroupPreference { /** This pref stores a list of strings encoded as JSON. */ - static String KEY = "custom_extra_keys"; - - boolean _attached = false; - /** Mutable. This is the list of the key strings, not the key names. */ - List<String> _keys; + static final String KEY = "custom_extra_keys"; public CustomExtraKeysPreference(Context context, AttributeSet attrs) { super(context, attrs); setKey(KEY); - setOrderingAsAdded(true); - _keys = new ArrayList<String>(); } public static List<KeyValue> get(SharedPreferences prefs) { List<KeyValue> kvs = new ArrayList<KeyValue>(); - String inp = prefs.getString(KEY, null); - if (inp != null) - for (String key_name : load_from_string(inp)) - kvs.add(KeyValue.makeStringKey(key_name)); - return kvs; - } - - @Override - protected void onSetInitialValue(boolean restoreValue, Object defaultValue) - { - if (restoreValue) + List<String> key_names = load_from_preferences(KEY, prefs, null); + if (key_names != null) { - String persisted = getPersistedString(null); - if (persisted != null) - set_keys(load_from_string(persisted), false); + for (String key_name : key_names) + kvs.add(KeyValue.makeStringKey(key_name)); } - else if (defaultValue != null) - set_keys(load_from_string((String)defaultValue), false); + return kvs; } @Override - protected void onAttachedToActivity() - { - super.onAttachedToActivity(); - if (_attached) - return; - _attached = true; - reattach(); - } - - void reattach() - { - removeAll(); - for (String k : _keys) - addPreference(this.new CustomExtraKey(getContext(), k)); - addPreference(this.new AddButton(getContext())); - } - - void set_keys(List<String> v, boolean persist) - { - _keys = v; - reattach(); - if (persist) - persistString(save_to_string(_keys)); - } - - void add_key(String k) - { - _keys.add(k); - set_keys(_keys, true); - } - - void remove_key(String k) - { - _keys.remove(k); - set_keys(_keys, true); - } - - static String save_to_string(List<String> keys) - { - return (new JSONArray(keys)).toString(); - } - - static List<String> load_from_string(String inp) - { - List<String> keys = new ArrayList<String>(); - try - { - JSONArray arr = new JSONArray(inp); - for (int i = 0; i < arr.length(); i++) - keys.add(arr.getString(i)); - } - catch (JSONException e) - { - Logs.err_load_custom_extra_keys(e); - } - return keys; - } - - /** A preference with no key that is only intended to be rendered. */ - final class CustomExtraKey extends Preference implements View.OnClickListener - { - String _key; - - public CustomExtraKey(Context ctx, String key) - { - super(ctx); - _key = key; - setTitle(key); - setPersistent(false); - setWidgetLayoutResource(R.layout.custom_extra_key_widget); - } - - /** Remove-button listener. */ - @Override - public void onClick(View _v) - { - CustomExtraKeysPreference.this.remove_key(_key); - } - - @Override - protected View onCreateView(ViewGroup parent) - { - View v = super.onCreateView(parent); - v.findViewById(R.id.btn_custom_extra_key_remove).setOnClickListener(this); - return v; - } - } - - final class AddButton extends Preference - { - public AddButton(Context ctx) - { - super(ctx); - setPersistent(false); - setLayoutResource(R.layout.custom_extra_key_add); - } - - @Override - protected void onClick() - { - new AlertDialog.Builder(getContext()) - .setView(R.layout.custom_extra_key_add_dialog) - .setPositiveButton(android.R.string.ok, new DialogInterface.OnClickListener(){ - public void onClick(DialogInterface dialog, int which) - { - EditText input = (EditText)((AlertDialog)dialog).findViewById(R.id.key_name); - String k = input.getText().toString(); - if (!k.equals("")) - CustomExtraKeysPreference.this.add_key(k); - } - }) - .setNegativeButton(android.R.string.cancel, null) - .setIcon(android.R.drawable.ic_dialog_alert) - .show(); - } + void select(final SelectionCallback callback) + { + new AlertDialog.Builder(getContext()) + .setView(R.layout.custom_extra_key_add_dialog) + .setPositiveButton(android.R.string.ok, new DialogInterface.OnClickListener(){ + public void onClick(DialogInterface dialog, int which) + { + EditText input = (EditText)((AlertDialog)dialog).findViewById(R.id.key_name); + final String k = input.getText().toString(); + if (!k.equals("")) + callback.select(k); + } + }) + .setNegativeButton(android.R.string.cancel, null) + .setIcon(android.R.drawable.ic_dialog_alert) + .show(); } } 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<String> _values; + + public ListGroupPreference(Context context, AttributeSet attrs) + { + super(context, attrs); + setOrderingAsAdded(true); + setLayoutResource(R.layout.pref_listgroup_group); + _values = new ArrayList<String>(); + } + + /** 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<String> load_from_preferences(String key, + SharedPreferences prefs, List<String> 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<String> load_from_string(String inp) + { + try + { + List<String> l = new ArrayList<String>(); + 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<String> l) + { + return (new JSONArray(l)).toString(); + } + + /** Protected API */ + + /** Set the values. If [persist] is [true], persist into the store. */ + void set_values(List<String> 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<String> 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); + } +} diff --git a/srcs/juloo.keyboard2/Logs.java b/srcs/juloo.keyboard2/Logs.java index ee44e21..c214296 100644 --- a/srcs/juloo.keyboard2/Logs.java +++ b/srcs/juloo.keyboard2/Logs.java @@ -26,9 +26,4 @@ public final class Logs _debug_logs.println("swapEnterActionKey: "+conf.swapEnterActionKey); _debug_logs.println("actionLabel: "+conf.actionLabel); } - - public static void err_load_custom_extra_keys(JSONException e) - { - Log.e(TAG, "Failed to read custom extra keys from preferences", e); - } } |
