/*
* 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.device.definition;
import static com.motorola.studio.android.common.log.StudioLogger.error;
import java.util.Collection;
import java.util.LinkedHashMap;
import java.util.Map;
import org.eclipse.core.runtime.IConfigurationElement;
import org.eclipse.core.runtime.IExtension;
import org.eclipse.sequoyah.device.common.utilities.PluginUtils;
import com.motorola.studio.android.common.utilities.EclipseUtils;
import com.motorola.studio.android.emulator.core.model.IAndroidEmulatorInstance;
import com.motorola.studio.android.emulator.core.model.IInputLogic;
import com.motorola.studio.android.emulator.logic.AbstractStartAndroidEmulatorLogic;
/**
* Contains methods for managing Android emulator definitions
*
*/
public class AndroidEmuDefMgr implements IAndroidEmuDefConstants
{
// emulator definitions
private static final Map<String, AndroidEmuDefBean> emuDefs =
new LinkedHashMap<String, AndroidEmuDefBean>();
private final static AndroidEmuDefMgr instance = new AndroidEmuDefMgr();
/**
* Initialize class
*/
private AndroidEmuDefMgr()
{
readExtensions();
}
/**
* Return class instance
*
* @return AndroidEmuDefMgr instance
*/
public static AndroidEmuDefMgr getInstance()
{
return instance;
}
/**
* Read extension points to add emulator definitions
*/
private static void readExtensions()
{
IExtension[] emuDefExtensions =
EclipseUtils.getInstalledPlugins(EMULATOR_DEFINITION_EXTENSION_POINT);
for (IExtension emuDefExtension : emuDefExtensions)
{
String id = emuDefExtension.getUniqueIdentifier();
// elements
IConfigurationElement[] elements = emuDefExtension.getConfigurationElements();
AndroidEmuDefBean bean = null;
boolean extensionOk = true;
for (IConfigurationElement element : elements)
{
if (element.getName().equals(ELEMENT_SKIN))
{
String skinId = element.getAttribute(ATT_SKIN_ID);
String skinSize = element.getAttribute(ATT_SKIN_SIZE);
if (!skinId.equals("") && !skinSize.equals(""))
{
bean = new AndroidEmuDefBean(emuDefExtension.getLabel(), skinId, skinSize);
}
else
{
extensionOk = false;
}
}
}
if (extensionOk)
{
emuDefs.put(id, bean);
}
}
}
/**
* Get all emulator IDs
*
* @return all emulator IDs
*/
public Collection<String> getAllIds()
{
return emuDefs.keySet();
}
/**
* Retrieves the default emulator definition id, which should be initially set
* to the emulator devices being created
*
* @return The default emulator definition id
*/
public String getDefaultId()
{
String defaultId = "";
Collection<String> ids = getAllIds();
/*
* NOTE: This is not considering more than one type of device
*/
if (!ids.isEmpty())
{
Object[] idsArray = ids.toArray();
defaultId = idsArray[0].toString();
}
return defaultId;
}
/**
* Get all emulator names
*
* @return all emulator names
*/
public String[] getAllNames()
{
String[] allNames = new String[emuDefs.size()];
int i = 0;
for (AndroidEmuDefBean bean : emuDefs.values())
{
allNames[i++] = bean.getName();
}
return allNames;
}
/**
* Get emulator name given its ID
*
* @param emuDefId emulator ID
* @return emulator name
*/
public String getName(String emuDefId)
{
String name = emuDefId;
AndroidEmuDefBean bean = emuDefs.get(emuDefId);
if (bean != null)
{
name = bean.getName();
}
return name;
}
/**
* Get emulator skin ID given its ID
*
* @param emuDefId emulator ID
* @return emulator skin ID
*/
public String getSkinId(String emuDefId)
{
String skinId = "";
AndroidEmuDefBean bean = emuDefs.get(emuDefId);
if (bean != null)
{
skinId = bean.getSkinId();
}
return skinId;
}
/**
* Get startup emulator command arguments
*
* @param emuDefId emulator ID
* @return emulator command line arguments
*/
public String getCommandLineArgumentsForEmuDefinition(String emuDefId)
{
String arguments = "";
AndroidEmuDefBean bean = emuDefs.get(emuDefId);
if (bean != null)
{
arguments = bean.getCommandLineArguments();
}
return arguments;
}
/**
* Retrieve the input logic of the given emulator definition
* @param emuDefId id of the extension that declare emulator definitions.
* @return the IAndroidLogic associated to the given emulator definitions
*/
public IInputLogic getInputLogic(String emuDefId, IAndroidEmulatorInstance instance)
{
IInputLogic inputLogic = null;
try
{
inputLogic = (IInputLogic) PluginUtils.getExecutable(emuDefId, "inputLogic");
inputLogic.init(instance);
}
catch (Exception e)
{
error("Could not retrieve the input logic from definition " + emuDefId);
}
return inputLogic;
}
/**
* Get the start logic for the given emulator definition
* @param emuDefId id of the extension that declare emulator definitions.
* @return the IAndroidLogic associated to the given emulator definitions
*/
public AbstractStartAndroidEmulatorLogic getStartLogic(String emuDefId)
{
AbstractStartAndroidEmulatorLogic startLogic = null;
AndroidEmuDefBean bean = emuDefs.get(emuDefId);
try
{
if (bean.getStartLogic() == null)
{
bean.setStartLogic((AbstractStartAndroidEmulatorLogic) PluginUtils.getExecutable(
emuDefId, "startLogic"));
}
startLogic = bean.getStartLogic();
}
catch (Exception e)
{
error("Could not retrieve the Start logic for " + emuDefId);
}
return startLogic;
}
}