Search in sources :

Example 11 with SMILRegionElement

use of org.w3c.dom.smil.SMILRegionElement in project qksms by moezbhatti.

the class SlideshowModel method createFromPduBody.

public static SlideshowModel createFromPduBody(Context context, PduBody pb) throws MmsException {
    SMILDocument document = SmilHelper.getDocument(pb);
    // Create root-layout model.
    SMILLayoutElement sle = document.getLayout();
    SMILRootLayoutElement srle = sle.getRootLayout();
    int w = srle.getWidth();
    int h = srle.getHeight();
    if ((w == 0) || (h == 0)) {
        w = LayoutManager.getInstance().getLayoutParameters().getWidth();
        h = LayoutManager.getInstance().getLayoutParameters().getHeight();
        srle.setWidth(w);
        srle.setHeight(h);
    }
    RegionModel rootLayout = new RegionModel(null, 0, 0, w, h);
    // Create region models.
    ArrayList<RegionModel> regions = new ArrayList<>();
    NodeList nlRegions = sle.getRegions();
    int regionsNum = nlRegions.getLength();
    for (int i = 0; i < regionsNum; i++) {
        SMILRegionElement sre = (SMILRegionElement) nlRegions.item(i);
        RegionModel r = new RegionModel(sre.getId(), sre.getFit(), sre.getLeft(), sre.getTop(), sre.getWidth(), sre.getHeight(), sre.getBackgroundColor());
        regions.add(r);
    }
    LayoutModel layouts = new LayoutModel(rootLayout, regions);
    // Create slide models.
    SMILElement docBody = document.getBody();
    NodeList slideNodes = docBody.getChildNodes();
    int slidesNum = slideNodes.getLength();
    ArrayList<SlideModel> slides = new ArrayList<>(slidesNum);
    int totalMessageSize = 0;
    for (int i = 0; i < slidesNum; i++) {
        // FIXME: This is NOT compatible with the SMILDocument which is
        // generated by some other mobile phones.
        SMILParElement par = (SMILParElement) slideNodes.item(i);
        // Create media models for each slide.
        NodeList mediaNodes = par.getChildNodes();
        int mediaNum = mediaNodes.getLength();
        ArrayList<MediaModel> mediaSet = new ArrayList<>(mediaNum);
        ArrayList<String> srcs = new ArrayList<>(mediaNum);
        for (int j = 0; j < mediaNum; j++) {
            SMILMediaElement sme = (SMILMediaElement) mediaNodes.item(j);
            srcs.add(sme.getSrc());
        }
        for (int j = 0; j < mediaNum; j++) {
            SMILMediaElement sme = (SMILMediaElement) mediaNodes.item(j);
            try {
                MediaModel media = MediaModelFactory.getMediaModel(context, sme, srcs, layouts, pb);
                /*
                    * This is for slide duration value set.
                    * If mms server does not support slide duration.
                    */
                if (!MmsConfig.getSlideDurationEnabled()) {
                    int mediadur = media.getDuration();
                    float dur = par.getDur();
                    if (dur == 0) {
                        mediadur = MmsConfig.getMinimumSlideElementDuration() * 1000;
                        media.setDuration(mediadur);
                    }
                    if ((int) mediadur / 1000 != dur) {
                        String tag = sme.getTagName();
                        if (ContentType.isVideoType(media.mContentType) || tag.equals(SmilHelper.ELEMENT_TAG_VIDEO) || ContentType.isAudioType(media.mContentType) || tag.equals(SmilHelper.ELEMENT_TAG_AUDIO)) {
                            /*
                                * add 1 sec to release and close audio/video
                                * for guaranteeing the audio/video playing.
                                * because the mmsc does not support the slide duration.
                                */
                            par.setDur((float) mediadur / 1000 + 1);
                        } else {
                            /*
                                * If a slide has an image and an audio/video element
                                * and the audio/video element has longer duration than the image,
                                * The Image disappear before the slide play done. so have to match
                                * an image duration to the slide duration.
                                */
                            if ((int) mediadur / 1000 < dur) {
                                media.setDuration((int) dur * 1000);
                            } else {
                                if ((int) dur != 0) {
                                    media.setDuration((int) dur * 1000);
                                } else {
                                    par.setDur((float) mediadur / 1000);
                                }
                            }
                        }
                    }
                }
                SmilHelper.addMediaElementEventListeners((EventTarget) sme, media);
                mediaSet.add(media);
                totalMessageSize += media.getMediaSize();
            } catch (IOException e) {
                Log.e(TAG, e.getMessage(), e);
            } catch (IllegalArgumentException e) {
                Log.e(TAG, e.getMessage(), e);
            } catch (UnsupportContentTypeException e) {
                Log.e(TAG, e.getMessage(), e);
            }
        }
        SlideModel slide = new SlideModel((int) (par.getDur() * 1000), mediaSet);
        slide.setFill(par.getFill());
        SmilHelper.addParElementEventListeners((EventTarget) par, slide);
        slides.add(slide);
    }
    SlideshowModel slideshow = new SlideshowModel(layouts, slides, document, pb, context);
    slideshow.mTotalMessageSize = totalMessageSize;
    slideshow.registerModelChangedObserver(slideshow);
    return slideshow;
}
Also used : SMILDocument(org.w3c.dom.smil.SMILDocument) NodeList(org.w3c.dom.NodeList) ArrayList(java.util.ArrayList) SMILElement(org.w3c.dom.smil.SMILElement) IOException(java.io.IOException) UnsupportContentTypeException(com.moez.QKSMS.UnsupportContentTypeException) SMILMediaElement(org.w3c.dom.smil.SMILMediaElement) SMILRootLayoutElement(org.w3c.dom.smil.SMILRootLayoutElement) SMILLayoutElement(org.w3c.dom.smil.SMILLayoutElement) SMILParElement(org.w3c.dom.smil.SMILParElement) SMILRegionElement(org.w3c.dom.smil.SMILRegionElement)

