1 /* 2 * Copyright (C) 2007-2008 Esmertec AG. 3 * Copyright (C) 2007-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 18 package com.android.mms.dom.smil; 19 20 import org.w3c.dom.DOMException; 21 import org.w3c.dom.events.DocumentEvent; 22 import org.w3c.dom.events.Event; 23 import org.w3c.dom.smil.ElementTime; 24 import org.w3c.dom.smil.SMILMediaElement; 25 import org.w3c.dom.smil.TimeList; 26 27 import android.util.Log; 28 29 import com.android.mms.LogTag; 30 import com.android.mms.dom.events.EventImpl; 31 32 public class SmilMediaElementImpl extends SmilElementImpl implements 33 SMILMediaElement { 34 public final static String SMIL_MEDIA_START_EVENT = "SmilMediaStart"; 35 public final static String SMIL_MEDIA_END_EVENT = "SmilMediaEnd"; 36 public final static String SMIL_MEDIA_PAUSE_EVENT = "SmilMediaPause"; 37 public final static String SMIL_MEDIA_SEEK_EVENT = "SmilMediaSeek"; 38 private final static String TAG = LogTag.TAG; 39 private static final boolean DEBUG = false; 40 private static final boolean LOCAL_LOGV = false; 41 42 ElementTime mElementTime = new ElementTimeImpl(this) { 43 private Event createEvent(String eventType) { 44 DocumentEvent doc = 45 (DocumentEvent)SmilMediaElementImpl.this.getOwnerDocument(); 46 Event event = doc.createEvent("Event"); 47 event.initEvent(eventType, false, false); 48 if (LOCAL_LOGV) { 49 Log.v(TAG, "Dispatching 'begin' event to " 50 + SmilMediaElementImpl.this.getTagName() + " " 51 + SmilMediaElementImpl.this.getSrc() + " at " 52 + System.currentTimeMillis()); 53 } 54 return event; 55 } 56 57 private Event createEvent(String eventType, int seekTo) { 58 DocumentEvent doc = 59 (DocumentEvent)SmilMediaElementImpl.this.getOwnerDocument(); 60 EventImpl event = (EventImpl) doc.createEvent("Event"); 61 event.initEvent(eventType, false, false, seekTo); 62 if (LOCAL_LOGV) { 63 Log.v(TAG, "Dispatching 'begin' event to " 64 + SmilMediaElementImpl.this.getTagName() + " " 65 + SmilMediaElementImpl.this.getSrc() + " at " 66 + System.currentTimeMillis()); 67 } 68 return event; 69 } 70 71 public boolean beginElement() { 72 Event startEvent = createEvent(SMIL_MEDIA_START_EVENT); 73 dispatchEvent(startEvent); 74 return true; 75 } 76 77 public boolean endElement() { 78 Event endEvent = createEvent(SMIL_MEDIA_END_EVENT); 79 dispatchEvent(endEvent); 80 return true; 81 } 82 83 public void resumeElement() { 84 Event resumeEvent = createEvent(SMIL_MEDIA_START_EVENT); 85 dispatchEvent(resumeEvent); 86 } 87 88 public void pauseElement() { 89 Event pauseEvent = createEvent(SMIL_MEDIA_PAUSE_EVENT); 90 dispatchEvent(pauseEvent); 91 } 92 93 public void seekElement(float seekTo) { 94 Event seekEvent = createEvent(SMIL_MEDIA_SEEK_EVENT, (int) seekTo); 95 dispatchEvent(seekEvent); 96 } 97 98 @Override 99 public float getDur() { 100 float dur = super.getDur(); 101 if (dur == 0) { 102 // Duration is not specified, So get the implicit duration. 103 String tag = getTagName(); 104 if (tag.equals("video") || tag.equals("audio")) { 105 // Continuous media 106 // FIXME Should get the duration of the media. "indefinite" instead here. 107 dur = -1.0F; 108 } else if (tag.equals("text") || tag.equals("img")) { 109 // Discrete media 110 dur = 0; 111 } else { 112 Log.w(TAG, "Unknown media type"); 113 } 114 } 115 return dur; 116 } 117 118 @Override 119 ElementTime getParentElementTime() { 120 return ((SmilParElementImpl) mSmilElement.getParentNode()).mParTimeContainer; 121 } 122 }; 123 124 /* 125 * Internal Interface 126 */ 127 SmilMediaElementImpl(SmilDocumentImpl owner, String tagName)128 SmilMediaElementImpl(SmilDocumentImpl owner, String tagName) { 129 super(owner, tagName); 130 } 131 132 /* 133 * SMILMediaElement Interface 134 */ 135 getAbstractAttr()136 public String getAbstractAttr() { 137 return this.getAttribute("abstract"); 138 } 139 getAlt()140 public String getAlt() { 141 return this.getAttribute("alt"); 142 } 143 getAuthor()144 public String getAuthor() { 145 return this.getAttribute("author"); 146 } 147 getClipBegin()148 public String getClipBegin() { 149 return this.getAttribute("clipBegin"); 150 } 151 getClipEnd()152 public String getClipEnd() { 153 return this.getAttribute("clipEnd"); 154 } 155 getCopyright()156 public String getCopyright() { 157 return this.getAttribute("copyright"); 158 } 159 getLongdesc()160 public String getLongdesc() { 161 return this.getAttribute("longdesc"); 162 } 163 getPort()164 public String getPort() { 165 return this.getAttribute("port"); 166 } 167 getReadIndex()168 public String getReadIndex() { 169 return this.getAttribute("readIndex"); 170 } 171 getRtpformat()172 public String getRtpformat() { 173 return this.getAttribute("rtpformat"); 174 } 175 getSrc()176 public String getSrc() { 177 return this.getAttribute("src"); 178 } 179 getStripRepeat()180 public String getStripRepeat() { 181 return this.getAttribute("stripRepeat"); 182 } 183 getTitle()184 public String getTitle() { 185 return this.getAttribute("title"); 186 } 187 getTransport()188 public String getTransport() { 189 return this.getAttribute("transport"); 190 } 191 getType()192 public String getType() { 193 return this.getAttribute("type"); 194 } 195 setAbstractAttr(String abstractAttr)196 public void setAbstractAttr(String abstractAttr) throws DOMException { 197 this.setAttribute("abstract", abstractAttr); 198 } 199 setAlt(String alt)200 public void setAlt(String alt) throws DOMException { 201 this.setAttribute("alt", alt); 202 } 203 setAuthor(String author)204 public void setAuthor(String author) throws DOMException { 205 this.setAttribute("author", author); 206 } 207 setClipBegin(String clipBegin)208 public void setClipBegin(String clipBegin) throws DOMException { 209 this.setAttribute("clipBegin", clipBegin); 210 } 211 setClipEnd(String clipEnd)212 public void setClipEnd(String clipEnd) throws DOMException { 213 this.setAttribute("clipEnd", clipEnd); 214 } 215 setCopyright(String copyright)216 public void setCopyright(String copyright) throws DOMException { 217 this.setAttribute("copyright", copyright); 218 } 219 setLongdesc(String longdesc)220 public void setLongdesc(String longdesc) throws DOMException { 221 this.setAttribute("longdesc", longdesc); 222 223 } 224 setPort(String port)225 public void setPort(String port) throws DOMException { 226 this.setAttribute("port", port); 227 } 228 setReadIndex(String readIndex)229 public void setReadIndex(String readIndex) throws DOMException { 230 this.setAttribute("readIndex", readIndex); 231 } 232 setRtpformat(String rtpformat)233 public void setRtpformat(String rtpformat) throws DOMException { 234 this.setAttribute("rtpformat", rtpformat); 235 } 236 setSrc(String src)237 public void setSrc(String src) throws DOMException { 238 this.setAttribute("src", src); 239 } 240 setStripRepeat(String stripRepeat)241 public void setStripRepeat(String stripRepeat) throws DOMException { 242 this.setAttribute("stripRepeat", stripRepeat); 243 } 244 setTitle(String title)245 public void setTitle(String title) throws DOMException { 246 this.setAttribute("title", title); 247 } 248 setTransport(String transport)249 public void setTransport(String transport) throws DOMException { 250 this.setAttribute("transport", transport); 251 } 252 setType(String type)253 public void setType(String type) throws DOMException { 254 this.setAttribute("type", type); 255 } 256 257 /* 258 * TimeElement Interface 259 */ 260 beginElement()261 public boolean beginElement() { 262 return mElementTime.beginElement(); 263 } 264 endElement()265 public boolean endElement() { 266 return mElementTime.endElement(); 267 } 268 getBegin()269 public TimeList getBegin() { 270 return mElementTime.getBegin(); 271 } 272 getDur()273 public float getDur() { 274 return mElementTime.getDur(); 275 } 276 getEnd()277 public TimeList getEnd() { 278 return mElementTime.getEnd(); 279 } 280 getFill()281 public short getFill() { 282 return mElementTime.getFill(); 283 } 284 getFillDefault()285 public short getFillDefault() { 286 return mElementTime.getFillDefault(); 287 } 288 getRepeatCount()289 public float getRepeatCount() { 290 return mElementTime.getRepeatCount(); 291 } 292 getRepeatDur()293 public float getRepeatDur() { 294 return mElementTime.getRepeatDur(); 295 } 296 getRestart()297 public short getRestart() { 298 return mElementTime.getRestart(); 299 } 300 pauseElement()301 public void pauseElement() { 302 mElementTime.pauseElement(); 303 } 304 resumeElement()305 public void resumeElement() { 306 mElementTime.resumeElement(); 307 } 308 seekElement(float seekTo)309 public void seekElement(float seekTo) { 310 mElementTime.seekElement(seekTo); 311 } 312 setBegin(TimeList begin)313 public void setBegin(TimeList begin) throws DOMException { 314 mElementTime.setBegin(begin); 315 } 316 setDur(float dur)317 public void setDur(float dur) throws DOMException { 318 mElementTime.setDur(dur); 319 } 320 setEnd(TimeList end)321 public void setEnd(TimeList end) throws DOMException { 322 mElementTime.setEnd(end); 323 } 324 setFill(short fill)325 public void setFill(short fill) throws DOMException { 326 mElementTime.setFill(fill); 327 } 328 setFillDefault(short fillDefault)329 public void setFillDefault(short fillDefault) throws DOMException { 330 mElementTime.setFillDefault(fillDefault); 331 } 332 setRepeatCount(float repeatCount)333 public void setRepeatCount(float repeatCount) throws DOMException { 334 mElementTime.setRepeatCount(repeatCount); 335 } 336 setRepeatDur(float repeatDur)337 public void setRepeatDur(float repeatDur) throws DOMException { 338 mElementTime.setRepeatDur(repeatDur); 339 } 340 setRestart(short restart)341 public void setRestart(short restart) throws DOMException { 342 mElementTime.setRestart(restart); 343 } 344 } 345