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
133 private void setupUI() {
134 sublocationChangeListener = new SublocationChangeListener() {
135 @Override
136 public void onActiveSublocationChanged(int sublocationId) {
137 if (floorSelector != null) {
138 floorSelector.setSublocationId(sublocationId);
139 }
140 }
141 };
142 locationWindow.addSublocationChangeListener(sublocationChangeListener);
143
144 zoomControls = new ZoomControls(getContext(),
145 this::zoomInPressed,
146 this::zoomOutPressed,
147 zoomControlsConfig);
148 FrameLayout.LayoutParams zoomLp = new FrameLayout.LayoutParams(
149 ViewGroup.LayoutParams.WRAP_CONTENT,
150 ViewGroup.LayoutParams.WRAP_CONTENT
151 );
152 zoomLp.gravity = Gravity.END | Gravity.CENTER_VERTICAL;
153 addView(zoomControls, zoomLp);
154
155 followMeButton = new FollowMeButton(getContext(),
156 this::followMePressed,
157 followMeButtonConfig);
158 FrameLayout.LayoutParams followLp = new FrameLayout.LayoutParams(
159 ViewGroup.LayoutParams.WRAP_CONTENT,
160 ViewGroup.LayoutParams.WRAP_CONTENT
161 );
162 followLp.gravity = Gravity.END | Gravity.BOTTOM;
163 addView(followMeButton, followLp);
164
165 floorSelector = new FloorSelectorView(getContext(),
166 (sublocationId) -> locationWindow.setSublocationId(sublocationId),
167 floorSelectorConfig);
168
169 FrameLayout.LayoutParams lp = new FrameLayout.LayoutParams(
170 ViewGroup.LayoutParams.WRAP_CONTENT,
171 ViewGroup.LayoutParams.WRAP_CONTENT
172 );
173 lp.gravity = Gravity.START | Gravity.TOP;
174 floorSelector.setVisibility(GONE);
175
176 addView(floorSelector, lp);
177
178 applyWidgetLayoutParams();
179 applyConfigVisibility();
180
181 buildingListener = new BuildingListener() {
182 @Override
183 public void onActiveBuildingFocused(Building activeBuilding) {
184 if (floorSelector == null || activeBuilding == null) {
185 return;
186 }
187 hideFloorSelectorOutsideBuildingFocus = false;
188 List<FloorSelectorView.LevelInfo> floors = new ArrayList<>();
189 for (Sublocation sublocation : activeBuilding.getSublocations()) {
190 if (sublocation == null) {
191 continue;
192 }
193 floors.add(new FloorSelectorView.LevelInfo(sublocation.getLevelId(), sublocation.getId()));
194 }
195 floorSelector.setFloors(floors);
196 floorSelector.setSublocationId(activeBuilding.getActiveSublocationId());
197 applyConfigVisibility();
198 }
199
200 @Override
201 public void onActiveBuildingLeft() {
202 if (floorSelector == null) {
203 return;
204 }
205 hideFloorSelectorOutsideBuildingFocus = true;
206 floorSelector.setFloors(new ArrayList<>());
207 floorSelector.setVisibility(GONE);
208 applyConfigVisibility();
209 }
210
211 @Override
212 public void onActiveSublocationChanged(int activeSublocationId) {
213 }
214 };
215 locationWindow.addBuildingListener(buildingListener);
216
217 userLocationLayer = NavigineSdk.getInstance().getUserLocationLayer(locationWindow);
218 userLocationLayer.setVisible(true);
219
220 cameraListener = new CameraListener() {
221 @Override
222 public void onCameraPositionChanged(CameraUpdateReason reason, boolean finished) {
223 if (reason == CameraUpdateReason.APPLICATION) {
224 return;
225 }
226
227 if (followMeButton != null && followMeButton.isFollowing()) {
228 userLocationLayer.resetAnchor();
229 followMeButton.updateAppearanceForFollowingState(false);
230 }
231 }
232 };
233 locationWindow.addCameraListener(cameraListener);
234 }
235
236
238 private void zoomInPressed() {
239 float currentZoom = locationWindow.getZoomFactor();
240 locationWindow.setZoomFactor(currentZoom * (3.f / 2.f));
241 }
242
244 private void zoomOutPressed() {
245 float currentZoom = locationWindow.getZoomFactor();
246 locationWindow.setZoomFactor(currentZoom * (2.f / 3.f));
247 }
248
249 private void applyConfigVisibility() {
250 if (zoomControls != null) {
251 zoomControls.setVisibility((viewConfig.getVisibleWidgets() & DefaultNavigationViewConfig.WIDGET_ZOOM_CONTROLS) != 0 ? VISIBLE : GONE);
252 }
253 if (followMeButton != null) {
254 followMeButton.setVisibility((viewConfig.getVisibleWidgets() & DefaultNavigationViewConfig.WIDGET_FOLLOW_ME) != 0 ? VISIBLE : GONE);
255 }
256 if (floorSelector != null) {
257 boolean floorVisible = (viewConfig.getVisibleWidgets() & DefaultNavigationViewConfig.WIDGET_FLOOR_SELECTOR) != 0
258 && !hideFloorSelectorOutsideBuildingFocus
259 && floorSelector.getFloorsCount() > 1;
260 floorSelector.setVisibility(floorVisible ? VISIBLE : GONE);
261 }
262 }
263
264 private int dpToPx(int dp) {
265 return (int) (dp * getResources().getDisplayMetrics().density + 0.5f);
266 }
267
269 private void applyWidgetLayoutParams() {
270 if (zoomControls != null) {
271 FrameLayout.LayoutParams zoomLp = (FrameLayout.LayoutParams) zoomControls.getLayoutParams();
272 if (zoomLp == null) {
273 zoomLp = new FrameLayout.LayoutParams(
274 ViewGroup.LayoutParams.WRAP_CONTENT,
275 ViewGroup.LayoutParams.WRAP_CONTENT);
276 }
277 zoomLp.gravity = Gravity.END | Gravity.CENTER_VERTICAL;
278 ZoomControlsConfig zc = zoomControlsConfig;
279 int zoomRight = zc.getMarginRight() > 0
280 ? dpToPx(zc.getMarginRight())
281 : dpToPx((int) com.navigine.view.widgets.WidgetStyles.STANDARD_RIGHT_PADDING);
282 zoomLp.setMargins(0, 0, zoomRight, 0);
283 zoomControls.setLayoutParams(zoomLp);
284 int mv = zc.getMarginVertical();
285 zoomControls.setTranslationY(mv != 0 ? dpToPx(mv) / 2f : 0f);
286 }
287 if (followMeButton != null) {
288 FrameLayout.LayoutParams followLp = (FrameLayout.LayoutParams) followMeButton.getLayoutParams();
289 if (followLp == null) {
290 followLp = new FrameLayout.LayoutParams(
291 ViewGroup.LayoutParams.WRAP_CONTENT,
292 ViewGroup.LayoutParams.WRAP_CONTENT);
293 }
294 followLp.gravity = Gravity.END | Gravity.BOTTOM;
295 FollowMeButtonConfig fmConfig = followMeButtonConfig;
296 int rightPad = fmConfig.getMarginRight() > 0
297 ? dpToPx(fmConfig.getMarginRight())
298 : dpToPx((int) com.navigine.view.widgets.WidgetStyles.STANDARD_RIGHT_PADDING);
299 int bottomPad = fmConfig.getMarginBottom() > 0
300 ? dpToPx(fmConfig.getMarginBottom())
301 : dpToPx((int) com.navigine.view.widgets.WidgetStyles.FOLLOW_ME_BOTTOM_PADDING);
302 followLp.setMargins(0, 0, rightPad, bottomPad);
303 followMeButton.setLayoutParams(followLp);
304 }
305 if (floorSelector != null) {
306 FrameLayout.LayoutParams fl = (FrameLayout.LayoutParams) floorSelector.getLayoutParams();
307 if (fl == null) {
308 fl = new FrameLayout.LayoutParams(
309 ViewGroup.LayoutParams.WRAP_CONTENT,
310 ViewGroup.LayoutParams.WRAP_CONTENT);
311 }
312 fl.gravity = Gravity.START | Gravity.TOP;
313 FloorSelectorViewConfig fsConfig = floorSelectorConfig;
314 int leftPad = fsConfig.getMarginLeft() > 0
315 ? dpToPx(fsConfig.getMarginLeft())
316 : dpToPx((int) com.navigine.view.widgets.WidgetStyles.STANDARD_LEFT_PADDING);
317 int topPad = fsConfig.getMarginTop() > 0
318 ? dpToPx(fsConfig.getMarginTop())
319 : dpToPx((int) com.navigine.view.widgets.WidgetStyles.FLOOR_SELECTOR_TOP_PADDING);
320 fl.setMargins(leftPad, topPad, 0, 0);
321 floorSelector.setLayoutParams(fl);
322 }
323 }
324
329 private void followMePressed(boolean isFollowing) {
330 if (isFollowing) {
331 float centerX = getWidth() / 2f;
332 float centerY = getHeight() / 2f;
333 PointF anchorPoint = new PointF(centerX, centerY);
334 userLocationLayer.setAnchor(anchorPoint);
335 } else {
336 userLocationLayer.resetAnchor();
337 }
338 }
339
343 public void setViewConfig(DefaultNavigationViewConfig newViewConfig) {
344 if (newViewConfig != null) viewConfig = newViewConfig;
345 applyConfigVisibility();
346 }
347
359 public void setConfig(DefaultNavigationViewConfig newViewConfig,
360 ZoomControlsConfig newZoomConfig,
361 FollowMeButtonConfig newFollowMeConfig,
362 FloorSelectorViewConfig newFloorConfig) {
363 if (newViewConfig != null) viewConfig = newViewConfig;
364 if (newZoomConfig != null) zoomControlsConfig = newZoomConfig;
365 if (newFollowMeConfig != null) followMeButtonConfig = newFollowMeConfig;
366 if (newFloorConfig != null) floorSelectorConfig = newFloorConfig;
367 applyConfigVisibility();
368 if (zoomControls != null) zoomControls.applyConfig(zoomControlsConfig);
369 if (floorSelector != null) floorSelector.applyConfig(floorSelectorConfig);
370 if (followMeButton != null) followMeButton.applyConfig(followMeButtonConfig);
371 applyWidgetLayoutParams();
372 }
373
375 public DefaultNavigationViewConfig getViewConfig() { return viewConfig; }
377 public ZoomControlsConfig getZoomControlsConfig() { return zoomControlsConfig; }
379 public FollowMeButtonConfig getFollowMeButtonConfig() { return followMeButtonConfig; }
381 public FloorSelectorViewConfig getFloorSelectorConfig() { return floorSelectorConfig; }
382
393 public FloorSelectorView getFloorSelectorView() { return floorSelector; }
395 public ZoomControls getZoomControls() { return zoomControls; }
397 public FollowMeButton getFollowMeButton() { return followMeButton; }
398
400 private boolean hideFloorSelectorOutsideBuildingFocus = true;
401
402 private FloorSelectorView floorSelector;
403 private ZoomControls zoomControls;
404 private BuildingListener buildingListener;
405 private SublocationChangeListener sublocationChangeListener;
406 private UserLocationLayer userLocationLayer;
407 private CameraListener cameraListener;
408 private FollowMeButton followMeButton;
409}