Example #1
0
 /**
  * replace existing spannable with smiles
  *
  * @param context
  * @param spannable
  * @return
  */
 public static boolean addSmiles(Context context, Spannable spannable) {
   boolean hasChanges = false;
   for (Entry<Pattern, Integer> entry : emoticons.entrySet()) {
     Matcher matcher = entry.getKey().matcher(spannable);
     while (matcher.find()) {
       boolean set = true;
       for (ImageSpan span : spannable.getSpans(matcher.start(), matcher.end(), ImageSpan.class))
         if (spannable.getSpanStart(span) >= matcher.start()
             && spannable.getSpanEnd(span) <= matcher.end()) spannable.removeSpan(span);
         else {
           set = false;
           break;
         }
       if (set) {
         hasChanges = true;
         spannable.setSpan(
             new ImageSpan(context, entry.getValue()),
             matcher.start(),
             matcher.end(),
             Spannable.SPAN_EXCLUSIVE_EXCLUSIVE);
       }
     }
   }
   return hasChanges;
 }
Example #2
0
 public static Spannable getSmiledText(Context context, CharSequence text) {
   Spannable spannable = spannableFactory.newSpannable(text);
   for (Entry entry : ANDROID_EMOTICONS.entrySet()) {
     Matcher matcher = ((Pattern) entry.getKey()).matcher(spannable);
     while (matcher.find()) {
       for (Object obj :
           (ImageSpan[]) spannable.getSpans(matcher.start(), matcher.end(), ImageSpan.class)) {
         if (spannable.getSpanStart(obj) < matcher.start()
             || spannable.getSpanEnd(obj) > matcher.end()) {
           Object obj2 = null;
           break;
         }
         spannable.removeSpan(obj);
       }
       int i = 1;
       if (obj2 != null) {
         spannable.setSpan(
             new ImageSpan(context, ((Integer) entry.getValue()).intValue()),
             matcher.start(),
             matcher.end(),
             33);
       }
     }
   }
   return spannable;
 }
Example #3
0
  public boolean addImages(Context context, Spannable spannable) {
    Pattern refImg = Pattern.compile("\\Q[img src=\\E([a-zA-Z0-9_]+?)\\Q/]\\E");
    boolean hasChanges = false;

    Matcher matcher = refImg.matcher(spannable);
    while (matcher.find()) {
      boolean set = true;
      for (ImageSpan span : spannable.getSpans(matcher.start(), matcher.end(), ImageSpan.class)) {
        if (spannable.getSpanStart(span) >= matcher.start()
            && spannable.getSpanEnd(span) <= matcher.end()) {
          spannable.removeSpan(span);
        } else {
          set = false;
          break;
        }
      }
      String resname = spannable.subSequence(matcher.start(1), matcher.end(1)).toString().trim();
      int id = context.getResources().getIdentifier(resname, "drawable", context.getPackageName());
      Drawable icon = context.getResources().getDrawable(id); // ,this.getTheme());
      icon.setBounds(0, 0, tv_test1.getLineHeight(), tv_test1.getLineHeight());
      if (set) {
        hasChanges = true;
        spannable.setSpan(
            new ImageSpan(icon, ImageSpan.ALIGN_BASELINE),
            matcher.start(),
            matcher.end(),
            Spannable.SPAN_EXCLUSIVE_EXCLUSIVE);
      }
    }
    return hasChanges;
  }
 @Override
 public boolean onTouchEvent(TextView textView, Spannable spannable, MotionEvent event) {
   if (event.getAction() == MotionEvent.ACTION_DOWN) {
     mPressedSpan = getPressedSpan(textView, spannable, event);
     if (mPressedSpan != null) {
       mPressedSpan.setPressed(true);
       Selection.setSelection(
           spannable, spannable.getSpanStart(mPressedSpan), spannable.getSpanEnd(mPressedSpan));
     }
   } else if (event.getAction() == MotionEvent.ACTION_MOVE) {
     TouchableSpan touchedSpan = getPressedSpan(textView, spannable, event);
     if (mPressedSpan != null && touchedSpan != mPressedSpan) {
       mPressedSpan.setPressed(false);
       mPressedSpan = null;
       Selection.removeSelection(spannable);
     }
   } else {
     if (mPressedSpan != null) {
       mPressedSpan.setPressed(false);
       super.onTouchEvent(textView, spannable, event);
     }
     mPressedSpan = null;
     Selection.removeSelection(spannable);
   }
   return true;
 }
