1
0
Fork 0
mirror of https://github.com/geometer/FBReaderJ.git synced 2025-10-04 18:29:23 +02:00

key codes instead of key names

This commit is contained in:
Nikolay Pultsin 2011-07-21 23:04:00 +01:00
parent 6cf327a064
commit 06db42f28c
6 changed files with 68 additions and 255 deletions

View file

@ -1,8 +1,8 @@
<?xml version="1.0" encoding="UTF-8"?>
<keymap>
<binding key="&lt;VolumeDown&gt;" action="volumeKeyScrollForward"/>
<binding key="&lt;VolumeUp&gt;" action="volumeKeyScrollBackward"/>
<binding key="&lt;Back&gt;" action="cancelMenu"/>
<binding key="&lt;Enter&gt;" action="processHyperlink"/>
<binding key="&lt;PadCenter&gt;" action="processHyperlink"/>
<binding key="4" action="cancelMenu"/>
<binding key="23" action="processHyperlink"/>
<binding key="24" action="volumeKeyScrollBackward"/>
<binding key="25" action="volumeKeyScrollForward"/>
<binding key="66" action="processHyperlink"/>
</keymap>

View file

@ -20,6 +20,7 @@
package org.geometerplus.android.fbreader.preferences;
import android.content.Intent;
import android.view.KeyEvent;
import org.geometerplus.zlibrary.core.application.ZLKeyBindings;
import org.geometerplus.zlibrary.core.options.ZLIntegerOption;
@ -407,14 +408,14 @@ public class PreferenceActivity extends ZLPreferenceActivity {
{ ActionCode.EXIT, ActionCode.SHOW_CANCEL_MENU };
cancelMenuScreen.addPreference(new ZLStringChoicePreference(
this, cancelMenuScreen.Resource, "backKeyAction",
bindings.getOption("<Back>", false), backKeyActions
bindings.getOption(KeyEvent.KEYCODE_BACK, false), backKeyActions
));
final String[] backKeyLongPressActions =
//{ ActionCode.EXIT, ActionCode.GO_BACK, ActionCode.SHOW_CANCEL_MENU, FBReaderApp.NoAction };
{ ActionCode.EXIT, ActionCode.SHOW_CANCEL_MENU, FBReaderApp.NoAction };
cancelMenuScreen.addPreference(new ZLStringChoicePreference(
this, cancelMenuScreen.Resource, "backKeyLongPressAction",
bindings.getOption("<Back>", true), backKeyLongPressActions
bindings.getOption(KeyEvent.KEYCODE_BACK, true), backKeyLongPressActions
));
}
}

View file

