diff --git a/changeAppSettings.sh b/changeAppSettings.sh index 2d4a3e1..5cc9591 100755 --- a/changeAppSettings.sh +++ b/changeAppSettings.sh @@ -358,7 +358,7 @@ echo "# 9 = Nintendo64 from RetroArch" >> AndroidAppSettings.cfg echo TouchscreenKeysTheme=$TouchscreenKeysTheme >> AndroidAppSettings.cfg echo >> AndroidAppSettings.cfg echo "# Redefine gamepad keys to SDL keysyms, button order is:" >> AndroidAppSettings.cfg -echo "# A B X Y L1 R1 L2 R2 LThumb RThumb Start Select Up Down Left Right LThumbUp LThumbDown LThumbLeft LThumbRight RThumbUp RThumbDown RThumbLeft RThumbRight" >> AndroidAppSettings.cfg +echo "# A B X Y C Z L1 R1 L2 R2 LThumb RThumb Start Select Up Down Left Right LThumbUp LThumbDown LThumbLeft LThumbRight RThumbUp RThumbDown RThumbLeft RThumbRight" >> AndroidAppSettings.cfg echo RedefinedKeysGamepad=\"$RedefinedKeysGamepad\" >> AndroidAppSettings.cfg echo >> AndroidAppSettings.cfg echo "# Redefine keys for the second gamepad, same as the first gamepad if not set:" >> AndroidAppSettings.cfg diff --git a/project/java/Globals.java b/project/java/Globals.java index f13a379..34af106 100644 --- a/project/java/Globals.java +++ b/project/java/Globals.java @@ -120,7 +120,7 @@ class Globals public static int ClickScreenPressure = 0; public static int ClickScreenTouchspotSize = 0; public static boolean FingerHover = true; - public static boolean HoverJitterFilter = true; + public static boolean HoverJitterFilter = false; public static boolean GenerateSubframeTouchEvents = false; public static boolean KeepAspectRatio = KeepAspectRatioDefaultSetting; public static boolean TvBorders = true; @@ -137,7 +137,7 @@ class Globals public static int MultitouchGestureSensitivity = 1; public static int TouchscreenCalibration[] = new int[4]; public static String DataDir = new String(""); - public static boolean VideoLinearFilter = true; + public static boolean VideoLinearFilter = false; public static boolean MultiThreadedVideo = false; public static boolean OuyaEmulation = false; // For debugging diff --git a/project/java/MainActivity.java b/project/java/MainActivity.java index cbf7e31..2abbc2b 100644 --- a/project/java/MainActivity.java +++ b/project/java/MainActivity.java @@ -97,9 +97,15 @@ import android.app.UiModeManager; import android.Manifest; import android.content.pm.PermissionInfo; import java.util.Arrays; +// ********************************** IURI ********************************** // +import com.google.android.gms.*; +import com.google.android.gms.common.api.GoogleApiClient; +import com.google.android.gms.games.Games; +import com.google.android.gms.common.ConnectionResult; +// ********************************** IURI ********************************** // -public class MainActivity extends Activity +public class MainActivity extends Activity implements GoogleApiClient.ConnectionCallbacks, GoogleApiClient.OnConnectionFailedListener { @Override protected void onCreate(Bundle savedInstanceState) @@ -248,6 +254,17 @@ public class MainActivity extends Activity startService(intent); } cloudSave = new CloudSave(this); + + // ********************************** IURI ********************************** // + // Create the Google Api Client with access to the Play Games services + mGoogleApiClient = new GoogleApiClient.Builder(this) + .addConnectionCallbacks(this) + .addOnConnectionFailedListener(this) + .addApi(Games.API).addScope(Games.SCOPE_GAMES) + // add other APIs and scopes here as needed + .build(); + // ********************************** IURI ********************************** // + // Request SD card permission right during start, because game devs don't care about runtime permissions and stuff try { @@ -269,6 +286,46 @@ public class MainActivity extends Activity catch(Exception e) {} } + // ********************************** IURI ********************************** // + @Override + public void onConnectionSuspended(int i) { + // Attempt to reconnect + mGoogleApiClient.connect(); + } + + + @Override + public void onConnectionFailed(ConnectionResult connectionResult) { + if (mResolvingConnectionFailure) { + // already resolving + return; + } + + // if the sign-in button was clicked or if auto sign-in is enabled, + // launch the sign-in flow + if (mSignInClicked || mAutoStartSignInFlow) { + mAutoStartSignInFlow = false; + mSignInClicked = false; + mResolvingConnectionFailure = true; + + /* + // Attempt to resolve the connection failure using BaseGameUtils. + // The R.string.signin_other_error value should reference a generic + // error string in your strings.xml file, such as "There was + // an issue with sign-in, please try again later." + if (!BaseGameUtils.resolveConnectionFailure(this, + mGoogleApiClient, connectionResult, + RC_SIGN_IN, R.string.signin_other_error)) { + mResolvingConnectionFailure = false; + } + */ + } + + // Put code here to display the sign-in button + } + + // ********************************** IURI ********************************** // + public void setUpStatusLabel() { MainActivity Parent = this; // Too lazy to rename @@ -584,18 +641,44 @@ public class MainActivity extends Activity protected void onStart() { super.onStart(); cloudSave.onStart(); + mGoogleApiClient.connect(); } @Override protected void onStop() { super.onStart(); cloudSave.onStop(); + mGoogleApiClient.disconnect(); } + + @Override + public void onConnected(Bundle connectionHint) { + // The player is signed in. Hide the sign-in button and allow the + // player to proceed. + } @Override public void onActivityResult(int request, int response, Intent data) { super.onActivityResult(request, response, data); cloudSave.onActivityResult(request, response, data); + // ********************************** IURI ********************************** // + if (request == RC_SIGN_IN) { + mSignInClicked = false; + mResolvingConnectionFailure = false; + if (response == RESULT_OK) { + mGoogleApiClient.connect(); + } else { + Log.i("SDL", "libSDL::ROCKBOT >>>>>>>>>>>>>>>> onActivityResult: connect failed <<<<<<<<<<<<<<<<<<<<<<"); + /* + // Bring up an error dialog to alert the user that sign-in + // failed. The R.string.signin_failure should reference an error + // string in your strings.xml file that tells the user they + // could not be signed in, such as "Unable to sign in." + BaseGameUtils.showActivityResultError(this, requestCode, resultCode, R.string.signin_failure); + */ + } + } + // ********************************** IURI ********************************** // } private int TextInputKeyboardList[][] = @@ -1044,7 +1127,55 @@ public class MainActivity extends Activity runOnUiThread(new Callback()); } } - + + // ********************************** IURI ********************************** // + public void unlockAchievement(final String achievementId) + { + // logged-in check + if (!mGoogleApiClient.isConnected()) { + connectPlayServices(); + } + // run on a thread so we don't freeze game + runOnUiThread(new Runnable() { + public void run() { + //Games.Achievements.unlock(((AppActivity)currentContext).getGameHelper().getApiClient(), achievementIDs[currentAchievementID]); + Games.Achievements.unlock(mGoogleApiClient, achievementId); + } + }); + } + + public void connectPlayServices() { + // TODO: run on a thread + mSignInClicked = true; + + // already connected + if (mGoogleApiClient.isConnected()) { + return; + } + // run on a thread so we don't freeze game + runOnUiThread(new Runnable() { + public void run() { + mGoogleApiClient.connect(); + } + }); + } + + public void disconnectPlayServices() { + // TODO: run on a thread + mSignInClicked = false; + // already disconnected + if (!mGoogleApiClient.isConnected()) { + return; + } + + // run on a thread so we don't freeze game + runOnUiThread(new Runnable() { + public void run() { + Games.signOut(mGoogleApiClient); + } + }); + } + // ********************************** IURI ********************************** // /* @Override public boolean onKeyDown(int keyCode, final KeyEvent event) @@ -1565,6 +1696,15 @@ public class MainActivity extends Activity public LinkedList textInput = new LinkedList (); public static MainActivity instance = null; public boolean writeExternalStoragePermissionDialogAnswered = false; + + // ********************************** IURI ********************************** // + private GoogleApiClient mGoogleApiClient; + private static int RC_SIGN_IN = 9001; + private boolean mResolvingConnectionFailure = false; + private boolean mAutoStartSignInFlow = true; + private boolean mSignInClicked = false; + // ********************************** IURI ********************************** // + } // *** HONEYCOMB / ICS FIX FOR FULLSCREEN MODE, by lmak *** diff --git a/project/jni/sdl-1.2/include/SDL_android.h b/project/jni/sdl-1.2/include/SDL_android.h index d22494b..f2aabbe 100644 --- a/project/jni/sdl-1.2/include/SDL_android.h +++ b/project/jni/sdl-1.2/include/SDL_android.h @@ -110,6 +110,11 @@ Returns 1 if save succeeded, 0 if user aborted sign-in, or there was no network extern DECLSPEC int SDLCALL SDL_ANDROID_CloudSave(const char *filename, const char *saveId, const char *dialogTitle, const char *description, const char *screenshotFile, uint64_t playedTimeMs); +extern DECLSPEC void SDLCALL SDL_ANDROID_ConnectPlayServices(); +extern DECLSPEC void SDLCALL SDL_ANDROID_DisconnectPlayServices(); +extern DECLSPEC void SDLCALL SDL_ANDROID_UnlockAchievement(const char *achievement_id); + + /* Load the specified file from the cloud. This function will block, until user signs in to the cloud account, and selects a savegame. diff --git a/project/jni/sdl-1.2/include/SDL_screenkeyboard.h b/project/jni/sdl-1.2/include/SDL_screenkeyboard.h index 7fa0ea1..137a426 100644 --- a/project/jni/sdl-1.2/include/SDL_screenkeyboard.h +++ b/project/jni/sdl-1.2/include/SDL_screenkeyboard.h @@ -183,13 +183,13 @@ enum Analog thumb joysticks will send keycodes instead of joystick events only if SDL_JoystickOpen() was NOT called for joystick IDs from 2 to 5. */ extern DECLSPEC void SDLCALL SDL_ANDROID_SetIndividualGamepadKeymap(int GamepadId, - int A, int B, int X, int Y, int L1, int R1, int L2, int R2, int LThumb, int RThumb, + int A, int B, int X, int Y, int C, int Z, int L1, int R1, int L2, int R2, int LThumb, int RThumb, int Start, int Select, int Up, int Down, int Left, int Right, int LThumbUp, int LThumbDown, int LThumbLeft, int LThumbRight, int RThumbUp, int RThumbDown, int RThumbLeft, int RThumbRight); /* Deprecated API, will change keymap for all gamepads */ -extern DECLSPEC void SDLCALL SDL_ANDROID_SetGamepadKeymap(int A, int B, int X, int Y, int L1, int R1, int L2, int R2, int LThumb, int RThumb); +extern DECLSPEC void SDLCALL SDL_ANDROID_SetGamepadKeymap(int A, int B, int X, int Y, int C, int Z, int L1, int R1, int L2, int R2, int LThumb, int RThumb); /* Set SDL keycode for hardware Android key. Android keycodes are defined here: http://developer.android.com/reference/android/view/KeyEvent.html#KEYCODE_0 diff --git a/project/jni/sdl-1.2/src/video/android/SDL_androidinput.c b/project/jni/sdl-1.2/src/video/android/SDL_androidinput.c index aa199ec..f00eafc 100644 --- a/project/jni/sdl-1.2/src/video/android/SDL_androidinput.c +++ b/project/jni/sdl-1.2/src/video/android/SDL_androidinput.c @@ -61,17 +61,25 @@ SDLKey SDL_android_gamepad_keymap[SDL_ANDROID_MAX_GAMEPADS][KEYCODE_LAST+1]; static inline SDL_scancode TranslateKey(int scancode) { - if ( scancode >= KEYCODE_LAST + 1 ) + if ( scancode >= KEYCODE_LAST + 1 ) { + __android_log_print(ANDROID_LOG_INFO, "libSDL","### UNKNOWN #1 KEY[%d] ###", scancode); scancode = KEYCODE_UNKNOWN; + } return SDL_android_keymap[scancode]; } static inline SDL_scancode TranslateKeyGamepad(int scancode, int gamepadId) { - if ( scancode >= KEYCODE_LAST + 1 ) + if ( scancode >= KEYCODE_LAST + 1 ) { + __android_log_print(ANDROID_LOG_INFO, "libSDL","### UNKNOWN #2 KEY[%d] ###", scancode); scancode = KEYCODE_UNKNOWN; + } if (gamepadId < 0 || gamepadId > SDL_ANDROID_MAX_GAMEPADS) gamepadId = 0; + + __android_log_print(ANDROID_LOG_INFO, "libSDL","######## TranslateKeyGamepad - scancode[%d], gamepadId[%d], KEYCODE_LAST+1[%d]", + scancode, gamepadId, (KEYCODE_LAST+1)); + return gamepadId ? SDL_android_gamepad_keymap[gamepadId - 1][scancode] : SDL_android_keymap[scancode]; } @@ -990,7 +998,7 @@ JAVA_EXPORT_NAME(DemoGLSurfaceView_nativeKey) ( JNIEnv* env, jobject thiz, jint return 1; #endif - //__android_log_print(ANDROID_LOG_INFO, "libSDL", "%s: gamepadId %d", __FUNCTION__, gamepadId); + __android_log_print(ANDROID_LOG_INFO, "libSDL", "%s: gamepadId %d", __FUNCTION__, gamepadId); if( key == rightClickKey && rightClickMethod == RIGHT_CLICK_WITH_KEY ) { @@ -1004,10 +1012,12 @@ JAVA_EXPORT_NAME(DemoGLSurfaceView_nativeKey) ( JNIEnv* env, jobject thiz, jint } keycode = TranslateKeyGamepad(key, gamepadId); - //__android_log_print(ANDROID_LOG_INFO, "libSDL","nativeKey %d action %d translated %d unicode %d", key, action, keycode, unicode); + __android_log_print(ANDROID_LOG_INFO, "libSDL",">>>>>>>>>>>>>>>>> nativeKey[%d] action[%d] translated[%d] unicode[%d]", key, action, keycode, unicode); - if( (int)keycode == SDLK_NO_REMAP || (keycode == SDLK_UNKNOWN && unicode == 0) ) + if( (int)keycode == SDLK_NO_REMAP || (keycode == SDLK_UNKNOWN && unicode == 0) ) { + __android_log_print(ANDROID_LOG_INFO, "libSDL",">>>>>>>>>>>>>>> KEYCODE::RETURN[0]"); return 0; + } if( keycode == SDLK_UNKNOWN || unicode != unshifted ) { @@ -1696,16 +1706,20 @@ void ANDROID_InitOSKeymap() JNIEXPORT jint JNICALL JAVA_EXPORT_NAME(Settings_nativeGetKeymapKey) (JNIEnv* env, jobject thiz, jint code) { - if( code < 0 || code > KEYCODE_LAST ) + if( code < 0 || code > KEYCODE_LAST ) { + __android_log_print(ANDROID_LOG_INFO, "libSDL","### ERROR #2 ###"); return SDL_KEY(UNKNOWN); + } return SDL_android_keymap[code]; } JNIEXPORT void JNICALL JAVA_EXPORT_NAME(Settings_nativeSetKeymapKey) (JNIEnv* env, jobject thiz, jint javakey, jint key) { - if( javakey < 0 || javakey > KEYCODE_LAST ) + if( javakey < 0 || javakey > KEYCODE_LAST ) { + __android_log_print(ANDROID_LOG_INFO, "libSDL","### ERROR #3 ###"); return; + } SDL_android_keymap[javakey] = key; } @@ -1747,7 +1761,7 @@ JAVA_EXPORT_NAME(Settings_nativeInitKeymap) ( JNIEnv* env, jobject thiz ) } void SDL_ANDROID_SetIndividualGamepadKeymap(int GamepadId, - int A, int B, int X, int Y, int L1, int R1, int L2, int R2, int LThumb, int RThumb, + int A, int B, int X, int Y, int C, int Z, int L1, int R1, int L2, int R2, int LThumb, int RThumb, int Start, int Select, int Up, int Down, int Left, int Right, int LThumbUp, int LThumbDown, int LThumbLeft, int LThumbRight, int RThumbUp, int RThumbDown, int RThumbLeft, int RThumbRight) @@ -1763,19 +1777,44 @@ void SDL_ANDROID_SetIndividualGamepadKeymap(int GamepadId, A = B C and Z do not exist, they also do not exist on any gamepad I've seen (PS3/XBox/SHIELD) */ + + __android_log_print(ANDROID_LOG_INFO, "libSDL",">>>>>>>>>>>>>>> SDL_ANDROID_SetIndividualGamepadKeymap::gamepad[%d]::keys[%d][%d][%d][%d][%d][%d][%d][%d][%d][%d][%d][%d][%d][%d][%d][%d]", + GamepadId, A, B, X, Y, L1, R1, L2, R2, LThumb, RThumb, Start, Select, Up, Down, Left, Right + ); + // [ A ][B ][ X ][Y ][L1 ][R1 ][L2 ][R2 ] + //SDL_ANDROID_SetIndividualGamepadKeymap::gamepad[0]::keys[120][97][118][98][113][119][101][114][116][121][13][278][273][274][276][275] + // Y => 98 + // L2 => 101 + + __android_log_print(ANDROID_LOG_INFO, "libSDL","%%%%%%%%%% SDL_ANDROID_SetIndividualGamepadKeymap::KEYCODE_BUTTON_A[%d], KEYCODE_BUTTON_Y[%d], KEYCODE_BUTTON_1[%d], KEYCODE_BUTTON_L2[%d], KEYCODE_BUTTON_7[%d]", KEYCODE_BUTTON_A, KEYCODE_BUTTON_Y, KEYCODE_BUTTON_1, KEYCODE_BUTTON_L2, KEYCODE_BUTTON_7); + +/* + +SDL_ANDROID_SetIndividualGamepadKeymap::KEYCODE_BUTTON_A[96], KEYCODE_BUTTON_Y[100], KEYCODE_BUTTON_1[188], KEYCODE_BUTTON_L2[104], KEYCODE_BUTTON_7[194] + + +*/ if( GamepadId < 0 || GamepadId >= SDL_ANDROID_MAX_GAMEPADS ) return; if (A) SDL_android_gamepad_keymap[GamepadId][KEYCODE_BUTTON_A] = A; if (A) SDL_android_gamepad_keymap[GamepadId][KEYCODE_BUTTON_3] = A; - if (B) SDL_android_gamepad_keymap[GamepadId][KEYCODE_BUTTON_B] = B; + + if (B) SDL_android_gamepad_keymap[GamepadId][KEYCODE_BUTTON_B] = B; if (B) SDL_android_gamepad_keymap[GamepadId][KEYCODE_BUTTON_2] = B; - if (B) SDL_android_gamepad_keymap[GamepadId][KEYCODE_BUTTON_C] = B; - if (X) SDL_android_gamepad_keymap[GamepadId][KEYCODE_BUTTON_X] = X; + + if (X) SDL_android_gamepad_keymap[GamepadId][KEYCODE_BUTTON_X] = X; if (X) SDL_android_gamepad_keymap[GamepadId][KEYCODE_BUTTON_4] = X; if (Y) SDL_android_gamepad_keymap[GamepadId][KEYCODE_BUTTON_Y] = Y; if (Y) SDL_android_gamepad_keymap[GamepadId][KEYCODE_BUTTON_1] = Y; + + if (C) SDL_android_gamepad_keymap[GamepadId][KEYCODE_BUTTON_C] = C; + if (C) SDL_android_gamepad_keymap[GamepadId][KEYCODE_BUTTON_13] = C; + if (Z) SDL_android_gamepad_keymap[GamepadId][KEYCODE_BUTTON_Z] = Z; + if (Z) SDL_android_gamepad_keymap[GamepadId][KEYCODE_BUTTON_14] = Z; + + if (L1) SDL_android_gamepad_keymap[GamepadId][KEYCODE_BUTTON_L1] = L1; if (L1) SDL_android_gamepad_keymap[GamepadId][KEYCODE_BUTTON_5] = L1; if (R1) SDL_android_gamepad_keymap[GamepadId][KEYCODE_BUTTON_R1] = R1; @@ -1813,26 +1852,28 @@ void SDL_ANDROID_SetIndividualGamepadKeymap(int GamepadId, { SDL_android_keymap[i] = SDL_android_gamepad_keymap[GamepadId][i]; } - for( i = KEYCODE_BUTTON_1; i <= KEYCODE_BUTTON_12; i++ ) + for( i = KEYCODE_BUTTON_1; i <= KEYCODE_BUTTON_14; i++ ) { SDL_android_keymap[i] = SDL_android_gamepad_keymap[GamepadId][i]; } } } -void SDL_ANDROID_SetGamepadKeymap(int A, int B, int X, int Y, int L1, int R1, int L2, int R2, int LThumb, int RThumb) +void SDL_ANDROID_SetGamepadKeymap(int A, int B, int X, int Y, int C, int Z, int L1, int R1, int L2, int R2, int LThumb, int RThumb) { int i; for( i = 0; i < SDL_ANDROID_MAX_GAMEPADS; i++ ) { - SDL_ANDROID_SetIndividualGamepadKeymap(i, A, B, X, Y, L1, R1, L2, R2, LThumb, RThumb, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0); + SDL_ANDROID_SetIndividualGamepadKeymap(i, A, B, X, Y, C, Z, L1, R1, L2, R2, LThumb, RThumb, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0); } } void SDL_ANDROID_SetAndroidKeycode(int Android_Key, int Sdl_Key) { - if (Android_Key < 0 || Android_Key >= KEYCODE_LAST) + if (Android_Key < 0 || Android_Key >= KEYCODE_LAST) { + __android_log_print(ANDROID_LOG_INFO, "libSDL","### ERROR #1 ###"); return; + } SDL_android_keymap[Android_Key] = Sdl_Key; } diff --git a/project/jni/sdl-1.2/src/video/android/SDL_androidinput.h b/project/jni/sdl-1.2/src/video/android/SDL_androidinput.h index 345312d..a79b612 100644 --- a/project/jni/sdl-1.2/src/video/android/SDL_androidinput.h +++ b/project/jni/sdl-1.2/src/video/android/SDL_androidinput.h @@ -284,6 +284,12 @@ extern int SDL_ANDROID_isTouchscreenKeyboardUsed; #ifndef SDL_ANDROID_GAMEPAD_0_KEYCODE_23 #define SDL_ANDROID_GAMEPAD_0_KEYCODE_23 UNKNOWN #endif +#ifndef SDL_ANDROID_GAMEPAD_0_KEYCODE_24 +#define SDL_ANDROID_GAMEPAD_0_KEYCODE_24 UNKNOWN +#endif +#ifndef SDL_ANDROID_GAMEPAD_0_KEYCODE_25 +#define SDL_ANDROID_GAMEPAD_0_KEYCODE_25 UNKNOWN +#endif #ifndef SDL_ANDROID_GAMEPAD_1_KEYCODE_0 #define SDL_ANDROID_GAMEPAD_1_KEYCODE_0 SDL_ANDROID_GAMEPAD_0_KEYCODE_0 @@ -357,6 +363,12 @@ extern int SDL_ANDROID_isTouchscreenKeyboardUsed; #ifndef SDL_ANDROID_GAMEPAD_1_KEYCODE_23 #define SDL_ANDROID_GAMEPAD_1_KEYCODE_23 SDL_ANDROID_GAMEPAD_0_KEYCODE_23 #endif +#ifndef SDL_ANDROID_GAMEPAD_1_KEYCODE_24 +#define SDL_ANDROID_GAMEPAD_1_KEYCODE_24 SDL_ANDROID_GAMEPAD_0_KEYCODE_24 +#endif +#ifndef SDL_ANDROID_GAMEPAD_1_KEYCODE_25 +#define SDL_ANDROID_GAMEPAD_1_KEYCODE_25 SDL_ANDROID_GAMEPAD_0_KEYCODE_25 +#endif #ifndef SDL_ANDROID_GAMEPAD_2_KEYCODE_0 #define SDL_ANDROID_GAMEPAD_2_KEYCODE_0 SDL_ANDROID_GAMEPAD_0_KEYCODE_0 @@ -430,6 +442,12 @@ extern int SDL_ANDROID_isTouchscreenKeyboardUsed; #ifndef SDL_ANDROID_GAMEPAD_2_KEYCODE_23 #define SDL_ANDROID_GAMEPAD_2_KEYCODE_23 SDL_ANDROID_GAMEPAD_0_KEYCODE_23 #endif +#ifndef SDL_ANDROID_GAMEPAD_2_KEYCODE_24 +#define SDL_ANDROID_GAMEPAD_2_KEYCODE_24 SDL_ANDROID_GAMEPAD_0_KEYCODE_24 +#endif +#ifndef SDL_ANDROID_GAMEPAD_2_KEYCODE_25 +#define SDL_ANDROID_GAMEPAD_2_KEYCODE_25 SDL_ANDROID_GAMEPAD_0_KEYCODE_25 +#endif #ifndef SDL_ANDROID_GAMEPAD_3_KEYCODE_0 #define SDL_ANDROID_GAMEPAD_3_KEYCODE_0 SDL_ANDROID_GAMEPAD_0_KEYCODE_0 @@ -503,7 +521,12 @@ extern int SDL_ANDROID_isTouchscreenKeyboardUsed; #ifndef SDL_ANDROID_GAMEPAD_3_KEYCODE_23 #define SDL_ANDROID_GAMEPAD_3_KEYCODE_23 SDL_ANDROID_GAMEPAD_0_KEYCODE_23 #endif - +#ifndef SDL_ANDROID_GAMEPAD_3_KEYCODE_24 +#define SDL_ANDROID_GAMEPAD_3_KEYCODE_24 SDL_ANDROID_GAMEPAD_0_KEYCODE_24 +#endif +#ifndef SDL_ANDROID_GAMEPAD_3_KEYCODE_25 +#define SDL_ANDROID_GAMEPAD_3_KEYCODE_25 SDL_ANDROID_GAMEPAD_0_KEYCODE_25 +#endif // Queue events to main thread extern void SDL_ANDROID_MainThreadPushMouseMotion(int x, int y); diff --git a/project/jni/sdl-1.2/src/video/android/SDL_androidvideo.c b/project/jni/sdl-1.2/src/video/android/SDL_androidvideo.c index ca886e1..ad2c12d 100644 --- a/project/jni/sdl-1.2/src/video/android/SDL_androidvideo.c +++ b/project/jni/sdl-1.2/src/video/android/SDL_androidvideo.c @@ -86,6 +86,14 @@ static jmethodID JavaSetAdvertisementPosition = NULL; static jmethodID JavaRequestNewAdvertisement = NULL; static jmethodID JavaRequestCloudSave = NULL; static jmethodID JavaRequestCloudLoad = NULL; + +// IURI // +static jmethodID JavaRequestUnlockAchievement = NULL; +static jmethodID JavaRequestConnectPlayServices = NULL; +static jmethodID JavaRequestDisconnectPlayServices = NULL; + +// IURI // + static jmethodID JavaRequestOpenExternalApp = NULL; static jmethodID JavaRequestRestartMyself = NULL; static jmethodID JavaRequestSetConfigOption = NULL; @@ -389,6 +397,15 @@ JAVA_EXPORT_NAME(DemoRenderer_nativeInitJavaCallbacks) ( JNIEnv* env, jobject t "(Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;J)Z"); JavaRequestCloudLoad = (*JavaEnv)->GetMethodID(JavaEnv, JavaRendererClass, "cloudLoad", "(Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;)Z"); + + + // ********************************** IURI ********************************** // + JavaRequestUnlockAchievement = (*JavaEnv)->GetMethodID(JavaEnv, JavaRendererClass, "unlockAchievement", "(Ljava/lang/String;)V"); + JavaRequestConnectPlayServices = (*JavaEnv)->GetMethodID(JavaEnv, JavaRendererClass, "connectPlayServices", "()V"); + JavaRequestDisconnectPlayServices = (*JavaEnv)->GetMethodID(JavaEnv, JavaRendererClass, "disconnectPlayServices", "()V"); + + // ********************************** IURI ********************************** // + JavaRequestOpenExternalApp = (*JavaEnv)->GetMethodID(JavaEnv, JavaRendererClass, "openExternalApp", "(Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;)V"); JavaRequestRestartMyself = (*JavaEnv)->GetMethodID(JavaEnv, JavaRendererClass, "restartMyself", "(Ljava/lang/String;)V"); JavaRequestSetConfigOption = (*JavaEnv)->GetMethodID(JavaEnv, JavaRendererClass, "setConfigOptionFromSDL", "(II)V"); @@ -643,6 +660,36 @@ void SDLCALL SDL_ANDROID_RestartMyself(const char *restartParams) (*JavaEnv)->PopLocalFrame(JavaEnv, NULL); } +// ********************************** IURI ********************************** // +void SDLCALL SDL_ANDROID_UnlockAchievement(const char *achievement_id) +{ + JNIEnv *JavaEnv = GetJavaEnv(); + (*JavaEnv)->PushLocalFrame(JavaEnv, 1); + jstring s1 = achievement_id ? (*JavaEnv)->NewStringUTF(JavaEnv, achievement_id) : (*JavaEnv)->NewStringUTF(JavaEnv, ""); + (*JavaEnv)->CallVoidMethod( JavaEnv, JavaRenderer, JavaRequestUnlockAchievement, s1 ); + (*JavaEnv)->DeleteLocalRef(JavaEnv, s1); + (*JavaEnv)->PopLocalFrame(JavaEnv, NULL); +} + + +void SDLCALL SDL_ANDROID_ConnectPlayServices() +{ + JNIEnv *JavaEnv = GetJavaEnv(); + (*JavaEnv)->PushLocalFrame(JavaEnv, 1); + (*JavaEnv)->CallVoidMethod( JavaEnv, JavaRenderer, JavaRequestConnectPlayServices ); + (*JavaEnv)->PopLocalFrame(JavaEnv, NULL); +} + +void SDLCALL SDL_ANDROID_DisconnectPlayServices() +{ + JNIEnv *JavaEnv = GetJavaEnv(); + (*JavaEnv)->PushLocalFrame(JavaEnv, 1); + (*JavaEnv)->CallVoidMethod( JavaEnv, JavaRenderer, JavaRequestDisconnectPlayServices ); + (*JavaEnv)->PopLocalFrame(JavaEnv, NULL); +} + +// ********************************** IURI ********************************** // + void SDLCALL SDL_ANDROID_SetConfigOption(int option, int value) { JNIEnv *JavaEnv = GetJavaEnv(); diff --git a/project/jni/sdl-1.2/src/video/android/keymap.c b/project/jni/sdl-1.2/src/video/android/keymap.c index 2b3b507..185bd26 100644 --- a/project/jni/sdl-1.2/src/video/android/keymap.c +++ b/project/jni/sdl-1.2/src/video/android/keymap.c @@ -293,7 +293,9 @@ void SDL_android_init_keymap(SDLKey *SDL_android_keymap) SDL_KEY(SDL_KEY_VAL(SDL_ANDROID_GAMEPAD_0_KEYCODE_20)), SDL_KEY(SDL_KEY_VAL(SDL_ANDROID_GAMEPAD_0_KEYCODE_21)), SDL_KEY(SDL_KEY_VAL(SDL_ANDROID_GAMEPAD_0_KEYCODE_22)), - SDL_KEY(SDL_KEY_VAL(SDL_ANDROID_GAMEPAD_0_KEYCODE_23)) + SDL_KEY(SDL_KEY_VAL(SDL_ANDROID_GAMEPAD_2_KEYCODE_23)), + SDL_KEY(SDL_KEY_VAL(SDL_ANDROID_GAMEPAD_2_KEYCODE_24)), + SDL_KEY(SDL_KEY_VAL(SDL_ANDROID_GAMEPAD_2_KEYCODE_25)) ); SDL_ANDROID_SetIndividualGamepadKeymap( 1, @@ -320,7 +322,9 @@ void SDL_android_init_keymap(SDLKey *SDL_android_keymap) SDL_KEY(SDL_KEY_VAL(SDL_ANDROID_GAMEPAD_1_KEYCODE_20)), SDL_KEY(SDL_KEY_VAL(SDL_ANDROID_GAMEPAD_1_KEYCODE_21)), SDL_KEY(SDL_KEY_VAL(SDL_ANDROID_GAMEPAD_1_KEYCODE_22)), - SDL_KEY(SDL_KEY_VAL(SDL_ANDROID_GAMEPAD_1_KEYCODE_23)) + SDL_KEY(SDL_KEY_VAL(SDL_ANDROID_GAMEPAD_2_KEYCODE_23)), + SDL_KEY(SDL_KEY_VAL(SDL_ANDROID_GAMEPAD_2_KEYCODE_24)), + SDL_KEY(SDL_KEY_VAL(SDL_ANDROID_GAMEPAD_2_KEYCODE_25)) ); SDL_ANDROID_SetIndividualGamepadKeymap( 2, @@ -347,7 +351,9 @@ void SDL_android_init_keymap(SDLKey *SDL_android_keymap) SDL_KEY(SDL_KEY_VAL(SDL_ANDROID_GAMEPAD_2_KEYCODE_20)), SDL_KEY(SDL_KEY_VAL(SDL_ANDROID_GAMEPAD_2_KEYCODE_21)), SDL_KEY(SDL_KEY_VAL(SDL_ANDROID_GAMEPAD_2_KEYCODE_22)), - SDL_KEY(SDL_KEY_VAL(SDL_ANDROID_GAMEPAD_2_KEYCODE_23)) + SDL_KEY(SDL_KEY_VAL(SDL_ANDROID_GAMEPAD_2_KEYCODE_23)), + SDL_KEY(SDL_KEY_VAL(SDL_ANDROID_GAMEPAD_2_KEYCODE_24)), + SDL_KEY(SDL_KEY_VAL(SDL_ANDROID_GAMEPAD_2_KEYCODE_25)) ); SDL_ANDROID_SetIndividualGamepadKeymap( 3, @@ -374,7 +380,9 @@ void SDL_android_init_keymap(SDLKey *SDL_android_keymap) SDL_KEY(SDL_KEY_VAL(SDL_ANDROID_GAMEPAD_3_KEYCODE_20)), SDL_KEY(SDL_KEY_VAL(SDL_ANDROID_GAMEPAD_3_KEYCODE_21)), SDL_KEY(SDL_KEY_VAL(SDL_ANDROID_GAMEPAD_3_KEYCODE_22)), - SDL_KEY(SDL_KEY_VAL(SDL_ANDROID_GAMEPAD_3_KEYCODE_23)) + SDL_KEY(SDL_KEY_VAL(SDL_ANDROID_GAMEPAD_2_KEYCODE_23)), + SDL_KEY(SDL_KEY_VAL(SDL_ANDROID_GAMEPAD_2_KEYCODE_24)), + SDL_KEY(SDL_KEY_VAL(SDL_ANDROID_GAMEPAD_2_KEYCODE_25)) ); }