/*
* 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.devices;
import java.io.File;
import java.util.ArrayList;
import java.util.List;
import org.eclipse.core.runtime.IProgressMonitor;
import org.eclipse.core.runtime.IStatus;
import org.eclipse.core.runtime.Platform;
import org.eclipse.core.runtime.Status;
import org.eclipse.core.runtime.jobs.Job;
import org.eclipse.jface.dialogs.MessageDialog;
import org.eclipse.sequoyah.device.framework.model.IDeviceTypeDropSupport;
import org.eclipse.sequoyah.device.framework.model.IInstance;
import org.eclipse.swt.dnd.DropTargetEvent;
import org.eclipse.swt.dnd.FileTransfer;
import org.eclipse.swt.dnd.TransferData;
import org.eclipse.ui.PlatformUI;
import com.motorola.studio.android.adt.DDMSFacade;
import com.motorola.studio.android.adt.DDMSUtils;
import com.motorola.studio.android.adt.InstallPackageBean;
import com.motorola.studio.android.i18n.AndroidNLS;
import com.motorola.studio.android.wizards.installapp.DeployWizard.INSTALL_TYPE;
public abstract class AbstractDeviceDropSupportHandler implements IDeviceTypeDropSupport
{
private DropTargetEvent lastEvent = null;
private List<File> availableAPKs = null;
/*
* (non-Javadoc)
*
* @see
* org.eclipse.sequoyah.device.framework.model.IDeviceTypeDropSupport#canDrop
* (org.eclipse.sequoyah.device.framework.model.IInstance,
* org.eclipse.swt.dnd.TransferData, org.eclipse.swt.dnd.DropTargetEvent)
*/
public boolean canDrop(IInstance instance, TransferData data, DropTargetEvent event)
{
return (((getFiles(event) != null) && (getFiles(event).size() > 0)) || !Platform.OS_WIN32
.equals(Platform.getOS()));
}
/*
* (non-Javadoc)
*
* @see
* org.eclipse.sequoyah.device.framework.model.IDeviceTypeDropSupport#drop
* (org.eclipse.sequoyah.device.framework.model.IInstance,
* org.eclipse.swt.dnd.TransferData, org.eclipse.swt.dnd.DropTargetEvent)
*/
public void drop(final IInstance instance, TransferData data, DropTargetEvent event)
{
final List<File> files = getFiles(event);
Job installApksJob =
new Job(AndroidNLS.AbstractDeviceDropSupportHandler_InstallingApksJobName)
{
@Override
protected IStatus run(IProgressMonitor monitor)
{
final List<File> failedFiles = new ArrayList<File>();
availableAPKs = null;
if (files != null)
{
for (File apk : files)
{
IStatus installationStatus = installAPK(apk, instance);
if (!installationStatus.isOK())
{
failedFiles.add(apk);
}
}
}
if (failedFiles.size() > 0)
{
PlatformUI.getWorkbench().getDisplay().asyncExec(new Runnable()
{
public void run()
{
StringBuilder builder = new StringBuilder();
builder.append(AndroidNLS.AbstractDeviceDropSupportHandler_ApplicationsFailed);
builder.append("\n"); //$NON-NLS-1$
for (File f : failedFiles)
{
builder.append("\n"); //$NON-NLS-1$
builder.append(f.getName());
}
MessageDialog.openInformation(PlatformUI.getWorkbench()
.getActiveWorkbenchWindow().getShell(),
AndroidNLS.UI_InstallApp_InstallApp, builder.toString());
}
});
}
return Status.OK_STATUS;
}
};
installApksJob.schedule();
lastEvent = null;
}
private synchronized IStatus installAPK(File apk, final IInstance instance)
{
final InstallPackageBean installBean = new InstallPackageBean();
installBean.setCanOverwrite(INSTALL_TYPE.UNINSTALL);
installBean.setPackagePath(apk.getAbsolutePath());
return DDMSUtils.installPackage(DDMSFacade.getSerialNumberByName(instance.getName()),
installBean);
}
protected List<File> getFiles(DropTargetEvent event)
{
if ((lastEvent == null) || (lastEvent != event))
{
lastEvent = event;
availableAPKs = new ArrayList<File>();
if (FileTransfer.getInstance().isSupportedType(event.currentDataType))
{
String[] files =
(String[]) FileTransfer.getInstance().nativeToJava(event.currentDataType);
// On MacOSX the files are not available until drop
if (files == null)
{
try
{
files = (String[]) event.data;
}
catch (Exception e)
{
// do nothing
files = null;
}
}
if (files != null)
{
for (int i = 0; (i < files.length); i++)
{
String filePath = files[i];
if (filePath.toLowerCase().endsWith(".apk")) //$NON-NLS-1$
{
File f = new File(filePath);
if (f.exists() && f.isFile() && f.canRead())
{
availableAPKs.add(f);
}
}
}
}
}
}
return availableAPKs;
}
}