Skip to main content
summaryrefslogblamecommitdiffstats
blob: 502c2e0bd97cf94ab19da1de4047940524d3fecc (plain) (tree)
1
2
3
4
5
6
7
8
9
10









                                                                                 
                           
                          
                             









                                                
                                       

                                        
                                                    
                                                 
                                                          
                                                     

   
                                                                        

             



                                  
                                                               
 
















                                                                                
 

                                                                                                

                                                                                                             
                                                                                                                                                            
 
                                                                                                                                                      
 
                                                                  
                                                                                                                                                         
 
                                                                                                         
                                                                                                                                                         
 



                                                                                                                     









                                                         
                                  


                                 
                                        
 

                                        
                                                              


                                               

                                            
                                                   
 




                                                                                                             

                                                           
                        

         





                                                                                           


                                





                                                                                   
                                                           

                                                   


                                         


                                
 


                                           
 







                                                 







                                             







                                                                            










                                             
                                      


                                       
                                              
                                           
                                   

         
                                         
                                      


                                                                          

         



                                                                                        












                                                                                          
                                                                                                                        










                                                                                                                   



                                                                                     
 
                                                                                     
                                          
                                                                                                       
                                                                  

                 
                                                                             

                                                              
                                         
                               
                 

                                          
                                                                    
                                             














                                                                        
                                 
 
                                                                
 
                                                                                                                
                             
                                                                                
                                               

                                                                                                           

                         

         





                                                                 
                                                         
                                                               









                                                                        
                                                            



                                                                                      


                 
                                                   
                                                               

                                                






                                                                                
                 

         
                                                      



                                                                                


                 



















                                                                                                                


                                                            














































                                                                                                                        


                                                                                                                 

                                                                               






                                                                        
 
                                            
                                                                                                                       


                                                                       





                                                                                  
                                               
                                                                                                          


                                                                       






                                                                                            
                                         


                                                                       





                                                             
                                                                                     





                                                                                   
                                          




                                                                           









                                                                                     
                                                                               
 
                                                                         


                                                                                     





                                                                                       





                                 
                                                    
                                                          



                                                 
                           


                                                    
                                                        



                                                                                    
                           







                                                     



                      
                                             
                                                       













                                                                           


                                                           
                                                                                             
                                        
                                   
                               
                 
 



                                                                                               
                                                       
                                                                

                                                  
                        
















                                                                 




















                                                                                                






                                                                                               
 












                                                                                                










                                                                                                                




                                                                                                                



                                                             
                                                            
                                                                   
                                                               
                                                                 



                                                                  


                                                                   
                                                                                          






                                                                               
 









                                                                               

                                                                    
                                                         
                                                                                    



                             
 







                                                                        
 
                                                                

                                                                   









                                                                      




                                                                  
                                       

                                                                   









                                                                       


                             
 










                                                                               
 







                                            
                                                 







                                                                                          
                                                                    



                                                                           
                                                              
                                                                            




                                                                                                                           
                                                        


                                                                 


                                                                           







                                                                          

                                                                  





























                                                                                                                 
                                                                       

                                                                   
                                                                     


                                                                                                                      

                                                            
 










                                                                                                                      
 
                                                                    


                                                                     
                                                                  




                                                                                                            
                                                           

                                                          
                                                                      


                                                                               
                                                                    




                                                                                                              
                                                         

                                                        
                                                                        


                                                                                   
                                                                      




                                                                                                                    
                                                            












































                                                                                 

                                                                                   
         









                                                                           
 
                                                                             


                                                                                                               




                                            
 





                                                                              



































                                                                                                   


                                                                 
 
/*******************************************************************************
 * Copyright (c) 2004, 2007 Mylyn project committers and others.
 * All rights reserved. This program and the accompanying materials
 * are made available under the terms of the Eclipse Public License v1.0
 * which accompanies this distribution, and is available at
 * http://www.eclipse.org/legal/epl-v10.html
 *******************************************************************************/

package org.eclipse.mylyn.internal.tasks.core;

import java.util.ArrayList;
import java.util.Calendar;
import java.util.Collections;
import java.util.Date;
import java.util.HashSet;
import java.util.List;
import java.util.Map;
import java.util.Set;
import java.util.SortedMap;
import java.util.TreeMap;
import java.util.concurrent.ConcurrentHashMap;
import java.util.concurrent.CopyOnWriteArraySet;

import org.eclipse.core.runtime.Assert;
import org.eclipse.core.runtime.IStatus;
import org.eclipse.core.runtime.Status;
import org.eclipse.mylyn.commons.core.StatusHandler;
import org.eclipse.mylyn.tasks.core.AbstractTask;
import org.eclipse.mylyn.tasks.core.ITaskActivityListener;
import org.eclipse.mylyn.tasks.core.ITaskListManager;

