1be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root/*
2be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root * Copyright (C) 2010 The Android Open Source Project
3be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root *
4be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root * Licensed under the Apache License, Version 2.0 (the "License");
5be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root * you may not use this file except in compliance with the License.
6be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root * You may obtain a copy of the License at
7be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root *
8be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root *      http://www.apache.org/licenses/LICENSE-2.0
9be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root *
10be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root * Unless required by applicable law or agreed to in writing, software
11be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root * distributed under the License is distributed on an "AS IS" BASIS,
12be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root * See the License for the specific language governing permissions and
14be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root * limitations under the License.
15be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root */
16be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root
17be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Rootpackage android.os.storage;
18be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root
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;
24be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root
25be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root/**
26be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root * WARNING! Update IMountService.h and IMountService.cpp if you change this
27be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root * file. In particular, the ordering of the methods below must match the
28be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root * _TRANSACTION enum in IMountService.cpp
29f7b3cd4efd40b7631f36ea014407a850f7dc637eJason parks *
30be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root * @hide - Applications should use android.os.storage.StorageManager to access
31be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root *       storage functions.
32be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root */
33be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Rootpublic interface IMountService extends IInterface {
34be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root    /** Local-side IPC implementation stub class. */
35be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root    public static abstract class Stub extends Binder implements IMountService {
36be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root        private static class Proxy implements IMountService {
37444eca232964dbf27d0c4d01447c1493f89186e0Ben Komalo            private final IBinder mRemote;
38be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root
39be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root            Proxy(IBinder remote) {
40be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root                mRemote = remote;
41be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root            }
42be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root
43be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root            public IBinder asBinder() {
44be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root                return mRemote;
45be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root            }
46be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root
47be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root            public String getInterfaceDescriptor() {
48be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root                return DESCRIPTOR;
49be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root            }
50be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root
51be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root            /**
52be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root             * Registers an IMountServiceListener for receiving async
53be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root             * notifications.
54be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root             */
55be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root            public void registerListener(IMountServiceListener listener) throws RemoteException {
56be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root                Parcel _data = Parcel.obtain();
57be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root                Parcel _reply = Parcel.obtain();
58be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root                try {
59be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root                    _data.writeInterfaceToken(DESCRIPTOR);
60be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root                    _data.writeStrongBinder((listener != null ? listener.asBinder() : null));
61be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root                    mRemote.transact(Stub.TRANSACTION_registerListener, _data, _reply, 0);
62be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root                    _reply.readException();
63be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root                } finally {
64be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root                    _reply.recycle();
65be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root                    _data.recycle();
66be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root                }
67be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root            }
68be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root
69be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root            /**
70be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root             * Unregisters an IMountServiceListener
71be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root             */
72be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root            public void unregisterListener(IMountServiceListener listener) throws RemoteException {
73be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root                Parcel _data = Parcel.obtain();
74be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root                Parcel _reply = Parcel.obtain();
75be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root                try {
76be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root                    _data.writeInterfaceToken(DESCRIPTOR);
77be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root                    _data.writeStrongBinder((listener != null ? listener.asBinder() : null));
78be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root                    mRemote.transact(Stub.TRANSACTION_unregisterListener, _data, _reply, 0);
79be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root                    _reply.readException();
80be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root                } finally {
81be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root                    _reply.recycle();
82be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root                    _data.recycle();
83be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root                }
84be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root            }
85be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root
86be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root            /**
87be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root             * Returns true if a USB mass storage host is connected
88be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root             */
89be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root            public boolean isUsbMassStorageConnected() throws RemoteException {
90be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root                Parcel _data = Parcel.obtain();
91be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root                Parcel _reply = Parcel.obtain();
92be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root                boolean _result;
93be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root                try {
94be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root                    _data.writeInterfaceToken(DESCRIPTOR);
95be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root                    mRemote.transact(Stub.TRANSACTION_isUsbMassStorageConnected, _data, _reply, 0);
96be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root                    _reply.readException();
97be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root                    _result = 0 != _reply.readInt();
98be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root                } finally {
99be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root                    _reply.recycle();
100be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root                    _data.recycle();
101be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root                }
102be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root                return _result;
103be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root            }
104be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root
105be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root            /**
106be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root             * Enables / disables USB mass storage. The caller should check
107be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root             * actual status of enabling/disabling USB mass storage via
108be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root             * StorageEventListener.
109be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root             */
110be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root            public void setUsbMassStorageEnabled(boolean enable) throws RemoteException {
111be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root                Parcel _data = Parcel.obtain();
112be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root                Parcel _reply = Parcel.obtain();
113be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root                try {
114be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root                    _data.writeInterfaceToken(DESCRIPTOR);
115be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root                    _data.writeInt((enable ? 1 : 0));
116be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root                    mRemote.transact(Stub.TRANSACTION_setUsbMassStorageEnabled, _data, _reply, 0);
117be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root                    _reply.readException();
118be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root                } finally {
119be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root                    _reply.recycle();
120be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root                    _data.recycle();
121be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root                }
122be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root            }
123be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root
124be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root            /**
125be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root             * Returns true if a USB mass storage host is enabled (media is
126be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root             * shared)
127be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root             */
128be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root            public boolean isUsbMassStorageEnabled() throws RemoteException {
129be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root                Parcel _data = Parcel.obtain();
130be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root                Parcel _reply = Parcel.obtain();
131be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root                boolean _result;
132be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root                try {
133be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root                    _data.writeInterfaceToken(DESCRIPTOR);
134be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root                    mRemote.transact(Stub.TRANSACTION_isUsbMassStorageEnabled, _data, _reply, 0);
135be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root                    _reply.readException();
136be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root                    _result = 0 != _reply.readInt();
137be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root                } finally {
138be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root                    _reply.recycle();
139be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root                    _data.recycle();
140be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root                }
141be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root                return _result;
142be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root            }
143be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root
144be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root            /**
145be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root             * Mount external storage at given mount point. Returns an int
146be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root             * consistent with MountServiceResultCode
147be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root             */
148be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root            public int mountVolume(String mountPoint) throws RemoteException {
149be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root                Parcel _data = Parcel.obtain();
150be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root                Parcel _reply = Parcel.obtain();
151be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root                int _result;
152be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root                try {
153be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root                    _data.writeInterfaceToken(DESCRIPTOR);
154be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root                    _data.writeString(mountPoint);
155be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root                    mRemote.transact(Stub.TRANSACTION_mountVolume, _data, _reply, 0);
156be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root                    _reply.readException();
157be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root                    _result = _reply.readInt();
158be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root                } finally {
159be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root                    _reply.recycle();
160be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root                    _data.recycle();
161be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root                }
162be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root                return _result;
163be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root            }
164be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root
165be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root            /**
166be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root             * Safely unmount external storage at given mount point. The unmount
167be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root             * is an asynchronous operation. Applications should register
168be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root             * StorageEventListener for storage related status changes.
169be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root             */
17013c7197da8a16f77f6398708a6314c80cb01e0d1Ben Komalo            public void unmountVolume(String mountPoint, boolean force, boolean removeEncryption)
17113c7197da8a16f77f6398708a6314c80cb01e0d1Ben Komalo                    throws RemoteException {
172be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root                Parcel _data = Parcel.obtain();
173be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root                Parcel _reply = Parcel.obtain();
174be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root                try {
175be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root                    _data.writeInterfaceToken(DESCRIPTOR);
176be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root                    _data.writeString(mountPoint);
177be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root                    _data.writeInt((force ? 1 : 0));
17813c7197da8a16f77f6398708a6314c80cb01e0d1Ben Komalo                    _data.writeInt((removeEncryption ? 1 : 0));
179be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root                    mRemote.transact(Stub.TRANSACTION_unmountVolume, _data, _reply, 0);
180be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root                    _reply.readException();
181be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root                } finally {
182be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root                    _reply.recycle();
183be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root                    _data.recycle();
184be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root                }
185be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root            }
186be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root
187be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root            /**
188be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root             * Format external storage given a mount point. Returns an int
189be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root             * consistent with MountServiceResultCode
190be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root             */
191be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root            public int formatVolume(String mountPoint) throws RemoteException {
192be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root                Parcel _data = Parcel.obtain();
193be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root                Parcel _reply = Parcel.obtain();
194be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root                int _result;
195be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root                try {
196be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root                    _data.writeInterfaceToken(DESCRIPTOR);
197be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root                    _data.writeString(mountPoint);
198be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root                    mRemote.transact(Stub.TRANSACTION_formatVolume, _data, _reply, 0);
199be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root                    _reply.readException();
200be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root                    _result = _reply.readInt();
201be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root                } finally {
202be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root                    _reply.recycle();
203be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root                    _data.recycle();
204be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root                }
205be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root                return _result;
206be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root            }
207be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root
208be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root            /**
209be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root             * Returns an array of pids with open files on the specified path.
210be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root             */
211be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root            public int[] getStorageUsers(String path) throws RemoteException {
212be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root                Parcel _data = Parcel.obtain();
213be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root                Parcel _reply = Parcel.obtain();
214be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root                int[] _result;
215be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root                try {
216be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root                    _data.writeInterfaceToken(DESCRIPTOR);
217be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root                    _data.writeString(path);
218be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root                    mRemote.transact(Stub.TRANSACTION_getStorageUsers, _data, _reply, 0);
219be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root                    _reply.readException();
220be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root                    _result = _reply.createIntArray();
221be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root                } finally {
222be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root                    _reply.recycle();
223be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root                    _data.recycle();
224be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root                }
225be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root                return _result;
226be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root            }
227be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root
228be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root            /**
229be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root             * Gets the state of a volume via its mountpoint.
230be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root             */
231be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root            public String getVolumeState(String mountPoint) throws RemoteException {
232be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root                Parcel _data = Parcel.obtain();
233be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root                Parcel _reply = Parcel.obtain();
234be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root                String _result;
235be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root                try {
236be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root                    _data.writeInterfaceToken(DESCRIPTOR);
237be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root                    _data.writeString(mountPoint);
238be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root                    mRemote.transact(Stub.TRANSACTION_getVolumeState, _data, _reply, 0);
239be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root                    _reply.readException();
240be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root                    _result = _reply.readString();
241be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root                } finally {
242be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root                    _reply.recycle();
243be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root                    _data.recycle();
244be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root                }
245be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root                return _result;
246be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root            }
247be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root
248be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root            /*
249be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root             * Creates a secure container with the specified parameters. Returns
250be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root             * an int consistent with MountServiceResultCode
251be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root             */
252be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root            public int createSecureContainer(String id, int sizeMb, String fstype, String key,
2536dceb88f1c7c42c6ab43834af2c993d599895d82Kenny Root                    int ownerUid, boolean external) throws RemoteException {
254be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root                Parcel _data = Parcel.obtain();
255be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root                Parcel _reply = Parcel.obtain();
256be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root                int _result;
257be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root                try {
258be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root                    _data.writeInterfaceToken(DESCRIPTOR);
259be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root                    _data.writeString(id);
260be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root                    _data.writeInt(sizeMb);
261be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root                    _data.writeString(fstype);
262be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root                    _data.writeString(key);
263be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root                    _data.writeInt(ownerUid);
2646dceb88f1c7c42c6ab43834af2c993d599895d82Kenny Root                    _data.writeInt(external ? 1 : 0);
265be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root                    mRemote.transact(Stub.TRANSACTION_createSecureContainer, _data, _reply, 0);
266be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root                    _reply.readException();
267be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root                    _result = _reply.readInt();
268be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root                } finally {
269be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root                    _reply.recycle();
270be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root                    _data.recycle();
271be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root                }
272be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root                return _result;
273be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root            }
274be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root
275be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root            /*
276be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root             * Destroy a secure container, and free up all resources associated
277be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root             * with it. NOTE: Ensure all references are released prior to
278be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root             * deleting. Returns an int consistent with MountServiceResultCode
279be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root             */
280be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root            public int destroySecureContainer(String id, boolean force) throws RemoteException {
281be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root                Parcel _data = Parcel.obtain();
282be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root                Parcel _reply = Parcel.obtain();
283be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root                int _result;
284be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root                try {
285be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root                    _data.writeInterfaceToken(DESCRIPTOR);
286be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root                    _data.writeString(id);
287be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root                    _data.writeInt((force ? 1 : 0));
288be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root                    mRemote.transact(Stub.TRANSACTION_destroySecureContainer, _data, _reply, 0);
289be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root                    _reply.readException();
290be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root                    _result = _reply.readInt();
291be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root                } finally {
292be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root                    _reply.recycle();
293be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root                    _data.recycle();
294be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root                }
295be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root                return _result;
296be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root            }
297be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root
298be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root            /*
299be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root             * Finalize a container which has just been created and populated.
300be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root             * After finalization, the container is immutable. Returns an int
301be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root             * consistent with MountServiceResultCode
302be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root             */
303be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root            public int finalizeSecureContainer(String id) throws RemoteException {
304be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root                Parcel _data = Parcel.obtain();
305be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root                Parcel _reply = Parcel.obtain();
306be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root                int _result;
307be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root                try {
308be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root                    _data.writeInterfaceToken(DESCRIPTOR);
309be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root                    _data.writeString(id);
310be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root                    mRemote.transact(Stub.TRANSACTION_finalizeSecureContainer, _data, _reply, 0);
311be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root                    _reply.readException();
312be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root                    _result = _reply.readInt();
313be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root                } finally {
314be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root                    _reply.recycle();
315be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root                    _data.recycle();
316be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root                }
317be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root                return _result;
318be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root            }
319be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root
320be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root            /*
321be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root             * Mount a secure container with the specified key and owner UID.
322be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root             * Returns an int consistent with MountServiceResultCode
323be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root             */
324941a8ba1a6043cf84a7bf622e44a0b4f7abd0178Jeff Sharkey            public int mountSecureContainer(String id, String key, int ownerUid, boolean readOnly)
325be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root                    throws RemoteException {
326be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root                Parcel _data = Parcel.obtain();
327be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root                Parcel _reply = Parcel.obtain();
328be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root                int _result;
329be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root                try {
330be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root                    _data.writeInterfaceToken(DESCRIPTOR);
331be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root                    _data.writeString(id);
332be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root                    _data.writeString(key);
333be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root                    _data.writeInt(ownerUid);
334941a8ba1a6043cf84a7bf622e44a0b4f7abd0178Jeff Sharkey                    _data.writeInt(readOnly ? 1 : 0);
335be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root                    mRemote.transact(Stub.TRANSACTION_mountSecureContainer, _data, _reply, 0);
336be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root                    _reply.readException();
337be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root                    _result = _reply.readInt();
338be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root                } finally {
339be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root                    _reply.recycle();
340be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root                    _data.recycle();
341be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root                }
342be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root                return _result;
343be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root            }
344be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root
345be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root            /*
346be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root             * Unount a secure container. Returns an int consistent with
347be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root             * MountServiceResultCode
348be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root             */
349be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root            public int unmountSecureContainer(String id, boolean force) throws RemoteException {
350be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root                Parcel _data = Parcel.obtain();
351be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root                Parcel _reply = Parcel.obtain();
352be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root                int _result;
353be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root                try {
354be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root                    _data.writeInterfaceToken(DESCRIPTOR);
355be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root                    _data.writeString(id);
356be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root                    _data.writeInt((force ? 1 : 0));
357be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root                    mRemote.transact(Stub.TRANSACTION_unmountSecureContainer, _data, _reply, 0);
358be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root                    _reply.readException();
359be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root                    _result = _reply.readInt();
360be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root                } finally {
361be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root                    _reply.recycle();
362be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root                    _data.recycle();
363be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root                }
364be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root                return _result;
365be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root            }
366be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root
367be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root            /*
368be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root             * Returns true if the specified container is mounted
369be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root             */
370be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root            public boolean isSecureContainerMounted(String id) throws RemoteException {
371be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root                Parcel _data = Parcel.obtain();
372be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root                Parcel _reply = Parcel.obtain();
373be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root                boolean _result;
374be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root                try {
375be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root                    _data.writeInterfaceToken(DESCRIPTOR);
376be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root                    _data.writeString(id);
377be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root                    mRemote.transact(Stub.TRANSACTION_isSecureContainerMounted, _data, _reply, 0);
378be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root                    _reply.readException();
379be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root                    _result = 0 != _reply.readInt();
380be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root                } finally {
381be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root                    _reply.recycle();
382be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root                    _data.recycle();
383be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root                }
384be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root                return _result;
385be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root            }
386be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root
387be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root            /*
388be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root             * Rename an unmounted secure container. Returns an int consistent
389be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root             * with MountServiceResultCode
390be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root             */
391be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root            public int renameSecureContainer(String oldId, String newId) throws RemoteException {
392be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root                Parcel _data = Parcel.obtain();
393be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root                Parcel _reply = Parcel.obtain();
394be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root                int _result;
395be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root                try {
396be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root                    _data.writeInterfaceToken(DESCRIPTOR);
397be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root                    _data.writeString(oldId);
398be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root                    _data.writeString(newId);
399be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root                    mRemote.transact(Stub.TRANSACTION_renameSecureContainer, _data, _reply, 0);
400be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root                    _reply.readException();
401be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root                    _result = _reply.readInt();
402be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root                } finally {
403be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root                    _reply.recycle();
404be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root                    _data.recycle();
405be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root                }
406be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root                return _result;
407be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root            }
408be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root
409be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root            /*
410be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root             * Returns the filesystem path of a mounted secure container.
411be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root             */
412be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root            public String getSecureContainerPath(String id) throws RemoteException {
413be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root                Parcel _data = Parcel.obtain();
414be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root                Parcel _reply = Parcel.obtain();
415be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root                String _result;
416be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root                try {
417be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root                    _data.writeInterfaceToken(DESCRIPTOR);
418be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root                    _data.writeString(id);
419be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root                    mRemote.transact(Stub.TRANSACTION_getSecureContainerPath, _data, _reply, 0);
420be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root                    _reply.readException();
421be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root                    _result = _reply.readString();
422be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root                } finally {
423be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root                    _reply.recycle();
424be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root                    _data.recycle();
425be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root                }
426be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root                return _result;
427be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root            }
428be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root
429be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root            /**
430be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root             * Gets an Array of currently known secure container IDs
431be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root             */
432be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root            public String[] getSecureContainerList() throws RemoteException {
433be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root                Parcel _data = Parcel.obtain();
434be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root                Parcel _reply = Parcel.obtain();
435be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root                String[] _result;
436be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root                try {
437be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root                    _data.writeInterfaceToken(DESCRIPTOR);
438be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root                    mRemote.transact(Stub.TRANSACTION_getSecureContainerList, _data, _reply, 0);
439be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root                    _reply.readException();
440be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root                    _result = _reply.createStringArray();
441be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root                } finally {
442be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root                    _reply.recycle();
443be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root                    _data.recycle();
444be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root                }
445be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root                return _result;
446be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root            }
447be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root
448be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root            /**
449be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root             * Shuts down the MountService and gracefully unmounts all external
450be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root             * media. Invokes call back once the shutdown is complete.
451be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root             */
452be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root            public void shutdown(IMountShutdownObserver observer)
453be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root                    throws RemoteException {
454be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root                Parcel _data = Parcel.obtain();
455be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root                Parcel _reply = Parcel.obtain();
456be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root                try {
457be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root                    _data.writeInterfaceToken(DESCRIPTOR);
458be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root                    _data.writeStrongBinder((observer != null ? observer.asBinder() : null));
459be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root                    mRemote.transact(Stub.TRANSACTION_shutdown, _data, _reply, 0);
460be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root                    _reply.readException();
461be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root                } finally {
462be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root                    _reply.recycle();
463be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root                    _data.recycle();
464be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root                }
465be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root            }
466be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root
467be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root            /**
468be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root             * Call into MountService by PackageManager to notify that its done
469be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root             * processing the media status update request.
470be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root             */
471be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root            public void finishMediaUpdate() throws RemoteException {
472be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root                Parcel _data = Parcel.obtain();
473be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root                Parcel _reply = Parcel.obtain();
474be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root                try {
475be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root                    _data.writeInterfaceToken(DESCRIPTOR);
476be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root                    mRemote.transact(Stub.TRANSACTION_finishMediaUpdate, _data, _reply, 0);
477be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root                    _reply.readException();
478be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root                } finally {
479be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root                    _reply.recycle();
480be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root                    _data.recycle();
481be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root                }
482be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root            }
483be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root
484be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root            /**
485be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root             * Mounts an Opaque Binary Blob (OBB) with the specified decryption
486be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root             * key and only allows the calling process's UID access to the
487be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root             * contents. MountService will call back to the supplied
488be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root             * IObbActionListener to inform it of the terminal state of the
489be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root             * call.
490be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root             */
4914fbbda4cecb078bd3867f416b02cc75f5455284fJeff Sharkey            public void mountObb(String rawPath, String canonicalPath, String key,
4924fbbda4cecb078bd3867f416b02cc75f5455284fJeff Sharkey                    IObbActionListener token, int nonce) throws RemoteException {
493be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root                Parcel _data = Parcel.obtain();
494be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root                Parcel _reply = Parcel.obtain();
495be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root                try {
496be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root                    _data.writeInterfaceToken(DESCRIPTOR);
4974fbbda4cecb078bd3867f416b02cc75f5455284fJeff Sharkey                    _data.writeString(rawPath);
4984fbbda4cecb078bd3867f416b02cc75f5455284fJeff Sharkey                    _data.writeString(canonicalPath);
499be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root                    _data.writeString(key);
500be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root                    _data.writeStrongBinder((token != null ? token.asBinder() : null));
501af9d667ccf3e24058214cf4cc0a8aa8bc5100e3cKenny Root                    _data.writeInt(nonce);
502be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root                    mRemote.transact(Stub.TRANSACTION_mountObb, _data, _reply, 0);
503be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root                    _reply.readException();
504be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root                } finally {
505be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root                    _reply.recycle();
506be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root                    _data.recycle();
507be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root                }
508be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root            }
509be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root
510be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root            /**
511be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root             * Unmounts an Opaque Binary Blob (OBB). When the force flag is
512be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root             * specified, any program using it will be forcibly killed to
513be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root             * unmount the image. MountService will call back to the supplied
514be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root             * IObbActionListener to inform it of the terminal state of the
515be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root             * call.
516be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root             */
5174fbbda4cecb078bd3867f416b02cc75f5455284fJeff Sharkey            public void unmountObb(
5184fbbda4cecb078bd3867f416b02cc75f5455284fJeff Sharkey                    String rawPath, boolean force, IObbActionListener token, int nonce)
5194fbbda4cecb078bd3867f416b02cc75f5455284fJeff Sharkey                    throws RemoteException {
520be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root                Parcel _data = Parcel.obtain();
521be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root                Parcel _reply = Parcel.obtain();
522be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root                try {
523be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root                    _data.writeInterfaceToken(DESCRIPTOR);
5244fbbda4cecb078bd3867f416b02cc75f5455284fJeff Sharkey                    _data.writeString(rawPath);
525be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root                    _data.writeInt((force ? 1 : 0));
526be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root                    _data.writeStrongBinder((token != null ? token.asBinder() : null));
527af9d667ccf3e24058214cf4cc0a8aa8bc5100e3cKenny Root                    _data.writeInt(nonce);
528be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root                    mRemote.transact(Stub.TRANSACTION_unmountObb, _data, _reply, 0);
529be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root                    _reply.readException();
530be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root                } finally {
531be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root                    _reply.recycle();
532be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root                    _data.recycle();
533be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root                }
534be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root            }
535be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root
536be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root            /**
537be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root             * Checks whether the specified Opaque Binary Blob (OBB) is mounted
538be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root             * somewhere.
539be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root             */
5404fbbda4cecb078bd3867f416b02cc75f5455284fJeff Sharkey            public boolean isObbMounted(String rawPath) throws RemoteException {
541be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root                Parcel _data = Parcel.obtain();
542be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root                Parcel _reply = Parcel.obtain();
543be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root                boolean _result;
544be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root                try {
545be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root                    _data.writeInterfaceToken(DESCRIPTOR);
5464fbbda4cecb078bd3867f416b02cc75f5455284fJeff Sharkey                    _data.writeString(rawPath);
547be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root                    mRemote.transact(Stub.TRANSACTION_isObbMounted, _data, _reply, 0);
548be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root                    _reply.readException();
549be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root                    _result = 0 != _reply.readInt();
550be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root                } finally {
551be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root                    _reply.recycle();
552be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root                    _data.recycle();
553be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root                }
554be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root                return _result;
555be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root            }
556be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root
557be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root            /**
558be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root             * Gets the path to the mounted Opaque Binary Blob (OBB).
559be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root             */
5604fbbda4cecb078bd3867f416b02cc75f5455284fJeff Sharkey            public String getMountedObbPath(String rawPath) throws RemoteException {
561be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root                Parcel _data = Parcel.obtain();
562be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root                Parcel _reply = Parcel.obtain();
563be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root                String _result;
564be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root                try {
565be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root                    _data.writeInterfaceToken(DESCRIPTOR);
5664fbbda4cecb078bd3867f416b02cc75f5455284fJeff Sharkey                    _data.writeString(rawPath);
567be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root                    mRemote.transact(Stub.TRANSACTION_getMountedObbPath, _data, _reply, 0);
568be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root                    _reply.readException();
569be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root                    _result = _reply.readString();
570be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root                } finally {
571be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root                    _reply.recycle();
572be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root                    _data.recycle();
573be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root                }
574be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root                return _result;
575be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root            }
576e1ff214e32ed5c546a7603b07b054908c4d93312Kenny Root
577e1ff214e32ed5c546a7603b07b054908c4d93312Kenny Root            /**
578e1ff214e32ed5c546a7603b07b054908c4d93312Kenny Root             * Returns whether the external storage is emulated.
579e1ff214e32ed5c546a7603b07b054908c4d93312Kenny Root             */
580e1ff214e32ed5c546a7603b07b054908c4d93312Kenny Root            public boolean isExternalStorageEmulated() throws RemoteException {
581e1ff214e32ed5c546a7603b07b054908c4d93312Kenny Root                Parcel _data = Parcel.obtain();
582e1ff214e32ed5c546a7603b07b054908c4d93312Kenny Root                Parcel _reply = Parcel.obtain();
583e1ff214e32ed5c546a7603b07b054908c4d93312Kenny Root                boolean _result;
584e1ff214e32ed5c546a7603b07b054908c4d93312Kenny Root                try {
585e1ff214e32ed5c546a7603b07b054908c4d93312Kenny Root                    _data.writeInterfaceToken(DESCRIPTOR);
586e1ff214e32ed5c546a7603b07b054908c4d93312Kenny Root                    mRemote.transact(Stub.TRANSACTION_isExternalStorageEmulated, _data, _reply, 0);
587e1ff214e32ed5c546a7603b07b054908c4d93312Kenny Root                    _reply.readException();
588e1ff214e32ed5c546a7603b07b054908c4d93312Kenny Root                    _result = 0 != _reply.readInt();
589e1ff214e32ed5c546a7603b07b054908c4d93312Kenny Root                } finally {
590e1ff214e32ed5c546a7603b07b054908c4d93312Kenny Root                    _reply.recycle();
591e1ff214e32ed5c546a7603b07b054908c4d93312Kenny Root                    _data.recycle();
592e1ff214e32ed5c546a7603b07b054908c4d93312Kenny Root                }
593e1ff214e32ed5c546a7603b07b054908c4d93312Kenny Root                return _result;
594e1ff214e32ed5c546a7603b07b054908c4d93312Kenny Root            }
5955af0b916f850486cff4797355bf9e7dc3352fe00Jason parks
596444eca232964dbf27d0c4d01447c1493f89186e0Ben Komalo            public int getEncryptionState() throws RemoteException {
597444eca232964dbf27d0c4d01447c1493f89186e0Ben Komalo                Parcel _data = Parcel.obtain();
598444eca232964dbf27d0c4d01447c1493f89186e0Ben Komalo                Parcel _reply = Parcel.obtain();
599444eca232964dbf27d0c4d01447c1493f89186e0Ben Komalo                int _result;
600444eca232964dbf27d0c4d01447c1493f89186e0Ben Komalo                try {
601444eca232964dbf27d0c4d01447c1493f89186e0Ben Komalo                    _data.writeInterfaceToken(DESCRIPTOR);
602444eca232964dbf27d0c4d01447c1493f89186e0Ben Komalo                    mRemote.transact(Stub.TRANSACTION_getEncryptionState, _data, _reply, 0);
603444eca232964dbf27d0c4d01447c1493f89186e0Ben Komalo                    _reply.readException();
604444eca232964dbf27d0c4d01447c1493f89186e0Ben Komalo                    _result = _reply.readInt();
605444eca232964dbf27d0c4d01447c1493f89186e0Ben Komalo                } finally {
606444eca232964dbf27d0c4d01447c1493f89186e0Ben Komalo                    _reply.recycle();
607444eca232964dbf27d0c4d01447c1493f89186e0Ben Komalo                    _data.recycle();
608444eca232964dbf27d0c4d01447c1493f89186e0Ben Komalo                }
609444eca232964dbf27d0c4d01447c1493f89186e0Ben Komalo                return _result;
610444eca232964dbf27d0c4d01447c1493f89186e0Ben Komalo            }
611444eca232964dbf27d0c4d01447c1493f89186e0Ben Komalo
6125af0b916f850486cff4797355bf9e7dc3352fe00Jason parks            public int decryptStorage(String password) throws RemoteException {
6135af0b916f850486cff4797355bf9e7dc3352fe00Jason parks                Parcel _data = Parcel.obtain();
6145af0b916f850486cff4797355bf9e7dc3352fe00Jason parks                Parcel _reply = Parcel.obtain();
6155af0b916f850486cff4797355bf9e7dc3352fe00Jason parks                int _result;
6165af0b916f850486cff4797355bf9e7dc3352fe00Jason parks                try {
6175af0b916f850486cff4797355bf9e7dc3352fe00Jason parks                    _data.writeInterfaceToken(DESCRIPTOR);
6185af0b916f850486cff4797355bf9e7dc3352fe00Jason parks                    _data.writeString(password);
6195af0b916f850486cff4797355bf9e7dc3352fe00Jason parks                    mRemote.transact(Stub.TRANSACTION_decryptStorage, _data, _reply, 0);
6205af0b916f850486cff4797355bf9e7dc3352fe00Jason parks                    _reply.readException();
6215af0b916f850486cff4797355bf9e7dc3352fe00Jason parks                    _result = _reply.readInt();
6225af0b916f850486cff4797355bf9e7dc3352fe00Jason parks                } finally {
6235af0b916f850486cff4797355bf9e7dc3352fe00Jason parks                    _reply.recycle();
6245af0b916f850486cff4797355bf9e7dc3352fe00Jason parks                    _data.recycle();
6255af0b916f850486cff4797355bf9e7dc3352fe00Jason parks                }
6265af0b916f850486cff4797355bf9e7dc3352fe00Jason parks                return _result;
6275af0b916f850486cff4797355bf9e7dc3352fe00Jason parks            }
62856aa5321fe6f00fa3662e6f46a4b2559aa34f63eJason parks
62946791e752ca1eca35e6a882c47d7de7f4f66687cPaul Lawrence            public int encryptStorage(int type, String password) throws RemoteException {
63056aa5321fe6f00fa3662e6f46a4b2559aa34f63eJason parks                Parcel _data = Parcel.obtain();
63156aa5321fe6f00fa3662e6f46a4b2559aa34f63eJason parks                Parcel _reply = Parcel.obtain();
63256aa5321fe6f00fa3662e6f46a4b2559aa34f63eJason parks                int _result;
63356aa5321fe6f00fa3662e6f46a4b2559aa34f63eJason parks                try {
63456aa5321fe6f00fa3662e6f46a4b2559aa34f63eJason parks                    _data.writeInterfaceToken(DESCRIPTOR);
63546791e752ca1eca35e6a882c47d7de7f4f66687cPaul Lawrence                    _data.writeInt(type);
63656aa5321fe6f00fa3662e6f46a4b2559aa34f63eJason parks                    _data.writeString(password);
63756aa5321fe6f00fa3662e6f46a4b2559aa34f63eJason parks                    mRemote.transact(Stub.TRANSACTION_encryptStorage, _data, _reply, 0);
63856aa5321fe6f00fa3662e6f46a4b2559aa34f63eJason parks                    _reply.readException();
63956aa5321fe6f00fa3662e6f46a4b2559aa34f63eJason parks                    _result = _reply.readInt();
64056aa5321fe6f00fa3662e6f46a4b2559aa34f63eJason parks                } finally {
64156aa5321fe6f00fa3662e6f46a4b2559aa34f63eJason parks                    _reply.recycle();
64256aa5321fe6f00fa3662e6f46a4b2559aa34f63eJason parks                    _data.recycle();
64356aa5321fe6f00fa3662e6f46a4b2559aa34f63eJason parks                }
64456aa5321fe6f00fa3662e6f46a4b2559aa34f63eJason parks                return _result;
64556aa5321fe6f00fa3662e6f46a4b2559aa34f63eJason parks            }
646f7b3cd4efd40b7631f36ea014407a850f7dc637eJason parks
6478e39736f91a08961cf59c87075e61d9026833b50Paul Lawrence            public int changeEncryptionPassword(int type, String password) throws RemoteException {
648f7b3cd4efd40b7631f36ea014407a850f7dc637eJason parks                Parcel _data = Parcel.obtain();
649f7b3cd4efd40b7631f36ea014407a850f7dc637eJason parks                Parcel _reply = Parcel.obtain();
650f7b3cd4efd40b7631f36ea014407a850f7dc637eJason parks                int _result;
651f7b3cd4efd40b7631f36ea014407a850f7dc637eJason parks                try {
652f7b3cd4efd40b7631f36ea014407a850f7dc637eJason parks                    _data.writeInterfaceToken(DESCRIPTOR);
6538e39736f91a08961cf59c87075e61d9026833b50Paul Lawrence                    _data.writeInt(type);
654f7b3cd4efd40b7631f36ea014407a850f7dc637eJason parks                    _data.writeString(password);
655f7b3cd4efd40b7631f36ea014407a850f7dc637eJason parks                    mRemote.transact(Stub.TRANSACTION_changeEncryptionPassword, _data, _reply, 0);
656f7b3cd4efd40b7631f36ea014407a850f7dc637eJason parks                    _reply.readException();
657f7b3cd4efd40b7631f36ea014407a850f7dc637eJason parks                    _result = _reply.readInt();
658f7b3cd4efd40b7631f36ea014407a850f7dc637eJason parks                } finally {
659f7b3cd4efd40b7631f36ea014407a850f7dc637eJason parks                    _reply.recycle();
660f7b3cd4efd40b7631f36ea014407a850f7dc637eJason parks                    _data.recycle();
661f7b3cd4efd40b7631f36ea014407a850f7dc637eJason parks                }
662f7b3cd4efd40b7631f36ea014407a850f7dc637eJason parks                return _result;
663f7b3cd4efd40b7631f36ea014407a850f7dc637eJason parks            }
664d967f4664f40f9a4c5262a44b19df9bbdf457d8aMike Lockwood
66532418be49e5b61c2e9281528cb8fb67939e301e8Christopher Tate            @Override
66632418be49e5b61c2e9281528cb8fb67939e301e8Christopher Tate            public int verifyEncryptionPassword(String password) throws RemoteException {
66732418be49e5b61c2e9281528cb8fb67939e301e8Christopher Tate                Parcel _data = Parcel.obtain();
66832418be49e5b61c2e9281528cb8fb67939e301e8Christopher Tate                Parcel _reply = Parcel.obtain();
66932418be49e5b61c2e9281528cb8fb67939e301e8Christopher Tate                int _result;
67032418be49e5b61c2e9281528cb8fb67939e301e8Christopher Tate                try {
67132418be49e5b61c2e9281528cb8fb67939e301e8Christopher Tate                    _data.writeInterfaceToken(DESCRIPTOR);
67232418be49e5b61c2e9281528cb8fb67939e301e8Christopher Tate                    _data.writeString(password);
67332418be49e5b61c2e9281528cb8fb67939e301e8Christopher Tate                    mRemote.transact(Stub.TRANSACTION_verifyEncryptionPassword, _data, _reply, 0);
67432418be49e5b61c2e9281528cb8fb67939e301e8Christopher Tate                    _reply.readException();
67532418be49e5b61c2e9281528cb8fb67939e301e8Christopher Tate                    _result = _reply.readInt();
67632418be49e5b61c2e9281528cb8fb67939e301e8Christopher Tate                } finally {
67732418be49e5b61c2e9281528cb8fb67939e301e8Christopher Tate                    _reply.recycle();
67832418be49e5b61c2e9281528cb8fb67939e301e8Christopher Tate                    _data.recycle();
67932418be49e5b61c2e9281528cb8fb67939e301e8Christopher Tate                }
68032418be49e5b61c2e9281528cb8fb67939e301e8Christopher Tate                return _result;
68132418be49e5b61c2e9281528cb8fb67939e301e8Christopher Tate            }
68232418be49e5b61c2e9281528cb8fb67939e301e8Christopher Tate
6838e39736f91a08961cf59c87075e61d9026833b50Paul Lawrence            public int getPasswordType() throws RemoteException {
6848e39736f91a08961cf59c87075e61d9026833b50Paul Lawrence                Parcel _data = Parcel.obtain();
6858e39736f91a08961cf59c87075e61d9026833b50Paul Lawrence                Parcel _reply = Parcel.obtain();
6868e39736f91a08961cf59c87075e61d9026833b50Paul Lawrence                int _result;
6878e39736f91a08961cf59c87075e61d9026833b50Paul Lawrence                try {
6888e39736f91a08961cf59c87075e61d9026833b50Paul Lawrence                    _data.writeInterfaceToken(DESCRIPTOR);
6898e39736f91a08961cf59c87075e61d9026833b50Paul Lawrence                    mRemote.transact(Stub.TRANSACTION_getPasswordType, _data, _reply, 0);
6908e39736f91a08961cf59c87075e61d9026833b50Paul Lawrence                    _reply.readException();
6918e39736f91a08961cf59c87075e61d9026833b50Paul Lawrence                    _result = _reply.readInt();
6928e39736f91a08961cf59c87075e61d9026833b50Paul Lawrence                } finally {
6938e39736f91a08961cf59c87075e61d9026833b50Paul Lawrence                    _reply.recycle();
6948e39736f91a08961cf59c87075e61d9026833b50Paul Lawrence                    _data.recycle();
6958e39736f91a08961cf59c87075e61d9026833b50Paul Lawrence                }
6968e39736f91a08961cf59c87075e61d9026833b50Paul Lawrence                return _result;
6978e39736f91a08961cf59c87075e61d9026833b50Paul Lawrence            }
6988e39736f91a08961cf59c87075e61d9026833b50Paul Lawrence
699945490c12e32b1c13b9097c00702558260b2011fPaul Lawrence            public String getPassword() throws RemoteException {
700945490c12e32b1c13b9097c00702558260b2011fPaul Lawrence                Parcel _data = Parcel.obtain();
701945490c12e32b1c13b9097c00702558260b2011fPaul Lawrence                Parcel _reply = Parcel.obtain();
702945490c12e32b1c13b9097c00702558260b2011fPaul Lawrence                String _result;
703945490c12e32b1c13b9097c00702558260b2011fPaul Lawrence                try {
704945490c12e32b1c13b9097c00702558260b2011fPaul Lawrence                    _data.writeInterfaceToken(DESCRIPTOR);
705945490c12e32b1c13b9097c00702558260b2011fPaul Lawrence                    mRemote.transact(Stub.TRANSACTION_getPassword, _data, _reply, 0);
706945490c12e32b1c13b9097c00702558260b2011fPaul Lawrence                    _reply.readException();
707945490c12e32b1c13b9097c00702558260b2011fPaul Lawrence                    _result = _reply.readString();
708945490c12e32b1c13b9097c00702558260b2011fPaul Lawrence                } finally {
709945490c12e32b1c13b9097c00702558260b2011fPaul Lawrence                    _reply.recycle();
710945490c12e32b1c13b9097c00702558260b2011fPaul Lawrence                    _data.recycle();
711945490c12e32b1c13b9097c00702558260b2011fPaul Lawrence                }
712945490c12e32b1c13b9097c00702558260b2011fPaul Lawrence                return _result;
713945490c12e32b1c13b9097c00702558260b2011fPaul Lawrence            }
714945490c12e32b1c13b9097c00702558260b2011fPaul Lawrence
715945490c12e32b1c13b9097c00702558260b2011fPaul Lawrence            public void clearPassword() throws RemoteException {
716945490c12e32b1c13b9097c00702558260b2011fPaul Lawrence                Parcel _data = Parcel.obtain();
717945490c12e32b1c13b9097c00702558260b2011fPaul Lawrence                Parcel _reply = Parcel.obtain();
718e51dcf98a4ddb1340cffba88059ad89f0b90909aPaul Lawrence                try {
719e51dcf98a4ddb1340cffba88059ad89f0b90909aPaul Lawrence                    _data.writeInterfaceToken(DESCRIPTOR);
720e51dcf98a4ddb1340cffba88059ad89f0b90909aPaul Lawrence                    mRemote.transact(Stub.TRANSACTION_clearPassword, _data, _reply, IBinder.FLAG_ONEWAY);
721e51dcf98a4ddb1340cffba88059ad89f0b90909aPaul Lawrence                    _reply.readException();
722e51dcf98a4ddb1340cffba88059ad89f0b90909aPaul Lawrence                } finally {
723e51dcf98a4ddb1340cffba88059ad89f0b90909aPaul Lawrence                    _reply.recycle();
724e51dcf98a4ddb1340cffba88059ad89f0b90909aPaul Lawrence                    _data.recycle();
725e51dcf98a4ddb1340cffba88059ad89f0b90909aPaul Lawrence                }
726e51dcf98a4ddb1340cffba88059ad89f0b90909aPaul Lawrence            }
727e51dcf98a4ddb1340cffba88059ad89f0b90909aPaul Lawrence
728e51dcf98a4ddb1340cffba88059ad89f0b90909aPaul Lawrence            public void setField(String field, String data) throws RemoteException {
729e51dcf98a4ddb1340cffba88059ad89f0b90909aPaul Lawrence                Parcel _data = Parcel.obtain();
730e51dcf98a4ddb1340cffba88059ad89f0b90909aPaul Lawrence                Parcel _reply = Parcel.obtain();
731e51dcf98a4ddb1340cffba88059ad89f0b90909aPaul Lawrence                try {
732e51dcf98a4ddb1340cffba88059ad89f0b90909aPaul Lawrence                    _data.writeInterfaceToken(DESCRIPTOR);
733e51dcf98a4ddb1340cffba88059ad89f0b90909aPaul Lawrence                    _data.writeString(field);
734e51dcf98a4ddb1340cffba88059ad89f0b90909aPaul Lawrence                    _data.writeString(data);
735e51dcf98a4ddb1340cffba88059ad89f0b90909aPaul Lawrence                    mRemote.transact(Stub.TRANSACTION_setField, _data, _reply, IBinder.FLAG_ONEWAY);
736e51dcf98a4ddb1340cffba88059ad89f0b90909aPaul Lawrence                    _reply.readException();
737e51dcf98a4ddb1340cffba88059ad89f0b90909aPaul Lawrence                } finally {
738e51dcf98a4ddb1340cffba88059ad89f0b90909aPaul Lawrence                    _reply.recycle();
739e51dcf98a4ddb1340cffba88059ad89f0b90909aPaul Lawrence                    _data.recycle();
740e51dcf98a4ddb1340cffba88059ad89f0b90909aPaul Lawrence                }
741e51dcf98a4ddb1340cffba88059ad89f0b90909aPaul Lawrence            }
742e51dcf98a4ddb1340cffba88059ad89f0b90909aPaul Lawrence
743e51dcf98a4ddb1340cffba88059ad89f0b90909aPaul Lawrence            public String getField(String field) throws RemoteException {
744e51dcf98a4ddb1340cffba88059ad89f0b90909aPaul Lawrence                Parcel _data = Parcel.obtain();
745e51dcf98a4ddb1340cffba88059ad89f0b90909aPaul Lawrence                Parcel _reply = Parcel.obtain();
746945490c12e32b1c13b9097c00702558260b2011fPaul Lawrence                String _result;
747945490c12e32b1c13b9097c00702558260b2011fPaul Lawrence                try {
748945490c12e32b1c13b9097c00702558260b2011fPaul Lawrence                    _data.writeInterfaceToken(DESCRIPTOR);
749e51dcf98a4ddb1340cffba88059ad89f0b90909aPaul Lawrence                    _data.writeString(field);
750e51dcf98a4ddb1340cffba88059ad89f0b90909aPaul Lawrence                    mRemote.transact(Stub.TRANSACTION_getField, _data, _reply, 0);
751945490c12e32b1c13b9097c00702558260b2011fPaul Lawrence                    _reply.readException();
752e51dcf98a4ddb1340cffba88059ad89f0b90909aPaul Lawrence                    _result = _reply.readString();
753945490c12e32b1c13b9097c00702558260b2011fPaul Lawrence                } finally {
754945490c12e32b1c13b9097c00702558260b2011fPaul Lawrence                    _reply.recycle();
755945490c12e32b1c13b9097c00702558260b2011fPaul Lawrence                    _data.recycle();
756945490c12e32b1c13b9097c00702558260b2011fPaul Lawrence                }
757e51dcf98a4ddb1340cffba88059ad89f0b90909aPaul Lawrence                return _result;
758945490c12e32b1c13b9097c00702558260b2011fPaul Lawrence            }
759945490c12e32b1c13b9097c00702558260b2011fPaul Lawrence
760b049e212ab7fe8967893c202efcb30fecfdb82fbJeff Sharkey            public StorageVolume[] getVolumeList() throws RemoteException {
761d967f4664f40f9a4c5262a44b19df9bbdf457d8aMike Lockwood                Parcel _data = Parcel.obtain();
762d967f4664f40f9a4c5262a44b19df9bbdf457d8aMike Lockwood                Parcel _reply = Parcel.obtain();
763b049e212ab7fe8967893c202efcb30fecfdb82fbJeff Sharkey                StorageVolume[] _result;
764d967f4664f40f9a4c5262a44b19df9bbdf457d8aMike Lockwood                try {
765d967f4664f40f9a4c5262a44b19df9bbdf457d8aMike Lockwood                    _data.writeInterfaceToken(DESCRIPTOR);
766d967f4664f40f9a4c5262a44b19df9bbdf457d8aMike Lockwood                    mRemote.transact(Stub.TRANSACTION_getVolumeList, _data, _reply, 0);
767d967f4664f40f9a4c5262a44b19df9bbdf457d8aMike Lockwood                    _reply.readException();
768b049e212ab7fe8967893c202efcb30fecfdb82fbJeff Sharkey                    _result = _reply.createTypedArray(StorageVolume.CREATOR);
769d967f4664f40f9a4c5262a44b19df9bbdf457d8aMike Lockwood                } finally {
770d967f4664f40f9a4c5262a44b19df9bbdf457d8aMike Lockwood                    _reply.recycle();
771d967f4664f40f9a4c5262a44b19df9bbdf457d8aMike Lockwood                    _data.recycle();
772d967f4664f40f9a4c5262a44b19df9bbdf457d8aMike Lockwood                }
773d967f4664f40f9a4c5262a44b19df9bbdf457d8aMike Lockwood                return _result;
774d967f4664f40f9a4c5262a44b19df9bbdf457d8aMike Lockwood            }
775292f8bc9d1b790ab975a87a842c7fabc908b97e0Dianne Hackborn
776292f8bc9d1b790ab975a87a842c7fabc908b97e0Dianne Hackborn            /*
777292f8bc9d1b790ab975a87a842c7fabc908b97e0Dianne Hackborn             * Returns the filesystem path of a mounted secure container.
778292f8bc9d1b790ab975a87a842c7fabc908b97e0Dianne Hackborn             */
779292f8bc9d1b790ab975a87a842c7fabc908b97e0Dianne Hackborn            public String getSecureContainerFilesystemPath(String id) throws RemoteException {
780292f8bc9d1b790ab975a87a842c7fabc908b97e0Dianne Hackborn                Parcel _data = Parcel.obtain();
781292f8bc9d1b790ab975a87a842c7fabc908b97e0Dianne Hackborn                Parcel _reply = Parcel.obtain();
782292f8bc9d1b790ab975a87a842c7fabc908b97e0Dianne Hackborn                String _result;
783292f8bc9d1b790ab975a87a842c7fabc908b97e0Dianne Hackborn                try {
784292f8bc9d1b790ab975a87a842c7fabc908b97e0Dianne Hackborn                    _data.writeInterfaceToken(DESCRIPTOR);
785292f8bc9d1b790ab975a87a842c7fabc908b97e0Dianne Hackborn                    _data.writeString(id);
786292f8bc9d1b790ab975a87a842c7fabc908b97e0Dianne Hackborn                    mRemote.transact(Stub.TRANSACTION_getSecureContainerFilesystemPath, _data, _reply, 0);
787292f8bc9d1b790ab975a87a842c7fabc908b97e0Dianne Hackborn                    _reply.readException();
788292f8bc9d1b790ab975a87a842c7fabc908b97e0Dianne Hackborn                    _result = _reply.readString();
789292f8bc9d1b790ab975a87a842c7fabc908b97e0Dianne Hackborn                } finally {
790292f8bc9d1b790ab975a87a842c7fabc908b97e0Dianne Hackborn                    _reply.recycle();
791292f8bc9d1b790ab975a87a842c7fabc908b97e0Dianne Hackborn                    _data.recycle();
792292f8bc9d1b790ab975a87a842c7fabc908b97e0Dianne Hackborn                }
793292f8bc9d1b790ab975a87a842c7fabc908b97e0Dianne Hackborn                return _result;
794292f8bc9d1b790ab975a87a842c7fabc908b97e0Dianne Hackborn            }
7956dceb88f1c7c42c6ab43834af2c993d599895d82Kenny Root
7966dceb88f1c7c42c6ab43834af2c993d599895d82Kenny Root            /**
7976dceb88f1c7c42c6ab43834af2c993d599895d82Kenny Root             * Fix permissions in a container which has just been created and
7986dceb88f1c7c42c6ab43834af2c993d599895d82Kenny Root             * populated. Returns an int consistent with MountServiceResultCode
7996dceb88f1c7c42c6ab43834af2c993d599895d82Kenny Root             */
8006dceb88f1c7c42c6ab43834af2c993d599895d82Kenny Root            public int fixPermissionsSecureContainer(String id, int gid, String filename)
8016dceb88f1c7c42c6ab43834af2c993d599895d82Kenny Root                    throws RemoteException {
8026dceb88f1c7c42c6ab43834af2c993d599895d82Kenny Root                Parcel _data = Parcel.obtain();
8036dceb88f1c7c42c6ab43834af2c993d599895d82Kenny Root                Parcel _reply = Parcel.obtain();
8046dceb88f1c7c42c6ab43834af2c993d599895d82Kenny Root                int _result;
8056dceb88f1c7c42c6ab43834af2c993d599895d82Kenny Root                try {
8066dceb88f1c7c42c6ab43834af2c993d599895d82Kenny Root                    _data.writeInterfaceToken(DESCRIPTOR);
8076dceb88f1c7c42c6ab43834af2c993d599895d82Kenny Root                    _data.writeString(id);
8086dceb88f1c7c42c6ab43834af2c993d599895d82Kenny Root                    _data.writeInt(gid);
8096dceb88f1c7c42c6ab43834af2c993d599895d82Kenny Root                    _data.writeString(filename);
8106dceb88f1c7c42c6ab43834af2c993d599895d82Kenny Root                    mRemote.transact(Stub.TRANSACTION_fixPermissionsSecureContainer, _data, _reply, 0);
8116dceb88f1c7c42c6ab43834af2c993d599895d82Kenny Root                    _reply.readException();
8126dceb88f1c7c42c6ab43834af2c993d599895d82Kenny Root                    _result = _reply.readInt();
8136dceb88f1c7c42c6ab43834af2c993d599895d82Kenny Root                } finally {
8146dceb88f1c7c42c6ab43834af2c993d599895d82Kenny Root                    _reply.recycle();
8156dceb88f1c7c42c6ab43834af2c993d599895d82Kenny Root                    _data.recycle();
8166dceb88f1c7c42c6ab43834af2c993d599895d82Kenny Root                }
8176dceb88f1c7c42c6ab43834af2c993d599895d82Kenny Root                return _result;
8182d8b4e801332e02d6aad615b85cc9dd056ef805cJeff Sharkey            }
8196dceb88f1c7c42c6ab43834af2c993d599895d82Kenny Root
8202d8b4e801332e02d6aad615b85cc9dd056ef805cJeff Sharkey            @Override
8212d8b4e801332e02d6aad615b85cc9dd056ef805cJeff Sharkey            public int mkdirs(String callingPkg, String path) throws RemoteException {
8222d8b4e801332e02d6aad615b85cc9dd056ef805cJeff Sharkey                Parcel _data = Parcel.obtain();
8232d8b4e801332e02d6aad615b85cc9dd056ef805cJeff Sharkey                Parcel _reply = Parcel.obtain();
8242d8b4e801332e02d6aad615b85cc9dd056ef805cJeff Sharkey                int _result;
8252d8b4e801332e02d6aad615b85cc9dd056ef805cJeff Sharkey                try {
8262d8b4e801332e02d6aad615b85cc9dd056ef805cJeff Sharkey                    _data.writeInterfaceToken(DESCRIPTOR);
8272d8b4e801332e02d6aad615b85cc9dd056ef805cJeff Sharkey                    _data.writeString(callingPkg);
8282d8b4e801332e02d6aad615b85cc9dd056ef805cJeff Sharkey                    _data.writeString(path);
8292d8b4e801332e02d6aad615b85cc9dd056ef805cJeff Sharkey                    mRemote.transact(Stub.TRANSACTION_mkdirs, _data, _reply, 0);
8302d8b4e801332e02d6aad615b85cc9dd056ef805cJeff Sharkey                    _reply.readException();
8312d8b4e801332e02d6aad615b85cc9dd056ef805cJeff Sharkey                    _result = _reply.readInt();
8322d8b4e801332e02d6aad615b85cc9dd056ef805cJeff Sharkey                } finally {
8332d8b4e801332e02d6aad615b85cc9dd056ef805cJeff Sharkey                    _reply.recycle();
8342d8b4e801332e02d6aad615b85cc9dd056ef805cJeff Sharkey                    _data.recycle();
8352d8b4e801332e02d6aad615b85cc9dd056ef805cJeff Sharkey                }
8362d8b4e801332e02d6aad615b85cc9dd056ef805cJeff Sharkey                return _result;
8376dceb88f1c7c42c6ab43834af2c993d599895d82Kenny Root            }
838941a8ba1a6043cf84a7bf622e44a0b4f7abd0178Jeff Sharkey
839941a8ba1a6043cf84a7bf622e44a0b4f7abd0178Jeff Sharkey            @Override
840941a8ba1a6043cf84a7bf622e44a0b4f7abd0178Jeff Sharkey            public int resizeSecureContainer(String id, int sizeMb, String key)
841941a8ba1a6043cf84a7bf622e44a0b4f7abd0178Jeff Sharkey                    throws RemoteException {
842941a8ba1a6043cf84a7bf622e44a0b4f7abd0178Jeff Sharkey                Parcel _data = Parcel.obtain();
843941a8ba1a6043cf84a7bf622e44a0b4f7abd0178Jeff Sharkey                Parcel _reply = Parcel.obtain();
844941a8ba1a6043cf84a7bf622e44a0b4f7abd0178Jeff Sharkey                int _result;
845941a8ba1a6043cf84a7bf622e44a0b4f7abd0178Jeff Sharkey                try {
846941a8ba1a6043cf84a7bf622e44a0b4f7abd0178Jeff Sharkey                    _data.writeInterfaceToken(DESCRIPTOR);
847941a8ba1a6043cf84a7bf622e44a0b4f7abd0178Jeff Sharkey                    _data.writeString(id);
848941a8ba1a6043cf84a7bf622e44a0b4f7abd0178Jeff Sharkey                    _data.writeInt(sizeMb);
849941a8ba1a6043cf84a7bf622e44a0b4f7abd0178Jeff Sharkey                    _data.writeString(key);
850941a8ba1a6043cf84a7bf622e44a0b4f7abd0178Jeff Sharkey                    mRemote.transact(Stub.TRANSACTION_resizeSecureContainer, _data, _reply, 0);
851941a8ba1a6043cf84a7bf622e44a0b4f7abd0178Jeff Sharkey                    _reply.readException();
852941a8ba1a6043cf84a7bf622e44a0b4f7abd0178Jeff Sharkey                    _result = _reply.readInt();
853941a8ba1a6043cf84a7bf622e44a0b4f7abd0178Jeff Sharkey                } finally {
854941a8ba1a6043cf84a7bf622e44a0b4f7abd0178Jeff Sharkey                    _reply.recycle();
855941a8ba1a6043cf84a7bf622e44a0b4f7abd0178Jeff Sharkey                    _data.recycle();
856941a8ba1a6043cf84a7bf622e44a0b4f7abd0178Jeff Sharkey                }
857941a8ba1a6043cf84a7bf622e44a0b4f7abd0178Jeff Sharkey                return _result;
858941a8ba1a6043cf84a7bf622e44a0b4f7abd0178Jeff Sharkey            }
8597265abe77a76f848a316640b5da106e882bdbc8aChristopher Tate
8607265abe77a76f848a316640b5da106e882bdbc8aChristopher Tate            @Override
8617265abe77a76f848a316640b5da106e882bdbc8aChristopher Tate            public long lastMaintenance() throws RemoteException {
8627265abe77a76f848a316640b5da106e882bdbc8aChristopher Tate                Parcel _data = Parcel.obtain();
8637265abe77a76f848a316640b5da106e882bdbc8aChristopher Tate                Parcel _reply = Parcel.obtain();
8647265abe77a76f848a316640b5da106e882bdbc8aChristopher Tate                long _result;
8657265abe77a76f848a316640b5da106e882bdbc8aChristopher Tate                try {
8667265abe77a76f848a316640b5da106e882bdbc8aChristopher Tate                    _data.writeInterfaceToken(DESCRIPTOR);
8677265abe77a76f848a316640b5da106e882bdbc8aChristopher Tate                    mRemote.transact(Stub.TRANSACTION_lastMaintenance, _data, _reply, 0);
8687265abe77a76f848a316640b5da106e882bdbc8aChristopher Tate                    _reply.readException();
8697265abe77a76f848a316640b5da106e882bdbc8aChristopher Tate                    _result = _reply.readLong();
8707265abe77a76f848a316640b5da106e882bdbc8aChristopher Tate                } finally {
8717265abe77a76f848a316640b5da106e882bdbc8aChristopher Tate                    _reply.recycle();
8727265abe77a76f848a316640b5da106e882bdbc8aChristopher Tate                    _data.recycle();
8737265abe77a76f848a316640b5da106e882bdbc8aChristopher Tate                }
8747265abe77a76f848a316640b5da106e882bdbc8aChristopher Tate                return _result;
8757265abe77a76f848a316640b5da106e882bdbc8aChristopher Tate            }
8767265abe77a76f848a316640b5da106e882bdbc8aChristopher Tate
8777265abe77a76f848a316640b5da106e882bdbc8aChristopher Tate            @Override
8787265abe77a76f848a316640b5da106e882bdbc8aChristopher Tate            public void runMaintenance() throws RemoteException {
8797265abe77a76f848a316640b5da106e882bdbc8aChristopher Tate                Parcel _data = Parcel.obtain();
8807265abe77a76f848a316640b5da106e882bdbc8aChristopher Tate                Parcel _reply = Parcel.obtain();
8817265abe77a76f848a316640b5da106e882bdbc8aChristopher Tate                try {
8827265abe77a76f848a316640b5da106e882bdbc8aChristopher Tate                    _data.writeInterfaceToken(DESCRIPTOR);
8837265abe77a76f848a316640b5da106e882bdbc8aChristopher Tate                    mRemote.transact(Stub.TRANSACTION_runMaintenance, _data, _reply, 0);
8847265abe77a76f848a316640b5da106e882bdbc8aChristopher Tate                    _reply.readException();
8857265abe77a76f848a316640b5da106e882bdbc8aChristopher Tate                } finally {
8867265abe77a76f848a316640b5da106e882bdbc8aChristopher Tate                    _reply.recycle();
8877265abe77a76f848a316640b5da106e882bdbc8aChristopher Tate                    _data.recycle();
8887265abe77a76f848a316640b5da106e882bdbc8aChristopher Tate                }
8897265abe77a76f848a316640b5da106e882bdbc8aChristopher Tate                return;
8907265abe77a76f848a316640b5da106e882bdbc8aChristopher Tate            }
891be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root        }
892be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root
893be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root        private static final String DESCRIPTOR = "IMountService";
894be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root
895be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root        static final int TRANSACTION_registerListener = IBinder.FIRST_CALL_TRANSACTION + 0;
896be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root
897be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root        static final int TRANSACTION_unregisterListener = IBinder.FIRST_CALL_TRANSACTION + 1;
898be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root
899be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root        static final int TRANSACTION_isUsbMassStorageConnected = IBinder.FIRST_CALL_TRANSACTION + 2;
900be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root
901be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root        static final int TRANSACTION_setUsbMassStorageEnabled = IBinder.FIRST_CALL_TRANSACTION + 3;
902be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root
903be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root        static final int TRANSACTION_isUsbMassStorageEnabled = IBinder.FIRST_CALL_TRANSACTION + 4;
904be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root
905be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root        static final int TRANSACTION_mountVolume = IBinder.FIRST_CALL_TRANSACTION + 5;
906be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root
907be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root        static final int TRANSACTION_unmountVolume = IBinder.FIRST_CALL_TRANSACTION + 6;
908be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root
909be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root        static final int TRANSACTION_formatVolume = IBinder.FIRST_CALL_TRANSACTION + 7;
910be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root
911be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root        static final int TRANSACTION_getStorageUsers = IBinder.FIRST_CALL_TRANSACTION + 8;
912be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root
913be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root        static final int TRANSACTION_getVolumeState = IBinder.FIRST_CALL_TRANSACTION + 9;
914be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root
915be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root        static final int TRANSACTION_createSecureContainer = IBinder.FIRST_CALL_TRANSACTION + 10;
916be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root
917be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root        static final int TRANSACTION_finalizeSecureContainer = IBinder.FIRST_CALL_TRANSACTION + 11;
918be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root
919be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root        static final int TRANSACTION_destroySecureContainer = IBinder.FIRST_CALL_TRANSACTION + 12;
920be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root
921be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root        static final int TRANSACTION_mountSecureContainer = IBinder.FIRST_CALL_TRANSACTION + 13;
922be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root
923be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root        static final int TRANSACTION_unmountSecureContainer = IBinder.FIRST_CALL_TRANSACTION + 14;
924be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root
925be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root        static final int TRANSACTION_isSecureContainerMounted = IBinder.FIRST_CALL_TRANSACTION + 15;
926be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root
927be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root        static final int TRANSACTION_renameSecureContainer = IBinder.FIRST_CALL_TRANSACTION + 16;
928be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root
929be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root        static final int TRANSACTION_getSecureContainerPath = IBinder.FIRST_CALL_TRANSACTION + 17;
930be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root
931be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root        static final int TRANSACTION_getSecureContainerList = IBinder.FIRST_CALL_TRANSACTION + 18;
932be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root
933be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root        static final int TRANSACTION_shutdown = IBinder.FIRST_CALL_TRANSACTION + 19;
934be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root
935be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root        static final int TRANSACTION_finishMediaUpdate = IBinder.FIRST_CALL_TRANSACTION + 20;
936be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root
937be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root        static final int TRANSACTION_mountObb = IBinder.FIRST_CALL_TRANSACTION + 21;
938be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root
939be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root        static final int TRANSACTION_unmountObb = IBinder.FIRST_CALL_TRANSACTION + 22;
940be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root
941be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root        static final int TRANSACTION_isObbMounted = IBinder.FIRST_CALL_TRANSACTION + 23;
942be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root
943be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root        static final int TRANSACTION_getMountedObbPath = IBinder.FIRST_CALL_TRANSACTION + 24;
944be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root
945e1ff214e32ed5c546a7603b07b054908c4d93312Kenny Root        static final int TRANSACTION_isExternalStorageEmulated = IBinder.FIRST_CALL_TRANSACTION + 25;
946e1ff214e32ed5c546a7603b07b054908c4d93312Kenny Root
9475af0b916f850486cff4797355bf9e7dc3352fe00Jason parks        static final int TRANSACTION_decryptStorage = IBinder.FIRST_CALL_TRANSACTION + 26;
9485af0b916f850486cff4797355bf9e7dc3352fe00Jason parks
94956aa5321fe6f00fa3662e6f46a4b2559aa34f63eJason parks        static final int TRANSACTION_encryptStorage = IBinder.FIRST_CALL_TRANSACTION + 27;
95056aa5321fe6f00fa3662e6f46a4b2559aa34f63eJason parks
951f7b3cd4efd40b7631f36ea014407a850f7dc637eJason parks        static final int TRANSACTION_changeEncryptionPassword = IBinder.FIRST_CALL_TRANSACTION + 28;
952f7b3cd4efd40b7631f36ea014407a850f7dc637eJason parks
953d967f4664f40f9a4c5262a44b19df9bbdf457d8aMike Lockwood        static final int TRANSACTION_getVolumeList = IBinder.FIRST_CALL_TRANSACTION + 29;
954d967f4664f40f9a4c5262a44b19df9bbdf457d8aMike Lockwood
955292f8bc9d1b790ab975a87a842c7fabc908b97e0Dianne Hackborn        static final int TRANSACTION_getSecureContainerFilesystemPath = IBinder.FIRST_CALL_TRANSACTION + 30;
956292f8bc9d1b790ab975a87a842c7fabc908b97e0Dianne Hackborn
957444eca232964dbf27d0c4d01447c1493f89186e0Ben Komalo        static final int TRANSACTION_getEncryptionState = IBinder.FIRST_CALL_TRANSACTION + 31;
958444eca232964dbf27d0c4d01447c1493f89186e0Ben Komalo
95932418be49e5b61c2e9281528cb8fb67939e301e8Christopher Tate        static final int TRANSACTION_verifyEncryptionPassword = IBinder.FIRST_CALL_TRANSACTION + 32;
96032418be49e5b61c2e9281528cb8fb67939e301e8Christopher Tate
9616dceb88f1c7c42c6ab43834af2c993d599895d82Kenny Root        static final int TRANSACTION_fixPermissionsSecureContainer = IBinder.FIRST_CALL_TRANSACTION + 33;
9626dceb88f1c7c42c6ab43834af2c993d599895d82Kenny Root
9632d8b4e801332e02d6aad615b85cc9dd056ef805cJeff Sharkey        static final int TRANSACTION_mkdirs = IBinder.FIRST_CALL_TRANSACTION + 34;
9642d8b4e801332e02d6aad615b85cc9dd056ef805cJeff Sharkey
965945490c12e32b1c13b9097c00702558260b2011fPaul Lawrence        static final int TRANSACTION_getPasswordType = IBinder.FIRST_CALL_TRANSACTION + 35;
966945490c12e32b1c13b9097c00702558260b2011fPaul Lawrence
967945490c12e32b1c13b9097c00702558260b2011fPaul Lawrence        static final int TRANSACTION_getPassword = IBinder.FIRST_CALL_TRANSACTION + 36;
968945490c12e32b1c13b9097c00702558260b2011fPaul Lawrence
969945490c12e32b1c13b9097c00702558260b2011fPaul Lawrence        static final int TRANSACTION_clearPassword = IBinder.FIRST_CALL_TRANSACTION + 37;
9708e39736f91a08961cf59c87075e61d9026833b50Paul Lawrence
971e51dcf98a4ddb1340cffba88059ad89f0b90909aPaul Lawrence        static final int TRANSACTION_setField = IBinder.FIRST_CALL_TRANSACTION + 38;
972e51dcf98a4ddb1340cffba88059ad89f0b90909aPaul Lawrence
973e51dcf98a4ddb1340cffba88059ad89f0b90909aPaul Lawrence        static final int TRANSACTION_getField = IBinder.FIRST_CALL_TRANSACTION + 39;
974e51dcf98a4ddb1340cffba88059ad89f0b90909aPaul Lawrence
975941a8ba1a6043cf84a7bf622e44a0b4f7abd0178Jeff Sharkey        static final int TRANSACTION_resizeSecureContainer = IBinder.FIRST_CALL_TRANSACTION + 40;
976941a8ba1a6043cf84a7bf622e44a0b4f7abd0178Jeff Sharkey
9777265abe77a76f848a316640b5da106e882bdbc8aChristopher Tate        static final int TRANSACTION_lastMaintenance = IBinder.FIRST_CALL_TRANSACTION + 41;
9787265abe77a76f848a316640b5da106e882bdbc8aChristopher Tate
9797265abe77a76f848a316640b5da106e882bdbc8aChristopher Tate        static final int TRANSACTION_runMaintenance = IBinder.FIRST_CALL_TRANSACTION + 42;
9807265abe77a76f848a316640b5da106e882bdbc8aChristopher Tate
981be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root        /**
982be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root         * Cast an IBinder object into an IMountService interface, generating a
983be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root         * proxy if needed.
984be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root         */
985be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root        public static IMountService asInterface(IBinder obj) {
986be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root            if (obj == null) {
987be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root                return null;
988be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root            }
989be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root            IInterface iin = obj.queryLocalInterface(DESCRIPTOR);
990be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root            if (iin != null && iin instanceof IMountService) {
991be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root                return (IMountService) iin;
992be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root            }
993be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root            return new IMountService.Stub.Proxy(obj);
994be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root        }
995be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root
996be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root        /** Construct the stub at attach it to the interface. */
997be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root        public Stub() {
998be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root            attachInterface(this, DESCRIPTOR);
999be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root        }
1000be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root
1001be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root        public IBinder asBinder() {
1002be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root            return this;
1003be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root        }
1004be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root
1005be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root        @Override
1006be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root        public boolean onTransact(int code, Parcel data, Parcel reply,
1007be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root                int flags) throws RemoteException {
1008be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root            switch (code) {
1009be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root                case INTERFACE_TRANSACTION: {
1010be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root                    reply.writeString(DESCRIPTOR);
1011be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root                    return true;
1012be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root                }
1013be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root                case TRANSACTION_registerListener: {
1014be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root                    data.enforceInterface(DESCRIPTOR);
1015be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root                    IMountServiceListener listener;
1016be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root                    listener = IMountServiceListener.Stub.asInterface(data.readStrongBinder());
1017be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root                    registerListener(listener);
1018be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root                    reply.writeNoException();
1019be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root                    return true;
1020be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root                }
1021be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root                case TRANSACTION_unregisterListener: {
1022be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root                    data.enforceInterface(DESCRIPTOR);
1023be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root                    IMountServiceListener listener;
1024be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root                    listener = IMountServiceListener.Stub.asInterface(data.readStrongBinder());
1025be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root                    unregisterListener(listener);
1026be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root                    reply.writeNoException();
1027be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root                    return true;
1028be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root                }
1029be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root                case TRANSACTION_isUsbMassStorageConnected: {
1030be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root                    data.enforceInterface(DESCRIPTOR);
1031be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root                    boolean result = isUsbMassStorageConnected();
1032be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root                    reply.writeNoException();
1033be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root                    reply.writeInt((result ? 1 : 0));
1034be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root                    return true;
1035be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root                }
1036be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root                case TRANSACTION_setUsbMassStorageEnabled: {
1037be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root                    data.enforceInterface(DESCRIPTOR);
1038be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root                    boolean enable;
1039be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root                    enable = 0 != data.readInt();
1040be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root                    setUsbMassStorageEnabled(enable);
1041be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root                    reply.writeNoException();
1042be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root                    return true;
1043be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root                }
1044be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root                case TRANSACTION_isUsbMassStorageEnabled: {
1045be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root                    data.enforceInterface(DESCRIPTOR);
1046be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root                    boolean result = isUsbMassStorageEnabled();
1047be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root                    reply.writeNoException();
1048be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root                    reply.writeInt((result ? 1 : 0));
1049be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root                    return true;
1050be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root                }
1051be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root                case TRANSACTION_mountVolume: {
1052be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root                    data.enforceInterface(DESCRIPTOR);
1053be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root                    String mountPoint;
1054be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root                    mountPoint = data.readString();
1055be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root                    int resultCode = mountVolume(mountPoint);
1056be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root                    reply.writeNoException();
1057be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root                    reply.writeInt(resultCode);
1058be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root                    return true;
1059be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root                }
1060be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root                case TRANSACTION_unmountVolume: {
1061be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root                    data.enforceInterface(DESCRIPTOR);
1062be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root                    String mountPoint;
1063be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root                    mountPoint = data.readString();
106413c7197da8a16f77f6398708a6314c80cb01e0d1Ben Komalo                    boolean force = 0 != data.readInt();
106513c7197da8a16f77f6398708a6314c80cb01e0d1Ben Komalo                    boolean removeEncrypt = 0 != data.readInt();
106613c7197da8a16f77f6398708a6314c80cb01e0d1Ben Komalo                    unmountVolume(mountPoint, force, removeEncrypt);
1067be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root                    reply.writeNoException();
1068be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root                    return true;
1069be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root                }
1070be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root                case TRANSACTION_formatVolume: {
1071be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root                    data.enforceInterface(DESCRIPTOR);
1072be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root                    String mountPoint;
1073be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root                    mountPoint = data.readString();
1074be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root                    int result = formatVolume(mountPoint);
1075be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root                    reply.writeNoException();
1076be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root                    reply.writeInt(result);
1077be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root                    return true;
1078be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root                }
1079be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root                case TRANSACTION_getStorageUsers: {
1080be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root                    data.enforceInterface(DESCRIPTOR);
1081be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root                    String path;
1082be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root                    path = data.readString();
1083be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root                    int[] pids = getStorageUsers(path);
1084be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root                    reply.writeNoException();
1085be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root                    reply.writeIntArray(pids);
1086be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root                    return true;
1087be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root                }
1088be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root                case TRANSACTION_getVolumeState: {
1089be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root                    data.enforceInterface(DESCRIPTOR);
1090be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root                    String mountPoint;
1091be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root                    mountPoint = data.readString();
1092be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root                    String state = getVolumeState(mountPoint);
1093be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root                    reply.writeNoException();
1094be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root                    reply.writeString(state);
1095be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root                    return true;
1096be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root                }
1097be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root                case TRANSACTION_createSecureContainer: {
1098be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root                    data.enforceInterface(DESCRIPTOR);
1099be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root                    String id;
1100be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root                    id = data.readString();
1101be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root                    int sizeMb;
1102be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root                    sizeMb = data.readInt();
1103be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root                    String fstype;
1104be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root                    fstype = data.readString();
1105be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root                    String key;
1106be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root                    key = data.readString();
1107be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root                    int ownerUid;
1108be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root                    ownerUid = data.readInt();
11096dceb88f1c7c42c6ab43834af2c993d599895d82Kenny Root                    boolean external;
11106dceb88f1c7c42c6ab43834af2c993d599895d82Kenny Root                    external = 0 != data.readInt();
11116dceb88f1c7c42c6ab43834af2c993d599895d82Kenny Root                    int resultCode = createSecureContainer(id, sizeMb, fstype, key, ownerUid,
11126dceb88f1c7c42c6ab43834af2c993d599895d82Kenny Root                            external);
1113be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root                    reply.writeNoException();
1114be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root                    reply.writeInt(resultCode);
1115be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root                    return true;
1116be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root                }
1117be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root                case TRANSACTION_finalizeSecureContainer: {
1118be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root                    data.enforceInterface(DESCRIPTOR);
1119be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root                    String id;
1120be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root                    id = data.readString();
1121be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root                    int resultCode = finalizeSecureContainer(id);
1122be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root                    reply.writeNoException();
1123be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root                    reply.writeInt(resultCode);
1124be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root                    return true;
1125be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root                }
1126be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root                case TRANSACTION_destroySecureContainer: {
1127be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root                    data.enforceInterface(DESCRIPTOR);
1128be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root                    String id;
1129be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root                    id = data.readString();
1130be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root                    boolean force;
1131be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root                    force = 0 != data.readInt();
1132be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root                    int resultCode = destroySecureContainer(id, force);
1133be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root                    reply.writeNoException();
1134be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root                    reply.writeInt(resultCode);
1135be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root                    return true;
1136be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root                }
1137be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root                case TRANSACTION_mountSecureContainer: {
1138be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root                    data.enforceInterface(DESCRIPTOR);
1139be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root                    String id;
1140be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root                    id = data.readString();
1141be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root                    String key;
1142be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root                    key = data.readString();
1143be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root                    int ownerUid;
1144be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root                    ownerUid = data.readInt();
1145941a8ba1a6043cf84a7bf622e44a0b4f7abd0178Jeff Sharkey                    boolean readOnly;
1146941a8ba1a6043cf84a7bf622e44a0b4f7abd0178Jeff Sharkey                    readOnly = data.readInt() != 0;
1147941a8ba1a6043cf84a7bf622e44a0b4f7abd0178Jeff Sharkey                    int resultCode = mountSecureContainer(id, key, ownerUid, readOnly);
1148be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root                    reply.writeNoException();
1149be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root                    reply.writeInt(resultCode);
1150be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root                    return true;
1151be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root                }
1152be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root                case TRANSACTION_unmountSecureContainer: {
1153be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root                    data.enforceInterface(DESCRIPTOR);
1154be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root                    String id;
1155be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root                    id = data.readString();
1156be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root                    boolean force;
1157be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root                    force = 0 != data.readInt();
1158be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root                    int resultCode = unmountSecureContainer(id, force);
1159be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root                    reply.writeNoException();
1160be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root                    reply.writeInt(resultCode);
1161be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root                    return true;
1162be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root                }
1163be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root                case TRANSACTION_isSecureContainerMounted: {
1164be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root                    data.enforceInterface(DESCRIPTOR);
1165be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root                    String id;
1166be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root                    id = data.readString();
1167be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root                    boolean status = isSecureContainerMounted(id);
1168be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root                    reply.writeNoException();
1169be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root                    reply.writeInt((status ? 1 : 0));
1170be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root                    return true;
1171be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root                }
1172be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root                case TRANSACTION_renameSecureContainer: {
1173be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root                    data.enforceInterface(DESCRIPTOR);
1174be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root                    String oldId;
1175be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root                    oldId = data.readString();
1176be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root                    String newId;
1177be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root                    newId = data.readString();
1178be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root                    int resultCode = renameSecureContainer(oldId, newId);
1179be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root                    reply.writeNoException();
1180be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root                    reply.writeInt(resultCode);
1181be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root                    return true;
1182be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root                }
1183be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root                case TRANSACTION_getSecureContainerPath: {
1184be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root                    data.enforceInterface(DESCRIPTOR);
1185be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root                    String id;
1186be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root                    id = data.readString();
1187be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root                    String path = getSecureContainerPath(id);
1188be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root                    reply.writeNoException();
1189be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root                    reply.writeString(path);
1190be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root                    return true;
1191be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root                }
1192be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root                case TRANSACTION_getSecureContainerList: {
1193be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root                    data.enforceInterface(DESCRIPTOR);
1194be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root                    String[] ids = getSecureContainerList();
1195be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root                    reply.writeNoException();
1196be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root                    reply.writeStringArray(ids);
1197be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root                    return true;
1198be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root                }
1199be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root                case TRANSACTION_shutdown: {
1200be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root                    data.enforceInterface(DESCRIPTOR);
1201be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root                    IMountShutdownObserver observer;
1202be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root                    observer = IMountShutdownObserver.Stub.asInterface(data
1203be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root                            .readStrongBinder());
1204be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root                    shutdown(observer);
1205be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root                    reply.writeNoException();
1206be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root                    return true;
1207be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root                }
1208be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root                case TRANSACTION_finishMediaUpdate: {
1209be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root                    data.enforceInterface(DESCRIPTOR);
1210be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root                    finishMediaUpdate();
1211be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root                    reply.writeNoException();
1212be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root                    return true;
1213be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root                }
1214be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root                case TRANSACTION_mountObb: {
1215be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root                    data.enforceInterface(DESCRIPTOR);
12164fbbda4cecb078bd3867f416b02cc75f5455284fJeff Sharkey                    final String rawPath = data.readString();
12174fbbda4cecb078bd3867f416b02cc75f5455284fJeff Sharkey                    final String canonicalPath = data.readString();
12184fbbda4cecb078bd3867f416b02cc75f5455284fJeff Sharkey                    final String key = data.readString();
1219be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root                    IObbActionListener observer;
1220be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root                    observer = IObbActionListener.Stub.asInterface(data.readStrongBinder());
1221af9d667ccf3e24058214cf4cc0a8aa8bc5100e3cKenny Root                    int nonce;
1222af9d667ccf3e24058214cf4cc0a8aa8bc5100e3cKenny Root                    nonce = data.readInt();
12234fbbda4cecb078bd3867f416b02cc75f5455284fJeff Sharkey                    mountObb(rawPath, canonicalPath, key, observer, nonce);
1224be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root                    reply.writeNoException();
1225be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root                    return true;
1226be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root                }
1227be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root                case TRANSACTION_unmountObb: {
1228be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root                    data.enforceInterface(DESCRIPTOR);
1229be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root                    String filename;
1230be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root                    filename = data.readString();
1231be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root                    boolean force;
1232be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root                    force = 0 != data.readInt();
1233be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root                    IObbActionListener observer;
1234be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root                    observer = IObbActionListener.Stub.asInterface(data.readStrongBinder());
1235af9d667ccf3e24058214cf4cc0a8aa8bc5100e3cKenny Root                    int nonce;
1236af9d667ccf3e24058214cf4cc0a8aa8bc5100e3cKenny Root                    nonce = data.readInt();
1237af9d667ccf3e24058214cf4cc0a8aa8bc5100e3cKenny Root                    unmountObb(filename, force, observer, nonce);
1238be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root                    reply.writeNoException();
1239be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root                    return true;
1240be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root                }
1241be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root                case TRANSACTION_isObbMounted: {
1242be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root                    data.enforceInterface(DESCRIPTOR);
1243be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root                    String filename;
1244be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root                    filename = data.readString();
1245be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root                    boolean status = isObbMounted(filename);
1246be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root                    reply.writeNoException();
1247be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root                    reply.writeInt((status ? 1 : 0));
1248be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root                    return true;
1249be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root                }
1250be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root                case TRANSACTION_getMountedObbPath: {
1251be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root                    data.enforceInterface(DESCRIPTOR);
1252be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root                    String filename;
1253be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root                    filename = data.readString();
1254be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root                    String mountedPath = getMountedObbPath(filename);
1255be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root                    reply.writeNoException();
1256be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root                    reply.writeString(mountedPath);
1257be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root                    return true;
1258be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root                }
1259e1ff214e32ed5c546a7603b07b054908c4d93312Kenny Root                case TRANSACTION_isExternalStorageEmulated: {
1260e1ff214e32ed5c546a7603b07b054908c4d93312Kenny Root                    data.enforceInterface(DESCRIPTOR);
1261e1ff214e32ed5c546a7603b07b054908c4d93312Kenny Root                    boolean emulated = isExternalStorageEmulated();
1262e1ff214e32ed5c546a7603b07b054908c4d93312Kenny Root                    reply.writeNoException();
1263e1ff214e32ed5c546a7603b07b054908c4d93312Kenny Root                    reply.writeInt(emulated ? 1 : 0);
1264e1ff214e32ed5c546a7603b07b054908c4d93312Kenny Root                    return true;
1265e1ff214e32ed5c546a7603b07b054908c4d93312Kenny Root                }
12665af0b916f850486cff4797355bf9e7dc3352fe00Jason parks                case TRANSACTION_decryptStorage: {
12675af0b916f850486cff4797355bf9e7dc3352fe00Jason parks                    data.enforceInterface(DESCRIPTOR);
12685af0b916f850486cff4797355bf9e7dc3352fe00Jason parks                    String password = data.readString();
12695af0b916f850486cff4797355bf9e7dc3352fe00Jason parks                    int result = decryptStorage(password);
12705af0b916f850486cff4797355bf9e7dc3352fe00Jason parks                    reply.writeNoException();
12715af0b916f850486cff4797355bf9e7dc3352fe00Jason parks                    reply.writeInt(result);
12725af0b916f850486cff4797355bf9e7dc3352fe00Jason parks                    return true;
12735af0b916f850486cff4797355bf9e7dc3352fe00Jason parks                }
127456aa5321fe6f00fa3662e6f46a4b2559aa34f63eJason parks                case TRANSACTION_encryptStorage: {
127556aa5321fe6f00fa3662e6f46a4b2559aa34f63eJason parks                    data.enforceInterface(DESCRIPTOR);
127646791e752ca1eca35e6a882c47d7de7f4f66687cPaul Lawrence                    int type = data.readInt();
127756aa5321fe6f00fa3662e6f46a4b2559aa34f63eJason parks                    String password = data.readString();
127846791e752ca1eca35e6a882c47d7de7f4f66687cPaul Lawrence                    int result = encryptStorage(type, password);
127956aa5321fe6f00fa3662e6f46a4b2559aa34f63eJason parks                    reply.writeNoException();
128056aa5321fe6f00fa3662e6f46a4b2559aa34f63eJason parks                    reply.writeInt(result);
128156aa5321fe6f00fa3662e6f46a4b2559aa34f63eJason parks                    return true;
128256aa5321fe6f00fa3662e6f46a4b2559aa34f63eJason parks                }
1283f7b3cd4efd40b7631f36ea014407a850f7dc637eJason parks                case TRANSACTION_changeEncryptionPassword: {
1284f7b3cd4efd40b7631f36ea014407a850f7dc637eJason parks                    data.enforceInterface(DESCRIPTOR);
12858e39736f91a08961cf59c87075e61d9026833b50Paul Lawrence                    int type = data.readInt();
1286f7b3cd4efd40b7631f36ea014407a850f7dc637eJason parks                    String password = data.readString();
12878e39736f91a08961cf59c87075e61d9026833b50Paul Lawrence                    int result = changeEncryptionPassword(type, password);
1288f7b3cd4efd40b7631f36ea014407a850f7dc637eJason parks                    reply.writeNoException();
1289f7b3cd4efd40b7631f36ea014407a850f7dc637eJason parks                    reply.writeInt(result);
1290f7b3cd4efd40b7631f36ea014407a850f7dc637eJason parks                    return true;
1291f7b3cd4efd40b7631f36ea014407a850f7dc637eJason parks                }
1292d967f4664f40f9a4c5262a44b19df9bbdf457d8aMike Lockwood                case TRANSACTION_getVolumeList: {
1293d967f4664f40f9a4c5262a44b19df9bbdf457d8aMike Lockwood                    data.enforceInterface(DESCRIPTOR);
1294b049e212ab7fe8967893c202efcb30fecfdb82fbJeff Sharkey                    StorageVolume[] result = getVolumeList();
1295d967f4664f40f9a4c5262a44b19df9bbdf457d8aMike Lockwood                    reply.writeNoException();
1296b049e212ab7fe8967893c202efcb30fecfdb82fbJeff Sharkey                    reply.writeTypedArray(result, android.os.Parcelable.PARCELABLE_WRITE_RETURN_VALUE);
1297d967f4664f40f9a4c5262a44b19df9bbdf457d8aMike Lockwood                    return true;
1298d967f4664f40f9a4c5262a44b19df9bbdf457d8aMike Lockwood                }
1299292f8bc9d1b790ab975a87a842c7fabc908b97e0Dianne Hackborn                case TRANSACTION_getSecureContainerFilesystemPath: {
1300292f8bc9d1b790ab975a87a842c7fabc908b97e0Dianne Hackborn                    data.enforceInterface(DESCRIPTOR);
1301292f8bc9d1b790ab975a87a842c7fabc908b97e0Dianne Hackborn                    String id;
1302292f8bc9d1b790ab975a87a842c7fabc908b97e0Dianne Hackborn                    id = data.readString();
1303292f8bc9d1b790ab975a87a842c7fabc908b97e0Dianne Hackborn                    String path = getSecureContainerFilesystemPath(id);
1304292f8bc9d1b790ab975a87a842c7fabc908b97e0Dianne Hackborn                    reply.writeNoException();
1305292f8bc9d1b790ab975a87a842c7fabc908b97e0Dianne Hackborn                    reply.writeString(path);
1306292f8bc9d1b790ab975a87a842c7fabc908b97e0Dianne Hackborn                    return true;
1307292f8bc9d1b790ab975a87a842c7fabc908b97e0Dianne Hackborn                }
1308444eca232964dbf27d0c4d01447c1493f89186e0Ben Komalo                case TRANSACTION_getEncryptionState: {
1309444eca232964dbf27d0c4d01447c1493f89186e0Ben Komalo                    data.enforceInterface(DESCRIPTOR);
1310444eca232964dbf27d0c4d01447c1493f89186e0Ben Komalo                    int result = getEncryptionState();
1311444eca232964dbf27d0c4d01447c1493f89186e0Ben Komalo                    reply.writeNoException();
1312444eca232964dbf27d0c4d01447c1493f89186e0Ben Komalo                    reply.writeInt(result);
1313444eca232964dbf27d0c4d01447c1493f89186e0Ben Komalo                    return true;
1314444eca232964dbf27d0c4d01447c1493f89186e0Ben Komalo                }
13156dceb88f1c7c42c6ab43834af2c993d599895d82Kenny Root                case TRANSACTION_fixPermissionsSecureContainer: {
13166dceb88f1c7c42c6ab43834af2c993d599895d82Kenny Root                    data.enforceInterface(DESCRIPTOR);
13176dceb88f1c7c42c6ab43834af2c993d599895d82Kenny Root                    String id;
13186dceb88f1c7c42c6ab43834af2c993d599895d82Kenny Root                    id = data.readString();
13196dceb88f1c7c42c6ab43834af2c993d599895d82Kenny Root                    int gid;
13206dceb88f1c7c42c6ab43834af2c993d599895d82Kenny Root                    gid = data.readInt();
13216dceb88f1c7c42c6ab43834af2c993d599895d82Kenny Root                    String filename;
13226dceb88f1c7c42c6ab43834af2c993d599895d82Kenny Root                    filename = data.readString();
13236dceb88f1c7c42c6ab43834af2c993d599895d82Kenny Root                    int resultCode = fixPermissionsSecureContainer(id, gid, filename);
13246dceb88f1c7c42c6ab43834af2c993d599895d82Kenny Root                    reply.writeNoException();
13256dceb88f1c7c42c6ab43834af2c993d599895d82Kenny Root                    reply.writeInt(resultCode);
13266dceb88f1c7c42c6ab43834af2c993d599895d82Kenny Root                    return true;
13276dceb88f1c7c42c6ab43834af2c993d599895d82Kenny Root                }
13282d8b4e801332e02d6aad615b85cc9dd056ef805cJeff Sharkey                case TRANSACTION_mkdirs: {
13292d8b4e801332e02d6aad615b85cc9dd056ef805cJeff Sharkey                    data.enforceInterface(DESCRIPTOR);
13302d8b4e801332e02d6aad615b85cc9dd056ef805cJeff Sharkey                    String callingPkg = data.readString();
13312d8b4e801332e02d6aad615b85cc9dd056ef805cJeff Sharkey                    String path = data.readString();
13322d8b4e801332e02d6aad615b85cc9dd056ef805cJeff Sharkey                    int result = mkdirs(callingPkg, path);
13332d8b4e801332e02d6aad615b85cc9dd056ef805cJeff Sharkey                    reply.writeNoException();
13342d8b4e801332e02d6aad615b85cc9dd056ef805cJeff Sharkey                    reply.writeInt(result);
13352d8b4e801332e02d6aad615b85cc9dd056ef805cJeff Sharkey                    return true;
13362d8b4e801332e02d6aad615b85cc9dd056ef805cJeff Sharkey                }
13378e39736f91a08961cf59c87075e61d9026833b50Paul Lawrence                case TRANSACTION_getPasswordType: {
13388e39736f91a08961cf59c87075e61d9026833b50Paul Lawrence                    data.enforceInterface(DESCRIPTOR);
13398e39736f91a08961cf59c87075e61d9026833b50Paul Lawrence                    int result = getPasswordType();
13408e39736f91a08961cf59c87075e61d9026833b50Paul Lawrence                    reply.writeNoException();
13418e39736f91a08961cf59c87075e61d9026833b50Paul Lawrence                    reply.writeInt(result);
13428e39736f91a08961cf59c87075e61d9026833b50Paul Lawrence                    return true;
13438e39736f91a08961cf59c87075e61d9026833b50Paul Lawrence                }
1344945490c12e32b1c13b9097c00702558260b2011fPaul Lawrence                case TRANSACTION_getPassword: {
1345945490c12e32b1c13b9097c00702558260b2011fPaul Lawrence                    data.enforceInterface(DESCRIPTOR);
1346945490c12e32b1c13b9097c00702558260b2011fPaul Lawrence                    String result = getPassword();
1347945490c12e32b1c13b9097c00702558260b2011fPaul Lawrence                    reply.writeNoException();
1348945490c12e32b1c13b9097c00702558260b2011fPaul Lawrence                    reply.writeString(result);
1349945490c12e32b1c13b9097c00702558260b2011fPaul Lawrence                    return true;
1350945490c12e32b1c13b9097c00702558260b2011fPaul Lawrence                }
1351945490c12e32b1c13b9097c00702558260b2011fPaul Lawrence                case TRANSACTION_clearPassword: {
1352945490c12e32b1c13b9097c00702558260b2011fPaul Lawrence                    data.enforceInterface(DESCRIPTOR);
1353945490c12e32b1c13b9097c00702558260b2011fPaul Lawrence                    clearPassword();
1354945490c12e32b1c13b9097c00702558260b2011fPaul Lawrence                    reply.writeNoException();
1355945490c12e32b1c13b9097c00702558260b2011fPaul Lawrence                    return true;
1356945490c12e32b1c13b9097c00702558260b2011fPaul Lawrence                }
1357e51dcf98a4ddb1340cffba88059ad89f0b90909aPaul Lawrence                case TRANSACTION_setField: {
1358e51dcf98a4ddb1340cffba88059ad89f0b90909aPaul Lawrence                    data.enforceInterface(DESCRIPTOR);
1359e51dcf98a4ddb1340cffba88059ad89f0b90909aPaul Lawrence                    String field = data.readString();
1360e51dcf98a4ddb1340cffba88059ad89f0b90909aPaul Lawrence                    String contents = data.readString();
1361e51dcf98a4ddb1340cffba88059ad89f0b90909aPaul Lawrence                    setField(field, contents);
1362e51dcf98a4ddb1340cffba88059ad89f0b90909aPaul Lawrence                    reply.writeNoException();
1363e51dcf98a4ddb1340cffba88059ad89f0b90909aPaul Lawrence                    return true;
1364e51dcf98a4ddb1340cffba88059ad89f0b90909aPaul Lawrence                }
1365e51dcf98a4ddb1340cffba88059ad89f0b90909aPaul Lawrence                case TRANSACTION_getField: {
1366e51dcf98a4ddb1340cffba88059ad89f0b90909aPaul Lawrence                    data.enforceInterface(DESCRIPTOR);
1367e51dcf98a4ddb1340cffba88059ad89f0b90909aPaul Lawrence                    String field = data.readString();
1368e51dcf98a4ddb1340cffba88059ad89f0b90909aPaul Lawrence                    String contents = getField(field);
1369e51dcf98a4ddb1340cffba88059ad89f0b90909aPaul Lawrence                    reply.writeNoException();
1370e51dcf98a4ddb1340cffba88059ad89f0b90909aPaul Lawrence                    reply.writeString(contents);
1371e51dcf98a4ddb1340cffba88059ad89f0b90909aPaul Lawrence                    return true;
1372e51dcf98a4ddb1340cffba88059ad89f0b90909aPaul Lawrence                }
1373941a8ba1a6043cf84a7bf622e44a0b4f7abd0178Jeff Sharkey                case TRANSACTION_resizeSecureContainer: {
1374941a8ba1a6043cf84a7bf622e44a0b4f7abd0178Jeff Sharkey                    data.enforceInterface(DESCRIPTOR);
1375941a8ba1a6043cf84a7bf622e44a0b4f7abd0178Jeff Sharkey                    String id;
1376941a8ba1a6043cf84a7bf622e44a0b4f7abd0178Jeff Sharkey                    id = data.readString();
1377941a8ba1a6043cf84a7bf622e44a0b4f7abd0178Jeff Sharkey                    int sizeMb;
1378941a8ba1a6043cf84a7bf622e44a0b4f7abd0178Jeff Sharkey                    sizeMb = data.readInt();
1379941a8ba1a6043cf84a7bf622e44a0b4f7abd0178Jeff Sharkey                    String key;
1380941a8ba1a6043cf84a7bf622e44a0b4f7abd0178Jeff Sharkey                    key = data.readString();
1381941a8ba1a6043cf84a7bf622e44a0b4f7abd0178Jeff Sharkey                    int resultCode = resizeSecureContainer(id, sizeMb, key);
1382941a8ba1a6043cf84a7bf622e44a0b4f7abd0178Jeff Sharkey                    reply.writeNoException();
1383941a8ba1a6043cf84a7bf622e44a0b4f7abd0178Jeff Sharkey                    reply.writeInt(resultCode);
1384941a8ba1a6043cf84a7bf622e44a0b4f7abd0178Jeff Sharkey                    return true;
1385941a8ba1a6043cf84a7bf622e44a0b4f7abd0178Jeff Sharkey                }
13867265abe77a76f848a316640b5da106e882bdbc8aChristopher Tate                case TRANSACTION_lastMaintenance: {
13877265abe77a76f848a316640b5da106e882bdbc8aChristopher Tate                    data.enforceInterface(DESCRIPTOR);
13887265abe77a76f848a316640b5da106e882bdbc8aChristopher Tate                    long lastMaintenance = lastMaintenance();
13897265abe77a76f848a316640b5da106e882bdbc8aChristopher Tate                    reply.writeNoException();
13907265abe77a76f848a316640b5da106e882bdbc8aChristopher Tate                    reply.writeLong(lastMaintenance);
13917265abe77a76f848a316640b5da106e882bdbc8aChristopher Tate                    return true;
13927265abe77a76f848a316640b5da106e882bdbc8aChristopher Tate                }
13937265abe77a76f848a316640b5da106e882bdbc8aChristopher Tate                case TRANSACTION_runMaintenance: {
13947265abe77a76f848a316640b5da106e882bdbc8aChristopher Tate                    data.enforceInterface(DESCRIPTOR);
13957265abe77a76f848a316640b5da106e882bdbc8aChristopher Tate                    runMaintenance();
13967265abe77a76f848a316640b5da106e882bdbc8aChristopher Tate                    reply.writeNoException();
13977265abe77a76f848a316640b5da106e882bdbc8aChristopher Tate                    return true;
13987265abe77a76f848a316640b5da106e882bdbc8aChristopher Tate                }
1399be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root            }
1400be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root            return super.onTransact(code, data, reply, flags);
1401be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root        }
1402be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root    }
1403be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root
1404be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root    /*
1405be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root     * Creates a secure container with the specified parameters. Returns an int
1406be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root     * consistent with MountServiceResultCode
1407be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root     */
14086dceb88f1c7c42c6ab43834af2c993d599895d82Kenny Root    public int createSecureContainer(String id, int sizeMb, String fstype, String key,
14096dceb88f1c7c42c6ab43834af2c993d599895d82Kenny Root            int ownerUid, boolean external) throws RemoteException;
1410be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root
1411be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root    /*
1412be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root     * Destroy a secure container, and free up all resources associated with it.
1413be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root     * NOTE: Ensure all references are released prior to deleting. Returns an
1414be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root     * int consistent with MountServiceResultCode
1415be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root     */
1416be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root    public int destroySecureContainer(String id, boolean force) throws RemoteException;
1417be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root
1418be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root    /*
1419be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root     * Finalize a container which has just been created and populated. After
1420be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root     * finalization, the container is immutable. Returns an int consistent with
1421be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root     * MountServiceResultCode
1422be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root     */
1423be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root    public int finalizeSecureContainer(String id) throws RemoteException;
1424be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root
1425be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root    /**
1426be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root     * Call into MountService by PackageManager to notify that its done
1427be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root     * processing the media status update request.
1428be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root     */
1429be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root    public void finishMediaUpdate() throws RemoteException;
1430be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root
1431be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root    /**
1432be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root     * Format external storage given a mount point. Returns an int consistent
1433be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root     * with MountServiceResultCode
1434be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root     */
1435be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root    public int formatVolume(String mountPoint) throws RemoteException;
1436be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root
1437be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root    /**
1438be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root     * Gets the path to the mounted Opaque Binary Blob (OBB).
1439be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root     */
14404fbbda4cecb078bd3867f416b02cc75f5455284fJeff Sharkey    public String getMountedObbPath(String rawPath) throws RemoteException;
1441be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root
1442be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root    /**
1443be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root     * Gets an Array of currently known secure container IDs
1444be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root     */
1445be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root    public String[] getSecureContainerList() throws RemoteException;
1446be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root
1447be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root    /*
1448be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root     * Returns the filesystem path of a mounted secure container.
1449be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root     */
1450be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root    public String getSecureContainerPath(String id) throws RemoteException;
1451be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root
1452be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root    /**
1453be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root     * Returns an array of pids with open files on the specified path.
1454be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root     */
1455be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root    public int[] getStorageUsers(String path) throws RemoteException;
1456be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root
1457be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root    /**
1458be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root     * Gets the state of a volume via its mountpoint.
1459be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root     */
1460be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root    public String getVolumeState(String mountPoint) throws RemoteException;
1461be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root
1462be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root    /**
1463be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root     * Checks whether the specified Opaque Binary Blob (OBB) is mounted
1464be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root     * somewhere.
1465be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root     */
14664fbbda4cecb078bd3867f416b02cc75f5455284fJeff Sharkey    public boolean isObbMounted(String rawPath) throws RemoteException;
1467be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root
1468be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root    /*
1469be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root     * Returns true if the specified container is mounted
1470be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root     */
1471be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root    public boolean isSecureContainerMounted(String id) throws RemoteException;
1472be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root
1473be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root    /**
1474be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root     * Returns true if a USB mass storage host is connected
1475be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root     */
1476be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root    public boolean isUsbMassStorageConnected() throws RemoteException;
1477be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root
1478be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root    /**
1479be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root     * Returns true if a USB mass storage host is enabled (media is shared)
1480be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root     */
1481be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root    public boolean isUsbMassStorageEnabled() throws RemoteException;
1482be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root
1483be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root    /**
1484be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root     * Mounts an Opaque Binary Blob (OBB) with the specified decryption key and
1485be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root     * only allows the calling process's UID access to the contents.
1486be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root     * MountService will call back to the supplied IObbActionListener to inform
1487be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root     * it of the terminal state of the call.
1488be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root     */
14894fbbda4cecb078bd3867f416b02cc75f5455284fJeff Sharkey    public void mountObb(String rawPath, String canonicalPath, String key,
14904fbbda4cecb078bd3867f416b02cc75f5455284fJeff Sharkey            IObbActionListener token, int nonce) throws RemoteException;
1491be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root
1492be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root    /*
1493be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root     * Mount a secure container with the specified key and owner UID. Returns an
1494be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root     * int consistent with MountServiceResultCode
1495be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root     */
1496941a8ba1a6043cf84a7bf622e44a0b4f7abd0178Jeff Sharkey    public int mountSecureContainer(String id, String key, int ownerUid, boolean readOnly)
1497941a8ba1a6043cf84a7bf622e44a0b4f7abd0178Jeff Sharkey            throws RemoteException;
1498be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root
1499be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root    /**
1500be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root     * Mount external storage at given mount point. Returns an int consistent
1501be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root     * with MountServiceResultCode
1502be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root     */
1503be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root    public int mountVolume(String mountPoint) throws RemoteException;
1504be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root
1505be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root    /**
1506be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root     * Registers an IMountServiceListener for receiving async notifications.
1507be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root     */
1508be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root    public void registerListener(IMountServiceListener listener) throws RemoteException;
1509be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root
1510be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root    /*
1511be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root     * Rename an unmounted secure container. Returns an int consistent with
1512be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root     * MountServiceResultCode
1513be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root     */
1514be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root    public int renameSecureContainer(String oldId, String newId) throws RemoteException;
1515be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root
1516be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root    /**
1517be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root     * Enables / disables USB mass storage. The caller should check actual
1518be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root     * status of enabling/disabling USB mass storage via StorageEventListener.
1519be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root     */
1520be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root    public void setUsbMassStorageEnabled(boolean enable) throws RemoteException;
1521be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root
1522be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root    /**
1523be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root     * Shuts down the MountService and gracefully unmounts all external media.
1524be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root     * Invokes call back once the shutdown is complete.
1525be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root     */
1526be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root    public void shutdown(IMountShutdownObserver observer) throws RemoteException;
1527be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root
1528be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root    /**
1529be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root     * Unmounts an Opaque Binary Blob (OBB). When the force flag is specified,
1530be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root     * any program using it will be forcibly killed to unmount the image.
1531be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root     * MountService will call back to the supplied IObbActionListener to inform
1532be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root     * it of the terminal state of the call.
1533be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root     */
15344fbbda4cecb078bd3867f416b02cc75f5455284fJeff Sharkey    public void unmountObb(String rawPath, boolean force, IObbActionListener token, int nonce)
1535be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root            throws RemoteException;
1536be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root
1537be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root    /*
1538be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root     * Unount a secure container. Returns an int consistent with
1539be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root     * MountServiceResultCode
1540be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root     */
1541be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root    public int unmountSecureContainer(String id, boolean force) throws RemoteException;
1542be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root
1543be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root    /**
1544be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root     * Safely unmount external storage at given mount point. The unmount is an
1545be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root     * asynchronous operation. Applications should register StorageEventListener
1546be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root     * for storage related status changes.
154713c7197da8a16f77f6398708a6314c80cb01e0d1Ben Komalo     * @param mountPoint the mount point
154813c7197da8a16f77f6398708a6314c80cb01e0d1Ben Komalo     * @param force whether or not to forcefully unmount it (e.g. even if programs are using this
154913c7197da8a16f77f6398708a6314c80cb01e0d1Ben Komalo     *     data currently)
155013c7197da8a16f77f6398708a6314c80cb01e0d1Ben Komalo     * @param removeEncryption whether or not encryption mapping should be removed from the volume.
155113c7197da8a16f77f6398708a6314c80cb01e0d1Ben Komalo     *     This value implies {@code force}.
1552be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root     */
155313c7197da8a16f77f6398708a6314c80cb01e0d1Ben Komalo    public void unmountVolume(String mountPoint, boolean force, boolean removeEncryption)
155413c7197da8a16f77f6398708a6314c80cb01e0d1Ben Komalo            throws RemoteException;
1555be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root
1556be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root    /**
1557be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root     * Unregisters an IMountServiceListener
1558be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root     */
1559be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root    public void unregisterListener(IMountServiceListener listener) throws RemoteException;
1560e1ff214e32ed5c546a7603b07b054908c4d93312Kenny Root
1561e1ff214e32ed5c546a7603b07b054908c4d93312Kenny Root    /**
1562e1ff214e32ed5c546a7603b07b054908c4d93312Kenny Root     * Returns whether or not the external storage is emulated.
1563e1ff214e32ed5c546a7603b07b054908c4d93312Kenny Root     */
1564e1ff214e32ed5c546a7603b07b054908c4d93312Kenny Root    public boolean isExternalStorageEmulated() throws RemoteException;
15655af0b916f850486cff4797355bf9e7dc3352fe00Jason parks
1566444eca232964dbf27d0c4d01447c1493f89186e0Ben Komalo    /** The volume is not encrypted. */
1567444eca232964dbf27d0c4d01447c1493f89186e0Ben Komalo    static final int ENCRYPTION_STATE_NONE = 1;
1568444eca232964dbf27d0c4d01447c1493f89186e0Ben Komalo    /** The volume has been encrypted succesfully. */
1569444eca232964dbf27d0c4d01447c1493f89186e0Ben Komalo    static final int ENCRYPTION_STATE_OK = 0;
1570e2c88d39b2c5b33d55c42230db7899202625a96aPaul Lawrence    /** The volume is in a bad state.*/
1571444eca232964dbf27d0c4d01447c1493f89186e0Ben Komalo    static final int ENCRYPTION_STATE_ERROR_UNKNOWN = -1;
1572e2c88d39b2c5b33d55c42230db7899202625a96aPaul Lawrence    /** Encryption is incomplete */
1573444eca232964dbf27d0c4d01447c1493f89186e0Ben Komalo    static final int ENCRYPTION_STATE_ERROR_INCOMPLETE = -2;
1574e2c88d39b2c5b33d55c42230db7899202625a96aPaul Lawrence    /** Encryption is incomplete and irrecoverable */
1575e2c88d39b2c5b33d55c42230db7899202625a96aPaul Lawrence    static final int ENCRYPTION_STATE_ERROR_INCONSISTENT = -3;
1576e2c88d39b2c5b33d55c42230db7899202625a96aPaul Lawrence    /** Underlying data is corrupt */
1577e2c88d39b2c5b33d55c42230db7899202625a96aPaul Lawrence    static final int ENCRYPTION_STATE_ERROR_CORRUPT = -4;
1578444eca232964dbf27d0c4d01447c1493f89186e0Ben Komalo
1579444eca232964dbf27d0c4d01447c1493f89186e0Ben Komalo    /**
1580444eca232964dbf27d0c4d01447c1493f89186e0Ben Komalo     * Determines the encryption state of the volume.
1581444eca232964dbf27d0c4d01447c1493f89186e0Ben Komalo     * @return a numerical value. See {@code ENCRYPTION_STATE_*} for possible values.
1582444eca232964dbf27d0c4d01447c1493f89186e0Ben Komalo     */
1583444eca232964dbf27d0c4d01447c1493f89186e0Ben Komalo    public int getEncryptionState() throws RemoteException;
1584444eca232964dbf27d0c4d01447c1493f89186e0Ben Komalo
15855af0b916f850486cff4797355bf9e7dc3352fe00Jason parks    /**
15865af0b916f850486cff4797355bf9e7dc3352fe00Jason parks     * Decrypts any encrypted volumes.
15875af0b916f850486cff4797355bf9e7dc3352fe00Jason parks     */
15885af0b916f850486cff4797355bf9e7dc3352fe00Jason parks    public int decryptStorage(String password) throws RemoteException;
158956aa5321fe6f00fa3662e6f46a4b2559aa34f63eJason parks
159056aa5321fe6f00fa3662e6f46a4b2559aa34f63eJason parks    /**
159156aa5321fe6f00fa3662e6f46a4b2559aa34f63eJason parks     * Encrypts storage.
159256aa5321fe6f00fa3662e6f46a4b2559aa34f63eJason parks     */
159346791e752ca1eca35e6a882c47d7de7f4f66687cPaul Lawrence    public int encryptStorage(int type, String password) throws RemoteException;
1594f7b3cd4efd40b7631f36ea014407a850f7dc637eJason parks
1595f7b3cd4efd40b7631f36ea014407a850f7dc637eJason parks    /**
1596f7b3cd4efd40b7631f36ea014407a850f7dc637eJason parks     * Changes the encryption password.
1597f7b3cd4efd40b7631f36ea014407a850f7dc637eJason parks     */
15988e39736f91a08961cf59c87075e61d9026833b50Paul Lawrence    public int changeEncryptionPassword(int type, String password)
15998e39736f91a08961cf59c87075e61d9026833b50Paul Lawrence        throws RemoteException;
1600f7b3cd4efd40b7631f36ea014407a850f7dc637eJason parks
1601d967f4664f40f9a4c5262a44b19df9bbdf457d8aMike Lockwood    /**
160232418be49e5b61c2e9281528cb8fb67939e301e8Christopher Tate     * Verify the encryption password against the stored volume.  This method
160332418be49e5b61c2e9281528cb8fb67939e301e8Christopher Tate     * may only be called by the system process.
160432418be49e5b61c2e9281528cb8fb67939e301e8Christopher Tate     */
160532418be49e5b61c2e9281528cb8fb67939e301e8Christopher Tate    public int verifyEncryptionPassword(String password) throws RemoteException;
160632418be49e5b61c2e9281528cb8fb67939e301e8Christopher Tate
160732418be49e5b61c2e9281528cb8fb67939e301e8Christopher Tate    /**
1608d967f4664f40f9a4c5262a44b19df9bbdf457d8aMike Lockwood     * Returns list of all mountable volumes.
1609d967f4664f40f9a4c5262a44b19df9bbdf457d8aMike Lockwood     */
1610b049e212ab7fe8967893c202efcb30fecfdb82fbJeff Sharkey    public StorageVolume[] getVolumeList() throws RemoteException;
1611292f8bc9d1b790ab975a87a842c7fabc908b97e0Dianne Hackborn
161251a573c76737733638c475f52e441c814e6645ccKenny Root    /**
161351a573c76737733638c475f52e441c814e6645ccKenny Root     * Gets the path on the filesystem for the ASEC container itself.
161451a573c76737733638c475f52e441c814e6645ccKenny Root     *
161551a573c76737733638c475f52e441c814e6645ccKenny Root     * @param cid ASEC container ID
161651a573c76737733638c475f52e441c814e6645ccKenny Root     * @return path to filesystem or {@code null} if it's not found
161751a573c76737733638c475f52e441c814e6645ccKenny Root     * @throws RemoteException
161851a573c76737733638c475f52e441c814e6645ccKenny Root     */
161951a573c76737733638c475f52e441c814e6645ccKenny Root    public String getSecureContainerFilesystemPath(String cid) throws RemoteException;
16206dceb88f1c7c42c6ab43834af2c993d599895d82Kenny Root
16216dceb88f1c7c42c6ab43834af2c993d599895d82Kenny Root    /*
16226dceb88f1c7c42c6ab43834af2c993d599895d82Kenny Root     * Fix permissions in a container which has just been created and populated.
16236dceb88f1c7c42c6ab43834af2c993d599895d82Kenny Root     * Returns an int consistent with MountServiceResultCode
16246dceb88f1c7c42c6ab43834af2c993d599895d82Kenny Root     */
16256dceb88f1c7c42c6ab43834af2c993d599895d82Kenny Root    public int fixPermissionsSecureContainer(String id, int gid, String filename)
16266dceb88f1c7c42c6ab43834af2c993d599895d82Kenny Root            throws RemoteException;
16272d8b4e801332e02d6aad615b85cc9dd056ef805cJeff Sharkey
16282d8b4e801332e02d6aad615b85cc9dd056ef805cJeff Sharkey    /**
16292d8b4e801332e02d6aad615b85cc9dd056ef805cJeff Sharkey     * Ensure that all directories along given path exist, creating parent
16302d8b4e801332e02d6aad615b85cc9dd056ef805cJeff Sharkey     * directories as needed. Validates that given path is absolute and that it
16312d8b4e801332e02d6aad615b85cc9dd056ef805cJeff Sharkey     * contains no relative "." or ".." paths or symlinks. Also ensures that
16322d8b4e801332e02d6aad615b85cc9dd056ef805cJeff Sharkey     * path belongs to a volume managed by vold, and that path is either
16332d8b4e801332e02d6aad615b85cc9dd056ef805cJeff Sharkey     * external storage data or OBB directory belonging to calling app.
16342d8b4e801332e02d6aad615b85cc9dd056ef805cJeff Sharkey     */
16352d8b4e801332e02d6aad615b85cc9dd056ef805cJeff Sharkey    public int mkdirs(String callingPkg, String path) throws RemoteException;
16368e39736f91a08961cf59c87075e61d9026833b50Paul Lawrence
16378e39736f91a08961cf59c87075e61d9026833b50Paul Lawrence    /**
16388e39736f91a08961cf59c87075e61d9026833b50Paul Lawrence     * Determines the type of the encryption password
16398e39736f91a08961cf59c87075e61d9026833b50Paul Lawrence     * @return PasswordType
16408e39736f91a08961cf59c87075e61d9026833b50Paul Lawrence     */
16418e39736f91a08961cf59c87075e61d9026833b50Paul Lawrence    public int getPasswordType() throws RemoteException;
1642945490c12e32b1c13b9097c00702558260b2011fPaul Lawrence
1643945490c12e32b1c13b9097c00702558260b2011fPaul Lawrence    /**
1644945490c12e32b1c13b9097c00702558260b2011fPaul Lawrence     * Get password from vold
1645945490c12e32b1c13b9097c00702558260b2011fPaul Lawrence     * @return password or empty string
1646945490c12e32b1c13b9097c00702558260b2011fPaul Lawrence     */
1647945490c12e32b1c13b9097c00702558260b2011fPaul Lawrence    public String getPassword() throws RemoteException;
1648945490c12e32b1c13b9097c00702558260b2011fPaul Lawrence
1649945490c12e32b1c13b9097c00702558260b2011fPaul Lawrence    /**
1650945490c12e32b1c13b9097c00702558260b2011fPaul Lawrence     * Securely clear password from vold
1651945490c12e32b1c13b9097c00702558260b2011fPaul Lawrence     */
1652945490c12e32b1c13b9097c00702558260b2011fPaul Lawrence    public void clearPassword() throws RemoteException;
1653e51dcf98a4ddb1340cffba88059ad89f0b90909aPaul Lawrence
1654e51dcf98a4ddb1340cffba88059ad89f0b90909aPaul Lawrence    /**
1655e51dcf98a4ddb1340cffba88059ad89f0b90909aPaul Lawrence     * Set a field in the crypto header.
1656e51dcf98a4ddb1340cffba88059ad89f0b90909aPaul Lawrence     * @param field field to set
1657e51dcf98a4ddb1340cffba88059ad89f0b90909aPaul Lawrence     * @param contents contents to set in field
1658e51dcf98a4ddb1340cffba88059ad89f0b90909aPaul Lawrence     */
1659e51dcf98a4ddb1340cffba88059ad89f0b90909aPaul Lawrence    public void setField(String field, String contents) throws RemoteException;
1660e51dcf98a4ddb1340cffba88059ad89f0b90909aPaul Lawrence
1661e51dcf98a4ddb1340cffba88059ad89f0b90909aPaul Lawrence    /**
1662e51dcf98a4ddb1340cffba88059ad89f0b90909aPaul Lawrence     * Gets a field from the crypto header.
1663e51dcf98a4ddb1340cffba88059ad89f0b90909aPaul Lawrence     * @param field field to get
1664e51dcf98a4ddb1340cffba88059ad89f0b90909aPaul Lawrence     * @return contents of field
1665e51dcf98a4ddb1340cffba88059ad89f0b90909aPaul Lawrence     */
1666e51dcf98a4ddb1340cffba88059ad89f0b90909aPaul Lawrence    public String getField(String field) throws RemoteException;
1667941a8ba1a6043cf84a7bf622e44a0b4f7abd0178Jeff Sharkey
1668941a8ba1a6043cf84a7bf622e44a0b4f7abd0178Jeff Sharkey    public int resizeSecureContainer(String id, int sizeMb, String key) throws RemoteException;
16697265abe77a76f848a316640b5da106e882bdbc8aChristopher Tate
16707265abe77a76f848a316640b5da106e882bdbc8aChristopher Tate    /**
16717265abe77a76f848a316640b5da106e882bdbc8aChristopher Tate     * Report the time of the last maintenance operation such as fstrim.
16727265abe77a76f848a316640b5da106e882bdbc8aChristopher Tate     * @return Timestamp of the last maintenance operation, in the
16737265abe77a76f848a316640b5da106e882bdbc8aChristopher Tate     *     System.currentTimeMillis() time base
16747265abe77a76f848a316640b5da106e882bdbc8aChristopher Tate     * @throws RemoteException
16757265abe77a76f848a316640b5da106e882bdbc8aChristopher Tate     */
16767265abe77a76f848a316640b5da106e882bdbc8aChristopher Tate    public long lastMaintenance() throws RemoteException;
16777265abe77a76f848a316640b5da106e882bdbc8aChristopher Tate
16787265abe77a76f848a316640b5da106e882bdbc8aChristopher Tate    /**
16797265abe77a76f848a316640b5da106e882bdbc8aChristopher Tate     * Kick off an immediate maintenance operation
16807265abe77a76f848a316640b5da106e882bdbc8aChristopher Tate     * @throws RemoteException
16817265abe77a76f848a316640b5da106e882bdbc8aChristopher Tate     */
16827265abe77a76f848a316640b5da106e882bdbc8aChristopher Tate    public void runMaintenance() throws RemoteException;
1683be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root}
1684