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

Android Open Source » App » vanbus 
vanbus » org » niclab » vanbus » activity » controller » ReminderController.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.Calendar;

import org.niclab.vanbus.R;
import org.niclab.vanbus.database.ApplicationDataBase;
import org.niclab.vanbus.database.ReminderDAO;
import org.niclab.vanbus.model.BusRoute;
import org.niclab.vanbus.model.BusStop;
import org.niclab.vanbus.model.EndStopReminder;
import org.niclab.vanbus.model.Reminder;
import org.niclab.vanbus.model.StartStopReminder;
import org.niclab.vanbus.model.Reminder.ReminderType;

import android.app.AlarmManager;
import android.app.PendingIntent;
import android.app.Service;
import android.content.Context;
import android.content.Intent;
import android.database.sqlite.SQLiteConstraintException;
import android.location.LocationManager;
import android.net.Uri;
import android.util.Log;

public class ReminderController {
  
  private static final String LOG_TAG="ReminderController";


  public static final String REMINDER_ID = "org.niclab.reminder.startstop.reminderid";
  public static final String REMINDER_START_STOP_ALARM_INTENT_KEY_BUS_TIMES = "org.niclab.reminder.startstop.bustimes";
  public static final String REMINDER_START_STOP_ALARM_INTENT_KEY_BUS_STOP_NAME = "org.niclab.reminder.startstop.busstopname";
  public static final String REMINDER_START_STOP_ALARM_INTENT_KEY_BUS_STOP_ID = "org.niclab.reminder.startstop.busstopid";
  public static final String REMINDER_START_STOP_ALARM_INTENT_KEY_ROUTE_ID = "org.niclab.reminder.startstop.routeid";
  
  public static final String REMINDER_END_STOP_LOCATION_UPDATE_INTENT_KEY_SOURCE="org.niclab.reminder.endstop.intentsource";
  public static final String REMINDTER_END_STOP_LOCATION_UPDATE_INTENT_KEY_DATA="org.niclab.reminder.endstop.intentdata";
  
  public static final int REMINDER_END_STOP_INTENT_SRC_PROXIMITY_ALERT=1;
  public static final int REMINDER_END_STOP_INTENT_SRC_GPS_UPDATE=2;
  
  public static final int PROXIMITY_SERVICE_INTERVAL=240; //4 mins, 240 secs
  
  
  private Context context;
  
  public ReminderController(Context context){
    
    this.context = context;
  }
  
  public void setStartStopReminder(StartStopReminder reminder) throws SQLiteConstraintException{
    
    BusStop stop = reminder.getStop();
    BusRoute route = reminder.getRoute();
    
    AlarmManager alarmManager = (AlarmManager) context.getSystemService(Service.ALARM_SERVICE);
    
    Intent intent = new Intent(context.getString(R.string.reminder_intent_action_start_stop));
    //set data to this stop
    String prefix = context.getString(R.string.reminder_intent_data_uri_start_stop);
    intent.setData(Uri.parse(prefix + reminder.getReminderId()));
    
    ArrayList<String> times = (ArrayList<String>) stop.getTimes(route);
    intent.putStringArrayListExtra(REMINDER_START_STOP_ALARM_INTENT_KEY_BUS_TIMES, times);
    intent.putExtra(REMINDER_START_STOP_ALARM_INTENT_KEY_BUS_STOP_NAME, stop.getStopName());
    intent.putExtra(REMINDER_START_STOP_ALARM_INTENT_KEY_BUS_STOP_ID, stop.getStopId());
    intent.putExtra(REMINDER_START_STOP_ALARM_INTENT_KEY_ROUTE_ID, route.getRouteId());
    
    PendingIntent pendingIntent = PendingIntent.getBroadcast(context, 0, intent, PendingIntent.FLAG_ONE_SHOT);
    
    //insert a reminder record to database
    try{
      ReminderDAO rDao= new ReminderDAO(ApplicationDataBase.getSQLiteOpenHelper());
      rDao.insertReminder(reminder);
      alarmManager.set(AlarmManager.RTC_WAKEUP, reminder.getAlarmTime().getTime(), pendingIntent);
      Intent reminderUpdate = new Intent(context.getString(R.string.reminders_tab_start_stop_update));
      context.sendBroadcast(reminderUpdate);
    
    }catch(SQLiteConstraintException e){
      Log.d(LOG_TAG,"caught a SQLiteConstraintException");
      throw e;
    }
    
    
    
    Log.d(LOG_TAG, "a start stop reminder has been set");
    
  }

  
  public void deleteReminderByIdFromDB(ReminderType type, String reminderId){
    ReminderDAO rDao= new ReminderDAO(ApplicationDataBase.getSQLiteOpenHelper());

    rDao.deleteReminder(reminderId);
  /*  String t = reminderId.substring(0,1);
    Reminder.ReminderType type = Reminder.ReminderType.parseReminderType(t);*/
    //send change intent
    Intent removeReminderIntent =null;
    if(type == ReminderType.StartStopReminder)
      removeReminderIntent= new Intent(context.getString(R.string.reminders_tab_start_stop_update));
    else
      removeReminderIntent = new Intent(context.getString(R.string.reminders_tab_end_stop_update));
    context.sendBroadcast(removeReminderIntent);
  }
  
