From 154e2e3edab10cef14b25bfd75972deb9dfcfd4d Mon Sep 17 00:00:00 2001 From: pelya Date: Wed, 29 Dec 2010 12:55:44 +0000 Subject: [PATCH] Editable data download path/application curdir, editable app commandline, updated teadme --- RecompileAllApps.sh | 2 +- project/java/DataDownloader.java | 23 ++--- project/java/Globals.java | 2 + project/java/Settings.java | 90 +++++++++++++++++-- project/java/Video.java | 4 +- project/java/translations/values/strings.xml | 2 + .../REminiscence/AndroidAppSettings.cfg | 3 +- .../alienblaster/AndroidAppSettings.cfg | 3 +- .../openttd/AndroidAppSettings.cfg | 4 +- project/jni/application/src | 2 +- project/jni/sdl_main/sdl_main.c | 29 ++---- readme.txt | 17 ++-- 12 files changed, 123 insertions(+), 58 deletions(-) diff --git a/RecompileAllApps.sh b/RecompileAllApps.sh index 074e13b7e..70fb78d3e 100755 --- a/RecompileAllApps.sh +++ b/RecompileAllApps.sh @@ -2,7 +2,7 @@ KEYSTORE=~/.ssh/android.keystore ALIAS=pelya -APPS_SKIP="src jooleem_0.1.4 lbreakout2 glxgears atari800 scummvm" +APPS_SKIP="src scummvm" mkdir -p apk diff --git a/project/java/DataDownloader.java b/project/java/DataDownloader.java index e1f597bed..1c43c2be6 100644 --- a/project/java/DataDownloader.java +++ b/project/java/DataDownloader.java @@ -148,9 +148,7 @@ class DataDownloader extends Thread Parent = _Parent; Status = new StatusWriter( _Status, _Parent ); //Status.setText( "Connecting to " + Globals.DataDownloadUrl ); - outFilesDir = Parent.getFilesDir().getAbsolutePath(); - if( Globals.DownloadToSdcard ) - outFilesDir = Environment.getExternalStorageDirectory().getAbsolutePath() + "/app-data/" + Globals.class.getPackage().getName(); + outFilesDir = Globals.DataDir; DownloadComplete = false; this.start(); } @@ -217,18 +215,15 @@ class DataDownloader extends Thread checkFile = null; // Create output directory (not necessary for phone storage) - if( Globals.DownloadToSdcard ) - { - try { - (new File( outFilesDir )).mkdirs(); - OutputStream out = new FileOutputStream( getOutFilePath(".nomedia") ); - out.flush(); - out.close(); - } - catch( SecurityException e ) {} - catch( FileNotFoundException e ) {} - catch( IOException e ) {}; + try { + (new File( outFilesDir )).mkdirs(); + OutputStream out = new FileOutputStream( getOutFilePath(".nomedia") ); + out.flush(); + out.close(); } + catch( SecurityException e ) {} + catch( FileNotFoundException e ) {} + catch( IOException e ) {}; HttpResponse response = null; HttpGet request; diff --git a/project/java/Globals.java b/project/java/Globals.java index 3a0c46d74..b6da27a95 100644 --- a/project/java/Globals.java +++ b/project/java/Globals.java @@ -83,10 +83,12 @@ class Globals { public static int RemapHwKeycode[] = new int[SDL_Keys.JAVA_KEYCODE_LAST]; public static int RemapScreenKbKeycode[] = new int[6]; public static boolean ScreenKbControlsShown[] = new boolean[8]; /* Also joystick and text input button added */ + public static int ScreenKbControlsLayout[][] = new int[8][4]; public static int RemapMultitouchGestureKeycode[] = new int[4]; public static boolean MultitouchGesturesUsed[] = new boolean[4]; public static int MultitouchGestureSensitivity = 1; public static int TouchscreenCalibration[] = new int[4]; + public static String DataDir = new String(""); } class LoadLibrary { diff --git a/project/java/Settings.java b/project/java/Settings.java index 6e870c791..8e0e6c73b 100644 --- a/project/java/Settings.java +++ b/project/java/Settings.java @@ -31,6 +31,9 @@ import android.widget.FrameLayout; import android.graphics.drawable.BitmapDrawable; import android.graphics.BitmapFactory; import android.graphics.Bitmap; +import android.widget.TextView; +import android.widget.EditText; +import android.text.Editable; @@ -95,6 +98,12 @@ class Settings out.writeInt(Globals.MultitouchGestureSensitivity); for( int i = 0; i < Globals.TouchscreenCalibration.length; i++ ) out.writeInt(Globals.TouchscreenCalibration[i]); + out.writeInt(Globals.DataDir.length()); + for( int i = 0; i < Globals.DataDir.length(); i++ ) + out.writeChar(Globals.DataDir.charAt(i)); + out.writeInt(Globals.CommandLine.length()); + for( int i = 0; i < Globals.CommandLine.length(); i++ ) + out.writeChar(Globals.CommandLine.charAt(i)); out.close(); settingsLoaded = true; @@ -200,6 +209,17 @@ class Settings Globals.MultitouchGestureSensitivity = settingsFile.readInt(); for( int i = 0; i < Globals.TouchscreenCalibration.length; i++ ) Globals.TouchscreenCalibration[i] = settingsFile.readInt(); + StringBuilder b = new StringBuilder(); + int len = settingsFile.readInt(); + for( int i = 0; i < len; i++ ) + b.append( settingsFile.readChar() ); + Globals.DataDir = b.toString(); + + b = new StringBuilder(); + len = settingsFile.readInt(); + for( int i = 0; i < len; i++ ) + b.append( settingsFile.readChar() ); + Globals.CommandLine = b.toString(); settingsLoaded = true; @@ -211,6 +231,11 @@ class Settings } catch( SecurityException e ) { } catch ( IOException e ) {}; + if( Globals.DataDir.length() == 0 ) + Globals.DataDir = Globals.DownloadToSdcard ? + Environment.getExternalStorageDirectory().getAbsolutePath() + "/app-data/" + Globals.class.getPackage().getName() : + p.getFilesDir().getAbsolutePath(); + // This code fails for both of my phones! /* Configuration c = new Configuration(); @@ -494,7 +519,8 @@ class Settings }catch(Exception e) {} final CharSequence[] items = { p.getResources().getString(R.string.storage_phone, freePhone), - p.getResources().getString(R.string.storage_sd, freeSdcard) }; + p.getResources().getString(R.string.storage_sd, freeSdcard), + p.getResources().getString(R.string.storage_custom) }; AlertDialog.Builder builder = new AlertDialog.Builder(p); String [] downloadFiles = Globals.DataDownloadUrl.split("\\^"); builder.setTitle(downloadFiles[0].split("[|]")[0]); @@ -502,9 +528,66 @@ class Settings { public void onClick(DialogInterface dialog, int item) { - Globals.DownloadToSdcard = (item == 1); + Globals.DownloadToSdcard = (item != 0); + Globals.DataDir = Globals.DownloadToSdcard ? + Environment.getExternalStorageDirectory().getAbsolutePath() + "/app-data/" + Globals.class.getPackage().getName() : + p.getFilesDir().getAbsolutePath(); dialog.dismiss(); + + if( item == 2 ) + showCustomDownloadDirConfig(p); + else + showConfigMainMenu(p); + } + }); + AlertDialog alert = builder.create(); + alert.setOwnerActivity(p); + alert.show(); + }; + + static void showCustomDownloadDirConfig(final MainActivity p) { + + AlertDialog.Builder builder = new AlertDialog.Builder(p); + builder.setTitle(p.getResources().getString(R.string.storage_custom)); + + final EditText edit = new EditText(p); + edit.setFocusableInTouchMode(true); + edit.setFocusable(true); + edit.setText(Globals.DataDir); + builder.setView(edit); + + builder.setPositiveButton(p.getResources().getString(R.string.ok), new DialogInterface.OnClickListener() + { + public void onClick(DialogInterface dialog, int item) + { + Globals.DataDir = edit.getText().toString(); + dialog.dismiss(); + showCommandLineConfig(p); + } + }); + AlertDialog alert = builder.create(); + alert.setOwnerActivity(p); + alert.show(); + }; + + static void showCommandLineConfig(final MainActivity p) { + + AlertDialog.Builder builder = new AlertDialog.Builder(p); + builder.setTitle(p.getResources().getString(R.string.storage_commandline)); + + final EditText edit = new EditText(p); + edit.setFocusableInTouchMode(true); + edit.setFocusable(true); + edit.setText(Globals.CommandLine); + builder.setView(edit); + + builder.setPositiveButton(p.getResources().getString(R.string.ok), new DialogInterface.OnClickListener() + { + public void onClick(DialogInterface dialog, int item) + { + Globals.CommandLine = edit.getText().toString(); + dialog.dismiss(); showConfigMainMenu(p); } }); @@ -1369,8 +1452,6 @@ class Settings static void Apply(Activity p) { - nativeIsSdcardUsed( Globals.DownloadToSdcard ? 1 : 0 ); - if( Globals.PhoneHasTrackball ) nativeSetTrackballUsed(); if( Globals.AppUsesMouse ) @@ -1452,7 +1533,6 @@ class Settings } } - private static native void nativeIsSdcardUsed(int flag); private static native void nativeSetTrackballUsed(); private static native void nativeSetTrackballDampening(int value); private static native void nativeSetAccelerometerSettings(int sensitivity, int centerPos); diff --git a/project/java/Video.java b/project/java/Video.java index 21d8b65c6..9d44b9cf9 100644 --- a/project/java/Video.java +++ b/project/java/Video.java @@ -212,9 +212,7 @@ class DemoRenderer extends GLSurfaceView_SDL.Renderer { // Tweak video thread priority, if user selected big audio buffer if(Globals.AudioBufferConfig >= 2) Thread.currentThread().setPriority( (Thread.NORM_PRIORITY + Thread.MIN_PRIORITY) / 2 ); // Lower than normal - nativeInit( Globals.DownloadToSdcard ? - Environment.getExternalStorageDirectory().getAbsolutePath() + "/app-data/" + Globals.class.getPackage().getName() : - context.getFilesDir().getAbsolutePath(), + nativeInit( Globals.DataDir, Globals.CommandLine); // Calls main() and never returns, hehe - we'll call eglSwapBuffers() from native code System.exit(0); // The main() returns here - I don't bother with deinit stuff, just terminate process } diff --git a/project/java/translations/values/strings.xml b/project/java/translations/values/strings.xml index e3cc5b03f..9961e711f 100644 --- a/project/java/translations/values/strings.xml +++ b/project/java/translations/values/strings.xml @@ -21,6 +21,8 @@ Internal storage - %d MB free SD card storage - %d MB free + Specify directory + Specify command line parameters Where to download application data Optional downloads OK diff --git a/project/jni/application/REminiscence/AndroidAppSettings.cfg b/project/jni/application/REminiscence/AndroidAppSettings.cfg index 8ce7bb650..6b79626d1 100644 --- a/project/jni/application/REminiscence/AndroidAppSettings.cfg +++ b/project/jni/application/REminiscence/AndroidAppSettings.cfg @@ -1,5 +1,5 @@ # The application settings for Android libSDL port -AppSettingVersion=15 +AppSettingVersion=16 LibSdlVersion=1.2 AppName="REminiscence" AppFullName=fr.freecyxdown.sdl @@ -20,6 +20,7 @@ NonBlockingSwapBuffers=n RedefinedKeys="RSHIFT RETURN BACKSPACE RETURN SPACE" AppTouchscreenKeyboardKeysAmount=3 AppTouchscreenKeyboardKeysAmountAutoFire=0 +RedefinedKeysScreenKb="RSHIFT RETURN BACKSPACE RETURN SPACE" MultiABI=n AppVersionCode=01901 AppVersionName="0.1.9" diff --git a/project/jni/application/alienblaster/AndroidAppSettings.cfg b/project/jni/application/alienblaster/AndroidAppSettings.cfg index bcf660fb9..a3e237025 100644 --- a/project/jni/application/alienblaster/AndroidAppSettings.cfg +++ b/project/jni/application/alienblaster/AndroidAppSettings.cfg @@ -1,5 +1,5 @@ # The application settings for Android libSDL port -AppSettingVersion=15 +AppSettingVersion=16 LibSdlVersion=1.3 AppName="Alien Blaster" AppFullName=de.schwardtnet.alienblaster @@ -20,6 +20,7 @@ NonBlockingSwapBuffers=n RedefinedKeys="RETURN LCTRL PAGEUP PAGEDOWN LCTRL" AppTouchscreenKeyboardKeysAmount=4 AppTouchscreenKeyboardKeysAmountAutoFire=1 +RedefinedKeysScreenKb="RETURN LCTRL PAGEUP PAGEDOWN LCTRL" MultiABI=n AppVersionCode=110013 AppVersionName="1.1.0.13 - fixed crashes for some devices" diff --git a/project/jni/application/openttd/AndroidAppSettings.cfg b/project/jni/application/openttd/AndroidAppSettings.cfg index c66887f42..62e4bfd02 100644 --- a/project/jni/application/openttd/AndroidAppSettings.cfg +++ b/project/jni/application/openttd/AndroidAppSettings.cfg @@ -22,8 +22,8 @@ AppTouchscreenKeyboardKeysAmount=0 AppTouchscreenKeyboardKeysAmountAutoFire=0 RedefinedKeysScreenKb="LALT RETURN KP_PLUS KP_MINUS SPACE DELETE KP_PLUS KP_MINUS 1 2" MultiABI=n -AppVersionCode=10508 -AppVersionName="1.0.5.08" +AppVersionCode=10509 +AppVersionName="1.0.5.09" CompiledLibraries="jpeg png freetype timidity lzma lzo2" CustomBuildScript=y AppCflags='' diff --git a/project/jni/application/src b/project/jni/application/src index 59d41f41e..104f796a6 120000 --- a/project/jni/application/src +++ b/project/jni/application/src @@ -1 +1 @@ -fheroes2 \ No newline at end of file +ballfield \ No newline at end of file diff --git a/project/jni/sdl_main/sdl_main.c b/project/jni/sdl_main/sdl_main.c index 67a8e5d7e..7d306bc9b 100644 --- a/project/jni/sdl_main/sdl_main.c +++ b/project/jni/sdl_main/sdl_main.c @@ -25,40 +25,27 @@ #define JAVA_EXPORT_NAME(name) JAVA_EXPORT_NAME1(name,SDL_JAVA_PACKAGE_PATH) -static int isSdcardUsed = 0; - extern C_LINKAGE void JAVA_EXPORT_NAME(DemoRenderer_nativeInit) ( JNIEnv* env, jobject thiz, jstring jcurdir, jstring cmdline ) { int i = 0; char curdir[PATH_MAX] = ""; - char realcurdir[PATH_MAX] = ""; const jbyte *jstr; const char * str = "sdl"; int argc = 0; char ** argv = NULL; - if( isSdcardUsed ) - { - strcpy(curdir, "/sdcard/app-data/"); - strcat(curdir, SDL_CURDIR_PATH); - } - else - { - strcpy(curdir, "/data/data/"); - strcat(curdir, SDL_CURDIR_PATH); - strcat(curdir, "/files"); - } + strcpy(curdir, "/sdcard/app-data/"); + strcat(curdir, SDL_CURDIR_PATH); jstr = (*env)->GetStringUTFChars(env, jcurdir, NULL); if (jstr != NULL && strlen(jstr) > 0) strcpy(curdir, jstr); (*env)->ReleaseStringUTFChars(env, jcurdir, jstr); - if( realpath(curdir, realcurdir) == NULL ) - strcpy(realcurdir, curdir); - chdir(realcurdir); - setenv("HOME", realcurdir, 1); + chdir(curdir); + setenv("HOME", curdir, 1); + __android_log_print(ANDROID_LOG_INFO, "libSDL", "Changing curdir to \"%s\"", curdir); jstr = (*env)->GetStringUTFChars(env, cmdline, NULL); @@ -104,12 +91,6 @@ JAVA_EXPORT_NAME(DemoRenderer_nativeInit) ( JNIEnv* env, jobject thiz, jstring }; -extern C_LINKAGE void -JAVA_EXPORT_NAME(Settings_nativeIsSdcardUsed) ( JNIEnv* env, jobject thiz, jint flag ) -{ - isSdcardUsed = flag; -} - extern C_LINKAGE void JAVA_EXPORT_NAME(Settings_nativeSetEnv) ( JNIEnv* env, jobject thiz, jstring j_name, jstring j_value ) { diff --git a/readme.txt b/readme.txt index 8b753565e..8df1da60b 100644 --- a/readme.txt +++ b/readme.txt @@ -16,28 +16,33 @@ http://www.pocketmagic.net/?p=1332 - guide how to set up environment in Cygwin. Please don't use NDK r5, it is buggy, wait for NDK r5b: http://groups.google.com/group/android-ndk/browse_thread/thread/6b35728eec7ef52f/b57f52776842041d -How to compile Alien Blaster demo application -============================================= +How to compile demo application +=============================== Go to "project" directory and launch command android update project -p . + rm project/jni/application/src + ln -s ballfield project/jni/application/src Then go back, edit file build.sh if needed to add NDK dir to your PATH, then launch it. It will compile a bunch of libs under project/libs/armeabi, create file project/bin/DemoActivity-debug.apk and install it on your device or emulator. -Then you can test it by launching Alien Blaster icon from Android applications menu. -It's designed for 640x480, so if you have smaller screen it will be resized. +Then you can test it by launching Ballfield icon from Android applications menu. +It's designed for 320x240, so if you have smaller screen it will be resized. Note: The game enforces horizontal screen orientation, you may open your keyboard and use it for additional keys - the phone will just keep current screen orientation. Recent Android phone models like HTC Evo have no keyboard at all, on-screen keyboard built into libSDL is available for such devices - it has joystick (which can be configured as arrow buttons or analog joystick), -and 6 configurable keys, full text input is toggled with 7-th key. Application may redefine button layout -and returned keycodes, and also toggle full text input - see SDL_screenkeyboard.h. +and 6 configurable keys, full text input is toggled with 7-th key. Both user and application may redefine +button layout and returned keycodes, and also toggle full text input - see SDL_screenkeyboard.h. This port also supports GL ES + SDL combo - there is GLXGears demo app in project/jni/application/glxgears, remove project/jni/application/src symlink and make new one pointing to glxgears, then run build.sh Note that GL ES is NOT pure OpenGL - there are no glBegin() and glEnd() call and other widely used functions, and generally it will take a lot of effort to port pure OpenGL application to GL ES. +Previously The Alien Blaster was the default demo application, however it uses SDL 1.3 and I'm breaking +the compilation too often, so if something does not compile please try to use some older revision. + How to compile your own application ===================================