Loading...
Searching...
No Matches
DefaultNavigationView.java
Go to the documentation of this file.
1package com.navigine.view;
2
3import android.content.Context;
4import android.graphics.Color;
5import android.graphics.PointF;
6import android.util.AttributeSet;
7import android.view.Gravity;
8import android.view.ViewGroup;
9import android.widget.FrameLayout;
10
11import com.navigine.idl.java.Building;
12import com.navigine.idl.java.BuildingListener;
13import com.navigine.idl.java.CameraListener;
14import com.navigine.idl.java.CameraUpdateReason;
15import com.navigine.idl.java.NavigineSdk;
16import com.navigine.idl.java.Sublocation;
17import com.navigine.idl.java.SublocationChangeListener;
18import com.navigine.view.widgets.FloorSelectorView;
19import com.navigine.view.widgets.FloorSelectorViewConfig;
20import com.navigine.view.widgets.FollowMeButton;
21import com.navigine.view.widgets.FollowMeButtonConfig;
22import com.navigine.view.widgets.ZoomControls;
23import com.navigine.view.widgets.ZoomControlsConfig;
24import com.navigine.idl.java.UserLocationLayer;
25
26import java.util.ArrayList;
27import java.util.List;
28
75public class DefaultNavigationView extends LocationView {
76 public static final String TAG = DefaultNavigationView.class.getCanonicalName();
77
78 private DefaultNavigationViewConfig viewConfig;
79 private ZoomControlsConfig zoomControlsConfig;
80 private FollowMeButtonConfig followMeButtonConfig;
81 private FloorSelectorViewConfig floorSelectorConfig;
82
92 public DefaultNavigationView(final Context context) {
93 this(context, null, null, null, null, null);
94 }
95
97 public DefaultNavigationView(final Context context, final AttributeSet attrs) {
98 this(context, attrs, null, null, null, null);
99 }
100
110 public DefaultNavigationView(final Context context, final AttributeSet attrs,
111 final DefaultNavigationViewConfig viewConfig) {
112 this(context, attrs, viewConfig, null, null, null);
113 }
114
119 public DefaultNavigationView(final Context context, final AttributeSet attrs,
120 final DefaultNavigationViewConfig viewConfig,
121 final ZoomControlsConfig zoomConfig,
122 final FollowMeButtonConfig followMeConfig,
123 final FloorSelectorViewConfig floorConfig) {
124 super(context, attrs);
125 this.viewConfig = viewConfig != null ? viewConfig : DefaultNavigationViewConfig.defaultConfig();
126 this.zoomControlsConfig = zoomConfig != null ? zoomConfig : ZoomControlsConfig.defaultConfig();
127 this.followMeButtonConfig = followMeConfig != null ? followMeConfig : FollowMeButtonConfig.defaultConfig();
128 this.floorSelectorConfig = floorConfig != null ? floorConfig : FloorSelectorViewConfig.defaultConfig();
129 setupUI();
130 }
131
132 @Override
133 protected void onDetachedFromWindow() {
134 locationWindow.removeBuildingListener(buildingListener);
135 locationWindow.removeSublocationChangeListener(sublocationChangeListener);
136 locationWindow.removeCameraListener(cameraListener);
137 super.onDetachedFromWindow();
138 }
139
141 private void setupUI() {
142 sublocationChangeListener = new SublocationChangeListener() {
143 @Override
144 public void onActiveSublocationChanged(int sublocationId) {
145 if (floorSelector != null) {
146 floorSelector.setSublocationId(sublocationId);
147 }
148 }
149 };
150 locationWindow.addSublocationChangeListener(sublocationChangeListener);
151
152 zoomControls = new ZoomControls(getContext(),
153 this::zoomInPressed,
154 this::zoomOutPressed,
155 zoomControlsConfig);
156 FrameLayout.LayoutParams zoomLp = new FrameLayout.LayoutParams(
157 ViewGroup.LayoutParams.WRAP_CONTENT,
158 ViewGroup.LayoutParams.WRAP_CONTENT
159 );
160 zoomLp.gravity = Gravity.END | Gravity.CENTER_VERTICAL;
161 addView(zoomControls, zoomLp);
162
163 followMeButton = new FollowMeButton(getContext(),
164 this::followMePressed,
165 followMeButtonConfig);
166 FrameLayout.LayoutParams followLp = new FrameLayout.LayoutParams(
167 ViewGroup.LayoutParams.WRAP_CONTENT,
168 ViewGroup.LayoutParams.WRAP_CONTENT
169 );
170 followLp.gravity = Gravity.END | Gravity.BOTTOM;
171 FollowMeButtonConfig fmConfig = followMeButtonConfig;
172 int rightPad = fmConfig.getMarginRight() > 0
173 ? dpToPx(fmConfig.getMarginRight())
174 : dpToPx((int) com.navigine.view.widgets.WidgetStyles.STANDARD_RIGHT_PADDING);
175 int bottomPad = fmConfig.getMarginBottom() > 0
176 ? dpToPx(fmConfig.getMarginBottom())
177 : dpToPx((int) com.navigine.view.widgets.WidgetStyles.FOLLOW_ME_BOTTOM_PADDING);
178 followLp.setMargins(0, 0, rightPad, bottomPad);
179 addView(followMeButton, followLp);
180
181 floorSelector = new FloorSelectorView(getContext(),
182 (sublocationId) -> locationWindow.setSublocationId(sublocationId),
183 floorSelectorConfig);
184
185 FrameLayout.LayoutParams lp = new FrameLayout.LayoutParams(
186 ViewGroup.LayoutParams.WRAP_CONTENT,
187 ViewGroup.LayoutParams.WRAP_CONTENT
188 );
189 lp.gravity = Gravity.START | Gravity.TOP;
190 FloorSelectorViewConfig fsConfig = floorSelectorConfig;
191 int leftPad = fsConfig.getMarginLeft() > 0
192 ? dpToPx(fsConfig.getMarginLeft())
193 : dpToPx((int) com.navigine.view.widgets.WidgetStyles.STANDARD_LEFT_PADDING);
194 int topPad = fsConfig.getMarginTop() > 0
195 ? dpToPx(fsConfig.getMarginTop())
196 : dpToPx((int) com.navigine.view.widgets.WidgetStyles.FLOOR_SELECTOR_TOP_PADDING);
197 lp.setMargins(leftPad, topPad, 0, 0);
198 floorSelector.setVisibility(GONE);
199
200 addView(floorSelector, lp);
201
202 applyConfigVisibility();
203
204 buildingListener = new BuildingListener() {
205 @Override
206 public void onActiveBuildingFocused(Building activeBuilding) {
207 if (floorSelector == null || activeBuilding == null) {
208 return;
209 }
210 hideFloorSelectorOutsideBuildingFocus = false;
211 List<FloorSelectorView.LevelInfo> floors = new ArrayList<>();
212 for (Sublocation sublocation : activeBuilding.getSublocations()) {
213 if (sublocation == null) {
214 continue;
215 }
216 floors.add(new FloorSelectorView.LevelInfo(sublocation.getLevelId(), sublocation.getId()));
217 }
218 floorSelector.setFloors(floors);
219 floorSelector.setSublocationId(activeBuilding.getActiveSublocationId());
220 applyConfigVisibility();
221 }
222
223 @Override
224 public void onActiveBuildingLeft() {
225 if (floorSelector == null) {
226 return;
227 }
228 hideFloorSelectorOutsideBuildingFocus = true;
229 floorSelector.setFloors(new ArrayList<>());
230 floorSelector.setVisibility(GONE);
231 applyConfigVisibility();
232 }
233
234 @Override
235 public void onActiveSublocationChanged(int activeSublocationId) {
236 }
237 };
238 locationWindow.addBuildingListener(buildingListener);
239
240 userLocationLayer = NavigineSdk.getInstance().getUserLocationLayer(locationWindow);
241 userLocationLayer.setVisible(true);
242
243 cameraListener = new CameraListener() {
244 @Override
245 public void onCameraPositionChanged(CameraUpdateReason reason, boolean finished) {
246 if (reason == CameraUpdateReason.APPLICATION) {
247 return;
248 }
249
250 if (followMeButton != null && followMeButton.isFollowing()) {
251 userLocationLayer.resetAnchor();
252 followMeButton.updateAppearanceForFollowingState(false);
253 }
254 }
255 };
256 locationWindow.addCameraListener(cameraListener);
257 }
258
259
261 private void zoomInPressed() {
262 float currentZoom = locationWindow.getZoomFactor();
263 locationWindow.setZoomFactor(currentZoom * (3.f / 2.f));
264 }
265
267 private void zoomOutPressed() {
268 float currentZoom = locationWindow.getZoomFactor();
269 locationWindow.setZoomFactor(currentZoom * (2.f / 3.f));
270 }
271
272 private void applyConfigVisibility() {
273 if (zoomControls != null) {
274 zoomControls.setVisibility((viewConfig.getVisibleWidgets() & DefaultNavigationViewConfig.WIDGET_ZOOM_CONTROLS) != 0 ? VISIBLE : GONE);
275 }
276 if (followMeButton != null) {
277 followMeButton.setVisibility((viewConfig.getVisibleWidgets() & DefaultNavigationViewConfig.WIDGET_FOLLOW_ME) != 0 ? VISIBLE : GONE);
278 }
279 if (floorSelector != null) {
280 boolean floorVisible = (viewConfig.getVisibleWidgets() & DefaultNavigationViewConfig.WIDGET_FLOOR_SELECTOR) != 0
281 && !hideFloorSelectorOutsideBuildingFocus
282 && floorSelector.getFloorsCount() > 1;
283 floorSelector.setVisibility(floorVisible ? VISIBLE : GONE);
284 }
285 }
286
287 private int dpToPx(int dp) {
288 return (int) (dp * getResources().getDisplayMetrics().density + 0.5f);
289 }
290
295 private void followMePressed(boolean isFollowing) {
296 if (isFollowing) {
297 float centerX = getWidth() / 2f;
298 float centerY = getHeight() / 2f;
299 PointF anchorPoint = new PointF(centerX, centerY);
300 userLocationLayer.setAnchor(anchorPoint);
301 } else {
302 userLocationLayer.resetAnchor();
303 }
304 }
305
309 public void setViewConfig(DefaultNavigationViewConfig newViewConfig) {
310 if (newViewConfig != null) viewConfig = newViewConfig;
311 applyConfigVisibility();
312 }
313
325 public void setConfig(DefaultNavigationViewConfig newViewConfig,
326 ZoomControlsConfig newZoomConfig,
327 FollowMeButtonConfig newFollowMeConfig,
328 FloorSelectorViewConfig newFloorConfig) {
329 if (newViewConfig != null) viewConfig = newViewConfig;
330 if (newZoomConfig != null) zoomControlsConfig = newZoomConfig;
331 if (newFollowMeConfig != null) followMeButtonConfig = newFollowMeConfig;
332 if (newFloorConfig != null) floorSelectorConfig = newFloorConfig;
333 applyConfigVisibility();
334 if (zoomControls != null) zoomControls.applyConfig(zoomControlsConfig);
335 if (floorSelector != null) floorSelector.applyConfig(floorSelectorConfig);
336 if (followMeButton != null) followMeButton.applyConfig(followMeButtonConfig);
337 }
338
340 public DefaultNavigationViewConfig getViewConfig() { return viewConfig; }
342 public ZoomControlsConfig getZoomControlsConfig() { return zoomControlsConfig; }
344 public FollowMeButtonConfig getFollowMeButtonConfig() { return followMeButtonConfig; }
346 public FloorSelectorViewConfig getFloorSelectorConfig() { return floorSelectorConfig; }
347
358 public FloorSelectorView getFloorSelectorView() { return floorSelector; }
360 public ZoomControls getZoomControls() { return zoomControls; }
362 public FollowMeButton getFollowMeButton() { return followMeButton; }
363
365 private boolean hideFloorSelectorOutsideBuildingFocus = true;
366
367 private FloorSelectorView floorSelector;
368 private ZoomControls zoomControls;
369 private BuildingListener buildingListener;
370 private SublocationChangeListener sublocationChangeListener;
371 private UserLocationLayer userLocationLayer;
372 private CameraListener cameraListener;
373 private FollowMeButton followMeButton;
374}