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