summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorBryan Aldrich <bryan.a.aldrich@gmail.com>2013-07-06 01:40:29 -0400
committerGerrit Code Review <gerrit@cyanogenmod.org>2013-07-23 17:37:47 +0000
commit2757db88a16af8197243025a9393367a6ebba3e1 (patch)
treec43054e45e6a785a7875ff511f3b7d7039c9a6c2
parentb9b83171ac9d8e7a66a2908524dd507704304da0 (diff)
downloadpackages_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.java35
-rwxr-xr-x[-rw-r--r--]src/com/android/mms/model/SmilHelper.java92
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("&lt;","<")
- .replaceAll("&gt;", ">")
- .replaceAll("&quot;","\"")
- .replaceAll("&apos;","'")
- .replaceAll("&amp;", "&");
- }
-
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("&lt;","<")
+ .replaceAll("&gt;", ">")
+ .replaceAll("&quot;","\"")
+ .replaceAll("&apos;","'")
+ .replaceAll("&amp;", "&");
+ }
+
/**
* 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) {