Skip to content

Commit efe1501

Browse files
committed
Implemented requested changes as well as improved documentation. Added tests to increase code coverage to 100%.
1 parent 3ae6f2b commit efe1501

21 files changed

+519
-131
lines changed

README.md

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -23,7 +23,7 @@ To use this plugin, add `geolocator` as a [dependency in your pubspec.yaml file]
2323

2424
```yaml
2525
dependencies:
26-
geolocator: ^6.1.8
26+
geolocator: ^6.1.9
2727
```
2828
2929
<details>

geolocator/README.md

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -23,7 +23,7 @@ To use this plugin, add `geolocator` as a [dependency in your pubspec.yaml file]
2323

2424
```yaml
2525
dependencies:
26-
geolocator: ^6.1.8
26+
geolocator: ^6.1.9
2727
```
2828
2929
<details>
Lines changed: 0 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,3 @@
11
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
22
package="com.baseflow.geolocator">
3-
4-
<uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" />
53
</manifest>

geolocator/android/src/main/java/com/baseflow/geolocator/GeolocatorPlugin.java

Lines changed: 25 additions & 25 deletions
Original file line numberDiff line numberDiff line change
@@ -1,11 +1,10 @@
11
package com.baseflow.geolocator;
22

3-
import android.util.Log;
4-
53
import androidx.annotation.NonNull;
64
import androidx.annotation.Nullable;
75

