diff options
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.java | 179 |
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; + } + } +} |