Implement map marker click actions

This commit is contained in:
neslihanturan 2019-09-06 17:05:03 +03:00
parent 7a06073185
commit 32db7b3239
6 changed files with 232 additions and 32 deletions

View file

@ -14,7 +14,10 @@ import android.view.View;
import android.view.ViewGroup;
import android.view.animation.Animation;
import android.view.animation.AnimationUtils;
import android.widget.ImageView;
import android.widget.LinearLayout;
import android.widget.ProgressBar;
import android.widget.TextView;
import androidx.annotation.NonNull;
import androidx.annotation.Nullable;
@ -25,6 +28,7 @@ import com.google.android.material.bottomsheet.BottomSheetBehavior;
import com.google.android.material.floatingactionbutton.FloatingActionButton;
import com.google.android.material.snackbar.Snackbar;
import com.mapbox.mapboxsdk.Mapbox;
import com.mapbox.mapboxsdk.annotations.Marker;
import com.mapbox.mapboxsdk.camera.CameraPosition;
import com.mapbox.mapboxsdk.camera.CameraUpdateFactory;
import com.mapbox.mapboxsdk.geometry.LatLng;
@ -40,6 +44,9 @@ import butterknife.BindView;
import butterknife.ButterKnife;
import fr.free.nrw.commons.CommonsApplication;
import fr.free.nrw.commons.R;
import fr.free.nrw.commons.Utils;
import fr.free.nrw.commons.bookmarks.locations.BookmarkLocationsDao;
import fr.free.nrw.commons.contributions.ContributionController;
import fr.free.nrw.commons.contributions.MainActivity;
import fr.free.nrw.commons.di.CommonsDaggerSupportFragment;
import fr.free.nrw.commons.kvstore.JsonKvStore;
@ -83,6 +90,36 @@ public class NearbyTestLayersFragment extends CommonsDaggerSupportFragment imple
@BindView(R.id.bottom_sheet_details)
View bottomSheetDetails;
@BindView(R.id.bookmarkButtonImage)
ImageView bookmarkButtonImage;
@BindView(R.id.bookmarkButton)
LinearLayout bookmarkButton;
@BindView(R.id.wikipediaButton)
LinearLayout wikipediaButton;
@BindView(R.id.wikidataButton)
LinearLayout wikidataButton;
@BindView(R.id.directionsButton)
LinearLayout directionsButton;
@BindView(R.id.commonsButton)
LinearLayout commonsButton;
@BindView(R.id.description)
TextView description;
@BindView(R.id.title)
TextView title;
@BindView(R.id.category)
TextView distance;
@BindView(R.id.icon)
ImageView icon;
@Inject
LocationServiceManager locationManager;
@ -93,6 +130,12 @@ public class NearbyTestLayersFragment extends CommonsDaggerSupportFragment imple
@Named("default_preferences")
JsonKvStore applicationKvStore;
@Inject
BookmarkLocationsDao bookmarkLocationDao;
@Inject
ContributionController controller;
private BottomSheetBehavior bottomSheetListBehavior;
private BottomSheetBehavior bottomSheetDetailsBehavior;
@ -115,6 +158,8 @@ public class NearbyTestLayersFragment extends CommonsDaggerSupportFragment imple
boolean isDarkTheme;
boolean isFabOpen;
boolean isBottomListSheetExpanded;
private Marker selectedMarker;
private Place selectedPlace;
private final double CAMERA_TARGET_SHIFT_FACTOR_PORTRAIT = 0.06;
private final double CAMERA_TARGET_SHIFT_FACTOR_LANDSCAPE = 0.04;
@ -321,7 +366,7 @@ public class NearbyTestLayersFragment extends CommonsDaggerSupportFragment imple
* @param nearbyPlacesInfo This variable has place list information and distances.
*/
private void updateMapMarkers(NearbyController.NearbyPlacesInfo nearbyPlacesInfo) {
nearbyParentFragmentPresenter.updateMapMarkers(nearbyPlacesInfo);
nearbyParentFragmentPresenter.updateMapMarkers(nearbyPlacesInfo, selectedMarker);
}
@Override
@ -362,7 +407,6 @@ public class NearbyTestLayersFragment extends CommonsDaggerSupportFragment imple
/**
* Starts animation of fab plus (turning on opening) and other FABs
* @param isFabOpen state of FAB buttons, open when clicked on fab button, closed on other click
*/
@Override
public void animateFABs() {
@ -442,4 +486,86 @@ public class NearbyTestLayersFragment extends CommonsDaggerSupportFragment imple
mapFragment.getMapboxMap().animateCamera(CameraUpdateFactory.newCameraPosition(position), 1000);
}
@Override
public void initViewPositions() {
}
@Override
public void hideBottomSheet() {
bottomSheetListBehavior.setState(BottomSheetBehavior.STATE_HIDDEN);
}
@Override
public void displayBottomSheetWithInfo(Marker marker) {
this.selectedMarker = marker;
NearbyMarker nearbyMarker = (NearbyMarker) marker;
Place place = nearbyMarker.getNearbyBaseMarker().getPlace();
passInfoToSheet(place);
bottomSheetListBehavior.setState(BottomSheetBehavior.STATE_HIDDEN);
bottomSheetDetailsBehavior.setState(BottomSheetBehavior.STATE_COLLAPSED);
}
/**
* Same bottom sheet carries information for all nearby places, so we need to pass information
* (title, description, distance and links) to view on nearby marker click
* @param place Place of clicked nearby marker
*/
private void passInfoToSheet(Place place) {
this.selectedPlace = place;
updateBookmarkButtonImage(this.selectedPlace);
bookmarkButton.setOnClickListener(view -> {
boolean isBookmarked = bookmarkLocationDao.updateBookmarkLocation(this.selectedPlace);
updateBookmarkButtonImage(this.selectedPlace);
mapFragment.updateMarker(isBookmarked, this.selectedPlace, locationManager.getLastLocation());
});
//TODO move all this buttons into a custom bottom sheet
wikipediaButton.setVisibility(place.hasWikipediaLink()?View.VISIBLE:View.GONE);
wikipediaButton.setOnClickListener(view -> Utils.handleWebUrl(getContext(), this.selectedPlace.siteLinks.getWikipediaLink()));
wikidataButton.setVisibility(place.hasWikidataLink()?View.VISIBLE:View.GONE);
wikidataButton.setOnClickListener(view -> Utils.handleWebUrl(getContext(), this.selectedPlace.siteLinks.getWikidataLink()));
directionsButton.setOnClickListener(view -> Utils.handleGeoCoordinates(getActivity(), this.selectedPlace.getLocation()));
commonsButton.setVisibility(this.selectedPlace.hasCommonsLink()?View.VISIBLE:View.GONE);
commonsButton.setOnClickListener(view -> Utils.handleWebUrl(getContext(), this.selectedPlace.siteLinks.getCommonsLink()));
icon.setImageResource(this.selectedPlace.getLabel().getIcon());
title.setText(this.selectedPlace.name);
distance.setText(this.selectedPlace.distance);
description.setText(this.selectedPlace.getLongDescription());
fabCamera.setOnClickListener(view -> {
if (fabCamera.isShown()) {
Timber.d("Camera button tapped. Place: %s", this.selectedPlace.toString());
// TODO storeSharedPrefs();
controller.initiateCameraPick(getActivity());
}
});
fabGallery.setOnClickListener(view -> {
if (fabGallery.isShown()) {
Timber.d("Gallery button tapped. Place: %s", this.selectedPlace.toString());
//TODO storeSharedPrefs();
controller.initiateGalleryPick(getActivity(), false);
}
});
}
private void updateBookmarkButtonImage(Place place) {
int bookmarkIcon;
if (bookmarkLocationDao.findBookmarkLocation(place)) {
bookmarkIcon = R.drawable.ic_round_star_filled_24px;
} else {
bookmarkIcon = R.drawable.ic_round_star_border_24px;
}
if (bookmarkButtonImage != null) {
bookmarkButtonImage.setImageResource(bookmarkIcon);
}
}
}