Example #5
0
  @Override
  public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);

    tv = new TextView(this);
    ctx = this;

    String htmlLinkText = "我是超链接" + "<a href='lianjie'><font color='red'>超链接点击事件</font></a>";
    // 文字的样式(style)被覆盖,不能改变……

    tv.setText(Html.fromHtml(htmlLinkText));
    tv.setMovementMethod(LinkMovementMethod.getInstance());
    CharSequence text = tv.getText();
    if (text instanceof Spannable) {
      int end = text.length();
      Spannable sp = (Spannable) tv.getText();
      URLSpan[] urls = sp.getSpans(0, end, URLSpan.class);
      SpannableStringBuilder style = new SpannableStringBuilder(text);
      style.clearSpans(); // should clear old spans

      // 循环把链接发过去
      for (URLSpan url : urls) {
        MyURLSpan myURLSpan = new MyURLSpan(url.getURL());
        style.setSpan(
            myURLSpan,
            sp.getSpanStart(url),
            sp.getSpanEnd(url),
            Spannable.SPAN_EXCLUSIVE_INCLUSIVE);
      }
      tv.setText(style);
    }
    setContentView(tv);
  }
Example #6
0
  @Override
  public boolean onTouchEvent(MotionEvent event) {
    CharSequence text = getText();
    int action = event.getAction();

    if (!(text instanceof Spannable)) {
      return super.onTouchEvent(event);
    }

    Spannable buffer = (Spannable) text;

    if (action == MotionEvent.ACTION_UP
        || action == MotionEvent.ACTION_DOWN
        || action == MotionEvent.ACTION_MOVE) {
      TextView widget = this;

      int x = (int) event.getX();
      int y = (int) event.getY();

      x -= widget.getTotalPaddingLeft();
      y -= widget.getTotalPaddingTop();

      x += widget.getScrollX();
      y += widget.getScrollY();

      Layout layout = widget.getLayout();
      int line = layout.getLineForVertical(y);
      int off = layout.getOffsetForHorizontal(line, x);

      URLSpan[] link = buffer.getSpans(off, off, URLSpan.class);

      if (link.length != 0) {
        if (action == MotionEvent.ACTION_UP) {
          if (mCurrentLink == link[0]) {
            link[0].onClick(widget);
          }
          mCurrentLink = null;
          buffer.removeSpan(mLinkFocusStyle);
        } else if (action == MotionEvent.ACTION_DOWN) {
          mCurrentLink = link[0];
          buffer.setSpan(
              mLinkFocusStyle,
              buffer.getSpanStart(link[0]),
              buffer.getSpanEnd(link[0]),
              Spanned.SPAN_EXCLUSIVE_EXCLUSIVE);
        }

        return true;
      }
    }

    mCurrentLink = null;
    buffer.removeSpan(mLinkFocusStyle);

    return super.onTouchEvent(event);
  }
 public static Spanned toSpanned(
     final Context context, final String toastString, @ColorRes final int toastColor) {
   final String string = "" + context.getResources().getColor(toastColor);
   final Spannable spannable =
       (Spannable) Html.fromHtml(colorize_a(colorize_em(toastString, string, true), string));
   for (final URLSpan urlSpan :
       (URLSpan[]) spannable.getSpans(0, spannable.length(), (Class) URLSpan.class)) {
     spannable.setSpan(urlSpan, spannable.getSpanStart(urlSpan), spannable.getSpanEnd(urlSpan), 0);
   }
   return spannable;
 }
 private void stripUnderlines(TextView textView) {
   Spannable s = (Spannable) textView.getText();
   URLSpan[] spans = s.getSpans(0, s.length(), URLSpan.class);
   for (URLSpan span : spans) {
     int start = s.getSpanStart(span);
     int end = s.getSpanEnd(span);
     s.removeSpan(span);
     span = new URLSpanNoUnderline(span.getURL());
     s.setSpan(span, start, end, 0);
   }
   textView.setText(s);
 }
