diff options
Diffstat (limited to 'platform/android/java/lib')
5 files changed, 99 insertions, 3 deletions
| diff --git a/platform/android/java/lib/src/org/godotengine/godot/Godot.java b/platform/android/java/lib/src/org/godotengine/godot/Godot.java index a002a37ab9..3487e5019c 100644 --- a/platform/android/java/lib/src/org/godotengine/godot/Godot.java +++ b/platform/android/java/lib/src/org/godotengine/godot/Godot.java @@ -175,6 +175,7 @@ public class Godot extends Fragment implements SensorEventListener, IDownloaderC  	public GodotIO io;  	public GodotNetUtils netUtils;  	public GodotTTS tts; +	DirectoryAccessHandler directoryAccessHandler;  	public interface ResultCallback {  		void callback(int requestCode, int resultCode, Intent data); @@ -488,7 +489,7 @@ public class Godot extends Fragment implements SensorEventListener, IDownloaderC  		netUtils = new GodotNetUtils(activity);  		tts = new GodotTTS(activity);  		Context context = getContext(); -		DirectoryAccessHandler directoryAccessHandler = new DirectoryAccessHandler(context); +		directoryAccessHandler = new DirectoryAccessHandler(context);  		FileAccessHandler fileAccessHandler = new FileAccessHandler(context);  		mSensorManager = (SensorManager)activity.getSystemService(Context.SENSOR_SERVICE);  		mAccelerometer = mSensorManager.getDefaultSensor(Sensor.TYPE_ACCELEROMETER); diff --git a/platform/android/java/lib/src/org/godotengine/godot/GodotGLRenderView.java b/platform/android/java/lib/src/org/godotengine/godot/GodotGLRenderView.java index 3dfc37f6b0..252554126d 100644 --- a/platform/android/java/lib/src/org/godotengine/godot/GodotGLRenderView.java +++ b/platform/android/java/lib/src/org/godotengine/godot/GodotGLRenderView.java @@ -43,8 +43,13 @@ import org.godotengine.godot.xr.regular.RegularFallbackConfigChooser;  import android.annotation.SuppressLint;  import android.content.Context; +import android.content.res.AssetManager; +import android.graphics.Bitmap; +import android.graphics.BitmapFactory;  import android.graphics.PixelFormat;  import android.os.Build; +import android.text.TextUtils; +import android.util.SparseArray;  import android.view.KeyEvent;  import android.view.MotionEvent;  import android.view.PointerIcon; @@ -52,6 +57,8 @@ import android.view.SurfaceView;  import androidx.annotation.Keep; +import java.io.InputStream; +  /**   * A simple GLSurfaceView sub-class that demonstrate how to perform   * OpenGL ES 2.0 rendering into a GL Surface. Note the following important @@ -74,6 +81,7 @@ public class GodotGLRenderView extends GLSurfaceView implements GodotRenderView  	private final Godot godot;  	private final GodotInputHandler inputHandler;  	private final GodotRenderer godotRenderer; +	private final SparseArray<PointerIcon> customPointerIcons = new SparseArray<>();  	public GodotGLRenderView(Context context, Godot godot, XRMode xrMode, boolean p_use_debug_opengl) {  		super(context); @@ -169,12 +177,49 @@ public class GodotGLRenderView extends GLSurfaceView implements GodotRenderView  	}  	/** +	 * Used to configure the PointerIcon for the given type. +	 * +	 * Called from JNI +	 */ +	@Keep +	@Override +	public void configurePointerIcon(int pointerType, String imagePath, float hotSpotX, float hotSpotY) { +		if (android.os.Build.VERSION.SDK_INT >= android.os.Build.VERSION_CODES.N) { +			try { +				Bitmap bitmap = null; +				if (!TextUtils.isEmpty(imagePath)) { +					if (godot.directoryAccessHandler.filesystemFileExists(imagePath)) { +						// Try to load the bitmap from the file system +						bitmap = BitmapFactory.decodeFile(imagePath); +					} else if (godot.directoryAccessHandler.assetsFileExists(imagePath)) { +						// Try to load the bitmap from the assets directory +						AssetManager am = getContext().getAssets(); +						InputStream imageInputStream = am.open(imagePath); +						bitmap = BitmapFactory.decodeStream(imageInputStream); +					} +				} + +				PointerIcon customPointerIcon = PointerIcon.create(bitmap, hotSpotX, hotSpotY); +				customPointerIcons.put(pointerType, customPointerIcon); +			} catch (Exception e) { +				// Reset the custom pointer icon +				customPointerIcons.delete(pointerType); +			} +		} +	} + +	/**  	 * called from JNI to change pointer icon  	 */  	@Keep +	@Override  	public void setPointerIcon(int pointerType) {  		if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N) { -			setPointerIcon(PointerIcon.getSystemIcon(getContext(), pointerType)); +			PointerIcon pointerIcon = customPointerIcons.get(pointerType); +			if (pointerIcon == null) { +				pointerIcon = PointerIcon.getSystemIcon(getContext(), pointerType); +			} +			setPointerIcon(pointerIcon);  		}  	} diff --git a/platform/android/java/lib/src/org/godotengine/godot/GodotRenderView.java b/platform/android/java/lib/src/org/godotengine/godot/GodotRenderView.java index cb63fd885f..ab74ba037d 100644 --- a/platform/android/java/lib/src/org/godotengine/godot/GodotRenderView.java +++ b/platform/android/java/lib/src/org/godotengine/godot/GodotRenderView.java @@ -48,5 +48,7 @@ public interface GodotRenderView {  	GodotInputHandler getInputHandler(); +	void configurePointerIcon(int pointerType, String imagePath, float hotSpotX, float hotSpotY); +  	void setPointerIcon(int pointerType);  } diff --git a/platform/android/java/lib/src/org/godotengine/godot/GodotVulkanRenderView.java b/platform/android/java/lib/src/org/godotengine/godot/GodotVulkanRenderView.java index 0becf00d93..56bc7f9e76 100644 --- a/platform/android/java/lib/src/org/godotengine/godot/GodotVulkanRenderView.java +++ b/platform/android/java/lib/src/org/godotengine/godot/GodotVulkanRenderView.java @@ -36,7 +36,12 @@ import org.godotengine.godot.vulkan.VkSurfaceView;  import android.annotation.SuppressLint;  import android.content.Context; +import android.content.res.AssetManager; +import android.graphics.Bitmap; +import android.graphics.BitmapFactory;  import android.os.Build; +import android.text.TextUtils; +import android.util.SparseArray;  import android.view.KeyEvent;  import android.view.MotionEvent;  import android.view.PointerIcon; @@ -44,10 +49,13 @@ import android.view.SurfaceView;  import androidx.annotation.Keep; +import java.io.InputStream; +  public class GodotVulkanRenderView extends VkSurfaceView implements GodotRenderView {  	private final Godot godot;  	private final GodotInputHandler mInputHandler;  	private final VkRenderer mRenderer; +	private final SparseArray<PointerIcon> customPointerIcons = new SparseArray<>();  	public GodotVulkanRenderView(Context context, Godot godot) {  		super(context); @@ -143,12 +151,49 @@ public class GodotVulkanRenderView extends VkSurfaceView implements GodotRenderV  	}  	/** +	 * Used to configure the PointerIcon for the given type. +	 * +	 * Called from JNI +	 */ +	@Keep +	@Override +	public void configurePointerIcon(int pointerType, String imagePath, float hotSpotX, float hotSpotY) { +		if (android.os.Build.VERSION.SDK_INT >= android.os.Build.VERSION_CODES.N) { +			try { +				Bitmap bitmap = null; +				if (!TextUtils.isEmpty(imagePath)) { +					if (godot.directoryAccessHandler.filesystemFileExists(imagePath)) { +						// Try to load the bitmap from the file system +						bitmap = BitmapFactory.decodeFile(imagePath); +					} else if (godot.directoryAccessHandler.assetsFileExists(imagePath)) { +						// Try to load the bitmap from the assets directory +						AssetManager am = getContext().getAssets(); +						InputStream imageInputStream = am.open(imagePath); +						bitmap = BitmapFactory.decodeStream(imageInputStream); +					} +				} + +				PointerIcon customPointerIcon = PointerIcon.create(bitmap, hotSpotX, hotSpotY); +				customPointerIcons.put(pointerType, customPointerIcon); +			} catch (Exception e) { +				// Reset the custom pointer icon +				customPointerIcons.delete(pointerType); +			} +		} +	} + +	/**  	 * called from JNI to change pointer icon  	 */  	@Keep +	@Override  	public void setPointerIcon(int pointerType) {  		if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N) { -			setPointerIcon(PointerIcon.getSystemIcon(getContext(), pointerType)); +			PointerIcon pointerIcon = customPointerIcons.get(pointerType); +			if (pointerIcon == null) { +				pointerIcon = PointerIcon.getSystemIcon(getContext(), pointerType); +			} +			setPointerIcon(pointerIcon);  		}  	} diff --git a/platform/android/java/lib/src/org/godotengine/godot/io/directory/DirectoryAccessHandler.kt b/platform/android/java/lib/src/org/godotengine/godot/io/directory/DirectoryAccessHandler.kt index fedcf4843f..6bc317415f 100644 --- a/platform/android/java/lib/src/org/godotengine/godot/io/directory/DirectoryAccessHandler.kt +++ b/platform/android/java/lib/src/org/godotengine/godot/io/directory/DirectoryAccessHandler.kt @@ -79,6 +79,9 @@ class DirectoryAccessHandler(context: Context) {  	private val assetsDirAccess = AssetsDirectoryAccess(context)  	private val fileSystemDirAccess = FilesystemDirectoryAccess(context) +	fun assetsFileExists(assetsPath: String) = assetsDirAccess.fileExists(assetsPath) +	fun filesystemFileExists(path: String) = fileSystemDirAccess.fileExists(path) +  	private fun hasDirId(accessType: AccessType, dirId: Int): Boolean {  		return when (accessType) {  			ACCESS_RESOURCES -> assetsDirAccess.hasDirId(dirId) |