View file

@ -1,6 +1,7 @@
package fr.free.nrw.commons.nearby;
import android.content.Context;
import android.graphics.Bitmap;
import android.graphics.Color;
import android.net.Uri;
import android.os.Bundle;
@ -12,7 +13,9 @@ import android.view.ViewGroup;
import androidx.annotation.NonNull;
import androidx.annotation.Nullable;
import androidx.vectordrawable.graphics.drawable.VectorDrawableCompat;
import com.google.android.material.bottomsheet.BottomSheetBehavior;
import com.google.android.material.floatingactionbutton.FloatingActionButton;
import com.mapbox.mapboxsdk.annotations.Icon;
import com.mapbox.mapboxsdk.annotations.IconFactory;
@ -39,9 +42,13 @@ import fr.free.nrw.commons.di.CommonsDaggerSupportFragment;
import fr.free.nrw.commons.location.LatLng;
import fr.free.nrw.commons.nearby.mvp.contract.NearbyMapContract;
import fr.free.nrw.commons.nearby.mvp.contract.NearbyParentFragmentContract;
import fr.free.nrw.commons.nearby.mvp.presenter.NearbyParentFragmentPresenter;
import fr.free.nrw.commons.utils.LocationUtils;
import fr.free.nrw.commons.utils.UiUtils;
import timber.log.Timber;
import static fr.free.nrw.commons.utils.LengthUtils.formatDistanceBetween;
/**
* Support Fragment wrapper around a map view.
* <p>
@ -265,7 +272,9 @@ public class SupportMapFragment extends CommonsDaggerSupportFragment
}
@Override
public void updateMapMarkers(LatLng latLng, List<Place> placeList) {
public void updateMapMarkers(LatLng latLng, List<Place> placeList
, Marker selectedMarker
, NearbyParentFragmentPresenter nearbyParentFragmentPresenter) {
Log.d("denemeTest","updateMapMarkers, curLatng:"+latLng);
List<NearbyBaseMarker> customBaseMarkerOptions = NearbyController
.loadAttractionsFromLocationToBaseMarkerOptions(latLng, // Curlatlang will be used to calculate distances
@ -281,7 +290,7 @@ public class SupportMapFragment extends CommonsDaggerSupportFragment
.newCameraPosition(cameraPosition), 1000);*/
// TODO: set position depening to botom sheet position heere
// We are trying to find nearby places around our custom searched area, thus custom parameter is nonnull
addNearbyMarkersToMapBoxMap(customBaseMarkerOptions);
addNearbyMarkersToMapBoxMap(customBaseMarkerOptions, selectedMarker, nearbyParentFragmentPresenter);
// Re-enable mapbox gestures on custom location markers load
mapboxMap.getUiSettings().setAllGesturesEnabled(true);
updateMapToTrackPosition(latLng);
@ -373,7 +382,9 @@ public class SupportMapFragment extends CommonsDaggerSupportFragment
}
@Override
public void addNearbyMarkersToMapBoxMap(@Nullable List<NearbyBaseMarker> baseMarkerList) {
public void addNearbyMarkersToMapBoxMap(@Nullable List<NearbyBaseMarker> baseMarkerList
, Marker selectedMarker
, NearbyParentFragmentPresenter nearbyParentFragmentPresenter) {
Log.d("denemeTest","add markers to map");
mapboxMap.addMarkers(baseMarkerList);
mapboxMap.setOnInfoWindowCloseListener(marker -> {
@ -384,27 +395,7 @@ public class SupportMapFragment extends CommonsDaggerSupportFragment
map.getMapAsync(mapboxMap -> {
mapboxMap.addMarkers(baseMarkerList);
//fabRecenter.setVisibility(View.VISIBLE);
mapboxMap.setOnInfoWindowCloseListener(marker -> {
/*if (marker == selected) {
bottomSheetDetailsBehavior.setState(BottomSheetBehavior.STATE_HIDDEN);
}*/
});
mapboxMap.setOnMarkerClickListener(marker -> {
if (marker instanceof NearbyMarker) {
//this.selected = marker;
NearbyMarker nearbyMarker = (NearbyMarker) marker;
Place place = nearbyMarker.getNearbyBaseMarker().getPlace();
passInfoToSheet(place);
//bottomSheetListBehavior.setState(BottomSheetBehavior.STATE_HIDDEN);
//bottomSheetDetailsBehavior.setState(BottomSheetBehavior.STATE_COLLAPSED);
}
return false;
});
setMapMarkerActions(selectedMarker, nearbyParentFragmentPresenter);
});
}
@ -492,5 +483,55 @@ public class SupportMapFragment extends CommonsDaggerSupportFragment
public void showPlaces() {
}
void setMapMarkerActions(Marker selected, NearbyParentFragmentPresenter nearbyParentFragmentPresenter) {
getMapboxMap().setOnInfoWindowCloseListener(marker -> {
if (marker == selected) {
nearbyParentFragmentPresenter.markerUnselected();
}
});
getMapboxMap().setOnMarkerClickListener(marker -> {
if (marker instanceof NearbyMarker) {
nearbyParentFragmentPresenter.markerSelected(marker);
}
return false;
});
}
public void updateMarker(boolean isBookmarked, Place place, LatLng curLatLng) {
VectorDrawableCompat vectorDrawable;
if (isBookmarked) {
vectorDrawable = VectorDrawableCompat.create(
getContext().getResources(), R.drawable.ic_custom_bookmark_marker, getContext().getTheme()
);
} else {
vectorDrawable = VectorDrawableCompat.create(
getContext().getResources(), R.drawable.ic_custom_map_marker, getContext().getTheme()
);
}
for (Marker marker : mapboxMap.getMarkers()) {
if (marker.getTitle() != null && marker.getTitle().equals(place.getName())) {
Bitmap icon = UiUtils.getBitmap(vectorDrawable);
String distance = formatDistanceBetween(curLatLng, place.location);
place.setDistance(distance);
NearbyBaseMarker nearbyBaseMarker = new NearbyBaseMarker();
nearbyBaseMarker.title(place.name);
nearbyBaseMarker.position(
new com.mapbox.mapboxsdk.geometry.LatLng(
place.location.getLatitude(),
place.location.getLongitude()));
nearbyBaseMarker.place(place);
nearbyBaseMarker.icon(IconFactory.getInstance(getContext())
.fromBitmap(icon));
marker.setIcon(IconFactory.getInstance(getContext()).fromBitmap(icon));
}
}
}
}

View file

@ -6,6 +6,7 @@ import android.view.View;
import com.google.android.material.floatingactionbutton.FloatingActionButton;
import com.mapbox.mapboxsdk.annotations.BaseMarkerOptions;
import com.mapbox.mapboxsdk.annotations.Marker;
import com.mapbox.mapboxsdk.maps.MapView;
import com.mapbox.mapboxsdk.maps.MapboxMap;
@ -14,6 +15,7 @@ import java.util.List;
import fr.free.nrw.commons.location.LatLng;
import fr.free.nrw.commons.nearby.NearbyBaseMarker;
import fr.free.nrw.commons.nearby.Place;
import fr.free.nrw.commons.nearby.mvp.presenter.NearbyParentFragmentPresenter;
/**
* This interface defines specific View and UserActions for map
@ -27,14 +29,14 @@ public interface NearbyMapContract {
void showSearchThisAreaButton();
void showInformationBottomSheet();
void initViews();
void updateMapMarkers(LatLng latLng, List<Place> placeList);
void updateMapMarkers(LatLng latLng, List<Place> placeList, Marker selectedMarker, NearbyParentFragmentPresenter nearbyParentFragmentPresenter);
void updateMapToTrackPosition(LatLng curLatLng);
void setListeners();
MapView setupMapView(Bundle savedInstanceState);
void addCurrentLocationMarker(LatLng curLatLng);
void setSearchThisAreaButtonVisibility(boolean visible);
boolean isCurrentLocationMarkerVisible();
void addNearbyMarkersToMapBoxMap(List<NearbyBaseMarker> baseMarkerOptions);
void addNearbyMarkersToMapBoxMap(List<NearbyBaseMarker> baseMarkerOptions, Marker marker, NearbyParentFragmentPresenter nearbyParentFragmentPresenter);
void prepareViewsForSheetPosition();
void hideFABs();
void showFABs();

View file

@ -2,6 +2,7 @@ package fr.free.nrw.commons.nearby.mvp.contract;
import android.view.View;
import com.mapbox.mapboxsdk.annotations.Marker;
import com.mapbox.mapboxsdk.maps.MapboxMap;
import fr.free.nrw.commons.kvstore.JsonKvStore;
@ -29,6 +30,9 @@ public interface NearbyParentFragmentContract {
void setFABRecenterAction(android.view.View.OnClickListener onClickListener);
void animateFABs();
void recenterMap(LatLng curLatLng);
void initViewPositions();
void hideBottomSheet();
void displayBottomSheetWithInfo(Marker marker);
}
interface UserActions {

View file

@ -22,6 +22,7 @@ import com.google.android.material.bottomsheet.BottomSheetBehavior;
import com.google.android.material.snackbar.Snackbar;
import com.google.gson.Gson;
import com.mapbox.mapboxsdk.Mapbox;
import com.mapbox.mapboxsdk.annotations.Marker;
import com.mapbox.mapboxsdk.camera.CameraPosition;
import com.mapbox.mapboxsdk.maps.MapboxMap;
import com.mapbox.mapboxsdk.maps.MapboxMapOptions;
@ -233,7 +234,7 @@ public class NearbyParentFragment extends CommonsDaggerSupportFragment
* @param nearbyPlacesInfo This variable has place list information and distances.
*/
private void updateMapMarkers(NearbyController.NearbyPlacesInfo nearbyPlacesInfo) {
nearbyParentFragmentPresenter.updateMapMarkers(nearbyPlacesInfo);
nearbyParentFragmentPresenter.updateMapMarkers(nearbyPlacesInfo, null);
}
/**
@ -349,6 +350,21 @@ public class NearbyParentFragment extends CommonsDaggerSupportFragment
}
@Override
public void initViewPositions() {
}
@Override
public void hideBottomSheet() {
}
@Override
public void displayBottomSheetWithInfo(Marker marker) {
}
@Override
public boolean isNetworkConnectionEstablished() {
return NetworkUtils.isInternetConnectionEstablished(getActivity());

View file

@ -3,6 +3,7 @@ package fr.free.nrw.commons.nearby.mvp.presenter;
import android.util.Log;
import android.view.View;
import com.mapbox.mapboxsdk.annotations.Marker;
import com.mapbox.mapboxsdk.maps.MapboxMap;
import fr.free.nrw.commons.kvstore.JsonKvStore;
@ -142,10 +143,10 @@ public class NearbyParentFragmentPresenter
public void initializeMapOperations() {
Log.d("denemeTest","initializeMapOperations");
nearbyParentFragmentView.initViewPositions();
lockNearby(false);
nearbyParentFragmentView.addNetworkBroadcastReceiver();
//TODO: NETWORK RECEIVER IS NOT ASSIGNED
Timber.d("Nearby map view is created and ready");
updateMapAndList(LOCATION_SIGNIFICANTLY_CHANGED, null);
@ -171,6 +172,16 @@ public class NearbyParentFragmentPresenter
nearbyParentFragmentView.setFABRecenterAction(v -> {
nearbyParentFragmentView.recenterMap(curLatLng);
});
}
public void markerUnselected() {
nearbyParentFragmentView.hideBottomSheet();
}
public void markerSelected(Marker marker) {
nearbyParentFragmentView.displayBottomSheetWithInfo(marker);
}
@ -269,8 +280,8 @@ public class NearbyParentFragmentPresenter
* location where you are not at.
* @param nearbyPlacesInfo This variable has place list information and distances.
*/
public void updateMapMarkers(NearbyController.NearbyPlacesInfo nearbyPlacesInfo) {
nearbyMapFragmentView.updateMapMarkers(nearbyPlacesInfo.curLatLng, nearbyPlacesInfo.placeList);
public void updateMapMarkers(NearbyController.NearbyPlacesInfo nearbyPlacesInfo, Marker selectedMarker) {
nearbyMapFragmentView.updateMapMarkers(nearbyPlacesInfo.curLatLng, nearbyPlacesInfo.placeList, selectedMarker, this);
nearbyMapFragmentView.updateMapToTrackPosition(nearbyPlacesInfo.curLatLng);
}