Example #9
0
 /**
  * 清除textview链接的下划线
  *
  * @param textView
  */
 public static void removeLinkUnderline(TextView textView) {
   Spannable s = Spannable.Factory.getInstance().newSpannable(textView.getText());
   URLSpan[] spans = s.getSpans(0, s.length(), URLSpan.class);
   for (URLSpan span : spans) {
     int start = s.getSpanStart(span);
     int end = s.getSpanEnd(span);
     s.removeSpan(span);
     span = new TweetURLSpan(span.getURL());
     s.setSpan(span, start, end, 0);
   }
   textView.setText(s);
 }
  /**
   * Removes any {@link android.text.style.URLSpan}s from the Spannable and replaces them with a
   * non-underline version {@link LinkStyleSpan} which calls the supplied listener when clicked.
   */
  public static void stripUnderlinesAndLinkUrls(
      Spannable input, View.OnClickListener onClickListener) {
    final URLSpan[] urls = input.getSpans(0, input.length(), URLSpan.class);

    for (URLSpan span : urls) {
      final int start = input.getSpanStart(span);
      final int end = input.getSpanEnd(span);
      input.removeSpan(span);
      input.setSpan(
          new LinkStyleSpan(onClickListener), start, end, Spanned.SPAN_EXCLUSIVE_EXCLUSIVE);
    }
  }
Example #11
0
 public static Spannable changeHyperlinkColor(
     String content, Html.ImageGetter imageGetter, Html.TagHandler tagHandler, int color) {
   Spannable s = (Spannable) Html.fromHtml(content, imageGetter, tagHandler);
   URLSpan[] spans = s.getSpans(0, s.length(), URLSpan.class);
   for (URLSpan span : spans) {
     int start = s.getSpanStart(span);
     int end = s.getSpanEnd(span);
     s.removeSpan(span);
     span = new URLSpanNoUnderline(span.getURL(), color);
     s.setSpan(span, start, end, 0);
   }
   return s;
 }
Example #12
0
  public static Spannable recentMessage(
      String content, Html.ImageGetter imageGetter, Html.TagHandler tagHandler) {
    String parse = parseNoMonkeyImage(content);

    Spannable s = (Spannable) Html.fromHtml(parse, imageGetter, null);
    URLSpan[] spans = s.getSpans(0, s.length(), URLSpan.class);
    for (URLSpan span : spans) {
      int start = s.getSpanStart(span);
      int end = s.getSpanEnd(span);
      s.removeSpan(span);
      span = new URLSpanNoUnderline(span.getURL(), 0xff999999);
      s.setSpan(span, start, end, 0);
    }
    return s;
  }
    public void run() {
      Spannable buf = mBuffer;

      if (buf != null) {
        int st = Selection.getSelectionStart(buf);
        int en = Selection.getSelectionEnd(buf);

        int start = buf.getSpanStart(TextKeyListener.ACTIVE);
        int end = buf.getSpanEnd(TextKeyListener.ACTIVE);

        if (st == start && en == end) {
          Selection.setSelection(buf, Selection.getSelectionEnd(buf));
        }

        buf.removeSpan(Timeout.this);
      }
    }
Example #14
0
 public static CharSequence getHtmlText(String text) {
   // fixes an android bug (?): text layout fails on text with nested style tags
   text = removeNestedTags(text, new String[] {"i", "b", "strong"});
   final Spanned htmlText = Html.fromHtml(text);
   if (htmlText.getSpans(0, htmlText.length(), URLSpan.class).length == 0) {
     return htmlText;
   }
   final Spannable newHtmlText = Spannable.Factory.getInstance().newSpannable(htmlText);
   for (URLSpan span : newHtmlText.getSpans(0, newHtmlText.length(), URLSpan.class)) {
     final int start = newHtmlText.getSpanStart(span);
     final int end = newHtmlText.getSpanEnd(span);
     final int flags = newHtmlText.getSpanFlags(span);
     final String url = NetworkLibrary.Instance().rewriteUrl(span.getURL(), true);
     newHtmlText.removeSpan(span);
     newHtmlText.setSpan(new URLSpan(url), start, end, flags);
   }
   return newHtmlText;
 }
