1414import com .mapbox .services .android .navigation .v5 .navigation .MapboxNavigation ;
1515
1616import java .util .ArrayList ;
17+ import java .util .HashSet ;
1718import java .util .List ;
19+ import java .util .Set ;
1820
1921import static com .mapbox .mapboxsdk .style .layers .PropertyFactory .iconImage ;
2022import static com .mapbox .mapboxsdk .style .layers .PropertyFactory .visibility ;
2426class MapWayname {
2527
2628 private static final String NAME_PROPERTY = "name" ;
29+ private final MapWaynameProgressChangeListener progressChangeListener = new MapWaynameProgressChangeListener (this );
30+ private final Set <OnWayNameChangedListener > onWayNameChangedListeners ;
2731 private WaynameLayoutProvider layoutProvider ;
2832 private MapLayerInteractor layerInteractor ;
2933 private WaynameFeatureFinder featureInteractor ;
3034 private List <Point > currentStepPoints = new ArrayList <>();
3135 private Location currentLocation = null ;
3236 private MapboxNavigation navigation ;
33- private final MapWaynameProgressChangeListener progressChangeListener = new MapWaynameProgressChangeListener (this );
3437 private boolean isAutoQueryEnabled ;
3538 private boolean isVisible ;
3639 private FeatureFilterTask filterTask ;
@@ -42,19 +45,20 @@ class MapWayname {
4245 this .layerInteractor = layerInteractor ;
4346 this .featureInteractor = featureInteractor ;
4447 paddingAdjustor .updatePaddingWithDefault ();
48+ this .onWayNameChangedListeners = new HashSet <>();
4549 }
4650
4751 void updateWaynameWithPoint (PointF point , SymbolLayer waynameLayer ) {
48- if (!isAutoQueryEnabled || ! isVisible ) {
52+ if (!isAutoQueryEnabled ) {
4953 return ;
5054 }
51- List <Feature > roads = findRoadLabelFeatures (point );
52- boolean shouldBeVisible = ! roads .isEmpty ();
53- adjustWaynameVisibility ( shouldBeVisible , waynameLayer );
54- if (! shouldBeVisible ) {
55+ List <Feature > roadLabelFeatures = findRoadLabelFeatures (point );
56+ boolean invalidLabelFeatures = roadLabelFeatures .isEmpty ();
57+ if ( invalidLabelFeatures ) {
58+ updateVisibility ( false , waynameLayer );
5559 return ;
5660 }
57- updateLayerWithRoadLabelFeatures ( roads , waynameLayer );
61+ executeFeatureFilterTask ( roadLabelFeatures , waynameLayer );
5862 }
5963
6064 void updateWaynameLayer (String wayname , SymbolLayer waynameLayer ) {
@@ -63,14 +67,6 @@ void updateWaynameLayer(String wayname, SymbolLayer waynameLayer) {
6367 }
6468 }
6569
66- void updateWaynameVisibility (boolean isVisible , SymbolLayer waynameLayer ) {
67- this .isVisible = isVisible ;
68- if (checkWaynameVisibility (isVisible , waynameLayer )) {
69- return ;
70- }
71- adjustWaynameVisibility (isVisible , waynameLayer );
72- }
73-
7470 void updateProgress (Location currentLocation , List <Point > currentStepPoints ) {
7571 if (!this .currentStepPoints .equals (currentStepPoints )) {
7672 this .currentStepPoints = currentStepPoints ;
@@ -80,6 +76,11 @@ void updateProgress(Location currentLocation, List<Point> currentStepPoints) {
8076 }
8177 }
8278
79+ void updateWaynameVisibility (boolean isVisible , SymbolLayer waynameLayer ) {
80+ this .isVisible = isVisible ;
81+ updateVisibility (isVisible , waynameLayer );
82+ }
83+
8384 void updateWaynameQueryMap (boolean isEnabled ) {
8485 isAutoQueryEnabled = isEnabled ;
8586 }
@@ -97,6 +98,14 @@ void addProgressChangeListener(MapboxNavigation navigation) {
9798 navigation .addProgressChangeListener (progressChangeListener );
9899 }
99100
101+ boolean addOnWayNameChangedListener (OnWayNameChangedListener listener ) {
102+ return onWayNameChangedListeners .add (listener );
103+ }
104+
105+ boolean removeOnWayNameChangedListener (OnWayNameChangedListener listener ) {
106+ return onWayNameChangedListeners .remove (listener );
107+ }
108+
100109 void onStart () {
101110 if (navigation != null ) {
102111 navigation .addProgressChangeListener (progressChangeListener );
@@ -117,15 +126,6 @@ private List<Feature> findRoadLabelFeatures(PointF point) {
117126 return featureInteractor .queryRenderedFeatures (point , layerIds );
118127 }
119128
120- private void updateLayerWithRoadLabelFeatures (List <Feature > roadFeatures , final SymbolLayer waynameLayer ) {
121- boolean isValidFeatureList = !roadFeatures .isEmpty ();
122- if (isValidFeatureList ) {
123- executeFeatureFilterTask (roadFeatures , waynameLayer );
124- } else {
125- updateWaynameVisibility (false , waynameLayer );
126- }
127- }
128-
129129 private void executeFeatureFilterTask (List <Feature > roadFeatures , final SymbolLayer waynameLayer ) {
130130 if (isTaskRunning ()) {
131131 filterTask .cancel (true );
@@ -145,22 +145,27 @@ public void onFeatureFiltered(@NonNull Feature feature) {
145145
146146 private boolean isTaskRunning () {
147147 return filterTask != null
148- && (filterTask .getStatus () == AsyncTask .Status .PENDING || filterTask .getStatus () == AsyncTask .Status .RUNNING );
148+ && (filterTask .getStatus () == AsyncTask .Status .PENDING
149+ || filterTask .getStatus () == AsyncTask .Status .RUNNING );
149150 }
150151
151152 private boolean hasValidProgressData () {
152153 return currentLocation != null && !currentStepPoints .isEmpty ();
153154 }
154155
155156 private void createWaynameIcon (String wayname , Layer waynameLayer ) {
156- boolean isVisible = waynameLayer .getVisibility ().getValue ().contentEquals (Property .VISIBLE );
157- if (isVisible ) {
158- Bitmap waynameLayoutBitmap = layoutProvider .generateLayoutBitmap (wayname );
159- if (waynameLayoutBitmap != null ) {
160- layerInteractor .addLayerImage (MAPBOX_WAYNAME_ICON , waynameLayoutBitmap );
161- waynameLayer .setProperties (iconImage (MAPBOX_WAYNAME_ICON ));
162- }
157+ Bitmap waynameLayoutBitmap = layoutProvider .generateLayoutBitmap (wayname );
158+ if (waynameLayoutBitmap != null ) {
159+ layerInteractor .addLayerImage (MAPBOX_WAYNAME_ICON , waynameLayoutBitmap );
160+ waynameLayer .setProperties (iconImage (MAPBOX_WAYNAME_ICON ));
161+ }
162+ }
163+
164+ private void updateVisibility (boolean isVisible , SymbolLayer waynameLayer ) {
165+ if (checkWaynameVisibility (isVisible , waynameLayer )) {
166+ return ;
163167 }
168+ adjustWaynameVisibility (isVisible , waynameLayer );
164169 }
165170
166171 private boolean checkWaynameVisibility (boolean isVisible , Layer waynameLayer ) {
@@ -183,10 +188,21 @@ private void updateWaynameLayerWithNameProperty(SymbolLayer waynameLayer, Featur
183188 String currentWayname = roadFeature .getStringProperty (NAME_PROPERTY );
184189 boolean newWayname = !wayname .contentEquals (currentWayname );
185190 if (newWayname ) {
191+ updateListenersWith (currentWayname );
186192 wayname = currentWayname ;
187- updateWaynameVisibility (true , waynameLayer );
193+ if (isVisible ) {
194+ updateVisibility (true , waynameLayer );
195+ }
188196 updateWaynameLayer (wayname , waynameLayer );
189197 }
198+ } else {
199+ updateVisibility (false , waynameLayer );
200+ }
201+ }
202+
203+ private void updateListenersWith (String currentWayName ) {
204+ for (OnWayNameChangedListener listener : onWayNameChangedListeners ) {
205+ listener .onWayNameChanged (currentWayName );
190206 }
191207 }
192208}
0 commit comments