/*
* Copyright 2012 Javier Pérez Pacheco and Francisco Díaz Rodriguez
* TweetTopics 2.0
* javielinux@gmail.com
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package com.javielinux.fragments;
import android.content.Intent;
import android.location.Address;
import android.os.Bundle;
import android.support.v4.app.Fragment;
import android.text.Editable;
import android.text.TextWatcher;
import android.util.Log;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.*;
import com.javielinux.adapters.AddressAdapter;
import com.javielinux.api.APIDelegate;
import com.javielinux.api.APITweetTopics;
import com.javielinux.api.request.GetGeolocationAddressRequest;
import com.javielinux.api.response.BaseResponse;
import com.javielinux.api.response.ErrorResponse;
import com.javielinux.api.response.GetGeolocationAddressResponse;
import com.javielinux.database.EntitySearch;
import com.javielinux.tweettopics2.R;
import java.util.ArrayList;
public class SearchGeoFragment extends Fragment implements APIDelegate<BaseResponse> {
public static final int ACTIVITY_MAPSEARCH = 0;
private EntitySearch search_entity;
public CheckBox useGeo;
private RadioGroup typeGeo;
public RadioButton typeGeoGPS;
public RadioButton typeGeoMap;
private AutoCompleteTextView place;
public EditText latitude;
public EditText longitude;
public SeekBar distance;
private TextView distanceTxt;
private RadioGroup typeDistance;
public RadioButton typeDistanceMiles;
public RadioButton typeDistanceKM;
private LinearLayout llLocation;
private LinearLayout llMap;
private LinearLayout llDistance;
private AddressAdapter address_adapter;
private ArrayList<Address> address_list;
private int distance_value = 0;
public SearchGeoFragment(EntitySearch search_entity) {
this.search_entity = search_entity;
}
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
}
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
View view = View.inflate(getActivity(), R.layout.search_geo_fragment, null);
useGeo = (CheckBox)view.findViewById(R.id.cb_use_geo);
typeGeo = (RadioGroup)view.findViewById(R.id.rg_type_geo);
typeGeoGPS = (RadioButton)view.findViewById(R.id.rb_use_gps);
typeGeoMap = (RadioButton)view.findViewById(R.id.rb_use_map);
typeDistance = (RadioGroup)view.findViewById(R.id.rg_type_distance);
typeDistanceMiles = (RadioButton)view.findViewById(R.id.rb_distance_miles);
typeDistanceKM = (RadioButton)view.findViewById(R.id.rb_distance_km);
llLocation = (LinearLayout)view.findViewById(R.id.ll_location);
llMap = (LinearLayout)view.findViewById(R.id.ll_map);
llDistance = (LinearLayout)view.findViewById(R.id.ll_distance);
place = (AutoCompleteTextView)view.findViewById(R.id.et_place);
address_list = new ArrayList<Address>();
address_adapter = new AddressAdapter(getActivity(), address_list);
place.setAdapter(address_adapter);
place.setOnItemClickListener(new AdapterView.OnItemClickListener() {
@Override
public void onItemClick(AdapterView<?> adapterView, View view, int i, long l) {
Address address = address_adapter.getAddressItem(i);
if (address != null) {
latitude.setText(String.valueOf(address.getLatitude()));
longitude.setText(String.valueOf(address.getLongitude()));
}
}
});
latitude = (EditText)view.findViewById(R.id.et_latitude);
longitude = (EditText)view.findViewById(R.id.et_longitude);
distance = (SeekBar)view.findViewById(R.id.sb_distance);
distanceTxt = (TextView)view.findViewById(R.id.distance);
distance.setOnSeekBarChangeListener(new SeekBar.OnSeekBarChangeListener() {
@Override
public void onProgressChanged(SeekBar arg0, int arg1, boolean arg2) {
changeTextDistance(arg1);
}
@Override
public void onStartTrackingTouch(SeekBar arg0) {}
@Override
public void onStopTrackingTouch(SeekBar arg0) {}
});
useGeo.setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener() {
@Override
public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) {
if (isChecked) {
showFields();
} else {
hideFields();
}
}
});
typeGeoGPS.setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener() {
@Override
public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) {
if (isChecked){
hideFieldsMap();
}
}
});
typeGeoMap.setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener() {
@Override
public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) {
if (isChecked){
showFieldsMap();
}
}
});
typeDistanceMiles.setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener() {
@Override
public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) {
reloadTextDistance();
}
});
typeDistanceKM.setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener() {
@Override
public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) {
reloadTextDistance();
}
});
place.addTextChangedListener(new TextWatcher() {
public void onTextChanged(CharSequence s, int start, int before, int count) {
String currentText = place.getText().toString();
if (currentText.length() >= 3)
APITweetTopics.execute(getActivity(), getLoaderManager(), SearchGeoFragment.this, new GetGeolocationAddressRequest(getActivity(), currentText, false));
}
public void beforeTextChanged(CharSequence s, int start, int count, int after) {}
public void afterTextChanged(Editable editable) {}
});
populateFields();
return view;
}
@Override
public void onActivityResult(int requestCode, int resultCode, Intent intent) {
super.onActivityResult(requestCode, resultCode, intent);
switch (requestCode){
case ACTIVITY_MAPSEARCH:
if( resultCode != 0 ) {
Bundle extras = intent.getExtras();
if (extras.containsKey("longitude")) {
longitude.setText(extras.getFloat("longitude")+"");
}
if (extras.containsKey("latitude")) {
latitude.setText(extras.getFloat("latitude")+"");
}
}
break;
}
}
private void reloadTextDistance() {
changeTextDistance(distance_value);
}
private void changeTextDistance(int distance_value) {
this.distance_value = distance_value;
String t = getActivity().getString(R.string.distance) + " (" + distance_value;
if (typeDistanceMiles.isChecked())
t += " " + getActivity().getString(R.string.miles) + ")";
else
t += " " + getActivity().getString(R.string.km) + ")";
distanceTxt.setText(t);
}
private void showFieldsMap() {
place.setVisibility(View.VISIBLE);
latitude.setVisibility(View.VISIBLE);
longitude.setVisibility(View.VISIBLE);
}
private void hideFieldsMap() {
place.setVisibility(View.GONE);
latitude.setVisibility(View.GONE);
longitude.setVisibility(View.GONE);
}
private void showFields() {
llLocation.setVisibility(View.VISIBLE);
llMap.setVisibility(View.VISIBLE);
llDistance.setVisibility(View.VISIBLE);
typeGeo.setVisibility(View.VISIBLE);
typeDistance.setVisibility(View.VISIBLE);
}
private void hideFields() {
llLocation.setVisibility(View.GONE);
llMap.setVisibility(View.GONE);
llDistance.setVisibility(View.GONE);
typeGeo.setVisibility(View.GONE);
typeDistance.setVisibility(View.GONE);
}
private void populateFields() {
latitude.setText(search_entity.getString("latitude"));
longitude.setText(search_entity.getString("longitude"));
distance.setProgress(search_entity.getInt("distance_value"));
if (search_entity.getInt("use_geo") == 1) {
useGeo.setChecked(true);
showFields();
}
if (search_entity.getInt("type_geo") == 1)
typeGeoGPS.setChecked(true);
else
typeGeoMap.setChecked(true);
if (search_entity.getInt("type_distance")==1)
typeDistanceKM.setChecked(true);
else
typeDistanceMiles.setChecked(true);
reloadTextDistance();
}
@Override
public void onResults(BaseResponse response) {
GetGeolocationAddressResponse result = (GetGeolocationAddressResponse)response;
if (result.getSingleResult()) {
if (result.getAddressList().size() > 0) {
Address address = result.getAddressList().get(0);
String text = address.getAddressLine(0);
if (address.getCountryName() != null)
text = text + " (" + address.getCountryName() + ")";
place.setText(text);
latitude.setText(String.valueOf(address.getLatitude()));
longitude.setText(String.valueOf(address.getLongitude()));
}
} else {
address_list.clear();
for(Address address: result.getAddressList()) {
address_list.add(address);
}
address_adapter.notifyDataSetChanged();
}
}
@Override
public void onError(ErrorResponse error) {
Log.d(getActivity().getResources().getString(R.string.app_name) + ".0",error.getMsgError());
error.getError().printStackTrace();
}
}