/**
 * Manages task elapsed time, scheduling, due dates, and the date ranges
 * 
 * @since 2.1
 * @author Rob Elves
 */
public class TaskActivityManager {

	private static final int NUM_WEEKS_PREVIOUS_START = -1;

	private static final int NUM_WEEKS_PREVIOUS_END = -1;

	private static final int NUM_WEEKS_NEXT = 1;

	private static final int NUM_WEEKS_FUTURE_START = 2;

	private static final int NUM_WEEKS_PAST_END = -2;

	private static final String DESCRIPTION_THIS_WEEK = "This Week";

	private static final String DESCRIPTION_PREVIOUS_WEEK = "Previous Week";

	private static final String DESCRIPTION_NEXT_WEEK = "Next Week";

	private static final String DESCRIPTION_FUTURE = "Future";

	private static final String DESCRIPTION_PAST = "Past";

	private final TaskActivationHistory taskActivationHistory = new TaskActivationHistory();

	private final List<ITaskActivityListener> activityListeners = new ArrayList<ITaskActivityListener>();

	private final SortedMap<Calendar, Set<AbstractTask>> scheduledTasks = Collections.synchronizedSortedMap(new TreeMap<Calendar, Set<AbstractTask>>());

	private final SortedMap<Calendar, Set<AbstractTask>> dueTasks = Collections.synchronizedSortedMap(new TreeMap<Calendar, Set<AbstractTask>>());

	// Map of Calendar (hour) to Tasks active during that hour
	private final SortedMap<Calendar, Set<AbstractTask>> activeTasks = Collections.synchronizedSortedMap(new TreeMap<Calendar, Set<AbstractTask>>());

	// For a given task maps Calendar Hour to duration of time spent (milliseconds) with task active 
	private final Map<AbstractTask, SortedMap<Calendar, Long>> taskElapsedTimeMap = new ConcurrentHashMap<AbstractTask, SortedMap<Calendar, Long>>();

	private final List<ScheduledTaskContainer> scheduleWeekDays = new ArrayList<ScheduledTaskContainer>();

	private final ArrayList<ScheduledTaskContainer> scheduleContainers = new ArrayList<ScheduledTaskContainer>();

	private ScheduledTaskContainer scheduledThisWeek;

	private ScheduledTaskContainer scheduledNextWeek;

	private ScheduledTaskContainer scheduledFuture;

	private ScheduledTaskContainer scheduledPast;

	private ScheduledTaskContainer scheduledPrevious;

//	private int startHour = 9;

	private int endHour = 17;

	private final TaskList taskList;

	private AbstractTask activeTask;

	private final TaskRepositoryManager repositoryManager;

	private int startDay = Calendar.MONDAY;

	private Date startTime = new Date();

	public static TaskActivityManager INSTANCE;

	private final ITaskListManager taskListManager;

	public TaskActivityManager(TaskRepositoryManager repositoryManager, ITaskListManager taskListManager,
			TaskList taskList) {
		this.taskListManager = taskListManager;
		this.taskList = taskList;
		this.repositoryManager = repositoryManager;
		clear();
	}

	/**
	 * Get the user specified first day of the week (Calendar.SUNDAY | Calendar.MONDAY)
	 * 
	 * @see http://en.wikipedia.org/wiki/Days_of_the_week#First_day_of_the_week
	 */
	public int getWeekStartDay() {
		return startDay;
	}

	/**
	 * Set the first day of the week (Calendar.SUNDAY | Calendar.MONDAY)
	 * 
	 * @see http://en.wikipedia.org/wiki/Days_of_the_week#First_day_of_the_week
	 * 
	 * @param startDay
	 * 		(Calendar.SUNDAY | Calendar.MONDAY)
	 */
	public void setWeekStartDay(int startDay) {
		this.startDay = startDay;
	}

//	public int getEndDay() {
//		return endDay;
//	}

//	public void setEndDay(int endDay) {
//		this.endDay = endDay;
//	}

//	public int getStartHour() {
//		return startHour;
//	}
//
//	public void setStartHour(int startHour) {
//		this.startHour = startHour;
//	}
//
	public void setEndHour(int endHour) {
		this.endHour = endHour;
	}

	public int getEndHour() {
		return endHour;
	}

	public void addActivityListener(ITaskActivityListener listener) {
		activityListeners.add(listener);
	}

	public void removeActivityListener(ITaskActivityListener listener) {
		activityListeners.remove(listener);
	}

	public void setStartTime(Date time) {
		this.startTime = time;
		// TODO: separate concerns
		setupCalendarRanges();
		reloadTimingData();
	}