Example #15
0
    /** 覆寫觸控事件,分辨出是否為連結的點擊。 */
    @Override
    public boolean onTouchEvent(TextView widget, Spannable buffer, MotionEvent event) {
      int action = event.getAction(); // 取得事件類型

      if (action == MotionEvent.ACTION_UP || action == MotionEvent.ACTION_DOWN) {
        int x = (int) event.getX();
        int y = (int) event.getY();

        x -= widget.getTotalPaddingLeft();
        y -= widget.getTotalPaddingTop();

        x += widget.getScrollX();
        y += widget.getScrollY();

        Layout layout = widget.getLayout();
        int line = layout.getLineForVertical(y);
        int off = layout.getOffsetForHorizontal(line, x);

        ClickableSpan[] link = buffer.getSpans(off, off, ClickableSpan.class);

        if (link.length != 0) { // 是連結點擊
          if (widget instanceof LinkTextView) { // 如果實體是LinkTextView
            ((LinkTextView) widget).linkHit = true;
          }
          if (action == MotionEvent.ACTION_UP) { // 放開時
            //                        link[0].onClick(widget); // 開啟連結
            String url = ((URLSpan) link[0]).getURL();
            Utils.clickUrl(widget, url);
          } else if (action == MotionEvent.ACTION_DOWN) { // 按下時
            Selection.setSelection(
                buffer, buffer.getSpanStart(link[0]), buffer.getSpanEnd(link[0])); // 選擇連結
          }
          return true;
        } else { // 不是連結點擊
          if (widget instanceof LinkTextView) { // 如果實體是LinkTextView
            ((LinkTextView) widget).linkHit = false;
          }
          Selection.removeSelection(buffer);
          Touch.onTouchEvent(widget, buffer, event);
          return false;
        }
      }
      return Touch.onTouchEvent(widget, buffer, event);
    }
