Fix HierarchyViewer2 to run on MacOS X correctly.
This also fix the issue with the app never closing correctly
(throwing an exception).
Also updated the launcher script to match the new ones we use in
the other Java based tools.
Change-Id: I851f0732a78c6e6c072728f05e611f01eee8fc19
diff --git a/hierarchyviewer2/app/etc/hierarchyviewer b/hierarchyviewer2/app/etc/hierarchyviewer
index 18a3aca..32dd2b8 100755
--- a/hierarchyviewer2/app/etc/hierarchyviewer
+++ b/hierarchyviewer2/app/etc/hierarchyviewer
@@ -15,6 +15,7 @@
# Set up prog to be the path of this script, including following symlinks,
# and set up progdir to be the fully-qualified pathname of its directory.
+
prog="$0"
while [ -h "${prog}" ]; do
newProg=`/bin/ls -ld "${prog}"`
@@ -52,6 +53,7 @@
exit 1
fi
+
# Check args.
if [ debug = "$1" ]; then
# add this in for debugging
@@ -61,9 +63,12 @@
java_debug=
fi
+javaCmd="java"
+
# Mac OS X needs an additional arg, or you get an "illegal thread" complaint.
if [ `uname` = "Darwin" ]; then
- os_opts="-XstartOnFirstThread"
+ os_opts=
+# os_opts="-XstartOnFirstThread"
else
os_opts=
fi
@@ -72,12 +77,7 @@
export GDK_NATIVE_WINDOWS=true
fi
-if [ "$OSTYPE" = "cygwin" ] ; then
- jarpath=`cygpath -w "$frameworkdir/$jarfile"`
- progdir=`cygpath -w "$progdir"`
-else
- jarpath="$frameworkdir/$jarfile"
-fi
+jarpath="$frameworkdir/$jarfile"
# Figure out the path to the swt.jar for the current architecture.
# if ANDROID_SWT is defined, then just use this.
@@ -87,7 +87,7 @@
if [ -n "$ANDROID_SWT" ]; then
swtpath="$ANDROID_SWT"
else
- vmarch=`java -jar "${frameworkdir}"/archquery.jar`
+ vmarch=`${javaCmd} -jar "${frameworkdir}"/archquery.jar`
if [ -n "$ANDROID_BUILD_TOP" ]; then
osname=`uname -s | tr A-Z a-z`
swtpath="${ANDROID_BUILD_TOP}/prebuilt/${osname}-${vmarch}/swt"
@@ -96,10 +96,7 @@
fi
fi
-# Combine the swtpath and the framework dir path.
-if [ -d "$swtpath" ]; then
- frameworkdir="${swtpath}:${frameworkdir}"
-else
+if [ ! -d "$swtpath" ]; then
echo "SWT folder '${swtpath}' does not exist."
echo "Please export ANDROID_SWT to point to the folder containing swt.jar for your platform."
exit 1
@@ -107,4 +104,4 @@
# need to use "java.ext.dirs" because "-jar" causes classpath to be ignored
# might need more memory, e.g. -Xmx128M
-exec java -Xmx512M $java_debug -Djava.ext.dirs="$frameworkdir" -Dcom.android.hierarchyviewer.bindir="$progdir" -jar "$jarpath" "$@"
+exec "$javaCmd" -Xmx5126M $os_opts $java_debug -Dcom.android.hierarchyviewer.bindir="$progdir" -classpath "$jarpath:$swtpath/swt.jar" com.android.hierarchyviewer.HierarchyViewerApplication "$@"
diff --git a/hierarchyviewer2/app/etc/manifest.txt b/hierarchyviewer2/app/etc/manifest.txt
index c1b0666..52759c9 100644
--- a/hierarchyviewer2/app/etc/manifest.txt
+++ b/hierarchyviewer2/app/etc/manifest.txt
@@ -1,2 +1,2 @@
Main-Class: com.android.hierarchyviewer.HierarchyViewerApplication
-Class-Path: ddmlib.jar ddmuilib.jar hierarchyviewerlib.jar swt.jar org.eclipse.jface_3.4.2.M20090107-0800.jar org.eclipse.core.commands_3.4.0.I20080509-2000.jar sdklib.jar
+Class-Path: ddmlib.jar ddmuilib.jar hierarchyviewerlib.jar sdklib.jar org.eclipse.jface_3.4.2.M20090107-0800.jar org.eclipse.core.commands_3.4.0.I20080509-2000.jar org.eclipse.equinox.common_3.4.0.v20080421-2006.jar
diff --git a/hierarchyviewer2/app/src/com/android/hierarchyviewer/HierarchyViewerApplication.java b/hierarchyviewer2/app/src/com/android/hierarchyviewer/HierarchyViewerApplication.java
index df4f08f..25943c4 100644
--- a/hierarchyviewer2/app/src/com/android/hierarchyviewer/HierarchyViewerApplication.java
+++ b/hierarchyviewer2/app/src/com/android/hierarchyviewer/HierarchyViewerApplication.java
@@ -16,6 +16,7 @@
package com.android.hierarchyviewer;
+import com.android.ddmlib.Log;
import com.android.ddmuilib.ImageLoader;
import com.android.hierarchyviewer.actions.AboutAction;
import com.android.hierarchyviewer.actions.LoadAllViewsAction;
@@ -81,77 +82,65 @@
public class HierarchyViewerApplication extends ApplicationWindow {
private static final int INITIAL_WIDTH = 1024;
-
private static final int INITIAL_HEIGHT = 768;
- private static HierarchyViewerApplication mApp;
+ private static HierarchyViewerApplication sMainWindow;
// Images for moving between the 3 main windows.
-
private Image mDeviceViewImage;
-
private Image mPixelPerfectImage;
-
private Image mTreeViewImage;
-
private Image mDeviceViewSelectedImage;
-
private Image mPixelPerfectSelectedImage;
-
private Image mTreeViewSelectedImage;
// And their buttons
-
private Button mTreeViewButton;
-
private Button mPixelPerfectButton;
-
private Button mDeviceViewButton;
private Label mProgressLabel;
-
private ProgressBar mProgressBar;
-
private String mProgressString;
private Composite mDeviceSelectorPanel;
-
private Composite mTreeViewPanel;
-
private Composite mPixelPerfectPanel;
-
private StackLayout mMainWindowStackLayout;
-
private DeviceSelector mDeviceSelector;
-
private Composite mStatusBar;
-
private TreeView mTreeView;
-
private Composite mMainWindow;
-
private Image mOnBlackImage;
-
private Image mOnWhiteImage;
-
private Button mOnBlackWhiteButton;
-
private Button mShowExtras;
-
private LayoutViewer mLayoutViewer;
-
private PixelPerfectLoupe mPixelPerfectLoupe;
-
private Composite mTreeViewControls;
- public static final HierarchyViewerApplication getApp() {
- return mApp;
+ private HierarchyViewerDirector mDirector;
+
+ /*
+ * If a thread bails with an uncaught exception, bring the whole
+ * thing down.
+ */
+ private static class UncaughtHandler implements Thread.UncaughtExceptionHandler {
+ public void uncaughtException(Thread t, Throwable e) {
+ Log.e("HierarchyViewer", "shutting down due to uncaught exception");
+ Log.e("HierarchyViewer", e);
+ System.exit(1);
+ }
+ }
+
+ public static final HierarchyViewerApplication getMainWindow() {
+ return sMainWindow;
}
public HierarchyViewerApplication() {
- super(null);
+ super(null /*shell*/);
- mApp = this;
+ sMainWindow = this;
addMenuBar();
}
@@ -171,25 +160,17 @@
}
public void run() {
- HierarchyViewerDirector director = HierarchyViewerApplicationDirector.createDirector();
- director.initDebugBridge();
- director.startListenForDevices();
- director.populateDeviceSelectionModel();
- TreeViewModel.getModel().addTreeChangeListener(treeChangeListener);
- PixelPerfectModel.getModel().addImageChangeListener(imageChangeListener);
-
setBlockOnOpen(true);
open();
- TreeViewModel.getModel().removeTreeChangeListener(treeChangeListener);
- PixelPerfectModel.getModel().removeImageChangeListener(imageChangeListener);
+ TreeViewModel.getModel().removeTreeChangeListener(mTreeChangeListener);
+ PixelPerfectModel.getModel().removeImageChangeListener(mImageChangeListener);
- Display.getCurrent().dispose();
ImageLoader.dispose();
- director.stopListenForDevices();
- director.stopDebugBridge();
- director.terminate();
+ mDirector.stopListenForDevices();
+ mDirector.stopDebugBridge();
+ mDirector.terminate();
}
@Override
@@ -218,6 +199,15 @@
@Override
protected Control createContents(Composite parent) {
+ // create this only once the window is opened to please SWT on Mac
+ mDirector = HierarchyViewerApplicationDirector.createDirector();
+ mDirector.initDebugBridge();
+ mDirector.startListenForDevices();
+ mDirector.populateDeviceSelectionModel();
+
+ TreeViewModel.getModel().addTreeChangeListener(mTreeChangeListener);
+ PixelPerfectModel.getModel().addImageChangeListener(mImageChangeListener);
+
loadResources();
Composite control = new Composite(parent, SWT.NONE);
@@ -591,10 +581,13 @@
MenuManager mm = getMenuBarManager();
mm.removeAll();
- MenuManager file = new MenuManager("&File");
- mm.add(file);
+ String os = System.getProperty("os.name"); //$NON-NLS-1$
+ if (os.startsWith("Mac OS") == false) { //$NON-NLS-1$
+ MenuManager file = new MenuManager("&File");
+ mm.add(file);
- file.add(QuitAction.getAction());
+ file.add(QuitAction.getAction());
+ }
MenuManager device = new MenuManager("&Devices");
mm.add(device);
@@ -633,10 +626,13 @@
MenuManager mm = getMenuBarManager();
mm.removeAll();
- MenuManager file = new MenuManager("&File");
- mm.add(file);
+ String os = System.getProperty("os.name"); //$NON-NLS-1$
+ if (os.startsWith("Mac OS") == false) { //$NON-NLS-1$
+ MenuManager file = new MenuManager("&File");
+ mm.add(file);
- file.add(QuitAction.getAction());
+ file.add(QuitAction.getAction());
+ }
MenuManager treeViewMenu = new MenuManager("&Tree View");
mm.add(treeViewMenu);
@@ -680,10 +676,13 @@
MenuManager mm = getMenuBarManager();
mm.removeAll();
- MenuManager file = new MenuManager("&File");
- mm.add(file);
+ String os = System.getProperty("os.name"); //$NON-NLS-1$
+ if (os.startsWith("Mac OS") == false) { //$NON-NLS-1$
+ MenuManager file = new MenuManager("&File");
+ mm.add(file);
- file.add(QuitAction.getAction());
+ file.add(QuitAction.getAction());
+ }
MenuManager pixelPerfect = new MenuManager("&Pixel Perfect");
pixelPerfect.add(SavePixelPerfectAction.getAction(getShell()));
@@ -791,7 +790,7 @@
}
};
- private ITreeChangeListener treeChangeListener = new ITreeChangeListener() {
+ private ITreeChangeListener mTreeChangeListener = new ITreeChangeListener() {
public void selectionChanged() {
// pass
}
@@ -819,7 +818,7 @@
}
};
- private IImageChangeListener imageChangeListener = new IImageChangeListener() {
+ private IImageChangeListener mImageChangeListener = new IImageChangeListener() {
public void crosshairMoved() {
// pass
@@ -866,11 +865,9 @@
};
public static void main(String[] args) {
- Display.getDefault().syncExec(new Runnable() {
- public void run() {
- new HierarchyViewerApplication().run();
- }
- });
- System.exit(0);
+ Thread.setDefaultUncaughtExceptionHandler(new UncaughtHandler());
+
+ Display.setAppName("HierarchyViewer");
+ new HierarchyViewerApplication().run();
}
}
diff --git a/hierarchyviewer2/app/src/com/android/hierarchyviewer/HierarchyViewerApplicationDirector.java b/hierarchyviewer2/app/src/com/android/hierarchyviewer/HierarchyViewerApplicationDirector.java
index 23b6210..d1a5b8c 100644
--- a/hierarchyviewer2/app/src/com/android/hierarchyviewer/HierarchyViewerApplicationDirector.java
+++ b/hierarchyviewer2/app/src/com/android/hierarchyviewer/HierarchyViewerApplicationDirector.java
@@ -62,9 +62,9 @@
public void executeInBackground(final String taskName, final Runnable task) {
mExecutor.execute(new Runnable() {
public void run() {
- HierarchyViewerApplication.getApp().startTask(taskName);
+ HierarchyViewerApplication.getMainWindow().startTask(taskName);
task.run();
- HierarchyViewerApplication.getApp().endTask();
+ HierarchyViewerApplication.getMainWindow().endTask();
}
});
}
diff --git a/hierarchyviewer2/app/src/com/android/hierarchyviewer/actions/QuitAction.java b/hierarchyviewer2/app/src/com/android/hierarchyviewer/actions/QuitAction.java
index 3e9598d..b5a8c5f 100644
--- a/hierarchyviewer2/app/src/com/android/hierarchyviewer/actions/QuitAction.java
+++ b/hierarchyviewer2/app/src/com/android/hierarchyviewer/actions/QuitAction.java
@@ -39,6 +39,6 @@
@Override
public void run() {
- HierarchyViewerApplication.getApp().close();
+ HierarchyViewerApplication.getMainWindow().close();
}
}
diff --git a/hierarchyviewer2/app/src/com/android/hierarchyviewer/actions/ShowOverlayAction.java b/hierarchyviewer2/app/src/com/android/hierarchyviewer/actions/ShowOverlayAction.java
index 987386d..72adb5f 100644
--- a/hierarchyviewer2/app/src/com/android/hierarchyviewer/actions/ShowOverlayAction.java
+++ b/hierarchyviewer2/app/src/com/android/hierarchyviewer/actions/ShowOverlayAction.java
@@ -55,7 +55,7 @@
@Override
public void run() {
- HierarchyViewerApplication.getApp().showOverlayInLoupe(sAction.isChecked());
+ HierarchyViewerApplication.getMainWindow().showOverlayInLoupe(sAction.isChecked());
}
public Image getImage() {
diff --git a/hierarchyviewer2/libs/hierarchyviewerlib/manifest.txt b/hierarchyviewer2/libs/hierarchyviewerlib/manifest.txt
new file mode 100644
index 0000000..ac6ab55
--- /dev/null
+++ b/hierarchyviewer2/libs/hierarchyviewerlib/manifest.txt
@@ -0,0 +1 @@
+Class-Path: ddmlib.jar ddmuilib.jar hierarchyviewerlib.jar org.eclipse.jface_3.4.2.M20090107-0800.jar org.eclipse.core.commands_3.4.0.I20080509-2000.jar org.eclipse.equinox.common_3.4.0.v20080421-2006.jar
diff --git a/hierarchyviewer2/libs/hierarchyviewerlib/src/Android.mk b/hierarchyviewer2/libs/hierarchyviewerlib/src/Android.mk
index ecaabde..ded20e1 100644
--- a/hierarchyviewer2/libs/hierarchyviewerlib/src/Android.mk
+++ b/hierarchyviewer2/libs/hierarchyviewerlib/src/Android.mk
@@ -18,6 +18,8 @@
LOCAL_SRC_FILES := $(call all-subdir-java-files)
LOCAL_JAVA_RESOURCE_DIRS := resources
+LOCAL_JAR_MANIFEST := ../manifest.txt
+
LOCAL_JAVA_LIBRARIES := ddmlib \
ddmuilib \
swt \