	public void clear() {
		clear(new Date());
	}

	public void clear(Date date) {
		dueTasks.clear();
		scheduledTasks.clear();
		activeTasks.clear();
		taskActivationHistory.clear();
		taskElapsedTimeMap.clear();
		setStartTime(date);
	}

	private void reloadTimingData() {
		reloadScheduledData();
		for (ITaskActivityListener listener : activityListeners) {
			listener.activityReset();
		}
	}

	public void removeElapsedTime(AbstractTask task, Date startDate, Date endDate) {
		Assert.isNotNull(task);
		Assert.isNotNull(startDate);
		Assert.isNotNull(endDate);
		// remove any time that has already accumulated in data structures
		SortedMap<Calendar, Long> activityMap = taskElapsedTimeMap.get(task);
		if (activityMap != null) {
			Calendar start = TaskActivityUtil.getCalendar();
			start.setTime(startDate);
			TaskActivityUtil.snapStartOfHour(start);
			Calendar end = TaskActivityUtil.getCalendar();
			end.setTime(endDate);
			TaskActivityUtil.snapEndOfHour(end);
			activityMap = activityMap.subMap(start, end);
			for (Calendar cal : new HashSet<Calendar>(activityMap.keySet())) {
				activityMap.remove(cal);
			}
			for (ITaskActivityListener listener : new ArrayList<ITaskActivityListener>(activityListeners)) {
				try {
					listener.elapsedTimeUpdated(task, getElapsedTime(task));
				} catch (Throwable t) {
					StatusHandler.log(new Status(IStatus.ERROR, ITasksCoreConstants.ID_PLUGIN,
							"Task activity listener failed: \"" + listener + "\"", t));
				}
			}
		}

	}

	public void addElapsedTime(AbstractTask task, Date startDate, Date endDate) {
		Assert.isNotNull(task);
		Assert.isNotNull(startDate);
		Assert.isNotNull(endDate);

		SortedMap<Calendar, Long> activityMap = taskElapsedTimeMap.get(task);
		if (activityMap == null) {
			activityMap = Collections.synchronizedSortedMap(new TreeMap<Calendar, Long>());
			taskElapsedTimeMap.put(task, activityMap);
		}

		long attentionSpan = endDate.getTime() - startDate.getTime();

		// Ignore any potential negative or zero times
		if (attentionSpan <= 0) {
			return;
		}

		// granularity to the hour
		Calendar hourOfDay = TaskActivityUtil.getCalendar();
		hourOfDay.setTime(startDate);
		snapToStartOfHour(hourOfDay);
		Long daysActivity = activityMap.get(hourOfDay);
		if (daysActivity == null) {
			daysActivity = new Long(0);
		}

		daysActivity = daysActivity.longValue() + attentionSpan;

		activityMap.put(hourOfDay, daysActivity);

		Set<AbstractTask> active = activeTasks.get(hourOfDay);
		if (active == null) {
			active = new HashSet<AbstractTask>();
			activeTasks.put(hourOfDay, active);
		}
		active.add(task);

		long totalElapsed = getElapsedTime(activityMap);

		for (ITaskActivityListener listener : new ArrayList<ITaskActivityListener>(activityListeners)) {
			try {
				listener.elapsedTimeUpdated(task, totalElapsed);
			} catch (Throwable t) {
				StatusHandler.log(new Status(IStatus.ERROR, ITasksCoreConstants.ID_PLUGIN,
						"Task activity listener failed: \"" + listener + "\"", t));
			}
		}
	}

	private Calendar getNewInstance(Calendar cal) {
		Calendar newCal = TaskActivityUtil.getCalendar();
		newCal.setTimeInMillis(cal.getTimeInMillis());
		return newCal;
	}

	public void addScheduledTask(AbstractTask task) {
		Calendar time = TaskActivityUtil.getCalendar();
		time.setTime(task.getScheduledForDate());
		snapToStartOfHour(time);
		Set<AbstractTask> tasks = scheduledTasks.get(time);
		if (tasks == null) {
			tasks = new CopyOnWriteArraySet<AbstractTask>();
			scheduledTasks.put(time, tasks);
		}
		tasks.add(task);
	}

	public void removeScheduledTask(AbstractTask task) {
		synchronized (scheduledTasks) {
			for (Set<AbstractTask> setOfTasks : scheduledTasks.values()) {
				setOfTasks.remove(task);
			}
		}
	}

