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 static com.android.mms.dom.smil.SmilMediaElementImpl.SMIL_MEDIA_END_EVENT;
2172735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Projectimport static com.android.mms.dom.smil.SmilMediaElementImpl.SMIL_MEDIA_PAUSE_EVENT;
2272735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Projectimport static com.android.mms.dom.smil.SmilMediaElementImpl.SMIL_MEDIA_SEEK_EVENT;
2372735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Projectimport static com.android.mms.dom.smil.SmilMediaElementImpl.SMIL_MEDIA_START_EVENT;
2472735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Projectimport static com.android.mms.dom.smil.SmilParElementImpl.SMIL_SLIDE_END_EVENT;
2572735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Projectimport static com.android.mms.dom.smil.SmilParElementImpl.SMIL_SLIDE_START_EVENT;
2672735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project
27d64419030e1fec1e751695dab3bd7236e2fb0214Roger Chenimport java.io.ByteArrayInputStream;
28d64419030e1fec1e751695dab3bd7236e2fb0214Roger Chenimport java.io.ByteArrayOutputStream;
29d64419030e1fec1e751695dab3bd7236e2fb0214Roger Chenimport java.io.IOException;
30d64419030e1fec1e751695dab3bd7236e2fb0214Roger Chenimport java.util.ArrayList;
31d64419030e1fec1e751695dab3bd7236e2fb0214Roger Chenimport java.util.Arrays;
3272735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project
3372735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Projectimport org.w3c.dom.events.EventTarget;
3472735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Projectimport org.w3c.dom.smil.SMILDocument;
3572735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Projectimport org.w3c.dom.smil.SMILElement;
3672735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Projectimport org.w3c.dom.smil.SMILLayoutElement;
3772735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Projectimport org.w3c.dom.smil.SMILMediaElement;
3872735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Projectimport org.w3c.dom.smil.SMILParElement;
3972735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Projectimport org.w3c.dom.smil.SMILRegionElement;
4072735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Projectimport org.w3c.dom.smil.SMILRegionMediaElement;
4172735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Projectimport org.w3c.dom.smil.SMILRootLayoutElement;
4272735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Projectimport org.xml.sax.SAXException;
4372735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project
440ecc26df09777835cfa8dbfd3c48ca7b7fa7f011Tom Taylorimport android.drm.DrmManagerClient;
4572735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Projectimport android.text.TextUtils;
460ecc26df09777835cfa8dbfd3c48ca7b7fa7f011Tom Taylorimport android.util.Config;
4772735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Projectimport android.util.Log;
4872735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project
49d64419030e1fec1e751695dab3bd7236e2fb0214Roger Chenimport com.android.mms.MmsApp;
50d64419030e1fec1e751695dab3bd7236e2fb0214Roger Chenimport com.android.mms.dom.smil.SmilDocumentImpl;
51d64419030e1fec1e751695dab3bd7236e2fb0214Roger Chenimport com.android.mms.dom.smil.parser.SmilXmlParser;
52d64419030e1fec1e751695dab3bd7236e2fb0214Roger Chenimport com.android.mms.dom.smil.parser.SmilXmlSerializer;
53d64419030e1fec1e751695dab3bd7236e2fb0214Roger Chenimport com.google.android.mms.ContentType;
54d64419030e1fec1e751695dab3bd7236e2fb0214Roger Chenimport com.google.android.mms.MmsException;
55d64419030e1fec1e751695dab3bd7236e2fb0214Roger Chenimport com.google.android.mms.pdu.PduBody;
56d64419030e1fec1e751695dab3bd7236e2fb0214Roger Chenimport com.google.android.mms.pdu.PduPart;
5772735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project
5872735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Projectpublic class SmilHelper {
599242286c35743422051d439d7460cd0a1426899cWei Huang    private static final String TAG = "Mms/smil";
6072735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project    private static final boolean DEBUG = false;
610ecc26df09777835cfa8dbfd3c48ca7b7fa7f011Tom Taylor    private static final boolean LOCAL_LOGV = DEBUG ? Config.LOGD : Config.LOGV;
6272735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project
6372735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project    public static final String ELEMENT_TAG_TEXT = "text";
6472735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project    public static final String ELEMENT_TAG_IMAGE = "img";
6572735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project    public static final String ELEMENT_TAG_AUDIO = "audio";
6672735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project    public static final String ELEMENT_TAG_VIDEO = "video";
6772735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project    public static final String ELEMENT_TAG_REF = "ref";
6872735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project
6972735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project    private SmilHelper() {
7072735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project        // Never instantiate this class.
7172735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project    }
7272735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project
7372735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project    public static SMILDocument getDocument(PduBody pb) {
7472735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project        // Find SMIL part in the message.
7572735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project        PduPart smilPart = findSmilPart(pb);
7672735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project        SMILDocument document = null;
7772735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project
7872735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project        // Try to load SMIL document from existing part.
7972735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project        if (smilPart != null) {
8072735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project            document = getSmilDocument(smilPart);
8172735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project        }
8272735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project
8372735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project        if (document == null) {
8472735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project            // Create a new SMIL document.
8572735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project            document = createSmilDocument(pb);
8672735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project        }
8772735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project
8872735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project        return document;
8972735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project    }
9072735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project
9172735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project    public static SMILDocument getDocument(SlideshowModel model) {
9272735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project        return createSmilDocument(model);
9372735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project    }
9472735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project
9572735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project    /**
9672735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project     * Find a SMIL part in the MM.
9772735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project     *
9872735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project     * @return The existing SMIL part or null if no SMIL part was found.
9972735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project     */
10072735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project    private static PduPart findSmilPart(PduBody body) {
10172735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project        int partNum = body.getPartsNum();
10272735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project        for(int i = 0; i < partNum; i++) {
10372735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project            PduPart part = body.getPart(i);
10472735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project            if (Arrays.equals(part.getContentType(),
10572735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project                            ContentType.APP_SMIL.getBytes())) {
10672735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project                // Sure only one SMIL part.
10772735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project                return part;
10872735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project            }
10972735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project        }
11072735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project        return null;
11172735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project    }
11272735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project
11372735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project    private static SMILDocument validate(SMILDocument in) {
11472735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project        // TODO: add more validating facilities.
11572735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project        return in;
11672735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project    }
11772735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project
11872735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project    /**
11972735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project     * Parse SMIL message and retrieve SMILDocument.
12072735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project     *
12172735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project     * @return A SMILDocument or null if parsing failed.
12272735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project     */
12372735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project    private static SMILDocument getSmilDocument(PduPart smilPart) {
12472735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project        try {
12572735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project            byte[] data = smilPart.getData();
12672735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project            if (data != null) {
12772735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project                if (LOCAL_LOGV) {
12872735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project                    Log.v(TAG, "Parsing SMIL document.");
12972735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project                    Log.v(TAG, new String(data));
13072735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project                }
13172735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project
13272735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project                ByteArrayInputStream bais = new ByteArrayInputStream(data);
13372735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project                SMILDocument document = new SmilXmlParser().parse(bais);
13472735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project                return validate(document);
13572735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project            }
13672735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project        } catch (IOException e) {
13772735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project            Log.e(TAG, "Failed to parse SMIL document.", e);
13872735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project        } catch (SAXException e) {
13972735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project            Log.e(TAG, "Failed to parse SMIL document.", e);
14072735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project        } catch (MmsException e) {
14172735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project            Log.e(TAG, "Failed to parse SMIL document.", e);
14272735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project        }
14372735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project        return null;
14472735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project    }
14572735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project
14672735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project    public static SMILParElement addPar(SMILDocument document) {
14772735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project        SMILParElement par = (SMILParElement) document.createElement("par");
14872735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project        // Set duration to eight seconds by default.
14972735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project        par.setDur(8.0f);
15072735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project        document.getBody().appendChild(par);
15172735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project        return par;
15272735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project    }
15372735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project
15472735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project    public static SMILMediaElement createMediaElement(
15572735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project            String tag, SMILDocument document, String src) {
15672735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project        SMILMediaElement mediaElement =
15772735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project                (SMILMediaElement) document.createElement(tag);
15831e14b68beee7af348a4d1528acf947732351a51Tom Taylor        mediaElement.setSrc(escapeXML(src));
15972735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project        return mediaElement;
16072735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project    }
16172735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project
16231e14b68beee7af348a4d1528acf947732351a51Tom Taylor    static public String escapeXML(String str) {
16331e14b68beee7af348a4d1528acf947732351a51Tom Taylor        return str.replaceAll("&","&amp;")
16431e14b68beee7af348a4d1528acf947732351a51Tom Taylor                  .replaceAll("<", "&lt;")
16531e14b68beee7af348a4d1528acf947732351a51Tom Taylor                  .replaceAll(">", "&gt;")
16631e14b68beee7af348a4d1528acf947732351a51Tom Taylor                  .replaceAll("\"", "&quot;")
16731e14b68beee7af348a4d1528acf947732351a51Tom Taylor                  .replaceAll("'", "&apos;");
16831e14b68beee7af348a4d1528acf947732351a51Tom Taylor    }
16931e14b68beee7af348a4d1528acf947732351a51Tom Taylor
17072735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project    private static SMILDocument createSmilDocument(PduBody pb) {
1710ecc26df09777835cfa8dbfd3c48ca7b7fa7f011Tom Taylor        if (Config.LOGV) {
17272735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project            Log.v(TAG, "Creating default SMIL document.");
17372735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project        }
17472735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project
17572735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project        SMILDocument document = new SmilDocumentImpl();
17672735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project
17772735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project        // Create root element.
17872735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project        // FIXME: Should we create root element in the constructor of document?
17972735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project        SMILElement smil = (SMILElement) document.createElement("smil");
18072735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project        smil.setAttribute("xmlns", "http://www.w3.org/2001/SMIL20/Language");
18172735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project        document.appendChild(smil);
18272735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project
18372735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project        // Create <head> and <layout> element.
18472735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project        SMILElement head = (SMILElement) document.createElement("head");
18572735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project        smil.appendChild(head);
18672735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project
18772735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project        SMILLayoutElement layout = (SMILLayoutElement) document.createElement("layout");
18872735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project        head.appendChild(layout);
18972735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project
19072735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project        // Create <body> element and add a empty <par>.
19172735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project        SMILElement body = (SMILElement) document.createElement("body");
19272735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project        smil.appendChild(body);
19372735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project        SMILParElement par = addPar(document);
19472735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project
19572735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project        // Create media objects for the parts in PDU.
19672735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project        int partsNum = pb.getPartsNum();
19772735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project        if (partsNum == 0) {
19872735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project            return document;
19972735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project        }
20072735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project
2010ecc26df09777835cfa8dbfd3c48ca7b7fa7f011Tom Taylor        DrmManagerClient drmManagerClient = MmsApp.getApplication().getDrmManagerClient();
2020ecc26df09777835cfa8dbfd3c48ca7b7fa7f011Tom Taylor
20372735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project        boolean hasText = false;
20472735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project        boolean hasMedia = false;
20572735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project        for (int i = 0; i < partsNum; i++) {
20672735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project            // Create new <par> element.
20772735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project            if ((par == null) || (hasMedia && hasText)) {
20872735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project                par = addPar(document);
20972735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project                hasText = false;
21072735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project                hasMedia = false;
21172735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project            }
21272735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project
21372735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project            PduPart part = pb.getPart(i);
21472735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project            String contentType = new String(part.getContentType());
2150ecc26df09777835cfa8dbfd3c48ca7b7fa7f011Tom Taylor
21672735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project            if (ContentType.isDrmType(contentType)) {
2170ecc26df09777835cfa8dbfd3c48ca7b7fa7f011Tom Taylor                contentType = drmManagerClient.getOriginalMimeType(part.getDataUri());
21872735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project            }
21972735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project
22072735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project            if (contentType.equals(ContentType.TEXT_PLAIN)
2217c8748972faf3078f53ef9ecbe6c95f0903f43f7satok                    || contentType.equalsIgnoreCase(ContentType.APP_WAP_XHTML)
2227c8748972faf3078f53ef9ecbe6c95f0903f43f7satok                    || contentType.equals(ContentType.TEXT_HTML)) {
22372735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project                SMILMediaElement textElement = createMediaElement(
22472735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project                        ELEMENT_TAG_TEXT, document, part.generateLocation());
22572735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project                par.appendChild(textElement);
22672735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project                hasText = true;
22772735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project            } else if (ContentType.isImageType(contentType)) {
22872735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project                SMILMediaElement imageElement = createMediaElement(
22972735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project                        ELEMENT_TAG_IMAGE, document, part.generateLocation());
23072735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project                par.appendChild(imageElement);
23172735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project                hasMedia = true;
23272735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project            } else if (ContentType.isVideoType(contentType)) {
23372735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project                SMILMediaElement videoElement = createMediaElement(
23472735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project                        ELEMENT_TAG_VIDEO, document, part.generateLocation());
23572735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project                par.appendChild(videoElement);
23672735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project                hasMedia = true;
23772735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project            } else if (ContentType.isAudioType(contentType)) {
23872735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project                SMILMediaElement audioElement = createMediaElement(
23972735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project                        ELEMENT_TAG_AUDIO, document, part.generateLocation());
24072735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project                par.appendChild(audioElement);
24172735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project                hasMedia = true;
24272735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project            } else {
24372735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project                // TODO: handle other media types.
24472735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project                Log.w(TAG, "unsupport media type");
24572735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project            }
24672735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project        }
24772735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project
24872735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project        return document;
24972735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project    }
25072735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project
25172735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project    private static SMILDocument createSmilDocument(SlideshowModel slideshow) {
2520ecc26df09777835cfa8dbfd3c48ca7b7fa7f011Tom Taylor        if (Config.LOGV) {
25372735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project            Log.v(TAG, "Creating SMIL document from SlideshowModel.");
25472735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project        }
25572735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project
25672735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project        SMILDocument document = new SmilDocumentImpl();
25772735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project
25872735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project        // Create SMIL and append it to document
25972735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project        SMILElement smilElement = (SMILElement) document.createElement("smil");
26072735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project        document.appendChild(smilElement);
26172735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project
26272735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project        // Create HEAD and append it to SMIL
26372735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project        SMILElement headElement = (SMILElement) document.createElement("head");
26472735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project        smilElement.appendChild(headElement);
26572735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project
26672735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project        // Create LAYOUT and append it to HEAD
26772735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project        SMILLayoutElement layoutElement = (SMILLayoutElement)
26872735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project                document.createElement("layout");
26972735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project        headElement.appendChild(layoutElement);
27072735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project
27172735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project        // Create ROOT-LAYOUT and append it to LAYOUT
27272735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project        SMILRootLayoutElement rootLayoutElement =
27372735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project                (SMILRootLayoutElement) document.createElement("root-layout");
27472735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project        LayoutModel layouts = slideshow.getLayout();
27572735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project        rootLayoutElement.setWidth(layouts.getLayoutWidth());
27672735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project        rootLayoutElement.setHeight(layouts.getLayoutHeight());
27772735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project        String bgColor = layouts.getBackgroundColor();
27872735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project        if (!TextUtils.isEmpty(bgColor)) {
27972735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project            rootLayoutElement.setBackgroundColor(bgColor);
28072735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project        }
28172735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project        layoutElement.appendChild(rootLayoutElement);
28272735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project
28372735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project        // Create REGIONs and append them to LAYOUT
28472735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project        ArrayList<RegionModel> regions = layouts.getRegions();
28572735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project        ArrayList<SMILRegionElement> smilRegions = new ArrayList<SMILRegionElement>();
28672735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project        for (RegionModel r : regions) {
28772735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project            SMILRegionElement smilRegion = (SMILRegionElement) document.createElement("region");
28872735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project            smilRegion.setId(r.getRegionId());
28972735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project            smilRegion.setLeft(r.getLeft());
29072735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project            smilRegion.setTop(r.getTop());
29172735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project            smilRegion.setWidth(r.getWidth());
29272735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project            smilRegion.setHeight(r.getHeight());
29372735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project            smilRegion.setFit(r.getFit());
29472735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project            smilRegions.add(smilRegion);
29572735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project        }
29672735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project
29772735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project        // Create BODY and append it to the document.
29872735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project        SMILElement bodyElement = (SMILElement) document.createElement("body");
29972735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project        smilElement.appendChild(bodyElement);
30072735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project
30172735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project        for (SlideModel slide : slideshow) {
30284e6aaee7d3721b0c36e9adc67e72248cf3cbadfTom Taylor            boolean txtRegionPresentInLayout = false;
30384e6aaee7d3721b0c36e9adc67e72248cf3cbadfTom Taylor            boolean imgRegionPresentInLayout = false;
30484e6aaee7d3721b0c36e9adc67e72248cf3cbadfTom Taylor
30572735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project            // Create PAR element.
30672735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project            SMILParElement par = addPar(document);
30772735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project            par.setDur(slide.getDuration() / 1000f);
30872735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project
30972735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project            addParElementEventListeners((EventTarget) par, slide);
31072735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project
31172735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project            // Add all media elements.
31272735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project            for (MediaModel media : slide) {
31372735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project                SMILMediaElement sme = null;
31472735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project                String src = media.getSrc();
31572735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project                if (media instanceof TextModel) {
31672735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project                    TextModel text = (TextModel) media;
31772735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project                    if (TextUtils.isEmpty(text.getText())) {
31872735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project                        if (LOCAL_LOGV) {
31972735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project                            Log.v(TAG, "Empty text part ignored: " + text.getSrc());
32072735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project                        }
32172735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project                        continue;
32272735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project                    }
32372735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project                    sme = SmilHelper.createMediaElement(SmilHelper.ELEMENT_TAG_TEXT, document, src);
32472735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project                    txtRegionPresentInLayout = setRegion((SMILRegionMediaElement) sme,
32572735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project                                                         smilRegions,
32672735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project                                                         layoutElement,
32772735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project                                                         LayoutModel.TEXT_REGION_ID,
32872735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project                                                         txtRegionPresentInLayout);
32972735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project                } else if (media instanceof ImageModel) {
33072735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project                    sme = SmilHelper.createMediaElement(SmilHelper.ELEMENT_TAG_IMAGE, document, src);
33172735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project                    imgRegionPresentInLayout = setRegion((SMILRegionMediaElement) sme,
33272735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project                                                         smilRegions,
33372735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project                                                         layoutElement,
33472735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project                                                         LayoutModel.IMAGE_REGION_ID,
33572735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project                                                         imgRegionPresentInLayout);
33672735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project                } else if (media instanceof VideoModel) {
33772735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project                    sme = SmilHelper.createMediaElement(SmilHelper.ELEMENT_TAG_VIDEO, document, src);
33872735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project                    imgRegionPresentInLayout = setRegion((SMILRegionMediaElement) sme,
33972735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project                                                         smilRegions,
34072735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project                                                         layoutElement,
34172735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project                                                         LayoutModel.IMAGE_REGION_ID,
34272735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project                                                         imgRegionPresentInLayout);
34372735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project                } else if (media instanceof AudioModel) {
34472735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project                    sme = SmilHelper.createMediaElement(SmilHelper.ELEMENT_TAG_AUDIO, document, src);
34572735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project                } else {
34672735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project                    Log.w(TAG, "Unsupport media: " + media);
34772735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project                    continue;
34872735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project                }
34972735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project
35072735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project                // Set timing information.
35172735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project                int begin = media.getBegin();
35272735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project                if (begin != 0) {
35372735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project                    sme.setAttribute("begin", String.valueOf(begin / 1000));
35472735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project                }
35572735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project                int duration = media.getDuration();
35672735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project                if (duration != 0) {
35772735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project                    sme.setDur((float) duration / 1000);
35872735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project                }
35972735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project                par.appendChild(sme);
36072735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project
36172735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project                addMediaElementEventListeners((EventTarget) sme, media);
36272735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project            }
36372735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project        }
36472735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project
36572735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project        if (LOCAL_LOGV) {
36672735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project            ByteArrayOutputStream out = new ByteArrayOutputStream();
36772735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project            SmilXmlSerializer.serialize(document, out);
36872735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project            Log.v(TAG, out.toString());
36972735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project        }
37072735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project
37172735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project        return document;
37272735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project    }
37372735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project
37472735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project    private static SMILRegionElement findRegionElementById(
37572735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project            ArrayList<SMILRegionElement> smilRegions, String rId) {
37672735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project        for (SMILRegionElement smilRegion : smilRegions) {
37772735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project            if (smilRegion.getId().equals(rId)) {
37872735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project                return smilRegion;
37972735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project            }
38072735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project        }
38172735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project        return null;
38272735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project    }
38372735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project
38472735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project    private static boolean setRegion(SMILRegionMediaElement srme,
38572735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project                                     ArrayList<SMILRegionElement> smilRegions,
38672735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project                                     SMILLayoutElement smilLayout,
38772735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project                                     String regionId,
38872735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project                                     boolean regionPresentInLayout) {
38972735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project        SMILRegionElement smilRegion = findRegionElementById(smilRegions, regionId);
39072735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project        if (!regionPresentInLayout && smilRegion != null) {
39172735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project            srme.setRegion(smilRegion);
39272735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project            smilLayout.appendChild(smilRegion);
39372735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project            return true;
39472735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project        }
39572735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project        return false;
39672735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project    }
39772735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project
39872735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project    static void addMediaElementEventListeners(
39972735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project            EventTarget target, MediaModel media) {
40072735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project        // To play the media with SmilPlayer, we should add them
40172735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project        // as EventListener into an EventTarget.
40272735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project        target.addEventListener(SMIL_MEDIA_START_EVENT, media, false);
40372735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project        target.addEventListener(SMIL_MEDIA_END_EVENT, media, false);
40472735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project        target.addEventListener(SMIL_MEDIA_PAUSE_EVENT, media, false);
40572735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project        target.addEventListener(SMIL_MEDIA_SEEK_EVENT, media, false);
40672735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project    }
40772735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project
40872735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project    static void addParElementEventListeners(
40972735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project            EventTarget target, SlideModel slide) {
41072735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project        // To play the slide with SmilPlayer, we should add it
41172735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project        // as EventListener into an EventTarget.
41272735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project        target.addEventListener(SMIL_SLIDE_START_EVENT, slide, false);
41372735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project        target.addEventListener(SMIL_SLIDE_END_EVENT, slide, false);
41472735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project    }
41572735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project}
416