/* * 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.emulator.logic.start; import static com.motorola.studio.android.common.log.StudioLogger.debug; import static com.motorola.studio.android.common.log.StudioLogger.error; import static com.motorola.studio.android.common.log.StudioLogger.info; import java.util.Map; import org.eclipse.core.runtime.IProgressMonitor; import org.eclipse.core.runtime.IStatus; import org.eclipse.core.runtime.NullProgressMonitor; import org.eclipse.core.runtime.Status; import org.eclipse.osgi.util.NLS; import com.motorola.studio.android.emulator.EmulatorPlugin; import com.motorola.studio.android.emulator.core.exception.InstanceStartException; import com.motorola.studio.android.emulator.core.exception.InstanceStopException; import com.motorola.studio.android.emulator.core.exception.StartCancelledException; import com.motorola.studio.android.emulator.core.exception.StartTimeoutException; import com.motorola.studio.android.emulator.i18n.EmulatorNLS; import com.motorola.studio.android.emulator.logic.AbstractStartAndroidEmulatorLogic; import com.motorola.studio.android.emulator.logic.AndroidLogicUtils; import com.motorola.studio.android.emulator.logic.IAndroidLogicInstance; import com.motorola.studio.android.emulator.logic.AbstractStartAndroidEmulatorLogic.LogicMode; /** * DESCRIPTION: * This class contains the business layer of the Android * Emulator start procedure * * RESPONSIBILITY: * Start any Android Emulator * * COLABORATORS: * None. * * USAGE: * Use the public method to start a Android Emulator */ public class AndroidEmulatorStarter { /** * Starts this instance, after creating a clean VM copy at the provided location. * Besides that, adds a new Android Emulator viewer inside the Android view. * This method provides automatic VM startup. * * @param instance The Android device instance * @param monitor A progress monitor that will give the user feedback about this * long running operation * * @return the status of the operation (OK, Cancel or Error+ErrorMessage) */ public static IStatus startInstance(IAndroidLogicInstance instance, Map<Object, Object> arguments, IProgressMonitor monitor) { if (instance == null) { error("Abort start operation. Instance is null."); return new Status(IStatus.ERROR, EmulatorPlugin.PLUGIN_ID, EmulatorNLS.ERR_AndroidEmulatorStarter_InstanceNullPointer); } if (monitor == null) { monitor = new NullProgressMonitor(); } IStatus status = Status.OK_STATUS; if (!instance.isStarted()) { int timeout = instance.getTimeout(); if (timeout <= 0) { status = new Status(IStatus.ERROR, EmulatorPlugin.PLUGIN_ID, NLS.bind( EmulatorNLS.ERR_AndroidLogicPlugin_InvalidTimeoutValue, new Object[] { timeout })); return status; } try { try { LogicMode mode = LogicMode.START_MODE; if (arguments != null) { Object modeObject = arguments.get(LogicMode.class); if (modeObject instanceof LogicMode) { mode = (LogicMode) modeObject; } } AbstractStartAndroidEmulatorLogic logic = instance.getStartLogic(); if (logic != null) { debug("Retrieved start logic: " + logic); logic.execute(instance, mode, timeout, monitor); AndroidLogicUtils.testCanceled(monitor); } else { error("Cannot start emulator because a logic is not provided for that."); throw new InstanceStartException( EmulatorNLS.ERR_AndroidEmulatorStarter_NoLogicAvailableForStart); } } catch (Exception e) { error("An exception happened while trying to execute the start emulator logic for " + instance + " Try to rollback by executing the stop process..."); try { instance.stop(true); } catch (InstanceStopException e1) { error("There was an error while forcing the stop the instance"); } throw e; } } catch (StartTimeoutException e) { error("A timeout has happeded during the start Android Emulator Instance. " + instance + "Cause: " + e.getMessage()); status = new Status(IStatus.ERROR, EmulatorPlugin.PLUGIN_ID, e.getMessage(), e); } catch (InstanceStartException e) { error("It was not possible to start the Android Emulator Instance. " + instance + "Cause: " + e.getMessage()); status = new Status(IStatus.ERROR, EmulatorPlugin.PLUGIN_ID, e.getMessage()); } catch (StartCancelledException e) { info("Start operation was cancelled." + instance); status = Status.CANCEL_STATUS; } catch (Exception e) { error("Unknown exception while starting the emulator instance: " + instance + " Cause: " + e.getMessage()); status = new Status(IStatus.ERROR, EmulatorPlugin.PLUGIN_ID, e.getMessage()); } } return status; } }