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 _keys; public CustomExtraKeysPreference(Context context, AttributeSet attrs) { super(context, attrs); setKey(KEY); setOrderingAsAdded(true); _keys = new ArrayList(); } public static List get(SharedPreferences prefs) { List kvs = new ArrayList(); 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 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 keys) { return (new JSONArray(keys)).toString(); } static List load_from_string(String inp) { List keys = new ArrayList(); 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(); } } }