diff options
author | Bryan Aldrich <bryan.a.aldrich@gmail.com> | 2013-07-06 01:40:29 -0400 |
---|---|---|
committer | Gerrit Code Review <gerrit@cyanogenmod.org> | 2013-07-23 17:37:47 +0000 |
commit | 2757db88a16af8197243025a9393367a6ebba3e1 (patch) | |
tree | c43054e45e6a785a7875ff511f3b7d7039c9a6c2 | |
parent | b9b83171ac9d8e7a66a2908524dd507704304da0 (diff) | |
download | packages_apps_Mms-2757db88a16af8197243025a9393367a6ebba3e1.zip packages_apps_Mms-2757db88a16af8197243025a9393367a6ebba3e1.tar.gz packages_apps_Mms-2757db88a16af8197243025a9393367a6ebba3e1.tar.bz2 |
MediaModelFactory.findPart moved to SmilHelper for use in both places.
findPart updated to include looking in ContentId even if the "src" does not have the cid: prefix. Noticed from a Stock GS4.
SmilHelper now has a fixup(...) method which removes duplciate parts.
Change-Id: I1e1b6b0792888797123fadd795dd33b141ce8ea2
-rwxr-xr-x[-rw-r--r--] | src/com/android/mms/model/MediaModelFactory.java | 35 | ||||
-rwxr-xr-x[-rw-r--r--] | src/com/android/mms/model/SmilHelper.java | 92 |
2 files changed, 91 insertions, 36 deletions
diff --git a/src/com/android/mms/model/MediaModelFactory.java b/src/com/android/mms/model/MediaModelFactory.java index 6ed7a7b..92e537d 100644..100755 --- a/src/com/android/mms/model/MediaModelFactory.java +++ b/src/com/android/mms/model/MediaModelFactory.java @@ -43,7 +43,7 @@ public class MediaModelFactory { throws IOException, IllegalArgumentException, MmsException { String tag = sme.getTagName(); String src = sme.getSrc(); - PduPart part = findPart(pb, src); + PduPart part = SmilHelper.findPart(pb, src); if (sme instanceof SMILRegionMediaElement) { return getRegionMediaModel( @@ -54,39 +54,6 @@ public class MediaModelFactory { } } - private static PduPart findPart(PduBody pb, String src) { - PduPart part = null; - - if (src != null) { - src = unescapeXML(src); - if (src.startsWith("cid:")) { - part = pb.getPartByContentId("<" + src.substring("cid:".length()) + ">"); - } else { - part = pb.getPartByName(src); - if (part == null) { - part = pb.getPartByFileName(src); - if (part == null) { - part = pb.getPartByContentLocation(src); - } - } - } - } - - if (part != null) { - return part; - } - - throw new IllegalArgumentException("No part found for the model."); - } - - private static String unescapeXML(String str) { - return str.replaceAll("<","<") - .replaceAll(">", ">") - .replaceAll(""","\"") - .replaceAll("'","'") - .replaceAll("&", "&"); - } - private static MediaModel getRegionMediaModel(Context context, String tag, String src, SMILRegionMediaElement srme, LayoutModel layouts, PduPart part) throws IOException, MmsException { diff --git a/src/com/android/mms/model/SmilHelper.java b/src/com/android/mms/model/SmilHelper.java index 755bcab..c8e03f3 100644..100755 --- a/src/com/android/mms/model/SmilHelper.java +++ b/src/com/android/mms/model/SmilHelper.java @@ -30,6 +30,7 @@ import java.io.IOException; import java.util.ArrayList; import java.util.Arrays; +import org.w3c.dom.NodeList; import org.w3c.dom.events.EventTarget; import org.w3c.dom.smil.SMILDocument; import org.w3c.dom.smil.SMILElement; @@ -77,7 +78,7 @@ public class SmilHelper { // Try to load SMIL document from existing part. if (smilPart != null) { - document = getSmilDocument(smilPart); + document = getSmilDocument(smilPart, pb); } if (document == null) { @@ -115,12 +116,98 @@ public class SmilHelper { return in; } + private static SMILDocument fixup(SMILDocument in, PduBody pb) { + //Some Mms implementations end up creating two <par> elements which actually point to the same rendered element. + SMILElement body = in.getBody(); + NodeList slideNodes = body.getChildNodes(); + int slideNodesLen = slideNodes.getLength(); + + for (int i = 0; i < slideNodesLen; i++) { + SMILParElement parA = (SMILParElement) slideNodes.item(i); + NodeList mediaNodesA = parA.getChildNodes(); + int mediaNodesALen = mediaNodesA.getLength(); + + SMILParElement matchedPart = null; + + for (int iB = i + 1; iB < slideNodesLen; iB++) { + SMILParElement parB = (SMILParElement) slideNodes.item(iB); + matchedPart = parB; + + NodeList mediaNodesB = parB.getChildNodes(); + + int mediaNodesBLen = mediaNodesB.getLength(); + + if (mediaNodesALen != mediaNodesBLen) { + matchedPart = null; + break; + } + + for (int j = 0; j < mediaNodesALen; j++) { + SMILMediaElement smeA = (SMILMediaElement)mediaNodesA.item(j); + + PduPart pA = findPart(pb, smeA.getSrc()); + + SMILMediaElement smeB = (SMILMediaElement)mediaNodesB.item(j); + + PduPart pB = findPart(pb, smeB.getSrc()); + + if (pA != pB) { + matchedPart = null; + break; + } + + if (matchedPart == null) break; + } + } + + if (matchedPart != null) { + body.removeChild(matchedPart); + slideNodesLen--; + } + } + + return in; + } + + public static PduPart findPart(PduBody pb, String src) { + PduPart part = null; + + if (src != null) { + src = unescapeXML(src); + if (src.startsWith("cid:")) { + part = pb.getPartByContentId("<" + src.substring("cid:".length()) + ">"); + } else { + part = pb.getPartByName(src); + if (part == null) { + part = pb.getPartByFileName(src); + if (part == null) { + part = pb.getPartByContentLocation(src); + //Some carriers send this in as a ContentId, but fail to append the "cid:" prefix. + if (part == null) { + part = pb.getPartByContentId("<" + src + ">"); + } + } + } + } + } + + return part; + } + + private static String unescapeXML(String str) { + return str.replaceAll("<","<") + .replaceAll(">", ">") + .replaceAll(""","\"") + .replaceAll("'","'") + .replaceAll("&", "&"); + } + /** * Parse SMIL message and retrieve SMILDocument. * * @return A SMILDocument or null if parsing failed. */ - private static SMILDocument getSmilDocument(PduPart smilPart) { + private static SMILDocument getSmilDocument(PduPart smilPart, PduBody pb) { try { byte[] data = smilPart.getData(); if (data != null) { @@ -131,6 +218,7 @@ public class SmilHelper { ByteArrayInputStream bais = new ByteArrayInputStream(data); SMILDocument document = new SmilXmlParser().parse(bais); + document = fixup(document, pb); return validate(document); } } catch (IOException e) { |