Search code examples
androidemoticons

Convert drawable to a specific string


I have a chat app which I want to extend with emoticons.

This code is used to insert a smilie in the text:

   Spanned cs = Html.fromHtml("<img src ='"+ index +"'/>", imageGetter, null);     

   int cursorPosition = content.getSelectionStart();        
   content.getText().insert(cursorPosition, cs);

This is working great. The smilies show up in the textView at the right place.

Now I want to send the text to my server via HTTP. I would like to store ":)" instead of the image as for ones using an older app version the image can not be displayed. In the new version I convert ":)" to the image before displaying the text. Is there any way to convert the image to a specific string?


Solution

  • if you want to replace your emoticons try this:

    EditText et = new EditText(this);
    et.setTextSize(24);
    et.setHint("this view shows \":)\" as an emoticon, try to type \":)\" somewhere");
    final Bitmap smile = BitmapFactory.decodeResource(getResources(), R.drawable.emo_im_happy);
    final Pattern pattern = Pattern.compile(":\\)");
    TextWatcher watcher = new TextWatcher() {
    boolean fastReplace = true; 
        @Override
        public void onTextChanged(CharSequence s, int start, int before, int count) {
            //Log.d(TAG, "onTextChanged " + start + " " + before + " " + count);
            if (fastReplace) {
                if (start > 0 && count > 0) {
                    String sub = s.subSequence(start - 1, start + 1).toString();
                    if (sub.equals(":)")) {
                        Spannable spannable = (Spannable) s;
                        ImageSpan smileSpan = new ImageSpan(smile);
                        spannable.setSpan(smileSpan, start-1, start+1, Spannable.SPAN_EXCLUSIVE_EXCLUSIVE);
                    }
                }
            } else {
                Spannable spannable = (Spannable) s;
                Matcher matcher = pattern.matcher(s);
                while (matcher.find()) {
                    int mstart = matcher.start();
                    int mend = matcher.end();
                    ImageSpan[] spans = spannable.getSpans(mstart, mend, ImageSpan.class);
                    Log.d(TAG, "onTextChanged " + mstart + " " + mend + " " + spans.length);
                    if (spans.length == 0) {
                        ImageSpan smileSpan = new ImageSpan(smile);
                        spannable.setSpan(smileSpan, mstart, mend, Spannable.SPAN_EXCLUSIVE_EXCLUSIVE);
                    }
                }
            }
            Log.d(TAG, "onTextChanged " + s);
        }
    
        @Override
        public void beforeTextChanged(CharSequence s, int start, int count, int after) {
        }
    
        @Override
        public void afterTextChanged(Editable s) {
            Log.d(TAG, "afterTextChanged " + s);
        }
    };
    et.addTextChangedListener(watcher );
    
    setContentView(et);
    

    here if fastReplace == true you don't have to scan the whole text but it's only minimal implementation: works only if you type ")" right after typed ":", if fastReplace == false it replaces every occurrence of ":)" with a smiley but it has to scan the whole text so it's a bit slower when text is quite large