/* * 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.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); } }