diff -r ed1d52c5aa94 -r 763d3961400b project_files/Android-build/SDL-android-project/src/org/hedgewars/hedgeroid/SDLActivity.java --- a/project_files/Android-build/SDL-android-project/src/org/hedgewars/hedgeroid/SDLActivity.java Sat Aug 18 00:22:33 2012 +0200 +++ b/project_files/Android-build/SDL-android-project/src/org/hedgewars/hedgeroid/SDLActivity.java Sat Aug 18 00:47:51 2012 +0200 @@ -1,5 +1,8 @@ package org.hedgewars.hedgeroid; +import java.io.UnsupportedEncodingException; +import java.util.concurrent.atomic.AtomicBoolean; + import javax.microedition.khronos.egl.EGL10; import javax.microedition.khronos.egl.EGLConfig; import javax.microedition.khronos.egl.EGLContext; @@ -12,7 +15,9 @@ import org.hedgewars.hedgeroid.frontlib.Frontlib.GameSetupPtr; import org.hedgewars.hedgeroid.frontlib.Frontlib.GameconnPtr; import org.hedgewars.hedgeroid.frontlib.Frontlib.IntCallback; -import org.hedgewars.hedgeroid.netplay.TickHandler; +import org.hedgewars.hedgeroid.netplay.Netplay; +import org.hedgewars.hedgeroid.util.FileUtils; +import org.hedgewars.hedgeroid.util.TickHandler; import com.sun.jna.Pointer; @@ -31,6 +36,7 @@ import android.os.Handler; import android.os.HandlerThread; import android.os.Message; +import android.util.Base64; import android.util.DisplayMetrics; import android.util.Log; import android.view.KeyEvent; @@ -50,6 +56,7 @@ * way to do this (http://developer.android.com/guide/faq/framework.html#3) */ public static volatile GameConfig startConfig; + public static volatile boolean startNetgame; // Main components public static SDLActivity mSingleton; @@ -87,7 +94,7 @@ mSingleton = this; // Set up the surface - mSurface = new SDLSurface(getApplication(), startConfig); + mSurface = new SDLSurface(getApplication(), startConfig, startNetgame); setContentView(mSurface); } @@ -150,8 +157,14 @@ commandHandler.sendMessage(msg); } + public static void synchronizedNativeInit(String...args) { + synchronized(PascalExports.engineMutex) { + nativeInit(args); + } + } + // C functions we call - public static native void nativeInit(String...args); + private static native void nativeInit(String...args); public static native void nativeQuit(); public static native void nativePause(); public static native void nativeResume(); @@ -184,12 +197,29 @@ return mSingleton; } - public static void startApp(int width, int height, GameConfig config) { + public static void startApp(final int width, final int height, GameConfig config, boolean netgame) { synchronized(SDLActivity.class) { - // Start up the C app thread + // Start up the C app thread TODO this is silly code if (mSDLThread == null) { - mSDLThread = new Thread(new SDLMain(width, height, config), "SDLThread"); - mSDLThread.start(); + final AtomicBoolean gameconnStartDone = new AtomicBoolean(false); + GameConnection.Listener listener = new GameConnection.Listener() { + public void gameConnectionReady(int port) { + mSDLThread = new Thread(new SDLMain(width, height, port, "Medo")); + mSDLThread.start(); + gameconnStartDone.set(true); + } + + public void gameConnectionDisconnected(int reason) { + Log.e("startApp", "disconnected: "+reason); + gameconnStartDone.set(true); + } + }; + if(netgame) { + Netplay netplay = Netplay.getAppInstance(mSingleton.getApplicationContext()); + GameConnection.forNetgame(config, netplay, listener); + } else { + GameConnection.forLocalGame(config, listener); + } } else { SDLActivity.nativeResume(); } @@ -426,61 +456,32 @@ class SDLMain implements Runnable { private final int surfaceWidth, surfaceHeight; - private final GameConfig config; - private GameconnPtr conn; + private final int port; + private final String playerName; HandlerThread thread = new HandlerThread("IPC thread"); - private final IntCallback dccb = new IntCallback() { - public void callback(Pointer context, int arg1) { - Log.d("SDLMain", "Disconnected: "+arg1); - Flib.INSTANCE.flib_gameconn_destroy(conn); - conn = null; - thread.quit(); - } - }; - - public SDLMain(int width, int height, GameConfig _config) { - config = _config; + public SDLMain(int width, int height, int port, String playerName) { surfaceWidth = width; surfaceHeight = height; + this.port = port; + this.playerName = playerName; } public void run() { //Set up the IPC socket server to communicate with the engine - - final GameconnPtr conn = Flib.INSTANCE.flib_gameconn_create("Xeli", GameSetupPtr.createJavaOwned(config), false); - if(conn == null) { - throw new AssertionError(); - } - Flib.INSTANCE.flib_gameconn_onDisconnect(conn, dccb, null); - int port = Flib.INSTANCE.flib_gameconn_getport(conn); - - String path = Utils.getDataPath(SDLActivity.mSingleton);//This represents the data directory + String path = FileUtils.getDataPath(SDLActivity.mSingleton);//This represents the data directory path = path.substring(0, path.length()-1);//remove the trailing '/' - thread.start(); // TODO ensure it gets stopped - new TickHandler(thread.getLooper(), 500, new Runnable() { - public void run() { - Log.d("SDLMain", "pre-tick"); - Flib.INSTANCE.flib_gameconn_tick(conn); - Log.d("SDLMain", "post-tick"); - } - }).start(); - Log.d("SDLMain", "Starting engine"); // Runs SDL_main() with added parameters - SDLActivity.nativeInit(new String[] { String.valueOf(port), - String.valueOf(surfaceWidth), String.valueOf(surfaceHeight), - "0", "en.txt", "xeli", "1", "1", "1", path, "" }); + try { + SDLActivity.synchronizedNativeInit(new String[] { String.valueOf(port), + String.valueOf(surfaceWidth), String.valueOf(surfaceHeight), + "0", "en.txt", Base64.encodeToString(playerName.getBytes("UTF-8"), 0), "1", "1", "1", path, "" }); + } catch (UnsupportedEncodingException e) { + throw new AssertionError(e); // never happens + } Log.d("SDLMain", "Engine stopped"); - try { - thread.join(); - } catch (InterruptedException e) { - throw new AssertionError(); - } - Log.v("SDLMain", "thread joined"); - Flib.INSTANCE.flib_gameconn_destroy(conn); - Log.v("SDLMain", "SDL thread terminated"); } } @@ -495,12 +496,13 @@ View.OnKeyListener, View.OnTouchListener, SensorEventListener { private GameConfig config; - + private boolean netgame; + // Sensors private static SensorManager mSensorManager; // Startup - public SDLSurface(Context context, GameConfig _config) { + public SDLSurface(Context context, GameConfig _config, boolean netgame) { super(context); getHolder().addCallback(this); @@ -512,6 +514,7 @@ mSensorManager = (SensorManager)context.getSystemService("sensor"); config = _config; + this.netgame = netgame; } // Called when we have a valid drawing surface @@ -581,7 +584,7 @@ SDLActivity.onNativeResize(width, height, sdlFormat); Log.v("SDL", "Window size:" + width + "x"+height); - SDLActivity.startApp(width, height, config); + SDLActivity.startApp(width, height, config, netgame); } // unused