diff options
Diffstat (limited to 'platform/android/java/lib')
| -rw-r--r-- | platform/android/java/lib/res/drawable-hdpi/notify_panel_notification_icon_bg.png | bin | 1843 -> 1116 bytes | |||
| -rw-r--r-- | platform/android/java/lib/res/drawable-mdpi/notify_panel_notification_icon_bg.png | bin | 718 -> 388 bytes | |||
| -rw-r--r-- | platform/android/java/lib/res/drawable-xxhdpi/notify_panel_notification_icon_bg.png | bin | 2830 -> 1556 bytes | |||
| -rw-r--r-- | platform/android/java/lib/src/org/godotengine/godot/Godot.java | 71 | ||||
| -rw-r--r-- | platform/android/java/lib/src/org/godotengine/godot/GodotLib.java | 5 | ||||
| -rw-r--r-- | platform/android/java/lib/src/org/godotengine/godot/input/GodotInputHandler.java | 13 | ||||
| -rw-r--r-- | platform/android/java/lib/src/org/godotengine/godot/utils/PermissionsUtil.java | 157 | 
7 files changed, 216 insertions, 30 deletions
diff --git a/platform/android/java/lib/res/drawable-hdpi/notify_panel_notification_icon_bg.png b/platform/android/java/lib/res/drawable-hdpi/notify_panel_notification_icon_bg.png Binary files differindex 2c246b04a4..f849d8e90d 100644 --- a/platform/android/java/lib/res/drawable-hdpi/notify_panel_notification_icon_bg.png +++ b/platform/android/java/lib/res/drawable-hdpi/notify_panel_notification_icon_bg.png diff --git a/platform/android/java/lib/res/drawable-mdpi/notify_panel_notification_icon_bg.png b/platform/android/java/lib/res/drawable-mdpi/notify_panel_notification_icon_bg.png Binary files differindex 8bcd464bed..1dfb28b33a 100644 --- a/platform/android/java/lib/res/drawable-mdpi/notify_panel_notification_icon_bg.png +++ b/platform/android/java/lib/res/drawable-mdpi/notify_panel_notification_icon_bg.png diff --git a/platform/android/java/lib/res/drawable-xxhdpi/notify_panel_notification_icon_bg.png b/platform/android/java/lib/res/drawable-xxhdpi/notify_panel_notification_icon_bg.png Binary files differindex b458ff3057..302a972049 100644 --- a/platform/android/java/lib/res/drawable-xxhdpi/notify_panel_notification_icon_bg.png +++ b/platform/android/java/lib/res/drawable-xxhdpi/notify_panel_notification_icon_bg.png 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 739aa285bf..4dae2dcc53 100644 --- a/platform/android/java/lib/src/org/godotengine/godot/Godot.java +++ b/platform/android/java/lib/src/org/godotengine/godot/Godot.java @@ -30,7 +30,6 @@  package org.godotengine.godot; -import android.Manifest;  import android.annotation.SuppressLint;  import android.app.Activity;  import android.app.ActivityManager; @@ -56,12 +55,14 @@ import android.hardware.SensorManager;  import android.os.Build;  import android.os.Bundle;  import android.os.Environment; +import android.os.Handler; +import android.os.Looper;  import android.os.Messenger;  import android.os.VibrationEffect;  import android.os.Vibrator;  import android.provider.Settings.Secure;  import android.support.annotation.Keep; -import android.support.v4.content.ContextCompat; +import android.support.annotation.Nullable;  import android.view.Display;  import android.view.KeyEvent;  import android.view.MotionEvent; @@ -95,14 +96,12 @@ import java.util.Locale;  import javax.microedition.khronos.opengles.GL10;  import org.godotengine.godot.input.GodotEditText;  import org.godotengine.godot.payments.PaymentsManager; +import org.godotengine.godot.utils.PermissionsUtil;  import org.godotengine.godot.xr.XRMode;  public abstract class Godot extends Activity implements SensorEventListener, IDownloaderClient {  	static final int MAX_SINGLETONS = 64; -	static final int REQUEST_RECORD_AUDIO_PERMISSION = 1; -	static final int REQUEST_CAMERA_PERMISSION = 2; -	static final int REQUEST_VIBRATE_PERMISSION = 3;  	private IStub mDownloaderClientStub;  	private TextView mStatusText;  	private TextView mProgressFraction; @@ -126,6 +125,9 @@ public abstract class Godot extends Activity implements SensorEventListener, IDo  	private boolean activityResumed;  	private int mState; +	// Used to dispatch events to the main thread. +	private final Handler mainThreadHandler = new Handler(Looper.getMainLooper()); +  	static private Intent mCurrentIntent;  	@Override @@ -187,6 +189,20 @@ public abstract class Godot extends Activity implements SensorEventListener, IDo  			Godot.singletons[Godot.singleton_count++] = this;  		} +		/** +		 * Invoked once during the Godot Android initialization process after creation of the +		 * {@link GodotView} view. +		 * <p> +		 * This method should be overridden by descendants of this class that would like to add +		 * their view/layout to the Godot view hierarchy. +		 * +		 * @return the view to be included; null if no views should be included. +		 */ +		@Nullable +		protected View onMainCreateView(Activity activity) { +			return null; +		} +  		protected void onMainActivityResult(int requestCode, int resultCode, Intent data) {  		} @@ -306,6 +322,20 @@ public abstract class Godot extends Activity implements SensorEventListener, IDo  			public void run() {  				GodotLib.setup(current_command_line);  				setKeepScreenOn("True".equals(GodotLib.getGlobal("display/window/energy_saving/keep_screen_on"))); + +				// The Godot Android plugins are setup on completion of GodotLib.setup +				mainThreadHandler.post(new Runnable() { +					@Override +					public void run() { +						// Include the non-null views returned in the Godot view hierarchy. +						for (int i = 0; i < singleton_count; i++) { +							View view = singletons[i].onMainCreateView(Godot.this); +							if (view != null) { +								layout.addView(view); +							} +						} +					} +				});  			}  		});  	} @@ -973,32 +1003,15 @@ public abstract class Godot extends Activity implements SensorEventListener, IDo  	}  	public boolean requestPermission(String p_name) { -		if (Build.VERSION.SDK_INT < Build.VERSION_CODES.M) { -			// Not necessary, asked on install already -			return true; -		} - -		if (p_name.equals("RECORD_AUDIO")) { -			if (ContextCompat.checkSelfPermission(this, Manifest.permission.RECORD_AUDIO) != PackageManager.PERMISSION_GRANTED) { -				requestPermissions(new String[] { Manifest.permission.RECORD_AUDIO }, REQUEST_RECORD_AUDIO_PERMISSION); -				return false; -			} -		} +		return PermissionsUtil.requestPermission(p_name, this); +	} -		if (p_name.equals("CAMERA")) { -			if (ContextCompat.checkSelfPermission(this, Manifest.permission.CAMERA) != PackageManager.PERMISSION_GRANTED) { -				requestPermissions(new String[] { Manifest.permission.CAMERA }, REQUEST_CAMERA_PERMISSION); -				return false; -			} -		} +	public boolean requestPermissions() { +		return PermissionsUtil.requestManifestPermissions(this); +	} -		if (p_name.equals("VIBRATE")) { -			if (ContextCompat.checkSelfPermission(this, Manifest.permission.VIBRATE) != PackageManager.PERMISSION_GRANTED) { -				requestPermissions(new String[] { Manifest.permission.VIBRATE }, REQUEST_VIBRATE_PERMISSION); -				return false; -			} -		} -		return true; +	public String[] getGrantedPermissions() { +		return PermissionsUtil.getGrantedPermissions(this);  	}  	/** diff --git a/platform/android/java/lib/src/org/godotengine/godot/GodotLib.java b/platform/android/java/lib/src/org/godotengine/godot/GodotLib.java index 067fa6f4b9..67dce172dc 100644 --- a/platform/android/java/lib/src/org/godotengine/godot/GodotLib.java +++ b/platform/android/java/lib/src/org/godotengine/godot/GodotLib.java @@ -95,6 +95,11 @@ public class GodotLib {  	public static native void touch(int what, int pointer, int howmany, int[] arr);  	/** +	 * Forward hover events from the main thread to the GL thread. +	 */ +	public static native void hover(int type, int x, int y); + +	/**  	 * Forward accelerometer sensor events from the main thread to the GL thread.  	 * @see android.hardware.SensorEventListener#onSensorChanged(SensorEvent)  	 */ diff --git a/platform/android/java/lib/src/org/godotengine/godot/input/GodotInputHandler.java b/platform/android/java/lib/src/org/godotengine/godot/input/GodotInputHandler.java index 2beca67922..2756ca6c83 100644 --- a/platform/android/java/lib/src/org/godotengine/godot/input/GodotInputHandler.java +++ b/platform/android/java/lib/src/org/godotengine/godot/input/GodotInputHandler.java @@ -188,7 +188,18 @@ public class GodotInputHandler implements InputDeviceListener {  				}  				return true;  			} -		}; +		} else if ((event.getSource() & InputDevice.SOURCE_STYLUS) == InputDevice.SOURCE_STYLUS) { +			final int x = Math.round(event.getX()); +			final int y = Math.round(event.getY()); +			final int type = event.getAction(); +			queueEvent(new Runnable() { +				@Override +				public void run() { +					GodotLib.hover(type, x, y); +				} +			}); +			return true; +		}  		return false;  	} diff --git a/platform/android/java/lib/src/org/godotengine/godot/utils/PermissionsUtil.java b/platform/android/java/lib/src/org/godotengine/godot/utils/PermissionsUtil.java new file mode 100644 index 0000000000..2c4a444e5a --- /dev/null +++ b/platform/android/java/lib/src/org/godotengine/godot/utils/PermissionsUtil.java @@ -0,0 +1,157 @@ +package org.godotengine.godot.utils; + +import android.Manifest; +import android.content.pm.PackageInfo; +import android.content.pm.PackageManager; +import android.content.pm.PermissionInfo; +import android.os.Build; +import android.support.v4.content.ContextCompat; +import java.util.ArrayList; +import java.util.List; +import org.godotengine.godot.Godot; + +/** + * This class includes utility functions for Android permissions related operations. + * @author Cagdas Caglak <cagdascaglak@gmail.com> + */ +public final class PermissionsUtil { + +	static final int REQUEST_RECORD_AUDIO_PERMISSION = 1; +	static final int REQUEST_CAMERA_PERMISSION = 2; +	static final int REQUEST_VIBRATE_PERMISSION = 3; +	static final int REQUEST_ALL_PERMISSION_REQ_CODE = 1001; + +	private PermissionsUtil() { +	} + +	/** +	 * Request a dangerous permission. name must be specified in <a href="https://github.com/aosp-mirror/platform_frameworks_base/blob/master/core/res/AndroidManifest.xml">this</a> +	 * @param name the name of the requested permission. +	 * @param activity the caller activity for this method. +	 * @return true/false. "true" if permission was granted otherwise returns "false". +	 */ +	public static boolean requestPermission(String name, Godot activity) { +		if (Build.VERSION.SDK_INT < Build.VERSION_CODES.M) { +			// Not necessary, asked on install already +			return true; +		} + +		if (name.equals("RECORD_AUDIO") && ContextCompat.checkSelfPermission(activity, Manifest.permission.RECORD_AUDIO) != PackageManager.PERMISSION_GRANTED) { +			activity.requestPermissions(new String[] { Manifest.permission.RECORD_AUDIO }, REQUEST_RECORD_AUDIO_PERMISSION); +			return false; +		} + +		if (name.equals("CAMERA") && ContextCompat.checkSelfPermission(activity, Manifest.permission.CAMERA) != PackageManager.PERMISSION_GRANTED) { +			activity.requestPermissions(new String[] { Manifest.permission.CAMERA }, REQUEST_CAMERA_PERMISSION); +			return false; +		} + +		if (name.equals("VIBRATE") && ContextCompat.checkSelfPermission(activity, Manifest.permission.VIBRATE) != PackageManager.PERMISSION_GRANTED) { +			activity.requestPermissions(new String[] { Manifest.permission.VIBRATE }, REQUEST_VIBRATE_PERMISSION); +			return false; +		} +		return true; +	} + +	/** +	 * Request dangerous permissions which are defined in the Android manifest file from the user. +	 * @param activity the caller activity for this method. +	 * @return true/false. "true" if all permissions were granted otherwise returns "false". +	 */ +	public static boolean requestManifestPermissions(Godot activity) { +		if (Build.VERSION.SDK_INT < Build.VERSION_CODES.M) { +			return true; +		} + +		String[] manifestPermissions; +		try { +			manifestPermissions = getManifestPermissions(activity); +		} catch (PackageManager.NameNotFoundException e) { +			e.printStackTrace(); +			return false; +		} + +		if (manifestPermissions == null || manifestPermissions.length == 0) +			return true; + +		List<String> dangerousPermissions = new ArrayList<>(); +		for (String manifestPermission : manifestPermissions) { +			try { +				PermissionInfo permissionInfo = getPermissionInfo(activity, manifestPermission); +				int protectionLevel = Build.VERSION.SDK_INT >= Build.VERSION_CODES.P ? permissionInfo.getProtection() : permissionInfo.protectionLevel; +				if (protectionLevel == PermissionInfo.PROTECTION_DANGEROUS && ContextCompat.checkSelfPermission(activity, manifestPermission) != PackageManager.PERMISSION_GRANTED) { +					dangerousPermissions.add(manifestPermission); +				} +			} catch (PackageManager.NameNotFoundException e) { +				e.printStackTrace(); +				return false; +			} +		} + +		if (dangerousPermissions.isEmpty()) { +			// If list is empty, all of dangerous permissions were granted. +			return true; +		} + +		String[] requestedPermissions = dangerousPermissions.toArray(new String[0]); +		activity.requestPermissions(requestedPermissions, REQUEST_ALL_PERMISSION_REQ_CODE); +		return false; +	} + +	/** +	 * With this function you can get the list of dangerous permissions that have been granted to the Android application. +	 * @param activity the caller activity for this method. +	 * @return granted permissions list +	 */ +	public static String[] getGrantedPermissions(Godot activity) { +		String[] manifestPermissions; +		try { +			manifestPermissions = getManifestPermissions(activity); +		} catch (PackageManager.NameNotFoundException e) { +			e.printStackTrace(); +			return new String[0]; +		} +		if (manifestPermissions == null || manifestPermissions.length == 0) +			return new String[0]; + +		List<String> dangerousPermissions = new ArrayList<>(); +		for (String manifestPermission : manifestPermissions) { +			try { +				PermissionInfo permissionInfo = getPermissionInfo(activity, manifestPermission); +				int protectionLevel = Build.VERSION.SDK_INT >= Build.VERSION_CODES.P ? permissionInfo.getProtection() : permissionInfo.protectionLevel; +				if (protectionLevel == PermissionInfo.PROTECTION_DANGEROUS && ContextCompat.checkSelfPermission(activity, manifestPermission) == PackageManager.PERMISSION_GRANTED) { +					dangerousPermissions.add(manifestPermission); +				} +			} catch (PackageManager.NameNotFoundException e) { +				e.printStackTrace(); +				return new String[0]; +			} +		} + +		return dangerousPermissions.toArray(new String[0]); +	} + +	/** +	 * Returns the permissions defined in the AndroidManifest.xml file. +	 * @param activity the caller activity for this method. +	 * @return manifest permissions list +	 * @throws PackageManager.NameNotFoundException the exception is thrown when a given package, application, or component name cannot be found. +	 */ +	private static String[] getManifestPermissions(Godot activity) throws PackageManager.NameNotFoundException { +		PackageManager packageManager = activity.getPackageManager(); +		PackageInfo packageInfo = packageManager.getPackageInfo(activity.getPackageName(), PackageManager.GET_PERMISSIONS); +		return packageInfo.requestedPermissions; +	} + +	/** +	 * Returns the information of the desired permission. +	 * @param activity the caller activity for this method. +	 * @param permission the name of the permission. +	 * @return permission info object +	 * @throws PackageManager.NameNotFoundException the exception is thrown when a given package, application, or component name cannot be found. +	 */ +	private static PermissionInfo getPermissionInfo(Godot activity, String permission) throws PackageManager.NameNotFoundException { +		PackageManager packageManager = activity.getPackageManager(); +		return packageManager.getPermissionInfo(permission, 0); +	} +}  |