Merge "Make getExternalStorageMountMode as SystemApi" into sc-dev

This commit is contained in:
TreeHugger Robot
2021-03-24 11:36:19 +00:00
committed by Android (Google) Code Review
5 changed files with 107 additions and 13 deletions

View File

@@ -8687,9 +8687,15 @@ package android.os.storage {
method @WorkerThread public void allocateBytes(@NonNull java.util.UUID, long, @RequiresPermission int) throws java.io.IOException; method @WorkerThread public void allocateBytes(@NonNull java.util.UUID, long, @RequiresPermission int) throws java.io.IOException;
method @WorkerThread public void allocateBytes(java.io.FileDescriptor, long, @RequiresPermission int) throws java.io.IOException; method @WorkerThread public void allocateBytes(java.io.FileDescriptor, long, @RequiresPermission int) throws java.io.IOException;
method @WorkerThread public long getAllocatableBytes(@NonNull java.util.UUID, @RequiresPermission int) throws java.io.IOException; method @WorkerThread public long getAllocatableBytes(@NonNull java.util.UUID, @RequiresPermission int) throws java.io.IOException;
method @RequiresPermission(android.Manifest.permission.WRITE_MEDIA_STORAGE) public int getExternalStorageMountMode(int, @NonNull String);
method public static boolean hasIsolatedStorage(); method public static boolean hasIsolatedStorage();
method public void updateExternalStorageFileQuotaType(@NonNull java.io.File, int) throws java.io.IOException; method public void updateExternalStorageFileQuotaType(@NonNull java.io.File, int) throws java.io.IOException;
field @RequiresPermission(android.Manifest.permission.ALLOCATE_AGGRESSIVE) public static final int FLAG_ALLOCATE_AGGRESSIVE = 1; // 0x1 field @RequiresPermission(android.Manifest.permission.ALLOCATE_AGGRESSIVE) public static final int FLAG_ALLOCATE_AGGRESSIVE = 1; // 0x1
field public static final int MOUNT_MODE_EXTERNAL_ANDROID_WRITABLE = 4; // 0x4
field public static final int MOUNT_MODE_EXTERNAL_DEFAULT = 1; // 0x1
field public static final int MOUNT_MODE_EXTERNAL_INSTALLER = 2; // 0x2
field public static final int MOUNT_MODE_EXTERNAL_NONE = 0; // 0x0
field public static final int MOUNT_MODE_EXTERNAL_PASS_THROUGH = 3; // 0x3
field public static final int QUOTA_TYPE_MEDIA_AUDIO = 2; // 0x2 field public static final int QUOTA_TYPE_MEDIA_AUDIO = 2; // 0x2
field public static final int QUOTA_TYPE_MEDIA_IMAGE = 1; // 0x1 field public static final int QUOTA_TYPE_MEDIA_IMAGE = 1; // 0x1
field public static final int QUOTA_TYPE_MEDIA_NONE = 0; // 0x0 field public static final int QUOTA_TYPE_MEDIA_NONE = 0; // 0x0
@@ -9014,6 +9020,8 @@ package android.provider {
method @NonNull public static android.net.Uri setManageMode(@NonNull android.net.Uri); method @NonNull public static android.net.Uri setManageMode(@NonNull android.net.Uri);
field public static final String ACTION_DOCUMENT_ROOT_SETTINGS = "android.provider.action.DOCUMENT_ROOT_SETTINGS"; field public static final String ACTION_DOCUMENT_ROOT_SETTINGS = "android.provider.action.DOCUMENT_ROOT_SETTINGS";
field public static final String ACTION_MANAGE_DOCUMENT = "android.provider.action.MANAGE_DOCUMENT"; field public static final String ACTION_MANAGE_DOCUMENT = "android.provider.action.MANAGE_DOCUMENT";
field public static final String DOWNLOADS_PROVIDER_AUTHORITY = "downloads";
field public static final String EXTERNAL_STORAGE_PROVIDER_AUTHORITY = "com.android.externalstorage.documents";
field public static final String EXTRA_SHOW_ADVANCED = "android.provider.extra.SHOW_ADVANCED"; field public static final String EXTRA_SHOW_ADVANCED = "android.provider.extra.SHOW_ADVANCED";
} }

View File

@@ -202,4 +202,5 @@ interface IStorageManager {
void notifyAppIoResumed(in String volumeUuid, int uid, int tid, int reason) = 92; void notifyAppIoResumed(in String volumeUuid, int uid, int tid, int reason) = 92;
PendingIntent getManageSpaceActivityIntent(in String packageName, int requestCode) = 93; PendingIntent getManageSpaceActivityIntent(in String packageName, int requestCode) = 93;
boolean isAppIoBlocked(in String volumeUuid, int uid, int tid, int reason) = 94; boolean isAppIoBlocked(in String volumeUuid, int uid, int tid, int reason) = 94;
int getExternalStorageMountMode(int uid, in String packageName) = 95;
} }

View File

