package edu.mit.mitmobile2.objs; import java.util.ArrayList; import java.util.HashMap; import java.util.Timer; import java.util.TimerTask; import android.annotation.SuppressLint; import android.content.Context; import android.os.Handler; import android.os.Message; import android.util.Log; import edu.mit.mitmobile2.MobileWebApi; import edu.mit.mitmobile2.shuttles.ShuttleModel; public class ShuttleMapUpdater extends MapUpdater { Timer timer; RouteItem routeItem; private static int STATUS_RUNNING = 0; private static int STATUS_COMPLETED = 1; private int status = ShuttleMapUpdater.STATUS_COMPLETED; private static final String TAG = "ShuttleMapUpdater"; private static int updateInterval = 20000; // time between update calls @Override public void updateMap(Context mContext) { Log.d(TAG,"updateMap()"); routeItem = new RouteItem(); routeItem.route_id = (String)params.get("route_id"); // debug Log.d(TAG,"fetchRouteDetails from ShuttleMapUpdater"); ShuttleModel.fetchRouteDetails(mContext, routeItem, uiHandler); } @Override public void init(Context mContext, HashMap<String, Object> mParams,Handler mHandler) { // TODO Auto-generated method stub Log.d(TAG,"init()"); super.init(mContext, mParams,mHandler); this.context = mContext; MyTimerTask myTask = new MyTimerTask(); timer = new Timer(); timer.schedule(myTask, updateInterval, updateInterval); } class MyTimerTask extends TimerTask { @Override public void run() { if (status != STATUS_RUNNING) { status = ShuttleMapUpdater.STATUS_RUNNING; Log.d(TAG,"status = " + status); Log.d(TAG,"MyTimerTask: run"); updateMap(context); } else { Log.d(TAG,"waiting for update to complete"); } } } @Override public void stop() { timer.cancel(); } @SuppressLint("HandlerLeak") public Handler uiHandler = new Handler() { @Override public void handleMessage(Message msg) { if (msg.arg1 == MobileWebApi.SUCCESS) { // get the route item returned by fetchRouteDetails routeItem = (RouteItem)msg.obj; //RouteItem updatedRouteItem = ShuttleModel.getUpdatedRoute(routeItem); // Convert the routeItem to a mapData object HashMap<String,ArrayList<? extends MapItem>> layers = ShuttleModel.buildShuttleItems(routeItem); // create a new message with the mapData object Message mapMessage = new Message(); mapMessage.arg1 = MobileWebApi.SUCCESS; mapMessage.obj = layers; // send the mapMessage to the mapUpdateUiHandler handler.sendMessage(mapMessage); status = ShuttleMapUpdater.STATUS_COMPLETED; } else if (msg.arg1 == MobileWebApi.ERROR) { } else if (msg.arg1 == MobileWebApi.CANCELLED) { } } }; }