/* * Copyright 2017, 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.managedprovisioning.common; import static android.text.Spanned.SPAN_EXCLUSIVE_EXCLUSIVE; import static com.android.internal.util.Preconditions.checkNotNull; import static com.android.internal.util.Preconditions.checkStringNotEmpty; import android.content.Intent; import android.text.Html; import android.text.SpannableStringBuilder; import android.text.Spanned; import android.text.style.ClickableSpan; import android.text.style.URLSpan; import com.android.managedprovisioning.preprovisioning.WebActivity; /** * Parses HTML text using {@link Html} and sets URL links to be handled by {@link WebActivity} */ public class HtmlToSpannedParser { private static final int HTML_MODE = Html.FROM_HTML_MODE_COMPACT; private final ClickableSpanFactory mClickableSpanFactory; private final UrlIntentFactory mUrlIntentFactory; /** * Default constructor * * @param clickableSpanFactory Factory of {@link ClickableSpan} objects for urls * @param urlIntentFactory Factory of {@link Intent} objects for handling urls */ public HtmlToSpannedParser(ClickableSpanFactory clickableSpanFactory, UrlIntentFactory urlIntentFactory) { mClickableSpanFactory = checkNotNull(clickableSpanFactory); mUrlIntentFactory = checkNotNull(urlIntentFactory); } /** * See {@link Html#fromHtml(String, int)} for caveats regarding limited HTML support */ public Spanned parseHtml(String htmlContent) { Spanned spanned = Html.fromHtml(checkStringNotEmpty(htmlContent), HTML_MODE); if (spanned == null) { return null; } // Make html <a> tags open WebActivity SpannableStringBuilder result = new SpannableStringBuilder(spanned); URLSpan[] urlSpans = result.getSpans(0, result.length(), URLSpan.class); for (URLSpan urlSpan : urlSpans) { Intent intent = mUrlIntentFactory.create(urlSpan.getURL()); if (intent != null) { int spanStart = result.getSpanStart(urlSpan); int spanEnd = result.getSpanEnd(urlSpan); result.setSpan(mClickableSpanFactory.create(intent), spanStart, spanEnd, SPAN_EXCLUSIVE_EXCLUSIVE); result.removeSpan(urlSpan); } } return result; } /** * Allows to specify an intent to handle URLs */ public interface UrlIntentFactory { /** * Creates an {@link Intent} based on a passed in {@link String} url */ Intent create(String url); } }