diff options
author | 2023-11-13 11:09:27 -0700 | |
---|---|---|
committer | 2023-11-15 09:42:09 -0700 | |
commit | 73067713b07dbb98934e46ca930fc69e45cef984 (patch) | |
tree | 9728db632508a21f7a35e3962ff8a4536511b384 | |
parent | f8810f0d77eeefe487ec13a2966bfe2b2463d948 (diff) |
[1/?] Support android.content for Ravenwood.
Initial pass at foundational classes under android.content, along
with CTS to verify consistency.
Methods that interface to broader parts of OS remain marked as
"throw" for the moment, such as cross-process work and StrictMode.
Bug: 292141694
Test: atest-dev CtsOsTestCasesRavenwood CtsOsTestCases
Test: atest-dev CtsContentTestCasesRavenwood CtsContentTestCases
Change-Id: Ic3deafb1f4058fcc104882a3508728994669f7d2
-rw-r--r-- | Ravenwood.bp | 1 | ||||
-rw-r--r-- | core/java/android/content/ClipData.java | 10 | ||||
-rw-r--r-- | core/java/android/content/ClipDescription.java | 1 | ||||
-rw-r--r-- | core/java/android/content/ComponentName.java | 1 | ||||
-rw-r--r-- | core/java/android/content/ContentUris.java | 1 | ||||
-rw-r--r-- | core/java/android/content/ContentValues.java | 1 | ||||
-rw-r--r-- | core/java/android/content/Intent.java | 10 | ||||
-rw-r--r-- | core/java/android/content/IntentFilter.java | 1 | ||||
-rw-r--r-- | core/java/android/content/UriMatcher.java | 1 | ||||
-rw-r--r-- | ravenwood/framework-minus-apex-ravenwood-policies.txt | 12 | ||||
-rw-r--r-- | ravenwood/ravenwood-annotation-allowed-classes.txt | 10 | ||||
-rw-r--r-- | tools/hoststubgen/hoststubgen/helper-framework-runtime-src/framework/com/android/hoststubgen/nativesubstitution/Parcel_host.java | 6 |
12 files changed, 54 insertions, 1 deletions
diff --git a/Ravenwood.bp b/Ravenwood.bp index 2f6709090093..b497871aee85 100644 --- a/Ravenwood.bp +++ b/Ravenwood.bp @@ -82,6 +82,7 @@ android_ravenwood_libgroup { "junit", "truth", "ravenwood-junit", + "android.test.mock", ], } diff --git a/core/java/android/content/ClipData.java b/core/java/android/content/ClipData.java index 0bc459a19e7d..67759f4aa76d 100644 --- a/core/java/android/content/ClipData.java +++ b/core/java/android/content/ClipData.java @@ -163,6 +163,7 @@ import java.util.List; * into an editor), then {@link Item#coerceToText(Context)} will ask the content * provider for the clip URI as text and successfully paste the entire note. */ +@android.ravenwood.annotation.RavenwoodKeepWholeClass public class ClipData implements Parcelable { static final String[] MIMETYPES_TEXT_PLAIN = new String[] { ClipDescription.MIMETYPE_TEXT_PLAIN }; @@ -387,6 +388,7 @@ public class ClipData implements Parcelable { * @return Returns the item's textual representation. */ //BEGIN_INCLUDE(coerceToText) + @android.ravenwood.annotation.RavenwoodThrow public CharSequence coerceToText(Context context) { // If this Item has an explicit textual value, simply return that. CharSequence text = getText(); @@ -470,6 +472,7 @@ public class ClipData implements Parcelable { * and other things can be retrieved. * @return Returns the item's textual representation. */ + @android.ravenwood.annotation.RavenwoodThrow public CharSequence coerceToStyledText(Context context) { CharSequence text = getText(); if (text instanceof Spanned) { @@ -520,6 +523,7 @@ public class ClipData implements Parcelable { * and other things can be retrieved. * @return Returns the item's representation as HTML text. */ + @android.ravenwood.annotation.RavenwoodThrow public String coerceToHtmlText(Context context) { // If the item has an explicit HTML value, simply return that. String htmlText = getHtmlText(); @@ -540,6 +544,7 @@ public class ClipData implements Parcelable { return text != null ? text.toString() : null; } + @android.ravenwood.annotation.RavenwoodThrow private CharSequence coerceToHtmlOrStyledText(Context context, boolean styled) { // If this Item has a URI value, try using that. if (mUri != null) { @@ -1030,6 +1035,7 @@ public class ClipData implements Parcelable { * * @hide */ + @android.ravenwood.annotation.RavenwoodThrow public void prepareToLeaveProcess(boolean leavingPackage) { // Assume that callers are going to be granting permissions prepareToLeaveProcess(leavingPackage, Intent.FLAG_GRANT_READ_URI_PERMISSION); @@ -1040,6 +1046,7 @@ public class ClipData implements Parcelable { * * @hide */ + @android.ravenwood.annotation.RavenwoodThrow public void prepareToLeaveProcess(boolean leavingPackage, int intentFlags) { final int size = mItems.size(); for (int i = 0; i < size; i++) { @@ -1060,6 +1067,7 @@ public class ClipData implements Parcelable { } /** {@hide} */ + @android.ravenwood.annotation.RavenwoodThrow public void prepareToEnterProcess(AttributionSource source) { final int size = mItems.size(); for (int i = 0; i < size; i++) { @@ -1073,6 +1081,7 @@ public class ClipData implements Parcelable { } /** @hide */ + @android.ravenwood.annotation.RavenwoodThrow public void fixUris(int contentUserHint) { final int size = mItems.size(); for (int i = 0; i < size; i++) { @@ -1090,6 +1099,7 @@ public class ClipData implements Parcelable { * Only fixing the data field of the intents * @hide */ + @android.ravenwood.annotation.RavenwoodThrow public void fixUrisLight(int contentUserHint) { final int size = mItems.size(); for (int i = 0; i < size; i++) { diff --git a/core/java/android/content/ClipDescription.java b/core/java/android/content/ClipDescription.java index de2ba44ca393..5953890ad85f 100644 --- a/core/java/android/content/ClipDescription.java +++ b/core/java/android/content/ClipDescription.java @@ -48,6 +48,7 @@ import java.util.Map; * developer guide.</p> * </div> */ +@android.ravenwood.annotation.RavenwoodKeepWholeClass public class ClipDescription implements Parcelable { /** * The MIME type for a clip holding plain text. diff --git a/core/java/android/content/ComponentName.java b/core/java/android/content/ComponentName.java index f12e971afb1f..a6a6bccbb4b5 100644 --- a/core/java/android/content/ComponentName.java +++ b/core/java/android/content/ComponentName.java @@ -37,6 +37,7 @@ import java.io.PrintWriter; * name inside of that package. * */ +@android.ravenwood.annotation.RavenwoodKeepWholeClass public final class ComponentName implements Parcelable, Cloneable, Comparable<ComponentName> { private final String mPackage; private final String mClass; diff --git a/core/java/android/content/ContentUris.java b/core/java/android/content/ContentUris.java index 767d3f668313..093faff654ec 100644 --- a/core/java/android/content/ContentUris.java +++ b/core/java/android/content/ContentUris.java @@ -70,6 +70,7 @@ import java.util.List; *</dl> * */ +@android.ravenwood.annotation.RavenwoodKeepWholeClass public class ContentUris { /** diff --git a/core/java/android/content/ContentValues.java b/core/java/android/content/ContentValues.java index 02a5ba13f2aa..bde2f3e9a707 100644 --- a/core/java/android/content/ContentValues.java +++ b/core/java/android/content/ContentValues.java @@ -35,6 +35,7 @@ import java.util.Set; * This class is used to store a set of values that the {@link ContentResolver} * can process. */ +@android.ravenwood.annotation.RavenwoodKeepWholeClass public final class ContentValues implements Parcelable { public static final String TAG = "ContentValues"; diff --git a/core/java/android/content/Intent.java b/core/java/android/content/Intent.java index 6b39f266a802..665ba1119550 100644 --- a/core/java/android/content/Intent.java +++ b/core/java/android/content/Intent.java @@ -660,6 +660,7 @@ import java.util.TimeZone; * {@link #setFlags} and {@link #addFlags}. See {@link #setFlags} for a list * of all possible flags. */ +@android.ravenwood.annotation.RavenwoodKeepWholeClass public class Intent implements Parcelable, Cloneable { private static final String TAG = "Intent"; @@ -12180,6 +12181,7 @@ public class Intent implements Parcelable, Cloneable { * * @hide */ + @android.ravenwood.annotation.RavenwoodThrow @UnsupportedAppUsage(maxTargetSdk = Build.VERSION_CODES.R, trackingBug = 170729553) public void prepareToLeaveProcess(Context context) { final boolean leavingPackage; @@ -12201,6 +12203,7 @@ public class Intent implements Parcelable, Cloneable { * * @hide */ + @android.ravenwood.annotation.RavenwoodThrow public void prepareToLeaveProcess(boolean leavingPackage) { setAllowFds(false); @@ -12296,6 +12299,7 @@ public class Intent implements Parcelable, Cloneable { /** * @hide */ + @android.ravenwood.annotation.RavenwoodThrow public void prepareToEnterProcess(boolean fromProtectedComponent, AttributionSource source) { if (fromProtectedComponent) { prepareToEnterProcess(LOCAL_FLAG_FROM_PROTECTED_COMPONENT, source); @@ -12307,6 +12311,7 @@ public class Intent implements Parcelable, Cloneable { /** * @hide */ + @android.ravenwood.annotation.RavenwoodThrow public void prepareToEnterProcess(int localFlags, AttributionSource source) { // We just entered destination process, so we should be able to read all // parcelables inside. @@ -12378,6 +12383,7 @@ public class Intent implements Parcelable, Cloneable { /** * @hide */ + @android.ravenwood.annotation.RavenwoodThrow public void fixUris(int contentUserHint) { Uri data = getData(); if (data != null) { @@ -12417,6 +12423,7 @@ public class Intent implements Parcelable, Cloneable { * @return Whether any contents were migrated. * @hide */ + @android.ravenwood.annotation.RavenwoodThrow public boolean migrateExtraStreamToClipData() { return migrateExtraStreamToClipData(AppGlobals.getInitialApplication()); } @@ -12430,6 +12437,7 @@ public class Intent implements Parcelable, Cloneable { * @return Whether any contents were migrated. * @hide */ + @android.ravenwood.annotation.RavenwoodThrow public boolean migrateExtraStreamToClipData(Context context) { // Refuse to touch if extras already parcelled if (mExtras != null && mExtras.isParcelled()) return false; @@ -12545,6 +12553,7 @@ public class Intent implements Parcelable, Cloneable { return false; } + @android.ravenwood.annotation.RavenwoodThrow private Uri maybeConvertFileToContentUri(Context context, Uri uri) { if (ContentResolver.SCHEME_FILE.equals(uri.getScheme()) && context.getApplicationInfo().targetSdkVersion < Build.VERSION_CODES.R) { @@ -12598,6 +12607,7 @@ public class Intent implements Parcelable, Cloneable { // TODO(b/299109198): Refactor into the {@link SdkSandboxManagerLocal} /** @hide */ + @android.ravenwood.annotation.RavenwoodThrow public boolean isSandboxActivity(@NonNull Context context) { if (mAction != null && mAction.equals(ACTION_START_SANDBOXED_ACTIVITY)) { return true; diff --git a/core/java/android/content/IntentFilter.java b/core/java/android/content/IntentFilter.java index f946754bd9a1..ad3acd713c6b 100644 --- a/core/java/android/content/IntentFilter.java +++ b/core/java/android/content/IntentFilter.java @@ -152,6 +152,7 @@ import java.util.function.Predicate; * that unlike the action, an IntentFilter with no categories * will only match an Intent that does not have any categories. */ +@android.ravenwood.annotation.RavenwoodKeepWholeClass public class IntentFilter implements Parcelable { private static final String TAG = "IntentFilter"; diff --git a/core/java/android/content/UriMatcher.java b/core/java/android/content/UriMatcher.java index 7fa48f0e9a78..4422ade7ec0a 100644 --- a/core/java/android/content/UriMatcher.java +++ b/core/java/android/content/UriMatcher.java @@ -119,6 +119,7 @@ instead of: } </pre> */ +@android.ravenwood.annotation.RavenwoodKeepWholeClass public class UriMatcher { public static final int NO_MATCH = -1; diff --git a/ravenwood/framework-minus-apex-ravenwood-policies.txt b/ravenwood/framework-minus-apex-ravenwood-policies.txt index 3e54c7a06288..aa2d470d7d9c 100644 --- a/ravenwood/framework-minus-apex-ravenwood-policies.txt +++ b/ravenwood/framework-minus-apex-ravenwood-policies.txt @@ -121,3 +121,15 @@ class com.android.modules.utils.FastDataOutput stubclass class com.android.modules.utils.ModifiedUtf8 stubclass class com.android.modules.utils.TypedXmlPullParser stubclass class com.android.modules.utils.TypedXmlSerializer stubclass + +# Uri +class android.net.Uri stubclass +class android.net.UriCodec stubclass + +# Context: just enough to support wrapper, no further functionality +class android.content.Context stub + method <init> ()V stub + +# Text +class android.text.TextUtils stub + method isEmpty (Ljava/lang/CharSequence;)Z stub diff --git a/ravenwood/ravenwood-annotation-allowed-classes.txt b/ravenwood/ravenwood-annotation-allowed-classes.txt index 1ac6bf0a7c4d..0290bbe64439 100644 --- a/ravenwood/ravenwood-annotation-allowed-classes.txt +++ b/ravenwood/ravenwood-annotation-allowed-classes.txt @@ -10,3 +10,13 @@ android.os.IBinder android.os.Process android.os.SystemClock android.os.UserHandle + +android.content.ClipData +android.content.ClipData$Item +android.content.ClipDescription +android.content.ComponentName +android.content.ContentUris +android.content.ContentValues +android.content.Intent +android.content.IntentFilter +android.content.UriMatcher diff --git a/tools/hoststubgen/hoststubgen/helper-framework-runtime-src/framework/com/android/hoststubgen/nativesubstitution/Parcel_host.java b/tools/hoststubgen/hoststubgen/helper-framework-runtime-src/framework/com/android/hoststubgen/nativesubstitution/Parcel_host.java index 12c7841556fc..4a3a79803b65 100644 --- a/tools/hoststubgen/hoststubgen/helper-framework-runtime-src/framework/com/android/hoststubgen/nativesubstitution/Parcel_host.java +++ b/tools/hoststubgen/hoststubgen/helper-framework-runtime-src/framework/com/android/hoststubgen/nativesubstitution/Parcel_host.java @@ -286,11 +286,15 @@ public class Parcel_host { } public static byte[] nativeReadBlob(long nativePtr) { + var p = getInstance(nativePtr); + if (p.mSize - p.mPos < 4) { + // Match native impl that returns "null" when not enough data + return null; + } final var size = nativeReadInt(nativePtr); if (size == -1) { return null; } - var p = getInstance(nativePtr); try { p.ensureDataAvailable(align4(size)); } catch (Exception e) { |