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);
134 locationWindow.removeBuildingListener(buildingListener);
135 locationWindow.removeSublocationChangeListener(sublocationChangeListener);
136 locationWindow.removeCameraListener(cameraListener);
137 super.onDetachedFromWindow();
141 private void setupUI() {
144 public void onActiveSublocationChanged(
int sublocationId) {
145 if (floorSelector !=
null) {
154 this::zoomOutPressed,
156 FrameLayout.LayoutParams zoomLp =
new FrameLayout.LayoutParams(
157 ViewGroup.LayoutParams.WRAP_CONTENT,
158 ViewGroup.LayoutParams.WRAP_CONTENT
160 zoomLp.gravity = Gravity.END | Gravity.CENTER_VERTICAL;
161 addView(zoomControls, zoomLp);
164 this::followMePressed,
165 followMeButtonConfig);
166 FrameLayout.LayoutParams followLp =
new FrameLayout.LayoutParams(
167 ViewGroup.LayoutParams.WRAP_CONTENT,
168 ViewGroup.LayoutParams.WRAP_CONTENT
170 followLp.gravity = Gravity.END | Gravity.BOTTOM;
171 addView(followMeButton, followLp);
175 floorSelectorConfig);
177 FrameLayout.LayoutParams lp =
new FrameLayout.LayoutParams(
178 ViewGroup.LayoutParams.WRAP_CONTENT,
179 ViewGroup.LayoutParams.WRAP_CONTENT
181 lp.gravity = Gravity.START | Gravity.TOP;
182 floorSelector.setVisibility(GONE);
184 addView(floorSelector, lp);
186 applyWidgetLayoutParams();
187 applyConfigVisibility();
191 public void onActiveBuildingFocused(
Building activeBuilding) {
192 if (floorSelector ==
null || activeBuilding ==
null) {
195 hideFloorSelectorOutsideBuildingFocus =
false;
196 List<FloorSelectorView.LevelInfo> floors =
new ArrayList<>();
198 if (sublocation ==
null) {
201 floors.add(
new FloorSelectorView.LevelInfo(sublocation.getLevelId(), sublocation.getId()));
203 floorSelector.setFloors(floors);
205 applyConfigVisibility();
209 public void onActiveBuildingLeft() {
210 if (floorSelector ==
null) {
213 hideFloorSelectorOutsideBuildingFocus =
true;
214 floorSelector.setFloors(
new ArrayList<>());
215 floorSelector.setVisibility(GONE);
216 applyConfigVisibility();
220 public void onActiveSublocationChanged(
int activeSublocationId) {
223 locationWindow.addBuildingListener(buildingListener);
225 userLocationLayer = NavigineSdk.getInstance().getUserLocationLayer(locationWindow);
226 userLocationLayer.setVisible(
true);
228 cameraListener =
new CameraListener() {
230 public void onCameraPositionChanged(CameraUpdateReason reason,
boolean finished) {
231 if (reason == CameraUpdateReason.APPLICATION) {
235 if (followMeButton !=
null && followMeButton.isFollowing()) {
236 userLocationLayer.resetAnchor();
237 followMeButton.updateAppearanceForFollowingState(
false);
241 locationWindow.addCameraListener(cameraListener);
246 private void zoomInPressed() {
247 float currentZoom = locationWindow.getZoomFactor();
248 locationWindow.setZoomFactor(currentZoom * (3.f / 2.f));
252 private void zoomOutPressed() {
253 float currentZoom = locationWindow.getZoomFactor();
254 locationWindow.setZoomFactor(currentZoom * (2.f / 3.f));
257 private void applyConfigVisibility() {
258 if (zoomControls !=
null) {
259 zoomControls.setVisibility((viewConfig.getVisibleWidgets() & DefaultNavigationViewConfig.WIDGET_ZOOM_CONTROLS) != 0 ? VISIBLE : GONE);
261 if (followMeButton !=
null) {
262 followMeButton.setVisibility((viewConfig.getVisibleWidgets() & DefaultNavigationViewConfig.WIDGET_FOLLOW_ME) != 0 ? VISIBLE : GONE);
264 if (floorSelector !=
null) {
265 boolean floorVisible = (viewConfig.getVisibleWidgets() & DefaultNavigationViewConfig.WIDGET_FLOOR_SELECTOR) != 0
266 && !hideFloorSelectorOutsideBuildingFocus
267 && floorSelector.getFloorsCount() > 1;
268 floorSelector.setVisibility(floorVisible ? VISIBLE : GONE);
272 private int dpToPx(
int dp) {
273 return (
int) (dp * getResources().getDisplayMetrics().density + 0.5f);
277 private void applyWidgetLayoutParams() {
278 if (zoomControls !=
null) {
279 FrameLayout.LayoutParams zoomLp = (FrameLayout.LayoutParams) zoomControls.getLayoutParams();
280 if (zoomLp ==
null) {
281 zoomLp =
new FrameLayout.LayoutParams(
282 ViewGroup.LayoutParams.WRAP_CONTENT,
283 ViewGroup.LayoutParams.WRAP_CONTENT);
285 zoomLp.gravity = Gravity.END | Gravity.CENTER_VERTICAL;
286 ZoomControlsConfig zc = zoomControlsConfig;
287 int zoomRight = zc.getMarginRight() > 0
288 ? dpToPx(zc.getMarginRight())
289 : dpToPx((int) com.navigine.view.widgets.WidgetStyles.STANDARD_RIGHT_PADDING);
290 zoomLp.setMargins(0, 0, zoomRight, 0);
291 zoomControls.setLayoutParams(zoomLp);
292 int mv = zc.getMarginVertical();
293 zoomControls.setTranslationY(mv != 0 ? dpToPx(mv) / 2f : 0f);
295 if (followMeButton !=
null) {
296 FrameLayout.LayoutParams followLp = (FrameLayout.LayoutParams) followMeButton.getLayoutParams();
297 if (followLp ==
null) {
298 followLp =
new FrameLayout.LayoutParams(
299 ViewGroup.LayoutParams.WRAP_CONTENT,
300 ViewGroup.LayoutParams.WRAP_CONTENT);
302 followLp.gravity = Gravity.END | Gravity.BOTTOM;
303 FollowMeButtonConfig fmConfig = followMeButtonConfig;
304 int rightPad = fmConfig.getMarginRight() > 0
305 ? dpToPx(fmConfig.getMarginRight())
306 : dpToPx((int) com.navigine.view.widgets.WidgetStyles.STANDARD_RIGHT_PADDING);
307 int bottomPad = fmConfig.getMarginBottom() > 0
308 ? dpToPx(fmConfig.getMarginBottom())
309 : dpToPx((
int) com.navigine.view.widgets.WidgetStyles.FOLLOW_ME_BOTTOM_PADDING);
310 followLp.setMargins(0, 0, rightPad, bottomPad);
311 followMeButton.setLayoutParams(followLp);
313 if (floorSelector !=
null) {
314 FrameLayout.LayoutParams fl = (FrameLayout.LayoutParams) floorSelector.getLayoutParams();
316 fl =
new FrameLayout.LayoutParams(
317 ViewGroup.LayoutParams.WRAP_CONTENT,
318 ViewGroup.LayoutParams.WRAP_CONTENT);
320 fl.gravity = Gravity.START | Gravity.TOP;
321 FloorSelectorViewConfig fsConfig = floorSelectorConfig;
322 int leftPad = fsConfig.getMarginLeft() > 0
323 ? dpToPx(fsConfig.getMarginLeft())
324 : dpToPx((int) com.navigine.view.widgets.WidgetStyles.STANDARD_LEFT_PADDING);
325 int topPad = fsConfig.getMarginTop() > 0
326 ? dpToPx(fsConfig.getMarginTop())
327 : dpToPx((
int) com.navigine.view.widgets.WidgetStyles.FLOOR_SELECTOR_TOP_PADDING);
328 fl.setMargins(leftPad, topPad, 0, 0);
329 floorSelector.setLayoutParams(fl);
337 private void followMePressed(
boolean isFollowing) {
339 float centerX = getWidth() / 2f;
340 float centerY = getHeight() / 2f;
341 PointF anchorPoint =
new PointF(centerX, centerY);
342 userLocationLayer.setAnchor(anchorPoint);
344 userLocationLayer.resetAnchor();
352 if (newViewConfig !=
null) viewConfig = newViewConfig;
353 applyConfigVisibility();
371 if (newViewConfig !=
null) viewConfig = newViewConfig;
372 if (newZoomConfig !=
null) zoomControlsConfig = newZoomConfig;
373 if (newFollowMeConfig !=
null) followMeButtonConfig = newFollowMeConfig;
374 if (newFloorConfig !=
null) floorSelectorConfig = newFloorConfig;
375 applyConfigVisibility();
376 if (zoomControls !=
null) zoomControls.applyConfig(zoomControlsConfig);
377 if (floorSelector !=
null) floorSelector.applyConfig(floorSelectorConfig);
378 if (followMeButton !=
null) followMeButton.applyConfig(followMeButtonConfig);
379 applyWidgetLayoutParams();
408 private boolean hideFloorSelectorOutsideBuildingFocus =
true;