172735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project/* 272735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project * Copyright (C) 2007-2008 Esmertec AG. 372735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project * Copyright (C) 2007-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.dom.smil; 1972735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project 2072735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Projectimport java.util.ArrayList; 2172735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project 2272735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Projectimport org.w3c.dom.DOMException; 2372735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Projectimport org.w3c.dom.smil.ElementTime; 2472735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Projectimport org.w3c.dom.smil.SMILElement; 2572735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Projectimport org.w3c.dom.smil.Time; 2672735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Projectimport org.w3c.dom.smil.TimeList; 2772735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project 2872735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Projectimport android.util.Log; 2972735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project 3072735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Projectpublic abstract class ElementTimeImpl implements ElementTime { 3172735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project private static final String TAG = "ElementTimeImpl"; 3272735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project 3372735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project private static final String FILL_REMOVE_ATTRIBUTE = "remove"; 3472735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project private static final String FILL_FREEZE_ATTRIBUTE = "freeze"; 3572735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project private static final String FILL_HOLD_ATTRIBUTE = "hold"; 3672735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project private static final String FILL_TRANSITION_ATTRIBUTE = "transition"; 3772735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project private static final String FILL_AUTO_ATTRIBUTE = "auto"; 3872735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project private static final String FILL_ATTRIBUTE_NAME = "fill"; 3972735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project private static final String FILLDEFAULT_ATTRIBUTE_NAME = "fillDefault"; 4072735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project 4172735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project final SMILElement mSmilElement; 4272735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project 4372735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project /* 4472735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project * Internal Interface 4572735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project */ 4672735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project ElementTimeImpl(SMILElement element) { 4772735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project mSmilElement = element; 4872735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project } 4972735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project 5072735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project // Default implementation. Override if required. 5172735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project int getBeginConstraints() { 5272735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project return TimeImpl.ALLOW_ALL; 5372735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project } 5472735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project 5572735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project // Default implementation. Override if required 5672735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project int getEndConstraints() { 5772735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project return TimeImpl.ALLOW_ALL; 5872735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project } 5972735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project 6072735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project /** 6172735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project * To get the parent node on the ElementTime tree. It is in opposition to getTimeChildren. 6272735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project * @return the parent ElementTime. Returns <code>null</code> if there is no parent. 6372735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project */ 6472735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project abstract ElementTime getParentElementTime(); 6572735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project 6672735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project /* 6772735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project * ElementTime Interface 6872735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project */ 6972735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project 7072735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project public TimeList getBegin() { 7172735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project String[] beginTimeStringList = mSmilElement.getAttribute("begin").split(";"); 7272735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project 7372735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project // TODO: Check other constraints on parsed values, e.g., "single, non-negative offset values 7472735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project ArrayList<Time> beginTimeList = new ArrayList<Time>(); 7572735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project // Initialize Time instances and add them to Vector 7672735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project for (int i = 0; i < beginTimeStringList.length; i++) { 7772735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project try { 7872735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project beginTimeList.add(new TimeImpl(beginTimeStringList[i], getBeginConstraints())); 7972735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project } catch (IllegalArgumentException e) { 8072735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project // Ignore badly formatted times 8172735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project } 8272735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project } 8372735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project if (beginTimeList.size() == 0) { 8472735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project /* 8572735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project * What is the right default value? 8672735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project * 8772735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project * In MMS SMIL, this method may be called either on an instance of: 8872735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project * 8972735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project * 1 - ElementSequentialTimeContainer (The SMILDocument) 9072735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project * 2 - ElementParallelTimeContainer (A Time-Child of the SMILDocument, which is a seq) 9172735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project * 3 - ElementTime (A SMILMediaElement). 9272735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project * 9372735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project * 1 - In the first case, the default start time is obviously 0. 9472735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project * 2 - In the second case, the specifications mentions that 9572735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project * "For children of a sequence, the only legal value for begin is 9672735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project * a (single) non-negative offset value. The default begin value is 0." 9772735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project * 3 - In the third case, the specification mentions that 9872735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project * "The default value of begin for children of a par is 0." 9972735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project * 10072735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project * In short, if no value is specified, the default is always 0. 10172735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project */ 10272735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project 10372735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project beginTimeList.add(new TimeImpl("0", TimeImpl.ALLOW_ALL)); 10472735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project } 10572735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project return new TimeListImpl(beginTimeList); 10672735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project } 10772735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project 10872735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project public float getDur() { 10972735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project float dur = 0; 11072735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project try { 11172735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project String durString = mSmilElement.getAttribute("dur"); 11272735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project if (durString != null) { 11372735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project dur = TimeImpl.parseClockValue(durString) / 1000f; 11472735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project } 11572735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project } catch (IllegalArgumentException e) { 116e6367524d22c6bfedfb81c7e068e475b0f807053Tom Taylor // Do nothing and return the minimum value 117e6367524d22c6bfedfb81c7e068e475b0f807053Tom Taylor } 11886b3e552c250704de7abeab5553bab664fa01f64Wei Huang 11972735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project return dur; 12072735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project } 12172735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project 12272735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project public TimeList getEnd() { 12372735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project ArrayList<Time> endTimeList = new ArrayList<Time>(); 12472735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project 12572735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project String[] endTimeStringList = mSmilElement.getAttribute("end").split(";"); 12672735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project int len = endTimeStringList.length; 12772735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project if (!((len == 1) && (endTimeStringList[0].length() == 0))) { // Ensure the end field is set. 12872735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project // Initialize Time instances and add them to Vector 12972735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project for (int i = 0; i < len; i++) { 13072735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project try { 13172735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project endTimeList.add(new TimeImpl(endTimeStringList[i], 13272735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project getEndConstraints())); 13372735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project } catch (IllegalArgumentException e) { 13472735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project // Ignore badly formatted times 13572735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project Log.e(TAG, "Malformed time value.", e); 13672735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project } 13772735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project } 13872735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project } 13972735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project 14072735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project // "end" time is not specified 14172735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project if (endTimeList.size() == 0) { 14272735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project // Get duration 14372735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project float duration = getDur(); 14472735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project 14572735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project if (duration < 0) { 14672735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project endTimeList.add(new TimeImpl("indefinite", getEndConstraints())); 14772735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project } else { 14872735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project // Get begin 14972735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project TimeList begin = getBegin(); 15072735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project for (int i = 0; i < begin.getLength(); i++) { 15172735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project endTimeList.add(new TimeImpl( 15272735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project // end = begin + dur 15372735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project begin.item(i).getResolvedOffset() + duration + "s", 15472735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project getEndConstraints())); 15572735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project } 15672735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project } 15772735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project } 15872735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project 15972735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project return new TimeListImpl(endTimeList); 16072735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project } 16172735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project 162a5c3b877c5b51f8486852bbb1528e04fa9a93c7bTom Taylor private boolean beginAndEndAreZero() { 163a5c3b877c5b51f8486852bbb1528e04fa9a93c7bTom Taylor TimeList begin = getBegin(); 164a5c3b877c5b51f8486852bbb1528e04fa9a93c7bTom Taylor TimeList end = getEnd(); 165a5c3b877c5b51f8486852bbb1528e04fa9a93c7bTom Taylor if (begin.getLength() == 1 && end.getLength() == 1) { 166a5c3b877c5b51f8486852bbb1528e04fa9a93c7bTom Taylor Time beginTime = begin.item(0); 167a5c3b877c5b51f8486852bbb1528e04fa9a93c7bTom Taylor Time endTime = end.item(0); 168a5c3b877c5b51f8486852bbb1528e04fa9a93c7bTom Taylor return beginTime.getOffset() == 0. && endTime.getOffset() == 0.; 169a5c3b877c5b51f8486852bbb1528e04fa9a93c7bTom Taylor } 170a5c3b877c5b51f8486852bbb1528e04fa9a93c7bTom Taylor return false; 171a5c3b877c5b51f8486852bbb1528e04fa9a93c7bTom Taylor } 172a5c3b877c5b51f8486852bbb1528e04fa9a93c7bTom Taylor 17372735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project public short getFill() { 17472735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project String fill = mSmilElement.getAttribute(FILL_ATTRIBUTE_NAME); 17572735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project if (fill.equalsIgnoreCase(FILL_FREEZE_ATTRIBUTE)) { 17672735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project return FILL_FREEZE; 17772735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project } else if (fill.equalsIgnoreCase(FILL_REMOVE_ATTRIBUTE)) { 17872735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project return FILL_REMOVE; 17972735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project } else if (fill.equalsIgnoreCase(FILL_HOLD_ATTRIBUTE)) { 18072735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project // FIXME handle it as freeze for now 18172735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project return FILL_FREEZE; 18272735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project } else if (fill.equalsIgnoreCase(FILL_TRANSITION_ATTRIBUTE)) { 18372735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project // FIXME handle it as freeze for now 18472735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project return FILL_FREEZE; 18572735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project } else if (!fill.equalsIgnoreCase(FILL_AUTO_ATTRIBUTE)) { 18672735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project /* 18772735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project * fill = default 18872735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project * The fill behavior for the element is determined by the value of the fillDefault 18972735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project * attribute. This is the default value. 19072735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project */ 19172735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project short fillDefault = getFillDefault(); 19272735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project if (fillDefault != FILL_AUTO) { 19372735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project return fillDefault; 19472735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project } 19572735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project } 19672735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project 19772735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project /* 19872735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project * fill = auto 19972735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project * The fill behavior for this element depends on whether the element specifies any of 20072735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project * the attributes that define the simple or active duration: 20172735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project * - If none of the attributes dur, end, repeatCount or repeatDur are specified on 20272735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project * the element, then the element will have a fill behavior identical to that if it were 20372735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project * specified as "freeze". 20472735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project * - Otherwise, the element will have a fill behavior identical to that if it were 20572735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project * specified as "remove". 20672735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project */ 207a5c3b877c5b51f8486852bbb1528e04fa9a93c7bTom Taylor if (((mSmilElement.getAttribute("dur").length() == 0) && 20872735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project (mSmilElement.getAttribute("end").length() == 0) && 20972735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project (mSmilElement.getAttribute("repeatCount").length() == 0) && 210a5c3b877c5b51f8486852bbb1528e04fa9a93c7bTom Taylor (mSmilElement.getAttribute("repeatDur").length() == 0)) || 211a5c3b877c5b51f8486852bbb1528e04fa9a93c7bTom Taylor beginAndEndAreZero()) { 21272735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project return FILL_FREEZE; 21372735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project } else { 21472735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project return FILL_REMOVE; 21572735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project } 21672735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project } 21772735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project 21872735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project public short getFillDefault() { 21972735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project String fillDefault = mSmilElement.getAttribute(FILLDEFAULT_ATTRIBUTE_NAME); 22072735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project if (fillDefault.equalsIgnoreCase(FILL_REMOVE_ATTRIBUTE)) { 22172735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project return FILL_REMOVE; 22272735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project } else if (fillDefault.equalsIgnoreCase(FILL_FREEZE_ATTRIBUTE)) { 22372735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project return FILL_FREEZE; 22472735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project } else if (fillDefault.equalsIgnoreCase(FILL_AUTO_ATTRIBUTE)) { 22572735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project return FILL_AUTO; 22672735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project } else if (fillDefault.equalsIgnoreCase(FILL_HOLD_ATTRIBUTE)) { 22772735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project // FIXME handle it as freeze for now 22872735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project return FILL_FREEZE; 22972735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project } else if (fillDefault.equalsIgnoreCase(FILL_TRANSITION_ATTRIBUTE)) { 23072735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project // FIXME handle it as freeze for now 23172735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project return FILL_FREEZE; 23272735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project } else { 23372735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project /* 23472735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project * fillDefault = inherit 23572735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project * Specifies that the value of this attribute (and of the fill behavior) are 23672735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project * inherited from the fillDefault value of the parent element. 23772735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project * This is the default value. 23872735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project */ 23972735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project ElementTime parent = getParentElementTime(); 24072735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project if (parent == null) { 24172735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project /* 24272735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project * fillDefault = auto 24372735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project * If there is no parent element, the value is "auto". 24472735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project */ 24572735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project return FILL_AUTO; 24672735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project } else { 24772735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project return ((ElementTimeImpl) parent).getFillDefault(); 24872735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project } 24972735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project } 25072735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project } 25172735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project 25272735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project public float getRepeatCount() { 25372735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project String repeatCount = mSmilElement.getAttribute("repeatCount"); 25472735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project try { 25572735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project float value = Float.parseFloat(repeatCount); 25672735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project if (value > 0) { 25772735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project return value; 25872735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project } else { 25972735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project return 0; // default 26072735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project } 26172735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project } catch (NumberFormatException e) { 26272735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project return 0; // default 26372735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project } 26472735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project } 26572735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project 26672735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project public float getRepeatDur() { 26772735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project try { 26872735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project float repeatDur = 26972735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project TimeImpl.parseClockValue(mSmilElement.getAttribute("repeatDur")); 27072735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project if (repeatDur > 0) { 27172735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project return repeatDur; 27272735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project } else { 27372735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project return 0; // default 27472735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project } 27572735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project } catch (IllegalArgumentException e) { 27672735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project return 0; // default 27772735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project } 27872735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project } 27972735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project 28072735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project public short getRestart() { 28172735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project String restart = mSmilElement.getAttribute("restart"); 28272735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project if (restart.equalsIgnoreCase("never")) { 28372735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project return RESTART_NEVER; 28472735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project } else if (restart.equalsIgnoreCase("whenNotActive")) { 28572735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project return RESTART_WHEN_NOT_ACTIVE; 28672735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project } else { 28772735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project return RESTART_ALWAYS; // default 28872735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project } 28972735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project } 29072735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project 29172735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project public void setBegin(TimeList begin) throws DOMException { 29272735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project // TODO Implement this 29372735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project mSmilElement.setAttribute("begin", "indefinite"); 29472735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project } 29572735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project 29672735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project public void setDur(float dur) throws DOMException { 29772735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project // In SMIL 3.0, the dur could be a timecount-value which may contain fractions. 29872735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project // However, in MMS 1.3, the dur SHALL be expressed in integer milliseconds. 29972735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project mSmilElement.setAttribute("dur", Integer.toString((int)(dur * 1000)) + "ms"); 30072735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project } 30172735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project 30272735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project public void setEnd(TimeList end) throws DOMException { 30372735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project // TODO Implement this 30472735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project mSmilElement.setAttribute("end", "indefinite"); 30572735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project } 30672735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project 30772735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project public void setFill(short fill) throws DOMException { 30872735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project if (fill == FILL_FREEZE) { 30972735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project mSmilElement.setAttribute(FILL_ATTRIBUTE_NAME, FILL_FREEZE_ATTRIBUTE); 31072735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project } else { 31172735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project mSmilElement.setAttribute(FILL_ATTRIBUTE_NAME, FILL_REMOVE_ATTRIBUTE); // default 31272735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project } 31372735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project } 31472735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project 31572735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project public void setFillDefault(short fillDefault) throws DOMException { 31672735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project if (fillDefault == FILL_FREEZE) { 31772735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project mSmilElement.setAttribute(FILLDEFAULT_ATTRIBUTE_NAME, FILL_FREEZE_ATTRIBUTE); 31872735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project } else { 31972735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project mSmilElement.setAttribute(FILLDEFAULT_ATTRIBUTE_NAME, FILL_REMOVE_ATTRIBUTE); 32072735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project } 32172735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project } 32272735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project 32372735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project public void setRepeatCount(float repeatCount) throws DOMException { 32472735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project String repeatCountString = "indefinite"; 32572735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project if (repeatCount > 0) { 32672735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project repeatCountString = Float.toString(repeatCount); 32772735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project } 32872735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project mSmilElement.setAttribute("repeatCount", repeatCountString); 32972735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project } 33072735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project 33172735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project public void setRepeatDur(float repeatDur) throws DOMException { 33272735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project String repeatDurString = "indefinite"; 33372735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project if (repeatDur > 0) { 33472735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project repeatDurString = Float.toString(repeatDur) + "ms"; 33572735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project } 33672735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project mSmilElement.setAttribute("repeatDur", repeatDurString); 33772735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project } 33872735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project 33972735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project public void setRestart(short restart) throws DOMException { 34072735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project if (restart == RESTART_NEVER) { 34172735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project mSmilElement.setAttribute("restart", "never"); 34272735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project } else if (restart == RESTART_WHEN_NOT_ACTIVE) { 34372735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project mSmilElement.setAttribute("restart", "whenNotActive"); 34472735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project } else { 34572735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project mSmilElement.setAttribute("restart", "always"); 34672735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project } 34772735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project } 34872735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project} 349