16ffce2e9a3c57634bb73f8ff133ca680f8070d5dSuchi Amalapurapu/* 26ffce2e9a3c57634bb73f8ff133ca680f8070d5dSuchi Amalapurapu * Copyright (C) 2009 The Android Open Source Project 3fea87ae1a742c94c50573dcdd50f07e6d56c8015San Mehat * 4fea87ae1a742c94c50573dcdd50f07e6d56c8015San Mehat * Licensed under the Apache License, Version 2.0 (the "License"); 5fea87ae1a742c94c50573dcdd50f07e6d56c8015San Mehat * you may not use this file except in compliance with the License. 6fea87ae1a742c94c50573dcdd50f07e6d56c8015San Mehat * You may obtain a copy of the License at 7fea87ae1a742c94c50573dcdd50f07e6d56c8015San Mehat * 8fea87ae1a742c94c50573dcdd50f07e6d56c8015San Mehat * http://www.apache.org/licenses/LICENSE-2.0 9fea87ae1a742c94c50573dcdd50f07e6d56c8015San Mehat * 10fea87ae1a742c94c50573dcdd50f07e6d56c8015San Mehat * Unless required by applicable law or agreed to in writing, software 11fea87ae1a742c94c50573dcdd50f07e6d56c8015San Mehat * distributed under the License is distributed on an "AS IS" BASIS, 12fea87ae1a742c94c50573dcdd50f07e6d56c8015San Mehat * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13fea87ae1a742c94c50573dcdd50f07e6d56c8015San Mehat * See the License for the specific language governing permissions and 14fea87ae1a742c94c50573dcdd50f07e6d56c8015San Mehat * limitations under the License. 15fea87ae1a742c94c50573dcdd50f07e6d56c8015San Mehat */ 16fea87ae1a742c94c50573dcdd50f07e6d56c8015San Mehat 176ffce2e9a3c57634bb73f8ff133ca680f8070d5dSuchi Amalapurapupackage android.os.storage; 186ffce2e9a3c57634bb73f8ff133ca680f8070d5dSuchi Amalapurapu 19be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Rootimport android.os.Binder; 20be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Rootimport android.os.IBinder; 21be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Rootimport android.os.IInterface; 22be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Rootimport android.os.Parcel; 23be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Rootimport android.os.RemoteException; 24b4a162e50a96d2eef5fa3ed686e1418c4fbc8dedSan Mehat 25b4a162e50a96d2eef5fa3ed686e1418c4fbc8dedSan Mehat/** 26b4a162e50a96d2eef5fa3ed686e1418c4fbc8dedSan Mehat * Callback class for receiving events from MountService. 27be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root * 28be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root * @hide - Applications should use IStorageEventListener for storage event 29be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root * callbacks. 30be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root */ 31be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Rootpublic interface IMountServiceListener extends IInterface { 32be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root /** Local-side IPC implementation stub class. */ 33be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root public static abstract class Stub extends Binder implements IMountServiceListener { 34be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root private static final String DESCRIPTOR = "IMountServiceListener"; 35be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root 36be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root /** Construct the stub at attach it to the interface. */ 37be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root public Stub() { 38be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root this.attachInterface(this, DESCRIPTOR); 39be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root } 40be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root 41be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root /** 42be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root * Cast an IBinder object into an IMountServiceListener interface, 43be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root * generating a proxy if needed. 44be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root */ 45be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root public static IMountServiceListener asInterface(IBinder obj) { 46be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root if ((obj == null)) { 47be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root return null; 48be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root } 49be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root IInterface iin = (IInterface) obj.queryLocalInterface(DESCRIPTOR); 50be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root if (((iin != null) && (iin instanceof IMountServiceListener))) { 51be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root return ((IMountServiceListener) iin); 52be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root } 53be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root return new IMountServiceListener.Stub.Proxy(obj); 54be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root } 55be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root 56be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root public IBinder asBinder() { 57be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root return this; 58be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root } 59be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root 60be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root @Override 61be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root public boolean onTransact(int code, Parcel data, Parcel reply, int flags) 62be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root throws RemoteException { 63be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root switch (code) { 64be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root case INTERFACE_TRANSACTION: { 65be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root reply.writeString(DESCRIPTOR); 66be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root return true; 67be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root } 68be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root case TRANSACTION_onUsbMassStorageConnectionChanged: { 69be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root data.enforceInterface(DESCRIPTOR); 70be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root boolean connected; 71be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root connected = (0 != data.readInt()); 72be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root this.onUsbMassStorageConnectionChanged(connected); 73be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root reply.writeNoException(); 74be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root return true; 75be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root } 76be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root case TRANSACTION_onStorageStateChanged: { 77be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root data.enforceInterface(DESCRIPTOR); 78be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root String path; 79be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root path = data.readString(); 80be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root String oldState; 81be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root oldState = data.readString(); 82be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root String newState; 83be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root newState = data.readString(); 84be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root this.onStorageStateChanged(path, oldState, newState); 85be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root reply.writeNoException(); 86be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root return true; 87be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root } 88be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root } 89be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root return super.onTransact(code, data, reply, flags); 90be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root } 91be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root 92be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root private static class Proxy implements IMountServiceListener { 93be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root private IBinder mRemote; 94be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root 95be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root Proxy(IBinder remote) { 96be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root mRemote = remote; 97be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root } 98be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root 99be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root public IBinder asBinder() { 100be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root return mRemote; 101be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root } 102be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root 103be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root public String getInterfaceDescriptor() { 104be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root return DESCRIPTOR; 105be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root } 106be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root 107be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root /** 108be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root * Detection state of USB Mass Storage has changed 109be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root * 110be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root * @param available true if a UMS host is connected. 111be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root */ 112be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root public void onUsbMassStorageConnectionChanged(boolean connected) throws RemoteException { 113be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root Parcel _data = Parcel.obtain(); 114be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root Parcel _reply = Parcel.obtain(); 115be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root try { 116be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root _data.writeInterfaceToken(DESCRIPTOR); 117be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root _data.writeInt(((connected) ? (1) : (0))); 118be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root mRemote.transact(Stub.TRANSACTION_onUsbMassStorageConnectionChanged, _data, 119be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root _reply, 0); 120be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root _reply.readException(); 121be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root } finally { 122be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root _reply.recycle(); 123be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root _data.recycle(); 124be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root } 125be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root } 126be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root 127be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root /** 128be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root * Storage state has changed. 129be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root * 130be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root * @param path The volume mount path. 131be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root * @param oldState The old state of the volume. 132be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root * @param newState The new state of the volume. Note: State is one 133be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root * of the values returned by 134be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root * Environment.getExternalStorageState() 135be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root */ 136be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root public void onStorageStateChanged(String path, String oldState, String newState) 137be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root throws RemoteException { 138be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root Parcel _data = Parcel.obtain(); 139be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root Parcel _reply = Parcel.obtain(); 140be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root try { 141be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root _data.writeInterfaceToken(DESCRIPTOR); 142be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root _data.writeString(path); 143be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root _data.writeString(oldState); 144be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root _data.writeString(newState); 145be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root mRemote.transact(Stub.TRANSACTION_onStorageStateChanged, _data, _reply, 0); 146be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root _reply.readException(); 147be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root } finally { 148be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root _reply.recycle(); 149be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root _data.recycle(); 150be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root } 151be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root } 152be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root } 153be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root 154be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root static final int TRANSACTION_onUsbMassStorageConnectionChanged = (IBinder.FIRST_CALL_TRANSACTION + 0); 155be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root 156be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root static final int TRANSACTION_onStorageStateChanged = (IBinder.FIRST_CALL_TRANSACTION + 1); 157be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root } 158be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root 159be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root /** 160be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root * Detection state of USB Mass Storage has changed 161be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root * 162be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root * @param available true if a UMS host is connected. 163be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root */ 164be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root public void onUsbMassStorageConnectionChanged(boolean connected) throws RemoteException; 165be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root 166be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root /** 167be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root * Storage state has changed. 168be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root * 169be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root * @param path The volume mount path. 170be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root * @param oldState The old state of the volume. 171be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root * @param newState The new state of the volume. Note: State is one of the 172be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root * values returned by Environment.getExternalStorageState() 173be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root */ 174be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root public void onStorageStateChanged(String path, String oldState, String newState) 175be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root throws RemoteException; 176be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root} 177