| package com.android.ide.eclipse.gltrace; |
| |
| import com.android.ddmlib.Client; |
| import com.android.ddmlib.ClientData; |
| import com.android.ide.eclipse.ddms.IClientAction; |
| |
| import org.eclipse.core.runtime.IProgressMonitor; |
| import org.eclipse.jface.action.Action; |
| import org.eclipse.jface.dialogs.MessageDialog; |
| import org.eclipse.jface.dialogs.ProgressMonitorDialog; |
| import org.eclipse.jface.operation.IRunnableWithProgress; |
| import org.eclipse.jface.window.Window; |
| import org.eclipse.swt.widgets.Display; |
| import org.eclipse.swt.widgets.Shell; |
| |
| import java.lang.reflect.InvocationTargetException; |
| |
| public class DeviceViewAction implements IClientAction { |
| private static final class StartTraceAction extends Action { |
| private static final int LOCAL_FORWARDED_PORT = 6049; |
| |
| private Client mClient; |
| |
| public StartTraceAction() { |
| super("Start OpenGL Trace"); |
| setImageDescriptor(GlTracePlugin.getImageDescriptor("/icons/connect.png")); //$NON-NLS-1$ |
| setClient(null); |
| } |
| |
| public void setClient(Client c) { |
| mClient = c; |
| clientChanged(); |
| } |
| |
| private void clientChanged() { |
| if (mClient == null) { |
| setEnabled(false); |
| return; |
| } |
| |
| ClientData cd = mClient.getClientData(); |
| if (cd.hasFeature(ClientData.FEATURE_OPENGL_TRACING)) { |
| setEnabled(true); |
| setToolTipText("Trace OpenGL calls"); |
| } else { |
| setEnabled(false); |
| setToolTipText("Selected VM does not support tracing OpenGL calls"); |
| } |
| } |
| |
| @Override |
| public void run() { |
| if (mClient == null) { |
| return; |
| } |
| |
| Shell shell = Display.getDefault().getActiveShell(); |
| GLTraceOptionsDialog dlg = new GLTraceOptionsDialog(shell, false, |
| mClient.getClientData().getClientDescription()); |
| if (dlg.open() != Window.OK) { |
| return; |
| } |
| |
| // start tracing on the client |
| mClient.startOpenGlTracing(); |
| |
| try { |
| CollectTraceAction.setupForwarding(mClient.getDevice(), LOCAL_FORWARDED_PORT); |
| } catch (Exception e) { |
| MessageDialog.openError(shell, "Setup GL Trace", |
| "Error while setting up port forwarding: " + e.getMessage()); |
| return; |
| } |
| |
| // wait for a few seconds for the client to start the trace server |
| try { |
| new ProgressMonitorDialog(shell).run(true, true, new IRunnableWithProgress() { |
| @Override |
| public void run(IProgressMonitor monitor) |
| throws InvocationTargetException, InterruptedException { |
| Thread.sleep(3000); |
| } |
| }); |
| } catch (Exception e) { |
| } |
| |
| // retrieve the trace from the device |
| TraceOptions traceOptions = dlg.getTraceOptions(); |
| CollectTraceAction.startTracing(shell, traceOptions, LOCAL_FORWARDED_PORT); |
| |
| // inform the client that it doesn't need to be traced anymore |
| mClient.stopOpenGlTracing(); |
| |
| // remove port forwarding |
| CollectTraceAction.disablePortForwarding(mClient.getDevice(), LOCAL_FORWARDED_PORT); |
| |
| // and finally open the editor to view the file |
| CollectTraceAction.openInEditor(shell, traceOptions.traceDestination); |
| } |
| } |
| |
| private static final StartTraceAction sAction = new StartTraceAction(); |
| |
| @Override |
| public Action getAction() { |
| return sAction; |
| } |
| |
| @Override |
| public void selectedClientChanged(Client c) { |
| sAction.setClient(c); |
| } |
| } |