diff options
Diffstat (limited to 'src/plugins/remote.device/src/com/motorola/studio/android/remote/RemoteDevicePlugin.java')
-rw-r--r-- | src/plugins/remote.device/src/com/motorola/studio/android/remote/RemoteDevicePlugin.java | 280 |
1 files changed, 280 insertions, 0 deletions
diff --git a/src/plugins/remote.device/src/com/motorola/studio/android/remote/RemoteDevicePlugin.java b/src/plugins/remote.device/src/com/motorola/studio/android/remote/RemoteDevicePlugin.java new file mode 100644 index 0000000..b3afbf6 --- /dev/null +++ b/src/plugins/remote.device/src/com/motorola/studio/android/remote/RemoteDevicePlugin.java @@ -0,0 +1,280 @@ +/* + * Copyright (C) 2012 The Android Open Source Project + * + * 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 com.motorola.studio.android.remote; + +import static com.motorola.studio.android.common.log.StudioLogger.warn; + +import java.util.Collection; +import java.util.List; + +import org.eclipse.jface.resource.ImageDescriptor; +import org.eclipse.sequoyah.device.common.utilities.exception.SequoyahException; +import org.eclipse.sequoyah.device.framework.DeviceUtils; +import org.eclipse.sequoyah.device.framework.events.IInstanceListener; +import org.eclipse.sequoyah.device.framework.events.InstanceAdapter; +import org.eclipse.sequoyah.device.framework.events.InstanceEvent; +import org.eclipse.sequoyah.device.framework.events.InstanceEventManager; +import org.eclipse.sequoyah.device.framework.factory.DeviceTypeRegistry; +import org.eclipse.sequoyah.device.framework.model.IDeviceType; +import org.eclipse.sequoyah.device.framework.model.IInstance; +import org.eclipse.sequoyah.device.framework.model.IService; +import org.eclipse.sequoyah.device.framework.model.handler.IServiceHandler; +import org.eclipse.sequoyah.device.framework.model.handler.ServiceHandler; +import org.eclipse.ui.IWorkbenchListener; +import org.eclipse.ui.PlatformUI; +import org.eclipse.ui.plugin.AbstractUIPlugin; +import org.osgi.framework.BundleContext; + +import com.motorola.studio.android.AndroidPlugin; +import com.motorola.studio.android.adt.DDMSFacade; +import com.motorola.studio.android.adt.DdmsRunnable; +import com.motorola.studio.android.adt.StudioAndroidEventManager; +import com.motorola.studio.android.common.log.StudioLogger; +import com.motorola.studio.android.remote.instance.RemoteDeviceInstance; + +/** + * The activator class controls the plug-in life cycle. + */ +public class RemoteDevicePlugin extends AbstractUIPlugin +{ + + public static final String PLUGIN_ID = "com.motorola.studio.android.remote"; + + /** + * The ID of the device declared by this plug-in + */ + public static final String DEVICE_ID = PLUGIN_ID + ".androidRemoteDevice"; + + public static final String STATUS_ONLINE_ID = PLUGIN_ID + ".status.connected"; + + public static final String WIRELESS_PAGE_CONTEXT_HELP_ID = PLUGIN_ID + ".langPage"; + + /** + * The shared instance. + */ + private static RemoteDevicePlugin plugin; + + /** + * The service that connects the remote device. + */ + private static ServiceHandler connectServiceHandler = null; + + /** + * The service that disconnects the remote device. + */ + private static ServiceHandler disconnectServiceHandler = null; + + // sync Studio device status for already connected remote devices + private static final Runnable sdkLoaderListener = new Runnable() + { + @Override + public void run() + { + Collection<String> serialNumbers = DDMSFacade.getConnectedSerialNumbers(); + for (String serial : serialNumbers) + { + RemoteDeviceUtils.connectDevice(serial); + } + } + }; + + /* + * Listener called when a new device is connected + */ + private static DdmsRunnable connectedListener = new DdmsRunnable() + { + + @Override + public void run(String serialNumber) + { + RemoteDeviceUtils.connectDevice(serialNumber); + } + }; + + /* + * Listener called when a device is disconnected + */ + private static DdmsRunnable disconnectedListener = new DdmsRunnable() + { + + @Override + public void run(String serialNumber) + { + RemoteDeviceUtils.disconnectDevice(serialNumber); + } + }; + + /* + * Listener responsible for initializing the Remote Device instances + * right after they are loaded by TmL + */ + private static final IInstanceListener tmlListener = new InstanceAdapter() + { + @Override + public void instanceLoaded(InstanceEvent e) + { + IInstance instance = e.getInstance(); + if (instance instanceof RemoteDeviceInstance) + { + IDeviceType device = + DeviceTypeRegistry.getInstance().getDeviceTypeById( + instance.getDeviceTypeId()); + IService service = + DeviceUtils.getServiceById(device, RemoteDeviceConstants.SERVICE_INIT_ID); + IServiceHandler handler = service.getHandler(); + try + { + handler.run(instance); + } + catch (SequoyahException e1) + { + warn("Remote Device: the instance " + instance.getName() + + " is in an incorrect state (" + e1.getMessage() + ")."); + } + } + } + }; + + // Listener that will be used to ask the user if he wants to disconnect the remote devices when the Studio is being closed + private static final IWorkbenchListener workbenchListener = new RemoteDeviceWorkbenchListener(); + + /* + * (non-Javadoc) + * @see org.eclipse.ui.plugin.AbstractUIPlugin#start(org.osgi.framework.BundleContext) + */ + @Override + public void start(BundleContext context) throws Exception + { + StudioLogger.debug(RemoteDevicePlugin.class, + "Starting MOTODEV Android Remote Device Plugin..."); + + super.start(context); + plugin = this; + AndroidPlugin.getDefault().addSDKLoaderListener(sdkLoaderListener); + StudioAndroidEventManager.asyncAddDeviceChangeListeners(connectedListener, + disconnectedListener); + InstanceEventManager.getInstance().addInstanceListener(tmlListener); + PlatformUI.getWorkbench().addWorkbenchListener(workbenchListener); + + StudioLogger.debug(RemoteDevicePlugin.class, + "Starting MOTODEV Android Remote Device Plugin started."); + } + + /* + * (non-Javadoc) + * @see org.eclipse.ui.plugin.AbstractUIPlugin#stop(org.osgi.framework.BundleContext) + */ + @Override + public void stop(BundleContext context) throws Exception + { + AndroidPlugin.getDefault().removeSDKLoaderListener(sdkLoaderListener); + StudioAndroidEventManager.asyncRemoveDeviceChangeListeners(connectedListener, + disconnectedListener); + InstanceEventManager.getInstance().removeInstanceListener(tmlListener); + PlatformUI.getWorkbench().removeWorkbenchListener(workbenchListener); + plugin = null; + super.stop(context); + } + + /** + * Returns the shared instance + * + * @return the shared instance + */ + public static RemoteDevicePlugin getDefault() + { + return plugin; + } + + /** + * Retrieves the connect service handler. + * + * @return The currently registered connect service handler, or <null> if no handler is registered. + */ + public static ServiceHandler getConnectServiceHandler() + { + if (connectServiceHandler == null) + { + IDeviceType device = + DeviceTypeRegistry.getInstance().getDeviceTypeById( + RemoteDeviceConstants.DEVICE_ID); + List<IService> services = device.getServices(); + for (IService service : services) + { + IServiceHandler handler = service.getHandler(); + if (handler.getService().getId().equals(RemoteDeviceConstants.SERVICE_CONNECT_ID)) + { + connectServiceHandler = (ServiceHandler) handler; + break; + } + } + } + + return connectServiceHandler; + } + + /** + * Retrieves the disconnect service handler. + * + * @return The currently registered disconnect service handler, or <null> if no handler is registered. + */ + public static ServiceHandler getDisconnectServiceHandler() + { + if (disconnectServiceHandler == null) + { + IDeviceType device = + DeviceTypeRegistry.getInstance().getDeviceTypeById( + RemoteDeviceConstants.DEVICE_ID); + List<IService> services = device.getServices(); + for (IService service : services) + { + IServiceHandler handler = service.getHandler(); + if (handler.getService().getId() + .equals(RemoteDeviceConstants.SERVICE_DISCONNECT_ID)) + { + disconnectServiceHandler = (ServiceHandler) handler; + break; + } + } + } + + return disconnectServiceHandler; + } + + /** + * Creates and returns a new image descriptor for an image file in this plug-in. + * @param path the relative path of the image file, relative to the root of the plug-in; the path must be legal + * @return an image descriptor, or null if no image could be found + */ + public static ImageDescriptor getImageDescriptor(String path) + { + return imageDescriptorFromPlugin(PLUGIN_ID, path); + } + + public static boolean isWifiServiceEnabled() + { + Boolean enabled = null; + try + { + enabled = Boolean.parseBoolean(System.getProperty("enableWifiService")); + } + catch (Exception e) + { + enabled = Boolean.FALSE; + } + return enabled; + } +} |