package com.mobmonkey.mobmonkeyandroid.fragments; import java.util.ArrayList; import java.util.HashMap; import org.json.JSONArray; import org.json.JSONException; import org.json.JSONObject; import android.app.Activity; import android.content.Context; import android.content.Intent; import android.content.SharedPreferences; import android.location.Address; import android.os.Bundle; import android.support.v4.app.FragmentManager; 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.ViewGroup; import android.widget.AdapterView; import android.widget.AdapterView.OnItemClickListener; import android.widget.Button; import android.widget.ImageButton; import android.widget.LinearLayout; import android.widget.RelativeLayout; import android.widget.ScrollView; import android.widget.TextView; import android.widget.Toast; import com.google.android.gms.maps.CameraUpdateFactory; import com.google.android.gms.maps.GoogleMap; import com.google.android.gms.maps.GoogleMap.InfoWindowAdapter; import com.google.android.gms.maps.GoogleMap.OnInfoWindowClickListener; import com.google.android.gms.maps.GoogleMap.OnMapClickListener; 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.mobmonkey.mobmonkeyandroid.R; import com.mobmonkey.mobmonkeyandroid.AddLocationScreen; import com.mobmonkey.mobmonkeyandroid.arrayadapters.MMFavoritesArrayAdapter; import com.mobmonkey.mobmonkeyandroid.listeners.*; import com.mobmonkey.mobmonkeyandroid.utils.MMConstants; import com.mobmonkey.mobmonkeyandroid.utils.MMExpandedListView; import com.mobmonkey.mobmonkeyandroid.utils.MMFragment; import com.mobmonkey.mobmonkeyandroid.utils.MMSupportMapFragment; import com.mobmonkey.mobmonkeysdk.adapters.MMFavoritesAdapter; import com.mobmonkey.mobmonkeysdk.adapters.MMGeocoderAdapter; import com.mobmonkey.mobmonkeysdk.utils.MMCallback; import com.mobmonkey.mobmonkeysdk.utils.MMProgressDialog; import com.mobmonkey.mobmonkeysdk.utils.MMSDKConstants; import com.mobmonkey.mobmonkeysdk.utils.MMLocationListener; import com.mobmonkey.mobmonkeysdk.utils.MMLocationManager; /** * @author Dezapp, LLC * */ public class FavoritesFragment extends MMFragment implements OnClickListener, OnItemClickListener, OnMapClickListener, OnInfoWindowClickListener { private static final String TAG = "FavoritesFragment: "; private SharedPreferences userPrefs; private SharedPreferences.Editor userPrefsEditor; private FragmentManager fragmentManager; private ImageButton ibMap; private Button btnAddLoc; private Button btnCancel; private ScrollView svFavorites; private MMExpandedListView elvFavorites; private LinearLayout llFavoritesMap; private MMFavoritesArrayAdapter favoritesArrayAdapter; private MMSupportMapFragment smfFavoriteLocations; private GoogleMap googleMap; private HashMap<Marker, JSONObject> markerHashMap; private boolean addLocClicked; private Marker currMarker; private float currZoomLevel = 16; private boolean displayMap = false; private MMOnSearchResultsFragmentItemClickListener locationSelectListener; /* * (non-Javadoc) * @see android.support.v4.app.Fragment#onCreateView(android.view.LayoutInflater, android.view.ViewGroup, android.os.Bundle) */ @Override public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { Log.d(TAG, TAG + "onCreateView"); userPrefs = getActivity().getSharedPreferences(MMSDKConstants.USER_PREFS, Context.MODE_PRIVATE); userPrefsEditor = userPrefs.edit(); fragmentManager = getFragmentManager(); View view = inflater.inflate(R.layout.fragment_favorites_screen, container, false); ibMap = (ImageButton) view.findViewById(R.id.ibmap); btnAddLoc = (Button) view.findViewById(R.id.btnaddloc); btnCancel = (Button) view.findViewById(R.id.btncancel); svFavorites = (ScrollView) view.findViewById(R.id.svfavorites); elvFavorites = (MMExpandedListView) view.findViewById(R.id.elvfavorites); llFavoritesMap = (LinearLayout) view.findViewById(R.id.llfavoritesmap); markerHashMap = new HashMap<Marker, JSONObject>(); addLocClicked = false; ibMap.setOnClickListener(FavoritesFragment.this); btnAddLoc.setOnClickListener(FavoritesFragment.this); btnCancel.setOnClickListener(FavoritesFragment.this); elvFavorites.setOnItemClickListener(FavoritesFragment.this); return view; } /* * (non-Javadoc) * @see android.support.v4.app.Fragment#onAttach(android.app.Activity) */ @Override public void onAttach(Activity activity) { super.onAttach(activity); if(activity instanceof MMOnSearchResultsFragmentItemClickListener) { locationSelectListener = (MMOnSearchResultsFragmentItemClickListener) activity; } } /* (non-Javadoc) * @see android.support.v4.app.Fragment#onActivityResult(int, int, android.content.Intent) */ @Override public void onActivityResult(int requestCode, int resultCode, Intent data) { super.onActivityResult(requestCode, resultCode, data); if(requestCode == MMSDKConstants.REQUEST_CODE_ADD_LOCATION) { if(resultCode == Activity.RESULT_OK) { Log.d(TAG, TAG + "info: " + data.getStringExtra(MMSDKConstants.KEY_INTENT_EXTRA_LOCATION_DETAILS)); locationSelectListener.onSearchResultsFragmentItemClick(data.getStringExtra(MMSDKConstants.KEY_INTENT_EXTRA_LOCATION_DETAILS)); } } } /* * (non-Javadoc) * @see android.view.View.OnClickListener#onClick(android.view.View) */ @Override public void onClick(View view) { if(MMLocationManager.isGPSEnabled() && MMLocationManager.getGPSLocation() != null) { switch(view.getId()) { case R.id.ibmap: mapButtonClicked(); break; case R.id.btnaddloc: addLocButtonClicked(); break; case R.id.btncancel: cancelButtonClicked(); break; } } } /* * (non-Javadoc) * @see android.widget.AdapterView.OnItemClickListener#onItemClick(android.widget.AdapterView, android.view.View, int, long) */ @Override public void onItemClick(AdapterView<?> adapter, View view, int position, long id) { locationSelectListener.onSearchResultsFragmentItemClick(favoritesArrayAdapter.getItem(position).toString()); } /* * (non-Javadoc) * @see com.google.android.gms.maps.GoogleMap.OnMapClickListener#onMapClick(com.google.android.gms.maps.model.LatLng) */ @Override public void onMapClick(LatLng pointClicked) { Log.d(TAG, TAG + "addLocClicked: " + addLocClicked); if(addLocClicked) { MMGeocoderAdapter.getFromLocation(getActivity(), new ReverseGeocodeCallback(), pointClicked.latitude, pointClicked.longitude); MMProgressDialog.displayDialog(getActivity(), MMSDKConstants.DEFAULT_STRING_EMPTY, getString(R.string.pd_retrieving_location_information)); } } /* * (non-Javadoc) * @see com.google.android.gms.maps.GoogleMap.OnInfoWindowClickListener#onInfoWindowClick(com.google.android.gms.maps.model.Marker) */ @Override public void onInfoWindowClick(Marker marker) { Log.d(TAG, TAG + "marker clicked: " + marker); currMarker = marker; currZoomLevel = googleMap.getCameraPosition().zoom; locationSelectListener.onSearchResultsFragmentItemClick(markerHashMap.get((Marker) marker).toString()); } /* * (non-Javadoc) * @see android.support.v4.app.Fragment#onResume() */ @Override public void onResume() { Log.d(TAG, TAG + "onResume"); super.onResume(); if(MMLocationManager.isGPSEnabled() && MMLocationManager.getGPSLocation() != null) { refreshFavorites(); getMMSupportMapFragment(); } } /* (non-Javadoc) * @see android.support.v4.app.Fragment#onPause() */ @Override public void onPause() { Log.d(TAG, TAG + "onPause"); super.onPause(); if(MMLocationManager.isGPSEnabled() && MMLocationManager.getGPSLocation() != null) { try { FragmentTransaction transaction = fragmentManager.beginTransaction(); transaction.remove(smfFavoriteLocations); transaction.commitAllowingStateLoss(); } catch (Exception e) { e.printStackTrace(); } } } /* (non-Javadoc) * @see com.mobmonkey.mobmonkey.utils.MMFragment#onFragmentBackPressed() */ @Override public void onFragmentBackPressed() { } /** * */ private void mapButtonClicked() { if(!displayMap) { svFavorites.setVisibility(View.GONE); llFavoritesMap.setVisibility(View.VISIBLE); displayMap = true; } else { svFavorites.setVisibility(View.VISIBLE); llFavoritesMap.setVisibility(View.GONE); displayMap = false; } } /** * */ private void addLocButtonClicked() { Log.d(TAG, TAG + "displayMap: " + displayMap); if(!displayMap) { Intent intent = new Intent(getActivity(), AddLocationScreen.class); intent.putExtra(MMSDKConstants.REQUEST_CODE, MMSDKConstants.REQUEST_CODE_ADD_LOCATION); startActivityForResult(intent, MMSDKConstants.REQUEST_CODE_ADD_LOCATION); } else { Toast.makeText(getActivity(), R.string.toast_tap_location_to_add, Toast.LENGTH_LONG).show(); addLocClicked = true; btnAddLoc.setVisibility(View.INVISIBLE); btnCancel.setVisibility(View.VISIBLE); RelativeLayout.LayoutParams params = (RelativeLayout.LayoutParams) ibMap.getLayoutParams(); params.addRule(RelativeLayout.LEFT_OF, R.id.btncancel); ibMap.setLayoutParams(params); } } /** * */ private void cancelButtonClicked() { addLocClicked = false; btnAddLoc.setVisibility(View.VISIBLE); btnCancel.setVisibility(View.INVISIBLE); RelativeLayout.LayoutParams params = (RelativeLayout.LayoutParams) ibMap.getLayoutParams(); params.addRule(RelativeLayout.LEFT_OF, R.id.btnaddloc); ibMap.setLayoutParams(params); } /** * Make a call to the server and refresh the Favorites list */ private void refreshFavorites() { MMFavoritesAdapter.getFavorites(new FavoritesCallback()); MMProgressDialog.displayDialog(getActivity(), MMSDKConstants.DEFAULT_STRING_EMPTY, getString(R.string.pd_updating_favorites)); } /** * @throws JSONException * */ private void getMMSupportMapFragment() { smfFavoriteLocations = (MMSupportMapFragment) fragmentManager.findFragmentByTag(MMSDKConstants.MMSUPPORT_MAP_FRAGMENT_TAG); if(smfFavoriteLocations == null) { smfFavoriteLocations = new MMSupportMapFragment() { /* (non-Javadoc) * @see android.support.v4.app.Fragment#onActivityCreated(android.os.Bundle) */ @Override public void onActivityCreated(Bundle savedInstanceState) { super.onActivityCreated(savedInstanceState); googleMap = smfFavoriteLocations.getMap(); } }; FragmentTransaction fragmentTransaction = fragmentManager.beginTransaction(); fragmentTransaction.add(R.id.llfavoritesmap, smfFavoriteLocations, MMSDKConstants.MMSUPPORT_MAP_FRAGMENT_TAG); fragmentTransaction.commit(); } } /** * * @throws JSONException */ private void getFavorites(String result) throws JSONException { JSONArray favorites = new JSONArray(result); userPrefsEditor.putString(MMSDKConstants.SHARED_PREFS_KEY_FAVORITES, result); userPrefsEditor.apply(); markerHashMap.clear(); googleMap.clear(); if(favorites.length() > 0) { ArrayList<JSONObject> favoriteLocations = new ArrayList<JSONObject>(); for(int i = 0; i < favorites.length(); i++) { favoriteLocations.add(favorites.getJSONObject(i)); } favoritesArrayAdapter = new MMFavoritesArrayAdapter(getActivity(), R.layout.listview_row_favorites, favoriteLocations); elvFavorites.setAdapter(favoritesArrayAdapter); addToGoogleMap(favorites); } if(displayMap) { svFavorites.setVisibility(View.GONE); llFavoritesMap.setVisibility(View.VISIBLE); } else { svFavorites.setVisibility(View.VISIBLE); elvFavorites.setVisibility(View.VISIBLE); llFavoritesMap.setVisibility(View.GONE); } } /** * * @throws JSONException */ private void addToGoogleMap(JSONArray favorites) throws JSONException { LatLng currentLoc = new LatLng(MMLocationManager.getLocationLatitude(), MMLocationManager.getLocationLongitude()); googleMap.setInfoWindowAdapter(new CustomInfoWindowAdapter()); for(int i = 0; i < favorites.length(); i++) { JSONObject jObj = favorites.getJSONObject(i); LatLng resultLocLatLng = new LatLng(jObj.getDouble(MMSDKConstants.JSON_KEY_LATITUDE), jObj.getDouble(MMSDKConstants.JSON_KEY_LONGITUDE)); Marker locationResultMarker = googleMap.addMarker(new MarkerOptions(). position(resultLocLatLng). title(jObj.getString(MMSDKConstants.JSON_KEY_NAME)) .snippet(jObj.getString(MMSDKConstants.JSON_KEY_ADDRESS))); if(currMarker != null && currMarker.getTitle().equals(locationResultMarker.getTitle()) && currMarker.getTitle().equals(locationResultMarker.getTitle())) { Log.d(TAG, TAG + "marker equal"); locationResultMarker.showInfoWindow(); currentLoc = currMarker.getPosition(); } markerHashMap.put(locationResultMarker, jObj); } Log.d(TAG, TAG + "lat: " + currentLoc.latitude + " long: " + currentLoc.longitude); googleMap.moveCamera(CameraUpdateFactory.newLatLngZoom(currentLoc, currZoomLevel)); googleMap.setOnInfoWindowClickListener(FavoritesFragment.this); googleMap.setOnMapClickListener(FavoritesFragment.this); googleMap.setMyLocationEnabled(true); Log.d(TAG, TAG + "my location: " + googleMap.getMyLocation()); } /** * Callback to update the user's favorites list in app data after making get favorites call to the server * @author Dezapp, LLC * */ private class FavoritesCallback implements MMCallback { @Override public void processCallback(Object obj) { MMProgressDialog.dismissDialog(); if(obj != null) { if(((String) obj).equals(MMSDKConstants.CONNECTION_TIMED_OUT)) { Toast.makeText(getActivity(), getString(R.string.toast_connection_timed_out), Toast.LENGTH_SHORT).show(); } else { Log.d(TAG, TAG + "response: " + ((String) obj)); try { getFavorites((String) obj); } catch (JSONException e) { e.printStackTrace(); } } } } } /** * * @author Dezapp, LLC * */ private class ReverseGeocodeCallback implements MMCallback { @Override public void processCallback(Object obj) { MMProgressDialog.dismissDialog(); if(obj != null) { if(obj instanceof String) { if(((String) obj).equals(MMSDKConstants.CONNECTION_TIMED_OUT)) { Toast.makeText(getActivity(), getString(R.string.toast_connection_timed_out), Toast.LENGTH_SHORT).show(); } else if(((String) obj).equals(MMSDKConstants.SERVICE_NOT_AVAILABLE)) { Toast.makeText(getActivity(), R.string.toast_service_not_available, Toast.LENGTH_LONG).show(); } } else if(obj instanceof Address){ Address locationClicked = (Address) obj; Intent intent = new Intent(getActivity(), AddLocationScreen.class); intent.putExtra(MMSDKConstants.JSON_KEY_ADDRESS, locationClicked.getAddressLine(MMSDKConstants.DEFAULT_INT_ZERO)); intent.putExtra(MMSDKConstants.JSON_KEY_LOCALITY, locationClicked.getLocality()); intent.putExtra(MMSDKConstants.JSON_KEY_REGION, locationClicked.getAdminArea()); intent.putExtra(MMSDKConstants.JSON_KEY_POSTCODE, locationClicked.getPostalCode()); intent.putExtra(MMSDKConstants.JSON_KEY_COUNTRY_CODE, locationClicked.getCountryCode()); intent.putExtra(MMSDKConstants.JSON_KEY_LATITUDE, locationClicked.getLatitude()); intent.putExtra(MMSDKConstants.JSON_KEY_LONGITUDE, locationClicked.getLongitude()); startActivityForResult(intent, MMSDKConstants.REQUEST_CODE_ADD_LOCATION); } } } } /** * * @author Dezapp, LLC * */ private class CustomInfoWindowAdapter implements InfoWindowAdapter { private final View mWindow; private final View mContents; public CustomInfoWindowAdapter() { mWindow = getActivity().getLayoutInflater().inflate(R.layout.custom_info_window, null); mContents = getActivity().getLayoutInflater().inflate(R.layout.custom_info_contents, null); } @Override public View getInfoWindow(Marker marker) { render(marker, mWindow); return mWindow; } @Override public View getInfoContents(Marker marker) { render(marker, mContents); return mContents; } private void render(Marker marker, View view) { String title = marker.getTitle(); TextView titleUi = ((TextView) view.findViewById(R.id.title)); if (title != null) { titleUi.setText(title); } else { titleUi.setText(MMSDKConstants.DEFAULT_STRING_EMPTY); } String snippet = marker.getSnippet(); TextView snippetUi = ((TextView) view.findViewById(R.id.snippet)); if (snippet != null) { snippetUi.setText(snippet); } else { snippetUi.setText(MMSDKConstants.DEFAULT_STRING_EMPTY); } } } }