11package plugin .google .maps ;
22
3- import java .lang .reflect .Method ;
4- import java .util .HashMap ;
5- import java .util .Iterator ;
6- import java .util .List ;
7- import java .util .Set ;
8-
9- import android .view .*;
10- import org .apache .cordova .CallbackContext ;
11- import org .apache .cordova .CordovaInterface ;
12- import org .apache .cordova .CordovaPlugin ;
13- import org .apache .cordova .CordovaWebView ;
14- import org .apache .cordova .PluginEntry ;
15- import org .apache .cordova .PluginResult ;
16- import org .json .JSONArray ;
17- import org .json .JSONException ;
18- import org .json .JSONObject ;
19-
203import android .annotation .SuppressLint ;
214import android .annotation .TargetApi ;
225import android .app .Activity ;
4326import android .os .Handler ;
4427import android .provider .Settings ;
4528import android .util .Log ;
46- import android .webkit .WebChromeClient ;
29+ import android .view .Gravity ;
30+ import android .view .View ;
31+ import android .view .ViewGroup ;
32+ import android .view .WindowManager ;
4733import android .widget .AbsoluteLayout ;
4834import android .widget .FrameLayout ;
4935import android .widget .FrameLayout .LayoutParams ;
9278import com .google .android .gms .maps .model .Polyline ;
9379import com .google .android .gms .maps .model .VisibleRegion ;
9480
81+ import org .apache .cordova .CallbackContext ;
82+ import org .apache .cordova .CordovaInterface ;
83+ import org .apache .cordova .CordovaPlugin ;
84+ import org .apache .cordova .CordovaWebView ;
85+ import org .apache .cordova .PluginEntry ;
86+ import org .apache .cordova .PluginResult ;
87+ import org .json .JSONArray ;
88+ import org .json .JSONException ;
89+ import org .json .JSONObject ;
90+
91+ import java .lang .reflect .Method ;
92+ import java .util .HashMap ;
93+ import java .util .Iterator ;
94+ import java .util .List ;
95+ import java .util .Set ;
96+
9597@ SuppressWarnings ("deprecation" )
9698public class GoogleMaps extends CordovaPlugin implements View .OnClickListener , OnMarkerClickListener ,
9799 OnInfoWindowClickListener , OnMapClickListener , OnMapLongClickListener ,
@@ -125,6 +127,8 @@ private enum TEXT_STYLE_ALIGNMENTS {
125127 private MyPluginLayout mPluginLayout = null ;
126128 public boolean isDebug = false ;
127129 private GoogleApiClient googleApiClient = null ;
130+ private JSONArray _saveArgs = null ;
131+ private CallbackContext _saveCallbackContext = null ;
128132
129133 @ SuppressLint ("NewApi" ) @ Override
130134 public void initialize (final CordovaInterface cordova , final CordovaWebView webView ) {
@@ -228,7 +232,7 @@ public boolean execute(final String action, final JSONArray args, final Callback
228232
229233 Runnable runnable = new Runnable () {
230234 public void run () {
231- if (("getMap" .equals (action ) == false && "isAvailable" .equals (action ) == false && "getLicenseInfo" .equals (action ) == false ) &&
235+ if ((! "getMap" .equals (action ) && ! "isAvailable" .equals (action ) && ! "getLicenseInfo" .equals (action )) &&
232236 GoogleMaps .this .map == null ) {
233237 Log .w (TAG , "Can not execute '" + action + "' because the map is not created." );
234238 return ;
@@ -271,7 +275,7 @@ public void run() {
271275 } else {
272276 try {
273277 Method method = GoogleMaps .this .getClass ().getDeclaredMethod (action , JSONArray .class , CallbackContext .class );
274- if (method .isAccessible () == false ) {
278+ if (! method .isAccessible ()) {
275279 method .setAccessible (true );
276280 }
277281 method .invoke (GoogleMaps .this , args , callbackContext );
@@ -860,6 +864,31 @@ private void getFocusedBuilding(final JSONArray args, final CallbackContext call
860864 }
861865 }
862866
867+ public void requestPermissions (CordovaPlugin plugin , int requestCode , String [] permissions ) {
868+
869+ try {
870+ Method requestPermission = CordovaInterface .class .getDeclaredMethod (
871+ "requestPermissions" , CordovaPlugin .class , int .class , String [].class );
872+
873+ // If there is no exception, then this is cordova-android 5.0.0+
874+ requestPermission .invoke (plugin .cordova , plugin , requestCode , permissions );
875+ } catch (Exception e ) {
876+ e .printStackTrace ();
877+ }
878+ }
879+
880+ public void onRequestPermissionResult (int requestCode , String [] permissions ,
881+ int [] grantResults ) throws JSONException {
882+ PluginResult result ;
883+ for (int r : grantResults ) {
884+ if (r == PackageManager .PERMISSION_DENIED ) {
885+ result = new PluginResult (PluginResult .Status .ERROR , "Geolocation permission request was denied." );
886+ _saveCallbackContext .sendPluginResult (result );
887+ return ;
888+ }
889+ }
890+ GoogleMaps .this .getMyLocation (_saveArgs , _saveCallbackContext );
891+ }
863892 @ SuppressWarnings ("unused" )
864893 private void getMyLocation (final JSONArray args , final CallbackContext callbackContext ) throws JSONException {
865894
@@ -871,6 +900,29 @@ private void getMyLocation(final JSONArray args, final CallbackContext callbackC
871900 if (params .has ("enableHighAccuracy" )) {
872901 isHigh = params .getBoolean ("enableHighAccuracy" );
873902 }
903+
904+ // Request geolocation permission.
905+ boolean locationPermission = false ;
906+ try {
907+ Method hasPermission = CordovaInterface .class .getDeclaredMethod ("hasPermission" , String .class );
908+
909+ String permission = "android.permission.ACCESS_COARSE_LOCATION" ;
910+ locationPermission = (Boolean ) hasPermission .invoke (cordova , permission );
911+ } catch (Exception e ) {
912+ PluginResult result ;
913+ result = new PluginResult (PluginResult .Status .ILLEGAL_ACCESS_EXCEPTION );
914+ callbackContext .sendPluginResult (result );
915+ return ;
916+ }
917+
918+ if (!locationPermission ) {
919+ _saveArgs = args ;
920+ _saveCallbackContext = callbackContext ;
921+ this .requestPermissions (GoogleMaps .this , 0 , new String []{"android.permission.ACCESS_FINE_LOCATION" , "android.permission.ACCESS_COARSE_LOCATION" });
922+ return ;
923+ }
924+
925+
874926 final boolean enableHighAccuracy = isHigh ;
875927
876928 if (googleApiClient == null ) {
0 commit comments