refactoring, ask for closing android debug sessions before disabling ddmlib

This commit is contained in:
Eugene Kudelevsky
2012-03-15 22:35:31 +04:00
parent ba200d8f68
commit 2e8e0ba313
6 changed files with 87 additions and 38 deletions
@@ -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
android.lint.inspections.suspicious.import='import android.R' statement
android.debug.sessions.will.be.closed=Following debug sessions will be closed\:\n
@@ -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<Pair<ProcessHandler, RunContentDescriptor>> pairs = new ArrayList<Pair<ProcessHandler, RunContentDescriptor>>();
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<ProcessHandler, RunContentDescriptor> 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
@@ -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<RunContentDescriptor> ANDROID_PROCESS_HANDLER = new Key<RunContentDescriptor>("ANDROID_PROCESS_HANDLER");
public static final Key<RunContentDescriptor> ANDROID_PROCESS_HANDLER = new Key<RunContentDescriptor>("ANDROID_PROCESS_HANDLER");
private static final Object myReaderLock = new Object();
private static final Object myDebugLock = new Object();
@@ -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();
@@ -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());
@@ -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);
}
}
}