package ee.ajapaik.android.fragment; 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.os.Handler; import android.support.v4.app.LoaderManager.LoaderCallbacks; import android.support.v4.content.Loader; import android.util.Log; import android.view.LayoutInflater; import android.view.View; import android.view.ViewGroup; 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.SupportMapFragment; 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 ee.ajapaik.android.DetailsActivity; import ee.ajapaik.android.loader.PhotoListLoader; public class MainFragment extends SupportMapFragment implements LoaderCallbacks<MarkerOptions[]>/*, PhotoItemsOverlay.Listener */{ public static MainFragment newInstance() { return new MainFragment(); } public static final String TAG = "MainFragment"; private GoogleMap map; private Location currentPhotoLoc = null; @Override public View onCreateView(LayoutInflater inflater, ViewGroup viewGroup, Bundle savedInstanceState) { View v = super.onCreateView(inflater, viewGroup, savedInstanceState); map = getMap(); map.setMyLocationEnabled(true); map.getUiSettings().setCompassEnabled(true); if (savedInstanceState == null) { CameraUpdate[] updates = new CameraUpdate[] { CameraUpdateFactory.newLatLng(new LatLng(58.378195d, 26.714388d)), CameraUpdateFactory.zoomTo(15.0f) }; for (CameraUpdate u : updates) { map.moveCamera(u); } LocationManager lm = (LocationManager) getActivity().getSystemService(Context.LOCATION_SERVICE); map.setOnCameraChangeListener(new GoogleMap.OnCameraChangeListener() { @Override public void onCameraChange(CameraPosition cameraPosition) { Location loc = new Location(LocationManager.GPS_PROVIDER); // gps provider doesn't mean anything loc.setLatitude(cameraPosition.target.latitude); loc.setLongitude(cameraPosition.target.longitude); loadPhotoList(loc); } }); Criteria crit = new Criteria(); crit.setAccuracy(Criteria.ACCURACY_MEDIUM); lm.requestSingleUpdate(crit, new LocationListener() { @Override public void onLocationChanged(Location loc) { map.animateCamera(CameraUpdateFactory.newLatLng(new LatLng(loc.getLatitude(), loc.getLongitude()))); } public void onStatusChanged(String provider, int status, Bundle extras) {} public void onProviderEnabled(String provider) {} public void onProviderDisabled(String provider) {} }, null); } map.setOnMarkerClickListener(new GoogleMap.OnMarkerClickListener() { @Override public boolean onMarkerClick(Marker marker) { DetailsActivity.start(getActivity(), Integer.valueOf(marker.getSnippet()), marker.getTitle()); return true; } }); return v; } private void loadPhotoList(final Location loc) { if (currentPhotoLoc == null || currentPhotoLoc.distanceTo(loc) > 150.0f) { currentPhotoLoc = loc; (new Handler()).postDelayed(new Runnable() { @Override public void run() { if (!loc.equals(currentPhotoLoc)) { return; } Log.d(TAG, "Loading photo list for location{lat=" + loc.getLatitude() + ", lng=" + loc.getLongitude()); Bundle args = new Bundle(); args.putDouble(PhotoListLoader.ARG_LATITUDE, loc.getLatitude()); args.putDouble(PhotoListLoader.ARG_LONGITUDE, loc.getLongitude()); getLoaderManager().restartLoader(0, args, MainFragment.this); } }, 1000L); } } @Override public Loader<MarkerOptions[]> onCreateLoader(int id, Bundle args) { return new PhotoListLoader(getActivity(), args.getDouble(PhotoListLoader.ARG_LATITUDE), args.getDouble(PhotoListLoader.ARG_LONGITUDE)); } @Override public void onLoadFinished(Loader<MarkerOptions[]> loader, MarkerOptions[] results) { map.clear(); for (MarkerOptions mo : results) { map.addMarker(mo); } } @Override public void onLoaderReset(Loader<MarkerOptions[]> loader) { // wut } }