/* | |
* 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.installer.jobs; | |
import java.net.URI; | |
import java.util.ArrayList; | |
import java.util.Collection; | |
import java.util.List; | |
import java.util.Map; | |
import org.eclipse.core.runtime.IProgressMonitor; | |
import org.eclipse.core.runtime.IStatus; | |
import org.eclipse.core.runtime.MultiStatus; | |
import org.eclipse.core.runtime.Status; | |
import org.eclipse.core.runtime.SubMonitor; | |
import org.eclipse.core.runtime.jobs.Job; | |
import org.eclipse.ui.PlatformUI; | |
import com.motorola.studio.android.common.log.StudioLogger; | |
import com.motorola.studio.android.common.utilities.EclipseUtils; | |
import com.motorola.studio.android.installer.InstallerException; | |
import com.motorola.studio.android.installer.InstallerPlugin; | |
import com.motorola.studio.android.installer.i18n.InstallerNLS; | |
import com.motorola.studio.android.installer.ui.dialogs.AcceptLicensesDialog; | |
import com.motorola.studio.android.installer.utilities.IInstallManager.BACKEND; | |
import com.motorola.studio.android.installer.utilities.IInstallManager.CATEGORY; | |
import com.motorola.studio.android.installer.utilities.InstallManager; | |
import com.motorola.studio.android.installer.utilities.InstallableItem; | |
/** | |
* This {@link Job} execute studio update | |
*/ | |
public class UpdateStudioJob extends Job | |
{ | |
private static final String STUDIO_UPDATE_SITE = | |
"https://studio-android.motodevupdate.com/android/4.0/"; | |
private static Job updateJob; | |
/** | |
* Constructor which receives data in order to install components. | |
* | |
* @param name Name of the {@link Job}. | |
* @param stageSites Selected Stage Sites. | |
* @param itemsToInstall Items to Install. | |
*/ | |
private UpdateStudioJob(String name) | |
{ | |
super(name); | |
} | |
/** | |
* Get the instance of the {@link UpdateStudioJob}. In case | |
* it has never been created by the method {@link UpdateStudioJob#createJob(String, List, Collection, MultiStatus, Map)}, | |
* <code>null</code> will be returned. | |
* | |
* @return Returns the instance of {@link UpdateStudioJob}. | |
*/ | |
public static Job getInstance() | |
{ | |
return updateJob; | |
} | |
/** | |
* Create a {@link UpdateStudioJob} job instance for installing components | |
* from the "Download Components". | |
* | |
* @param name Name of the {@link Job}. | |
* @param stageSites Selected Stage Sites. | |
* @param itemsToInstall Items to Install. | |
* @param finishStatus Status to be merged with this operation. | |
* @param pages Pages which hold the tasks that origins the installation. | |
* @param configurationDialog The Page which started this job. | |
*/ | |
public static Job createJob(String name) | |
{ | |
updateJob = new UpdateStudioJob(name); | |
return updateJob; | |
} | |
/* (non-Javadoc) | |
* @see org.eclipse.core.runtime.jobs.Job#run(org.eclipse.core.runtime.IProgressMonitor) | |
*/ | |
@Override | |
protected IStatus run(IProgressMonitor monitor) | |
{ | |
InstallManager installManager = (InstallManager) InstallManager.getInstance(); | |
IStatus status = null; | |
SubMonitor submonitor = SubMonitor.convert(monitor); | |
submonitor.beginTask(InstallerNLS.UpdateStudio_LoadingRepositories, 100); | |
Collection<InstallableItem> itemsToInstall = new ArrayList<InstallableItem>(); | |
List<URI> updateSites = new ArrayList<URI>(); | |
updateSites.add(URI.create(STUDIO_UPDATE_SITE)); | |
try | |
{ | |
status = | |
installManager.listAllAvailableUpdates(itemsToInstall, updateSites, | |
CATEGORY.UPDATE_STUDIO, BACKEND.P2, submonitor.newChild(40)); | |
if (itemsToInstall.size() == 0) | |
{ | |
StudioLogger.info(this.getClass(), "listAvailable updates returned an empty list"); //$NON-NLS-1$ | |
} | |
if (!status.isOK()) | |
{ | |
StudioLogger.info(this.getClass(), | |
"Error listing available updates " + status.getMessage()); //$NON-NLS-1$ | |
if (status.getSeverity() == Status.INFO) | |
{ | |
EclipseUtils.showInformationDialog( | |
InstallerNLS.UpdateStudio_AlreadyUpdatedInformationDialogTitle, | |
InstallerNLS.UpdateStudio_AlreadyUpdatedInformationDialogText); | |
} | |
else if (status.getSeverity() != Status.CANCEL) | |
{ | |
EclipseUtils.showErrorDialog(InstallerNLS.UpdateStudio_UpdateErrorTitle, | |
InstallerNLS.UpdateStudioJob_UpdateErrorMessage, status); | |
status = Status.CANCEL_STATUS; | |
} | |
} | |
else | |
{ | |
final InstallableItem[] itemsToInstallArray = | |
new InstallableItem[itemsToInstall.size()]; | |
int index = 0; | |
for (InstallableItem item : itemsToInstall) | |
{ | |
itemsToInstallArray[index] = item; | |
index++; | |
} | |
final int[] result = new int[1]; | |
if (!monitor.isCanceled()) | |
{ | |
PlatformUI.getWorkbench().getDisplay().syncExec(new Runnable() | |
{ | |
public void run() | |
{ | |
AcceptLicensesDialog licenceDialog = | |
new AcceptLicensesDialog(PlatformUI.getWorkbench().getDisplay() | |
.getActiveShell(), itemsToInstallArray, true, true); | |
result[0] = licenceDialog.open(); | |
} | |
}); | |
} | |
if (!monitor.isCanceled()) | |
{ | |
if (result[0] == AcceptLicensesDialog.OK) | |
{ | |
if (status.isOK() && (itemsToInstallArray.length > 0)) | |
{ | |
submonitor | |
.setTaskName(InstallerNLS.UpdateStudio_UpdatingStudioJobDescription); | |
status = | |
installManager.updateStudio(updateSites, BACKEND.P2, | |
submonitor.newChild(60)); | |
if (updateSites.isEmpty()) | |
{ | |
StudioLogger.info(this.getClass(), | |
"Tryed to update from Studio but updateSites[] is empty. Status message = " //$NON-NLS-1$ | |
+ status.getMessage()); | |
} | |
else | |
{ | |
StudioLogger.info(this.getClass(), | |
"Tryed to update from [" + updateSites.toString() //$NON-NLS-1$ | |
+ "]. Status message = " + status.getMessage()); //$NON-NLS-1$ | |
} | |
} | |
if (status.isOK() && !monitor.isCanceled()) | |
{ | |
if (itemsToInstallArray.length > 0) | |
{ | |
boolean restart = | |
EclipseUtils.showQuestionDialog( | |
InstallerNLS.UpdateStudio_MSG_RESTART_TITLE, | |
InstallerNLS.UpdateStudio_MSG_RESTART_MESSAGE); | |
if (restart) | |
{ | |
PlatformUI.getWorkbench().getDisplay().syncExec(new Runnable() | |
{ | |
public void run() | |
{ | |
PlatformUI.getWorkbench().restart(); | |
} | |
}); | |
} | |
} | |
} | |
else if (monitor.isCanceled()) | |
{ | |
StudioLogger.info(this.getClass(), | |
"Setting status to CANCEL since monitor was canceled 1."); //$NON-NLS-1$ | |
status = Status.CANCEL_STATUS; | |
} | |
else if (status.getSeverity() == Status.INFO) | |
{ | |
EclipseUtils.showInformationDialog( | |
InstallerNLS.UpdateStudio_AlreadyUpdatedInformationDialogTitle, | |
InstallerNLS.UpdateStudio_AlreadyUpdatedInformationDialogText); | |
} | |
else | |
{ | |
EclipseUtils.showErrorDialog( | |
InstallerNLS.UpdateStudio_UpdateErrorTitle, | |
InstallerNLS.UpdateStudioJob_UpdateErrorMessage, status); | |
status = Status.CANCEL_STATUS; | |
StudioLogger.info(this.getClass(), "Setting status to CANCEL 2."); //$NON-NLS-1$ | |
} | |
} | |
} | |
if (monitor.isCanceled()) | |
{ | |
StudioLogger.info(this.getClass(), | |
"Setting status to CANCEL since monitor was canceled 3."); //$NON-NLS-1$ | |
status = Status.CANCEL_STATUS; | |
} | |
} | |
} | |
catch (InstallerException e) | |
{ | |
StudioLogger.error(this.getClass(), | |
"Error when retrieving installable units for update", e); //$NON-NLS-1$ | |
status = | |
new Status(IStatus.ERROR, InstallerPlugin.PLUGIN_ID, 0, | |
InstallerNLS.UpdateStudio_UpdateErrorText, null); | |
} | |
if (!status.isOK()) | |
{ | |
StudioLogger.info(this.getClass(), | |
"Update Studio job exiting with status different from ok: " //$NON-NLS-1$ | |
+ status.getMessage()); | |
} | |
return status; | |
} | |
} |