	public void addDueTask(AbstractTask task) {
		Calendar time = TaskActivityUtil.getCalendar();
		time.setTime(task.getDueDate());
		snapToStartOfHour(time);
		synchronized (dueTasks) {
			Set<AbstractTask> tasks = dueTasks.get(time);
			if (tasks == null) {
				tasks = new CopyOnWriteArraySet<AbstractTask>();
				dueTasks.put(time, tasks);
			}
			tasks.add(task);
		}
	}

	public void removeDueTask(AbstractTask task) {
		synchronized (dueTasks) {
			for (Set<AbstractTask> setOfTasks : dueTasks.values()) {
				setOfTasks.remove(task);
			}
		}
	}

	public void activateTask(AbstractTask task) {
		activateTask(task, true);
	}

	@Deprecated
	public void activateTask(AbstractTask task, boolean addToHistory) {
		deactivateAllTasks();

		// notify that a task is about to be activated
		for (ITaskActivityListener listener : new ArrayList<ITaskActivityListener>(activityListeners)) {
			try {
				listener.preTaskActivated(task);
			} catch (Throwable t) {
				StatusHandler.log(new Status(IStatus.ERROR, ITasksCoreConstants.ID_PLUGIN,
						"Task activity listener failed: " + listener, t));
			}
		}

		activeTask = task;
		activeTask.setActive(true);
//		if (addToHistory) {
//			taskActivationHistory.addTask(task);
//		}

		for (ITaskActivityListener listener : new ArrayList<ITaskActivityListener>(activityListeners)) {
			try {
				listener.taskActivated(task);
			} catch (Throwable t) {
				StatusHandler.log(new Status(IStatus.ERROR, ITasksCoreConstants.ID_PLUGIN,
						"Task activity listener failed: " + listener, t));
			}
		}
	}

	public void deactivateAllTasks() {
		if (activeTask != null) {
			deactivateTask(activeTask);
		}
	}

	public void deactivateTask(AbstractTask task) {
		if (task == null) {
			return;
		}

		if (task.isActive() && task == activeTask) {
			// notify that a task is about to be deactivated
			for (ITaskActivityListener listener : new ArrayList<ITaskActivityListener>(activityListeners)) {
				try {
					listener.preTaskDeactivated(task);
				} catch (Throwable t) {
					StatusHandler.log(new Status(IStatus.ERROR, ITasksCoreConstants.ID_PLUGIN,
							"Notification failed for: " + listener, t));
				}
			}

			activeTask.setActive(false);
			activeTask = null;

			for (ITaskActivityListener listener : new ArrayList<ITaskActivityListener>(activityListeners)) {
				try {
					listener.taskDeactivated(task);
				} catch (Throwable t) {
					StatusHandler.log(new Status(IStatus.ERROR, ITasksCoreConstants.ID_PLUGIN,
							"Notification failed for: " + listener, t));
				}
			}
		}
	}

	/**
	 * returns active tasks from start to end (exclusive) where both are snapped to the beginning of the hour
	 */
	public Set<AbstractTask> getActiveTasks(Calendar start, Calendar end) {
		Set<AbstractTask> resultingTasks = new HashSet<AbstractTask>();
		Calendar startInternal = TaskActivityUtil.getCalendar();
		startInternal.setTimeInMillis(start.getTimeInMillis());
		TaskActivityUtil.snapStartOfHour(startInternal);

		Calendar endInternal = TaskActivityUtil.getCalendar();
		endInternal.setTimeInMillis(end.getTimeInMillis());
		TaskActivityUtil.snapStartOfHour(endInternal);

		synchronized (activeTasks) {
			SortedMap<Calendar, Set<AbstractTask>> result = activeTasks.subMap(startInternal, endInternal);
			for (Set<AbstractTask> set : result.values()) {
				resultingTasks.addAll(set);
			}
		}
		return resultingTasks;
	}

	public Set<AbstractTask> getScheduledTasks(Calendar start, Calendar end) {
		Set<AbstractTask> resultingTasks = new HashSet<AbstractTask>();
		synchronized (scheduledTasks) {
			SortedMap<Calendar, Set<AbstractTask>> result = scheduledTasks.subMap(start, end);
			for (Set<AbstractTask> set : result.values()) {
				resultingTasks.addAll(set);
			}
		}
		return resultingTasks;
	}

	public Set<AbstractTask> getDueTasks(Calendar start, Calendar end) {
		Set<AbstractTask> resultingTasks = new HashSet<AbstractTask>();
		SortedMap<Calendar, Set<AbstractTask>> result = dueTasks.subMap(start, end);
		synchronized (dueTasks) {
			for (Set<AbstractTask> set : result.values()) {
				resultingTasks.addAll(set);
			}
		}
		return resultingTasks;
	}

	/** total elapsed time based on activation history */
	public long getElapsedTime(AbstractTask task) {
		SortedMap<Calendar, Long> activityMap = taskElapsedTimeMap.get(task);
		return getElapsedTime(activityMap);
	}

