/*
* TV-Browser
* Copyright (C) 04-2003 Martin Oberhauser (martin_oat@yahoo.de)
*
* This program 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 2
* of the License, or (at your option) any later version.
*
* This program 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 this program; if not, write to the Free Software
* Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
*
* CVS information:
* $RCSfile$
* $Source$
* $Date: 2010-03-14 16:05:29 +0100 (Sun, 14 Mar 2010) $
* $Author: bananeweizen $
* $Revision: 6574 $
*/
/**
* TV-Browser
* @author Martin Oberhauser
*/
package tvbrowser.extras.reminderplugin;
import java.awt.Toolkit;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.Properties;
import java.util.logging.Logger;
import javax.swing.SwingUtilities;
import org.apache.commons.lang.StringUtils;
import util.exc.ErrorHandler;
import util.io.ExecutionHandler;
import util.io.IOUtilities;
import util.paramhandler.ParamParser;
import devplugin.Date;
import devplugin.Program;
import devplugin.ProgramReceiveIf;
import devplugin.ProgramReceiveTarget;
public class ReminderTimerListener {
private static final util.ui.Localizer mLocalizer
= util.ui.Localizer.getLocalizerFor(ReminderTimerListener.class );
private static final Logger mLog = Logger.getLogger(ReminderTimerListener.class.getName());
private Properties mSettings;
private ReminderList mReminderList;
public ReminderTimerListener(Properties settings, ReminderList reminderList) {
mSettings = settings;
mReminderList = reminderList;
}
public void timeEvent(ArrayList<ReminderListItem> reminders) {
// filter expired items, just for safety
ArrayList<ReminderListItem> notExpired = new ArrayList<ReminderListItem>(
reminders.size());
for (ReminderListItem item : reminders) {
if (!item.getProgramItem().getProgram().isExpired()) {
notExpired.add(item);
}
}
reminders = notExpired;
if (reminders.isEmpty()) {
return;
}
if ("true" .equals(mSettings.getProperty( "usesound" ))) {
ReminderPlugin.playSound(mSettings.getProperty( "soundfile" ));
}
if ("true" .equals(mSettings.getProperty( "usebeep" ))) {
Toolkit.getDefaultToolkit().beep();
}
if ("true" .equals(mSettings.getProperty( "usemsgbox" ))) {
// sort reminders by time
HashMap<Integer, ArrayList<ReminderListItem>> sortedReminders = new HashMap<Integer, ArrayList<ReminderListItem>>(reminders.size());
for (ReminderListItem reminder : reminders) {
int time = reminder.getProgram().getStartTime();
// take all already running programs together because there are no different reminder options for them
if (reminder.getProgram().isOnAir() || reminder.getProgram().isExpired()) {
time = -1;
}
ArrayList<ReminderListItem> list = sortedReminders.get(time);
if (list == null) {
list = new ArrayList<ReminderListItem>();
sortedReminders.put(time, list);
}
list.add(reminder);
}
// show reminders at same time in one window
for (ArrayList<ReminderListItem> singleTimeReminders : sortedReminders.values()) {
new ReminderFrame(mReminderList, singleTimeReminders, getAutoCloseReminderTime(singleTimeReminders));
}
} else {
for (ReminderListItem reminder : reminders) {
mReminderList.removeWithoutChecking(reminder.getProgramItem());
mReminderList.blockProgram(reminder.getProgram());
}
}
if ("true".equals(mSettings.getProperty("useexec"))) {
String fName = mSettings.getProperty("execfile", "").trim();
if (StringUtils.isNotEmpty(fName)) {
for (ReminderListItem reminder : reminders) {
ParamParser parser = new ParamParser();
String fParam = parser.analyse(
mSettings.getProperty("execparam", ""), reminder.getProgram());
try {
ExecutionHandler executionHandler = new ExecutionHandler(fParam,
fName);
executionHandler.execute();
} catch (Exception exc) {
String msg = mLocalizer.msg("error.2",
"Error executing reminder program!\n({0})", fName, exc);
ErrorHandler.handle(msg, exc);
}
}
} else {
mLog.warning("Reminder program name is not defined!");
}
}
// send to receiving plugins
ProgramReceiveTarget[] targets = ReminderPlugin.getInstance()
.getClientPluginsTargets();
ArrayList<Program> programs = new ArrayList<Program>();
for (ReminderListItem reminder : reminders) {
programs.add(reminder.getProgram());
}
for (ProgramReceiveTarget target : targets) {
ProgramReceiveIf plugin = target.getReceifeIfForIdOfTarget();
if (plugin != null && plugin.canReceiveProgramsWithTarget()) {
plugin.receivePrograms(programs.toArray(new Program[programs.size()]),
target);
}
}
SwingUtilities.invokeLater(new Runnable() {
public void run() {
new Thread("Update reminder tree") {
public void run() {
setPriority(Thread.MIN_PRIORITY);
ReminderPlugin.getInstance().updateRootNode(true);
}
}.start();
}
});
}
private int getAutoCloseReminderTime(ArrayList<ReminderListItem> reminders) {
int result = 0;
for (ReminderListItem reminder : reminders) {
result = Math
.max(result, getAutoCloseReminderTime(reminder.getProgram()));
}
return result;
}
/**
* Gets the time (in seconds) after which the reminder frame closes
* automatically.
*/
private int getAutoCloseReminderTime(Program p) {
int autoCloseReminderTime = 0;
try {
if(mSettings.getProperty("autoCloseBehaviour","onEnd").equals("onEnd")) {
int endTime = p.getStartTime() + p.getLength();
int currentTime = IOUtilities.getMinutesAfterMidnight();
int dateDiff = p.getDate().compareTo(Date.getCurrentDate());
if (dateDiff == -1) { // program started yesterday
currentTime += 1440;
}
else if (dateDiff == 1) { // program starts the next day
endTime += 1440;
}
autoCloseReminderTime = (endTime - currentTime) * 60;
}
else if(mSettings.getProperty("autoCloseBehaviour","onTime").equals("onTime")){
String asString = mSettings.getProperty("autoCloseReminderTime", "10");
autoCloseReminderTime = Integer.parseInt(asString);
} else {
autoCloseReminderTime = 0;
}
} catch (Exception exc) {
// ignore
}
return autoCloseReminderTime;
}
}