/*
 * Copyright (C) 2010 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.gallery3d.ui;

import android.graphics.Bitmap;

import com.android.gallery3d.data.MediaItem;

public abstract class AbstractDisplayItem extends DisplayItem {

    private static final String TAG = "AbstractDisplayItem";

    private static final int STATE_INVALID = 0x01;
    private static final int STATE_VALID = 0x02;
    private static final int STATE_UPDATING = 0x04;
    private static final int STATE_CANCELING = 0x08;
    private static final int STATE_ERROR = 0x10;

    private int mState = STATE_INVALID;
    private boolean mImageRequested = false;
    private boolean mRecycling = false;
    private Bitmap mBitmap;

    protected final MediaItem mMediaItem;

    public AbstractDisplayItem(MediaItem item) {
        mMediaItem = item;
        if (item == null) mState = STATE_ERROR;
    }

    protected void updateImage(Bitmap bitmap, boolean isCancelled) {
        if (mRecycling) {
            recycleBitmap(bitmap);
            return;
        }

        if (isCancelled && bitmap == null) {
            mState = STATE_INVALID;
            if (mImageRequested) {
                // request image again.
                requestImage();
            }
            return;
        }

        mBitmap = bitmap;
        mState = bitmap == null ? STATE_ERROR : STATE_VALID ;
        onBitmapAvailable(mBitmap);
    }

    @Override
    public int getRotation() {
        if (mMediaItem != null) return mMediaItem.getRotation();
        return 0;
    }

    @Override
    public int getIdentity() {
        return mMediaItem != null
                ? System.identityHashCode(mMediaItem.getPath())
                : System.identityHashCode(this);
    }

    public void requestImage() {
        mImageRequested = true;
        if (mState == STATE_INVALID) {
            mState = STATE_UPDATING;
            startLoadBitmap();
        }
    }

    public void cancelImageRequest() {
        mImageRequested = false;
        if (mState == STATE_UPDATING) {
            mState = STATE_CANCELING;
            cancelLoadBitmap();
        }
    }

    private boolean inState(int states) {
        return (mState & states) != 0;
    }

    public void recycle() {
        if (!inState(STATE_UPDATING | STATE_CANCELING)) {
            if (mBitmap != null) {
                recycleBitmap(mBitmap);
                mBitmap = null;
            }
        } else {
            mRecycling = true;
            cancelImageRequest();
        }
    }

    public boolean isRequestInProgress() {
        return mImageRequested && inState(STATE_UPDATING | STATE_CANCELING);
    }

    abstract protected void startLoadBitmap();
    abstract protected void cancelLoadBitmap();
    abstract protected void onBitmapAvailable(Bitmap bitmap);
    abstract protected void recycleBitmap(Bitmap bitmap);
}
