/* * 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()); } } }