Removed AndroidHarness specific calls from the OGLESContext.

- The harness is now a system listener and dispatch the system events to the jme app
- Every Harness related code is now in the harness (exit hook dialog, and mapping addition, spash screen hiding,....)
- Added a handleExitHook flag to configure if the Harness should handle exit or not.

git-svn-id: https://jmonkeyengine.googlecode.com/svn/trunk@9238 75d07b2b-3a1a-0410-a2c5-0572b91ccdca
3.0
rem..om 13 years ago
parent e769d453ec
commit 191bd21b40
  1. 62
      engine/src/android/com/jme3/app/AndroidHarness.java
  2. 48
      engine/src/android/com/jme3/system/android/OGLESContext.java

@ -15,11 +15,14 @@ import android.widget.ImageView;
import android.widget.TextView; import android.widget.TextView;
import com.jme3.audio.AudioRenderer; import com.jme3.audio.AudioRenderer;
import com.jme3.audio.android.AndroidAudioRenderer; import com.jme3.audio.android.AndroidAudioRenderer;
import com.jme3.input.TouchInput;
import com.jme3.input.android.AndroidInput; import com.jme3.input.android.AndroidInput;
import com.jme3.input.controls.TouchListener; import com.jme3.input.controls.TouchListener;
import com.jme3.input.controls.TouchTrigger;
import com.jme3.input.event.TouchEvent; import com.jme3.input.event.TouchEvent;
import com.jme3.system.AppSettings; import com.jme3.system.AppSettings;
import com.jme3.system.JmeSystem; import com.jme3.system.JmeSystem;
import com.jme3.system.SystemListener;
import com.jme3.system.android.AndroidConfigChooser.ConfigType; import com.jme3.system.android.AndroidConfigChooser.ConfigType;
import com.jme3.system.android.JmeAndroidSystem; import com.jme3.system.android.JmeAndroidSystem;
import com.jme3.system.android.OGLESContext; import com.jme3.system.android.OGLESContext;
@ -37,7 +40,7 @@ import java.util.logging.Logger;
* @author Kirill * @author Kirill
* @author larynx * @author larynx
*/ */
public class AndroidHarness extends Activity implements TouchListener, DialogInterface.OnClickListener { public class AndroidHarness extends Activity implements TouchListener, DialogInterface.OnClickListener, SystemListener {
protected final static Logger logger = Logger.getLogger(AndroidHarness.class.getName()); protected final static Logger logger = Logger.getLogger(AndroidHarness.class.getName());
/** /**
@ -73,6 +76,10 @@ public class AndroidHarness extends Activity implements TouchListener, DialogInt
* if true finish this activity when the jme app is stopped * if true finish this activity when the jme app is stopped
*/ */
protected boolean finishOnAppStop = true; protected boolean finishOnAppStop = true;
/**
* set to false if you don't want the harness to handle the exit hook
*/
protected boolean handleExitHook = true;
/** /**
* Title of the exit dialog, default is "Do you want to exit?" * Title of the exit dialog, default is "Do you want to exit?"
*/ */
@ -118,6 +125,7 @@ public class AndroidHarness extends Activity implements TouchListener, DialogInt
private ImageView splashImageView = null; private ImageView splashImageView = null;
private FrameLayout frameLayout = null; private FrameLayout frameLayout = null;
final private String ESCAPE_EVENT = "TouchEscape"; final private String ESCAPE_EVENT = "TouchEscape";
private boolean firstDrawFrame = true;
static { static {
try { try {
@ -190,7 +198,8 @@ public class AndroidHarness extends Activity implements TouchListener, DialogInt
AppSettings s = ctx.getSettings(); AppSettings s = ctx.getSettings();
logger.log(Level.INFO, "Settings: Width {0} Height {1}", new Object[]{s.getWidth(), s.getHeight()}); logger.log(Level.INFO, "Settings: Width {0} Height {1}", new Object[]{s.getWidth(), s.getHeight()});
//setting the Harness as the system listener
ctx.setSystemListener(this);
layoutDisplay(); layoutDisplay();
} catch (Exception ex) { } catch (Exception ex) {
handleError("Class " + appClass + " init failed", ex); handleError("Class " + appClass + " init failed", ex);
@ -244,7 +253,7 @@ public class AndroidHarness extends Activity implements TouchListener, DialogInt
//pause the audio //pause the audio
AudioRenderer result = app.getAudioRenderer(); AudioRenderer result = app.getAudioRenderer();
if (result != null) { if (result != null) {
logger.info("pause: " + result.getClass().getSimpleName()); logger.log(Level.INFO, "pause: {0}", result.getClass().getSimpleName());
if (result instanceof AndroidAudioRenderer) { if (result instanceof AndroidAudioRenderer) {
AndroidAudioRenderer renderer = (AndroidAudioRenderer) result; AndroidAudioRenderer renderer = (AndroidAudioRenderer) result;
renderer.pauseAll(); renderer.pauseAll();
@ -321,6 +330,7 @@ public class AndroidHarness extends Activity implements TouchListener, DialogInt
if (app != null) { if (app != null) {
app.stop(true); app.stop(true);
} }
app = null;
this.finish(); this.finish();
} }
} }
@ -400,9 +410,47 @@ public class AndroidHarness extends Activity implements TouchListener, DialogInt
} }
} }
public boolean isFinishOnAppStop() { public void initialize() {
return finishOnAppStop; app.initialize();
if (handleExitHook) {
app.getInputManager().addMapping(ESCAPE_EVENT, new TouchTrigger(TouchInput.KEYCODE_BACK));
app.getInputManager().addListener(this, new String[]{ESCAPE_EVENT});
}
}
public void reshape(int width, int height) {
app.reshape(width, height);
}
public void update() {
app.update();
// call to remove the splash screen, if present.
// call after app.update() to make sure no gap between
// splash screen going away and app display being shown.
if (firstDrawFrame) {
removeSplashScreen();
firstDrawFrame = false;
}
}
public void requestClose(boolean esc) {
app.requestClose(esc);
}
public void gainFocus() {
app.gainFocus();
}
public void loseFocus() {
app.loseFocus();
}
public void destroy() {
if (app != null) {
app.destroy();
}
if (finishOnAppStop) {
finish();
}
} }
} }

