/* * Jitsi, the OpenSource Java VoIP and Instant Messaging client. * * Copyright @ 2015 Atlassian Pty Ltd * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ package net.java.sip.communicator.plugin.generalconfig.autoaway; import java.awt.*; import java.util.*; import net.java.sip.communicator.plugin.generalconfig.*; import net.java.sip.communicator.service.protocol.*; /** * A <tt>Runnable</tt> which permanently looks at the mouse position. If the * mouse is not moved, all accounts are set to "Away" or similar * states. * * @author Thomas Hofer */ public class StatusUpdateThread implements Runnable { private static final int AWAY_DEFAULT_STATUS = 40; private static final int IDLE_TIMER = 3000; /** * Finds the Away-Status of the protocols * * @param presence * @return */ static PresenceStatus findAwayStatus(OperationSetPresence presence) { Iterator<PresenceStatus> statusSet = presence.getSupportedStatusSet(); PresenceStatus status = null; while (statusSet.hasNext()) { PresenceStatus possibleState = statusSet.next(); int possibleStatus = possibleState.getStatus(); if ((possibleStatus < PresenceStatus.AVAILABLE_THRESHOLD) && (possibleStatus >= PresenceStatus.ONLINE_THRESHOLD)) { if (status == null || (Math.abs(possibleStatus - AWAY_DEFAULT_STATUS) < Math.abs( status.getStatus() - AWAY_DEFAULT_STATUS))) { status = possibleState; } } } return status; } private static boolean isNear(Point p1, Point p2) { return (p1 != null) && (p2 != null) && (Math.abs(p1.x - p2.x) <= 10) && (Math.abs(p1.y - p2.y) <= 10); } private Point lastPosition = null; private final Map<ProtocolProviderService, PresenceStatus> lastStates = new HashMap<ProtocolProviderService, PresenceStatus>(); private boolean run = false; public boolean isRunning() { return run; } public void run() { run = true; int timer = 0; do { try { if (MouseInfo.getPointerInfo() != null) { PointerInfo info = MouseInfo.getPointerInfo(); Point currentPosition = (info != null) ? info.getLocation() : new Point(0, 0); if (!isNear(lastPosition, currentPosition)) { // Position has changed check, if a minor state has been // automatically set and reset this state to the former // state. for (ProtocolProviderService protocolProvider : GeneralConfigPluginActivator.getProtocolProviders()) { if (lastStates.get(protocolProvider) != null) { PresenceStatus lastState = lastStates.get(protocolProvider); OperationSetPresence presence = protocolProvider.getOperationSet( OperationSetPresence.class); try { presence .publishPresenceStatus(lastState, ""); } catch (IllegalArgumentException e) { } catch (IllegalStateException e) { } catch (OperationFailedException e) { } lastStates.remove(protocolProvider); } } timer = Preferences.getTimer() * 1000 * 60; } else { // Position has not changed! Get all protocols and set // them to away. for (ProtocolProviderService protocolProvider : GeneralConfigPluginActivator.getProtocolProviders()) { OperationSetPresence presence = protocolProvider.getOperationSet( OperationSetPresence.class); PresenceStatus status = presence.getPresenceStatus(); if (status.getStatus() < PresenceStatus.AVAILABLE_THRESHOLD) { // already (manually) set to away or lower continue; } lastStates.put(protocolProvider, status); PresenceStatus newStatus = findAwayStatus(presence); try { if (newStatus != null) { presence.publishPresenceStatus( newStatus, newStatus.getStatusName()); } } catch (IllegalArgumentException e) { } catch (IllegalStateException e) { } catch (OperationFailedException e) { } } timer = IDLE_TIMER; } lastPosition = currentPosition; } Thread.sleep(timer); } catch (InterruptedException e) { } } while (run && timer > 0); } public void stop() { run = false; } }