src/com/android/mms/util/SmileyParser.java
author Da Risk <da_risk@beem-project.com>
Thu, 14 Mar 2013 10:52:04 +0100
changeset 1034 a221cd4a5413
parent 1007 c3598834218b
permissions -rw-r--r--
Bump version 0.1.8
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
1007
c3598834218b Add SmileyParser from the android Mms application.
Da Risk <da_risk@beem-project.com>
parents:
diff changeset
     1
/*
c3598834218b Add SmileyParser from the android Mms application.
Da Risk <da_risk@beem-project.com>
parents:
diff changeset
     2
 * Copyright (C) 2009 The Android Open Source Project
c3598834218b Add SmileyParser from the android Mms application.
Da Risk <da_risk@beem-project.com>
parents:
diff changeset
     3
 *
c3598834218b Add SmileyParser from the android Mms application.
Da Risk <da_risk@beem-project.com>
parents:
diff changeset
     4
 * Licensed under the Apache License, Version 2.0 (the "License");
c3598834218b Add SmileyParser from the android Mms application.
Da Risk <da_risk@beem-project.com>
parents:
diff changeset
     5
 * you may not use this file except in compliance with the License.
c3598834218b Add SmileyParser from the android Mms application.
Da Risk <da_risk@beem-project.com>
parents:
diff changeset
     6
 * You may obtain a copy of the License at
c3598834218b Add SmileyParser from the android Mms application.
Da Risk <da_risk@beem-project.com>
parents:
diff changeset
     7
 *
c3598834218b Add SmileyParser from the android Mms application.
Da Risk <da_risk@beem-project.com>
parents:
diff changeset
     8
 *      http://www.apache.org/licenses/LICENSE-2.0
c3598834218b Add SmileyParser from the android Mms application.
Da Risk <da_risk@beem-project.com>
parents:
diff changeset
     9
 *
c3598834218b Add SmileyParser from the android Mms application.
Da Risk <da_risk@beem-project.com>
parents:
diff changeset
    10
 * Unless required by applicable law or agreed to in writing, software
c3598834218b Add SmileyParser from the android Mms application.
Da Risk <da_risk@beem-project.com>
parents:
diff changeset
    11
 * distributed under the License is distributed on an "AS IS" BASIS,
c3598834218b Add SmileyParser from the android Mms application.
Da Risk <da_risk@beem-project.com>
parents:
diff changeset
    12
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
c3598834218b Add SmileyParser from the android Mms application.
Da Risk <da_risk@beem-project.com>
parents:
diff changeset
    13
 * See the License for the specific language governing permissions and
c3598834218b Add SmileyParser from the android Mms application.
Da Risk <da_risk@beem-project.com>
parents:
diff changeset
    14
 * limitations under the License.
c3598834218b Add SmileyParser from the android Mms application.
Da Risk <da_risk@beem-project.com>
parents:
diff changeset
    15
 */
c3598834218b Add SmileyParser from the android Mms application.
Da Risk <da_risk@beem-project.com>
parents:
diff changeset
    16
c3598834218b Add SmileyParser from the android Mms application.
Da Risk <da_risk@beem-project.com>
parents:
diff changeset
    17
package com.android.mms.util;
c3598834218b Add SmileyParser from the android Mms application.
Da Risk <da_risk@beem-project.com>
parents:
diff changeset
    18
c3598834218b Add SmileyParser from the android Mms application.
Da Risk <da_risk@beem-project.com>
parents:
diff changeset
    19
import java.util.HashMap;
c3598834218b Add SmileyParser from the android Mms application.
Da Risk <da_risk@beem-project.com>
parents:
diff changeset
    20
import java.util.regex.Matcher;
c3598834218b Add SmileyParser from the android Mms application.
Da Risk <da_risk@beem-project.com>
parents:
diff changeset
    21
import java.util.regex.Pattern;
c3598834218b Add SmileyParser from the android Mms application.
Da Risk <da_risk@beem-project.com>
parents:
diff changeset
    22
c3598834218b Add SmileyParser from the android Mms application.
Da Risk <da_risk@beem-project.com>
parents:
diff changeset
    23
import android.content.Context;
c3598834218b Add SmileyParser from the android Mms application.
Da Risk <da_risk@beem-project.com>
parents:
diff changeset
    24
import android.text.Spannable;
c3598834218b Add SmileyParser from the android Mms application.
Da Risk <da_risk@beem-project.com>
parents:
diff changeset
    25
