diff --git a/engine/src/android/com/jme3/app/AndroidHarness.java b/engine/src/android/com/jme3/app/AndroidHarness.java index eccbceaf1..caf875007 100644 --- a/engine/src/android/com/jme3/app/AndroidHarness.java +++ b/engine/src/android/com/jme3/app/AndroidHarness.java @@ -6,7 +6,6 @@ import android.content.DialogInterface; import android.content.pm.ActivityInfo; import android.graphics.drawable.Drawable; import android.graphics.drawable.NinePatchDrawable; -import android.opengl.GLSurfaceView; import android.os.Bundle; import android.util.Log; import android.view.*; @@ -14,6 +13,7 @@ import android.view.ViewGroup.LayoutParams; import android.widget.FrameLayout; import android.widget.ImageView; import android.widget.TextView; +import com.jme3.asset.DesktopAssetManager; import com.jme3.audio.AudioRenderer; import com.jme3.audio.android.AndroidAudioRenderer; import com.jme3.input.JoyInput; @@ -22,6 +22,7 @@ import com.jme3.input.android.AndroidSensorJoyInput; import com.jme3.input.controls.TouchListener; import com.jme3.input.controls.TouchTrigger; import com.jme3.input.event.TouchEvent; +import com.jme3.renderer.android.AndroidGLSurfaceView; import com.jme3.system.AppSettings; import com.jme3.system.SystemListener; import com.jme3.system.android.AndroidConfigChooser.ConfigType; @@ -141,7 +142,7 @@ public class AndroidHarness extends Activity implements TouchListener, DialogInt */ protected int screenOrientation = ActivityInfo.SCREEN_ORIENTATION_SENSOR; protected OGLESContext ctx; - protected GLSurfaceView view = null; + protected AndroidGLSurfaceView view = null; protected boolean isGLThreadPaused = true; protected ImageView splashImageView = null; protected FrameLayout frameLayout = null; @@ -155,7 +156,7 @@ public class AndroidHarness extends Activity implements TouchListener, DialogInt @Override public Object onRetainNonConfigurationInstance() { - logger.log(Level.INFO, "onRetainNonConfigurationInstance called"); + logger.log(Level.INFO, "onRetainNonConfigurationInstance"); final DataObject data = new DataObject(); data.app = this.app; inConfigChange = true; @@ -165,6 +166,7 @@ public class AndroidHarness extends Activity implements TouchListener, DialogInt @Override public void onCreate(Bundle savedInstanceState) { + logger.info("onCreate"); super.onCreate(savedInstanceState); JmeAndroidSystem.setActivity(this); @@ -185,18 +187,13 @@ public class AndroidHarness extends Activity implements TouchListener, DialogInt logger.log(Level.INFO, "Using Retained App"); this.app = data.app; - ctx = (OGLESContext) app.getContext(); - view = ctx.createView(eglConfigType, eglConfigVerboseLogging); - ctx.setSystemListener(this); - layoutDisplay(); - } else { // Discover the screen reolution //TODO try to find a better way to get a hand on the resolution WindowManager wind = this.getWindowManager(); Display disp = wind.getDefaultDisplay(); Log.d("AndroidHarness", "Resolution from Window, width:" + disp.getWidth() + ", height: " + disp.getHeight()); - + // Create Settings logger.log(Level.INFO, "Creating settings"); AppSettings settings = new AppSettings(true); @@ -215,38 +212,41 @@ public class AndroidHarness extends Activity implements TouchListener, DialogInt app.setSettings(settings); app.start(); - ctx = (OGLESContext) app.getContext(); - view = ctx.createView(eglConfigType, eglConfigVerboseLogging); - // AndroidHarness wraps the app as a SystemListener. - ctx.setSystemListener(this); - layoutDisplay(); } catch (Exception ex) { handleError("Class " + appClass + " init failed", ex); setContentView(new TextView(this)); } } + + ctx = (OGLESContext) app.getContext(); + view = ctx.createView(eglConfigType, eglConfigVerboseLogging); + // AndroidHarness wraps the app as a SystemListener. + ctx.setSystemListener(this); + layoutDisplay(); + } @Override protected void onRestart() { + logger.info("onRestart"); super.onRestart(); if (app != null) { app.restart(); } - logger.info("onRestart"); } @Override protected void onStart() { - super.onStart(); logger.info("onStart"); + super.onStart(); } @Override protected void onResume() { + logger.info("onResume"); super.onResume(); if (view != null) { view.onResume(); @@ -274,11 +274,11 @@ public class AndroidHarness extends Activity implements TouchListener, DialogInt } isGLThreadPaused = false; - logger.info("onResume"); } @Override protected void onPause() { + logger.info("onPause"); super.onPause(); if (view != null) { view.onPause(); @@ -306,18 +306,18 @@ public class AndroidHarness extends Activity implements TouchListener, DialogInt } } isGLThreadPaused = true; - logger.info("onPause"); } @Override protected void onStop() { - super.onStop(); logger.info("onStop"); + super.onStop(); } @Override protected void onDestroy() { + logger.info("onDestroy"); final DataObject data = (DataObject) getLastNonConfigurationInstance(); if (data != null || inConfigChange) { logger.info("In Config Change, not stopping app."); @@ -326,7 +326,11 @@ public class AndroidHarness extends Activity implements TouchListener, DialogInt app.stop(!isGLThreadPaused); } } - logger.info("onDestroy"); + JmeAndroidSystem.setActivity(null); + ctx = null; + app = null; + view = null; + super.onDestroy(); } diff --git a/engine/src/android/com/jme3/audio/android/AndroidAudioRenderer.java b/engine/src/android/com/jme3/audio/android/AndroidAudioRenderer.java index b53b2e181..6587fbcc0 100644 --- a/engine/src/android/com/jme3/audio/android/AndroidAudioRenderer.java +++ b/engine/src/android/com/jme3/audio/android/AndroidAudioRenderer.java @@ -50,7 +50,7 @@ import java.util.logging.Logger; /** * This class is the android implementation for {@link AudioRenderer} - * + * * @author larynx * @author plan_rich */ @@ -64,7 +64,6 @@ public class AndroidAudioRenderer implements AudioRenderer, private final Vector3f listenerPosition = new Vector3f(); // For temp use private final Vector3f distanceVector = new Vector3f(); - private final Context context; private final AssetManager assetManager; private HashMap soundpoolStillLoading = new HashMap(); private Listener listener; @@ -72,7 +71,6 @@ public class AndroidAudioRenderer implements AudioRenderer, private final AudioManager manager; public AndroidAudioRenderer(Activity context) { - this.context = context; manager = (AudioManager) context.getSystemService(Context.AUDIO_SERVICE); context.setVolumeControlStream(AudioManager.STREAM_MUSIC); assetManager = context.getAssets(); @@ -302,14 +300,14 @@ public class AndroidAudioRenderer implements AudioRenderer, break; } } - + } /** * Plays using the {@link SoundPool} of Android. Due to hard limitation of * the SoundPool: After playing more instances of the sound you only have * the channel of the last played instance. - * + * * It is not possible to get information about the state of the soundpool of * a specific streamid, so removing is not possilbe -> noone knows when * sound finished. @@ -329,7 +327,7 @@ public class AndroidAudioRenderer implements AudioRenderer, try { - if (audioData.getId() < 0) { // found something to load + if (audioData.getId() < 0) { // found something to load int soundId = soundPool.load( assetManager.openFd(assetKey.getName()), 1); audioData.setId(soundId); diff --git a/engine/src/android/com/jme3/input/android/AndroidInput.java b/engine/src/android/com/jme3/input/android/AndroidInput.java index d47197e64..8a9278e6f 100644 --- a/engine/src/android/com/jme3/input/android/AndroidInput.java +++ b/engine/src/android/com/jme3/input/android/AndroidInput.java @@ -12,7 +12,6 @@ import com.jme3.math.Vector2f; import com.jme3.system.AppSettings; import com.jme3.util.RingBuffer; import java.util.HashMap; -import java.util.logging.Level; import java.util.logging.Logger; /** @@ -148,16 +147,17 @@ public class AndroidInput implements 0x0,//mute }; - public AndroidInput(View view) { - setView(view); - detector = new GestureDetector(null, this, null, false); - scaledetector = new ScaleGestureDetector(view.getContext(), this); + public AndroidInput() { } public void setView(View view) { this.view = view; - this.view.setOnTouchListener(this); - this.view.setOnKeyListener(this); + if (view != null) { + detector = new GestureDetector(null, this, null, false); + scaledetector = new ScaleGestureDetector(view.getContext(), this); + view.setOnTouchListener(this); + view.setOnKeyListener(this); + } } private TouchEvent getNextFreeTouchEvent() { @@ -373,6 +373,9 @@ public class AndroidInput implements while (!eventQueue.isEmpty()) { eventQueue.pop(); } + + + this.view = null; } @Override @@ -464,14 +467,14 @@ public class AndroidInput implements listener.onMouseMotionEvent(mot); lastX = newX; lastY = newY; - + break; - + case MOVE: if (event.isScaleSpanInProgress()) { break; } - + int dx; int dy; if (lastX != -1) { @@ -481,13 +484,13 @@ public class AndroidInput implements dx = 0; dy = 0; } - + mot = new MouseMotionEvent(newX, newY, dx, dy, (int)event.getScaleSpan(), (int)event.getDeltaScaleSpan()); mot.setTime(event.getTime()); listener.onMouseMotionEvent(mot); lastX = newX; lastY = newY; - + break; } } diff --git a/engine/src/android/com/jme3/input/android/AndroidSensorJoyInput.java b/engine/src/android/com/jme3/input/android/AndroidSensorJoyInput.java index a84fa0655..ab87a0f9c 100644 --- a/engine/src/android/com/jme3/input/android/AndroidSensorJoyInput.java +++ b/engine/src/android/com/jme3/input/android/AndroidSensorJoyInput.java @@ -32,15 +32,15 @@ package com.jme3.input.android; +import android.app.Activity; import android.content.Context; import android.hardware.Sensor; import android.hardware.SensorEvent; import android.hardware.SensorEventListener; import android.hardware.SensorManager; import android.os.Vibrator; -import android.view.Display; import android.view.Surface; -import android.view.WindowManager; +import android.view.View; import com.jme3.input.AbstractJoystick; import com.jme3.input.DefaultJoystickAxis; import com.jme3.input.InputManager; @@ -63,20 +63,20 @@ import java.util.logging.Logger; * AndroidSensorJoyInput converts the Android Sensor system into Joystick events. * A single joystick is configured and includes data for all configured sensors * as seperate axes of the joystick. - * + * * Each axis is named accounting to the static strings in SensorJoystickAxis. * Refer to the strings defined in SensorJoystickAxis for a list of supported * sensors and their axis data. Each sensor type defined in SensorJoystickAxis * will be attempted to be configured. If the device does not support a particular * sensor, the axis will return null if joystick.getAxis(String name) is called. - * + * * The joystick.getXAxis and getYAxis methods of the joystick are configured to * return the device orientation values in the device's X and Y directions. - * + * * This joystick also supports the joystick.rumble(rumbleAmount) method. In this * case, when joystick.rumble(rumbleAmount) is called, the Android device will vibrate * if the device has a built in vibrate motor. - * + * * Because Andorid does not allow for the user to define the intensity of the * vibration, the rumble amount (ie strength) is converted into vibration pulses * The stronger the strength amount, the shorter the delay between pulses. If @@ -92,12 +92,13 @@ import java.util.logging.Logger; * To use the joystick rumble feature, the following line needs to be * added to the Android Manifest File * - * + * * @author iwgeric */ public class AndroidSensorJoyInput implements JoyInput, SensorEventListener { private final static Logger logger = Logger.getLogger(AndroidSensorJoyInput.class.getName()); + private Activity activity = null; private InputManager inputManager = null; private SensorManager sensorManager = null; private Vibrator vibrator = null; @@ -106,8 +107,6 @@ public class AndroidSensorJoyInput implements JoyInput, SensorEventListener { private RawInputListener listener = null; private IntMap sensors = new IntMap(); private AndroidJoystick[] joysticks; - private WindowManager window; - private Display disp; private int lastRotation = 0; private boolean initialized = false; private boolean loaded = false; @@ -136,25 +135,16 @@ public class AndroidSensorJoyInput implements JoyInput, SensorEventListener { } private void initSensorManager() { - initWindow(); + this.activity = JmeAndroidSystem.getActivity(); // Get instance of the SensorManager from the current Context - sensorManager = (SensorManager) JmeAndroidSystem.getActivity().getSystemService(Context.SENSOR_SERVICE); + sensorManager = (SensorManager) activity.getSystemService(Context.SENSOR_SERVICE); // Get instance of Vibrator from current Context - vibrator = (Vibrator) JmeAndroidSystem.getActivity().getSystemService(Context.VIBRATOR_SERVICE); + vibrator = (Vibrator) activity.getSystemService(Context.VIBRATOR_SERVICE); if (vibrator == null) { logger.log(Level.INFO, "Vibrator Service not found."); } } - /** - * Used internally. Do not use. - * Allows the context to reset the current activity for getting device rotation - */ - public void initWindow() { - window = JmeAndroidSystem.getActivity().getWindowManager(); - disp = window.getDefaultDisplay(); - } - private SensorData initSensor(int sensorType) { boolean success = false; @@ -316,7 +306,7 @@ public class AndroidSensorJoyInput implements JoyInput, SensorEventListener { * @return Current device rotation amount */ private int getScreenRotation() { - return disp.getRotation(); + return activity.getWindowManager().getDefaultDisplay().getRotation(); } /** @@ -364,7 +354,7 @@ public class AndroidSensorJoyInput implements JoyInput, SensorEventListener { if (sensorData.sensorAccuracy == SensorManager.SENSOR_STATUS_UNRELIABLE) { return false; } - + synchronized(sensorData.valuesLock) { accValues[0] = sensorData.lastValues[0]; accValues[1] = sensorData.lastValues[1]; @@ -379,7 +369,7 @@ public class AndroidSensorJoyInput implements JoyInput, SensorEventListener { if (sensorData.sensorAccuracy == SensorManager.SENSOR_STATUS_UNRELIABLE) { return false; } - + synchronized(sensorData.valuesLock) { magValues[0] = sensorData.lastValues[0]; magValues[1] = sensorData.lastValues[1]; @@ -464,9 +454,9 @@ public class AndroidSensorJoyInput implements JoyInput, SensorEventListener { public Joystick[] loadJoysticks(InputManager inputManager) { this.inputManager = inputManager; - + initSensorManager(); - + SensorData sensorData; List list = new ArrayList(); AndroidJoystick joystick; @@ -477,7 +467,7 @@ public class AndroidSensorJoyInput implements JoyInput, SensorEventListener { list.size(), "AndroidSensorsJoystick"); list.add(joystick); - + List availSensors = sensorManager.getSensorList(Sensor.TYPE_ALL); for (Sensor sensor: availSensors) { logger.log(Level.INFO, "{0} Sensor is available, Type: {1}, Vendor: {2}, Version: {3}", @@ -561,8 +551,8 @@ public class AndroidSensorJoyInput implements JoyInput, SensorEventListener { // if (sensorData != null) { // sensorData.lastValues = new float[1]; // } - - + + joysticks = list.toArray( new AndroidJoystick[list.size()] ); loaded = true; return joysticks; @@ -600,6 +590,9 @@ public class AndroidSensorJoyInput implements JoyInput, SensorEventListener { initialized = false; loaded = false; joysticks = null; + sensorManager = null; + vibrator = null; + activity = null; } public boolean isInitialized() { @@ -636,7 +629,7 @@ public class AndroidSensorJoyInput implements JoyInput, SensorEventListener { sensorData.lastValues[i] = se.values[i]; } } - + if (sensorData != null && sensorData.axes.size() > 0) { AndroidJoystickAxis axis; for (int i=0; i