Merge "Add a mehtod definition to StorageManager for appfuse."
diff --git a/core/java/android/os/storage/IMountService.java b/core/java/android/os/storage/IMountService.java
index d19c7c9..2e43ffc 100644
--- a/core/java/android/os/storage/IMountService.java
+++ b/core/java/android/os/storage/IMountService.java
@@ -21,8 +21,12 @@
import android.os.IBinder;
import android.os.IInterface;
import android.os.Parcel;
+import android.os.ParcelFileDescriptor;
+import android.os.Parcelable;
import android.os.RemoteException;
+import java.io.FileDescriptor;
+
/**
* WARNING! Update IMountService.h and IMountService.cpp if you change this
* file. In particular, the ordering of the methods below must match the
@@ -1312,6 +1316,25 @@
}
return _result;
}
+
+ @Override
+ public ParcelFileDescriptor mountAppFuse(String name) throws RemoteException {
+ Parcel _data = Parcel.obtain();
+ Parcel _reply = Parcel.obtain();
+ ParcelFileDescriptor _result = null;
+ try {
+ _data.writeInterfaceToken(DESCRIPTOR);
+ _data.writeString(name);
+ mRemote.transact(Stub.TRANSACTION_mountAppFuse, _data, _reply, 0);
+ _reply.readException();
+ _result = _reply.<ParcelFileDescriptor>readParcelable(
+ ClassLoader.getSystemClassLoader());
+ } finally {
+ _reply.recycle();
+ _data.recycle();
+ }
+ return _result;
+ }
}
private static final String DESCRIPTOR = "IMountService";
@@ -1439,6 +1462,8 @@
static final int TRANSACTION_isPerUserEncryptionEnabled = IBinder.FIRST_CALL_TRANSACTION + 67;
static final int TRANSACTION_isConvertibleToFBE = IBinder.FIRST_CALL_TRANSACTION + 68;
+ static final int TRANSACTION_mountAppFuse = IBinder.FIRST_CALL_TRANSACTION + 69;
+
/**
* Cast an IBinder object into an IMountService interface, generating a
* proxy if needed.
@@ -2056,6 +2081,14 @@
reply.writeInt(result ? 1 : 0);
return true;
}
+ case TRANSACTION_mountAppFuse: {
+ data.enforceInterface(DESCRIPTOR);
+ String name = data.readString();
+ ParcelFileDescriptor fd = mountAppFuse(name);
+ reply.writeNoException();
+ reply.writeParcelable(fd, Parcelable.PARCELABLE_WRITE_RETURN_VALUE);
+ return true;
+ }
}
return super.onTransact(code, data, reply, flags);
}
@@ -2379,4 +2412,6 @@
throws RemoteException;
public boolean isPerUserEncryptionEnabled() throws RemoteException;
+
+ public ParcelFileDescriptor mountAppFuse(String name) throws RemoteException;
}
diff --git a/core/java/android/os/storage/StorageManager.java b/core/java/android/os/storage/StorageManager.java
index 27df46d..2d9090b 100644
--- a/core/java/android/os/storage/StorageManager.java
+++ b/core/java/android/os/storage/StorageManager.java
@@ -30,6 +30,7 @@
import android.os.Handler;
import android.os.Looper;
import android.os.Message;
+import android.os.ParcelFileDescriptor;
import android.os.RemoteException;
import android.os.ServiceManager;
import android.provider.Settings;
@@ -293,7 +294,7 @@
/**
* Constructs a StorageManager object through which an application can
* can communicate with the systems mount service.
- *
+ *
* @param tgtLooper The {@link android.os.Looper} which events will be received on.
*
* <p>Applications can get instance of this class by calling
@@ -409,7 +410,7 @@
* file matches a package ID that is owned by the calling program's UID.
* That is, shared UID applications can attempt to mount any other
* application's OBB that shares its UID.
- *
+ *
* @param rawPath the path to the OBB file
* @param key secret used to encrypt the OBB; may be <code>null</code> if no
* encryption was used on the OBB.
@@ -447,7 +448,7 @@
* That is, shared UID applications can obtain access to any other
* application's OBB that shares its UID.
* <p>
- *
+ *
* @param rawPath path to the OBB file
* @param force whether to kill any programs using this in order to unmount
* it
@@ -471,7 +472,7 @@
/**
* Check whether an Opaque Binary Blob (OBB) is mounted or not.
- *
+ *
* @param rawPath path to OBB image
* @return true if OBB is mounted; false if not mounted or on error
*/
@@ -491,7 +492,7 @@
* Check the mounted path of an Opaque Binary Blob (OBB) file. This will
* give you the path to where you can obtain access to the internals of the
* OBB.
- *
+ *
* @param rawPath path to OBB image
* @return absolute path to mounted OBB image data or <code>null</code> if
* not mounted or exception encountered trying to read status
@@ -1049,6 +1050,15 @@
return path;
}
+ /** {@hide} */
+ public ParcelFileDescriptor mountAppFuse(String name) {
+ try {
+ return mMountService.mountAppFuse(name);
+ } catch (RemoteException e) {
+ throw e.rethrowAsRuntimeException();
+ }
+ }
+
/// Consts to match the password types in cryptfs.h
/** @hide */
public static final int CRYPT_TYPE_PASSWORD = 0;
diff --git a/services/core/java/com/android/server/MountService.java b/services/core/java/com/android/server/MountService.java
index 37dd884..f89155d 100644
--- a/services/core/java/com/android/server/MountService.java
+++ b/services/core/java/com/android/server/MountService.java
@@ -56,6 +56,7 @@
import android.os.IBinder;
import android.os.Looper;
import android.os.Message;
+import android.os.ParcelFileDescriptor;
import android.os.Process;
import android.os.RemoteCallbackList;
import android.os.RemoteException;
@@ -2768,6 +2769,12 @@
}
@Override
+ public ParcelFileDescriptor mountAppFuse(String name) throws RemoteException {
+ // TODO: Invoke vold to mount app fuse.
+ throw new UnsupportedOperationException();
+ }
+
+ @Override
public int mkdirs(String callingPkg, String appPath) {
final int userId = UserHandle.getUserId(Binder.getCallingUid());
final UserEnvironment userEnv = new UserEnvironment(userId);