93 this(context,
null,
null,
null,
null,
null);
98 this(context, attrs,
null,
null,
null,
null);
112 this(context, attrs, viewConfig,
null,
null,
null);
124 super(context, attrs);
133 private void setupUI() {
136 public void onActiveSublocationChanged(
int sublocationId) {
137 if (floorSelector !=
null) {
146 this::zoomOutPressed,
148 FrameLayout.LayoutParams zoomLp =
new FrameLayout.LayoutParams(
149 ViewGroup.LayoutParams.WRAP_CONTENT,
150 ViewGroup.LayoutParams.WRAP_CONTENT
152 zoomLp.gravity = Gravity.END | Gravity.CENTER_VERTICAL;
153 addView(zoomControls, zoomLp);
156 this::followMePressed,
157 followMeButtonConfig);
158 FrameLayout.LayoutParams followLp =
new FrameLayout.LayoutParams(
159 ViewGroup.LayoutParams.WRAP_CONTENT,
160 ViewGroup.LayoutParams.WRAP_CONTENT
162 followLp.gravity = Gravity.END | Gravity.BOTTOM;
163 addView(followMeButton, followLp);
167 floorSelectorConfig);
169 FrameLayout.LayoutParams lp =
new FrameLayout.LayoutParams(
170 ViewGroup.LayoutParams.WRAP_CONTENT,
171 ViewGroup.LayoutParams.WRAP_CONTENT
173 lp.gravity = Gravity.START | Gravity.TOP;
174 floorSelector.setVisibility(GONE);
176 addView(floorSelector, lp);
178 applyWidgetLayoutParams();
179 applyConfigVisibility();
183 public void onActiveBuildingFocused(
Building activeBuilding) {
184 if (floorSelector ==
null || activeBuilding ==
null) {
187 hideFloorSelectorOutsideBuildingFocus =
false;
188 List<FloorSelectorView.LevelInfo> floors =
new ArrayList<>();
190 if (sublocation ==
null) {
193 floors.add(
new FloorSelectorView.LevelInfo(sublocation.getLevelId(), sublocation.getId()));
195 floorSelector.setFloors(floors);
197 applyConfigVisibility();
201 public void onActiveBuildingLeft() {
202 if (floorSelector ==
null) {
205 hideFloorSelectorOutsideBuildingFocus =
true;
206 floorSelector.setFloors(
new ArrayList<>());
207 floorSelector.setVisibility(GONE);
208 applyConfigVisibility();
212 public void onActiveSublocationChanged(
int activeSublocationId) {
215 locationWindow.addBuildingListener(buildingListener);
217 userLocationLayer = NavigineSdk.getInstance().getUserLocationLayer(locationWindow);
218 userLocationLayer.setVisible(
true);
220 cameraListener =
new CameraListener() {
222 public void onCameraPositionChanged(CameraUpdateReason reason,
boolean finished) {
223 if (reason == CameraUpdateReason.APPLICATION) {
227 if (followMeButton !=
null && followMeButton.isFollowing()) {
228 userLocationLayer.resetAnchor();
229 followMeButton.updateAppearanceForFollowingState(
false);
233 locationWindow.addCameraListener(cameraListener);
238 private void zoomInPressed() {
239 float currentZoom = locationWindow.getZoomFactor();
240 locationWindow.setZoomFactor(currentZoom * (3.f / 2.f));
244 private void zoomOutPressed() {
245 float currentZoom = locationWindow.getZoomFactor();
246 locationWindow.setZoomFactor(currentZoom * (2.f / 3.f));
249 private void applyConfigVisibility() {
250 if (zoomControls !=
null) {
251 zoomControls.setVisibility((viewConfig.getVisibleWidgets() & DefaultNavigationViewConfig.WIDGET_ZOOM_CONTROLS) != 0 ? VISIBLE : GONE);
253 if (followMeButton !=
null) {
254 followMeButton.setVisibility((viewConfig.getVisibleWidgets() & DefaultNavigationViewConfig.WIDGET_FOLLOW_ME) != 0 ? VISIBLE : GONE);
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);
264 private int dpToPx(
int dp) {
265 return (
int) (dp * getResources().getDisplayMetrics().density + 0.5f);
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);
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);
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);
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);
305 if (floorSelector !=
null) {
306 FrameLayout.LayoutParams fl = (FrameLayout.LayoutParams) floorSelector.getLayoutParams();
308 fl =
new FrameLayout.LayoutParams(
309 ViewGroup.LayoutParams.WRAP_CONTENT,
310 ViewGroup.LayoutParams.WRAP_CONTENT);
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);
329 private void followMePressed(
boolean isFollowing) {
331 float centerX = getWidth() / 2f;
332 float centerY = getHeight() / 2f;
333 PointF anchorPoint =
new PointF(centerX, centerY);
334 userLocationLayer.setAnchor(anchorPoint);
336 userLocationLayer.resetAnchor();
344 if (newViewConfig !=
null) viewConfig = newViewConfig;
345 applyConfigVisibility();
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();
400 private boolean hideFloorSelectorOutsideBuildingFocus =
true;