/* * Copyright (C) 2012 The Android Open Source Project * * 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 com.motorola.studio.android.obfuscate.handlers; import java.util.ArrayList; import java.util.Iterator; import java.util.List; import org.eclipse.core.commands.AbstractHandler; import org.eclipse.core.commands.ExecutionEvent; import org.eclipse.core.commands.ExecutionException; import org.eclipse.core.resources.IProject; import org.eclipse.core.resources.ResourcesPlugin; import org.eclipse.core.runtime.CoreException; import org.eclipse.core.runtime.NullProgressMonitor; import org.eclipse.jface.dialogs.TitleAreaDialog; import org.eclipse.ui.PlatformUI; import com.motorola.studio.android.model.AndroidProject; import com.motorola.studio.android.obfuscate.ObfuscatorManager; import com.motorola.studio.android.obfuscate.ui.ObfuscateDialog; /** * * This class is responsible for handling the command that marks/unmarks Android * project to be obfuscated. * * Its proposal at first is to be called from the motodev menu */ public class ObfuscateProjectsHandler extends AbstractHandler { public Object execute(ExecutionEvent event) throws ExecutionException { PlatformUI.getWorkbench().getDisplay().syncExec(new Runnable() { public void run() { ObfuscateDialog dialog = new ObfuscateDialog(PlatformUI.getWorkbench().getActiveWorkbenchWindow() .getShell()); if (dialog.open() == TitleAreaDialog.OK) { List<IProject> obfuscatedProjects = new ArrayList<IProject>(); ArrayList<IProject> selectedProjects = dialog.getSelectedProjects(); List<IProject> toDesobfuscate = new ArrayList<IProject>(); IProject[] allProjects = ResourcesPlugin.getWorkspace().getRoot().getProjects(); for (int i = 0; i < allProjects.length; i++) { IProject projectN = allProjects[i]; try { //it is an android project and is opened if ((projectN.getNature(AndroidProject.ANDROID_NATURE) != null) && projectN.isOpen()) { //it is obfuscated if (ObfuscatorManager.isProguardSet(projectN)) { obfuscatedProjects.add(projectN); //it was not selected -> desobfuscate it if (!selectedProjects.contains(projectN)) { toDesobfuscate.add(projectN); } } } } catch (CoreException e) { // do nothing } } //It only makes sense to perform some action if there is a project to obfuscate/desobfuscate if (!(obfuscatedProjects.containsAll(selectedProjects) && toDesobfuscate .isEmpty())) { toggleObfuscateMode(selectedProjects, toDesobfuscate); } } } }); return null; } /** * Receives a list of project and toogles obfscation mode of these projects: * if it is set to be obfuscated, than unset. (and vice-versa) * * @param selection */ private void toggleObfuscateMode(List<IProject> _obfuscatedProjects, List<IProject> _notObfuscatedProjects) { for (Iterator<IProject> iterator = _notObfuscatedProjects.iterator(); iterator.hasNext();) { IProject iProject = iterator.next(); ObfuscatorManager.unobfuscate(iProject); } for (Iterator<IProject> iterator = _obfuscatedProjects.iterator(); iterator.hasNext();) { IProject iProject = iterator.next(); ObfuscatorManager.obfuscate(iProject, new NullProgressMonitor()); } } }