package com.rthoni.stssaguenay.ui.fragments; import android.Manifest; import android.app.ProgressDialog; import android.content.Context; import android.content.pm.PackageManager; import android.os.Bundle; import android.support.annotation.NonNull; import android.support.annotation.Nullable; import android.support.v4.app.ActivityCompat; import android.support.v4.app.Fragment; import android.view.LayoutInflater; import android.view.View; import android.view.ViewGroup; import android.widget.Toast; import com.google.android.gms.maps.CameraUpdateFactory; import com.google.android.gms.maps.GoogleMap; import com.google.android.gms.maps.MapView; import com.google.android.gms.maps.OnMapReadyCallback; import com.google.android.gms.maps.model.LatLng; import com.google.android.gms.maps.model.Marker; import com.google.android.gms.maps.model.MarkerOptions; import com.google.maps.android.clustering.ClusterItem; import com.google.maps.android.clustering.ClusterManager; import com.google.maps.android.clustering.view.DefaultClusterRenderer; import com.luticate.utils.business.LuConsumer; import com.luticate.utils.business.LuPromise; import com.luticate.utils.dbo.LuPromiseError; import com.rthoni.stssaguenay.R; import com.rthoni.stssaguenay.business.STSBusiness; import com.rthoni.stssaguenay.business.StopsBusiness; import com.rthoni.stssaguenay.dbo.StopsDbo; import com.rthoni.stssaguenay.ui.activities.StopPickerActivity; import com.rthoni.stssaguenay.ui.interfaces.OnStopClicked; import java.util.HashMap; import java.util.List; import butterknife.BindView; import butterknife.ButterKnife; /** * Created by robin on 9/29/16. */ public class StopMapPickerFragment extends Fragment { public static class StopDboMapItem implements ClusterItem { private LatLng _latLng; private StopsDbo _stopsDbo; StopDboMapItem(StopsDbo stopsDbo) { _stopsDbo = stopsDbo; _latLng = new LatLng(_stopsDbo.getPosY(), _stopsDbo.getPosX()); } @Override public LatLng getPosition() { return _latLng; } public StopsDbo getStopsDbo() { return _stopsDbo; } } public static class StopDboMapRenderer extends DefaultClusterRenderer { private HashMap _items = new HashMap<>(); public StopDboMapRenderer(Context context, GoogleMap map, ClusterManager clusterManager) { super(context, map, clusterManager); } @Override protected void onBeforeClusterItemRendered(StopDboMapItem item, MarkerOptions markerOptions) { markerOptions.title(item.getStopsDbo().getFullName()); super.onBeforeClusterItemRendered(item, markerOptions); } @Override protected void onClusterItemRendered(StopDboMapItem clusterItem, Marker marker) { _items.put(marker.getId(), clusterItem); marker.setTag(clusterItem); super.onClusterItemRendered(clusterItem, marker); } public StopDboMapItem getStopItem(String id) { return _items.get(id); } } @BindView(R.id.mapView) MapView _mapView; private OnStopClicked _onStopSelectedConsumer; private GoogleMap _map; private List _stopsDbos; private StopDboMapRenderer _renderer; @Override public void onStart() { _mapView.onStart(); super.onStart(); } @Override public void onResume() { _mapView.onResume(); super.onResume(); } @Override public void onPause() { _mapView.onPause(); super.onPause(); } @Override public void onStop() { _mapView.onStop(); super.onStop(); } @Override public void onDestroy() { _mapView.onDestroy(); super.onDestroy(); } @Override public void onSaveInstanceState(Bundle outState) { _mapView.onSaveInstanceState(outState); super.onSaveInstanceState(outState); } @Override public void onLowMemory() { _mapView.onLowMemory(); super.onLowMemory(); } @Nullable @Override public View onCreateView(LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) { View v = inflater.inflate(R.layout.fragment_stop_picker_map, container, false); ButterKnife.bind(this, v); _mapView.onCreate(savedInstanceState); _mapView.getMapAsync(new OnMapReadyCallback() { @Override public void onMapReady(GoogleMap googleMap) { _map = googleMap; setupMap(); } }); loadStops(); return v; } @Override public void onAttach(Context context) { super.onAttach(context); if (context instanceof OnStopClicked) { _onStopSelectedConsumer = (OnStopClicked) context; } } @Override public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) { if (ActivityCompat.checkSelfPermission(getContext(), Manifest.permission.ACCESS_FINE_LOCATION) == PackageManager.PERMISSION_GRANTED || ActivityCompat.checkSelfPermission(getContext(), Manifest.permission.ACCESS_COARSE_LOCATION) == PackageManager.PERMISSION_GRANTED) { _map.setMyLocationEnabled(true); } super.onRequestPermissionsResult(requestCode, permissions, grantResults); } public void setupMap() { _map.getUiSettings().setMyLocationButtonEnabled(true); _map.getUiSettings().setCompassEnabled(true); _map.moveCamera(CameraUpdateFactory.newLatLngZoom(new LatLng(48.3786565, -71.3354953), 9)); _map.setOnMarkerClickListener(new GoogleMap.OnMarkerClickListener() { @Override public boolean onMarkerClick(Marker marker) { if (marker.getTag() instanceof StopDboMapItem) { Toast.makeText(getContext(), R.string.stop_add_map_help, Toast.LENGTH_LONG).show(); } return false; } }); _map.setOnInfoWindowClickListener(new GoogleMap.OnInfoWindowClickListener() { @Override public void onInfoWindowClick(Marker marker) { onStopSelected(_renderer.getStopItem(marker.getId()).getStopsDbo()); } }); if (ActivityCompat.checkSelfPermission(getContext(), Manifest.permission.ACCESS_FINE_LOCATION) == PackageManager.PERMISSION_GRANTED || ActivityCompat.checkSelfPermission(getContext(), Manifest.permission.ACCESS_COARSE_LOCATION) == PackageManager.PERMISSION_GRANTED) { _map.setMyLocationEnabled(true); } else { requestPermissions(new String[]{Manifest.permission.ACCESS_FINE_LOCATION, Manifest.permission.ACCESS_COARSE_LOCATION}, 0); } if (_stopsDbos != null) { addStops(); } } public void loadStops() { final ProgressDialog progressDialog = new ProgressDialog(getContext()); progressDialog.setIndeterminate(true); progressDialog.setCancelable(false); progressDialog.show(); progressDialog.setTitle(R.string.loading); progressDialog.setMessage(getString(R.string.loading_stops)); StopsBusiness.getAll(STSBusiness.getConfig(getContext())) .then(new LuConsumer>() { @Override public void execute(List data) { progressDialog.dismiss(); _stopsDbos = data; if (_map != null) { addStops(); } } }, new LuConsumer() { @Override public void execute(LuPromiseError data) { progressDialog.dismiss(); _stopsDbos = null; Toast.makeText(getContext(), data.getError(), Toast.LENGTH_LONG).show(); } }); } public void addStops() { ClusterManager clusterManager = new ClusterManager<>(getContext(), _map); _renderer = new StopDboMapRenderer(getContext(), _map, clusterManager); clusterManager.setRenderer(_renderer); for (StopsDbo stopsDbo : _stopsDbos) { clusterManager.addItem(new StopDboMapItem(stopsDbo)); } _map.setOnCameraIdleListener(clusterManager); _map.moveCamera(CameraUpdateFactory.newLatLngZoom(new LatLng(48.3786565, -71.3354953), 9)); } public void onStopSelected(StopsDbo stopsDbo) { if (_onStopSelectedConsumer != null) { _onStopSelectedConsumer.onStopSlicker(stopsDbo); } } }