public final class

MediaItem

extends Object
/*
 * Copyright (C) 2009 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.cooliris.media;

import java.util.Date;

public final class MediaItem {
    public static final int MEDIA_TYPE_IMAGE = 0;
    public static final int MEDIA_TYPE_VIDEO = 1;
    // Approximately the year 1975 in milliseconds and seconds. Serves as a min
    // cutoff for bad times.
    public static final long MIN_VALID_DATE_IN_MS = 157680000000L;
    public static final long MIN_VALID_DATE_IN_SEC = 157680000L;
    // Approximately the year 2035 in milliseconds ans seconds. Serves as a max
    // cutoff for bad time.
    public static final long MAX_VALID_DATE_IN_MS = 2049840000000L;
    public static final long MAX_VALID_DATE_IN_SEC = 2049840000L;

    // mId is not a unique identifier of the item mId is initialized to -1 in
    // some cases.
    public static final String ID = new String("id");
    public long mId;

    public String mGuid;
    public String mCaption;
    public String mEditUri;
    public String mContentUri;
    public String mThumbnailUri;
    public String mScreennailUri;
    public String mMicroThumbnailUri;
    public String mWeblink;
    public String mMimeType;
    private String mDisplayMimeType;
    private int mMediaType = -1;
    public String mRole;
    public String mDescription;

    // Location-based properties of the item.
    public double mLatitude;
    public double mLongitude;
    public String mReverseGeocodedLocation;

    public long mDateTakenInMs = 0;
    public Date mLocaltime;
    public boolean mTriedRetrievingExifDateTaken = false;
    public long mDateModifiedInSec = 0;
    public long mDateAddedInSec = 0;
    public int mDurationInSec;

    public int mPrimingState = 0;
    public static final int NOT_PRIMED = 0;
    public static final int STARTED_PRIMING = 1;
    public static final int PRIMED = 2;

    public int mClusteringState = 0;
    public static final int NOT_CLUSTERED = 0;
    public static final int CLUSTERED = 1;

    public float mRotation;

    public long mThumbnailId;
    public int mThumbnailFocusX;
    public int mThumbnailFocusY;

    public String mFilePath;

    public MediaSet mParentMediaSet;
    public boolean mFlagForDelete;

    public MediaItem() {
        mCaption = "";
    }

    public boolean isWellFormed() {
        return true;
    }

    @Override
    public String toString() {
        return mCaption;
    }

    public boolean isLatLongValid() {
        return (mLatitude != 0.0 || mLongitude != 0.0);
    }

    // Serves as a sanity check cutoff for bad exif information.
    public boolean isDateTakenValid() {
        return (mDateTakenInMs > MIN_VALID_DATE_IN_MS && mDateTakenInMs < MAX_VALID_DATE_IN_MS);
    }

    public boolean isDateModifiedValid() {
        return (mDateModifiedInSec > MIN_VALID_DATE_IN_SEC && mDateModifiedInSec < MAX_VALID_DATE_IN_SEC);
    }

    public boolean isDateAddedValid() {
        return (mDateAddedInSec > MIN_VALID_DATE_IN_SEC && mDateAddedInSec < MAX_VALID_DATE_IN_SEC);
    }

    public boolean isPicassaItem() {
        return (mParentMediaSet != null && mParentMediaSet.isPicassaAlbum());
    }

    private static final String VIDEO = "video/";

    public int getMediaType() {
        if (mMediaType == -1) {
            // Default to image if mMimetype is null or not video.
            mMediaType = (mMimeType != null && mMimeType.startsWith(VIDEO)) ? MediaItem.MEDIA_TYPE_VIDEO
                    : MediaItem.MEDIA_TYPE_IMAGE;
        }
        return mMediaType;
    }

    public void setMediaType(int mediaType) {
        mMediaType = mediaType;
    }

    public String getDisplayMimeType() {
        if (mDisplayMimeType == null && mMimeType != null) {
            int slashPos = mMimeType.indexOf('/');
            if (slashPos != -1 && slashPos + 1 < mMimeType.length()) {
                mDisplayMimeType = mMimeType.substring(slashPos + 1).toUpperCase();
            } else {
                mDisplayMimeType = mMimeType.toUpperCase();
            }
        }
        return (mDisplayMimeType == null) ? "" : mDisplayMimeType;
    }

    public void setDisplayMimeType(final String displayMimeType) {
        mDisplayMimeType = displayMimeType;
    }

    public String getReverseGeocodedLocation(ReverseGeocoder reverseGeocoder) {
        if (mReverseGeocodedLocation != null) {
            return mReverseGeocodedLocation;
        }
        if (reverseGeocoder == null || !isLatLongValid()) {
            return null;
        }
        // Get the 2 most granular details available.
        mReverseGeocodedLocation = reverseGeocoder.getReverseGeocodedLocation(mLatitude, mLongitude, 2);
        return mReverseGeocodedLocation;
    }
}