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.graphics.Color;
import android.location.Location;
import android.os.Bundle;
import android.support.v4.app.FragmentManager;
import android.support.v4.app.FragmentTransaction;
import android.text.Editable;
import android.text.TextWatcher;
import android.util.Log;
import android.util.TypedValue;
import android.view.LayoutInflater;
import android.view.MotionEvent;
import android.view.View;
import android.view.View.OnClickListener;
import android.view.View.OnLongClickListener;
import android.view.View.OnTouchListener;
import android.view.ViewGroup;
import android.view.inputmethod.InputMethodManager;
import android.widget.AdapterView;
import android.widget.ArrayAdapter;
import android.widget.Button;
import android.widget.EditText;
import android.widget.ImageButton;
import android.widget.LinearLayout;
import android.widget.ListView;
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.OnMapLongClickListener;
import com.google.android.gms.maps.GoogleMapOptions;
import com.google.android.gms.maps.UiSettings;
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.AddLocationScreen;
import com.mobmonkey.mobmonkeyandroid.R;
import com.mobmonkey.mobmonkeyandroid.arrayadapters.MMNearbyLocationsArrayAdapter;
import com.mobmonkey.mobmonkeyandroid.arrayadapters.MMSearchCategoriesArrayAdapter;
import com.mobmonkey.mobmonkeyandroid.arrayadaptersitems.MMSearchCategoriesItem;
import com.mobmonkey.mobmonkeyandroid.listeners.MMOnCategoryFragmentItemClickListener;
import com.mobmonkey.mobmonkeyandroid.listeners.MMOnCreateHotSpotFragmentClickListener;
import com.mobmonkey.mobmonkeyandroid.listeners.MMOnHistoryFragmentItemClickListener;
import com.mobmonkey.mobmonkeyandroid.listeners.MMOnNearbyLocationsItemClickListener;
import com.mobmonkey.mobmonkeyandroid.utils.MMCategories;
import com.mobmonkey.mobmonkeyandroid.utils.MMConstants;
import com.mobmonkey.mobmonkeyandroid.utils.MMExpandedListView;
import com.mobmonkey.mobmonkeyandroid.utils.MMExpandedNearbyLocationsListView;
import com.mobmonkey.mobmonkeyandroid.utils.MMFragment;
import com.mobmonkey.mobmonkeyandroid.utils.MMScrollView;
import com.mobmonkey.mobmonkeyandroid.utils.MMScrollViewListener;
import com.mobmonkey.mobmonkeyandroid.utils.MMSupportMapFragment;
import com.mobmonkey.mobmonkeyandroid.utils.MMTagPopupWindow;
import com.mobmonkey.mobmonkeyandroid.utils.MMTagPopupWindow.OnDismissListener;
import com.mobmonkey.mobmonkeyandroid.utils.MMUtility;
import com.mobmonkey.mobmonkeysdk.adapters.MMSearchLocationAdapter;
import com.mobmonkey.mobmonkeysdk.utils.MMSDKConstants;
import com.mobmonkey.mobmonkeysdk.utils.MMCallback;
import com.mobmonkey.mobmonkeysdk.utils.MMLocationListener;
import com.mobmonkey.mobmonkeysdk.utils.MMLocationManager;
import com.mobmonkey.mobmonkeysdk.utils.MMProgressDialog;
/**
* @author Dezapp, LLC
*
*/
public class SearchLocationsFragment extends MMFragment implements MMScrollViewListener,
OnClickListener,
OnLongClickListener,
OnDismissListener,
OnTouchListener,
OnInfoWindowClickListener,
OnMapLongClickListener {
private static final String TAG = "SearchLocationsFragment: ";
private SharedPreferences userPrefs;
private SharedPreferences.Editor userPrefsEditor;
private String user;
private FragmentManager fragmentManager;
private Location location;
private JSONArray nearbyLocations;
private JSONArray locationHistory;
private TextView tvNavBarTitle;
private LinearLayout llCreateHotSpot;
private ImageButton ibTags;
private EditText etSearch;
private ImageButton ibClearSearch;
private MMScrollView svNearbyLocations;
private MMExpandedNearbyLocationsListView enllvNearbyLocations;
private LinearLayout llLoadMore;
private Button btnAddLoc;
private TextView tvHoldToPanAndZoom;
private MMExpandedListView elvSearch;
private LinearLayout llNearbyLocationsSearch;
private TextView tvNearbyLocationsSearch;
private ListView lvNearbyLocationsSearch;
private MMTagPopupWindow mmTagPopupWindow;
private MMSupportMapFragment smfNearbyLocations;
private GoogleMap googleMap;
private MMNearbyLocationsArrayAdapter nearbyLocationsArrayAdapter;
private MMNearbyLocationsArrayAdapter nearbyLocationsSearchArrayAdapter;
private InputMethodManager inputMethodManager;
private int nearbyLocationsCount = 5;
private Marker currMarker;
private float currZoomLevel = 16;
private boolean enablePanAndZoom = false;
private HashMap<Marker, JSONObject> markerHashMap;
private MMOnCreateHotSpotFragmentClickListener createHotSpotFragmentClicKlistener;
private MMOnNearbyLocationsItemClickListener nearbyLocationsFragmentItemClickListener;
private MMOnHistoryFragmentItemClickListener historyFragmentItemClickListener;
private MMOnCategoryFragmentItemClickListener categoryFragmentItemClickListener;
private String searchText = MMSDKConstants.DEFAULT_STRING_EMPTY;
/*
* (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) {
userPrefs = getActivity().getSharedPreferences(MMSDKConstants.USER_PREFS, Context.MODE_PRIVATE);
userPrefsEditor = userPrefs.edit();
user = userPrefs.getString(MMSDKConstants.KEY_USER, MMSDKConstants.DEFAULT_STRING_EMPTY);
fragmentManager = getFragmentManager();
View view = inflater.inflate(R.layout.fragment_searchlocations_screen, container, false);
tvNavBarTitle = (TextView) view.findViewById(R.id.tvnavbartitle);
llCreateHotSpot = (LinearLayout) view.findViewById(R.id.llcreatehotspot);
ibTags = (ImageButton) view.findViewById(R.id.ibtags);
etSearch = (EditText) view.findViewById(R.id.etsearch);
ibClearSearch = (ImageButton) view.findViewById(R.id.ibclearsearch);
svNearbyLocations = (MMScrollView) view.findViewById(R.id.svnearbylocations);
enllvNearbyLocations = (MMExpandedNearbyLocationsListView) view.findViewById(R.id.enllvnearbylocations);
llLoadMore = (LinearLayout) view.findViewById(R.id.llloadmore);
btnAddLoc = (Button) view.findViewById(R.id.btnaddloc);
tvHoldToPanAndZoom = (TextView) view.findViewById(R.id.tvholdtopanandzoom);
elvSearch = (MMExpandedListView) view.findViewById(R.id.elvsearch);
llNearbyLocationsSearch = (LinearLayout) view.findViewById(R.id.llnearbylocationssearch);
tvNearbyLocationsSearch = (TextView) view.findViewById(R.id.tvnearbylocationssearch);
lvNearbyLocationsSearch = (ListView) view.findViewById(R.id.lvnearbylocationssearch);
inputMethodManager = (InputMethodManager) getActivity().getSystemService(Context.INPUT_METHOD_SERVICE);
markerHashMap = new HashMap<Marker, JSONObject>();
if(MMLocationManager.isGPSEnabled() && MMLocationManager.getGPSLocation() != null) {
if(!enablePanAndZoom) {
tvHoldToPanAndZoom.setText(MMUtility.setTextStyleItalic(getString(R.string.tv_hold_to_enable_pan_and_zoom)));
} else {
tvHoldToPanAndZoom.setText(MMUtility.setTextStyleItalic(getString(R.string.tv_hold_to_disable_pan_and_zoom)));
}
tvHoldToPanAndZoom.setVisibility(View.VISIBLE);
}
llCreateHotSpot.setOnClickListener(SearchLocationsFragment.this);
ibTags.setOnClickListener(SearchLocationsFragment.this);
ibClearSearch.setOnClickListener(SearchLocationsFragment.this);
svNearbyLocations.setScrollViewListener(SearchLocationsFragment.this);
enllvNearbyLocations.setOnItemClickListener(new AdapterView.OnItemClickListener() {
@Override
public void onItemClick(AdapterView<?> adapterView, View view, int position, long id) {
try {
Log.d(TAG, TAG + "onItemClick");
Log.d(TAG, TAG + "positon: " + position);
addToHistory(nearbyLocationsArrayAdapter.getItem(position));
nearbyLocationsFragmentItemClickListener.onNearbyLocationsItemClick(nearbyLocationsArrayAdapter.getItem(position).toString());
} catch (JSONException e) {
e.printStackTrace();
}
}
});
llLoadMore.setOnClickListener(SearchLocationsFragment.this);
if(MMLocationManager.getGPSLocation() != null) {
btnAddLoc.setOnClickListener(SearchLocationsFragment.this);
btnAddLoc.setVisibility(View.VISIBLE);
}
elvSearch.setOnItemClickListener(new AdapterView.OnItemClickListener() {
@Override
public void onItemClick(AdapterView<?> adapterView, View view, int position, long id) {
switch(position) {
case 0:
historyFragmentItemClickListener.onHistoryItemClick();
break;
case 1:
categoryFragmentItemClickListener.onCategoryFragmentItemClick(getActivity().getString(R.string.tv_title_categories), MMCategories.getTopLevelCategories(getActivity()), true);
break;
}
}
});
lvNearbyLocationsSearch.setOnItemClickListener(new AdapterView.OnItemClickListener() {
@Override
public void onItemClick(AdapterView<?> adapterView, View view, int position, long id) {
try {
addToHistory(nearbyLocationsSearchArrayAdapter.getItem(position));
nearbyLocationsFragmentItemClickListener.onNearbyLocationsItemClick(nearbyLocationsSearchArrayAdapter.getItem(position).toString());
inputMethodManager.hideSoftInputFromWindow(etSearch.getWindowToken(), 0);
// nearbyLocationsSearch = true;
searchText = etSearch.getText().toString();
} catch (JSONException e) {
e.printStackTrace();
}
}
});
try {
getLocationHistory();
} catch (JSONException e) {
e.printStackTrace();
}
setSearchByText();
setSearch();
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 MMOnCreateHotSpotFragmentClickListener) {
createHotSpotFragmentClicKlistener = (MMOnCreateHotSpotFragmentClickListener) activity;
if(activity instanceof MMOnNearbyLocationsItemClickListener) {
nearbyLocationsFragmentItemClickListener = (MMOnNearbyLocationsItemClickListener) activity;
if(activity instanceof MMOnHistoryFragmentItemClickListener) {
historyFragmentItemClickListener = (MMOnHistoryFragmentItemClickListener) activity;
if(activity instanceof MMOnCategoryFragmentItemClickListener) {
categoryFragmentItemClickListener = (MMOnCategoryFragmentItemClickListener) activity;
}
}
}
}
}
/* (non-Javadoc)
* @see com.mobmonkey.mobmonkeyandroid.utils.MMScrollViewListener#onScrollChanged(com.mobmonkey.mobmonkeyandroid.utils.MMScrollView, int, int, int, int)
*/
@Override
public void onScrollChanged(MMScrollView mmScrollView, int x, int y, int oldx, int oldy) {
mmScrollView.setVisibility(View.GONE);
mmScrollView.setVisibility(View.VISIBLE);
}
/*
* (non-Javadoc)
* @see android.view.View.OnClickListener#onClick(android.view.View)
*/
@Override
public void onClick(View view) {
switch(view.getId()) {
case R.id.llcreatehotspot:
if(MMLocationManager.isGPSEnabled() && (location = MMLocationManager.getGPSLocation()) != null) {
createHotSpotFragmentClicKlistener.onCreateHotSpotClick(nearbyLocations);
}
break;
case R.id.ibtags:
llCreateHotSpot.setVisibility(View.GONE);
displayTagsPopUp(view);
break;
case R.id.etsearch:
if(MMLocationManager.isGPSEnabled() && (location = MMLocationManager.getGPSLocation()) != null) {
setNearbyLocationsSearch();
}
break;
case R.id.ibclearsearch:
etSearch.setText(MMSDKConstants.DEFAULT_STRING_EMPTY);
break;
case R.id.llloadmore:
nearbyLocationsCount += 5;
setNearbyLocations();
break;
case R.id.btnaddloc:
Intent intent = new Intent(getActivity(), AddLocationScreen.class);
intent.putExtra(MMSDKConstants.REQUEST_CODE, MMSDKConstants.REQUEST_CODE_ADD_LOCATION);
startActivityForResult(intent, MMSDKConstants.REQUEST_CODE_ADD_LOCATION);
break;
}
}
/* (non-Javadoc)
* @see android.view.View.OnLongClickListener#onLongClick(android.view.View)
*/
@Override
public boolean onLongClick(View v) {
switch(v.getId()) {
case R.id.etsearch:
setNearbyLocationsSearch();
break;
}
return false;
}
/* (non-Javadoc)
* @see com.mobmonkey.mobmonkeyandroid.utils.MMTagPopupWindow.OnDismissListener#onDismiss()
*/
@Override
public void onDismiss() {
if(!mmTagPopupWindow.getCityState().equals(MMSDKConstants.DEFAULT_STRING_EMPTY) || !mmTagPopupWindow.getZipCode().equals(MMSDKConstants.DEFAULT_STRING_EMPTY)) {
// ibTags.setBackgroundColor(Color.BLUE);
}
Log.d(TAG, TAG + "cityState: " + mmTagPopupWindow.getCityState() + " zipCode: " + mmTagPopupWindow.getZipCode());
llCreateHotSpot.setVisibility(View.VISIBLE);
}
/* (non-Javadoc)
* @see android.view.View.OnTouchListener#onTouch(android.view.View, android.view.MotionEvent)
*/
@Override
public boolean onTouch(View v, MotionEvent event) {
switch(v.getId()) {
case R.id.etsearch:
tvNavBarTitle.setVisibility(View.GONE);
return true;
}
return false;
}
/* (non-Javadoc)
* @see com.google.android.gms.maps.GoogleMap.OnMapLongClickListener#onMapLongClick(com.google.android.gms.maps.model.LatLng)
*/
@Override
public void onMapLongClick(LatLng latLng) {
if(!enablePanAndZoom) {
tvHoldToPanAndZoom.setText(MMUtility.setTextStyleItalic(getString(R.string.tv_hold_to_disable_pan_and_zoom)));
enablePanAndZoom = true;
svNearbyLocations.requestDisallowInterceptTouchEvent(true);
svNearbyLocations.setDisableStatus(true);
panAndZoom();
} else {
tvHoldToPanAndZoom.setText(MMUtility.setTextStyleItalic(getString(R.string.tv_hold_to_enable_pan_and_zoom)));
enablePanAndZoom = false;
svNearbyLocations.setDisableStatus(false);
panAndZoom();
}
}
/*
* (non-Javadoc)
* @see com.google.android.gms.maps.GoogleMap.OnInfoWindowClickListener#onInfoWindowClick(com.google.android.gms.maps.model.Marker)
*/
@Override
public void onInfoWindowClick(Marker marker) {
try {
addToHistory(markerHashMap.get((Marker) marker));
currMarker = marker;
currZoomLevel = googleMap.getCameraPosition().zoom;
nearbyLocationsFragmentItemClickListener.onNearbyLocationsItemClick(markerHashMap.get((Marker) marker).toString());
} catch (JSONException e) {
e.printStackTrace();
}
}
/* (non-Javadoc)
* @see android.support.v4.app.Fragment#onActivityCreated(android.os.Bundle)
*/
@Override
public void onActivityCreated(Bundle savedInstanceState) {
super.onActivityCreated(savedInstanceState);
}
/* (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));
nearbyLocationsFragmentItemClickListener.onNearbyLocationsItemClick(data.getStringExtra(MMSDKConstants.KEY_INTENT_EXTRA_LOCATION_DETAILS));
}
}
}
/* (non-Javadoc)
* @see android.support.v4.app.Fragment#onResume()
*/
@Override
public void onResume() {
Log.d(TAG, TAG + "onResume");
super.onResume();
if(MMLocationManager.isGPSEnabled() && (location = MMLocationManager.getGPSLocation()) != null) {
searchAllNearbyLocations();
getMMSupportMapFragment();
}
}
/* (non-Javadoc)
* @see android.support.v4.app.Fragment#onStart()
*/
@Override
public void onStart() {
Log.d(TAG, TAG + "onStart");
super.onStart();
}
/* (non-Javadoc)
* @see android.support.v4.app.Fragment#onPause()
*/
@Override
public void onPause() {
Log.d(TAG, TAG + "onPause");
super.onPause();
if(MMLocationManager.isGPSEnabled() && (location = MMLocationManager.getGPSLocation()) != null) {
try {
FragmentTransaction transaction = fragmentManager.beginTransaction();
transaction.remove(smfNearbyLocations);
transaction.commitAllowingStateLoss();
Log.d(TAG, TAG + "fragmentManager: " + fragmentManager.findFragmentByTag(MMSDKConstants.MMSUPPORT_MAP_FRAGMENT_TAG));
} catch (Exception e) {
e.printStackTrace();
}
}
}
/* (non-Javadoc)
* @see android.support.v4.app.Fragment#onDestroyView()
*/
@Override
public void onDestroyView() {
Log.d(TAG, "onDestroyView");
super.onDestroyView();
}
/* (non-Javadoc)
* @see com.mobmonkey.mobmonkey.utils.MMFragment#onFragmentBackPressed()
*/
@Override
public void onFragmentBackPressed() {
Log.d(TAG, TAG + "onFragmentBackPressed");
if(llNearbyLocationsSearch.getVisibility() == View.VISIBLE) {
cancelNearbyLocationsSearch();
}
}
/**
*
*/
private void setSearchByText() {
etSearch.setOnClickListener(SearchLocationsFragment.this);
etSearch.setOnLongClickListener(SearchLocationsFragment.this);
etSearch.addTextChangedListener(new NearbyLocationsTextWatcher());
if(!MMLocationManager.isGPSEnabled() || MMLocationManager.getGPSLocation() == null) {
etSearch.setFocusable(false);
etSearch.setFocusableInTouchMode(false);
etSearch.setClickable(false);
}
}
/**
*
*/
private void setSearch() {
String[] searchArray = getActivity().getResources().getStringArray(R.array.array_search);
MMSearchCategoriesItem[] searchItems = new MMSearchCategoriesItem[searchArray.length];
for(int i = 0; i < searchArray.length; i++) {
searchItems[i] = new MMSearchCategoriesItem();
searchItems[i].setCatIconId(0);
searchItems[i].setCatName(searchArray[i]);
searchItems[i].setCatIndicatorIconId(R.drawable.listview_accessory_indicator);
}
ArrayAdapter<MMSearchCategoriesItem> arrayAdapter = new MMSearchCategoriesArrayAdapter(getActivity(), R.layout.listview_row_searchcategory, searchItems);
elvSearch.setAdapter(arrayAdapter);
if(!MMLocationManager.isGPSEnabled() || MMLocationManager.getGPSLocation() == null) {
elvSearch.setEnabled(false);
}
}
/**
*
*/
private void searchAllNearbyLocations() {
MMSearchLocationAdapter.searchAllNearbyLocations(new SearchCallback(),
userPrefs.getInt(MMSDKConstants.SHARED_PREFS_KEY_SEARCH_RADIUS, MMSDKConstants.SEARCH_RADIUS_HALF_MILE));
MMProgressDialog.displayDialog(getActivity(),
MMSDKConstants.DEFAULT_STRING_EMPTY,
getString(R.string.pd_search_all_nearby));
}
/**
*
*/
private void getMMSupportMapFragment() {
Log.d(TAG, TAG + "getMMSupportMapFragment");
smfNearbyLocations = new MMSupportMapFragment(new GoogleMapOptions().zOrderOnTop(true)) {
/* (non-Javadoc)
* @see android.support.v4.app.Fragment#onActivityCreated(android.os.Bundle)
*/
@Override
public void onActivityCreated(Bundle savedInstanceState) {
super.onActivityCreated(savedInstanceState);
googleMap = smfNearbyLocations.getMap();
if(googleMap != null) {
Log.d(TAG, TAG + "google map is NOT null!");
panAndZoom();
}
}
};
FragmentTransaction fragmentTransaction = fragmentManager.beginTransaction();
fragmentTransaction.add(R.id.flnearbylocationsmap, smfNearbyLocations, MMSDKConstants.MMSUPPORT_MAP_FRAGMENT_TAG);
fragmentTransaction.commit();
}
/**
*
*/
private void panAndZoom() {
UiSettings uiSettings = googleMap.getUiSettings();
uiSettings.setCompassEnabled(enablePanAndZoom);
uiSettings.setMyLocationButtonEnabled(enablePanAndZoom);
uiSettings.setRotateGesturesEnabled(enablePanAndZoom);
uiSettings.setScrollGesturesEnabled(enablePanAndZoom);
uiSettings.setTiltGesturesEnabled(enablePanAndZoom);
uiSettings.setZoomControlsEnabled(enablePanAndZoom);
uiSettings.setZoomGesturesEnabled(enablePanAndZoom);
}
/**
*
* @return
* @throws JSONException
*/
private boolean getLocationHistory() throws JSONException {
String history = userPrefs.getString(user + MMSDKConstants.SHARED_PREFS_KEY_HISTORY, MMSDKConstants.DEFAULT_STRING_EMPTY);
if(!history.equals(MMSDKConstants.DEFAULT_STRING_EMPTY)) {
locationHistory = new JSONArray(history);
return true;
} else {
locationHistory = new JSONArray();
return false;
}
}
/**
*
* @throws JSONException
*/
private void setNearbyLocations() {
if(nearbyLocationsCount >= nearbyLocations.length()) {
nearbyLocationsCount = nearbyLocations.length();
llLoadMore.setVisibility(View.GONE);
}
ArrayList<JSONObject> resultLocations = new ArrayList<JSONObject>();
try {
for(int i = 0; i < nearbyLocationsCount; i++) {
resultLocations.add(nearbyLocations.getJSONObject(i));
}
if(resultLocations.size() > 0) {
enllvNearbyLocations.setVisibility(View.VISIBLE);
llLoadMore.setVisibility(View.VISIBLE);
btnAddLoc.setVisibility(View.VISIBLE);
nearbyLocationsArrayAdapter = new MMNearbyLocationsArrayAdapter(getActivity(), R.layout.listview_row_searchresults, resultLocations);
enllvNearbyLocations.setAdapter(nearbyLocationsArrayAdapter);
}
addToGoogleMap();
} catch (JSONException e) {
e.printStackTrace();
}
}
/**
*
* @throws JSONException
*/
private void setSearchNearbyLocations() {
ArrayList<JSONObject> resultLocations = new ArrayList<JSONObject>();
try {
for(int i = 0; i < nearbyLocations.length(); i++) {
resultLocations.add(nearbyLocations.getJSONObject(i));
}
if(resultLocations.size() > 0) {
lvNearbyLocationsSearch.setVisibility(View.VISIBLE);
nearbyLocationsSearchArrayAdapter = new MMNearbyLocationsArrayAdapter(getActivity(), R.layout.listview_row_searchresults, resultLocations);
lvNearbyLocationsSearch.setAdapter(nearbyLocationsSearchArrayAdapter);
}
} catch (JSONException e) {
e.printStackTrace();
}
}
/**
*
* @throws JSONException
*/
private void addToGoogleMap() {
LatLng currentLoc = new LatLng(location.getLatitude(), location.getLongitude());
googleMap.clear();
googleMap.setInfoWindowAdapter(new CustomInfoWindowAdapter());
markerHashMap.clear();
if(nearbyLocationsCount >= nearbyLocations.length()) {
nearbyLocationsCount = nearbyLocations.length();
}
try {
for(int i = 0; i < nearbyLocationsCount; i++) {
JSONObject jObj = nearbyLocations.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())) {
Log.d(TAG, TAG + "marker equal");
locationResultMarker.showInfoWindow();
currentLoc = currMarker.getPosition();
}
markerHashMap.put(locationResultMarker, jObj);
}
} catch (JSONException e) {
e.printStackTrace();
}
if(currMarker != null) {
currentLoc = currMarker.getPosition();
}
googleMap.moveCamera(CameraUpdateFactory.newLatLngZoom(currentLoc, currZoomLevel));
googleMap.setOnInfoWindowClickListener(SearchLocationsFragment.this);
googleMap.setOnMapLongClickListener(SearchLocationsFragment.this);
googleMap.setMyLocationEnabled(true);
}
/**
*
* @param position
* @throws JSONException
*/
private void addToHistory(JSONObject loc) throws JSONException {
if(!locationExistsInHistory(loc)) {
if(locationHistory.length() < MMSDKConstants.HISTORY_SIZE) {
ArrayList<JSONObject> temp = new ArrayList<JSONObject>();
//Convert to ArrayList so that you can add last item view to front of array
for (int i=0; i<locationHistory.length(); i++)
temp.add(locationHistory.getJSONObject(i));
temp.add(0, loc);
locationHistory = new JSONArray(temp);
} else {
ArrayList<JSONObject> temp = new ArrayList<JSONObject>();
//Convert to ArrayList so that you can add last item view to front of array
for (int i=0; i<locationHistory.length(); i++)
temp.add(locationHistory.getJSONObject(i));
temp.add(0, loc);
temp.remove(MMSDKConstants.HISTORY_SIZE);
locationHistory = new JSONArray(temp);
}
}
userPrefsEditor.putString(user + MMSDKConstants.SHARED_PREFS_KEY_HISTORY, locationHistory.toString());
userPrefsEditor.commit();
}
/**
*
* @param loc
* @return
* @throws JSONException
*/
private boolean locationExistsInHistory(JSONObject loc) throws JSONException {
if(locationHistory.length() <= 0) {
return false;
}
for(int i = 0; i < locationHistory.length(); i++) {
if(locationHistory.getJSONObject(i).getString(MMSDKConstants.JSON_KEY_NAME).equals(loc.getString(MMSDKConstants.JSON_KEY_NAME)) &&
locationHistory.getJSONObject(i).getString(MMSDKConstants.JSON_KEY_LATITUDE).equals(loc.getString(MMSDKConstants.JSON_KEY_LATITUDE)) &&
locationHistory.getJSONObject(i).getString(MMSDKConstants.JSON_KEY_LONGITUDE).equals(loc.getString(MMSDKConstants.JSON_KEY_LONGITUDE))) {
ArrayList<JSONObject> temp = new ArrayList<JSONObject>();
//Convert to ArrayList so that you can add last item view to front of array
for (int j=0; j<locationHistory.length(); j++)
temp.add(locationHistory.getJSONObject(j));
JSONObject tempObj = temp.remove(i);
temp.add(0, tempObj);
locationHistory = new JSONArray(temp);
return true;
}
}
return false;
}
/**
*
* @param view
*/
private void displayTagsPopUp(View view) {
Log.d(TAG, TAG + "display tags popup");
if(mmTagPopupWindow == null) {
mmTagPopupWindow = new MMTagPopupWindow(getActivity());
mmTagPopupWindow.setOnDismissListener(SearchLocationsFragment.this);
}
int yOffset = llCreateHotSpot.getMeasuredHeight();
yOffset += (int) TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_DIP, 20.0f, getResources().getDisplayMetrics());
mmTagPopupWindow.show(view, yOffset);
}
/**
*
*/
private void setNearbyLocationsSearch() {
tvNavBarTitle.setVisibility(View.GONE);
llNearbyLocationsSearch.setVisibility(View.VISIBLE);
svNearbyLocations.setDisableStatus(true);
svNearbyLocations.setClickable(false);
enllvNearbyLocations.setEnabled(false);
}
/**
*
*/
private void cancelNearbyLocationsSearch() {
searchText = MMSDKConstants.DEFAULT_STRING_EMPTY;
tvNavBarTitle.setVisibility(View.VISIBLE);
llNearbyLocationsSearch.setVisibility(View.GONE);
svNearbyLocations.setDisableStatus(false);
svNearbyLocations.setClickable(true);
enllvNearbyLocations.setEnabled(true);
etSearch.setText(MMSDKConstants.DEFAULT_STRING_EMPTY);
inputMethodManager.hideSoftInputFromWindow(etSearch.getWindowToken(), 0);
}
/**
* Custom {@link MMCallback} specifically for {@link SearchScreen} to be processed after receiving response from MobMonkey server.
* @author Dezapp, LLC
*
*/
private class SearchCallback implements MMCallback {
@Override
public void processCallback(Object obj) {
MMProgressDialog.dismissDialog();
if(obj != null) {
Log.d(TAG, TAG + "Response: " + ((String) obj));
if(((String) obj).equals(MMSDKConstants.CONNECTION_TIMED_OUT)) {
Toast.makeText(getActivity(), getString(R.string.toast_connection_timed_out), Toast.LENGTH_SHORT).show();
} else {
nearbyLocations = MMUtility.filterSubLocations((String) obj);
Log.d(TAG, TAG + "nearbyLocations: " + nearbyLocations.toString());
nearbyLocationsCount = 5;
setNearbyLocations();
setSearchNearbyLocations();
}
// try {
// JSONObject jObj = new JSONObject((String) obj);
// mmNoCategoryItemClickFragmentListener.onNoCategoryFragmentItemClick(0, searchCategory, jObj.getJSONArray(MMSDKConstants.JSON_KEY_DEFAULT_TEXTS).toString());
// mmNoCategoryItemClickFragmentListener.onNoCategoryFragmentItemClick(0, searchCategory, (String) obj);
// } catch (JSONException e) {
// e.printStackTrace();
// }
}
}
}
/**
*
* @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);
}
}
}
/**
*
* @author Dezapp, LLC
*
*/
private class NearbyLocationsTextWatcher implements TextWatcher {
@Override
public void afterTextChanged(Editable s) {
}
@Override
public void beforeTextChanged(CharSequence s, int start, int count, int after) {
}
@Override
public void onTextChanged(CharSequence s, int start, int before, int count) {
if(nearbyLocationsArrayAdapter != null) {
if(s.length() > 0) {
ibClearSearch.setVisibility(View.VISIBLE);
tvNearbyLocationsSearch.setVisibility(View.VISIBLE);
lvNearbyLocationsSearch.setVisibility(View.VISIBLE);
nearbyLocationsSearchArrayAdapter.getFilter().filter(s);
} else {
ibClearSearch.setVisibility(View.INVISIBLE);
tvNearbyLocationsSearch.setVisibility(View.GONE);
lvNearbyLocationsSearch.setVisibility(View.GONE);
}
}
}
}
}