BusRouteController.java :  » App » vanbus » org » niclab » vanbus » activity » controller » Android Open Source

Android Open Source » App » vanbus 
vanbus » org » niclab » vanbus » activity » controller » BusRouteController.java
/*******************************************************************************
 * Copyright (c) 2010 liw.
 * All rights reserved. 
 * 
 * This file is part of VanBus.
 * 
 *     VanBus 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.
 * 
 *     VanBus 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 VanBus.  If not, see <http://www.gnu.org/licenses/>.
 * Contributors:
 *     liw - initial API and implementation
 ******************************************************************************/
package org.niclab.vanbus.activity.controller;

import java.util.ArrayList;
import java.util.Date;
import java.util.HashSet;
import java.util.Iterator;
import java.util.List;

import org.niclab.vanbus.R;
import org.niclab.vanbus.activity.StopListOfRouteAct;
import org.niclab.vanbus.application.VanBusApplication;
import org.niclab.vanbus.database.ApplicationDataBase;
import org.niclab.vanbus.database.BusRouteDAO;
import org.niclab.vanbus.database.BusStopDAO;
import org.niclab.vanbus.model.BusRoute;
import org.niclab.vanbus.model.BusStop;
import org.niclab.vanbus.model.viewadpater.BusStopArrayAdapter;
import org.niclab.vanbus.query.ClosestBusStopsQuery;
import org.niclab.vanbus.query.IQuery;
import org.niclab.vanbus.query.RouteStopsWithTimesQuery;
import org.niclab.vanbus.query.SimpleQueryWorker;
import org.niclab.vanbus.query.command.ClosestStopsByRouteUICmd;
import org.niclab.vanbus.query.command.ICommand;
import org.niclab.vanbus.query.command.ICommandChain;
import org.niclab.vanbus.query.command.ToggleBusyLoadingPanelCmd;
import org.niclab.vanbus.query.command.UpdateListViewCmd;
import org.niclab.vanbus.query.handler.IQueryHandler;
import org.niclab.vanbus.query.mem.SimpleMemQueryHandler;
import org.niclab.vanbus.query.ws.ClosestBusStopsWSQueryResResolver;
import org.niclab.vanbus.query.ws.RouteStopsWithTimesWSQueryResResolver;
import org.niclab.vanbus.query.ws.SimpleWSQueryHandler;
import org.niclab.vanbus.utils.CacheUtils;

import android.app.Activity;
import android.app.AlertDialog;
import android.app.Dialog;
import android.content.Context;
import android.content.DialogInterface;
import android.content.Intent;
import android.content.DialogInterface.OnClickListener;
import android.database.Cursor;
import android.location.Location;
import android.util.Log;
import android.view.View;
import android.widget.BaseAdapter;
import android.widget.ListView;


public class BusRouteController {
  
  private final static String LOG_TAG="BusRouteController";
  
  private BusRoute busRoute;
  

  public BusRouteController(){
    
  }
  public BusRouteController(BusRoute route){
    
    this.busRoute = route;
  
    
  }


  public void setBusRoute(BusRoute busRoute) {
    this.busRoute = busRoute;
  }

  /**
   * 
   * @param routeId route Id
   * @param routeDir direction
   * @param routeName name
   * @param routeDirDesp direction description
   *
   * @return BusRoute object
   */

  public BusRoute createBusRouteFromCache(String routeId, String routeDir, String routeName, String routeDirDesp){
    BusRoute route = null;
    if(routeId !=null && routeDir!=null)
      route=CacheUtils.getCachedBusRoute(routeId, routeDir);
    if(route == null){
      route = new BusRoute();
      route.setRouteId(routeId);
      route.setRouteDir(routeDir);
      route.setRouteDirDesp(routeDirDesp);
      route.setRouteName(routeName);
    }
    
    return route;
    
  }
  
  
  
  
  public BusRoute createBusRouteFromCacheAndDB(Cursor cursor){
    
    String routeId = cursor.getString(cursor.getColumnIndex("ROUTE_ID"));
    String routeDir = cursor.getString(cursor.getColumnIndex("DIR"));
    
    BusRoute route = CacheUtils.getCachedBusRoute(routeId, routeDir);
    
    if(route==null){
      BusRouteDAO routeDAO = new BusRouteDAO(ApplicationDataBase.getSQLiteOpenHelper());
      route = routeDAO.getBusRoute(cursor);
    }
    
    return route;
      
  
    
  }
  public void saveBusRouteToCache(BusRoute route){
    
    CacheUtils.saveBusRouteToCache(route);
  }

  
  public void cancelFavoriteRoute(Context context) {
    busRoute.setFavorite(false);
    BusRouteDAO routeDAO = new BusRouteDAO(ApplicationDataBase.getSQLiteOpenHelper());
    routeDAO.unsetFavorite(busRoute);
    context.sendBroadcast(new Intent(context.getString(R.string.favorites_tab_route_update)));
    
  }



  public void addFavoriteRoute(Context context) {
    busRoute.setFavorite(true);
    BusRouteDAO routeDAO = new BusRouteDAO(ApplicationDataBase.getSQLiteOpenHelper());
    routeDAO.setFavorite(busRoute);
    context.sendBroadcast(new Intent(context.getString(R.string.favorites_tab_route_update)));
    
  }



