blob: 61bab7d54a94bc3e303f0f842946c653ef74f08c [file] [log] [blame]
/*
* 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());
}
}
}