import android.text.SpannableStringBuilder;
c3598834218b Add SmileyParser from the android Mms application.
Da Risk <da_risk@beem-project.com>
parents:
diff changeset
    26
import android.text.style.ImageSpan;
c3598834218b Add SmileyParser from the android Mms application.
Da Risk <da_risk@beem-project.com>
parents:
diff changeset
    27
c3598834218b Add SmileyParser from the android Mms application.
Da Risk <da_risk@beem-project.com>
parents:
diff changeset
    28
import com.beem.project.beem.R;
c3598834218b Add SmileyParser from the android Mms application.
Da Risk <da_risk@beem-project.com>
parents:
diff changeset
    29
c3598834218b Add SmileyParser from the android Mms application.
Da Risk <da_risk@beem-project.com>
parents:
diff changeset
    30
/**
c3598834218b Add SmileyParser from the android Mms application.
Da Risk <da_risk@beem-project.com>
parents:
diff changeset
    31
 * A class for annotating a CharSequence with spans to convert textual emoticons
c3598834218b Add SmileyParser from the android Mms application.
Da Risk <da_risk@beem-project.com>
parents:
diff changeset
    32
 * to graphical ones.
c3598834218b Add SmileyParser from the android Mms application.
Da Risk <da_risk@beem-project.com>
parents:
diff changeset
    33
 */
c3598834218b Add SmileyParser from the android Mms application.
Da Risk <da_risk@beem-project.com>
parents:
diff changeset
    34
