/*
* 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 android.content.res;

import android.content.pm.ActivityInfo.Config;

/**
 * A cache class that can provide new instances of a particular resource which may change
 * depending on the current {@link Resources.Theme} or {@link Configuration}.
 * <p>
 * A constant state should be able to return a bitmask of changing configurations, which
 * identifies the type of configuration changes that may invalidate this resource. These
 * configuration changes can be obtained from {@link android.util.TypedValue}. Entities such as
 * {@link android.animation.Animator} also provide a changing configuration method to include
 * their dependencies (e.g. An AnimatorSet's changing configuration is the union of the
 * changing configurations of each Animator in the set)
 * @hide
 */
abstract public class ConstantState<T> {

    /**
     * Return a bit mask of configuration changes that will impact
     * this resource (and thus require completely reloading it).
     */
    abstract public @Config int getChangingConfigurations();

    /**
     * Create a new instance without supplying resources the caller
     * is running in.
     */
    public abstract T newInstance();

    /**
     * Create a new instance from its constant state.  This
     * must be implemented for resources that change based on the target
     * density of their caller (that is depending on whether it is
     * in compatibility mode).
     */
    public T newInstance(Resources res) {
        return newInstance();
    }

    /**
     * Create a new instance from its constant state.  This must be
     * implemented for resources that can have a theme applied.
     */
    public T newInstance(Resources res, Resources.Theme theme) {
        return newInstance(res);
    }
}
