VideoModel.java revision c1edca92206708d49fc9a14da9eb5cc7e60e4a1d
1/* 2 * Copyright (C) 2008 Esmertec AG. 3 * Copyright (C) 2008 The Android Open Source Project 4 * 5 * Licensed under the Apache License, Version 2.0 (the "License"); 6 * you may not use this file except in compliance with the License. 7 * You may obtain a copy of the License at 8 * 9 * http://www.apache.org/licenses/LICENSE-2.0 10 * 11 * Unless required by applicable law or agreed to in writing, software 12 * distributed under the License is distributed on an "AS IS" BASIS, 13 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 14 * See the License for the specific language governing permissions and 15 * limitations under the License. 16 */ 17 18package com.android.mms.model; 19 20import com.android.mms.ContentRestrictionException; 21import com.android.mms.LogTag; 22import com.android.mms.dom.events.EventImpl; 23import com.android.mms.dom.smil.SmilMediaElementImpl; 24import com.android.mms.drm.DrmWrapper; 25import com.google.android.mms.MmsException; 26import android.database.sqlite.SqliteWrapper; 27 28import org.w3c.dom.events.Event; 29import org.w3c.dom.smil.ElementTime; 30 31import android.content.ContentResolver; 32import android.content.Context; 33import android.database.Cursor; 34import android.net.Uri; 35import android.provider.MediaStore.Images; 36import android.text.TextUtils; 37import android.util.Config; 38import android.util.Log; 39 40import com.google.android.mms.ContentType; 41import java.io.IOException; 42 43public class VideoModel extends RegionMediaModel { 44 private static final String TAG = MediaModel.TAG; 45 private static final boolean DEBUG = true; 46 private static final boolean LOCAL_LOGV = DEBUG ? Config.LOGD : Config.LOGV; 47 48 public VideoModel(Context context, Uri uri, RegionModel region) 49 throws MmsException { 50 this(context, null, null, uri, region); 51 initModelFromUri(uri); 52 checkContentRestriction(); 53 } 54 55 public VideoModel(Context context, String contentType, String src, 56 Uri uri, RegionModel region) throws MmsException { 57 super(context, SmilHelper.ELEMENT_TAG_VIDEO, contentType, src, uri, region); 58 } 59 60 public VideoModel(Context context, String contentType, String src, 61 DrmWrapper wrapper, RegionModel regionModel) throws IOException { 62 super(context, SmilHelper.ELEMENT_TAG_VIDEO, contentType, src, wrapper, regionModel); 63 } 64 65 private void initModelFromUri(Uri uri) throws MmsException { 66 ContentResolver cr = mContext.getContentResolver(); 67 Cursor c = SqliteWrapper.query(mContext, cr, uri, null, null, null, null); 68 69 if (c != null) { 70 try { 71 if (c.moveToFirst()) { 72 String path = c.getString(c.getColumnIndexOrThrow(Images.Media.DATA)); 73 mSrc = path.substring(path.lastIndexOf('/') + 1); 74 mContentType = c.getString(c.getColumnIndexOrThrow( 75 Images.Media.MIME_TYPE)); 76 if (TextUtils.isEmpty(mContentType)) { 77 throw new MmsException("Type of media is unknown."); 78 } 79 80 if (mContentType.equals(ContentType.VIDEO_MP4) && !(TextUtils.isEmpty(mSrc))) { 81 int index = mSrc.lastIndexOf("."); 82 if (index != -1) { 83 try { 84 String extension = mSrc.substring(index + 1); 85 if (!(TextUtils.isEmpty(extension)) && 86 (extension.equalsIgnoreCase("3gp") || 87 extension.equalsIgnoreCase("3gpp") || 88 extension.equalsIgnoreCase("3g2"))) { 89 mContentType = ContentType.VIDEO_3GPP; 90 } 91 } catch(IndexOutOfBoundsException ex) { 92 if (LOCAL_LOGV) { 93 Log.v(TAG, "Media extension is unknown."); 94 } 95 } 96 } 97 } 98 99 if (Log.isLoggable(LogTag.APP, Log.VERBOSE)) { 100 Log.v(TAG, "New VideoModel created:" 101 + " mSrc=" + mSrc 102 + " mContentType=" + mContentType 103 + " mUri=" + uri); 104 } 105 } else { 106 throw new MmsException("Nothing found: " + uri); 107 } 108 } finally { 109 c.close(); 110 } 111 } else { 112 throw new MmsException("Bad URI: " + uri); 113 } 114 115 initMediaDuration(); 116 } 117 118 // EventListener Interface 119 public void handleEvent(Event evt) { 120 String evtType = evt.getType(); 121 if (LOCAL_LOGV || Log.isLoggable(LogTag.APP, Log.VERBOSE)) { 122 Log.v(TAG, "[VideoModel] handleEvent " + evt.getType() + " on " + this); 123 } 124 125 MediaAction action = MediaAction.NO_ACTIVE_ACTION; 126 if (evtType.equals(SmilMediaElementImpl.SMIL_MEDIA_START_EVENT)) { 127 action = MediaAction.START; 128 129 // if the Music player app is playing audio, we should pause that so it won't 130 // interfere with us playing video here. 131 pauseMusicPlayer(); 132 133 mVisible = true; 134 } else if (evtType.equals(SmilMediaElementImpl.SMIL_MEDIA_END_EVENT)) { 135 action = MediaAction.STOP; 136 if (mFill != ElementTime.FILL_FREEZE) { 137 mVisible = false; 138 } 139 } else if (evtType.equals(SmilMediaElementImpl.SMIL_MEDIA_PAUSE_EVENT)) { 140 action = MediaAction.PAUSE; 141 mVisible = true; 142 } else if (evtType.equals(SmilMediaElementImpl.SMIL_MEDIA_SEEK_EVENT)) { 143 action = MediaAction.SEEK; 144 mSeekTo = ((EventImpl) evt).getSeekTo(); 145 mVisible = true; 146 } 147 148 appendAction(action); 149 notifyModelChanged(false); 150 } 151 152 protected void checkContentRestriction() throws ContentRestrictionException { 153 ContentRestriction cr = ContentRestrictionFactory.getContentRestriction(); 154 cr.checkVideoContentType(mContentType); 155 } 156 157 @Override 158 protected boolean isPlayable() { 159 return true; 160 } 161} 162