String (@Nullable TextRange rangeInHost) { final String text = myHost.getText(); final List<TextRange> contentRanges = getContentRanges(); final StringBuilder builder = new StringBuilder(); for (int i = 0; i < contentRanges.size(); i++) { final TextRange range = rangeInHost != null ? rangeInHost.intersection(contentRanges.get(i)) : contentRanges.get(i); if (range == null) continue; final CharSequence curString = range.subSequence(text); builder.append(curString); if (range.getEndOffset() == contentRanges.get(i).getEndOffset() && i + 1 != contentRanges.size()) { builder.append(getRangesJoiner(text, contentRanges, i)); } } return processReplacements(builder, myHost.getDecodeReplacements(builder)); }