blob: ca1a09cf77c83e6badc5468c8a5af096530a8491 [file] [log] [blame]
/*
* 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);
}
}