Example 12 with SMILRegionElement

use of org.w3c.dom.smil.SMILRegionElement in project android-aosp-mms by slvn.

the class MediaModelFactory method getRegionMediaModel.

private static MediaModel getRegionMediaModel(Context context, String tag, String src, SMILRegionMediaElement srme, LayoutModel layouts, PduPart part) throws IOException, MmsException {
    SMILRegionElement sre = srme.getRegion();
    if (sre != null) {
        RegionModel region = layouts.findRegionById(sre.getId());
        if (region != null) {
            return getGenericMediaModel(context, tag, src, srme, part, region);
        }
    } else {
        String rId = null;
        if (tag.equals(SmilHelper.ELEMENT_TAG_TEXT)) {
            rId = LayoutModel.TEXT_REGION_ID;
        } else {
            rId = LayoutModel.IMAGE_REGION_ID;
        }
        RegionModel region = layouts.findRegionById(rId);
        if (region != null) {
            return getGenericMediaModel(context, tag, src, srme, part, region);
        }
    }
    throw new IllegalArgumentException("Region not found or bad region ID.");
}
Also used : SMILRegionElement(org.w3c.dom.smil.SMILRegionElement)

Example 13 with SMILRegionElement

use of org.w3c.dom.smil.SMILRegionElement in project android-aosp-mms by slvn.

the class SlideshowModel method createFromPduBody.

