blob: cc46a21da9896dd25a60dd7e5dd5463217d4eabd [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.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;
}
}