Search in sources :

Example 1 with MapMarkersItemTouchHelperCallback

use of net.osmand.plus.mapmarkers.adapters.MapMarkersItemTouchHelperCallback in project Osmand by osmandapp.

the class MapMarkersActiveFragment method onCreateView.

@Nullable
@Override
public View onCreateView(LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {
    final MapActivity mapActivity = (MapActivity) getActivity();
    final View mainView = inflater.inflate(R.layout.fragment_map_markers_active, container, false);
    final EmptyStateRecyclerView recyclerView = (EmptyStateRecyclerView) mainView.findViewById(R.id.list);
    recyclerView.setLayoutManager(new LinearLayoutManager(getContext()));
    adapter = new MapMarkersActiveAdapter(mapActivity);
    final ItemTouchHelper touchHelper = new ItemTouchHelper(new MapMarkersItemTouchHelperCallback(mapActivity, adapter));
    touchHelper.attachToRecyclerView(recyclerView);
    adapter.setAdapterListener(new MapMarkersActiveAdapterListener() {

        private int fromPosition;

        private int toPosition;

        @Override
        public void onItemClick(View view) {
            int pos = recyclerView.getChildAdapterPosition(view);
            if (pos == RecyclerView.NO_POSITION) {
                return;
            }
            MapMarker marker = adapter.getItem(pos);
            OsmandApplication app = mapActivity.getMyApplication();
            if (app.getSettings().SELECT_MARKER_ON_SINGLE_TAP.get()) {
                app.getMapMarkersHelper().moveMarkerToTop(marker);
                updateAdapter();
            } else {
                FavouritePoint fav = marker.favouritePoint == null ? app.getFavorites().getVisibleFavByLatLon(marker.point) : marker.favouritePoint;
                if (fav != null) {
                    showMap(marker.point, fav.getPointDescription(), fav);
                    return;
                }
                WptPt pt = marker.wptPt == null ? app.getSelectedGpxHelper().getVisibleWayPointByLatLon(marker.point) : marker.wptPt;
                if (pt != null) {
                    showMap(marker.point, pt.getPointDescription(mapActivity), pt);
                    return;
                }
                Amenity mapObj = mapActivity.getMapLayers().getMapMarkersLayer().getMapObjectByMarker(marker);
                PointDescription desc = mapObj == null ? marker.getPointDescription(mapActivity) : mapActivity.getMapLayers().getPoiMapLayer().getObjectName(mapObj);
                showMap(marker.point, desc, mapObj == null ? marker : mapObj);
            }
        }

        private void showMap(LatLon latLon, PointDescription desc, Object objToShow) {
            mapActivity.getMyApplication().getSettings().setMapLocationToShow(latLon.getLatitude(), latLon.getLongitude(), 15, desc, true, objToShow);
            MapActivity.launchMapActivityMoveToTop(mapActivity);
            ((DialogFragment) getParentFragment()).dismiss();
        }

        @Override
        public void onDragStarted(RecyclerView.ViewHolder holder) {
            compassUpdateAllowed = false;
            fromPosition = holder.getAdapterPosition();
            touchHelper.startDrag(holder);
        }

        @Override
        public void onDragOrSwipeEnded(RecyclerView.ViewHolder holder) {
            compassUpdateAllowed = true;
            toPosition = holder.getAdapterPosition();
            if (toPosition >= 0 && fromPosition >= 0 && toPosition != fromPosition) {
                hideSnackbar();
                mapActivity.getMyApplication().getMapMarkersHelper().reorderActiveMarkersIfNeeded();
                adapter.notifyDataSetChanged();
            }
        }

        @Override
        public void onSwipeStarted() {
            compassUpdateAllowed = false;
        }
    });
    final View emptyView = mainView.findViewById(R.id.empty_view);
    ImageView emptyImageView = (ImageView) emptyView.findViewById(R.id.empty_state_image_view);
    if (Build.VERSION.SDK_INT >= 18) {
        emptyImageView.setImageResource(mapActivity.getMyApplication().getSettings().isLightContent() ? R.drawable.ic_empty_state_marker_list_day : R.drawable.ic_empty_state_marker_list_night);
    } else {
        emptyImageView.setVisibility(View.INVISIBLE);
    }
    recyclerView.setEmptyView(emptyView);
    recyclerView.setAdapter(adapter);
    recyclerView.addOnScrollListener(new RecyclerView.OnScrollListener() {

        @Override
        public void onScrollStateChanged(RecyclerView recyclerView, int newState) {
            super.onScrollStateChanged(recyclerView, newState);
            compassUpdateAllowed = newState == RecyclerView.SCROLL_STATE_IDLE;
        }
    });
    return mainView;
}
Also used : WptPt(net.osmand.plus.GPXUtilities.WptPt) Amenity(net.osmand.data.Amenity) MapMarker(net.osmand.plus.MapMarkersHelper.MapMarker) OsmandApplication(net.osmand.plus.OsmandApplication) FavouritePoint(net.osmand.data.FavouritePoint) EmptyStateRecyclerView(net.osmand.plus.widgets.EmptyStateRecyclerView) MapMarkersActiveAdapterListener(net.osmand.plus.mapmarkers.adapters.MapMarkersActiveAdapter.MapMarkersActiveAdapterListener) LinearLayoutManager(android.support.v7.widget.LinearLayoutManager) EmptyStateRecyclerView(net.osmand.plus.widgets.EmptyStateRecyclerView) ImageView(android.widget.ImageView) View(android.view.View) RecyclerView(android.support.v7.widget.RecyclerView) FavouritePoint(net.osmand.data.FavouritePoint) ItemTouchHelper(android.support.v7.widget.helper.ItemTouchHelper) LatLon(net.osmand.data.LatLon) MapMarkersItemTouchHelperCallback(net.osmand.plus.mapmarkers.adapters.MapMarkersItemTouchHelperCallback) PointDescription(net.osmand.data.PointDescription) EmptyStateRecyclerView(net.osmand.plus.widgets.EmptyStateRecyclerView) RecyclerView(android.support.v7.widget.RecyclerView) MapMarkersActiveAdapter(net.osmand.plus.mapmarkers.adapters.MapMarkersActiveAdapter) ImageView(android.widget.ImageView) MapActivity(net.osmand.plus.activities.MapActivity) Nullable(android.support.annotation.Nullable)

Example 2 with MapMarkersItemTouchHelperCallback

use of net.osmand.plus.mapmarkers.adapters.MapMarkersItemTouchHelperCallback in project Osmand by osmandapp.

the class PlanRouteFragment method onCreateView.

@Nullable
@Override
public View onCreateView(LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {
    final MapActivity mapActivity = getMapActivity();
    markersHelper = mapActivity.getMyApplication().getMapMarkersHelper();
    planRouteContext = markersHelper.getPlanRouteContext();
    planRouteContext.setListener(new MarkersPlanRouteContext.PlanRouteProgressListener() {

        @Override
        public void showProgressBar() {
            PlanRouteFragment.this.showProgressBar();
        }

        @Override
        public void updateProgress(int progress) {
            ((ProgressBar) mainView.findViewById(R.id.snap_to_road_progress_bar)).setProgress(progress);
        }

        @Override
        public void hideProgressBar(boolean canceled) {
            mainView.findViewById(R.id.snap_to_road_progress_bar).setVisibility(View.GONE);
            planRouteContext.setProgressBarVisible(false);
            if (!canceled && portrait && planRouteContext.isMarkersListOpened()) {
                Snackbar.make(mainView, getString(R.string.route_is_calculated) + ":", Snackbar.LENGTH_LONG).setAction(R.string.show_map, new View.OnClickListener() {

                    @Override
                    public void onClick(View view) {
                        showHideMarkersList();
                    }
                }).show();
            }
        }

        @Override
        public void refresh() {
            adapter.notifyDataSetChanged();
            mapActivity.refreshMap();
        }

        @Override
        public void updateText() {
            PlanRouteFragment.this.updateText();
        }

        @Override
        public void showMarkersRouteOnMap(boolean adjustMap) {
            PlanRouteFragment.this.showMarkersRouteOnMap(adjustMap);
        }
    });
    // Handling screen rotation
    FragmentManager fragmentManager = mapActivity.getSupportFragmentManager();
    Fragment snapToRoadFragment = fragmentManager.findFragmentByTag(SnapToRoadBottomSheetDialogFragment.TAG);
    if (snapToRoadFragment != null) {
        ((SnapToRoadBottomSheetDialogFragment) snapToRoadFragment).setListener(createSnapToRoadFragmentListener());
    }
    Fragment optionsFragment = fragmentManager.findFragmentByTag(PlanRouteOptionsBottomSheetDialogFragment.TAG);
    if (optionsFragment != null) {
        ((PlanRouteOptionsBottomSheetDialogFragment) optionsFragment).setListener(createOptionsFragmentListener());
    }
    toolbarHeight = mapActivity.getResources().getDimensionPixelSize(R.dimen.dashboard_map_toolbar);
    nightMode = mapActivity.getMyApplication().getDaynightHelper().isNightModeForMapControls();
    final int themeRes = nightMode ? R.style.OsmandDarkTheme : R.style.OsmandLightTheme;
    final int backgroundColor = ContextCompat.getColor(mapActivity, nightMode ? R.color.ctx_menu_info_view_bg_dark : R.color.ctx_menu_info_view_bg_light);
    portrait = AndroidUiHelper.isOrientationPortrait(mapActivity);
    fullScreen = portrait && planRouteContext.isMarkersListOpened();
    int layoutRes = fullScreen ? R.layout.fragment_plan_route_full_screen : R.layout.fragment_plan_route_half_screen;
    View view = View.inflate(new ContextThemeWrapper(getContext(), themeRes), layoutRes, null);
    mainView = fullScreen ? view : view.findViewById(R.id.main_view);
    enterPlanRouteMode();
    View markersListContainer = mainView.findViewById(R.id.markers_list_container);
    if (markersListContainer != null) {
        markersListContainer.setBackgroundColor(backgroundColor);
    }
    if (portrait) {
        mainView.findViewById(R.id.toolbar_divider).setBackgroundColor(ContextCompat.getColor(mapActivity, nightMode ? R.color.actionbar_dark_color : R.color.dashboard_divider_light));
        Drawable arrow = getContentIcon(fullScreen ? R.drawable.ic_action_arrow_down : R.drawable.ic_action_arrow_up);
        ((ImageView) mainView.findViewById(R.id.up_down_icon)).setImageDrawable(arrow);
        mainView.findViewById(R.id.up_down_row).setOnClickListener(new View.OnClickListener() {

            @Override
            public void onClick(View view) {
                showHideMarkersList();
            }
        });
        mainView.findViewById(R.id.select_all_button).setOnClickListener(new View.OnClickListener() {

            @Override
            public void onClick(View view) {
                selectAllOnClick();
                updateSelectButton();
            }
        });
        toolbarController = new PlanRouteToolbarController();
        toolbarController.setBackBtnIconIds(R.drawable.ic_action_mode_back, R.drawable.ic_action_mode_back);
        toolbarController.setTitle(getString(R.string.plan_route));
        toolbarController.setOnBackButtonClickListener(new View.OnClickListener() {

            @Override
            public void onClick(View view) {
                if (quit(false)) {
                    MapMarkersDialogFragment.showInstance(mapActivity);
                }
            }
        });
        toolbarController.setSaveViewTextId(R.string.shared_string_options);
        toolbarController.setOnSaveViewClickListener(new View.OnClickListener() {

            @Override
            public void onClick(View view) {
                optionsOnClick();
            }
        });
        mapActivity.showTopToolbar(toolbarController);
        if (fullScreen) {
            mapActivity.findViewById(R.id.bottom_controls_container).setVisibility(View.GONE);
            mainView.findViewById(R.id.plan_route_toolbar).setVisibility(View.VISIBLE);
            mainView.findViewById(R.id.toolbar_divider).setVisibility(View.VISIBLE);
        } else {
            final int screenH = AndroidUtils.getScreenHeight(mapActivity);
            final int statusBarH = AndroidUtils.getStatusBarHeight(mapActivity);
            final int navBarH = AndroidUtils.getNavBarHeight(mapActivity);
            final int availableHeight = (screenH - statusBarH - navBarH) / 2;
            mainView.getViewTreeObserver().addOnGlobalLayoutListener(new ViewTreeObserver.OnGlobalLayoutListener() {

                @Override
                public void onGlobalLayout() {
                    int upDownRowH = mainView.findViewById(R.id.up_down_row).getHeight();
                    closedListContainerHeight = availableHeight - upDownRowH;
                    View listContainer = mainView.findViewById(R.id.markers_list_container);
                    listContainer.getLayoutParams().height = closedListContainerHeight;
                    listContainer.requestLayout();
                    ViewTreeObserver obs = mainView.getViewTreeObserver();
                    if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.JELLY_BEAN) {
                        obs.removeOnGlobalLayoutListener(this);
                    } else {
                        obs.removeGlobalOnLayoutListener(this);
                    }
                }
            });
        }
    }
    Toolbar toolbar = (Toolbar) mainView.findViewById(R.id.plan_route_toolbar);
    toolbar.setNavigationIcon(getContentIcon(R.drawable.ic_arrow_back));
    toolbar.setNavigationOnClickListener(new View.OnClickListener() {

        @Override
        public void onClick(View view) {
            if (quit(false)) {
                MapMarkersDialogFragment.showInstance(mapActivity);
            }
        }
    });
    mainView.findViewById(R.id.options_button).setOnClickListener(new View.OnClickListener() {

        @Override
        public void onClick(View view) {
            optionsOnClick();
        }
    });
    markersRv = mainView.findViewById(R.id.markers_recycler_view);
    adapter = new MapMarkersListAdapter(mapActivity);
    adapter.setHasStableIds(true);
    adapter.setSnappedToRoadPoints(planRouteContext.getSnappedToRoadPoints());
    final ItemTouchHelper touchHelper = new ItemTouchHelper(new MapMarkersItemTouchHelperCallback(adapter));
    touchHelper.attachToRecyclerView(markersRv);
    adapter.setAdapterListener(new MapMarkersListAdapter.MapMarkersListAdapterListener() {

        private int fromPosition;

        private int toPosition;

        @Override
        public void onDisableRoundTripClick() {
            roundTripOnClick();
        }

        @Override
        public void onCheckBoxClick(View view) {
            int pos = markersRv.getChildAdapterPosition(view);
            if (pos == RecyclerView.NO_POSITION) {
                return;
            }
            Object item = adapter.getItem(pos);
            if (item instanceof Location) {
                markersHelper.setStartFromMyLocation(!mapActivity.getMyApplication().getSettings().ROUTE_MAP_MARKERS_START_MY_LOC.get());
            } else if (item instanceof MapMarker) {
                MapMarker marker = (MapMarker) item;
                selectedCount = marker.selected ? selectedCount - 1 : selectedCount + 1;
                marker.selected = !marker.selected;
                markersHelper.updateMapMarker(marker, false);
            }
            adapter.reloadData();
            adapter.notifyDataSetChanged();
            updateSelectButton();
            planRouteContext.recreateSnapTrkSegment(false);
        }

        @Override
        public void onItemClick(View v) {
            int pos = markersRv.getChildAdapterPosition(v);
            if (pos == RecyclerView.NO_POSITION) {
                return;
            }
            Object item = adapter.getItem(pos);
            if (item instanceof Location) {
                Location loc = (Location) item;
                moveMapToPosition(loc.getLatitude(), loc.getLongitude());
            } else if (item instanceof MapMarker) {
                MapMarker marker = (MapMarker) item;
                moveMapToPosition(marker.getLatitude(), marker.getLongitude());
            }
        }

        @Override
        public void onDragStarted(RecyclerView.ViewHolder holder) {
            fromPosition = holder.getAdapterPosition();
            touchHelper.startDrag(holder);
        }

        @Override
        public void onDragEnded(RecyclerView.ViewHolder holder) {
            toPosition = holder.getAdapterPosition();
            if (toPosition >= 0 && fromPosition >= 0) {
                mapActivity.getMyApplication().getMapMarkersHelper().reorderActiveMarkersIfNeeded();
                mapActivity.refreshMap();
                adapter.reloadData();
                try {
                    adapter.notifyDataSetChanged();
                } catch (Exception e) {
                // to avoid crash because of:
                // java.lang.IllegalStateException: Cannot call this method while RecyclerView is computing a layout or scrolling
                }
                planRouteContext.recreateSnapTrkSegment(false);
            }
        }
    });
    markersRv.setPadding(0, (int) mapActivity.getResources().getDimension(R.dimen.map_markers_recycler_view_padding_top), 0, (int) mapActivity.getResources().getDimension(R.dimen.map_markers_recycler_view_padding_bottom));
    markersRv.setClipToPadding(false);
    markersRv.setLayoutManager(new LinearLayoutManager(getContext()));
    markersRv.setAdapter(adapter);
    if (planRouteContext.isProgressBarVisible()) {
        showProgressBar();
    }
    return view;
}
Also used : MapMarker(net.osmand.plus.MapMarkersHelper.MapMarker) LinearLayoutManager(android.support.v7.widget.LinearLayoutManager) Fragment(android.support.v4.app.Fragment) SnapToRoadBottomSheetDialogFragment(net.osmand.plus.measurementtool.SnapToRoadBottomSheetDialogFragment) BaseOsmAndFragment(net.osmand.plus.base.BaseOsmAndFragment) ItemTouchHelper(android.support.v7.widget.helper.ItemTouchHelper) MapMarkersItemTouchHelperCallback(net.osmand.plus.mapmarkers.adapters.MapMarkersItemTouchHelperCallback) ImageView(android.widget.ImageView) ViewTreeObserver(android.view.ViewTreeObserver) MapActivity(net.osmand.plus.activities.MapActivity) SnapToRoadBottomSheetDialogFragment(net.osmand.plus.measurementtool.SnapToRoadBottomSheetDialogFragment) Toolbar(android.support.v7.widget.Toolbar) Drawable(android.graphics.drawable.Drawable) MapMarkersListAdapter(net.osmand.plus.mapmarkers.adapters.MapMarkersListAdapter) ImageView(android.widget.ImageView) View(android.view.View) TextView(android.widget.TextView) OsmandMapTileView(net.osmand.plus.views.OsmandMapTileView) RecyclerView(android.support.v7.widget.RecyclerView) TargetPoint(net.osmand.plus.TargetPointsHelper.TargetPoint) FragmentManager(android.support.v4.app.FragmentManager) ContextThemeWrapper(android.view.ContextThemeWrapper) RecyclerView(android.support.v7.widget.RecyclerView) Location(net.osmand.Location) Nullable(android.support.annotation.Nullable)

Aggregations

Nullable (android.support.annotation.Nullable)2 LinearLayoutManager (android.support.v7.widget.LinearLayoutManager)2 RecyclerView (android.support.v7.widget.RecyclerView)2 ItemTouchHelper (android.support.v7.widget.helper.ItemTouchHelper)2 View (android.view.View)2 ImageView (android.widget.ImageView)2 MapMarker (net.osmand.plus.MapMarkersHelper.MapMarker)2 MapActivity (net.osmand.plus.activities.MapActivity)2 MapMarkersItemTouchHelperCallback (net.osmand.plus.mapmarkers.adapters.MapMarkersItemTouchHelperCallback)2 Drawable (android.graphics.drawable.Drawable)1 Fragment (android.support.v4.app.Fragment)1 FragmentManager (android.support.v4.app.FragmentManager)1 Toolbar (android.support.v7.widget.Toolbar)1 ContextThemeWrapper (android.view.ContextThemeWrapper)1 ViewTreeObserver (android.view.ViewTreeObserver)1 TextView (android.widget.TextView)1 Location (net.osmand.Location)1 Amenity (net.osmand.data.Amenity)1 FavouritePoint (net.osmand.data.FavouritePoint)1 LatLon (net.osmand.data.LatLon)1