/*
 * Copyright (C) 2010 Cyril Mottier (http://www.cyrilmottier.com)
 *
 * 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 greendroid.app;

import greendroid.widget.GDActionBar;
import greendroid.widget.ActionBarItem;
import android.app.Activity;
import android.app.Application;
import android.view.View;
import android.widget.FrameLayout;

/**
 * Defines all methods related to Activities embedding an {@link GDActionBar}
 * 
 * @author Cyril Mottier
 */
public interface ActionBarActivity {

    /**
     * The optional title of the launched ActionBarActivity
     * 
     * @see Activity#setTitle(CharSequence)
     * @see Activity#setTitle(int)
     */
    static final String GD_ACTION_BAR_TITLE = "greendroid.app.ActionBarActivity.GD_ACTION_BAR_TITLE";

    /**
     * An integer that can be used to force the ActionBar to a particular
     * visibility. This is especially useful when using GDActivity inside a
     * GDTabActivity.
     * 
     * @see View#VISIBLE
     * @see View#INVISIBLE
     * @see View#GONE
     */
    static final String GD_ACTION_BAR_VISIBILITY = "greendroid.app.ActionBarActivity.GD_ACTION_BAR_VISIBILITY";

    /**
     * Clients may use this method to listen to {@link ActionBarItem}s clicks.
     * 
     * @param item The {@link ActionBarItem} that has been clicked
     * @param position The position of the clicked item. This number is equal or
     *            greater to zero. 0 is the leftmost item.
     * @return true if the method has handled the click on the
     *         {@link ActionBarItem} at position <em>position</em>. Otherwise it
     *         returns false.
     */
    boolean onHandleActionBarItemClick(ActionBarItem item, int position);

    /**
     * Returns the content view. Please note the content view is not the entire
     * view but a {@link FrameLayout} that contains everything but the
     * {@link GDActionBar}.
     * 
     * @return The content view
     */
    FrameLayout getContentView();

    /**
     * Returns the {@link GDActionBar}. Listening to {@link GDActionBar} events
     * should be done via the
     * {@link ActionBarActivity#onHandleActionBarItemClick(ActionBarItem, int)}
     * method. Most of the time, this method don't need to be used directly.
     * 
     * @see {@link ActionBarActivity#onHandleActionBarItemClick(ActionBarItem, int)}
     * @see {@link ActionBarActivity#addActionBarItem(ActionBarItem)}
     * @see {@link ActionBarActivity#addActionBarItem(greendroid.widget.ActionBarItem.Type)}
     * @return The {@link GDActionBar} currently displayed on screen
     */
    GDActionBar getGDActionBar();

    /**
     * A simple utility method that casts the {@link Application} returned by
     * {@link #getApplication()} into a {@link GDApplication}
     * 
     * @return The current {@link GDApplication}
     */
    GDApplication getGDApplication();

    /**
     * Add a new item to the {@link GDActionBar}.
     * 
     * @param item The item to add to the {@link GDActionBar}
     */
    ActionBarItem addActionBarItem(ActionBarItem item);

    /**
     * Add a new item to the {@link GDActionBar}.
     * 
     * @param item The item to add to the {@link GDActionBar}
     * @param itemId Unique item ID. Use {@link GDActionBar#NONE} if you do not
     *            need a unique ID.
     */
    ActionBarItem addActionBarItem(ActionBarItem item, int itemId);

    /**
     * Adds a new item of type <em>type</em> to the {@link GDActionBar}.
     * 
     * @param actionBarItemType The item to add to the {@link GDActionBar}
     */
    ActionBarItem addActionBarItem(ActionBarItem.Type actionBarItemType);

    /**
     * Adds a new item of type <em>type</em> to the {@link GDActionBar}.
     * 
     * @param actionBarItemType The item to add to the {@link GDActionBar}
     * @param itemId Unique item ID. Use {@link GDActionBar#NONE} if you do not
     *            need a unique ID.
     */
    ActionBarItem addActionBarItem(ActionBarItem.Type actionBarItemType, int itemId);

    /**
     * Returns the identifier of the layout that needs to be created for this
     * {@link ActionBarActivity}
     * 
     * @return The layout identifier of the layout to create
     */
    int createLayout();

    /**
     * Called at the beginning of the {@link Activity#onContentChanged()}
     * method. This may be used to initialize all references on elements.
     */
    void onPreContentChanged();

    /**
     * Called at the end of the {@link Activity#onContentChanged()} method. This
     * may be use to initialize the content of the layout (titles, etc.)
     */
    void onPostContentChanged();
}
