/*
 * Copyright (C) 2008 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.ide.common.rendering.api;

import com.android.resources.ResourceType;
import com.android.util.Pair;

import java.net.URL;

/**
 * Callback for project information needed by the Layout Library.
 * Classes implementing this interface provide methods giving access to some project data, like
 * resource resolution, namespace information, and instantiation of custom view.
 */
public interface IProjectCallback {

    public enum ViewAttribute {
        TEXT(String.class),
        IS_CHECKED(Boolean.class),
        SRC(URL.class),
        COLOR(Integer.class);

        private final Class<?> mClass;

        private ViewAttribute(Class<?> theClass) {
            mClass = theClass;
        }

        public Class<?> getAttributeClass() {
            return mClass;
        }
    }

    /**
     * Loads a custom view with the given constructor signature and arguments.
     * @param name The fully qualified name of the class.
     * @param constructorSignature The signature of the class to use
     * @param constructorArgs The arguments to use on the constructor
     * @return A newly instantiated android.view.View object.
     * @throws ClassNotFoundException
     * @throws Exception
     */
    @SuppressWarnings("unchecked")
    Object loadView(String name, Class[] constructorSignature, Object[] constructorArgs)
        throws ClassNotFoundException, Exception;

    /**
     * Returns the namespace of the application.
     * <p/>This lets the Layout Lib load custom attributes for custom views.
     */
    String getNamespace();

    /**
     * Resolves the id of a resource Id.
     * <p/>The resource id is the value of a <code>R.&lt;type&gt;.&lt;name&gt;</code>, and
     * this method will return both the type and name of the resource.
     * @param id the Id to resolve.
     * @return a Pair of {@link ResourceType} and resource name, or null if the id
     *     does not match any resource.
     */
    @SuppressWarnings("deprecation")
    Pair<ResourceType, String> resolveResourceId(int id);

    /**
     * Resolves the id of a resource Id of type int[]
     * <p/>The resource id is the value of a R.styleable.&lt;name&gt;, and this method will
     * return the name of the resource.
     * @param id the Id to resolve.
     * @return the name of the resource or <code>null</code> if not found.
     */
    String resolveResourceId(int[] id);

    /**
     * Returns the id of a resource.
     * <p/>The provided type and name must match an existing constant defined as
     * <code>R.&lt;type&gt;.&lt;name&gt;</code>.
     * @param type the type of the resource
     * @param name the name of the resource
     * @return an Integer containing the resource Id, or <code>null</code> if not found.
     */
    Integer getResourceId(ResourceType type, String name);

    /**
     * Returns a custom parser for the layout of the given name.
     * @param layoutName the name of the layout.
     * @return returns a custom parser or null if no custom parsers are needed.
     * @deprecated This is replaced by {@link #getParser(ResourceValue)} but older version
     * of the layoutlib (before API7) will still call this method.
     */
    @Deprecated
    ILayoutPullParser getParser(String layoutName);

    /**
     * Returns a custom parser for a given layout.
     * @param layoutResource The layout.
     * @return returns a custom parser or null if no custom parsers are needed.
     */
    ILayoutPullParser getParser(ResourceValue layoutResource);

    /**
     * Returns the value of an item used by an adapter.
     * @param adapterView The {@link ResourceReference} for the adapter view info.
     * @param adapterCookie the view cookie for this particular view.
     * @param itemRef the {@link ResourceReference} for the layout used by the adapter item.
     * @param fullPosition the position of the item in the full list.
     * @param positionPerType the position of the item if only items of the same type are
     *     considered. If there is only one type of items, this is the same as
     *     <var>fullPosition</var>.
     * @param fullParentPosition the full position of the item's parent. This is only
     *     valid if the adapter view is an ExpandableListView.
     * @param parentPositionPerType the position of the parent's item, only considering items
     *     of the same type. This is only valid if the adapter view is an ExpandableListView.
     *     If there is only one type of items, this is the same as <var>fullParentPosition</var>.
     * @param viewRef The {@link ResourceReference} for the view we're trying to fill.
     * @param ViewAttribute the attribute being queried.
     * @param defaultValue the default value for this attribute. The object class matches the
     *      class associated with the {@link ViewAttribute}.
     * @return the item value or null if there's no value.
     *
     * @see ViewAttribute#getAttributeClass()
     */
    Object getAdapterItemValue(ResourceReference adapterView, Object adapterCookie,
            ResourceReference itemRef,
            int fullPosition, int positionPerType,
            int fullParentPosition, int parentPositionPerType,
            ResourceReference viewRef, ViewAttribute viewAttribute, Object defaultValue);

    /**
     * Returns an adapter binding for a given adapter view.
     * This is only called if {@link SessionParams} does not have an {@link AdapterBinding} for
     * the given {@link ResourceReference} already.
     *
     * @param adapterViewRef the reference of adapter view to return the adapter binding for.
     * @param adapterCookie the view cookie for this particular view.
     * @param viewObject the view object for the adapter.
     * @return an adapter binding for the given view or null if there's no data.
     */
    AdapterBinding getAdapterBinding(ResourceReference adapterViewRef, Object adapterCookie,
            Object viewObject);
}