  public SimpleQueryWorker updateRouteSchedule() {
    
  /*  //query
    final RouteStopsWithTimesQuery query = new RouteStopsWithTimesQuery();
    query.addQueryInputParam(RouteStopsWithTimesQuery.InputParams.BUS_ROUTE_ID, busRoute.getRouteId());
    query.addQueryInputParam(RouteStopsWithTimesQuery.InputParams.DIR, busRoute.getRouteDir());
    
    //worker
    SimpleQueryWorker worker = new SimpleQueryWorker();
        
    
    
    //web service
    RouteStopsWithTimesWSQueryResResolver wsResHandler = new RouteStopsWithTimesWSQueryResResolver();
    IQueryHandler wsHandler = new SimpleWSQueryHandler(query, wsResHandler){
      
      @Override
      public void onPostQuery(){
        RouteStopsWithTimesWSQueryResResolver.QueryResult result = (org.niclab.vanbus.query.ws.RouteStopsWithTimesWSQueryResResolver.QueryResult) query.getQueryResult();
        busRoute.setStops(result.getStops());
        for(BusStop stop : busRoute.getStops()){
          stop.putTimes(busRoute, result.getTimes(stop.getStopId()));
        }
        
        busRoute.setScheduleLastPopulated(new Date());
        //put bus route to cache
        CacheUtils.saveBusRouteToCache(busRoute);
      }
    };
    
    worker.addAsyncQueryHandler(wsHandler);
    
    return worker;*/
    
    SimpleQueryWorker worker = loadBusStops();
    worker.removeSyncQueryHandler();
    return worker;
    
    
  
    
  }



  /**
   * If curLat ==0 and curLng ==0, it will use MyLocationManager to get the current best estimation.
   * @param curLat current latitude
   * @param curLng current longitude
   * @return the query worker to find the closest stops
   */
  public SimpleQueryWorker findClosestStop(final double curLat, final double curLng) {
    final IQuery query = new ClosestBusStopsQuery();
    if(curLat ==0.0 && curLng ==0.0){
      query.addQueryInputParam(ClosestBusStopsQuery.InputParams.CURRENT_LNG, curLng);
      query.addQueryInputParam(ClosestBusStopsQuery.InputParams.CURRENT_LAT, curLat);
    }
    
    SimpleQueryWorker worker = new SimpleQueryWorker();
    
    ClosestBusStopsWSQueryResResolver resHandler = new ClosestBusStopsWSQueryResResolver();
    SimpleWSQueryHandler qHandler = new SimpleWSQueryHandler(query, resHandler){
      
      @Override
      public void onPreQuery(){
        if(curLat==0.0 && curLng==0.0){
          Location loc = VanBusApplication.getInstance().getMyLocationManager().getCurrentBestLocation(3000);
          query.addQueryInputParam(ClosestBusStopsQuery.InputParams.CURRENT_LNG, loc.getLongitude());
          query.addQueryInputParam(ClosestBusStopsQuery.InputParams.CURRENT_LAT, loc.getLatitude());
        }
      }
      @Override
      public void onPostQuery(){
        ClosestBusStopsWSQueryResResolver.QueryResult result = (org.niclab.vanbus.query.ws.ClosestBusStopsWSQueryResResolver.QueryResult) query.getQueryResult();
        List<BusStop> stops = result.getStops();
        HashSet<BusStop> allStops = new HashSet<BusStop>(busRoute.getStops());
        Iterator<BusStop> stopItr = stops.iterator();
        while(stopItr.hasNext()){
          if(!allStops.contains(stopItr.next()))
            stopItr.remove();
        }
      /*  for(BusStop stop:stops){
          if(!allStops.contains(stop))
            stops.remove(stop);
        }*/
        
      }
    };
    
    worker.addAsyncQueryHandler(qHandler);
    
    
    return worker;
    
    
  }
  

  
  public SimpleQueryWorker loadBusStops(){
    //query
    final RouteStopsWithTimesQuery query = new RouteStopsWithTimesQuery();
    query.addQueryInputParam(RouteStopsWithTimesQuery.InputParams.BUS_ROUTE_ID, busRoute.getRouteId());
    query.addQueryInputParam(RouteStopsWithTimesQuery.InputParams.DIR, busRoute.getRouteDir());

    //worker
    final SimpleQueryWorker worker = new SimpleQueryWorker();
    
    
    
  
    //Memory query handler
    IQueryHandler memHandler = new SimpleMemQueryHandler(query){

      @Override
      public void query() {
        
      

        long threshold = VanBusApplication.getInstance().getPreferences().getScheduleUpdateThreshold();

        if (!busRoute.needRepopulate(threshold))
          
        {
          Log.v(LOG_TAG,"populate route stops query is finished");
          query.setQueryFinished(true);

          //put the busRoute objec to cache
          CacheUtils.saveBusRouteToCache(busRoute);

        }
            
      }    
      
    };
    worker.addSyncQueryHandler(memHandler);
    //web service
    RouteStopsWithTimesWSQueryResResolver wsResHandler = new RouteStopsWithTimesWSQueryResResolver();
    
    IQueryHandler wsHandler = new SimpleWSQueryHandler(query, wsResHandler){
      @Override
      public void onPostQuery(){
        RouteStopsWithTimesWSQueryResResolver.QueryResult result = (org.niclab.vanbus.query.ws.RouteStopsWithTimesWSQueryResResolver.QueryResult)query .getQueryResult();
        busRoute.setStops(result.getStops());
        for(BusStop stop : busRoute.getStops()){
          stop.putTimes(busRoute, result.getTimes(stop.getStopId()));
        }
        
        busRoute.setScheduleLastPopulated(new Date());
        //put bus route to cache
        CacheUtils.saveBusRouteToCache(busRoute);
        
        //check the database if there are any favorite bus stops
        BusStopDAO busDao = new BusStopDAO(ApplicationDataBase.getSQLiteOpenHelper());
        busDao.checkFavoriteStops(busRoute.getStops());
        
      }
    };
    
    worker.addAsyncQueryHandler(wsHandler);
    
    return worker;
    
  }
  
  

}
java2s.com  | Contact Us | Privacy Policy
Copyright 2009 - 12 Demo Source and Support. All rights reserved.
All other trademarks are property of their respective owners.