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
diff --git a/core/java/android/database/AbstractCursor.java b/core/java/android/database/AbstractCursor.java
index 69d573f..80f085f 100644
--- a/core/java/android/database/AbstractCursor.java
+++ b/core/java/android/database/AbstractCursor.java
@@ -33,11 +33,11 @@
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 @@
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 @@
mClosed = true;
mContentObservable.unregisterAll();
onDeactivateOrClose();
- mCloseGuard.close();
+ if (mCloseGuard != null) {
+ mCloseGuard.close();
+ }
}
/**
@@ -224,7 +226,19 @@
/* 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 73781b7..4927654 100644
--- a/core/java/android/database/CharArrayBuffer.java
+++ b/core/java/android/database/CharArrayBuffer.java
@@ -19,6 +19,7 @@
/**
* 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 7692bb3..dc35b5a 100644
--- a/core/java/android/database/ContentObservable.java
+++ b/core/java/android/database/ContentObservable.java
@@ -23,6 +23,7 @@
* 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 c27ee51..39c9400 100644
--- a/core/java/android/database/ContentObserver.java
+++ b/core/java/android/database/ContentObserver.java
@@ -36,6 +36,7 @@
* 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 @@
@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 @@
// 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 @@
}
}
+ @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 afa1c20..cb1d3f5 100644
--- a/core/java/android/database/Cursor.java
+++ b/core/java/android/database/Cursor.java
@@ -40,6 +40,7 @@
* 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 1f77d00..89d4418 100644
--- a/core/java/android/database/CursorIndexOutOfBoundsException.java
+++ b/core/java/android/database/CursorIndexOutOfBoundsException.java
@@ -19,6 +19,7 @@
/**
* 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 a95263b..2eb81a1 100644
--- a/core/java/android/database/CursorJoiner.java
+++ b/core/java/android/database/CursorJoiner.java
@@ -42,6 +42,7 @@
* }
* </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 4496f80..6572f99 100644
--- a/core/java/android/database/CursorWrapper.java
+++ b/core/java/android/database/CursorWrapper.java
@@ -27,6 +27,7 @@
* 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 ca77a13..ff47f9a 100644
--- a/core/java/android/database/DataSetObservable.java
+++ b/core/java/android/database/DataSetObservable.java
@@ -21,6 +21,7 @@
* 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 28616c8..13469cb 100644
--- a/core/java/android/database/DataSetObserver.java
+++ b/core/java/android/database/DataSetObserver.java
@@ -21,6 +21,7 @@
* 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 050a49a..ad35b2f 100644
--- a/core/java/android/database/MatrixCursor.java
+++ b/core/java/android/database/MatrixCursor.java
@@ -26,6 +26,7 @@
* {@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 272cfa2..5a56756 100644
--- a/core/java/android/database/MergeCursor.java
+++ b/core/java/android/database/MergeCursor.java
@@ -22,6 +22,7 @@
* 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 aff32db..a3057ac 100644
--- a/core/java/android/database/Observable.java
+++ b/core/java/android/database/Observable.java
@@ -26,6 +26,7 @@
*
* @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 0290bbe..128155c 100644
--- a/ravenwood/ravenwood-annotation-allowed-classes.txt
+++ b/ravenwood/ravenwood-annotation-allowed-classes.txt
@@ -20,3 +20,18 @@
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