permissions.monkey2 3.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155
  1. Namespace std.permissions
  2. #If __TARGET__="android"
  3. #Import "native/Monkey2Permissions.java"
  4. Private
  5. Using jni..
  6. Global _class:jclass
  7. Global _ctor:jmethodID
  8. Global _checkPermission:jmethodID
  9. Global _requestPermissions:jmethodID
  10. Global _requestPermissionsFinished:jmethodID
  11. Global _requestPermissionsResult:jmethodID
  12. Global _instance:jobject
  13. Global _requests:=New Deque<Request>
  14. Global _busy:=False
  15. Function Init()
  16. If _class Return
  17. Local env:=sdl2.Android_JNI_GetEnv()
  18. _class=env.FindClass( "com/monkey2/lib/Monkey2Permissions" )
  19. _ctor=env.GetMethodID( _class,"<init>","()V" )
  20. _checkPermission=env.GetMethodID( _class,"checkPermission","(Ljava/lang/String;)I" )
  21. _requestPermissions=env.GetMethodID( _class,"requestPermissions","(Ljava/lang/String;I)V" )
  22. _requestPermissionsResult=env.GetMethodID( _class,"requestPermissionsResult","()Ljava/lang/String;" )
  23. Local instance:=env.NewObject( _class,_ctor,Null )
  24. _instance=env.NewGlobalRef( instance )
  25. End
  26. Class Request
  27. Field permissions:String
  28. Field finished:Void( result:ResultType[] )
  29. Method New( permissions:String[],finished:Void( result:ResultType[] ) )
  30. Self.permissions=";".Join( permissions )
  31. Self.finished=finished
  32. End
  33. method Start()
  34. Assert( Not _busy )
  35. _busy=True
  36. Local env:=sdl2.Android_JNI_GetEnv()
  37. Local callback:=async.CreateAsyncCallback( Finished,True )
  38. env.CallVoidMethod( _instance,_requestPermissions,New Variant[]( permissions,callback ) )
  39. End
  40. Method Finished()
  41. Local env:=sdl2.Android_JNI_GetEnv()
  42. Local result:=env.CallStringMethod( _instance,_requestPermissionsResult,null )
  43. _busy=False
  44. StartNextRequest()
  45. Local sresult:=result.Split( ";" )
  46. Local iresult:=New ResultType[sresult.Length]
  47. For Local i:=0 Until iresult.Length
  48. iresult[i]=Cast<UInt>( sresult[i] )
  49. Next
  50. finished( iresult )
  51. End
  52. End
  53. Function StartNextRequest()
  54. If Not _busy And Not _requests.Empty _requests.RemoveFirst().Start()
  55. End
  56. Public
  57. #Endif
  58. #rem monkeydoc Check an android permission.
  59. This function is only available on android.
  60. Returns 1 if the given permission has been granted to the app, else 0.
  61. The permission string should be in android manifest form, eg: "android.permission.READ\_EXTERNAL\_STORAGE".
  62. #end
  63. Function CheckPermission:Int( permission:String )
  64. #If __TARGET__="android"
  65. Init()
  66. Local env:=sdl2.Android_JNI_GetEnv()
  67. Return env.CallIntMethod( _instance,_checkPermission,New Variant[]( permission ) )
  68. #Else
  69. Return -1
  70. #Endif
  71. End
  72. Alias ResultType:UInt
  73. #rem monkeydoc Request android permissions.
  74. This function is only available on android.
  75. Attempts to grant the given permissions to the app.
  76. Depending on the permissions, this may cause a modal dialog to be presented to the user.
  77. The permission strings should be in android manifest form, eg: "android.permission.READ\_EXTERNAL\_STORAGE".
  78. See this page for more permissions:
  79. https://developer.android.com/reference/android/Manifest.permission
  80. If the result is an empty array, the operation was cancelled.
  81. #end
  82. Function RequestPermissions( permissions:String[],finished:Void( results:ResultType[] ) )
  83. #If __TARGET__="android"
  84. Init()
  85. _requests.AddLast( New Request( permissions,finished ) )
  86. StartNextRequest()
  87. #Endif
  88. End