Example #16
0
 private static void fixLinks(Spannable spannable) {
   for (URLSpan span : spannable.getSpans(0, spannable.length(), URLSpan.class)) {
     final String url = span.getURL();
     int start = spannable.getSpanStart(span);
     int end = spannable.getSpanEnd(span);
     int flags = spannable.getSpanFlags(span);
     URLSpan newSpan =
         new URLSpan(url) {
           @Override
           public void updateDrawState(TextPaint paramTextPaint) {
             super.updateDrawState(paramTextPaint);
             paramTextPaint.setUnderlineText(false);
             paramTextPaint.setColor(0xff006FC8);
           }
         };
     spannable.removeSpan(span);
     spannable.setSpan(newSpan, start, end, flags);
   }
 }
  @Override
  public boolean onTouchEvent(MotionEvent event) {
    TextView widget = (TextView) this;
    Object text = widget.getText();
    if (text instanceof Spanned) {
      Spannable buffer = (Spannable) text;

      int action = event.getAction();

      if (action == MotionEvent.ACTION_UP || action == MotionEvent.ACTION_DOWN) {
        int x = (int) event.getX();
        int y = (int) event.getY();

        x -= widget.getTotalPaddingLeft();
        y -= widget.getTotalPaddingTop();

        x += widget.getScrollX();
        y += widget.getScrollY();

        Layout layout = widget.getLayout();
        int line = layout.getLineForVertical(y);
        int off = layout.getOffsetForHorizontal(line, x);

        ClickableSpan[] link = buffer.getSpans(off, off, ClickableSpan.class);

        if (link.length != 0) {
          if (action == MotionEvent.ACTION_UP) {
            link[0].onClick(widget);
          } else if (action == MotionEvent.ACTION_DOWN) {
            Selection.setSelection(
                buffer, buffer.getSpanStart(link[0]), buffer.getSpanEnd(link[0]));
          }
          return true;
        }
      }
    }

    return false;
  }
  @Override
  public boolean onTouchEvent(MotionEvent event) {
    float x = event.getX();
    float y = event.getY();

    boolean result = false;
    int side = AndroidUtilities.dp(48);
    if (textLayout != null) {
      if (event.getAction() == MotionEvent.ACTION_DOWN
          || pressedLink != null && event.getAction() == MotionEvent.ACTION_UP) {
        if (event.getAction() == MotionEvent.ACTION_DOWN) {
          resetPressedLink();
          try {
            int x2 = (int) (x - textX);
            int y2 = (int) (y - textY);
            final int line = textLayout.getLineForVertical(y2);
            final int off = textLayout.getOffsetForHorizontal(line, x2);

            final float left = textLayout.getLineLeft(line);
            if (left <= x2 && left + textLayout.getLineWidth(line) >= x2) {
              Spannable buffer = (Spannable) textLayout.getText();
              ClickableSpan[] link = buffer.getSpans(off, off, ClickableSpan.class);
              if (link.length != 0) {
                resetPressedLink();
                pressedLink = link[0];
                result = true;
                try {
                  int start = buffer.getSpanStart(pressedLink);
                  urlPath.setCurrentLayout(textLayout, start);
                  textLayout.getSelectionPath(start, buffer.getSpanEnd(pressedLink), urlPath);
                } catch (Exception e) {
                  FileLog.e("tmessages", e);
                }
              } else {
                resetPressedLink();
              }
            } else {
              resetPressedLink();
            }
          } catch (Exception e) {
            resetPressedLink();
            FileLog.e("tmessages", e);
          }
        } else if (pressedLink != null) {
          try {
            if (pressedLink instanceof URLSpanNoUnderline) {
              String url = ((URLSpanNoUnderline) pressedLink).getURL();
              if (url.startsWith("@") || url.startsWith("#") || url.startsWith("/")) {
                if (delegate != null) {
                  delegate.didPressUrl(url);
                }
              }
            } else {
              pressedLink.onClick(this);
            }
          } catch (Exception e) {
            FileLog.e("tmessages", e);
          }
          resetPressedLink();
          result = true;
        }
      } else if (event.getAction() == MotionEvent.ACTION_CANCEL) {
        resetPressedLink();
      }
    }
    return result || super.onTouchEvent(event);
  }
  @Override
  public void onSuccess(Object result) {
    try {
      if (getActivity() != null) {
        if (result instanceof DescriptionResult) {
          resultData = (DescriptionResult) result;
          setUpVisibility(View.GONE, View.VISIBLE);
          btnBuy.setVisibility(View.VISIBLE);
          btnSell.setVisibility(View.VISIBLE);
          if (((DescriptionResult) result).getAssetClass() == null) {
            linearAssetName.setVisibility(View.GONE);
            viewAssetClass.setVisibility(View.GONE);
          } else {
            tvAssetClass.setText(((DescriptionResult) result).getAssetClass());
          }
          if (((DescriptionResult) result).getDescription() == null) {
            linearDescription.setVisibility(View.GONE);
            viewDescription.setVisibility(View.GONE);
          } else {
            tvDescription.setText(((DescriptionResult) result).getDescription());
          }

          if (((DescriptionResult) result).getIssuerName() == null) {
            linearIssuerName.setVisibility(View.GONE);
            viewIssuerName.setVisibility(View.GONE);
          } else {
            tvIssuerName.setText(((DescriptionResult) result).getIssuerName());
          }
          if (((DescriptionResult) result).getNumberOfCoins() == null) {
            linearNumberOfCoins.setVisibility(View.GONE);
            viewNumberOfCoins.setVisibility(View.GONE);
          } else {
            tvNumberOfCoins.setText(((DescriptionResult) result).getNumberOfCoins());
          }
          if (((DescriptionResult) result).getMarketCapitalization() == null) {
            linearMarketCapitalization.setVisibility(View.GONE);
            viewMarketCapitalization.setVisibility(View.GONE);
          } else {
            tvMarketCapitalization.setText(((DescriptionResult) result).getMarketCapitalization());
          }
          if (((DescriptionResult) result).getAssetDescriptionUrl() == null) {
            linearDescriptionUrl.setVisibility(View.GONE);
            viewDescriptionUrl.setVisibility(View.GONE);
          } else {

            Spannable s =
                (Spannable) Html.fromHtml(((DescriptionResult) result).getAssetDescriptionUrl());
            for (URLSpan u : s.getSpans(0, s.length(), URLSpan.class)) {
              s.setSpan(
                  new UnderlineSpan() {
                    public void updateDrawState(TextPaint tp) {
                      tp.setUnderlineText(false);
                    }
                  },
                  s.getSpanStart(u),
                  s.getSpanEnd(u),
                  0);
            }

            tvDescriptionUrl.setMovementMethod(LinkMovementMethod.getInstance());
            tvDescriptionUrl.setLinksClickable(true);
            tvDescriptionUrl.setText(s);
          }
          Resources r = getResources();
          float px =
              TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_DIP, 20, r.getDisplayMetrics());
          float pxMargin =
              TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_DIP, 3, r.getDisplayMetrics());
          linearPop.removeAllViews();

          for (int i = 0; i < Integer.parseInt(((DescriptionResult) result).getPopIndex()); i++) {
            ImageView imageView = new ImageView(getActivity());
            imageView.setImageResource(R.drawable.star);
            LinearLayout.LayoutParams lp =
                new LinearLayout.LayoutParams(Math.round(px), Math.round(px));
            lp.setMargins(Math.round(pxMargin), 0, Math.round(pxMargin), 0);
            imageView.setLayoutParams(lp);

            linearPop.addView(imageView);
          }

          if (Integer.parseInt(((DescriptionResult) result).getPopIndex()) == 0) {
            linearPopularity.setVisibility(View.GONE);
          }
          handler.post(run);
        } else if (result instanceof RateResult) {
          if (((RateResult) result).getRate() != null
              && ((RateResult) result).getRate().getAsk() != null
              && getActivity() != null) {
            price = BigDecimal.valueOf(((RateResult) result).getRate().getAsk());
            if (assetPair.getInverted()) {
              price = BigDecimal.ONE.divide(price, accurancy, RoundingMode.HALF_EVEN);
            }
            btnBuy.setText(
                String.format(getString(R.string.buy_rate), mainName, subName)
                    + " "
                    + LykkeUtils.getStriped(accurancy, price));
          }
          if (((RateResult) result).getRate() != null
              && ((RateResult) result).getRate().getBid() != null
              && getActivity() != null) {
            bid = BigDecimal.valueOf(((RateResult) result).getRate().getBid());
            if (assetPair.getInverted()) {
              bid = BigDecimal.ONE.divide(bid, accurancy, RoundingMode.HALF_EVEN);
            }
            btnSell.setText(
                String.format(getString(R.string.sell_at_price), mainName, subName)
                    + " "
                    + LykkeUtils.getStriped(accurancy, bid));
          }
        }
      }
    } catch (NullPointerException ex) {

    }
  }
        @Override
        public boolean onTouchEvent(TextView widget, Spannable buffer, MotionEvent event) {
          int action = event.getAction();

          if (action == MotionEvent.ACTION_UP
              || action == MotionEvent.ACTION_DOWN
              || action == MotionEvent.ACTION_CANCEL) {
            int x = (int) event.getX();
            int y = (int) event.getY();

            x -= widget.getTotalPaddingLeft();
            y -= widget.getTotalPaddingTop();

            x += widget.getScrollX();
            y += widget.getScrollY();

            Layout layout = widget.getLayout();
            int line = layout.getLineForVertical(y);
            int off = layout.getOffsetForHorizontal(line, x);

            ClickableSpan[] link = buffer.getSpans(off, off, ClickableSpan.class);
            if (link.length != 0) {
              if (action == MotionEvent.ACTION_UP) {
                // 按下后松开,移除所有 BackgroundColorSpan。
                BackgroundColorSpan[] backgroundColorSpans =
                    buffer.getSpans(0, buffer.length(), BackgroundColorSpan.class);
                for (BackgroundColorSpan bkcolor : backgroundColorSpans) {
                  buffer.removeSpan(bkcolor);
                }

                // Selection.removeSelection(buffer);
                link[0].onClick(widget);
              } else if (action == MotionEvent.ACTION_DOWN) {
                // 按下,给按下的 ClickableSpan 设置 BackgroundColorSpan。
                /*
                Selection.setSelection(buffer,
                                       buffer.getSpanStart(link[0]),
                                       buffer.getSpanEnd(link[0]));
                */

                BackgroundColorSpan bkcolor = new BackgroundColorSpan(0xff89660f);
                buffer.setSpan(
                    bkcolor,
                    buffer.getSpanStart(link[0]),
                    buffer.getSpanEnd(link[0]),
                    Spanned.SPAN_INCLUSIVE_INCLUSIVE);
              } else if (action == MotionEvent.ACTION_CANCEL) {
                // 按下不松开而是移动,则变成取消事件,移除所有 BackgroundColorSpan。
                BackgroundColorSpan[] backgroundColorSpans =
                    buffer.getSpans(0, buffer.length(), BackgroundColorSpan.class);
                for (BackgroundColorSpan bkcolor : backgroundColorSpans) {
                  buffer.removeSpan(bkcolor);
                }
              }

              return true;
            } else {
              BackgroundColorSpan[] backgroundColorSpans =
                  buffer.getSpans(0, buffer.length(), BackgroundColorSpan.class);
              for (BackgroundColorSpan bkcolor : backgroundColorSpans) {
                buffer.removeSpan(bkcolor);
              }
              // Selection.removeSelection(buffer);
            }
          }

          return super.onTouchEvent(widget, buffer, event);
        }
 private int getEndIndex() {
   return mParent.getSpanEnd(mSpan);
 }
  /**
   * Applies formatting to selected text, or marks the entry for a new text style at the current
   * cursor position
   *
   * @param toggleButton button from formatting bar
   * @param tag HTML tag name for text style
   */
  private void onFormatButtonClick(ToggleButton toggleButton, String tag) {
    Spannable s = mContentEditText.getText();
    if (s == null) return;
    int selectionStart = mContentEditText.getSelectionStart();
    mStyleStart = selectionStart;
    int selectionEnd = mContentEditText.getSelectionEnd();

    if (selectionStart > selectionEnd) {
      int temp = selectionEnd;
      selectionEnd = selectionStart;
      selectionStart = temp;
    }

    Class styleClass = null;
    if (tag.equals(TAG_FORMAT_BAR_BUTTON_STRONG) || tag.equals(TAG_FORMAT_BAR_BUTTON_EM))
      styleClass = StyleSpan.class;
    else if (tag.equals(TAG_FORMAT_BAR_BUTTON_UNDERLINE)) styleClass = WPUnderlineSpan.class;
    else if (tag.equals(TAG_FORMAT_BAR_BUTTON_STRIKE)) styleClass = StrikethroughSpan.class;
    else if (tag.equals(TAG_FORMAT_BAR_BUTTON_QUOTE)) styleClass = QuoteSpan.class;

    if (styleClass == null) return;

    Object[] allSpans = s.getSpans(selectionStart, selectionEnd, styleClass);
    boolean textIsSelected = selectionEnd > selectionStart;
    if (mIsLocalDraft) {
      // Local drafts can use the rich text editor. Yay!
      boolean shouldAddSpan = true;
      for (Object span : allSpans) {
        if (span instanceof StyleSpan) {
          StyleSpan styleSpan = (StyleSpan) span;
          if ((styleSpan.getStyle() == Typeface.BOLD && !tag.equals(TAG_FORMAT_BAR_BUTTON_STRONG))
              || (styleSpan.getStyle() == Typeface.ITALIC
                  && !tag.equals(TAG_FORMAT_BAR_BUTTON_EM))) {
            continue;
          }
        }
        if (!toggleButton.isChecked() && textIsSelected) {
          // If span exists and text is selected, remove the span
          s.removeSpan(span);
          shouldAddSpan = false;
          break;
        } else if (!toggleButton.isChecked()) {
          // Remove span at cursor point if button isn't checked
          Object[] spans = s.getSpans(mStyleStart - 1, mStyleStart, styleClass);
          for (Object removeSpan : spans) {
            selectionStart = s.getSpanStart(removeSpan);
            selectionEnd = s.getSpanEnd(removeSpan);
            s.removeSpan(removeSpan);
          }
        }
      }

      if (shouldAddSpan) {
        if (tag.equals(TAG_FORMAT_BAR_BUTTON_STRONG)) {
          s.setSpan(
              new StyleSpan(android.graphics.Typeface.BOLD),
              selectionStart,
              selectionEnd,
              Spannable.SPAN_EXCLUSIVE_EXCLUSIVE);
        } else if (tag.equals(TAG_FORMAT_BAR_BUTTON_EM)) {
          s.setSpan(
              new StyleSpan(android.graphics.Typeface.ITALIC),
              selectionStart,
              selectionEnd,
              Spannable.SPAN_EXCLUSIVE_EXCLUSIVE);
        } else {
          try {
            s.setSpan(
                styleClass.newInstance(),
                selectionStart,
                selectionEnd,
                Spannable.SPAN_EXCLUSIVE_EXCLUSIVE);
          } catch (java.lang.InstantiationException e) {
            AppLog.e(T.POSTS, e);
          } catch (IllegalAccessException e) {
            AppLog.e(T.POSTS, e);
          }
        }
      }
    } else {
      // Add HTML tags when editing an existing post
      String startTag = "<" + tag + ">";
      String endTag = "</" + tag + ">";
      Editable content = mContentEditText.getText();
      if (textIsSelected) {
        content.insert(selectionStart, startTag);
        content.insert(selectionEnd + startTag.length(), endTag);
        toggleButton.setChecked(false);
        mContentEditText.setSelection(selectionEnd + startTag.length() + endTag.length());
      } else if (toggleButton.isChecked()) {
        content.insert(selectionStart, startTag);
        mContentEditText.setSelection(selectionEnd + startTag.length());
      } else if (!toggleButton.isChecked()) {
        content.insert(selectionEnd, endTag);
        mContentEditText.setSelection(selectionEnd + endTag.length());
      }
    }
  }
  @Override
  public boolean onTouchEvent(TextView widget, Spannable buffer, MotionEvent event) {
    if (mGray == null) {
      mGray =
          new BackgroundColorSpan(
              widget.getContext().getResources().getColor(R.color.selector_gray));
    }

    mIsLinkHit = false;

    int action = event.getAction();

    if (action == MotionEvent.ACTION_DOWN || action == MotionEvent.ACTION_UP) {
      int x = (int) event.getX();
      int y = (int) event.getY();

      /*if (DEBUG) {
      	Log.d(TAG, "x = " + x + " y = " + y);
      }*/

      x -= widget.getTotalPaddingLeft();
      y -= widget.getTotalPaddingTop();

      /*if (DEBUG) {
      	Log.d(TAG, "x = " + x + " y = " + y);
      }*/

      x += widget.getScrollX();
      y += widget.getScrollY();

      int line = widget.getLayout().getLineForVertical(y);
      int offset = widget.getLayout().getOffsetForHorizontal(line, x);

      ClickableSpan[] spans = buffer.getSpans(offset, offset, ClickableSpan.class);

      /*if (DEBUG) {
      	Log.d(TAG, "x = " + x + " y = " + y);
      	Log.d(TAG, "line = " + line + " offset = " + offset);
      	Log.d(TAG, "spans.lenth = " + spans.length);
      }*/

      if (spans.length != 0) {
        int start = buffer.getSpanStart(spans[0]);
        int end = buffer.getSpanEnd(spans[0]);

        mIsLinkHit = true;

        if (action == MotionEvent.ACTION_DOWN) {
          /*if (DEBUG) {
          	Log.d(TAG, "Down event detected");
          }*/

          buffer.setSpan(mGray, start, end, Spanned.SPAN_EXCLUSIVE_EXCLUSIVE);
        } else if (action == MotionEvent.ACTION_UP) {
          /*if (DEBUG) {
          	Log.d(TAG, "Up event detected");
          }*/

          spans[0].onClick(widget);

          buffer.removeSpan(mGray);
        }

        return true;
      }
    } else {
      buffer.removeSpan(mGray);
    }

    return Touch.onTouchEvent(widget, buffer, event);
  }