blob: 294353d0cbceee9825bfba669c1f3b36c4ab6841 [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.net.InetAddress;
import java.util.Map;
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.jface.wizard.WizardDialog;
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 org.eclipse.ui.PlatformUI;
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.ui.wireless.WirelessWizard;
/**
* Handler which launches the Over the Air wizard.
*/
public class WirelessServiceHandler extends ServiceHandler
{
private static final int TIMEOUT_REACH_IP = 30000;
// 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 WirelessServiceHandler();
}
/**
* 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.WirelessServiceHandler_MsgLaunchingWirelessConnection,
1000);
final ISerialNumbered device = (ISerialNumbered) instance;
int deviceSdkVersion = -1;
try
{
deviceSdkVersion =
Integer.parseInt(DDMSFacade.getDeviceProperty(device.getSerialNumber(),
"ro.build.version.sdk"));
subMonitor.worked(100);
}
catch (Exception e)
{
StudioLogger.error(WirelessServiceHandler.class,
"Problems trying to retrieve handset's sdk version.", 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.WirelessWizard_TitleWirelessConnectionModeWizard,
RemoteDeviceNLS.ERR_WirelessWizard_NOT_VALID_SDK);
}
else
{
if (!subMonitor.isCanceled())
{
subMonitor
.setTaskName(RemoteDeviceNLS.WirelessServiceHandler_MsgRetrievingDeviceIPNumber);
// retrieve the IP and validate it
final String host =
DDMSFacade.getWirelessIPfromHandset(device.getSerialNumber(), monitor);
subMonitor.worked(300);
if (host == null)
{
EclipseUtils.showErrorDialog(
RemoteDeviceNLS.WirelessWizard_TitleWirelessConnectionModeWizard,
RemoteDeviceNLS.ERR_WirelessWizard_No_IP);
}
else
{
if (!subMonitor.isCanceled())
{
// check whether the IP can be reached
subMonitor
.setTaskName(RemoteDeviceNLS.WirelessServiceHandler_MsgPingingIPAddress);
InetAddress ipAddress = null;
boolean canReachIPAddress = true;
if (!subMonitor.isCanceled())
{
try
{
ipAddress = InetAddress.getByName(host);
canReachIPAddress =
(ipAddress != null)
&& ipAddress.isReachable(TIMEOUT_REACH_IP);
subMonitor.worked(200);
}
catch (Exception e)
{
canReachIPAddress = false;
StudioLogger
.error(this.getClass(), NLS.bind(
RemoteDeviceNLS.ERR_WirelessWizard_Reach_IP, host),
e);
}
if (!canReachIPAddress)
{
EclipseUtils
.showErrorDialog(
RemoteDeviceNLS.WirelessWizard_TitleWirelessConnectionModeWizard,
NLS.bind(
RemoteDeviceNLS.ERR_WirelessWizard_Reach_IP,
host));
}
else
{
if (!subMonitor.isCanceled())
{
// launch the wireless wizard
PlatformUI.getWorkbench().getDisplay().asyncExec(new Runnable()
{
public void run()
{
subMonitor.worked(400);
WirelessWizard wizard = new WirelessWizard();
wizard.setInstance(device);
//wizard.setIp("192.168.16.2");
wizard.setIp(host);
wizard.setProgressMonitor(monitor);
WizardDialog dialog =
new WizardDialog(PlatformUI.getWorkbench()
.getActiveWorkbenchWindow().getShell(),
wizard);
dialog.open();
}
});
}
}
}
}
}
}
}
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());
}
}
}