diff --git a/src/com/fsck/k9/mail/BodyPart.java b/src/com/fsck/k9/mail/BodyPart.java index b0c1b3e81..18e680a77 100644 --- a/src/com/fsck/k9/mail/BodyPart.java +++ b/src/com/fsck/k9/mail/BodyPart.java @@ -3,10 +3,15 @@ package com.fsck.k9.mail; public abstract class BodyPart implements Part { - protected Multipart mParent; + private Multipart mParent; public Multipart getParent() { return mParent; } + + public void setParent(Multipart parent) + { + mParent = parent; + } } diff --git a/src/com/fsck/k9/mail/Multipart.java b/src/com/fsck/k9/mail/Multipart.java index 210436847..72e3db7a1 100644 --- a/src/com/fsck/k9/mail/Multipart.java +++ b/src/com/fsck/k9/mail/Multipart.java @@ -17,11 +17,13 @@ public abstract class Multipart implements Body public void addBodyPart(BodyPart part) { mParts.add(part); + part.setParent(this); } public void addBodyPart(BodyPart part, int index) { mParts.add(index, part); + part.setParent(this); } public BodyPart getBodyPart(int index) @@ -41,11 +43,13 @@ public abstract class Multipart implements Body public boolean removeBodyPart(BodyPart part) { + part.setParent(null); return mParts.remove(part); } public void removeBodyPart(int index) { + mParts.get(index).setParent(null); mParts.remove(index); } diff --git a/src/com/fsck/k9/mail/internet/Iso2022JpToShiftJisInputStream.java b/src/com/fsck/k9/mail/internet/Iso2022JpToShiftJisInputStream.java new file mode 100644 index 000000000..f0e630386 --- /dev/null +++ b/src/com/fsck/k9/mail/internet/Iso2022JpToShiftJisInputStream.java @@ -0,0 +1,86 @@ +package com.fsck.k9.mail.internet; + +import java.io.IOException; +import java.io.InputStream; +import java.nio.charset.MalformedInputException; + +class Iso2022JpToShiftJisInputStream extends InputStream { + private enum Charset { + ASCII, JISX0201, JISX0208, + } + + private InputStream mIn; + private Charset charset = Charset.ASCII; + private int out; + private boolean hasOut = false; + + public Iso2022JpToShiftJisInputStream(InputStream in) + { + mIn = in; + } + + @Override + public int read() throws IOException + { + if (hasOut) + { + hasOut = false; + return out; + } + + int in1 = mIn.read(); + if (in1 == 0x1b) + { + in1 = mIn.read(); + if (in1 == '(') + { + in1 = mIn.read(); + if (in1 == 'B' || in1 == 'J') + charset = Charset.ASCII; + else if (in1 == 'I') // Not defined in RFC 1468 but in CP50221. + charset = Charset.JISX0201; + else + throw new MalformedInputException(0); + } + else if (in1 == '$') + { + in1 = mIn.read(); + if (in1 == '@' || in1 == 'B') + charset = Charset.JISX0208; + else + throw new MalformedInputException(0); + } + else + throw new MalformedInputException(0); + in1 = mIn.read(); + } + + if (in1 == '\n' || in1 == '\r') + charset = Charset.ASCII; + + if (in1 < 0x21 || in1 >= 0x7e) + return in1; + + switch (charset) + { + case ASCII: + return in1; + case JISX0201: + return in1 + 0x80; + case JISX0208: + int in2 = mIn.read(); + if (in2 < 0x21 || in2 >= 0x7e) + throw new MalformedInputException(0); + + int out1 = (in1 + 1) / 2 + (in1 < 0x5f ? 0x70 : 0xb0); + int out2 = in2 + (in1 % 2 == 0 ? 0x7e : in2 < 0x60 ? 0x1f : 0x20); + + out = out2; + hasOut = true; + + return out1; + default: + throw new RuntimeException(); + } + } +} diff --git a/src/com/fsck/k9/mail/internet/MimeUtility.java b/src/com/fsck/k9/mail/internet/MimeUtility.java index 905a08df6..4eed3f8e5 100644 --- a/src/com/fsck/k9/mail/internet/MimeUtility.java +++ b/src/com/fsck/k9/mail/internet/MimeUtility.java @@ -1,6 +1,7 @@ package com.fsck.k9.mail.internet; +import android.os.Build.VERSION; import android.util.Log; import com.fsck.k9.K9; import com.fsck.k9.mail.*; @@ -9,7 +10,6 @@ import org.apache.james.mime4j.decoder.Base64InputStream; import org.apache.james.mime4j.decoder.DecoderUtil; import org.apache.james.mime4j.decoder.QuotedPrintableInputStream; -import java.io.ByteArrayOutputStream; import java.io.IOException; import java.io.InputStream; import java.io.OutputStream; @@ -1029,40 +1029,15 @@ public class MimeUtility /* * We've got a text part, so let's see if it needs to be processed further. */ - final String originalCharset = getHeaderParameter(part.getContentType(), "charset"); - String charset = "ASCII"; // No encoding, so use us-ascii, which is the standard. - if ((originalCharset != null) && (!"0".equals(originalCharset))) - { - /* - * See if there is conversion from the MIME charset to the Java one. - */ - - charset = Charset.forName(fixupCharset(originalCharset)).name(); - - if (charset == null) - { - Log.e(K9.LOG_TAG,"I don't know how to deal with the charset "+originalCharset+". Falling back to US-ASCII"); - charset = "US-ASCII"; - } - } + String charset = getHeaderParameter(part.getContentType(), "charset"); + charset = fixupCharset(charset, getMessageFromPart(part)); /* * Now we read the part into a buffer for further processing. Because * the stream is now wrapped we'll remove any transfer encoding at this point. */ InputStream in = part.getBody().getInputStream(); - ByteArrayOutputStream out = new ByteArrayOutputStream(in.available()); - IOUtils.copy(in, out); - in.close(); - in = null; // we want all of our memory back, and close might not release - // Cargo culted from AOSP - This disagrees with the platform docs - - /* - * Convert and return as new String - */ - final String result = out.toString(charset); - out.close(); - return result; + return readToString(in, charset); } } @@ -1265,18 +1240,681 @@ public class MimeUtility return DEFAULT_ATTACHMENT_MIME_TYPE; } - - private static String fixupCharset(String charset) + private static Message getMessageFromPart(Part part) { - charset = charset.toLowerCase(); - if (charset.equals("cp932")) - return "shift-jis"; - else if (charset.equals("koi8-u")) - return "koi8-r"; + while (part != null) + { + if (part instanceof Message) + return (Message)part; - return charset; + if (!(part instanceof BodyPart)) + return null; + Multipart multipart = ((BodyPart)part).getParent(); + if (multipart == null) + return null; + + part = multipart.getParent(); + } + return null; } + private static String fixupCharset(String charset, Message message) throws MessagingException + { + if (charset == null || "0".equals(charset)) + charset = "US-ASCII"; // No encoding, so use us-ascii, which is the standard. + charset = charset.toLowerCase(); + if (charset.equals("cp932")) + charset = "shift_jis"; + else if (charset.equals("koi8-u")) + charset = "koi8-r"; + + if (charset.equals("shift_jis") || charset.equals("iso-2022-jp")) + { + String variant = getJisVariantFromMessage(message); + if (variant != null) + charset = "x-" + variant + "-" + charset + "-2007"; + } + return charset; + } + + private static String getJisVariantFromMessage(Message message) throws MessagingException + { + if (message == null) + return null; + + // If a receiver is known to use a JIS variant, the sender transfers the message after converting the + // charset as a convention. + String variant = getJisVariantFromReceivedHeaders(message); + if (variant != null) + return variant; + + // If a receiver is not known to use any JIS variants, the sender transfers the message without converting + // the charset. + variant = getJisVariantFromFromHeaders(message); + if (variant != null) + return variant; + + return getJisVariantFromMailerHeaders(message); + } + + private static String getJisVariantFromReceivedHeaders(Message message) throws MessagingException + { + String receivedHeaders[] = message.getHeader("Received"); + if (receivedHeaders == null) + return null; + + for (String receivedHeader : receivedHeaders) + { + String address = getAddressFromReceivedHeader(receivedHeader); + if (address == null) + continue; + String variant = getJisVariantFromAddress(address); + if (variant != null) + return variant; + } + return null; + } + + private static String getAddressFromReceivedHeader(String receivedHeader) + { + // Not implemented yet! Extract an address from the FOR clause of the given Received header. + return null; + } + + private static String getJisVariantFromFromHeaders(Message message) throws MessagingException + { + Address addresses[] = message.getFrom(); + if (addresses == null || addresses.length == 0) + return null; + + return getJisVariantFromAddress(addresses[0].getAddress()); + } + + private static String getJisVariantFromAddress(String address) + { + if (isInDomain(address, "docomo.ne.jp") || isInDomain(address, "dwmail.jp") || + isInDomain(address, "pdx.ne.jp") || isInDomain(address, "willcom.com")) + return "docomo"; + else if (isInDomain(address, "softbank.ne.jp") || isInDomain(address, "vodafone.ne.jp") || + isInDomain(address, "disney.ne.jp") || isInDomain(address, "vertuclub.ne.jp")) + return "softbank"; + else if (isInDomain(address, "ezweb.ne.jp") || isInDomain(address, "ido.ne.jp")) + return "kddi"; + return null; + } + + private static boolean isInDomain(String address, String domain) + { + int index = address.length() - domain.length() - 1; + if (index < 0) + return false; + + char c = address.charAt(index); + if (c != '@' && c != '.') + return false; + + return address.endsWith(domain); + } + + private static String getJisVariantFromMailerHeaders(Message message) throws MessagingException + { + String mailerHeaders[] = message.getHeader("X-Mailer"); + if (mailerHeaders == null || mailerHeaders.length == 0) + return null; + + if (mailerHeaders[0].startsWith("iPhone Mail ")) + return "iphone"; + + return null; + } + + private static String readToString(InputStream in, String charset) throws IOException + { + boolean isIphoneString = false; + + // iso-2022-jp variants are supported by no versions as of Dec 2010. + if (charset.length() > 19 && charset.startsWith("x-") && + charset.endsWith("-iso-2022-jp-2007") && !Charset.isSupported(charset)) + { + in = new Iso2022JpToShiftJisInputStream(in); + charset = "x-" + charset.substring(2, charset.length() - 17) + "-shift_jis-2007"; + } + + // shift_jis variants are supported by Eclair and later. + if (charset.length() > 17 && charset.startsWith("x-") && + charset.endsWith("-shift_jis-2007") && !Charset.isSupported(charset)) + { + // If the JIS variant is iPhone, map the Unicode private use area in iPhone to the one in Android after + // converting the character set from the standard Shift JIS to Unicode. + if (charset.substring(2, charset.length() - 15).equals("iphone")) + isIphoneString = true; + + charset = "shift_jis"; + } + + /* + * See if there is conversion from the MIME charset to the Java one. + */ + if (!Charset.isSupported(charset)) + { + Log.e(K9.LOG_TAG, "I don't know how to deal with the charset " + charset + + ". Falling back to US-ASCII"); + charset = "US-ASCII"; + } + + /* + * Convert and return as new String + */ + String str = IOUtils.toString(in, charset); + + if (isIphoneString) + str = importStringFromIphone(str); + return str; + } + + static private String importStringFromIphone(String str) + { + StringBuilder buff = new StringBuilder(str.length()); + for (int i = 0; i < str.length(); i = str.offsetByCodePoints(i, 1)) + { + int codePoint = str.codePointAt(i); + buff.appendCodePoint(importCodePointFromIphone(codePoint)); + } + return buff.toString(); + } + + static private int importCodePointFromIphone(int codePoint) + { + switch (codePoint) + { + case 0xE001: return 0xFE19B; + case 0xE002: return 0xFE19C; + case 0xE003: return 0xFE823; + case 0xE004: return 0xFE19D; + case 0xE005: return 0xFE19E; + case 0xE006: return 0xFE4CF; + case 0xE007: return 0xFE4CD; + case 0xE008: return 0xFE4EF; + case 0xE009: return 0xFE523; + case 0xE00A: return 0xFE525; + case 0xE00B: return 0xFE528; + case 0xE00C: return 0xFE538; + case 0xE00D: return 0xFEB96; + case 0xE00E: return 0xFEB97; + case 0xE00F: return 0xFEB98; + case 0xE010: return 0xFEB93; + case 0xE011: return 0xFEB94; + case 0xE012: return 0xFEB95; + case 0xE013: return 0xFE7D5; + case 0xE014: return 0xFE7D2; + case 0xE015: return 0xFE7D3; + case 0xE016: return 0xFE7D1; + case 0xE017: return 0xFE7DA; + case 0xE018: return 0xFE7D4; + case 0xE019: return 0xFE1BD; + case 0xE01A: return 0xFE1BE; + case 0xE01B: return 0xFE7E4; + case 0xE01C: return 0xFE7EA; + case 0xE01D: return 0xFE7E9; + case 0xE01E: return 0xFE7DF; + case 0xE01F: return 0xFE7E3; + case 0xE020: return 0xFEB09; + case 0xE021: return 0xFEB04; + case 0xE022: return 0xFEB0C; + case 0xE023: return 0xFEB0E; + case 0xE024: return 0xFE01E; + case 0xE025: return 0xFE01F; + case 0xE026: return 0xFE020; + case 0xE027: return 0xFE021; + case 0xE028: return 0xFE022; + case 0xE029: return 0xFE023; + case 0xE02A: return 0xFE024; + case 0xE02B: return 0xFE025; + case 0xE02C: return 0xFE026; + case 0xE02D: return 0xFE027; + case 0xE02E: return 0xFE028; + case 0xE02F: return 0xFE029; + case 0xE030: return 0xFE040; + case 0xE031: return 0xFE4D2; + case 0xE032: return 0xFE041; + case 0xE033: return 0xFE512; + case 0xE034: return 0xFE825; + case 0xE035: return 0xFE826; + case 0xE036: return 0xFE4B0; + case 0xE037: return 0xFE4BB; + case 0xE038: return 0xFE4B2; + case 0xE039: return 0xFE7EC; + case 0xE03A: return 0xFE7F5; + case 0xE03B: return 0xFE4C3; + case 0xE03C: return 0xFE800; + case 0xE03D: return 0xFE801; + case 0xE03E: return 0xFE813; + case 0xE03F: return 0xFEB82; + case 0xE040: return 0xFE815; + case 0xE041: return 0xFE816; + case 0xE042: return 0xFE818; + case 0xE043: return 0xFE980; + case 0xE044: return 0xFE982; + case 0xE045: return 0xFE981; + case 0xE046: return 0xFE962; + case 0xE047: return 0xFE983; + case 0xE048: return 0xFE003; + case 0xE049: return 0xFE001; + case 0xE04A: return 0xFE000; + case 0xE04B: return 0xFE002; + case 0xE04C: return 0xFE014; + case 0xE04D: return 0xFE009; + case 0xE04E: return 0xFE1AF; + case 0xE04F: return 0xFE1B8; + case 0xE050: return 0xFE1C0; + case 0xE051: return 0xFE1C1; + case 0xE052: return 0xFE1B7; + case 0xE053: return 0xFE1C2; + case 0xE054: return 0xFE1C3; + case 0xE055: return 0xFE1BC; + case 0xE056: return 0xFE335; + case 0xE057: return 0xFE330; + case 0xE058: return 0xFE323; + case 0xE059: return 0xFE320; + case 0xE05A: return 0xFE4F4; + case 0xE101: return 0xFE52D; + case 0xE102: return 0xFE52E; + case 0xE103: return 0xFE52B; + case 0xE104: return 0xFE526; + case 0xE105: return 0xFE329; + case 0xE106: return 0xFE327; + case 0xE107: return 0xFE341; + case 0xE108: return 0xFE344; + case 0xE109: return 0xFE1C4; + case 0xE10A: return 0xFE1C5; + case 0xE10B: return 0xFE1BF; + case 0xE10C: return 0xFE1B0; + case 0xE10D: return 0xFE7ED; + case 0xE10E: return 0xFE4D1; + case 0xE10F: return 0xFEB56; + case 0xE110: return 0xFE03C; + case 0xE111: return 0xFE827; + case 0xE112: return 0xFE510; + case 0xE113: return 0xFE4F5; + case 0xE114: return 0xFEB85; + case 0xE115: return 0xFE7D9; + case 0xE116: return 0xFE4CA; + case 0xE117: return 0xFE515; + case 0xE118: return 0xFE03F; + case 0xE119: return 0xFE042; + case 0xE11A: return 0xFE1B2; + case 0xE11B: return 0xFE1AE; + case 0xE11C: return 0xFE1B3; + case 0xE11D: return 0xFE4F6; + case 0xE11E: return 0xFE53B; + case 0xE11F: return 0xFE537; + case 0xE120: return 0xFE960; + case 0xE121: return 0xFE4BC; + case 0xE122: return 0xFE7FB; + case 0xE123: return 0xFE7FA; + case 0xE124: return 0xFE7FD; + case 0xE125: return 0xFE807; + case 0xE126: return 0xFE81D; + case 0xE127: return 0xFE81E; + case 0xE128: return 0xFE81F; + case 0xE129: return 0xFE820; + case 0xE12A: return 0xFE81C; + case 0xE12B: return 0xFE1B1; + case 0xE12C: return 0xFE81B; + case 0xE12D: return 0xFE80B; + case 0xE12E: return 0xFEB32; + case 0xE12F: return 0xFE4DD; + case 0xE130: return 0xFE80C; + case 0xE131: return 0xFE7DB; + case 0xE132: return 0xFE7D7; + case 0xE133: return 0xFE80D; + case 0xE134: return 0xFE7DC; + case 0xE135: return 0xFE7EE; + case 0xE136: return 0xFE7EB; + case 0xE137: return 0xFE7F8; + case 0xE138: return 0xFEB33; + case 0xE139: return 0xFEB34; + case 0xE13A: return 0xFEB35; + case 0xE13B: return 0xFE509; + case 0xE13C: return 0xFEB59; + case 0xE13D: return 0xFE004; + case 0xE13E: return 0xFE4D6; + case 0xE13F: return 0xFE505; + case 0xE140: return 0xFE507; + case 0xE141: return 0xFE821; + case 0xE142: return 0xFE52F; + case 0xE143: return 0xFE514; + case 0xE144: return 0xFEB86; + case 0xE145: return 0xFEB87; + case 0xE146: return 0xFE00B; + case 0xE147: return 0xFE965; + case 0xE148: return 0xFE546; + case 0xE149: return 0xFE4DE; + case 0xE14A: return 0xFE4DF; + case 0xE14B: return 0xFE531; + case 0xE14C: return 0xFEB5E; + case 0xE14D: return 0xFE4B5; + case 0xE14E: return 0xFE7F7; + case 0xE14F: return 0xFE7F6; + case 0xE150: return 0xFE7E7; + case 0xE151: return 0xFE506; + case 0xE152: return 0xFE1A1; + case 0xE153: return 0xFE4B3; + case 0xE154: return 0xFE4B6; + case 0xE155: return 0xFE4B4; + case 0xE156: return 0xFE4B9; + case 0xE157: return 0xFE4BA; + case 0xE158: return 0xFE4B7; + case 0xE159: return 0xFE7E6; + case 0xE15A: return 0xFE7EF; + case 0xE201: return 0xFE7F0; + case 0xE202: return 0xFE7E8; + case 0xE203: return 0xFEB24; + case 0xE204: return 0xFEB19; + case 0xE205: return 0xFEB61; + case 0xE206: return 0xFEB62; + case 0xE207: return 0xFEB25; + case 0xE208: return 0xFEB1F; + case 0xE209: return 0xFE044; + case 0xE20A: return 0xFEB20; + case 0xE20B: return 0xFE838; + case 0xE20C: return 0xFEB1A; + case 0xE20D: return 0xFEB1C; + case 0xE20E: return 0xFEB1B; + case 0xE20F: return 0xFEB1D; + case 0xE210: return 0xFE82C; + case 0xE211: return 0xFE82B; + case 0xE212: return 0xFEB36; + case 0xE213: return 0xFEB37; + case 0xE214: return 0xFEB38; + case 0xE215: return 0xFEB39; + case 0xE216: return 0xFEB3A; + case 0xE217: return 0xFEB3B; + case 0xE218: return 0xFEB3C; + case 0xE219: return 0xFEB63; + case 0xE21A: return 0xFEB64; + case 0xE21B: return 0xFEB67; + case 0xE21C: return 0xFE82E; + case 0xE21D: return 0xFE82F; + case 0xE21E: return 0xFE830; + case 0xE21F: return 0xFE831; + case 0xE220: return 0xFE832; + case 0xE221: return 0xFE833; + case 0xE222: return 0xFE834; + case 0xE223: return 0xFE835; + case 0xE224: return 0xFE836; + case 0xE225: return 0xFE837; + case 0xE226: return 0xFEB3D; + case 0xE227: return 0xFEB3E; + case 0xE228: return 0xFEB3F; + case 0xE229: return 0xFEB81; + case 0xE22A: return 0xFEB31; + case 0xE22B: return 0xFEB2F; + case 0xE22C: return 0xFEB40; + case 0xE22D: return 0xFEB41; + case 0xE22E: return 0xFEB99; + case 0xE22F: return 0xFEB9A; + case 0xE230: return 0xFEB9B; + case 0xE231: return 0xFEB9C; + case 0xE232: return 0xFEAF8; + case 0xE233: return 0xFEAF9; + case 0xE234: return 0xFEAFA; + case 0xE235: return 0xFEAFB; + case 0xE236: return 0xFEAF0; + case 0xE237: return 0xFEAF2; + case 0xE238: return 0xFEAF1; + case 0xE239: return 0xFEAF3; + case 0xE23A: return 0xFEAFC; + case 0xE23B: return 0xFEAFD; + case 0xE23C: return 0xFEAFE; + case 0xE23D: return 0xFEAFF; + case 0xE23E: return 0xFE4F8; + case 0xE23F: return 0xFE02B; + case 0xE240: return 0xFE02C; + case 0xE241: return 0xFE02D; + case 0xE242: return 0xFE02E; + case 0xE243: return 0xFE02F; + case 0xE244: return 0xFE030; + case 0xE245: return 0xFE031; + case 0xE246: return 0xFE032; + case 0xE247: return 0xFE033; + case 0xE248: return 0xFE034; + case 0xE249: return 0xFE035; + case 0xE24A: return 0xFE036; + case 0xE24B: return 0xFE037; + case 0xE24C: return 0xFEB42; + case 0xE24D: return 0xFEB27; + case 0xE24E: return 0xFEB29; + case 0xE24F: return 0xFEB2D; + case 0xE250: return 0xFE839; + case 0xE251: return 0xFE83A; + case 0xE252: return 0xFEB23; + case 0xE253: return 0xFE1B4; + case 0xE254: return 0xFEE77; + case 0xE255: return 0xFEE78; + case 0xE256: return 0xFEE79; + case 0xE257: return 0xFEE7A; + case 0xE258: return 0xFEE7B; + case 0xE259: return 0xFEE7C; + case 0xE25A: return 0xFEE7D; + case 0xE301: return 0xFE527; + case 0xE302: return 0xFE4D3; + case 0xE303: return 0xFE045; + case 0xE304: return 0xFE03D; + case 0xE305: return 0xFE046; + case 0xE306: return 0xFE828; + case 0xE307: return 0xFE047; + case 0xE308: return 0xFE048; + case 0xE309: return 0xFE508; + case 0xE30A: return 0xFE803; + case 0xE30B: return 0xFE985; + case 0xE30C: return 0xFE987; + case 0xE30D: return 0xFEB43; + case 0xE30E: return 0xFEB1E; + case 0xE30F: return 0xFE50A; + case 0xE310: return 0xFE516; + case 0xE311: return 0xFEB58; + case 0xE312: return 0xFE517; + case 0xE313: return 0xFE53E; + case 0xE314: return 0xFE50F; + case 0xE315: return 0xFEB2B; + case 0xE316: return 0xFE53C; + case 0xE317: return 0xFE530; + case 0xE318: return 0xFE4D4; + case 0xE319: return 0xFE4D5; + case 0xE31A: return 0xFE4D7; + case 0xE31B: return 0xFE4D8; + case 0xE31C: return 0xFE195; + case 0xE31D: return 0xFE196; + case 0xE31E: return 0xFE197; + case 0xE31F: return 0xFE198; + case 0xE320: return 0xFE199; + case 0xE321: return 0xFE4D9; + case 0xE322: return 0xFE4DA; + case 0xE323: return 0xFE4F0; + case 0xE324: return 0xFE808; + case 0xE325: return 0xFE4F2; + case 0xE326: return 0xFE814; + case 0xE327: return 0xFEB0D; + case 0xE328: return 0xFEB11; + case 0xE329: return 0xFEB12; + case 0xE32A: return 0xFEB13; + case 0xE32B: return 0xFEB14; + case 0xE32C: return 0xFEB15; + case 0xE32D: return 0xFEB16; + case 0xE32E: return 0xFEB60; + case 0xE32F: return 0xFEB68; + case 0xE330: return 0xFEB5D; + case 0xE331: return 0xFEB5B; + case 0xE332: return 0xFEB44; + case 0xE333: return 0xFEB45; + case 0xE334: return 0xFEB57; + case 0xE335: return 0xFEB69; + case 0xE336: return 0xFEB0A; + case 0xE337: return 0xFEB0B; + case 0xE338: return 0xFE984; + case 0xE339: return 0xFE964; + case 0xE33A: return 0xFE966; + case 0xE33B: return 0xFE967; + case 0xE33C: return 0xFE968; + case 0xE33D: return 0xFE969; + case 0xE33E: return 0xFE96A; + case 0xE33F: return 0xFE96B; + case 0xE340: return 0xFE963; + case 0xE341: return 0xFE96C; + case 0xE342: return 0xFE961; + case 0xE343: return 0xFE96D; + case 0xE344: return 0xFE96E; + case 0xE345: return 0xFE051; + case 0xE346: return 0xFE052; + case 0xE347: return 0xFE053; + case 0xE348: return 0xFE054; + case 0xE349: return 0xFE055; + case 0xE34A: return 0xFE056; + case 0xE34B: return 0xFE511; + case 0xE34C: return 0xFE96F; + case 0xE34D: return 0xFE970; + case 0xE401: return 0xFE345; + case 0xE402: return 0xFE343; + case 0xE403: return 0xFE340; + case 0xE404: return 0xFE333; + case 0xE405: return 0xFE347; + case 0xE406: return 0xFE33C; + case 0xE407: return 0xFE33F; + case 0xE408: return 0xFE342; + case 0xE409: return 0xFE32A; + case 0xE40A: return 0xFE33E; + case 0xE40B: return 0xFE33B; + case 0xE40C: return 0xFE32E; + case 0xE40D: return 0xFE32F; + case 0xE40E: return 0xFE326; + case 0xE40F: return 0xFE325; + case 0xE410: return 0xFE322; + case 0xE411: return 0xFE33A; + case 0xE412: return 0xFE334; + case 0xE413: return 0xFE339; + case 0xE414: return 0xFE336; + case 0xE415: return 0xFE338; + case 0xE416: return 0xFE33D; + case 0xE417: return 0xFE32D; + case 0xE418: return 0xFE32C; + case 0xE419: return 0xFE190; + case 0xE41A: return 0xFE192; + case 0xE41B: return 0xFE191; + case 0xE41C: return 0xFE193; + case 0xE41D: return 0xFE35B; + case 0xE41E: return 0xFEB9D; + case 0xE41F: return 0xFEB9E; + case 0xE420: return 0xFEB9F; + case 0xE421: return 0xFEBA0; + case 0xE422: return 0xFEBA1; + case 0xE423: return 0xFE351; + case 0xE424: return 0xFE352; + case 0xE425: return 0xFE829; + case 0xE426: return 0xFE353; + case 0xE427: return 0xFE358; + case 0xE428: return 0xFE1A0; + case 0xE429: return 0xFE1A2; + case 0xE42A: return 0xFE7D6; + case 0xE42B: return 0xFE7DD; + case 0xE42C: return 0xFE80E; + case 0xE42D: return 0xFE7DE; + case 0xE42E: return 0xFE7E5; + case 0xE42F: return 0xFE7F1; + case 0xE430: return 0xFE7F2; + case 0xE431: return 0xFE7F3; + case 0xE432: return 0xFE7F4; + case 0xE433: return 0xFE7FE; + case 0xE434: return 0xFE7E0; + case 0xE435: return 0xFE7E2; + case 0xE436: return 0xFE518; + case 0xE437: return 0xFEB17; + case 0xE438: return 0xFE519; + case 0xE439: return 0xFE51A; + case 0xE43A: return 0xFE51B; + case 0xE43B: return 0xFE51C; + case 0xE43C: return 0xFE007; + case 0xE43D: return 0xFE82A; + case 0xE43E: return 0xFE038; + case 0xE43F: return 0xFE971; + case 0xE440: return 0xFE51D; + case 0xE441: return 0xFE1C6; + case 0xE442: return 0xFE51E; + case 0xE443: return 0xFE005; + case 0xE444: return 0xFE049; + case 0xE445: return 0xFE51F; + case 0xE446: return 0xFE017; + case 0xE447: return 0xFE043; + case 0xE448: return 0xFE513; + case 0xE449: return 0xFE00A; + case 0xE44A: return 0xFE00C; + case 0xE44B: return 0xFE008; + case 0xE44C: return 0xFE00D; + case 0xE501: return 0xFE4B8; + case 0xE502: return 0xFE804; + case 0xE503: return 0xFE805; + case 0xE504: return 0xFE4BD; + case 0xE505: return 0xFE4BE; + case 0xE506: return 0xFE4BF; + case 0xE507: return 0xFE802; + case 0xE508: return 0xFE4C0; + case 0xE509: return 0xFE4C4; + case 0xE50A: return 0xFE4C5; + case 0xE50B: return 0xFE4E5; + case 0xE50C: return 0xFE4E6; + case 0xE50D: return 0xFE4E7; + case 0xE50E: return 0xFE4E8; + case 0xE50F: return 0xFE4E9; + case 0xE510: return 0xFE4EA; + case 0xE511: return 0xFE4EB; + case 0xE512: return 0xFE4EC; + case 0xE513: return 0xFE4ED; + case 0xE514: return 0xFE4EE; + case 0xE515: return 0xFE1A4; + case 0xE516: return 0xFE1A5; + case 0xE517: return 0xFE1A6; + case 0xE518: return 0xFE1A7; + case 0xE519: return 0xFE1A8; + case 0xE51A: return 0xFE1A9; + case 0xE51B: return 0xFE1AA; + case 0xE51C: return 0xFE1AB; + case 0xE51D: return 0xFE4C6; + case 0xE51E: return 0xFE1B5; + case 0xE51F: return 0xFE1B6; + case 0xE520: return 0xFE1C7; + case 0xE521: return 0xFE1C8; + case 0xE522: return 0xFE1C9; + case 0xE523: return 0xFE1BA; + case 0xE524: return 0xFE1CA; + case 0xE525: return 0xFE1CB; + case 0xE526: return 0xFE1CC; + case 0xE527: return 0xFE1CD; + case 0xE528: return 0xFE1CE; + case 0xE529: return 0xFE1CF; + case 0xE52A: return 0xFE1D0; + case 0xE52B: return 0xFE1D1; + case 0xE52C: return 0xFE1D2; + case 0xE52D: return 0xFE1D3; + case 0xE52E: return 0xFE1D4; + case 0xE52F: return 0xFE1D5; + case 0xE530: return 0xFE1D6; + case 0xE531: return 0xFE1D7; + case 0xE532: return 0xFE50B; + case 0xE533: return 0xFE50C; + case 0xE534: return 0xFE50D; + case 0xE535: return 0xFE50E; + case 0xE536: return 0xFE553; + case 0xE537: return 0xFEB2A; + case 0xE538: return 0xFEE70; + case 0xE539: return 0xFEE71; + case 0xE53A: return 0xFEE72; + case 0xE53B: return 0xFEE73; + case 0xE53C: return 0xFEE74; + case 0xE53D: return 0xFEE75; + case 0xE53E: return 0xFEE76; + default: return codePoint; + } + } } diff --git a/src/com/fsck/k9/mail/store/LocalStore.java b/src/com/fsck/k9/mail/store/LocalStore.java index 3a51a6cfb..e1127d588 100644 --- a/src/com/fsck/k9/mail/store/LocalStore.java +++ b/src/com/fsck/k9/mail/store/LocalStore.java @@ -3142,7 +3142,7 @@ public class LocalStore extends Store implements Serializable html = htmlifyString(text); } - html = convertEmoji2ImgForDocomo(html); + html = convertEmoji2Img(html); return html; } @@ -3257,2041 +3257,442 @@ public class LocalStore extends Store implements Serializable } } - public String convertEmoji2ImgForDocomo(String html) + public String convertEmoji2Img(String html) { - StringReader reader = new StringReader(html); StringBuilder buff = new StringBuilder(html.length() + 512); - int c; - try - { - while ((c = reader.read()) != -1) - { - switch (c) - { - // These emoji codepoints are generated by tools/make_emoji in the K-9 source tree + for (int i = 0; i < html.length(); i = html.offsetByCodePoints(i, 1)) + { + int codePoint = html.codePointAt(i); + String emoji = getEmojiForCodePoint(codePoint); + if (emoji != null) + buff.append("\"""); + else + buff.appendCodePoint(codePoint); - case 0xE6F9: //docomo kissmark - buff.append("\"kissmark\""); - break; - case 0xE729: //docomo wink - buff.append("\"wink\""); - break; - case 0xE6D2: //docomo info02 - buff.append("\"info02\""); - break; - case 0xE753: //docomo smile - buff.append("\"smile\""); - break; - case 0xE68D: //docomo heart - buff.append("\"heart\""); - break; - case 0xE6A5: //docomo downwardleft - buff.append("\"downwardleft\""); - break; - case 0xE6AD: //docomo pouch - buff.append("\"pouch\""); - break; - case 0xE6D4: //docomo by-d - buff.append("\"by-d\""); - break; - case 0xE6D7: //docomo free - buff.append("\"free\""); - break; - case 0xE6E8: //docomo seven - buff.append("\"seven\""); - break; - case 0xE74E: //docomo snail - buff.append("\"snail\""); - break; - case 0xE658: //docomo basketball - buff.append("\"basketball\""); - break; - case 0xE65A: //docomo pocketbell - buff.append("\"pocketbell\""); - break; - case 0xE6E3: //docomo two - buff.append("\"two\""); - break; - case 0xE74A: //docomo cake - buff.append("\"cake\""); - break; - case 0xE6D0: //docomo faxto - buff.append("\"faxto\""); - break; - case 0xE661: //docomo ship - buff.append("\"ship\""); - break; - case 0xE64B: //docomo virgo - buff.append("\"virgo\""); - break; - case 0xE67E: //docomo ticket - buff.append("\"ticket\""); - break; - case 0xE6D6: //docomo yen - buff.append("\"yen\""); - break; - case 0xE6E0: //docomo sharp - buff.append("\"sharp\""); - break; - case 0xE6FE: //docomo bomb - buff.append("\"bomb\""); - break; - case 0xE6E1: //docomo mobaq - buff.append("\"mobaq\""); - break; - case 0xE70A: //docomo sign05 - buff.append("\"sign05\""); - break; - case 0xE667: //docomo bank - buff.append("\"bank\""); - break; - case 0xE731: //docomo copyright - buff.append("\"copyright\""); - break; - case 0xE678: //docomo upwardright - buff.append("\"upwardright\""); - break; - case 0xE694: //docomo scissors - buff.append("\"scissors\""); - break; - case 0xE682: //docomo bag - buff.append("\"bag\""); - break; - case 0xE64D: //docomo scorpius - buff.append("\"scorpius\""); - break; - case 0xE6D9: //docomo key - buff.append("\"key\""); - break; - case 0xE734: //docomo secret - buff.append("\"secret\""); - break; - case 0xE74F: //docomo chick - buff.append("\"chick\""); - break; - case 0xE691: //docomo eye - buff.append("\"eye\""); - break; - case 0xE70B: //docomo ok - buff.append("\"ok\""); - break; - case 0xE714: //docomo door - buff.append("\"door\""); - break; - case 0xE64F: //docomo capricornus - buff.append("\"capricornus\""); - break; - case 0xE674: //docomo boutique - buff.append("\"boutique\""); - break; - case 0xE726: //docomo lovely - buff.append("\"lovely\""); - break; - case 0xE68F: //docomo diamond - buff.append("\"diamond\""); - break; - case 0xE69B: //docomo wheelchair - buff.append("\"wheelchair\""); - break; - case 0xE747: //docomo maple - buff.append("\"maple\""); - break; - case 0xE64C: //docomo libra - buff.append("\"libra\""); - break; - case 0xE647: //docomo taurus - buff.append("\"taurus\""); - break; - case 0xE645: //docomo sprinkle - buff.append("\"sprinkle\""); - break; - case 0xE6FC: //docomo annoy - buff.append("\"annoy\""); - break; - case 0xE6E6: //docomo five - buff.append("\"five\""); - break; - case 0xE676: //docomo karaoke - buff.append("\"karaoke\""); - break; - case 0xE69D: //docomo moon1 - buff.append("\"moon1\""); - break; - case 0xE709: //docomo sign04 - buff.append("\"sign04\""); - break; - case 0xE72A: //docomo happy02 - buff.append("\"happy02\""); - break; - case 0xE669: //docomo hotel - buff.append("\"hotel\""); - break; - case 0xE71B: //docomo ring - buff.append("\"ring\""); - break; - case 0xE644: //docomo mist - buff.append("\"mist\""); - break; - case 0xE73B: //docomo full - buff.append("\"full\""); - break; - case 0xE683: //docomo book - buff.append("\"book\""); - break; - case 0xE707: //docomo sweat02 - buff.append("\"sweat02\""); - break; - case 0xE716: //docomo pc - buff.append("\"pc\""); - break; - case 0xE671: //docomo bar - buff.append("\"bar\""); - break; - case 0xE72B: //docomo bearing - buff.append("\"bearing\""); - break; - case 0xE65C: //docomo subway - buff.append("\"subway\""); - break; - case 0xE725: //docomo gawk - buff.append("\"gawk\""); - break; - case 0xE745: //docomo apple - buff.append("\"apple\""); - break; - case 0xE65F: //docomo rvcar - buff.append("\"rvcar\""); - break; - case 0xE664: //docomo building - buff.append("\"building\""); - break; - case 0xE737: //docomo danger - buff.append("\"danger\""); - break; - case 0xE702: //docomo sign01 - buff.append("\"sign01\""); - break; - case 0xE6EC: //docomo heart01 - buff.append("\"heart01\""); - break; - case 0xE660: //docomo bus - buff.append("\"bus\""); - break; - case 0xE72D: //docomo crying - buff.append("\"crying\""); - break; - case 0xE652: //docomo sports - buff.append("\"sports\""); - break; - case 0xE6B8: //docomo on - buff.append("\"on\""); - break; - case 0xE73C: //docomo leftright - buff.append("\"leftright\""); - break; - case 0xE6BA: //docomo clock - buff.append("\"clock\""); - break; - case 0xE6F0: //docomo happy01 - buff.append("\"happy01\""); - break; - case 0xE701: //docomo sleepy - buff.append("\"sleepy\""); - break; - case 0xE63E: //docomo sun - buff.append("\"sun\""); - break; - case 0xE67D: //docomo event - buff.append("\"event\""); - break; - case 0xE689: //docomo memo - buff.append("\"memo\""); - break; - case 0xE68B: //docomo game - buff.append("\"game\""); - break; - case 0xE718: //docomo wrench - buff.append("\"wrench\""); - break; - case 0xE741: //docomo clover - buff.append("\"clover\""); - break; - case 0xE693: //docomo rock - buff.append("\"rock\""); - break; - case 0xE6F6: //docomo note - buff.append("\"note\""); - break; - case 0xE67A: //docomo music - buff.append("\"music\""); - break; - case 0xE743: //docomo tulip - buff.append("\"tulip\""); - break; - case 0xE656: //docomo soccer - buff.append("\"soccer\""); - break; - case 0xE69C: //docomo newmoon - buff.append("\"newmoon\""); - break; - case 0xE73E: //docomo school - buff.append("\"school\""); - break; - case 0xE750: //docomo penguin - buff.append("\"penguin\""); - break; - case 0xE696: //docomo downwardright - buff.append("\"downwardright\""); - break; - case 0xE6CE: //docomo phoneto - buff.append("\"phoneto\""); - break; - case 0xE728: //docomo bleah - buff.append("\"bleah\""); - break; - case 0xE662: //docomo airplane - buff.append("\"airplane\""); - break; - case 0xE74C: //docomo noodle - buff.append("\"noodle\""); - break; - case 0xE704: //docomo sign03 - buff.append("\"sign03\""); - break; - case 0xE68E: //docomo spade - buff.append("\"spade\""); - break; - case 0xE698: //docomo foot - buff.append("\"foot\""); - break; - case 0xE712: //docomo snowboard - buff.append("\"snowboard\""); - break; - case 0xE684: //docomo ribbon - buff.append("\"ribbon\""); - break; - case 0xE6DA: //docomo enter - buff.append("\"enter\""); - break; - case 0xE6EA: //docomo nine - buff.append("\"nine\""); - break; - case 0xE722: //docomo coldsweats01 - buff.append("\"coldsweats01\""); - break; - case 0xE6F7: //docomo spa - buff.append("\"spa\""); - break; - case 0xE710: //docomo rouge - buff.append("\"rouge\""); - break; - case 0xE73F: //docomo wave - buff.append("\"wave\""); - break; - case 0xE686: //docomo birthday - buff.append("\"birthday\""); - break; - case 0xE721: //docomo confident - buff.append("\"confident\""); - break; - case 0xE6FF: //docomo notes - buff.append("\"notes\""); - break; - case 0xE724: //docomo pout - buff.append("\"pout\""); - break; - case 0xE6A4: //docomo xmas - buff.append("\"xmas\""); - break; - case 0xE6FB: //docomo flair - buff.append("\"flair\""); - break; - case 0xE71D: //docomo bicycle - buff.append("\"bicycle\""); - break; - case 0xE6DC: //docomo search - buff.append("\"search\""); - break; - case 0xE757: //docomo shock - buff.append("\"shock\""); - break; - case 0xE680: //docomo nosmoking - buff.append("\"nosmoking\""); - break; - case 0xE66D: //docomo signaler - buff.append("\"signaler\""); - break; - case 0xE66A: //docomo 24hours - buff.append("\"24hours\""); - break; - case 0xE6F4: //docomo wobbly - buff.append("\"wobbly\""); - break; - case 0xE641: //docomo snow - buff.append("\"snow\""); - break; - case 0xE6AE: //docomo pen - buff.append("\"pen\""); - break; - case 0xE70D: //docomo appli02 - buff.append("\"appli02\""); - break; - case 0xE732: //docomo tm - buff.append("\"tm\""); - break; - case 0xE755: //docomo pig - buff.append("\"pig\""); - break; - case 0xE648: //docomo gemini - buff.append("\"gemini\""); - break; - case 0xE6DE: //docomo flag - buff.append("\"flag\""); - break; - case 0xE6A1: //docomo dog - buff.append("\"dog\""); - break; - case 0xE6EF: //docomo heart04 - buff.append("\"heart04\""); - break; - case 0xE643: //docomo typhoon - buff.append("\"typhoon\""); - break; - case 0xE65B: //docomo train - buff.append("\"train\""); - break; - case 0xE746: //docomo bud - buff.append("\"bud\""); - break; - case 0xE653: //docomo baseball - buff.append("\"baseball\""); - break; - case 0xE6B2: //docomo chair - buff.append("\"chair\""); - break; - case 0xE64A: //docomo leo - buff.append("\"leo\""); - break; - case 0xE6E7: //docomo six - buff.append("\"six\""); - break; - case 0xE6E4: //docomo three - buff.append("\"three\""); - break; - case 0xE6DF: //docomo freedial - buff.append("\"freedial\""); - break; - case 0xE744: //docomo banana - buff.append("\"banana\""); - break; - case 0xE6DB: //docomo clear - buff.append("\"clear\""); - break; - case 0xE6AC: //docomo slate - buff.append("\"slate\""); - break; - case 0xE666: //docomo hospital - buff.append("\"hospital\""); - break; - case 0xE663: //docomo house - buff.append("\"house\""); - break; - case 0xE695: //docomo paper - buff.append("\"paper\""); - break; - case 0xE67F: //docomo smoking - buff.append("\"smoking\""); - break; - case 0xE65D: //docomo bullettrain - buff.append("\"bullettrain\""); - break; - case 0xE6B1: //docomo shadow - buff.append("\"shadow\""); - break; - case 0xE670: //docomo cafe - buff.append("\"cafe\""); - break; - case 0xE654: //docomo golf - buff.append("\"golf\""); - break; - case 0xE708: //docomo dash - buff.append("\"dash\""); - break; - case 0xE748: //docomo cherryblossom - buff.append("\"cherryblossom\""); - break; - case 0xE6F1: //docomo angry - buff.append("\"angry\""); - break; - case 0xE736: //docomo r-mark - buff.append("\"r-mark\""); - break; - case 0xE6A2: //docomo cat - buff.append("\"cat\""); - break; - case 0xE6D1: //docomo info01 - buff.append("\"info01\""); - break; - case 0xE687: //docomo telephone - buff.append("\"telephone\""); - break; - case 0xE68C: //docomo cd - buff.append("\"cd\""); - break; - case 0xE70E: //docomo t-shirt - buff.append("\"t-shirt\""); - break; - case 0xE733: //docomo run - buff.append("\"run\""); - break; - case 0xE679: //docomo carouselpony - buff.append("\"carouselpony\""); - break; - case 0xE646: //docomo aries - buff.append("\"aries\""); - break; - case 0xE690: //docomo club - buff.append("\"club\""); - break; - case 0xE64E: //docomo sagittarius - buff.append("\"sagittarius\""); - break; - case 0xE6F5: //docomo up - buff.append("\"up\""); - break; - case 0xE720: //docomo think - buff.append("\"think\""); - break; - case 0xE6E2: //docomo one - buff.append("\"one\""); - break; - case 0xE6D8: //docomo id - buff.append("\"id\""); - break; - case 0xE675: //docomo hairsalon - buff.append("\"hairsalon\""); - break; - case 0xE6B7: //docomo soon - buff.append("\"soon\""); - break; - case 0xE717: //docomo loveletter - buff.append("\"loveletter\""); - break; - case 0xE673: //docomo fastfood - buff.append("\"fastfood\""); - break; - case 0xE719: //docomo pencil - buff.append("\"pencil\""); - break; - case 0xE697: //docomo upwardleft - buff.append("\"upwardleft\""); - break; - case 0xE730: //docomo clip - buff.append("\"clip\""); - break; - case 0xE6ED: //docomo heart02 - buff.append("\"heart02\""); - break; - case 0xE69A: //docomo eyeglass - buff.append("\"eyeglass\""); - break; - case 0xE65E: //docomo car - buff.append("\"car\""); - break; - case 0xE742: //docomo cherry - buff.append("\"cherry\""); - break; - case 0xE71C: //docomo sandclock - buff.append("\"sandclock\""); - break; - case 0xE735: //docomo recycle - buff.append("\"recycle\""); - break; - case 0xE752: //docomo delicious - buff.append("\"delicious\""); - break; - case 0xE69E: //docomo moon2 - buff.append("\"moon2\""); - break; - case 0xE68A: //docomo tv - buff.append("\"tv\""); - break; - case 0xE706: //docomo sweat01 - buff.append("\"sweat01\""); - break; - case 0xE738: //docomo ban - buff.append("\"ban\""); - break; - case 0xE672: //docomo beer - buff.append("\"beer\""); - break; - case 0xE640: //docomo rain - buff.append("\"rain\""); - break; - case 0xE69F: //docomo moon3 - buff.append("\"moon3\""); - break; - case 0xE657: //docomo ski - buff.append("\"ski\""); - break; - case 0xE70C: //docomo appli01 - buff.append("\"appli01\""); - break; - case 0xE6E5: //docomo four - buff.append("\"four\""); - break; - case 0xE699: //docomo shoe - buff.append("\"shoe\""); - break; - case 0xE63F: //docomo cloud - buff.append("\"cloud\""); - break; - case 0xE72F: //docomo ng - buff.append("\"ng\""); - break; - case 0xE6A3: //docomo yacht - buff.append("\"yacht\""); - break; - case 0xE73A: //docomo pass - buff.append("\"pass\""); - break; - case 0xE67C: //docomo drama - buff.append("\"drama\""); - break; - case 0xE727: //docomo good - buff.append("\"good\""); - break; - case 0xE6EB: //docomo zero - buff.append("\"zero\""); - break; - case 0xE72C: //docomo catface - buff.append("\"catface\""); - break; - case 0xE6D5: //docomo d-point - buff.append("\"d-point\""); - break; - case 0xE6F2: //docomo despair - buff.append("\"despair\""); - break; - case 0xE700: //docomo down - buff.append("\"down\""); - break; - case 0xE655: //docomo tennis - buff.append("\"tennis\""); - break; - case 0xE703: //docomo sign02 - buff.append("\"sign02\""); - break; - case 0xE711: //docomo denim - buff.append("\"denim\""); - break; - case 0xE705: //docomo impact - buff.append("\"impact\""); - break; - case 0xE642: //docomo thunder - buff.append("\"thunder\""); - break; - case 0xE66C: //docomo parking - buff.append("\"parking\""); - break; - case 0xE6F3: //docomo sad - buff.append("\"sad\""); - break; - case 0xE71E: //docomo japanesetea - buff.append("\"japanesetea\""); - break; - case 0xE6FD: //docomo punch - buff.append("\"punch\""); - break; - case 0xE73D: //docomo updown - buff.append("\"updown\""); - break; - case 0xE66F: //docomo restaurant - buff.append("\"restaurant\""); - break; - case 0xE66E: //docomo toilet - buff.append("\"toilet\""); - break; - case 0xE739: //docomo empty - buff.append("\"empty\""); - break; - case 0xE723: //docomo coldsweats02 - buff.append("\"coldsweats02\""); - break; - case 0xE6B9: //docomo end - buff.append("\"end\""); - break; - case 0xE67B: //docomo art - buff.append("\"art\""); - break; - case 0xE72E: //docomo weep - buff.append("\"weep\""); - break; - case 0xE715: //docomo dollar - buff.append("\"dollar\""); - break; - case 0xE6CF: //docomo mailto - buff.append("\"mailto\""); - break; - case 0xE6F8: //docomo cute - buff.append("\"cute\""); - break; - case 0xE6DD: //docomo new - buff.append("\"new\""); - break; - case 0xE651: //docomo pisces - buff.append("\"pisces\""); - break; - case 0xE756: //docomo wine - buff.append("\"wine\""); - break; - case 0xE649: //docomo cancer - buff.append("\"cancer\""); - break; - case 0xE650: //docomo aquarius - buff.append("\"aquarius\""); - break; - case 0xE740: //docomo fuji - buff.append("\"fuji\""); - break; - case 0xE681: //docomo camera - buff.append("\"camera\""); - break; - case 0xE71F: //docomo watch - buff.append("\"watch\""); - break; - case 0xE6EE: //docomo heart03 - buff.append("\"heart03\""); - break; - case 0xE71A: //docomo crown - buff.append("\"crown\""); - break; - case 0xE6B3: //docomo night - buff.append("\"night\""); - break; - case 0xE66B: //docomo gasstation - buff.append("\"gasstation\""); - break; - case 0xE692: //docomo ear - buff.append("\"ear\""); - break; - case 0xE685: //docomo present - buff.append("\"present\""); - break; - case 0xE6E9: //docomo eight - buff.append("\"eight\""); - break; - case 0xE70F: //docomo moneybag - buff.append("\"moneybag\""); - break; - case 0xE749: //docomo riceball - buff.append("\"riceball\""); - break; - case 0xE6A0: //docomo fullmoon - buff.append("\"fullmoon\""); - break; - case 0xE74D: //docomo bread - buff.append("\"bread\""); - break; - case 0xE665: //docomo postoffice - buff.append("\"postoffice\""); - break; - case 0xE677: //docomo movie - buff.append("\"movie\""); - break; - case 0xE668: //docomo atm - buff.append("\"atm\""); - break; - case 0xE688: //docomo mobilephone - buff.append("\"mobilephone\""); - break; - case 0xE6FA: //docomo shine - buff.append("\"shine\""); - break; - case 0xE713: //docomo bell - buff.append("\"bell\""); - break; - case 0xE74B: //docomo bottle - buff.append("\"bottle\""); - break; - case 0xE754: //docomo horse - buff.append("\"horse\""); - break; - case 0xE751: //docomo fish - buff.append("\"fish\""); - break; - case 0xE659: //docomo motorsports - buff.append("\"motorsports\""); - break; - case 0xE6D3: //docomo mail - buff.append("\"mail\""); - break; - // These emoji codepoints are generated by tools/make_emoji in the K-9 source tree - // The spaces between the < and the img are a hack to avoid triggering - // K-9's 'load images' button - - case 0xE223: //softbank eight - buff.append("\"eight\""); - break; - case 0xE415: //softbank coldsweats01 - buff.append("\"coldsweats01\""); - break; - case 0xE21F: //softbank four - buff.append("\"four\""); - break; - case 0xE125: //softbank ticket - buff.append("\"ticket\""); - break; - case 0xE148: //softbank book - buff.append("\"book\""); - break; - case 0xE242: //softbank cancer - buff.append("\"cancer\""); - break; - case 0xE31C: //softbank rouge - buff.append("\"rouge\""); - break; - case 0xE252: //softbank danger - buff.append("\"danger\""); - break; - case 0xE011: //softbank scissors - buff.append("\"scissors\""); - break; - case 0xE342: //softbank riceball - buff.append("\"riceball\""); - break; - case 0xE04B: //softbank rain - buff.append("\"rain\""); - break; - case 0xE03E: //softbank note - buff.append("\"note\""); - break; - case 0xE43C: //softbank sprinkle - buff.append("\"sprinkle\""); - break; - case 0xE20A: //softbank wheelchair - buff.append("\"wheelchair\""); - break; - case 0xE42A: //softbank basketball - buff.append("\"basketball\""); - break; - case 0xE03D: //softbank movie - buff.append("\"movie\""); - break; - case 0xE30E: //softbank smoking - buff.append("\"smoking\""); - break; - case 0xE003: //softbank kissmark - buff.append("\"kissmark\""); - break; - case 0xE21C: //softbank one - buff.append("\"one\""); - break; - case 0xE237: //softbank upwardleft - buff.append("\"upwardleft\""); - break; - case 0xE407: //softbank sad - buff.append("\"sad\""); - break; - case 0xE03B: //softbank fuji - buff.append("\"fuji\""); - break; - case 0xE40E: //softbank gawk - buff.append("\"gawk\""); - break; - case 0xE245: //softbank libra - buff.append("\"libra\""); - break; - case 0xE24A: //softbank pisces - buff.append("\"pisces\""); - break; - case 0xE443: //softbank typhoon - buff.append("\"typhoon\""); - break; - case 0xE052: //softbank dog - buff.append("\"dog\""); - break; - case 0xE244: //softbank virgo - buff.append("\"virgo\""); - break; - case 0xE523: //softbank chick - buff.append("\"chick\""); - break; - case 0xE023: //softbank heart03 - buff.append("\"heart03\""); - break; - case 0xE325: //softbank bell - buff.append("\"bell\""); - break; - case 0xE239: //softbank downwardleft - buff.append("\"downwardleft\""); - break; - case 0xE20C: //softbank heart - buff.append("\"heart\""); - break; - case 0xE211: //softbank freedial - buff.append("\"freedial\""); - break; - case 0xE11F: //softbank chair - buff.append("\"chair\""); - break; - case 0xE108: //softbank coldsweats02 - buff.append("\"coldsweats02\""); - break; - case 0xE330: //softbank dash - buff.append("\"dash\""); - break; - case 0xE404: //softbank smile - buff.append("\"smile\""); - break; - case 0xE304: //softbank tulip - buff.append("\"tulip\""); - break; - case 0xE419: //softbank eye - buff.append("\"eye\""); - break; - case 0xE13D: //softbank thunder - buff.append("\"thunder\""); - break; - case 0xE013: //softbank ski - buff.append("\"ski\""); - break; - case 0xE136: //softbank bicycle - buff.append("\"bicycle\""); - break; - case 0xE059: //softbank angry - buff.append("\"angry\""); - break; - case 0xE01D: //softbank airplane - buff.append("\"airplane\""); - break; - case 0xE048: //softbank snow - buff.append("\"snow\""); - break; - case 0xE435: //softbank bullettrain - buff.append("\"bullettrain\""); - break; - case 0xE20E: //softbank spade - buff.append("\"spade\""); - break; - case 0xE247: //softbank sagittarius - buff.append("\"sagittarius\""); - break; - case 0xE157: //softbank school - buff.append("\"school\""); - break; - case 0xE10F: //softbank flair - buff.append("\"flair\""); - break; - case 0xE502: //softbank art - buff.append("\"art\""); - break; - case 0xE338: //softbank japanesetea - buff.append("\"japanesetea\""); - break; - case 0xE34B: //softbank birthday - buff.append("\"birthday\""); - break; - case 0xE22B: //softbank empty - buff.append("\"empty\""); - break; - case 0xE311: //softbank bomb - buff.append("\"bomb\""); - break; - case 0xE012: //softbank paper - buff.append("\"paper\""); - break; - case 0xE151: //softbank toilet - buff.append("\"toilet\""); - break; - case 0xE01A: //softbank horse - buff.append("\"horse\""); - break; - case 0xE03A: //softbank gasstation - buff.append("\"gasstation\""); - break; - case 0xE03F: //softbank key - buff.append("\"key\""); - break; - case 0xE00D: //softbank punch - buff.append("\"punch\""); - break; - case 0xE24D: //softbank ok - buff.append("\"ok\""); - break; - case 0xE105: //softbank bleah - buff.append("\"bleah\""); - break; - case 0xE00E: //softbank good - buff.append("\"good\""); - break; - case 0xE154: //softbank atm - buff.append("\"atm\""); - break; - case 0xE405: //softbank wink - buff.append("\"wink\""); - break; - case 0xE030: //softbank cherryblossom - buff.append("\"cherryblossom\""); - break; - case 0xE057: //softbank happy01 - buff.append("\"happy01\""); - break; - case 0xE229: //softbank id - buff.append("\"id\""); - break; - case 0xE016: //softbank baseball - buff.append("\"baseball\""); - break; - case 0xE044: //softbank wine - buff.append("\"wine\""); - break; - case 0xE115: //softbank run - buff.append("\"run\""); - break; - case 0xE14F: //softbank parking - buff.append("\"parking\""); - break; - case 0xE327: //softbank heart04 - buff.append("\"heart04\""); - break; - case 0xE014: //softbank golf - buff.append("\"golf\""); - break; - case 0xE021: //softbank sign01 - buff.append("\"sign01\""); - break; - case 0xE30A: //softbank music - buff.append("\"music\""); - break; - case 0xE411: //softbank crying - buff.append("\"crying\""); - break; - case 0xE536: //softbank foot - buff.append("\"foot\""); - break; - case 0xE047: //softbank beer - buff.append("\"beer\""); - break; - case 0xE43E: //softbank wave - buff.append("\"wave\""); - break; - case 0xE022: //softbank heart01 - buff.append("\"heart01\""); - break; - case 0xE007: //softbank shoe - buff.append("\"shoe\""); - break; - case 0xE010: //softbank rock - buff.append("\"rock\""); - break; - case 0xE32E: //softbank shine - buff.append("\"shine\""); - break; - case 0xE055: //softbank penguin - buff.append("\"penguin\""); - break; - case 0xE03C: //softbank karaoke - buff.append("\"karaoke\""); - break; - case 0xE018: //softbank soccer - buff.append("\"soccer\""); - break; - case 0xE159: //softbank bus - buff.append("\"bus\""); - break; - case 0xE107: //softbank shock - buff.append("\"shock\""); - break; - case 0xE04A: //softbank sun - buff.append("\"sun\""); - break; - case 0xE156: //softbank 24hours - buff.append("\"24hours\""); - break; - case 0xE110: //softbank clover - buff.append("\"clover\""); - break; - case 0xE034: //softbank ring - buff.append("\"ring\""); - break; - case 0xE24F: //softbank r-mark - buff.append("\"r-mark\""); - break; - case 0xE112: //softbank present - buff.append("\"present\""); - break; - case 0xE14D: //softbank bank - buff.append("\"bank\""); - break; - case 0xE42E: //softbank rvcar - buff.append("\"rvcar\""); - break; - case 0xE13E: //softbank boutique - buff.append("\"boutique\""); - break; - case 0xE413: //softbank weep - buff.append("\"weep\""); - break; - case 0xE241: //softbank gemini - buff.append("\"gemini\""); - break; - case 0xE212: //softbank new - buff.append("\"new\""); - break; - case 0xE324: //softbank slate - buff.append("\"slate\""); - break; - case 0xE220: //softbank five - buff.append("\"five\""); - break; - case 0xE503: //softbank drama - buff.append("\"drama\""); - break; - case 0xE248: //softbank capricornus - buff.append("\"capricornus\""); - break; - case 0xE049: //softbank cloud - buff.append("\"cloud\""); - break; - case 0xE243: //softbank leo - buff.append("\"leo\""); - break; - case 0xE326: //softbank notes - buff.append("\"notes\""); - break; - case 0xE00B: //softbank faxto - buff.append("\"faxto\""); - break; - case 0xE221: //softbank six - buff.append("\"six\""); - break; - case 0xE240: //softbank taurus - buff.append("\"taurus\""); - break; - case 0xE24E: //softbank copyright - buff.append("\"copyright\""); - break; - case 0xE224: //softbank nine - buff.append("\"nine\""); - break; - case 0xE008: //softbank camera - buff.append("\"camera\""); - break; - case 0xE01E: //softbank train - buff.append("\"train\""); - break; - case 0xE20D: //softbank diamond - buff.append("\"diamond\""); - break; - case 0xE009: //softbank telephone - buff.append("\"telephone\""); - break; - case 0xE019: //softbank fish - buff.append("\"fish\""); - break; - case 0xE01C: //softbank yacht - buff.append("\"yacht\""); - break; - case 0xE40A: //softbank confident - buff.append("\"confident\""); - break; - case 0xE246: //softbank scorpius - buff.append("\"scorpius\""); - break; - case 0xE120: //softbank fastfood - buff.append("\"fastfood\""); - break; - case 0xE323: //softbank bag - buff.append("\"bag\""); - break; - case 0xE345: //softbank apple - buff.append("\"apple\""); - break; - case 0xE339: //softbank bread - buff.append("\"bread\""); - break; - case 0xE13C: //softbank sleepy - buff.append("\"sleepy\""); - break; - case 0xE106: //softbank lovely - buff.append("\"lovely\""); - break; - case 0xE340: //softbank noodle - buff.append("\"noodle\""); - break; - case 0xE20F: //softbank club - buff.append("\"club\""); - break; - case 0xE114: //softbank search - buff.append("\"search\""); - break; - case 0xE10E: //softbank crown - buff.append("\"crown\""); - break; - case 0xE406: //softbank wobbly - buff.append("\"wobbly\""); - break; - case 0xE331: //softbank sweat02 - buff.append("\"sweat02\""); - break; - case 0xE04F: //softbank cat - buff.append("\"cat\""); - break; - case 0xE301: //softbank memo - buff.append("\"memo\""); - break; - case 0xE01B: //softbank car - buff.append("\"car\""); - break; - case 0xE314: //softbank ribbon - buff.append("\"ribbon\""); - break; - case 0xE315: //softbank secret - buff.append("\"secret\""); - break; - case 0xE236: //softbank up - buff.append("\"up\""); - break; - case 0xE208: //softbank nosmoking - buff.append("\"nosmoking\""); - break; - case 0xE006: //softbank t-shirt - buff.append("\"t-shirt\""); - break; - case 0xE12A: //softbank tv - buff.append("\"tv\""); - break; - case 0xE238: //softbank downwardright - buff.append("\"downwardright\""); - break; - case 0xE10B: //softbank pig - buff.append("\"pig\""); - break; - case 0xE126: //softbank cd - buff.append("\"cd\""); - break; - case 0xE402: //softbank catface - buff.append("\"catface\""); - break; - case 0xE416: //softbank pout - buff.append("\"pout\""); - break; - case 0xE045: //softbank cafe - buff.append("\"cafe\""); - break; - case 0xE41B: //softbank ear - buff.append("\"ear\""); - break; - case 0xE23F: //softbank aries - buff.append("\"aries\""); - break; - case 0xE21E: //softbank three - buff.append("\"three\""); - break; - case 0xE056: //softbank delicious - buff.append("\"delicious\""); - break; - case 0xE14E: //softbank signaler - buff.append("\"signaler\""); - break; - case 0xE155: //softbank hospital - buff.append("\"hospital\""); - break; - case 0xE033: //softbank xmas - buff.append("\"xmas\""); - break; - case 0xE22A: //softbank full - buff.append("\"full\""); - break; - case 0xE123: //softbank spa - buff.append("\"spa\""); - break; - case 0xE132: //softbank motorsports - buff.append("\"motorsports\""); - break; - case 0xE434: //softbank subway - buff.append("\"subway\""); - break; - case 0xE403: //softbank think - buff.append("\"think\""); - break; - case 0xE043: //softbank restaurant - buff.append("\"restaurant\""); - break; - case 0xE537: //softbank tm - buff.append("\"tm\""); - break; - case 0xE058: //softbank despair - buff.append("\"despair\""); - break; - case 0xE04C: //softbank moon3 - buff.append("\"moon3\""); - break; - case 0xE21D: //softbank two - buff.append("\"two\""); - break; - case 0xE202: //softbank ship - buff.append("\"ship\""); - break; - case 0xE30B: //softbank bottle - buff.append("\"bottle\""); - break; - case 0xE118: //softbank maple - buff.append("\"maple\""); - break; - case 0xE103: //softbank loveletter - buff.append("\"loveletter\""); - break; - case 0xE225: //softbank zero - buff.append("\"zero\""); - break; - case 0xE00C: //softbank pc - buff.append("\"pc\""); - break; - case 0xE210: //softbank sharp - buff.append("\"sharp\""); - break; - case 0xE015: //softbank tennis - buff.append("\"tennis\""); - break; - case 0xE038: //softbank building - buff.append("\"building\""); - break; - case 0xE02D: //softbank clock - buff.append("\"clock\""); - break; - case 0xE334: //softbank annoy - buff.append("\"annoy\""); - break; - case 0xE153: //softbank postoffice - buff.append("\"postoffice\""); - break; - case 0xE222: //softbank seven - buff.append("\"seven\""); - break; - case 0xE12F: //softbank dollar - buff.append("\"dollar\""); - break; - case 0xE00A: //softbank mobilephone - buff.append("\"mobilephone\""); - break; - case 0xE158: //softbank hotel - buff.append("\"hotel\""); - break; - case 0xE249: //softbank aquarius - buff.append("\"aquarius\""); - break; - case 0xE036: //softbank house - buff.append("\"house\""); - break; - case 0xE046: //softbank cake - buff.append("\"cake\""); - break; - case 0xE104: //softbank phoneto - buff.append("\"phoneto\""); - break; - case 0xE44B: //softbank night - buff.append("\"night\""); - break; - case 0xE313: //softbank hairsalon - buff.append("\"hairsalon\""); - break; - // These emoji codepoints are generated by tools/make_emoji in the K-9 source tree - // The spaces between the < and the img are a hack to avoid triggering - // K-9's 'load images' button - - case 0xE488: //kddi sun - buff.append("\"sun\""); - break; - case 0xEA88: //kddi id - buff.append("\"id\""); - break; - case 0xE4BA: //kddi baseball - buff.append("\"baseball\""); - break; - case 0xE525: //kddi four - buff.append("\"four\""); - break; - case 0xE578: //kddi free - buff.append("\"free\""); - break; - case 0xE4C1: //kddi wine - buff.append("\"wine\""); - break; - case 0xE512: //kddi bell - buff.append("\"bell\""); - break; - case 0xEB83: //kddi rock - buff.append("\"rock\""); - break; - case 0xE4D0: //kddi cake - buff.append("\"cake\""); - break; - case 0xE473: //kddi crying - buff.append("\"crying\""); - break; - case 0xE48C: //kddi rain - buff.append("\"rain\""); - break; - case 0xEAC2: //kddi bearing - buff.append("\"bearing\""); - break; - case 0xE47E: //kddi nosmoking - buff.append("\"nosmoking\""); - break; - case 0xEAC0: //kddi despair - buff.append("\"despair\""); - break; - case 0xE559: //kddi r-mark - buff.append("\"r-mark\""); - break; - case 0xEB2D: //kddi up - buff.append("\"up\""); - break; - case 0xEA89: //kddi full - buff.append("\"full\""); - break; - case 0xEAC9: //kddi gawk - buff.append("\"gawk\""); - break; - case 0xEB79: //kddi recycle - buff.append("\"recycle\""); - break; - case 0xE5AC: //kddi zero - buff.append("\"zero\""); - break; - case 0xEAAE: //kddi japanesetea - buff.append("\"japanesetea\""); - break; - case 0xEB30: //kddi sign03 - buff.append("\"sign03\""); - break; - case 0xE4B6: //kddi soccer - buff.append("\"soccer\""); - break; - case 0xE556: //kddi downwardleft - buff.append("\"downwardleft\""); - break; - case 0xE4BE: //kddi slate - buff.append("\"slate\""); - break; - case 0xE4A5: //kddi toilet - buff.append("\"toilet\""); - break; - // Skipping kddi codepoint E523 two - // It conflicts with an earlier definition from another carrier: - // softbank chick - - case 0xE496: //kddi scorpius - buff.append("\"scorpius\""); - break; - case 0xE4C6: //kddi game - buff.append("\"game\""); - break; - case 0xE5A0: //kddi birthday - buff.append("\"birthday\""); - break; - case 0xE5B8: //kddi pc - buff.append("\"pc\""); - break; - case 0xE516: //kddi hairsalon - buff.append("\"hairsalon\""); - break; - case 0xE475: //kddi sleepy - buff.append("\"sleepy\""); - break; - case 0xE4A3: //kddi atm - buff.append("\"atm\""); - break; - case 0xE59A: //kddi basketball - buff.append("\"basketball\""); - break; - case 0xE497: //kddi sagittarius - buff.append("\"sagittarius\""); - break; - case 0xEACD: //kddi delicious - buff.append("\"delicious\""); - break; - case 0xE5A8: //kddi newmoon - buff.append("\"newmoon\""); - break; - case 0xE49E: //kddi ticket - buff.append("\"ticket\""); - break; - case 0xE5AE: //kddi wobbly - buff.append("\"wobbly\""); - break; - case 0xE4E6: //kddi sweat02 - buff.append("\"sweat02\""); - break; - case 0xE59E: //kddi event - buff.append("\"event\""); - break; - case 0xE4AB: //kddi house - buff.append("\"house\""); - break; - case 0xE491: //kddi gemini - buff.append("\"gemini\""); - break; - case 0xE4C9: //kddi xmas - buff.append("\"xmas\""); - break; - case 0xE5BE: //kddi note - buff.append("\"note\""); - break; - case 0xEB2F: //kddi sign02 - buff.append("\"sign02\""); - break; - case 0xE508: //kddi music - buff.append("\"music\""); - break; - case 0xE5DF: //kddi hospital - buff.append("\"hospital\""); - break; - case 0xE5BC: //kddi subway - buff.append("\"subway\""); - break; - case 0xE5C9: //kddi crown - buff.append("\"crown\""); - break; - case 0xE4BC: //kddi spa - buff.append("\"spa\""); - break; - case 0xE514: //kddi ring - buff.append("\"ring\""); - break; - // Skipping kddi codepoint E502 tv - // It conflicts with an earlier definition from another carrier: - // softbank art - - case 0xE4AC: //kddi restaurant - buff.append("\"restaurant\""); - break; - case 0xE529: //kddi eight - buff.append("\"eight\""); - break; - case 0xE518: //kddi search - buff.append("\"search\""); - break; - case 0xE505: //kddi notes - buff.append("\"notes\""); - break; - case 0xE498: //kddi capricornus - buff.append("\"capricornus\""); - break; - case 0xEB7E: //kddi snail - buff.append("\"snail\""); - break; - case 0xEA97: //kddi bottle - buff.append("\"bottle\""); - break; - case 0xEB08: //kddi phoneto - buff.append("\"phoneto\""); - break; - case 0xE4D2: //kddi cherry - buff.append("\"cherry\""); - break; - case 0xE54D: //kddi downwardright - buff.append("\"downwardright\""); - break; - case 0xE5C3: //kddi wink - buff.append("\"wink\""); - break; - case 0xEAAC: //kddi ski - buff.append("\"ski\""); - break; - case 0xE515: //kddi camera - buff.append("\"camera\""); - break; - case 0xE5B6: //kddi t-shirt - buff.append("\"t-shirt\""); - break; - case 0xE5C4: //kddi lovely - buff.append("\"lovely\""); - break; - case 0xE4AD: //kddi building - buff.append("\"building\""); - break; - case 0xE4CE: //kddi maple - buff.append("\"maple\""); - break; - case 0xE5AA: //kddi moon2 - buff.append("\"moon2\""); - break; - case 0xE5B4: //kddi noodle - buff.append("\"noodle\""); - break; - case 0xE5A6: //kddi scissors - buff.append("\"scissors\""); - break; - case 0xE4AA: //kddi bank - buff.append("\"bank\""); - break; - case 0xE4B5: //kddi train - buff.append("\"train\""); - break; - case 0xE477: //kddi heart03 - buff.append("\"heart03\""); - break; - case 0xE481: //kddi danger - buff.append("\"danger\""); - break; - case 0xE597: //kddi cafe - buff.append("\"cafe\""); - break; - case 0xEB2B: //kddi shoe - buff.append("\"shoe\""); - break; - case 0xEB7C: //kddi wave - buff.append("\"wave\""); - break; - case 0xE471: //kddi happy01 - buff.append("\"happy01\""); - break; - case 0xE4CA: //kddi cherryblossom - buff.append("\"cherryblossom\""); - break; - case 0xE4D5: //kddi riceball - buff.append("\"riceball\""); - break; - case 0xE587: //kddi wrench - buff.append("\"wrench\""); - break; - case 0xEB2A: //kddi foot - buff.append("\"foot\""); - break; - case 0xE47D: //kddi smoking - buff.append("\"smoking\""); - break; - case 0xE4DC: //kddi penguin - buff.append("\"penguin\""); - break; - case 0xE4B3: //kddi airplane - buff.append("\"airplane\""); - break; - case 0xE4DE: //kddi pig - buff.append("\"pig\""); - break; - case 0xE59B: //kddi pocketbell - buff.append("\"pocketbell\""); - break; - case 0xE4AF: //kddi bus - buff.append("\"bus\""); - break; - case 0xE4A6: //kddi parking - buff.append("\"parking\""); - break; - case 0xE486: //kddi moon3 - buff.append("\"moon3\""); - break; - case 0xE5A4: //kddi eye - buff.append("\"eye\""); - break; - case 0xE50C: //kddi cd - buff.append("\"cd\""); - break; - case 0xE54C: //kddi upwardleft - buff.append("\"upwardleft\""); - break; - case 0xEA82: //kddi ship - buff.append("\"ship\""); - break; - case 0xE4B1: //kddi car - buff.append("\"car\""); - break; - case 0xEB80: //kddi smile - buff.append("\"smile\""); - break; - case 0xE5B0: //kddi impact - buff.append("\"impact\""); - break; - case 0xE504: //kddi moneybag - buff.append("\"moneybag\""); - break; - case 0xE4B9: //kddi motorsports - buff.append("\"motorsports\""); - break; - case 0xE494: //kddi virgo - buff.append("\"virgo\""); - break; - case 0xE595: //kddi heart01 - buff.append("\"heart01\""); - break; - case 0xEB03: //kddi pen - buff.append("\"pen\""); - break; - case 0xE57D: //kddi yen - buff.append("\"yen\""); - break; - case 0xE598: //kddi mist - buff.append("\"mist\""); - break; - case 0xE5A2: //kddi diamond - buff.append("\"diamond\""); - break; - case 0xE4A4: //kddi 24hours - buff.append("\"24hours\""); - break; - case 0xE524: //kddi three - buff.append("\"three\""); - break; - case 0xEB7B: //kddi updown - buff.append("\"updown\""); - break; - case 0xE5A1: //kddi spade - buff.append("\"spade\""); - break; - case 0xE495: //kddi libra - buff.append("\"libra\""); - break; - case 0xE588: //kddi mobilephone - buff.append("\"mobilephone\""); - break; - case 0xE599: //kddi golf - buff.append("\"golf\""); - break; - case 0xE520: //kddi faxto - buff.append("\"faxto\""); - break; - // Skipping kddi codepoint E503 karaoke - // It conflicts with an earlier definition from another carrier: - // softbank drama - - case 0xE4D6: //kddi fastfood - buff.append("\"fastfood\""); - break; - case 0xE4A1: //kddi pencil - buff.append("\"pencil\""); - break; - case 0xE522: //kddi one - buff.append("\"one\""); - break; - case 0xEB84: //kddi sharp - buff.append("\"sharp\""); - break; - case 0xE476: //kddi flair - buff.append("\"flair\""); - break; - case 0xE46B: //kddi run - buff.append("\"run\""); - break; - case 0xEAF5: //kddi drama - buff.append("\"drama\""); - break; - case 0xEAB9: //kddi apple - buff.append("\"apple\""); - break; - case 0xE4EB: //kddi kissmark - buff.append("\"kissmark\""); - break; - case 0xE55D: //kddi enter - buff.append("\"enter\""); - break; - case 0xE59F: //kddi ribbon - buff.append("\"ribbon\""); - break; - case 0xE526: //kddi five - buff.append("\"five\""); - break; - case 0xE571: //kddi gasstation - buff.append("\"gasstation\""); - break; - case 0xE517: //kddi movie - buff.append("\"movie\""); - break; - case 0xE4B8: //kddi snowboard - buff.append("\"snowboard\""); - break; - case 0xEAE8: //kddi sprinkle - buff.append("\"sprinkle\""); - break; - case 0xEA80: //kddi school - buff.append("\"school\""); - break; - case 0xE47C: //kddi sandclock - buff.append("\"sandclock\""); - break; - case 0xEB31: //kddi sign05 - buff.append("\"sign05\""); - break; - case 0xE5AB: //kddi clear - buff.append("\"clear\""); - break; - case 0xE5DE: //kddi postoffice - buff.append("\"postoffice\""); - break; - case 0xEB62: //kddi mailto - buff.append("\"mailto\""); - break; - case 0xE528: //kddi seven - buff.append("\"seven\""); - break; - case 0xE4C2: //kddi bar - buff.append("\"bar\""); - break; - case 0xE487: //kddi thunder - buff.append("\"thunder\""); - break; - case 0xE5A9: //kddi moon1 - buff.append("\"moon1\""); - break; - case 0xEB7A: //kddi leftright - buff.append("\"leftright\""); - break; - case 0xE513: //kddi clover - buff.append("\"clover\""); - break; - case 0xE492: //kddi cancer - buff.append("\"cancer\""); - break; - case 0xEB78: //kddi loveletter - buff.append("\"loveletter\""); - break; - case 0xE4E0: //kddi chick - buff.append("\"chick\""); - break; - case 0xE4CF: //kddi present - buff.append("\"present\""); - break; - case 0xE478: //kddi heart04 - buff.append("\"heart04\""); - break; - case 0xEAC3: //kddi sad - buff.append("\"sad\""); - break; - case 0xE52A: //kddi nine - buff.append("\"nine\""); - break; - case 0xE482: //kddi sign01 - buff.append("\"sign01\""); - break; - case 0xEABF: //kddi catface - buff.append("\"catface\""); - break; - case 0xE527: //kddi six - buff.append("\"six\""); - break; - case 0xE52C: //kddi mobaq - buff.append("\"mobaq\""); - break; - case 0xE485: //kddi snow - buff.append("\"snow\""); - break; - case 0xE4B7: //kddi tennis - buff.append("\"tennis\""); - break; - case 0xE5BD: //kddi fuji - buff.append("\"fuji\""); - break; - case 0xE558: //kddi copyright - buff.append("\"copyright\""); - break; - case 0xE4D8: //kddi horse - buff.append("\"horse\""); - break; - case 0xE4B0: //kddi bullettrain - buff.append("\"bullettrain\""); - break; - case 0xE596: //kddi telephone - buff.append("\"telephone\""); - break; - case 0xE48F: //kddi aries - buff.append("\"aries\""); - break; - case 0xE46A: //kddi signaler - buff.append("\"signaler\""); - break; - case 0xE472: //kddi angry - buff.append("\"angry\""); - break; - case 0xE54E: //kddi tm - buff.append("\"tm\""); - break; - case 0xE51A: //kddi boutique - buff.append("\"boutique\""); - break; - case 0xE493: //kddi leo - buff.append("\"leo\""); - break; - case 0xE5A3: //kddi club - buff.append("\"club\""); - break; - case 0xE499: //kddi aquarius - buff.append("\"aquarius\""); - break; - case 0xE4AE: //kddi bicycle - buff.append("\"bicycle\""); - break; - case 0xE4E7: //kddi bleah - buff.append("\"bleah\""); - break; - case 0xE49F: //kddi book - buff.append("\"book\""); - break; - case 0xE5AD: //kddi ok - buff.append("\"ok\""); - break; - case 0xE5A7: //kddi paper - buff.append("\"paper\""); - break; - case 0xE4E5: //kddi annoy - buff.append("\"annoy\""); - break; - case 0xE4A0: //kddi clip - buff.append("\"clip\""); - break; - case 0xE509: //kddi rouge - buff.append("\"rouge\""); - break; - case 0xEAAF: //kddi bread - buff.append("\"bread\""); - break; - case 0xE519: //kddi key - buff.append("\"key\""); - break; - case 0xE594: //kddi clock - buff.append("\"clock\""); - break; - case 0xEB7D: //kddi bud - buff.append("\"bud\""); - break; - case 0xEA8A: //kddi empty - buff.append("\"empty\""); - break; - case 0xE5B5: //kddi new - buff.append("\"new\""); - break; - case 0xE47A: //kddi bomb - buff.append("\"bomb\""); - break; - case 0xE5C6: //kddi coldsweats02 - buff.append("\"coldsweats02\""); - break; - case 0xE49A: //kddi pisces - buff.append("\"pisces\""); - break; - case 0xE4F3: //kddi punch - buff.append("\"punch\""); - break; - case 0xEB5D: //kddi pout - buff.append("\"pout\""); - break; - case 0xE469: //kddi typhoon - buff.append("\"typhoon\""); - break; - case 0xE5B1: //kddi sweat01 - buff.append("\"sweat01\""); - break; - case 0xE4C7: //kddi dollar - buff.append("\"dollar\""); - break; - case 0xE5C5: //kddi shock - buff.append("\"shock\""); - break; - case 0xE4F9: //kddi good - buff.append("\"good\""); - break; - case 0xE4F1: //kddi secret - buff.append("\"secret\""); - break; - case 0xE4E4: //kddi tulip - buff.append("\"tulip\""); - break; - case 0xEA81: //kddi hotel - buff.append("\"hotel\""); - break; - case 0xE4FE: //kddi eyeglass - buff.append("\"eyeglass\""); - break; - case 0xEAF1: //kddi night - buff.append("\"night\""); - break; - case 0xE555: //kddi upwardright - buff.append("\"upwardright\""); - break; - case 0xEB2E: //kddi down - buff.append("\"down\""); - break; - case 0xE4DB: //kddi cat - buff.append("\"cat\""); - break; - case 0xE59C: //kddi art - buff.append("\"art\""); - break; - case 0xEB69: //kddi weep - buff.append("\"weep\""); - break; - case 0xE4F4: //kddi dash - buff.append("\"dash\""); - break; - case 0xE490: //kddi taurus - buff.append("\"taurus\""); - break; - case 0xE57A: //kddi watch - buff.append("\"watch\""); - break; - case 0xEB2C: //kddi flag - buff.append("\"flag\""); - break; - case 0xEB77: //kddi denim - buff.append("\"denim\""); - break; - case 0xEAC5: //kddi confident - buff.append("\"confident\""); - break; - case 0xE4B4: //kddi yacht - buff.append("\"yacht\""); - break; - case 0xE49C: //kddi bag - buff.append("\"bag\""); - break; - case 0xE5A5: //kddi ear - buff.append("\"ear\""); - break; - case 0xE4E1: //kddi dog - buff.append("\"dog\""); - break; - case 0xE521: //kddi mail - buff.append("\"mail\""); - break; - case 0xEB35: //kddi banana - buff.append("\"banana\""); - break; - case 0xEAA5: //kddi heart - buff.append("\"heart\""); - break; - case 0xE47F: //kddi wheelchair - buff.append("\"wheelchair\""); - break; - case 0xEB75: //kddi heart02 - buff.append("\"heart02\""); - break; - case 0xE48D: //kddi cloud - buff.append("\"cloud\""); - break; - case 0xE4C3: //kddi beer - buff.append("\"beer\""); - break; - case 0xEAAB: //kddi shine - buff.append("\"shine\""); - break; - case 0xEA92: //kddi memo - buff.append("\"memo\""); - break; - default: - buff.append((char)c); - }//switch - } } - catch (IOException e) - { - //Should never happen - Log.e(K9.LOG_TAG, null, e); - } - return buff.toString(); } + private String getEmojiForCodePoint(int codePoint) + { + // Derived from http://code.google.com/p/emoji4unicode/source/browse/trunk/data/emoji4unicode.xml + // XXX: This doesn't cover all the characters. More emoticons are wanted. + switch (codePoint) + { + case 0xFE000: return "sun"; + case 0xFE001: return "cloud"; + case 0xFE002: return "rain"; + case 0xFE003: return "snow"; + case 0xFE004: return "thunder"; + case 0xFE005: return "typhoon"; + case 0xFE006: return "mist"; + case 0xFE007: return "sprinkle"; + case 0xFE008: return "night"; + case 0xFE009: return "sun"; + case 0xFE00A: return "sun"; + case 0xFE00C: return "sun"; + case 0xFE010: return "night"; + case 0xFE011: return "newmoon"; + case 0xFE012: return "moon1"; + case 0xFE013: return "moon2"; + case 0xFE014: return "moon3"; + case 0xFE015: return "fullmoon"; + case 0xFE016: return "moon2"; + case 0xFE018: return "soon"; + case 0xFE019: return "on"; + case 0xFE01A: return "end"; + case 0xFE01B: return "sandclock"; + case 0xFE01C: return "sandclock"; + case 0xFE01D: return "watch"; + case 0xFE01E: return "clock"; + case 0xFE01F: return "clock"; + case 0xFE020: return "clock"; + case 0xFE021: return "clock"; + case 0xFE022: return "clock"; + case 0xFE023: return "clock"; + case 0xFE024: return "clock"; + case 0xFE025: return "clock"; + case 0xFE026: return "clock"; + case 0xFE027: return "clock"; + case 0xFE028: return "clock"; + case 0xFE029: return "clock"; + case 0xFE02A: return "clock"; + case 0xFE02B: return "aries"; + case 0xFE02C: return "taurus"; + case 0xFE02D: return "gemini"; + case 0xFE02E: return "cancer"; + case 0xFE02F: return "leo"; + case 0xFE030: return "virgo"; + case 0xFE031: return "libra"; + case 0xFE032: return "scorpius"; + case 0xFE033: return "sagittarius"; + case 0xFE034: return "capricornus"; + case 0xFE035: return "aquarius"; + case 0xFE036: return "pisces"; + case 0xFE038: return "wave"; + case 0xFE03B: return "night"; + case 0xFE03C: return "clover"; + case 0xFE03D: return "tulip"; + case 0xFE03E: return "bud"; + case 0xFE03F: return "maple"; + case 0xFE040: return "cherryblossom"; + case 0xFE042: return "maple"; + case 0xFE04E: return "clover"; + case 0xFE04F: return "cherry"; + case 0xFE050: return "banana"; + case 0xFE051: return "apple"; + case 0xFE05B: return "apple"; + case 0xFE190: return "eye"; + case 0xFE191: return "ear"; + case 0xFE193: return "kissmark"; + case 0xFE194: return "bleah"; + case 0xFE195: return "rouge"; + case 0xFE198: return "hairsalon"; + case 0xFE19A: return "shadow"; + case 0xFE19B: return "happy01"; + case 0xFE19C: return "happy01"; + case 0xFE19D: return "happy01"; + case 0xFE19E: return "happy01"; + case 0xFE1B7: return "dog"; + case 0xFE1B8: return "cat"; + case 0xFE1B9: return "snail"; + case 0xFE1BA: return "chick"; + case 0xFE1BB: return "chick"; + case 0xFE1BC: return "penguin"; + case 0xFE1BD: return "fish"; + case 0xFE1BE: return "horse"; + case 0xFE1BF: return "pig"; + case 0xFE1C8: return "chick"; + case 0xFE1C9: return "fish"; + case 0xFE1CF: return "aries"; + case 0xFE1D0: return "dog"; + case 0xFE1D8: return "dog"; + case 0xFE1D9: return "fish"; + case 0xFE1DB: return "foot"; + case 0xFE1DD: return "chick"; + case 0xFE1E0: return "pig"; + case 0xFE1E3: return "cancer"; + case 0xFE320: return "angry"; + case 0xFE321: return "sad"; + case 0xFE322: return "wobbly"; + case 0xFE323: return "despair"; + case 0xFE324: return "wobbly"; + case 0xFE325: return "coldsweats02"; + case 0xFE326: return "gawk"; + case 0xFE327: return "lovely"; + case 0xFE328: return "smile"; + case 0xFE329: return "bleah"; + case 0xFE32A: return "bleah"; + case 0xFE32B: return "delicious"; + case 0xFE32C: return "lovely"; + case 0xFE32D: return "lovely"; + case 0xFE32F: return "happy02"; + case 0xFE330: return "happy01"; + case 0xFE331: return "coldsweats01"; + case 0xFE332: return "happy02"; + case 0xFE333: return "smile"; + case 0xFE334: return "happy02"; + case 0xFE335: return "delicious"; + case 0xFE336: return "happy01"; + case 0xFE337: return "happy01"; + case 0xFE338: return "coldsweats01"; + case 0xFE339: return "weep"; + case 0xFE33A: return "crying"; + case 0xFE33B: return "shock"; + case 0xFE33C: return "bearing"; + case 0xFE33D: return "pout"; + case 0xFE33E: return "confident"; + case 0xFE33F: return "sad"; + case 0xFE340: return "think"; + case 0xFE341: return "shock"; + case 0xFE342: return "sleepy"; + case 0xFE343: return "catface"; + case 0xFE344: return "coldsweats02"; + case 0xFE345: return "coldsweats02"; + case 0xFE346: return "bearing"; + case 0xFE347: return "wink"; + case 0xFE348: return "happy01"; + case 0xFE349: return "smile"; + case 0xFE34A: return "happy02"; + case 0xFE34B: return "lovely"; + case 0xFE34C: return "lovely"; + case 0xFE34D: return "weep"; + case 0xFE34E: return "pout"; + case 0xFE34F: return "smile"; + case 0xFE350: return "sad"; + case 0xFE351: return "ng"; + case 0xFE352: return "ok"; + case 0xFE357: return "paper"; + case 0xFE359: return "sad"; + case 0xFE35A: return "angry"; + case 0xFE4B0: return "house"; + case 0xFE4B1: return "house"; + case 0xFE4B2: return "building"; + case 0xFE4B3: return "postoffice"; + case 0xFE4B4: return "hospital"; + case 0xFE4B5: return "bank"; + case 0xFE4B6: return "atm"; + case 0xFE4B7: return "hotel"; + case 0xFE4B9: return "24hours"; + case 0xFE4BA: return "school"; + case 0xFE4C1: return "ship"; + case 0xFE4C2: return "bottle"; + case 0xFE4C3: return "fuji"; + case 0xFE4C9: return "wrench"; + case 0xFE4CC: return "shoe"; + case 0xFE4CD: return "shoe"; + case 0xFE4CE: return "eyeglass"; + case 0xFE4CF: return "t-shirt"; + case 0xFE4D0: return "denim"; + case 0xFE4D1: return "crown"; + case 0xFE4D2: return "crown"; + case 0xFE4D6: return "boutique"; + case 0xFE4D7: return "boutique"; + case 0xFE4DB: return "t-shirt"; + case 0xFE4DC: return "moneybag"; + case 0xFE4DD: return "dollar"; + case 0xFE4E0: return "dollar"; + case 0xFE4E2: return "yen"; + case 0xFE4E3: return "dollar"; + case 0xFE4EF: return "camera"; + case 0xFE4F0: return "bag"; + case 0xFE4F1: return "pouch"; + case 0xFE4F2: return "bell"; + case 0xFE4F3: return "door"; + case 0xFE4F9: return "movie"; + case 0xFE4FB: return "flair"; + case 0xFE4FD: return "sign05"; + case 0xFE4FF: return "book"; + case 0xFE500: return "book"; + case 0xFE501: return "book"; + case 0xFE502: return "book"; + case 0xFE503: return "book"; + case 0xFE505: return "spa"; + case 0xFE506: return "toilet"; + case 0xFE507: return "toilet"; + case 0xFE508: return "toilet"; + case 0xFE50F: return "ribbon"; + case 0xFE510: return "present"; + case 0xFE511: return "birthday"; + case 0xFE512: return "xmas"; + case 0xFE522: return "pocketbell"; + case 0xFE523: return "telephone"; + case 0xFE524: return "telephone"; + case 0xFE525: return "mobilephone"; + case 0xFE526: return "phoneto"; + case 0xFE527: return "memo"; + case 0xFE528: return "faxto"; + case 0xFE529: return "mail"; + case 0xFE52A: return "mailto"; + case 0xFE52B: return "mailto"; + case 0xFE52C: return "postoffice"; + case 0xFE52D: return "postoffice"; + case 0xFE52E: return "postoffice"; + case 0xFE535: return "present"; + case 0xFE536: return "pen"; + case 0xFE537: return "chair"; + case 0xFE538: return "pc"; + case 0xFE539: return "pencil"; + case 0xFE53A: return "clip"; + case 0xFE53B: return "bag"; + case 0xFE53E: return "hairsalon"; + case 0xFE540: return "memo"; + case 0xFE541: return "memo"; + case 0xFE545: return "book"; + case 0xFE546: return "book"; + case 0xFE547: return "book"; + case 0xFE548: return "memo"; + case 0xFE54D: return "book"; + case 0xFE54F: return "book"; + case 0xFE552: return "memo"; + case 0xFE553: return "foot"; + case 0xFE7D0: return "sports"; + case 0xFE7D1: return "baseball"; + case 0xFE7D2: return "golf"; + case 0xFE7D3: return "tennis"; + case 0xFE7D4: return "soccer"; + case 0xFE7D5: return "ski"; + case 0xFE7D6: return "basketball"; + case 0xFE7D7: return "motorsports"; + case 0xFE7D8: return "snowboard"; + case 0xFE7D9: return "run"; + case 0xFE7DA: return "snowboard"; + case 0xFE7DC: return "horse"; + case 0xFE7DF: return "train"; + case 0xFE7E0: return "subway"; + case 0xFE7E1: return "subway"; + case 0xFE7E2: return "bullettrain"; + case 0xFE7E3: return "bullettrain"; + case 0xFE7E4: return "car"; + case 0xFE7E5: return "rvcar"; + case 0xFE7E6: return "bus"; + case 0xFE7E8: return "ship"; + case 0xFE7E9: return "airplane"; + case 0xFE7EA: return "yacht"; + case 0xFE7EB: return "bicycle"; + case 0xFE7EE: return "yacht"; + case 0xFE7EF: return "car"; + case 0xFE7F0: return "run"; + case 0xFE7F5: return "gasstation"; + case 0xFE7F6: return "parking"; + case 0xFE7F7: return "signaler"; + case 0xFE7FA: return "spa"; + case 0xFE7FC: return "carouselpony"; + case 0xFE7FF: return "fish"; + case 0xFE800: return "karaoke"; + case 0xFE801: return "movie"; + case 0xFE802: return "movie"; + case 0xFE803: return "music"; + case 0xFE804: return "art"; + case 0xFE805: return "drama"; + case 0xFE806: return "event"; + case 0xFE807: return "ticket"; + case 0xFE808: return "slate"; + case 0xFE809: return "drama"; + case 0xFE80A: return "game"; + case 0xFE813: return "note"; + case 0xFE814: return "notes"; + case 0xFE81A: return "notes"; + case 0xFE81C: return "tv"; + case 0xFE81D: return "cd"; + case 0xFE81E: return "cd"; + case 0xFE823: return "kissmark"; + case 0xFE824: return "loveletter"; + case 0xFE825: return "ring"; + case 0xFE826: return "ring"; + case 0xFE827: return "kissmark"; + case 0xFE829: return "heart02"; + case 0xFE82B: return "freedial"; + case 0xFE82C: return "sharp"; + case 0xFE82D: return "mobaq"; + case 0xFE82E: return "one"; + case 0xFE82F: return "two"; + case 0xFE830: return "three"; + case 0xFE831: return "four"; + case 0xFE832: return "five"; + case 0xFE833: return "six"; + case 0xFE834: return "seven"; + case 0xFE835: return "eight"; + case 0xFE836: return "nine"; + case 0xFE837: return "zero"; + case 0xFE960: return "fastfood"; + case 0xFE961: return "riceball"; + case 0xFE962: return "cake"; + case 0xFE963: return "noodle"; + case 0xFE964: return "bread"; + case 0xFE96A: return "noodle"; + case 0xFE973: return "typhoon"; + case 0xFE980: return "restaurant"; + case 0xFE981: return "cafe"; + case 0xFE982: return "bar"; + case 0xFE983: return "beer"; + case 0xFE984: return "japanesetea"; + case 0xFE985: return "bottle"; + case 0xFE986: return "wine"; + case 0xFE987: return "beer"; + case 0xFE988: return "bar"; + case 0xFEAF0: return "upwardright"; + case 0xFEAF1: return "downwardright"; + case 0xFEAF2: return "upwardleft"; + case 0xFEAF3: return "downwardleft"; + case 0xFEAF4: return "up"; + case 0xFEAF5: return "down"; + case 0xFEAF6: return "leftright"; + case 0xFEAF7: return "updown"; + case 0xFEB04: return "sign01"; + case 0xFEB05: return "sign02"; + case 0xFEB06: return "sign03"; + case 0xFEB07: return "sign04"; + case 0xFEB08: return "sign05"; + case 0xFEB0B: return "sign01"; + case 0xFEB0C: return "heart01"; + case 0xFEB0D: return "heart02"; + case 0xFEB0E: return "heart03"; + case 0xFEB0F: return "heart04"; + case 0xFEB10: return "heart01"; + case 0xFEB11: return "heart02"; + case 0xFEB12: return "heart01"; + case 0xFEB13: return "heart01"; + case 0xFEB14: return "heart01"; + case 0xFEB15: return "heart01"; + case 0xFEB16: return "heart01"; + case 0xFEB17: return "heart01"; + case 0xFEB18: return "heart02"; + case 0xFEB19: return "cute"; + case 0xFEB1A: return "heart"; + case 0xFEB1B: return "spade"; + case 0xFEB1C: return "diamond"; + case 0xFEB1D: return "club"; + case 0xFEB1E: return "smoking"; + case 0xFEB1F: return "nosmoking"; + case 0xFEB20: return "wheelchair"; + case 0xFEB21: return "free"; + case 0xFEB22: return "flag"; + case 0xFEB23: return "danger"; + case 0xFEB26: return "ng"; + case 0xFEB27: return "ok"; + case 0xFEB28: return "ng"; + case 0xFEB29: return "copyright"; + case 0xFEB2A: return "tm"; + case 0xFEB2B: return "secret"; + case 0xFEB2C: return "recycle"; + case 0xFEB2D: return "r-mark"; + case 0xFEB2E: return "ban"; + case 0xFEB2F: return "empty"; + case 0xFEB30: return "pass"; + case 0xFEB31: return "full"; + case 0xFEB36: return "new"; + case 0xFEB44: return "fullmoon"; + case 0xFEB48: return "ban"; + case 0xFEB55: return "cute"; + case 0xFEB56: return "flair"; + case 0xFEB57: return "annoy"; + case 0xFEB58: return "bomb"; + case 0xFEB59: return "sleepy"; + case 0xFEB5A: return "impact"; + case 0xFEB5B: return "sweat01"; + case 0xFEB5C: return "sweat02"; + case 0xFEB5D: return "dash"; + case 0xFEB5F: return "sad"; + case 0xFEB60: return "shine"; + case 0xFEB61: return "cute"; + case 0xFEB62: return "cute"; + case 0xFEB63: return "newmoon"; + case 0xFEB64: return "newmoon"; + case 0xFEB65: return "newmoon"; + case 0xFEB66: return "newmoon"; + case 0xFEB67: return "newmoon"; + case 0xFEB77: return "shine"; + case 0xFEB81: return "id"; + case 0xFEB82: return "key"; + case 0xFEB83: return "enter"; + case 0xFEB84: return "clear"; + case 0xFEB85: return "search"; + case 0xFEB86: return "key"; + case 0xFEB87: return "key"; + case 0xFEB8A: return "key"; + case 0xFEB8D: return "search"; + case 0xFEB90: return "key"; + case 0xFEB91: return "recycle"; + case 0xFEB92: return "mail"; + case 0xFEB93: return "rock"; + case 0xFEB94: return "scissors"; + case 0xFEB95: return "paper"; + case 0xFEB96: return "punch"; + case 0xFEB97: return "good"; + case 0xFEB9D: return "paper"; + case 0xFEB9F: return "ok"; + case 0xFEBA0: return "down"; + case 0xFEBA1: return "paper"; + case 0xFEE10: return "info01"; + case 0xFEE11: return "info02"; + case 0xFEE12: return "by-d"; + case 0xFEE13: return "d-point"; + case 0xFEE14: return "appli01"; + case 0xFEE15: return "appli02"; + case 0xFEE1C: return "movie"; + default: return null; + } + } @Override public boolean isInTopGroup()