/**
* galaxy inc.
* meetup client for android
*/
package com.galaxy.meetup.client.android.ui.fragments;
import android.app.Activity;
import android.content.Context;
import android.content.SharedPreferences;
import android.database.Cursor;
import android.location.Location;
import android.location.LocationListener;
import android.os.Bundle;
import android.preference.PreferenceManager;
import android.support.v4.app.LoaderManager.LoaderCallbacks;
import android.support.v4.content.Loader;
import android.text.Editable;
import android.text.TextUtils;
import android.text.TextWatcher;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.AbsListView;
import android.widget.AdapterView;
import android.widget.AdapterView.OnItemClickListener;
import android.widget.EditText;
import android.widget.ImageView;
import android.widget.ListView;
import android.widget.TextView;
import com.galaxy.meetup.client.android.EsCursorAdapter;
import com.galaxy.meetup.client.android.EsCursorLoader;
import com.galaxy.meetup.client.android.EsMatrixCursor;
import com.galaxy.meetup.client.android.LocationController;
import com.galaxy.meetup.client.android.R;
import com.galaxy.meetup.client.android.api.LocationQuery;
import com.galaxy.meetup.client.android.content.DbLocation;
import com.galaxy.meetup.client.android.content.EsAccount;
import com.galaxy.meetup.client.android.content.EsProvider;
import com.galaxy.meetup.client.android.service.EsService;
import com.galaxy.meetup.client.util.LocationUtils;
import com.galaxy.meetup.client.util.SoftInput;
import com.galaxy.meetup.server.client.domain.Place;
/**
*
* @author sihai
*
*/
public class EventLocationFragment extends EsListFragment implements
LoaderCallbacks, TextWatcher, OnItemClickListener {
private static final String LOCATION_PROJECTION[] = {
"_id", "type", "title", "description", "location"
};
private double mCurrentLatitude;
private double mCurrentLongitude;
private String mInitialQuery;
private OnLocationSelectedListener mListener;
private LocationController mLocationController;
private LocationListener mLocationListener;
private LocationQuery mLocationQuery;
private EditText mLocationText;
private String mQuery;
public EventLocationFragment() {
mLocationListener = new LocationListener() {
public final void onLocationChanged(Location location) {
removeLocationListener();
locationChanged(location.getLatitude(), location.getLongitude());
}
public final void onProviderDisabled(String s) {
}
public final void onProviderEnabled(String s) {
}
public final void onStatusChanged(String s, int i, Bundle bundle) {
}
};
}
private void buildLocationQuery() {
if (!TextUtils.isEmpty(mQuery) && isCurrentLocationKnown()) {
Location location = new Location((String) null);
location.setLatitude(mCurrentLatitude);
location.setLongitude(mCurrentLongitude);
mLocationQuery = new LocationQuery(location, mQuery);
} else {
mLocationQuery = null;
}
}
private EsAccount getAccount() {
return (EsAccount) getActivity().getIntent().getExtras().get("account");
}
private boolean isCurrentLocationKnown() {
return mCurrentLatitude != 0.0D && mCurrentLongitude != 0.0D;
}
private void removeLocationListener() {
if (mLocationController != null) {
mLocationController.release();
mLocationController = null;
}
}
private void runQuery() {
if (mLocationQuery != null) {
getLoaderManager().restartLoader(0, null, this);
EsService.getNearbyLocations(getActivity(), getAccount(), mLocationQuery);
}
}
private void updateAdapter(Cursor cursor) {
EsMatrixCursor esmatrixcursor = new EsMatrixCursor(LOCATION_PROJECTION);
if(TextUtils.isEmpty(mQuery)) {
Object aobj3[] = new Object[5];
aobj3[0] = Integer.valueOf(1);
aobj3[1] = Integer.valueOf(0);
aobj3[2] = getString(R.string.event_location_none_title);
aobj3[3] = getString(R.string.event_location_none_description);
aobj3[4] = null;
esmatrixcursor.addRow(aobj3);
} else {
Object aobj[] = new Object[5];
int i = 1 + 1;
aobj[0] = Integer.valueOf(1);
aobj[1] = Integer.valueOf(1);
int j = R.string.event_location_add;
Object aobj1[] = new Object[1];
aobj1[0] = mQuery;
aobj[2] = getString(j, aobj1);
aobj[3] = null;
aobj[4] = null;
esmatrixcursor.addRow(aobj);
if(cursor != null && cursor.moveToFirst())
do
{
byte abyte0[] = cursor.getBlob(0);
DbLocation dblocation = DbLocation.deserialize(abyte0);
if(dblocation != null)
{
Object aobj2[] = new Object[5];
int k = i + 1;
aobj2[0] = Integer.valueOf(i);
aobj2[1] = Integer.valueOf(2);
aobj2[2] = dblocation.getName();
aobj2[3] = dblocation.getBestAddress();
aobj2[4] = abyte0;
esmatrixcursor.addRow(aobj2);
i = k;
}
} while(cursor.moveToNext());
}
mAdapter.swapCursor(esmatrixcursor);
}
public void afterTextChanged(Editable editable) {
}
public void beforeTextChanged(CharSequence charsequence, int i, int j, int k) {
}
/**
* 当fragment添加到activity中时,会调用fragment的方法onAttach()
*/
public final void onAttach(Activity activity) {
super.onAttach(activity);
if (!isCurrentLocationKnown()) {
SharedPreferences sharedpreferences = PreferenceManager.getDefaultSharedPreferences(getActivity());
if (sharedpreferences.contains("event.current.latitude")) {
mCurrentLatitude = Double.parseDouble(sharedpreferences.getString("event.current.latitude", "0"));
mCurrentLongitude = Double.parseDouble(sharedpreferences.getString("event.current.longitude", "0"));
}
}
}
public final void onCreate(Bundle bundle) {
super.onCreate(bundle);
if (bundle != null) {
mQuery = bundle.getString("query");
mCurrentLatitude = bundle.getDouble("latitude");
mCurrentLongitude = bundle.getDouble("longitude");
buildLocationQuery();
}
getLoaderManager().initLoader(0, null, this);
}
public final Loader onCreateLoader(int i, Bundle bundle) {
String s;
android.net.Uri uri;
if(mLocationQuery == null)
s = "no_location_stream_key";
else
s = mLocationQuery.getKey();
uri = EsProvider.buildLocationQueryUri(getAccount(), s);
return new EsCursorLoader(getActivity(), uri, new String[] {
"location"
}, null, null, null);
}
public final View onCreateView(LayoutInflater layoutinflater, ViewGroup viewgroup, Bundle bundle) {
View view = super.onCreateView(layoutinflater, viewgroup, bundle, R.layout.event_location_fragment);
mAdapter = new EventLocationAdapter(getActivity());
((ListView)mListView).setAdapter(mAdapter);
((ListView)mListView).setOnItemClickListener(this);
mLocationText = (EditText)view.findViewById(R.id.location_text);
mLocationText.addTextChangedListener(this);
mLocationText.setText(mInitialQuery);
return view;
}
public final View onCreateView(LayoutInflater layoutinflater, ViewGroup viewgroup, Bundle bundle, int i) {
return super.onCreateView(layoutinflater, viewgroup, bundle, i);
}
public final void onDestroyView() {
super.onDestroyView();
}
public void onItemClick(AdapterView adapterview, View view, int i, long l) {
Cursor cursor = (Cursor)mAdapter.getItem(i);
int value = cursor.getInt(1);
Place place = null;
if(0 == value) {
place = null;
} else if (1 == value) {
place = new Place();
place.name = mQuery;
} else {
byte abyte0[] = cursor.getBlob(4);
if(abyte0 != null)
place = LocationUtils.convertLocationToPlace(DbLocation.deserialize(abyte0).toProtocolObject());
else
place = null;
}
SoftInput.hide(getView());
if(mListener != null)
mListener.onLocationSelected(place);
}
public final void onLoadFinished(Loader loader, Object obj) {
updateAdapter((Cursor)obj);
}
public final void onLoaderReset(Loader loader) {
}
public final void onPause() {
super.onPause();
removeLocationListener();
}
public final void onResume() {
super.onResume();
if(mLocationController == null)
mLocationController = new LocationController(getActivity(), getAccount(), true, 3000L, null, mLocationListener);
if(mLocationController.isProviderEnabled())
mLocationController.init();
}
public final void onSaveInstanceState(Bundle bundle) {
super.onSaveInstanceState(bundle);
bundle.putString("query", mQuery);
bundle.putDouble("latitude", mCurrentLatitude);
bundle.putDouble("longitude", mCurrentLongitude);
}
public void onScroll(AbsListView abslistview, int i, int j, int k) {
super.onScroll(abslistview, i, j, k);
}
public void onScrollStateChanged(AbsListView abslistview, int i) {
super.onScrollStateChanged(abslistview, i);
}
public void onTextChanged(CharSequence charsequence, int i, int j, int k) {
String s = mLocationText.getText().toString().trim();
if (!TextUtils.equals(mQuery, s)) {
mQuery = s;
if (isAdded()) {
updateAdapter(null);
buildLocationQuery();
runQuery();
}
}
}
public final void setInitialQueryString(String s){
mInitialQuery = s;
}
public final void setOnLocationSelectedListener(OnLocationSelectedListener onlocationselectedlistener) {
mListener = onlocationselectedlistener;
}
/**
*
* @param latitude
* @param longitude
*/
private void locationChanged(double latitude, double longitude) {
if(isCurrentLocationKnown()) {
float result[] = new float[1];
Location.distanceBetween(mCurrentLatitude, mCurrentLongitude, latitude, longitude, result);
if(result[0] < 200F) {
return;
}
}
mCurrentLatitude = latitude;
mCurrentLongitude = longitude;
android.content.SharedPreferences.Editor editor = PreferenceManager.getDefaultSharedPreferences(getActivity()).edit();
editor.putString("event.current.latitude", Double.toString(mCurrentLatitude));
editor.putString("event.current.longitude", Double.toString(mCurrentLongitude));
if(android.os.Build.VERSION.SDK_INT >= 9)
editor.apply();
else
editor.commit();
buildLocationQuery();
runQuery();
}
//==================================================================================================================
// Inner class
//==================================================================================================================
private static final class EventLocationAdapter extends EsCursorAdapter {
public final void bindView(View view, Context context, Cursor cursor) {
ImageView imageview;
TextView textview;
TextView textview1;
imageview = (ImageView)view.findViewById(0x1020006);
textview = (TextView)view.findViewById(0x1020016);
textview1 = (TextView)view.findViewById(0x1020005);
int value = cursor.getInt(1);
if(0 == value) {
imageview.setVisibility(0);
imageview.setImageResource(R.drawable.ic_location_none);
} else if(1 == value) {
imageview.setVisibility(8);
} else if(2 == value) {
imageview.setVisibility(0);
imageview.setImageResource(R.drawable.ic_location_grey);
}
textview.setText(cursor.getString(2));
String s = cursor.getString(3);
if(!TextUtils.isEmpty(s))
{
textview1.setVisibility(0);
textview1.setText(s);
} else
{
textview1.setVisibility(8);
}
}
public final View newView(Context context, Cursor cursor, ViewGroup viewgroup)
{
return LayoutInflater.from(context).inflate(R.layout.location_row_layout, viewgroup, false);
}
public EventLocationAdapter(Context context)
{
super(context, null);
}
}
public static interface OnLocationSelectedListener {
void onLocationSelected(Place place);
}
}