Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit fd12f36f authored by Martijn Coenen's avatar Martijn Coenen
Browse files

Switch to new project ID constants.

These are used on devices without sdcardfs.

Bug: 146419093
Test: lsattr -pR
Change-Id: I87c900d409c90770fb3eaa595324dab385458c6c
parent b3562f43
Loading
Loading
Loading
Loading
+44 −12
Original line number Diff line number Diff line
@@ -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);