package com.android_mvc.framework.gps;
import com.android_mvc.framework.common.FWUtil;
import com.android_mvc.framework.task.SequentialEventTask;
import android.content.Context;
import android.location.Location;
import android.location.LocationListener;
import android.location.LocationManager;
import android.os.Bundle;
import android.os.Looper;
/**
* 逐次非同期で自分の現在地を取得するためのクラス。
* 地名変換処理は別の非同期タスクで実行すること。
* @author id:language_and_engineering
*
*/
public abstract class GetMyLocationEventTask extends SequentialEventTask implements LocationListener
{
private LocationManager mLocationManager;
private Context context;
private boolean continue_tasks_flag;
public GetMyLocationEventTask(Context context) {
this.context = context;
}
/**
* 位置情報を取得したときの処理を記述する。
*/
protected abstract boolean onLocationReceived( Location location );
// -------- 非同期タスクとしての性質 --------
@Override
public void kickEventAndWait()
{
// GPS機能を呼び出し
mLocationManager = (LocationManager) context.getSystemService(Context.LOCATION_SERVICE);
if (mLocationManager != null) {
// 別スレッドでGPSを呼ぶので,明示的にLooperが必要
Looper looper = Looper.getMainLooper();
// @see http://d.hatena.ne.jp/terurou/20110825
// http://www.stevenmarkford.com/cant-create-handler-inside-thread-that-has-not-called-looper-prepare-in-android/
// 現在地取得をリクエストし,応答を待つ
mLocationManager.requestLocationUpdates(
LocationManager.GPS_PROVIDER,
0,
0,
this,
looper
);
FWUtil.d("LocationManagerの処理を開始。位置変更の検出を待っています・・・");
// onLocationChangedが呼ばれるまで待機。
}
}
// -------- GPS処理クラスとしての性質 --------
// 位置情報取得時に呼ばれる。呼ばれるまで時間がかかるかも。
@Override
public void onLocationChanged(Location location)
{
FWUtil.d("位置変更を検出");
FWUtil.d("GPS:Latitude" + String.valueOf(location.getLatitude()));
FWUtil.d("GPS:Longitude" + String.valueOf(location.getLongitude()));
// GPS処理をクローズ
mLocationManager.removeUpdates(this);
// http://d.hatena.ne.jp/glass-_-onion/20101113/1289615195
// 取得したlocationを実装側に引き渡して処理させる。タスク継続の可否を返却させる
continue_tasks_flag = onLocationReceived( location );
// このタスクを終了し,ランナー側に制御を戻す
endEventAndBackToRunner(continue_tasks_flag);
}
@Override
public void onProviderDisabled(String provider) {
// TODO:異常系
}
@Override
public void onProviderEnabled(String provider) {
}
@Override
public void onStatusChanged(String provider, int status, Bundle extras) {
}
}