	private long getElapsedTime(SortedMap<Calendar, Long> activityMap) {
		// TODO: Keep a running total instead of recalculating all the time
		long result = 0;
		if (activityMap != null) {
			synchronized (activityMap) {
				for (Long time : activityMap.values()) {
					if (time != null) {
						result += time.longValue();
					}
				}
			}
		}
		return result;
	}

	/** total elapsed time based on activation history */
	public long getElapsedTime(AbstractTask task, Calendar start, Calendar end) {
		long result = 0;

		Calendar startRange = snapToStartOfHour(getNewInstance(start));

		Calendar endRange = snapToEndOfHour(getNewInstance(end));

		SortedMap<Calendar, Long> activityMap = taskElapsedTimeMap.get(task);
		if (activityMap != null) {
			synchronized (activityMap) {
				activityMap = activityMap.subMap(startRange, endRange);
				for (Long time : activityMap.values()) {
					if (time != null) {
						result += time.longValue();
					}
				}
			}
		}
		return result;
	}

	// TODO: remove, copied from TaskListManager
	private Calendar snapToStartOfHour(Calendar cal) {
		cal.set(Calendar.MINUTE, 0);
		cal.set(Calendar.SECOND, 0);
		cal.set(Calendar.MILLISECOND, 0);
		cal.getTime();
		return cal;
	}

	// TODO: remove, copied from TaskListManager
	private Calendar snapToEndOfHour(Calendar cal) {
		cal.set(Calendar.MINUTE, cal.getMaximum(Calendar.MINUTE));
		cal.set(Calendar.SECOND, cal.getMaximum(Calendar.SECOND));
		cal.set(Calendar.MILLISECOND, cal.getMaximum(Calendar.MILLISECOND));
		cal.getTime();
		return cal;
	}

	// TODO: copy from TaskListManager
	public void snapToNextDay(Calendar cal) {
		cal.add(Calendar.DAY_OF_MONTH, 1);
		TaskActivityUtil.snapStartOfDay(cal);
	}

	/**
	 * @deprecated
	 */
	@Deprecated
	public AbstractTask getActiveTask() {
		return taskListManager.getActiveTask();
	}

	private void reloadScheduledData() {
		for (AbstractTask task : taskList.getAllTasks()) {
			if (task.getScheduledForDate() != null) {
				addScheduledTask(task);
			}
			if (task.getDueDate() != null) {
				addDueTask(task);
			}
		}
	}

	public void setScheduledFor(AbstractTask task, Date reminderDate) {
		setScheduledFor(task, reminderDate, false);
	}

	public void setScheduledFor(AbstractTask task, Date reminderDate, boolean floating) {
		// API-3.0: remove check
		if (task == null) {
			return;
		}

		if (reminderDate != null && !reminderDate.equals(task.getScheduledForDate())) {
			task.setReminded(false);
		}

		task.setScheduledForDate(reminderDate);
		task.internalSetFloatingScheduledDate(floating);
		if (reminderDate == null) {
			removeScheduledTask(task);
		} else {
			removeScheduledTask(task);
			addScheduledTask(task);
		}
		taskList.notifyTaskChanged(task, false);
	}

	public void setDueDate(AbstractTask task, Date dueDate) {
		task.setDueDate(dueDate);
		if (dueDate == null) {
			removeDueTask(task);
		} else {
			removeDueTask(task);
			addDueTask(task);
		}
		taskList.notifyTaskChanged(task, false);
	}

	/**
	 * @return if a repository task, will only return true if the user is a
	 */
	public boolean isCompletedToday(AbstractTask task) {
		if (task != null) {
			boolean isOwnedByUser = repositoryManager.isOwnedByUser(task);
			if (!isOwnedByUser) {
				return false;
			} else {

				Date completionDate = task.getCompletionDate();
				if (completionDate != null) {
					Calendar completedTime = TaskActivityUtil.getCalendar();
					completedTime.setTime(completionDate);
					return TaskActivityUtil.isToday(completedTime);
				}
			}
		}
		return false;
	}

	public boolean isPastReminder(AbstractTask task) {
		if (task == null || task.isCompleted() || task.getScheduledForDate() == null) {
			return false;
		} else {
			return isPastReminder(task.getScheduledForDate(), task.isCompleted());
		}
	}

	public boolean isPastReminder(Date date, boolean isComplete) {
		if (date == null || isComplete) {
			return false;
		} else {
			Date now = new Date();
			if (/*!internalIsFloatingScheduledDate() && */date.compareTo(now) < 0) {
				return true;
			} else {
				return false;
			}
		}
	}

