package com.android.ex.photo;

import android.database.Cursor;
import android.os.Bundle;
import android.support.v4.app.Fragment;
import android.support.v4.content.Loader;

import com.android.ex.photo.adapters.PhotoPagerAdapter;
import com.android.ex.photo.fragments.PhotoViewFragment;
import com.android.ex.photo.loaders.PhotoBitmapLoaderInterface.BitmapResult;

public interface PhotoViewCallbacks {

    public static final int BITMAP_LOADER_AVATAR = 1;
    public static final int BITMAP_LOADER_THUMBNAIL = 2;
    public static final int BITMAP_LOADER_PHOTO = 3;

    /**
     * Listener to be invoked for screen events.
     */
    public static interface OnScreenListener {

        /**
         * The full screen state has changed.
         */
        public void onFullScreenChanged(boolean fullScreen);

        /**
         * A new view has been activated and the previous view de-activated.
         */
        public void onViewActivated();

        /**
         * Called when a right-to-left touch move intercept is about to occur.
         *
         * @param origX the raw x coordinate of the initial touch
         * @param origY the raw y coordinate of the initial touch
         * @return {@code true} if the touch should be intercepted.
         */
        public boolean onInterceptMoveLeft(float origX, float origY);

        /**
         * Called when a left-to-right touch move intercept is about to occur.
         *
         * @param origX the raw x coordinate of the initial touch
         * @param origY the raw y coordinate of the initial touch
         * @return {@code true} if the touch should be intercepted.
         */
        public boolean onInterceptMoveRight(float origX, float origY);
    }

    public static interface CursorChangedListener {
        /**
         * Called when the cursor that contains the photo list data
         * is updated. Note that there is no guarantee that the cursor
         * will be at the proper position.
         * @param cursor the cursor containing the photo list data
         */
        public void onCursorChanged(Cursor cursor);
    }

    public void addScreenListener(int position, OnScreenListener listener);

    public void removeScreenListener(int position);

    public void addCursorListener(CursorChangedListener listener);

    public void removeCursorListener(CursorChangedListener listener);

    public void setViewActivated(int position);

    public void onNewPhotoLoaded(int position);

    public void onFragmentPhotoLoadComplete(PhotoViewFragment fragment,
            boolean success);

    public void toggleFullScreen();

    public boolean isFragmentActive(Fragment fragment);

    public void onFragmentVisible(PhotoViewFragment fragment);

    public boolean isFragmentFullScreen(Fragment fragment);

    public void onCursorChanged(PhotoViewFragment fragment, Cursor cursor);

    public Loader<BitmapResult> onCreateBitmapLoader(int id, Bundle args, String uri);

    /**
     * Returns the adapter associated with this activity.
     */
    public PhotoPagerAdapter getAdapter();
}
