From 8b53f4656c9760da39d5b55b86dde5b311ed131d Mon Sep 17 00:00:00 2001
From: John Wu
This class is not thread safe. */ +@android.ravenwood.annotation.RavenwoodKeepWholeClass class TimeFormatter { // An arbitrary value outside the range representable by a char. private static final int FORCE_LOWER_CASE = -1; diff --git a/core/java/android/text/format/TimeMigrationUtils.java b/core/java/android/text/format/TimeMigrationUtils.java index 17bac8d67b26..b2f5024c73b7 100644 --- a/core/java/android/text/format/TimeMigrationUtils.java +++ b/core/java/android/text/format/TimeMigrationUtils.java @@ -22,6 +22,7 @@ package android.text.format; * * @hide */ +@android.ravenwood.annotation.RavenwoodKeepWholeClass public class TimeMigrationUtils { private TimeMigrationUtils() {} diff --git a/core/java/android/text/method/AllCapsTransformationMethod.java b/core/java/android/text/method/AllCapsTransformationMethod.java index 305b056aee72..70dcc52691cd 100644 --- a/core/java/android/text/method/AllCapsTransformationMethod.java +++ b/core/java/android/text/method/AllCapsTransformationMethod.java @@ -33,6 +33,7 @@ import java.util.Locale; * * @hide */ +@android.ravenwood.annotation.RavenwoodKeepWholeClass public class AllCapsTransformationMethod implements TransformationMethod2 { private static final String TAG = "AllCapsTransformationMethod"; diff --git a/core/java/android/text/method/ArrowKeyMovementMethod.java b/core/java/android/text/method/ArrowKeyMovementMethod.java index 37474e5645b0..609922073f53 100644 --- a/core/java/android/text/method/ArrowKeyMovementMethod.java +++ b/core/java/android/text/method/ArrowKeyMovementMethod.java @@ -30,6 +30,7 @@ import android.widget.TextView; * A movement method that provides cursor movement and selection. * Supports displaying the context menu on DPad Center. */ +@android.ravenwood.annotation.RavenwoodKeepWholeClass public class ArrowKeyMovementMethod extends BaseMovementMethod implements MovementMethod { private static boolean isSelecting(Spannable buffer) { return ((MetaKeyKeyListener.getMetaState(buffer, MetaKeyKeyListener.META_SHIFT_ON) == 1) || diff --git a/core/java/android/text/method/BaseKeyListener.java b/core/java/android/text/method/BaseKeyListener.java index e427908541e5..5ebfd99c6f6e 100644 --- a/core/java/android/text/method/BaseKeyListener.java +++ b/core/java/android/text/method/BaseKeyListener.java @@ -47,6 +47,7 @@ import java.text.BreakIterator; * with hardware keyboards. Software input methods have no obligation to trigger * the methods in this class. */ +@android.ravenwood.annotation.RavenwoodKeepWholeClass public abstract class BaseKeyListener extends MetaKeyKeyListener implements KeyListener { /* package */ static final Object OLD_SEL_START = new NoCopySpan.Concrete(); diff --git a/core/java/android/text/method/BaseMovementMethod.java b/core/java/android/text/method/BaseMovementMethod.java index 7a4b3a095ae9..0c2e52e04c1f 100644 --- a/core/java/android/text/method/BaseMovementMethod.java +++ b/core/java/android/text/method/BaseMovementMethod.java @@ -27,6 +27,7 @@ import android.widget.TextView; /** * Base classes for movement methods. */ +@android.ravenwood.annotation.RavenwoodKeepWholeClass public class BaseMovementMethod implements MovementMethod { @Override public boolean canSelectArbitrarily() { diff --git a/core/java/android/text/method/CharacterPickerDialog.java b/core/java/android/text/method/CharacterPickerDialog.java index 7d838e06cd68..f084d03cf6dd 100644 --- a/core/java/android/text/method/CharacterPickerDialog.java +++ b/core/java/android/text/method/CharacterPickerDialog.java @@ -38,6 +38,7 @@ import com.android.internal.R; /** * Dialog for choosing accented characters related to a base character. */ +@android.ravenwood.annotation.RavenwoodKeepWholeClass public class CharacterPickerDialog extends Dialog implements OnItemClickListener, OnClickListener { private View mView; diff --git a/core/java/android/text/method/DateKeyListener.java b/core/java/android/text/method/DateKeyListener.java index 0accbf6c74e5..acf182263272 100644 --- a/core/java/android/text/method/DateKeyListener.java +++ b/core/java/android/text/method/DateKeyListener.java @@ -35,6 +35,7 @@ import java.util.Locale; * with hardware keyboards. Software input methods have no obligation to trigger * the methods in this class. */ +@android.ravenwood.annotation.RavenwoodKeepWholeClass public class DateKeyListener extends NumberKeyListener { public int getInputType() { diff --git a/core/java/android/text/method/DateTimeKeyListener.java b/core/java/android/text/method/DateTimeKeyListener.java index 1593db5de641..a46ae45433b9 100644 --- a/core/java/android/text/method/DateTimeKeyListener.java +++ b/core/java/android/text/method/DateTimeKeyListener.java @@ -35,6 +35,7 @@ import java.util.Locale; * with hardware keyboards. Software input methods have no obligation to trigger * the methods in this class. */ +@android.ravenwood.annotation.RavenwoodKeepWholeClass public class DateTimeKeyListener extends NumberKeyListener { public int getInputType() { diff --git a/core/java/android/text/method/DialerKeyListener.java b/core/java/android/text/method/DialerKeyListener.java index 17abed6c363a..9eea51a07593 100644 --- a/core/java/android/text/method/DialerKeyListener.java +++ b/core/java/android/text/method/DialerKeyListener.java @@ -28,6 +28,7 @@ import android.view.KeyEvent; * with hardware keyboards. Software input methods have no obligation to trigger * the methods in this class. */ +@android.ravenwood.annotation.RavenwoodKeepWholeClass public class DialerKeyListener extends NumberKeyListener { @Override diff --git a/core/java/android/text/method/DigitsKeyListener.java b/core/java/android/text/method/DigitsKeyListener.java index d9f2dcf2e896..c97d4afef4fa 100644 --- a/core/java/android/text/method/DigitsKeyListener.java +++ b/core/java/android/text/method/DigitsKeyListener.java @@ -40,6 +40,7 @@ import java.util.Locale; * with hardware keyboards. Software input methods have no obligation to trigger * the methods in this class. */ +@android.ravenwood.annotation.RavenwoodKeepWholeClass public class DigitsKeyListener extends NumberKeyListener { private char[] mAccepted; diff --git a/core/java/android/text/method/HideReturnsTransformationMethod.java b/core/java/android/text/method/HideReturnsTransformationMethod.java index 40ce8714cf38..8b93b3558f86 100644 --- a/core/java/android/text/method/HideReturnsTransformationMethod.java +++ b/core/java/android/text/method/HideReturnsTransformationMethod.java @@ -24,6 +24,7 @@ import android.os.Build; * to be hidden by displaying them as zero-width non-breaking space * characters (\uFEFF). */ +@android.ravenwood.annotation.RavenwoodKeepWholeClass public class HideReturnsTransformationMethod extends ReplacementTransformationMethod { private static char[] ORIGINAL = new char[] { '\r' }; diff --git a/core/java/android/text/method/InsertModeTransformationMethod.java b/core/java/android/text/method/InsertModeTransformationMethod.java index 6c6576f8888e..ace2d256f5b0 100644 --- a/core/java/android/text/method/InsertModeTransformationMethod.java +++ b/core/java/android/text/method/InsertModeTransformationMethod.java @@ -58,6 +58,7 @@ import java.lang.reflect.Array; * the new transformed text: "hello abc\n\n world", and the highlight range will be [5, 11). * @hide */ +@android.ravenwood.annotation.RavenwoodKeepWholeClass public class InsertModeTransformationMethod implements TransformationMethod, TextWatcher { /** The start offset of the highlight range in the original text, inclusive. */ private int mStart; diff --git a/core/java/android/text/method/KeyListener.java b/core/java/android/text/method/KeyListener.java index ce7054c40d01..447c4d9432ed 100644 --- a/core/java/android/text/method/KeyListener.java +++ b/core/java/android/text/method/KeyListener.java @@ -34,6 +34,7 @@ import android.view.View; * targetting Jelly Bean or later, and will only deliver it for some * key presses to applications targetting Ice Cream Sandwich or earlier. */ +@android.ravenwood.annotation.RavenwoodKeepWholeClass public interface KeyListener { /** * Return the type of text that this key listener is manipulating, diff --git a/core/java/android/text/method/LinkMovementMethod.java b/core/java/android/text/method/LinkMovementMethod.java index 9f4a0aea7207..484bc1ae1a85 100644 --- a/core/java/android/text/method/LinkMovementMethod.java +++ b/core/java/android/text/method/LinkMovementMethod.java @@ -33,6 +33,7 @@ import android.widget.TextView; * A movement method that traverses links in the text buffer and scrolls if necessary. * Supports clicking on links with DPad Center or Enter. */ +@android.ravenwood.annotation.RavenwoodKeepWholeClass public class LinkMovementMethod extends ScrollingMovementMethod { private static final int CLICK = 1; private static final int UP = 2; diff --git a/core/java/android/text/method/MetaKeyKeyListener.java b/core/java/android/text/method/MetaKeyKeyListener.java index d1d7c968411f..7c9c2f132793 100644 --- a/core/java/android/text/method/MetaKeyKeyListener.java +++ b/core/java/android/text/method/MetaKeyKeyListener.java @@ -71,6 +71,7 @@ import android.view.View; * } * */ +@android.ravenwood.annotation.RavenwoodKeepWholeClass public abstract class MetaKeyKeyListener { /** * Flag that indicates that the SHIFT key is on. diff --git a/core/java/android/text/method/MovementMethod.java b/core/java/android/text/method/MovementMethod.java index f6fe575a9265..5ea439d50561 100644 --- a/core/java/android/text/method/MovementMethod.java +++ b/core/java/android/text/method/MovementMethod.java @@ -32,6 +32,7 @@ import android.widget.TextView; * directly by applications. *
*/ +@android.ravenwood.annotation.RavenwoodKeepWholeClass public interface MovementMethod { public void initialize(TextView widget, Spannable text); public boolean onKeyDown(TextView widget, Spannable text, int keyCode, KeyEvent event); diff --git a/core/java/android/text/method/MultiTapKeyListener.java b/core/java/android/text/method/MultiTapKeyListener.java index 5770482b3feb..022853abf450 100644 --- a/core/java/android/text/method/MultiTapKeyListener.java +++ b/core/java/android/text/method/MultiTapKeyListener.java @@ -36,6 +36,7 @@ import android.view.View; * with hardware keyboards. Software input methods have no obligation to trigger * the methods in this class. */ +@android.ravenwood.annotation.RavenwoodKeepWholeClass public class MultiTapKeyListener extends BaseKeyListener implements SpanWatcher { private static MultiTapKeyListener[] sInstance = diff --git a/core/java/android/text/method/NumberKeyListener.java b/core/java/android/text/method/NumberKeyListener.java index 2b038dd11348..e32ccd48c7e3 100644 --- a/core/java/android/text/method/NumberKeyListener.java +++ b/core/java/android/text/method/NumberKeyListener.java @@ -39,6 +39,7 @@ import java.util.Locale; * with hardware keyboards. Software input methods have no obligation to trigger * the methods in this class. */ +@android.ravenwood.annotation.RavenwoodKeepWholeClass public abstract class NumberKeyListener extends BaseKeyListener implements InputFilter { diff --git a/core/java/android/text/method/OffsetMapping.java b/core/java/android/text/method/OffsetMapping.java index fcf3de6784fb..99613d3ae300 100644 --- a/core/java/android/text/method/OffsetMapping.java +++ b/core/java/android/text/method/OffsetMapping.java @@ -27,6 +27,7 @@ import java.lang.annotation.RetentionPolicy; * {@link TransformationMethod} that alters the text length. * @hide */ +@android.ravenwood.annotation.RavenwoodKeepWholeClass public interface OffsetMapping { /** * The mapping strategy for a character offset. diff --git a/core/java/android/text/method/PasswordTransformationMethod.java b/core/java/android/text/method/PasswordTransformationMethod.java index 53553be6e5a8..4a61d9aa1bd0 100644 --- a/core/java/android/text/method/PasswordTransformationMethod.java +++ b/core/java/android/text/method/PasswordTransformationMethod.java @@ -33,6 +33,7 @@ import android.view.View; import java.lang.ref.WeakReference; +@android.ravenwood.annotation.RavenwoodKeepWholeClass public class PasswordTransformationMethod implements TransformationMethod, TextWatcher { diff --git a/core/java/android/text/method/QwertyKeyListener.java b/core/java/android/text/method/QwertyKeyListener.java index c43864d0f215..27c58ea3a56e 100644 --- a/core/java/android/text/method/QwertyKeyListener.java +++ b/core/java/android/text/method/QwertyKeyListener.java @@ -37,6 +37,7 @@ import android.view.View; * with hardware keyboards. Software input methods have no obligation to trigger * the methods in this class. */ +@android.ravenwood.annotation.RavenwoodKeepWholeClass public class QwertyKeyListener extends BaseKeyListener { private static QwertyKeyListener[] sInstance = new QwertyKeyListener[Capitalize.values().length * 2]; diff --git a/core/java/android/text/method/ReplacementTransformationMethod.java b/core/java/android/text/method/ReplacementTransformationMethod.java index d6f879aa4353..05899d79b02e 100644 --- a/core/java/android/text/method/ReplacementTransformationMethod.java +++ b/core/java/android/text/method/ReplacementTransformationMethod.java @@ -30,6 +30,7 @@ import android.view.View; * array to be replaced by the corresponding characters in the * {@link #getReplacement} array. */ +@android.ravenwood.annotation.RavenwoodKeepWholeClass public abstract class ReplacementTransformationMethod implements TransformationMethod { diff --git a/core/java/android/text/method/ScrollingMovementMethod.java b/core/java/android/text/method/ScrollingMovementMethod.java index 4f422cbf51cb..2e0eda96b7f6 100644 --- a/core/java/android/text/method/ScrollingMovementMethod.java +++ b/core/java/android/text/method/ScrollingMovementMethod.java @@ -25,6 +25,7 @@ import android.widget.TextView; /** * A movement method that interprets movement keys by scrolling the text buffer. */ +@android.ravenwood.annotation.RavenwoodKeepWholeClass public class ScrollingMovementMethod extends BaseMovementMethod implements MovementMethod { @Override protected boolean left(TextView widget, Spannable buffer) { diff --git a/core/java/android/text/method/SingleLineTransformationMethod.java b/core/java/android/text/method/SingleLineTransformationMethod.java index 818526a7d795..d6eff86920f8 100644 --- a/core/java/android/text/method/SingleLineTransformationMethod.java +++ b/core/java/android/text/method/SingleLineTransformationMethod.java @@ -21,6 +21,7 @@ package android.text.method; * displayed as spaces instead of causing line breaks, and causes * carriage return characters (\r) to have no appearance. */ +@android.ravenwood.annotation.RavenwoodKeepWholeClass public class SingleLineTransformationMethod extends ReplacementTransformationMethod { private static char[] ORIGINAL = new char[] { '\n', '\r' }; diff --git a/core/java/android/text/method/TextKeyListener.java b/core/java/android/text/method/TextKeyListener.java index 2eb917b6fd57..1b0ae61c62a4 100644 --- a/core/java/android/text/method/TextKeyListener.java +++ b/core/java/android/text/method/TextKeyListener.java @@ -43,6 +43,7 @@ import java.lang.ref.WeakReference; * with hardware keyboards. Software input methods have no obligation to trigger * the methods in this class. */ +@android.ravenwood.annotation.RavenwoodKeepWholeClass public class TextKeyListener extends BaseKeyListener implements SpanWatcher { private static TextKeyListener[] sInstance = new TextKeyListener[Capitalize.values().length * 2]; diff --git a/core/java/android/text/method/TimeKeyListener.java b/core/java/android/text/method/TimeKeyListener.java index f11f40099d9c..337611c79e3e 100644 --- a/core/java/android/text/method/TimeKeyListener.java +++ b/core/java/android/text/method/TimeKeyListener.java @@ -35,6 +35,7 @@ import java.util.Locale; * with hardware keyboards. Software input methods have no obligation to trigger * the methods in this class. */ +@android.ravenwood.annotation.RavenwoodKeepWholeClass public class TimeKeyListener extends NumberKeyListener { public int getInputType() { diff --git a/core/java/android/text/method/Touch.java b/core/java/android/text/method/Touch.java index 44811cb3ef8b..85aadba5da2b 100644 --- a/core/java/android/text/method/Touch.java +++ b/core/java/android/text/method/Touch.java @@ -25,6 +25,7 @@ import android.view.MotionEvent; import android.view.ViewConfiguration; import android.widget.TextView; +@android.ravenwood.annotation.RavenwoodKeepWholeClass public class Touch { private Touch() { } diff --git a/core/java/android/text/method/TransformationMethod.java b/core/java/android/text/method/TransformationMethod.java index 8f3b334abbbd..5246baa39d14 100644 --- a/core/java/android/text/method/TransformationMethod.java +++ b/core/java/android/text/method/TransformationMethod.java @@ -24,6 +24,7 @@ import android.view.View; * characters of passwords with dots, or keeping the newline characters * from causing line breaks in single-line text fields. */ +@android.ravenwood.annotation.RavenwoodKeepWholeClass public interface TransformationMethod { /** diff --git a/core/java/android/text/method/TransformationMethod2.java b/core/java/android/text/method/TransformationMethod2.java index 8d5ec246640e..6e0feb419f00 100644 --- a/core/java/android/text/method/TransformationMethod2.java +++ b/core/java/android/text/method/TransformationMethod2.java @@ -23,6 +23,7 @@ import android.compat.annotation.UnsupportedAppUsage; * * @hide */ +@android.ravenwood.annotation.RavenwoodKeepWholeClass public interface TransformationMethod2 extends TransformationMethod { /** * Relax the contract of TransformationMethod to allow length changes, diff --git a/core/java/android/text/method/TranslationTransformationMethod.java b/core/java/android/text/method/TranslationTransformationMethod.java index 43d186ee9d21..8f43d3dd1f6f 100644 --- a/core/java/android/text/method/TranslationTransformationMethod.java +++ b/core/java/android/text/method/TranslationTransformationMethod.java @@ -33,6 +33,7 @@ import java.util.regex.Pattern; * * @hide */ +@android.ravenwood.annotation.RavenwoodKeepWholeClass public class TranslationTransformationMethod implements TransformationMethod2 { private static final String TAG = "TranslationTransformationMethod"; diff --git a/core/java/android/text/method/WordIterator.java b/core/java/android/text/method/WordIterator.java index 2956f8461388..d57fa9b55312 100644 --- a/core/java/android/text/method/WordIterator.java +++ b/core/java/android/text/method/WordIterator.java @@ -37,6 +37,7 @@ import java.util.Locale; * Also provides methods to determine word boundaries. * {@hide} */ +@android.ravenwood.annotation.RavenwoodKeepWholeClass public class WordIterator implements Selection.PositionIterator { // Size of the window for the word iterator, should be greater than the longest word's length private static final int WINDOW_WIDTH = 50; diff --git a/core/java/android/text/style/AbsoluteSizeSpan.java b/core/java/android/text/style/AbsoluteSizeSpan.java index 6d4f05a84a03..1bc5d71fcd37 100644 --- a/core/java/android/text/style/AbsoluteSizeSpan.java +++ b/core/java/android/text/style/AbsoluteSizeSpan.java @@ -32,6 +32,7 @@ import android.text.TextUtils; *
*
*
*
* ClickableSpan.
*
* MaskFilterSpan.
* QuoteSpan.
* RelativeSizeSpan.
* ScaleXSpan.
*
* StyleSpan.TabStopSpan will only affect the first tab
* encountered on the first line of the text.
*/
+@android.ravenwood.annotation.RavenwoodKeepWholeClass
public interface TabStopSpan extends ParagraphStyle {
/**
diff --git a/core/java/android/text/style/TextAppearanceSpan.java b/core/java/android/text/style/TextAppearanceSpan.java
index 245a9dbc9f6c..7ede3499dc4d 100644
--- a/core/java/android/text/style/TextAppearanceSpan.java
+++ b/core/java/android/text/style/TextAppearanceSpan.java
@@ -58,6 +58,7 @@ import android.text.TextUtils;
* @attr ref android.R.styleable#TextAppearance_fontVariationSettings
*
*/
+@android.ravenwood.annotation.RavenwoodKeepWholeClass
public class TextAppearanceSpan extends MetricAffectingSpan implements ParcelableSpan {
private final String mFamilyName;
private final int mStyle;
diff --git a/core/java/android/text/style/TtsSpan.java b/core/java/android/text/style/TtsSpan.java
index e0d4ec1ca826..6d776d14fb00 100644
--- a/core/java/android/text/style/TtsSpan.java
+++ b/core/java/android/text/style/TtsSpan.java
@@ -42,6 +42,7 @@ import java.util.Locale;
* The inner classes are there for convenience and provide builders for each
* TtsSpan type.
*/
+@android.ravenwood.annotation.RavenwoodKeepWholeClass
public class TtsSpan implements ParcelableSpan {
private final String mType;
private final PersistableBundle mArgs;
diff --git a/core/java/android/text/style/TypefaceSpan.java b/core/java/android/text/style/TypefaceSpan.java
index bdfc772c0328..86f7f7638629 100644
--- a/core/java/android/text/style/TypefaceSpan.java
+++ b/core/java/android/text/style/TypefaceSpan.java
@@ -50,6 +50,7 @@ import android.text.TextUtils;
* TypefaceSpans constructed based on a font from resource and
* from a font family.
* URLSpan.
* [0..255] range for each channel.
*/
+@android.ravenwood.annotation.RavenwoodKeepWholeClass
public class LightingColorFilter extends ColorFilter {
@ColorInt
private int mMul;
diff --git a/graphics/java/android/graphics/LinearGradient.java b/graphics/java/android/graphics/LinearGradient.java
index 087937144b97..c6566c9b27fe 100644
--- a/graphics/java/android/graphics/LinearGradient.java
+++ b/graphics/java/android/graphics/LinearGradient.java
@@ -24,6 +24,7 @@ import android.compat.annotation.UnsupportedAppUsage;
import android.os.Build;
+@android.ravenwood.annotation.RavenwoodKeepWholeClass
public class LinearGradient extends Shader {
@UnsupportedAppUsage(maxTargetSdk = Build.VERSION_CODES.R, trackingBug = 170729553)
private float mX0;
diff --git a/graphics/java/android/graphics/MaskFilter.java b/graphics/java/android/graphics/MaskFilter.java
index d4743155729e..b490650e4d0c 100644
--- a/graphics/java/android/graphics/MaskFilter.java
+++ b/graphics/java/android/graphics/MaskFilter.java
@@ -21,6 +21,7 @@ package android.graphics;
* an alpha-channel mask before drawing it. A subclass of MaskFilter may be
* installed into a Paint. Blur and emboss are implemented as subclasses of MaskFilter.
*/
+@android.ravenwood.annotation.RavenwoodKeepWholeClass
public class MaskFilter {
protected void finalize() throws Throwable {
diff --git a/graphics/java/android/graphics/Mesh.java b/graphics/java/android/graphics/Mesh.java
index 6be8332e784b..f4d841b161fa 100644
--- a/graphics/java/android/graphics/Mesh.java
+++ b/graphics/java/android/graphics/Mesh.java
@@ -37,6 +37,7 @@ import java.nio.ShortBuffer;
* for the mesh. Once generated, a mesh object can be drawn through
* {@link Canvas#drawMesh(Mesh, BlendMode, Paint)}
*/
+@android.ravenwood.annotation.RavenwoodKeepWholeClass
public class Mesh {
private long mNativeMeshWrapper;
private boolean mIsIndexed;
diff --git a/graphics/java/android/graphics/MeshSpecification.java b/graphics/java/android/graphics/MeshSpecification.java
index b1aae7f37c31..9c7e948dfc1b 100644
--- a/graphics/java/android/graphics/MeshSpecification.java
+++ b/graphics/java/android/graphics/MeshSpecification.java
@@ -72,6 +72,7 @@ import java.lang.annotation.RetentionPolicy;
* These should be kept in mind when generating a mesh specification, as exceeding them will
* lead to errors.
*/
+@android.ravenwood.annotation.RavenwoodKeepWholeClass
public class MeshSpecification {
long mNativeMeshSpec;
diff --git a/graphics/java/android/graphics/Movie.java b/graphics/java/android/graphics/Movie.java
index 9c9535d16aab..cefe391f2d2c 100644
--- a/graphics/java/android/graphics/Movie.java
+++ b/graphics/java/android/graphics/Movie.java
@@ -27,6 +27,7 @@ import java.io.InputStream;
* @deprecated Prefer {@link android.graphics.drawable.AnimatedImageDrawable}.
*/
@Deprecated
+@android.ravenwood.annotation.RavenwoodKeepWholeClass
public class Movie {
@UnsupportedAppUsage(maxTargetSdk = Build.VERSION_CODES.R, trackingBug = 170729553)
private long mNativeMovie;
diff --git a/graphics/java/android/graphics/NinePatch.java b/graphics/java/android/graphics/NinePatch.java
index 382269f74366..00df23fe76ba 100644
--- a/graphics/java/android/graphics/NinePatch.java
+++ b/graphics/java/android/graphics/NinePatch.java
@@ -32,6 +32,7 @@ import android.compat.annotation.UnsupportedAppUsage;
* using a WYSIWYG graphics editor.
*
*/
+@android.ravenwood.annotation.RavenwoodKeepWholeClass
public class NinePatch {
/**
* Struct of inset information attached to a 9 patch bitmap.
diff --git a/graphics/java/android/graphics/Paint.java b/graphics/java/android/graphics/Paint.java
index 3d4dccf095f5..a0ca0988e03c 100644
--- a/graphics/java/android/graphics/Paint.java
+++ b/graphics/java/android/graphics/Paint.java
@@ -66,6 +66,7 @@ import java.util.Objects;
* The Paint class holds the style and color information about how to draw
* geometries, text and bitmaps.
*/
+@android.ravenwood.annotation.RavenwoodKeepWholeClass
public class Paint {
private static final String TAG = "Paint";
diff --git a/graphics/java/android/graphics/PaintFlagsDrawFilter.java b/graphics/java/android/graphics/PaintFlagsDrawFilter.java
index 232661113b5a..f4c49b11ea96 100644
--- a/graphics/java/android/graphics/PaintFlagsDrawFilter.java
+++ b/graphics/java/android/graphics/PaintFlagsDrawFilter.java
@@ -16,6 +16,7 @@
package android.graphics;
+@android.ravenwood.annotation.RavenwoodKeepWholeClass
public class PaintFlagsDrawFilter extends DrawFilter {
/**
* Subclass of DrawFilter that affects every paint by first clearing
diff --git a/graphics/java/android/graphics/PathDashPathEffect.java b/graphics/java/android/graphics/PathDashPathEffect.java
index 2b6a6edcc266..dc92e6caabcd 100644
--- a/graphics/java/android/graphics/PathDashPathEffect.java
+++ b/graphics/java/android/graphics/PathDashPathEffect.java
@@ -16,6 +16,7 @@
package android.graphics;
+@android.ravenwood.annotation.RavenwoodKeepWholeClass
public class PathDashPathEffect extends PathEffect {
public enum Style {
diff --git a/graphics/java/android/graphics/PathEffect.java b/graphics/java/android/graphics/PathEffect.java
index 3292501e6324..9bb71935cfd0 100644
--- a/graphics/java/android/graphics/PathEffect.java
+++ b/graphics/java/android/graphics/PathEffect.java
@@ -21,6 +21,7 @@ package android.graphics;
* the geometry of a drawing primitive before it is transformed by the
* canvas' matrix and drawn.
*/
+@android.ravenwood.annotation.RavenwoodKeepWholeClass
public class PathEffect {
protected void finalize() throws Throwable {
diff --git a/graphics/java/android/graphics/PathIterator.java b/graphics/java/android/graphics/PathIterator.java
index d7caabf9f91b..1ed70d02d140 100644
--- a/graphics/java/android/graphics/PathIterator.java
+++ b/graphics/java/android/graphics/PathIterator.java
@@ -34,6 +34,7 @@ import java.util.Iterator;
* PathIterator can be used to query a given {@link Path} object, to discover its
* operations and point values.
*/
+@android.ravenwood.annotation.RavenwoodKeepWholeClass
public class PathIterator implements IteratorVerb indicates the operation for a given segment of a path. These
@@ -69,6 +72,11 @@ public class PathIterator implements IteratorNote: Prior to API level 23 a picture cannot * be replayed on a hardware accelerated canvas.
*/ +@android.ravenwood.annotation.RavenwoodKeepWholeClass public class Picture { private PictureCanvas mRecordingCanvas; // TODO: Figure out if this was a false-positive diff --git a/graphics/java/android/graphics/PixelXorXfermode.java b/graphics/java/android/graphics/PixelXorXfermode.java index 27884e07ecfb..64278525bb1f 100644 --- a/graphics/java/android/graphics/PixelXorXfermode.java +++ b/graphics/java/android/graphics/PixelXorXfermode.java @@ -20,6 +20,7 @@ package android.graphics; * @removed */ @Deprecated +@android.ravenwood.annotation.RavenwoodKeepWholeClass public class PixelXorXfermode extends Xfermode { public PixelXorXfermode(int opColor) { diff --git a/graphics/java/android/graphics/PorterDuff.java b/graphics/java/android/graphics/PorterDuff.java index eb940e2f9017..730a804e17c3 100644 --- a/graphics/java/android/graphics/PorterDuff.java +++ b/graphics/java/android/graphics/PorterDuff.java @@ -26,6 +26,7 @@ import android.compat.annotation.UnsupportedAppUsage; * * Consider using {@link BlendMode} instead as it provides a wider variety of tinting options */ +@android.ravenwood.annotation.RavenwoodKeepWholeClass public class PorterDuff { /** * {@usesMathJax} diff --git a/graphics/java/android/graphics/PorterDuffColorFilter.java b/graphics/java/android/graphics/PorterDuffColorFilter.java index 0700f217ecf0..777ef6ce906b 100644 --- a/graphics/java/android/graphics/PorterDuffColorFilter.java +++ b/graphics/java/android/graphics/PorterDuffColorFilter.java @@ -25,6 +25,7 @@ import android.os.Build; * A color filter that can be used to tint the source pixels using a single * color and a specific {@link PorterDuff Porter-Duff composite mode}. */ +@android.ravenwood.annotation.RavenwoodKeepWholeClass public class PorterDuffColorFilter extends ColorFilter { @ColorInt private int mColor; diff --git a/graphics/java/android/graphics/PorterDuffXfermode.java b/graphics/java/android/graphics/PorterDuffXfermode.java index 83d0507a5074..e10d7370d6f9 100644 --- a/graphics/java/android/graphics/PorterDuffXfermode.java +++ b/graphics/java/android/graphics/PorterDuffXfermode.java @@ -23,6 +23,7 @@ package android.graphics; * information on the available alpha compositing and blending modes. * */ +@android.ravenwood.annotation.RavenwoodKeepWholeClass public class PorterDuffXfermode extends Xfermode { /** * Create an xfermode that uses the specified porter-duff mode. diff --git a/graphics/java/android/graphics/PostProcessor.java b/graphics/java/android/graphics/PostProcessor.java index 6fed39b9975d..066214ac6cd6 100644 --- a/graphics/java/android/graphics/PostProcessor.java +++ b/graphics/java/android/graphics/PostProcessor.java @@ -37,6 +37,7 @@ import android.graphics.drawable.Drawable; * *Supplied to ImageDecoder via {@link ImageDecoder#setPostProcessor setPostProcessor}.
*/ +@android.ravenwood.annotation.RavenwoodKeepWholeClass public interface PostProcessor { /** * Do any processing after (for example) decoding. diff --git a/graphics/java/android/graphics/RadialGradient.java b/graphics/java/android/graphics/RadialGradient.java index e582e66e1627..06e92eae9c82 100644 --- a/graphics/java/android/graphics/RadialGradient.java +++ b/graphics/java/android/graphics/RadialGradient.java @@ -24,6 +24,7 @@ import android.annotation.Nullable; import android.compat.annotation.UnsupportedAppUsage; import android.os.Build; +@android.ravenwood.annotation.RavenwoodKeepWholeClass public class RadialGradient extends Shader { @UnsupportedAppUsage(maxTargetSdk = Build.VERSION_CODES.R, trackingBug = 170729553) private float mX; diff --git a/graphics/java/android/graphics/Rasterizer.java b/graphics/java/android/graphics/Rasterizer.java index 575095426563..5e67da50a40d 100644 --- a/graphics/java/android/graphics/Rasterizer.java +++ b/graphics/java/android/graphics/Rasterizer.java @@ -24,6 +24,7 @@ package android.graphics; /** * @removed feature is not supported by hw-accerlerated or PDF backends */ +@android.ravenwood.annotation.RavenwoodKeepWholeClass public class Rasterizer { protected void finalize() throws Throwable { } diff --git a/graphics/java/android/graphics/RecordingCanvas.java b/graphics/java/android/graphics/RecordingCanvas.java index cc5b3b94e0fa..a56f461e511a 100644 --- a/graphics/java/android/graphics/RecordingCanvas.java +++ b/graphics/java/android/graphics/RecordingCanvas.java @@ -33,6 +33,7 @@ import dalvik.annotation.optimization.CriticalNative; * {@link RenderNode#endRecording()} is called. It must not be retained beyond that as it is * internally reused. */ +@android.ravenwood.annotation.RavenwoodKeepWholeClass public final class RecordingCanvas extends BaseRecordingCanvas { // The recording canvas pool should be large enough to handle a deeply nested // view hierarchy because display lists are generated recursively. diff --git a/graphics/java/android/graphics/Region.java b/graphics/java/android/graphics/Region.java index 29708738d2db..e2215d4bf300 100644 --- a/graphics/java/android/graphics/Region.java +++ b/graphics/java/android/graphics/Region.java @@ -23,6 +23,7 @@ import android.os.Parcel; import android.os.Parcelable; import android.util.Pools.SynchronizedPool; +@android.ravenwood.annotation.RavenwoodKeepWholeClass public class Region implements Parcelable { private static final int MAX_POOL_SIZE = 10; diff --git a/graphics/java/android/graphics/RegionIterator.java b/graphics/java/android/graphics/RegionIterator.java index 443b23c1b5fc..5d74487e5a8e 100644 --- a/graphics/java/android/graphics/RegionIterator.java +++ b/graphics/java/android/graphics/RegionIterator.java @@ -16,6 +16,7 @@ package android.graphics; +@android.ravenwood.annotation.RavenwoodKeepWholeClass public class RegionIterator { /** diff --git a/graphics/java/android/graphics/RenderEffect.java b/graphics/java/android/graphics/RenderEffect.java index b8a46856601e..06bfb82ef630 100644 --- a/graphics/java/android/graphics/RenderEffect.java +++ b/graphics/java/android/graphics/RenderEffect.java @@ -30,6 +30,7 @@ import libcore.util.NativeAllocationRegistry; * Additionally a {@link RenderEffect} can be applied to a View's backing RenderNode through * {@link android.view.View#setRenderEffect(RenderEffect)} */ +@android.ravenwood.annotation.RavenwoodKeepWholeClass public final class RenderEffect { private static class RenderEffectHolder { diff --git a/graphics/java/android/graphics/RenderNode.java b/graphics/java/android/graphics/RenderNode.java index 03a8b306f99d..fa41876187cf 100644 --- a/graphics/java/android/graphics/RenderNode.java +++ b/graphics/java/android/graphics/RenderNode.java @@ -192,6 +192,7 @@ import java.lang.ref.WeakReference; * top-level content is desired, and finally calling {@link Surface#unlockCanvasAndPost(Canvas)}. * */ +@android.ravenwood.annotation.RavenwoodKeepWholeClass public final class RenderNode { // Use a Holder to allow static initialization in the boot image. diff --git a/graphics/java/android/graphics/RuntimeColorFilter.java b/graphics/java/android/graphics/RuntimeColorFilter.java index a64acfe767a9..06aecc3f2c49 100644 --- a/graphics/java/android/graphics/RuntimeColorFilter.java +++ b/graphics/java/android/graphics/RuntimeColorFilter.java @@ -37,6 +37,7 @@ import com.android.graphics.hwui.flags.Flags; * */ @FlaggedApi(Flags.FLAG_RUNTIME_COLOR_FILTERS_BLENDERS) +@android.ravenwood.annotation.RavenwoodKeepWholeClass public class RuntimeColorFilter extends ColorFilter { private String mAgsl; diff --git a/graphics/java/android/graphics/RuntimeShader.java b/graphics/java/android/graphics/RuntimeShader.java index db2376e008f5..6464f72490c4 100644 --- a/graphics/java/android/graphics/RuntimeShader.java +++ b/graphics/java/android/graphics/RuntimeShader.java @@ -248,6 +248,7 @@ import libcore.util.NativeAllocationRegistry; * the bitmap), remember that the coordinates are local to the canvas. * */ +@android.ravenwood.annotation.RavenwoodKeepWholeClass public class RuntimeShader extends Shader { private static class NoImagePreloadHolder { diff --git a/graphics/java/android/graphics/RuntimeXfermode.java b/graphics/java/android/graphics/RuntimeXfermode.java index c8a0b1a11339..1e20bd352244 100644 --- a/graphics/java/android/graphics/RuntimeXfermode.java +++ b/graphics/java/android/graphics/RuntimeXfermode.java @@ -39,6 +39,7 @@ import libcore.util.NativeAllocationRegistry; * */ @FlaggedApi(Flags.FLAG_RUNTIME_COLOR_FILTERS_BLENDERS) +@android.ravenwood.annotation.RavenwoodKeepWholeClass public class RuntimeXfermode extends Xfermode { private static class NoImagePreloadHolder { diff --git a/graphics/java/android/graphics/Shader.java b/graphics/java/android/graphics/Shader.java index 4d6beadc0fdd..369fab45bf69 100644 --- a/graphics/java/android/graphics/Shader.java +++ b/graphics/java/android/graphics/Shader.java @@ -29,6 +29,7 @@ import libcore.util.NativeAllocationRegistry; * paint.setShader(shader). After that any object (other than a bitmap) that is * drawn with that paint will get its color(s) from the shader. */ +@android.ravenwood.annotation.RavenwoodKeepWholeClass public class Shader { private static class NoImagePreloadHolder { diff --git a/graphics/java/android/graphics/SumPathEffect.java b/graphics/java/android/graphics/SumPathEffect.java index 8fedc317c428..3543e101fb38 100644 --- a/graphics/java/android/graphics/SumPathEffect.java +++ b/graphics/java/android/graphics/SumPathEffect.java @@ -16,6 +16,7 @@ package android.graphics; +@android.ravenwood.annotation.RavenwoodKeepWholeClass public class SumPathEffect extends PathEffect { /** diff --git a/graphics/java/android/graphics/SurfaceTexture.java b/graphics/java/android/graphics/SurfaceTexture.java index 5caedba364be..df384ead58fb 100644 --- a/graphics/java/android/graphics/SurfaceTexture.java +++ b/graphics/java/android/graphics/SurfaceTexture.java @@ -78,6 +78,7 @@ import java.lang.ref.WeakReference; * frame-available callback is called on an arbitrary thread, so unless special care is taken {@link * #updateTexImage} should not be called directly from the callback. */ +@android.ravenwood.annotation.RavenwoodKeepWholeClass public class SurfaceTexture { private final Looper mCreatorLooper; @UnsupportedAppUsage(maxTargetSdk = Build.VERSION_CODES.R, trackingBug = 170729553) diff --git a/graphics/java/android/graphics/SweepGradient.java b/graphics/java/android/graphics/SweepGradient.java index 3a29395b1717..94219259a69d 100644 --- a/graphics/java/android/graphics/SweepGradient.java +++ b/graphics/java/android/graphics/SweepGradient.java @@ -23,6 +23,7 @@ import android.annotation.Nullable; import android.compat.annotation.UnsupportedAppUsage; import android.os.Build; +@android.ravenwood.annotation.RavenwoodKeepWholeClass public class SweepGradient extends Shader { @UnsupportedAppUsage(maxTargetSdk = Build.VERSION_CODES.R, trackingBug = 170729553) private float mCx; diff --git a/graphics/java/android/graphics/TableMaskFilter.java b/graphics/java/android/graphics/TableMaskFilter.java index 204f9705852a..ca7627c40031 100644 --- a/graphics/java/android/graphics/TableMaskFilter.java +++ b/graphics/java/android/graphics/TableMaskFilter.java @@ -21,6 +21,7 @@ import android.compat.annotation.UnsupportedAppUsage; /** * @hide */ +@android.ravenwood.annotation.RavenwoodKeepWholeClass public class TableMaskFilter extends MaskFilter { public TableMaskFilter(byte[] table) { diff --git a/graphics/java/android/graphics/TemporaryBuffer.java b/graphics/java/android/graphics/TemporaryBuffer.java index ef3f7f704e0d..681c48ea9f71 100644 --- a/graphics/java/android/graphics/TemporaryBuffer.java +++ b/graphics/java/android/graphics/TemporaryBuffer.java @@ -23,6 +23,7 @@ import com.android.internal.util.ArrayUtils; /** * @hide */ +@android.ravenwood.annotation.RavenwoodKeepWholeClass public class TemporaryBuffer { @UnsupportedAppUsage public static char[] obtain(int len) { diff --git a/graphics/java/android/graphics/TextureLayer.java b/graphics/java/android/graphics/TextureLayer.java index ac1bd6902062..981b78a7b5b8 100644 --- a/graphics/java/android/graphics/TextureLayer.java +++ b/graphics/java/android/graphics/TextureLayer.java @@ -29,6 +29,7 @@ import com.android.internal.util.VirtualRefBasePtr; * * @hide TODO: Make this a SystemApi for b/155905258 */ +@android.ravenwood.annotation.RavenwoodKeepWholeClass public final class TextureLayer implements AutoCloseable { private HardwareRenderer mRenderer; private VirtualRefBasePtr mFinalizer; diff --git a/graphics/java/android/graphics/Typeface.java b/graphics/java/android/graphics/Typeface.java index 874b847c709c..d1aca34c7b8d 100644 --- a/graphics/java/android/graphics/Typeface.java +++ b/graphics/java/android/graphics/Typeface.java @@ -42,6 +42,7 @@ import android.os.SystemProperties; import android.os.Trace; import android.provider.FontRequest; import android.provider.FontsContract; +import android.ravenwood.annotation.RavenwoodReplace; import android.system.ErrnoException; import android.system.OsConstants; import android.text.FontConfig; @@ -86,6 +87,7 @@ import java.util.Objects; * textSize, textSkewX, textScaleX to specify * how text appears when drawn (and measured). */ +@android.ravenwood.annotation.RavenwoodKeepWholeClass public class Typeface { private static String TAG = "Typeface"; @@ -93,9 +95,11 @@ public class Typeface { /** @hide */ public static final boolean ENABLE_LAZY_TYPEFACE_INITIALIZATION = true; - private static final NativeAllocationRegistry sRegistry = - NativeAllocationRegistry.createMalloced( - Typeface.class.getClassLoader(), nativeGetReleaseFunc()); + private static class NoImagePreloadHolder { + static final NativeAllocationRegistry sRegistry = + NativeAllocationRegistry.createMalloced( + Typeface.class.getClassLoader(), nativeGetReleaseFunc()); + } /** The default NORMAL typeface object */ public static final Typeface DEFAULT = null; @@ -1284,7 +1288,7 @@ public class Typeface { } native_instance = ni; - mCleaner = sRegistry.registerNativeAllocation(this, native_instance); + mCleaner = NoImagePreloadHolder.sRegistry.registerNativeAllocation(this, native_instance); mStyle = nativeGetStyle(ni); mWeight = nativeGetWeight(ni); mIsVariationInstance = nativeIsVariationInstance(ni); @@ -1560,9 +1564,23 @@ public class Typeface { } static { + staticInitializer(); + } + + @RavenwoodReplace(reason = "Prevent circular reference on host side JVM", bug = 337329128) + private static void staticInitializer() { + init(); + } + + private static void staticInitializer$ravenwood() { + /* no-op */ + } + + /** @hide */ + public static void init() { // Preload Roboto-Regular.ttf in Zygote for improving app launch performance. - preloadFontFile("/system/fonts/Roboto-Regular.ttf"); - preloadFontFile("/system/fonts/RobotoStatic-Regular.ttf"); + preloadFontFile(SystemFonts.SYSTEM_FONT_DIR + "Roboto-Regular.ttf"); + preloadFontFile(SystemFonts.SYSTEM_FONT_DIR + "RobotoStatic-Regular.ttf"); String locale = SystemProperties.get("persist.sys.locale", "en-US"); String script = ULocale.addLikelySubtags(ULocale.forLanguageTag(locale)).getScript(); @@ -1642,6 +1660,21 @@ public class Typeface { setSystemFontMap(typefaceMap); } + /** + * {@link #loadPreinstalledSystemFontMap()} does not actually initialize the native + * system font APIs. Add a new method to actually load the font files without going + * through SharedMemory. + * + * @hide + */ + public static void loadNativeSystemFonts() { + synchronized (SYSTEM_FONT_MAP_LOCK) { + for (var type : sSystemFontMap.values()) { + nativeAddFontCollections(type.native_instance); + } + } + } + static { if (!ENABLE_LAZY_TYPEFACE_INITIALIZATION) { loadPreinstalledSystemFontMap(); diff --git a/graphics/java/android/graphics/Xfermode.java b/graphics/java/android/graphics/Xfermode.java index fb689e4cb9c2..eda9e3c1055d 100644 --- a/graphics/java/android/graphics/Xfermode.java +++ b/graphics/java/android/graphics/Xfermode.java @@ -28,4 +28,5 @@ package android.graphics; * specified in the Modes enum. When an Xfermode is assigned to a Paint, then * objects drawn with that paint have the xfermode applied. */ +@android.ravenwood.annotation.RavenwoodKeepWholeClass public class Xfermode {} diff --git a/graphics/java/android/graphics/YuvImage.java b/graphics/java/android/graphics/YuvImage.java index b0c7f202f23a..2b7f40493e8d 100644 --- a/graphics/java/android/graphics/YuvImage.java +++ b/graphics/java/android/graphics/YuvImage.java @@ -32,6 +32,7 @@ import java.io.OutputStream; * To compress a rectangle region in the YUV data, users have to specify the * region by left, top, width and height. */ +@android.ravenwood.annotation.RavenwoodKeepWholeClass public class YuvImage { /** diff --git a/graphics/java/android/graphics/fonts/Font.java b/graphics/java/android/graphics/fonts/Font.java index 2893177aafc5..8be340005543 100644 --- a/graphics/java/android/graphics/fonts/Font.java +++ b/graphics/java/android/graphics/fonts/Font.java @@ -44,6 +44,7 @@ import java.io.IOException; import java.io.InputStream; import java.nio.ByteBuffer; import java.nio.ByteOrder; +import java.nio.channels.Channels; import java.nio.channels.FileChannel; import java.util.Arrays; import java.util.Collections; @@ -54,6 +55,7 @@ import java.util.Set; /** * A font class can be used for creating FontFamily. */ +@android.ravenwood.annotation.RavenwoodKeepWholeClass public final class Font { private static final String TAG = "Font"; @@ -293,7 +295,14 @@ public final class Font { int capacity = assetStream.available(); ByteBuffer buffer = ByteBuffer.allocateDirect(capacity); buffer.order(ByteOrder.nativeOrder()); - assetStream.read(buffer.array(), buffer.arrayOffset(), assetStream.available()); + if (buffer.hasArray()) { + assetStream.read(buffer.array(), buffer.arrayOffset(), assetStream.available()); + } else { + // Direct buffer does not have a backing array on Ravenwood, + // wrap it with a channel and read from it + var ch = Channels.newChannel(assetStream); + ch.read(buffer.duplicate()); + } if (assetStream.read() != -1) { throw new IOException("Unable to access full contents of " + path); diff --git a/graphics/java/android/graphics/fonts/FontCustomizationParser.java b/graphics/java/android/graphics/fonts/FontCustomizationParser.java index b7bf0553bcc6..732a5f3bfce4 100644 --- a/graphics/java/android/graphics/fonts/FontCustomizationParser.java +++ b/graphics/java/android/graphics/fonts/FontCustomizationParser.java @@ -43,6 +43,7 @@ import java.util.Map; * * @hide */ +@android.ravenwood.annotation.RavenwoodKeepWholeClass public class FontCustomizationParser { private static final String TAG = "FontCustomizationParser"; diff --git a/graphics/java/android/graphics/fonts/FontFamily.java b/graphics/java/android/graphics/fonts/FontFamily.java index 5a7b0bbca399..0ab46398c924 100644 --- a/graphics/java/android/graphics/fonts/FontFamily.java +++ b/graphics/java/android/graphics/fonts/FontFamily.java @@ -66,6 +66,7 @@ import java.util.Set; * * */ +@android.ravenwood.annotation.RavenwoodKeepWholeClass public final class FontFamily { private static final String TAG = "FontFamily"; diff --git a/graphics/java/android/graphics/fonts/FontFileUtil.java b/graphics/java/android/graphics/fonts/FontFileUtil.java index abcafb666576..305ab3b39995 100644 --- a/graphics/java/android/graphics/fonts/FontFileUtil.java +++ b/graphics/java/android/graphics/fonts/FontFileUtil.java @@ -32,6 +32,7 @@ import java.util.Set; * Provides a utility for font file operations. * @hide */ +@android.ravenwood.annotation.RavenwoodKeepWholeClass public class FontFileUtil { private FontFileUtil() {} // Do not instantiate diff --git a/graphics/java/android/graphics/fonts/FontStyle.java b/graphics/java/android/graphics/fonts/FontStyle.java index 48969aa71059..b3ddbed645ff 100644 --- a/graphics/java/android/graphics/fonts/FontStyle.java +++ b/graphics/java/android/graphics/fonts/FontStyle.java @@ -44,6 +44,7 @@ import java.util.Objects; * * */ +@android.ravenwood.annotation.RavenwoodKeepWholeClass public final class FontStyle { private static final String TAG = "FontStyle"; diff --git a/graphics/java/android/graphics/fonts/FontVariationAxis.java b/graphics/java/android/graphics/fonts/FontVariationAxis.java index 30a248bb3e0e..1d715940d628 100644 --- a/graphics/java/android/graphics/fonts/FontVariationAxis.java +++ b/graphics/java/android/graphics/fonts/FontVariationAxis.java @@ -31,6 +31,7 @@ import java.util.regex.Pattern; /** * Class that holds information about single font variation axis. */ +@android.ravenwood.annotation.RavenwoodKeepWholeClass public final class FontVariationAxis { @UnsupportedAppUsage(maxTargetSdk = Build.VERSION_CODES.P, trackingBug = 115609023) private final int mTag; diff --git a/graphics/java/android/graphics/fonts/SystemFonts.java b/graphics/java/android/graphics/fonts/SystemFonts.java index 0e25c346064c..599c42659ece 100644 --- a/graphics/java/android/graphics/fonts/SystemFonts.java +++ b/graphics/java/android/graphics/fonts/SystemFonts.java @@ -25,6 +25,7 @@ import android.annotation.Nullable; import android.graphics.FontListParser; import android.graphics.Typeface; import android.os.LocaleList; +import android.ravenwood.annotation.RavenwoodReplace; import android.text.FontConfig; import android.util.ArrayMap; import android.util.Log; @@ -32,6 +33,7 @@ import android.util.SparseIntArray; import com.android.internal.annotations.GuardedBy; import com.android.internal.annotations.VisibleForTesting; +import com.android.internal.ravenwood.RavenwoodEnvironment; import org.xmlpull.v1.XmlPullParserException; @@ -50,23 +52,46 @@ import java.util.Set; /** * Provides the system font configurations. */ +@android.ravenwood.annotation.RavenwoodKeepWholeClass public final class SystemFonts { private static final String TAG = "SystemFonts"; - private static final String FONTS_XML = "/system/etc/font_fallback.xml"; - private static final String LEGACY_FONTS_XML = "/system/etc/fonts.xml"; + private static final String FONTS_XML = getFontsXmlDir() + "font_fallback.xml"; + /** @hide */ + public static final String LEGACY_FONTS_XML = getFontsXmlDir() + "fonts.xml"; /** @hide */ - public static final String SYSTEM_FONT_DIR = "/system/fonts/"; + public static final String SYSTEM_FONT_DIR = getSystemFontDir(); private static final String OEM_XML = "/product/etc/fonts_customization.xml"; /** @hide */ public static final String OEM_FONT_DIR = "/product/fonts/"; + private static final String DEVICE_FONTS_XML_DIR = "/system/etc/"; + private static final String DEVICE_FONT_DIR = "/system/fonts/"; + private SystemFonts() {} // Do not instansiate. private static final Object LOCK = new Object(); private static @GuardedBy("sLock") Set sAvailableFonts; + @RavenwoodReplace + private static String getFontsXmlDir() { + return DEVICE_FONTS_XML_DIR; + } + + private static String getFontsXmlDir$ravenwood() { + return RavenwoodEnvironment.getInstance().getRavenwoodRuntimePath() + "fonts/"; + } + + @RavenwoodReplace + private static String getSystemFontDir() { + return DEVICE_FONT_DIR; + } + + private static String getSystemFontDir$ravenwood() { + return RavenwoodEnvironment.getInstance().getRavenwoodRuntimePath() + "fonts/"; + } + /** * Returns all available font files in the system. * diff --git a/graphics/java/android/graphics/text/GraphemeBreak.java b/graphics/java/android/graphics/text/GraphemeBreak.java index f82b2fd659cc..0bc1e3b0cae3 100644 --- a/graphics/java/android/graphics/text/GraphemeBreak.java +++ b/graphics/java/android/graphics/text/GraphemeBreak.java @@ -17,6 +17,7 @@ package android.graphics.text; /** @hide */ +@android.ravenwood.annotation.RavenwoodKeepWholeClass public class GraphemeBreak { private GraphemeBreak() { } diff --git a/graphics/java/android/graphics/text/LineBreakConfig.java b/graphics/java/android/graphics/text/LineBreakConfig.java index 5a1086cef407..fa3cfbdd4e97 100644 --- a/graphics/java/android/graphics/text/LineBreakConfig.java +++ b/graphics/java/android/graphics/text/LineBreakConfig.java @@ -24,12 +24,13 @@ import android.annotation.IntDef; import android.annotation.NonNull; import android.annotation.Nullable; import android.annotation.SuppressLint; -import android.app.ActivityThread; import android.os.Build; import android.os.LocaleList; import android.os.Parcel; import android.os.Parcelable; +import dalvik.system.VMRuntime; + import java.lang.annotation.Retention; import java.lang.annotation.RetentionPolicy; import java.util.Objects; @@ -41,6 +42,7 @@ import java.util.Objects; * * line-break property for more information. */ +@android.ravenwood.annotation.RavenwoodKeepWholeClass public final class LineBreakConfig implements Parcelable { /** * No hyphenation preference is specified. @@ -484,8 +486,7 @@ public final class LineBreakConfig implements Parcelable { * @hide */ public static @LineBreakStyle int getResolvedLineBreakStyle(@Nullable LineBreakConfig config) { - final int targetSdkVersion = ActivityThread.currentApplication().getApplicationInfo() - .targetSdkVersion; + final int targetSdkVersion = VMRuntime.getRuntime().getTargetSdkVersion(); final int defaultStyle; final int vicVersion = Build.VERSION_CODES.VANILLA_ICE_CREAM; if (targetSdkVersion >= vicVersion) { @@ -519,8 +520,7 @@ public final class LineBreakConfig implements Parcelable { */ public static @LineBreakWordStyle int getResolvedLineBreakWordStyle( @Nullable LineBreakConfig config) { - final int targetSdkVersion = ActivityThread.currentApplication().getApplicationInfo() - .targetSdkVersion; + final int targetSdkVersion = VMRuntime.getRuntime().getTargetSdkVersion(); final int defaultWordStyle; final int vicVersion = Build.VERSION_CODES.VANILLA_ICE_CREAM; if (targetSdkVersion >= vicVersion) { diff --git a/graphics/java/android/graphics/text/LineBreaker.java b/graphics/java/android/graphics/text/LineBreaker.java index 94de066c9182..29135b837352 100644 --- a/graphics/java/android/graphics/text/LineBreaker.java +++ b/graphics/java/android/graphics/text/LineBreaker.java @@ -91,6 +91,7 @@ import java.lang.annotation.RetentionPolicy; * * */ +@android.ravenwood.annotation.RavenwoodKeepWholeClass public class LineBreaker { /** @hide */ @IntDef(prefix = { "BREAK_STRATEGY_" }, value = { diff --git a/graphics/java/android/graphics/text/MeasuredText.java b/graphics/java/android/graphics/text/MeasuredText.java index 884268a4b85c..f58d5311fa30 100644 --- a/graphics/java/android/graphics/text/MeasuredText.java +++ b/graphics/java/android/graphics/text/MeasuredText.java @@ -56,6 +56,7 @@ import java.util.Objects; * * */ +@android.ravenwood.annotation.RavenwoodKeepWholeClass public class MeasuredText { private static final String TAG = "MeasuredText"; diff --git a/graphics/java/android/graphics/text/PositionedGlyphs.java b/graphics/java/android/graphics/text/PositionedGlyphs.java index 43216ba6e087..31125ffa7bd4 100644 --- a/graphics/java/android/graphics/text/PositionedGlyphs.java +++ b/graphics/java/android/graphics/text/PositionedGlyphs.java @@ -46,6 +46,7 @@ import java.util.Objects; * @see TextRunShaper#shapeTextRun(char[], int, int, int, int, float, float, boolean, Paint) * @see TextRunShaper#shapeTextRun(CharSequence, int, int, int, int, float, float, boolean, Paint) */ +@android.ravenwood.annotation.RavenwoodKeepWholeClass public final class PositionedGlyphs { private static class NoImagePreloadHolder { private static final NativeAllocationRegistry REGISTRY = diff --git a/graphics/java/android/graphics/text/TextRunShaper.java b/graphics/java/android/graphics/text/TextRunShaper.java index 19ea04a48046..f1e3d67e9925 100644 --- a/graphics/java/android/graphics/text/TextRunShaper.java +++ b/graphics/java/android/graphics/text/TextRunShaper.java @@ -40,6 +40,7 @@ import com.android.internal.util.Preconditions; * @see android.text.TextShaper#shapeText(CharSequence, int, int, TextDirectionHeuristic, TextPaint, * TextShaper.GlyphsConsumer) */ +@android.ravenwood.annotation.RavenwoodKeepWholeClass public class TextRunShaper { private TextRunShaper() {} // Do not instantiate diff --git a/libs/hwui/Android.bp b/libs/hwui/Android.bp index bb2a53bc04d6..38ac8ab7135e 100644 --- a/libs/hwui/Android.bp +++ b/libs/hwui/Android.bp @@ -232,6 +232,14 @@ java_sdk_library { unsafe_ignore_missing_latest_api: true, } +filegroup { + name: "framework-graphics-ravenwood-policies", + srcs: [ + "framework-graphics-ravenwood-policies.txt", + ], + visibility: ["//frameworks/base/ravenwood"], +} + filegroup { name: "framework-graphics-srcs", srcs: [ @@ -461,6 +469,10 @@ cc_defaults { }, linux: { srcs: ["platform/linux/utils/SharedLib.cpp"], + shared_libs: [ + "libbinder", + "libbinder_ndk", + ], }, darwin: { srcs: ["platform/darwin/utils/SharedLib.cpp"], diff --git a/libs/hwui/framework-graphics-ravenwood-policies.txt b/libs/hwui/framework-graphics-ravenwood-policies.txt new file mode 100644 index 000000000000..7296225ccfe8 --- /dev/null +++ b/libs/hwui/framework-graphics-ravenwood-policies.txt @@ -0,0 +1 @@ +class android.graphics.ColorMatrix keepclass diff --git a/libs/hwui/jni/Bitmap.cpp b/libs/hwui/jni/Bitmap.cpp index cfde0b28c0d5..27d4ac7cef4b 100644 --- a/libs/hwui/jni/Bitmap.cpp +++ b/libs/hwui/jni/Bitmap.cpp @@ -613,7 +613,7 @@ static void Bitmap_setHasMipMap(JNIEnv* env, jobject, jlong bitmapHandle, /////////////////////////////////////////////////////////////////////////////// // TODO: Move somewhere else -#ifdef __ANDROID__ // Layoutlib does not support parcel +#ifdef __linux__ // Only Linux support parcel #define ON_ERROR_RETURN(X) \ if ((error = (X)) != STATUS_OK) return error @@ -717,7 +717,7 @@ static binder_status_t writeBlob(AParcel* parcel, uint64_t bitmapId, const SkBit #undef ON_ERROR_RETURN -#endif // __ANDROID__ // Layoutlib does not support parcel +#endif // __linux__ // Only Linux support parcel // This is the maximum possible size because the SkColorSpace must be // representable (and therefore serializable) using a matrix and numerical @@ -733,7 +733,7 @@ static bool validateImageInfo(const SkImageInfo& info, int32_t rowBytes) { } static jobject Bitmap_createFromParcel(JNIEnv* env, jobject, jobject parcel) { -#ifdef __ANDROID__ // Layoutlib does not support parcel +#ifdef __linux__ // Only Linux support parcel if (parcel == NULL) { jniThrowNullPointerException(env, "parcel cannot be null"); return NULL; @@ -836,14 +836,14 @@ static jobject Bitmap_createFromParcel(JNIEnv* env, jobject, jobject parcel) { return createBitmap(env, nativeBitmap.release(), getPremulBitmapCreateFlags(isMutable), nullptr, nullptr, density, sourceId); #else - jniThrowRuntimeException(env, "Cannot use parcels outside of Android"); + jniThrowRuntimeException(env, "Cannot use parcels outside of Linux"); return NULL; #endif } static jboolean Bitmap_writeToParcel(JNIEnv* env, jobject, jlong bitmapHandle, jint density, jobject parcel) { -#ifdef __ANDROID__ // Layoutlib does not support parcel +#ifdef __linux__ // Only Linux support parcel if (parcel == NULL) { ALOGD("------- writeToParcel null parcel\n"); return JNI_FALSE; @@ -901,7 +901,7 @@ static jboolean Bitmap_writeToParcel(JNIEnv* env, jobject, jlong bitmapHandle, j } return JNI_TRUE; #else - doThrowRE(env, "Cannot use parcels outside of Android"); + doThrowRE(env, "Cannot use parcels outside of Linux"); return JNI_FALSE; #endif } diff --git a/libs/hwui/jni/Region.cpp b/libs/hwui/jni/Region.cpp index 1e064b820591..76986eeb079d 100644 --- a/libs/hwui/jni/Region.cpp +++ b/libs/hwui/jni/Region.cpp @@ -18,7 +18,7 @@ #include "SkPath.h" #include "GraphicsJNI.h" -#ifdef __ANDROID__ // Layoutlib does not support parcel +#ifdef __linux__ // Only Linux support parcel #includeThis is only intended for use by {@code dalvik.system.CloseGuardSupport} class and so + * MUST NOT be used for any other purposes. + * + * @hide + */ + public static void setTracker(Tracker tracker) { + } + + /** + * Returns {@link #setTracker(Tracker) last Tracker that was set}, or null to indicate + * there is none. + * + *
This is only intended for use by {@code dalvik.system.CloseGuardSupport} class and so + * MUST NOT be used for any other purposes. + * + * @hide + */ + public static Tracker getTracker() { + return null; + } + + private CloseGuard() {} + + /** + * {@code open} initializes the instance with a warning that the caller + * should have explicitly called the {@code closer} method instead of + * relying on finalization. + * + * @param closer non-null name of explicit termination method. Printed by warnIfOpen. + * @throws NullPointerException if closer is null. + * + * @hide + */ + public void open(String closer) { + openWithCallSite(closer, null /* callsite */); + } + + /** + * Like {@link #open(String)}, but with explicit callsite string being passed in for better + * performance. + *
+ * This only has better performance than {@link #open(String)} if {@link #isEnabled()} returns {@code true}, which + * usually shouldn't happen on release builds. + * + * @param closer Non-null name of explicit termination method. Printed by warnIfOpen. + * @param callsite Non-null string uniquely identifying the callsite. + * + * @hide + */ + public void openWithCallSite(String closer, String callsite) { + } + + // We keep either an allocation stack containing the closer String or, when + // in disabled state, just the closer String. + // We keep them in a single field only to minimize overhead. + private Object /* String or Throwable */ closerNameOrAllocationInfo; + + /** + * Marks this CloseGuard instance as closed to avoid warnings on + * finalization. + * + * @hide + */ + public void close() { + } + + /** + * Logs a warning if the caller did not properly cleanup by calling an + * explicit close method before finalization. If CloseGuard was enabled + * when the CloseGuard was created, passes the stacktrace associated with + * the allocation to the current reporter. If it was not enabled, it just + * directly logs a brief message. + * + * @hide + */ + public void warnIfOpen() { + } + + + /** + * Interface to allow customization of tracking behaviour. + * + *
This is only intended for use by {@code dalvik.system.CloseGuardSupport} class and so
+ * MUST NOT be used for any other purposes.
+ *
+ * @hide
+ */
+ public interface Tracker {
+ void open(Throwable allocationSite);
+ void close(Throwable allocationSite);
+ }
+
+ /**
+ * Interface to allow customization of reporting behavior.
+ * @hide
+ */
+ public interface Reporter {
+ /**
+ *
+ * @hide
+ */
+ void report(String message, Throwable allocationSite);
+
+ /**
+ *
+ * @hide
+ */
+ default void report(String message) {}
+ }
+}
diff --git a/ravenwood/runtime-helper-src/libcore-fake/libcore/io/IoBridge.java b/ravenwood/runtime-helper-src/libcore-fake/libcore/io/IoBridge.java
new file mode 100644
index 000000000000..2a1ee2542982
--- /dev/null
+++ b/ravenwood/runtime-helper-src/libcore-fake/libcore/io/IoBridge.java
@@ -0,0 +1,63 @@
+/*
+ * Copyright (C) 2025 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 libcore.io;
+
+import android.system.ErrnoException;
+import android.system.Os;
+import android.system.OsConstants;
+
+import java.io.FileDescriptor;
+import java.io.FileNotFoundException;
+import java.io.IOException;
+
+public class IoBridge {
+
+ public static void closeAndSignalBlockedThreads(FileDescriptor fd) throws IOException {
+ if (fd == null) {
+ return;
+ }
+ try {
+ Os.close(fd);
+ } catch (ErrnoException errnoException) {
+ throw errnoException.rethrowAsIOException();
+ }
+ }
+
+ public static FileDescriptor open(String path, int flags) throws FileNotFoundException {
+ FileDescriptor fd = null;
+ try {
+ fd = Os.open(path, flags, 0666);
+ // Posix open(2) fails with EISDIR only if you ask for write permission.
+ // Java disallows reading directories too.f
+ if (OsConstants.S_ISDIR(Os.fstat(fd).st_mode)) {
+ throw new ErrnoException("open", OsConstants.EISDIR);
+ }
+ return fd;
+ } catch (ErrnoException errnoException) {
+ try {
+ if (fd != null) {
+ closeAndSignalBlockedThreads(fd);
+ }
+ } catch (IOException ignored) {
+ }
+ FileNotFoundException ex = new FileNotFoundException(path + ": "
+ + errnoException.getMessage());
+ ex.initCause(errnoException);
+ throw ex;
+ }
+ }
+}
diff --git a/ravenwood/runtime-helper-src/libcore-fake/libcore/util/NativeAllocationRegistry.java b/ravenwood/runtime-helper-src/libcore-fake/libcore/util/NativeAllocationRegistry.java
index ad86135de32e..cf1a5138cbc6 100644
--- a/ravenwood/runtime-helper-src/libcore-fake/libcore/util/NativeAllocationRegistry.java
+++ b/ravenwood/runtime-helper-src/libcore-fake/libcore/util/NativeAllocationRegistry.java
@@ -35,6 +35,11 @@ public class NativeAllocationRegistry {
return new NativeAllocationRegistry(classLoader, freeFunction, size);
}
+ public static NativeAllocationRegistry createNonmalloced(
+ Class clazz, long freeFunction, long size) {
+ return new NativeAllocationRegistry(clazz.getClassLoader(), freeFunction, size);
+ }
+
public static NativeAllocationRegistry createMalloced(
ClassLoader classLoader, long freeFunction, long size) {
return new NativeAllocationRegistry(classLoader, freeFunction, size);
@@ -45,6 +50,11 @@ public class NativeAllocationRegistry {
return new NativeAllocationRegistry(classLoader, freeFunction, 0);
}
+ public static NativeAllocationRegistry createMalloced(
+ Class clazz, long freeFunction, long size) {
+ return new NativeAllocationRegistry(clazz.getClassLoader(), freeFunction, size);
+ }
+
public NativeAllocationRegistry(ClassLoader classLoader, long freeFunction, long size) {
if (size < 0) {
throw new IllegalArgumentException("Invalid native allocation size: " + size);
@@ -52,6 +62,37 @@ public class NativeAllocationRegistry {
mFreeFunction = freeFunction;
}
+ private class CleanerThunk implements Runnable {
+ private long nativePtr;
+
+ public CleanerThunk() {
+ nativePtr = 0;
+ }
+
+ public void setNativePtr(long ptr) {
+ nativePtr = ptr;
+ }
+
+ @Override
+ public void run() {
+ if (nativePtr != 0) {
+ applyFreeFunction(mFreeFunction, nativePtr);
+ }
+ }
+ }
+
+ private static class CleanableRunner implements Runnable {
+ private final Cleaner.Cleanable mCleanable;
+
+ public CleanableRunner(Cleaner.Cleanable cleanable) {
+ mCleanable = cleanable;
+ }
+
+ public void run() {
+ mCleanable.clean();
+ }
+ }
+
public Runnable registerNativeAllocation(Object referent, long nativePtr) {
if (referent == null) {
throw new IllegalArgumentException("referent is null");
@@ -60,13 +101,25 @@ public class NativeAllocationRegistry {
throw new IllegalArgumentException("nativePtr is null");
}
- final Runnable releaser = () -> {
- RavenwoodRuntimeNative.applyFreeFunction(mFreeFunction, nativePtr);
- };
- sCleaner.register(referent, releaser);
+ final CleanerThunk thunk;
+ final CleanableRunner result;
+ try {
+ thunk = new CleanerThunk();
+ final var cleanable = sCleaner.register(referent, thunk);
+ result = new CleanableRunner(cleanable);
+ } catch (VirtualMachineError vme /* probably OutOfMemoryError */) {
+ applyFreeFunction(mFreeFunction, nativePtr);
+ throw vme;
+ }
+ // Enable the cleaner only after we can no longer throw anything, including OOME.
+ thunk.setNativePtr(nativePtr);
// Ensure that cleaner doesn't get invoked before we enable it.
Reference.reachabilityFence(referent);
- return releaser;
+ return result;
+ }
+
+ public static void applyFreeFunction(long freeFunction, long nativePtr) {
+ RavenwoodRuntimeNative.applyFreeFunction(freeFunction, nativePtr);
}
}
diff --git a/ravenwood/runtime-jni/ravenwood_runtime.cpp b/ravenwood/runtime-jni/ravenwood_runtime.cpp
index 8d8ed7119e84..01ebdc953539 100644
--- a/ravenwood/runtime-jni/ravenwood_runtime.cpp
+++ b/ravenwood/runtime-jni/ravenwood_runtime.cpp
@@ -20,6 +20,7 @@
#include