mirror of
https://github.com/RetroDECK/Duckstation.git
synced 2024-11-26 23:55:40 +00:00
Android: Support binding half axes to buttons
This commit is contained in:
parent
bb21a062d8
commit
a9a571cd6a
|
@ -1191,6 +1191,24 @@ DEFINE_JNI_ARGS_METHOD(jint, AndroidHostInterface_getControllerAxisCode, jobject
|
||||||
return code.value_or(-1);
|
return code.value_or(-1);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
DEFINE_JNI_ARGS_METHOD(jint, AndroidHostInterface_getControllerAxisType, jobject unused, jstring controller_type,
|
||||||
|
jstring axis_name)
|
||||||
|
{
|
||||||
|
std::optional<ControllerType> type =
|
||||||
|
Settings::ParseControllerTypeName(AndroidHelpers::JStringToString(env, controller_type).c_str());
|
||||||
|
if (!type)
|
||||||
|
return -1;
|
||||||
|
|
||||||
|
const std::string axis_name_str(AndroidHelpers::JStringToString(env, axis_name));
|
||||||
|
for (const auto& [name, code, type] : Controller::GetAxisNames(type.value()))
|
||||||
|
{
|
||||||
|
if (name == axis_name_str)
|
||||||
|
return static_cast<jint>(type);
|
||||||
|
}
|
||||||
|
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
|
||||||
DEFINE_JNI_ARGS_METHOD(jobjectArray, AndroidHostInterface_getControllerButtonNames, jobject unused,
|
DEFINE_JNI_ARGS_METHOD(jobjectArray, AndroidHostInterface_getControllerButtonNames, jobject unused,
|
||||||
jstring controller_type)
|
jstring controller_type)
|
||||||
{
|
{
|
||||||
|
|
|
@ -18,6 +18,9 @@ public class AndroidHostInterface {
|
||||||
public final static int DISPLAY_ALIGNMENT_CENTER = 1;
|
public final static int DISPLAY_ALIGNMENT_CENTER = 1;
|
||||||
public final static int DISPLAY_ALIGNMENT_RIGHT_OR_BOTTOM = 2;
|
public final static int DISPLAY_ALIGNMENT_RIGHT_OR_BOTTOM = 2;
|
||||||
|
|
||||||
|
public final static int CONTROLLER_AXIS_TYPE_FULL = 0;
|
||||||
|
public final static int CONTROLLER_AXIS_TYPE_HALF = 1;
|
||||||
|
|
||||||
private long mNativePointer;
|
private long mNativePointer;
|
||||||
private Context mContext;
|
private Context mContext;
|
||||||
|
|
||||||
|
@ -77,6 +80,8 @@ public class AndroidHostInterface {
|
||||||
|
|
||||||
public static native int getControllerAxisCode(String controllerType, String axisName);
|
public static native int getControllerAxisCode(String controllerType, String axisName);
|
||||||
|
|
||||||
|
public static native int getControllerAxisType(String controllerType, String axisName);
|
||||||
|
|
||||||
public static native String[] getControllerButtonNames(String controllerType);
|
public static native String[] getControllerButtonNames(String controllerType);
|
||||||
|
|
||||||
public static native String[] getControllerAxisNames(String controllerType);
|
public static native String[] getControllerAxisNames(String controllerType);
|
||||||
|
|
|
@ -78,7 +78,7 @@ public class ControllerBindingDialog extends AlertDialog {
|
||||||
return super.onKeyDown(keyCode, event);
|
return super.onKeyDown(keyCode, event);
|
||||||
}
|
}
|
||||||
|
|
||||||
if (mType == ControllerBindingPreference.Type.BUTTON) {
|
if (mType == ControllerBindingPreference.Type.BUTTON || mType == ControllerBindingPreference.Type.HALF_AXIS) {
|
||||||
mCurrentBinding = String.format("%s/Button%d", device.getDescriptor(), event.getKeyCode());
|
mCurrentBinding = String.format("%s/Button%d", device.getDescriptor(), event.getKeyCode());
|
||||||
} else if (mType == ControllerBindingPreference.Type.VIBRATION) {
|
} else if (mType == ControllerBindingPreference.Type.VIBRATION) {
|
||||||
if (device.getVibrator() == null || !device.getVibrator().hasVibrator()) {
|
if (device.getVibrator() == null || !device.getVibrator().hasVibrator()) {
|
||||||
|
@ -105,7 +105,7 @@ public class ControllerBindingDialog extends AlertDialog {
|
||||||
mUpdatedAxisCode = axisCode;
|
mUpdatedAxisCode = axisCode;
|
||||||
|
|
||||||
final int controllerIndex = 0;
|
final int controllerIndex = 0;
|
||||||
if (mType == ControllerBindingPreference.Type.AXIS)
|
if (mType == ControllerBindingPreference.Type.AXIS || mType == ControllerBindingPreference.Type.HALF_AXIS)
|
||||||
mCurrentBinding = String.format("%s/Axis%d", device.getDescriptor(), axisCode);
|
mCurrentBinding = String.format("%s/Axis%d", device.getDescriptor(), axisCode);
|
||||||
else
|
else
|
||||||
mCurrentBinding = String.format("%s/%cAxis%d", device.getDescriptor(), (positive) ? '+' : '-', axisCode);
|
mCurrentBinding = String.format("%s/%cAxis%d", device.getDescriptor(), (positive) ? '+' : '-', axisCode);
|
||||||
|
@ -156,7 +156,9 @@ public class ControllerBindingDialog extends AlertDialog {
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public boolean onGenericMotionEvent(@NonNull MotionEvent event) {
|
public boolean onGenericMotionEvent(@NonNull MotionEvent event) {
|
||||||
if (mType != ControllerBindingPreference.Type.AXIS && mType != ControllerBindingPreference.Type.BUTTON) {
|
if (mType != ControllerBindingPreference.Type.AXIS &&
|
||||||
|
mType != ControllerBindingPreference.Type.HALF_AXIS &&
|
||||||
|
mType != ControllerBindingPreference.Type.BUTTON) {
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -18,6 +18,7 @@ public class ControllerBindingPreference extends Preference {
|
||||||
public enum Type {
|
public enum Type {
|
||||||
BUTTON,
|
BUTTON,
|
||||||
AXIS,
|
AXIS,
|
||||||
|
HALF_AXIS,
|
||||||
VIBRATION
|
VIBRATION
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -149,10 +150,10 @@ public class ControllerBindingPreference extends Preference {
|
||||||
updateValue();
|
updateValue();
|
||||||
}
|
}
|
||||||
|
|
||||||
public void initAxis(int controllerIndex, String axisName) {
|
public void initAxis(int controllerIndex, String axisName, int axisType) {
|
||||||
mBindingName = axisName;
|
mBindingName = axisName;
|
||||||
mDisplayName = axisName;
|
mDisplayName = axisName;
|
||||||
mType = Type.AXIS;
|
mType = (axisType == AndroidHostInterface.CONTROLLER_AXIS_TYPE_HALF) ? Type.HALF_AXIS : Type.AXIS;
|
||||||
mVisualType = VisualType.AXIS;
|
mVisualType = VisualType.AXIS;
|
||||||
setKey(String.format("Controller%d/Axis%s", controllerIndex, axisName));
|
setKey(String.format("Controller%d/Axis%s", controllerIndex, axisName));
|
||||||
updateValue();
|
updateValue();
|
||||||
|
|
|
@ -297,12 +297,12 @@ public class ControllerSettingsActivity extends AppCompatActivity {
|
||||||
private void createPreferences(String controllerType) {
|
private void createPreferences(String controllerType) {
|
||||||
final PreferenceScreen ps = getPreferenceScreen();
|
final PreferenceScreen ps = getPreferenceScreen();
|
||||||
final SharedPreferences sp = getPreferenceManager().getSharedPreferences();
|
final SharedPreferences sp = getPreferenceManager().getSharedPreferences();
|
||||||
final String[] controllerButtons = AndroidHostInterface.getControllerButtonNames(controllerType);
|
final String[] buttonNames = AndroidHostInterface.getControllerButtonNames(controllerType);
|
||||||
final String[] axisButtons = AndroidHostInterface.getControllerAxisNames(controllerType);
|
final String[] axisNames = AndroidHostInterface.getControllerAxisNames(controllerType);
|
||||||
final int vibrationMotors = AndroidHostInterface.getControllerVibrationMotorCount(controllerType);
|
final int vibrationMotors = AndroidHostInterface.getControllerVibrationMotorCount(controllerType);
|
||||||
|
|
||||||
if (controllerButtons != null) {
|
if (buttonNames != null) {
|
||||||
for (String buttonName : controllerButtons) {
|
for (String buttonName : buttonNames) {
|
||||||
final ControllerBindingPreference cbp = new ControllerBindingPreference(getContext(), null);
|
final ControllerBindingPreference cbp = new ControllerBindingPreference(getContext(), null);
|
||||||
cbp.initButton(controllerIndex, buttonName);
|
cbp.initButton(controllerIndex, buttonName);
|
||||||
mButtonsCategory.addPreference(cbp);
|
mButtonsCategory.addPreference(cbp);
|
||||||
|
@ -310,10 +310,11 @@ public class ControllerSettingsActivity extends AppCompatActivity {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
if (axisButtons != null) {
|
if (axisNames != null) {
|
||||||
for (String axisName : axisButtons) {
|
for (String axisName : axisNames) {
|
||||||
|
final int axisType = AndroidHostInterface.getControllerAxisType(controllerType, axisName);
|
||||||
final ControllerBindingPreference cbp = new ControllerBindingPreference(getContext(), null);
|
final ControllerBindingPreference cbp = new ControllerBindingPreference(getContext(), null);
|
||||||
cbp.initAxis(controllerIndex, axisName);
|
cbp.initAxis(controllerIndex, axisName, axisType);
|
||||||
mAxisCategory.addPreference(cbp);
|
mAxisCategory.addPreference(cbp);
|
||||||
activity.mPreferences.add(cbp);
|
activity.mPreferences.add(cbp);
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in a new issue