package com.mobmonkey.mobmonkeyandroid.fragments; import org.json.JSONException; import org.json.JSONObject; import android.app.Activity; import android.app.AlertDialog; import android.content.Context; import android.content.Intent; import android.content.SharedPreferences; import android.graphics.Typeface; import android.location.Address; import android.os.Bundle; import android.support.v4.app.FragmentManager; import android.support.v4.app.FragmentTransaction; import android.text.SpannableString; import android.text.TextUtils; import android.text.style.StyleSpan; import android.util.Log; import android.view.KeyEvent; import android.view.LayoutInflater; import android.view.MotionEvent; import android.view.View; import android.view.View.OnClickListener; import android.view.View.OnKeyListener; import android.view.View.OnTouchListener; import android.view.inputmethod.InputMethodManager; import android.view.ViewGroup; import android.widget.Button; import android.widget.CompoundButton; import android.widget.CompoundButton.OnCheckedChangeListener; import android.widget.EditText; import android.widget.ScrollView; import android.widget.TextView; import android.widget.Toast; import android.widget.ToggleButton; import com.google.android.gms.maps.CameraUpdateFactory; import com.google.android.gms.maps.GoogleMap; import com.google.android.gms.maps.GoogleMap.OnMapClickListener; import com.google.android.gms.maps.model.BitmapDescriptorFactory; 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.HotSpotRangeActionSheet; import com.mobmonkey.mobmonkeyandroid.R; import com.mobmonkey.mobmonkeyandroid.listeners.MMOnFragmentMultipleBackListener; import com.mobmonkey.mobmonkeyandroid.utils.MMConstants; import com.mobmonkey.mobmonkeyandroid.utils.MMFragment; import com.mobmonkey.mobmonkeyandroid.utils.MMSupportMapFragment; import com.mobmonkey.mobmonkeyandroid.utils.MMUtility; import com.mobmonkey.mobmonkeysdk.adapters.MMGeocoderAdapter; import com.mobmonkey.mobmonkeysdk.adapters.MMLocationAdapter; import com.mobmonkey.mobmonkeysdk.utils.MMCallback; import com.mobmonkey.mobmonkeysdk.utils.MMProgressDialog; import com.mobmonkey.mobmonkeysdk.utils.MMSDKConstants; /** * @author Dezapp, LLC * */ public class NewHotSpotFragment extends MMFragment implements OnMapClickListener, OnTouchListener, OnKeyListener, OnClickListener { private static final String TAG = "NewHotSpotFragment: "; private SharedPreferences userPrefs; private FragmentManager fragmentManager; private InputMethodManager inputMethodManager; private JSONObject locationInfo; private int requestCode; private ScrollView svHotSpotDetails; private ToggleButton tbUseCurrentLocation; private MMSupportMapFragment smfNewHotSpot; private TextView tvTapOnTheMap; private EditText etName; private EditText etDescription; private EditText etRange; private Button btnCreateHotSpot; private GoogleMap googleMap; private Marker newHotSpotMarker; private Address locationClicked; private MMOnFragmentMultipleBackListener fragmentMultipleBackListener; /* (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); fragmentManager = getFragmentManager(); inputMethodManager = (InputMethodManager) getActivity().getSystemService(Context.INPUT_METHOD_SERVICE); requestCode = getArguments().getInt(MMSDKConstants.REQUEST_CODE); View view = inflater.inflate(R.layout.fragment_new_hot_spot, container, false); svHotSpotDetails = (ScrollView) view.findViewById(R.id.svhotspotdetails); tbUseCurrentLocation = (ToggleButton) view.findViewById(R.id.tbusecurrentlocation); tvTapOnTheMap = (TextView) view.findViewById(R.id.tvtaponthemap); etName = (EditText) view.findViewById(R.id.etname); etDescription = (EditText) view.findViewById(R.id.etdescription); etRange = (EditText) view.findViewById(R.id.etrange); btnCreateHotSpot = (Button) view.findViewById(R.id.btncreatehotspot); tvTapOnTheMap.setText(MMUtility.setTextStyleItalic(tvTapOnTheMap.getText().toString())); tbUseCurrentLocation.setOnClickListener(NewHotSpotFragment.this); etName.setOnClickListener(NewHotSpotFragment.this); etDescription.setOnKeyListener(NewHotSpotFragment.this); etRange.setOnTouchListener(NewHotSpotFragment.this); btnCreateHotSpot.setOnClickListener(NewHotSpotFragment.this); etName.setText("Wilson Hot Spot"); etRange.setText("50 meters"); 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 MMOnFragmentMultipleBackListener) { fragmentMultipleBackListener = (MMOnFragmentMultipleBackListener) activity; } } /* (non-Javadoc) * @see com.google.android.gms.maps.GoogleMap.OnMapClickListener#onMapClick(com.google.android.gms.maps.model.LatLng) */ @Override public void onMapClick(LatLng pointClicked) { tbUseCurrentLocation.setClickable(true); tbUseCurrentLocation.setChecked(false); 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 android.view.View.OnTouchListener#onTouch(android.view.View, android.view.MotionEvent) */ @Override public boolean onTouch(View v, MotionEvent event) { if(event.getAction() == MotionEvent.ACTION_UP) { switch(v.getId()) { case R.id.etrange: Intent intent = new Intent(getActivity(), HotSpotRangeActionSheet.class); startActivityForResult(intent, MMSDKConstants.REQUEST_CODE_RANGE); return true; } } return false; } /* (non-Javadoc) * @see android.view.View.OnKeyListener#onKey(android.view.View, int, android.view.KeyEvent) */ @Override public boolean onKey(View v, int keyCode, KeyEvent event) { if(event.getAction() == KeyEvent.ACTION_UP && keyCode == KeyEvent.KEYCODE_ENTER) { inputMethodManager.hideSoftInputFromWindow(etDescription.getWindowToken(), 0); return true; } return false; } /* (non-Javadoc) * @see android.view.View.OnClickListener#onClick(android.view.View) */ @Override public void onClick(View view) { switch(view.getId()) { case R.id.tbusecurrentlocation: tbUseCurrentLocation.setClickable(false); if(newHotSpotMarker != null) { newHotSpotMarker.remove(); } break; case R.id.btncreatehotspot: try { checkFields(); } catch (JSONException e) { e.printStackTrace(); } break; } } /* (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_RANGE) { if(resultCode == Activity.RESULT_OK) { etRange.setText(data.getIntExtra(MMSDKConstants.KEY_INTENT_EXTRA_RANGE, MMSDKConstants.DEFAULT_INT) + MMSDKConstants.DEFAULT_STRING_SPACE + getString(R.string.et_text_meters)); Log.d(TAG, TAG + "range: " + data.getIntExtra(MMSDKConstants.KEY_INTENT_EXTRA_RANGE, MMSDKConstants.DEFAULT_INT)); } } } /* (non-Javadoc) * @see android.support.v4.app.Fragment#onResume() */ @Override public void onResume() { super.onResume(); getMMSupportMapFragment(); } /* (non-Javadoc) * @see android.support.v4.app.Fragment#onPause() */ @Override public void onPause() { super.onPause(); try { FragmentTransaction transaction = fragmentManager.beginTransaction(); transaction.remove(smfNewHotSpot); transaction.commitAllowingStateLoss(); Log.d(TAG, TAG + "fragmentManager: " + fragmentManager.findFragmentByTag(MMSDKConstants.MMSUPPORT_MAP_FRAGMENT_TAG)); Log.d(TAG, TAG + "transaction: " + transaction.isEmpty()); } catch (Exception e) { e.printStackTrace(); } } /* (non-Javadoc) * @see android.support.v4.app.Fragment#onDestroyView() */ @Override public void onDestroyView() { super.onDestroyView(); } /* (non-Javadoc) * @see com.mobmonkey.mobmonkeyandroid.utils.MMFragment#onFragmentBackPressed() */ @Override public void onFragmentBackPressed() { } /** * @throws JSONException * */ private void getMMSupportMapFragment() { Log.d(TAG, TAG + "getSupportMapFragment"); smfNewHotSpot = (MMSupportMapFragment) fragmentManager.findFragmentByTag(MMSDKConstants.MMSUPPORT_MAP_FRAGMENT_TAG); if(smfNewHotSpot == null) { Log.d(TAG, TAG + "smfNewHotSpot is null"); smfNewHotSpot = new MMSupportMapFragment() { /* (non-Javadoc) * @see android.support.v4.app.Fragment#onActivityCreated(android.os.Bundle) */ @Override public void onActivityCreated(Bundle savedInstanceState) { super.onActivityCreated(savedInstanceState); googleMap = smfNewHotSpot.getMap(); if(googleMap != null) { addToGoogleMap(); } } }; FragmentTransaction fragmentTransaction = fragmentManager.beginTransaction(); fragmentTransaction.add(R.id.flnewhotspotmap, smfNewHotSpot, MMSDKConstants.MMSUPPORT_MAP_FRAGMENT_TAG); fragmentTransaction.commit(); } } /** * */ private void addToGoogleMap() { try { locationInfo = new JSONObject(getArguments().getString(MMSDKConstants.KEY_INTENT_EXTRA_HOT_SPOT_LOCATION)); LatLng locLatLng = new LatLng(locationInfo.getDouble(MMSDKConstants.JSON_KEY_LATITUDE), locationInfo.getDouble(MMSDKConstants.JSON_KEY_LONGITUDE)); googleMap.addMarker(new MarkerOptions() .position(locLatLng) .title(locationInfo.getString(MMSDKConstants.JSON_KEY_NAME)) .snippet(locationInfo.getString(MMSDKConstants.JSON_KEY_ADDRESS)) .icon(BitmapDescriptorFactory.defaultMarker(BitmapDescriptorFactory.HUE_GREEN))); googleMap.moveCamera(CameraUpdateFactory.newLatLngZoom(locLatLng, 17)); googleMap.setMyLocationEnabled(true); googleMap.setOnMapClickListener(NewHotSpotFragment.this); } catch (JSONException e) { e.printStackTrace(); } } /** * * @throws JSONException */ private void checkFields() throws JSONException { if(checkName()) { MMLocationAdapter.createHotSpot(new CreateHotSpotCallback(), etName.getText().toString(), etDescription.getText().toString(), etRange.getText().toString(), MMSDKConstants.DEFAULT_STRING_EMPTY, getLatitude(), getLongitude(), locationInfo.getString(MMSDKConstants.JSON_KEY_CATEGORY_IDS), locationInfo.getString(MMSDKConstants.JSON_KEY_COUNTRY_CODE).toLowerCase(), locationInfo.getString(MMSDKConstants.JSON_KEY_LOCALITY), locationInfo.getString(MMSDKConstants.JSON_KEY_PHONE_NUMBER), MMConstants.PROVIDER_ID, locationInfo.getString(MMSDKConstants.JSON_KEY_REGION), locationInfo.getString(MMSDKConstants.JSON_KEY_WEBSITE), locationInfo.getString(MMSDKConstants.JSON_KEY_LOCATION_ID), locationInfo.getString(MMSDKConstants.JSON_KEY_PROVIDER_ID)); MMProgressDialog.displayDialog(getActivity(), MMSDKConstants.DEFAULT_STRING_EMPTY, getString(R.string.pd_creating_hot_spot)); } } /** * * @return */ private boolean checkName() { if(!TextUtils.isEmpty(etName.getText().toString())) { return checkRange(); } else { displayAlert(R.string.ad_message_empty_name); return false; } } /** * * @return */ private boolean checkRange() { if(!TextUtils.isEmpty(etRange.getText().toString())) { return true; } else { displayAlert(R.string.ad_message_empty_range); return false; } } /** * * @return * @throws JSONException */ private double getLatitude() throws JSONException { if(locationClicked != null) { return locationClicked.getLatitude(); } else { return locationInfo.getDouble(MMSDKConstants.JSON_KEY_LATITUDE); } } /** * * @return * @throws JSONException */ private double getLongitude() throws JSONException { if(locationClicked != null) { return locationClicked.getLongitude(); } else { return locationInfo.getDouble(MMSDKConstants.JSON_KEY_LONGITUDE); } } /** * * @param messageId */ private void displayAlert(int messageId) { new AlertDialog.Builder(getActivity()) .setTitle(R.string.app_name) .setMessage(messageId) .setNeutralButton(android.R.string.ok, null) .show(); } /** * */ private void updateHotSpotMarker() { LatLng newLocLatLng = new LatLng(locationClicked.getLatitude(), locationClicked.getLongitude()); if(newHotSpotMarker != null) { newHotSpotMarker.remove(); } newHotSpotMarker = googleMap.addMarker(new MarkerOptions() .position(newLocLatLng) .title(getString(R.string.tv_new_hot_spot))); newHotSpotMarker.showInfoWindow(); } /** * * @param result */ private void handleCreateHotSpotCallback(String result) { try { JSONObject jObj = new JSONObject(result); Log.d(TAG, TAG + "requestCode: " + requestCode); if(!jObj.has(MMSDKConstants.JSON_KEY_STATUS)) { if(requestCode == MMSDKConstants.REQUEST_CODE_MASTER_LOCATION || requestCode == MMSDKConstants.REQUEST_CODE_EXISTING_HOT_SPOTS) { fragmentMultipleBackListener.onFragmentMultipleBack(); } else if(requestCode == MMSDKConstants.REQUEST_CODE_LOCATION_DETAILS) { getActivity().onBackPressed(); } } else if(jObj.getString(MMSDKConstants.JSON_KEY_STATUS).equals(MMSDKConstants.RESPONSE_STATUS_UNAUTHORIZED_EMAIL)){ Toast.makeText(getActivity(), jObj.getString(MMSDKConstants.JSON_KEY_DESCRIPTION), Toast.LENGTH_LONG).show(); } else { Toast.makeText(getActivity(), R.string.toast_error_create_hot_spot, Toast.LENGTH_SHORT).show(); } } 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) { locationClicked = (Address) obj; Log.d(TAG, TAG + "address: " + locationClicked.toString()); updateHotSpotMarker(); } } } } /** * * @author Dezapp, LLC * */ private class CreateHotSpotCallback implements MMCallback { @Override public void processCallback(Object obj) { MMProgressDialog.dismissDialog(); if(obj != null) { Log.d(TAG, TAG + "hotspot 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 { handleCreateHotSpotCallback((String) obj); } } } } }