From 2e8e0ba31366c7bb84093b68dc35cf7d4d7e99c6 Mon Sep 17 00:00:00 2001 From: Eugene Kudelevsky Date: Thu, 15 Mar 2012 20:10:25 +0400 Subject: [PATCH] refactoring, ask for closing android debug sessions before disabling ddmlib --- .../messages/AndroidBundle.properties | 3 +- .../AndroidEnableAdbServiceAction.java | 62 ++++++++++++++----- .../android/run/AndroidDebugRunner.java | 2 +- .../android/run/AndroidRunningState.java | 5 +- .../jetbrains/android/sdk/AndroidSdkData.java | 6 +- .../android/sdk/AndroidSdkUtils.java | 47 +++++++++----- 6 files changed, 87 insertions(+), 38 deletions(-) diff --git a/plugins/android/resources/messages/AndroidBundle.properties b/plugins/android/resources/messages/AndroidBundle.properties index 74f17980cbb8..c1f8b531a595 100644 --- a/plugins/android/resources/messages/AndroidBundle.properties +++ b/plugins/android/resources/messages/AndroidBundle.properties @@ -394,4 +394,5 @@ android.lint.inspections.enforce.utf8=Encoding used in resource files is not UTF android.lint.inspections.wrong.view.cast=Mismatched view type android.lint.inspections.unknown.id.in.layout=Reference to an id that is not in the current layout android.lint.inspections.unknown.id=Reference to an unknown id -android.lint.inspections.suspicious.import='import android.R' statement \ No newline at end of file +android.lint.inspections.suspicious.import='import android.R' statement +android.debug.sessions.will.be.closed=Following debug sessions will be closed\:\n \ No newline at end of file diff --git a/plugins/android/src/org/jetbrains/android/actions/AndroidEnableAdbServiceAction.java b/plugins/android/src/org/jetbrains/android/actions/AndroidEnableAdbServiceAction.java index 4860bac1fff6..81bfb45ed867 100644 --- a/plugins/android/src/org/jetbrains/android/actions/AndroidEnableAdbServiceAction.java +++ b/plugins/android/src/org/jetbrains/android/actions/AndroidEnableAdbServiceAction.java @@ -15,21 +15,28 @@ */ package org.jetbrains.android.actions; +import com.intellij.execution.ExecutionManager; +import com.intellij.execution.process.ProcessHandler; +import com.intellij.execution.ui.RunContentDescriptor; import com.intellij.facet.ProjectFacetManager; import com.intellij.ide.util.PropertiesComponent; import com.intellij.openapi.actionSystem.AnActionEvent; import com.intellij.openapi.actionSystem.PlatformDataKeys; import com.intellij.openapi.actionSystem.ToggleAction; +import com.intellij.openapi.application.ApplicationManager; import com.intellij.openapi.project.Project; -import com.intellij.openapi.wm.ToolWindow; -import com.intellij.openapi.wm.ToolWindowManager; +import com.intellij.openapi.ui.Messages; +import com.intellij.openapi.util.Pair; import org.jetbrains.android.facet.AndroidFacet; -import org.jetbrains.android.logcat.AndroidLogcatToolWindowFactory; -import org.jetbrains.android.sdk.AndroidSdkData; +import org.jetbrains.android.run.AndroidDebugRunner; +import org.jetbrains.android.sdk.AndroidSdkUtils; import org.jetbrains.android.util.AndroidBundle; +import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; import javax.swing.*; +import java.util.ArrayList; +import java.util.List; /** * @author Eugene.Kudelevsky @@ -63,21 +70,48 @@ public class AndroidEnableAdbServiceAction extends ToggleAction { setAdbServiceEnabled(project, state); } - public static void setAdbServiceEnabled(Project project, boolean state) { + public static boolean setAdbServiceEnabled(Project project, boolean state) { + ApplicationManager.getApplication().assertIsDispatchThread(); + + if (!state && !closeAndroidDebugSessions(project)) { + return false; + } + boolean oldState = isAdbServiceEnabled(); PropertiesComponent.getInstance().setValue(ENABLE_ADB_SERVICE_PROPERTY_NAME, Boolean.toString(state)); if (oldState != state) { - ToolWindow toolWindow = ToolWindowManager.getInstance(project).getToolWindow(AndroidLogcatToolWindowFactory.TOOL_WINDOW_ID); - boolean hidden = false; - if (toolWindow != null && toolWindow.isVisible()) { - hidden = true; - toolWindow.hide(null); - } - AndroidSdkData.terminateDdmlib(); - if (hidden) { - toolWindow.show(null); + AndroidSdkUtils.restartDdmlib(project); + } + return true; + } + + private static boolean closeAndroidDebugSessions(@NotNull Project project) { + final List> pairs = new ArrayList>(); + final ProcessHandler[] processes = ExecutionManager.getInstance(project).getRunningProcesses(); + + for (ProcessHandler process : processes) { + final RunContentDescriptor descriptor = process.getUserData(AndroidDebugRunner.ANDROID_PROCESS_HANDLER); + if (descriptor != null) { + pairs.add(Pair.create(process, descriptor)); } } + + if (pairs.size() == 0) { + return true; + } + + final StringBuilder s = new StringBuilder(); + + for (Pair pair : pairs) { + if (s.length() > 0) { + s.append('\n'); + } + s.append(pair.getSecond().getDisplayName()); + } + + final int r = Messages.showYesNoDialog(AndroidBundle.message("android.debug.sessions.will.be.closed") + s, + AndroidBundle.message("android.activate.adb.service.title"), Messages.getQuestionIcon()); + return r == Messages.YES; } @Override diff --git a/plugins/android/src/org/jetbrains/android/run/AndroidDebugRunner.java b/plugins/android/src/org/jetbrains/android/run/AndroidDebugRunner.java index 24299d5ef7f9..c97c498aea13 100644 --- a/plugins/android/src/org/jetbrains/android/run/AndroidDebugRunner.java +++ b/plugins/android/src/org/jetbrains/android/run/AndroidDebugRunner.java @@ -51,7 +51,7 @@ import static com.intellij.execution.process.ProcessOutputTypes.STDERR; public class AndroidDebugRunner extends DefaultProgramRunner { private static final Logger LOG = Logger.getInstance("#org.jetbrains.android.run.AndroidDebugRunner"); - private static final Key ANDROID_PROCESS_HANDLER = new Key("ANDROID_PROCESS_HANDLER"); + public static final Key ANDROID_PROCESS_HANDLER = new Key("ANDROID_PROCESS_HANDLER"); private static final Object myReaderLock = new Object(); private static final Object myDebugLock = new Object(); diff --git a/plugins/android/src/org/jetbrains/android/run/AndroidRunningState.java b/plugins/android/src/org/jetbrains/android/run/AndroidRunningState.java index e6b530bbb165..abbdf63bc546 100644 --- a/plugins/android/src/org/jetbrains/android/run/AndroidRunningState.java +++ b/plugins/android/src/org/jetbrains/android/run/AndroidRunningState.java @@ -51,7 +51,6 @@ import com.intellij.openapi.util.Condition; import com.intellij.openapi.util.Key; import com.intellij.util.ArrayUtil; import com.intellij.xdebugger.DefaultDebugProcessHandler; -import org.jetbrains.android.actions.AndroidEnableAdbServiceAction; import org.jetbrains.android.facet.AndroidFacet; import org.jetbrains.android.facet.AndroidRootUtil; import org.jetbrains.android.facet.AvdsNotSupportedException; @@ -669,8 +668,8 @@ public abstract class AndroidRunningState implements RunProfileState, AndroidDeb myConsole.printHyperlink(AndroidBundle.message("restart.adb.fix.text"), new HyperlinkInfo() { @Override public void navigate(Project project) { - AndroidEnableAdbServiceAction.setAdbServiceEnabled(project, false); - AndroidEnableAdbServiceAction.setAdbServiceEnabled(project, true); + AndroidSdkUtils.restartDdmlib(project); + final ProcessHandler processHandler = getProcessHandler(); if (!processHandler.isProcessTerminated()) { processHandler.destroyProcess(); diff --git a/plugins/android/src/org/jetbrains/android/sdk/AndroidSdkData.java b/plugins/android/src/org/jetbrains/android/sdk/AndroidSdkData.java index 670814c544d6..c63650b914fb 100644 --- a/plugins/android/src/org/jetbrains/android/sdk/AndroidSdkData.java +++ b/plugins/android/src/org/jetbrains/android/sdk/AndroidSdkData.java @@ -255,10 +255,12 @@ public class AndroidSdkData { } private void doInitializeDdmlib() { + doInitializeDdmlib(getAdbPath()); + } + + private static void doInitializeDdmlib(@NotNull String adbPath) { synchronized (myDdmsLock) { - String adbPath = getAdbPath(); if (!myDdmLibInitialized) { - //noinspection AssignmentToStaticFieldFromInstanceMethod myDdmLibInitialized = true; DdmPreferences.setTimeOut(AndroidUtils.TIMEOUT); AndroidDebugBridge.init(AndroidEnableAdbServiceAction.isAdbServiceEnabled()); diff --git a/plugins/android/src/org/jetbrains/android/sdk/AndroidSdkUtils.java b/plugins/android/src/org/jetbrains/android/sdk/AndroidSdkUtils.java index 7f2bc2801692..e7e7932ba1e3 100644 --- a/plugins/android/src/org/jetbrains/android/sdk/AndroidSdkUtils.java +++ b/plugins/android/src/org/jetbrains/android/sdk/AndroidSdkUtils.java @@ -43,10 +43,13 @@ import com.intellij.openapi.util.io.FileUtil; import com.intellij.openapi.vfs.JarFileSystem; import com.intellij.openapi.vfs.LocalFileSystem; import com.intellij.openapi.vfs.VirtualFile; +import com.intellij.openapi.wm.ToolWindow; +import com.intellij.openapi.wm.ToolWindowManager; import com.intellij.util.containers.HashSet; import org.jetbrains.android.actions.AndroidEnableAdbServiceAction; import org.jetbrains.android.facet.AndroidFacet; import org.jetbrains.android.facet.AndroidRootUtil; +import org.jetbrains.android.logcat.AndroidLogcatToolWindowFactory; import org.jetbrains.android.util.AndroidBundle; import org.jetbrains.android.util.AndroidUtils; import org.jetbrains.annotations.NonNls; @@ -462,25 +465,22 @@ public class AndroidSdkUtils { } public static boolean activateDdmsIfNecessary(@NotNull Project project, @Nullable AndroidDebugBridge bridge) { - final boolean ddmsEnabled = AndroidEnableAdbServiceAction.isAdbServiceEnabled(); - boolean shouldRestartDdms = !ddmsEnabled; - - if (ddmsEnabled && bridge != null && isDdmsCorrupted(bridge)) { - shouldRestartDdms = true; - LOG.info("DDMLIB is corrupted and will be restarted"); - AndroidEnableAdbServiceAction.setAdbServiceEnabled(project, false); + if (AndroidEnableAdbServiceAction.isAdbServiceEnabled()) { + if (bridge != null && isDdmsCorrupted(bridge)) { + LOG.info("DDMLIB is corrupted and will be restarted"); + restartDdmlib(project); + } } - - if (shouldRestartDdms) { - if (!ddmsEnabled) { - int result = Messages.showYesNoDialog(project, AndroidBundle.message("android.ddms.disabled.error"), - AndroidBundle.message("android.ddms.disabled.dialog.title"), - Messages.getQuestionIcon()); - if (result != 0) { - return false; - } + else { + int result = Messages.showYesNoDialog(project, AndroidBundle.message("android.ddms.disabled.error"), + AndroidBundle.message("android.ddms.disabled.dialog.title"), + Messages.getQuestionIcon()); + if (result != 0) { + return false; + } + if (!AndroidEnableAdbServiceAction.setAdbServiceEnabled(project, true)) { + return false; } - AndroidEnableAdbServiceAction.setAdbServiceEnabled(project, true); } return true; } @@ -514,4 +514,17 @@ public class AndroidSdkUtils { } return false; } + + public static void restartDdmlib(@NotNull Project project) { + ToolWindow toolWindow = ToolWindowManager.getInstance(project).getToolWindow(AndroidLogcatToolWindowFactory.TOOL_WINDOW_ID); + boolean hidden = false; + if (toolWindow != null && toolWindow.isVisible()) { + hidden = true; + toolWindow.hide(null); + } + AndroidSdkData.terminateDdmlib(); + if (hidden) { + toolWindow.show(null); + } + } }