Skip to content
This repository has been archived by the owner on Nov 8, 2023. It is now read-only.

Commit

Permalink
Special case game controller fallback keys for Japan
Browse files Browse the repository at this point in the history
Bug: 10306633
Change-Id: I647fc5286678ddd85599a00e68e2fd70c2c3db49
  • Loading branch information
Michael Wright committed Aug 26, 2013
1 parent 0ccb7d1 commit 4567e40
Show file tree
Hide file tree
Showing 5 changed files with 95 additions and 126 deletions.
73 changes: 72 additions & 1 deletion core/java/android/view/ViewRootImpl.java
Expand Up @@ -81,6 +81,7 @@
import java.lang.ref.WeakReference;
import java.util.ArrayList;
import java.util.HashSet;
import java.util.Locale;

/**
* The top of a view hierarchy, implementing the needed protocol between View
Expand Down Expand Up @@ -230,6 +231,8 @@ public final class ViewRootImpl implements ViewParent,
InputStage mFirstPostImeInputStage;
SyntheticInputStage mSyntheticInputStage;

boolean mFlipControllerFallbackKeys;

boolean mWindowAttributesChanged = false;
int mWindowAttributesChangesFlag = 0;

Expand Down Expand Up @@ -366,6 +369,8 @@ public ViewRootImpl(Context context, Display display) {
mNoncompatDensity = context.getResources().getDisplayMetrics().noncompatDensityDpi;
mFallbackEventHandler = PolicyManager.makeNewFallbackEventHandler(context);
mChoreographer = Choreographer.getInstance();
mFlipControllerFallbackKeys =
context.getResources().getBoolean(R.bool.flip_controller_fallback_keys);

PowerManager powerManager = (PowerManager) context.getSystemService(Context.POWER_SERVICE);
mAttachInfo.mScreenOn = powerManager.isScreenOn();
Expand Down Expand Up @@ -2873,8 +2878,11 @@ void updateConfiguration(Configuration config, boolean force) {
mView.dispatchConfigurationChanged(config);
}
}

mFlipControllerFallbackKeys =
mContext.getResources().getBoolean(R.bool.flip_controller_fallback_keys);
}

/**
* Return true if child is an ancestor of parent, (or equal to the parent).
*/
Expand Down Expand Up @@ -3904,6 +3912,7 @@ final class SyntheticInputStage extends InputStage {
private final SyntheticJoystickHandler mJoystick = new SyntheticJoystickHandler();
private final SyntheticTouchNavigationHandler mTouchNavigation =
new SyntheticTouchNavigationHandler();
private final SyntheticKeyHandler mKeys = new SyntheticKeyHandler();

public SyntheticInputStage() {
super(null);
Expand All @@ -3926,7 +3935,12 @@ protected int onProcess(QueuedInputEvent q) {
mTouchNavigation.process(event);
return FINISH_HANDLED;
}
} else if (q.mEvent instanceof KeyEvent) {
if (mKeys.process((KeyEvent) q.mEvent)) {
return FINISH_HANDLED;
}
}

return FORWARD;
}

Expand Down Expand Up @@ -4802,6 +4816,63 @@ public void run() {
};
}

final class SyntheticKeyHandler {

public boolean process(KeyEvent event) {
// In some locales (like Japan) controllers use B for confirm and A for back, rather
// than vice versa, so we need to special case this here since the input system itself
// is not locale-aware.
int keyCode;
switch(event.getKeyCode()) {
case KeyEvent.KEYCODE_BUTTON_A:
case KeyEvent.KEYCODE_BUTTON_C:
case KeyEvent.KEYCODE_BUTTON_X:
case KeyEvent.KEYCODE_BUTTON_Z:
keyCode = mFlipControllerFallbackKeys ?
KeyEvent.KEYCODE_BACK : KeyEvent.KEYCODE_DPAD_CENTER;
break;
case KeyEvent.KEYCODE_BUTTON_B:
case KeyEvent.KEYCODE_BUTTON_Y:
keyCode = mFlipControllerFallbackKeys ?
KeyEvent.KEYCODE_DPAD_CENTER : KeyEvent.KEYCODE_BACK;
break;
case KeyEvent.KEYCODE_BUTTON_THUMBL:
case KeyEvent.KEYCODE_BUTTON_THUMBR:
case KeyEvent.KEYCODE_BUTTON_START:
case KeyEvent.KEYCODE_BUTTON_1:
case KeyEvent.KEYCODE_BUTTON_2:
case KeyEvent.KEYCODE_BUTTON_3:
case KeyEvent.KEYCODE_BUTTON_4:
case KeyEvent.KEYCODE_BUTTON_5:
case KeyEvent.KEYCODE_BUTTON_6:
case KeyEvent.KEYCODE_BUTTON_7:
case KeyEvent.KEYCODE_BUTTON_8:
case KeyEvent.KEYCODE_BUTTON_9:
case KeyEvent.KEYCODE_BUTTON_10:
case KeyEvent.KEYCODE_BUTTON_11:
case KeyEvent.KEYCODE_BUTTON_12:
case KeyEvent.KEYCODE_BUTTON_13:
case KeyEvent.KEYCODE_BUTTON_14:
case KeyEvent.KEYCODE_BUTTON_15:
case KeyEvent.KEYCODE_BUTTON_16:
keyCode = KeyEvent.KEYCODE_DPAD_CENTER;
break;
case KeyEvent.KEYCODE_BUTTON_SELECT:
case KeyEvent.KEYCODE_BUTTON_MODE:
keyCode = KeyEvent.KEYCODE_MENU;
default:
return false;
}

enqueueInputEvent(new KeyEvent(event.getDownTime(), event.getEventTime(),
event.getAction(), keyCode, event.getRepeatCount(), event.getMetaState(),
event.getScanCode(), event.getFlags() | KeyEvent.FLAG_FALLBACK,
event.getSource()));
return true;
}

}

