Skip to content

Commit

Permalink
Refactor: Split out ListGroupPreference
Browse files Browse the repository at this point in the history
Split out the implementation of a string-list preference from
CustomExtraKeysPreference.

Allows to share the implementation with future preferences.
  • Loading branch information
Julow committed Jul 29, 2023
1 parent 0a114bd commit 0856fb4
Show file tree
Hide file tree
Showing 8 changed files with 226 additions and 149 deletions.
4 changes: 0 additions & 4 deletions res/layout/custom_extra_key_widget.xml

This file was deleted.

File renamed without changes.
3 changes: 3 additions & 0 deletions res/layout/pref_listgroup_group.xml
Original file line number Diff line number Diff line change
@@ -0,0 +1,3 @@
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="fill_parent" android:layout_height="wrap_content" android:gravity="center">
</LinearLayout>
4 changes: 4 additions & 0 deletions res/layout/pref_listgroup_item_widget.xml
Original file line number Diff line number Diff line change
@@ -0,0 +1,4 @@
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="fill_parent" android:layout_height="fill_parent" android:orientation="horizontal">
<Button android:id="@+id/pref_listgroup_remove_btn" android:layout_width="@dimen/pref_button_size" android:layout_height="@dimen/pref_button_size" android:layout_gravity="center" android:background="@android:drawable/ic_menu_close_clear_cancel"/>
</LinearLayout>
4 changes: 3 additions & 1 deletion res/xml/settings.xml
Original file line number Diff line number Diff line change
Expand Up @@ -7,7 +7,9 @@
<ListPreference android:key="show_numpad" android:title="@string/pref_show_numpad_title" android:summary="%s" android:defaultValue="1" android:entries="@array/pref_show_numpad_entries" android:entryValues="@array/pref_show_numpad_values"/>
<CheckBoxPreference android:key="number_row" android:title="@string/pref_number_row_title" android:summary="@string/pref_number_row_summary" android:defaultValue="false"/>
<PreferenceScreen android:title="@string/pref_extra_keys_title">
<juloo.keyboard2.CustomExtraKeysPreference android:title="@string/pref_extra_keys_custom"/>
<PreferenceCategory android:title="@string/pref_extra_keys_custom">
<juloo.keyboard2.CustomExtraKeysPreference/>
</PreferenceCategory>
<juloo.keyboard2.ExtraKeysPreference android:title="@string/pref_extra_keys_internal"/>
</PreferenceScreen>
<ListPreference android:key="numpad_layout" android:title="@string/pref_numpad_layout" android:summary="%s" android:defaultValue="high_first" android:entries="@array/pref_numpad_layout_entries" android:entryValues="@array/pref_numpad_layout_values"/>
Expand Down
162 changes: 23 additions & 139 deletions srcs/juloo.keyboard2/CustomExtraKeysPreference.java
Original file line number Diff line number Diff line change
Expand Up @@ -17,161 +17,45 @@

/** 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();
}
}
Loading

0 comments on commit 0856fb4

Please sign in to comment.