/*
* 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.ui.wizard;
import java.util.Arrays;
import java.util.Comparator;
import java.util.List;
import java.util.Properties;
import org.eclipse.jface.wizard.WizardPage;
import org.eclipse.sequoyah.device.framework.ui.wizard.DefaultDeviceTypeMenuWizardPage;
import org.eclipse.sequoyah.device.framework.ui.wizard.IInstanceProperties;
import org.eclipse.swt.widgets.Composite;
import com.android.sdklib.IAndroidTarget;
import com.android.sdklib.SdkConstants;
import com.motorola.studio.android.adt.SdkUtils;
import com.motorola.studio.android.common.log.StudioLogger;
import com.motorola.studio.android.emulator.EmulatorPlugin;
import com.motorola.studio.android.emulator.device.IDevicePropertiesConstants;
import com.motorola.studio.android.emulator.device.instance.AndroidDeviceInstance;
import com.motorola.studio.android.emulator.device.ui.AbstractPropertiesComposite;
import com.motorola.studio.android.emulator.device.ui.AbstractPropertiesComposite.PropertyCompositeChangeEvent;
import com.motorola.studio.android.emulator.device.ui.AbstractPropertiesComposite.PropertyCompositeChangeListener;
import com.motorola.studio.android.emulator.device.ui.PropertiesMainComposite;
import com.motorola.studio.android.emulator.i18n.EmulatorNLS;
/**
* DESCRIPTION:
* <br>
* This class represents the first wizard page for Android Emulator Device Instance creation.
* <br>
* It shows all main information and validates it, setting an appropriate error message when
* applicable.
* <br>
* RESPONSIBILITY:
* <br>
* - Allow user to enter main information for creating a new Android Emulator Device Instance
* <br>
* - Validate main information entered by user
* <br>
* COLABORATORS:
* <br>
* WizardPage: extends this class
* <br>
* PropertiesMainComposite: uses this composite as the main widget
* <br>
* USAGE:
* <br>
* This wizard page must be added as the first page on the class implementing the New Android
* Emulator Device Instance Wizard.
*/
public class WizardMainPage extends WizardPage implements IInstanceProperties
{
private PropertiesMainComposite mainComposite;
DefaultDeviceTypeMenuWizardPage tmlPage = null;
private PropertyCompositeChangeListener listener = new PropertyCompositeChangeListener()
{
public void compositeChanged(PropertyCompositeChangeEvent e)
{
String errorMessage = mainComposite.getErrorMessage();
if (errorMessage != null)
{
setErrorMessage(errorMessage);
setPageComplete(false);
}
else
{
setErrorMessage(null);
setPageComplete(true);
setMessage(EmulatorNLS.UI_WizardMainPage_PageName);
}
}
};
/**
* Creates a WizardMainPage object.
*/
public WizardMainPage()
{
super(EmulatorNLS.UI_WizardMainPage_PageName);
}
/**
* Creates the UI for this wizard page.
* It uses the PropertiesMainComposite only.
*/
public void createControl(Composite parent)
{
// Collecting usage data for statistical purpose
try
{
StudioLogger.collectUsageData(StudioLogger.WHAT_EMULATOR_CREATION_WIZARD,
StudioLogger.KIND_EMULATOR, StudioLogger.DESCRIPTION_DEFAULT,
EmulatorPlugin.PLUGIN_ID, EmulatorPlugin.getDefault().getBundle().getVersion()
.toString());
}
catch (Throwable e)
{
//Do nothing, but error on the log should never prevent app from working
}
setTitle(EmulatorNLS.UI_General_WizardTitle);
setErrorMessage(null);
setMessage(EmulatorNLS.UI_WizardMainPage_PageName);
IAndroidTarget vmTarget = null;
String vmSkin = ""; //$NON-NLS-1$
String vmPath;
String timeout;
String useVnc;
String useProxy;
String abiType = SdkConstants.ABI_ARMEABI;
String useSnapshot;
String saveSnapshot;
String startFromSnapshot;
tmlPage = (DefaultDeviceTypeMenuWizardPage) this.getPreviousPage();
IAndroidTarget targets[] = SdkUtils.getAllTargets();
if ((targets != null) && (targets.length > 0))
{
// Sort the targets array by comparing the API level of them
Arrays.sort(targets, new Comparator<IAndroidTarget>()
{
public int compare(IAndroidTarget o1, IAndroidTarget o2)
{
int returnValue;
if (o1.getVersion().getApiLevel() == o2.getVersion().getApiLevel())
{
returnValue = 0;
}
else if (o1.getVersion().getApiLevel() > o2.getVersion().getApiLevel())
{
returnValue = 1;
}
else
{
returnValue = -1;
}
return returnValue;
}
});
// Gets the first target with the highest API
int maxAPILevel = targets[targets.length - 1].getVersion().getApiLevel();
for (IAndroidTarget t : targets)
{
if (t.getVersion().getApiLevel() == maxAPILevel)
{
vmTarget = t;
break;
}
}
String skins[] = vmTarget.getSkins();
vmSkin = vmTarget.getDefaultSkin();
List<String> skinsList = Arrays.asList(skins);
/*
* Workaround to select WVGA skin on JIL SDK because HVGA skin is broken
*/
if (SdkUtils.isJILSdk())
{
String tmpVmSkin = null;
int i = 0;
while ((tmpVmSkin == null) && (i < skins.length))
{
if (skins[i].toLowerCase().trim().equals("wvga"))
{
tmpVmSkin = skins[i];
}
i++;
}
if (tmpVmSkin != null)
{
vmSkin = tmpVmSkin;
}
}
if (!skinsList.contains(vmSkin))
{
vmSkin = skins[0];
}
}
vmPath = IDevicePropertiesConstants.defaultVmPath;
// get the default properties value
Properties defaultProperties = new Properties();
AndroidDeviceInstance.populateWithDefaultProperties(defaultProperties);
timeout = defaultProperties.getProperty(IDevicePropertiesConstants.timeout);
useVnc = defaultProperties.getProperty(IDevicePropertiesConstants.useVnc);
useProxy = defaultProperties.getProperty(IDevicePropertiesConstants.useProxy);
useSnapshot = defaultProperties.getProperty(IDevicePropertiesConstants.useSnapshots);
saveSnapshot = defaultProperties.getProperty(IDevicePropertiesConstants.saveSnapshot);
startFromSnapshot = defaultProperties.getProperty(IDevicePropertiesConstants.startFromSnapshot);
// When removing the emulator definition extension, remove this hardcoded set as
// well as the constant declaration from the Activator. If the Mot skin plugin is used,
// find another way to set this variable
mainComposite =
new PropertiesMainComposite(parent, tmlPage.getInstanceName(),
EmulatorPlugin.DEFAULT_EMULATOR_DEFINITION, timeout,
Boolean.parseBoolean(useVnc), Boolean.parseBoolean(useProxy),
Boolean.parseBoolean(useSnapshot), Boolean.parseBoolean(saveSnapshot),
Boolean.parseBoolean(startFromSnapshot), vmTarget, vmSkin, vmPath, abiType,
false, true, true);
AbstractPropertiesComposite.addCompositeChangeListener(listener);
setControl(mainComposite);
if ((targets == null) || ((targets != null) && (targets.length <= 0)))
{
setMessage(EmulatorNLS.WizardMainPage_NO_SDK_CONFIGURED_MSG);
setPageComplete(false);
return;
}
String initialMessage = mainComposite.getErrorMessage();
if (initialMessage != null)
{
setMessage(initialMessage);
}
setPageComplete(initialMessage == null);
}
@Override
public void setVisible(boolean visible)
{
if (visible)
{
mainComposite.setName(tmlPage.getInstanceName());
}
super.setVisible(visible);
}
/**
* Retrieves the skin id associated with this instance
*
* @return the skin id
*/
public String getSkinId()
{
return mainComposite.getSkinId();
}
/**
* Retrieves the timeout associated with this instance
*
* @return the timeout
*/
public String getTimeout()
{
return mainComposite.getTimeout();
}
/**
* Retrieves the vnc option associated with this instance
*
* @return the timeout
*/
public String getUseVnc()
{
return mainComposite.getUseVnc();
}
/**
* Retrieves the proxy option associated with this instance
*
* @return the timeout
*/
public String getUseProxy()
{
return mainComposite.getUseProxy();
}
/**
* Retrieves the emulator definition name associated with this instance
*
* @return the emulator definition name
*/
public String getEmulatorDefId()
{
// When removing the emulator definition extension, remove this hardcoded set as
// well as the constant declaration from the Activator. If the Mot skin plugin is used,
// find another way to set this variable
return EmulatorPlugin.DEFAULT_EMULATOR_DEFINITION;
}
public String getUseSnapshot()
{
return mainComposite.getUseSnapshot();
}
public void setInstanceName(String name)
{
mainComposite.setName(name);
}
/**
* Retrieves VM target
*/
public IAndroidTarget getVmTarget()
{
return mainComposite.getVmTarget();
}
/**
* Retrieves VM target
*/
public String getAbiType()
{
return mainComposite.getAbiType();
}
/**
* Retrieves VM skin
*/
public String getVmSkin()
{
return mainComposite.getVmSkin();
}
/**
* Retrieves VM path
*/
public String getVmPath()
{
return mainComposite.getVmPath();
}
/**
* Retrieves SD Card info
*/
public String getSDCard()
{
return mainComposite.getSDCard();
}
/**
* Retrieves Command line
*/
public String getCommandLine()
{
//The command line shall be editable through the GUI
Properties defaultProperties = new Properties();
AndroidDeviceInstance.populateWithDefaultProperties(defaultProperties);
return defaultProperties.getProperty(IDevicePropertiesConstants.commandline);
}
@Override
public boolean isPageComplete()
{
return (mainComposite != null) && (mainComposite.getErrorMessage() == null);
}
@Override
public void dispose()
{
AbstractPropertiesComposite.removeCompositeChangeListener(listener);
setControl(null);
if (mainComposite != null)
{
mainComposite.dispose();
mainComposite = null;
}
super.dispose();
}
public Properties getProperties()
{
Properties properties = new Properties();
properties.setProperty(IDevicePropertiesConstants.timeout, this.getTimeout());
properties.setProperty(IDevicePropertiesConstants.useVnc, this.getUseVnc());
properties.setProperty(IDevicePropertiesConstants.useProxy, this.getUseProxy());
properties.setProperty(IDevicePropertiesConstants.emulatorDefId, this.getEmulatorDefId());
properties.setProperty(IDevicePropertiesConstants.skinId, this.getSkinId());
properties.setProperty(IDevicePropertiesConstants.vmSkin, this.getVmSkin());
properties.setProperty(IDevicePropertiesConstants.vmPath, this.getVmPath());
properties.setProperty(IDevicePropertiesConstants.abiType, this.getAbiType());
properties.setProperty(IDevicePropertiesConstants.useSnapshots, this.getUseSnapshot());
properties.setProperty(IDevicePropertiesConstants.saveSnapshot, this.getSaveSnapshot());
properties.setProperty(IDevicePropertiesConstants.startFromSnapshot, this.getstartFromSnapshot());
if (this.getVmTarget() != null)
{
properties.setProperty(IDevicePropertiesConstants.vmTarget, this.getVmTarget()
.getName());
}
else
{
properties.setProperty(IDevicePropertiesConstants.vmTarget, ""); //$NON-NLS-1$
}
return properties;
}
/**
* @return
*/
public String getstartFromSnapshot()
{
return mainComposite.getstartFromSnapshot();
}
/**
* @return
*/
public String getSaveSnapshot()
{
return mainComposite.getSaveSnapshot();
}
}