public class SmileyParser {
c3598834218b Add SmileyParser from the android Mms application.
Da Risk <da_risk@beem-project.com>
parents:
diff changeset
    35
    // Singleton stuff
c3598834218b Add SmileyParser from the android Mms application.
Da Risk <da_risk@beem-project.com>
parents:
diff changeset
    36
    private static SmileyParser sInstance;
c3598834218b Add SmileyParser from the android Mms application.
Da Risk <da_risk@beem-project.com>
parents:
diff changeset
    37
    public static SmileyParser getInstance() { return sInstance; }
c3598834218b Add SmileyParser from the android Mms application.
Da Risk <da_risk@beem-project.com>
parents:
diff changeset
    38
    public static void init(Context context) {
c3598834218b Add SmileyParser from the android Mms application.
Da Risk <da_risk@beem-project.com>
parents:
diff changeset
    39
        sInstance = new SmileyParser(context);
c3598834218b Add SmileyParser from the android Mms application.
Da Risk <da_risk@beem-project.com>
parents:
diff changeset
    40
    }
c3598834218b Add SmileyParser from the android Mms application.
Da Risk <da_risk@beem-project.com>
parents:
diff changeset
    41
c3598834218b Add SmileyParser from the android Mms application.
Da Risk <da_risk@beem-project.com>
parents:
diff changeset
    42
    private final Context mContext;
c3598834218b Add SmileyParser from the android Mms application.
Da Risk <da_risk@beem-project.com>
parents:
diff changeset
    43
    private final String[] mSmileyTexts;
c3598834218b Add SmileyParser from the android Mms application.
Da Risk <da_risk@beem-project.com>
parents:
diff changeset
    44
    private final Pattern mPattern;
c3598834218b Add SmileyParser from the android Mms application.
Da Risk <da_risk@beem-project.com>
parents:
diff changeset
    45
    private final HashMap<String, Integer> mSmileyToRes;
c3598834218b Add SmileyParser from the android Mms application.
Da Risk <da_risk@beem-project.com>
parents:
diff changeset
    46
c3598834218b Add SmileyParser from the android Mms application.
Da Risk <da_risk@beem-project.com>
parents:
diff changeset
    47
    private SmileyParser(Context context) {
c3598834218b Add SmileyParser from the android Mms application.
Da Risk <da_risk@beem-project.com>
parents:
diff changeset
    48
        mContext = context;
c3598834218b Add SmileyParser from the android Mms application.
Da Risk <da_risk@beem-project.com>
parents:
diff changeset
    49
        mSmileyTexts = mContext.getResources().getStringArray(DEFAULT_SMILEY_TEXTS);
c3598834218b Add SmileyParser from the android Mms application.
Da Risk <da_risk@beem-project.com>
parents:
diff changeset
    50
        mSmileyToRes = buildSmileyToRes();
c3598834218b Add SmileyParser from the android Mms application.
Da Risk <da_risk@beem-project.com>
parents:
diff changeset
    51
        mPattern = buildPattern();
c3598834218b Add SmileyParser from the android Mms application.
Da Risk <da_risk@beem-project.com>
parents:
diff changeset
    52
    }
c3598834218b Add SmileyParser from the android Mms application.
Da Risk <da_risk@beem-project.com>
parents:
diff changeset
    53
c3598834218b Add SmileyParser from the android Mms application.
Da Risk <da_risk@beem-project.com>
parents:
diff changeset
    54
    static class Smileys {
c3598834218b Add SmileyParser from the android Mms application.
Da Risk <da_risk@beem-project.com>
parents:
diff changeset
    55
        private static final int[] sIconIds = {
c3598834218b Add SmileyParser from the android Mms application.
Da Risk <da_risk@beem-project.com>
parents:
diff changeset
    56
            R.drawable.emo_im_happy,
c3598834218b Add SmileyParser from the android Mms application.
Da Risk <da_risk@beem-project.com>
parents:
diff changeset
    57
            R.drawable.emo_im_sad,
c3598834218b Add SmileyParser from the android Mms application.
Da Risk <da_risk@beem-project.com>
parents:
diff changeset
    58
            R.drawable.emo_im_winking,
c3598834218b Add SmileyParser from the android Mms application.
Da Risk <da_risk@beem-project.com>
parents:
diff changeset
    59
            R.drawable.emo_im_tongue_sticking_out,
c3598834218b Add SmileyParser from the android Mms application.
Da Risk <da_risk@beem-project.com>
parents:
diff changeset
    60
            R.drawable.emo_im_surprised,
c3598834218b Add SmileyParser from the android Mms application.
Da Risk <da_risk@beem-project.com>
parents:
diff changeset
    61
            R.drawable.emo_im_kissing,
c3598834218b Add SmileyParser from the android Mms application.
Da Risk <da_risk@beem-project.com>
parents:
diff changeset
    62
            R.drawable.emo_im_yelling,
c3598834218b Add SmileyParser from the android Mms application.
Da Risk <da_risk@beem-project.com>
parents:
diff changeset
    63
            R.drawable.emo_im_cool,
c3598834218b Add SmileyParser from the android Mms application.
Da Risk <da_risk@beem-project.com>
parents:
diff changeset
    64
            R.drawable.emo_im_money_mouth,
c3598834218b Add SmileyParser from the android Mms application.
Da Risk <da_risk@beem-project.com>
parents:
diff changeset
    65
            R.drawable.emo_im_foot_in_mouth,
c3598834218b Add SmileyParser from the android Mms application.
Da Risk <da_risk@beem-project.com>
parents:
diff changeset
    66
            R.drawable.emo_im_embarrassed,
c3598834218b Add SmileyParser from the android Mms application.
Da Risk <da_risk@beem-project.com>
parents:
diff changeset
    67
            R.drawable.emo_im_angel,
c3598834218b Add SmileyParser from the android Mms application.
Da Risk <da_risk@beem-project.com>
parents:
diff changeset
    68
            R.drawable.emo_im_undecided,
c3598834218b Add SmileyParser from the android Mms application.
Da Risk <da_risk@beem-project.com>
parents:
diff changeset
    69
            R.drawable.emo_im_crying,
c3598834218b Add SmileyParser from the android Mms application.
Da Risk <da_risk@beem-project.com>
parents:
diff changeset
    70
            R.drawable.emo_im_lips_are_sealed,
c3598834218b Add SmileyParser from the android Mms application.
Da Risk <da_risk@beem-project.com>
parents:
diff changeset
    71
            R.drawable.emo_im_laughing,
c3598834218b Add SmileyParser from the android Mms application.
Da Risk <da_risk@beem-project.com>
parents:
diff changeset
    72
            R.drawable.emo_im_wtf,
c3598834218b Add SmileyParser from the android Mms application.
Da Risk <da_risk@beem-project.com>
parents:
diff changeset
    73
            R.drawable.emo_im_heart,
c3598834218b Add SmileyParser from the android Mms application.
Da Risk <da_risk@beem-project.com>
parents:
diff changeset
    74
            R.drawable.emo_im_mad,
c3598834218b Add SmileyParser from the android Mms application.
Da Risk <da_risk@beem-project.com>
parents:
diff changeset
    75
            R.drawable.emo_im_smirk,
c3598834218b Add SmileyParser from the android Mms application.
Da Risk <da_risk@beem-project.com>
parents:
diff changeset
    76
            R.drawable.emo_im_pokerface
c3598834218b Add SmileyParser from the android Mms application.
Da Risk <da_risk@beem-project.com>
parents:
diff changeset
    77
        };
c3598834218b Add SmileyParser from the android Mms application.
Da Risk <da_risk@beem-project.com>
parents:
diff changeset
    78
c3598834218b Add SmileyParser from the android Mms application.
Da Risk <da_risk@beem-project.com>
parents:
diff changeset
    79
        public static int HAPPY = 0;
c3598834218b Add SmileyParser from the android Mms application.
Da Risk <da_risk@beem-project.com>
parents:
diff changeset
    80
        public static int SAD = 1;
c3598834218b Add SmileyParser from the android Mms application.
Da Risk <da_risk@beem-project.com>
parents:
diff changeset
    81
        public static int WINKING = 2;
c3598834218b Add SmileyParser from the android Mms application.
Da Risk <da_risk@beem-project.com>
parents:
diff changeset
    82
        public static int TONGUE_STICKING_OUT = 3;
c3598834218b Add SmileyParser from the android Mms application.
Da Risk <da_risk@beem-project.com>
parents:
diff changeset
    83
        public static int SURPRISED = 4;
c3598834218b Add SmileyParser from the android Mms application.
Da Risk <da_risk@beem-project.com>
parents:
diff changeset
    84
        public static int KISSING = 5;
c3598834218b Add SmileyParser from the android Mms application.
Da Risk <da_risk@beem-project.com>
parents:
diff changeset
    85
        public static int YELLING = 6;
c3598834218b Add SmileyParser from the android Mms application.
Da Risk <da_risk@beem-project.com>
parents:
diff changeset
    86
        public static int COOL = 7;
c3598834218b Add SmileyParser from the android Mms application.
Da Risk <da_risk@beem-project.com>
parents:
diff changeset
    87
        public static int MONEY_MOUTH = 8;
c3598834218b Add SmileyParser from the android Mms application.
Da Risk <da_risk@beem-project.com>
parents:
diff changeset
    88
        public static int FOOT_IN_MOUTH = 9;
c3598834218b Add SmileyParser from the android Mms application.
Da Risk <da_risk@beem-project.com>
parents:
diff changeset
    89
        public static int EMBARRASSED = 10;
c3598834218b Add SmileyParser from the android Mms application.
Da Risk <da_risk@beem-project.com>
parents:
diff changeset
    90
        public static int ANGEL = 11;
c3598834218b Add SmileyParser from the android Mms application.
Da Risk <da_risk@beem-project.com>
parents:
diff changeset
    91
        public static int UNDECIDED = 12;
c3598834218b Add SmileyParser from the android Mms application.
Da Risk <da_risk@beem-project.com>
parents:
diff changeset
    92
        public static int CRYING = 13;
c3598834218b Add SmileyParser from the android Mms application.
Da Risk <da_risk@beem-project.com>
parents:
diff changeset
    93
        public static int LIPS_ARE_SEALED = 14;
c3598834218b Add SmileyParser from the android Mms application.
Da Risk <da_risk@beem-project.com>
parents:
diff changeset
    94
        public static int LAUGHING = 15;
c3598834218b Add SmileyParser from the android Mms application.
Da Risk <da_risk@beem-project.com>
parents:
diff changeset
    95
        public static int WTF = 16;
c3598834218b Add SmileyParser from the android Mms application.
Da Risk <da_risk@beem-project.com>
parents:
diff changeset
    96
        public static int MAD = 17;
c3598834218b Add SmileyParser from the android Mms application.
Da Risk <da_risk@beem-project.com>
parents:
diff changeset
    97
        public static int HEART = 18;
c3598834218b Add SmileyParser from the android Mms application.
Da Risk <da_risk@beem-project.com>
parents:
diff changeset
    98
        public static int SMIRK = 19;
c3598834218b Add SmileyParser from the android Mms application.
Da Risk <da_risk@beem-project.com>
parents:
diff changeset
    99
        public static int POKERFACE = 20;
c3598834218b Add SmileyParser from the android Mms application.
Da Risk <da_risk@beem-project.com>
parents:
diff changeset
   100
c3598834218b Add SmileyParser from the android Mms application.
Da Risk <da_risk@beem-project.com>
parents:
diff changeset
   101
        public static int getSmileyResource(int which) {
c3598834218b Add SmileyParser from the android Mms application.
Da Risk <da_risk@beem-project.com>
parents:
diff changeset
   102
            return sIconIds[which];
c3598834218b Add SmileyParser from the android Mms application.
Da Risk <da_risk@beem-project.com>
parents:
diff changeset
   103
        }
c3598834218b Add SmileyParser from the android Mms application.
Da Risk <da_risk@beem-project.com>
parents:
diff changeset
   104
    }
c3598834218b Add SmileyParser from the android Mms application.
Da Risk <da_risk@beem-project.com>
parents:
diff changeset
   105
c3598834218b Add SmileyParser from the android Mms application.
Da Risk <da_risk@beem-project.com>
parents:
diff changeset
   106
    // NOTE: if you change anything about this array, you must make the corresponding change
c3598834218b Add SmileyParser from the android Mms application.
Da Risk <da_risk@beem-project.com>
parents:
diff changeset
   107
    // to the string arrays: default_smiley_texts and default_smiley_names in res/values/arrays.xml
c3598834218b Add SmileyParser from the android Mms application.
Da Risk <da_risk@beem-project.com>
parents:
diff changeset
   108
    public static final int[] DEFAULT_SMILEY_RES_IDS = {
c3598834218b Add SmileyParser from the android Mms application.
Da Risk <da_risk@beem-project.com>
parents:
diff changeset
   109
        Smileys.getSmileyResource(Smileys.HAPPY),                //  0
c3598834218b Add SmileyParser from the android Mms application.
Da Risk <da_risk@beem-project.com>
parents:
diff changeset
   110
        Smileys.getSmileyResource(Smileys.SAD),                  //  1
c3598834218b Add SmileyParser from the android Mms application.
Da Risk <da_risk@beem-project.com>
parents:
diff changeset
   111
        Smileys.getSmileyResource(Smileys.WINKING),              //  2
c3598834218b Add SmileyParser from the android Mms application.
Da Risk <da_risk@beem-project.com>
parents:
diff changeset
   112
        Smileys.getSmileyResource(Smileys.TONGUE_STICKING_OUT),  //  3
c3598834218b Add SmileyParser from the android Mms application.
Da Risk <da_risk@beem-project.com>
parents:
diff changeset
   113
        Smileys.getSmileyResource(Smileys.SURPRISED),            //  4
c3598834218b Add SmileyParser from the android Mms application.
Da Risk <da_risk@beem-project.com>
parents:
diff changeset
   114
        Smileys.getSmileyResource(Smileys.KISSING),              //  5
c3598834218b Add SmileyParser from the android Mms application.
Da Risk <da_risk@beem-project.com>
parents:
diff changeset
   115
        Smileys.getSmileyResource(Smileys.YELLING),              //  6
c3598834218b Add SmileyParser from the android Mms application.
Da Risk <da_risk@beem-project.com>
parents:
diff changeset
   116
        Smileys.getSmileyResource(Smileys.COOL),                 //  7
c3598834218b Add SmileyParser from the android Mms application.
Da Risk <da_risk@beem-project.com>
parents:
diff changeset
   117
        Smileys.getSmileyResource(Smileys.MONEY_MOUTH),          //  8
c3598834218b Add SmileyParser from the android Mms application.
Da Risk <da_risk@beem-project.com>
parents:
diff changeset
   118
        Smileys.getSmileyResource(Smileys.FOOT_IN_MOUTH),        //  9
c3598834218b Add SmileyParser from the android Mms application.
Da Risk <da_risk@beem-project.com>
parents:
diff changeset
   119
        Smileys.getSmileyResource(Smileys.EMBARRASSED),          //  10
c3598834218b Add SmileyParser from the android Mms application.
Da Risk <da_risk@beem-project.com>
parents:
diff changeset
   120
        Smileys.getSmileyResource(Smileys.ANGEL),                //  11
c3598834218b Add SmileyParser from the android Mms application.
Da Risk <da_risk@beem-project.com>
parents:
diff changeset
   121
        Smileys.getSmileyResource(Smileys.UNDECIDED),            //  12
c3598834218b Add SmileyParser from the android Mms application.
Da Risk <da_risk@beem-project.com>
parents:
diff changeset
   122
        Smileys.getSmileyResource(Smileys.CRYING),               //  13
c3598834218b Add SmileyParser from the android Mms application.
Da Risk <da_risk@beem-project.com>
parents:
diff changeset
   123
        Smileys.getSmileyResource(Smileys.LIPS_ARE_SEALED),      //  14
c3598834218b Add SmileyParser from the android Mms application.
Da Risk <da_risk@beem-project.com>
parents:
diff changeset
   124
        Smileys.getSmileyResource(Smileys.LAUGHING),             //  15
c3598834218b Add SmileyParser from the android Mms application.
Da Risk <da_risk@beem-project.com>
parents:
diff changeset
   125
        Smileys.getSmileyResource(Smileys.WTF),                  //  16
c3598834218b Add SmileyParser from the android Mms application.
Da Risk <da_risk@beem-project.com>
parents:
diff changeset
   126
        Smileys.getSmileyResource(Smileys.MAD),                  //  17
c3598834218b Add SmileyParser from the android Mms application.
Da Risk <da_risk@beem-project.com>
parents:
diff changeset
   127
        Smileys.getSmileyResource(Smileys.HEART),                //  18
c3598834218b Add SmileyParser from the android Mms application.
Da Risk <da_risk@beem-project.com>
parents:
diff changeset
   128
        Smileys.getSmileyResource(Smileys.SMIRK),                //  19
c3598834218b Add SmileyParser from the android Mms application.
Da Risk <da_risk@beem-project.com>
parents:
diff changeset
   129
        Smileys.getSmileyResource(Smileys.POKERFACE),            //  20
c3598834218b Add SmileyParser from the android Mms application.
Da Risk <da_risk@beem-project.com>
parents:
diff changeset
   130
    };
c3598834218b Add SmileyParser from the android Mms application.
Da Risk <da_risk@beem-project.com>
parents:
diff changeset
   131
c3598834218b Add SmileyParser from the android Mms application.
Da Risk <da_risk@beem-project.com>
parents:
diff changeset
   132
    public static final int DEFAULT_SMILEY_TEXTS = R.array.default_smiley_texts;
c3598834218b Add SmileyParser from the android Mms application.
Da Risk <da_risk@beem-project.com>
parents:
diff changeset
   133
    public static final int DEFAULT_SMILEY_NAMES = R.array.default_smiley_names;
c3598834218b Add SmileyParser from the android Mms application.
Da Risk <da_risk@beem-project.com>
parents:
diff changeset
   134
c3598834218b Add SmileyParser from the android Mms application.
Da Risk <da_risk@beem-project.com>
parents:
diff changeset
   135
    /**
c3598834218b Add SmileyParser from the android Mms application.
Da Risk <da_risk@beem-project.com>
parents:
diff changeset
   136
     * Builds the hashtable we use for mapping the string version
c3598834218b Add SmileyParser from the android Mms application.
Da Risk <da_risk@beem-project.com>
parents:
diff changeset
   137
     * of a smiley (e.g. ":-)") to a resource ID for the icon version.
c3598834218b Add SmileyParser from the android Mms application.
Da Risk <da_risk@beem-project.com>
parents:
diff changeset
   138
     */
c3598834218b Add SmileyParser from the android Mms application.
Da Risk <da_risk@beem-project.com>
parents:
diff changeset
   139
    private HashMap<String, Integer> buildSmileyToRes() {
c3598834218b Add SmileyParser from the android Mms application.
Da Risk <da_risk@beem-project.com>
parents:
diff changeset
   140
        if (DEFAULT_SMILEY_RES_IDS.length != mSmileyTexts.length) {
c3598834218b Add SmileyParser from the android Mms application.
Da Risk <da_risk@beem-project.com>
parents:
diff changeset
   141
            // Throw an exception if someone updated DEFAULT_SMILEY_RES_IDS
c3598834218b Add SmileyParser from the android Mms application.
Da Risk <da_risk@beem-project.com>
parents:
diff changeset
   142
            // and failed to update arrays.xml
c3598834218b Add SmileyParser from the android Mms application.
Da Risk <da_risk@beem-project.com>
parents:
diff changeset
   143
            throw new IllegalStateException("Smiley resource ID/text mismatch");
c3598834218b Add SmileyParser from the android Mms application.
Da Risk <da_risk@beem-project.com>
parents:
diff changeset
   144
        }
c3598834218b Add SmileyParser from the android Mms application.
Da Risk <da_risk@beem-project.com>
parents:
diff changeset
   145
c3598834218b Add SmileyParser from the android Mms application.
Da Risk <da_risk@beem-project.com>
parents:
diff changeset
   146
        HashMap<String, Integer> smileyToRes =
c3598834218b Add SmileyParser from the android Mms application.
Da Risk <da_risk@beem-project.com>
parents:
diff changeset
   147
                            new HashMap<String, Integer>(mSmileyTexts.length);
c3598834218b Add SmileyParser from the android Mms application.
Da Risk <da_risk@beem-project.com>
parents:
diff changeset
   148
        for (int i = 0; i < mSmileyTexts.length; i++) {
c3598834218b Add SmileyParser from the android Mms application.
Da Risk <da_risk@beem-project.com>
parents:
diff changeset
   149
            smileyToRes.put(mSmileyTexts[i], DEFAULT_SMILEY_RES_IDS[i]);
c3598834218b Add SmileyParser from the android Mms application.
Da Risk <da_risk@beem-project.com>
parents:
diff changeset
   150
        }
c3598834218b Add SmileyParser from the android Mms application.
Da Risk <da_risk@beem-project.com>
parents:
diff changeset
   151
c3598834218b Add SmileyParser from the android Mms application.
Da Risk <da_risk@beem-project.com>
parents:
diff changeset
   152
        return smileyToRes;
c3598834218b Add SmileyParser from the android Mms application.
Da Risk <da_risk@beem-project.com>
parents:
diff changeset
   153
    }
c3598834218b Add SmileyParser from the android Mms application.
Da Risk <da_risk@beem-project.com>
parents:
diff changeset
   154
c3598834218b Add SmileyParser from the android Mms application.
Da Risk <da_risk@beem-project.com>
parents:
diff changeset
   155
    /**
c3598834218b Add SmileyParser from the android Mms application.
Da Risk <da_risk@beem-project.com>
parents:
diff changeset
   156
     * Builds the regular expression we use to find smileys in {@link #addSmileySpans}.
c3598834218b Add SmileyParser from the android Mms application.
Da Risk <da_risk@beem-project.com>
parents:
diff changeset
   157
     */
c3598834218b Add SmileyParser from the android Mms application.
Da Risk <da_risk@beem-project.com>
parents:
diff changeset
   158
    private Pattern buildPattern() {
c3598834218b Add SmileyParser from the android Mms application.
Da Risk <da_risk@beem-project.com>
parents:
diff changeset
   159
        // Set the StringBuilder capacity with the assumption that the average
c3598834218b Add SmileyParser from the android Mms application.
Da Risk <da_risk@beem-project.com>
parents:
diff changeset
   160
        // smiley is 3 characters long.
c3598834218b Add SmileyParser from the android Mms application.
Da Risk <da_risk@beem-project.com>
parents:
diff changeset
   161
        StringBuilder patternString = new StringBuilder(mSmileyTexts.length * 3);
c3598834218b Add SmileyParser from the android Mms application.
Da Risk <da_risk@beem-project.com>
parents:
diff changeset
   162
c3598834218b Add SmileyParser from the android Mms application.
Da Risk <da_risk@beem-project.com>
parents:
diff changeset
   163
        // Build a regex that looks like (:-)|:-(|...), but escaping the smilies
c3598834218b Add SmileyParser from the android Mms application.
Da Risk <da_risk@beem-project.com>
parents:
diff changeset
   164
        // properly so they will be interpreted literally by the regex matcher.
c3598834218b Add SmileyParser from the android Mms application.
Da Risk <da_risk@beem-project.com>
parents:
diff changeset
   165
        patternString.append('(');
c3598834218b Add SmileyParser from the android Mms application.
Da Risk <da_risk@beem-project.com>
parents:
diff changeset
   166
        for (String s : mSmileyTexts) {
c3598834218b Add SmileyParser from the android Mms application.
Da Risk <da_risk@beem-project.com>
parents:
diff changeset
   167
            patternString.append(Pattern.quote(s));
c3598834218b Add SmileyParser from the android Mms application.
Da Risk <da_risk@beem-project.com>
parents:
diff changeset
   168
            patternString.append('|');
c3598834218b Add SmileyParser from the android Mms application.
Da Risk <da_risk@beem-project.com>
parents:
diff changeset
   169
        }
c3598834218b Add SmileyParser from the android Mms application.
Da Risk <da_risk@beem-project.com>
parents:
diff changeset
   170
        // Replace the extra '|' with a ')'
c3598834218b Add SmileyParser from the android Mms application.
Da Risk <da_risk@beem-project.com>
parents:
diff changeset
   171
        patternString.replace(patternString.length() - 1, patternString.length(), ")");
c3598834218b Add SmileyParser from the android Mms application.
Da Risk <da_risk@beem-project.com>
parents:
diff changeset
   172
c3598834218b Add SmileyParser from the android Mms application.
Da Risk <da_risk@beem-project.com>
parents:
diff changeset
   173
        return Pattern.compile(patternString.toString());
c3598834218b Add SmileyParser from the android Mms application.
Da Risk <da_risk@beem-project.com>
parents:
diff changeset
   174
    }
c3598834218b Add SmileyParser from the android Mms application.
Da Risk <da_risk@beem-project.com>
parents:
diff changeset
   175
c3598834218b Add SmileyParser from the android Mms application.
Da Risk <da_risk@beem-project.com>
parents:
diff changeset
   176
c3598834218b Add SmileyParser from the android Mms application.
Da Risk <da_risk@beem-project.com>
parents:
diff changeset
   177
    /**
c3598834218b Add SmileyParser from the android Mms application.
Da Risk <da_risk@beem-project.com>
parents:
diff changeset
   178
     * Adds ImageSpans to a CharSequence that replace textual emoticons such
c3598834218b Add SmileyParser from the android Mms application.
Da Risk <da_risk@beem-project.com>
parents:
diff changeset
   179
     * as :-) with a graphical version.
c3598834218b Add SmileyParser from the android Mms application.
Da Risk <da_risk@beem-project.com>
parents:
diff changeset
   180
     *
c3598834218b Add SmileyParser from the android Mms application.
Da Risk <da_risk@beem-project.com>
parents:
diff changeset
   181
     * @param text A CharSequence possibly containing emoticons
c3598834218b Add SmileyParser from the android Mms application.
Da Risk <da_risk@beem-project.com>
parents:
diff changeset
   182
     * @return A CharSequence annotated with ImageSpans covering any
c3598834218b Add SmileyParser from the android Mms application.
Da Risk <da_risk@beem-project.com>
parents:
diff changeset
   183
     *         recognized emoticons.
c3598834218b Add SmileyParser from the android Mms application.
Da Risk <da_risk@beem-project.com>
parents:
diff changeset
   184
     */
c3598834218b Add SmileyParser from the android Mms application.
Da Risk <da_risk@beem-project.com>
parents:
diff changeset
   185
    public CharSequence addSmileySpans(CharSequence text) {
c3598834218b Add SmileyParser from the android Mms application.
Da Risk <da_risk@beem-project.com>
parents:
diff changeset
   186
        SpannableStringBuilder builder = new SpannableStringBuilder(text);
c3598834218b Add SmileyParser from the android Mms application.
Da Risk <da_risk@beem-project.com>
parents:
diff changeset
   187
c3598834218b Add SmileyParser from the android Mms application.
Da Risk <da_risk@beem-project.com>
parents:
diff changeset
   188
        Matcher matcher = mPattern.matcher(text);
c3598834218b Add SmileyParser from the android Mms application.
Da Risk <da_risk@beem-project.com>
parents:
diff changeset
   189
        while (matcher.find()) {
c3598834218b Add SmileyParser from the android Mms application.
Da Risk <da_risk@beem-project.com>
parents:
diff changeset
   190
            int resId = mSmileyToRes.get(matcher.group());
c3598834218b Add SmileyParser from the android Mms application.
Da Risk <da_risk@beem-project.com>
parents:
diff changeset
   191
            builder.setSpan(new ImageSpan(mContext, resId),
c3598834218b Add SmileyParser from the android Mms application.
Da Risk <da_risk@beem-project.com>
parents:
diff changeset
   192
                            matcher.start(), matcher.end(),
c3598834218b Add SmileyParser from the android Mms application.
Da Risk <da_risk@beem-project.com>
parents:
diff changeset
   193
                            Spannable.SPAN_EXCLUSIVE_EXCLUSIVE);
c3598834218b Add SmileyParser from the android Mms application.
Da Risk <da_risk@beem-project.com>
parents:
diff changeset
   194
        }
c3598834218b Add SmileyParser from the android Mms application.
Da Risk <da_risk@beem-project.com>
parents:
diff changeset
   195
c3598834218b Add SmileyParser from the android Mms application.
Da Risk <da_risk@beem-project.com>
parents:
diff changeset
   196
        return builder;
c3598834218b Add SmileyParser from the android Mms application.
Da Risk <da_risk@beem-project.com>
parents:
diff changeset
   197
    }
c3598834218b Add SmileyParser from the android Mms application.
Da Risk <da_risk@beem-project.com>
parents:
diff changeset
   198
}
c3598834218b Add SmileyParser from the android Mms application.
Da Risk <da_risk@beem-project.com>
parents:
diff changeset
   199
c3598834218b Add SmileyParser from the android Mms application.
Da Risk <da_risk@beem-project.com>
parents:
diff changeset
   200