Skip to content

Commit 9552e90

Browse files
author
masashiGMS
committed
Fix: issue #892
1 parent 9b1ac99 commit 9552e90

2 files changed

Lines changed: 74 additions & 21 deletions

File tree

plugin.xml

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -15,7 +15,8 @@
1515
<keywords>google,maps,geo</keywords>
1616

1717
<engines>
18-
<engine name="cordova" version=">=3.5.0" />
18+
<engine name="cordova-android" version=">=5.1.0" />
19+
<engine name="cordova-ios" version=">=3.0.0" />
1920
</engines>
2021

2122
<!-- android -->

src/android/plugin/google/maps/GoogleMaps.java

Lines changed: 72 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -1,22 +1,5 @@
11
package 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-
203
import android.annotation.SuppressLint;
214
import android.annotation.TargetApi;
225
import android.app.Activity;
@@ -43,7 +26,10 @@
4326
import android.os.Handler;
4427
import android.provider.Settings;
4528
import 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;
4733
import android.widget.AbsoluteLayout;
4834
import android.widget.FrameLayout;
4935
import android.widget.FrameLayout.LayoutParams;
@@ -92,6 +78,22 @@
9278
import com.google.android.gms.maps.model.Polyline;
9379
import 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")
9698
public 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

Comments
 (0)