From cb269aac7e358d10e9a435ea6451e661508f467f Mon Sep 17 00:00:00 2001 From: Jeff Sharkey Date: Fri, 25 Jan 2019 11:15:38 -0700 Subject: [PATCH] Get CtsProviderTestCases building against API. To help confirm that we're actually testing developer-visible behaviors, we need to build against public APIs, since there have been plenty of examples in this suite of "testing" hidden API behaviors, which are then misleading to developers. Bug: 120429729 Test: atest cts/tests/tests/provider/ Exempt-From-Owner-Approval: Trivial API annotations Change-Id: I07fe33e54f611a6060217f0706fb99b809961f4d --- api/test-current.txt | 42 ++++++++++++++++++- config/hiddenapi-greylist.txt | 1 - core/java/android/os/FileUtils.java | 2 + .../java/android/os/ParcelFileDescriptor.java | 2 + .../android/provider/CalendarContract.java | 3 ++ .../android/provider/ContactsContract.java | 2 + core/java/android/provider/MediaStore.java | 7 ++++ .../android/provider/VoicemailContract.java | 2 + core/res/AndroidManifest.xml | 2 +- media/java/android/media/MediaScanner.java | 10 +++-- .../android/telephony/TelephonyManager.java | 9 ++-- 11 files changed, 71 insertions(+), 11 deletions(-) diff --git a/api/test-current.txt b/api/test-current.txt index 0f2ba12bd9adf..ae29e49521083 100644 --- a/api/test-current.txt +++ b/api/test-current.txt @@ -6,6 +6,7 @@ package android { field public static final String ACTIVITY_EMBEDDING = "android.permission.ACTIVITY_EMBEDDING"; field public static final String BRIGHTNESS_SLIDER_USAGE = "android.permission.BRIGHTNESS_SLIDER_USAGE"; field public static final String CHANGE_APP_IDLE_STATE = "android.permission.CHANGE_APP_IDLE_STATE"; + field public static final String CLEAR_APP_USER_DATA = "android.permission.CLEAR_APP_USER_DATA"; field public static final String CONFIGURE_DISPLAY_BRIGHTNESS = "android.permission.CONFIGURE_DISPLAY_BRIGHTNESS"; field public static final String FORCE_STOP_PACKAGES = "android.permission.FORCE_STOP_PACKAGES"; field public static final String MANAGE_ACTIVITY_STACKS = "android.permission.MANAGE_ACTIVITY_STACKS"; @@ -1053,6 +1054,10 @@ package android.os { method public static java.io.File getStorageDirectory(); } + public class FileUtils { + method public static boolean contains(java.io.File, java.io.File); + } + public abstract class HwBinder implements android.os.IHwBinder { ctor public HwBinder(); method public static final void configureRpcThreadpool(long, boolean); @@ -1218,6 +1223,10 @@ package android.os { method public boolean hasSingleFileDescriptor(); } + public class ParcelFileDescriptor implements java.io.Closeable android.os.Parcelable { + method public static java.io.File getFile(java.io.FileDescriptor) throws java.io.IOException; + } + public final class PowerManager { method @RequiresPermission("android.permission.POWER_SAVER") public int getPowerSaveMode(); method @RequiresPermission("android.permission.POWER_SAVER") public boolean setDynamicPowerSavings(boolean, int); @@ -1485,17 +1494,37 @@ package android.print { package android.provider { + public static final class CalendarContract.Calendars implements android.provider.BaseColumns android.provider.CalendarContract.CalendarColumns android.provider.CalendarContract.SyncColumns { + field public static final String[] SYNC_WRITABLE_COLUMNS; + } + + public static final class CalendarContract.Events implements android.provider.BaseColumns android.provider.CalendarContract.CalendarColumns android.provider.CalendarContract.EventsColumns android.provider.CalendarContract.SyncColumns { + field public static final String[] SYNC_WRITABLE_COLUMNS; + } + + public final class ContactsContract { + field public static final String HIDDEN_COLUMN_PREFIX = "x_"; + } + public static final class ContactsContract.CommonDataKinds.Phone implements android.provider.ContactsContract.CommonDataKinds.CommonColumns android.provider.ContactsContract.DataColumnsWithJoins { field public static final android.net.Uri ENTERPRISE_CONTENT_URI; } + public static final class ContactsContract.PinnedPositions { + field public static final String UNDEMOTE_METHOD = "undemote"; + } + public static final class ContactsContract.RawContactsEntity implements android.provider.BaseColumns android.provider.ContactsContract.DataColumns android.provider.ContactsContract.RawContactsColumns { field public static final android.net.Uri CORP_CONTENT_URI; } public final class MediaStore { - method @RequiresPermission("android.permission.CLEAR_APP_USER_DATA") public static void deleteContributedMedia(android.content.Context, String, android.os.UserHandle) throws java.io.IOException; - method @RequiresPermission("android.permission.CLEAR_APP_USER_DATA") public static long getContributedMediaSize(android.content.Context, String, android.os.UserHandle) throws java.io.IOException; + method @RequiresPermission(android.Manifest.permission.CLEAR_APP_USER_DATA) public static void deleteContributedMedia(android.content.Context, String, android.os.UserHandle) throws java.io.IOException; + method @RequiresPermission(android.Manifest.permission.CLEAR_APP_USER_DATA) public static long getContributedMediaSize(android.content.Context, String, android.os.UserHandle) throws java.io.IOException; + method @NonNull public static java.io.File getVolumePath(@NonNull String) throws java.io.FileNotFoundException; + method @NonNull public static java.util.Collection getVolumeScanPaths(@NonNull String) throws java.io.FileNotFoundException; + field public static final String SCAN_FILE_CALL = "scan_file"; + field public static final String SCAN_VOLUME_CALL = "scan_volume"; } public final class Settings { @@ -1555,6 +1584,10 @@ package android.provider { field public static final String SMS_CARRIER_PROVISION_ACTION = "android.provider.Telephony.SMS_CARRIER_PROVISION"; } + public static final class VoicemailContract.Voicemails implements android.provider.BaseColumns android.provider.OpenableColumns { + field public static final String _DATA = "_data"; + } + } package android.security { @@ -1829,10 +1862,15 @@ package android.telephony { } public class TelephonyManager { + method public int checkCarrierPrivilegesForPackage(String); method public int getCarrierIdListVersion(); method public boolean isRttSupported(); method @RequiresPermission(android.Manifest.permission.MODIFY_PHONE_STATE) public void refreshUiccProfile(); method public void setCarrierTestOverride(String, String, String, String, String, String, String); + field public static final int CARRIER_PRIVILEGE_STATUS_ERROR_LOADING_RULES = -2; // 0xfffffffe + field public static final int CARRIER_PRIVILEGE_STATUS_HAS_ACCESS = 1; // 0x1 + field public static final int CARRIER_PRIVILEGE_STATUS_NO_ACCESS = 0; // 0x0 + field public static final int CARRIER_PRIVILEGE_STATUS_RULES_NOT_LOADED = -1; // 0xffffffff field public static final int UNKNOWN_CARRIER_ID_LIST_VERSION = -1; // 0xffffffff } diff --git a/config/hiddenapi-greylist.txt b/config/hiddenapi-greylist.txt index ee2fe8f5750fd..8e7a58b40d0c6 100644 --- a/config/hiddenapi-greylist.txt +++ b/config/hiddenapi-greylist.txt @@ -901,7 +901,6 @@ Landroid/os/ParcelableParcel;->getClassLoader()Ljava/lang/ClassLoader; Landroid/os/ParcelableParcel;->getParcel()Landroid/os/Parcel; Landroid/os/ParcelFileDescriptor;->(Ljava/io/FileDescriptor;)V Landroid/os/ParcelFileDescriptor;->fromData([BLjava/lang/String;)Landroid/os/ParcelFileDescriptor; -Landroid/os/ParcelFileDescriptor;->getFile(Ljava/io/FileDescriptor;)Ljava/io/File; Landroid/os/ParcelFileDescriptor;->seekTo(J)J Landroid/os/PerformanceCollector;->()V Landroid/os/PerformanceCollector;->beginSnapshot(Ljava/lang/String;)V diff --git a/core/java/android/os/FileUtils.java b/core/java/android/os/FileUtils.java index 51c3c4c25ce02..629289bb7a453 100644 --- a/core/java/android/os/FileUtils.java +++ b/core/java/android/os/FileUtils.java @@ -39,6 +39,7 @@ import static android.system.OsConstants.W_OK; import android.annotation.NonNull; import android.annotation.Nullable; +import android.annotation.TestApi; import android.content.ContentResolver; import android.provider.DocumentsContract.Document; import android.system.ErrnoException; @@ -852,6 +853,7 @@ public class FileUtils { * * @hide */ + @TestApi public static boolean contains(File dir, File file) { if (dir == null || file == null) return false; return contains(dir.getAbsolutePath(), file.getAbsolutePath()); diff --git a/core/java/android/os/ParcelFileDescriptor.java b/core/java/android/os/ParcelFileDescriptor.java index 630bd2e509ff9..d68eeeda2eb9d 100644 --- a/core/java/android/os/ParcelFileDescriptor.java +++ b/core/java/android/os/ParcelFileDescriptor.java @@ -31,6 +31,7 @@ import static android.system.OsConstants.S_ISLNK; import static android.system.OsConstants.S_ISREG; import static android.system.OsConstants.S_IWOTH; +import android.annotation.TestApi; import android.content.BroadcastReceiver; import android.content.ContentProvider; import android.os.MessageQueue.OnFileDescriptorEventListener; @@ -580,6 +581,7 @@ public class ParcelFileDescriptor implements Parcelable, Closeable { * * @hide */ + @TestApi public static File getFile(FileDescriptor fd) throws IOException { try { final String path = Os.readlink("/proc/self/fd/" + fd.getInt$()); diff --git a/core/java/android/provider/CalendarContract.java b/core/java/android/provider/CalendarContract.java index 8bd75d7791547..8a52f1f0eec0d 100644 --- a/core/java/android/provider/CalendarContract.java +++ b/core/java/android/provider/CalendarContract.java @@ -19,6 +19,7 @@ package android.provider; import android.annotation.NonNull; import android.annotation.SdkConstant; import android.annotation.SdkConstant.SdkConstantType; +import android.annotation.TestApi; import android.annotation.UnsupportedAppUsage; import android.app.Activity; import android.app.AlarmManager; @@ -805,6 +806,7 @@ public final class CalendarContract { * * @hide */ + @TestApi public static final String[] SYNC_WRITABLE_COLUMNS = new String[] { ACCOUNT_NAME, ACCOUNT_TYPE, @@ -1832,6 +1834,7 @@ public final class CalendarContract { * * @hide */ + @TestApi public static final String[] SYNC_WRITABLE_COLUMNS = new String[] { _SYNC_ID, DIRTY, diff --git a/core/java/android/provider/ContactsContract.java b/core/java/android/provider/ContactsContract.java index 25554b9370655..81e1eb99336b1 100644 --- a/core/java/android/provider/ContactsContract.java +++ b/core/java/android/provider/ContactsContract.java @@ -126,6 +126,7 @@ public final class ContactsContract { * Prefix for column names that are not visible to client apps. * @hide */ + @TestApi public static final String HIDDEN_COLUMN_PREFIX = "x_"; /** @@ -8444,6 +8445,7 @@ public final class ContactsContract { * nothing will be done. * @hide */ + @TestApi public static final String UNDEMOTE_METHOD = "undemote"; /** diff --git a/core/java/android/provider/MediaStore.java b/core/java/android/provider/MediaStore.java index f5c442f194ba2..887175a804215 100644 --- a/core/java/android/provider/MediaStore.java +++ b/core/java/android/provider/MediaStore.java @@ -104,6 +104,11 @@ public final class MediaStore { */ public static final String VOLUME_EXTERNAL = "external"; + /** {@hide} */ @TestApi + public static final String SCAN_FILE_CALL = "scan_file"; + /** {@hide} */ @TestApi + public static final String SCAN_VOLUME_CALL = "scan_volume"; + /** * The method name used by the media scanner and mtp to tell the media provider to * rescan and reclassify that have become unhidden because of renaming folders or @@ -2992,6 +2997,7 @@ public final class MediaStore { * * @hide */ + @TestApi public static @NonNull File getVolumePath(@NonNull String volumeName) throws FileNotFoundException { if (TextUtils.isEmpty(volumeName)) { @@ -3022,6 +3028,7 @@ public final class MediaStore { * * @hide */ + @TestApi public static @NonNull Collection getVolumeScanPaths(@NonNull String volumeName) throws FileNotFoundException { if (TextUtils.isEmpty(volumeName)) { diff --git a/core/java/android/provider/VoicemailContract.java b/core/java/android/provider/VoicemailContract.java index 140336e93357f..dce5d56e24a44 100644 --- a/core/java/android/provider/VoicemailContract.java +++ b/core/java/android/provider/VoicemailContract.java @@ -18,6 +18,7 @@ package android.provider; import android.annotation.SdkConstant; import android.annotation.SdkConstant.SdkConstantType; +import android.annotation.TestApi; import android.content.ComponentName; import android.content.ContentResolver; import android.content.ContentValues; @@ -289,6 +290,7 @@ public class VoicemailContract { * Path to the media content file. Internal only field. * @hide */ + @TestApi public static final String _DATA = "_data"; // Note: PHONE_ACCOUNT_* constant values are "subscription_*" due to a historic naming diff --git a/core/res/AndroidManifest.xml b/core/res/AndroidManifest.xml index 4a54bd775387f..3d294f6ad3b30 100644 --- a/core/res/AndroidManifest.xml +++ b/core/res/AndroidManifest.xml @@ -3329,7 +3329,7 @@ - diff --git a/media/java/android/media/MediaScanner.java b/media/java/android/media/MediaScanner.java index 4eed12f428bcf..33e7d8ea1b946 100644 --- a/media/java/android/media/MediaScanner.java +++ b/media/java/android/media/MediaScanner.java @@ -335,7 +335,7 @@ public class MediaScanner implements AutoCloseable { private final Uri mPlaylistsUri; @UnsupportedAppUsage private final Uri mFilesUri; - private final Uri mFilesUriNoNotify; + private final Uri mFilesFullUri; private final boolean mProcessPlaylists; private final boolean mProcessGenres; private int mMtpObjectHandle; @@ -445,7 +445,11 @@ public class MediaScanner implements AutoCloseable { mVideoUri = Video.Media.getContentUri(volumeName); mImagesUri = Images.Media.getContentUri(volumeName); mFilesUri = Files.getContentUri(volumeName); - mFilesUriNoNotify = mFilesUri.buildUpon().appendQueryParameter("nonotify", "1").build(); + + Uri filesFullUri = mFilesUri.buildUpon().appendQueryParameter("nonotify", "1").build(); + filesFullUri = MediaStore.setIncludePending(filesFullUri); + filesFullUri = MediaStore.setIncludeTrashed(filesFullUri); + mFilesFullUri = filesFullUri; if (!volumeName.equals("internal")) { // we only support playlists on external media @@ -1625,7 +1629,7 @@ public class MediaScanner implements AutoCloseable { try { where = Files.FileColumns.DATA + "=?"; selectionArgs = new String[] { path }; - c = mMediaProvider.query(mFilesUriNoNotify, FILES_PRESCAN_PROJECTION, + c = mMediaProvider.query(mFilesFullUri, FILES_PRESCAN_PROJECTION, where, selectionArgs, null, null); if (c != null && c.moveToFirst()) { long rowId = c.getLong(FILES_PRESCAN_ID_COLUMN_INDEX); diff --git a/telephony/java/android/telephony/TelephonyManager.java b/telephony/java/android/telephony/TelephonyManager.java index e710e0e02c46c..98fc7251e9a8a 100644 --- a/telephony/java/android/telephony/TelephonyManager.java +++ b/telephony/java/android/telephony/TelephonyManager.java @@ -6848,13 +6848,13 @@ public class TelephonyManager { /** * Values used to return status for hasCarrierPrivileges call. */ - /** @hide */ @SystemApi + /** @hide */ @SystemApi @TestApi public static final int CARRIER_PRIVILEGE_STATUS_HAS_ACCESS = 1; - /** @hide */ @SystemApi + /** @hide */ @SystemApi @TestApi public static final int CARRIER_PRIVILEGE_STATUS_NO_ACCESS = 0; - /** @hide */ @SystemApi + /** @hide */ @SystemApi @TestApi public static final int CARRIER_PRIVILEGE_STATUS_RULES_NOT_LOADED = -1; - /** @hide */ @SystemApi + /** @hide */ @SystemApi @TestApi public static final int CARRIER_PRIVILEGE_STATUS_ERROR_LOADING_RULES = -2; /** @@ -7056,6 +7056,7 @@ public class TelephonyManager { /** @hide */ @SystemApi + @TestApi @SuppressLint("Doclava125") public int checkCarrierPrivilegesForPackage(String pkgName) { try {