/*
 * Copyright (C) 2014 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.android.manifmerger;

/**
 * Defines attributes operations as it can be provided by users through attributes on the target
 * xml element.
 * <p>
 *
 * For instance:
 * <pre>
 *     {@code
 *     <uses-permission
 *         android:name="android.permission.CAMERA"
 *         android:maxSdkVersion=25
 *         tools:replace="android:maxSdkVersion"/>
 *     }
 * </pre>
 *
 * <p>
 *
 * The operation type is provided as part of the tools attribute name itself, so you can find
 * tools:remove, tools:replace, tools:strict. The value of that attribute is a comma separated list
 * of attribute names on which the operation applies.
 *
 * <p>
 * For instance:
 * <pre>
 *     {@code
 *     <permission
 *         android:name="android.permission.CAMERA"
 *         android:icon="@Res/foo"
 *         android:protectionLevel="dangerous"
 *         tools:replace="android:maxSdkVersion, protectionLevel"/>
 *     }
 * </pre>
 * will replace maxSdkVersion and protectionLevel attributes values when merging lower level xml
 * elements.
 */
enum AttributeOperationType {

    /**
     * Removes the attributes from all further merging activities.
     */
    REMOVE,

    /**
     * Replace the attributes values with the provided one. (Will generate a merging error if no
     * new value is provided).
     */
    REPLACE,

    /**
     * The attributes should not be specified by any lower priority xml elements.
     */
    STRICT
}
