Add support for createContentUriForUser for Android R
Bug: 205096638
Test: atest ItemTest passes on Android R
Change-Id: I0414ba99609496929b909eee43a71e0dd5371139
diff --git a/src/com/android/providers/media/photopicker/data/ItemsProvider.java b/src/com/android/providers/media/photopicker/data/ItemsProvider.java
index 8e62c8e..38f594a 100644
--- a/src/com/android/providers/media/photopicker/data/ItemsProvider.java
+++ b/src/com/android/providers/media/photopicker/data/ItemsProvider.java
@@ -31,12 +31,15 @@
import android.os.Bundle;
import android.os.Environment;
import android.os.RemoteException;
+import android.os.UserHandle;
import android.provider.CloudMediaProviderContract.AlbumColumns;
import android.provider.MediaStore;
import android.provider.MediaStore.Files.FileColumns;
import android.provider.MediaStore.MediaColumns;
+import android.text.TextUtils;
import android.util.Log;
+import com.android.modules.utils.build.SdkLevel;
import com.android.providers.media.PickerUriResolver;
import com.android.providers.media.photopicker.PickerSyncController;
import com.android.providers.media.photopicker.data.model.Category;
@@ -304,8 +307,48 @@
if (userId.equals(UserId.CURRENT_USER)) {
return uri;
- } else {
- return ContentProvider.createContentUriForUser(uri, userId.getUserHandle());
}
+
+ return createContentUriForUser(uri, userId.getUserHandle());
+ }
+
+ private static Uri createContentUriForUser(Uri uri, UserHandle userHandle) {
+ if (SdkLevel.isAtLeastS()) {
+ return ContentProvider.createContentUriForUser(uri, userHandle);
+ }
+
+ return createContentUriForUserImpl(uri, userHandle);
+ }
+
+ /**
+ * This method is a copy of {@link ContentProvider#createContentUriForUser(Uri, UserHandle)}
+ * which is a System API added in Android S.
+ */
+ private static Uri createContentUriForUserImpl(Uri uri, UserHandle userHandle) {
+ if (!ContentResolver.SCHEME_CONTENT.equals(uri.getScheme())) {
+ throw new IllegalArgumentException(String.format(
+ "Given URI [%s] is not a content URI: ", uri));
+ }
+
+ int userId = userHandle.getIdentifier();
+ if (uriHasUserId(uri)) {
+ if (String.valueOf(userId).equals(uri.getUserInfo())) {
+ return uri;
+ }
+ throw new IllegalArgumentException(String.format(
+ "Given URI [%s] already has a user ID, different from given user handle [%s]",
+ uri,
+ userId));
+ }
+
+ Uri.Builder builder = uri.buildUpon();
+ builder.encodedAuthority(
+ "" + userHandle.getIdentifier() + "@" + uri.getEncodedAuthority());
+ return builder.build();
+ }
+
+ private static boolean uriHasUserId(Uri uri) {
+ if (uri == null) return false;
+ return !TextUtils.isEmpty(uri.getUserInfo());
}
}
diff --git a/tests/src/com/android/providers/media/photopicker/data/model/ItemTest.java b/tests/src/com/android/providers/media/photopicker/data/model/ItemTest.java
index 656c7df..81fec5d 100644
--- a/tests/src/com/android/providers/media/photopicker/data/model/ItemTest.java
+++ b/tests/src/com/android/providers/media/photopicker/data/model/ItemTest.java
@@ -69,8 +69,6 @@
}
@Test
- // TODO(b/205096638) Re-enable if we add work profile support on R
- @SdkSuppress(minSdkVersion = Build.VERSION_CODES.S)
public void testConstructor_differentUser() {
final String id = "1";
final long dateTaken = 12345678L;