/* * 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.model.manifest.dom; import java.util.LinkedList; import java.util.List; import java.util.Map; import org.eclipse.core.runtime.IStatus; /** * Class that represents an <intent-filter> node on AndroidManifest.xml file */ public class IntentFilterNode extends AndroidManifestNode implements IAndroidManifestProperties { static { defaultProperties.add(PROP_ICON); defaultProperties.add(PROP_LABEL); defaultProperties.add(PROP_PRIORITY); } /** * The icon property */ private String propIcon = null; /** * The label property */ private String propLabel = null; /** * The priority property */ private Integer propPriority = null; /* (non-Javadoc) * @see com.motorola.studio.android.model.manifest.dom.AndroidManifestNode#canContains(com.motorola.studio.android.model.manifest.dom.AndroidManifestNode.NodeType) */ @Override protected boolean canContains(NodeType nodeType) { return (nodeType == NodeType.Action) || (nodeType == NodeType.Category) || (nodeType == NodeType.Data) || (nodeType == NodeType.Comment); } /* (non-Javadoc) * @see com.motorola.studio.android.model.manifest.dom.AndroidManifestNode#getNodeProperties() */ @Override public Map<String, String> getNodeProperties() { properties.clear(); if ((propIcon != null) && (propIcon.trim().length() > 0)) { properties.put(PROP_ICON, propIcon); } if ((propLabel != null) && (propLabel.length() > 0)) { properties.put(PROP_LABEL, propLabel); } if (propPriority != null) { properties.put(PROP_PRIORITY, propPriority.toString()); } return properties; } /* (non-Javadoc) * @see com.motorola.studio.android.model.manifest.dom.AndroidManifestNode#getNodeType() */ @Override public NodeType getNodeType() { return NodeType.IntentFilter; } /* (non-Javadoc) * @see com.motorola.studio.android.model.manifest.dom.AndroidManifestNode#isNodeValid() */ @Override protected boolean isNodeValid() { AndroidManifestNode[] actions = getAllChildrenFromType(NodeType.Action); return actions.length > 0; } /** * Gets the icon property value * * @return the icon property value */ public String getIcon() { return propIcon; } /** * Sets the icon property value. Set it to null to remove it. * * @param icon the icon property value */ public void setIcon(String icon) { this.propIcon = icon; } /** * Gets the label property value * * @return the label property value */ public String getLabel() { return propLabel; } /** * Sets the label property value. Set it to null to remove it. * * @param label the label property value */ public void setLabel(String label) { this.propLabel = label; } /** * Gets the priority property value * * @return the priority property value */ public Integer getPriority() { return propPriority; } /** * Sets the priority property value. Set it to null to remove it. * * @param priority the priority property value */ public void setPriority(Integer priority) { this.propPriority = priority; } /** * Adds an Action Node to the Intent Filter Node * * @param action The Action Node */ public void addActionNode(ActionNode action) { if (action != null) { if (!children.contains(action)) { children.add(action); } } } /** * Retrieves all Action Nodes from the Intent Filter Node * * @return all Action Nodes from the Intent Filter Node */ public List<ActionNode> getActionNodes() { List<ActionNode> actions = new LinkedList<ActionNode>(); for (AndroidManifestNode node : getAllChildrenFromType(NodeType.Action)) { actions.add((ActionNode) node); } return actions; } /** * Removes an Action Node from the Intent Filter Node * * @param action the Action Node to be removed */ public void removeActionNode(ActionNode action) { if (action != null) { children.remove(action); } } /** * Adds a Category Node to the Intent Filter Node * * @param category The Category Node */ public void addCategoryNode(CategoryNode category) { if (category != null) { if (!children.contains(category)) { children.add(category); } } } /** * Adds a Category Node to the Intent Filter Node * * @param category The Category Node */ public void addUsesPermissionNode(UsesPermissionNode permission) { if (permission != null) { if (!children.contains(permission)) { children.add(permission); } } } /** * Retrieves all Category Nodes from the Intent Filter Node * * @return all Category Nodes from the Intent Filter Node */ public List<CategoryNode> getCategoryNodes() { List<CategoryNode> categories = new LinkedList<CategoryNode>(); for (AndroidManifestNode node : getAllChildrenFromType(NodeType.Category)) { categories.add((CategoryNode) node); } return categories; } /** * Retrieves all Uses permission Nodes from the Intent Filter Node * * @return all Category Nodes from the Intent Filter Node */ public List<UsesPermissionNode> getUsesPermissionNodes() { List<UsesPermissionNode> permissions = new LinkedList<UsesPermissionNode>(); for (AndroidManifestNode node : getAllChildrenFromType(NodeType.UsesPermission)) { permissions.add((UsesPermissionNode) node); } return permissions; } /** * Removes a Category Node from the Intent Filter Node * * @param category the Category Node to be removed */ public void removeCategoryNode(CategoryNode category) { if (category != null) { children.remove(category); } } /** * Removes a UsesPermission Node from the Intent Filter Node * * @param permission the Category Node to be removed */ public void removeUsesPermissionNode(UsesPermissionNode permission) { if (permission != null) { children.remove(permission); } } /** * Adds a Data Node to the Intent Filter Node * * @param data The Data Node */ public void addDataNode(DataNode data) { if (data != null) { if (!children.contains(data)) { children.add(data); } } } /** * Retrieves all Data Nodes from the Intent Filter Node * * @return all Data Nodes from the Intent Filter Node */ public List<DataNode> getDataNodes() { List<DataNode> datas = new LinkedList<DataNode>(); for (AndroidManifestNode node : getAllChildrenFromType(NodeType.Data)) { datas.add((DataNode) node); } return datas; } /** * Removes a Data Node from the Intent Filter Node * * @param data the Data Node to be removed */ public void removeDataNode(DataNode data) { if (data != null) { children.remove(data); } } /* (non-Javadoc) * @see com.motorola.studio.android.model.manifest.dom.AndroidManifestNode#getSpecificNodeErrors() */ @Override protected List<IStatus> getSpecificNodeProblems() { return null; } /** * Check if this intent-filter node has any information or if it is empty. * @return True if this node has no information, false otherwise. * */ public boolean isEmpty() { //an intent-filter node may have action nodes, category nodes, data nodes or attributes (properties). return getActionNodes().isEmpty() && getCategoryNodes().isEmpty() && getDataNodes().isEmpty() && getNodeProperties().isEmpty(); } public ActionNode getActionNode(String name) { ActionNode result = null; //iterate over action nodes for (ActionNode actionNode : getActionNodes()) { if (actionNode.getName().equals(name)) { result = actionNode; } } return result; } public CategoryNode getCategoryNode(String name) { CategoryNode result = null; //iterate over action nodes for (CategoryNode categoryNode : getCategoryNodes()) { if (categoryNode.getName().equals(name)) { result = categoryNode; } } return result; } }