86
import com.baseflow.geolocator.location.GeolocationManager;
7+
import com.baseflow.geolocator.nmea.NmeaMessageManager;
98
import com.baseflow.geolocator.permission.PermissionManager;
109
import io.flutter.embedding.engine.plugins.FlutterPlugin;
1110
import io.flutter.embedding.engine.plugins.activity.ActivityAware;
@@ -18,14 +17,15 @@ public class GeolocatorPlugin implements FlutterPlugin, ActivityAware {
1817
private static final String TAG = "GeocodingPlugin";
1918
private final PermissionManager permissionManager;
2019
private final GeolocationManager geolocationManager;
20+
private final NmeaMessageManager nmeaMessageManager;
2121

2222
@Nullable private MethodCallHandlerImpl methodCallHandler;
2323

2424
@Nullable
25-
private PositionStreamImpl streamHandler;
25+
private PositionStreamHandlerImpl positionStreamHandler;
2626

2727
@Nullable
28-
private NmeaStreamImpl nmeaStream;
28+
private NmeaStreamHandlerImpl nmeaStreamHandler;
2929

3030
@Nullable
3131
private Registrar pluginRegistrar;
@@ -34,8 +34,8 @@ public class GeolocatorPlugin implements FlutterPlugin, ActivityAware {
3434
private ActivityPluginBinding pluginBinding;
3535

3636
public GeolocatorPlugin() {
37-
3837
this.permissionManager = new PermissionManager();
38+
this.nmeaMessageManager = new NmeaMessageManager(permissionManager);
3939
this.geolocationManager = new GeolocationManager(permissionManager);
4040
}
4141

@@ -59,11 +59,11 @@ public static void registerWith(Registrar registrar) {
5959
methodCallHandler.startListening(registrar.context(), registrar.messenger());
6060
methodCallHandler.setActivity(registrar.activity());
6161

62-
PositionStreamImpl streamHandler = new PositionStreamImpl(geolocatorPlugin.geolocationManager);
62+
PositionStreamHandlerImpl streamHandler = new PositionStreamHandlerImpl(geolocatorPlugin.geolocationManager);
6363
streamHandler.startListening(registrar.context(), registrar.messenger());
6464
streamHandler.setActivity(registrar.activity());
6565

66-
NmeaStreamImpl nmeaStream = new NmeaStreamImpl(geolocatorPlugin.geolocationManager);
66+
NmeaStreamHandlerImpl nmeaStream = new NmeaStreamHandlerImpl(geolocatorPlugin.nmeaMessageManager);
6767
nmeaStream.startListening(registrar.context(), registrar.messenger());
6868
nmeaStream.setActivity(registrar.activity());
6969
}
@@ -73,11 +73,11 @@ public void onAttachedToEngine(@NonNull FlutterPluginBinding flutterPluginBindin
7373
methodCallHandler = new MethodCallHandlerImpl(this.permissionManager, this.geolocationManager);
7474
methodCallHandler.startListening(
7575
flutterPluginBinding.getApplicationContext(), flutterPluginBinding.getBinaryMessenger());
76-
streamHandler = new PositionStreamImpl(this.geolocationManager);
77-
streamHandler.startListening(
76+
positionStreamHandler = new PositionStreamHandlerImpl(this.geolocationManager);
77+
positionStreamHandler.startListening(
7878
flutterPluginBinding.getApplicationContext(), flutterPluginBinding.getBinaryMessenger());
79-
nmeaStream = new NmeaStreamImpl(this.geolocationManager);
80-
nmeaStream.startListening(
79+
nmeaStreamHandler = new NmeaStreamHandlerImpl(this.nmeaMessageManager);
80+
nmeaStreamHandler.startListening(
8181
flutterPluginBinding.getApplicationContext(), flutterPluginBinding.getBinaryMessenger());
8282
}
8383

@@ -88,14 +88,14 @@ public void onDetachedFromEngine(@NonNull FlutterPluginBinding binding) {
8888
methodCallHandler = null;
8989
}
9090

91-
if (streamHandler != null) {
92-
streamHandler.stopListening();
93-
streamHandler = null;
91+
if (positionStreamHandler != null) {
92+
positionStreamHandler.stopListening();
93+
positionStreamHandler = null;
9494
}
9595

96-
if (nmeaStream != null) {
97-
nmeaStream.stopListening();
98-
nmeaStream = null;
96+
if (nmeaStreamHandler != null) {
97+
nmeaStreamHandler.stopListening();
98+
nmeaStreamHandler = null;
9999
}
100100
}
101101

@@ -104,12 +104,12 @@ public void onAttachedToActivity(@NonNull ActivityPluginBinding binding) {
104104
if (methodCallHandler != null) {
105105
methodCallHandler.setActivity(binding.getActivity());
106106
}
107-
if (streamHandler != null) {
108-
streamHandler.setActivity(binding.getActivity());
107+
if (positionStreamHandler != null) {
108+
positionStreamHandler.setActivity(binding.getActivity());
109109
}
110110

111-
if (nmeaStream != null) {
112-
nmeaStream.setActivity(binding.getActivity());
111+
if (nmeaStreamHandler != null) {
112+
nmeaStreamHandler.setActivity(binding.getActivity());
113113
}
114114

115115
this.pluginBinding = binding;
@@ -131,12 +131,12 @@ public void onDetachedFromActivity() {
131131
if (methodCallHandler != null) {
132132
methodCallHandler.setActivity(null);
133133
}
134-
if (streamHandler != null) {
135-
streamHandler.setActivity(null);
134+
if (positionStreamHandler != null) {
135+
positionStreamHandler.setActivity(null);
136136
}
137137

138-
if (nmeaStream != null) {
139-
nmeaStream.setActivity(null);
138+
if (nmeaStreamHandler != null) {
139+
nmeaStreamHandler.setActivity(null);
140140
}
141141

142142
deregisterListeners();

geolocator/android/src/main/java/com/baseflow/geolocator/NmeaStreamImpl.java renamed to geolocator/android/src/main/java/com/baseflow/geolocator/NmeaStreamHandlerImpl.java

Lines changed: 10 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -6,17 +6,18 @@
66
import androidx.annotation.Nullable;
77
import com.baseflow.geolocator.errors.ErrorCodes;
88
import com.baseflow.geolocator.location.GeolocationManager;
9-
import com.baseflow.geolocator.location.NmeaMessageaClient;
9+
import com.baseflow.geolocator.nmea.NmeaMessageManager;
10+
import com.baseflow.geolocator.nmea.NmeaMessageaClient;
1011
import io.flutter.plugin.common.BinaryMessenger;
1112
import io.flutter.plugin.common.EventChannel;
1213
import java.util.HashMap;
1314
import java.util.Map;
1415

15-
class NmeaStreamImpl implements EventChannel.StreamHandler {
16+
class NmeaStreamHandlerImpl implements EventChannel.StreamHandler {
1617

1718
private static final String TAG = "NmeaStreamImpl";
1819

19-
private final GeolocationManager geolocationManager;
20+
private final NmeaMessageManager nmeaMessageManager;
2021

2122
@Nullable
2223
private EventChannel channel;
@@ -27,11 +28,11 @@ class NmeaStreamImpl implements EventChannel.StreamHandler {
2728
@Nullable
2829
private NmeaMessageaClient nmeaMessageaClient;
2930

30-
public NmeaStreamImpl(GeolocationManager geolocationManager) {
31-
this.geolocationManager = geolocationManager;
31+
public NmeaStreamHandlerImpl(NmeaMessageManager nmeaMessageManager) {
32+
this.nmeaMessageManager = nmeaMessageManager;
3233
}
3334

34-
public static Map<String, Object> toMap(String n, Long l) {
35+
private static Map<String, Object> toMap(String n, Long l) {
3536
if (n == null || l == null) {
3637
return null;
3738
}
@@ -84,9 +85,9 @@ void stopListening() {
8485
@Override
8586
public void onListen(Object arguments, EventChannel.EventSink events) {
8687

87-
this.nmeaMessageaClient = geolocationManager.createNmeaClient(context);
88+
this.nmeaMessageaClient = nmeaMessageManager.createNmeaClient(context);
8889

89-
geolocationManager.startNmeaUpdates(
90+
nmeaMessageManager.startNmeaUpdates(
9091
context,
9192
activity,
9293
this.nmeaMessageaClient,
@@ -98,7 +99,7 @@ public void onListen(Object arguments, EventChannel.EventSink events) {
9899
@Override
99100
public void onCancel(Object arguments) {
100101
if (this.nmeaMessageaClient != null) {
101-
geolocationManager.stopNmeaUpdates(this.nmeaMessageaClient);
102+
nmeaMessageManager.stopNmeaUpdates(this.nmeaMessageaClient);
102103
}
103104
}
104105

geolocator/android/src/main/java/com/baseflow/geolocator/PositionStreamImpl.java renamed to geolocator/android/src/main/java/com/baseflow/geolocator/PositionStreamHandlerImpl.java

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -15,7 +15,7 @@
1515

1616
import java.util.Map;
1717

18-
class PositionStreamImpl implements EventChannel.StreamHandler {
18+
class PositionStreamHandlerImpl implements EventChannel.StreamHandler {
1919

2020
private static final String TAG = "PositionStreamImpl";
2121

@@ -26,7 +26,7 @@ class PositionStreamImpl implements EventChannel.StreamHandler {
2626
@Nullable private Activity activity;
2727
@Nullable private LocationClient locationClient;
2828

29-
public PositionStreamImpl(GeolocationManager geolocationManager) {
29+
public PositionStreamHandlerImpl(GeolocationManager geolocationManager) {
3030
this.geolocationManager = geolocationManager;
3131
}
3232

geolocator/android/src/main/java/com/baseflow/geolocator/location/GeolocationManager.java

Lines changed: 2 additions & 66 deletions
Original file line numberDiff line numberDiff line change
@@ -3,14 +3,10 @@
33
import android.app.Activity;
44
import android.content.Context;
55
import android.content.Intent;
6-
import android.os.Build.VERSION_CODES;
76
import androidx.annotation.NonNull;
87
import androidx.annotation.Nullable;
9-
108
import com.baseflow.geolocator.errors.ErrorCallback;
119
import com.baseflow.geolocator.errors.ErrorCodes;
12-
import com.baseflow.geolocator.errors.PermissionUndefinedException;
13-
import com.baseflow.geolocator.permission.LocationPermission;
1410
import com.baseflow.geolocator.permission.PermissionManager;
1511
import com.google.android.gms.common.ConnectionResult;
1612
import com.google.android.gms.common.GoogleApiAvailability;
@@ -37,7 +33,7 @@ public void getLastKnownPosition(
3733
PositionChangedCallback positionChangedCallback,
3834
ErrorCallback errorCallback) {
3935

40-
handlePermissions(
36+
permissionManager.handlePermissions(
4137
context,
4238
activity,
4339
() -> {
@@ -66,7 +62,7 @@ public void startPositionUpdates(
6662

6763
this.locationClients.add(locationClient);
6864

69-
handlePermissions(
65+
permissionManager.handlePermissions(
7066
context,
7167
activity,
7268
() -> locationClient.startPositionUpdates(activity, positionChangedCallback, errorCallback),
@@ -78,26 +74,6 @@ public void stopPositionUpdates(@NonNull LocationClient locationClient) {
7874
locationClient.stopPositionUpdates();
7975
}
8076

81-
82-
public void startNmeaUpdates(Context context, Activity activity, NmeaMessageaClient client,
83-
NmeaChangedCallback nmeaChangedCallback, ErrorCallback errorCallback) {
84-
85-
handlePermissions(
86-
context,
87-
activity,
88-
() -> client.startNmeaUpdates(nmeaChangedCallback, errorCallback),
89-
errorCallback);
90-
}
91-
92-
public void stopNmeaUpdates(NmeaMessageaClient client) {
93-
client.stopNmeaUpdates();
94-
}
95-
96-
public NmeaMessageaClient createNmeaClient(Context context) {
97-
return android.os.Build.VERSION.SDK_INT >= VERSION_CODES.N ? new GnssNmeaMessageClient(context)
98-
: new GpsNmeaMessageClient(context);
99-
}
100-
10177
public LocationClient createLocationClient(
10278
Context context,
10379
boolean forceAndroidLocationManager,
@@ -117,46 +93,6 @@ private boolean isGooglePlayServicesAvailable(Context context) {
11793
return resultCode == ConnectionResult.SUCCESS;
11894
}
11995

120-
private void handlePermissions(
121-
Context context,
122-
@Nullable Activity activity,
123-
Runnable hasPermissionCallback,
124-
ErrorCallback errorCallback) {
125-
try {
126-
LocationPermission permissionStatus =
127-
permissionManager.checkPermissionStatus(context, activity);
128-
129-
if (permissionStatus == LocationPermission.deniedForever) {
130-
errorCallback.onError(ErrorCodes.permissionDenied);
131-
return;
132-
}
133-
134-
if (permissionStatus == LocationPermission.whileInUse
135-
|| permissionStatus == LocationPermission.always) {
136-
hasPermissionCallback.run();
137-
return;
138-
}
139-
140-
if (permissionStatus == LocationPermission.denied && activity != null) {
141-
permissionManager.requestPermission(
142-
activity,
143-
(permission) -> {
144-
if (permission == LocationPermission.whileInUse
145-
|| permission == LocationPermission.always) {
146-
hasPermissionCallback.run();
147-
} else {
148-
errorCallback.onError(ErrorCodes.permissionDenied);
149-
}
150-
},
151-
errorCallback);
152-
} else {
153-
errorCallback.onError(ErrorCodes.permissionDenied);
154-
}
155-
} catch (PermissionUndefinedException ex) {
156-
errorCallback.onError(ErrorCodes.permissionDefinitionsNotFound);
157-
}
158-
}
159-
16096
@Override
16197
public boolean onActivityResult(int requestCode, int resultCode, Intent data) {
16298
for (LocationClient client : this.locationClients) {

geolocator/android/src/main/java/com/baseflow/geolocator/location/GnssNmeaMessageClient.java renamed to geolocator/android/src/main/java/com/baseflow/geolocator/nmea/GnssNmeaMessageClient.java

Lines changed: 7 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
package com.baseflow.geolocator.location;
1+
package com.baseflow.geolocator.nmea;
22

33
import android.annotation.SuppressLint;
44
import android.content.Context;
@@ -32,17 +32,19 @@ public GnssNmeaMessageClient(
3232
this.locationManager = (LocationManager) context.getSystemService(Context.LOCATION_SERVICE);
3333
}
3434

35+
@SuppressLint("MissingPermission")
3536
public void startNmeaUpdates(NmeaChangedCallback nmeaChangedCallback,
3637
ErrorCallback errorCallback) {
3738

3839
this.locationManager.addNmeaListener(this, null);
39-
this.locationManager.requestLocationUpdates(LocationManager.GPS_PROVIDER, 5000, 0, this,
40+
this.locationManager.requestLocationUpdates(LocationManager.GPS_PROVIDER, 10000, 0, this,
4041
Looper.getMainLooper());
4142
this.nmeaChangedCallback = nmeaChangedCallback;
4243
this.errorCallback = errorCallback;
4344
this.isListening = true;
4445
}
4546

47+
@SuppressLint("MissingPermission")
4648
@Override
4749
public void stopNmeaUpdates() {
4850
this.isListening = false;
@@ -60,16 +62,18 @@ public void onNmeaMessage(String s, long l) {
6062

6163
@Override
6264
public void onLocationChanged(@NonNull Location location) {
65+
System.out.println("location changed");
6366
}
6467

6568

6669
@Override
6770
public void onProviderEnabled(String s) {
6871
}
6972

73+
@SuppressLint("MissingPermission")
7074
@Override
7175
public void onProviderDisabled(String s) {
72-
if (s.equals(locationManager.GPS_PROVIDER)) {
76+
if (s.equals(LocationManager.GPS_PROVIDER)) {
7377
if (isListening) {
7478
this.locationManager.removeUpdates(this);
7579
}

0 commit comments

Comments
 (0)