From e361a961cbe1ead74659b4a761453b312d026e55 Mon Sep 17 00:00:00 2001 From: Konstantin Lopyrev Date: Mon, 9 Aug 2010 17:42:51 -0700 Subject: Increasing the changes of a device connecting properly and making sure things are disposed of properly. Change-Id: Ib1190c65c8ac9795fc0b97beacd7fd102cb95abf --- .../src/com/android/hierarchyviewer/UIThread.java | 5 ++- .../HierarchyViewerDirector.java | 52 +++++++++++++++------- .../hierarchyviewerlib/device/DeviceBridge.java | 7 ++- .../hierarchyvieweruilib/DeviceSelector.java | 16 ++++--- .../android/hierarchyvieweruilib/PixelPerfect.java | 23 ++++++---- .../hierarchyvieweruilib/PixelPerfectLoupe.java | 26 ++++++----- .../hierarchyvieweruilib/PixelPerfectTree.java | 17 ++++--- .../com/android/hierarchyvieweruilib/TreeView.java | 16 ++++--- .../hierarchyvieweruilib/TreeViewOverview.java | 16 ++++--- 9 files changed, 116 insertions(+), 62 deletions(-) (limited to 'hierarchyviewer2') diff --git a/hierarchyviewer2/app/src/com/android/hierarchyviewer/UIThread.java b/hierarchyviewer2/app/src/com/android/hierarchyviewer/UIThread.java index f1965b2..4dd990b 100644 --- a/hierarchyviewer2/app/src/com/android/hierarchyviewer/UIThread.java +++ b/hierarchyviewer2/app/src/com/android/hierarchyviewer/UIThread.java @@ -88,7 +88,7 @@ public class UIThread { TreeViewOverview treeViewOverview = new TreeViewOverview(shell3); shell3.open(); // ComponentRegistry.getDirector().loadViewTreeData(null); - while (!shell.isDisposed() && !shell2.isDisposed()) { + while (!shell.isDisposed() && !shell2.isDisposed() && !shell3.isDisposed()) { if (!display.readAndDispatch()) { display.sleep(); } @@ -99,6 +99,9 @@ public class UIThread { if (!shell2.isDisposed()) { shell2.dispose(); } + if (!shell3.isDisposed()) { + shell3.dispose(); + } // NO LONGER TESTING STUFF. diff --git a/hierarchyviewer2/libs/hierarchyviewerlib/src/com/android/hierarchyviewerlib/HierarchyViewerDirector.java b/hierarchyviewer2/libs/hierarchyviewerlib/src/com/android/hierarchyviewerlib/HierarchyViewerDirector.java index b63fba8..65cb24f 100644 --- a/hierarchyviewer2/libs/hierarchyviewerlib/src/com/android/hierarchyviewerlib/HierarchyViewerDirector.java +++ b/hierarchyviewer2/libs/hierarchyviewerlib/src/com/android/hierarchyviewerlib/HierarchyViewerDirector.java @@ -77,27 +77,49 @@ public abstract class HierarchyViewerDirector implements IDeviceChangeListener, DeviceBridge.setupDeviceForward(device); if (!DeviceBridge.isViewServerRunning(device)) { if (!DeviceBridge.startViewServer(device)) { - DeviceBridge.removeDeviceForward(device); - Log.e(TAG, "Unable to debug device " + device); + // Let's do something interesting here... Try again in 2 + // seconds. + executeInBackground(new Runnable() { + public void run() { + try { + Thread.sleep(2000); + } catch (InterruptedException e) { + Log.e(TAG, "Unable to debug device " + device); + DeviceBridge.removeDeviceForward(device); + return; + } + if (!DeviceBridge.startViewServer(device)) { + Log.e(TAG, "Unable to debug device " + device); + DeviceBridge.removeDeviceForward(device); + } else { + loadViewServerInfoAndWindows(device); + } + } + }); return; } } - executeInBackground(new Runnable() { - public void run() { - ViewServerInfo viewServerInfo = DeviceBridge.loadViewServerInfo(device); - Window[] windows = DeviceBridge.loadWindows(device); - ComponentRegistry.getDeviceSelectionModel().addDevice(device, windows); - if (viewServerInfo.protocolVersion >= 3) { - WindowUpdater.startListenForWindowChanges(HierarchyViewerDirector.this, - device); - focusChanged(device); - } - } - }); - + loadViewServerInfoAndWindows(device); } } + private void loadViewServerInfoAndWindows(final IDevice device) { + executeInBackground(new Runnable() { + public void run() { + ViewServerInfo viewServerInfo = DeviceBridge.loadViewServerInfo(device); + if (viewServerInfo == null) { + return; + } + Window[] windows = DeviceBridge.loadWindows(device); + ComponentRegistry.getDeviceSelectionModel().addDevice(device, windows); + if (viewServerInfo.protocolVersion >= 3) { + WindowUpdater.startListenForWindowChanges(HierarchyViewerDirector.this, device); + focusChanged(device); + } + } + }); + } + public void deviceDisconnected(IDevice device) { ViewServerInfo viewServerInfo = DeviceBridge.getViewServerInfo(device); if (viewServerInfo == null) { diff --git a/hierarchyviewer2/libs/hierarchyviewerlib/src/com/android/hierarchyviewerlib/device/DeviceBridge.java b/hierarchyviewer2/libs/hierarchyviewerlib/src/com/android/hierarchyviewerlib/device/DeviceBridge.java index 34e7c03..c9244d2 100644 --- a/hierarchyviewer2/libs/hierarchyviewerlib/src/com/android/hierarchyviewerlib/device/DeviceBridge.java +++ b/hierarchyviewer2/libs/hierarchyviewerlib/src/com/android/hierarchyviewerlib/device/DeviceBridge.java @@ -257,8 +257,8 @@ public class DeviceBridge { } public static ViewServerInfo loadViewServerInfo(IDevice device) { - int server = 2; - int protocol = 2; + int server = -1; + int protocol = -1; DeviceConnection connection = null; try { connection = new DeviceConnection(device); @@ -289,6 +289,9 @@ public class DeviceBridge { connection.close(); } } + if (server == -1 || protocol == -1) { + return null; + } ViewServerInfo returnValue = new ViewServerInfo(server, protocol); synchronized (viewServerInfo) { viewServerInfo.put(device, returnValue); diff --git a/hierarchyviewer2/libs/hierarchyvieweruilib/src/com/android/hierarchyvieweruilib/DeviceSelector.java b/hierarchyviewer2/libs/hierarchyvieweruilib/src/com/android/hierarchyvieweruilib/DeviceSelector.java index 187a3fa..4add510 100644 --- a/hierarchyviewer2/libs/hierarchyvieweruilib/src/com/android/hierarchyvieweruilib/DeviceSelector.java +++ b/hierarchyviewer2/libs/hierarchyvieweruilib/src/com/android/hierarchyvieweruilib/DeviceSelector.java @@ -31,6 +31,8 @@ import org.eclipse.jface.viewers.TreeSelection; import org.eclipse.jface.viewers.TreeViewer; import org.eclipse.jface.viewers.Viewer; import org.eclipse.swt.SWT; +import org.eclipse.swt.events.DisposeEvent; +import org.eclipse.swt.events.DisposeListener; import org.eclipse.swt.events.SelectionEvent; import org.eclipse.swt.events.SelectionListener; import org.eclipse.swt.graphics.Font; @@ -158,6 +160,8 @@ public class DeviceSelector extends Composite implements WindowChangeListener, S tree.setLinesVisible(true); tree.addSelectionListener(this); + addDisposeListener(disposeListener); + loadResources(); model = ComponentRegistry.getDeviceSelectionModel(); @@ -192,12 +196,12 @@ public class DeviceSelector extends Composite implements WindowChangeListener, S .getSystemColor(SWT.COLOR_BLUE)); } - @Override - public void dispose() { - super.dispose(); - model.removeWindowChangeListener(this); - boldFont.dispose(); - } + private DisposeListener disposeListener = new DisposeListener() { + public void widgetDisposed(DisposeEvent e) { + model.removeWindowChangeListener(DeviceSelector.this); + boldFont.dispose(); + } + }; @Override public boolean setFocus() { diff --git a/hierarchyviewer2/libs/hierarchyvieweruilib/src/com/android/hierarchyvieweruilib/PixelPerfect.java b/hierarchyviewer2/libs/hierarchyvieweruilib/src/com/android/hierarchyvieweruilib/PixelPerfect.java index 3972830..5336ec3 100644 --- a/hierarchyviewer2/libs/hierarchyvieweruilib/src/com/android/hierarchyvieweruilib/PixelPerfect.java +++ b/hierarchyviewer2/libs/hierarchyvieweruilib/src/com/android/hierarchyvieweruilib/PixelPerfect.java @@ -25,6 +25,8 @@ import com.android.hierarchyviewerlib.models.PixelPerfectModel.Point; import org.eclipse.swt.SWT; import org.eclipse.swt.custom.ScrolledComposite; +import org.eclipse.swt.events.DisposeEvent; +import org.eclipse.swt.events.DisposeListener; import org.eclipse.swt.events.MouseEvent; import org.eclipse.swt.events.MouseListener; import org.eclipse.swt.events.MouseMoveListener; @@ -75,22 +77,25 @@ public class PixelPerfect extends ScrolledComposite implements ImageChangeListen canvas.addMouseListener(mouseListener); canvas.addMouseMoveListener(mouseMoveListener); + addDisposeListener(disposeListener); + crosshairColor = new Color(Display.getDefault(), new RGB(0, 255, 255)); borderColor = new Color(Display.getDefault(), new RGB(255, 0, 0)); marginColor = new Color(Display.getDefault(), new RGB(0, 255, 0)); paddingColor = new Color(Display.getDefault(), new RGB(0, 0, 255)); } - @Override - public void dispose() { - super.dispose(); - if (image != null) { - image.dispose(); + private DisposeListener disposeListener = new DisposeListener() { + public void widgetDisposed(DisposeEvent e) { + model.removeImageChangeListener(PixelPerfect.this); + if (image != null) { + image.dispose(); + } + crosshairColor.dispose(); + borderColor.dispose(); + paddingColor.dispose(); } - crosshairColor.dispose(); - borderColor.dispose(); - paddingColor.dispose(); - } + }; @Override public boolean setFocus() { diff --git a/hierarchyviewer2/libs/hierarchyvieweruilib/src/com/android/hierarchyvieweruilib/PixelPerfectLoupe.java b/hierarchyviewer2/libs/hierarchyvieweruilib/src/com/android/hierarchyvieweruilib/PixelPerfectLoupe.java index 62bb8c7..f0402f3 100644 --- a/hierarchyviewer2/libs/hierarchyvieweruilib/src/com/android/hierarchyvieweruilib/PixelPerfectLoupe.java +++ b/hierarchyviewer2/libs/hierarchyvieweruilib/src/com/android/hierarchyvieweruilib/PixelPerfectLoupe.java @@ -23,6 +23,8 @@ import com.android.hierarchyviewerlib.models.PixelPerfectModel.ImageChangeListen import com.android.hierarchyviewerlib.models.PixelPerfectModel.Point; import org.eclipse.swt.SWT; +import org.eclipse.swt.events.DisposeEvent; +import org.eclipse.swt.events.DisposeListener; import org.eclipse.swt.events.MouseEvent; import org.eclipse.swt.events.MouseListener; import org.eclipse.swt.events.MouseWheelListener; @@ -71,24 +73,26 @@ public class PixelPerfectLoupe extends Canvas implements ImageChangeListener { addPaintListener(paintListener); addMouseListener(mouseListener); addMouseWheelListener(mouseWheelListener); + addDisposeListener(disposeListener); crosshairColor = new Color(Display.getDefault(), new RGB(255, 94, 254)); transform = new Transform(Display.getDefault()); } - @Override - public void dispose() { - super.dispose(); - if (image != null) { - image.dispose(); - } - crosshairColor.dispose(); - transform.dispose(); - if (grid != null) { - grid.dispose(); + private DisposeListener disposeListener = new DisposeListener() { + public void widgetDisposed(DisposeEvent e) { + model.removeImageChangeListener(PixelPerfectLoupe.this); + if (image != null) { + image.dispose(); + } + crosshairColor.dispose(); + transform.dispose(); + if (grid != null) { + grid.dispose(); + } } - } + }; private MouseListener mouseListener = new MouseListener() { diff --git a/hierarchyviewer2/libs/hierarchyvieweruilib/src/com/android/hierarchyvieweruilib/PixelPerfectTree.java b/hierarchyviewer2/libs/hierarchyvieweruilib/src/com/android/hierarchyvieweruilib/PixelPerfectTree.java index 9f25a33..30a7b9e 100644 --- a/hierarchyviewer2/libs/hierarchyvieweruilib/src/com/android/hierarchyvieweruilib/PixelPerfectTree.java +++ b/hierarchyviewer2/libs/hierarchyvieweruilib/src/com/android/hierarchyvieweruilib/PixelPerfectTree.java @@ -29,6 +29,8 @@ import org.eclipse.jface.viewers.TreeSelection; import org.eclipse.jface.viewers.TreeViewer; import org.eclipse.jface.viewers.Viewer; import org.eclipse.swt.SWT; +import org.eclipse.swt.events.DisposeEvent; +import org.eclipse.swt.events.DisposeListener; import org.eclipse.swt.events.SelectionEvent; import org.eclipse.swt.events.SelectionListener; import org.eclipse.swt.graphics.Image; @@ -142,6 +144,8 @@ public class PixelPerfectTree extends Composite implements ImageChangeListener, loadResources(); + addDisposeListener(disposeListener); + model = ComponentRegistry.getPixelPerfectModel(); ContentProvider contentProvider = new ContentProvider(); treeViewer.setContentProvider(contentProvider); @@ -158,12 +162,13 @@ public class PixelPerfectTree extends Composite implements ImageChangeListener, folderImage = loader.loadImage("folder.png", Display.getDefault()); } - @Override - public void dispose() { - super.dispose(); - fileImage.dispose(); - folderImage.dispose(); - } + private DisposeListener disposeListener = new DisposeListener() { + public void widgetDisposed(DisposeEvent e) { + model.removeImageChangeListener(PixelPerfectTree.this); + fileImage.dispose(); + folderImage.dispose(); + } + }; @Override public boolean setFocus() { diff --git a/hierarchyviewer2/libs/hierarchyvieweruilib/src/com/android/hierarchyvieweruilib/TreeView.java b/hierarchyviewer2/libs/hierarchyvieweruilib/src/com/android/hierarchyvieweruilib/TreeView.java index a29bdb3..2bf4012 100644 --- a/hierarchyviewer2/libs/hierarchyvieweruilib/src/com/android/hierarchyvieweruilib/TreeView.java +++ b/hierarchyviewer2/libs/hierarchyvieweruilib/src/com/android/hierarchyvieweruilib/TreeView.java @@ -24,6 +24,8 @@ import com.android.hierarchyviewerlib.scene.DrawableViewNode.Point; import com.android.hierarchyviewerlib.scene.DrawableViewNode.Rectangle; import org.eclipse.swt.SWT; +import org.eclipse.swt.events.DisposeEvent; +import org.eclipse.swt.events.DisposeListener; import org.eclipse.swt.events.MouseEvent; import org.eclipse.swt.events.MouseListener; import org.eclipse.swt.events.MouseMoveListener; @@ -67,17 +69,19 @@ public class TreeView extends Canvas implements TreeChangeListener { addMouseMoveListener(mouseMoveListener); addMouseWheelListener(mouseWheelListener); addListener(SWT.Resize, resizeListener); + addDisposeListener(disposeListener); transform = new Transform(Display.getDefault()); inverse = new Transform(Display.getDefault()); } - @Override - public void dispose() { - super.dispose(); - transform.dispose(); - inverse.dispose(); - } + private DisposeListener disposeListener = new DisposeListener() { + public void widgetDisposed(DisposeEvent e) { + model.removeTreeChangeListener(TreeView.this); + transform.dispose(); + inverse.dispose(); + } + }; private Listener resizeListener = new Listener() { public void handleEvent(Event e) { diff --git a/hierarchyviewer2/libs/hierarchyvieweruilib/src/com/android/hierarchyvieweruilib/TreeViewOverview.java b/hierarchyviewer2/libs/hierarchyvieweruilib/src/com/android/hierarchyvieweruilib/TreeViewOverview.java index cfa9070..d299717 100644 --- a/hierarchyviewer2/libs/hierarchyvieweruilib/src/com/android/hierarchyvieweruilib/TreeViewOverview.java +++ b/hierarchyviewer2/libs/hierarchyvieweruilib/src/com/android/hierarchyvieweruilib/TreeViewOverview.java @@ -24,6 +24,8 @@ import com.android.hierarchyviewerlib.scene.DrawableViewNode.Point; import com.android.hierarchyviewerlib.scene.DrawableViewNode.Rectangle; import org.eclipse.swt.SWT; +import org.eclipse.swt.events.DisposeEvent; +import org.eclipse.swt.events.DisposeListener; import org.eclipse.swt.events.MouseEvent; import org.eclipse.swt.events.MouseListener; import org.eclipse.swt.events.MouseMoveListener; @@ -64,17 +66,19 @@ public class TreeViewOverview extends Canvas implements TreeChangeListener { addMouseListener(mouseListener); addMouseMoveListener(mouseMoveListener); addListener(SWT.Resize, resizeListener); + addDisposeListener(disposeListener); transform = new Transform(Display.getDefault()); inverse = new Transform(Display.getDefault()); } - @Override - public void dispose() { - super.dispose(); - transform.dispose(); - inverse.dispose(); - } + private DisposeListener disposeListener = new DisposeListener() { + public void widgetDisposed(DisposeEvent e) { + model.removeTreeChangeListener(TreeViewOverview.this); + transform.dispose(); + inverse.dispose(); + } + }; private MouseListener mouseListener = new MouseListener() { -- cgit v1.1