Home | History | Annotate | Download | only in storage
      1 /*
      2  * Copyright (C) 2010 The Android Open Source Project
      3  *
      4  * Licensed under the Apache License, Version 2.0 (the "License");
      5  * you may not use this file except in compliance with the License.
      6  * You may obtain a copy of the License at
      7  *
      8  *      http://www.apache.org/licenses/LICENSE-2.0
      9  *
     10  * Unless required by applicable law or agreed to in writing, software
     11  * distributed under the License is distributed on an "AS IS" BASIS,
     12  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
     13  * See the License for the specific language governing permissions and
     14  * limitations under the License.
     15  */
     16 
     17 package android.os.storage;
     18 
     19 import android.content.pm.IPackageMoveObserver;
     20 import android.os.Binder;
     21 import android.os.IBinder;
     22 import android.os.IInterface;
     23 import android.os.Parcel;
     24 import android.os.ParcelFileDescriptor;
     25 import android.os.Parcelable;
     26 import android.os.RemoteException;
     27 
     28 /**
     29  * WARNING! Update IMountService.h and IMountService.cpp if you change this
     30  * file. In particular, the ordering of the methods below must match the
     31  * _TRANSACTION enum in IMountService.cpp
     32  *
     33  * @hide - Applications should use android.os.storage.StorageManager to access
     34  *       storage functions.
     35  */
     36 public interface IMountService extends IInterface {
     37     /** Local-side IPC implementation stub class. */
     38     public static abstract class Stub extends Binder implements IMountService {
     39         private static class Proxy implements IMountService {
     40             private final IBinder mRemote;
     41 
     42             Proxy(IBinder remote) {
     43                 mRemote = remote;
     44             }
     45 
     46             public IBinder asBinder() {
     47                 return mRemote;
     48             }
     49 
     50             public String getInterfaceDescriptor() {
     51                 return DESCRIPTOR;
     52             }
     53 
     54             /**
     55              * Registers an IMountServiceListener for receiving async
     56              * notifications.
     57              */
     58             public void registerListener(IMountServiceListener listener) throws RemoteException {
     59                 Parcel _data = Parcel.obtain();
     60                 Parcel _reply = Parcel.obtain();
     61                 try {
     62                     _data.writeInterfaceToken(DESCRIPTOR);
     63                     _data.writeStrongBinder((listener != null ? listener.asBinder() : null));
     64                     mRemote.transact(Stub.TRANSACTION_registerListener, _data, _reply, 0);
     65                     _reply.readException();
     66                 } finally {
     67                     _reply.recycle();
     68                     _data.recycle();
     69                 }
     70             }
     71 
     72             /**
     73              * Unregisters an IMountServiceListener
     74              */
     75             public void unregisterListener(IMountServiceListener listener) throws RemoteException {
     76                 Parcel _data = Parcel.obtain();
     77                 Parcel _reply = Parcel.obtain();
     78                 try {
     79                     _data.writeInterfaceToken(DESCRIPTOR);
     80                     _data.writeStrongBinder((listener != null ? listener.asBinder() : null));
     81                     mRemote.transact(Stub.TRANSACTION_unregisterListener, _data, _reply, 0);
     82                     _reply.readException();
     83                 } finally {
     84                     _reply.recycle();
     85                     _data.recycle();
     86                 }
     87             }
     88 
     89             /**
     90              * Returns true if a USB mass storage host is connected
     91              */
     92             public boolean isUsbMassStorageConnected() throws RemoteException {
     93                 Parcel _data = Parcel.obtain();
     94                 Parcel _reply = Parcel.obtain();
     95                 boolean _result;
     96                 try {
     97                     _data.writeInterfaceToken(DESCRIPTOR);
     98                     mRemote.transact(Stub.TRANSACTION_isUsbMassStorageConnected, _data, _reply, 0);
     99                     _reply.readException();
    100                     _result = 0 != _reply.readInt();
    101                 } finally {
    102                     _reply.recycle();
    103                     _data.recycle();
    104                 }
    105                 return _result;
    106             }
    107 
    108             /**
    109              * Enables / disables USB mass storage. The caller should check
    110              * actual status of enabling/disabling USB mass storage via
    111              * StorageEventListener.
    112              */
    113             public void setUsbMassStorageEnabled(boolean enable) throws RemoteException {
    114                 Parcel _data = Parcel.obtain();
    115                 Parcel _reply = Parcel.obtain();
    116                 try {
    117                     _data.writeInterfaceToken(DESCRIPTOR);
    118                     _data.writeInt((enable ? 1 : 0));
    119                     mRemote.transact(Stub.TRANSACTION_setUsbMassStorageEnabled, _data, _reply, 0);
    120                     _reply.readException();
    121                 } finally {
    122                     _reply.recycle();
    123                     _data.recycle();
    124                 }
    125             }
    126 
    127             /**
    128              * Returns true if a USB mass storage host is enabled (media is
    129              * shared)
    130              */
    131             public boolean isUsbMassStorageEnabled() throws RemoteException {
    132                 Parcel _data = Parcel.obtain();
    133                 Parcel _reply = Parcel.obtain();
    134                 boolean _result;
    135                 try {
    136                     _data.writeInterfaceToken(DESCRIPTOR);
    137                     mRemote.transact(Stub.TRANSACTION_isUsbMassStorageEnabled, _data, _reply, 0);
    138                     _reply.readException();
    139                     _result = 0 != _reply.readInt();
    140                 } finally {
    141                     _reply.recycle();
    142                     _data.recycle();
    143                 }
    144                 return _result;
    145             }
    146 
    147             /**
    148              * Mount external storage at given mount point. Returns an int
    149              * consistent with MountServiceResultCode
    150              */
    151             public int mountVolume(String mountPoint) throws RemoteException {
    152                 Parcel _data = Parcel.obtain();
    153                 Parcel _reply = Parcel.obtain();
    154                 int _result;
    155                 try {
    156                     _data.writeInterfaceToken(DESCRIPTOR);
    157                     _data.writeString(mountPoint);
    158                     mRemote.transact(Stub.TRANSACTION_mountVolume, _data, _reply, 0);
    159                     _reply.readException();
    160                     _result = _reply.readInt();
    161                 } finally {
    162                     _reply.recycle();
    163                     _data.recycle();
    164                 }
    165                 return _result;
    166             }
    167 
    168             /**
    169              * Safely unmount external storage at given mount point. The unmount
    170              * is an asynchronous operation. Applications should register
    171              * StorageEventListener for storage related status changes.
    172              */
    173             public void unmountVolume(String mountPoint, boolean force, boolean removeEncryption)
    174                     throws RemoteException {
    175                 Parcel _data = Parcel.obtain();
    176                 Parcel _reply = Parcel.obtain();
    177                 try {
    178                     _data.writeInterfaceToken(DESCRIPTOR);
    179                     _data.writeString(mountPoint);
    180                     _data.writeInt((force ? 1 : 0));
    181                     _data.writeInt((removeEncryption ? 1 : 0));
    182                     mRemote.transact(Stub.TRANSACTION_unmountVolume, _data, _reply, 0);
    183                     _reply.readException();
    184                 } finally {
    185                     _reply.recycle();
    186                     _data.recycle();
    187                 }
    188             }
    189 
    190             /**
    191              * Format external storage given a mount point. Returns an int
    192              * consistent with MountServiceResultCode
    193              */
    194             public int formatVolume(String mountPoint) throws RemoteException {
    195                 Parcel _data = Parcel.obtain();
    196                 Parcel _reply = Parcel.obtain();
    197                 int _result;
    198                 try {
    199                     _data.writeInterfaceToken(DESCRIPTOR);
    200                     _data.writeString(mountPoint);
    201                     mRemote.transact(Stub.TRANSACTION_formatVolume, _data, _reply, 0);
    202                     _reply.readException();
    203                     _result = _reply.readInt();
    204                 } finally {
    205                     _reply.recycle();
    206                     _data.recycle();
    207                 }
    208                 return _result;
    209             }
    210 
    211             /**
    212              * Returns an array of pids with open files on the specified path.
    213              */
    214             public int[] getStorageUsers(String path) throws RemoteException {
    215                 Parcel _data = Parcel.obtain();
    216                 Parcel _reply = Parcel.obtain();
    217                 int[] _result;
    218                 try {
    219                     _data.writeInterfaceToken(DESCRIPTOR);
    220                     _data.writeString(path);
    221                     mRemote.transact(Stub.TRANSACTION_getStorageUsers, _data, _reply, 0);
    222                     _reply.readException();
    223                     _result = _reply.createIntArray();
    224                 } finally {
    225                     _reply.recycle();
    226                     _data.recycle();
    227                 }
    228                 return _result;
    229             }
    230 
    231             /**
    232              * Gets the state of a volume via its mountpoint.
    233              */
    234             public String getVolumeState(String mountPoint) throws RemoteException {
    235                 Parcel _data = Parcel.obtain();
    236                 Parcel _reply = Parcel.obtain();
    237                 String _result;
    238                 try {
    239                     _data.writeInterfaceToken(DESCRIPTOR);
    240                     _data.writeString(mountPoint);
    241                     mRemote.transact(Stub.TRANSACTION_getVolumeState, _data, _reply, 0);
    242                     _reply.readException();
    243                     _result = _reply.readString();
    244                 } finally {
    245                     _reply.recycle();
    246                     _data.recycle();
    247                 }
    248                 return _result;
    249             }
    250 
    251             /*
    252              * Creates a secure container with the specified parameters. Returns
    253              * an int consistent with MountServiceResultCode
    254              */
    255             public int createSecureContainer(String id, int sizeMb, String fstype, String key,
    256                     int ownerUid, boolean external) throws RemoteException {
    257                 Parcel _data = Parcel.obtain();
    258                 Parcel _reply = Parcel.obtain();
    259                 int _result;
    260                 try {
    261                     _data.writeInterfaceToken(DESCRIPTOR);
    262                     _data.writeString(id);
    263                     _data.writeInt(sizeMb);
    264                     _data.writeString(fstype);
    265                     _data.writeString(key);
    266                     _data.writeInt(ownerUid);
    267                     _data.writeInt(external ? 1 : 0);
    268                     mRemote.transact(Stub.TRANSACTION_createSecureContainer, _data, _reply, 0);
    269                     _reply.readException();
    270                     _result = _reply.readInt();
    271                 } finally {
    272                     _reply.recycle();
    273                     _data.recycle();
    274                 }
    275                 return _result;
    276             }
    277 
    278             /*
    279              * Destroy a secure container, and free up all resources associated
    280              * with it. NOTE: Ensure all references are released prior to
    281              * deleting. Returns an int consistent with MountServiceResultCode
    282              */
    283             public int destroySecureContainer(String id, boolean force) throws RemoteException {
    284                 Parcel _data = Parcel.obtain();
    285                 Parcel _reply = Parcel.obtain();
    286                 int _result;
    287                 try {
    288                     _data.writeInterfaceToken(DESCRIPTOR);
    289                     _data.writeString(id);
    290                     _data.writeInt((force ? 1 : 0));
    291                     mRemote.transact(Stub.TRANSACTION_destroySecureContainer, _data, _reply, 0);
    292                     _reply.readException();
    293                     _result = _reply.readInt();
    294                 } finally {
    295                     _reply.recycle();
    296                     _data.recycle();
    297                 }
    298                 return _result;
    299             }
    300 
    301             /*
    302              * Finalize a container which has just been created and populated.
    303              * After finalization, the container is immutable. Returns an int
    304              * consistent with MountServiceResultCode
    305              */
    306             public int finalizeSecureContainer(String id) throws RemoteException {
    307                 Parcel _data = Parcel.obtain();
    308                 Parcel _reply = Parcel.obtain();
    309                 int _result;
    310                 try {
    311                     _data.writeInterfaceToken(DESCRIPTOR);
    312                     _data.writeString(id);
    313                     mRemote.transact(Stub.TRANSACTION_finalizeSecureContainer, _data, _reply, 0);
    314                     _reply.readException();
    315                     _result = _reply.readInt();
    316                 } finally {
    317                     _reply.recycle();
    318                     _data.recycle();
    319                 }
    320                 return _result;
    321             }
    322 
    323             /*
    324              * Mount a secure container with the specified key and owner UID.
    325              * Returns an int consistent with MountServiceResultCode
    326              */
    327             public int mountSecureContainer(String id, String key, int ownerUid, boolean readOnly)
    328                     throws RemoteException {
    329                 Parcel _data = Parcel.obtain();
    330                 Parcel _reply = Parcel.obtain();
    331                 int _result;
    332                 try {
    333                     _data.writeInterfaceToken(DESCRIPTOR);
    334                     _data.writeString(id);
    335                     _data.writeString(key);
    336                     _data.writeInt(ownerUid);
    337                     _data.writeInt(readOnly ? 1 : 0);
    338                     mRemote.transact(Stub.TRANSACTION_mountSecureContainer, _data, _reply, 0);
    339                     _reply.readException();
    340                     _result = _reply.readInt();
    341                 } finally {
    342                     _reply.recycle();
    343                     _data.recycle();
    344                 }
    345                 return _result;
    346             }
    347 
    348             /*
    349              * Unount a secure container. Returns an int consistent with
    350              * MountServiceResultCode
    351              */
    352             public int unmountSecureContainer(String id, boolean force) throws RemoteException {
    353                 Parcel _data = Parcel.obtain();
    354                 Parcel _reply = Parcel.obtain();
    355                 int _result;
    356                 try {
    357                     _data.writeInterfaceToken(DESCRIPTOR);
    358                     _data.writeString(id);
    359                     _data.writeInt((force ? 1 : 0));
    360                     mRemote.transact(Stub.TRANSACTION_unmountSecureContainer, _data, _reply, 0);
    361                     _reply.readException();
    362                     _result = _reply.readInt();
    363                 } finally {
    364                     _reply.recycle();
    365                     _data.recycle();
    366                 }
    367                 return _result;
    368             }
    369 
    370             /*
    371              * Returns true if the specified container is mounted
    372              */
    373             public boolean isSecureContainerMounted(String id) throws RemoteException {
    374                 Parcel _data = Parcel.obtain();
    375                 Parcel _reply = Parcel.obtain();
    376                 boolean _result;
    377                 try {
    378                     _data.writeInterfaceToken(DESCRIPTOR);
    379                     _data.writeString(id);
    380                     mRemote.transact(Stub.TRANSACTION_isSecureContainerMounted, _data, _reply, 0);
    381                     _reply.readException();
    382                     _result = 0 != _reply.readInt();
    383                 } finally {
    384                     _reply.recycle();
    385                     _data.recycle();
    386                 }
    387                 return _result;
    388             }
    389 
    390             /*
    391              * Rename an unmounted secure container. Returns an int consistent
    392              * with MountServiceResultCode
    393              */
    394             public int renameSecureContainer(String oldId, String newId) throws RemoteException {
    395                 Parcel _data = Parcel.obtain();
    396                 Parcel _reply = Parcel.obtain();
    397                 int _result;
    398                 try {
    399                     _data.writeInterfaceToken(DESCRIPTOR);
    400                     _data.writeString(oldId);
    401                     _data.writeString(newId);
    402                     mRemote.transact(Stub.TRANSACTION_renameSecureContainer, _data, _reply, 0);
    403                     _reply.readException();
    404                     _result = _reply.readInt();
    405                 } finally {
    406                     _reply.recycle();
    407                     _data.recycle();
    408                 }
    409                 return _result;
    410             }
    411 
    412             /*
    413              * Returns the filesystem path of a mounted secure container.
    414              */
    415             public String getSecureContainerPath(String id) throws RemoteException {
    416                 Parcel _data = Parcel.obtain();
    417                 Parcel _reply = Parcel.obtain();
    418                 String _result;
    419                 try {
    420                     _data.writeInterfaceToken(DESCRIPTOR);
    421                     _data.writeString(id);
    422                     mRemote.transact(Stub.TRANSACTION_getSecureContainerPath, _data, _reply, 0);
    423                     _reply.readException();
    424                     _result = _reply.readString();
    425                 } finally {
    426                     _reply.recycle();
    427                     _data.recycle();
    428                 }
    429                 return _result;
    430             }
    431 
    432             /**
    433              * Gets an Array of currently known secure container IDs
    434              */
    435             public String[] getSecureContainerList() throws RemoteException {
    436                 Parcel _data = Parcel.obtain();
    437                 Parcel _reply = Parcel.obtain();
    438                 String[] _result;
    439                 try {
    440                     _data.writeInterfaceToken(DESCRIPTOR);
    441                     mRemote.transact(Stub.TRANSACTION_getSecureContainerList, _data, _reply, 0);
    442                     _reply.readException();
    443                     _result = _reply.createStringArray();
    444                 } finally {
    445                     _reply.recycle();
    446                     _data.recycle();
    447                 }
    448                 return _result;
    449             }
    450 
    451             /**
    452              * Shuts down the MountService and gracefully unmounts all external
    453              * media. Invokes call back once the shutdown is complete.
    454              */
    455             public void shutdown(IMountShutdownObserver observer)
    456                     throws RemoteException {
    457                 Parcel _data = Parcel.obtain();
    458                 Parcel _reply = Parcel.obtain();
    459                 try {
    460                     _data.writeInterfaceToken(DESCRIPTOR);
    461                     _data.writeStrongBinder((observer != null ? observer.asBinder() : null));
    462                     mRemote.transact(Stub.TRANSACTION_shutdown, _data, _reply, 0);
    463                     _reply.readException();
    464                 } finally {
    465                     _reply.recycle();
    466                     _data.recycle();
    467                 }
    468             }
    469 
    470             /**
    471              * Call into MountService by PackageManager to notify that its done
    472              * processing the media status update request.
    473              */
    474             public void finishMediaUpdate() throws RemoteException {
    475                 Parcel _data = Parcel.obtain();
    476                 Parcel _reply = Parcel.obtain();
    477                 try {
    478                     _data.writeInterfaceToken(DESCRIPTOR);
    479                     mRemote.transact(Stub.TRANSACTION_finishMediaUpdate, _data, _reply, 0);
    480                     _reply.readException();
    481                 } finally {
    482                     _reply.recycle();
    483                     _data.recycle();
    484                 }
    485             }
    486 
    487             /**
    488              * Mounts an Opaque Binary Blob (OBB) with the specified decryption
    489              * key and only allows the calling process's UID access to the
    490              * contents. MountService will call back to the supplied
    491              * IObbActionListener to inform it of the terminal state of the
    492              * call.
    493              */
    494             public void mountObb(String rawPath, String canonicalPath, String key,
    495                     IObbActionListener token, int nonce) throws RemoteException {
    496                 Parcel _data = Parcel.obtain();
    497                 Parcel _reply = Parcel.obtain();
    498                 try {
    499                     _data.writeInterfaceToken(DESCRIPTOR);
    500                     _data.writeString(rawPath);
    501                     _data.writeString(canonicalPath);
    502                     _data.writeString(key);
    503                     _data.writeStrongBinder((token != null ? token.asBinder() : null));
    504                     _data.writeInt(nonce);
    505                     mRemote.transact(Stub.TRANSACTION_mountObb, _data, _reply, 0);
    506                     _reply.readException();
    507                 } finally {
    508                     _reply.recycle();
    509                     _data.recycle();
    510                 }
    511             }
    512 
    513             /**
    514              * Unmounts an Opaque Binary Blob (OBB). When the force flag is
    515              * specified, any program using it will be forcibly killed to
    516              * unmount the image. MountService will call back to the supplied
    517              * IObbActionListener to inform it of the terminal state of the
    518              * call.
    519              */
    520             public void unmountObb(
    521                     String rawPath, boolean force, IObbActionListener token, int nonce)
    522                     throws RemoteException {
    523                 Parcel _data = Parcel.obtain();
    524                 Parcel _reply = Parcel.obtain();
    525                 try {
    526                     _data.writeInterfaceToken(DESCRIPTOR);
    527                     _data.writeString(rawPath);
    528                     _data.writeInt((force ? 1 : 0));
    529                     _data.writeStrongBinder((token != null ? token.asBinder() : null));
    530                     _data.writeInt(nonce);
    531                     mRemote.transact(Stub.TRANSACTION_unmountObb, _data, _reply, 0);
    532                     _reply.readException();
    533                 } finally {
    534                     _reply.recycle();
    535                     _data.recycle();
    536                 }
    537             }
    538 
    539             /**
    540              * Checks whether the specified Opaque Binary Blob (OBB) is mounted
    541              * somewhere.
    542              */
    543             public boolean isObbMounted(String rawPath) throws RemoteException {
    544                 Parcel _data = Parcel.obtain();
    545                 Parcel _reply = Parcel.obtain();
    546                 boolean _result;
    547                 try {
    548                     _data.writeInterfaceToken(DESCRIPTOR);
    549                     _data.writeString(rawPath);
    550                     mRemote.transact(Stub.TRANSACTION_isObbMounted, _data, _reply, 0);
    551                     _reply.readException();
    552                     _result = 0 != _reply.readInt();
    553                 } finally {
    554                     _reply.recycle();
    555                     _data.recycle();
    556                 }
    557                 return _result;
    558             }
    559 
    560             /**
    561              * Gets the path to the mounted Opaque Binary Blob (OBB).
    562              */
    563             public String getMountedObbPath(String rawPath) throws RemoteException {
    564                 Parcel _data = Parcel.obtain();
    565                 Parcel _reply = Parcel.obtain();
    566                 String _result;
    567                 try {
    568                     _data.writeInterfaceToken(DESCRIPTOR);
    569                     _data.writeString(rawPath);
    570                     mRemote.transact(Stub.TRANSACTION_getMountedObbPath, _data, _reply, 0);
    571                     _reply.readException();
    572                     _result = _reply.readString();
    573                 } finally {
    574                     _reply.recycle();
    575                     _data.recycle();
    576                 }
    577                 return _result;
    578             }
    579 
    580             /**
    581              * Returns whether the external storage is emulated.
    582              */
    583             public boolean isExternalStorageEmulated() throws RemoteException {
    584                 Parcel _data = Parcel.obtain();
    585                 Parcel _reply = Parcel.obtain();
    586                 boolean _result;
    587                 try {
    588                     _data.writeInterfaceToken(DESCRIPTOR);
    589                     mRemote.transact(Stub.TRANSACTION_isExternalStorageEmulated, _data, _reply, 0);
    590                     _reply.readException();
    591                     _result = 0 != _reply.readInt();
    592                 } finally {
    593                     _reply.recycle();
    594                     _data.recycle();
    595                 }
    596                 return _result;
    597             }
    598 
    599             public int getEncryptionState() throws RemoteException {
    600                 Parcel _data = Parcel.obtain();
    601                 Parcel _reply = Parcel.obtain();
    602                 int _result;
    603                 try {
    604                     _data.writeInterfaceToken(DESCRIPTOR);
    605                     mRemote.transact(Stub.TRANSACTION_getEncryptionState, _data, _reply, 0);
    606                     _reply.readException();
    607                     _result = _reply.readInt();
    608                 } finally {
    609                     _reply.recycle();
    610                     _data.recycle();
    611                 }
    612                 return _result;
    613             }
    614 
    615             public int decryptStorage(String password) throws RemoteException {
    616                 Parcel _data = Parcel.obtain();
    617                 Parcel _reply = Parcel.obtain();
    618                 int _result;
    619                 try {
    620                     _data.writeInterfaceToken(DESCRIPTOR);
    621                     _data.writeString(password);
    622                     mRemote.transact(Stub.TRANSACTION_decryptStorage, _data, _reply, 0);
    623                     _reply.readException();
    624                     _result = _reply.readInt();
    625                 } finally {
    626                     _reply.recycle();
    627                     _data.recycle();
    628                 }
    629                 return _result;
    630             }
    631 
    632             public int encryptStorage(int type, String password) throws RemoteException {
    633                 Parcel _data = Parcel.obtain();
    634                 Parcel _reply = Parcel.obtain();
    635                 int _result;
    636                 try {
    637                     _data.writeInterfaceToken(DESCRIPTOR);
    638                     _data.writeInt(type);
    639                     _data.writeString(password);
    640                     mRemote.transact(Stub.TRANSACTION_encryptStorage, _data, _reply, 0);
    641                     _reply.readException();
    642                     _result = _reply.readInt();
    643                 } finally {
    644                     _reply.recycle();
    645                     _data.recycle();
    646                 }
    647                 return _result;
    648             }
    649 
    650             public int changeEncryptionPassword(int type, String password) throws RemoteException {
    651                 Parcel _data = Parcel.obtain();
    652                 Parcel _reply = Parcel.obtain();
    653                 int _result;
    654                 try {
    655                     _data.writeInterfaceToken(DESCRIPTOR);
    656                     _data.writeInt(type);
    657                     _data.writeString(password);
    658                     mRemote.transact(Stub.TRANSACTION_changeEncryptionPassword, _data, _reply, 0);
    659                     _reply.readException();
    660                     _result = _reply.readInt();
    661                 } finally {
    662                     _reply.recycle();
    663                     _data.recycle();
    664                 }
    665                 return _result;
    666             }
    667 
    668             @Override
    669             public int verifyEncryptionPassword(String password) throws RemoteException {
    670                 Parcel _data = Parcel.obtain();
    671                 Parcel _reply = Parcel.obtain();
    672                 int _result;
    673                 try {
    674                     _data.writeInterfaceToken(DESCRIPTOR);
    675                     _data.writeString(password);
    676                     mRemote.transact(Stub.TRANSACTION_verifyEncryptionPassword, _data, _reply, 0);
    677                     _reply.readException();
    678                     _result = _reply.readInt();
    679                 } finally {
    680                     _reply.recycle();
    681                     _data.recycle();
    682                 }
    683                 return _result;
    684             }
    685 
    686             public int getPasswordType() throws RemoteException {
    687                 Parcel _data = Parcel.obtain();
    688                 Parcel _reply = Parcel.obtain();
    689                 int _result;
    690                 try {
    691                     _data.writeInterfaceToken(DESCRIPTOR);
    692                     mRemote.transact(Stub.TRANSACTION_getPasswordType, _data, _reply, 0);
    693                     _reply.readException();
    694                     _result = _reply.readInt();
    695                 } finally {
    696                     _reply.recycle();
    697                     _data.recycle();
    698                 }
    699                 return _result;
    700             }
    701 
    702             public String getPassword() throws RemoteException {
    703                 Parcel _data = Parcel.obtain();
    704                 Parcel _reply = Parcel.obtain();
    705                 String _result;
    706                 try {
    707                     _data.writeInterfaceToken(DESCRIPTOR);
    708                     mRemote.transact(Stub.TRANSACTION_getPassword, _data, _reply, 0);
    709                     _reply.readException();
    710                     _result = _reply.readString();
    711                 } finally {
    712                     _reply.recycle();
    713                     _data.recycle();
    714                 }
    715                 return _result;
    716             }
    717 
    718             public void clearPassword() throws RemoteException {
    719                 Parcel _data = Parcel.obtain();
    720                 Parcel _reply = Parcel.obtain();
    721                 try {
    722                     _data.writeInterfaceToken(DESCRIPTOR);
    723                     mRemote.transact(Stub.TRANSACTION_clearPassword, _data, _reply, IBinder.FLAG_ONEWAY);
    724                     _reply.readException();
    725                 } finally {
    726                     _reply.recycle();
    727                     _data.recycle();
    728                 }
    729             }
    730 
    731             public void setField(String field, String data) throws RemoteException {
    732                 Parcel _data = Parcel.obtain();
    733                 Parcel _reply = Parcel.obtain();
    734                 try {
    735                     _data.writeInterfaceToken(DESCRIPTOR);
    736                     _data.writeString(field);
    737                     _data.writeString(data);
    738                     mRemote.transact(Stub.TRANSACTION_setField, _data, _reply, IBinder.FLAG_ONEWAY);
    739                     _reply.readException();
    740                 } finally {
    741                     _reply.recycle();
    742                     _data.recycle();
    743                 }
    744             }
    745 
    746             public String getField(String field) throws RemoteException {
    747                 Parcel _data = Parcel.obtain();
    748                 Parcel _reply = Parcel.obtain();
    749                 String _result;
    750                 try {
    751                     _data.writeInterfaceToken(DESCRIPTOR);
    752                     _data.writeString(field);
    753                     mRemote.transact(Stub.TRANSACTION_getField, _data, _reply, 0);
    754                     _reply.readException();
    755                     _result = _reply.readString();
    756                 } finally {
    757                     _reply.recycle();
    758                     _data.recycle();
    759                 }
    760                 return _result;
    761             }
    762 
    763             public boolean isConvertibleToFBE() throws RemoteException {
    764                 Parcel _data = Parcel.obtain();
    765                 Parcel _reply = Parcel.obtain();
    766                 boolean _result;
    767                 try {
    768                     _data.writeInterfaceToken(DESCRIPTOR);
    769                     mRemote.transact(Stub.TRANSACTION_isConvertibleToFBE, _data, _reply, 0);
    770                     _reply.readException();
    771                     _result = _reply.readInt() != 0;
    772                 } finally {
    773                     _reply.recycle();
    774                     _data.recycle();
    775                 }
    776                 return _result;
    777             }
    778 
    779             public StorageVolume[] getVolumeList(int uid, String packageName, int flags)
    780                     throws RemoteException {
    781                 Parcel _data = Parcel.obtain();
    782                 Parcel _reply = Parcel.obtain();
    783                 StorageVolume[] _result;
    784                 try {
    785                     _data.writeInterfaceToken(DESCRIPTOR);
    786                     _data.writeInt(uid);
    787                     _data.writeString(packageName);
    788                     _data.writeInt(flags);
    789                     mRemote.transact(Stub.TRANSACTION_getVolumeList, _data, _reply, 0);
    790                     _reply.readException();
    791                     _result = _reply.createTypedArray(StorageVolume.CREATOR);
    792                 } finally {
    793                     _reply.recycle();
    794                     _data.recycle();
    795                 }
    796                 return _result;
    797             }
    798 
    799             /*
    800              * Returns the filesystem path of a mounted secure container.
    801              */
    802             public String getSecureContainerFilesystemPath(String id) throws RemoteException {
    803                 Parcel _data = Parcel.obtain();
    804                 Parcel _reply = Parcel.obtain();
    805                 String _result;
    806                 try {
    807                     _data.writeInterfaceToken(DESCRIPTOR);
    808                     _data.writeString(id);
    809                     mRemote.transact(Stub.TRANSACTION_getSecureContainerFilesystemPath, _data, _reply, 0);
    810                     _reply.readException();
    811                     _result = _reply.readString();
    812                 } finally {
    813                     _reply.recycle();
    814                     _data.recycle();
    815                 }
    816                 return _result;
    817             }
    818 
    819             /**
    820              * Fix permissions in a container which has just been created and
    821              * populated. Returns an int consistent with MountServiceResultCode
    822              */
    823             public int fixPermissionsSecureContainer(String id, int gid, String filename)
    824                     throws RemoteException {
    825                 Parcel _data = Parcel.obtain();
    826                 Parcel _reply = Parcel.obtain();
    827                 int _result;
    828                 try {
    829                     _data.writeInterfaceToken(DESCRIPTOR);
    830                     _data.writeString(id);
    831                     _data.writeInt(gid);
    832                     _data.writeString(filename);
    833                     mRemote.transact(Stub.TRANSACTION_fixPermissionsSecureContainer, _data, _reply, 0);
    834                     _reply.readException();
    835                     _result = _reply.readInt();
    836                 } finally {
    837                     _reply.recycle();
    838                     _data.recycle();
    839                 }
    840                 return _result;
    841             }
    842 
    843             @Override
    844             public int mkdirs(String callingPkg, String path) throws RemoteException {
    845                 Parcel _data = Parcel.obtain();
    846                 Parcel _reply = Parcel.obtain();
    847                 int _result;
    848                 try {
    849                     _data.writeInterfaceToken(DESCRIPTOR);
    850                     _data.writeString(callingPkg);
    851                     _data.writeString(path);
    852                     mRemote.transact(Stub.TRANSACTION_mkdirs, _data, _reply, 0);
    853                     _reply.readException();
    854                     _result = _reply.readInt();
    855                 } finally {
    856                     _reply.recycle();
    857                     _data.recycle();
    858                 }
    859                 return _result;
    860             }
    861 
    862             @Override
    863             public int resizeSecureContainer(String id, int sizeMb, String key)
    864                     throws RemoteException {
    865                 Parcel _data = Parcel.obtain();
    866                 Parcel _reply = Parcel.obtain();
    867                 int _result;
    868                 try {
    869                     _data.writeInterfaceToken(DESCRIPTOR);
    870                     _data.writeString(id);
    871                     _data.writeInt(sizeMb);
    872                     _data.writeString(key);
    873                     mRemote.transact(Stub.TRANSACTION_resizeSecureContainer, _data, _reply, 0);
    874                     _reply.readException();
    875                     _result = _reply.readInt();
    876                 } finally {
    877                     _reply.recycle();
    878                     _data.recycle();
    879                 }
    880                 return _result;
    881             }
    882 
    883             @Override
    884             public long lastMaintenance() throws RemoteException {
    885                 Parcel _data = Parcel.obtain();
    886                 Parcel _reply = Parcel.obtain();
    887                 long _result;
    888                 try {
    889                     _data.writeInterfaceToken(DESCRIPTOR);
    890                     mRemote.transact(Stub.TRANSACTION_lastMaintenance, _data, _reply, 0);
    891                     _reply.readException();
    892                     _result = _reply.readLong();
    893                 } finally {
    894                     _reply.recycle();
    895                     _data.recycle();
    896                 }
    897                 return _result;
    898             }
    899 
    900             @Override
    901             public void runMaintenance() throws RemoteException {
    902                 Parcel _data = Parcel.obtain();
    903                 Parcel _reply = Parcel.obtain();
    904                 try {
    905                     _data.writeInterfaceToken(DESCRIPTOR);
    906                     mRemote.transact(Stub.TRANSACTION_runMaintenance, _data, _reply, 0);
    907                     _reply.readException();
    908                 } finally {
    909                     _reply.recycle();
    910                     _data.recycle();
    911                 }
    912                 return;
    913             }
    914 
    915             @Override
    916             public void waitForAsecScan() throws RemoteException {
    917                 Parcel _data = Parcel.obtain();
    918                 Parcel _reply = Parcel.obtain();
    919                 try {
    920                     _data.writeInterfaceToken(DESCRIPTOR);
    921                     mRemote.transact(Stub.TRANSACTION_waitForAsecScan, _data, _reply, 0);
    922                     _reply.readException();
    923                 } finally {
    924                     _reply.recycle();
    925                     _data.recycle();
    926                 }
    927                 return;
    928             }
    929 
    930             @Override
    931             public DiskInfo[] getDisks() throws RemoteException {
    932                 Parcel _data = Parcel.obtain();
    933                 Parcel _reply = Parcel.obtain();
    934                 DiskInfo[] _result;
    935                 try {
    936                     _data.writeInterfaceToken(DESCRIPTOR);
    937                     mRemote.transact(Stub.TRANSACTION_getDisks, _data, _reply, 0);
    938                     _reply.readException();
    939                     _result = _reply.createTypedArray(DiskInfo.CREATOR);
    940                 } finally {
    941                     _reply.recycle();
    942                     _data.recycle();
    943                 }
    944                 return _result;
    945             }
    946 
    947             @Override
    948             public VolumeInfo[] getVolumes(int _flags) throws RemoteException {
    949                 Parcel _data = Parcel.obtain();
    950                 Parcel _reply = Parcel.obtain();
    951                 VolumeInfo[] _result;
    952                 try {
    953                     _data.writeInterfaceToken(DESCRIPTOR);
    954                     _data.writeInt(_flags);
    955                     mRemote.transact(Stub.TRANSACTION_getVolumes, _data, _reply, 0);
    956                     _reply.readException();
    957                     _result = _reply.createTypedArray(VolumeInfo.CREATOR);
    958                 } finally {
    959                     _reply.recycle();
    960                     _data.recycle();
    961                 }
    962                 return _result;
    963             }
    964 
    965             @Override
    966             public VolumeRecord[] getVolumeRecords(int _flags) throws RemoteException {
    967                 Parcel _data = Parcel.obtain();
    968                 Parcel _reply = Parcel.obtain();
    969                 VolumeRecord[] _result;
    970                 try {
    971                     _data.writeInterfaceToken(DESCRIPTOR);
    972                     _data.writeInt(_flags);
    973                     mRemote.transact(Stub.TRANSACTION_getVolumeRecords, _data, _reply, 0);
    974                     _reply.readException();
    975                     _result = _reply.createTypedArray(VolumeRecord.CREATOR);
    976                 } finally {
    977                     _reply.recycle();
    978                     _data.recycle();
    979                 }
    980                 return _result;
    981             }
    982 
    983             @Override
    984             public void mount(String volId) throws RemoteException {
    985                 Parcel _data = Parcel.obtain();
    986                 Parcel _reply = Parcel.obtain();
    987                 try {
    988                     _data.writeInterfaceToken(DESCRIPTOR);
    989                     _data.writeString(volId);
    990                     mRemote.transact(Stub.TRANSACTION_mount, _data, _reply, 0);
    991                     _reply.readException();
    992                 } finally {
    993                     _reply.recycle();
    994                     _data.recycle();
    995                 }
    996             }
    997 
    998             @Override
    999             public void unmount(String volId) throws RemoteException {
   1000                 Parcel _data = Parcel.obtain();
   1001                 Parcel _reply = Parcel.obtain();
   1002                 try {
   1003                     _data.writeInterfaceToken(DESCRIPTOR);
   1004                     _data.writeString(volId);
   1005                     mRemote.transact(Stub.TRANSACTION_unmount, _data, _reply, 0);
   1006                     _reply.readException();
   1007                 } finally {
   1008                     _reply.recycle();
   1009                     _data.recycle();
   1010                 }
   1011             }
   1012 
   1013             @Override
   1014             public void format(String volId) throws RemoteException {
   1015                 Parcel _data = Parcel.obtain();
   1016                 Parcel _reply = Parcel.obtain();
   1017                 try {
   1018                     _data.writeInterfaceToken(DESCRIPTOR);
   1019                     _data.writeString(volId);
   1020                     mRemote.transact(Stub.TRANSACTION_format, _data, _reply, 0);
   1021                     _reply.readException();
   1022                 } finally {
   1023                     _reply.recycle();
   1024                     _data.recycle();
   1025                 }
   1026             }
   1027 
   1028             @Override
   1029             public long benchmark(String volId) throws RemoteException {
   1030                 Parcel _data = Parcel.obtain();
   1031                 Parcel _reply = Parcel.obtain();
   1032                 try {
   1033                     _data.writeInterfaceToken(DESCRIPTOR);
   1034                     _data.writeString(volId);
   1035                     mRemote.transact(Stub.TRANSACTION_benchmark, _data, _reply, 0);
   1036                     _reply.readException();
   1037                     return _reply.readLong();
   1038                 } finally {
   1039                     _reply.recycle();
   1040                     _data.recycle();
   1041                 }
   1042             }
   1043 
   1044             @Override
   1045             public void partitionPublic(String diskId) throws RemoteException {
   1046                 Parcel _data = Parcel.obtain();
   1047                 Parcel _reply = Parcel.obtain();
   1048                 try {
   1049                     _data.writeInterfaceToken(DESCRIPTOR);
   1050                     _data.writeString(diskId);
   1051                     mRemote.transact(Stub.TRANSACTION_partitionPublic, _data, _reply, 0);
   1052                     _reply.readException();
   1053                 } finally {
   1054                     _reply.recycle();
   1055                     _data.recycle();
   1056                 }
   1057             }
   1058 
   1059             @Override
   1060             public void partitionPrivate(String diskId) throws RemoteException {
   1061                 Parcel _data = Parcel.obtain();
   1062                 Parcel _reply = Parcel.obtain();
   1063                 try {
   1064                     _data.writeInterfaceToken(DESCRIPTOR);
   1065                     _data.writeString(diskId);
   1066                     mRemote.transact(Stub.TRANSACTION_partitionPrivate, _data, _reply, 0);
   1067                     _reply.readException();
   1068                 } finally {
   1069                     _reply.recycle();
   1070                     _data.recycle();
   1071                 }
   1072             }
   1073 
   1074             @Override
   1075             public void partitionMixed(String diskId, int ratio) throws RemoteException {
   1076                 Parcel _data = Parcel.obtain();
   1077                 Parcel _reply = Parcel.obtain();
   1078                 try {
   1079                     _data.writeInterfaceToken(DESCRIPTOR);
   1080                     _data.writeString(diskId);
   1081                     _data.writeInt(ratio);
   1082                     mRemote.transact(Stub.TRANSACTION_partitionMixed, _data, _reply, 0);
   1083                     _reply.readException();
   1084                 } finally {
   1085                     _reply.recycle();
   1086                     _data.recycle();
   1087                 }
   1088             }
   1089 
   1090             @Override
   1091             public void setVolumeNickname(String fsUuid, String nickname) throws RemoteException {
   1092                 Parcel _data = Parcel.obtain();
   1093                 Parcel _reply = Parcel.obtain();
   1094                 try {
   1095                     _data.writeInterfaceToken(DESCRIPTOR);
   1096                     _data.writeString(fsUuid);
   1097                     _data.writeString(nickname);
   1098                     mRemote.transact(Stub.TRANSACTION_setVolumeNickname, _data, _reply, 0);
   1099                     _reply.readException();
   1100                 } finally {
   1101                     _reply.recycle();
   1102                     _data.recycle();
   1103                 }
   1104             }
   1105 
   1106             @Override
   1107             public void setVolumeUserFlags(String fsUuid, int flags, int mask) throws RemoteException {
   1108                 Parcel _data = Parcel.obtain();
   1109                 Parcel _reply = Parcel.obtain();
   1110                 try {
   1111                     _data.writeInterfaceToken(DESCRIPTOR);
   1112                     _data.writeString(fsUuid);
   1113                     _data.writeInt(flags);
   1114                     _data.writeInt(mask);
   1115                     mRemote.transact(Stub.TRANSACTION_setVolumeUserFlags, _data, _reply, 0);
   1116                     _reply.readException();
   1117                 } finally {
   1118                     _reply.recycle();
   1119                     _data.recycle();
   1120                 }
   1121             }
   1122 
   1123             @Override
   1124             public void forgetVolume(String fsUuid) throws RemoteException {
   1125                 Parcel _data = Parcel.obtain();
   1126                 Parcel _reply = Parcel.obtain();
   1127                 try {
   1128                     _data.writeInterfaceToken(DESCRIPTOR);
   1129                     _data.writeString(fsUuid);
   1130                     mRemote.transact(Stub.TRANSACTION_forgetVolume, _data, _reply, 0);
   1131                     _reply.readException();
   1132                 } finally {
   1133                     _reply.recycle();
   1134                     _data.recycle();
   1135                 }
   1136             }
   1137 
   1138             @Override
   1139             public void forgetAllVolumes() throws RemoteException {
   1140                 Parcel _data = Parcel.obtain();
   1141                 Parcel _reply = Parcel.obtain();
   1142                 try {
   1143                     _data.writeInterfaceToken(DESCRIPTOR);
   1144                     mRemote.transact(Stub.TRANSACTION_forgetAllVolumes, _data, _reply, 0);
   1145                     _reply.readException();
   1146                 } finally {
   1147                     _reply.recycle();
   1148                     _data.recycle();
   1149                 }
   1150             }
   1151 
   1152             @Override
   1153             public void setDebugFlags(int _flags, int _mask) throws RemoteException {
   1154                 Parcel _data = Parcel.obtain();
   1155                 Parcel _reply = Parcel.obtain();
   1156                 try {
   1157                     _data.writeInterfaceToken(DESCRIPTOR);
   1158                     _data.writeInt(_flags);
   1159                     _data.writeInt(_mask);
   1160                     mRemote.transact(Stub.TRANSACTION_setDebugFlags, _data, _reply, 0);
   1161                     _reply.readException();
   1162                 } finally {
   1163                     _reply.recycle();
   1164                     _data.recycle();
   1165                 }
   1166             }
   1167 
   1168             @Override
   1169             public String getPrimaryStorageUuid() throws RemoteException {
   1170                 Parcel _data = Parcel.obtain();
   1171                 Parcel _reply = Parcel.obtain();
   1172                 String _result;
   1173                 try {
   1174                     _data.writeInterfaceToken(DESCRIPTOR);
   1175                     mRemote.transact(Stub.TRANSACTION_getPrimaryStorageUuid, _data, _reply, 0);
   1176                     _reply.readException();
   1177                     _result = _reply.readString();
   1178                 } finally {
   1179                     _reply.recycle();
   1180                     _data.recycle();
   1181                 }
   1182                 return _result;
   1183             }
   1184 
   1185             @Override
   1186             public void setPrimaryStorageUuid(String volumeUuid, IPackageMoveObserver callback)
   1187                     throws RemoteException {
   1188                 Parcel _data = Parcel.obtain();
   1189                 Parcel _reply = Parcel.obtain();
   1190                 try {
   1191                     _data.writeInterfaceToken(DESCRIPTOR);
   1192                     _data.writeString(volumeUuid);
   1193                     _data.writeStrongBinder((callback != null ? callback.asBinder() : null));
   1194                     mRemote.transact(Stub.TRANSACTION_setPrimaryStorageUuid, _data, _reply, 0);
   1195                     _reply.readException();
   1196                 } finally {
   1197                     _reply.recycle();
   1198                     _data.recycle();
   1199                 }
   1200             }
   1201 
   1202             @Override
   1203             public void createUserKey(int userId, int serialNumber, boolean ephemeral)
   1204                     throws RemoteException {
   1205                 Parcel _data = Parcel.obtain();
   1206                 Parcel _reply = Parcel.obtain();
   1207                 try {
   1208                     _data.writeInterfaceToken(DESCRIPTOR);
   1209                     _data.writeInt(userId);
   1210                     _data.writeInt(serialNumber);
   1211                     _data.writeInt(ephemeral ? 1 : 0);
   1212                     mRemote.transact(Stub.TRANSACTION_createUserKey, _data, _reply, 0);
   1213                     _reply.readException();
   1214                 } finally {
   1215                     _reply.recycle();
   1216                     _data.recycle();
   1217                 }
   1218             }
   1219 
   1220             @Override
   1221             public void destroyUserKey(int userId) throws RemoteException {
   1222                 Parcel _data = Parcel.obtain();
   1223                 Parcel _reply = Parcel.obtain();
   1224                 try {
   1225                     _data.writeInterfaceToken(DESCRIPTOR);
   1226                     _data.writeInt(userId);
   1227                     mRemote.transact(Stub.TRANSACTION_destroyUserKey, _data, _reply, 0);
   1228                     _reply.readException();
   1229                 } finally {
   1230                     _reply.recycle();
   1231                     _data.recycle();
   1232                 }
   1233             }
   1234 
   1235             @Override
   1236             public void addUserKeyAuth(int userId, int serialNumber,
   1237                     byte[] token, byte[] secret) throws RemoteException {
   1238                 Parcel _data = Parcel.obtain();
   1239                 Parcel _reply = Parcel.obtain();
   1240                 try {
   1241                     _data.writeInterfaceToken(DESCRIPTOR);
   1242                     _data.writeInt(userId);
   1243                     _data.writeInt(serialNumber);
   1244                     _data.writeByteArray(token);
   1245                     _data.writeByteArray(secret);
   1246                     mRemote.transact(Stub.TRANSACTION_addUserKeyAuth, _data, _reply, 0);
   1247                     _reply.readException();
   1248                 } finally {
   1249                     _reply.recycle();
   1250                     _data.recycle();
   1251                 }
   1252             }
   1253 
   1254             @Override
   1255             public void fixateNewestUserKeyAuth(int userId) throws RemoteException {
   1256                 Parcel _data = Parcel.obtain();
   1257                 Parcel _reply = Parcel.obtain();
   1258                 try {
   1259                     _data.writeInterfaceToken(DESCRIPTOR);
   1260                     _data.writeInt(userId);
   1261                     mRemote.transact(Stub.TRANSACTION_fixateNewestUserKeyAuth, _data, _reply, 0);
   1262                     _reply.readException();
   1263                 } finally {
   1264                     _reply.recycle();
   1265                     _data.recycle();
   1266                 }
   1267             }
   1268 
   1269             @Override
   1270             public void unlockUserKey(int userId, int serialNumber,
   1271                     byte[] token, byte[] secret) throws RemoteException {
   1272                 Parcel _data = Parcel.obtain();
   1273                 Parcel _reply = Parcel.obtain();
   1274                 try {
   1275                     _data.writeInterfaceToken(DESCRIPTOR);
   1276                     _data.writeInt(userId);
   1277                     _data.writeInt(serialNumber);
   1278                     _data.writeByteArray(token);
   1279                     _data.writeByteArray(secret);
   1280                     mRemote.transact(Stub.TRANSACTION_unlockUserKey, _data, _reply, 0);
   1281                     _reply.readException();
   1282                 } finally {
   1283                     _reply.recycle();
   1284                     _data.recycle();
   1285                 }
   1286             }
   1287 
   1288             @Override
   1289             public void lockUserKey(int userId) throws RemoteException {
   1290                 Parcel _data = Parcel.obtain();
   1291                 Parcel _reply = Parcel.obtain();
   1292                 try {
   1293                     _data.writeInterfaceToken(DESCRIPTOR);
   1294                     _data.writeInt(userId);
   1295                     mRemote.transact(Stub.TRANSACTION_lockUserKey, _data, _reply, 0);
   1296                     _reply.readException();
   1297                 } finally {
   1298                     _reply.recycle();
   1299                     _data.recycle();
   1300                 }
   1301             }
   1302 
   1303             @Override
   1304             public boolean isUserKeyUnlocked(int userId) throws RemoteException {
   1305                 Parcel _data = Parcel.obtain();
   1306                 Parcel _reply = Parcel.obtain();
   1307                 boolean _result;
   1308                 try {
   1309                     _data.writeInterfaceToken(DESCRIPTOR);
   1310                     _data.writeInt(userId);
   1311                     mRemote.transact(Stub.TRANSACTION_isUserKeyUnlocked, _data, _reply, 0);
   1312                     _reply.readException();
   1313                     _result = 0 != _reply.readInt();
   1314                 } finally {
   1315                     _reply.recycle();
   1316                     _data.recycle();
   1317                 }
   1318                 return _result;
   1319             }
   1320 
   1321             @Override
   1322             public void prepareUserStorage(
   1323                     String volumeUuid, int userId, int serialNumber, int flags)
   1324                     throws RemoteException {
   1325                 Parcel _data = Parcel.obtain();
   1326                 Parcel _reply = Parcel.obtain();
   1327                 try {
   1328                     _data.writeInterfaceToken(DESCRIPTOR);
   1329                     _data.writeString(volumeUuid);
   1330                     _data.writeInt(userId);
   1331                     _data.writeInt(serialNumber);
   1332                     _data.writeInt(flags);
   1333                     mRemote.transact(Stub.TRANSACTION_prepareUserStorage, _data, _reply, 0);
   1334                     _reply.readException();
   1335                 } finally {
   1336                     _reply.recycle();
   1337                     _data.recycle();
   1338                 }
   1339             }
   1340 
   1341             @Override
   1342             public void destroyUserStorage(String volumeUuid, int userId, int flags)
   1343                     throws RemoteException {
   1344                 Parcel _data = Parcel.obtain();
   1345                 Parcel _reply = Parcel.obtain();
   1346                 try {
   1347                     _data.writeInterfaceToken(DESCRIPTOR);
   1348                     _data.writeString(volumeUuid);
   1349                     _data.writeInt(userId);
   1350                     _data.writeInt(flags);
   1351                     mRemote.transact(Stub.TRANSACTION_destroyUserStorage, _data, _reply, 0);
   1352                     _reply.readException();
   1353                 } finally {
   1354                     _reply.recycle();
   1355                     _data.recycle();
   1356                 }
   1357             }
   1358 
   1359             @Override
   1360             public ParcelFileDescriptor mountAppFuse(String name) throws RemoteException {
   1361                 Parcel _data = Parcel.obtain();
   1362                 Parcel _reply = Parcel.obtain();
   1363                 ParcelFileDescriptor _result = null;
   1364                 try {
   1365                     _data.writeInterfaceToken(DESCRIPTOR);
   1366                     _data.writeString(name);
   1367                     mRemote.transact(Stub.TRANSACTION_mountAppFuse, _data, _reply, 0);
   1368                     _reply.readException();
   1369                     _result = _reply.<ParcelFileDescriptor>readParcelable(
   1370                             ClassLoader.getSystemClassLoader());
   1371                 } finally {
   1372                     _reply.recycle();
   1373                     _data.recycle();
   1374                 }
   1375                 return _result;
   1376             }
   1377         }
   1378 
   1379         private static final String DESCRIPTOR = "IMountService";
   1380 
   1381         static final int TRANSACTION_registerListener = IBinder.FIRST_CALL_TRANSACTION + 0;
   1382 
   1383         static final int TRANSACTION_unregisterListener = IBinder.FIRST_CALL_TRANSACTION + 1;
   1384 
   1385         static final int TRANSACTION_isUsbMassStorageConnected = IBinder.FIRST_CALL_TRANSACTION + 2;
   1386 
   1387         static final int TRANSACTION_setUsbMassStorageEnabled = IBinder.FIRST_CALL_TRANSACTION + 3;
   1388 
   1389         static final int TRANSACTION_isUsbMassStorageEnabled = IBinder.FIRST_CALL_TRANSACTION + 4;
   1390 
   1391         static final int TRANSACTION_mountVolume = IBinder.FIRST_CALL_TRANSACTION + 5;
   1392 
   1393         static final int TRANSACTION_unmountVolume = IBinder.FIRST_CALL_TRANSACTION + 6;
   1394 
   1395         static final int TRANSACTION_formatVolume = IBinder.FIRST_CALL_TRANSACTION + 7;
   1396 
   1397         static final int TRANSACTION_getStorageUsers = IBinder.FIRST_CALL_TRANSACTION + 8;
   1398 
   1399         static final int TRANSACTION_getVolumeState = IBinder.FIRST_CALL_TRANSACTION + 9;
   1400 
   1401         static final int TRANSACTION_createSecureContainer = IBinder.FIRST_CALL_TRANSACTION + 10;
   1402 
   1403         static final int TRANSACTION_finalizeSecureContainer = IBinder.FIRST_CALL_TRANSACTION + 11;
   1404 
   1405         static final int TRANSACTION_destroySecureContainer = IBinder.FIRST_CALL_TRANSACTION + 12;
   1406 
   1407         static final int TRANSACTION_mountSecureContainer = IBinder.FIRST_CALL_TRANSACTION + 13;
   1408 
   1409         static final int TRANSACTION_unmountSecureContainer = IBinder.FIRST_CALL_TRANSACTION + 14;
   1410 
   1411         static final int TRANSACTION_isSecureContainerMounted = IBinder.FIRST_CALL_TRANSACTION + 15;
   1412 
   1413         static final int TRANSACTION_renameSecureContainer = IBinder.FIRST_CALL_TRANSACTION + 16;
   1414 
   1415         static final int TRANSACTION_getSecureContainerPath = IBinder.FIRST_CALL_TRANSACTION + 17;
   1416 
   1417         static final int TRANSACTION_getSecureContainerList = IBinder.FIRST_CALL_TRANSACTION + 18;
   1418 
   1419         static final int TRANSACTION_shutdown = IBinder.FIRST_CALL_TRANSACTION + 19;
   1420 
   1421         static final int TRANSACTION_finishMediaUpdate = IBinder.FIRST_CALL_TRANSACTION + 20;
   1422 
   1423         static final int TRANSACTION_mountObb = IBinder.FIRST_CALL_TRANSACTION + 21;
   1424 
   1425         static final int TRANSACTION_unmountObb = IBinder.FIRST_CALL_TRANSACTION + 22;
   1426 
   1427         static final int TRANSACTION_isObbMounted = IBinder.FIRST_CALL_TRANSACTION + 23;
   1428 
   1429         static final int TRANSACTION_getMountedObbPath = IBinder.FIRST_CALL_TRANSACTION + 24;
   1430 
   1431         static final int TRANSACTION_isExternalStorageEmulated = IBinder.FIRST_CALL_TRANSACTION + 25;
   1432 
   1433         static final int TRANSACTION_decryptStorage = IBinder.FIRST_CALL_TRANSACTION + 26;
   1434 
   1435         static final int TRANSACTION_encryptStorage = IBinder.FIRST_CALL_TRANSACTION + 27;
   1436 
   1437         static final int TRANSACTION_changeEncryptionPassword = IBinder.FIRST_CALL_TRANSACTION + 28;
   1438 
   1439         static final int TRANSACTION_getVolumeList = IBinder.FIRST_CALL_TRANSACTION + 29;
   1440 
   1441         static final int TRANSACTION_getSecureContainerFilesystemPath = IBinder.FIRST_CALL_TRANSACTION + 30;
   1442 
   1443         static final int TRANSACTION_getEncryptionState = IBinder.FIRST_CALL_TRANSACTION + 31;
   1444 
   1445         static final int TRANSACTION_verifyEncryptionPassword = IBinder.FIRST_CALL_TRANSACTION + 32;
   1446 
   1447         static final int TRANSACTION_fixPermissionsSecureContainer = IBinder.FIRST_CALL_TRANSACTION + 33;
   1448 
   1449         static final int TRANSACTION_mkdirs = IBinder.FIRST_CALL_TRANSACTION + 34;
   1450 
   1451         static final int TRANSACTION_getPasswordType = IBinder.FIRST_CALL_TRANSACTION + 35;
   1452 
   1453         static final int TRANSACTION_getPassword = IBinder.FIRST_CALL_TRANSACTION + 36;
   1454 
   1455         static final int TRANSACTION_clearPassword = IBinder.FIRST_CALL_TRANSACTION + 37;
   1456 
   1457         static final int TRANSACTION_setField = IBinder.FIRST_CALL_TRANSACTION + 38;
   1458 
   1459         static final int TRANSACTION_getField = IBinder.FIRST_CALL_TRANSACTION + 39;
   1460 
   1461         static final int TRANSACTION_resizeSecureContainer = IBinder.FIRST_CALL_TRANSACTION + 40;
   1462 
   1463         static final int TRANSACTION_lastMaintenance = IBinder.FIRST_CALL_TRANSACTION + 41;
   1464 
   1465         static final int TRANSACTION_runMaintenance = IBinder.FIRST_CALL_TRANSACTION + 42;
   1466 
   1467         static final int TRANSACTION_waitForAsecScan = IBinder.FIRST_CALL_TRANSACTION + 43;
   1468 
   1469         static final int TRANSACTION_getDisks = IBinder.FIRST_CALL_TRANSACTION + 44;
   1470         static final int TRANSACTION_getVolumes = IBinder.FIRST_CALL_TRANSACTION + 45;
   1471         static final int TRANSACTION_getVolumeRecords = IBinder.FIRST_CALL_TRANSACTION + 46;
   1472 
   1473         static final int TRANSACTION_mount = IBinder.FIRST_CALL_TRANSACTION + 47;
   1474         static final int TRANSACTION_unmount = IBinder.FIRST_CALL_TRANSACTION + 48;
   1475         static final int TRANSACTION_format = IBinder.FIRST_CALL_TRANSACTION + 49;
   1476 
   1477         static final int TRANSACTION_partitionPublic = IBinder.FIRST_CALL_TRANSACTION + 50;
   1478         static final int TRANSACTION_partitionPrivate = IBinder.FIRST_CALL_TRANSACTION + 51;
   1479         static final int TRANSACTION_partitionMixed = IBinder.FIRST_CALL_TRANSACTION + 52;
   1480 
   1481         static final int TRANSACTION_setVolumeNickname = IBinder.FIRST_CALL_TRANSACTION + 53;
   1482         static final int TRANSACTION_setVolumeUserFlags = IBinder.FIRST_CALL_TRANSACTION + 54;
   1483         static final int TRANSACTION_forgetVolume = IBinder.FIRST_CALL_TRANSACTION + 55;
   1484         static final int TRANSACTION_forgetAllVolumes = IBinder.FIRST_CALL_TRANSACTION + 56;
   1485 
   1486         static final int TRANSACTION_getPrimaryStorageUuid = IBinder.FIRST_CALL_TRANSACTION + 57;
   1487         static final int TRANSACTION_setPrimaryStorageUuid = IBinder.FIRST_CALL_TRANSACTION + 58;
   1488 
   1489         static final int TRANSACTION_benchmark = IBinder.FIRST_CALL_TRANSACTION + 59;
   1490         static final int TRANSACTION_setDebugFlags = IBinder.FIRST_CALL_TRANSACTION + 60;
   1491 
   1492         static final int TRANSACTION_createUserKey = IBinder.FIRST_CALL_TRANSACTION + 61;
   1493         static final int TRANSACTION_destroyUserKey = IBinder.FIRST_CALL_TRANSACTION + 62;
   1494 
   1495         static final int TRANSACTION_unlockUserKey = IBinder.FIRST_CALL_TRANSACTION + 63;
   1496         static final int TRANSACTION_lockUserKey = IBinder.FIRST_CALL_TRANSACTION + 64;
   1497         static final int TRANSACTION_isUserKeyUnlocked = IBinder.FIRST_CALL_TRANSACTION + 65;
   1498 
   1499         static final int TRANSACTION_prepareUserStorage = IBinder.FIRST_CALL_TRANSACTION + 66;
   1500         static final int TRANSACTION_destroyUserStorage = IBinder.FIRST_CALL_TRANSACTION + 67;
   1501 
   1502         static final int TRANSACTION_isConvertibleToFBE = IBinder.FIRST_CALL_TRANSACTION + 68;
   1503 
   1504         static final int TRANSACTION_mountAppFuse = IBinder.FIRST_CALL_TRANSACTION + 69;
   1505 
   1506         static final int TRANSACTION_addUserKeyAuth = IBinder.FIRST_CALL_TRANSACTION + 70;
   1507 
   1508         static final int TRANSACTION_fixateNewestUserKeyAuth = IBinder.FIRST_CALL_TRANSACTION + 71;
   1509 
   1510         /**
   1511          * Cast an IBinder object into an IMountService interface, generating a
   1512          * proxy if needed.
   1513          */
   1514         public static IMountService asInterface(IBinder obj) {
   1515             if (obj == null) {
   1516                 return null;
   1517             }
   1518             IInterface iin = obj.queryLocalInterface(DESCRIPTOR);
   1519             if (iin != null && iin instanceof IMountService) {
   1520                 return (IMountService) iin;
   1521             }
   1522             return new IMountService.Stub.Proxy(obj);
   1523         }
   1524 
   1525         /** Construct the stub at attach it to the interface. */
   1526         public Stub() {
   1527             attachInterface(this, DESCRIPTOR);
   1528         }
   1529 
   1530         public IBinder asBinder() {
   1531             return this;
   1532         }
   1533 
   1534         @Override
   1535         public boolean onTransact(int code, Parcel data, Parcel reply,
   1536                 int flags) throws RemoteException {
   1537             switch (code) {
   1538                 case INTERFACE_TRANSACTION: {
   1539                     reply.writeString(DESCRIPTOR);
   1540                     return true;
   1541                 }
   1542                 case TRANSACTION_registerListener: {
   1543                     data.enforceInterface(DESCRIPTOR);
   1544                     IMountServiceListener listener;
   1545                     listener = IMountServiceListener.Stub.asInterface(data.readStrongBinder());
   1546                     registerListener(listener);
   1547                     reply.writeNoException();
   1548                     return true;
   1549                 }
   1550                 case TRANSACTION_unregisterListener: {
   1551                     data.enforceInterface(DESCRIPTOR);
   1552                     IMountServiceListener listener;
   1553                     listener = IMountServiceListener.Stub.asInterface(data.readStrongBinder());
   1554                     unregisterListener(listener);
   1555                     reply.writeNoException();
   1556                     return true;
   1557                 }
   1558                 case TRANSACTION_isUsbMassStorageConnected: {
   1559                     data.enforceInterface(DESCRIPTOR);
   1560                     boolean result = isUsbMassStorageConnected();
   1561                     reply.writeNoException();
   1562                     reply.writeInt((result ? 1 : 0));
   1563                     return true;
   1564                 }
   1565                 case TRANSACTION_setUsbMassStorageEnabled: {
   1566                     data.enforceInterface(DESCRIPTOR);
   1567                     boolean enable;
   1568                     enable = 0 != data.readInt();
   1569                     setUsbMassStorageEnabled(enable);
   1570                     reply.writeNoException();
   1571                     return true;
   1572                 }
   1573                 case TRANSACTION_isUsbMassStorageEnabled: {
   1574                     data.enforceInterface(DESCRIPTOR);
   1575                     boolean result = isUsbMassStorageEnabled();
   1576                     reply.writeNoException();
   1577                     reply.writeInt((result ? 1 : 0));
   1578                     return true;
   1579                 }
   1580                 case TRANSACTION_mountVolume: {
   1581                     data.enforceInterface(DESCRIPTOR);
   1582                     String mountPoint;
   1583                     mountPoint = data.readString();
   1584                     int resultCode = mountVolume(mountPoint);
   1585                     reply.writeNoException();
   1586                     reply.writeInt(resultCode);
   1587                     return true;
   1588                 }
   1589                 case TRANSACTION_unmountVolume: {
   1590                     data.enforceInterface(DESCRIPTOR);
   1591                     String mountPoint;
   1592                     mountPoint = data.readString();
   1593                     boolean force = 0 != data.readInt();
   1594                     boolean removeEncrypt = 0 != data.readInt();
   1595                     unmountVolume(mountPoint, force, removeEncrypt);
   1596                     reply.writeNoException();
   1597                     return true;
   1598                 }
   1599                 case TRANSACTION_formatVolume: {
   1600                     data.enforceInterface(DESCRIPTOR);
   1601                     String mountPoint;
   1602                     mountPoint = data.readString();
   1603                     int result = formatVolume(mountPoint);
   1604                     reply.writeNoException();
   1605                     reply.writeInt(result);
   1606                     return true;
   1607                 }
   1608                 case TRANSACTION_getStorageUsers: {
   1609                     data.enforceInterface(DESCRIPTOR);
   1610                     String path;
   1611                     path = data.readString();
   1612                     int[] pids = getStorageUsers(path);
   1613                     reply.writeNoException();
   1614                     reply.writeIntArray(pids);
   1615                     return true;
   1616                 }
   1617                 case TRANSACTION_getVolumeState: {
   1618                     data.enforceInterface(DESCRIPTOR);
   1619                     String mountPoint;
   1620                     mountPoint = data.readString();
   1621                     String state = getVolumeState(mountPoint);
   1622                     reply.writeNoException();
   1623                     reply.writeString(state);
   1624                     return true;
   1625                 }
   1626                 case TRANSACTION_createSecureContainer: {
   1627                     data.enforceInterface(DESCRIPTOR);
   1628                     String id;
   1629                     id = data.readString();
   1630                     int sizeMb;
   1631                     sizeMb = data.readInt();
   1632                     String fstype;
   1633                     fstype = data.readString();
   1634                     String key;
   1635                     key = data.readString();
   1636                     int ownerUid;
   1637                     ownerUid = data.readInt();
   1638                     boolean external;
   1639                     external = 0 != data.readInt();
   1640                     int resultCode = createSecureContainer(id, sizeMb, fstype, key, ownerUid,
   1641                             external);
   1642                     reply.writeNoException();
   1643                     reply.writeInt(resultCode);
   1644                     return true;
   1645                 }
   1646                 case TRANSACTION_finalizeSecureContainer: {
   1647                     data.enforceInterface(DESCRIPTOR);
   1648                     String id;
   1649                     id = data.readString();
   1650                     int resultCode = finalizeSecureContainer(id);
   1651                     reply.writeNoException();
   1652                     reply.writeInt(resultCode);
   1653                     return true;
   1654                 }
   1655                 case TRANSACTION_destroySecureContainer: {
   1656                     data.enforceInterface(DESCRIPTOR);
   1657                     String id;
   1658                     id = data.readString();
   1659                     boolean force;
   1660                     force = 0 != data.readInt();
   1661                     int resultCode = destroySecureContainer(id, force);
   1662                     reply.writeNoException();
   1663                     reply.writeInt(resultCode);
   1664                     return true;
   1665                 }
   1666                 case TRANSACTION_mountSecureContainer: {
   1667                     data.enforceInterface(DESCRIPTOR);
   1668                     String id;
   1669                     id = data.readString();
   1670                     String key;
   1671                     key = data.readString();
   1672                     int ownerUid;
   1673                     ownerUid = data.readInt();
   1674                     boolean readOnly;
   1675                     readOnly = data.readInt() != 0;
   1676                     int resultCode = mountSecureContainer(id, key, ownerUid, readOnly);
   1677                     reply.writeNoException();
   1678                     reply.writeInt(resultCode);
   1679                     return true;
   1680                 }
   1681                 case TRANSACTION_unmountSecureContainer: {
   1682                     data.enforceInterface(DESCRIPTOR);
   1683                     String id;
   1684                     id = data.readString();
   1685                     boolean force;
   1686                     force = 0 != data.readInt();
   1687                     int resultCode = unmountSecureContainer(id, force);
   1688                     reply.writeNoException();
   1689                     reply.writeInt(resultCode);
   1690                     return true;
   1691                 }
   1692                 case TRANSACTION_isSecureContainerMounted: {
   1693                     data.enforceInterface(DESCRIPTOR);
   1694                     String id;
   1695                     id = data.readString();
   1696                     boolean status = isSecureContainerMounted(id);
   1697                     reply.writeNoException();
   1698                     reply.writeInt((status ? 1 : 0));
   1699                     return true;
   1700                 }
   1701                 case TRANSACTION_renameSecureContainer: {
   1702                     data.enforceInterface(DESCRIPTOR);
   1703                     String oldId;
   1704                     oldId = data.readString();
   1705                     String newId;
   1706                     newId = data.readString();
   1707                     int resultCode = renameSecureContainer(oldId, newId);
   1708                     reply.writeNoException();
   1709                     reply.writeInt(resultCode);
   1710                     return true;
   1711                 }
   1712                 case TRANSACTION_getSecureContainerPath: {
   1713                     data.enforceInterface(DESCRIPTOR);
   1714                     String id;
   1715                     id = data.readString();
   1716                     String path = getSecureContainerPath(id);
   1717                     reply.writeNoException();
   1718                     reply.writeString(path);
   1719                     return true;
   1720                 }
   1721                 case TRANSACTION_getSecureContainerList: {
   1722                     data.enforceInterface(DESCRIPTOR);
   1723                     String[] ids = getSecureContainerList();
   1724                     reply.writeNoException();
   1725                     reply.writeStringArray(ids);
   1726                     return true;
   1727                 }
   1728                 case TRANSACTION_shutdown: {
   1729                     data.enforceInterface(DESCRIPTOR);
   1730                     IMountShutdownObserver observer;
   1731                     observer = IMountShutdownObserver.Stub.asInterface(data
   1732                             .readStrongBinder());
   1733                     shutdown(observer);
   1734                     reply.writeNoException();
   1735                     return true;
   1736                 }
   1737                 case TRANSACTION_finishMediaUpdate: {
   1738                     data.enforceInterface(DESCRIPTOR);
   1739                     finishMediaUpdate();
   1740                     reply.writeNoException();
   1741                     return true;
   1742                 }
   1743                 case TRANSACTION_mountObb: {
   1744                     data.enforceInterface(DESCRIPTOR);
   1745                     final String rawPath = data.readString();
   1746                     final String canonicalPath = data.readString();
   1747                     final String key = data.readString();
   1748                     IObbActionListener observer;
   1749                     observer = IObbActionListener.Stub.asInterface(data.readStrongBinder());
   1750                     int nonce;
   1751                     nonce = data.readInt();
   1752                     mountObb(rawPath, canonicalPath, key, observer, nonce);
   1753                     reply.writeNoException();
   1754                     return true;
   1755                 }
   1756                 case TRANSACTION_unmountObb: {
   1757                     data.enforceInterface(DESCRIPTOR);
   1758                     String filename;
   1759                     filename = data.readString();
   1760                     boolean force;
   1761                     force = 0 != data.readInt();
   1762                     IObbActionListener observer;
   1763                     observer = IObbActionListener.Stub.asInterface(data.readStrongBinder());
   1764                     int nonce;
   1765                     nonce = data.readInt();
   1766                     unmountObb(filename, force, observer, nonce);
   1767                     reply.writeNoException();
   1768                     return true;
   1769                 }
   1770                 case TRANSACTION_isObbMounted: {
   1771                     data.enforceInterface(DESCRIPTOR);
   1772                     String filename;
   1773                     filename = data.readString();
   1774                     boolean status = isObbMounted(filename);
   1775                     reply.writeNoException();
   1776                     reply.writeInt((status ? 1 : 0));
   1777                     return true;
   1778                 }
   1779                 case TRANSACTION_getMountedObbPath: {
   1780                     data.enforceInterface(DESCRIPTOR);
   1781                     String filename;
   1782                     filename = data.readString();
   1783                     String mountedPath = getMountedObbPath(filename);
   1784                     reply.writeNoException();
   1785                     reply.writeString(mountedPath);
   1786                     return true;
   1787                 }
   1788                 case TRANSACTION_isExternalStorageEmulated: {
   1789                     data.enforceInterface(DESCRIPTOR);
   1790                     boolean emulated = isExternalStorageEmulated();
   1791                     reply.writeNoException();
   1792                     reply.writeInt(emulated ? 1 : 0);
   1793                     return true;
   1794                 }
   1795                 case TRANSACTION_decryptStorage: {
   1796                     data.enforceInterface(DESCRIPTOR);
   1797                     String password = data.readString();
   1798                     int result = decryptStorage(password);
   1799                     reply.writeNoException();
   1800                     reply.writeInt(result);
   1801                     return true;
   1802                 }
   1803                 case TRANSACTION_encryptStorage: {
   1804                     data.enforceInterface(DESCRIPTOR);
   1805                     int type = data.readInt();
   1806                     String password = data.readString();
   1807                     int result = encryptStorage(type, password);
   1808                     reply.writeNoException();
   1809                     reply.writeInt(result);
   1810                     return true;
   1811                 }
   1812                 case TRANSACTION_changeEncryptionPassword: {
   1813                     data.enforceInterface(DESCRIPTOR);
   1814                     int type = data.readInt();
   1815                     String password = data.readString();
   1816                     int result = changeEncryptionPassword(type, password);
   1817                     reply.writeNoException();
   1818                     reply.writeInt(result);
   1819                     return true;
   1820                 }
   1821                 case TRANSACTION_getVolumeList: {
   1822                     data.enforceInterface(DESCRIPTOR);
   1823                     int uid = data.readInt();
   1824                     String packageName = data.readString();
   1825                     int _flags = data.readInt();
   1826                     StorageVolume[] result = getVolumeList(uid, packageName, _flags);
   1827                     reply.writeNoException();
   1828                     reply.writeTypedArray(result, android.os.Parcelable.PARCELABLE_WRITE_RETURN_VALUE);
   1829                     return true;
   1830                 }
   1831                 case TRANSACTION_getSecureContainerFilesystemPath: {
   1832                     data.enforceInterface(DESCRIPTOR);
   1833                     String id;
   1834                     id = data.readString();
   1835                     String path = getSecureContainerFilesystemPath(id);
   1836                     reply.writeNoException();
   1837                     reply.writeString(path);
   1838                     return true;
   1839                 }
   1840                 case TRANSACTION_getEncryptionState: {
   1841                     data.enforceInterface(DESCRIPTOR);
   1842                     int result = getEncryptionState();
   1843                     reply.writeNoException();
   1844                     reply.writeInt(result);
   1845                     return true;
   1846                 }
   1847                 case TRANSACTION_fixPermissionsSecureContainer: {
   1848                     data.enforceInterface(DESCRIPTOR);
   1849                     String id;
   1850                     id = data.readString();
   1851                     int gid;
   1852                     gid = data.readInt();
   1853                     String filename;
   1854                     filename = data.readString();
   1855                     int resultCode = fixPermissionsSecureContainer(id, gid, filename);
   1856                     reply.writeNoException();
   1857                     reply.writeInt(resultCode);
   1858                     return true;
   1859                 }
   1860                 case TRANSACTION_mkdirs: {
   1861                     data.enforceInterface(DESCRIPTOR);
   1862                     String callingPkg = data.readString();
   1863                     String path = data.readString();
   1864                     int result = mkdirs(callingPkg, path);
   1865                     reply.writeNoException();
   1866                     reply.writeInt(result);
   1867                     return true;
   1868                 }
   1869                 case TRANSACTION_getPasswordType: {
   1870                     data.enforceInterface(DESCRIPTOR);
   1871                     int result = getPasswordType();
   1872                     reply.writeNoException();
   1873                     reply.writeInt(result);
   1874                     return true;
   1875                 }
   1876                 case TRANSACTION_getPassword: {
   1877                     data.enforceInterface(DESCRIPTOR);
   1878                     String result = getPassword();
   1879                     reply.writeNoException();
   1880                     reply.writeString(result);
   1881                     return true;
   1882                 }
   1883                 case TRANSACTION_clearPassword: {
   1884                     data.enforceInterface(DESCRIPTOR);
   1885                     clearPassword();
   1886                     reply.writeNoException();
   1887                     return true;
   1888                 }
   1889                 case TRANSACTION_setField: {
   1890                     data.enforceInterface(DESCRIPTOR);
   1891                     String field = data.readString();
   1892                     String contents = data.readString();
   1893                     setField(field, contents);
   1894                     reply.writeNoException();
   1895                     return true;
   1896                 }
   1897                 case TRANSACTION_getField: {
   1898                     data.enforceInterface(DESCRIPTOR);
   1899                     String field = data.readString();
   1900                     String contents = getField(field);
   1901                     reply.writeNoException();
   1902                     reply.writeString(contents);
   1903                     return true;
   1904                 }
   1905                 case TRANSACTION_isConvertibleToFBE: {
   1906                     data.enforceInterface(DESCRIPTOR);
   1907                     int resultCode = isConvertibleToFBE() ? 1 : 0;
   1908                     reply.writeNoException();
   1909                     reply.writeInt(resultCode);
   1910                     return true;
   1911                 }
   1912                 case TRANSACTION_resizeSecureContainer: {
   1913                     data.enforceInterface(DESCRIPTOR);
   1914                     String id;
   1915                     id = data.readString();
   1916                     int sizeMb;
   1917                     sizeMb = data.readInt();
   1918                     String key;
   1919                     key = data.readString();
   1920                     int resultCode = resizeSecureContainer(id, sizeMb, key);
   1921                     reply.writeNoException();
   1922                     reply.writeInt(resultCode);
   1923                     return true;
   1924                 }
   1925                 case TRANSACTION_lastMaintenance: {
   1926                     data.enforceInterface(DESCRIPTOR);
   1927                     long lastMaintenance = lastMaintenance();
   1928                     reply.writeNoException();
   1929                     reply.writeLong(lastMaintenance);
   1930                     return true;
   1931                 }
   1932                 case TRANSACTION_runMaintenance: {
   1933                     data.enforceInterface(DESCRIPTOR);
   1934                     runMaintenance();
   1935                     reply.writeNoException();
   1936                     return true;
   1937                 }
   1938                 case TRANSACTION_waitForAsecScan: {
   1939                     data.enforceInterface(DESCRIPTOR);
   1940                     waitForAsecScan();
   1941                     reply.writeNoException();
   1942                     return true;
   1943                 }
   1944                 case TRANSACTION_getDisks: {
   1945                     data.enforceInterface(DESCRIPTOR);
   1946                     DiskInfo[] disks = getDisks();
   1947                     reply.writeNoException();
   1948                     reply.writeTypedArray(disks, android.os.Parcelable.PARCELABLE_WRITE_RETURN_VALUE);
   1949                     return true;
   1950                 }
   1951                 case TRANSACTION_getVolumes: {
   1952                     data.enforceInterface(DESCRIPTOR);
   1953                     int _flags = data.readInt();
   1954                     VolumeInfo[] volumes = getVolumes(_flags);
   1955                     reply.writeNoException();
   1956                     reply.writeTypedArray(volumes, android.os.Parcelable.PARCELABLE_WRITE_RETURN_VALUE);
   1957                     return true;
   1958                 }
   1959                 case TRANSACTION_getVolumeRecords: {
   1960                     data.enforceInterface(DESCRIPTOR);
   1961                     int _flags = data.readInt();
   1962                     VolumeRecord[] volumes = getVolumeRecords(_flags);
   1963                     reply.writeNoException();
   1964                     reply.writeTypedArray(volumes, android.os.Parcelable.PARCELABLE_WRITE_RETURN_VALUE);
   1965                     return true;
   1966                 }
   1967                 case TRANSACTION_mount: {
   1968                     data.enforceInterface(DESCRIPTOR);
   1969                     String volId = data.readString();
   1970                     mount(volId);
   1971                     reply.writeNoException();
   1972                     return true;
   1973                 }
   1974                 case TRANSACTION_unmount: {
   1975                     data.enforceInterface(DESCRIPTOR);
   1976                     String volId = data.readString();
   1977                     unmount(volId);
   1978                     reply.writeNoException();
   1979                     return true;
   1980                 }
   1981                 case TRANSACTION_format: {
   1982                     data.enforceInterface(DESCRIPTOR);
   1983                     String volId = data.readString();
   1984                     format(volId);
   1985                     reply.writeNoException();
   1986                     return true;
   1987                 }
   1988                 case TRANSACTION_benchmark: {
   1989                     data.enforceInterface(DESCRIPTOR);
   1990                     String volId = data.readString();
   1991                     long res = benchmark(volId);
   1992                     reply.writeNoException();
   1993                     reply.writeLong(res);
   1994                     return true;
   1995                 }
   1996                 case TRANSACTION_partitionPublic: {
   1997                     data.enforceInterface(DESCRIPTOR);
   1998                     String diskId = data.readString();
   1999                     partitionPublic(diskId);
   2000                     reply.writeNoException();
   2001                     return true;
   2002                 }
   2003                 case TRANSACTION_partitionPrivate: {
   2004                     data.enforceInterface(DESCRIPTOR);
   2005                     String diskId = data.readString();
   2006                     partitionPrivate(diskId);
   2007                     reply.writeNoException();
   2008                     return true;
   2009                 }
   2010                 case TRANSACTION_partitionMixed: {
   2011                     data.enforceInterface(DESCRIPTOR);
   2012                     String diskId = data.readString();
   2013                     int ratio = data.readInt();
   2014                     partitionMixed(diskId, ratio);
   2015                     reply.writeNoException();
   2016                     return true;
   2017                 }
   2018                 case TRANSACTION_setVolumeNickname: {
   2019                     data.enforceInterface(DESCRIPTOR);
   2020                     String volId = data.readString();
   2021                     String nickname = data.readString();
   2022                     setVolumeNickname(volId, nickname);
   2023                     reply.writeNoException();
   2024                     return true;
   2025                 }
   2026                 case TRANSACTION_setVolumeUserFlags: {
   2027                     data.enforceInterface(DESCRIPTOR);
   2028                     String volId = data.readString();
   2029                     int _flags = data.readInt();
   2030                     int _mask = data.readInt();
   2031                     setVolumeUserFlags(volId, _flags, _mask);
   2032                     reply.writeNoException();
   2033                     return true;
   2034                 }
   2035                 case TRANSACTION_forgetVolume: {
   2036                     data.enforceInterface(DESCRIPTOR);
   2037                     String fsUuid = data.readString();
   2038                     forgetVolume(fsUuid);
   2039                     reply.writeNoException();
   2040                     return true;
   2041                 }
   2042                 case TRANSACTION_forgetAllVolumes: {
   2043                     data.enforceInterface(DESCRIPTOR);
   2044                     forgetAllVolumes();
   2045                     reply.writeNoException();
   2046                     return true;
   2047                 }
   2048                 case TRANSACTION_setDebugFlags: {
   2049                     data.enforceInterface(DESCRIPTOR);
   2050                     int _flags = data.readInt();
   2051                     int _mask = data.readInt();
   2052                     setDebugFlags(_flags, _mask);
   2053                     reply.writeNoException();
   2054                     return true;
   2055                 }
   2056                 case TRANSACTION_getPrimaryStorageUuid: {
   2057                     data.enforceInterface(DESCRIPTOR);
   2058                     String volumeUuid = getPrimaryStorageUuid();
   2059                     reply.writeNoException();
   2060                     reply.writeString(volumeUuid);
   2061                     return true;
   2062                 }
   2063                 case TRANSACTION_setPrimaryStorageUuid: {
   2064                     data.enforceInterface(DESCRIPTOR);
   2065                     String volumeUuid = data.readString();
   2066                     IPackageMoveObserver listener = IPackageMoveObserver.Stub.asInterface(
   2067                             data.readStrongBinder());
   2068                     setPrimaryStorageUuid(volumeUuid, listener);
   2069                     reply.writeNoException();
   2070                     return true;
   2071                 }
   2072                 case TRANSACTION_createUserKey: {
   2073                     data.enforceInterface(DESCRIPTOR);
   2074                     int userId = data.readInt();
   2075                     int serialNumber = data.readInt();
   2076                     boolean ephemeral = data.readInt() != 0;
   2077                     createUserKey(userId, serialNumber, ephemeral);
   2078                     reply.writeNoException();
   2079                     return true;
   2080                 }
   2081                 case TRANSACTION_destroyUserKey: {
   2082                     data.enforceInterface(DESCRIPTOR);
   2083                     int userId = data.readInt();
   2084                     destroyUserKey(userId);
   2085                     reply.writeNoException();
   2086                     return true;
   2087                 }
   2088                 case TRANSACTION_addUserKeyAuth: {
   2089                     data.enforceInterface(DESCRIPTOR);
   2090                     int userId = data.readInt();
   2091                     int serialNumber = data.readInt();
   2092                     byte[] token = data.createByteArray();
   2093                     byte[] secret = data.createByteArray();
   2094                     addUserKeyAuth(userId, serialNumber, token, secret);
   2095                     reply.writeNoException();
   2096                     return true;
   2097                 }
   2098                 case TRANSACTION_fixateNewestUserKeyAuth: {
   2099                     data.enforceInterface(DESCRIPTOR);
   2100                     int userId = data.readInt();
   2101                     fixateNewestUserKeyAuth(userId);
   2102                     reply.writeNoException();
   2103                     return true;
   2104                 }
   2105                 case TRANSACTION_unlockUserKey: {
   2106                     data.enforceInterface(DESCRIPTOR);
   2107                     int userId = data.readInt();
   2108                     int serialNumber = data.readInt();
   2109                     byte[] token = data.createByteArray();
   2110                     byte[] secret = data.createByteArray();
   2111                     unlockUserKey(userId, serialNumber, token, secret);
   2112                     reply.writeNoException();
   2113                     return true;
   2114                 }
   2115                 case TRANSACTION_lockUserKey: {
   2116                     data.enforceInterface(DESCRIPTOR);
   2117                     int userId = data.readInt();
   2118                     lockUserKey(userId);
   2119                     reply.writeNoException();
   2120                     return true;
   2121                 }
   2122                 case TRANSACTION_isUserKeyUnlocked: {
   2123                     data.enforceInterface(DESCRIPTOR);
   2124                     int userId = data.readInt();
   2125                     boolean result = isUserKeyUnlocked(userId);
   2126                     reply.writeNoException();
   2127                     reply.writeInt(result ? 1 : 0);
   2128                     return true;
   2129                 }
   2130                 case TRANSACTION_prepareUserStorage: {
   2131                     data.enforceInterface(DESCRIPTOR);
   2132                     String volumeUuid = data.readString();
   2133                     int userId = data.readInt();
   2134                     int serialNumber = data.readInt();
   2135                     int _flags = data.readInt();
   2136                     prepareUserStorage(volumeUuid, userId, serialNumber, _flags);
   2137                     reply.writeNoException();
   2138                     return true;
   2139                 }
   2140                 case TRANSACTION_destroyUserStorage: {
   2141                     data.enforceInterface(DESCRIPTOR);
   2142                     String volumeUuid = data.readString();
   2143                     int userId = data.readInt();
   2144                     int _flags = data.readInt();
   2145                     destroyUserStorage(volumeUuid, userId, _flags);
   2146                     reply.writeNoException();
   2147                     return true;
   2148                 }
   2149                 case TRANSACTION_mountAppFuse: {
   2150                     data.enforceInterface(DESCRIPTOR);
   2151                     String name = data.readString();
   2152                     ParcelFileDescriptor fd = mountAppFuse(name);
   2153                     reply.writeNoException();
   2154                     reply.writeParcelable(fd, Parcelable.PARCELABLE_WRITE_RETURN_VALUE);
   2155                     return true;
   2156                 }
   2157             }
   2158             return super.onTransact(code, data, reply, flags);
   2159         }
   2160     }
   2161 
   2162     /*
   2163      * Creates a secure container with the specified parameters. Returns an int
   2164      * consistent with MountServiceResultCode
   2165      */
   2166     public int createSecureContainer(String id, int sizeMb, String fstype, String key,
   2167             int ownerUid, boolean external) throws RemoteException;
   2168 
   2169     /*
   2170      * Destroy a secure container, and free up all resources associated with it.
   2171      * NOTE: Ensure all references are released prior to deleting. Returns an
   2172      * int consistent with MountServiceResultCode
   2173      */
   2174     public int destroySecureContainer(String id, boolean force) throws RemoteException;
   2175 
   2176     /*
   2177      * Finalize a container which has just been created and populated. After
   2178      * finalization, the container is immutable. Returns an int consistent with
   2179      * MountServiceResultCode
   2180      */
   2181     public int finalizeSecureContainer(String id) throws RemoteException;
   2182 
   2183     /**
   2184      * Call into MountService by PackageManager to notify that its done
   2185      * processing the media status update request.
   2186      */
   2187     public void finishMediaUpdate() throws RemoteException;
   2188 
   2189     /**
   2190      * Format external storage given a mount point. Returns an int consistent
   2191      * with MountServiceResultCode
   2192      */
   2193     public int formatVolume(String mountPoint) throws RemoteException;
   2194 
   2195     /**
   2196      * Gets the path to the mounted Opaque Binary Blob (OBB).
   2197      */
   2198     public String getMountedObbPath(String rawPath) throws RemoteException;
   2199 
   2200     /**
   2201      * Gets an Array of currently known secure container IDs
   2202      */
   2203     public String[] getSecureContainerList() throws RemoteException;
   2204 
   2205     /*
   2206      * Returns the filesystem path of a mounted secure container.
   2207      */
   2208     public String getSecureContainerPath(String id) throws RemoteException;
   2209 
   2210     /**
   2211      * Returns an array of pids with open files on the specified path.
   2212      */
   2213     public int[] getStorageUsers(String path) throws RemoteException;
   2214 
   2215     /**
   2216      * Gets the state of a volume via its mountpoint.
   2217      */
   2218     public String getVolumeState(String mountPoint) throws RemoteException;
   2219 
   2220     /**
   2221      * Checks whether the specified Opaque Binary Blob (OBB) is mounted
   2222      * somewhere.
   2223      */
   2224     public boolean isObbMounted(String rawPath) throws RemoteException;
   2225 
   2226     /*
   2227      * Returns true if the specified container is mounted
   2228      */
   2229     public boolean isSecureContainerMounted(String id) throws RemoteException;
   2230 
   2231     /**
   2232      * Returns true if a USB mass storage host is connected
   2233      */
   2234     public boolean isUsbMassStorageConnected() throws RemoteException;
   2235 
   2236     /**
   2237      * Returns true if a USB mass storage host is enabled (media is shared)
   2238      */
   2239     public boolean isUsbMassStorageEnabled() throws RemoteException;
   2240 
   2241     /**
   2242      * Mounts an Opaque Binary Blob (OBB) with the specified decryption key and
   2243      * only allows the calling process's UID access to the contents.
   2244      * MountService will call back to the supplied IObbActionListener to inform
   2245      * it of the terminal state of the call.
   2246      */
   2247     public void mountObb(String rawPath, String canonicalPath, String key,
   2248             IObbActionListener token, int nonce) throws RemoteException;
   2249 
   2250     /*
   2251      * Mount a secure container with the specified key and owner UID. Returns an
   2252      * int consistent with MountServiceResultCode
   2253      */
   2254     public int mountSecureContainer(String id, String key, int ownerUid, boolean readOnly)
   2255             throws RemoteException;
   2256 
   2257     /**
   2258      * Mount external storage at given mount point. Returns an int consistent
   2259      * with MountServiceResultCode
   2260      */
   2261     public int mountVolume(String mountPoint) throws RemoteException;
   2262 
   2263     /**
   2264      * Registers an IMountServiceListener for receiving async notifications.
   2265      */
   2266     public void registerListener(IMountServiceListener listener) throws RemoteException;
   2267 
   2268     /*
   2269      * Rename an unmounted secure container. Returns an int consistent with
   2270      * MountServiceResultCode
   2271      */
   2272     public int renameSecureContainer(String oldId, String newId) throws RemoteException;
   2273 
   2274     /**
   2275      * Enables / disables USB mass storage. The caller should check actual
   2276      * status of enabling/disabling USB mass storage via StorageEventListener.
   2277      */
   2278     public void setUsbMassStorageEnabled(boolean enable) throws RemoteException;
   2279 
   2280     /**
   2281      * Shuts down the MountService and gracefully unmounts all external media.
   2282      * Invokes call back once the shutdown is complete.
   2283      */
   2284     public void shutdown(IMountShutdownObserver observer) throws RemoteException;
   2285 
   2286     /**
   2287      * Unmounts an Opaque Binary Blob (OBB). When the force flag is specified,
   2288      * any program using it will be forcibly killed to unmount the image.
   2289      * MountService will call back to the supplied IObbActionListener to inform
   2290      * it of the terminal state of the call.
   2291      */
   2292     public void unmountObb(String rawPath, boolean force, IObbActionListener token, int nonce)
   2293             throws RemoteException;
   2294 
   2295     /*
   2296      * Unount a secure container. Returns an int consistent with
   2297      * MountServiceResultCode
   2298      */
   2299     public int unmountSecureContainer(String id, boolean force) throws RemoteException;
   2300 
   2301     /**
   2302      * Safely unmount external storage at given mount point. The unmount is an
   2303      * asynchronous operation. Applications should register StorageEventListener
   2304      * for storage related status changes.
   2305      * @param mountPoint the mount point
   2306      * @param force whether or not to forcefully unmount it (e.g. even if programs are using this
   2307      *     data currently)
   2308      * @param removeEncryption whether or not encryption mapping should be removed from the volume.
   2309      *     This value implies {@code force}.
   2310      */
   2311     public void unmountVolume(String mountPoint, boolean force, boolean removeEncryption)
   2312             throws RemoteException;
   2313 
   2314     /**
   2315      * Unregisters an IMountServiceListener
   2316      */
   2317     public void unregisterListener(IMountServiceListener listener) throws RemoteException;
   2318 
   2319     /**
   2320      * Returns whether or not the external storage is emulated.
   2321      */
   2322     public boolean isExternalStorageEmulated() throws RemoteException;
   2323 
   2324     /** The volume is not encrypted. */
   2325     static final int ENCRYPTION_STATE_NONE = 1;
   2326     /** The volume has been encrypted succesfully. */
   2327     static final int ENCRYPTION_STATE_OK = 0;
   2328     /** The volume is in a bad state.*/
   2329     static final int ENCRYPTION_STATE_ERROR_UNKNOWN = -1;
   2330     /** Encryption is incomplete */
   2331     static final int ENCRYPTION_STATE_ERROR_INCOMPLETE = -2;
   2332     /** Encryption is incomplete and irrecoverable */
   2333     static final int ENCRYPTION_STATE_ERROR_INCONSISTENT = -3;
   2334     /** Underlying data is corrupt */
   2335     static final int ENCRYPTION_STATE_ERROR_CORRUPT = -4;
   2336 
   2337     /**
   2338      * Determines the encryption state of the volume.
   2339      * @return a numerical value. See {@code ENCRYPTION_STATE_*} for possible
   2340      * values.
   2341      * Note that this has been replaced in most cases by the APIs in
   2342      * StorageManager (see isEncryptable and below)
   2343      * This is still useful to get the error state when encryption has failed
   2344      * and CryptKeeper needs to throw up a screen advising the user what to do
   2345      */
   2346     public int getEncryptionState() throws RemoteException;
   2347 
   2348     /**
   2349      * Decrypts any encrypted volumes.
   2350      */
   2351     public int decryptStorage(String password) throws RemoteException;
   2352 
   2353     /**
   2354      * Encrypts storage.
   2355      */
   2356     public int encryptStorage(int type, String password) throws RemoteException;
   2357 
   2358     /**
   2359      * Changes the encryption password.
   2360      */
   2361     public int changeEncryptionPassword(int type, String password)
   2362         throws RemoteException;
   2363 
   2364     /**
   2365      * Verify the encryption password against the stored volume.  This method
   2366      * may only be called by the system process.
   2367      */
   2368     public int verifyEncryptionPassword(String password) throws RemoteException;
   2369 
   2370     /**
   2371      * Returns list of all mountable volumes.
   2372      */
   2373     public StorageVolume[] getVolumeList(int uid, String packageName, int flags) throws RemoteException;
   2374 
   2375     /**
   2376      * Gets the path on the filesystem for the ASEC container itself.
   2377      *
   2378      * @param cid ASEC container ID
   2379      * @return path to filesystem or {@code null} if it's not found
   2380      * @throws RemoteException
   2381      */
   2382     public String getSecureContainerFilesystemPath(String cid) throws RemoteException;
   2383 
   2384     /*
   2385      * Fix permissions in a container which has just been created and populated.
   2386      * Returns an int consistent with MountServiceResultCode
   2387      */
   2388     public int fixPermissionsSecureContainer(String id, int gid, String filename)
   2389             throws RemoteException;
   2390 
   2391     /**
   2392      * Ensure that all directories along given path exist, creating parent
   2393      * directories as needed. Validates that given path is absolute and that it
   2394      * contains no relative "." or ".." paths or symlinks. Also ensures that
   2395      * path belongs to a volume managed by vold, and that path is either
   2396      * external storage data or OBB directory belonging to calling app.
   2397      */
   2398     public int mkdirs(String callingPkg, String path) throws RemoteException;
   2399 
   2400     /**
   2401      * Determines the type of the encryption password
   2402      * @return PasswordType
   2403      */
   2404     public int getPasswordType() throws RemoteException;
   2405 
   2406     /**
   2407      * Get password from vold
   2408      * @return password or empty string
   2409      */
   2410     public String getPassword() throws RemoteException;
   2411 
   2412     /**
   2413      * Securely clear password from vold
   2414      */
   2415     public void clearPassword() throws RemoteException;
   2416 
   2417     /**
   2418      * Set a field in the crypto header.
   2419      * @param field field to set
   2420      * @param contents contents to set in field
   2421      */
   2422     public void setField(String field, String contents) throws RemoteException;
   2423 
   2424     /**
   2425      * Gets a field from the crypto header.
   2426      * @param field field to get
   2427      * @return contents of field
   2428      */
   2429     public String getField(String field) throws RemoteException;
   2430 
   2431     public boolean isConvertibleToFBE() throws RemoteException;
   2432 
   2433     public int resizeSecureContainer(String id, int sizeMb, String key) throws RemoteException;
   2434 
   2435     /**
   2436      * Report the time of the last maintenance operation such as fstrim.
   2437      * @return Timestamp of the last maintenance operation, in the
   2438      *     System.currentTimeMillis() time base
   2439      * @throws RemoteException
   2440      */
   2441     public long lastMaintenance() throws RemoteException;
   2442 
   2443     /**
   2444      * Kick off an immediate maintenance operation
   2445      * @throws RemoteException
   2446      */
   2447     public void runMaintenance() throws RemoteException;
   2448 
   2449     public void waitForAsecScan() throws RemoteException;
   2450 
   2451     public DiskInfo[] getDisks() throws RemoteException;
   2452     public VolumeInfo[] getVolumes(int flags) throws RemoteException;
   2453     public VolumeRecord[] getVolumeRecords(int flags) throws RemoteException;
   2454 
   2455     public void mount(String volId) throws RemoteException;
   2456     public void unmount(String volId) throws RemoteException;
   2457     public void format(String volId) throws RemoteException;
   2458     public long benchmark(String volId) throws RemoteException;
   2459 
   2460     public void partitionPublic(String diskId) throws RemoteException;
   2461     public void partitionPrivate(String diskId) throws RemoteException;
   2462     public void partitionMixed(String diskId, int ratio) throws RemoteException;
   2463 
   2464     public void setVolumeNickname(String fsUuid, String nickname) throws RemoteException;
   2465     public void setVolumeUserFlags(String fsUuid, int flags, int mask) throws RemoteException;
   2466     public void forgetVolume(String fsUuid) throws RemoteException;
   2467     public void forgetAllVolumes() throws RemoteException;
   2468     public void setDebugFlags(int flags, int mask) throws RemoteException;
   2469 
   2470     public String getPrimaryStorageUuid() throws RemoteException;
   2471     public void setPrimaryStorageUuid(String volumeUuid, IPackageMoveObserver callback)
   2472             throws RemoteException;
   2473 
   2474     public void createUserKey(int userId, int serialNumber, boolean ephemeral)
   2475             throws RemoteException;
   2476     public void destroyUserKey(int userId) throws RemoteException;
   2477     public void addUserKeyAuth(int userId, int serialNumber,
   2478             byte[] token, byte[] secret) throws RemoteException;
   2479     public void fixateNewestUserKeyAuth(int userId) throws RemoteException;
   2480 
   2481     public void unlockUserKey(int userId, int serialNumber,
   2482             byte[] token, byte[] secret) throws RemoteException;
   2483     public void lockUserKey(int userId) throws RemoteException;
   2484     public boolean isUserKeyUnlocked(int userId) throws RemoteException;
   2485 
   2486     public void prepareUserStorage(String volumeUuid, int userId, int serialNumber,
   2487             int flags) throws RemoteException;
   2488     public void destroyUserStorage(String volumeUuid, int userId, int flags) throws RemoteException;
   2489 
   2490     public ParcelFileDescriptor mountAppFuse(String name) throws RemoteException;
   2491 }
   2492