aboutsummaryrefslogtreecommitdiff
path: root/eclipse/plugins/com.android.ide.eclipse.monitor/src/com/android/ide/eclipse/monitor/MonitorApplication.java
diff options
context:
space:
mode:
Diffstat (limited to 'eclipse/plugins/com.android.ide.eclipse.monitor/src/com/android/ide/eclipse/monitor/MonitorApplication.java')
-rw-r--r--eclipse/plugins/com.android.ide.eclipse.monitor/src/com/android/ide/eclipse/monitor/MonitorApplication.java179
1 files changed, 179 insertions, 0 deletions
diff --git a/eclipse/plugins/com.android.ide.eclipse.monitor/src/com/android/ide/eclipse/monitor/MonitorApplication.java b/eclipse/plugins/com.android.ide.eclipse.monitor/src/com/android/ide/eclipse/monitor/MonitorApplication.java
new file mode 100644
index 000000000..425786f6f
--- /dev/null
+++ b/eclipse/plugins/com.android.ide.eclipse.monitor/src/com/android/ide/eclipse/monitor/MonitorApplication.java
@@ -0,0 +1,179 @@
+/*
+ * Copyright (C) 2011 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.android.ide.eclipse.monitor;
+
+import com.android.ide.eclipse.monitor.SdkToolsLocator.SdkInstallStatus;
+import com.android.prefs.AndroidLocation;
+import com.android.sdklib.SdkManager;
+import com.android.sdkstats.SdkStatsService;
+import com.android.sdkuilib.internal.repository.ui.AdtUpdateDialog;
+import com.android.utils.ILogger;
+import com.android.utils.NullLogger;
+
+import org.eclipse.core.runtime.IPath;
+import org.eclipse.core.runtime.Path;
+import org.eclipse.core.runtime.Platform;
+import org.eclipse.equinox.app.IApplication;
+import org.eclipse.equinox.app.IApplicationContext;
+import org.eclipse.jface.dialogs.MessageDialog;
+import org.eclipse.jface.window.Window;
+import org.eclipse.osgi.service.datalocation.Location;
+import org.eclipse.swt.widgets.Display;
+import org.eclipse.swt.widgets.Shell;
+import org.eclipse.ui.IWorkbench;
+import org.eclipse.ui.PlatformUI;
+
+import java.io.File;
+
+public class MonitorApplication implements IApplication {
+ private static final String SDK_PATH_ENVVAR = "com.android.sdk.path";
+ private static final String MONITOR_WORKSPACE_PATH = "monitor-workspace";
+
+ @Override
+ public Object start(IApplicationContext context) throws Exception {
+ Display display = PlatformUI.createDisplay();
+
+ // set workspace location
+ Location instanceLoc = Platform.getInstanceLocation();
+ IPath workspacePath = new Path(AndroidLocation.getFolder()).append(MONITOR_WORKSPACE_PATH);
+ instanceLoc.set(workspacePath.toFile().toURI().toURL(), true);
+
+ // figure out path to SDK
+ String sdkPath = findSdkPath(display);
+ if (!isValidSdkLocation(sdkPath)) {
+ // exit with return code -1
+ return Integer.valueOf(-1);
+ }
+ MonitorPlugin.getDefault().setSdkFolder(new File(sdkPath));
+
+ // install platform tools if necessary
+ ILogger sdkLog = NullLogger.getLogger();
+ SdkManager manager = SdkManager.createManager(sdkPath, sdkLog);
+ if (manager.getPlatformToolsVersion() == null) {
+ boolean install = MessageDialog.openQuestion(new Shell(display),
+ "Monitor",
+ "The platform tools package that provides adb is missing from your SDK installation. "
+ + "Monitor requires this package to work properly. Would you like to install that package now?");
+ if (!install) {
+ return Integer.valueOf(-1);
+ }
+ AdtUpdateDialog window = new AdtUpdateDialog(new Shell(display), sdkLog, sdkPath);
+ window.installPlatformTools();
+ }
+
+ // If this is the first time using ddms or adt, open up the stats service
+ // opt out dialog, and request user for permissions.
+ // Note that the actual ping is performed in MonitorStartup
+ SdkStatsService stats = new SdkStatsService();
+ stats.checkUserPermissionForPing(new Shell(display));
+
+ // open up RCP
+ try {
+ int returnCode = PlatformUI.createAndRunWorkbench(display,
+ new MonitorWorkbenchAdvisor());
+ if (returnCode == PlatformUI.RETURN_RESTART) {
+ return IApplication.EXIT_RESTART;
+ }
+ return IApplication.EXIT_OK;
+ } finally {
+ display.dispose();
+ }
+ }
+
+ @Override
+ public void stop() {
+ if (!PlatformUI.isWorkbenchRunning())
+ return;
+ final IWorkbench workbench = PlatformUI.getWorkbench();
+ final Display display = workbench.getDisplay();
+ display.syncExec(new Runnable() {
+ @Override
+ public void run() {
+ if (!display.isDisposed())
+ workbench.close();
+ }
+ });
+ }
+
+ private String findSdkPath(Display display) {
+ // see if there is a system property set (passed in via a command line arg)
+ String sdkLocation = System.getProperty(SDK_PATH_ENVVAR);
+ if (isValidSdkLocation(sdkLocation)) {
+ return sdkLocation;
+ }
+
+ // see if there is an environment variable set
+ sdkLocation = System.getenv(SDK_PATH_ENVVAR);
+ if (isValidSdkLocation(sdkLocation)) {
+ return sdkLocation;
+ }
+
+ // The monitor app should be located in "<sdk>/tools/lib/monitor-platform/"
+ // So see if the folder one level up from the install location is a valid SDK.
+ Location install = Platform.getInstallLocation();
+ if (install != null && install.getURL() != null) {
+ File libFolder = new File(install.getURL().getFile()).getParentFile();
+ if (libFolder != null) {
+ String toolsFolder = libFolder.getParent();
+ if (toolsFolder != null) {
+ sdkLocation = new File(toolsFolder).getParent();
+ if (isValidSdkLocation(sdkLocation)) {
+ MonitorPlugin.getDdmsPreferenceStore().setLastSdkPath(sdkLocation);
+ return sdkLocation;
+ }
+ }
+
+ }
+ }
+
+ // check for the last used SDK
+ sdkLocation = MonitorPlugin.getDdmsPreferenceStore().getLastSdkPath();
+ if (isValidSdkLocation(sdkLocation)) {
+ return sdkLocation;
+ }
+
+ // if nothing else works, prompt the user
+ sdkLocation = getSdkLocationFromUser(new Shell(display));
+ if (isValidSdkLocation(sdkLocation)) {
+ MonitorPlugin.getDdmsPreferenceStore().setLastSdkPath(sdkLocation);
+ }
+
+ return sdkLocation;
+ }
+
+ private boolean isValidSdkLocation(String sdkLocation) {
+ if (sdkLocation == null) {
+ return false;
+ }
+
+ if (sdkLocation.trim().length() == 0) {
+ return false;
+ }
+
+ SdkToolsLocator locator = new SdkToolsLocator(new File(sdkLocation));
+ return locator.isValidInstallation() == SdkInstallStatus.VALID;
+ }
+
+ private String getSdkLocationFromUser(Shell shell) {
+ SdkLocationChooserDialog dlg = new SdkLocationChooserDialog(shell);
+ if (dlg.open() == Window.OK) {
+ return dlg.getPath();
+ } else {
+ return null;
+ }
+ }
+}