475 lines
16 KiB
Java
475 lines
16 KiB
Java
package com.reicast.emulator;
|
|
|
|
import java.io.IOException;
|
|
import java.io.InputStream;
|
|
|
|
import de.ankri.views.Switch;
|
|
import android.app.Activity;
|
|
import android.app.AlertDialog;
|
|
import android.app.Dialog;
|
|
import android.content.DialogInterface;
|
|
import android.content.SharedPreferences;
|
|
import android.graphics.Bitmap;
|
|
import android.graphics.BitmapFactory;
|
|
import android.graphics.Matrix;
|
|
import android.graphics.drawable.BitmapDrawable;
|
|
import android.graphics.drawable.Drawable;
|
|
import android.os.Build;
|
|
import android.os.Bundle;
|
|
import android.preference.PreferenceManager;
|
|
import android.support.v4.app.Fragment;
|
|
import android.view.KeyEvent;
|
|
import android.view.LayoutInflater;
|
|
import android.view.View;
|
|
import android.view.ViewGroup;
|
|
import android.widget.AdapterView;
|
|
import android.widget.ArrayAdapter;
|
|
import android.widget.Button;
|
|
import android.widget.CompoundButton;
|
|
import android.widget.ImageView;
|
|
import android.widget.Spinner;
|
|
import android.widget.TextView;
|
|
import android.widget.AdapterView.OnItemSelectedListener;
|
|
import android.widget.CompoundButton.OnCheckedChangeListener;
|
|
|
|
public class InputModFragment extends Fragment {
|
|
|
|
private Activity parentActivity;
|
|
private SharedPreferences mPrefs;
|
|
private Switch switchModifiedLayoutEnabled;
|
|
private Switch switchCompatibilityEnabled;
|
|
private String player;
|
|
private int sS = 2;
|
|
|
|
// Container Activity must implement this interface
|
|
public interface OnClickListener {
|
|
public void onMainBrowseSelected(String path_entry, boolean games);
|
|
}
|
|
|
|
@Override
|
|
public View onCreateView(LayoutInflater inflater, ViewGroup container,
|
|
Bundle savedInstanceState) {
|
|
// Inflate the layout for this fragment
|
|
return inflater.inflate(R.layout.input_mod_fragment, container, false);
|
|
}
|
|
|
|
@Override
|
|
public void onViewCreated(View view, Bundle savedInstanceState) {
|
|
parentActivity = getActivity();
|
|
|
|
Runtime.getRuntime().freeMemory();
|
|
System.gc();
|
|
|
|
mPrefs = PreferenceManager.getDefaultSharedPreferences(parentActivity);
|
|
|
|
String[] controllers = parentActivity.getResources().getStringArray(
|
|
R.array.controllers);
|
|
|
|
Spinner player_spnr = (Spinner) getView().findViewById(
|
|
R.id.player_spinner);
|
|
ArrayAdapter<String> playerAdapter = new ArrayAdapter<String>(
|
|
parentActivity, android.R.layout.simple_spinner_item,
|
|
controllers);
|
|
playerAdapter
|
|
.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item);
|
|
player_spnr.setAdapter(playerAdapter);
|
|
|
|
player_spnr.setOnItemSelectedListener(new OnItemSelectedListener() {
|
|
|
|
public void onItemSelected(AdapterView<?> parent, View view,
|
|
int pos, long id) {
|
|
String selection = parent.getItemAtPosition(pos).toString();
|
|
player = "_"
|
|
+ selection.substring(selection.lastIndexOf(" ") + 1,
|
|
selection.length());
|
|
}
|
|
|
|
public void onNothingSelected(AdapterView<?> arg0) {
|
|
// player = "A";
|
|
}
|
|
|
|
});
|
|
|
|
OnCheckedChangeListener modified_layout = new OnCheckedChangeListener() {
|
|
public void onCheckedChanged(CompoundButton buttonView,
|
|
boolean isChecked) {
|
|
mPrefs.edit()
|
|
.putBoolean("modified_key_layout" + player, isChecked)
|
|
.commit();
|
|
}
|
|
};
|
|
switchModifiedLayoutEnabled = (Switch) getView().findViewById(
|
|
R.id.switchModifiedLayoutEnabled);
|
|
boolean layout = mPrefs.getBoolean("modified_key_layout" + player,
|
|
false);
|
|
if (layout) {
|
|
switchModifiedLayoutEnabled.setChecked(true);
|
|
} else {
|
|
switchModifiedLayoutEnabled.setChecked(false);
|
|
}
|
|
switchModifiedLayoutEnabled.setOnCheckedChangeListener(modified_layout);
|
|
|
|
OnCheckedChangeListener compat_mode = new OnCheckedChangeListener() {
|
|
public void onCheckedChanged(CompoundButton buttonView,
|
|
boolean isChecked) {
|
|
selectController();
|
|
mPrefs.edit()
|
|
.putBoolean("controller_compat" + player, isChecked)
|
|
.commit();
|
|
}
|
|
};
|
|
switchCompatibilityEnabled = (Switch) getView().findViewById(
|
|
R.id.switchCompatibilityEnabled);
|
|
boolean compat = mPrefs.getBoolean("controller_compat" + player, false);
|
|
if (compat) {
|
|
switchCompatibilityEnabled.setChecked(true);
|
|
} else {
|
|
switchCompatibilityEnabled.setChecked(false);
|
|
}
|
|
switchCompatibilityEnabled.setOnCheckedChangeListener(compat_mode);
|
|
|
|
ImageView a_button_icon = (ImageView) getView().findViewById(
|
|
R.id.a_button_icon);
|
|
a_button_icon.setImageDrawable(getButtonImage(448 / sS, 0));
|
|
final TextView a_button_text = (TextView) getView().findViewById(
|
|
R.id.a_button_key);
|
|
Button a_button = (Button) getView().findViewById(R.id.a_button_edit);
|
|
a_button.setOnClickListener(new View.OnClickListener() {
|
|
public void onClick(View v) {
|
|
mapKeyCode("a_button", a_button_text);
|
|
}
|
|
});
|
|
Button a_remove = (Button) getView().findViewById(R.id.remove_a_button);
|
|
a_remove.setOnClickListener(new View.OnClickListener() {
|
|
public void onClick(View v) {
|
|
remKeyCode("a_button", a_button_text);
|
|
}
|
|
});
|
|
|
|
ImageView b_button_icon = (ImageView) getView().findViewById(
|
|
R.id.b_button_icon);
|
|
b_button_icon.setImageDrawable(getButtonImage(384 / sS, 0));
|
|
final TextView b_button_text = (TextView) getView().findViewById(
|
|
R.id.b_button_key);
|
|
getKeyCode("b_button", b_button_text);
|
|
Button b_button = (Button) getView().findViewById(R.id.b_button_edit);
|
|
b_button.setOnClickListener(new View.OnClickListener() {
|
|
public void onClick(View v) {
|
|
mapKeyCode("b_button", b_button_text);
|
|
}
|
|
});
|
|
Button b_remove = (Button) getView().findViewById(R.id.remove_b_button);
|
|
b_remove.setOnClickListener(new View.OnClickListener() {
|
|
public void onClick(View v) {
|
|
remKeyCode("b_button", b_button_text);
|
|
}
|
|
});
|
|
|
|
ImageView x_button_icon = (ImageView) getView().findViewById(
|
|
R.id.x_button_icon);
|
|
x_button_icon.setImageDrawable(getButtonImage(256 / sS, 0));
|
|
final TextView x_button_text = (TextView) getView().findViewById(
|
|
R.id.x_button_key);
|
|
getKeyCode("x_button", x_button_text);
|
|
Button x_button = (Button) getView().findViewById(R.id.x_button_edit);
|
|
x_button.setOnClickListener(new View.OnClickListener() {
|
|
public void onClick(View v) {
|
|
mapKeyCode("x_button", x_button_text);
|
|
}
|
|
});
|
|
Button x_remove = (Button) getView().findViewById(R.id.remove_x_button);
|
|
x_remove.setOnClickListener(new View.OnClickListener() {
|
|
public void onClick(View v) {
|
|
remKeyCode("x_button", x_button_text);
|
|
}
|
|
});
|
|
|
|
ImageView y_button_icon = (ImageView) getView().findViewById(
|
|
R.id.y_button_icon);
|
|
y_button_icon.setImageDrawable(getButtonImage(320 / sS, 0));
|
|
final TextView y_button_text = (TextView) getView().findViewById(
|
|
R.id.y_button_key);
|
|
getKeyCode("y_button", y_button_text);
|
|
Button y_button = (Button) getView().findViewById(R.id.y_button_edit);
|
|
y_button.setOnClickListener(new View.OnClickListener() {
|
|
public void onClick(View v) {
|
|
mapKeyCode("y_button", y_button_text);
|
|
}
|
|
});
|
|
Button y_remove = (Button) getView().findViewById(R.id.remove_y_button);
|
|
y_remove.setOnClickListener(new View.OnClickListener() {
|
|
public void onClick(View v) {
|
|
remKeyCode("y_button", y_button_text);
|
|
}
|
|
});
|
|
|
|
ImageView l_button_icon = (ImageView) getView().findViewById(
|
|
R.id.l_button_icon);
|
|
l_button_icon.setImageDrawable(getButtonImage(78 / sS, 64 / sS));
|
|
final TextView l_button_text = (TextView) getView().findViewById(
|
|
R.id.l_button_key);
|
|
getKeyCode("l_button", l_button_text);
|
|
Button l_button = (Button) getView().findViewById(R.id.l_button_edit);
|
|
l_button.setOnClickListener(new View.OnClickListener() {
|
|
public void onClick(View v) {
|
|
mapKeyCode("l_button", l_button_text);
|
|
}
|
|
});
|
|
Button l_remove = (Button) getView().findViewById(R.id.remove_l_button);
|
|
l_remove.setOnClickListener(new View.OnClickListener() {
|
|
public void onClick(View v) {
|
|
remKeyCode("l_button", l_button_text);
|
|
}
|
|
});
|
|
|
|
ImageView r_button_icon = (ImageView) getView().findViewById(
|
|
R.id.r_button_icon);
|
|
r_button_icon.setImageDrawable(getButtonImage(162 / sS, 64 / sS));
|
|
final TextView r_button_text = (TextView) getView().findViewById(
|
|
R.id.r_button_key);
|
|
getKeyCode("r_button", r_button_text);
|
|
Button r_button = (Button) getView().findViewById(R.id.r_button_edit);
|
|
r_button.setOnClickListener(new View.OnClickListener() {
|
|
public void onClick(View v) {
|
|
mapKeyCode("r_button", r_button_text);
|
|
}
|
|
});
|
|
Button r_remove = (Button) getView().findViewById(R.id.remove_r_button);
|
|
r_remove.setOnClickListener(new View.OnClickListener() {
|
|
public void onClick(View v) {
|
|
remKeyCode("r_button", r_button_text);
|
|
}
|
|
});
|
|
|
|
final TextView joystick_text = (TextView) getView().findViewById(
|
|
R.id.joystick_key);
|
|
getKeyCode("joystick", joystick_text);
|
|
Button joystick = (Button) getView().findViewById(R.id.joystick_edit);
|
|
joystick.setOnClickListener(new View.OnClickListener() {
|
|
public void onClick(View v) {
|
|
mapKeyCode("joystick", joystick_text);
|
|
}
|
|
});
|
|
Button joystick_remove = (Button) getView().findViewById(
|
|
R.id.remove_joystick);
|
|
joystick_remove.setOnClickListener(new View.OnClickListener() {
|
|
public void onClick(View v) {
|
|
remKeyCode("joystick", joystick_text);
|
|
}
|
|
});
|
|
joystick.setEnabled(false);
|
|
mPrefs.edit().remove("joystick").commit();
|
|
// Still needs better support for identifying the entire stick
|
|
|
|
final TextView dpad_up_text = (TextView) getView().findViewById(
|
|
R.id.dpad_up_key);
|
|
getKeyCode("dpad_up", dpad_up_text);
|
|
Button dpad_up = (Button) getView().findViewById(R.id.dpad_up_edit);
|
|
dpad_up.setOnClickListener(new View.OnClickListener() {
|
|
public void onClick(View v) {
|
|
mapKeyCode("dpad_up", dpad_up_text);
|
|
}
|
|
});
|
|
Button up_remove = (Button) getView().findViewById(R.id.remove_dpad_up);
|
|
up_remove.setOnClickListener(new View.OnClickListener() {
|
|
public void onClick(View v) {
|
|
remKeyCode("dpad_up", dpad_up_text);
|
|
}
|
|
});
|
|
|
|
final TextView dpad_down_text = (TextView) getView().findViewById(
|
|
R.id.dpad_down_key);
|
|
getKeyCode("dpad_down", dpad_down_text);
|
|
Button dpad_down = (Button) getView().findViewById(R.id.dpad_down_edit);
|
|
dpad_down.setOnClickListener(new View.OnClickListener() {
|
|
public void onClick(View v) {
|
|
mapKeyCode("dpad_down", dpad_down_text);
|
|
}
|
|
});
|
|
Button down_remove = (Button) getView().findViewById(
|
|
R.id.remove_dpad_down);
|
|
down_remove.setOnClickListener(new View.OnClickListener() {
|
|
public void onClick(View v) {
|
|
remKeyCode("dpad_down", dpad_down_text);
|
|
}
|
|
});
|
|
|
|
final TextView dpad_left_text = (TextView) getView().findViewById(
|
|
R.id.dpad_left_key);
|
|
getKeyCode("dpad_left", dpad_left_text);
|
|
Button dpad_left = (Button) getView().findViewById(R.id.dpad_left_edit);
|
|
dpad_left.setOnClickListener(new View.OnClickListener() {
|
|
public void onClick(View v) {
|
|
mapKeyCode("dpad_left", dpad_left_text);
|
|
}
|
|
});
|
|
Button left_remove = (Button) getView().findViewById(
|
|
R.id.remove_dpad_left);
|
|
left_remove.setOnClickListener(new View.OnClickListener() {
|
|
public void onClick(View v) {
|
|
remKeyCode("dpad_left", dpad_left_text);
|
|
}
|
|
});
|
|
|
|
final TextView dpad_right_text = (TextView) getView().findViewById(
|
|
R.id.dpad_right_key);
|
|
getKeyCode("dpad_right", dpad_right_text);
|
|
Button dpad_right = (Button) getView().findViewById(
|
|
R.id.dpad_right_edit);
|
|
dpad_right.setOnClickListener(new View.OnClickListener() {
|
|
public void onClick(View v) {
|
|
mapKeyCode("dpad_right", dpad_right_text);
|
|
}
|
|
});
|
|
Button right_remove = (Button) getView().findViewById(
|
|
R.id.remove_dpad_right);
|
|
right_remove.setOnClickListener(new View.OnClickListener() {
|
|
public void onClick(View v) {
|
|
remKeyCode("dpad_right", dpad_right_text);
|
|
}
|
|
});
|
|
|
|
ImageView start_button_icon = (ImageView) getView().findViewById(
|
|
R.id.start_button_icon);
|
|
start_button_icon.setImageDrawable(getButtonImage(0, 64 / sS));
|
|
final TextView start_button_text = (TextView) getView().findViewById(
|
|
R.id.start_button_key);
|
|
getKeyCode("start_button", start_button_text);
|
|
Button start_button = (Button) getView().findViewById(
|
|
R.id.start_button_edit);
|
|
start_button.setOnClickListener(new View.OnClickListener() {
|
|
public void onClick(View v) {
|
|
mapKeyCode("start_button", start_button_text);
|
|
}
|
|
});
|
|
Button start_remove = (Button) getView()
|
|
.findViewById(R.id.remove_start);
|
|
start_remove.setOnClickListener(new View.OnClickListener() {
|
|
public void onClick(View v) {
|
|
remKeyCode("start_button", start_button_text);
|
|
}
|
|
});
|
|
}
|
|
|
|
private Drawable getButtonImage(int x, int y) {
|
|
System.gc();
|
|
try {
|
|
InputStream bitmap = parentActivity.getAssets().open("buttons.png");
|
|
BitmapFactory.Options options = new BitmapFactory.Options();
|
|
options.inSampleSize = sS;
|
|
Bitmap image = BitmapFactory.decodeStream(bitmap, null, options);
|
|
bitmap.close();
|
|
bitmap = null;
|
|
System.gc();
|
|
Matrix matrix = new Matrix();
|
|
matrix.postScale(32, 32);
|
|
Bitmap resizedBitmap = Bitmap.createBitmap(image, x, y, 64 / sS,
|
|
64 / sS, matrix, true);
|
|
BitmapDrawable bmd = new BitmapDrawable(resizedBitmap);
|
|
image.recycle();
|
|
image = null;
|
|
return bmd;
|
|
} catch (IOException e1) {
|
|
e1.printStackTrace();
|
|
} catch (OutOfMemoryError E) {
|
|
if (sS == 2) {
|
|
sS = 4;
|
|
return getButtonImage(x, y);
|
|
} else {
|
|
E.printStackTrace();
|
|
Runtime.getRuntime().freeMemory();
|
|
System.gc();
|
|
}
|
|
}
|
|
return parentActivity.getResources().getDrawable(R.drawable.input);
|
|
}
|
|
|
|
private void getKeyCode(final String button, final TextView output) {
|
|
int keyCode = mPrefs.getInt(button + player, -1);
|
|
if (keyCode != -1) {
|
|
String label = output.getText().toString();
|
|
if (label.contains(":")) {
|
|
label = label.substring(0, label.indexOf(":"));
|
|
}
|
|
output.setText(label + ": " + String.valueOf(keyCode));
|
|
}
|
|
}
|
|
|
|
private void selectController() {
|
|
AlertDialog.Builder builder = new AlertDialog.Builder(parentActivity);
|
|
builder.setTitle(getString(R.string.select_controller_title));
|
|
builder.setMessage(getString(R.string.select_controller_message,
|
|
String.valueOf(player)));
|
|
builder.setNegativeButton("Cancel",
|
|
new DialogInterface.OnClickListener() {
|
|
public void onClick(DialogInterface dialog, int which) {
|
|
dialog.dismiss();
|
|
}
|
|
});
|
|
builder.setOnKeyListener(new Dialog.OnKeyListener() {
|
|
public boolean onKey(DialogInterface dialog, int keyCode,
|
|
KeyEvent event) {
|
|
mPrefs.edit()
|
|
.putInt("controller" + player, event.getDeviceId())
|
|
.commit();
|
|
dialog.dismiss();
|
|
return true;
|
|
}
|
|
});
|
|
builder.create();
|
|
builder.show();
|
|
}
|
|
|
|
private void mapKeyCode(final String button, final TextView output) {
|
|
|
|
AlertDialog.Builder builder = new AlertDialog.Builder(parentActivity);
|
|
builder.setTitle(getString(R.string.map_keycode_title));
|
|
builder.setMessage(getString(R.string.map_keycode_message,
|
|
button.replace("_", " ")));
|
|
builder.setNegativeButton("Cancel",
|
|
new DialogInterface.OnClickListener() {
|
|
public void onClick(DialogInterface dialog, int which) {
|
|
dialog.dismiss();
|
|
}
|
|
});
|
|
builder.setOnKeyListener(new Dialog.OnKeyListener() {
|
|
public boolean onKey(DialogInterface dialog, int keyCode,
|
|
KeyEvent event) {
|
|
int value = mapButton(keyCode, event, button);
|
|
dialog.dismiss();
|
|
if (value != -1) {
|
|
String label = output.getText().toString();
|
|
if (label.contains(":")) {
|
|
label = label.substring(0, label.indexOf(":"));
|
|
}
|
|
output.setText(label + ": " + String.valueOf(value));
|
|
return true;
|
|
} else {
|
|
return false;
|
|
}
|
|
|
|
}
|
|
});
|
|
builder.create();
|
|
builder.show();
|
|
}
|
|
|
|
private void remKeyCode(final String button, final TextView output) {
|
|
mPrefs.edit().remove(button + player).commit();
|
|
String label = output.getText().toString();
|
|
if (label.contains(":")) {
|
|
label = label.substring(0, label.indexOf(":"));
|
|
}
|
|
output.setText(label);
|
|
}
|
|
|
|
private int mapButton(int keyCode, KeyEvent event, String button) {
|
|
if (keyCode == KeyEvent.KEYCODE_BACK)
|
|
return -1;
|
|
|
|
mPrefs.edit().putInt(button + player, keyCode).commit();
|
|
|
|
return keyCode;
|
|
}
|
|
}
|