# HG changeset patch # User dadubrow # Date 1277733506 18000 # Node ID 84e4ca0e2d585bb4edc6a55fac011c1a7e66ff2e # Parent 972cc303236d690f87107c0e75f16b5704e9805a Bug 11222 diff -r 972cc303236d -r 84e4ca0e2d58 connectivity/com.nokia.carbide.remoteConnections/src/com/nokia/carbide/remoteconnections/RemoteConnectionsActivator.java --- a/connectivity/com.nokia.carbide.remoteConnections/src/com/nokia/carbide/remoteconnections/RemoteConnectionsActivator.java Fri Jun 25 15:35:36 2010 -0500 +++ b/connectivity/com.nokia.carbide.remoteConnections/src/com/nokia/carbide/remoteconnections/RemoteConnectionsActivator.java Mon Jun 28 08:58:26 2010 -0500 @@ -18,6 +18,7 @@ import java.util.ArrayList; import java.util.Collection; +import java.util.Collections; import java.util.HashMap; import java.util.Map; import java.util.Map.Entry; @@ -27,6 +28,7 @@ import org.eclipse.core.runtime.IStatus; import org.eclipse.core.runtime.Platform; import org.eclipse.core.runtime.preferences.InstanceScope; +import org.eclipse.jface.preference.IPreferenceStore; import org.eclipse.jface.resource.ImageDescriptor; import org.eclipse.jface.viewers.IFilter; import org.eclipse.swt.widgets.Control; @@ -40,11 +42,12 @@ import com.nokia.carbide.remoteconnections.interfaces.IConnectionTypeProvider; import com.nokia.carbide.remoteconnections.interfaces.IConnectionsManager; import com.nokia.carbide.remoteconnections.internal.api.IDeviceDiscoveryAgent; +import com.nokia.carbide.remoteconnections.internal.api.IDeviceDiscoveryAgent.IPrerequisiteStatus; import com.nokia.carbide.remoteconnections.internal.api.IStatusDisplay; -import com.nokia.carbide.remoteconnections.internal.api.IDeviceDiscoveryAgent.IPrerequisiteStatus; import com.nokia.carbide.remoteconnections.internal.registry.Registry; import com.nokia.carbide.remoteconnections.internal.ui.DeviceDiscoveryPrequisiteErrorDialog; import com.nokia.carbide.remoteconnections.internal.ui.StatusDisplay; +import com.nokia.cpp.internal.api.utils.core.ListenerList; import com.nokia.cpp.internal.api.utils.core.Logging; import com.nokia.cpp.internal.api.utils.ui.WorkbenchUtils; @@ -85,6 +88,10 @@ runnable.run(); } } + + public interface IDiscoveryAgentsLoadedListener { + void agentsAreLoaded(); + } // The plug-in ID public static final String PLUGIN_ID = "com.nokia.carbide.remoteConnections"; //$NON-NLS-1$ @@ -95,13 +102,16 @@ private static RemoteConnectionsActivator plugin; private Collection discoveryAgents; + private ListenerList listeners; private static final String IGNORE_AGENT_LOAD_ERRORS_KEY = "ignoreAgentLoadErrors"; //$NON-NLS-1$ + private static final String AGENT_STATE_KEY_PREFIX = "agentState."; //$NON-NLS-1$ /** * The constructor */ public RemoteConnectionsActivator() { + listeners = new ListenerList(); } public void start(BundleContext context) throws Exception { @@ -176,6 +186,28 @@ logError(e); } } + + private void storeAgentRunningStates() { + IPreferenceStore preferenceStore = getPreferenceStore(); + for (IDeviceDiscoveryAgent agent : discoveryAgents) { + String agentKey = AGENT_STATE_KEY_PREFIX + agent.getId(); + if (!preferenceStore.contains(agentKey)) + preferenceStore.setDefault(agentKey, true); + preferenceStore.setValue(agentKey, agent.isRunning()); + } + try { + new InstanceScope().getNode(PLUGIN_ID).flush(); + } catch (BackingStoreException e) { + logError(e); + } + } + + private boolean getStoredAgentRunningState(IDeviceDiscoveryAgent agent) { + String agentKey = AGENT_STATE_KEY_PREFIX + agent.getId(); + if (!getPreferenceStore().contains(agentKey)) + return true; + return getPreferenceStore().getBoolean(agentKey); + } /** * Returns the shared instance @@ -232,7 +264,9 @@ public boolean select(Object toTest) { if (toTest instanceof IDeviceDiscoveryAgent) { try { - ((IDeviceDiscoveryAgent) toTest).start(); + IDeviceDiscoveryAgent discoveryAgent = (IDeviceDiscoveryAgent) toTest; + if (getStoredAgentRunningState(discoveryAgent)) + discoveryAgent.start(); return true; } catch (Throwable e) { // since we launch arbitrary code, catch any exception to prevent killing the view @@ -242,13 +276,15 @@ return false; } }); - + fireDiscoveryAgentsLoaded(); } private void stopDeviceDiscoveryAgents() { + storeAgentRunningStates(); for (IDeviceDiscoveryAgent agent : discoveryAgents) { try { - agent.stop(); + if (agent.isRunning()) + agent.stop(); } catch (CoreException e) { logError(e); } @@ -287,4 +323,24 @@ public static IStatusDisplay getStatusDisplay() { return new StatusDisplay(); } + + public Collection getDiscoveryAgents() { + if (discoveryAgents != null) + return Collections.unmodifiableCollection(discoveryAgents); + return Collections.emptySet(); + } + + public void addDiscoveryAgentsLoadedListener(IDiscoveryAgentsLoadedListener listener) { + listeners.add(listener); + } + + public void removeDiscoveryAgentsLoadedListener(IDiscoveryAgentsLoadedListener listener) { + listeners.remove(listener); + } + + private void fireDiscoveryAgentsLoaded() { + for (IDiscoveryAgentsLoadedListener listener : listeners) { + listener.agentsAreLoaded(); + } + } } diff -r 972cc303236d -r 84e4ca0e2d58 connectivity/com.nokia.carbide.remoteConnections/src/com/nokia/carbide/remoteconnections/internal/ToggleDiscoveryAgentAction.java --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/connectivity/com.nokia.carbide.remoteConnections/src/com/nokia/carbide/remoteconnections/internal/ToggleDiscoveryAgentAction.java Mon Jun 28 08:58:26 2010 -0500 @@ -0,0 +1,59 @@ +/** +* Copyright (c) 2010 Nokia Corporation and/or its subsidiary(-ies). +* All rights reserved. +* This component and the accompanying materials are made available +* under the terms of the License "Eclipse Public License v1.0" +* which accompanies this distribution, and is available +* at the URL "http://www.eclipse.org/legal/epl-v10.html". +* +* Initial Contributors: +* Nokia Corporation - initial contribution. +* +* Contributors: +* +* Description: +* +*/ + +package com.nokia.carbide.remoteconnections.internal; + +import org.eclipse.core.runtime.CoreException; +import org.eclipse.jface.action.Action; +import org.eclipse.jface.action.IAction; + +import com.nokia.carbide.remoteconnections.RemoteConnectionsActivator; +import com.nokia.carbide.remoteconnections.internal.api.IDeviceDiscoveryAgent; + +public class ToggleDiscoveryAgentAction extends Action { + + private final IDeviceDiscoveryAgent agent; + + public ToggleDiscoveryAgentAction(IDeviceDiscoveryAgent agent) { + this.agent = agent; + setChecked(agent.isRunning()); + } + + @Override + public void run() { + try { + if (agent.isRunning()) + agent.stop(); + else + agent.start(); + setChecked(agent.isRunning()); + } catch (CoreException e) { + RemoteConnectionsActivator.logError(e); + } + } + + @Override + public int getStyle() { + return IAction.AS_CHECK_BOX; + } + + @Override + public String getText() { + return agent.getDisplayName(); + } +} + diff -r 972cc303236d -r 84e4ca0e2d58 connectivity/com.nokia.carbide.remoteConnections/src/com/nokia/carbide/remoteconnections/internal/api/IDeviceDiscoveryAgent.java --- a/connectivity/com.nokia.carbide.remoteConnections/src/com/nokia/carbide/remoteconnections/internal/api/IDeviceDiscoveryAgent.java Fri Jun 25 15:35:36 2010 -0500 +++ b/connectivity/com.nokia.carbide.remoteConnections/src/com/nokia/carbide/remoteconnections/internal/api/IDeviceDiscoveryAgent.java Mon Jun 28 08:58:26 2010 -0500 @@ -87,6 +87,18 @@ */ IPrerequisiteStatus getPrerequisiteStatus(); + /** + * Return whether this discovery agent is running + * @return boolean + */ + boolean isRunning(); + + /** + * The unique id for this agent + * @return String + */ + String getId(); + // In addition, there may need to be an additional API to do a deeper form of discovery for // connection mechanisms that require pairing (like BT or Wifi). In these cases, normal discovery // will probably be for already paired devices, however, the user will want to discover all diff -r 972cc303236d -r 84e4ca0e2d58 connectivity/com.nokia.carbide.remoteConnections/src/com/nokia/carbide/remoteconnections/view/ConnectionsView.java --- a/connectivity/com.nokia.carbide.remoteConnections/src/com/nokia/carbide/remoteconnections/view/ConnectionsView.java Fri Jun 25 15:35:36 2010 -0500 +++ b/connectivity/com.nokia.carbide.remoteConnections/src/com/nokia/carbide/remoteconnections/view/ConnectionsView.java Mon Jun 28 08:58:26 2010 -0500 @@ -76,19 +76,22 @@ import com.nokia.carbide.remoteconnections.Messages; import com.nokia.carbide.remoteconnections.RemoteConnectionsActivator; +import com.nokia.carbide.remoteconnections.RemoteConnectionsActivator.IDiscoveryAgentsLoadedListener; import com.nokia.carbide.remoteconnections.interfaces.IConnectedService; +import com.nokia.carbide.remoteconnections.interfaces.IConnectedService.IStatus; +import com.nokia.carbide.remoteconnections.interfaces.IConnectedService.IStatus.EStatus; +import com.nokia.carbide.remoteconnections.interfaces.IConnectedService.IStatusChangedListener; import com.nokia.carbide.remoteconnections.interfaces.IConnection; import com.nokia.carbide.remoteconnections.interfaces.IConnectionType; import com.nokia.carbide.remoteconnections.interfaces.IConnectionsManager; -import com.nokia.carbide.remoteconnections.interfaces.IConnectedService.IStatus; -import com.nokia.carbide.remoteconnections.interfaces.IConnectedService.IStatusChangedListener; -import com.nokia.carbide.remoteconnections.interfaces.IConnectedService.IStatus.EStatus; import com.nokia.carbide.remoteconnections.interfaces.IConnectionsManager.IConnectionListener; import com.nokia.carbide.remoteconnections.interfaces.IConnectionsManager.IConnectionsManagerListener; +import com.nokia.carbide.remoteconnections.internal.ToggleDiscoveryAgentAction; import com.nokia.carbide.remoteconnections.internal.api.IConnection2; import com.nokia.carbide.remoteconnections.internal.api.IConnection2.IConnectionStatus; +import com.nokia.carbide.remoteconnections.internal.api.IConnection2.IConnectionStatus.EConnectionStatus; import com.nokia.carbide.remoteconnections.internal.api.IConnection2.IConnectionStatusChangedListener; -import com.nokia.carbide.remoteconnections.internal.api.IConnection2.IConnectionStatus.EConnectionStatus; +import com.nokia.carbide.remoteconnections.internal.api.IDeviceDiscoveryAgent; import com.nokia.carbide.remoteconnections.internal.registry.Registry; import com.nokia.carbide.remoteconnections.internal.ui.ConnectionUIUtils; import com.nokia.carbide.remoteconnections.settings.ui.SettingsWizard; @@ -111,6 +114,7 @@ private List actions; private List connectionSelectedActions; private List serviceSelectedActions; + private List discoveryAgentActions; private static final String UID = ".uid"; //$NON-NLS-1$ private static final ImageDescriptor CONNECTION_NEW_IMGDESC = RemoteConnectionsActivator.getImageDescriptor("icons/connectionNew.png"); //$NON-NLS-1$ @@ -131,7 +135,7 @@ // handle, do not dispose private Font boldViewerFont; - + private TreeNode[] loadConnections() { if (serviceToListenerMap == null) serviceToListenerMap = new HashMap(); @@ -624,8 +628,30 @@ fillLocalToolBar(bars.getToolBarManager()); } - private void fillLocalPullDown(IMenuManager manager) { - // nothing for now + private void fillLocalPullDown(final IMenuManager manager) { + if (discoveryAgentActions.isEmpty()) { + IDiscoveryAgentsLoadedListener listener = new IDiscoveryAgentsLoadedListener() { + public void agentsAreLoaded() { + makeToggleDiscoveryAgentActions(); + addDiscoveryAgentActions(manager); + Display.getDefault().asyncExec(new Runnable() { + public void run() { + manager.update(true); + } + }); + } + }; + RemoteConnectionsActivator.getDefault().addDiscoveryAgentsLoadedListener(listener); + } + else { + addDiscoveryAgentActions(manager); + } + } + + private void addDiscoveryAgentActions(IMenuManager manager) { + for (Action action : discoveryAgentActions) { + manager.add(action); + } } private void fillContextMenu(IMenuManager manager) { @@ -827,8 +853,19 @@ enableConnectionSelectedActions(false); enableServiceSelectedActions(false); + + makeToggleDiscoveryAgentActions(); } + private void makeToggleDiscoveryAgentActions() { + discoveryAgentActions = new ArrayList(); + Collection discoveryAgents = RemoteConnectionsActivator.getDefault().getDiscoveryAgents(); + for (IDeviceDiscoveryAgent agent : discoveryAgents) { + discoveryAgentActions.add(new ToggleDiscoveryAgentAction(agent)); + } + + } + private void enableConnectionSelectedActions(boolean enable) { for (Action action : connectionSelectedActions) { action.setEnabled(enable);