Skip to content

Commit

Permalink
Add runtime permissions to android. Use NME_LOCAL_TOOLKIT for android
Browse files Browse the repository at this point in the history
  • Loading branch information
hughsando committed Sep 1, 2024
1 parent 1869bdf commit 112862a
Show file tree
Hide file tree
Showing 16 changed files with 325 additions and 50 deletions.
1 change: 1 addition & 0 deletions project/ToolkitBuild.xml
Original file line number Diff line number Diff line change
Expand Up @@ -29,6 +29,7 @@
<set name="NATIVE_TOOLKIT_SDL_ANGLE" value="1" if="NME_ANGLE" />
<set name="NATIVE_TOOLKIT_STATIC_ANGLE" value="1" if="NME_ANGLE" />

<set name="NME_LOCAL_TOOLKIT" value="1" if="android" />

<include name="${HXCPP}/build-tool/BuildCommon.xml"/>
<!--
Expand Down
30 changes: 21 additions & 9 deletions src/nme/android/Bluetooth.hx
Original file line number Diff line number Diff line change
Expand Up @@ -4,14 +4,6 @@ import nme.JNI;

@:nativeProperty
class BluetoothDeviceCallback
{
var onDevices:Int->Array<String>->Void;
public function new(inCallback:Int->Array<String>->Void) onDevices = inCallback;
public function setDevicesAsync(inCode:Int, inDevices:Array<String>) onDevices(inCode,inDevices);
}

@:nativeProperty
class Bluetooth
{
// ASync return codes
public static inline var DISABLED = -2;
Expand All @@ -20,6 +12,26 @@ class Bluetooth
public static inline var SCANNING = 1;
public static inline var NONE_PAIRED = 2;

var onDevices:BluetoothScan->Void;

public function new(inCallback:BluetoothScan->Void) onDevices = inCallback;
public function setDevicesAsync(inCode:Int, inDevices:Array<String>)
{
onDevices( switch(inCode) {
case DISABLED: BluetoothDisabled;
case MISSING: BluetoothMissing;
case SCANNING: BluetoothScanning;
case NONE_PAIRED: BluetoothNonePaired;
case OK: BluetoothDevices(inDevices);
case _: trace("Bad device code?:" + inCode); BluetoothMissing;
} );
}
}

@:nativeProperty
class Bluetooth
{

var handle:Dynamic;


Expand All @@ -41,7 +53,7 @@ class Bluetooth
isSetup = true;
}

static public function getDeviceListAsync(onDevices:Int->Array<String>->Void,inFullScan:Bool)
static public function getDeviceListAsync(onDevices:BluetoothScan->Void,inFullScan:Bool)
{
devicesAsync(new BluetoothDeviceCallback(onDevices),inFullScan);
}
Expand Down
10 changes: 10 additions & 0 deletions src/nme/android/BluetoothScan.hx
Original file line number Diff line number Diff line change
@@ -0,0 +1,10 @@
package nme.android;

enum BluetoothScan
{
BluetoothDisabled;
BluetoothMissing;
BluetoothNonePaired;
BluetoothScanning;
BluetoothDevices(devices:Array<String>);
}
60 changes: 60 additions & 0 deletions src/nme/android/Permission.hx
Original file line number Diff line number Diff line change
@@ -0,0 +1,60 @@
package nme.android;

import nme.JNI;

import nme.android.PermissionType;

