mirror of
https://github.com/Julow/Unexpected-Keyboard.git
synced 2024-11-22 23:33:11 +01:00
0b1befcc88
Remove the use of [getIdentifier] because it requires the current package name to be passed, which can't be found reliably since the change in build system.
189 lines
5.6 KiB
Java
189 lines
5.6 KiB
Java
package juloo.keyboard2;
|
|
|
|
import android.content.res.Configuration;
|
|
import android.content.Intent;
|
|
import android.content.SharedPreferences;
|
|
import android.graphics.Typeface;
|
|
import android.inputmethodservice.InputMethodService;
|
|
import android.os.Bundle;
|
|
import android.text.InputType;
|
|
import android.preference.PreferenceManager;
|
|
import android.view.inputmethod.EditorInfo;
|
|
import android.view.inputmethod.InputMethodManager;
|
|
import android.view.KeyEvent;
|
|
import android.view.View;
|
|
import android.view.ViewGroup;
|
|
import android.util.Log;
|
|
|
|
public class Keyboard2 extends InputMethodService
|
|
implements SharedPreferences.OnSharedPreferenceChangeListener
|
|
{
|
|
private Keyboard2View _keyboardView;
|
|
private KeyboardData _textKeyboard = null;
|
|
private KeyboardData _numericKeyboard = null;
|
|
private ViewGroup _emojiPane = null;
|
|
private Typeface _specialKeyFont = null;
|
|
|
|
private Config _config;
|
|
|
|
@Override
|
|
public void onCreate()
|
|
{
|
|
super.onCreate();
|
|
_specialKeyFont = Typeface.createFromAsset(getAssets(), "fonts/keys.ttf");
|
|
PreferenceManager.setDefaultValues(this, R.xml.settings, false);
|
|
PreferenceManager.getDefaultSharedPreferences(this).registerOnSharedPreferenceChangeListener(this);
|
|
_config = new Config(this);
|
|
updateConfig();
|
|
_keyboardView = (Keyboard2View)getLayoutInflater().inflate(R.layout.keyboard, null);
|
|
_keyboardView.reset();
|
|
}
|
|
|
|
public Config getConfig()
|
|
{
|
|
return (_config);
|
|
}
|
|
|
|
public Typeface getSpecialKeyFont()
|
|
{
|
|
return (_specialKeyFont);
|
|
}
|
|
|
|
@Override
|
|
public View onCreateInputView()
|
|
{
|
|
ViewGroup parent = (ViewGroup)_keyboardView.getParent();
|
|
|
|
if (parent != null)
|
|
parent.removeView(_keyboardView);
|
|
return (_keyboardView);
|
|
}
|
|
|
|
@Override
|
|
public void onStartInputView(EditorInfo info, boolean restarting)
|
|
{
|
|
if ((info.inputType & InputType.TYPE_CLASS_NUMBER) != 0)
|
|
_keyboardView.setKeyboard(_numericKeyboard);
|
|
else
|
|
_keyboardView.setKeyboard(_textKeyboard);
|
|
}
|
|
|
|
@Override
|
|
public void onSharedPreferenceChanged(SharedPreferences sharedPreferences, String key)
|
|
{
|
|
_config.refresh();
|
|
updateConfig();
|
|
_keyboardView.reset();
|
|
}
|
|
|
|
@Override
|
|
public void onConfigurationChanged(Configuration newConfig)
|
|
{
|
|
_keyboardView.reset();
|
|
}
|
|
|
|
private int _getKeyboardLayoutRes(SharedPreferences prefs)
|
|
{
|
|
// Not looking up using [getIdentifier] as it was intended because the
|
|
// [packageName] argument can't be passed reliably (eg. debug builds)
|
|
switch (prefs.getString("keyboard_layout", null))
|
|
{
|
|
case "azerty":
|
|
return R.xml.azerty;
|
|
default:
|
|
case "qwerty":
|
|
return R.xml.qwerty;
|
|
}
|
|
}
|
|
|
|
/*
|
|
** TODO: move this to Config object
|
|
*/
|
|
private void updateConfig()
|
|
{
|
|
SharedPreferences prefs = PreferenceManager.getDefaultSharedPreferences(this);
|
|
|
|
_textKeyboard = new KeyboardData(getResources().getXml(_getKeyboardLayoutRes(prefs)));
|
|
if (_config.disableAccentKeys)
|
|
_textKeyboard.removeKeysByFlag(KeyValue.FLAGS_ACCENTS);
|
|
_numericKeyboard = new KeyboardData(getResources().getXml(R.xml.numeric));
|
|
_emojiPane = null;
|
|
}
|
|
|
|
public void handleKeyUp(KeyValue key, int flags)
|
|
{
|
|
int eventCode = key.getEventCode();
|
|
char keyChar = key.getChar(flags);
|
|
|
|
if (getCurrentInputConnection() == null)
|
|
return ;
|
|
if (eventCode == KeyValue.EVENT_CONFIG)
|
|
{
|
|
Intent intent = new Intent(this, SettingsActivity.class);
|
|
intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
|
|
startActivity(intent);
|
|
}
|
|
else if (eventCode == KeyValue.EVENT_SWITCH_TEXT)
|
|
_keyboardView.setKeyboard(_textKeyboard);
|
|
else if (eventCode == KeyValue.EVENT_SWITCH_NUMERIC)
|
|
_keyboardView.setKeyboard(_numericKeyboard);
|
|
else if (eventCode == KeyValue.EVENT_SWITCH_EMOJI)
|
|
{
|
|
if (_emojiPane == null)
|
|
_emojiPane = (ViewGroup)getLayoutInflater().inflate(R.layout.emoji_pane, null);
|
|
setInputView(_emojiPane);
|
|
}
|
|
else if (eventCode == KeyValue.EVENT_SWITCH_BACK_EMOJI)
|
|
setInputView(_keyboardView);
|
|
else if (eventCode == KeyValue.EVENT_CHANGE_METHOD)
|
|
{
|
|
InputMethodManager imm = (InputMethodManager)getSystemService(INPUT_METHOD_SERVICE);
|
|
|
|
imm.switchToNextInputMethod(getWindow().getWindow().getAttributes().token, false);
|
|
}
|
|
else if ((flags & (KeyValue.FLAG_CTRL | KeyValue.FLAG_ALT)) != 0)
|
|
handleMetaKeyUp(key, flags);
|
|
// else if (eventCode == KeyEvent.KEYCODE_DEL)
|
|
// handleDelKey(1, 0);
|
|
// else if (eventCode == KeyEvent.KEYCODE_FORWARD_DEL)
|
|
// handleDelKey(0, 1);
|
|
else if (keyChar == KeyValue.CHAR_NONE)
|
|
{
|
|
if (eventCode != KeyValue.EVENT_NONE)
|
|
handleMetaKeyUp(key, flags);
|
|
else
|
|
getCurrentInputConnection().commitText(key.getSymbol(flags), 1);
|
|
}
|
|
else
|
|
sendKeyChar(keyChar);
|
|
}
|
|
|
|
// private void handleDelKey(int before, int after)
|
|
// {
|
|
// CharSequence selection = getCurrentInputConnection().getSelectedText(0);
|
|
|
|
// if (selection != null && selection.length() > 0)
|
|
// getCurrentInputConnection().commitText("", 1);
|
|
// else
|
|
// getCurrentInputConnection().deleteSurroundingText(before, after);
|
|
// }
|
|
|
|
private void handleMetaKeyUp(KeyValue key, int flags)
|
|
{
|
|
int metaState = 0;
|
|
KeyEvent event;
|
|
|
|
if (key.getEventCode() == KeyValue.EVENT_NONE)
|
|
return ;
|
|
if ((flags & KeyValue.FLAG_CTRL) != 0)
|
|
metaState |= KeyEvent.META_CTRL_LEFT_ON | KeyEvent.META_CTRL_ON;
|
|
if ((flags & KeyValue.FLAG_ALT) != 0)
|
|
metaState |= KeyEvent.META_ALT_LEFT_ON | KeyEvent.META_ALT_ON;
|
|
if ((flags & KeyValue.FLAG_SHIFT) != 0)
|
|
metaState |= KeyEvent.META_SHIFT_LEFT_ON | KeyEvent.META_SHIFT_ON;
|
|
event = new KeyEvent(1, 1, KeyEvent.ACTION_DOWN, key.getEventCode(), 1, metaState);
|
|
getCurrentInputConnection().sendKeyEvent(event);
|
|
getCurrentInputConnection().sendKeyEvent(KeyEvent.changeAction(event, KeyEvent.ACTION_UP));
|
|
}
|
|
}
|