Home | History | Annotate | Download | only in storage
      1 /*
      2  * Copyright (C) 2009 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.os.Binder;
     20 import android.os.IBinder;
     21 import android.os.IInterface;
     22 import android.os.Parcel;
     23 import android.os.RemoteException;
     24 
     25 /**
     26  * Callback class for receiving events from MountService.
     27  *
     28  * @hide - Applications should use IStorageEventListener for storage event
     29  *       callbacks.
     30  */
     31 public interface IMountServiceListener extends IInterface {
     32     /** Local-side IPC implementation stub class. */
     33     public static abstract class Stub extends Binder implements IMountServiceListener {
     34         private static final String DESCRIPTOR = "IMountServiceListener";
     35 
     36         /** Construct the stub at attach it to the interface. */
     37         public Stub() {
     38             this.attachInterface(this, DESCRIPTOR);
     39         }
     40 
     41         /**
     42          * Cast an IBinder object into an IMountServiceListener interface,
     43          * generating a proxy if needed.
     44          */
     45         public static IMountServiceListener asInterface(IBinder obj) {
     46             if ((obj == null)) {
     47                 return null;
     48             }
     49             IInterface iin = (IInterface) obj.queryLocalInterface(DESCRIPTOR);
     50             if (((iin != null) && (iin instanceof IMountServiceListener))) {
     51                 return ((IMountServiceListener) iin);
     52             }
     53             return new IMountServiceListener.Stub.Proxy(obj);
     54         }
     55 
     56         public IBinder asBinder() {
     57             return this;
     58         }
     59 
     60         @Override
     61         public boolean onTransact(int code, Parcel data, Parcel reply, int flags)
     62                 throws RemoteException {
     63             switch (code) {
     64                 case INTERFACE_TRANSACTION: {
     65                     reply.writeString(DESCRIPTOR);
     66                     return true;
     67                 }
     68                 case TRANSACTION_onUsbMassStorageConnectionChanged: {
     69                     data.enforceInterface(DESCRIPTOR);
     70                     boolean connected;
     71                     connected = (0 != data.readInt());
     72                     this.onUsbMassStorageConnectionChanged(connected);
     73                     reply.writeNoException();
     74                     return true;
     75                 }
     76                 case TRANSACTION_onStorageStateChanged: {
     77                     data.enforceInterface(DESCRIPTOR);
     78                     final String path = data.readString();
     79                     final String oldState = data.readString();
     80                     final String newState = data.readString();
     81                     this.onStorageStateChanged(path, oldState, newState);
     82                     reply.writeNoException();
     83                     return true;
     84                 }
     85                 case TRANSACTION_onVolumeStateChanged: {
     86                     data.enforceInterface(DESCRIPTOR);
     87                     final VolumeInfo vol = (VolumeInfo) data.readParcelable(null);
     88                     final int oldState = data.readInt();
     89                     final int newState = data.readInt();
     90                     onVolumeStateChanged(vol, oldState, newState);
     91                     reply.writeNoException();
     92                     return true;
     93                 }
     94                 case TRANSACTION_onVolumeRecordChanged: {
     95                     data.enforceInterface(DESCRIPTOR);
     96                     final VolumeRecord rec = (VolumeRecord) data.readParcelable(null);
     97                     onVolumeRecordChanged(rec);
     98                     reply.writeNoException();
     99                     return true;
    100                 }
    101                 case TRANSACTION_onVolumeForgotten: {
    102                     data.enforceInterface(DESCRIPTOR);
    103                     final String fsUuid = data.readString();
    104                     onVolumeForgotten(fsUuid);
    105                     reply.writeNoException();
    106                     return true;
    107                 }
    108                 case TRANSACTION_onDiskScanned: {
    109                     data.enforceInterface(DESCRIPTOR);
    110                     final DiskInfo disk = (DiskInfo) data.readParcelable(null);
    111                     final int volumeCount = data.readInt();
    112                     onDiskScanned(disk, volumeCount);
    113                     reply.writeNoException();
    114                     return true;
    115                 }
    116                 case TRANSACTION_onDiskDestroyed: {
    117                     data.enforceInterface(DESCRIPTOR);
    118                     final DiskInfo disk = (DiskInfo) data.readParcelable(null);
    119                     onDiskDestroyed(disk);
    120                     reply.writeNoException();
    121                     return true;
    122                 }
    123             }
    124             return super.onTransact(code, data, reply, flags);
    125         }
    126 
    127         private static class Proxy implements IMountServiceListener {
    128             private IBinder mRemote;
    129 
    130             Proxy(IBinder remote) {
    131                 mRemote = remote;
    132             }
    133 
    134             public IBinder asBinder() {
    135                 return mRemote;
    136             }
    137 
    138             public String getInterfaceDescriptor() {
    139                 return DESCRIPTOR;
    140             }
    141 
    142             /**
    143              * Detection state of USB Mass Storage has changed
    144              *
    145              * @param available true if a UMS host is connected.
    146              */
    147             public void onUsbMassStorageConnectionChanged(boolean connected) throws RemoteException {
    148                 Parcel _data = Parcel.obtain();
    149                 Parcel _reply = Parcel.obtain();
    150                 try {
    151                     _data.writeInterfaceToken(DESCRIPTOR);
    152                     _data.writeInt(((connected) ? (1) : (0)));
    153                     mRemote.transact(Stub.TRANSACTION_onUsbMassStorageConnectionChanged, _data,
    154                             _reply, android.os.IBinder.FLAG_ONEWAY);
    155                     _reply.readException();
    156                 } finally {
    157                     _reply.recycle();
    158                     _data.recycle();
    159                 }
    160             }
    161 
    162             /**
    163              * Storage state has changed.
    164              *
    165              * @param path The volume mount path.
    166              * @param oldState The old state of the volume.
    167              * @param newState The new state of the volume. Note: State is one
    168              *            of the values returned by
    169              *            Environment.getExternalStorageState()
    170              */
    171             public void onStorageStateChanged(String path, String oldState, String newState)
    172                     throws RemoteException {
    173                 Parcel _data = Parcel.obtain();
    174                 Parcel _reply = Parcel.obtain();
    175                 try {
    176                     _data.writeInterfaceToken(DESCRIPTOR);
    177                     _data.writeString(path);
    178                     _data.writeString(oldState);
    179                     _data.writeString(newState);
    180                     mRemote.transact(Stub.TRANSACTION_onStorageStateChanged, _data, _reply,
    181                             android.os.IBinder.FLAG_ONEWAY);
    182                     _reply.readException();
    183                 } finally {
    184                     _reply.recycle();
    185                     _data.recycle();
    186                 }
    187             }
    188 
    189             @Override
    190             public void onVolumeStateChanged(VolumeInfo vol, int oldState, int newState)
    191                     throws RemoteException {
    192                 Parcel _data = Parcel.obtain();
    193                 Parcel _reply = Parcel.obtain();
    194                 try {
    195                     _data.writeInterfaceToken(DESCRIPTOR);
    196                     _data.writeParcelable(vol, 0);
    197                     _data.writeInt(oldState);
    198                     _data.writeInt(newState);
    199                     mRemote.transact(Stub.TRANSACTION_onVolumeStateChanged, _data, _reply,
    200                             android.os.IBinder.FLAG_ONEWAY);
    201                     _reply.readException();
    202                 } finally {
    203                     _reply.recycle();
    204                     _data.recycle();
    205                 }
    206             }
    207 
    208             @Override
    209             public void onVolumeRecordChanged(VolumeRecord rec) throws RemoteException {
    210                 Parcel _data = Parcel.obtain();
    211                 Parcel _reply = Parcel.obtain();
    212                 try {
    213                     _data.writeInterfaceToken(DESCRIPTOR);
    214                     _data.writeParcelable(rec, 0);
    215                     mRemote.transact(Stub.TRANSACTION_onVolumeRecordChanged, _data, _reply,
    216                             android.os.IBinder.FLAG_ONEWAY);
    217                     _reply.readException();
    218                 } finally {
    219                     _reply.recycle();
    220                     _data.recycle();
    221                 }
    222             }
    223 
    224             @Override
    225             public void onVolumeForgotten(String fsUuid) throws RemoteException {
    226                 Parcel _data = Parcel.obtain();
    227                 Parcel _reply = Parcel.obtain();
    228                 try {
    229                     _data.writeInterfaceToken(DESCRIPTOR);
    230                     _data.writeString(fsUuid);
    231                     mRemote.transact(Stub.TRANSACTION_onVolumeForgotten, _data, _reply,
    232                             android.os.IBinder.FLAG_ONEWAY);
    233                     _reply.readException();
    234                 } finally {
    235                     _reply.recycle();
    236                     _data.recycle();
    237                 }
    238             }
    239 
    240             @Override
    241             public void onDiskScanned(DiskInfo disk, int volumeCount) throws RemoteException {
    242                 Parcel _data = Parcel.obtain();
    243                 Parcel _reply = Parcel.obtain();
    244                 try {
    245                     _data.writeInterfaceToken(DESCRIPTOR);
    246                     _data.writeParcelable(disk, 0);
    247                     _data.writeInt(volumeCount);
    248                     mRemote.transact(Stub.TRANSACTION_onDiskScanned, _data, _reply,
    249                             android.os.IBinder.FLAG_ONEWAY);
    250                     _reply.readException();
    251                 } finally {
    252                     _reply.recycle();
    253                     _data.recycle();
    254                 }
    255             }
    256 
    257             @Override
    258             public void onDiskDestroyed(DiskInfo disk) throws RemoteException {
    259                 Parcel _data = Parcel.obtain();
    260                 Parcel _reply = Parcel.obtain();
    261                 try {
    262                     _data.writeInterfaceToken(DESCRIPTOR);
    263                     _data.writeParcelable(disk, 0);
    264                     mRemote.transact(Stub.TRANSACTION_onDiskDestroyed, _data, _reply,
    265                             android.os.IBinder.FLAG_ONEWAY);
    266                     _reply.readException();
    267                 } finally {
    268                     _reply.recycle();
    269                     _data.recycle();
    270                 }
    271             }
    272         }
    273 
    274         static final int TRANSACTION_onUsbMassStorageConnectionChanged = (IBinder.FIRST_CALL_TRANSACTION + 0);
    275         static final int TRANSACTION_onStorageStateChanged = (IBinder.FIRST_CALL_TRANSACTION + 1);
    276         static final int TRANSACTION_onVolumeStateChanged = (IBinder.FIRST_CALL_TRANSACTION + 2);
    277         static final int TRANSACTION_onVolumeRecordChanged = (IBinder.FIRST_CALL_TRANSACTION + 3);
    278         static final int TRANSACTION_onVolumeForgotten = (IBinder.FIRST_CALL_TRANSACTION + 4);
    279         static final int TRANSACTION_onDiskScanned = (IBinder.FIRST_CALL_TRANSACTION + 5);
    280         static final int TRANSACTION_onDiskDestroyed = (IBinder.FIRST_CALL_TRANSACTION + 6);
    281     }
    282 
    283     /**
    284      * Detection state of USB Mass Storage has changed
    285      *
    286      * @param available true if a UMS host is connected.
    287      */
    288     public void onUsbMassStorageConnectionChanged(boolean connected) throws RemoteException;
    289 
    290     /**
    291      * Storage state has changed.
    292      *
    293      * @param path The volume mount path.
    294      * @param oldState The old state of the volume.
    295      * @param newState The new state of the volume. Note: State is one of the
    296      *            values returned by Environment.getExternalStorageState()
    297      */
    298     public void onStorageStateChanged(String path, String oldState, String newState)
    299             throws RemoteException;
    300 
    301     public void onVolumeStateChanged(VolumeInfo vol, int oldState, int newState)
    302             throws RemoteException;
    303     public void onVolumeRecordChanged(VolumeRecord rec) throws RemoteException;
    304     public void onVolumeForgotten(String fsUuid) throws RemoteException;
    305 
    306     public void onDiskScanned(DiskInfo disk, int volumeCount) throws RemoteException;
    307 
    308     public void onDiskDestroyed(DiskInfo disk) throws RemoteException;
    309 }
    310