public static SlideshowModel createFromPduBody(Context context, PduBody pb) throws MmsException {
    SMILDocument document = SmilHelper.getDocument(pb);
    // Create root-layout model.
    SMILLayoutElement sle = document.getLayout();
    SMILRootLayoutElement srle = sle.getRootLayout();
    int w = srle.getWidth();
    int h = srle.getHeight();
    if ((w == 0) || (h == 0)) {
        w = LayoutManager.getInstance().getLayoutParameters().getWidth();
        h = LayoutManager.getInstance().getLayoutParameters().getHeight();
        srle.setWidth(w);
        srle.setHeight(h);
    }
    RegionModel rootLayout = new RegionModel(null, 0, 0, w, h);
    // Create region models.
    ArrayList<RegionModel> regions = new ArrayList<RegionModel>();
    NodeList nlRegions = sle.getRegions();
    int regionsNum = nlRegions.getLength();
    for (int i = 0; i < regionsNum; i++) {
        SMILRegionElement sre = (SMILRegionElement) nlRegions.item(i);
        RegionModel r = new RegionModel(sre.getId(), sre.getFit(), sre.getLeft(), sre.getTop(), sre.getWidth(), sre.getHeight(), sre.getBackgroundColor());
        regions.add(r);
    }
    LayoutModel layouts = new LayoutModel(rootLayout, regions);
    // Create slide models.
    SMILElement docBody = document.getBody();
    NodeList slideNodes = docBody.getChildNodes();
    int slidesNum = slideNodes.getLength();
    ArrayList<SlideModel> slides = new ArrayList<SlideModel>(slidesNum);
    int totalMessageSize = 0;
    for (int i = 0; i < slidesNum; i++) {
        // FIXME: This is NOT compatible with the SMILDocument which is
        // generated by some other mobile phones.
        SMILParElement par = (SMILParElement) slideNodes.item(i);
        // Create media models for each slide.
        NodeList mediaNodes = par.getChildNodes();
        int mediaNum = mediaNodes.getLength();
        ArrayList<MediaModel> mediaSet = new ArrayList<MediaModel>(mediaNum);
        for (int j = 0; j < mediaNum; j++) {
            SMILMediaElement sme = (SMILMediaElement) mediaNodes.item(j);
            try {
                MediaModel media = MediaModelFactory.getMediaModel(context, sme, layouts, pb);
                /*
                    * This is for slide duration value set.
                    * If mms server does not support slide duration.
                    */
                if (!MmsConfig.getSlideDurationEnabled()) {
                    int mediadur = media.getDuration();
                    float dur = par.getDur();
                    if (dur == 0) {
                        mediadur = MmsConfig.getMinimumSlideElementDuration() * 1000;
                        media.setDuration(mediadur);
                    }
                    if ((int) mediadur / 1000 != dur) {
                        String tag = sme.getTagName();
                        if (ContentType.isVideoType(media.mContentType) || tag.equals(SmilHelper.ELEMENT_TAG_VIDEO) || ContentType.isAudioType(media.mContentType) || tag.equals(SmilHelper.ELEMENT_TAG_AUDIO)) {
                            /*
                                * add 1 sec to release and close audio/video
                                * for guaranteeing the audio/video playing.
                                * because the mmsc does not support the slide duration.
                                */
                            par.setDur((float) mediadur / 1000 + 1);
                        } else {
                            /*
                                * If a slide has an image and an audio/video element
                                * and the audio/video element has longer duration than the image,
                                * The Image disappear before the slide play done. so have to match
                                * an image duration to the slide duration.
                                */
                            if ((int) mediadur / 1000 < dur) {
                                media.setDuration((int) dur * 1000);
                            } else {
                                if ((int) dur != 0) {
                                    media.setDuration((int) dur * 1000);
                                } else {
                                    par.setDur((float) mediadur / 1000);
                                }
                            }
                        }
                    }
                }
                SmilHelper.addMediaElementEventListeners((EventTarget) sme, media);
                mediaSet.add(media);
                totalMessageSize += media.getMediaSize();
            } catch (IOException e) {
                Log.e(TAG, e.getMessage(), e);
            } catch (IllegalArgumentException e) {
                Log.e(TAG, e.getMessage(), e);
            } catch (UnsupportContentTypeException e) {
                Log.e(TAG, e.getMessage(), e);
            }
        }
        SlideModel slide = new SlideModel((int) (par.getDur() * 1000), mediaSet);
        slide.setFill(par.getFill());
        SmilHelper.addParElementEventListeners((EventTarget) par, slide);
        slides.add(slide);
    }
    SlideshowModel slideshow = new SlideshowModel(layouts, slides, document, pb, context);
    slideshow.mTotalMessageSize = totalMessageSize;
    slideshow.registerModelChangedObserver(slideshow);
    return slideshow;
}
Also used : SMILDocument(org.w3c.dom.smil.SMILDocument) NodeList(org.w3c.dom.NodeList) ArrayList(java.util.ArrayList) SMILElement(org.w3c.dom.smil.SMILElement) IOException(java.io.IOException) UnsupportContentTypeException(com.android.mms.UnsupportContentTypeException) SMILMediaElement(org.w3c.dom.smil.SMILMediaElement) SMILRootLayoutElement(org.w3c.dom.smil.SMILRootLayoutElement) SMILLayoutElement(org.w3c.dom.smil.SMILLayoutElement) SMILParElement(org.w3c.dom.smil.SMILParElement) SMILRegionElement(org.w3c.dom.smil.SMILRegionElement)

Aggregations

SMILRegionElement (org.w3c.dom.smil.SMILRegionElement)13 SMILDocument (org.w3c.dom.smil.SMILDocument)8 NodeList (org.w3c.dom.NodeList)5 SMILElement (org.w3c.dom.smil.SMILElement)5 SMILLayoutElement (org.w3c.dom.smil.SMILLayoutElement)5 SMILMediaElement (org.w3c.dom.smil.SMILMediaElement)5 SMILParElement (org.w3c.dom.smil.SMILParElement)5 SMILRootLayoutElement (org.w3c.dom.smil.SMILRootLayoutElement)5 ArrayList (java.util.ArrayList)4 SMILRegionMediaElement (org.w3c.dom.smil.SMILRegionMediaElement)3 SmilDocumentImpl (com.android.mms.dom.smil.SmilDocumentImpl)2 ByteArrayOutputStream (java.io.ByteArrayOutputStream)2 IOException (java.io.IOException)2 UnsupportContentTypeException (com.android.mms.UnsupportContentTypeException)1 UnsupportContentTypeException (com.moez.QKSMS.UnsupportContentTypeException)1 SmilDocumentImpl (org.thoughtcrime.securesms.dom.smil.SmilDocumentImpl)1 PduPart (ws.com.google.android.mms.pdu.PduPart)1