package com.odc.beachodc.fragments; import android.app.Activity; import android.app.ProgressDialog; import android.content.Context; import android.content.Intent; import android.location.Address; import android.location.Geocoder; import android.location.Location; import android.os.Bundle; import android.support.v4.app.Fragment; import android.text.Editable; import android.text.TextWatcher; import android.view.InflateException; import android.view.LayoutInflater; import android.view.View; import android.view.ViewGroup; import android.view.inputmethod.InputMethodManager; import android.widget.AdapterView; import android.widget.ArrayAdapter; import android.widget.AutoCompleteTextView; import android.widget.Button; import android.widget.EditText; import android.widget.RadioGroup; import android.widget.RelativeLayout; import android.widget.Toast; import com.facebook.android.Util; import com.google.android.gms.common.GooglePlayServicesNotAvailableException; import com.google.android.gms.maps.CameraUpdate; import com.google.android.gms.maps.CameraUpdateFactory; import com.google.android.gms.maps.GoogleMap; import com.google.android.gms.maps.MapsInitializer; import com.google.android.gms.maps.SupportMapFragment; import com.google.android.gms.maps.model.BitmapDescriptorFactory; 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.odc.beachodc.R; import com.odc.beachodc.activities.BuscarPlaya; import com.odc.beachodc.activities.ResultadoBusquedaPlaya; import com.odc.beachodc.interfaces.IStandardTaskListener; import com.odc.beachodc.utilities.Utilities; import com.odc.beachodc.utilities.ValidacionPlaya; import com.odc.beachodc.utilities.placeAutocomplete.DetailsPlaceOne; import com.odc.beachodc.utilities.placeAutocomplete.FillPlace; import com.odc.beachodc.webservices.Request; import java.util.List; import java.util.Locale; import de.keyboardsurfer.android.widget.crouton.Crouton; import de.keyboardsurfer.android.widget.crouton.Style; /** * Created by Paco on 7/01/14. * Fragment que se encarga de Loguear al usuario, es el splash screen inicial de login */ public class BuscarPlayaFragment extends Fragment { View rootView; private DetailsPlaceOne geoLugar; private FillPlace buscarLugar; private Thread thread; private ProgressDialog pd; GoogleMap mapa; Location myLocation; Button buscarBTN; RelativeLayout groupAddress; public BuscarPlayaFragment() { // Se ejecuta antes que el onCreateView } @Override public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { // Para evitar problemas al inflar Layout con Map Fragments... y reutilizar mejor los fragments if (rootView != null) { ViewGroup parent = (ViewGroup) rootView.getParent(); if (parent != null) parent.removeView(rootView); } try { rootView = inflater.inflate(R.layout.fragment_buscar_playas, container, false); } catch (InflateException e) {} // Empezar aqui a trabajar con la UI ValidacionPlaya.busqueda = (RadioGroup) rootView.findViewById(R.id.searchRG); ValidacionPlaya.nombrePlaya = (EditText) rootView.findViewById(R.id.nombreET); groupAddress = (RelativeLayout) rootView.findViewById(R.id.groupSearchByAddress); try { MapsInitializer.initialize(getActivity()); initMapa(); } catch (GooglePlayServicesNotAvailableException e) {} ValidacionPlaya.direccion = (AutoCompleteTextView) rootView.findViewById(R.id.addressET); ValidacionPlaya.porCercania = null; initAutocompletadoDireccion(); buscarBTN = (Button) rootView.findViewById(R.id.buscarBTN); buscarBTN.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View view) { Utilities.buscarPlaya (ValidacionPlaya.busqueda, ValidacionPlaya.nombrePlaya, getActivity(), ValidacionPlaya.porCercania, ValidacionPlaya.direccion, ValidacionPlaya.playa); } }); ValidacionPlaya.busqueda.setOnCheckedChangeListener(new RadioGroup.OnCheckedChangeListener() { @Override public void onCheckedChanged(RadioGroup group, int checkedId) { if (checkedId == R.id.searchByName) { ocultarBusquedaNombre(false); } else if (checkedId == R.id.searchByAddress){ ocultarBusquedaNombre(true); } else { ocultarBusquedaNombre(false); } } }); return rootView; } private void initMapa(){ mapa = ((SupportMapFragment) getFragmentManager().findFragmentById(R.id.map)).getMap(); if (mapa==null) return; mapa.setMyLocationEnabled(true); mapa.setOnMyLocationChangeListener(new GoogleMap.OnMyLocationChangeListener() { @Override public void onMyLocationChange(Location arg0) { myLocation=arg0; } }); mapa.setOnMyLocationButtonClickListener(new GoogleMap.OnMyLocationButtonClickListener() { @Override public boolean onMyLocationButtonClick() { if (myLocation != null){ try { InputMethodManager imm = (InputMethodManager)getActivity().getSystemService(Context.INPUT_METHOD_SERVICE); try { imm.hideSoftInputFromWindow(getActivity().getWindow().getCurrentFocus().getWindowToken(), 0); } catch (Exception e){} Geocoder geoCoder = new Geocoder(getActivity(), Locale.getDefault()); Double lat = myLocation.getLatitude(); Double lng = myLocation.getLongitude(); List<Address> addresses = geoCoder.getFromLocation(lat, lng, 1); String add = ""; if (addresses.size() > 0){ for (int i=0; i<addresses.get(0).getMaxAddressLineIndex();i++) add += addresses.get(0).getAddressLine(i) + " "; } mapa.clear(); ValidacionPlaya.direccion.setText(add); ValidacionPlaya.porCercania = new LatLng(lat, lng); mapa.addMarker(new MarkerOptions() .position(new LatLng(lat, lng)) .title(add) .draggable(true) .icon(BitmapDescriptorFactory.fromResource(R.drawable.aqui))); } catch (Exception e) {} } return false; } }); mapa.setOnMapLongClickListener(new GoogleMap.OnMapLongClickListener() { public void onMapLongClick(LatLng point) { InputMethodManager imm = (InputMethodManager)getActivity().getSystemService(Context.INPUT_METHOD_SERVICE); try { imm.hideSoftInputFromWindow(getActivity().getWindow().getCurrentFocus().getWindowToken(), 0); } catch (Exception e){} Geocoder geoCoder = new Geocoder(getActivity(), Locale.getDefault()); try { List<Address> addresses = geoCoder.getFromLocation(point.latitude, point.longitude, 1); String add = ""; if (addresses.size() > 0){ for (int i=0; i<addresses.get(0).getMaxAddressLineIndex();i++) add += addresses.get(0).getAddressLine(i) + " "; } ValidacionPlaya.direccion.setText(add); ValidacionPlaya.porCercania = new LatLng(point.latitude, point.longitude); mapa.clear(); // Insertamos el Marcador mapa.addMarker(new MarkerOptions() .position(new LatLng(point.latitude, point.longitude)) .title(add) .draggable(true) .icon(BitmapDescriptorFactory.fromResource(R.drawable.aqui))); } catch (Exception e) { } } }); mapa.setOnMarkerDragListener(new GoogleMap.OnMarkerDragListener() { @Override public void onMarkerDragStart(Marker marker) { marker.hideInfoWindow(); marker.setTitle(""); } @Override public void onMarkerDragEnd(Marker marker) { LatLng newPosition = marker.getPosition(); Geocoder geoCoder = new Geocoder(getActivity(), Locale.getDefault()); try { List<Address> addresses = geoCoder.getFromLocation(newPosition.latitude, newPosition.longitude, 1); String add = ""; if (addresses.size() > 0){ for (int i=0; i<addresses.get(0).getMaxAddressLineIndex();i++) add += addresses.get(0).getAddressLine(i) + " "; } mapa.clear(); mapa.addMarker(new MarkerOptions() .position(new LatLng(newPosition.latitude, newPosition.longitude)) .title(add) .draggable(true) .icon(BitmapDescriptorFactory.fromResource(R.drawable.aqui))); ValidacionPlaya.direccion.setText(add); ValidacionPlaya.porCercania = new LatLng(newPosition.latitude, newPosition.longitude); } catch (Exception e) { } } @Override public void onMarkerDrag(Marker marker) {} }); } public void initAutocompletadoDireccion(){ final ArrayAdapter<String> adapterFrom = new ArrayAdapter<String>(getActivity(), android.R.layout.simple_list_item_1); adapterFrom.setNotifyOnChange(true); ValidacionPlaya.direccion.setAdapter(adapterFrom); ValidacionPlaya.direccion.setOnItemClickListener(new AdapterView.OnItemClickListener() { @Override public void onItemClick(AdapterView<?> arg0, View arg1, int arg2, long arg3) { geoLugar = new DetailsPlaceOne(); geoLugar.setContext(arg1.getContext()); thread= new Thread(){ @Override public void run(){ try { synchronized(this){ wait(700); } } catch(InterruptedException ex){ } pd.dismiss(); if ((buscarLugar.referencesPlace.isEmpty()) || (buscarLugar.referencesPlace.get(ValidacionPlaya.direccion.getText().toString()) == null)){ showToastError(); } else { geoLugar.setListener(new PlaceToPointMap_TaskListener(ValidacionPlaya.direccion.getText().toString())); geoLugar.execute(buscarLugar.referencesPlace.get(ValidacionPlaya.direccion.getText().toString())); } } }; pd = ProgressDialog.show(getActivity(), getResources().getText(R.string.procesando), getResources().getText(R.string.esperar)); pd.setIndeterminate(false); pd.setCancelable(true); thread.start(); } }); // Monitorizamos el evento de cambio en el campo a autocompletar para buscar las propuestas de autocompletado ValidacionPlaya.direccion.addTextChangedListener(new TextWatcher() { public void onTextChanged(CharSequence s, int start, int before, int count) { // Calculamos el autocompletado if (count%3 == 1){ adapterFrom.clear(); // Ejecutamos en segundo plano la busqueda de propuestas de autocompletado buscarLugar = new FillPlace(adapterFrom, ValidacionPlaya.direccion, getActivity()); buscarLugar.execute(ValidacionPlaya.direccion.getText().toString()); } } public void beforeTextChanged(CharSequence s, int start, int count, int after) {} public void afterTextChanged(Editable s) {} }); } private class PlaceToPointMap_TaskListener implements IStandardTaskListener { private String markerStr; public PlaceToPointMap_TaskListener(String markerStr) { this.markerStr = markerStr; } @Override public void taskComplete(Object result) { if ((Boolean)result){ Double lat, lng; // Esconder teclado para que se vea la animación del mapa InputMethodManager imm = (InputMethodManager)getActivity().getSystemService(Context.INPUT_METHOD_SERVICE); try { imm.hideSoftInputFromWindow(getActivity().getWindow().getCurrentFocus().getWindowToken(), 0); } catch (Exception e){} // Recogemos la posicion que hemos pedido al Web Service de Google Place lat = geoLugar.coordinates.get("lat"); lng = geoLugar.coordinates.get("lng"); if ((lat == null) || (lng == null)) return; else{ ValidacionPlaya.porCercania = new LatLng(lat, lng); } LatLng go = new LatLng(lat, lng); ValidacionPlaya.direccion.setText(markerStr); // Creamos la animación de movimiento hacia el lugar que hemos introducido CameraPosition camPos = new CameraPosition.Builder() .target(go) .zoom(18) //Establecemos el zoom en 17 .tilt(45) //Bajamos el punto de vista de la cámara 70 grados .build(); // Lanzamos el movimiento CameraUpdate camUpd = CameraUpdateFactory.newCameraPosition(camPos); mapa.animateCamera(camUpd); mapa.clear(); mapa.addMarker(new MarkerOptions() .position(new LatLng(lat, lng)) .title(markerStr) .draggable(true) .icon(BitmapDescriptorFactory.fromResource(R.drawable.aqui))); } } } public void showToastError(){ getActivity().runOnUiThread(new Runnable() { public void run() { Toast.makeText(getActivity(), R.string.error_problemautocompletado, Toast.LENGTH_LONG).show(); } }); } public void ocultarBusquedaNombre (boolean ocultar){ try { if (ocultar) { ValidacionPlaya.nombrePlaya.setVisibility(View.GONE); groupAddress.setVisibility(View.VISIBLE); } else { groupAddress.setVisibility(View.GONE); ValidacionPlaya.nombrePlaya.setVisibility(View.VISIBLE); } } catch (Exception e){} } }