172735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project/*
272735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project * Copyright (C) 2008 Esmertec AG.
372735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project * Copyright (C) 2008 The Android Open Source Project
472735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project *
572735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project * Licensed under the Apache License, Version 2.0 (the "License");
672735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project * you may not use this file except in compliance with the License.
772735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project * You may obtain a copy of the License at
872735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project *
972735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project *      http://www.apache.org/licenses/LICENSE-2.0
1072735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project *
1172735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project * Unless required by applicable law or agreed to in writing, software
1272735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project * distributed under the License is distributed on an "AS IS" BASIS,
1372735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
1472735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project * See the License for the specific language governing permissions and
1572735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project * limitations under the License.
1672735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project */
1772735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project
1872735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Projectpackage com.android.mms.model;
1972735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project
2072735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Projectimport com.android.mms.R;
217fa61cafe50deb74beb0819bdf52128239d50201Wei Huangimport com.android.mms.LogTag;
226be18bedb5b87dbbcdb54f37d5a0945bd0f71377Tom Taylorimport android.drm.mobile1.DrmException;
2372735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Projectimport com.android.mms.drm.DrmWrapper;
246be18bedb5b87dbbcdb54f37d5a0945bd0f71377Tom Taylorimport android.media.MediaMetadataRetriever;        // TODO: remove dependency for SDK build
25f7e8281a223af6228e6399055a6197a1edd9bc3aTom Taylorimport com.google.android.mms.MmsException;
266be18bedb5b87dbbcdb54f37d5a0945bd0f71377Tom Taylorimport com.android.mms.drm.DrmUtils;
2772735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project
2872735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Projectimport org.w3c.dom.events.EventListener;
2972735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project
3072735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Projectimport android.content.ContentResolver;
3172735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Projectimport android.content.Context;
327fa61cafe50deb74beb0819bdf52128239d50201Wei Huangimport android.content.Intent;
3372735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Projectimport android.net.Uri;
3472735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Projectimport android.util.Log;
3572735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project
3672735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Projectimport java.io.FileInputStream;
3772735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Projectimport java.io.FileNotFoundException;
3872735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Projectimport java.io.IOException;
3972735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Projectimport java.io.InputStream;
4072735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Projectimport java.util.ArrayList;
4172735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project
4272735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Projectpublic abstract class MediaModel extends Model implements EventListener {
439242286c35743422051d439d7460cd0a1426899cWei Huang    protected static final String TAG = "Mms/media";
447fa61cafe50deb74beb0819bdf52128239d50201Wei Huang
457fa61cafe50deb74beb0819bdf52128239d50201Wei Huang    private final static String MUSIC_SERVICE_ACTION = "com.android.music.musicservicecommand";
4672735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project
4772735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project    protected Context mContext;
4872735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project    protected int mBegin;
4972735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project    protected int mDuration;
5072735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project    protected String mTag;
5172735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project    protected String mSrc;
5272735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project    protected String mContentType;
5372735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project    private Uri mUri;
5472735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project    private byte[] mData;
5572735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project    protected short mFill;
5672735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project    protected int mSize;
5772735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project    protected int mSeekTo;
5872735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project    protected DrmWrapper mDrmObjectWrapper;
5910eed0e3020e3eb0612747fe39e0f6117222dd95Tom Taylor    protected boolean mMediaResizeable;
6072735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project
6172735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project    private final ArrayList<MediaAction> mMediaActions;
6272735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project    public static enum MediaAction {
6372735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project        NO_ACTIVE_ACTION,
6472735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project        START,
6572735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project        STOP,
6672735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project        PAUSE,
6772735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project        SEEK,
6872735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project    }
6972735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project
7072735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project    public MediaModel(Context context, String tag, String contentType,
7172735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project            String src, Uri uri) throws MmsException {
7272735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project        mContext = context;
7372735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project        mTag = tag;
7472735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project        mContentType = contentType;
7572735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project        mSrc = src;
7672735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project        mUri = uri;
7772735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project        initMediaSize();
7872735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project        mMediaActions = new ArrayList<MediaAction>();
7972735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project    }
8072735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project
8172735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project    public MediaModel(Context context, String tag, String contentType,
8272735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project            String src, byte[] data) {
8372735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project        if (data == null) {
8472735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project            throw new IllegalArgumentException("data may not be null.");
8572735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project        }
8672735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project
8772735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project        mContext = context;
8872735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project        mTag = tag;
8972735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project        mContentType = contentType;
9072735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project        mSrc = src;
9172735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project        mData = data;
9272735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project        mSize = data.length;
9372735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project        mMediaActions = new ArrayList<MediaAction>();
9472735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project    }
9572735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project
9672735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project    public MediaModel(Context context, String tag, String contentType,
9772735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project            String src, DrmWrapper wrapper) throws IOException {
9872735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project        mContext = context;
9972735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project        mTag = tag;
10072735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project        mContentType = contentType;
10172735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project        mSrc = src;
10272735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project        mDrmObjectWrapper = wrapper;
10372735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project        mUri = DrmUtils.insert(context, wrapper);
10472735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project        mSize = wrapper.getOriginalData().length;
10572735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project        mMediaActions = new ArrayList<MediaAction>();
10672735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project    }
10772735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project
10872735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project    public int getBegin() {
10972735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project        return mBegin;
11072735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project    }
11172735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project
11272735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project    public void setBegin(int begin) {
11372735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project        mBegin = begin;
11472735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project        notifyModelChanged(true);
11572735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project    }
11672735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project
11772735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project    public int getDuration() {
11872735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project        return mDuration;
11972735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project    }
12072735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project
12172735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project    public void setDuration(int duration) {
12272735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project        if (isPlayable() && (duration < 0)) {
12372735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project            // 'indefinite' duration, we should try to find its exact value;
12472735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project            try {
12572735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project                initMediaDuration();
12672735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project            } catch (MmsException e) {
12772735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project                // On error, keep default duration.
12872735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project                Log.e(TAG, e.getMessage(), e);
12972735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project                return;
13072735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project            }
13172735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project        } else {
13272735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project            mDuration = duration;
13372735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project        }
13472735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project        notifyModelChanged(true);
13572735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project    }
13672735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project
13772735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project    public String getTag() {
13872735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project        return mTag;
13972735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project    }
14072735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project
14172735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project    public String getContentType() {
14272735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project        return mContentType;
14372735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project    }
14472735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project
14572735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project    /**
14672735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project     * Get the URI of the media without checking DRM rights. Use this method
14772735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project     * only if the media is NOT DRM protected.
14872735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project     *
14972735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project     * @return The URI of the media.
15072735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project     */
15172735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project    public Uri getUri() {
15272735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project        return mUri;
15372735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project    }
15472735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project
15572735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project    /**
15672735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project     * Get the URI of the media with checking DRM rights. Use this method
15772735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project     * if the media is probably DRM protected.
15872735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project     *
15972735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project     * @return The URI of the media.
16072735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project     * @throws DrmException Insufficient DRM rights detected.
16172735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project     */
16272735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project    public Uri getUriWithDrmCheck() throws DrmException {
16372735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project        if (mUri != null) {
16472735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project            if (isDrmProtected() && !mDrmObjectWrapper.consumeRights()) {
16572735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project                throw new DrmException("Insufficient DRM rights.");
16672735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project            }
16772735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project        }
16872735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project        return mUri;
16972735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project    }
17072735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project
17172735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project    public byte[] getData() throws DrmException {
17272735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project        if (mData != null) {
17372735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project            if (isDrmProtected() && !mDrmObjectWrapper.consumeRights()) {
17472735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project                throw new DrmException(
17572735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project                        mContext.getString(R.string.insufficient_drm_rights));
17672735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project            }
17772735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project
17872735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project            byte[] data = new byte[mData.length];
17972735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project            System.arraycopy(mData, 0, data, 0, mData.length);
18072735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project            return data;
18172735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project        }
18272735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project        return null;
18372735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project    }
18472735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project
18572735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project    /**
18672735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project     * @param uri the mUri to set
18772735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project     */
18872735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project    void setUri(Uri uri) {
18972735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project        mUri = uri;
19072735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project    }
19172735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project
19272735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project    /**
19372735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project     * @return the mSrc
19472735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project     */
19572735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project    public String getSrc() {
19672735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project        return mSrc;
19772735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project    }
19872735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project
19972735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project    /**
20072735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project     * @return the mFill
20172735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project     */
20272735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project    public short getFill() {
20372735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project        return mFill;
20472735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project    }
20572735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project
20672735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project    /**
20772735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project     * @param fill the mFill to set
20872735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project     */
20972735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project    public void setFill(short fill) {
21072735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project        mFill = fill;
21172735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project        notifyModelChanged(true);
21272735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project    }
21372735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project
21410eed0e3020e3eb0612747fe39e0f6117222dd95Tom Taylor    /**
21510eed0e3020e3eb0612747fe39e0f6117222dd95Tom Taylor     * @return whether the media is resizable or not. For instance, a picture can be resized
21610eed0e3020e3eb0612747fe39e0f6117222dd95Tom Taylor     * to smaller dimensions or lower resolution. Other media, such as video and sounds, aren't
21710eed0e3020e3eb0612747fe39e0f6117222dd95Tom Taylor     * currently able to be resized.
21810eed0e3020e3eb0612747fe39e0f6117222dd95Tom Taylor     */
21910eed0e3020e3eb0612747fe39e0f6117222dd95Tom Taylor    public boolean getMediaResizable() {
22010eed0e3020e3eb0612747fe39e0f6117222dd95Tom Taylor        return mMediaResizeable;
22110eed0e3020e3eb0612747fe39e0f6117222dd95Tom Taylor    }
22210eed0e3020e3eb0612747fe39e0f6117222dd95Tom Taylor
22310eed0e3020e3eb0612747fe39e0f6117222dd95Tom Taylor    /**
22410eed0e3020e3eb0612747fe39e0f6117222dd95Tom Taylor     * @return the size of the attached media
22510eed0e3020e3eb0612747fe39e0f6117222dd95Tom Taylor     */
22672735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project    public int getMediaSize() {
22772735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project        return mSize;
22872735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project    }
22972735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project
23072735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project    public boolean isText() {
23172735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project        return mTag.equals(SmilHelper.ELEMENT_TAG_TEXT);
23272735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project    }
23372735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project
23472735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project    public boolean isImage() {
23572735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project        return mTag.equals(SmilHelper.ELEMENT_TAG_IMAGE);
23672735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project    }
23772735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project
23872735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project    public boolean isVideo() {
23972735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project        return mTag.equals(SmilHelper.ELEMENT_TAG_VIDEO);
24072735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project    }
24172735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project
24272735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project    public boolean isAudio() {
24372735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project        return mTag.equals(SmilHelper.ELEMENT_TAG_AUDIO);
24472735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project    }
24572735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project
24672735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project    public boolean isDrmProtected() {
24772735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project        return mDrmObjectWrapper != null;
24872735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project    }
24972735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project
25072735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project    public boolean isAllowedToForward() {
25172735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project        return mDrmObjectWrapper.isAllowedToForward();
25272735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project    }
25372735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project
25472735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project    protected void initMediaDuration() throws MmsException {
25572735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project        if (mUri == null) {
25672735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project            throw new IllegalArgumentException("Uri may not be null.");
25772735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project        }
25872735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project
25907dde49d355fbe188b1ead3276544c4a324ebd11Tom Taylor        MediaMetadataRetriever retriever = new MediaMetadataRetriever();
26007dde49d355fbe188b1ead3276544c4a324ebd11Tom Taylor        int duration = 0;
26172735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project        try {
26207dde49d355fbe188b1ead3276544c4a324ebd11Tom Taylor            retriever.setDataSource(mContext, mUri);
26307dde49d355fbe188b1ead3276544c4a324ebd11Tom Taylor            String dur = retriever.extractMetadata(MediaMetadataRetriever.METADATA_KEY_DURATION);
26407dde49d355fbe188b1ead3276544c4a324ebd11Tom Taylor            if (dur != null) {
26507dde49d355fbe188b1ead3276544c4a324ebd11Tom Taylor                duration = Integer.parseInt(dur);
2662ef055d733c84b93f5ac23bb177f6e2429d09f67James Dong            }
26707dde49d355fbe188b1ead3276544c4a324ebd11Tom Taylor            mDuration = duration;
26807dde49d355fbe188b1ead3276544c4a324ebd11Tom Taylor        } catch (Exception ex) {
269293000e15498b71a4986d7247e60fe8bdaa05a4bWei Huang            Log.e(TAG, "MediaMetadataRetriever failed to get duration for " + mUri.getPath(), ex);
27007dde49d355fbe188b1ead3276544c4a324ebd11Tom Taylor            throw new MmsException(ex);
27172735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project        } finally {
27207dde49d355fbe188b1ead3276544c4a324ebd11Tom Taylor            retriever.release();
27372735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project        }
27472735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project    }
27572735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project
27672735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project    private void initMediaSize() throws MmsException {
27772735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project        ContentResolver cr = mContext.getContentResolver();
27872735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project        InputStream input = null;
27972735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project        try {
28072735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project            input = cr.openInputStream(mUri);
28172735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project            if (input instanceof FileInputStream) {
28272735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project                // avoid reading the whole stream to get its length
28372735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project                FileInputStream f = (FileInputStream) input;
28472735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project                mSize = (int) f.getChannel().size();
28537260f1a28619edf1bde204eb1bc46e9e4a5b282Tom Taylor                // sometimes mSize will be zero here. It's tempting to count the bytes as the code
28637260f1a28619edf1bde204eb1bc46e9e4a5b282Tom Taylor                // does below, but that turns out to be very slow. We'll deal with a zero size
28737260f1a28619edf1bde204eb1bc46e9e4a5b282Tom Taylor                // when we resize the media.
28872735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project            } else {
28972735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project                while (-1 != input.read()) {
29072735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project                    mSize++;
29172735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project                }
29272735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project            }
29372735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project
29472735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project        } catch (IOException e) {
29572735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project            // Ignore
29672735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project            Log.e(TAG, "IOException caught while opening or reading stream", e);
29772735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project            if (e instanceof FileNotFoundException) {
29872735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project                throw new MmsException(e.getMessage());
29972735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project            }
30072735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project        } finally {
30172735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project            if (null != input) {
30272735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project                try {
30372735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project                    input.close();
30472735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project                } catch (IOException e) {
30572735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project                    // Ignore
30672735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project                    Log.e(TAG, "IOException caught while closing stream", e);
30772735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project                }
30872735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project            }
30972735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project        }
31072735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project    }
31172735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project
31272735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project    public static boolean isMmsUri(Uri uri) {
31372735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project        return uri.getAuthority().startsWith("mms");
31472735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project    }
31572735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project
31672735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project    public int getSeekTo() {
31772735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project        return mSeekTo;
31872735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project    }
31972735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project
32072735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project    public void appendAction(MediaAction action) {
32172735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project        mMediaActions.add(action);
32272735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project    }
32372735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project
32472735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project    public MediaAction getCurrentAction() {
32572735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project        if (0 == mMediaActions.size()) {
32672735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project            return MediaAction.NO_ACTIVE_ACTION;
32772735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project        }
32872735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project        return mMediaActions.remove(0);
32972735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project    }
33072735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project
33172735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project    protected boolean isPlayable() {
33272735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project        return false;
33372735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project    }
33472735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project
33572735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project    public DrmWrapper getDrmObject() {
33672735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project        return mDrmObjectWrapper;
33772735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project    }
3387fa61cafe50deb74beb0819bdf52128239d50201Wei Huang
3397fa61cafe50deb74beb0819bdf52128239d50201Wei Huang    protected void pauseMusicPlayer() {
3407fa61cafe50deb74beb0819bdf52128239d50201Wei Huang        if (Log.isLoggable(LogTag.APP, Log.VERBOSE)) {
3417fa61cafe50deb74beb0819bdf52128239d50201Wei Huang            Log.d(TAG, "pauseMusicPlayer");
3427fa61cafe50deb74beb0819bdf52128239d50201Wei Huang        }
3437fa61cafe50deb74beb0819bdf52128239d50201Wei Huang
3447fa61cafe50deb74beb0819bdf52128239d50201Wei Huang        Intent i = new Intent(MUSIC_SERVICE_ACTION);
3457fa61cafe50deb74beb0819bdf52128239d50201Wei Huang        i.putExtra("command", "pause");
3467fa61cafe50deb74beb0819bdf52128239d50201Wei Huang        mContext.sendBroadcast(i);
3477fa61cafe50deb74beb0819bdf52128239d50201Wei Huang    }
34810eed0e3020e3eb0612747fe39e0f6117222dd95Tom Taylor
34910eed0e3020e3eb0612747fe39e0f6117222dd95Tom Taylor    /**
35010eed0e3020e3eb0612747fe39e0f6117222dd95Tom Taylor     * If the attached media is resizeable, resize it to fit within the byteLimit. Save the
35110eed0e3020e3eb0612747fe39e0f6117222dd95Tom Taylor     * new part in the pdu.
35210eed0e3020e3eb0612747fe39e0f6117222dd95Tom Taylor     * @param byteLimit the max size of the media attachment
35310eed0e3020e3eb0612747fe39e0f6117222dd95Tom Taylor     * @throws MmsException
35410eed0e3020e3eb0612747fe39e0f6117222dd95Tom Taylor     */
35510eed0e3020e3eb0612747fe39e0f6117222dd95Tom Taylor    protected void resizeMedia(int byteLimit, long messageId) throws MmsException {
35610eed0e3020e3eb0612747fe39e0f6117222dd95Tom Taylor    }
35772735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project}
358