  public void deleteReminderByDBIdFromDB(ReminderType type,int dbId){
    ReminderDAO rDao= new ReminderDAO(ApplicationDataBase.getSQLiteOpenHelper());

    rDao.deleteReminder(dbId);
    //send change intent
    Intent removeReminderIntent =null;
    if(type == ReminderType.StartStopReminder)
      removeReminderIntent= new Intent(context.getString(R.string.reminders_tab_start_stop_update));
    else
      removeReminderIntent = new Intent(context.getString(R.string.reminders_tab_end_stop_update));
    context.sendBroadcast(removeReminderIntent);
  }
  
  public void cancelStartStopReminder(int dbId, String reminderId){
    Intent intent = new Intent(context.getString(R.string.reminder_intent_action_start_stop));
    //set data to this stop
    String prefix = context.getString(R.string.reminder_intent_data_uri_start_stop);
    intent.setData(Uri.parse(prefix +reminderId));
    PendingIntent pendingIntent = PendingIntent.getBroadcast(context, 0, intent, PendingIntent.FLAG_ONE_SHOT);
    AlarmManager alarmManager = (AlarmManager) context.getSystemService(Service.ALARM_SERVICE);
    alarmManager.cancel(pendingIntent);
    deleteReminderByDBIdFromDB(ReminderType.StartStopReminder, dbId);
    
  }
  

  
  public void setEndStopReminder(EndStopReminder reminder) throws SQLiteConstraintException{
    BusRoute route = reminder.getRoute();
    BusStop destStop = reminder.getDestStop();
    
    LocationManager locMgr = (LocationManager)context.getSystemService(Context.LOCATION_SERVICE);
    
    float busSpeed = Float.parseFloat(context.getString(R.string.reminder_configs_regular_bus_speed));
    float radius = busSpeed*PROXIMITY_SERVICE_INTERVAL;
    
    Intent intent = new Intent(context.getString(R.string.reminder_intent_action_end_stop));
    intent.putExtra(REMINDER_END_STOP_LOCATION_UPDATE_INTENT_KEY_SOURCE,REMINDER_END_STOP_INTENT_SRC_PROXIMITY_ALERT);
    
    intent.putExtra(REMINDTER_END_STOP_LOCATION_UPDATE_INTENT_KEY_DATA, reminder.createBundle());

    //set data to this stop
    String prefix = context.getString(R.string.reminder_intent_data_uri_end_stop);
    intent.setData(Uri.parse(prefix + reminder.getReminderId()));
    
    PendingIntent pendingIntent = PendingIntent.getBroadcast(context, 0, intent,PendingIntent.FLAG_UPDATE_CURRENT);
    
    try{
    //insert a reminder record to database
      ReminderDAO rDao = new ReminderDAO(ApplicationDataBase.getSQLiteOpenHelper());
      rDao.insertReminder(reminder);
      
      locMgr.addProximityAlert(destStop.getLatitude(), destStop.getLongitude(), radius, -1, pendingIntent);
      Intent reminderUpdate = new Intent(context.getString(R.string.reminders_tab_end_stop_update));
      context.sendBroadcast(reminderUpdate);
    }catch(SQLiteConstraintException e){
      throw e;
    }    
    
    
    Log.d(LOG_TAG,"an end stop Reminder has been set");
    
  }
  
  public void cancelEndStopReminder(int dbId,String reminderId){
    Intent intent = new Intent(context.getString(R.string.reminder_intent_action_end_stop));
    //set data to this stop
    String prefix = context.getString(R.string.reminder_intent_data_uri_end_stop);
    intent.setData(Uri.parse(prefix + reminderId));
    PendingIntent origPendingIntent = PendingIntent.getBroadcast(context,0, intent, 0);
    LocationManager locManager = (LocationManager) context.getSystemService(Context.LOCATION_SERVICE);
    locManager.removeProximityAlert(origPendingIntent);
    locManager.removeUpdates(origPendingIntent);
    
    deleteReminderByDBIdFromDB(ReminderType.EndStopReminder, dbId);
    
    
  }
  
  
}
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.