@@ -2124,6 +2124,52 @@ public class StorageManager {
} }
} }
/** @hide */
@IntDef(prefix = { "MOUNT_MODE_" }, value = {
MOUNT_MODE_EXTERNAL_NONE,
MOUNT_MODE_EXTERNAL_DEFAULT,
MOUNT_MODE_EXTERNAL_INSTALLER,
MOUNT_MODE_EXTERNAL_PASS_THROUGH,
MOUNT_MODE_EXTERNAL_ANDROID_WRITABLE
})
/** @hide */
public @interface MountMode {}
/**
* No external storage should be mounted.
* @hide
*/
@SystemApi
public static final int MOUNT_MODE_EXTERNAL_NONE = IVold.REMOUNT_MODE_NONE;
/**
* Default external storage should be mounted.
* @hide
*/
@SystemApi
public static final int MOUNT_MODE_EXTERNAL_DEFAULT = IVold.REMOUNT_MODE_DEFAULT;
/**
* Mount mode for package installers which should give them access to
* all obb dirs in addition to their package sandboxes
* @hide
*/
@SystemApi
public static final int MOUNT_MODE_EXTERNAL_INSTALLER = IVold.REMOUNT_MODE_INSTALLER;
/**
* The lower file system should be bind mounted directly on external storage
* @hide
*/
@SystemApi
public static final int MOUNT_MODE_EXTERNAL_PASS_THROUGH = IVold.REMOUNT_MODE_PASS_THROUGH;
/**
* Use the regular scoped storage filesystem, but Android/ should be writable.
* Used to support the applications hosting DownloadManager and the MTP server.
* @hide
*/
@SystemApi
public static final int MOUNT_MODE_EXTERNAL_ANDROID_WRITABLE =
IVold.REMOUNT_MODE_ANDROID_WRITABLE;
/** /**
* Flag indicating that a disk space allocation request should operate in an * Flag indicating that a disk space allocation request should operate in an
* aggressive mode. This flag should only be rarely used in situations that * aggressive mode. This flag should only be rarely used in situations that
@@ -2300,6 +2346,28 @@ public class StorageManager {
} }
} }
/**
* Returns the External Storage mount mode corresponding to the given uid and packageName.
* These mount modes specify different views and access levels for
* different apps on external storage.
*
* @params uid UID of the application
* @params packageName name of the package
* @return {@code MountMode} for the given uid and packageName.
*
* @hide
*/
@RequiresPermission(android.Manifest.permission.WRITE_MEDIA_STORAGE)
@SystemApi
@MountMode
public int getExternalStorageMountMode(int uid, @NonNull String packageName) {
try {
return mStorageManager.getExternalStorageMountMode(uid, packageName);
} catch (RemoteException e) {
throw e.rethrowFromSystemServer();
}
}
/** /**
* Allocate the requested number of bytes for your application to use in the * Allocate the requested number of bytes for your application to use in the
* given open file. This will cause the system to delete any cached files * given open file. This will cause the system to delete any cached files

View File

@@ -236,10 +236,21 @@ public final class DocumentsContract {
public static final String public static final String
ACTION_DOCUMENT_ROOT_SETTINGS = "android.provider.action.DOCUMENT_ROOT_SETTINGS"; ACTION_DOCUMENT_ROOT_SETTINGS = "android.provider.action.DOCUMENT_ROOT_SETTINGS";
/** {@hide} */ /**
* External Storage Provider's authority string
* {@hide}
*/
@SystemApi
public static final String EXTERNAL_STORAGE_PROVIDER_AUTHORITY = public static final String EXTERNAL_STORAGE_PROVIDER_AUTHORITY =
"com.android.externalstorage.documents"; "com.android.externalstorage.documents";
/**
* Download Manager's authority string
* {@hide}
*/
@SystemApi
public static final String DOWNLOADS_PROVIDER_AUTHORITY = Downloads.Impl.AUTHORITY;
/** {@hide} */ /** {@hide} */
public static final String EXTERNAL_STORAGE_PRIMARY_EMULATED_ROOT_ID = "primary"; public static final String EXTERNAL_STORAGE_PRIMARY_EMULATED_ROOT_ID = "primary";

View File

