Moar Android configuration menus

This commit is contained in:
Aaron Culliney 2015-07-25 14:51:37 -07:00
parent 9ac6448593
commit fcd367bd9e
6 changed files with 526 additions and 79 deletions

View File

@ -41,13 +41,18 @@ public class Apple2AudioSettingsMenu implements Apple2MenuView {
enum SETTINGS {
SPEAKER_ENABLED {
@Override public String getTitle(Apple2Activity activity) {
@Override
public String getTitle(Apple2Activity activity) {
return activity.getResources().getString(R.string.speaker_enable);
}
@Override public String getSummary(Apple2Activity activity) {
@Override
public String getSummary(Apple2Activity activity) {
return activity.getResources().getString(R.string.speaker_enable_summary);
}
@Override public View getView(final Apple2Activity activity, View convertView) {
@Override
public View getView(final Apple2Activity activity, View convertView) {
convertView = _basicView(activity, this, convertView);
CheckBox cb = _addCheckbox(activity, this, convertView, true);
cb.setEnabled(false);
@ -55,22 +60,27 @@ public class Apple2AudioSettingsMenu implements Apple2MenuView {
}
},
SPEAKER_VOLUME {
@Override public String getTitle(Apple2Activity activity) {
@Override
public String getTitle(Apple2Activity activity) {
return activity.getResources().getString(R.string.speaker_volume);
}
@Override public String getSummary(Apple2Activity activity) {
@Override
public String getSummary(Apple2Activity activity) {
return activity.getResources().getString(R.string.speaker_volume_summary);
}
@Override public View getView(final Apple2Activity activity, View convertView) {
LayoutInflater inflater = (LayoutInflater)activity.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
@Override
public View getView(final Apple2Activity activity, View convertView) {
LayoutInflater inflater = (LayoutInflater) activity.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
convertView = inflater.inflate(R.layout.a2preference_slider, null, false);
TextView tv = (TextView)convertView.findViewById(R.id.a2preference_slider_summary);
TextView tv = (TextView) convertView.findViewById(R.id.a2preference_slider_summary);
tv.setText(getSummary(activity));
final TextView seekBarValue = (TextView)convertView.findViewById(R.id.a2preference_slider_seekBarValue);
final TextView seekBarValue = (TextView) convertView.findViewById(R.id.a2preference_slider_seekBarValue);
SeekBar sb = (SeekBar)convertView.findViewById(R.id.a2preference_slider_seekBar);
SeekBar sb = (SeekBar) convertView.findViewById(R.id.a2preference_slider_seekBar);
sb.setOnSeekBarChangeListener(new SeekBar.OnSeekBarChangeListener() {
@Override
public void onProgressChanged(SeekBar seekBar, int progress, boolean fromUser) {
@ -123,22 +133,27 @@ public class Apple2AudioSettingsMenu implements Apple2MenuView {
}
},
MOCKINGBOARD_VOLUME {
@Override public String getTitle(Apple2Activity activity) {
@Override
public String getTitle(Apple2Activity activity) {
return activity.getResources().getString(R.string.mockingboard_volume);
}
@Override public String getSummary(Apple2Activity activity) {
@Override
public String getSummary(Apple2Activity activity) {
return activity.getResources().getString(R.string.mockingboard_volume_summary);
}
@Override public View getView(final Apple2Activity activity, View convertView) {
LayoutInflater inflater = (LayoutInflater)activity.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
@Override
public View getView(final Apple2Activity activity, View convertView) {
LayoutInflater inflater = (LayoutInflater) activity.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
convertView = inflater.inflate(R.layout.a2preference_slider, null, false);
TextView tv = (TextView)convertView.findViewById(R.id.a2preference_slider_summary);
TextView tv = (TextView) convertView.findViewById(R.id.a2preference_slider_summary);
tv.setText(getSummary(activity));
final TextView seekBarValue = (TextView)convertView.findViewById(R.id.a2preference_slider_seekBarValue);
final TextView seekBarValue = (TextView) convertView.findViewById(R.id.a2preference_slider_seekBarValue);
SeekBar sb = (SeekBar)convertView.findViewById(R.id.a2preference_slider_seekBar);
SeekBar sb = (SeekBar) convertView.findViewById(R.id.a2preference_slider_seekBar);
sb.setOnSeekBarChangeListener(new SeekBar.OnSeekBarChangeListener() {
@Override
public void onProgressChanged(SeekBar seekBar, int progress, boolean fromUser) {
@ -167,30 +182,38 @@ public class Apple2AudioSettingsMenu implements Apple2MenuView {
}
},
ADVANCED_SEPARATOR {
@Override public String getTitle(Apple2Activity activity) {
@Override
public String getTitle(Apple2Activity activity) {
return activity.getResources().getString(R.string.settings_advanced);
}
@Override public String getSummary(Apple2Activity activity) {
@Override
public String getSummary(Apple2Activity activity) {
return activity.getResources().getString(R.string.settings_advanced_summary);
}
},
AUDIO_LATENCY {
@Override public String getTitle(Apple2Activity activity) {
@Override
public String getTitle(Apple2Activity activity) {
return activity.getResources().getString(R.string.audio_latency);
}
@Override public String getSummary(Apple2Activity activity) {
@Override
public String getSummary(Apple2Activity activity) {
return activity.getResources().getString(R.string.audio_latency_summary);
}
@Override public View getView(final Apple2Activity activity, View convertView) {
LayoutInflater inflater = (LayoutInflater)activity.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
@Override
public View getView(final Apple2Activity activity, View convertView) {
LayoutInflater inflater = (LayoutInflater) activity.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
convertView = inflater.inflate(R.layout.a2preference_slider, null, false);
TextView tv = (TextView)convertView.findViewById(R.id.a2preference_slider_summary);
TextView tv = (TextView) convertView.findViewById(R.id.a2preference_slider_summary);
tv.setText(getSummary(activity));
final TextView seekBarValue = (TextView)convertView.findViewById(R.id.a2preference_slider_seekBarValue);
final TextView seekBarValue = (TextView) convertView.findViewById(R.id.a2preference_slider_seekBarValue);
final SeekBar sb = (SeekBar)convertView.findViewById(R.id.a2preference_slider_seekBar);
final SeekBar sb = (SeekBar) convertView.findViewById(R.id.a2preference_slider_seekBar);
sb.setOnSeekBarChangeListener(new SeekBar.OnSeekBarChangeListener() {
@Override
public void onProgressChanged(SeekBar seekBar, int progress, boolean fromUser) {
@ -202,7 +225,7 @@ public class Apple2AudioSettingsMenu implements Apple2MenuView {
progress = 1;
sb.setProgress(progress);
}
float latencySecs = (float)progress / Apple2Preferences.AUDIO_LATENCY_NUM_CHOICES;
float latencySecs = (float) progress / Apple2Preferences.AUDIO_LATENCY_NUM_CHOICES;
seekBarValue.setText("" + latencySecs);
Apple2Preferences.AUDIO_LATENCY.saveFloat(activity, latencySecs);
}
@ -226,14 +249,14 @@ public class Apple2AudioSettingsMenu implements Apple2MenuView {
}
};
private static View _basicView(Apple2Activity activity, SETTINGS setting, View convertView) {
TextView tv = (TextView)convertView.findViewById(R.id.a2preference_title);
private static View _basicView(Apple2Activity activity, SETTINGS setting, View convertView) {
TextView tv = (TextView) convertView.findViewById(R.id.a2preference_title);
tv.setText(setting.getTitle(activity));
tv = (TextView)convertView.findViewById(R.id.a2preference_summary);
tv = (TextView) convertView.findViewById(R.id.a2preference_summary);
tv.setText(setting.getSummary(activity));
LinearLayout layout = (LinearLayout)convertView.findViewById(R.id.a2preference_widget_frame);
LinearLayout layout = (LinearLayout) convertView.findViewById(R.id.a2preference_widget_frame);
if (layout.getChildCount() > 0) {
// layout cells appear to be reused when scrolling into view ... make sure we start with clear hierarchy
layout.removeAllViews();
@ -241,18 +264,20 @@ public class Apple2AudioSettingsMenu implements Apple2MenuView {
return convertView;
}
private static ImageView _addPopupIcon(Apple2Activity activity, SETTINGS setting, View convertView) {
ImageView imageView = new ImageView(activity);
Drawable drawable = activity.getResources().getDrawable(android.R.drawable.ic_menu_edit);
imageView.setImageDrawable(drawable);
LinearLayout layout = (LinearLayout)convertView.findViewById(R.id.a2preference_widget_frame);
LinearLayout layout = (LinearLayout) convertView.findViewById(R.id.a2preference_widget_frame);
layout.addView(imageView);
return imageView;
}
private static CheckBox _addCheckbox(Apple2Activity activity, SETTINGS setting, View convertView, boolean isChecked) {
CheckBox checkBox = new CheckBox(activity);
checkBox.setChecked(isChecked);
LinearLayout layout = (LinearLayout)convertView.findViewById(R.id.a2preference_widget_frame);
LinearLayout layout = (LinearLayout) convertView.findViewById(R.id.a2preference_widget_frame);
layout.addView(checkBox);
return checkBox;
}
@ -260,6 +285,7 @@ public class Apple2AudioSettingsMenu implements Apple2MenuView {
public static final int size = SETTINGS.values().length;
public abstract String getTitle(Apple2Activity activity);
public abstract String getSummary(Apple2Activity activity);
public void handleSelection(Apple2AudioSettingsMenu settingsMenu, boolean isChecked) {
@ -281,13 +307,13 @@ public class Apple2AudioSettingsMenu implements Apple2MenuView {
}
private void setup() {
LayoutInflater inflater = (LayoutInflater)mActivity.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
LayoutInflater inflater = (LayoutInflater) mActivity.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
mSettingsView = inflater.inflate(R.layout.activity_settings, null, false);
TextView title = (TextView)mSettingsView.findViewById(R.id.header_settings);
TextView title = (TextView) mSettingsView.findViewById(R.id.header_settings);
title.setText(R.string.settings_audio);
ListView settingsList = (ListView)mSettingsView.findViewById(R.id.listView_settings);
ListView settingsList = (ListView) mSettingsView.findViewById(R.id.listView_settings);
settingsList.setEnabled(true);
// This is a bit of a hack ... we're not using the ArrayAdapter as intended here, simply piggy-backing off its call to getView() to supply a completely custom view. The arguably better way would be to create a custom Apple2SettingsAdapter or something akin to that...

View File

@ -0,0 +1,265 @@
/*
* Apple // emulator for *nix
*
* This software package is subject to the GNU General Public License
* version 2 or later (your choice) as published by the Free Software
* Foundation.
*
* THERE ARE NO WARRANTIES WHATSOEVER.
*
*/
package org.deadc0de.apple2ix;
import android.app.AlertDialog;
import android.content.Context;
import android.content.DialogInterface;
import android.graphics.drawable.Drawable;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.AdapterView;
import android.widget.ArrayAdapter;
import android.widget.CheckBox;
import android.widget.CheckedTextView;
import android.widget.CompoundButton;
import android.widget.FrameLayout;
import android.widget.ImageView;
import android.widget.LinearLayout;
import android.widget.ListView;
import android.widget.SeekBar;
import android.widget.TextView;
public class Apple2InputSettingsMenu implements Apple2MenuView {
private final static String TAG = "Apple2InputSettingsMenu";
private Apple2Activity mActivity = null;
private View mSettingsView = null;
public Apple2InputSettingsMenu(Apple2Activity activity) {
mActivity = activity;
setup();
}
enum SETTINGS {
FIRST_INPUT {
@Override
public String getTitle(Apple2Activity activity) {
return activity.getResources().getString(R.string.input_configure_first_title);
}
@Override
public String getSummary(Apple2Activity activity) {
return activity.getResources().getString(R.string.input_configure_first_summary);
}
@Override
public View getView(final Apple2Activity activity, View convertView) {
convertView = _basicView(activity, this, convertView);
_addPopupIcon(activity, this, convertView);
return convertView;
}
@Override
public void handleSelection(final Apple2Activity activity, final Apple2InputSettingsMenu settingsMenu, boolean isChecked) {
AlertDialog.Builder builder = new AlertDialog.Builder(activity).setIcon(R.drawable.ic_launcher).setCancelable(true).setTitle(R.string.input_configure_first_title);
builder.setNegativeButton(R.string.cancel, new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
dialog.dismiss();
}
});
String[] touch_choices = new String[]{
activity.getResources().getString(R.string.joystick),
activity.getResources().getString(R.string.keyboard),
};
final int checkedPosition = Apple2Preferences.FIRST_TOUCH_DEVICE.intValue(activity) - 1;
final ArrayAdapter<String> adapter = new ArrayAdapter<String>(activity, android.R.layout.select_dialog_singlechoice, touch_choices) {
@Override
public View getView(int position, View convertView, ViewGroup parent) {
View view = super.getView(position, convertView, parent);
CheckedTextView ctv = (CheckedTextView) view.findViewById(android.R.id.text1);
ctv.setChecked(position == checkedPosition);
return view;
}
};
builder.setAdapter(adapter, new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int color) {
Apple2Preferences.FIRST_TOUCH_DEVICE.saveTouchDevice(activity, Apple2Preferences.TouchDevice.values()[color + 1]);
dialog.dismiss();
}
});
builder.show();
}
},
JOYSTICK_CONFIGURE {
@Override
public String getTitle(Apple2Activity activity) {
return activity.getResources().getString(R.string.joystick_configure);
}
@Override
public String getSummary(Apple2Activity activity) {
return activity.getResources().getString(R.string.joystick_configure_summary);
}
@Override
public void handleSelection(final Apple2Activity activity, final Apple2InputSettingsMenu settingsMenu, boolean isChecked) {
//new Apple2JoystickSettingsMenu().show();
}
},
KEYBOARD_CONFIGURE {
@Override
public String getTitle(Apple2Activity activity) {
return activity.getResources().getString(R.string.keyboard_configure);
}
@Override
public String getSummary(Apple2Activity activity) {
return activity.getResources().getString(R.string.keyboard_configure_summary);
}
@Override
public void handleSelection(final Apple2Activity activity, final Apple2InputSettingsMenu settingsMenu, boolean isChecked) {
//new Apple2KeyboardSettingsMenu().show();
}
};
private static View _basicView(Apple2Activity activity, SETTINGS setting, View convertView) {
TextView tv = (TextView) convertView.findViewById(R.id.a2preference_title);
tv.setText(setting.getTitle(activity));
tv = (TextView) convertView.findViewById(R.id.a2preference_summary);
tv.setText(setting.getSummary(activity));
LinearLayout layout = (LinearLayout) convertView.findViewById(R.id.a2preference_widget_frame);
if (layout.getChildCount() > 0) {
// layout cells appear to be reused when scrolling into view ... make sure we start with clear hierarchy
layout.removeAllViews();
}
return convertView;
}
private static ImageView _addPopupIcon(Apple2Activity activity, SETTINGS setting, View convertView) {
ImageView imageView = new ImageView(activity);
Drawable drawable = activity.getResources().getDrawable(android.R.drawable.ic_menu_edit);
imageView.setImageDrawable(drawable);
LinearLayout layout = (LinearLayout) convertView.findViewById(R.id.a2preference_widget_frame);
layout.addView(imageView);
return imageView;
}
private static CheckBox _addCheckbox(Apple2Activity activity, SETTINGS setting, View convertView, boolean isChecked) {
CheckBox checkBox = new CheckBox(activity);
checkBox.setChecked(isChecked);
LinearLayout layout = (LinearLayout) convertView.findViewById(R.id.a2preference_widget_frame);
layout.addView(checkBox);
return checkBox;
}
public static final int size = SETTINGS.values().length;
public abstract String getTitle(Apple2Activity activity);
public abstract String getSummary(Apple2Activity activity);
public void handleSelection(Apple2Activity activity, Apple2InputSettingsMenu settingsMenu, boolean isChecked) {
/* ... */
}
public View getView(Apple2Activity activity, View convertView) {
return _basicView(activity, this, convertView);
}
public static String[] titles(Apple2Activity activity) {
String[] titles = new String[size];
int i = 0;
for (SETTINGS setting : values()) {
titles[i++] = setting.getTitle(activity);
}
return titles;
}
}
private void setup() {
LayoutInflater inflater = (LayoutInflater) mActivity.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
mSettingsView = inflater.inflate(R.layout.activity_settings, null, false);
TextView title = (TextView) mSettingsView.findViewById(R.id.header_settings);
title.setText(R.string.settings_audio);
ListView settingsList = (ListView) mSettingsView.findViewById(R.id.listView_settings);
settingsList.setEnabled(true);
// This is a bit of a hack ... we're not using the ArrayAdapter as intended here, simply piggy-backing off its call to getView() to supply a completely custom view. The arguably better way would be to create a custom Apple2SettingsAdapter or something akin to that...
ArrayAdapter<?> adapter = new ArrayAdapter<String>(mActivity, R.layout.a2preference, R.id.a2preference_title, SETTINGS.titles(mActivity)) {
@Override
public boolean areAllItemsEnabled() {
return true;
}
@Override
public boolean isEnabled(int position) {
if (position < 0 || position >= SETTINGS.size) {
throw new ArrayIndexOutOfBoundsException();
}
return true;
}
@Override
public View getView(int position, View convertView, ViewGroup parent) {
//View view = super.getView(position, convertView, parent);
// ^^^ WHOA ... this is catching an NPE deep in AOSP code on the second time loading the audio menu, WTF?
// Methinks it is related to the hack of loading a completely different R.layout.something for certain views...
View view = convertView != null ? convertView : super.getView(position, null, parent);
SETTINGS setting = SETTINGS.values()[position];
return setting.getView(mActivity, view);
}
};
settingsList.setAdapter(adapter);
settingsList.setOnItemClickListener(new AdapterView.OnItemClickListener() {
@Override
public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
SETTINGS setting = SETTINGS.values()[position];
LinearLayout layout = (LinearLayout) view.findViewById(R.id.a2preference_widget_frame);
if (layout == null) {
return;
}
View childView = layout.getChildAt(0);
boolean selected = false;
if (childView != null && childView instanceof CheckBox) {
CheckBox checkBox = (CheckBox) childView;
checkBox.setChecked(!checkBox.isChecked());
selected = checkBox.isChecked();
}
setting.handleSelection(mActivity, Apple2InputSettingsMenu.this, selected);
}
});
}
public void show() {
if (isShowing()) {
return;
}
mActivity.pushApple2View(this);
}
public void dismiss() {
mActivity.popApple2View(this);
}
public boolean isShowing() {
return mSettingsView.isShown();
}
public View getView() {
return mSettingsView;
}
}

View File

@ -18,23 +18,30 @@ import android.util.Log;
public enum Apple2Preferences {
PREFS_CONFIGURED {
@Override public void load(Apple2Activity activity) {
@Override
public void load(Apple2Activity activity) {
// ...
}
@Override public void saveBoolean(Apple2Activity activity, boolean ignored) {
@Override
public void saveBoolean(Apple2Activity activity, boolean ignored) {
activity.getPreferences(Context.MODE_PRIVATE).edit().putBoolean(toString(), true).apply();
}
},
HIRES_COLOR {
@Override public void load(Apple2Activity activity) {
@Override
public void load(Apple2Activity activity) {
nativeSetColor(intValue(activity));
}
@Override public int intValue(Apple2Activity activity) {
@Override
public int intValue(Apple2Activity activity) {
return activity.getPreferences(Context.MODE_PRIVATE).getInt(toString(), HiresColor.INTERPOLATED.ordinal());
}
},
SPEAKER_ENABLED {
@Override public void load(Apple2Activity activity) {
@Override
public void load(Apple2Activity activity) {
boolean enabled = booleanValue(activity);
boolean result = nativeSetSpeakerEnabled(enabled);
if (enabled && !result) {
@ -42,20 +49,26 @@ public enum Apple2Preferences {
activity.getPreferences(Context.MODE_PRIVATE).edit().putBoolean(toString(), false).apply();
}
}
@Override public boolean booleanValue(Apple2Activity activity) {
@Override
public boolean booleanValue(Apple2Activity activity) {
return activity.getPreferences(Context.MODE_PRIVATE).getBoolean(toString(), true);
}
},
SPEAKER_VOLUME {
@Override public void load(Apple2Activity activity) {
@Override
public void load(Apple2Activity activity) {
nativeSetSpeakerVolume(intValue(activity));
}
@Override public int intValue(Apple2Activity activity) {
@Override
public int intValue(Apple2Activity activity) {
return activity.getPreferences(Context.MODE_PRIVATE).getInt(toString(), Volume.MEDIUM.ordinal());
}
},
MOCKINGBOARD_ENABLED {
@Override public void load(Apple2Activity activity) {
@Override
public void load(Apple2Activity activity) {
boolean enabled = booleanValue(activity);
boolean result = nativeSetMockingboardEnabled(enabled);
if (enabled && !result) {
@ -65,18 +78,24 @@ public enum Apple2Preferences {
}
},
MOCKINGBOARD_VOLUME {
@Override public void load(Apple2Activity activity) {
@Override
public void load(Apple2Activity activity) {
nativeSetMockingboardVolume(intValue(activity));
}
@Override public int intValue(Apple2Activity activity) {
@Override
public int intValue(Apple2Activity activity) {
return activity.getPreferences(Context.MODE_PRIVATE).getInt(toString(), Volume.MEDIUM.ordinal());
}
},
AUDIO_LATENCY {
@Override public void load(Apple2Activity activity) {
@Override
public void load(Apple2Activity activity) {
nativeSetAudioLatency(floatValue(activity));
}
@Override public float floatValue(Apple2Activity activity) {
@Override
public float floatValue(Apple2Activity activity) {
float defaultLatency = 0.f;
if (defaultLatency == 0.f) {
@ -92,6 +111,17 @@ public enum Apple2Preferences {
return activity.getPreferences(Context.MODE_PRIVATE).getFloat(toString(), defaultLatency);
}
},
FIRST_TOUCH_DEVICE {
@Override
public void load(Apple2Activity activity) {
nativeSetDefaultTouchDevice(intValue(activity));
}
@Override
public int intValue(Apple2Activity activity) {
return activity.getPreferences(Context.MODE_PRIVATE).getInt(toString(), TouchDevice.KEYBOARD.ordinal());
}
};
public enum HiresColor {
@ -115,11 +145,23 @@ public enum Apple2Preferences {
MAX(10),
ELEVEN(11);
private int vol;
Volume(int vol) {
this.vol = vol;
}
}
public enum TouchDevice {
NONE(0),
JOYSTICK(1),
KEYBOARD(2);
private int dev;
TouchDevice(int dev) {
this.dev = dev;
}
}
protected abstract void load(Apple2Activity activity);
protected void warnError(Apple2Activity activity, int titleId, int mesgId) {
@ -141,23 +183,32 @@ public enum Apple2Preferences {
activity.getPreferences(Context.MODE_PRIVATE).edit().putBoolean(toString(), value).apply();
load(activity);
}
public void saveInt(Apple2Activity activity, int value) {
activity.getPreferences(Context.MODE_PRIVATE).edit().putInt(toString(), value).apply();
load(activity);
}
public void saveFloat(Apple2Activity activity, float value) {
activity.getPreferences(Context.MODE_PRIVATE).edit().putFloat(toString(), value).apply();
load(activity);
}
public void saveHiresColor(Apple2Activity activity, HiresColor value) {
activity.getPreferences(Context.MODE_PRIVATE).edit().putInt(toString(), value.ordinal()).apply();
load(activity);
}
public void saveVolume(Apple2Activity activity, Volume value) {
activity.getPreferences(Context.MODE_PRIVATE).edit().putInt(toString(), value.ordinal()).apply();
load(activity);
}
public void saveTouchDevice(Apple2Activity activity, TouchDevice value) {
activity.getPreferences(Context.MODE_PRIVATE).edit().putInt(toString(), value.ordinal()).apply();
load(activity);
}
// accessors
public boolean booleanValue(Apple2Activity activity) {
@ -184,11 +235,20 @@ public enum Apple2Preferences {
}
private static native void nativeEnableTouchJoystick(boolean enabled);
private static native void nativeEnableTiltJoystick(boolean enabled);
private static native void nativeSetColor(int color);
private static native boolean nativeSetSpeakerEnabled(boolean enabled);
private static native void nativeSetSpeakerVolume(int volume);
private static native boolean nativeSetMockingboardEnabled(boolean enabled);
private static native void nativeSetMockingboardVolume(int volume);
private static native void nativeSetAudioLatency(float latencySecs);
private static native void nativeSetDefaultTouchDevice(int device);
}

View File

@ -24,6 +24,7 @@ import android.view.ViewGroup;
import android.widget.AdapterView;
import android.widget.ArrayAdapter;
import android.widget.CheckBox;
import android.widget.CheckedTextView;
import android.widget.ImageView;
import android.widget.LinearLayout;
import android.widget.ListView;
@ -42,40 +43,56 @@ public class Apple2SettingsMenu implements Apple2MenuView {
}
enum SETTINGS {
JOYSTICK_CONFIGURE {
@Override public String getTitle(Apple2Activity activity) {
return activity.getResources().getString(R.string.joystick_configure);
INPUT_CONFIGURE {
@Override
public String getTitle(Apple2Activity activity) {
return activity.getResources().getString(R.string.input_configure);
}
@Override public String getSummary(Apple2Activity activity) {
return activity.getResources().getString(R.string.joystick_configure_summary);
@Override
public String getSummary(Apple2Activity activity) {
return activity.getResources().getString(R.string.input_configure_summary);
}
@Override public void handleSelection(Apple2Activity activity, Apple2SettingsMenu settingsMenu, boolean isChecked) {
//settingsMenu.mJoystickSettings.show();
@Override
public void handleSelection(Apple2Activity activity, Apple2SettingsMenu settingsMenu, boolean isChecked) {
new Apple2InputSettingsMenu(activity).show();
}
},
AUDIO_CONFIGURE {
@Override public String getTitle(Apple2Activity activity) {
@Override
public String getTitle(Apple2Activity activity) {
return activity.getResources().getString(R.string.audio_configure);
}
@Override public String getSummary(Apple2Activity activity) {
@Override
public String getSummary(Apple2Activity activity) {
return activity.getResources().getString(R.string.audio_configure_summary);
}
@Override public void handleSelection(Apple2Activity activity, Apple2SettingsMenu settingsMenu, boolean isChecked) {
@Override
public void handleSelection(Apple2Activity activity, Apple2SettingsMenu settingsMenu, boolean isChecked) {
new Apple2AudioSettingsMenu(activity).show();
}
},
VIDEO_CONFIGURE {
@Override public String getTitle(Apple2Activity activity) {
@Override
public String getTitle(Apple2Activity activity) {
return activity.getResources().getString(R.string.video_configure);
}
@Override public String getSummary(Apple2Activity activity) {
@Override
public String getSummary(Apple2Activity activity) {
return activity.getResources().getString(R.string.video_configure_summary);
}
@Override public View getView(Apple2Activity activity, View convertView) {
@Override
public View getView(Apple2Activity activity, View convertView) {
convertView = _basicView(activity, this, convertView);
_addPopupIcon(activity, this, convertView);
return convertView;
}
@Override
public void handleSelection(Apple2Activity activity, final Apple2SettingsMenu settingsMenu, boolean isChecked) {
AlertDialog.Builder builder = new AlertDialog.Builder(settingsMenu.mActivity).setIcon(R.drawable.ic_launcher).setCancelable(true).setTitle(R.string.video_configure);
@ -91,7 +108,16 @@ public class Apple2SettingsMenu implements Apple2MenuView {
settingsMenu.mActivity.getResources().getString(R.string.color_color),
settingsMenu.mActivity.getResources().getString(R.string.color_interpolated),
};
final ArrayAdapter<String> adapter = new ArrayAdapter<String>(settingsMenu.mActivity, android.R.layout.select_dialog_singlechoice, color_choices);
final int checkedPosition = Apple2Preferences.HIRES_COLOR.intValue(activity);
final ArrayAdapter<String> adapter = new ArrayAdapter<String>(settingsMenu.mActivity, android.R.layout.select_dialog_singlechoice, color_choices) {
@Override
public View getView(int position, View convertView, ViewGroup parent) {
View view = super.getView(position, convertView, parent);
CheckedTextView ctv = (CheckedTextView) view.findViewById(android.R.id.text1);
ctv.setChecked(position == checkedPosition);
return view;
}
};
builder.setAdapter(adapter, new DialogInterface.OnClickListener() {
@Override
@ -104,28 +130,56 @@ public class Apple2SettingsMenu implements Apple2MenuView {
}
},
ABOUT {
@Override public String getTitle(Apple2Activity activity) {
@Override
public String getTitle(Apple2Activity activity) {
return activity.getResources().getString(R.string.about_title);
}
@Override public String getSummary(Apple2Activity activity) {
@Override
public String getSummary(Apple2Activity activity) {
return activity.getResources().getString(R.string.about_summary);
}
@Override
public void handleSelection(Apple2Activity activity, final Apple2SettingsMenu settingsMenu, boolean isChecked) {
String url = "http://github.com/mauiaaron/apple2";
Intent i = new Intent(Intent.ACTION_VIEW);
i.setData(Uri.parse(url));
activity.startActivity(i); }
activity.startActivity(i);
}
},
RESET_PREFERENCES {
@Override
public String getTitle(Apple2Activity activity) {
return activity.getResources().getString(R.string.preferences_reset_title);
}
@Override
public String getSummary(Apple2Activity activity) {
return activity.getResources().getString(R.string.preferences_reset_summary);
}
@Override
public void handleSelection(final Apple2Activity activity, final Apple2SettingsMenu settingsMenu, boolean isChecked) {
AlertDialog.Builder builder = new AlertDialog.Builder(activity).setIcon(R.drawable.ic_launcher).setCancelable(true).setTitle(R.string.preferences_reset_really).setMessage(R.string.preferences_reset_warning).setPositiveButton(R.string.ok, new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
dialog.dismiss();
Apple2Preferences.resetPreferences(activity);
}
}).setNegativeButton(R.string.no, null);
builder.show();
}
};
private static View _basicView(Apple2Activity activity, SETTINGS setting, View convertView) {
TextView tv = (TextView)convertView.findViewById(R.id.a2preference_title);
private static View _basicView(Apple2Activity activity, SETTINGS setting, View convertView) {
TextView tv = (TextView) convertView.findViewById(R.id.a2preference_title);
tv.setText(setting.getTitle(activity));
tv = (TextView)convertView.findViewById(R.id.a2preference_summary);
tv = (TextView) convertView.findViewById(R.id.a2preference_summary);
tv.setText(setting.getSummary(activity));
LinearLayout layout = (LinearLayout)convertView.findViewById(R.id.a2preference_widget_frame);
LinearLayout layout = (LinearLayout) convertView.findViewById(R.id.a2preference_widget_frame);
if (layout.getChildCount() > 0) {
// layout cells appear to be reused when scrolling into view ... make sure we start with clear hierarchy
layout.removeAllViews();
@ -133,18 +187,20 @@ public class Apple2SettingsMenu implements Apple2MenuView {
return convertView;
}
private static ImageView _addPopupIcon(Apple2Activity activity, SETTINGS setting, View convertView) {
ImageView imageView = new ImageView(activity);
Drawable drawable = activity.getResources().getDrawable(android.R.drawable.ic_menu_edit);
imageView.setImageDrawable(drawable);
LinearLayout layout = (LinearLayout)convertView.findViewById(R.id.a2preference_widget_frame);
LinearLayout layout = (LinearLayout) convertView.findViewById(R.id.a2preference_widget_frame);
layout.addView(imageView);
return imageView;
}
private static CheckBox _addCheckbox(Apple2Activity activity, SETTINGS setting, View convertView, boolean isChecked) {
CheckBox checkBox = new CheckBox(activity);
checkBox.setChecked(isChecked);
LinearLayout layout = (LinearLayout)convertView.findViewById(R.id.a2preference_widget_frame);
LinearLayout layout = (LinearLayout) convertView.findViewById(R.id.a2preference_widget_frame);
layout.addView(checkBox);
return checkBox;
}
@ -152,7 +208,9 @@ public class Apple2SettingsMenu implements Apple2MenuView {
public static final int size = SETTINGS.values().length;
public abstract String getTitle(Apple2Activity activity);
public abstract String getSummary(Apple2Activity activity);
public abstract void handleSelection(Apple2Activity activity, Apple2SettingsMenu settingsMenu, boolean isChecked);
public View getView(Apple2Activity activity, View convertView) {
@ -171,10 +229,10 @@ public class Apple2SettingsMenu implements Apple2MenuView {
private void setup() {
LayoutInflater inflater = (LayoutInflater)mActivity.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
LayoutInflater inflater = (LayoutInflater) mActivity.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
mSettingsView = inflater.inflate(R.layout.activity_settings, null, false);
ListView settingsList = (ListView)mSettingsView.findViewById(R.id.listView_settings);
ListView settingsList = (ListView) mSettingsView.findViewById(R.id.listView_settings);
settingsList.setEnabled(true);
ArrayAdapter<?> adapter = new ArrayAdapter<String>(mActivity, R.layout.a2preference, R.id.a2preference_title, SETTINGS.titles(mActivity)) {

View File

@ -21,16 +21,20 @@
<string name="disk_read_write">Read/write</string>
<string name="header_disks">Insert disk:</string>
<string name="joystick">Joystick</string>
<string name="joystick_configure">Configure emulated joysticks…</string>
<string name="input_configure">Configure input devices…</string>
<string name="input_configure_summary">Keyboard, joystick, etc</string>
<string name="input_configure_first_title">First touch device</string>
<string name="input_configure_first_summary">Touch device enabled on launch</string>
<string name="input_first_joystick">Touch joystick</string>
<string name="input_first_keyboard">Touch keyboard</string>
<string name="joystick_configure">Configure joysticks…</string>
<string name="joystick_configure_summary">Touch/tilt, axis and buttons, etc</string>
<string name="joystick_enable">Enable emulated joystick</string>
<string name="joystick_keyA">Key Joystick 1</string>
<string name="joystick_keyB">Key Joystick 2</string>
<string name="keyboard">Keyboard</string>
<string name="keyboard_doubletap">Double-tap shows keyboard</string>
<string name="keyboard_doubletap_summary">Uncheck to disable keyboard input</string>
<string name="keyboard_singletap">Single-tap shows main menu</string>
<string name="keyboard_singletap_summary">(If unchecked, main menu still available from back key)</string>
<string name="keyboard_configure">Configure keyboard…</string>
<string name="keyboard_configure_summary">Transparency, fading, custom keys</string>
<string name="max">Max</string>
<string name="menu_disks">Load disk image…</string>
<string name="menu_disks_summary">Insert a Disk ][ image file</string>
@ -44,6 +48,10 @@
<string name="mockingboard_volume_summary">Set the Mockingboard(s) volume</string>
<string name="no">No</string>
<string name="ok">OK</string>
<string name="preferences_reset_title">Reset preferences</string>
<string name="preferences_reset_summary">Reset preferences to defaults</string>
<string name="preferences_reset_really">Really reset?</string>
<string name="preferences_reset_warning">You will lose your settings</string>
<string name="quit">Quit emulator…</string>
<string name="quit_summary"></string>
<string name="quit_really">Quit emulator?</string>

View File

@ -13,6 +13,14 @@
#include <jni.h>
typedef enum AndroidTouchDevice_t {
// Maps to values in Apple2Preferences.java
ANDROID_TOUCH_NONE = 0,
ANDROID_TOUCH_JOYSTICK,
ANDROID_TOUCH_KEYBOARD,
ANDROID_TOUCH_DEVICE_MAX,
} AndroidTouchDevice_t;
void Java_org_deadc0de_apple2ix_Apple2Preferences_nativeEnableTouchJoystick(JNIEnv *env, jclass cls, jboolean enabled) {
LOG("native enable touch joystick : %d", enabled);
}
@ -34,6 +42,7 @@ void Java_org_deadc0de_apple2ix_Apple2Preferences_nativeSetColor(JNIEnv *env, jc
}
jboolean Java_org_deadc0de_apple2ix_Apple2Preferences_nativeSetSpeakerEnabled(JNIEnv *env, jclass cls, jboolean enabled) {
LOG("native set speaker enabled : %d", true);
// NO-OP ... speaker should always be enabled (but volume could be zero)
return true;
}
@ -47,6 +56,7 @@ void Java_org_deadc0de_apple2ix_Apple2Preferences_nativeSetSpeakerVolume(JNIEnv
}
void Java_org_deadc0de_apple2ix_Apple2Preferences_nativeSetAudioLatency(JNIEnv *env, jclass cls, jfloat latencySecs) {
LOG("native set audio latency : %f", latencySecs);
//assert(cpu_isPaused());
audio_setLatency(latencySecs);
}
@ -68,3 +78,23 @@ void Java_org_deadc0de_apple2ix_Apple2Preferences_nativeSetMockingboardVolume(JN
MB_SetVolumeZeroToTen(goesToTen);
}
void Java_org_deadc0de_apple2ix_Apple2Preferences_nativeSetDefaultTouchDevice(JNIEnv *env, jclass cls, jint touchDevice) {
LOG("native set default touch device : %d", touchDevice);
assert(touchDevice >= 0 && touchDevice < ANDROID_TOUCH_DEVICE_MAX);
switch (touchDevice) {
case ANDROID_TOUCH_JOYSTICK:
keydriver_setTouchKeyboardOwnsScreen(false);
joydriver_setTouchJoystickOwnsScreen(true);
break;
case ANDROID_TOUCH_KEYBOARD:
joydriver_setTouchJoystickOwnsScreen(false);
keydriver_setTouchKeyboardOwnsScreen(true);
break;
case ANDROID_TOUCH_NONE:
default:
break;
}
}