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.Activity;
import android.app.AlertDialog; import android.app.AlertDialog;
import android.content.Context;
import android.content.DialogInterface; import android.content.DialogInterface;
import android.content.SharedPreferences;
import android.content.pm.PackageInfo; import android.content.pm.PackageInfo;
import android.content.pm.PackageManager; import android.content.pm.PackageManager;
import android.graphics.Rect; import android.graphics.Rect;
@ -25,23 +23,27 @@ import android.os.StrictMode;
import android.util.Log; import android.util.Log;
import android.view.KeyEvent; import android.view.KeyEvent;
import android.view.MotionEvent; import android.view.MotionEvent;
import android.view.View;
import android.view.ViewGroup;
import android.view.ViewTreeObserver; import android.view.ViewTreeObserver;
import android.widget.FrameLayout;
import java.io.File; import java.io.File;
import java.io.InputStream; import java.io.InputStream;
import java.io.IOException; import java.io.IOException;
import java.io.FileOutputStream; import java.io.FileOutputStream;
import java.util.ArrayList;
public class Apple2Activity extends Activity { public class Apple2Activity extends Activity {
private final static String TAG = "Apple2Activity"; private final static String TAG = "Apple2Activity";
private final static int BUF_SZ = 4096; private final static int BUF_SZ = 4096;
private final static int SOFTKEYBOARD_THRESHOLD = 50;
private final static int MAX_FINGERS = 32;// HACK ... private final static int MAX_FINGERS = 32;// HACK ...
private String mDataDir = null; private String mDataDir = null;
private Apple2View mView = null; private Apple2View mView = null;
private ArrayList<Apple2MenuView> mMenuStack = new ArrayList<Apple2MenuView>();
private AlertDialog mQuitDialog = null; private AlertDialog mQuitDialog = null;
private AlertDialog mRebootDialog = null; private AlertDialog mRebootDialog = null;
@ -278,15 +280,14 @@ public class Apple2Activity extends Activity {
mRebootDialog.dismiss(); mRebootDialog.dismiss();
} }
// For good measure, get rid of other menus too // Get rid of the menu hierarchy
Apple2SettingsMenu settingsMenu = mView.getSettingsMenu(); Apple2MenuView apple2MenuView = null;
if (settingsMenu != null) { do {
settingsMenu.dismissWithoutResume(); apple2MenuView = popApple2View();
} if (apple2MenuView != null) {
Apple2DisksMenu disksMenu = mView.getDisksMenu(); apple2MenuView.dismiss();
if (disksMenu != null) { }
disksMenu.dismissWithoutResume(); } while (apple2MenuView != null);
}
nativeOnPause(); nativeOnPause();
} }
@ -303,21 +304,11 @@ public class Apple2Activity extends Activity {
@Override @Override
public boolean onKeyUp(int keyCode, KeyEvent event) { public boolean onKeyUp(int keyCode, KeyEvent event) {
if (keyCode == KeyEvent.KEYCODE_BACK) { if (keyCode == KeyEvent.KEYCODE_BACK) {
Apple2SettingsMenu settingsMenu = mView.getSettingsMenu(); Apple2MenuView apple2MenuView = popApple2View();
Apple2DisksMenu disksMenu = mView.getDisksMenu(); if (apple2MenuView == null) {
if (settingsMenu != null) { mView.showMainMenu();
if (settingsMenu.isShowing()) { } else {
Apple2AudioSettingsMenu audioSubmenu = settingsMenu.getAudioSubmenu(); apple2MenuView.dismiss();
if (audioSubmenu.isShowing()) {
audioSubmenu.dismiss();
} else {
settingsMenu.dismiss();
}
} else if (disksMenu.isShowing()) {
disksMenu.dismiss();
} else {
mView.showMainMenu();
}
} }
return true; return true;
} else if (keyCode == KeyEvent.KEYCODE_MENU) { } else if (keyCode == KeyEvent.KEYCODE_MENU) {
@ -421,6 +412,46 @@ public class Apple2Activity extends Activity {
nativeGraphicsInitialized(w, h); 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() { public Apple2View getView() {
return mView; return mView;
} }

View File

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

View File

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