	public boolean isDueToday(AbstractTask task) {
		if (repositoryManager.isOwnedByUser(task) && !task.isCompleted() && task.getDueDate() != null) {
			Calendar cal = TaskActivityUtil.getCalendar();
			cal.setTimeInMillis(task.getDueDate().getTime());
			if (TaskActivityUtil.isToday(cal)) {
				return true;
			}
		}
		return false;
	}

	public boolean isOverdue(AbstractTask task) {
		return (!task.isCompleted() && task.getDueDate() != null && new Date().after(task.getDueDate()))
				&& repositoryManager.isOwnedByUser(task);
	}

	public boolean isOwnedByUser(AbstractTask task) {
		return repositoryManager.isOwnedByUser(task);
	}

	public boolean isActiveThisWeek(AbstractTask task) {
		Calendar calStart = TaskActivityUtil.getCalendar();
		TaskActivityUtil.snapStartOfWorkWeek(calStart);
		Calendar calEnd = TaskActivityUtil.getCalendar();
		TaskActivityUtil.snapEndOfWeek(calEnd);
		return getElapsedTime(task, calStart, calEnd) > 0;
	}

	public boolean isScheduledForToday(AbstractTask task) {
		if (task != null) {
			Date reminder = task.getScheduledForDate();
			if (reminder != null && !task.internalIsFloatingScheduledDate()) {
				Calendar time = TaskActivityUtil.getCalendar();
				time.setTime(reminder);
				return TaskActivityUtil.isToday(time);
			}
		}
		return false;
	}

	public boolean isScheduledForToday(Date date, boolean floating) {
		if (date != null) {
			if (!floating) {
				Calendar time = TaskActivityUtil.getCalendar();
				time.setTime(date);
				return TaskActivityUtil.isToday(time);
			}
		}
		return false;
	}

	public boolean isScheduledAfterThisWeek(AbstractTask task) {
		if (task.getScheduledForDate() != null) {
			return isScheduledAfterThisWeek(task.getScheduledForDate());
		}

		return false;
	}

	public boolean isScheduledAfterThisWeek(Date date) {
		Calendar cal = TaskActivityUtil.getCalendar();
		if (date != null) {
			cal.setTime(date);
			return TaskActivityUtil.isAfterCurrentWeek(cal);
		}
		return false;
	}

	public boolean isScheduledForFuture(AbstractTask task) {
		if (task != null) {
			Date reminder = task.getScheduledForDate();
			return isScheduledForFuture(reminder);
		}
		return false;
	}

	public boolean isScheduledForFuture(Date reminder) {
		if (reminder != null) {
			Calendar cal = TaskActivityUtil.getCalendar();
			cal.setTime(reminder);
			return TaskActivityUtil.isFuture(cal);
		}
		return false;
	}

	public boolean isScheduledForThisWeek(AbstractTask task) {
		boolean result = false;
		if (task != null) {
			Date reminder = task.getScheduledForDate();
			result = isScheduledForThisWeek(reminder);
		}
		return result;
	}

	public boolean isScheduledForThisWeek(Date reminder) {
		if (reminder != null) {
			Calendar time = TaskActivityUtil.getCalendar();
			time.setTime(reminder);
			return TaskActivityUtil.isThisWeek(time);
		}
		return false;
	}

	public boolean isScheduledForNextWeek(AbstractTask task) {
		if (task != null) {
			Date reminder = task.getScheduledForDate();
			if (reminder != null) {
				Calendar time = TaskActivityUtil.getCalendar();
				time.setTime(reminder);
				return TaskActivityUtil.isNextWeek(time);
			}
		}
		return false;
	}

