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