diff options
Diffstat (limited to 'srcs/juloo.keyboard2/CustomExtraKeysPreference.java')
| -rw-r--r-- | srcs/juloo.keyboard2/CustomExtraKeysPreference.java | 174 |
1 files changed, 174 insertions, 0 deletions
diff --git a/srcs/juloo.keyboard2/CustomExtraKeysPreference.java b/srcs/juloo.keyboard2/CustomExtraKeysPreference.java new file mode 100644 index 0000000..228eae8 --- /dev/null +++ b/srcs/juloo.keyboard2/CustomExtraKeysPreference.java @@ -0,0 +1,174 @@ +package juloo.keyboard2; + +import android.app.AlertDialog; +import android.content.Context; +import android.content.DialogInterface; +import android.content.SharedPreferences; +import android.preference.Preference; +import android.preference.PreferenceCategory; +import android.util.AttributeSet; +import android.view.View; +import android.view.ViewGroup; +import android.widget.EditText; +import java.util.ArrayList; +import java.util.List; +import org.json.JSONArray; +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 +{ + /** 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; + + 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) + { + String persisted = getPersistedString(null); + if (persisted != null) + set_keys(load_from_string(persisted), false); + } + else if (defaultValue != null) + set_keys(load_from_string((String)defaultValue), false); + } + + @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) {} + 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(); + } + } +} |
