blob: 82265ac53b1be34f392cae94a717debba5cb6652 [file] [log] [blame]
/*
* Copyright 2000-2010 JetBrains s.r.o.
*
* 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 org.jetbrains.android.actions;
import com.android.tools.idea.ddms.adb.AdbService;
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.CommonDataKeys;
import com.intellij.openapi.actionSystem.ToggleAction;
import com.intellij.openapi.application.ApplicationManager;
import com.intellij.openapi.project.Project;
import com.intellij.openapi.project.ProjectManager;
import com.intellij.openapi.ui.Messages;
import com.intellij.openapi.util.Pair;
import org.jetbrains.android.facet.AndroidFacet;
import org.jetbrains.android.run.AndroidDebugRunner;
import org.jetbrains.android.run.AndroidSessionInfo;
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
*/
public class AndroidEnableAdbServiceAction extends ToggleAction {
private static final String ENABLE_ADB_SERVICE_PROPERTY_NAME = "AndroidEnableDdms";
@SuppressWarnings({"UnusedDeclaration"})
public AndroidEnableAdbServiceAction() {
this(null);
}
public AndroidEnableAdbServiceAction(@Nullable Icon icon) {
super(AndroidBundle.message("android.enable.adb.service.action.title"),
AndroidBundle.message("android.enable.adb.service.action.description"), icon);
}
@Override
public boolean isSelected(AnActionEvent e) {
return isAdbServiceEnabled();
}
public static boolean isAdbServiceEnabled() {
String enableDdmsProperty = PropertiesComponent.getInstance().getValue(ENABLE_ADB_SERVICE_PROPERTY_NAME);
return enableDdmsProperty == null || Boolean.parseBoolean(enableDdmsProperty);
}
@Override
public void setSelected(AnActionEvent e, boolean state) {
Project project = e.getData(CommonDataKeys.PROJECT);
if (state) {
setAdbServiceEnabled(project, true);
}
else {
disableAdbService(project);
}
}
public static boolean disableAdbService(Project project) {
ApplicationManager.getApplication().assertIsDispatchThread();
if (!askForClosingDebugSessions(project)) {
return false;
}
setAdbServiceEnabled(project, false);
return true;
}
public static void setAdbServiceEnabled(Project project, boolean state) {
boolean oldState = isAdbServiceEnabled();
PropertiesComponent.getInstance().setValue(ENABLE_ADB_SERVICE_PROPERTY_NAME, Boolean.toString(state));
if (oldState != state) {
AdbService.getInstance().restartDdmlib(project);
}
}
private static boolean askForClosingDebugSessions(@NotNull Project project) {
final List<Pair<ProcessHandler, RunContentDescriptor>> pairs = new ArrayList<Pair<ProcessHandler, RunContentDescriptor>>();
for (Project p : ProjectManager.getInstance().getOpenProjects()) {
final ProcessHandler[] processes = ExecutionManager.getInstance(p).getRunningProcesses();
for (ProcessHandler process : processes) {
if (!process.isProcessTerminated()) {
final AndroidSessionInfo info = process.getUserData(AndroidDebugRunner.ANDROID_SESSION_INFO);
if (info != null) {
pairs.add(Pair.create(process, info.getDescriptor()));
}
}
}
}
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(project, AndroidBundle.message("android.debug.sessions.will.be.closed", s),
AndroidBundle.message("android.disable.adb.service.title"), Messages.getQuestionIcon());
return r == Messages.YES;
}
@Override
public void update(AnActionEvent e) {
super.update(e);
final Project project = e.getData(CommonDataKeys.PROJECT);
e.getPresentation().setEnabled(project != null && ProjectFacetManager.getInstance(project).getFacets(AndroidFacet.ID).size() > 0);
}
}