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