use of com.android.sdklib.internal.avd.HardwareProperties in project android by JetBrains.
the class AvdOptionsModel method handleFinished.
@Override
protected void handleFinished() {
// By this point we should have both a Device and a SystemImage
Device device = myDevice.getValue();
SystemImageDescription systemImage = mySystemImage.getValue();
Map<String, String> hardwareProperties = DeviceManager.getHardwareProperties(device);
Map<String, Object> userEditedProperties = generateUserEditedPropertiesMap();
// Remove the SD card setting that we're not using
String sdCard = null;
boolean useExisting = myUseExternalSdCard.get();
if (!useExisting) {
if (sdCardStorage().get().isPresent() && myOriginalSdCard != null && sdCardStorage().getValue().equals(myOriginalSdCard.get())) {
// unchanged, use existing card
useExisting = true;
}
}
boolean hasSdCard = false;
if (!useExisting) {
userEditedProperties.remove(AvdWizardUtils.EXISTING_SD_LOCATION);
Storage storage = null;
myOriginalSdCard = new ObjectValueProperty<>(mySdCardStorage.getValue());
if (mySdCardStorage.get().isPresent()) {
storage = mySdCardStorage.getValue();
sdCard = toIniString(storage, false);
}
hasSdCard = storage != null && storage.getSize() > 0;
} else if (!Strings.isNullOrEmpty(existingSdLocation.get())) {
sdCard = existingSdLocation.get();
userEditedProperties.remove(AvdWizardUtils.SD_CARD_STORAGE_KEY);
hasSdCard = true;
}
hardwareProperties.put(HardwareProperties.HW_SDCARD, toIniString(hasSdCard));
// Remove any internal keys from the map
userEditedProperties = Maps.filterEntries(userEditedProperties, input -> !input.getKey().startsWith(AvdWizardUtils.WIZARD_ONLY) && input.getValue() != null);
// Call toIniString() on all remaining values
hardwareProperties.putAll(Maps.transformEntries(userEditedProperties, (key, value) -> {
if (value instanceof Storage) {
if (key.equals(AvdWizardUtils.RAM_STORAGE_KEY) || key.equals(AvdWizardUtils.VM_HEAP_STORAGE_KEY)) {
return toIniString((Storage) value, true);
} else {
return toIniString((Storage) value, false);
}
} else if (value instanceof Boolean) {
return toIniString((Boolean) value);
} else if (value instanceof File) {
return toIniString((File) value);
} else if (value instanceof Double) {
return toIniString((Double) value);
} else if (value instanceof GpuMode) {
return ((GpuMode) value).getGpuSetting();
} else {
return value.toString();
}
}));
File skinFile = (myAvdDeviceData.customSkinFile().get().isPresent()) ? myAvdDeviceData.customSkinFile().getValue() : AvdWizardUtils.resolveSkinPath(device.getDefaultHardware().getSkinFile(), systemImage, FileOpUtils.create());
if (myBackupSkinFile.get().isPresent()) {
hardwareProperties.put(AvdManager.AVD_INI_BACKUP_SKIN_PATH, myBackupSkinFile.getValue().getPath());
}
// Add defaults if they aren't already set differently
if (!hardwareProperties.containsKey(AvdManager.AVD_INI_SKIN_DYNAMIC)) {
hardwareProperties.put(AvdManager.AVD_INI_SKIN_DYNAMIC, toIniString(true));
}
if (!hardwareProperties.containsKey(HardwareProperties.HW_KEYBOARD)) {
hardwareProperties.put(HardwareProperties.HW_KEYBOARD, toIniString(false));
}
boolean isCircular = myAvdDeviceData.isScreenRound().get();
String tempAvdName = myAvdId.get();
final String avdName = tempAvdName.isEmpty() ? calculateAvdName(myAvdInfo, hardwareProperties, device) : tempAvdName;
// If we're editing an AVD and we downgrade a system image, wipe the user data with confirmation
if (myAvdInfo != null) {
ISystemImage image = myAvdInfo.getSystemImage();
if (image != null) {
int oldApiLevel = image.getAndroidVersion().getFeatureLevel();
int newApiLevel = systemImage.getVersion().getFeatureLevel();
final String oldApiName = image.getAndroidVersion().getApiString();
final String newApiName = systemImage.getVersion().getApiString();
if (oldApiLevel > newApiLevel || (oldApiLevel == newApiLevel && image.getAndroidVersion().isPreview() && !systemImage.getVersion().isPreview())) {
final AtomicReference<Boolean> shouldContinue = new AtomicReference<>();
ApplicationManager.getApplication().invokeAndWait(() -> {
String message = String.format(Locale.getDefault(), "You are about to downgrade %1$s from API level %2$s to API level %3$s.\n" + "This requires a wipe of the userdata partition of the AVD.\nDo you wish to " + "continue with the data wipe?", avdName, oldApiName, newApiName);
int result = Messages.showYesNoDialog((Project) null, message, "Confirm Data Wipe", AllIcons.General.QuestionDialog);
shouldContinue.set(result == Messages.YES);
}, ModalityState.any());
if (shouldContinue.get()) {
AvdManagerConnection.getDefaultAvdManagerConnection().wipeUserData(myAvdInfo);
} else {
return;
}
}
}
}
AvdManagerConnection connection = AvdManagerConnection.getDefaultAvdManagerConnection();
myCreatedAvd = connection.createOrUpdateAvd(myAvdInfo, avdName, device, systemImage, mySelectedAvdOrientation.get(), isCircular, sdCard, skinFile, hardwareProperties, false);
if (myCreatedAvd == null) {
ApplicationManager.getApplication().invokeAndWait(() -> Messages.showErrorDialog((Project) null, "An error occurred while creating the AVD. See idea.log for details.", "Error Creating AVD"), ModalityState.any());
}
}
Aggregations