/**
* Copyright (C) 2009 Anders Aagaard <aagaande@gmail.com>
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
*
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program. If not, see <http://www.gnu.org/licenses/>.
*/
package com.neuron.trafikanten.tasks;
import android.app.Activity;
import android.app.Dialog;
import android.content.DialogInterface;
import android.content.DialogInterface.OnCancelListener;
import android.os.Handler;
import android.view.View;
import android.view.View.OnClickListener;
import android.view.Window;
import android.widget.Button;
import android.widget.TextView;
import android.widget.Toast;
import com.google.android.AnalyticsUtils;
import com.neuron.trafikanten.R;
import com.neuron.trafikanten.dataProviders.IGenericProviderHandler;
import com.neuron.trafikanten.dataSets.LocationData;
import com.neuron.trafikanten.locationProviders.google.TrafikantenLocationProvider;
import com.neuron.trafikanten.tasks.handlers.ReturnCoordinatesHandler;
/*
* Calculate our location, and search for a station
*/
public class LocationTask implements GenericTask {
private TrafikantenLocationProvider locationProvider;
private Activity activity;
private ReturnCoordinatesHandler handler;
private TextView message;
/*
* Coordinates:
*/
private double latitude;
private double longitude;
/*
* Dialog related
*/
private Dialog dialog;
private Button continueButton;
private Handler buttonRefresher = new Handler();
private long showContinueAfterMs = 20000;
public LocationTask(Activity activity, ReturnCoordinatesHandler handler)
{
this.activity = activity;
AnalyticsUtils.getInstance(activity).trackPageView("/task/location");
this.handler = handler;
showDialog();
}
private Runnable updateButton = new Runnable() {
@Override
public void run() {
showContinueAfterMs = showContinueAfterMs - 5000;
if (showContinueAfterMs <= 0 && latitude != 0) {
continueButton.setVisibility(View.VISIBLE);
} else {
buttonRefresher.postDelayed(updateButton, 5000);
continueButton.setVisibility(View.GONE);
}
}
};
private void showDialog() {
dialog = new Dialog(activity);
dialog.requestWindowFeature(Window.FEATURE_NO_TITLE);
dialog.setContentView(R.layout.dialog_waitlocation);
message = (TextView) dialog.findViewById(R.id.message);
message.setText(R.string.locationWaiting);
/*
* Setup continue button
*/
continueButton = (Button) dialog.findViewById(R.id.continueButton);
continueButton.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
returnLocation();
dialog.dismiss();
}
});
updateButton.run();
locationProvider = new TrafikantenLocationProvider(activity, new IGenericProviderHandler<LocationData>() {
@Override
public void onExtra(int what, Object obj) {
/* Class has no extra data */
}
@Override
public void onData(LocationData data) {
LocationTask.this.latitude = data.latitude;
LocationTask.this.longitude = data.longitude;
message.setText(activity.getText(R.string.locationWaiting).toString() + "\n" + activity.getText(R.string.current) + " " + data.accuracy + "m");
if (TrafikantenLocationProvider.SETTING_LOCATION_ACCURACY > data.accuracy && data.accuracy > 0) {
/*
* Return instant location ok only if accuracy is enough, and it's not a cached gps location (accuracy 0.0 meters)
*/
AnalyticsUtils.getInstance(activity).trackEvent("Task", "FoundLocation", null, (int)data.accuracy);
returnLocation();
dialog.dismiss();
}
}
@Override
public void onPostExecute(Exception e) {
// not needed
}
@Override
public void onPreExecute() {
// not needed
}
});
/*
* Handler onCancel
*/
dialog.setOnCancelListener(new OnCancelListener() {
@Override
public void onCancel(DialogInterface dialog) {
locationProvider.kill();
handler.onCanceled();
}
});
dialog.show();
}
private void returnLocation()
{
locationProvider.kill();
if (latitude == 0) {
Toast.makeText(activity, R.string.noLocationFoundError, Toast.LENGTH_SHORT).show();
return;
}
handler.onFinished(latitude, longitude);
}
@Override
public void stop() {
AnalyticsUtils.getInstance(activity).trackEvent("Task", "FoundLocation", null, -1);
locationProvider.kill();
handler.onCanceled();
dialog.dismiss();
}
}