/**
* Returns true if the key is used for keyboard navigation.
* @param keyEvent The key event.
Expand Down
20 changes: 20 additions & 0 deletions core/res/res/values-ja/bools.xml
@@ -0,0 +1,20 @@
<?xml version="1.0" encoding="utf-8"?>
<!-- Copyright (C) 2013 The Android Open Source Project
Licensed under the Apache License, Version 2.0 (the "License");
you may not use this file except in compliance with the License.
You may obtain a copy of the License at
http://www.apache.org/licenses/LICENSE-2.0
Unless required by applicable law or agreed to in writing, software
distributed under the License is distributed on an "AS IS" BASIS,
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
See the License for the specific language governing permissions and
limitations under the License.
-->

<resources>
<bool name="flip_controller_fallback_keys">true</bool>
</resources>

1 change: 1 addition & 0 deletions core/res/res/values/bools.xml
Expand Up @@ -26,4 +26,5 @@
<bool name="show_ongoing_ime_switcher">true</bool>
<bool name="action_bar_expanded_action_views_exclusive">true</bool>
<bool name="target_honeycomb_needs_options_menu">true</bool>
<bool name="flip_controller_fallback_keys">false</bool>
</resources>
1 change: 1 addition & 0 deletions core/res/res/values/symbols.xml
Expand Up @@ -282,6 +282,7 @@
<java-symbol type="bool" name="config_useFixedVolume" />
<java-symbol type="bool" name="config_forceDefaultOrientation" />
<java-symbol type="bool" name="config_wifi_batched_scan_supported" />
<java-symbol type="bool" name="flip_controller_fallback_keys" />

<java-symbol type="integer" name="config_cursorWindowSize" />
<java-symbol type="integer" name="config_extraFreeKbytesAdjust" />
Expand Down
126 changes: 1 addition & 125 deletions data/keyboards/Generic.kcm
Expand Up @@ -477,128 +477,4 @@ key ESCAPE {
ctrl: fallback MENU
}

### Gamepad buttons ###

key BUTTON_A {
base: fallback DPAD_CENTER
}

key BUTTON_B {
base: fallback BACK
}

key BUTTON_C {
base: fallback DPAD_CENTER
}

key BUTTON_X {
base: fallback DPAD_CENTER
}

key BUTTON_Y {
base: fallback BACK
}

key BUTTON_Z {
base: fallback DPAD_CENTER
}

key BUTTON_L1 {
base: none
}

key BUTTON_R1 {
base: none
}

key BUTTON_L2 {
base: none
}

key BUTTON_R2 {
base: none
}

key BUTTON_THUMBL {
base: fallback DPAD_CENTER
}

key BUTTON_THUMBR {
base: fallback DPAD_CENTER
}

key BUTTON_START {
base: fallback DPAD_CENTER
}

key BUTTON_SELECT {
base: fallback MENU
}

key BUTTON_MODE {
base: fallback MENU
}

key BUTTON_1 {
base: fallback DPAD_CENTER
}

key BUTTON_2 {
base: fallback DPAD_CENTER
}

key BUTTON_3 {
base: fallback DPAD_CENTER
}

key BUTTON_4 {
base: fallback DPAD_CENTER
}

key BUTTON_5 {
base: fallback DPAD_CENTER
}

key BUTTON_6 {
base: fallback DPAD_CENTER
}

key BUTTON_7 {
base: fallback DPAD_CENTER
}

key BUTTON_8 {
base: fallback DPAD_CENTER
}

key BUTTON_9 {
base: fallback DPAD_CENTER
}

key BUTTON_10 {
base: fallback DPAD_CENTER
}

key BUTTON_11 {
base: fallback DPAD_CENTER
}

key BUTTON_12 {
base: fallback DPAD_CENTER
}

key BUTTON_13 {
base: fallback DPAD_CENTER
}

key BUTTON_14 {
base: fallback DPAD_CENTER
}

key BUTTON_15 {
base: fallback DPAD_CENTER
}

key BUTTON_16 {
base: fallback DPAD_CENTER
}
### Gamepad buttons are handled by the view root ###

0 comments on commit 4567e40

Please sign in to comment.