/*******************************************************************************
* Copyright 2013 PAR Works, Inc
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
******************************************************************************/
package com.parworks.mars.view.nearby;
import java.util.HashMap;
import java.util.Map;
import android.location.Location;
import android.os.Bundle;
import android.support.v4.app.FragmentTransaction;
import android.util.Log;
import android.view.LayoutInflater;
import android.view.View;
import android.view.View.OnClickListener;
import android.view.View.OnLongClickListener;
import android.view.ViewGroup;
import android.view.ViewGroup.LayoutParams;
import android.widget.FrameLayout;
import android.widget.ImageButton;
import com.actionbarsherlock.app.SherlockFragmentActivity;
import com.google.android.gms.maps.CameraUpdateFactory;
import com.google.android.gms.maps.GoogleMap;
import com.google.android.gms.maps.GoogleMap.OnCameraChangeListener;
import com.google.android.gms.maps.GoogleMap.OnMapClickListener;
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.parworks.androidlibrary.response.SiteInfo;
import com.parworks.mars.MarsMenuFragment;
import com.parworks.mars.R;
import com.parworks.mars.view.nearby.GetLocation.GetLocationListener;
import com.parworks.mars.view.nearby.MarsMapFragment.MarsMapCreatedListener;
import com.parworks.mars.view.nearby.NearbySitesInfoFinder.NearbySitesInfoFinderListener;
import com.slidingmenu.lib.SlidingMenu;
import com.slidingmenu.lib.app.SlidingFragmentActivity;
public class NearbyFragment extends MarsMenuFragment implements MarsMapCreatedListener {
public static final String TAG = NearbyFragment.class.getName();
public static final String TAG_LOAD_MARKERS = "LOADING MARKERS TAG";
private NearbySitesListFragment mNearbySitesListFragment;
private GoogleMap mMap;
private NearbySitesInfoFinder mInfoFinder;
private static final int DEFAULT_MAX_SITES = 10;
private static final float MIN_ZOOM_TO_SHOW_MARKERS = 0.0f;
private static final double DEFAULT_RADIUS_IN_METERS = 10000 ;//10km
private static final float DEFAULT_ZOOM_LEVEL = 14.0f;
private MarsMapFragment mMapFragment;
private boolean isMapInitialized = false;
private View mNearbyView;
private Map<String,Marker> mAllMarkers = new HashMap<String,Marker>();
private boolean mIsMapFullscreen;
public NearbyFragment() {
super();
}
@Override
public void onCreate(Bundle savedInstanceState) {
Log.d(TAG,"onCreate");
setHasOptionsMenu(true);
super.onCreate(savedInstanceState);
}
@Override
public void onDestroyView() {
// TODO Auto-generated method stub
super.onDestroyView();
// SupportMapFragment fragment = (SupportMapFragment) (getFragmentManager().findFragmentById(R.id.fragmentNearbySitesMap));
// if(fragment == null) {
// return;
// }
// FragmentTransaction ft = getActivity().getSupportFragmentManager().beginTransaction();
// ft.remove(mMapFragment);
// ft.commitAllowingStateLoss();
}
@Override
public void onActivityCreated(Bundle savedInstanceState) {
// TODO Auto-generated method stub
super.onActivityCreated(savedInstanceState);
}
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState) {
View v = inflater.inflate(R.layout.fragment_nearby_test, null);
mNearbySitesListFragment = new NearbySitesListFragment();
mNearbyView = v;
return v;
}
protected void initializeMap() {
mMap = mMapFragment.getMap();
isMapInitialized = true;
mMap.setMyLocationEnabled(true);
mInfoFinder = new NearbySitesInfoFinder(new NearbySitesInfoFinderListener() {
@Override
public void gotSite(SiteInfo site) {
gotNewSiteInfo(site);
mNearbySitesListFragment.gotNewSiteInfo(site);
}
});
mMap.setOnCameraChangeListener(new OnCameraChangeListener() {
@Override
public void onCameraChange(CameraPosition position) {
onCameraPositionChanged(position);
}
});
mMap.setOnMapClickListener(new OnMapClickListener() {
@Override
public void onMapClick(LatLng point) {
hideNearbyList();
}
});
mMapFragment.getView().setOnLongClickListener(new OnLongClickListener() {
@Override
public boolean onLongClick(View v) {
makeMapFullScreen();
return false;
}
});
searchForLocation();
FrameLayout frameLayout = (FrameLayout) mNearbyView.findViewById(R.id.nearby_list_content_frame);
frameLayout.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
hideNearbyList();
}
});
}
@Override
public void onResume() {
super.onResume();
System.out.println("YUSUN ONRESUME MAP");
searchForLocation();
ImageButton button = (ImageButton) ((SherlockFragmentActivity) this.getActivity())
.getSupportActionBar().getCustomView().findViewById(R.id.rightBarButton);
button.setBackgroundResource(R.drawable.ic_bar_item_reload);
this.getActivity().getSupportFragmentManager()
.beginTransaction().replace(R.id.nearby_list_content_frame, mNearbySitesListFragment).commit();
mMapFragment = new MarsMapFragment(this);
this.getActivity().getSupportFragmentManager()
.beginTransaction().replace(R.id.nearby_map_containerasdf, mMapFragment).commit();
}
public void rightBarButtonClicked(View v) {
super.rightBarButtonClicked(v);
if(mIsMapFullscreen)
showNearbyList();
else
searchForLocation();
}
private void onCameraPositionChanged(CameraPosition position) {
Log.d(TAG_LOAD_MARKERS, "onCameraPositionChanged");
mInfoFinder.getNearbySiteInfo(position.target, DEFAULT_MAX_SITES, DEFAULT_RADIUS_IN_METERS);
Log.d(TAG,"onCameraPositionChanged: " + position.zoom);
if(position.zoom < MIN_ZOOM_TO_SHOW_MARKERS ) {
removeAllSiteMarkers();
}
}
private void makeMapFullScreen() {
LayoutParams newParams = mMapFragment.getView().getLayoutParams();
newParams.height = LayoutParams.MATCH_PARENT;
mMapFragment.getView().setLayoutParams(newParams);
}
private void hideNearbyList() {
mIsMapFullscreen = true;
ImageButton button = (ImageButton) ((SherlockFragmentActivity) this.getActivity())
.getSupportActionBar().getCustomView().findViewById(R.id.rightBarButton);
button.setBackgroundResource(R.drawable.ic_bar_item_up);
FrameLayout frameLayout = (FrameLayout) mNearbyView.findViewById(R.id.nearby_list_content_frame);
frameLayout.setVisibility(View.GONE);
((SlidingFragmentActivity) this.getActivity())
.getSlidingMenu().setTouchModeAbove(SlidingMenu.TOUCHMODE_NONE);
}
private void showNearbyList() {
mIsMapFullscreen = false;
ImageButton button = (ImageButton) ((SherlockFragmentActivity) this.getActivity())
.getSupportActionBar().getCustomView().findViewById(R.id.rightBarButton);
button.setBackgroundResource(R.drawable.ic_bar_item_reload);
FrameLayout frameLayout = (FrameLayout) mNearbyView.findViewById(R.id.nearby_list_content_frame);
frameLayout.setVisibility(View.VISIBLE);
((SlidingFragmentActivity) this.getActivity())
.getSlidingMenu().setTouchModeAbove(SlidingMenu.TOUCHMODE_FULLSCREEN);
}
private void searchForLocation() {
if(!isMapInitialized) {
return;
}
GetLocation getLocation = new GetLocation(getActivity(),new GetLocationListener() {
@Override
public void searchingForLocation() {
// Toast.makeText(mContext, "Searching for gps location!", Toast.LENGTH_LONG).show();
}
@Override
public void gotLocation(Location location) {
if(location == null) {
return;
}
gotUserLocation(location);
}
});
Location location = getLocation.start();
if(location == null) {
return;
}
gotUserLocation(location);
}
private void gotUserLocation(Location location) {
LatLng latLon = new LatLng(location.getLatitude(), location.getLongitude());
mInfoFinder.getNearbySiteInfo(latLon, DEFAULT_MAX_SITES, DEFAULT_RADIUS_IN_METERS);
moveCamera(location,DEFAULT_ZOOM_LEVEL);
}
private void gotNewSiteInfo(SiteInfo info) {
createSiteMarker(info);
}
private void createSiteMarker(SiteInfo info) {
if(mMap.getCameraPosition().zoom < MIN_ZOOM_TO_SHOW_MARKERS) {
return;
}
MarkerOptions markerOptions = new MarkerOptions();
String latString = info.getLat();
String lngString = info.getLon();
double latDouble = Double.parseDouble(latString);
double lngDouble = Double.parseDouble(lngString);
markerOptions.position(new LatLng(latDouble,lngDouble));
markerOptions.title(info.getId());
markerOptions.snippet(info.getDescription());
Marker marker = mMap.addMarker(markerOptions);
mAllMarkers.put(info.getId(), marker);
}
private void removeSiteMarker(String siteId) {
Log.d(TAG,"Removing site marker: " + siteId);
mAllMarkers.get(siteId).remove();
}
private void removeAllSiteMarkers() {
Log.d(TAG,"Removing all site markers");
for(String key : mAllMarkers.keySet()) {
removeSiteMarker(key);
}
mAllMarkers.clear();
mMap.clear();
}
private void moveCamera(Location location, float zoom) {
mMap.moveCamera(CameraUpdateFactory.newLatLngZoom(new LatLng(location.getLatitude(), location.getLongitude()), zoom));
}
@Override
public void onInitialized() {
initializeMap();
}
}