From fd12f36fb93aabf3251fef4fb92196650b59c904 Mon Sep 17 00:00:00 2001 From: Martijn Coenen Date: Tue, 18 Feb 2020 17:10:31 +0100 Subject: [PATCH] Switch to new project ID constants. These are used on devices without sdcardfs. Bug: 146419093 Test: lsattr -pR Change-Id: I87c900d409c90770fb3eaa595324dab385458c6c --- .../android/os/storage/StorageManager.java | 56 +++++++++++++++---- 1 file changed, 44 insertions(+), 12 deletions(-) diff --git a/core/java/android/os/storage/StorageManager.java b/core/java/android/os/storage/StorageManager.java index 8d04df0560f55..1454aac66d21c 100644 --- a/core/java/android/os/storage/StorageManager.java +++ b/core/java/android/os/storage/StorageManager.java @@ -29,6 +29,7 @@ import static android.app.AppOpsManager.OP_WRITE_MEDIA_IMAGES; import static android.app.AppOpsManager.OP_WRITE_MEDIA_VIDEO; import static android.content.ContentResolver.DEPRECATE_DATA_PREFIX; import static android.content.pm.PackageManager.PERMISSION_GRANTED; +import static android.os.UserHandle.PER_USER_RANGE; import android.annotation.BytesLong; import android.annotation.CallbackExecutor; @@ -2324,17 +2325,34 @@ public class StorageManager { private static final String XATTR_CACHE_TOMBSTONE = "user.cache_tombstone"; - // Matches AID_MEDIA_RW in android_filesystem_config.h - private static final int QUOTA_PROJECT_ID_MEDIA_NONE = 1023; + // Project IDs below must match android_projectid_config.h + /** + * Default project ID for files on external storage + * + * {@hide} + */ + public static final int PROJECT_ID_EXT_DEFAULT = 1000; - // Matches AID_MEDIA_IMAGE in android_filesystem_config.h - private static final int QUOTA_PROJECT_ID_MEDIA_IMAGE = 1057; + /** + * project ID for audio files on external storage + * + * {@hide} + */ + public static final int PROJECT_ID_EXT_MEDIA_AUDIO = 1001; - // Matches AID_MEDIA_AUDIO in android_filesystem_config.h - private static final int QUOTA_PROJECT_ID_MEDIA_AUDIO = 1055; + /** + * project ID for video files on external storage + * + * {@hide} + */ + public static final int PROJECT_ID_EXT_MEDIA_VIDEO = 1002; - // Matches AID_MEDIA_VIDEO in android_filesystem_config.h - private static final int QUOTA_PROJECT_ID_MEDIA_VIDEO = 1056; + /** + * project ID for image files on external storage + * + * {@hide} + */ + public static final int PROJECT_ID_EXT_MEDIA_IMAGE = 1003; /** * Constant for use with @@ -2388,6 +2406,11 @@ public class StorageManager { private static native boolean setQuotaProjectId(String path, long projectId); + private static long getProjectIdForUser(int userId, int projectId) { + // Much like UserHandle.getUid(), store the user ID in the upper bits + return userId * PER_USER_RANGE + projectId; + } + /** * Let StorageManager know that the quota type for a file on external storage should * be updated. Android tracks quotas for various media types. Consequently, this should be @@ -2417,18 +2440,27 @@ public class StorageManager { @QuotaType int quotaType) throws IOException { long projectId; final String filePath = path.getCanonicalPath(); + final StorageVolume volume = getStorageVolume(path); + if (volume == null) { + throw new IllegalStateException("Failed to update quota type for " + filePath); + } + + final int userId = volume.getOwner().getIdentifier(); + if (userId < 0) { + throw new IllegalStateException("Failed to update quota type for " + filePath); + } switch (quotaType) { case QUOTA_TYPE_MEDIA_NONE: - projectId = QUOTA_PROJECT_ID_MEDIA_NONE; + projectId = getProjectIdForUser(userId, PROJECT_ID_EXT_DEFAULT); break; case QUOTA_TYPE_MEDIA_AUDIO: - projectId = QUOTA_PROJECT_ID_MEDIA_AUDIO; + projectId = getProjectIdForUser(userId, PROJECT_ID_EXT_MEDIA_AUDIO); break; case QUOTA_TYPE_MEDIA_VIDEO: - projectId = QUOTA_PROJECT_ID_MEDIA_VIDEO; + projectId = getProjectIdForUser(userId, PROJECT_ID_EXT_MEDIA_VIDEO); break; case QUOTA_TYPE_MEDIA_IMAGE: - projectId = QUOTA_PROJECT_ID_MEDIA_IMAGE; + projectId = getProjectIdForUser(userId, PROJECT_ID_EXT_MEDIA_IMAGE); break; default: throw new IllegalArgumentException("Invalid quota type: " + quotaType);