am ef2f55d0: Add support to delete AVD in the new AvdSelector.
Merge commit 'ef2f55d0b70edcddeeeac7ad7cab0c8f115c0800' * commit 'ef2f55d0b70edcddeeeac7ad7cab0c8f115c0800': Add support to delete AVD in the new AvdSelector.
This commit is contained in:
committed by
The Android Open Source Project
commit
0991f05672
@@ -433,35 +433,6 @@ class AvdManagerListPage extends WizardPage {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
|
||||||
* Triggered when the user selects the "delete" button (the extra action in the selector)
|
|
||||||
* Deletes the currently selected AVD, if any.
|
|
||||||
*
|
|
||||||
* This is obsolete. Kept around to reuse the code later in the AvdSelector itself.
|
|
||||||
*/
|
|
||||||
@Deprecated
|
|
||||||
private void onDelete() {
|
|
||||||
AvdInfo avdInfo = mAvdSelector.getSelected();
|
|
||||||
AvdManager avdm = getAvdManager();
|
|
||||||
if (avdInfo == null || avdm == null) {
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
// Confirm you want to delete this AVD
|
|
||||||
if (!AdtPlugin.displayPrompt("Delete Android Virtual Device",
|
|
||||||
String.format("Please confirm that you want to delete the Android Virtual Device named '%s'. This operation cannot be reverted.",
|
|
||||||
avdInfo.getName()))) {
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
SdkLog log = new SdkLog(String.format("Result of deleting AVD '%s':", avdInfo.getName()));
|
|
||||||
|
|
||||||
boolean success = avdm.deleteAvd(avdInfo, log);
|
|
||||||
|
|
||||||
log.display(success);
|
|
||||||
reloadAvdList();
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Triggered when the user selects the "create" button.
|
* Triggered when the user selects the "create" button.
|
||||||
*/
|
*/
|
||||||
|
|||||||
@@ -783,7 +783,7 @@ public final class AvdManager {
|
|||||||
|
|
||||||
File f = avdInfo.getIniFile();
|
File f = avdInfo.getIniFile();
|
||||||
if (f != null && f.exists()) {
|
if (f != null && f.exists()) {
|
||||||
log.warning("Deleting file %1$s", f.getCanonicalPath());
|
log.printf("Deleting file %1$s", f.getCanonicalPath());
|
||||||
if (!f.delete()) {
|
if (!f.delete()) {
|
||||||
log.error(null, "Failed to delete %1$s", f.getCanonicalPath());
|
log.error(null, "Failed to delete %1$s", f.getCanonicalPath());
|
||||||
error = true;
|
error = true;
|
||||||
@@ -794,7 +794,7 @@ public final class AvdManager {
|
|||||||
if (path != null) {
|
if (path != null) {
|
||||||
f = new File(path);
|
f = new File(path);
|
||||||
if (f.exists()) {
|
if (f.exists()) {
|
||||||
log.warning("Deleting folder %1$s", f.getCanonicalPath());
|
log.printf("Deleting folder %1$s", f.getCanonicalPath());
|
||||||
recursiveDelete(f);
|
recursiveDelete(f);
|
||||||
if (!f.delete()) {
|
if (!f.delete()) {
|
||||||
log.error(null, "Failed to delete %1$s", f.getCanonicalPath());
|
log.error(null, "Failed to delete %1$s", f.getCanonicalPath());
|
||||||
@@ -806,10 +806,10 @@ public final class AvdManager {
|
|||||||
removeAvd(avdInfo);
|
removeAvd(avdInfo);
|
||||||
|
|
||||||
if (error) {
|
if (error) {
|
||||||
log.printf("AVD '%1$s' deleted with errors. See warnings above.\n",
|
log.printf("\nAVD '%1$s' deleted with errors. See errors above.",
|
||||||
avdInfo.getName());
|
avdInfo.getName());
|
||||||
} else {
|
} else {
|
||||||
log.printf("AVD '%1$s' deleted.\n", avdInfo.getName());
|
log.printf("\nAVD '%1$s' deleted.", avdInfo.getName());
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -245,6 +245,11 @@ final class UpdateChooserDialog extends Dialog {
|
|||||||
placeholder = new Label(mDialogShell, SWT.NONE);
|
placeholder = new Label(mDialogShell, SWT.NONE);
|
||||||
placeholder.setLayoutData(new GridData(SWT.RIGHT, SWT.CENTER, true, false, 1, 1));
|
placeholder.setLayoutData(new GridData(SWT.RIGHT, SWT.CENTER, true, false, 1, 1));
|
||||||
|
|
||||||
|
// for MacOS, the Cancel button should be left.
|
||||||
|
if (SdkConstants.currentPlatform() == SdkConstants.PLATFORM_DARWIN) {
|
||||||
|
mCancelButton = new Button(mDialogShell, SWT.PUSH);
|
||||||
|
}
|
||||||
|
|
||||||
mInstallButton = new Button(mDialogShell, SWT.PUSH);
|
mInstallButton = new Button(mDialogShell, SWT.PUSH);
|
||||||
mInstallButton.setLayoutData(new GridData(SWT.RIGHT, SWT.CENTER, false, false, 1, 1));
|
mInstallButton.setLayoutData(new GridData(SWT.RIGHT, SWT.CENTER, false, false, 1, 1));
|
||||||
mInstallButton.setText("Install Accepted");
|
mInstallButton.setText("Install Accepted");
|
||||||
@@ -255,7 +260,10 @@ final class UpdateChooserDialog extends Dialog {
|
|||||||
}
|
}
|
||||||
});
|
});
|
||||||
|
|
||||||
|
// if we haven't created the cancel button yet (macos?), create it now.
|
||||||
|
if (mCancelButton == null) {
|
||||||
mCancelButton = new Button(mDialogShell, SWT.PUSH);
|
mCancelButton = new Button(mDialogShell, SWT.PUSH);
|
||||||
|
}
|
||||||
mCancelButton.setLayoutData(new GridData(SWT.RIGHT, SWT.CENTER, false, false, 1, 1));
|
mCancelButton.setLayoutData(new GridData(SWT.RIGHT, SWT.CENTER, false, false, 1, 1));
|
||||||
mCancelButton.setText("Cancel");
|
mCancelButton.setText("Cancel");
|
||||||
mCancelButton.addSelectionListener(new SelectionAdapter() {
|
mCancelButton.addSelectionListener(new SelectionAdapter() {
|
||||||
|
|||||||
@@ -18,11 +18,13 @@ package com.android.sdkuilib.internal.widgets;
|
|||||||
|
|
||||||
import com.android.prefs.AndroidLocation.AndroidLocationException;
|
import com.android.prefs.AndroidLocation.AndroidLocationException;
|
||||||
import com.android.sdklib.IAndroidTarget;
|
import com.android.sdklib.IAndroidTarget;
|
||||||
|
import com.android.sdklib.ISdkLog;
|
||||||
import com.android.sdklib.internal.avd.AvdManager;
|
import com.android.sdklib.internal.avd.AvdManager;
|
||||||
import com.android.sdklib.internal.avd.AvdManager.AvdInfo;
|
import com.android.sdklib.internal.avd.AvdManager.AvdInfo;
|
||||||
import com.android.sdklib.internal.avd.AvdManager.AvdInfo.AvdStatus;
|
import com.android.sdklib.internal.avd.AvdManager.AvdInfo.AvdStatus;
|
||||||
import com.android.sdkuilib.internal.repository.icons.ImageFactory;
|
import com.android.sdkuilib.internal.repository.icons.ImageFactory;
|
||||||
|
|
||||||
|
import org.eclipse.jface.dialogs.MessageDialog;
|
||||||
import org.eclipse.swt.SWT;
|
import org.eclipse.swt.SWT;
|
||||||
import org.eclipse.swt.events.ControlAdapter;
|
import org.eclipse.swt.events.ControlAdapter;
|
||||||
import org.eclipse.swt.events.ControlEvent;
|
import org.eclipse.swt.events.ControlEvent;
|
||||||
@@ -37,11 +39,15 @@ import org.eclipse.swt.layout.GridData;
|
|||||||
import org.eclipse.swt.layout.GridLayout;
|
import org.eclipse.swt.layout.GridLayout;
|
||||||
import org.eclipse.swt.widgets.Button;
|
import org.eclipse.swt.widgets.Button;
|
||||||
import org.eclipse.swt.widgets.Composite;
|
import org.eclipse.swt.widgets.Composite;
|
||||||
|
import org.eclipse.swt.widgets.Display;
|
||||||
import org.eclipse.swt.widgets.Label;
|
import org.eclipse.swt.widgets.Label;
|
||||||
|
import org.eclipse.swt.widgets.Shell;
|
||||||
import org.eclipse.swt.widgets.Table;
|
import org.eclipse.swt.widgets.Table;
|
||||||
import org.eclipse.swt.widgets.TableColumn;
|
import org.eclipse.swt.widgets.TableColumn;
|
||||||
import org.eclipse.swt.widgets.TableItem;
|
import org.eclipse.swt.widgets.TableItem;
|
||||||
|
|
||||||
|
import java.util.ArrayList;
|
||||||
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* The AVD selector is a table that is added to the given parent composite.
|
* The AVD selector is a table that is added to the given parent composite.
|
||||||
@@ -195,7 +201,12 @@ public final class AvdSelector {
|
|||||||
Button deleteButton = new Button(buttons, SWT.PUSH | SWT.FLAT);
|
Button deleteButton = new Button(buttons, SWT.PUSH | SWT.FLAT);
|
||||||
deleteButton.setLayoutData(new GridData(GridData.FILL_HORIZONTAL));
|
deleteButton.setLayoutData(new GridData(GridData.FILL_HORIZONTAL));
|
||||||
deleteButton.setText("Delete");
|
deleteButton.setText("Delete");
|
||||||
// TODO: callback for button
|
deleteButton.addSelectionListener(new SelectionAdapter() {
|
||||||
|
@Override
|
||||||
|
public void widgetSelected(SelectionEvent arg0) {
|
||||||
|
onDelete();
|
||||||
|
}
|
||||||
|
});
|
||||||
|
|
||||||
Label l = new Label(buttons, SWT.SEPARATOR | SWT.HORIZONTAL);
|
Label l = new Label(buttons, SWT.SEPARATOR | SWT.HORIZONTAL);
|
||||||
l.setLayoutData(new GridData(GridData.FILL_HORIZONTAL));
|
l.setLayoutData(new GridData(GridData.FILL_HORIZONTAL));
|
||||||
@@ -610,4 +621,108 @@ public final class AvdSelector {
|
|||||||
item.setText(3, "--");
|
item.setText(3, "--");
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private void onDelete() {
|
||||||
|
final AvdInfo avdInfo = getSelected();
|
||||||
|
|
||||||
|
// get the current Display
|
||||||
|
final Display display = mTable.getDisplay();
|
||||||
|
|
||||||
|
// Confirm you want to delete this AVD
|
||||||
|
final boolean[] result = new boolean[1];
|
||||||
|
display.syncExec(new Runnable() {
|
||||||
|
public void run() {
|
||||||
|
Shell shell = display.getActiveShell();
|
||||||
|
result[0] = MessageDialog.openQuestion(shell,
|
||||||
|
"Delete Android Virtual Device",
|
||||||
|
String.format(
|
||||||
|
"Please confirm that you want to delete the Android Virtual Device named '%s'. This operation cannot be reverted.",
|
||||||
|
avdInfo.getName()));
|
||||||
|
}
|
||||||
|
});
|
||||||
|
|
||||||
|
if (result[0] == false) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
// log for this action.
|
||||||
|
SdkLog log = new SdkLog(
|
||||||
|
String.format("Result of deleting AVD '%s':", avdInfo.getName()),
|
||||||
|
display);
|
||||||
|
|
||||||
|
// delete the AVD
|
||||||
|
boolean success = mManager.deleteAvd(avdInfo, log);
|
||||||
|
|
||||||
|
// display the result
|
||||||
|
log.displayResult(success);
|
||||||
|
|
||||||
|
if (success) {
|
||||||
|
refresh(false);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Collects all log from the AVD action and displays it in a dialog.
|
||||||
|
*/
|
||||||
|
private class SdkLog implements ISdkLog {
|
||||||
|
|
||||||
|
final ArrayList<String> logMessages = new ArrayList<String>();
|
||||||
|
private final String mMessage;
|
||||||
|
private final Display mDisplay;
|
||||||
|
|
||||||
|
public SdkLog(String message, Display display) {
|
||||||
|
mMessage = message;
|
||||||
|
mDisplay = display;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void error(Throwable throwable, String errorFormat, Object... arg) {
|
||||||
|
if (errorFormat != null) {
|
||||||
|
logMessages.add(String.format("Error: " + errorFormat, arg));
|
||||||
|
}
|
||||||
|
|
||||||
|
if (throwable != null) {
|
||||||
|
logMessages.add(throwable.getMessage());
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public void warning(String warningFormat, Object... arg) {
|
||||||
|
logMessages.add(String.format("Warning: " + warningFormat, arg));
|
||||||
|
}
|
||||||
|
|
||||||
|
public void printf(String msgFormat, Object... arg) {
|
||||||
|
logMessages.add(String.format(msgFormat, arg));
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Displays the log if anything was captured.
|
||||||
|
*/
|
||||||
|
public void displayResult(final boolean success) {
|
||||||
|
if (logMessages.size() > 0) {
|
||||||
|
final StringBuilder sb = new StringBuilder(mMessage + "\n");
|
||||||
|
for (String msg : logMessages) {
|
||||||
|
sb.append('\n');
|
||||||
|
sb.append(msg);
|
||||||
|
}
|
||||||
|
|
||||||
|
// display the message
|
||||||
|
// dialog box only run in ui thread..
|
||||||
|
mDisplay.asyncExec(new Runnable() {
|
||||||
|
public void run() {
|
||||||
|
Shell shell = mDisplay.getActiveShell();
|
||||||
|
if (success) {
|
||||||
|
MessageDialog.openInformation(shell, "Android Virtual Devices Manager",
|
||||||
|
sb.toString());
|
||||||
|
} else {
|
||||||
|
MessageDialog.openError(shell, "Android Virtual Devices Manager",
|
||||||
|
sb.toString());
|
||||||
|
|
||||||
|
}
|
||||||
|
}
|
||||||
|
});
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user