mirror of
https://gitflic.ru/project/openide/openide.git
synced 2026-09-27 10:03:11 +07:00
refactoring, ask for closing android debug sessions before disabling ddmlib
This commit is contained in:
@@ -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
|
||||
+48
-14
@@ -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);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user