package com.mobilesorcery.sdk.builder.android.launch;
import java.text.MessageFormat;
import java.util.ArrayList;
import java.util.HashSet;
import java.util.List;
import org.eclipse.core.runtime.CoreException;
import org.eclipse.debug.core.ILaunchConfiguration;
import org.eclipse.debug.core.ILaunchConfigurationWorkingCopy;
import org.eclipse.jface.dialogs.IMessageProvider;
import org.eclipse.swt.SWT;
import org.eclipse.swt.layout.GridData;
import org.eclipse.swt.layout.GridLayout;
import org.eclipse.swt.widgets.Button;
import org.eclipse.swt.widgets.Combo;
import org.eclipse.swt.widgets.Composite;
import org.eclipse.swt.widgets.Event;
import org.eclipse.swt.widgets.Label;
import org.eclipse.swt.widgets.Listener;
import com.mobilesorcery.sdk.core.CoreMoSyncPlugin;
import com.mobilesorcery.sdk.core.SimpleQueue;
import com.mobilesorcery.sdk.core.Util;
import com.mobilesorcery.sdk.ui.DefaultMessageProvider;
import com.mobilesorcery.sdk.ui.UpdateListener;
import com.mobilesorcery.sdk.ui.UpdateListener.IUpdatableControl;
import com.mobilesorcery.sdk.ui.launch.IEmulatorLaunchConfigurationPart;
public class AndroidEmulatorLauncherPart implements
IEmulatorLaunchConfigurationPart, IUpdatableControl {
private Combo avd;
private Button autoSelectAVD;
private Android android;
private final SimpleQueue q = new SimpleQueue(false);
private HashSet<String> avdsAtLastRefresh = new HashSet<String>();
public AndroidEmulatorLauncherPart() {
// TODO Auto-generated constructor stub
}
@Override
public void init(ILaunchConfiguration config) throws CoreException {
avd.setText(config.getAttribute(AndroidEmulatorLauncher.AVD_NAME, ""));
autoSelectAVD.setSelection(config.getAttribute(AndroidEmulatorLauncher.AUTO_SELECT_AVD, true));
updateUI();
}
@Override
public Composite createControl(Composite parent, IUpdatableControl updatable) {
Composite main = new Composite(parent, SWT.NONE);
main.setLayout(new GridLayout(3, false));
UpdateListener listener = new UpdateListener(updatable);
autoSelectAVD = new Button(main, SWT.CHECK);
autoSelectAVD.setText("&Automatically select AVD");
autoSelectAVD.addListener(SWT.Selection, new UpdateListener(this));
autoSelectAVD.addListener(SWT.Selection, listener);
autoSelectAVD.setLayoutData(new GridData(SWT.FILL, SWT.DEFAULT, true,
false, 3, 1));
Label avdLabel = new Label(main, SWT.NONE);
avdLabel.setText("&AVD:");
avd = new Combo(main, SWT.NONE);
avd.setLayoutData(new GridData(GridData.FILL_HORIZONTAL));
Button refresh = new Button(main, SWT.PUSH);
refresh.setText("&Refresh AVD list");
android = Android.getExternal();
refresh.setEnabled(android.isValid());
refresh.addListener(SWT.Selection, new Listener() {
@Override
public void handleEvent(Event event) {
updateAVDs();
}
});
updateAVDs();
avd.addListener(SWT.Modify, listener);
updateUI();
return main;
}
protected void updateAVDs() {
q.execute(new Runnable() {
@Override
public void run() {
try {
android.refresh();
List<AVD> avds = android.listAVDs();
final List<String> avdNames = new ArrayList<String>();
for (AVD avd : avds) {
avdNames.add(avd.getName());
}
avdsAtLastRefresh = new HashSet<String>(avdNames);
avd.getDisplay().asyncExec(new Runnable() {
@Override
public void run() {
String oldText = avd.getText().trim();
avd.setItems(avdNames.toArray(new String[0]));
if (!Util.isEmpty(oldText)) {
avd.setText(oldText);
} else if (avdNames.size() > 0) {
avd.setText(avdNames.get(0));
}
}
});
} catch (CoreException e) {
CoreMoSyncPlugin.getDefault().log(e);
}
}
});
}
@Override
public void apply(ILaunchConfigurationWorkingCopy copy) {
copy.setAttribute(AndroidEmulatorLauncher.AVD_NAME, avd.getText()
.trim());
copy.setAttribute(AndroidEmulatorLauncher.AUTO_SELECT_AVD,
autoSelectAVD.getSelection());
}
@Override
public IMessageProvider validate() {
String avdName = avd.getText().trim();
if (!autoSelectAVD.getSelection()) {
if (Util.isEmpty(avdName)) {
return new DefaultMessageProvider("No AVD set",
IMessageProvider.ERROR);
} else if (!avdsAtLastRefresh.contains(avdName)) {
return new DefaultMessageProvider(MessageFormat.format(
"No AVD found with name {0}", avdName),
IMessageProvider.WARNING);
}
}
return null;
}
@Override
public void updateUI() {
avd.setEnabled(!autoSelectAVD.getSelection());
}
}