@ -86,7 +86,6 @@ public class OGLESContext implements JmeContext, GLSurfaceView.Renderer, SoftTex
protected SystemListener listener; protected SystemListener listener;
protected boolean autoFlush = true; protected boolean autoFlush = true;
protected AndroidInput view; protected AndroidInput view;
private boolean firstDrawFrame = true;
//protected int minFrameDuration = 1000 / frameRate; // Set a max FPS of 33 //protected int minFrameDuration = 1000 / frameRate; // Set a max FPS of 33
protected int minFrameDuration = 0; // No FPS cap protected int minFrameDuration = 0; // No FPS cap
/** /**
@ -95,7 +94,6 @@ public class OGLESContext implements JmeContext, GLSurfaceView.Renderer, SoftTex
*/ */
protected int clientOpenGLESVersion = 1; protected int clientOpenGLESVersion = 1;
protected boolean verboseLogging = false; protected boolean verboseLogging = false;
final private String ESCAPE_EVENT = "TouchEscape";
public OGLESContext() { public OGLESContext() {
} }
@ -215,24 +213,15 @@ public class OGLESContext implements JmeContext, GLSurfaceView.Renderer, SoftTex
logger.info("OGLESContext create"); logger.info("OGLESContext create");
logger.info("Running on thread: " + Thread.currentThread().getName()); logger.info("Running on thread: " + Thread.currentThread().getName());
final Context ctx = this.view.getContext();
// Setup unhandled Exception Handler // Setup unhandled Exception Handler
if (ctx instanceof AndroidHarness) {
Thread.currentThread().setUncaughtExceptionHandler(new Thread.UncaughtExceptionHandler() {
public void uncaughtException(Thread thread, Throwable thrown) { Thread.currentThread().setUncaughtExceptionHandler(new Thread.UncaughtExceptionHandler() {
((AndroidHarness) ctx).handleError("Exception thrown in " + thread.toString(), thrown);
}
});
} else {
Thread.currentThread().setUncaughtExceptionHandler(new Thread.UncaughtExceptionHandler() {
public void uncaughtException(Thread thread, Throwable thrown) { public void uncaughtException(Thread thread, Throwable thrown) {
listener.handleError("Exception thrown in " + thread.toString(), thrown); listener.handleError("Exception thrown in " + thread.toString(), thrown);
} }
}); });
}
if (clientOpenGLESVersion < 2) { if (clientOpenGLESVersion < 2) {
throw new UnsupportedOperationException("OpenGL ES 2.0 is not supported on this device"); throw new UnsupportedOperationException("OpenGL ES 2.0 is not supported on this device");
@ -247,14 +236,6 @@ public class OGLESContext implements JmeContext, GLSurfaceView.Renderer, SoftTex
renderer.initialize(); renderer.initialize();
listener.initialize(); listener.initialize();
// Setup exit hook
if (ctx instanceof AndroidHarness) {
Application app = ((AndroidHarness) ctx).getJmeApplication();
if (app.getInputManager() != null) {
app.getInputManager().addMapping(ESCAPE_EVENT, new TouchTrigger(TouchInput.KEYCODE_BACK));
app.getInputManager().addListener((AndroidHarness) ctx, new String[]{ESCAPE_EVENT});
}
}
JmeSystem.setSoftTextDialogInput(this); JmeSystem.setSoftTextDialogInput(this);
@ -282,13 +263,7 @@ public class OGLESContext implements JmeContext, GLSurfaceView.Renderer, SoftTex
logger.info("Display destroyed."); logger.info("Display destroyed.");
renderable.set(false); renderable.set(false);
final Context ctx = this.view.getContext();
if (ctx instanceof AndroidHarness) {
AndroidHarness harness = (AndroidHarness) ctx;
if (harness.isFinishOnAppStop()) {
harness.finish();
}
}
} }
} }
@ -371,6 +346,7 @@ public class OGLESContext implements JmeContext, GLSurfaceView.Renderer, SoftTex
logger.info("GL Surface changed, width: " + width + " height: " + height); logger.info("GL Surface changed, width: " + width + " height: " + height);
settings.setResolution(width, height); settings.setResolution(width, height);
listener.reshape(width, height); listener.reshape(width, height);
// androidListener.reshape(width, height);
} }
// SystemListener:update // SystemListener:update
@ -390,16 +366,6 @@ public class OGLESContext implements JmeContext, GLSurfaceView.Renderer, SoftTex
listener.update(); listener.update();
// call to AndroidHarness to remove the splash screen, if present.
// call after listener.update() to make sure no gap between
// splash screen going away and app display being shown.
if (firstDrawFrame) {
final Context ctx = this.view.getContext();
if (ctx instanceof AndroidHarness) {
((AndroidHarness) ctx).removeSplashScreen();
}
firstDrawFrame = false;
}
if (autoFlush) { if (autoFlush) {
renderer.onFrame(); renderer.onFrame();

Loading…
Cancel
Save