summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
author Jeff Sharkey <jsharkey@google.com> 2023-11-15 11:55:33 -0700
committer Jeff Sharkey <jsharkey@google.com> 2023-11-15 13:22:24 -0700
commit2acaa723457210802271ee6a416c5332f55a43b9 (patch)
tree68068eb2e3a1324f86448492b10253d901099c22
parent73067713b07dbb98934e46ca930fc69e45cef984 (diff)
Support android.database for Ravenwood, with CTS.
Initial pass at foundational classes under android.database, along with CTS to verify consistency. Unfortunately much of the CTS is structured as integration tests, when it'd be possible to verify behavior as unit tests using simpler tools like MatrixCursor. This change makes an effort at supporting existing tests using MatrixCursor where simple to adapt, but future changes will likely need to add more dedicated coverage. Bug: 292141694 Test: atest-dev CtsDatabaseTestCasesRavenwood CtsDatabaseTestCases Change-Id: I63c568fc2bcb9d7c1ac1f2a251442fec44a0d19a
-rw-r--r--core/java/android/database/AbstractCursor.java22
-rw-r--r--core/java/android/database/CharArrayBuffer.java1
-rw-r--r--core/java/android/database/ContentObservable.java1
-rw-r--r--core/java/android/database/ContentObserver.java13
-rw-r--r--core/java/android/database/Cursor.java1
-rw-r--r--core/java/android/database/CursorIndexOutOfBoundsException.java1
-rw-r--r--core/java/android/database/CursorJoiner.java1
-rw-r--r--core/java/android/database/CursorWrapper.java1
-rw-r--r--core/java/android/database/DataSetObservable.java1
-rw-r--r--core/java/android/database/DataSetObserver.java1
-rw-r--r--core/java/android/database/MatrixCursor.java1
-rw-r--r--core/java/android/database/MergeCursor.java1
-rw-r--r--core/java/android/database/Observable.java1
-rw-r--r--ravenwood/ravenwood-annotation-allowed-classes.txt15
14 files changed, 55 insertions, 6 deletions
diff --git a/core/java/android/database/AbstractCursor.java b/core/java/android/database/AbstractCursor.java
index 69d573f84975..80f085f5b9fe 100644
--- a/core/java/android/database/AbstractCursor.java
+++ b/core/java/android/database/AbstractCursor.java
@@ -33,11 +33,11 @@ import java.util.List;
import java.util.Map;
import java.util.Objects;
-
/**
* This is an abstract cursor class that handles a lot of the common code
* that all cursors need to deal with and is provided for convenience reasons.
*/
+@android.ravenwood.annotation.RavenwoodKeepWholeClass
public abstract class AbstractCursor implements CrossProcessCursor {
private static final String TAG = "Cursor";
@@ -89,7 +89,7 @@ public abstract class AbstractCursor implements CrossProcessCursor {
private Bundle mExtras = Bundle.EMPTY;
/** CloseGuard to detect leaked cursor **/
- private final CloseGuard mCloseGuard = CloseGuard.get();
+ private final CloseGuard mCloseGuard;
/* -------------------------------------------------------- */
/* These need to be implemented by subclasses */
@@ -184,7 +184,9 @@ public abstract class AbstractCursor implements CrossProcessCursor {
mClosed = true;
mContentObservable.unregisterAll();
onDeactivateOrClose();
- mCloseGuard.close();
+ if (mCloseGuard != null) {
+ mCloseGuard.close();
+ }
}
/**
@@ -224,7 +226,19 @@ public abstract class AbstractCursor implements CrossProcessCursor {
/* Implementation */
public AbstractCursor() {
mPos = -1;
- mCloseGuard.open("AbstractCursor.close");
+ mCloseGuard = initCloseGuard();
+ if (mCloseGuard != null) {
+ mCloseGuard.open("AbstractCursor.close");
+ }
+ }
+
+ @android.ravenwood.annotation.RavenwoodReplace
+ private CloseGuard initCloseGuard() {
+ return CloseGuard.get();
+ }
+
+ private CloseGuard initCloseGuard$ravenwood() {
+ return null;
}
@Override
diff --git a/core/java/android/database/CharArrayBuffer.java b/core/java/android/database/CharArrayBuffer.java
index 73781b763c3d..4927654c38b9 100644
--- a/core/java/android/database/CharArrayBuffer.java
+++ b/core/java/android/database/CharArrayBuffer.java
@@ -19,6 +19,7 @@ package android.database;
/**
* This is used for {@link Cursor#copyStringToBuffer}
*/
+@android.ravenwood.annotation.RavenwoodKeepWholeClass
public final class CharArrayBuffer {
public CharArrayBuffer(int size) {
data = new char[size];
diff --git a/core/java/android/database/ContentObservable.java b/core/java/android/database/ContentObservable.java
index 7692bb39da71..dc35b5af2a98 100644
--- a/core/java/android/database/ContentObservable.java
+++ b/core/java/android/database/ContentObservable.java
@@ -23,6 +23,7 @@ import android.net.Uri;
* that provides methods for sending notifications to a list of
* {@link ContentObserver} objects.
*/
+@android.ravenwood.annotation.RavenwoodKeepWholeClass
public class ContentObservable extends Observable<ContentObserver> {
// Even though the generic method defined in Observable would be perfectly
// fine on its own, we can't delete this overridden method because it would
diff --git a/core/java/android/database/ContentObserver.java b/core/java/android/database/ContentObserver.java
index c27ee51b9315..39c9400e7064 100644
--- a/core/java/android/database/ContentObserver.java
+++ b/core/java/android/database/ContentObserver.java
@@ -36,6 +36,7 @@ import java.util.Collection;
* Receives call backs for changes to content.
* Must be implemented by objects which are added to a {@link ContentObservable}.
*/
+@android.ravenwood.annotation.RavenwoodKeepWholeClass
public abstract class ContentObserver {
/**
* Starting in {@link android.os.Build.VERSION_CODES#R}, there is a new
@@ -49,7 +50,6 @@ public abstract class ContentObserver {
@ChangeId
@EnabledAfter(targetSdkVersion=android.os.Build.VERSION_CODES.Q)
private static final long ADD_CONTENT_OBSERVER_FLAGS = 150939131L;
-
private final Object mLock = new Object();
private Transport mTransport; // guarded by mLock
@@ -216,7 +216,7 @@ public abstract class ContentObserver {
// There are dozens of people relying on the hidden API inside the
// system UID, so hard-code the old behavior for all of them; for
// everyone else we gate based on a specific change
- if (!CompatChanges.isChangeEnabled(ADD_CONTENT_OBSERVER_FLAGS)
+ if (!isChangeEnabledAddContentObserverFlags()
|| android.os.Process.myUid() == android.os.Process.SYSTEM_UID) {
// Deliver userId through argument to preserve hidden API behavior
onChange(selfChange, uris, flags, UserHandle.of(userId));
@@ -225,6 +225,15 @@ public abstract class ContentObserver {
}
}
+ @android.ravenwood.annotation.RavenwoodReplace
+ private static boolean isChangeEnabledAddContentObserverFlags() {
+ return CompatChanges.isChangeEnabled(ADD_CONTENT_OBSERVER_FLAGS);
+ }
+
+ private static boolean isChangeEnabledAddContentObserverFlags$ravenwood() {
+ return true;
+ }
+
/**
* Dispatches a change notification to the observer.
* <p>
diff --git a/core/java/android/database/Cursor.java b/core/java/android/database/Cursor.java
index afa1c209c811..cb1d3f5252b2 100644
--- a/core/java/android/database/Cursor.java
+++ b/core/java/android/database/Cursor.java
@@ -40,6 +40,7 @@ import java.util.List;
* Implementations should subclass {@link AbstractCursor}.
* </p>
*/
+@android.ravenwood.annotation.RavenwoodKeepWholeClass
public interface Cursor extends Closeable {
/*
* Values returned by {@link #getType(int)}.
diff --git a/core/java/android/database/CursorIndexOutOfBoundsException.java b/core/java/android/database/CursorIndexOutOfBoundsException.java
index 1f77d0047191..89d44182a886 100644
--- a/core/java/android/database/CursorIndexOutOfBoundsException.java
+++ b/core/java/android/database/CursorIndexOutOfBoundsException.java
@@ -19,6 +19,7 @@ package android.database;
/**
* An exception indicating that a cursor is out of bounds.
*/
+@android.ravenwood.annotation.RavenwoodKeepWholeClass
public class CursorIndexOutOfBoundsException extends IndexOutOfBoundsException {
public CursorIndexOutOfBoundsException(int index, int size) {
diff --git a/core/java/android/database/CursorJoiner.java b/core/java/android/database/CursorJoiner.java
index a95263b67b43..2eb81a1eed5e 100644
--- a/core/java/android/database/CursorJoiner.java
+++ b/core/java/android/database/CursorJoiner.java
@@ -42,6 +42,7 @@ import java.util.Iterator;
* }
* </pre>
*/
+@android.ravenwood.annotation.RavenwoodKeepWholeClass
public final class CursorJoiner
implements Iterator<CursorJoiner.Result>, Iterable<CursorJoiner.Result> {
private Cursor mCursorLeft;
diff --git a/core/java/android/database/CursorWrapper.java b/core/java/android/database/CursorWrapper.java
index 4496f805cc2e..6572f99cdd07 100644
--- a/core/java/android/database/CursorWrapper.java
+++ b/core/java/android/database/CursorWrapper.java
@@ -27,6 +27,7 @@ import java.util.List;
* Wrapper class for Cursor that delegates all calls to the actual cursor object. The primary
* use for this class is to extend a cursor while overriding only a subset of its methods.
*/
+@android.ravenwood.annotation.RavenwoodKeepWholeClass
public class CursorWrapper implements Cursor {
/** @hide */
@UnsupportedAppUsage
diff --git a/core/java/android/database/DataSetObservable.java b/core/java/android/database/DataSetObservable.java
index ca77a13c2352..ff47f9a53a9a 100644
--- a/core/java/android/database/DataSetObservable.java
+++ b/core/java/android/database/DataSetObservable.java
@@ -21,6 +21,7 @@ package android.database;
* that provides methods for sending notifications to a list of
* {@link DataSetObserver} objects.
*/
+@android.ravenwood.annotation.RavenwoodKeepWholeClass
public class DataSetObservable extends Observable<DataSetObserver> {
/**
* Invokes {@link DataSetObserver#onChanged} on each observer.
diff --git a/core/java/android/database/DataSetObserver.java b/core/java/android/database/DataSetObserver.java
index 28616c80bd5a..13469cbf2645 100644
--- a/core/java/android/database/DataSetObserver.java
+++ b/core/java/android/database/DataSetObserver.java
@@ -21,6 +21,7 @@ package android.database;
* that are observed are {@link Cursor}s or {@link android.widget.Adapter}s.
* DataSetObserver must be implemented by objects which are added to a DataSetObservable.
*/
+@android.ravenwood.annotation.RavenwoodKeepWholeClass
public abstract class DataSetObserver {
/**
* This method is called when the entire data set has changed,
diff --git a/core/java/android/database/MatrixCursor.java b/core/java/android/database/MatrixCursor.java
index 050a49ac959e..ad35b2f96eab 100644
--- a/core/java/android/database/MatrixCursor.java
+++ b/core/java/android/database/MatrixCursor.java
@@ -26,6 +26,7 @@ import java.util.ArrayList;
* {@link #newRow()} to add rows. Automatically expands internal capacity
* as needed.
*/
+@android.ravenwood.annotation.RavenwoodKeepWholeClass
public class MatrixCursor extends AbstractCursor {
private final String[] columnNames;
diff --git a/core/java/android/database/MergeCursor.java b/core/java/android/database/MergeCursor.java
index 272cfa24181c..5a5675694040 100644
--- a/core/java/android/database/MergeCursor.java
+++ b/core/java/android/database/MergeCursor.java
@@ -22,6 +22,7 @@ package android.database;
* may be different if that is desired. Calls to getColumns, getColumnIndex, etc will return the
* value for the row that the MergeCursor is currently pointing at.
*/
+@android.ravenwood.annotation.RavenwoodKeepWholeClass
public class MergeCursor extends AbstractCursor
{
private DataSetObserver mObserver = new DataSetObserver() {
diff --git a/core/java/android/database/Observable.java b/core/java/android/database/Observable.java
index aff32db1bf9f..a3057aca7936 100644
--- a/core/java/android/database/Observable.java
+++ b/core/java/android/database/Observable.java
@@ -26,6 +26,7 @@ import java.util.ArrayList;
*
* @param T The observer type.
*/
+@android.ravenwood.annotation.RavenwoodKeepWholeClass
public abstract class Observable<T> {
/**
* The list of observers. An observer can be in the list at most
diff --git a/ravenwood/ravenwood-annotation-allowed-classes.txt b/ravenwood/ravenwood-annotation-allowed-classes.txt
index 0290bbe64439..128155cc63df 100644
--- a/ravenwood/ravenwood-annotation-allowed-classes.txt
+++ b/ravenwood/ravenwood-annotation-allowed-classes.txt
@@ -20,3 +20,18 @@ android.content.ContentValues
android.content.Intent
android.content.IntentFilter
android.content.UriMatcher
+
+android.database.AbstractCursor
+android.database.CharArrayBuffer
+android.database.ContentObservable
+android.database.ContentObserver
+android.database.Cursor
+android.database.CursorIndexOutOfBoundsException
+android.database.CursorJoiner
+android.database.CursorWrapper
+android.database.DataSetObservable
+android.database.DataSetObserver
+android.database.MatrixCursor
+android.database.MatrixCursor$RowBuilder
+android.database.MergeCursor
+android.database.Observable