package net.naonedbus.loader;
import java.io.IOException;
import java.net.MalformedURLException;
import java.util.ArrayList;
import java.util.List;
import net.naonedbus.BuildConfig;
import net.naonedbus.NBApplication;
import net.naonedbus.R;
import net.naonedbus.bean.AddressResult;
import net.naonedbus.bean.Equipement;
import net.naonedbus.bean.Equipement.Type;
import net.naonedbus.bean.async.AsyncResult;
import net.naonedbus.manager.impl.EquipementManager;
import net.naonedbus.rest.controller.impl.PlacesController;
import net.naonedbus.utils.FormatUtils;
import org.apache.http.HttpException;
import org.json.JSONException;
import android.content.Context;
import android.graphics.Color;
import android.location.Address;
import android.location.Location;
import android.os.Bundle;
import android.support.v4.content.AsyncTaskLoader;
import android.text.TextUtils;
import android.util.Log;
public class PlacesLoader extends AsyncTaskLoader<AsyncResult<List<AddressResult>>> {
private static final String TAG = "PlacesLoader";
private static final boolean DBG = BuildConfig.DEBUG;
private static final String KEYWORD = "keyword";
private static final String LOAD_ADDRESS = "loadAddress";
public static final Bundle create(final String keyword, boolean loadAddress) {
final Bundle bundle = new Bundle();
bundle.putString(KEYWORD, keyword);
bundle.putBoolean(LOAD_ADDRESS, loadAddress);
return bundle;
}
private final EquipementManager mEquipementManager;
private final String mKeyword;
private final boolean mLoadAddress;
private AsyncResult<List<AddressResult>> mResult;
public PlacesLoader(final Context context, final Bundle bundle) {
super(context);
mKeyword = bundle.getString(KEYWORD);
mLoadAddress = bundle.getBoolean(LOAD_ADDRESS);
mEquipementManager = EquipementManager.getInstance();
}
@Override
public AsyncResult<List<AddressResult>> loadInBackground() {
if (DBG)
Log.d(TAG, "loadInBackground " + mKeyword);
final AsyncResult<List<AddressResult>> result = new AsyncResult<List<AddressResult>>();
final List<AddressResult> addressResults = new ArrayList<AddressResult>();
addCurrentLocation(addressResults);
if (!TextUtils.isEmpty(mKeyword)) {
addEquipements(mKeyword, addressResults);
if (mLoadAddress) {
addAddresses(mKeyword, addressResults);
}
}
result.setResult(addressResults);
return result;
}
private void addCurrentLocation(final List<AddressResult> result) {
final Location currentLocation = NBApplication.getLocationProvider().getLastLocation();
final Address lastKnownAddress = NBApplication.getLocationProvider().getLastKnownAddress();
if (currentLocation != null && lastKnownAddress != null && currentLocation.getLatitude() != 0
&& currentLocation.getLongitude() != 0) {
final String title = FormatUtils.formatAddress(lastKnownAddress, null);
final int icon = R.drawable.ic_action_locate_selector;
final AddressResult addressResult = new AddressResult(title, null, null, icon, Color.TRANSPARENT,
currentLocation.getLatitude(), currentLocation.getLongitude());
addressResult.setCurrentLocation(true);
addressResult.setSection(7);
result.add(addressResult);
}
}
private void addAddresses(String filter, List<AddressResult> result) {
try {
final PlacesController placesController = new PlacesController();
List<AddressResult> addresses = placesController.getPlaces(getContext().getResources(), mKeyword);
if (addresses != null) {
result.addAll(addresses);
}
} catch (final MalformedURLException e) {
e.printStackTrace();
} catch (final IOException e) {
e.printStackTrace();
} catch (final JSONException e) {
e.printStackTrace();
} catch (final HttpException e) {
e.printStackTrace();
}
}
private void addEquipements(final String filter, final List<AddressResult> result) {
final List<Equipement> equipements = mEquipementManager.getEquipementsByName(getContext().getContentResolver(),
null, filter);
for (final Equipement equipement : equipements) {
final Type type = equipement.getType();
final String title = equipement.getNom();
final String description = equipement.getAdresse();
final int color = getContext().getResources().getColor(type.getBackgroundColorRes());
final AddressResult addressResult = new AddressResult(title, description, type, type.getDrawableRes(),
color, equipement.getLatitude(), equipement.getLongitude());
addressResult.setSection(type.getId() + 1);
result.add(addressResult);
}
}
/**
* Called when there is new data to deliver to the client. The super class
* will take care of delivering it; the implementation here just adds a
* little more logic.
*/
@Override
public void deliverResult(final AsyncResult<List<AddressResult>> result) {
mResult = result;
if (isStarted()) {
// If the Loader is currently started, we can immediately
// deliver its results.
try {
super.deliverResult(result);
} catch (final NullPointerException e) {
}
}
}
/**
* Handles a request to start the Loader.
*/
@Override
protected void onStartLoading() {
if (mResult != null) {
// If we currently have a result available, deliver it
// immediately.
deliverResult(mResult);
}
if (takeContentChanged() || mResult == null) {
// If the data has changed since the last time it was loaded
// or is not currently available, start a load.
forceLoad();
}
}
}