	/**
	 * TODO: move to activity manager
	 */
	private void setupCalendarRanges() {

		scheduleContainers.clear();
		scheduleWeekDays.clear();

		int startDay = getWeekStartDay();
		//int endDay = TaskActivityManager.getInstance().getEndDay();
		// scheduledStartHour =
		// TasksUiPlugin.getDefault().getPreferenceStore().getInt(
		// TaskListPreferenceConstants.PLANNING_STARTHOUR);

//		scheduledEndHour = TasksUiPlugin.getDefault().getPreferenceStore().getInt(
//				TasksUiPreferenceConstants.PLANNING_ENDHOUR);

		Calendar pastStart = TaskActivityUtil.getCalendar();
		pastStart.setTimeInMillis(0);
//		pastStart.setFirstDayOfWeek(startDay);
//		pastStart.setTime(startTime);
//		pastStart.add(Calendar.WEEK_OF_YEAR, NUM_WEEKS_PAST_START);
//		TaskActivityUtil.snapToStartOfWeek(pastStart);
		Calendar pastEnd = TaskActivityUtil.getStartOfCurrentWeek();
		pastEnd.setFirstDayOfWeek(startDay);
		pastEnd.setTime(startTime);
		pastEnd.add(Calendar.WEEK_OF_YEAR, NUM_WEEKS_PAST_END);
		TaskActivityUtil.snapEndOfWeek(pastEnd);
		scheduledPast = new ScheduledTaskContainer(this, pastStart.getTime(), pastEnd.getTime(), DESCRIPTION_PAST);
		//scheduleContainers.add(scheduledPast);

		scheduleWeekDays.clear();
		for (int x = startDay; x < (startDay + 7); x++) {
			Calendar dayStart = TaskActivityUtil.getCalendar();
			Calendar dayEnd = TaskActivityUtil.getCalendar();

			if (x > 7) {
				dayStart.set(Calendar.DAY_OF_WEEK, x % 7);
				dayEnd.set(Calendar.DAY_OF_WEEK, x % 7);
			} else {
				dayStart.set(Calendar.DAY_OF_WEEK, x);
				dayEnd.set(Calendar.DAY_OF_WEEK, x);
			}

			TaskActivityUtil.snapStartOfDay(dayStart);
			TaskActivityUtil.snapEndOfDay(dayEnd);

			String summary = "<unknown>";
			switch (dayStart.get(Calendar.DAY_OF_WEEK)) {
			case Calendar.MONDAY:
				summary = "Monday";
				break;
			case Calendar.TUESDAY:
				summary = "Tuesday";
				break;
			case Calendar.WEDNESDAY:
				summary = "Wednesday";
				break;
			case Calendar.THURSDAY:
				summary = "Thursday";
				break;
			case Calendar.FRIDAY:
				summary = "Friday";
				break;
			case Calendar.SATURDAY:
				summary = "Saturday";
				break;
			case Calendar.SUNDAY:
				summary = "Sunday";
				break;
			}
			ScheduledTaskContainer day = new ScheduledTaskContainer(this, dayStart, dayEnd, summary);
			scheduleWeekDays.add(day);
			scheduleContainers.add(day);
		}

		Calendar currentBegin = TaskActivityUtil.getCalendar();
		currentBegin.setTime(startTime);
		TaskActivityUtil.snapStartOfWorkWeek(currentBegin);
		Calendar currentEnd = TaskActivityUtil.getCalendar();
		currentEnd.setTime(startTime);
		TaskActivityUtil.snapEndOfWeek(currentEnd);
		scheduledThisWeek = new ScheduledTaskContainer(this, currentBegin, currentEnd, DESCRIPTION_THIS_WEEK);
		scheduledThisWeek.setCaptureFloating(true);
		//scheduleContainers.add(scheduledThisWeek);

//		GregorianCalendar currentBegin = new GregorianCalendar();
//		currentBegin.setFirstDayOfWeek(startDay);
//		currentBegin.setTime(startTime);
//		TaskActivityUtil.snapStartOfWorkWeek(currentBegin);
//		GregorianCalendar currentEnd = new GregorianCalendar();
//		currentEnd.setFirstDayOfWeek(startDay);
//		currentEnd.setTime(startTime);
//		TaskActivityUtil.snapEndOfWeek(currentEnd);
//		scheduledThisWeek = new ScheduledTaskContainer(this, currentBegin, currentEnd, DESCRIPTION_THIS_WEEK);
//		scheduledThisWeek.setCaptureFloating(true);
//		//scheduleContainers.add(scheduledThisWeek);

		Calendar nextStart = TaskActivityUtil.getCalendar();
		nextStart.setTime(startTime);
		nextStart.add(Calendar.WEEK_OF_YEAR, NUM_WEEKS_NEXT);
		TaskActivityUtil.snapStartOfWorkWeek(nextStart);
		Calendar nextEnd = TaskActivityUtil.getCalendar();
		nextEnd.setTime(startTime);
		nextEnd.add(Calendar.WEEK_OF_YEAR, NUM_WEEKS_NEXT);
		TaskActivityUtil.snapEndOfWeek(nextEnd);
		scheduledNextWeek = new ScheduledTaskContainer(this, nextStart.getTime(), nextEnd.getTime(),
				DESCRIPTION_NEXT_WEEK);
		scheduledNextWeek.setCaptureFloating(true);
		scheduleContainers.add(scheduledNextWeek);

		Calendar futureStart = TaskActivityUtil.getCalendar();
		futureStart.setTime(startTime);
		futureStart.add(Calendar.WEEK_OF_YEAR, NUM_WEEKS_FUTURE_START);
		TaskActivityUtil.snapStartOfWorkWeek(futureStart);
		Calendar futureEnd = TaskActivityUtil.getCalendar();
		futureEnd.setTime(startTime);
		futureEnd.add(Calendar.YEAR, 1);
		TaskActivityUtil.snapEndOfWeek(futureEnd);
		scheduledFuture = new ScheduledTaskContainer(this, futureStart.getTime(), futureEnd.getTime(),
				DESCRIPTION_FUTURE);
		scheduledFuture.setCaptureFloating(true);
		scheduleContainers.add(scheduledFuture);

		Calendar previousStart = TaskActivityUtil.getCalendar();
		previousStart.setTime(startTime);
		previousStart.add(Calendar.WEEK_OF_YEAR, NUM_WEEKS_PREVIOUS_START);
		TaskActivityUtil.snapStartOfWorkWeek(previousStart);
		Calendar previousEnd = TaskActivityUtil.getCalendar();
		previousEnd.setTime(startTime);
		previousEnd.add(Calendar.WEEK_OF_YEAR, NUM_WEEKS_PREVIOUS_END);
		TaskActivityUtil.snapEndOfWeek(previousEnd);
		scheduledPrevious = new ScheduledTaskContainer(this, previousStart.getTime(), previousEnd.getTime(),
				DESCRIPTION_PREVIOUS_WEEK);
		//scheduleContainers.add(scheduledPrevious);
	}

