private void notifySelectionChange(int start, int end) {

    final InputMethodManager imm = getInputMethodManager();
    final View v = getView();
    final Editable editable = getEditable();
    if (imm == null || v == null || editable == null) {
      return;
    }
    imm.updateSelection(
        v, start, end, getComposingSpanStart(editable), getComposingSpanEnd(editable));
  }
  public void notifySelectionChange(InputMethodManager imm, int start, int end) {
    if (!mBatchMode) {
      final Editable content = getEditable();

      start = clampContentIndex(content, start);
      end = clampContentIndex(content, end);

      clampSelection();
      int a = Selection.getSelectionStart(content);
      int b = Selection.getSelectionEnd(content);

      if (start != a || end != b) {
        if (DEBUG) {
          Log.d(
              LOGTAG,
              String.format(
                  ". . . notifySelectionChange: current editable selection: [%d, %d]", a, b));
        }

        super.setSelection(start, end);

        // Check if the selection is inside composing span
        int ca = getComposingSpanStart(content);
        int cb = getComposingSpanEnd(content);
        if (cb < ca) {
          int tmp = ca;
          ca = cb;
          cb = tmp;
        }
        if (start < ca || start > cb || end < ca || end > cb) {
          if (DEBUG) Log.d(LOGTAG, ". . . notifySelectionChange: removeComposingSpans");
          removeComposingSpans(content);
        }
      }
    }

    if (imm != null && imm.isFullscreenMode()) {
      View v = GeckoApp.mAppContext.getLayerController().getView();
      imm.updateSelection(v, start, end, -1, -1);
    }
  }