package com.ptrprograms.maps.fragments;
import android.app.Activity;
import android.content.SharedPreferences;
import android.location.Geocoder;
import android.os.Bundle;
import android.support.v4.app.Fragment;
import android.util.Log;
import android.view.InflateException;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import com.google.android.gms.common.ConnectionResult;
import com.google.android.gms.common.GooglePlayServicesClient;
import com.google.android.gms.common.GooglePlayServicesUtil;
import com.google.android.gms.location.LocationClient;
import com.google.android.gms.maps.CameraUpdateFactory;
import com.google.android.gms.maps.GoogleMap;
import com.google.android.gms.maps.SupportMapFragment;
import com.google.android.gms.maps.model.BitmapDescriptorFactory;
import com.google.android.gms.maps.model.CameraPosition;
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.ptrprograms.maps.R;
import com.ptrprograms.maps.interfaces.mapListener;
import java.io.IOException;
import java.util.ArrayList;
import java.util.List;
/**
* Created by PaulTR on 2/9/14.
*/
public class PTRMapFragment extends Fragment implements GooglePlayServicesClient.ConnectionCallbacks, GooglePlayServicesClient.OnConnectionFailedListener {
private static final String TAG = PTRMapFragment.class.getSimpleName();
private final static String SAVED_STATE_LONG = "LONG";
private final static String SAVED_STATE_LAT = "LAT";
private final static String SAVED_STATE_ZOOM = "ZOOM";
private final static String SAVED_STATE_TILT = "TILT";
private final static String SAVED_STATE_BEARING = "BEARING";
private final static String EXTRAS_SHARED_PREFERENCES = "SAVEDPREFERENCES";
private GoogleMap mMap;
private LocationClient mLocationClient;
private mapListener mCallback;
private List<Marker> markerLocations = new ArrayList<Marker>();
public static PTRMapFragment newInstance() {
return new PTRMapFragment();
}
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
mLocationClient = new LocationClient( getActivity(), this, this );
}
public View onCreateView( LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState ) {
View v = null;
if( playServicesUnavailable() ) {
if( mCallback != null )
mCallback.playServicesUnavailable();
return null;
} else {
try {
v = inflater.inflate( R.layout.fragment_map, null, false );
} catch ( InflateException e ) {
}
}
mMap = ( (SupportMapFragment) getFragmentManager()
.findFragmentById( R.id.map) )
.getMap();
return v;
}
@Override
public void onViewCreated( View view, Bundle savedInstanceState ) {
super.onViewCreated(view, savedInstanceState);
initializeMap();
}
protected void initializeMap() {
if( mMap == null )
return;
mMap.setTrafficEnabled( true );
mMap.setMapType( GoogleMap.MAP_TYPE_HYBRID );
mMap.setMyLocationEnabled( true );
mMap.setIndoorEnabled( true );
mMap.setMyLocationEnabled( true );
mMap.setOnMapLongClickListener( new GoogleMap.OnMapLongClickListener() {
@Override
public void onMapLongClick(LatLng latLng) {
if( mCallback == null )
return;
mCallback.longClickedMap( latLng );
}
});
mMap.setOnMarkerClickListener( new GoogleMap.OnMarkerClickListener() {
@Override
public boolean onMarkerClick( Marker marker ) {
if ( marker == null )
return false;
marker.remove();
if ( markerLocations.contains( marker ) )
markerLocations.remove( marker );
return true;
}
});
}
public void addMarker( LatLng latLng ) {
if( latLng == null )
return;
Geocoder geocoder = new Geocoder( getActivity() );
String address;
try {
address = geocoder.getFromLocation( latLng.latitude, latLng.longitude, 1 ).get( 0 ).getAddressLine( 0 );
} catch( IOException e ) {
address = "";
}
Log.e( TAG, address );
addMarker( 0, latLng, address );
}
public void addMarker( float color, LatLng latLng, String title ) {
if( mMap == null )
mMap = ( (SupportMapFragment) getFragmentManager()
.findFragmentById( R.id.map ) )
.getMap();
if( latLng == null || mMap == null )
return;
MarkerOptions markerOptions = new MarkerOptions().position( latLng );
if( !title.isEmpty() )
markerOptions.title( title );
if( color == 0 )
color = BitmapDescriptorFactory.HUE_RED;
markerOptions.icon( BitmapDescriptorFactory.defaultMarker( color ) );
Marker marker = mMap.addMarker( markerOptions );
if( !markerLocations.contains( marker ) )
markerLocations.add( marker );
marker.showInfoWindow();
}
protected boolean playServicesUnavailable() {
return !( GooglePlayServicesUtil
.isGooglePlayServicesAvailable( getActivity() ) == ConnectionResult.SUCCESS );
}
private void setInitialCameraPosition() {
double lng, lat;
float tilt, bearing, zoom;
SharedPreferences settings = getActivity().getSharedPreferences( EXTRAS_SHARED_PREFERENCES, 0 );
lng = Double.longBitsToDouble( settings.getLong( SAVED_STATE_LONG, Double.doubleToLongBits( mLocationClient.getLastLocation().getLongitude() ) ) );
lat = Double.longBitsToDouble( settings.getLong( SAVED_STATE_LAT, Double.doubleToLongBits( mLocationClient.getLastLocation().getLatitude() ) ) );
zoom = settings.getFloat( SAVED_STATE_ZOOM, 17 );
bearing = settings.getFloat( SAVED_STATE_BEARING, 0 );
tilt = settings.getFloat( SAVED_STATE_TILT, 30 );
CameraPosition cameraPosition = new CameraPosition.Builder()
.target( new LatLng( lat, lng) )
.zoom( zoom )
.bearing( bearing )
.tilt( tilt )
.build();
if( cameraPosition == null || mMap == null )
return;
mMap.animateCamera( CameraUpdateFactory.newCameraPosition( cameraPosition ) );
}
@Override
public void onAttach(Activity activity) {
super.onAttach( activity );
try {
mCallback = (mapListener) getActivity();
} catch ( ClassCastException e ) {
throw new ClassCastException( getActivity().toString()
+ " must implement onPlayServicesUnavailableListener" ) ;
}
}
@Override
public void onStart() {
super.onStart();
mLocationClient.connect();
}
@Override
public void onStop() {
super.onStop();
mLocationClient.disconnect();
}
@Override
public void onDestroy() {
super.onDestroy();
if( mMap == null || mMap.getCameraPosition() == null )
return;
CameraPosition cam = mMap.getCameraPosition();
SharedPreferences shared = getActivity().getSharedPreferences( EXTRAS_SHARED_PREFERENCES, 0 );
SharedPreferences.Editor editor = shared.edit();
editor.putLong( SAVED_STATE_LAT, Double.doubleToLongBits( cam.target.latitude ) );
editor.putLong( SAVED_STATE_LONG, Double.doubleToLongBits( cam.target.longitude ) );
editor.putFloat( SAVED_STATE_TILT, cam.tilt );
editor.putFloat( SAVED_STATE_BEARING, cam.bearing );
editor.putFloat( SAVED_STATE_ZOOM, cam.zoom );
editor.commit();
}
@Override
public void onConnected( Bundle bundle ) {
setInitialCameraPosition();
}
@Override
public void onDisconnected() {
}
@Override
public void onConnectionFailed( ConnectionResult connectionResult ) {
}
}