Maintain a menu page stack for simplicity

This commit is contained in:
Aaron Culliney 2015-07-25 00:06:20 -07:00
parent 933ef5533a
commit fe34a86c35
5 changed files with 104 additions and 74 deletions

View File

@ -13,9 +13,7 @@ package org.deadc0de.apple2ix;
import android.app.Activity;
import android.app.AlertDialog;
import android.content.Context;
import android.content.DialogInterface;
import android.content.SharedPreferences;
import android.content.pm.PackageInfo;
import android.content.pm.PackageManager;
import android.graphics.Rect;
@ -25,23 +23,27 @@ import android.os.StrictMode;
import android.util.Log;
import android.view.KeyEvent;
import android.view.MotionEvent;
import android.view.View;
import android.view.ViewGroup;
import android.view.ViewTreeObserver;
import android.widget.FrameLayout;
import java.io.File;
import java.io.InputStream;
import java.io.IOException;
import java.io.FileOutputStream;
import java.util.ArrayList;
public class Apple2Activity extends Activity {
private final static String TAG = "Apple2Activity";
private final static int BUF_SZ = 4096;
private final static int SOFTKEYBOARD_THRESHOLD = 50;
private final static int MAX_FINGERS = 32;// HACK ...
private String mDataDir = null;
private Apple2View mView = null;
private ArrayList<Apple2MenuView> mMenuStack = new ArrayList<Apple2MenuView>();
private AlertDialog mQuitDialog = null;
private AlertDialog mRebootDialog = null;
@ -278,15 +280,14 @@ public class Apple2Activity extends Activity {
mRebootDialog.dismiss();
}
// For good measure, get rid of other menus too
Apple2SettingsMenu settingsMenu = mView.getSettingsMenu();
if (settingsMenu != null) {
settingsMenu.dismissWithoutResume();
}
Apple2DisksMenu disksMenu = mView.getDisksMenu();
if (disksMenu != null) {
disksMenu.dismissWithoutResume();
}
// Get rid of the menu hierarchy
Apple2MenuView apple2MenuView = null;
do {
apple2MenuView = popApple2View();
if (apple2MenuView != null) {
apple2MenuView.dismiss();
}
} while (apple2MenuView != null);
nativeOnPause();
}
@ -303,21 +304,11 @@ public class Apple2Activity extends Activity {
@Override
public boolean onKeyUp(int keyCode, KeyEvent event) {
if (keyCode == KeyEvent.KEYCODE_BACK) {
Apple2SettingsMenu settingsMenu = mView.getSettingsMenu();
Apple2DisksMenu disksMenu = mView.getDisksMenu();
if (settingsMenu != null) {
if (settingsMenu.isShowing()) {
Apple2AudioSettingsMenu audioSubmenu = settingsMenu.getAudioSubmenu();
if (audioSubmenu.isShowing()) {
audioSubmenu.dismiss();
} else {
settingsMenu.dismiss();
}
} else if (disksMenu.isShowing()) {
disksMenu.dismiss();
} else {
mView.showMainMenu();
}
Apple2MenuView apple2MenuView = popApple2View();
if (apple2MenuView == null) {
mView.showMainMenu();
} else {
apple2MenuView.dismiss();
}
return true;
} else if (keyCode == KeyEvent.KEYCODE_MENU) {
@ -421,6 +412,46 @@ public class Apple2Activity extends Activity {
nativeGraphicsInitialized(w, h);
}
public synchronized void pushApple2View(Apple2MenuView apple2MenuView) {
mMenuStack.add(apple2MenuView);
View menuView = apple2MenuView.getView();
nativeOnPause();
addContentView(menuView, new FrameLayout.LayoutParams(getWidth(), getHeight()));
}
public synchronized Apple2MenuView popApple2View() {
int lastIndex = mMenuStack.size()-1;
if (lastIndex < 0) {
return null;
}
Apple2MenuView apple2MenuView = mMenuStack.remove(lastIndex);
_disposeApple2View(apple2MenuView);
return apple2MenuView;
}
public synchronized Apple2MenuView popApple2View(Apple2MenuView apple2MenuView) {
boolean wasRemoved = mMenuStack.remove(apple2MenuView);
_disposeApple2View(apple2MenuView);
return wasRemoved ? apple2MenuView : null;
}
private void _disposeApple2View(Apple2MenuView apple2MenuView) {
// Actually remove View from view hierarchy
{
View menuView = apple2MenuView.getView();
if (menuView.isShown()) {
((ViewGroup) menuView.getParent()).removeView(menuView);
}
}
// if no more views on menu stack, resume emulation
if (mMenuStack.size() == 0) {
nativeOnResume(/*isSystemResume:*/false);
}
}
public Apple2View getView() {
return mView;
}

View File

@ -13,7 +13,6 @@ package org.deadc0de.apple2ix;
import android.content.Context;
import android.graphics.drawable.Drawable;
import android.util.Log;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
@ -28,7 +27,7 @@ import android.widget.ListView;
import android.widget.SeekBar;
import android.widget.TextView;
public class Apple2AudioSettingsMenu {
public class Apple2AudioSettingsMenu implements Apple2MenuView {
private final static String TAG = "Apple2AudioSettingsMenu";
@ -284,24 +283,18 @@ public class Apple2AudioSettingsMenu {
if (isShowing()) {
return;
}
mActivity.nativeOnPause();
mActivity.addContentView(mSettingsView, new FrameLayout.LayoutParams(mActivity.getWidth(), mActivity.getHeight()));
mActivity.pushApple2View(this);
}
public void dismiss() {
if (isShowing()) {
dismissWithoutResume();
//mActivity.nativeOnResume(/*isSystemResume:*/false);
}
}
public void dismissWithoutResume() {
if (isShowing()) {
((ViewGroup)mSettingsView.getParent()).removeView(mSettingsView);
}
mActivity.popApple2View(this);
}
public boolean isShowing() {
return mSettingsView.isShown();
}
public View getView() {
return mSettingsView;
}
}

View File

@ -13,14 +13,12 @@ package org.deadc0de.apple2ix;
import android.content.Context;
import android.graphics.drawable.Drawable;
import android.util.Log;
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.FrameLayout;
import android.widget.ImageView;
import android.widget.LinearLayout;
import android.widget.ListView;
@ -30,7 +28,7 @@ import java.io.File;
import java.io.FilenameFilter;
import java.util.Arrays;
public class Apple2DisksMenu {
public class Apple2DisksMenu implements Apple2MenuView {
private final static String TAG = "Apple2DisksMenu";
@ -114,8 +112,8 @@ public class Apple2DisksMenu {
if (isDirectory[position]) {
// TODO FIXME ...
} else {
RadioButton diskA = (RadioButton)mDisksView.findViewById(R.id.radioButton_diskA);
CheckBox readWrite = (CheckBox)mDisksView.findViewById(R.id.checkBox_readWrite);
RadioButton diskA = (RadioButton) mDisksView.findViewById(R.id.radioButton_diskA);
CheckBox readWrite = (CheckBox) mDisksView.findViewById(R.id.checkBox_readWrite);
Apple2DisksMenu.this.dismiss();
mActivity.nativeChooseDisk(files[position].getAbsolutePath(), diskA.isChecked(), !readWrite.isChecked());
}
@ -128,24 +126,18 @@ public class Apple2DisksMenu {
return;
}
dynamicSetup();
mActivity.nativeOnPause();
mActivity.addContentView(mDisksView, new FrameLayout.LayoutParams(mActivity.getWidth(), mActivity.getHeight()));
mActivity.pushApple2View(this);
}
public void dismiss() {
if (isShowing()) {
dismissWithoutResume();
mActivity.nativeOnResume(/*isSystemResume:*/false);
}
}
public void dismissWithoutResume() {
if (isShowing()) {
((ViewGroup)mDisksView.getParent()).removeView(mDisksView);
}
mActivity.popApple2View(this);
}
public boolean isShowing() {
return mDisksView.isShown();
}
public View getView() {
return mDisksView;
}
}

View File

@ -0,0 +1,25 @@
/*
* 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.view.View;
public interface Apple2MenuView {
public void show();
public boolean isShowing();
public void dismiss();
public View getView();
}

View File

@ -22,13 +22,12 @@ import android.view.ViewGroup;
import android.widget.AdapterView;
import android.widget.ArrayAdapter;
import android.widget.CheckBox;
import android.widget.FrameLayout;
import android.widget.ImageView;
import android.widget.LinearLayout;
import android.widget.ListView;
import android.widget.TextView;
public class Apple2SettingsMenu {
public class Apple2SettingsMenu implements Apple2MenuView {
private final static String TAG = "Apple2SettingsMenu";
@ -210,28 +209,18 @@ public class Apple2SettingsMenu {
if (isShowing()) {
return;
}
mActivity.nativeOnPause();
mActivity.addContentView(mSettingsView, new FrameLayout.LayoutParams(mActivity.getWidth(), mActivity.getHeight()));
mActivity.pushApple2View(this);
}
public void dismiss() {
if (isShowing()) {
dismissWithoutResume();
mActivity.nativeOnResume(/*isSystemResume:*/false);
}
}
public void dismissWithoutResume() {
if (isShowing()) {
((ViewGroup)mSettingsView.getParent()).removeView(mSettingsView);
}
mActivity.popApple2View(this);
}
public boolean isShowing() {
return mSettingsView.isShown();
}
public Apple2AudioSettingsMenu getAudioSubmenu() {
return mAudioSettings;
public View getView() {
return mSettingsView;
}
}