blob: a5b97eab12e420021a7f14f5a60d21fe29437a64 [file] [log] [blame]
/*
* Copyright 2018 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 androidx.core.text;
import static androidx.annotation.RestrictTo.Scope.LIBRARY;
import static java.lang.annotation.RetentionPolicy.SOURCE;
import android.annotation.SuppressLint;
import android.graphics.Color;
import android.os.Build;
import android.text.Html;
import android.text.Html.ImageGetter;
import android.text.Html.TagHandler;
import android.text.Spanned;
import android.text.style.BulletSpan;
import android.text.style.ParagraphStyle;
import androidx.annotation.IntDef;
import androidx.annotation.NonNull;
import androidx.annotation.Nullable;
import androidx.annotation.RestrictTo;
import java.lang.annotation.Retention;
/**
* Backwards compatible version of {@link Html}.
*/
@SuppressLint("InlinedApi") // Intentionally aliasing platform constants to compat versions.
public final class HtmlCompat {
/**
* Option for {@link #fromHtml(String, int)}: Wrap consecutive lines of text delimited by '\n'
* inside <p> elements. {@link BulletSpan}s are ignored.
*/
public static final int TO_HTML_PARAGRAPH_LINES_CONSECUTIVE =
Html.TO_HTML_PARAGRAPH_LINES_CONSECUTIVE;
/**
* Option for {@link #fromHtml(String, int)}: Wrap each line of text delimited by '\n' inside a
* <p> or a <li> element. This allows {@link ParagraphStyle}s attached to be
* encoded as CSS styles within the corresponding <p> or <li> element.
*/
public static final int TO_HTML_PARAGRAPH_LINES_INDIVIDUAL =
Html.TO_HTML_PARAGRAPH_LINES_INDIVIDUAL;
/**
* Flag indicating that texts inside <p> elements will be separated from other texts with
* one newline character by default.
*/
public static final int FROM_HTML_SEPARATOR_LINE_BREAK_PARAGRAPH =
Html.FROM_HTML_SEPARATOR_LINE_BREAK_PARAGRAPH;
/**
* Flag indicating that texts inside <h1>~<h6> elements will be separated from
* other texts with one newline character by default.
*/
public static final int FROM_HTML_SEPARATOR_LINE_BREAK_HEADING =
Html.FROM_HTML_SEPARATOR_LINE_BREAK_HEADING;
/**
* Flag indicating that texts inside <li> elements will be separated from other texts
* with one newline character by default.
*/
public static final int FROM_HTML_SEPARATOR_LINE_BREAK_LIST_ITEM =
Html.FROM_HTML_SEPARATOR_LINE_BREAK_LIST_ITEM;
/**
* Flag indicating that texts inside <ul> elements will be separated from other texts
* with one newline character by default.
*/
public static final int FROM_HTML_SEPARATOR_LINE_BREAK_LIST =
Html.FROM_HTML_SEPARATOR_LINE_BREAK_LIST;
/**
* Flag indicating that texts inside <div> elements will be separated from other texts
* with one newline character by default.
*/
public static final int FROM_HTML_SEPARATOR_LINE_BREAK_DIV =
Html.FROM_HTML_SEPARATOR_LINE_BREAK_DIV;
/**
* Flag indicating that texts inside <blockquote> elements will be separated from other
* texts with one newline character by default.
*/
public static final int FROM_HTML_SEPARATOR_LINE_BREAK_BLOCKQUOTE =
Html.FROM_HTML_SEPARATOR_LINE_BREAK_BLOCKQUOTE;
/**
* Flag indicating that CSS color values should be used instead of those defined in
* {@link Color}.
*/
public static final int FROM_HTML_OPTION_USE_CSS_COLORS = Html.FROM_HTML_OPTION_USE_CSS_COLORS;
/**
* Flags for {@link #fromHtml(String, int, ImageGetter, TagHandler)}: Separate block-level
* elements with blank lines (two newline characters) in between. This is the legacy behavior
* prior to N.
*/
public static final int FROM_HTML_MODE_LEGACY = Html.FROM_HTML_MODE_LEGACY;
/**
* Flags for {@link #fromHtml(String, int, ImageGetter, TagHandler)}: Separate block-level
* elements with line breaks (single newline character) in between. This inverts the
* {@link Spanned} to HTML string conversion done with the option
* {@link #TO_HTML_PARAGRAPH_LINES_INDIVIDUAL}.
*/
public static final int FROM_HTML_MODE_COMPACT = Html.FROM_HTML_MODE_COMPACT;
/** @hide */
@IntDef(value = {
FROM_HTML_SEPARATOR_LINE_BREAK_PARAGRAPH,
FROM_HTML_SEPARATOR_LINE_BREAK_HEADING,
FROM_HTML_SEPARATOR_LINE_BREAK_LIST_ITEM,
FROM_HTML_SEPARATOR_LINE_BREAK_LIST,
FROM_HTML_SEPARATOR_LINE_BREAK_DIV,
FROM_HTML_SEPARATOR_LINE_BREAK_BLOCKQUOTE,
FROM_HTML_OPTION_USE_CSS_COLORS,
FROM_HTML_MODE_COMPACT,
FROM_HTML_MODE_LEGACY
}, flag = true)
@RestrictTo(LIBRARY)
@Retention(SOURCE)
@interface FromHtmlFlags {
}
/** @hide */
@IntDef({
TO_HTML_PARAGRAPH_LINES_CONSECUTIVE,
TO_HTML_PARAGRAPH_LINES_INDIVIDUAL
})
@RestrictTo(LIBRARY)
@Retention(SOURCE)
@interface ToHtmlOptions {
}
/**
* Invokes {@link Html#fromHtml(String, int)} on API 24 and newer, otherwise {@code flags} are
* ignored and {@link Html#fromHtml(String)} is used.
*/
@NonNull
public static Spanned fromHtml(@NonNull String source, @FromHtmlFlags int flags) {
if (Build.VERSION.SDK_INT >= 24) {
return Html.fromHtml(source, flags);
}
//noinspection deprecation
return Html.fromHtml(source);
}
/**
* Invokes {@link Html#fromHtml(String, int, ImageGetter, TagHandler)} on API 24 or newer,
* otherwise {@code flags} are ignored and
* {@link Html#fromHtml(String, ImageGetter, TagHandler)} is used.
*/
@NonNull
public static Spanned fromHtml(@NonNull String source, @FromHtmlFlags int flags,
@Nullable ImageGetter imageGetter, @Nullable TagHandler tagHandler) {
if (Build.VERSION.SDK_INT >= 24) {
return Html.fromHtml(source, flags, imageGetter, tagHandler);
}
//noinspection deprecation
return Html.fromHtml(source, imageGetter, tagHandler);
}
/**
* Invokes {@link Html#toHtml(Spanned, int)} on API 24 or newer, otherwise {@code options} are
* ignored and {@link Html#toHtml(Spanned)} is used.
*/
@NonNull
public static String toHtml(@NonNull Spanned text, @ToHtmlOptions int options) {
if (Build.VERSION.SDK_INT >= 24) {
return Html.toHtml(text, options);
}
//noinspection deprecation
return Html.toHtml(text);
}
private HtmlCompat() {
}
}