19066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project/*
29066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Copyright (C) 2007 The Android Open Source Project
39066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *
49066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Licensed under the Apache License, Version 2.0 (the "License");
59066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * you may not use this file except in compliance with the License.
69066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * You may obtain a copy of the License at
79066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *
89066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *      http://www.apache.org/licenses/LICENSE-2.0
99066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *
109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Unless required by applicable law or agreed to in writing, software
119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * distributed under the License is distributed on an "AS IS" BASIS,
129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * See the License for the specific language governing permissions and
149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * limitations under the License.
159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */
169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectpackage com.google.android.util;
189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.content.Context;
209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.text.Spannable;
219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.text.SpannableStringBuilder;
229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.text.style.ImageSpan;
239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport java.util.ArrayList;
259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project/**
279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Parses a text message typed by the user looking for smileys.
289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */
299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectpublic class SmileyParser extends AbstractMessageParser {
309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private SmileyResources mRes;
329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public SmileyParser(String text, SmileyResources res) {
349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        super(text,
359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                true,   // smilies
369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                false,  // acronyms
379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                false,  // formatting
389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                false,  // urls
399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                false,  // music
409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                false   // me text
419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        );
429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mRes = res;
439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    @Override
469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    protected Resources getResources() {
479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return mRes;
489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Retrieves the parsed text as a spannable string object.
529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @param context the context for fetching smiley resources.
539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @return the spannable string as CharSequence.
549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public CharSequence getSpannableString(Context context) {
569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        SpannableStringBuilder builder = new SpannableStringBuilder();
579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (getPartCount() == 0) {
599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            return "";
609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        // should have only one part since we parse smiley only
639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        Part part = getPart(0);
649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        ArrayList<Token> tokens = part.getTokens();
659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        int len = tokens.size();
669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        for (int i = 0; i < len; i++) {
679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            Token token = tokens.get(i);
689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            int start = builder.length();
699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            builder.append(token.getRawText());
709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if (token.getType() == AbstractMessageParser.Token.Type.SMILEY) {
719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                int resid = mRes.getSmileyRes(token.getRawText());
729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                if (resid != -1) {
739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    builder.setSpan(new ImageSpan(context, resid),
749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                            start,
759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                            builder.length(),
769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                            Spannable.SPAN_EXCLUSIVE_EXCLUSIVE);
779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                }
789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return builder;
819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project}
84