package com.cafejeunesse.android.fragment.map; import android.app.FragmentManager; import android.content.Context; import android.location.Criteria; import android.location.Location; import android.location.LocationListener; import android.location.LocationManager; import android.os.Bundle; import android.view.LayoutInflater; import android.view.View; import android.view.ViewGroup; import android.widget.TextView; import com.cafejeunesse.android.database.ServiceDataSource; import com.cafejeunesse.android.fragment.BasicFragment; import com.cafejeunesse.android.navigationdrawer.R; import com.cafejeunesse.android.structure.Service; import com.google.android.gms.maps.CameraUpdate; import com.google.android.gms.maps.CameraUpdateFactory; import com.google.android.gms.maps.GoogleMap; import com.google.android.gms.maps.MapFragment; import com.google.android.gms.maps.model.BitmapDescriptorFactory; 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 java.util.List; /** * Created by David Levayer on 21/03/15. */ public class GoogleMapFragment extends BasicFragment implements GoogleMap.OnInfoWindowClickListener { protected View mView; protected Context mContext; private static int MAPS_LOCATION_UPDATE = 20000; private MapFragment mMapFragment; private GoogleMap mMap; private LocationManager mLocationManager; private LocationListener mLocationListener; private Location mLocation; private ServiceDataSource mDataSource; @Override public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { initFragment(inflater, container, R.layout.fragment_googlemap_main); return inflater.inflate(R.layout.fragment_googlemap_main, container, false); } @Override public void onActivityCreated(Bundle savedInstanceState) { super.onActivityCreated(savedInstanceState); // Chargement d'un sous-fragment contenant la map FragmentManager fm = getChildFragmentManager(); mMapFragment = (MapFragment) fm.findFragmentById(R.id.map_container); if (mMapFragment == null) { // On créé une instance de MapFragment (il ne faut pas passer par le constructeur !) mMapFragment = MapFragment.newInstance(); // Chargement effectif du sous-fragment fm.beginTransaction().replace(R.id.map_container, mMapFragment).commit(); } } @Override public void onResume() { super.onResume(); if (mMap == null) { // Au besoin (pas déjà fait), on recharge la map mMap = mMapFragment.getMap(); // TODO chargement de la map dans une tâche asynchrone afin de diminuer // l'impression de lag (la vue se charge d'abord, puis la map) setUpMap(); } // mise à jour de la position if(mLocation !=null) { CameraUpdate center= CameraUpdateFactory.newLatLngZoom( new LatLng(mLocation.getLatitude(), mLocation.getLongitude()), 15); mMap.moveCamera(center); } if(mDataSource != null) mDataSource.open(); } @Override public void onPause() { if(mDataSource != null) mDataSource.close(); super.onPause(); } private void setUpMap() { // Trigger les clics sur les descriptions des markers mMap.setOnInfoWindowClickListener(this); mMap.setInfoWindowAdapter(new GoogleMap.InfoWindowAdapter() { @Override public View getInfoWindow(Marker arg0) { return null; } @Override public View getInfoContents(Marker marker) { View v = getActivity().getLayoutInflater().inflate( R.layout.fragment_googlemap_info_marker, null); TextView info_title = (TextView) v.findViewById(R.id.marker_title); info_title.setText(marker.getTitle()); //TextView info = (TextView) v.findViewById(R.id.info_content); //info.setText(marker.getSnippet()); return v; } }); mMap.setMyLocationEnabled(true); // Getting LocationManager object from System Service LOCATION_SERVICE mLocationManager = (LocationManager) getActivity().getSystemService(Context.LOCATION_SERVICE); // Creating a criteria object to retrieve provider Criteria criteria = new Criteria(); // Getting the name of the best provider String provider = mLocationManager.getBestProvider(criteria, true); // Getting Current Location mLocation = mLocationManager.getLastKnownLocation(provider); mLocationListener = new LocationListener() { public void onLocationChanged(Location location) { if(location!=null) { mLocation = location; } } public void onProviderDisabled(String provider) { } public void onProviderEnabled(String provider) { } public void onStatusChanged(String provider, int status, Bundle extras) { } }; loadMarkers(); mLocationManager.requestLocationUpdates( provider, MAPS_LOCATION_UPDATE, 0, mLocationListener); } @Override public void onInfoWindowClick(Marker marker) { Bundle b = new Bundle(); b.putString(GoogleMapDialogFragment.TITLE,marker.getTitle()); FragmentManager fm = getFragmentManager(); GoogleMapDialogFragment mDialogFragment = new GoogleMapDialogFragment(); mDialogFragment.setArguments(b); mDialogFragment.show(fm, "googlemap_dialog_fragment"); } private void loadMarkers(){ if(mDataSource == null){ mDataSource = new ServiceDataSource(getActivity()); // TODO refactor pour rendre l'import transparent ? mDataSource.open(); List<Service> values = mDataSource.getAllServices(); if(values.size() == 0) { mDataSource.importDataFromAsset(ServiceDataSource.NEWDB_FILEPATH); values = mDataSource.getAllServices(); } for(Service service: values){ mMap.addMarker(new MarkerOptions() .position(new LatLng(service.getLat(), service.getLon())) .icon(BitmapDescriptorFactory.defaultMarker(BitmapDescriptorFactory.HUE_GREEN)) .title(service.getServiceName())); } } } }