/* * 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.dom.manifest; import com.android.SdkConstants; import com.intellij.util.ArrayUtil; import com.intellij.util.xml.DomElement; import com.intellij.util.xml.XmlName; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; import java.util.ArrayList; import java.util.Collections; import java.util.List; /** * Created by IntelliJ IDEA. * User: Eugene.Kudelevsky * Date: Jun 19, 2009 * Time: 5:49:30 PM * To change this template use File | Settings | File Templates. */ public class AndroidManifestUtils { private AndroidManifestUtils() { } @Nullable public static String getStyleableNameForElement(@NotNull ManifestElement element) { if (element instanceof CompatibleScreensScreen) { return "AndroidManifestCompatibleScreensScreen"; } return null; } @NotNull public static String getStyleableNameByTagName(@NotNull String tagName) { String prefix = "AndroidManifest"; if (tagName.equals("manifest")) return prefix; String[] parts = tagName.split("-"); StringBuilder builder = new StringBuilder(prefix); for (String part : parts) { char first = part.charAt(0); String remained = part.substring(1); builder.append(Character.toUpperCase(first)).append(remained); } return builder.toString(); } @NotNull public static String[] getStaticallyDefinedAttrs(@NotNull ManifestElement element) { List<String> strings = new ArrayList<String>(); if (element instanceof ManifestElementWithName) { strings.add("name"); } if (element instanceof ApplicationComponent || element instanceof Application) { strings.add("label"); } if (element instanceof Application) { strings.add("name"); strings.add("manageSpaceActivity"); strings.add("backupAgent"); strings.add("debuggable"); } if (element instanceof Provider) { strings.add("authorities"); } if (element instanceof Instrumentation) { strings.add("targetPackage"); } else if (element instanceof UsesSdk) { strings.add("minSdkVersion"); strings.add("targetSdkVersion"); strings.add("maxSdkVersion"); } return ArrayUtil.toStringArray(strings); } @NotNull public static String[] getStaticallyDefinedSubtags(@NotNull ManifestElement element) { List<String> strings = new ArrayList<String>(); if (element instanceof Manifest) { Collections.addAll(strings, "application", "instrumentation", "permission", "permission-group", "permission-tree", "uses-permission", "compatible-screens", "uses-sdk", "uses-feature"); } else if (element instanceof Application) { Collections.addAll(strings, "activity", "activity-alias", "service", "provider", "receiver", "uses-library", "meta-data"); } else if (element instanceof Activity || element instanceof ActivityAlias || element instanceof Receiver || element instanceof Service) { Collections.addAll(strings, "intent-filter", "meta-data"); } else if (element instanceof Provider) { Collections.addAll(strings, "meta-data"); } else if (element instanceof IntentFilter) { strings.add("action"); strings.add("category"); } return ArrayUtil.toStringArray(strings); } @Nullable public static String getTagNameByStyleableName(@NotNull String styleableName) { String prefix = "AndroidManifest"; if (!styleableName.startsWith(prefix)) { return null; } String remained = styleableName.substring(prefix.length()); if (remained.length() == 0) return "manifest"; StringBuilder builder = new StringBuilder(); for (int i = 0; i < remained.length(); i++) { char c = remained.charAt(i); if (builder.length() > 0 && Character.isUpperCase(c)) { builder.append('-'); } builder.append(Character.toLowerCase(c)); } return builder.toString(); } public static boolean isRequiredAttribute(XmlName attrName, DomElement element) { if (element instanceof CompatibleScreensScreen && SdkConstants.NS_RESOURCES.equals(attrName.getNamespaceKey())) { final String localName = attrName.getLocalName(); return "screenSize".equals(localName) || "screenDensity".equals(localName); } return false; } }