/* * 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.handlers; import java.io.IOException; import java.util.Map; import java.util.Properties; import org.eclipse.core.runtime.IProgressMonitor; import org.eclipse.core.runtime.IStatus; import org.eclipse.core.runtime.Status; import org.eclipse.core.runtime.SubMonitor; import org.eclipse.osgi.util.NLS; 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 com.motorola.studio.android.adt.DDMSFacade; import com.motorola.studio.android.adt.ISerialNumbered; import com.motorola.studio.android.common.log.StudioLogger; import com.motorola.studio.android.common.utilities.EclipseUtils; import com.motorola.studio.android.remote.RemoteDevicePlugin; import com.motorola.studio.android.remote.i18n.RemoteDeviceNLS; import com.motorola.studio.android.remote.instance.RemoteDeviceInstance; /** * Handler which switches back a remote device from TCP/IP to USB mode. */ public class USBModeServiceHandler extends ServiceHandler { // Min SDK version that supports tcpip connection mode private static final int MIN_SDK_VERSION = 6; /** * Get the wireless service handler. */ @Override public IServiceHandler newInstance() { return new USBModeServiceHandler(); } /** * Get the phone IP, validate it and launch the Wireless wizard. */ @Override public IStatus runService(final IInstance instance, Map<Object, Object> arguments, final IProgressMonitor monitor) { final SubMonitor subMonitor = SubMonitor.convert(monitor, 1000); subMonitor.beginTask( RemoteDeviceNLS.USBModeServiceHandler_MsgStartingProcessOfSwitchingToUSBMode, 1000); final ISerialNumbered device = (ISerialNumbered) instance; int deviceSdkVersion = -1; try { deviceSdkVersion = Integer.parseInt(DDMSFacade.getDeviceProperty(device.getSerialNumber(), "ro.build.version.sdk")); //$NON-NLS-1$ subMonitor.worked(100); } catch (Exception e) { StudioLogger.error(USBModeServiceHandler.class, RemoteDeviceNLS.USBModeServiceHandler_2, e); } // if it was not possible to retrieve the sdk version // try to execute the service anyway if ((!subMonitor.isCanceled()) && (deviceSdkVersion < MIN_SDK_VERSION) && (deviceSdkVersion != -1)) { EclipseUtils.showErrorDialog(RemoteDeviceNLS.Title_ReturningToUSBConnectionDialog, RemoteDeviceNLS.USBModeServiceHandler_MsgUnableToSwitchToUSBDueToSDKVersion); } else { if (!subMonitor.isCanceled()) { subMonitor .setTaskName(RemoteDeviceNLS.WirelessServiceHandler_MsgRetrievingDeviceIPNumber); // retrieve the IP, Port and timeout and validate it Properties properties = instance.getProperties(); String host = properties.getProperty(RemoteDeviceInstance.PROPERTY_HOST); String port = properties.getProperty(RemoteDeviceInstance.PROPERTY_PORT); String timeout = properties.getProperty(RemoteDeviceInstance.PROPERTY_TIMEOUT); subMonitor.worked(600); if (host == null) { EclipseUtils.showErrorDialog( RemoteDeviceNLS.Title_ReturningToUSBConnectionDialog, RemoteDeviceNLS.ERR_WirelessWizard_No_IP); } else { if (!subMonitor.isCanceled()) { subMonitor .setTaskName(RemoteDeviceNLS.USBModeServiceHandler_MsgSwithcingTCPToUSB); // switch the device from connection mode from TCP/IP to USB try { IStatus status = DDMSFacade.switchFromTCPConnectionModeToUSBConnectionMode( device, host, port, Integer.parseInt(timeout), subMonitor.newChild(300)); // in case the status is not OK, show an error message if ((status != null) && (status.getSeverity() == IStatus.ERROR)) { EclipseUtils .showErrorDialog( RemoteDeviceNLS.Title_ReturningToUSBConnectionDialog, NLS.bind( RemoteDeviceNLS.USBModeServiceHandler_MsgItWasNotPossibleToSwitchDeviceToUSBMode, host), status); } else { // show a success message EclipseUtils.showInformationDialog( RemoteDeviceNLS.Title_ReturningToUSBConnectionDialog, NLS.bind(RemoteDeviceNLS.USBModeServiceHandler_MsgSuccess, host)); } } catch (IOException e) { StudioLogger .error(this.getClass(), NLS.bind( "It was not possible to switch the android device {0} connection mode to USB.", //$NON-NLS-1$ device.getDeviceName()), e); EclipseUtils .showErrorDialog( RemoteDeviceNLS.Title_ReturningToUSBConnectionDialog, NLS.bind( RemoteDeviceNLS.USBModeServiceHandler_MsgItWasNotPossibleToSwitchToUSBMode, device.getDeviceName())); } } } } } return Status.OK_STATUS; } /** * Simply Return an OK Status. */ @Override public IStatus updatingService(IInstance arg0, IProgressMonitor arg1) { return Status.OK_STATUS; } @Override public void setService(IService service) { super.setService(service); if (service != null) { service.setVisible(RemoteDevicePlugin.isWifiServiceEnabled()); } } }