diff options
Diffstat (limited to 'src/com/android/settings/LinkifyUtils.java')
| -rw-r--r-- | src/com/android/settings/LinkifyUtils.java | 84 |
1 files changed, 84 insertions, 0 deletions
diff --git a/src/com/android/settings/LinkifyUtils.java b/src/com/android/settings/LinkifyUtils.java new file mode 100644 index 0000000..5550db5 --- /dev/null +++ b/src/com/android/settings/LinkifyUtils.java @@ -0,0 +1,84 @@ +/* + * Copyright (C) 2015 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package com.android.settings; + +import android.text.Spannable; +import android.text.TextPaint; +import android.text.method.LinkMovementMethod; +import android.text.style.ClickableSpan; +import android.view.View; +import android.widget.TextView; +import android.widget.TextView.BufferType; + +/** + * Utility class to create clickable links inside {@link TextView TextViews}. + */ +public class LinkifyUtils { + private static final String PLACE_HOLDER_LINK_BEGIN = "LINK_BEGIN"; + private static final String PLACE_HOLDER_LINK_END = "LINK_END"; + + private LinkifyUtils() { + } + + /** Interface that handles the click event of the link */ + public interface OnClickListener { + void onClick(); + } + + /** + * Applies the text into the {@link TextView} and part of it a clickable link. + * The text surrounded with "LINK_BEGIN" and "LINK_END" will become a clickable link. Only + * supports at most one link. + * @return true if the link has been successfully applied, or false if the original text + * contains no link place holders. + */ + public static boolean linkify(TextView textView, StringBuilder text, + final OnClickListener listener) { + // Remove place-holders from the string and record their positions + final int beginIndex = text.indexOf(PLACE_HOLDER_LINK_BEGIN); + if (beginIndex == -1) { + textView.setText(text); + return false; + } + text.delete(beginIndex, beginIndex + PLACE_HOLDER_LINK_BEGIN.length()); + final int endIndex = text.indexOf(PLACE_HOLDER_LINK_END); + if (endIndex == -1) { + textView.setText(text); + return false; + } + text.delete(endIndex, endIndex + PLACE_HOLDER_LINK_END.length()); + + textView.setText(text.toString(), BufferType.SPANNABLE); + textView.setMovementMethod(LinkMovementMethod.getInstance()); + Spannable spannableContent = (Spannable) textView.getText(); + ClickableSpan spannableLink = new ClickableSpan() { + @Override + public void onClick(View widget) { + listener.onClick(); + } + + @Override + public void updateDrawState(TextPaint ds) { + super.updateDrawState(ds); + ds.setUnderlineText(false); + } + }; + spannableContent.setSpan(spannableLink, beginIndex, endIndex, + Spannable.SPAN_EXCLUSIVE_EXCLUSIVE); + return true; + } +} |
