Fixed bug 4319 - Android remove reflection for PointerIcon Sylvain Since SDL2 min requirement is Android SDK 26, and PointerIcon is 24. We don't need reflection to access it.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87
diff --git a/android-project/app/src/main/java/org/libsdl/app/SDLActivity.java b/android-project/app/src/main/java/org/libsdl/app/SDLActivity.java
index 311b2f1..6b81f61 100644
--- a/android-project/app/src/main/java/org/libsdl/app/SDLActivity.java
+++ b/android-project/app/src/main/java/org/libsdl/app/SDLActivity.java
@@ -86,7 +86,7 @@ public class SDLActivity extends Activity implements View.OnSystemUiVisibilityCh
protected static boolean mScreenKeyboardShown;
protected static ViewGroup mLayout;
protected static SDLClipboardHandler mClipboardHandler;
- protected static Hashtable<Integer, Object> mCursors;
+ protected static Hashtable<Integer, PointerIcon> mCursors;
protected static int mLastCursorID;
protected static SDLGenericMotionListener_API12 mMotionListener;
protected static HIDDeviceManager mHIDDeviceManager;
@@ -176,7 +176,7 @@ public class SDLActivity extends Activity implements View.OnSystemUiVisibilityCh
mTextEdit = null;
mLayout = null;
mClipboardHandler = null;
- mCursors = new Hashtable<Integer, Object>();
+ mCursors = new Hashtable<Integer, PointerIcon>();
mLastCursorID = 0;
mSDLThread = null;
mExitCalledFromJava = false;
@@ -1379,13 +1379,14 @@ public class SDLActivity extends Activity implements View.OnSystemUiVisibilityCh
public static int createCustomCursor(int[] colors, int width, int height, int hotSpotX, int hotSpotY) {
Bitmap bitmap = Bitmap.createBitmap(colors, width, height, Bitmap.Config.ARGB_8888);
++mLastCursorID;
- // This requires API 24, so use reflection to implement this
- try {
- Class PointerIconClass = Class.forName("android.view.PointerIcon");
- Class[] arg_types = new Class[] { Bitmap.class, float.class, float.class };
- Method create = PointerIconClass.getMethod("create", arg_types);
- mCursors.put(mLastCursorID, create.invoke(null, bitmap, hotSpotX, hotSpotY));
- } catch (Exception e) {
+
+ if (Build.VERSION.SDK_INT >= 24) {
+ try {
+ mCursors.put(mLastCursorID, PointerIcon.create(bitmap, hotSpotX, hotSpotY));
+ } catch (Exception e) {
+ return 0;
+ }
+ } else {
return 0;
}
return mLastCursorID;
@@ -1395,12 +1396,14 @@ public class SDLActivity extends Activity implements View.OnSystemUiVisibilityCh
* This method is called by SDL using JNI.
*/
public static boolean setCustomCursor(int cursorID) {
- // This requires API 24, so use reflection to implement this
- try {
- Class PointerIconClass = Class.forName("android.view.PointerIcon");
- Method setPointerIcon = SDLSurface.class.getMethod("setPointerIcon", PointerIconClass);
- setPointerIcon.invoke(mSurface, mCursors.get(cursorID));
- } catch (Exception e) {
+
+ if (Build.VERSION.SDK_INT >= 24) {
+ try {
+ mSurface.setPointerIcon(mCursors.get(cursorID));
+ } catch (Exception e) {
+ return false;
+ }
+ } else {
return false;
}
return true;
@@ -1449,15 +1452,12 @@ public class SDLActivity extends Activity implements View.OnSystemUiVisibilityCh
cursor_type = 1002; //PointerIcon.TYPE_HAND;
break;
}
- // This requires API 24, so use reflection to implement this
- try {
- Class PointerIconClass = Class.forName("android.view.PointerIcon");
- Class[] arg_types = new Class[] { Context.class, int.class };
- Method getSystemIcon = PointerIconClass.getMethod("getSystemIcon", arg_types);
- Method setPointerIcon = SDLSurface.class.getMethod("setPointerIcon", PointerIconClass);
- setPointerIcon.invoke(mSurface, getSystemIcon.invoke(null, SDL.getContext(), cursor_type));
- } catch (Exception e) {
- return false;
+ if (Build.VERSION.SDK_INT >= 24) {
+ try {
+ mSurface.setPointerIcon(PointerIcon.getSystemIcon(SDL.getContext(), cursor_type));
+ } catch (Exception e) {
+ return false;
+ }
}
return true;
}