package com.example.patrick.myapplication.view;
import android.os.AsyncTask;
import android.os.Bundle;
import android.os.PowerManager;
import android.support.annotation.Nullable;
import android.support.v4.app.Fragment;
import android.support.v4.app.FragmentManager;
import android.support.v4.app.FragmentTransaction;
import android.util.Log;
import android.view.InflateException;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.Toast;
import com.example.patrick.myapplication.R;
import com.example.patrick.myapplication.bean.Geometry;
import com.example.patrick.myapplication.bean.NodeBean;
import com.example.patrick.myapplication.cluster.MyClusterRenderer;
import com.example.patrick.myapplication.network.ServerProxy;
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.OnMapReadyCallback;
import com.google.android.gms.maps.model.LatLng;
import com.google.android.gms.maps.model.MarkerOptions;
import com.google.maps.android.clustering.ClusterManager;
import org.w3c.dom.Node;
import java.io.IOException;
import java.util.ArrayList;
/**
* Created by Patrizio Perna on 21/01/15.
*/
public class MyMapFragment extends Fragment implements OnMapReadyCallback {
private MapFragment mapFragment;
private String[] startFrom;
private static View rootView;
private ClusterManager<NodeBean> mClusterManager;
private GetNodeListTask getNodeListTask;
private boolean first = true;
@Override
public View onCreateView(LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {
super.onCreateView(inflater, container, savedInstanceState);
Log.i("myMapFragment","onCreateView");
if (rootView != null) {
ViewGroup parent = (ViewGroup) rootView.getParent();
if (parent != null)
parent.removeView(rootView);
return rootView;
}
try {
rootView = inflater.inflate(R.layout.fragment_map, container, false);
} catch (InflateException e) {
/* map is already there, just return view as it is */
}
// Recupero punto di partenza da file config.xml
startFrom = getResources().getStringArray(R.array.startFrom);
// Recupero riferimento al fragment per la mappa
MapFragment mapFragment = (MapFragment) getActivity().getFragmentManager()
.findFragmentById(R.id.map);
mapFragment.getMapAsync(this);
return rootView;
}
@Override
public void onActivityCreated(@Nullable Bundle savedInstanceState) {
super.onActivityCreated(savedInstanceState);
Log.i("myMapFragment","onActivityCreated");
if (first){
getNodeListTask = new GetNodeListTask();
getNodeListTask.execute();
first = false;
}
}
@Override
public void onViewCreated(View view, @Nullable Bundle savedInstanceState) {
super.onViewCreated(view, savedInstanceState);
Log.i("myMapFragment","onViewCreated");
}
public void onDestroyView() {
super.onDestroyView();
Log.i("myMapFragment","onDestroyView");
}
@Override
public void onMapReady(GoogleMap googleMap) {
googleMap.setMyLocationEnabled(true);
LatLng latLngStart = new LatLng(Float.parseFloat(startFrom[0]),Float.parseFloat(startFrom[1]));
googleMap.moveCamera(CameraUpdateFactory.newLatLngZoom(latLngStart,Float.parseFloat(startFrom[2])));
setUpCluster(googleMap);
}
@Override
public void onPause() {
super.onPause();
Log.i("myMapFragment","onPause");
}
@Override
public void onStop() {
super.onStop();
Log.i("myMapFragment","onStop");
}
@Override
public void onResume() {
super.onResume();
Log.i("myMapFragment","onResume");
}
private void setUpCluster(GoogleMap googleMap){
// Initialize the manager with the context and the map.
// (Activity extends context, so we can pass 'this' in the constructor.)
mClusterManager = new ClusterManager<NodeBean>(getActivity(),googleMap);
// Setting the custom render
mClusterManager.setRenderer(new MyClusterRenderer(getActivity(),googleMap, mClusterManager));
// Point the map's listeners at the listeners implemented by the cluster manager.
googleMap.setOnCameraChangeListener(mClusterManager);
googleMap.setOnMarkerClickListener(mClusterManager);
mClusterManager.setOnClusterItemClickListener(new ClusterManager.OnClusterItemClickListener<NodeBean>() {
@Override
public boolean onClusterItemClick(NodeBean nodeBean) {
return false;
}
});
}
/**
* Task per recuperare la lista completa dei nodi
*/
// creo una classe innestata per reperire la lista di nodi
private class GetNodeListTask extends
AsyncTask<Void, Void, ArrayList<NodeBean>> {
private PowerManager.WakeLock mWakeLock;
private String msg;
@Override
protected void onPreExecute() {
super.onPreExecute();
PowerManager powerManager = (PowerManager) getActivity().getSystemService(getActivity().POWER_SERVICE);
mWakeLock = powerManager.newWakeLock(PowerManager.PARTIAL_WAKE_LOCK
| PowerManager.ON_AFTER_RELEASE, "MainActivity");
mWakeLock.acquire();
Toast.makeText(getActivity(), "Comunicazione con il server in corso...", Toast.LENGTH_SHORT).show();
}
@Override
protected ArrayList<NodeBean> doInBackground(Void...voids) {
ServerProxy proxy = new ServerProxy();
try {
Log.i("doInBackground",
"Comunicazione con il server in corso...");
return proxy.getNodesList("","roma","900");
} catch (IOException e) {
Log.i("doInBackground",
"Errore nella comunicazione con il server in doBackground",
e);
return null;
}
}
@Override
protected void onPostExecute(ArrayList<NodeBean> result) {
super.onPostExecute(result);
Toast.makeText(getActivity(), "Dati scaricati", Toast.LENGTH_SHORT).show();
try{
mClusterManager.clearItems();
for (NodeBean node :result){
mClusterManager.addItem(node);
}
}
catch(Exception e){
Toast.makeText(getActivity(),"Problem reading list of makers",Toast.LENGTH_SHORT).show();
}
}
}
}