@ -146,12 +146,12 @@ public abstract class ZLApplication {
//may be protected
abstract public ZLKeyBindings keyBindings();
public final boolean hasActionForKey(String key, boolean longPress) {
public final boolean hasActionForKey(int key, boolean longPress) {
final String actionId = keyBindings().getBinding(key, longPress);
return actionId != null && !NoAction.equals(actionId);
}
public final boolean doActionByKey(String key, boolean longPress) {
public final boolean doActionByKey(int key, boolean longPress) {
final String actionId = keyBindings().getBinding(key, longPress);
if (actionId != null) {
final ZLAction action = myIdToActionMap.get(actionId);

View file

@ -33,23 +33,35 @@ public final class ZLKeyBindings {
private final String myName;
private final ZLStringListOption myKeysOption;
private final TreeMap<String,ZLStringOption> myActionMap = new TreeMap<String,ZLStringOption>();
private final TreeMap<String,ZLStringOption> myLongPressActionMap = new TreeMap<String,ZLStringOption>();
private final TreeMap<Integer,ZLStringOption> myActionMap = new TreeMap<Integer,ZLStringOption>();
private final TreeMap<Integer,ZLStringOption> myLongPressActionMap = new TreeMap<Integer,ZLStringOption>();
public ZLKeyBindings(String name) {
myName = name;
final List<String> keys = new LinkedList<String>();
new Reader(keys).readBindings();
Collections.sort(keys);
myKeysOption = new ZLStringListOption(name, "KeyList", keys);
// this code is here for migration from old versions;
// should be removed in FBReader 2.0
ZLStringOption oldBackKeyOption = new ZLStringOption(name + ":" + ACTION, "<Back>", "");
if (oldBackKeyOption.getValue() != null) {
new ZLStringOption(name + ":" + ACTION, "4", oldBackKeyOption.getValue());
}
oldBackKeyOption = new ZLStringOption(name + ":" + LONG_PRESS_ACTION, "<Back>", "");
if (oldBackKeyOption.getValue() != null) {
new ZLStringOption(name + ":" + LONG_PRESS_ACTION, "4", oldBackKeyOption.getValue());
}
// end of migration code
}
private ZLStringOption createOption(String key, boolean longPress, String defaultValue) {
private ZLStringOption createOption(int key, boolean longPress, String defaultValue) {
final String group = myName + ":" + (longPress ? LONG_PRESS_ACTION : ACTION);
return new ZLStringOption(group, key, defaultValue);
return new ZLStringOption(group, String.valueOf(key), defaultValue);
}
public ZLStringOption getOption(String key, boolean longPress) {
final TreeMap<String,ZLStringOption> map = longPress ? myLongPressActionMap : myActionMap;
public ZLStringOption getOption(int key, boolean longPress) {
final TreeMap<Integer,ZLStringOption> map = longPress ? myLongPressActionMap : myActionMap;
ZLStringOption option = map.get(key);
if (option == null) {
option = createOption(key, longPress, ZLApplication.NoAction);
@ -58,17 +70,19 @@ public final class ZLKeyBindings {
return option;
}
public void bindKey(String key, boolean longPress, String actionId) {
public void bindKey(int key, boolean longPress, String actionId) {
final String stringKey = String.valueOf(key);
List<String> keys = myKeysOption.getValue();
if (!keys.contains(key)) {
if (!keys.contains(stringKey)) {
keys = new ArrayList<String>(keys);
keys.add(key);
keys.add(stringKey);
Collections.sort(keys);
myKeysOption.setValue(keys);
}
getOption(key, longPress).setValue(actionId);
}
public String getBinding(String key, boolean longPress) {
public String getBinding(int key, boolean longPress) {
return getOption(key, longPress).getValue();
}
@ -87,11 +101,15 @@ public final class ZLKeyBindings {
@Override
public boolean startElementHandler(String tag, ZLStringMap attributes) {
if ("binding".equals(tag)) {
final String key = attributes.getValue("key");
final String stringKey = attributes.getValue("key");
final String actionId = attributes.getValue("action");
if (key != null && actionId != null) {
myKeyList.add(key);
myActionMap.put(key, createOption(key, false, actionId));
if (stringKey != null && actionId != null) {
try {
final int key = Integer.parseInt(stringKey);
myKeyList.add(stringKey);
myActionMap.put(key, createOption(key, false, actionId));
} catch (NumberFormatException e) {
}
}
}
return false;

View file

@ -1,193 +0,0 @@
/*
* Copyright (C) 2007-2011 Geometer Plus <contact@geometerplus.com>
*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation; either version 2 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
* 02110-1301, USA.
*/
package org.geometerplus.zlibrary.ui.android.util;
import android.view.KeyEvent;
public final class ZLAndroidKeyUtil {
public static String getKeyNameByCode(int code) {
switch (code) {
case KeyEvent.KEYCODE_0:
return "<0>";
case KeyEvent.KEYCODE_1:
return "<1>";
case KeyEvent.KEYCODE_2:
return "<2>";
case KeyEvent.KEYCODE_3:
return "<3>";
case KeyEvent.KEYCODE_4:
return "<4>";
case KeyEvent.KEYCODE_5:
return "<5>";
case KeyEvent.KEYCODE_6:
return "<6>";
case KeyEvent.KEYCODE_7:
return "<7>";
case KeyEvent.KEYCODE_8:
return "<8>";
case KeyEvent.KEYCODE_9:
return "<9>";
case KeyEvent.KEYCODE_A:
return "<A>";
case KeyEvent.KEYCODE_B:
return "<B>";
case KeyEvent.KEYCODE_C:
return "<C>";
case KeyEvent.KEYCODE_D:
return "<D>";
case KeyEvent.KEYCODE_E:
return "<E>";
case KeyEvent.KEYCODE_F:
return "<F>";
case KeyEvent.KEYCODE_G:
return "<G>";
case KeyEvent.KEYCODE_H:
return "<H>";
case KeyEvent.KEYCODE_I:
return "<I>";
case KeyEvent.KEYCODE_J:
return "<J>";
case KeyEvent.KEYCODE_K:
return "<K>";
case KeyEvent.KEYCODE_L:
return "<L>";
case KeyEvent.KEYCODE_M:
return "<M>";
case KeyEvent.KEYCODE_N:
return "<N>";
case KeyEvent.KEYCODE_O:
return "<O>";
case KeyEvent.KEYCODE_P:
return "<P>";
case KeyEvent.KEYCODE_Q:
return "<Q>";
case KeyEvent.KEYCODE_R:
return "<R>";
case KeyEvent.KEYCODE_S:
return "<S>";
case KeyEvent.KEYCODE_T:
return "<T>";
case KeyEvent.KEYCODE_U:
return "<U>";
case KeyEvent.KEYCODE_V:
return "<V>";
case KeyEvent.KEYCODE_W:
return "<W>";
case KeyEvent.KEYCODE_X:
return "<X>";
case KeyEvent.KEYCODE_Y:
return "<Y>";
case KeyEvent.KEYCODE_Z:
return "<Z>";
case KeyEvent.KEYCODE_APOSTROPHE:
return "<'>";
case KeyEvent.KEYCODE_AT:
return "<@>";
case KeyEvent.KEYCODE_BACK:
return "<Back>";
case KeyEvent.KEYCODE_BACKSLASH:
return "<\\>";
case KeyEvent.KEYCODE_CALL:
return "<Call>";
case KeyEvent.KEYCODE_CAMERA:
return "<Camera>";
case KeyEvent.KEYCODE_CLEAR:
return "<Clear>";
case KeyEvent.KEYCODE_COMMA:
return "<,>";
case KeyEvent.KEYCODE_DEL:
return "<Del>";
case KeyEvent.KEYCODE_DPAD_CENTER:
return "<PadCenter>";
case KeyEvent.KEYCODE_DPAD_DOWN:
return "<PadDown>";
case KeyEvent.KEYCODE_DPAD_LEFT:
return "<PadLeft>";
case KeyEvent.KEYCODE_DPAD_RIGHT:
return "<PadRight>";
case KeyEvent.KEYCODE_DPAD_UP:
return "<PadUp>";
case KeyEvent.KEYCODE_ENDCALL:
return "<EndCall>";
case KeyEvent.KEYCODE_ENTER:
return "<Enter>";
case KeyEvent.KEYCODE_ENVELOPE:
return "<Envelope>";
case KeyEvent.KEYCODE_EQUALS:
return "<=>";
case KeyEvent.KEYCODE_EXPLORER:
return "<Explorer>";
case KeyEvent.KEYCODE_FOCUS:
return "<??? 0>";
case KeyEvent.KEYCODE_GRAVE:
return "<??? 1>";
case KeyEvent.KEYCODE_HEADSETHOOK:
return "<??? 2>";
case KeyEvent.KEYCODE_HOME:
return "<Home>";
case KeyEvent.KEYCODE_LEFT_BRACKET:
return "<(>";
case KeyEvent.KEYCODE_MENU:
return "<Menu>";
case KeyEvent.KEYCODE_MINUS:
return "<->";
case KeyEvent.KEYCODE_NOTIFICATION:
return "<??? 3>";
case KeyEvent.KEYCODE_NUM:
return "<Num>";
case KeyEvent.KEYCODE_PERIOD:
return "<??? 4>";
case KeyEvent.KEYCODE_PLUS:
return "<+>";
case KeyEvent.KEYCODE_POUND:
return "<??? 5>";
case KeyEvent.KEYCODE_POWER:
return "<Power>";
case KeyEvent.KEYCODE_RIGHT_BRACKET:
return "<)>";
case KeyEvent.KEYCODE_SEMICOLON:
return "<;>";
case KeyEvent.KEYCODE_SLASH:
return "</>";
case KeyEvent.KEYCODE_SOFT_LEFT:
return "<??? 6>";
case KeyEvent.KEYCODE_SOFT_RIGHT:
return "<??? 7>";
case KeyEvent.KEYCODE_SPACE:
return "<Space>";
case KeyEvent.KEYCODE_STAR:
return "<*>";
case KeyEvent.KEYCODE_SYM:
return "<Sym>";
case KeyEvent.KEYCODE_TAB:
return "<Tab>";
case KeyEvent.KEYCODE_VOLUME_DOWN:
return "<VolumeDown>";
case KeyEvent.KEYCODE_VOLUME_UP:
return "<VolumeUp>";
case KeyEvent.KEYCODE_UNKNOWN:
default:
return "<Unknown>";
}
}
private ZLAndroidKeyUtil() {
}
}

View file

@ -29,7 +29,6 @@ import org.geometerplus.zlibrary.core.view.ZLViewWidget;
import org.geometerplus.zlibrary.core.application.ZLApplication;
import org.geometerplus.zlibrary.ui.android.library.ZLAndroidActivity;
import org.geometerplus.zlibrary.ui.android.util.ZLAndroidKeyUtil;
public class ZLAndroidWidget extends View implements ZLViewWidget, View.OnLongClickListener {
private final Paint myPaint = new Paint();
@ -387,35 +386,33 @@ public class ZLAndroidWidget extends View implements ZLViewWidget, View.OnLongCl
return view.onFingerLongPress(myPressedX, myPressedY);
}
private String myKeyUnderTracking;
private int myKeyUnderTracking = -1;
private long myTrackingStartTime;
public boolean onKeyDown(int keyCode, KeyEvent event) {
final ZLApplication application = ZLApplication.Instance();
switch (keyCode) {
case KeyEvent.KEYCODE_VOLUME_DOWN:
case KeyEvent.KEYCODE_VOLUME_UP:
case KeyEvent.KEYCODE_BACK:
case KeyEvent.KEYCODE_ENTER:
case KeyEvent.KEYCODE_DPAD_CENTER:
{
final String keyName = ZLAndroidKeyUtil.getKeyNameByCode(keyCode);
if (myKeyUnderTracking != null) {
if (myKeyUnderTracking.equals(keyName)) {
default:
if (application.hasActionForKey(keyCode, true) ||
application.hasActionForKey(keyCode, false)) {
if (myKeyUnderTracking != -1) {
if (myKeyUnderTracking == keyCode) {
return true;
} else {
myKeyUnderTracking = -1;
}
}
if (application.hasActionForKey(keyCode, true)) {
myKeyUnderTracking = keyCode;
myTrackingStartTime = System.currentTimeMillis();
return true;
} else {
myKeyUnderTracking = null;
return application.doActionByKey(keyCode, false);
}
}
if (application.hasActionForKey(keyName, true)) {
myKeyUnderTracking = keyName;
myTrackingStartTime = System.currentTimeMillis();
return true;
} else {
return application.doActionByKey(keyName, false);
return false;
}
}
case KeyEvent.KEYCODE_DPAD_LEFT:
application.getCurrentView().onTrackballRotated(-1, 0);
return true;
@ -428,30 +425,20 @@ public class ZLAndroidWidget extends View implements ZLViewWidget, View.OnLongCl
case KeyEvent.KEYCODE_DPAD_UP:
application.getCurrentView().onTrackballRotated(0, -1);
return true;
default:
return false;
}
}
public boolean onKeyUp(int keyCode, KeyEvent event) {
switch (keyCode) {
case KeyEvent.KEYCODE_VOLUME_DOWN:
case KeyEvent.KEYCODE_VOLUME_UP:
case KeyEvent.KEYCODE_BACK:
case KeyEvent.KEYCODE_ENTER:
case KeyEvent.KEYCODE_DPAD_CENTER:
if (myKeyUnderTracking != null) {
final String keyName = ZLAndroidKeyUtil.getKeyNameByCode(keyCode);
if (myKeyUnderTracking.equals(keyName)) {
final boolean longPress = System.currentTimeMillis() >
myTrackingStartTime + ViewConfiguration.getLongPressTimeout();
ZLApplication.Instance().doActionByKey(keyName, longPress);
}
myKeyUnderTracking = null;
}
return true;
default:
return false;
if (myKeyUnderTracking != -1) {
if (myKeyUnderTracking == keyCode) {
final boolean longPress = System.currentTimeMillis() >
myTrackingStartTime + ViewConfiguration.getLongPressTimeout();
ZLApplication.Instance().doActionByKey(keyCode, longPress);
}
myKeyUnderTracking = -1;
return true;
} else {
return false;
}
}