	public List<ScheduledTaskContainer> getDateRanges() {
		return scheduleContainers;
	}

	public List<ScheduledTaskContainer> getActivityWeekDays() {
		return scheduleWeekDays;
	}

	public boolean isWeekDay(ScheduledTaskContainer dateRangeTaskContainer) {
		return scheduleWeekDays.contains(dateRangeTaskContainer);
	}

	/** public for testing */
	public ScheduledTaskContainer getActivityThisWeek() {
		return scheduledThisWeek;
	}

	/** public for testing * */
	public ScheduledTaskContainer getActivityPast() {
		return scheduledPast;
	}

	/** public for testing */
	public ScheduledTaskContainer getActivityFuture() {
		return scheduledFuture;
	}

	/** public for testing */
	public ScheduledTaskContainer getActivityNextWeek() {
		return scheduledNextWeek;
	}

	/** public for testing */
	public ScheduledTaskContainer getActivityPrevious() {
		return scheduledPrevious;
	}

	public Date getStartTime() {
		return startTime;
	}

	public void scheduleNewTask(AbstractTask newTask) {
		newTask.setCreationDate(new Date());
		// TODO: set based on preference? see bug#158461
		setScheduledFor(newTask, TaskActivityUtil.getCalendar().getTime());
	}

	public boolean isDueThisWeek(AbstractTask task) {
		Date due = task.getDueDate();
		if (due != null && repositoryManager.isOwnedByUser(task)) {
			Calendar cal = TaskActivityUtil.getCalendar();
			cal.setTime(due);
			return TaskActivityUtil.isThisWeek(cal);
		}
		return false;
	}

	public boolean isFloatingThisWeek(AbstractTask singleTaskSelection) {
		if (singleTaskSelection != null && singleTaskSelection.getScheduledForDate() != null) {
			if (singleTaskSelection.internalIsFloatingScheduledDate()
					&& isScheduledForThisWeek(singleTaskSelection.getScheduledForDate())) {
				return true;
			}
		}
		return false;
	}

	public Set<AbstractTask> getScheduledForThisWeek() {
		Calendar startWeek = TaskActivityUtil.getStartOfCurrentWeek();
		Calendar endWeek = TaskActivityUtil.getEndOfCurrentWeek();
		return getScheduledTasks(startWeek, endWeek);
	}

	public ScheduledTaskContainer getActivityToday() {
		for (ScheduledTaskContainer container : scheduleWeekDays) {
			if (container.isToday()) {
				return container;
			}
		}
		return null;
	}

	public ScheduledTaskContainer getActivityContainer(Calendar calendar, boolean isFloating) {
		if (calendar == null) {
			return null;
		}
		if (isPastReminder(calendar.getTime(), false)) {
			return getActivityToday();
		}

		if (!isFloating) {
			for (ScheduledTaskContainer container : scheduleWeekDays) {
				if (container.includes(calendar)) {
					return container;
				}
			}
		} else {
			if (scheduledThisWeek.includes(calendar)) {
				return scheduledThisWeek;
			} else if (scheduledNextWeek.includes(calendar)) {
				return scheduledNextWeek;
			} else {
				return scheduledFuture;
			}
		}

		return null;
	}

	public TaskActivationHistory getTaskActivationHistory() {
		return taskActivationHistory;
	}
}

Back to the top