package com.sanchez.fmf.fragment; import android.content.Intent; import android.graphics.Color; import android.graphics.Rect; import android.net.Uri; import android.os.Bundle; import android.support.design.widget.Snackbar; import android.support.v4.app.Fragment; import android.support.v7.widget.Toolbar; import android.util.Log; import android.view.LayoutInflater; import android.view.View; import android.view.ViewGroup; import android.view.Window; import android.widget.Button; import com.google.android.gms.maps.CameraUpdateFactory; import com.google.android.gms.maps.GoogleMap; import com.google.android.gms.maps.MapView; import com.google.android.gms.maps.MapsInitializer; import com.google.android.gms.maps.OnMapReadyCallback; import com.google.android.gms.maps.model.LatLng; import com.google.android.gms.maps.model.LatLngBounds; import com.google.android.gms.maps.model.MarkerOptions; import com.sanchez.fmf.MarketDetailActivity; import com.sanchez.fmf.MarketListActivity; import com.sanchez.fmf.R; import com.sanchez.fmf.event.MarketsDetailsRetrievedEvent; import com.sanchez.fmf.event.PlaceTitleResolvedEvent; import com.sanchez.fmf.model.MarketDetailModel; import com.sanchez.fmf.model.MarketListItemModel; import com.sanchez.fmf.util.MarketUtils; import java.lang.reflect.Field; import java.util.ArrayList; import java.util.HashMap; import butterknife.Bind; import butterknife.ButterKnife; import de.greenrobot.event.EventBus; public class MarketMapFragment extends Fragment implements OnMapReadyCallback { public static final String TAG = MarketMapFragment.class.getSimpleName(); @Bind(R.id.toolbar_market_map_fragment) Toolbar mToolbar; @Bind(R.id.market_map) MapView mMapView; @Bind(R.id.map_market_details_popup) View mDetailsPopup; @Bind(R.id.open_in_maps_button) Button mOpenInMapsButton; @Bind(R.id.view_market_details_button) Button mViewMarketDetailsButton; private Bundle mBundle; private GoogleMap mMap; private double[] mCoordinates = null; private String mPlaceTitle = null; private MarketListItemModel mCurrentMarket; private double[] mCurrentMarketCoordinates; private HashMap<MarketListItemModel, MarketDetailModel> mMarkets = null; public static MarketMapFragment newInstance(double[] coords, String placeTitle) { MarketMapFragment frag = new MarketMapFragment(); Bundle args = new Bundle(); args.putDoubleArray(MarketListActivity.EXTRA_COORDINATES, coords); args.putString(MarketListActivity.EXTRA_PLACE_TITLE, placeTitle); frag.setArguments(args); return frag; } public MarketMapFragment() { } @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); mBundle = savedInstanceState; if (getArguments() != null) { mCoordinates = getArguments().getDoubleArray(MarketListActivity.EXTRA_COORDINATES); mPlaceTitle = getArguments().getString(MarketListActivity.EXTRA_PLACE_TITLE); } } @Override public void onStart() { super.onStart(); EventBus.getDefault().registerSticky(this); } @Override public void onStop() { EventBus.getDefault().unregister(this); super.onStop(); } /** * Relay lifecycle methods to MapView as per Google guidelines */ @Override public void onResume() { super.onResume(); mMapView.onResume(); } @Override public void onPause() { super.onPause(); mMapView.onPause(); } @Override public void onDestroy() { mMapView.onDestroy(); super.onDestroy(); } @Override public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { View view = inflater.inflate(R.layout.fragment_market_map, container, false); ButterKnife.bind(this, view); MapsInitializer.initialize(getActivity()); mMapView.onCreate(mBundle); // give primary_dark a little transparency int color = getResources().getColor(R.color.primary_dark); mToolbar.setBackgroundColor(Color.argb(200, Color.red(color), Color.green(color), Color.blue(color))); if (null != mPlaceTitle) { mToolbar.setTitle(mPlaceTitle); } mToolbar.setNavigationIcon(R.drawable.ic_clear_white_24dp); mToolbar.setNavigationOnClickListener((v) -> { getActivity().getSupportFragmentManager().popBackStackImmediate(); }); mOpenInMapsButton.setOnClickListener((v) -> { Uri gmmIntentUri = Uri.parse("geo:0,0?q=" + MarketUtils.getQueryFromMapUrl(mMarkets.get(mCurrentMarket).getMapLink())); Intent mapIntent = new Intent(Intent.ACTION_VIEW, gmmIntentUri); mapIntent.setPackage("com.google.android.apps.maps"); if (mapIntent.resolveActivity(getActivity().getPackageManager()) != null) { startActivity(mapIntent); } else { Snackbar.make(mMapView, R.string.no_maps_installed, Snackbar.LENGTH_SHORT).show(); } }); mViewMarketDetailsButton.setOnClickListener((v) -> { Intent i = new Intent(getActivity(), MarketDetailActivity.class); i.putExtra(MarketDetailActivity.EXTRA_MARKET_ID, mCurrentMarket.getId()); i.putExtra(MarketDetailActivity.EXTRA_MARKET_NAME, MarketUtils.getNameFromMarketString(mCurrentMarket.getName())); startActivity(i); }); mMapView.getMapAsync(this); return view; } @Override public void onMapReady(GoogleMap map) { mMap = map; if (null != mMarkets) { setUpMap(); } } private void setUpMap() { double lowestLat = mCoordinates[0]; double highestLat = mCoordinates[0]; double lowestLng = mCoordinates[1]; double highestLng = mCoordinates[1]; ArrayList<MarketListItemModel> keys = new ArrayList<>(mMarkets.keySet()); for (int i = 0; i < keys.size(); i++) { double[] coords = MarketUtils.getCoordinatesFromMapUrl(mMarkets.get(keys.get(i)).getMapLink()); if (coords[0] < lowestLat) { lowestLat = coords[0]; } else if (coords[0] > highestLat) { highestLat = coords[0]; } if (coords[1] < lowestLng) { lowestLng = coords[1]; } else if (coords[1] > highestLng) { highestLng = coords[1]; } mMap.addMarker(new MarkerOptions() .title(MarketUtils.getNameFromMarketString(keys.get(i).getName())) .position(new LatLng(coords[0], coords[1]))); } mMap.moveCamera(CameraUpdateFactory.newLatLngBounds(new LatLngBounds( new LatLng(lowestLat, lowestLng), new LatLng(highestLat, highestLng)), 100)); mMap.setOnMarkerClickListener((marker) -> { mDetailsPopup.setVisibility(View.VISIBLE); double lat = marker.getPosition().latitude; double lng = marker.getPosition().longitude; for (int i = 0; i < keys.size(); i++) { double[] coords = MarketUtils.getCoordinatesFromMapUrl(mMarkets.get(keys.get(i)).getMapLink()); if (lat == coords[0] && lng == coords[1]) { mCurrentMarket = keys.get(i); mCurrentMarketCoordinates = coords; } } return false; }); mMapView.setVisibility(View.VISIBLE); } public void onEvent(MarketsDetailsRetrievedEvent event) { mMarkets = event.getMarketDetailModels(); if (null != mMap) { setUpMap(); } } public void onEvent(PlaceTitleResolvedEvent event) { if(null != mToolbar) { mToolbar.setTitle(event.getPlaceTitle()); } } }