Unexpected-Keyboard/srcs/juloo.keyboard2/ExtraKeysPreference.java
Jules Aguillon 66b1bdc9c9 Refactor: Preferred positions for extra keys
The new PreferredPos class represents where an extra key should be
placed
Currently used to place keys at the same positions they were placed
before.
2023-09-15 18:00:27 +02:00

169 lines
4.6 KiB
Java

package juloo.keyboard2;
import android.content.Context;
import android.content.SharedPreferences;
import android.content.res.Resources;
import android.preference.CheckBoxPreference;
import android.preference.PreferenceCategory;
import android.util.AttributeSet;
import android.view.View;
import android.widget.TextView;
import java.util.HashMap;
import java.util.Map;
import java.util.Set;
/** This class implements the "extra keys" preference but also defines the
possible extra keys. */
public class ExtraKeysPreference extends PreferenceCategory
{
/** Array of the keys that can be selected. */
public static String[] extra_keys = new String[]
{
"alt",
"meta",
"voice_typing",
"accent_aigu",
"accent_grave",
"accent_double_aigu",
"accent_dot_above",
"accent_circonflexe",
"accent_tilde",
"accent_cedille",
"accent_trema",
"accent_ring",
"accent_caron",
"accent_macron",
"accent_ogonek",
"accent_breve",
"accent_slash",
"accent_bar",
"accent_dot_below",
"accent_hook_above",
"accent_horn",
"",
"ß",
"£",
"§",
"",
"ª",
"º",
"switch_greekmath",
"capslock",
"copy",
"paste",
"cut",
"selectAll",
"shareText",
"pasteAsPlainText",
"undo",
"redo",
"superscript",
"subscript",
};
/** Whether an extra key is enabled by default. */
public static boolean default_checked(String name)
{
switch (name)
{
case "voice_typing":
return true;
default:
return false;
}
}
/** Text that describe a key. Might be null. */
static String key_description(Resources res, String name)
{
int id = 0;
switch (name)
{
case "capslock": id = R.string.key_descr_capslock; break;
case "switch_greekmath": id = R.string.key_descr_switch_greekmath; break;
case "voice_typing": id = R.string.key_descr_voice_typing; break;
case "copy": id = R.string.key_descr_copy; break;
case "paste": id = R.string.key_descr_paste; break;
case "cut": id = R.string.key_descr_cut; break;
case "selectAll": id = R.string.key_descr_selectAll; break;
case "shareText": id = R.string.key_descr_shareText; break;
case "pasteAsPlainText": id = R.string.key_descr_pasteAsPlainText; break;
case "undo": id = R.string.key_descr_undo; break;
case "redo": id = R.string.key_descr_redo; break;
case "ª": id = R.string.key_descr_ª; break;
case "º": id = R.string.key_descr_º; break;
case "superscript": id = R.string.key_descr_superscript; break;
case "subscript": id = R.string.key_descr_subscript; break;
}
if (id == 0)
return null;
return res.getString(id);
}
/** Get the set of enabled extra keys. */
public static Map<KeyValue, KeyboardData.PreferredPos> get_extra_keys(SharedPreferences prefs)
{
Map<KeyValue, KeyboardData.PreferredPos> ks =
new HashMap<KeyValue, KeyboardData.PreferredPos>();
for (String key_name : extra_keys)
{
if (prefs.getBoolean(pref_key_of_key_name(key_name),
default_checked(key_name)))
ks.put(KeyValue.getKeyByName(key_name), KeyboardData.PreferredPos.DEFAULT);
}
return ks;
}
boolean _attached = false; /** Whether it has already been attached. */
public ExtraKeysPreference(Context context, AttributeSet attrs)
{
super(context, attrs);
setOrderingAsAdded(true);
}
@Override
protected void onAttachedToActivity()
{
if (_attached)
return;
_attached = true;
for (String key_name : extra_keys)
addPreference(new ExtraKeyCheckBoxPreference(getContext(), key_name,
default_checked(key_name)));
}
public static String pref_key_of_key_name(String key_name)
{
return "extra_key_" + key_name;
}
static class ExtraKeyCheckBoxPreference extends CheckBoxPreference
{
boolean _key_font;
public ExtraKeyCheckBoxPreference(Context ctx, String key_name,
boolean default_checked)
{
super(ctx);
KeyValue kv = KeyValue.getKeyByName(key_name);
String title = kv.getString();
String descr = key_description(ctx.getResources(), key_name);
if (descr != null)
title += " (" + descr + ")";
setKey(pref_key_of_key_name(key_name));
setDefaultValue(default_checked);
setTitle(title);
_key_font = kv.hasFlags(KeyValue.FLAG_KEY_FONT);
}
@Override
protected void onBindView(View view)
{
super.onBindView(view);
TextView title = (TextView)view.findViewById(android.R.id.title);
title.setTypeface(_key_font ? Theme.getKeyFont(getContext()) : null);
}
}
}