@@ -143,7 +143,6 @@ import com.android.internal.os.AppFuseMount;
import com.android.internal.os.BackgroundThread; import com.android.internal.os.BackgroundThread;
import com.android.internal.os.FuseUnavailableMountException; import com.android.internal.os.FuseUnavailableMountException;
import com.android.internal.os.SomeArgs; import com.android.internal.os.SomeArgs;
import com.android.internal.os.Zygote;
import com.android.internal.util.ArrayUtils; import com.android.internal.util.ArrayUtils;
import com.android.internal.util.CollectionUtils; import com.android.internal.util.CollectionUtils;
import com.android.internal.util.DumpUtils; import com.android.internal.util.DumpUtils;
@@ -4268,31 +4267,37 @@ class StorageManagerService extends IStorageManager.Stub
} }
} }
@Override
public int getExternalStorageMountMode(int uid, String packageName) {
enforcePermission(android.Manifest.permission.WRITE_MEDIA_STORAGE);
return mStorageManagerInternal.getExternalStorageMountMode(uid, packageName);
}
private int getMountModeInternal(int uid, String packageName) { private int getMountModeInternal(int uid, String packageName) {
try { try {
// Get some easy cases out of the way first // Get some easy cases out of the way first
if (Process.isIsolated(uid)) { if (Process.isIsolated(uid)) {
return Zygote.MOUNT_EXTERNAL_NONE; return StorageManager.MOUNT_MODE_EXTERNAL_NONE;
} }
final String[] packagesForUid = mIPackageManager.getPackagesForUid(uid); final String[] packagesForUid = mIPackageManager.getPackagesForUid(uid);
if (ArrayUtils.isEmpty(packagesForUid)) { if (ArrayUtils.isEmpty(packagesForUid)) {
// It's possible the package got uninstalled already, so just ignore. // It's possible the package got uninstalled already, so just ignore.
return Zygote.MOUNT_EXTERNAL_NONE; return StorageManager.MOUNT_MODE_EXTERNAL_NONE;
} }
if (packageName == null) { if (packageName == null) {
packageName = packagesForUid[0]; packageName = packagesForUid[0];
} }
if (mPmInternal.isInstantApp(packageName, UserHandle.getUserId(uid))) { if (mPmInternal.isInstantApp(packageName, UserHandle.getUserId(uid))) {
return Zygote.MOUNT_EXTERNAL_NONE; return StorageManager.MOUNT_MODE_EXTERNAL_NONE;
} }
if (mStorageManagerInternal.isExternalStorageService(uid)) { if (mStorageManagerInternal.isExternalStorageService(uid)) {
// Determine if caller requires pass_through mount; note that we do this for // Determine if caller requires pass_through mount; note that we do this for
// all processes that share a UID with MediaProvider; but this is fine, since // all processes that share a UID with MediaProvider; but this is fine, since
// those processes anyway share the same rights as MediaProvider. // those processes anyway share the same rights as MediaProvider.
return Zygote.MOUNT_EXTERNAL_PASS_THROUGH; return StorageManager.MOUNT_MODE_EXTERNAL_PASS_THROUGH;
} }
if ((mDownloadsAuthorityAppId == UserHandle.getAppId(uid) if ((mDownloadsAuthorityAppId == UserHandle.getAppId(uid)
@@ -4300,7 +4305,7 @@ class StorageManagerService extends IStorageManager.Stub
// DownloadManager can write in app-private directories on behalf of apps; // DownloadManager can write in app-private directories on behalf of apps;
// give it write access to Android/ // give it write access to Android/
// ExternalStorageProvider can access Android/{data,obb} dirs in managed mode // ExternalStorageProvider can access Android/{data,obb} dirs in managed mode
return Zygote.MOUNT_EXTERNAL_ANDROID_WRITABLE; return StorageManager.MOUNT_MODE_EXTERNAL_ANDROID_WRITABLE;
} }
final boolean hasMtp = mIPackageManager.checkUidPermission(ACCESS_MTP, uid) == final boolean hasMtp = mIPackageManager.checkUidPermission(ACCESS_MTP, uid) ==
@@ -4310,7 +4315,7 @@ class StorageManagerService extends IStorageManager.Stub
0, UserHandle.getUserId(uid)); 0, UserHandle.getUserId(uid));
if (ai != null && ai.isSignedWithPlatformKey()) { if (ai != null && ai.isSignedWithPlatformKey()) {
// Platform processes hosting the MTP server should be able to write in Android/ // Platform processes hosting the MTP server should be able to write in Android/
return Zygote.MOUNT_EXTERNAL_ANDROID_WRITABLE; return StorageManager.MOUNT_MODE_EXTERNAL_ANDROID_WRITABLE;
} }
} }
@@ -4335,13 +4340,13 @@ class StorageManagerService extends IStorageManager.Stub
} }
} }
if ((hasInstall || hasInstallOp) && hasWrite) { if ((hasInstall || hasInstallOp) && hasWrite) {
return Zygote.MOUNT_EXTERNAL_INSTALLER; return StorageManager.MOUNT_MODE_EXTERNAL_INSTALLER;
} }
return Zygote.MOUNT_EXTERNAL_DEFAULT; return StorageManager.MOUNT_MODE_EXTERNAL_DEFAULT;
} catch (RemoteException e) { } catch (RemoteException e) {
// Should not happen // Should not happen
} }
return Zygote.MOUNT_EXTERNAL_NONE; return StorageManager.MOUNT_MODE_EXTERNAL_NONE;
} }
private static class Callbacks extends Handler { private static class Callbacks extends Handler {
@@ -4711,7 +4716,8 @@ class StorageManagerService extends IStorageManager.Stub
return true; return true;
} }
return getExternalStorageMountMode(uid, packageName) != Zygote.MOUNT_EXTERNAL_NONE; return getExternalStorageMountMode(uid, packageName)
!= StorageManager.MOUNT_MODE_EXTERNAL_NONE;
} }
private void killAppForOpChange(int code, int uid) { private void killAppForOpChange(int code, int uid) {