aboutsummaryrefslogtreecommitdiff
path: root/eclipse/plugins/com.android.ide.eclipse.gldebugger/src/com/android/ide/eclipse/gltrace/DeviceViewAction.java
diff options
context:
space:
mode:
Diffstat (limited to 'eclipse/plugins/com.android.ide.eclipse.gldebugger/src/com/android/ide/eclipse/gltrace/DeviceViewAction.java')
-rw-r--r--eclipse/plugins/com.android.ide.eclipse.gldebugger/src/com/android/ide/eclipse/gltrace/DeviceViewAction.java113
1 files changed, 113 insertions, 0 deletions
diff --git a/eclipse/plugins/com.android.ide.eclipse.gldebugger/src/com/android/ide/eclipse/gltrace/DeviceViewAction.java b/eclipse/plugins/com.android.ide.eclipse.gldebugger/src/com/android/ide/eclipse/gltrace/DeviceViewAction.java
new file mode 100644
index 000000000..7d912bafe
--- /dev/null
+++ b/eclipse/plugins/com.android.ide.eclipse.gldebugger/src/com/android/ide/eclipse/gltrace/DeviceViewAction.java
@@ -0,0 +1,113 @@
+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);
+ }
+}