/*
* 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.refresh;
import static com.motorola.studio.android.common.log.StudioLogger.error;
import static com.motorola.studio.android.common.log.StudioLogger.info;
import java.util.Collection;
import java.util.Properties;
import org.eclipse.core.runtime.NullProgressMonitor;
import org.eclipse.sequoyah.device.common.utilities.exception.SequoyahException;
import org.eclipse.sequoyah.device.framework.DevicePlugin;
import org.eclipse.sequoyah.device.framework.factory.DeviceTypeRegistry;
import org.eclipse.sequoyah.device.framework.manager.InstanceManager;
import org.eclipse.sequoyah.device.framework.model.IDeviceType;
import com.motorola.studio.android.adt.SdkUtils;
import com.motorola.studio.android.emulator.EmulatorPlugin;
import com.motorola.studio.android.emulator.core.devfrm.DeviceFrameworkManager;
import com.motorola.studio.android.emulator.core.model.IAndroidEmulatorInstance;
import com.motorola.studio.android.emulator.device.AndroidDeviceUtils;
import com.motorola.studio.android.emulator.device.instance.AndroidDevInstBuilder;
import com.motorola.studio.android.emulator.device.instance.AndroidDeviceInstance;
/**
* This class is responsible for refreshing the TML Instances List It checks if
* the user has created more Android VMs by himself
*
*/
public class InstancesListRefresh
{
/**
* If the number of Android VMs is different from the number of TML
* Instances, the TML Instances list is updated
*/
public static synchronized void refresh()
{
SdkUtils.reloadAvds();
DeviceFrameworkManager devFramework = DeviceFrameworkManager.getInstance();
if (SdkUtils.getCurrentSdk() != null)
{
final Collection<String> vmInstances = SdkUtils.getAllVmNames();
final Collection<String> validVmInstances = SdkUtils.getAllValidVmNames();
final Collection<String> emulatorInstances = devFramework.getAllInstanceNames();
createAndUpdateEmulatorInstances(vmInstances, validVmInstances, emulatorInstances);
}
}
/**
* Creates Emulator instances to represent every VM available in the system.
* @param validVmInstances
**/
public static void createAndUpdateEmulatorInstances(Collection<String> vmInstances,
Collection<String> validVmInstances,
Collection<String> emulatorInstances)
{
IDeviceType device =
DeviceTypeRegistry.getInstance().getDeviceTypeById(EmulatorPlugin.DEVICE_ID);
for (String instanceName : vmInstances)
{
/*
* In case the is no TmL instances for a given VM, create the TmL
* Instance
*/
if (!emulatorInstances.contains(instanceName))
{
Properties instanceProperties = new Properties();
AndroidDeviceInstance.populateWithVMInfo(instanceName, instanceProperties);
AndroidDeviceInstance.populateWithDefaultProperties(instanceProperties);
AndroidDevInstBuilder projectBuilder =
new AndroidDevInstBuilder(instanceName, instanceProperties);
try
{
InstanceManager
.createProject(device, projectBuilder, new NullProgressMonitor());
}
catch (SequoyahException e)
{
error("There was an error while creating an emulator instance: " + instanceName
+ ". Message: " + e.getMessage());
}
refreshStatus(validVmInstances, instanceName);
info("Added instance " + instanceName + " using default emulator definitions ");
}
}
for (String emulatorInstance : emulatorInstances)
{
refreshStatus(validVmInstances, emulatorInstance);
}
}
public static void refreshStatus(Collection<String> vmInstances, String instanceName)
{
/*
* Refresh status
*/
IAndroidEmulatorInstance instance =
DeviceFrameworkManager.getInstance().getInstanceByName(instanceName);
AndroidDeviceInstance androidDeviceInstance = (AndroidDeviceInstance) instance;
AndroidDeviceInstance.populateWithVMInfo(androidDeviceInstance.getName(),
androidDeviceInstance.getProperties());
String currentStatus = androidDeviceInstance.getStatus();
if (androidDeviceInstance.hasDevice())
{
if ((androidDeviceInstance.getStatus().equals(EmulatorPlugin.STATUS_NOT_AVAILABLE))
|| (androidDeviceInstance.getStatus().equals(DevicePlugin.SEQUOYAH_STATUS_OFF)))
{
if (!EmulatorPlugin.STATUS_OFFLINE_NO_DATA.equals(currentStatus))
{
androidDeviceInstance.setNameSuffix(null);
androidDeviceInstance.setStatus(EmulatorPlugin.STATUS_OFFLINE_NO_DATA);
}
}
AndroidDeviceUtils.fireDummyStartTransition(androidDeviceInstance,
androidDeviceInstance.getSerialNumber());
}
else
{
if (vmInstances.contains(androidDeviceInstance.getName()))
{
if (androidDeviceInstance.isClean())
{
if (!EmulatorPlugin.STATUS_OFFLINE_NO_DATA.equals(currentStatus))
{
androidDeviceInstance.setNameSuffix(null);
androidDeviceInstance.setStatus(EmulatorPlugin.STATUS_OFFLINE_NO_DATA);
}
}
else
{
if (!EmulatorPlugin.STATUS_OFFLINE.equals(currentStatus))
{
androidDeviceInstance.setNameSuffix(null);
androidDeviceInstance.setStatus(EmulatorPlugin.STATUS_OFFLINE);
}
}
}
else
{
if (!EmulatorPlugin.STATUS_NOT_AVAILABLE.equals(currentStatus))
{
androidDeviceInstance.setNameSuffix(null);
androidDeviceInstance.setStatus(EmulatorPlugin.STATUS_NOT_AVAILABLE);
}
}
}
}
}