@:nativeProperty
class Permission
{
public static var BLUETOOTH_SCAN = "android.permission.BLUETOOTH_SCAN";
public static var BLUETOOTH_CONNECT = "android.permission.BLUETOOTH_CONNECT";


public static function getPermission(permission:String) : PermissionType
{
#if android
var code = sHasPermission(permission);
switch(code)
{
case 0: return PermissionGranted;
case 1: return PermissionShowRationaleToRequest;
case 2: return PermissionRequestNeeded;
default:
throw "Unknown permission code:" + code;
}
#else
return PermissionDenied;
#end
}

public static function requestPermission(permission:String, onPermission:PermissionType->Void)
{
#if android
sRequestPermission(permission, {
onGrant: () -> onPermission(PermissionGranted),
onDeny: () -> onPermission(PermissionDenied),
});
#end
}

public static function requestPermissions(permissions:Array<String>, onPermission:String->Bool->Void)
{
#if android
sRequestPermissions(permissions, {
onGrant: (p) -> onPermission(p,true),
onDeny: (p) -> onPermission(p,false),
});
#end
}


#if android
static var sHasPermission = JNI.createStaticMethod("org/haxe/nme/GameActivity", "hasPermission", "(Ljava/lang/String;)I");

static var sRequestPermission = JNI.createStaticMethod("org/haxe/nme/GameActivity", "requestPermission", "(Ljava/lang/String;Lorg/haxe/nme/HaxeObject;)V");
static var sRequestPermissions = JNI.createStaticMethod("org/haxe/nme/GameActivity", "requestPermissions", "([Ljava/lang/String;Lorg/haxe/nme/HaxeObject;)V");
#end
}


9 changes: 9 additions & 0 deletions src/nme/android/PermissionType.hx
Original file line number Diff line number Diff line change
@@ -0,0 +1,9 @@
package nme.android;

enum PermissionType
{
PermissionGranted;
PermissionShowRationaleToRequest;
PermissionRequestNeeded;
PermissionDenied;
}
17 changes: 17 additions & 0 deletions templates/android/PROJ-gradle/app/build.gradle
Original file line number Diff line number Diff line change
@@ -1,3 +1,7 @@
plugins {
id 'org.jetbrains.kotlin.android' version '1.8.0' apply false
}

apply plugin: 'com.android.application'
::if NME_FIREBASE::
apply plugin: 'com.google.gms.google-services'
Expand Down Expand Up @@ -115,6 +119,19 @@ dependencies {
::end::
::end::

def core_version = "1.13.1"

// Java language implementation
implementation "androidx.core:core:$core_version"
// Kotlin
implementation "androidx.core:core-ktx:$core_version"
implementation "androidx.activity:activity:1.2.0"
implementation "androidx.fragment:fragment:1.3.0"
implementation 'androidx.appcompat:appcompat:1.3.1'

implementation(platform("org.jetbrains.kotlin:kotlin-bom:1.8.0"))


dependencies {
::foreach (ANDROID_LIBRARY_PROJECTS)::
api project(':::name::')::end::
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -48,7 +48,7 @@
<uses-sdk android:minSdkVersion="::ANDROID_MIN_API_LEVEL::"
android:targetSdkVersion="::ANDROID_TARGET_API_LEVEL::" />

::foreach appPermission:: <uses-permission android:name="::permission::" android:required="::required::" />
::foreach appPermission:: ::permissionXml::
::end::
<uses-permission android:name="android.permission.WAKE_LOCK" />
<uses-permission android:name="android.permission.INTERNET" />
Expand Down
2 changes: 1 addition & 1 deletion templates/android/PROJ/AndroidManifest.xml
Original file line number Diff line number Diff line change
Expand Up @@ -38,7 +38,7 @@
/>


::foreach appPermission:: <uses-permission android:name="::permission::" android:required="::required::" />
::foreach appPermission:: ::permissionXml::
::end::
<uses-permission android:name="android.permission.WAKE_LOCK" />
<uses-permission android:name="android.permission.INTERNET" />
Expand Down
1 change: 1 addition & 0 deletions templates/android/extension-api/src/org/haxe/nme/NME.java
Original file line number Diff line number Diff line change
Expand Up @@ -38,4 +38,5 @@ public class NME {
public static native Object callObjectFunction(long inHandle,String function, Object[] args);
public static native double callNumericFunction(long inHandle,String function, Object[] args);
public static native void releaseReference(long inHandle);
public static native void onPermission(String permission, int inResult);
}
Loading

0 comments on commit 112862a

Please sign in to comment.