IMountService.java revision 6dceb88f1c7c42c6ab43834af2c993d599895d82
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;
232f6a3885533a52758c2cd4f81f6123a712be8ae6Mike Lockwoodimport android.os.Parcelable;
24be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Rootimport android.os.RemoteException;
252f6a3885533a52758c2cd4f81f6123a712be8ae6Mike Lockwoodimport android.os.storage.StorageVolume;
26be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root
27be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root/**
28be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root * WARNING! Update IMountService.h and IMountService.cpp if you change this
29be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root * file. In particular, the ordering of the methods below must match the
30be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root * _TRANSACTION enum in IMountService.cpp
31f7b3cd4efd40b7631f36ea014407a850f7dc637eJason parks *
32be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root * @hide - Applications should use android.os.storage.StorageManager to access
33be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root *       storage functions.
34be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root */
35be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Rootpublic interface IMountService extends IInterface {
36be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root    /** Local-side IPC implementation stub class. */
37be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root    public static abstract class Stub extends Binder implements IMountService {
38be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root        private static class Proxy implements IMountService {
39444eca232964dbf27d0c4d01447c1493f89186e0Ben Komalo            private final IBinder mRemote;
40be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root
41be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root            Proxy(IBinder remote) {
42be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root                mRemote = remote;
43be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root            }
44be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root
45be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root            public IBinder asBinder() {
46be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root                return mRemote;
47be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root            }
48be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root
49be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root            public String getInterfaceDescriptor() {
50be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root                return DESCRIPTOR;
51be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root            }
52be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root
53be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root            /**
54be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root             * Registers an IMountServiceListener for receiving async
55be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root             * notifications.
56be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root             */
57be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root            public void registerListener(IMountServiceListener listener) throws RemoteException {
58be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root                Parcel _data = Parcel.obtain();
59be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root                Parcel _reply = Parcel.obtain();
60be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root                try {
61be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root                    _data.writeInterfaceToken(DESCRIPTOR);
62be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root                    _data.writeStrongBinder((listener != null ? listener.asBinder() : null));
63be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root                    mRemote.transact(Stub.TRANSACTION_registerListener, _data, _reply, 0);
64be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root                    _reply.readException();
65be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root                } finally {
66be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root                    _reply.recycle();
67be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root                    _data.recycle();
68be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root                }
69be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root            }
70be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root
71be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root            /**
72be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root             * Unregisters an IMountServiceListener
73be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root             */
74be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root            public void unregisterListener(IMountServiceListener listener) throws RemoteException {
75be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root                Parcel _data = Parcel.obtain();
76be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root                Parcel _reply = Parcel.obtain();
77be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root                try {
78be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root                    _data.writeInterfaceToken(DESCRIPTOR);
79be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root                    _data.writeStrongBinder((listener != null ? listener.asBinder() : null));
80be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root                    mRemote.transact(Stub.TRANSACTION_unregisterListener, _data, _reply, 0);
81be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root                    _reply.readException();
82be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root                } finally {
83be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root                    _reply.recycle();
84be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root                    _data.recycle();
85be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root                }
86be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root            }
87be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root
88be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root            /**
89be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root             * Returns true if a USB mass storage host is connected
90be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root             */
91be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root            public boolean isUsbMassStorageConnected() throws RemoteException {
92be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root                Parcel _data = Parcel.obtain();
93be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root                Parcel _reply = Parcel.obtain();
94be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root                boolean _result;
95be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root                try {
96be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root                    _data.writeInterfaceToken(DESCRIPTOR);
97be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root                    mRemote.transact(Stub.TRANSACTION_isUsbMassStorageConnected, _data, _reply, 0);
98be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root                    _reply.readException();
99be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root                    _result = 0 != _reply.readInt();
100be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root                } finally {
101be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root                    _reply.recycle();
102be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root                    _data.recycle();
103be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root                }
104be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root                return _result;
105be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root            }
106be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root
107be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root            /**
108be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root             * Enables / disables USB mass storage. The caller should check
109be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root             * actual status of enabling/disabling USB mass storage via
110be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root             * StorageEventListener.
111be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root             */
112be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root            public void setUsbMassStorageEnabled(boolean enable) throws RemoteException {
113be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root                Parcel _data = Parcel.obtain();
114be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root                Parcel _reply = Parcel.obtain();
115be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root                try {
116be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root                    _data.writeInterfaceToken(DESCRIPTOR);
117be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root                    _data.writeInt((enable ? 1 : 0));
118be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root                    mRemote.transact(Stub.TRANSACTION_setUsbMassStorageEnabled, _data, _reply, 0);
119be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root                    _reply.readException();
120be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root                } finally {
121be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root                    _reply.recycle();
122be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root                    _data.recycle();
123be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root                }
124be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root            }
125be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root
126be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root            /**
127be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root             * Returns true if a USB mass storage host is enabled (media is
128be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root             * shared)
129be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root             */
130be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root            public boolean isUsbMassStorageEnabled() throws RemoteException {
131be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root                Parcel _data = Parcel.obtain();
132be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root                Parcel _reply = Parcel.obtain();
133be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root                boolean _result;
134be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root                try {
135be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root                    _data.writeInterfaceToken(DESCRIPTOR);
136be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root                    mRemote.transact(Stub.TRANSACTION_isUsbMassStorageEnabled, _data, _reply, 0);
137be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root                    _reply.readException();
138be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root                    _result = 0 != _reply.readInt();
139be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root                } finally {
140be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root                    _reply.recycle();
141be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root                    _data.recycle();
142be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root                }
143be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root                return _result;
144be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root            }
145be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root
146be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root            /**
147be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root             * Mount external storage at given mount point. Returns an int
148be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root             * consistent with MountServiceResultCode
149be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root             */
150be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root            public int mountVolume(String mountPoint) throws RemoteException {
151be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root                Parcel _data = Parcel.obtain();
152be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root                Parcel _reply = Parcel.obtain();
153be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root                int _result;
154be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root                try {
155be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root                    _data.writeInterfaceToken(DESCRIPTOR);
156be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root                    _data.writeString(mountPoint);
157be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root                    mRemote.transact(Stub.TRANSACTION_mountVolume, _data, _reply, 0);
158be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root                    _reply.readException();
159be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root                    _result = _reply.readInt();
160be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root                } finally {
161be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root                    _reply.recycle();
162be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root                    _data.recycle();
163be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root                }
164be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root                return _result;
165be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root            }
166be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root
167be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root            /**
168be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root             * Safely unmount external storage at given mount point. The unmount
169be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root             * is an asynchronous operation. Applications should register
170be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root             * StorageEventListener for storage related status changes.
171be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root             */
17213c7197da8a16f77f6398708a6314c80cb01e0d1Ben Komalo            public void unmountVolume(String mountPoint, boolean force, boolean removeEncryption)
17313c7197da8a16f77f6398708a6314c80cb01e0d1Ben Komalo                    throws RemoteException {
174be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root                Parcel _data = Parcel.obtain();
175be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root                Parcel _reply = Parcel.obtain();
176be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root                try {
177be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root                    _data.writeInterfaceToken(DESCRIPTOR);
178be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root                    _data.writeString(mountPoint);
179be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root                    _data.writeInt((force ? 1 : 0));
18013c7197da8a16f77f6398708a6314c80cb01e0d1Ben Komalo                    _data.writeInt((removeEncryption ? 1 : 0));
181be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root                    mRemote.transact(Stub.TRANSACTION_unmountVolume, _data, _reply, 0);
182be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root                    _reply.readException();
183be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root                } finally {
184be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root                    _reply.recycle();
185be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root                    _data.recycle();
186be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root                }
187be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root            }
188be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root
189be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root            /**
190be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root             * Format external storage given a mount point. Returns an int
191be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root             * consistent with MountServiceResultCode
192be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root             */
193be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root            public int formatVolume(String mountPoint) throws RemoteException {
194be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root                Parcel _data = Parcel.obtain();
195be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root                Parcel _reply = Parcel.obtain();
196be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root                int _result;
197be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root                try {
198be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root                    _data.writeInterfaceToken(DESCRIPTOR);
199be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root                    _data.writeString(mountPoint);
200be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root                    mRemote.transact(Stub.TRANSACTION_formatVolume, _data, _reply, 0);
201be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root                    _reply.readException();
202be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root                    _result = _reply.readInt();
203be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root                } finally {
204be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root                    _reply.recycle();
205be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root                    _data.recycle();
206be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root                }
207be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root                return _result;
208be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root            }
209be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root
210be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root            /**
211be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root             * Returns an array of pids with open files on the specified path.
212be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root             */
213be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root            public int[] getStorageUsers(String path) throws RemoteException {
214be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root                Parcel _data = Parcel.obtain();
215be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root                Parcel _reply = Parcel.obtain();
216be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root                int[] _result;
217be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root                try {
218be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root                    _data.writeInterfaceToken(DESCRIPTOR);
219be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root                    _data.writeString(path);
220be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root                    mRemote.transact(Stub.TRANSACTION_getStorageUsers, _data, _reply, 0);
221be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root                    _reply.readException();
222be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root                    _result = _reply.createIntArray();
223be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root                } finally {
224be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root                    _reply.recycle();
225be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root                    _data.recycle();
226be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root                }
227be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root                return _result;
228be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root            }
229be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root
230be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root            /**
231be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root             * Gets the state of a volume via its mountpoint.
232be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root             */
233be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root            public String getVolumeState(String mountPoint) throws RemoteException {
234be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root                Parcel _data = Parcel.obtain();
235be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root                Parcel _reply = Parcel.obtain();
236be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root                String _result;
237be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root                try {
238be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root                    _data.writeInterfaceToken(DESCRIPTOR);
239be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root                    _data.writeString(mountPoint);
240be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root                    mRemote.transact(Stub.TRANSACTION_getVolumeState, _data, _reply, 0);
241be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root                    _reply.readException();
242be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root                    _result = _reply.readString();
243be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root                } finally {
244be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root                    _reply.recycle();
245be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root                    _data.recycle();
246be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root                }
247be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root                return _result;
248be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root            }
249be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root
250be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root            /*
251be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root             * Creates a secure container with the specified parameters. Returns
252be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root             * an int consistent with MountServiceResultCode
253be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root             */
254be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root            public int createSecureContainer(String id, int sizeMb, String fstype, String key,
2556dceb88f1c7c42c6ab43834af2c993d599895d82Kenny Root                    int ownerUid, boolean external) throws RemoteException {
256be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root                Parcel _data = Parcel.obtain();
257be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root                Parcel _reply = Parcel.obtain();
258be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root                int _result;
259be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root                try {
260be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root                    _data.writeInterfaceToken(DESCRIPTOR);
261be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root                    _data.writeString(id);
262be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root                    _data.writeInt(sizeMb);
263be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root                    _data.writeString(fstype);
264be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root                    _data.writeString(key);
265be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root                    _data.writeInt(ownerUid);
2666dceb88f1c7c42c6ab43834af2c993d599895d82Kenny Root                    _data.writeInt(external ? 1 : 0);
267be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root                    mRemote.transact(Stub.TRANSACTION_createSecureContainer, _data, _reply, 0);
268be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root                    _reply.readException();
269be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root                    _result = _reply.readInt();
270be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root                } finally {
271be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root                    _reply.recycle();
272be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root                    _data.recycle();
273be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root                }
274be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root                return _result;
275be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root            }
276be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root
277be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root            /*
278be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root             * Destroy a secure container, and free up all resources associated
279be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root             * with it. NOTE: Ensure all references are released prior to
280be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root             * deleting. Returns an int consistent with MountServiceResultCode
281be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root             */
282be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root            public int destroySecureContainer(String id, boolean force) throws RemoteException {
283be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root                Parcel _data = Parcel.obtain();
284be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root                Parcel _reply = Parcel.obtain();
285be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root                int _result;
286be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root                try {
287be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root                    _data.writeInterfaceToken(DESCRIPTOR);
288be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root                    _data.writeString(id);
289be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root                    _data.writeInt((force ? 1 : 0));
290be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root                    mRemote.transact(Stub.TRANSACTION_destroySecureContainer, _data, _reply, 0);
291be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root                    _reply.readException();
292be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root                    _result = _reply.readInt();
293be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root                } finally {
294be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root                    _reply.recycle();
295be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root                    _data.recycle();
296be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root                }
297be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root                return _result;
298be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root            }
299be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root
300be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root            /*
301be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root             * Finalize a container which has just been created and populated.
302be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root             * After finalization, the container is immutable. Returns an int
303be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root             * consistent with MountServiceResultCode
304be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root             */
305be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root            public int finalizeSecureContainer(String id) throws RemoteException {
306be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root                Parcel _data = Parcel.obtain();
307be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root                Parcel _reply = Parcel.obtain();
308be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root                int _result;
309be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root                try {
310be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root                    _data.writeInterfaceToken(DESCRIPTOR);
311be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root                    _data.writeString(id);
312be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root                    mRemote.transact(Stub.TRANSACTION_finalizeSecureContainer, _data, _reply, 0);
313be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root                    _reply.readException();
314be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root                    _result = _reply.readInt();
315be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root                } finally {
316be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root                    _reply.recycle();
317be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root                    _data.recycle();
318be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root                }
319be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root                return _result;
320be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root            }
321be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root
322be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root            /*
323be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root             * Mount a secure container with the specified key and owner UID.
324be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root             * Returns an int consistent with MountServiceResultCode
325be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root             */
326be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root            public int mountSecureContainer(String id, String key, int ownerUid)
327be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root                    throws RemoteException {
328be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root                Parcel _data = Parcel.obtain();
329be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root                Parcel _reply = Parcel.obtain();
330be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root                int _result;
331be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root                try {
332be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root                    _data.writeInterfaceToken(DESCRIPTOR);
333be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root                    _data.writeString(id);
334be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root                    _data.writeString(key);
335be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root                    _data.writeInt(ownerUid);
336be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root                    mRemote.transact(Stub.TRANSACTION_mountSecureContainer, _data, _reply, 0);
337be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root                    _reply.readException();
338be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root                    _result = _reply.readInt();
339be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root                } finally {
340be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root                    _reply.recycle();
341be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root                    _data.recycle();
342be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root                }
343be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root                return _result;
344be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root            }
345be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root
346be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root            /*
347be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root             * Unount a secure container. Returns an int consistent with
348be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root             * MountServiceResultCode
349be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root             */
350be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root            public int unmountSecureContainer(String id, boolean force) throws RemoteException {
351be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root                Parcel _data = Parcel.obtain();
352be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root                Parcel _reply = Parcel.obtain();
353be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root                int _result;
354be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root                try {
355be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root                    _data.writeInterfaceToken(DESCRIPTOR);
356be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root                    _data.writeString(id);
357be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root                    _data.writeInt((force ? 1 : 0));
358be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root                    mRemote.transact(Stub.TRANSACTION_unmountSecureContainer, _data, _reply, 0);
359be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root                    _reply.readException();
360be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root                    _result = _reply.readInt();
361be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root                } finally {
362be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root                    _reply.recycle();
363be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root                    _data.recycle();
364be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root                }
365be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root                return _result;
366be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root            }
367be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root
368be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root            /*
369be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root             * Returns true if the specified container is mounted
370be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root             */
371be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root            public boolean isSecureContainerMounted(String id) throws RemoteException {
372be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root                Parcel _data = Parcel.obtain();
373be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root                Parcel _reply = Parcel.obtain();
374be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root                boolean _result;
375be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root                try {
376be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root                    _data.writeInterfaceToken(DESCRIPTOR);
377be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root                    _data.writeString(id);
378be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root                    mRemote.transact(Stub.TRANSACTION_isSecureContainerMounted, _data, _reply, 0);
379be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root                    _reply.readException();
380be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root                    _result = 0 != _reply.readInt();
381be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root                } finally {
382be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root                    _reply.recycle();
383be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root                    _data.recycle();
384be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root                }
385be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root                return _result;
386be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root            }
387be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root
388be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root            /*
389be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root             * Rename an unmounted secure container. Returns an int consistent
390be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root             * with MountServiceResultCode
391be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root             */
392be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root            public int renameSecureContainer(String oldId, String newId) throws RemoteException {
393be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root                Parcel _data = Parcel.obtain();
394be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root                Parcel _reply = Parcel.obtain();
395be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root                int _result;
396be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root                try {
397be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root                    _data.writeInterfaceToken(DESCRIPTOR);
398be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root                    _data.writeString(oldId);
399be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root                    _data.writeString(newId);
400be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root                    mRemote.transact(Stub.TRANSACTION_renameSecureContainer, _data, _reply, 0);
401be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root                    _reply.readException();
402be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root                    _result = _reply.readInt();
403be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root                } finally {
404be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root                    _reply.recycle();
405be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root                    _data.recycle();
406be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root                }
407be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root                return _result;
408be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root            }
409be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root
410be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root            /*
411be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root             * Returns the filesystem path of a mounted secure container.
412be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root             */
413be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root            public String getSecureContainerPath(String id) throws RemoteException {
414be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root                Parcel _data = Parcel.obtain();
415be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root                Parcel _reply = Parcel.obtain();
416be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root                String _result;
417be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root                try {
418be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root                    _data.writeInterfaceToken(DESCRIPTOR);
419be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root                    _data.writeString(id);
420be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root                    mRemote.transact(Stub.TRANSACTION_getSecureContainerPath, _data, _reply, 0);
421be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root                    _reply.readException();
422be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root                    _result = _reply.readString();
423be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root                } finally {
424be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root                    _reply.recycle();
425be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root                    _data.recycle();
426be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root                }
427be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root                return _result;
428be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root            }
429be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root
430be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root            /**
431be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root             * Gets an Array of currently known secure container IDs
432be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root             */
433be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root            public String[] getSecureContainerList() throws RemoteException {
434be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root                Parcel _data = Parcel.obtain();
435be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root                Parcel _reply = Parcel.obtain();
436be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root                String[] _result;
437be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root                try {
438be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root                    _data.writeInterfaceToken(DESCRIPTOR);
439be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root                    mRemote.transact(Stub.TRANSACTION_getSecureContainerList, _data, _reply, 0);
440be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root                    _reply.readException();
441be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root                    _result = _reply.createStringArray();
442be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root                } finally {
443be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root                    _reply.recycle();
444be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root                    _data.recycle();
445be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root                }
446be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root                return _result;
447be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root            }
448be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root
449be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root            /**
450be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root             * Shuts down the MountService and gracefully unmounts all external
451be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root             * media. Invokes call back once the shutdown is complete.
452be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root             */
453be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root            public void shutdown(IMountShutdownObserver observer)
454be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root                    throws RemoteException {
455be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root                Parcel _data = Parcel.obtain();
456be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root                Parcel _reply = Parcel.obtain();
457be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root                try {
458be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root                    _data.writeInterfaceToken(DESCRIPTOR);
459be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root                    _data.writeStrongBinder((observer != null ? observer.asBinder() : null));
460be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root                    mRemote.transact(Stub.TRANSACTION_shutdown, _data, _reply, 0);
461be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root                    _reply.readException();
462be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root                } finally {
463be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root                    _reply.recycle();
464be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root                    _data.recycle();
465be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root                }
466be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root            }
467be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root
468be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root            /**
469be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root             * Call into MountService by PackageManager to notify that its done
470be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root             * processing the media status update request.
471be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root             */
472be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root            public void finishMediaUpdate() throws RemoteException {
473be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root                Parcel _data = Parcel.obtain();
474be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root                Parcel _reply = Parcel.obtain();
475be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root                try {
476be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root                    _data.writeInterfaceToken(DESCRIPTOR);
477be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root                    mRemote.transact(Stub.TRANSACTION_finishMediaUpdate, _data, _reply, 0);
478be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root                    _reply.readException();
479be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root                } finally {
480be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root                    _reply.recycle();
481be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root                    _data.recycle();
482be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root                }
483be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root            }
484be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root
485be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root            /**
486be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root             * Mounts an Opaque Binary Blob (OBB) with the specified decryption
487be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root             * key and only allows the calling process's UID access to the
488be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root             * contents. MountService will call back to the supplied
489be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root             * IObbActionListener to inform it of the terminal state of the
490be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root             * call.
491be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root             */
492af9d667ccf3e24058214cf4cc0a8aa8bc5100e3cKenny Root            public void mountObb(String filename, String key, IObbActionListener token, int nonce)
493be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root                    throws RemoteException {
494be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root                Parcel _data = Parcel.obtain();
495be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root                Parcel _reply = Parcel.obtain();
496be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root                try {
497be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root                    _data.writeInterfaceToken(DESCRIPTOR);
498be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root                    _data.writeString(filename);
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             */
517af9d667ccf3e24058214cf4cc0a8aa8bc5100e3cKenny Root            public void unmountObb(String filename, boolean force, IObbActionListener token,
518af9d667ccf3e24058214cf4cc0a8aa8bc5100e3cKenny Root                    int nonce) throws RemoteException {
519be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root                Parcel _data = Parcel.obtain();
520be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root                Parcel _reply = Parcel.obtain();
521be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root                try {
522be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root                    _data.writeInterfaceToken(DESCRIPTOR);
523be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root                    _data.writeString(filename);
524be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root                    _data.writeInt((force ? 1 : 0));
525be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root                    _data.writeStrongBinder((token != null ? token.asBinder() : null));
526af9d667ccf3e24058214cf4cc0a8aa8bc5100e3cKenny Root                    _data.writeInt(nonce);
527be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root                    mRemote.transact(Stub.TRANSACTION_unmountObb, _data, _reply, 0);
528be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root                    _reply.readException();
529be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root                } finally {
530be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root                    _reply.recycle();
531be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root                    _data.recycle();
532be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root                }
533be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root            }
534be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root
535be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root            /**
536be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root             * Checks whether the specified Opaque Binary Blob (OBB) is mounted
537be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root             * somewhere.
538be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root             */
539be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root            public boolean isObbMounted(String filename) throws RemoteException {
540be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root                Parcel _data = Parcel.obtain();
541be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root                Parcel _reply = Parcel.obtain();
542be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root                boolean _result;
543be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root                try {
544be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root                    _data.writeInterfaceToken(DESCRIPTOR);
545be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root                    _data.writeString(filename);
546be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root                    mRemote.transact(Stub.TRANSACTION_isObbMounted, _data, _reply, 0);
547be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root                    _reply.readException();
548be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root                    _result = 0 != _reply.readInt();
549be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root                } finally {
550be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root                    _reply.recycle();
551be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root                    _data.recycle();
552be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root                }
553be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root                return _result;
554be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root            }
555be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root
556be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root            /**
557be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root             * Gets the path to the mounted Opaque Binary Blob (OBB).
558be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root             */
559be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root            public String getMountedObbPath(String filename) throws RemoteException {
560be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root                Parcel _data = Parcel.obtain();
561be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root                Parcel _reply = Parcel.obtain();
562be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root                String _result;
563be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root                try {
564be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root                    _data.writeInterfaceToken(DESCRIPTOR);
565be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root                    _data.writeString(filename);
566be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root                    mRemote.transact(Stub.TRANSACTION_getMountedObbPath, _data, _reply, 0);
567be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root                    _reply.readException();
568be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root                    _result = _reply.readString();
569be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root                } finally {
570be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root                    _reply.recycle();
571be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root                    _data.recycle();
572be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root                }
573be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root                return _result;
574be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root            }
575e1ff214e32ed5c546a7603b07b054908c4d93312Kenny Root
576e1ff214e32ed5c546a7603b07b054908c4d93312Kenny Root            /**
577e1ff214e32ed5c546a7603b07b054908c4d93312Kenny Root             * Returns whether the external storage is emulated.
578e1ff214e32ed5c546a7603b07b054908c4d93312Kenny Root             */
579e1ff214e32ed5c546a7603b07b054908c4d93312Kenny Root            public boolean isExternalStorageEmulated() throws RemoteException {
580e1ff214e32ed5c546a7603b07b054908c4d93312Kenny Root                Parcel _data = Parcel.obtain();
581e1ff214e32ed5c546a7603b07b054908c4d93312Kenny Root                Parcel _reply = Parcel.obtain();
582e1ff214e32ed5c546a7603b07b054908c4d93312Kenny Root                boolean _result;
583e1ff214e32ed5c546a7603b07b054908c4d93312Kenny Root                try {
584e1ff214e32ed5c546a7603b07b054908c4d93312Kenny Root                    _data.writeInterfaceToken(DESCRIPTOR);
585e1ff214e32ed5c546a7603b07b054908c4d93312Kenny Root                    mRemote.transact(Stub.TRANSACTION_isExternalStorageEmulated, _data, _reply, 0);
586e1ff214e32ed5c546a7603b07b054908c4d93312Kenny Root                    _reply.readException();
587e1ff214e32ed5c546a7603b07b054908c4d93312Kenny Root                    _result = 0 != _reply.readInt();
588e1ff214e32ed5c546a7603b07b054908c4d93312Kenny Root                } finally {
589e1ff214e32ed5c546a7603b07b054908c4d93312Kenny Root                    _reply.recycle();
590e1ff214e32ed5c546a7603b07b054908c4d93312Kenny Root                    _data.recycle();
591e1ff214e32ed5c546a7603b07b054908c4d93312Kenny Root                }
592e1ff214e32ed5c546a7603b07b054908c4d93312Kenny Root                return _result;
593e1ff214e32ed5c546a7603b07b054908c4d93312Kenny Root            }
5945af0b916f850486cff4797355bf9e7dc3352fe00Jason parks
595444eca232964dbf27d0c4d01447c1493f89186e0Ben Komalo            public int getEncryptionState() throws RemoteException {
596444eca232964dbf27d0c4d01447c1493f89186e0Ben Komalo                Parcel _data = Parcel.obtain();
597444eca232964dbf27d0c4d01447c1493f89186e0Ben Komalo                Parcel _reply = Parcel.obtain();
598444eca232964dbf27d0c4d01447c1493f89186e0Ben Komalo                int _result;
599444eca232964dbf27d0c4d01447c1493f89186e0Ben Komalo                try {
600444eca232964dbf27d0c4d01447c1493f89186e0Ben Komalo                    _data.writeInterfaceToken(DESCRIPTOR);
601444eca232964dbf27d0c4d01447c1493f89186e0Ben Komalo                    mRemote.transact(Stub.TRANSACTION_getEncryptionState, _data, _reply, 0);
602444eca232964dbf27d0c4d01447c1493f89186e0Ben Komalo                    _reply.readException();
603444eca232964dbf27d0c4d01447c1493f89186e0Ben Komalo                    _result = _reply.readInt();
604444eca232964dbf27d0c4d01447c1493f89186e0Ben Komalo                } finally {
605444eca232964dbf27d0c4d01447c1493f89186e0Ben Komalo                    _reply.recycle();
606444eca232964dbf27d0c4d01447c1493f89186e0Ben Komalo                    _data.recycle();
607444eca232964dbf27d0c4d01447c1493f89186e0Ben Komalo                }
608444eca232964dbf27d0c4d01447c1493f89186e0Ben Komalo                return _result;
609444eca232964dbf27d0c4d01447c1493f89186e0Ben Komalo            }
610444eca232964dbf27d0c4d01447c1493f89186e0Ben Komalo
6115af0b916f850486cff4797355bf9e7dc3352fe00Jason parks            public int decryptStorage(String password) throws RemoteException {
6125af0b916f850486cff4797355bf9e7dc3352fe00Jason parks                Parcel _data = Parcel.obtain();
6135af0b916f850486cff4797355bf9e7dc3352fe00Jason parks                Parcel _reply = Parcel.obtain();
6145af0b916f850486cff4797355bf9e7dc3352fe00Jason parks                int _result;
6155af0b916f850486cff4797355bf9e7dc3352fe00Jason parks                try {
6165af0b916f850486cff4797355bf9e7dc3352fe00Jason parks                    _data.writeInterfaceToken(DESCRIPTOR);
6175af0b916f850486cff4797355bf9e7dc3352fe00Jason parks                    _data.writeString(password);
6185af0b916f850486cff4797355bf9e7dc3352fe00Jason parks                    mRemote.transact(Stub.TRANSACTION_decryptStorage, _data, _reply, 0);
6195af0b916f850486cff4797355bf9e7dc3352fe00Jason parks                    _reply.readException();
6205af0b916f850486cff4797355bf9e7dc3352fe00Jason parks                    _result = _reply.readInt();
6215af0b916f850486cff4797355bf9e7dc3352fe00Jason parks                } finally {
6225af0b916f850486cff4797355bf9e7dc3352fe00Jason parks                    _reply.recycle();
6235af0b916f850486cff4797355bf9e7dc3352fe00Jason parks                    _data.recycle();
6245af0b916f850486cff4797355bf9e7dc3352fe00Jason parks                }
6255af0b916f850486cff4797355bf9e7dc3352fe00Jason parks                return _result;
6265af0b916f850486cff4797355bf9e7dc3352fe00Jason parks            }
62756aa5321fe6f00fa3662e6f46a4b2559aa34f63eJason parks
62856aa5321fe6f00fa3662e6f46a4b2559aa34f63eJason parks            public int encryptStorage(String password) throws RemoteException {
62956aa5321fe6f00fa3662e6f46a4b2559aa34f63eJason parks                Parcel _data = Parcel.obtain();
63056aa5321fe6f00fa3662e6f46a4b2559aa34f63eJason parks                Parcel _reply = Parcel.obtain();
63156aa5321fe6f00fa3662e6f46a4b2559aa34f63eJason parks                int _result;
63256aa5321fe6f00fa3662e6f46a4b2559aa34f63eJason parks                try {
63356aa5321fe6f00fa3662e6f46a4b2559aa34f63eJason parks                    _data.writeInterfaceToken(DESCRIPTOR);
63456aa5321fe6f00fa3662e6f46a4b2559aa34f63eJason parks                    _data.writeString(password);
63556aa5321fe6f00fa3662e6f46a4b2559aa34f63eJason parks                    mRemote.transact(Stub.TRANSACTION_encryptStorage, _data, _reply, 0);
63656aa5321fe6f00fa3662e6f46a4b2559aa34f63eJason parks                    _reply.readException();
63756aa5321fe6f00fa3662e6f46a4b2559aa34f63eJason parks                    _result = _reply.readInt();
63856aa5321fe6f00fa3662e6f46a4b2559aa34f63eJason parks                } finally {
63956aa5321fe6f00fa3662e6f46a4b2559aa34f63eJason parks                    _reply.recycle();
64056aa5321fe6f00fa3662e6f46a4b2559aa34f63eJason parks                    _data.recycle();
64156aa5321fe6f00fa3662e6f46a4b2559aa34f63eJason parks                }
64256aa5321fe6f00fa3662e6f46a4b2559aa34f63eJason parks                return _result;
64356aa5321fe6f00fa3662e6f46a4b2559aa34f63eJason parks            }
644f7b3cd4efd40b7631f36ea014407a850f7dc637eJason parks
645f7b3cd4efd40b7631f36ea014407a850f7dc637eJason parks            public int changeEncryptionPassword(String password) throws RemoteException {
646f7b3cd4efd40b7631f36ea014407a850f7dc637eJason parks                Parcel _data = Parcel.obtain();
647f7b3cd4efd40b7631f36ea014407a850f7dc637eJason parks                Parcel _reply = Parcel.obtain();
648f7b3cd4efd40b7631f36ea014407a850f7dc637eJason parks                int _result;
649f7b3cd4efd40b7631f36ea014407a850f7dc637eJason parks                try {
650f7b3cd4efd40b7631f36ea014407a850f7dc637eJason parks                    _data.writeInterfaceToken(DESCRIPTOR);
651f7b3cd4efd40b7631f36ea014407a850f7dc637eJason parks                    _data.writeString(password);
652f7b3cd4efd40b7631f36ea014407a850f7dc637eJason parks                    mRemote.transact(Stub.TRANSACTION_changeEncryptionPassword, _data, _reply, 0);
653f7b3cd4efd40b7631f36ea014407a850f7dc637eJason parks                    _reply.readException();
654f7b3cd4efd40b7631f36ea014407a850f7dc637eJason parks                    _result = _reply.readInt();
655f7b3cd4efd40b7631f36ea014407a850f7dc637eJason parks                } finally {
656f7b3cd4efd40b7631f36ea014407a850f7dc637eJason parks                    _reply.recycle();
657f7b3cd4efd40b7631f36ea014407a850f7dc637eJason parks                    _data.recycle();
658f7b3cd4efd40b7631f36ea014407a850f7dc637eJason parks                }
659f7b3cd4efd40b7631f36ea014407a850f7dc637eJason parks                return _result;
660f7b3cd4efd40b7631f36ea014407a850f7dc637eJason parks            }
661d967f4664f40f9a4c5262a44b19df9bbdf457d8aMike Lockwood
66232418be49e5b61c2e9281528cb8fb67939e301e8Christopher Tate            @Override
66332418be49e5b61c2e9281528cb8fb67939e301e8Christopher Tate            public int verifyEncryptionPassword(String password) throws RemoteException {
66432418be49e5b61c2e9281528cb8fb67939e301e8Christopher Tate                Parcel _data = Parcel.obtain();
66532418be49e5b61c2e9281528cb8fb67939e301e8Christopher Tate                Parcel _reply = Parcel.obtain();
66632418be49e5b61c2e9281528cb8fb67939e301e8Christopher Tate                int _result;
66732418be49e5b61c2e9281528cb8fb67939e301e8Christopher Tate                try {
66832418be49e5b61c2e9281528cb8fb67939e301e8Christopher Tate                    _data.writeInterfaceToken(DESCRIPTOR);
66932418be49e5b61c2e9281528cb8fb67939e301e8Christopher Tate                    _data.writeString(password);
67032418be49e5b61c2e9281528cb8fb67939e301e8Christopher Tate                    mRemote.transact(Stub.TRANSACTION_verifyEncryptionPassword, _data, _reply, 0);
67132418be49e5b61c2e9281528cb8fb67939e301e8Christopher Tate                    _reply.readException();
67232418be49e5b61c2e9281528cb8fb67939e301e8Christopher Tate                    _result = _reply.readInt();
67332418be49e5b61c2e9281528cb8fb67939e301e8Christopher Tate                } finally {
67432418be49e5b61c2e9281528cb8fb67939e301e8Christopher Tate                    _reply.recycle();
67532418be49e5b61c2e9281528cb8fb67939e301e8Christopher Tate                    _data.recycle();
67632418be49e5b61c2e9281528cb8fb67939e301e8Christopher Tate                }
67732418be49e5b61c2e9281528cb8fb67939e301e8Christopher Tate                return _result;
67832418be49e5b61c2e9281528cb8fb67939e301e8Christopher Tate            }
67932418be49e5b61c2e9281528cb8fb67939e301e8Christopher Tate
6802f6a3885533a52758c2cd4f81f6123a712be8ae6Mike Lockwood            public Parcelable[] getVolumeList() throws RemoteException {
681d967f4664f40f9a4c5262a44b19df9bbdf457d8aMike Lockwood                Parcel _data = Parcel.obtain();
682d967f4664f40f9a4c5262a44b19df9bbdf457d8aMike Lockwood                Parcel _reply = Parcel.obtain();
6832f6a3885533a52758c2cd4f81f6123a712be8ae6Mike Lockwood                Parcelable[] _result;
684d967f4664f40f9a4c5262a44b19df9bbdf457d8aMike Lockwood                try {
685d967f4664f40f9a4c5262a44b19df9bbdf457d8aMike Lockwood                    _data.writeInterfaceToken(DESCRIPTOR);
686d967f4664f40f9a4c5262a44b19df9bbdf457d8aMike Lockwood                    mRemote.transact(Stub.TRANSACTION_getVolumeList, _data, _reply, 0);
687d967f4664f40f9a4c5262a44b19df9bbdf457d8aMike Lockwood                    _reply.readException();
6882f6a3885533a52758c2cd4f81f6123a712be8ae6Mike Lockwood                    _result = _reply.readParcelableArray(StorageVolume.class.getClassLoader());
689d967f4664f40f9a4c5262a44b19df9bbdf457d8aMike Lockwood                } finally {
690d967f4664f40f9a4c5262a44b19df9bbdf457d8aMike Lockwood                    _reply.recycle();
691d967f4664f40f9a4c5262a44b19df9bbdf457d8aMike Lockwood                    _data.recycle();
692d967f4664f40f9a4c5262a44b19df9bbdf457d8aMike Lockwood                }
693d967f4664f40f9a4c5262a44b19df9bbdf457d8aMike Lockwood                return _result;
694d967f4664f40f9a4c5262a44b19df9bbdf457d8aMike Lockwood            }
695292f8bc9d1b790ab975a87a842c7fabc908b97e0Dianne Hackborn
696292f8bc9d1b790ab975a87a842c7fabc908b97e0Dianne Hackborn            /*
697292f8bc9d1b790ab975a87a842c7fabc908b97e0Dianne Hackborn             * Returns the filesystem path of a mounted secure container.
698292f8bc9d1b790ab975a87a842c7fabc908b97e0Dianne Hackborn             */
699292f8bc9d1b790ab975a87a842c7fabc908b97e0Dianne Hackborn            public String getSecureContainerFilesystemPath(String id) throws RemoteException {
700292f8bc9d1b790ab975a87a842c7fabc908b97e0Dianne Hackborn                Parcel _data = Parcel.obtain();
701292f8bc9d1b790ab975a87a842c7fabc908b97e0Dianne Hackborn                Parcel _reply = Parcel.obtain();
702292f8bc9d1b790ab975a87a842c7fabc908b97e0Dianne Hackborn                String _result;
703292f8bc9d1b790ab975a87a842c7fabc908b97e0Dianne Hackborn                try {
704292f8bc9d1b790ab975a87a842c7fabc908b97e0Dianne Hackborn                    _data.writeInterfaceToken(DESCRIPTOR);
705292f8bc9d1b790ab975a87a842c7fabc908b97e0Dianne Hackborn                    _data.writeString(id);
706292f8bc9d1b790ab975a87a842c7fabc908b97e0Dianne Hackborn                    mRemote.transact(Stub.TRANSACTION_getSecureContainerFilesystemPath, _data, _reply, 0);
707292f8bc9d1b790ab975a87a842c7fabc908b97e0Dianne Hackborn                    _reply.readException();
708292f8bc9d1b790ab975a87a842c7fabc908b97e0Dianne Hackborn                    _result = _reply.readString();
709292f8bc9d1b790ab975a87a842c7fabc908b97e0Dianne Hackborn                } finally {
710292f8bc9d1b790ab975a87a842c7fabc908b97e0Dianne Hackborn                    _reply.recycle();
711292f8bc9d1b790ab975a87a842c7fabc908b97e0Dianne Hackborn                    _data.recycle();
712292f8bc9d1b790ab975a87a842c7fabc908b97e0Dianne Hackborn                }
713292f8bc9d1b790ab975a87a842c7fabc908b97e0Dianne Hackborn                return _result;
714292f8bc9d1b790ab975a87a842c7fabc908b97e0Dianne Hackborn            }
7156dceb88f1c7c42c6ab43834af2c993d599895d82Kenny Root
7166dceb88f1c7c42c6ab43834af2c993d599895d82Kenny Root            /**
7176dceb88f1c7c42c6ab43834af2c993d599895d82Kenny Root             * Fix permissions in a container which has just been created and
7186dceb88f1c7c42c6ab43834af2c993d599895d82Kenny Root             * populated. Returns an int consistent with MountServiceResultCode
7196dceb88f1c7c42c6ab43834af2c993d599895d82Kenny Root             */
7206dceb88f1c7c42c6ab43834af2c993d599895d82Kenny Root            public int fixPermissionsSecureContainer(String id, int gid, String filename)
7216dceb88f1c7c42c6ab43834af2c993d599895d82Kenny Root                    throws RemoteException {
7226dceb88f1c7c42c6ab43834af2c993d599895d82Kenny Root                Parcel _data = Parcel.obtain();
7236dceb88f1c7c42c6ab43834af2c993d599895d82Kenny Root                Parcel _reply = Parcel.obtain();
7246dceb88f1c7c42c6ab43834af2c993d599895d82Kenny Root                int _result;
7256dceb88f1c7c42c6ab43834af2c993d599895d82Kenny Root                try {
7266dceb88f1c7c42c6ab43834af2c993d599895d82Kenny Root                    _data.writeInterfaceToken(DESCRIPTOR);
7276dceb88f1c7c42c6ab43834af2c993d599895d82Kenny Root                    _data.writeString(id);
7286dceb88f1c7c42c6ab43834af2c993d599895d82Kenny Root                    _data.writeInt(gid);
7296dceb88f1c7c42c6ab43834af2c993d599895d82Kenny Root                    _data.writeString(filename);
7306dceb88f1c7c42c6ab43834af2c993d599895d82Kenny Root                    mRemote.transact(Stub.TRANSACTION_fixPermissionsSecureContainer, _data, _reply, 0);
7316dceb88f1c7c42c6ab43834af2c993d599895d82Kenny Root                    _reply.readException();
7326dceb88f1c7c42c6ab43834af2c993d599895d82Kenny Root                    _result = _reply.readInt();
7336dceb88f1c7c42c6ab43834af2c993d599895d82Kenny Root                } finally {
7346dceb88f1c7c42c6ab43834af2c993d599895d82Kenny Root                    _reply.recycle();
7356dceb88f1c7c42c6ab43834af2c993d599895d82Kenny Root                    _data.recycle();
7366dceb88f1c7c42c6ab43834af2c993d599895d82Kenny Root                }
7376dceb88f1c7c42c6ab43834af2c993d599895d82Kenny Root                return _result;
7386dceb88f1c7c42c6ab43834af2c993d599895d82Kenny Root
7396dceb88f1c7c42c6ab43834af2c993d599895d82Kenny Root            }
740be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root        }
741be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root
742be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root        private static final String DESCRIPTOR = "IMountService";
743be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root
744be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root        static final int TRANSACTION_registerListener = IBinder.FIRST_CALL_TRANSACTION + 0;
745be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root
746be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root        static final int TRANSACTION_unregisterListener = IBinder.FIRST_CALL_TRANSACTION + 1;
747be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root
748be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root        static final int TRANSACTION_isUsbMassStorageConnected = IBinder.FIRST_CALL_TRANSACTION + 2;
749be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root
750be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root        static final int TRANSACTION_setUsbMassStorageEnabled = IBinder.FIRST_CALL_TRANSACTION + 3;
751be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root
752be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root        static final int TRANSACTION_isUsbMassStorageEnabled = IBinder.FIRST_CALL_TRANSACTION + 4;
753be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root
754be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root        static final int TRANSACTION_mountVolume = IBinder.FIRST_CALL_TRANSACTION + 5;
755be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root
756be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root        static final int TRANSACTION_unmountVolume = IBinder.FIRST_CALL_TRANSACTION + 6;
757be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root
758be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root        static final int TRANSACTION_formatVolume = IBinder.FIRST_CALL_TRANSACTION + 7;
759be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root
760be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root        static final int TRANSACTION_getStorageUsers = IBinder.FIRST_CALL_TRANSACTION + 8;
761be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root
762be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root        static final int TRANSACTION_getVolumeState = IBinder.FIRST_CALL_TRANSACTION + 9;
763be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root
764be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root        static final int TRANSACTION_createSecureContainer = IBinder.FIRST_CALL_TRANSACTION + 10;
765be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root
766be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root        static final int TRANSACTION_finalizeSecureContainer = IBinder.FIRST_CALL_TRANSACTION + 11;
767be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root
768be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root        static final int TRANSACTION_destroySecureContainer = IBinder.FIRST_CALL_TRANSACTION + 12;
769be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root
770be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root        static final int TRANSACTION_mountSecureContainer = IBinder.FIRST_CALL_TRANSACTION + 13;
771be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root
772be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root        static final int TRANSACTION_unmountSecureContainer = IBinder.FIRST_CALL_TRANSACTION + 14;
773be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root
774be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root        static final int TRANSACTION_isSecureContainerMounted = IBinder.FIRST_CALL_TRANSACTION + 15;
775be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root
776be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root        static final int TRANSACTION_renameSecureContainer = IBinder.FIRST_CALL_TRANSACTION + 16;
777be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root
778be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root        static final int TRANSACTION_getSecureContainerPath = IBinder.FIRST_CALL_TRANSACTION + 17;
779be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root
780be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root        static final int TRANSACTION_getSecureContainerList = IBinder.FIRST_CALL_TRANSACTION + 18;
781be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root
782be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root        static final int TRANSACTION_shutdown = IBinder.FIRST_CALL_TRANSACTION + 19;
783be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root
784be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root        static final int TRANSACTION_finishMediaUpdate = IBinder.FIRST_CALL_TRANSACTION + 20;
785be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root
786be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root        static final int TRANSACTION_mountObb = IBinder.FIRST_CALL_TRANSACTION + 21;
787be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root
788be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root        static final int TRANSACTION_unmountObb = IBinder.FIRST_CALL_TRANSACTION + 22;
789be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root
790be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root        static final int TRANSACTION_isObbMounted = IBinder.FIRST_CALL_TRANSACTION + 23;
791be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root
792be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root        static final int TRANSACTION_getMountedObbPath = IBinder.FIRST_CALL_TRANSACTION + 24;
793be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root
794e1ff214e32ed5c546a7603b07b054908c4d93312Kenny Root        static final int TRANSACTION_isExternalStorageEmulated = IBinder.FIRST_CALL_TRANSACTION + 25;
795e1ff214e32ed5c546a7603b07b054908c4d93312Kenny Root
7965af0b916f850486cff4797355bf9e7dc3352fe00Jason parks        static final int TRANSACTION_decryptStorage = IBinder.FIRST_CALL_TRANSACTION + 26;
7975af0b916f850486cff4797355bf9e7dc3352fe00Jason parks
79856aa5321fe6f00fa3662e6f46a4b2559aa34f63eJason parks        static final int TRANSACTION_encryptStorage = IBinder.FIRST_CALL_TRANSACTION + 27;
79956aa5321fe6f00fa3662e6f46a4b2559aa34f63eJason parks
800f7b3cd4efd40b7631f36ea014407a850f7dc637eJason parks        static final int TRANSACTION_changeEncryptionPassword = IBinder.FIRST_CALL_TRANSACTION + 28;
801f7b3cd4efd40b7631f36ea014407a850f7dc637eJason parks
802d967f4664f40f9a4c5262a44b19df9bbdf457d8aMike Lockwood        static final int TRANSACTION_getVolumeList = IBinder.FIRST_CALL_TRANSACTION + 29;
803d967f4664f40f9a4c5262a44b19df9bbdf457d8aMike Lockwood
804292f8bc9d1b790ab975a87a842c7fabc908b97e0Dianne Hackborn        static final int TRANSACTION_getSecureContainerFilesystemPath = IBinder.FIRST_CALL_TRANSACTION + 30;
805292f8bc9d1b790ab975a87a842c7fabc908b97e0Dianne Hackborn
806444eca232964dbf27d0c4d01447c1493f89186e0Ben Komalo        static final int TRANSACTION_getEncryptionState = IBinder.FIRST_CALL_TRANSACTION + 31;
807444eca232964dbf27d0c4d01447c1493f89186e0Ben Komalo
80832418be49e5b61c2e9281528cb8fb67939e301e8Christopher Tate        static final int TRANSACTION_verifyEncryptionPassword = IBinder.FIRST_CALL_TRANSACTION + 32;
80932418be49e5b61c2e9281528cb8fb67939e301e8Christopher Tate
8106dceb88f1c7c42c6ab43834af2c993d599895d82Kenny Root        static final int TRANSACTION_fixPermissionsSecureContainer = IBinder.FIRST_CALL_TRANSACTION + 33;
8116dceb88f1c7c42c6ab43834af2c993d599895d82Kenny Root
812be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root        /**
813be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root         * Cast an IBinder object into an IMountService interface, generating a
814be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root         * proxy if needed.
815be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root         */
816be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root        public static IMountService asInterface(IBinder obj) {
817be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root            if (obj == null) {
818be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root                return null;
819be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root            }
820be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root            IInterface iin = obj.queryLocalInterface(DESCRIPTOR);
821be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root            if (iin != null && iin instanceof IMountService) {
822be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root                return (IMountService) iin;
823be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root            }
824be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root            return new IMountService.Stub.Proxy(obj);
825be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root        }
826be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root
827be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root        /** Construct the stub at attach it to the interface. */
828be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root        public Stub() {
829be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root            attachInterface(this, DESCRIPTOR);
830be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root        }
831be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root
832be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root        public IBinder asBinder() {
833be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root            return this;
834be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root        }
835be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root
836be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root        @Override
837be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root        public boolean onTransact(int code, Parcel data, Parcel reply,
838be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root                int flags) throws RemoteException {
839be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root            switch (code) {
840be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root                case INTERFACE_TRANSACTION: {
841be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root                    reply.writeString(DESCRIPTOR);
842be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root                    return true;
843be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root                }
844be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root                case TRANSACTION_registerListener: {
845be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root                    data.enforceInterface(DESCRIPTOR);
846be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root                    IMountServiceListener listener;
847be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root                    listener = IMountServiceListener.Stub.asInterface(data.readStrongBinder());
848be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root                    registerListener(listener);
849be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root                    reply.writeNoException();
850be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root                    return true;
851be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root                }
852be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root                case TRANSACTION_unregisterListener: {
853be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root                    data.enforceInterface(DESCRIPTOR);
854be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root                    IMountServiceListener listener;
855be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root                    listener = IMountServiceListener.Stub.asInterface(data.readStrongBinder());
856be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root                    unregisterListener(listener);
857be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root                    reply.writeNoException();
858be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root                    return true;
859be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root                }
860be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root                case TRANSACTION_isUsbMassStorageConnected: {
861be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root                    data.enforceInterface(DESCRIPTOR);
862be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root                    boolean result = isUsbMassStorageConnected();
863be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root                    reply.writeNoException();
864be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root                    reply.writeInt((result ? 1 : 0));
865be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root                    return true;
866be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root                }
867be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root                case TRANSACTION_setUsbMassStorageEnabled: {
868be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root                    data.enforceInterface(DESCRIPTOR);
869be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root                    boolean enable;
870be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root                    enable = 0 != data.readInt();
871be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root                    setUsbMassStorageEnabled(enable);
872be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root                    reply.writeNoException();
873be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root                    return true;
874be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root                }
875be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root                case TRANSACTION_isUsbMassStorageEnabled: {
876be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root                    data.enforceInterface(DESCRIPTOR);
877be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root                    boolean result = isUsbMassStorageEnabled();
878be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root                    reply.writeNoException();
879be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root                    reply.writeInt((result ? 1 : 0));
880be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root                    return true;
881be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root                }
882be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root                case TRANSACTION_mountVolume: {
883be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root                    data.enforceInterface(DESCRIPTOR);
884be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root                    String mountPoint;
885be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root                    mountPoint = data.readString();
886be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root                    int resultCode = mountVolume(mountPoint);
887be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root                    reply.writeNoException();
888be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root                    reply.writeInt(resultCode);
889be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root                    return true;
890be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root                }
891be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root                case TRANSACTION_unmountVolume: {
892be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root                    data.enforceInterface(DESCRIPTOR);
893be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root                    String mountPoint;
894be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root                    mountPoint = data.readString();
89513c7197da8a16f77f6398708a6314c80cb01e0d1Ben Komalo                    boolean force = 0 != data.readInt();
89613c7197da8a16f77f6398708a6314c80cb01e0d1Ben Komalo                    boolean removeEncrypt = 0 != data.readInt();
89713c7197da8a16f77f6398708a6314c80cb01e0d1Ben Komalo                    unmountVolume(mountPoint, force, removeEncrypt);
898be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root                    reply.writeNoException();
899be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root                    return true;
900be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root                }
901be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root                case TRANSACTION_formatVolume: {
902be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root                    data.enforceInterface(DESCRIPTOR);
903be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root                    String mountPoint;
904be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root                    mountPoint = data.readString();
905be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root                    int result = formatVolume(mountPoint);
906be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root                    reply.writeNoException();
907be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root                    reply.writeInt(result);
908be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root                    return true;
909be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root                }
910be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root                case TRANSACTION_getStorageUsers: {
911be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root                    data.enforceInterface(DESCRIPTOR);
912be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root                    String path;
913be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root                    path = data.readString();
914be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root                    int[] pids = getStorageUsers(path);
915be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root                    reply.writeNoException();
916be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root                    reply.writeIntArray(pids);
917be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root                    return true;
918be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root                }
919be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root                case TRANSACTION_getVolumeState: {
920be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root                    data.enforceInterface(DESCRIPTOR);
921be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root                    String mountPoint;
922be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root                    mountPoint = data.readString();
923be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root                    String state = getVolumeState(mountPoint);
924be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root                    reply.writeNoException();
925be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root                    reply.writeString(state);
926be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root                    return true;
927be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root                }
928be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root                case TRANSACTION_createSecureContainer: {
929be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root                    data.enforceInterface(DESCRIPTOR);
930be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root                    String id;
931be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root                    id = data.readString();
932be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root                    int sizeMb;
933be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root                    sizeMb = data.readInt();
934be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root                    String fstype;
935be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root                    fstype = data.readString();
936be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root                    String key;
937be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root                    key = data.readString();
938be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root                    int ownerUid;
939be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root                    ownerUid = data.readInt();
9406dceb88f1c7c42c6ab43834af2c993d599895d82Kenny Root                    boolean external;
9416dceb88f1c7c42c6ab43834af2c993d599895d82Kenny Root                    external = 0 != data.readInt();
9426dceb88f1c7c42c6ab43834af2c993d599895d82Kenny Root                    int resultCode = createSecureContainer(id, sizeMb, fstype, key, ownerUid,
9436dceb88f1c7c42c6ab43834af2c993d599895d82Kenny Root                            external);
944be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root                    reply.writeNoException();
945be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root                    reply.writeInt(resultCode);
946be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root                    return true;
947be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root                }
948be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root                case TRANSACTION_finalizeSecureContainer: {
949be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root                    data.enforceInterface(DESCRIPTOR);
950be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root                    String id;
951be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root                    id = data.readString();
952be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root                    int resultCode = finalizeSecureContainer(id);
953be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root                    reply.writeNoException();
954be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root                    reply.writeInt(resultCode);
955be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root                    return true;
956be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root                }
957be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root                case TRANSACTION_destroySecureContainer: {
958be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root                    data.enforceInterface(DESCRIPTOR);
959be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root                    String id;
960be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root                    id = data.readString();
961be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root                    boolean force;
962be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root                    force = 0 != data.readInt();
963be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root                    int resultCode = destroySecureContainer(id, force);
964be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root                    reply.writeNoException();
965be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root                    reply.writeInt(resultCode);
966be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root                    return true;
967be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root                }
968be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root                case TRANSACTION_mountSecureContainer: {
969be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root                    data.enforceInterface(DESCRIPTOR);
970be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root                    String id;
971be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root                    id = data.readString();
972be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root                    String key;
973be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root                    key = data.readString();
974be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root                    int ownerUid;
975be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root                    ownerUid = data.readInt();
976be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root                    int resultCode = mountSecureContainer(id, key, ownerUid);
977be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root                    reply.writeNoException();
978be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root                    reply.writeInt(resultCode);
979be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root                    return true;
980be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root                }
981be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root                case TRANSACTION_unmountSecureContainer: {
982be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root                    data.enforceInterface(DESCRIPTOR);
983be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root                    String id;
984be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root                    id = data.readString();
985be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root                    boolean force;
986be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root                    force = 0 != data.readInt();
987be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root                    int resultCode = unmountSecureContainer(id, force);
988be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root                    reply.writeNoException();
989be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root                    reply.writeInt(resultCode);
990be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root                    return true;
991be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root                }
992be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root                case TRANSACTION_isSecureContainerMounted: {
993be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root                    data.enforceInterface(DESCRIPTOR);
994be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root                    String id;
995be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root                    id = data.readString();
996be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root                    boolean status = isSecureContainerMounted(id);
997be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root                    reply.writeNoException();
998be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root                    reply.writeInt((status ? 1 : 0));
999be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root                    return true;
1000be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root                }
1001be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root                case TRANSACTION_renameSecureContainer: {
1002be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root                    data.enforceInterface(DESCRIPTOR);
1003be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root                    String oldId;
1004be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root                    oldId = data.readString();
1005be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root                    String newId;
1006be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root                    newId = data.readString();
1007be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root                    int resultCode = renameSecureContainer(oldId, newId);
1008be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root                    reply.writeNoException();
1009be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root                    reply.writeInt(resultCode);
1010be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root                    return true;
1011be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root                }
1012be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root                case TRANSACTION_getSecureContainerPath: {
1013be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root                    data.enforceInterface(DESCRIPTOR);
1014be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root                    String id;
1015be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root                    id = data.readString();
1016be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root                    String path = getSecureContainerPath(id);
1017be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root                    reply.writeNoException();
1018be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root                    reply.writeString(path);
1019be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root                    return true;
1020be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root                }
1021be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root                case TRANSACTION_getSecureContainerList: {
1022be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root                    data.enforceInterface(DESCRIPTOR);
1023be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root                    String[] ids = getSecureContainerList();
1024be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root                    reply.writeNoException();
1025be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root                    reply.writeStringArray(ids);
1026be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root                    return true;
1027be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root                }
1028be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root                case TRANSACTION_shutdown: {
1029be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root                    data.enforceInterface(DESCRIPTOR);
1030be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root                    IMountShutdownObserver observer;
1031be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root                    observer = IMountShutdownObserver.Stub.asInterface(data
1032be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root                            .readStrongBinder());
1033be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root                    shutdown(observer);
1034be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root                    reply.writeNoException();
1035be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root                    return true;
1036be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root                }
1037be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root                case TRANSACTION_finishMediaUpdate: {
1038be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root                    data.enforceInterface(DESCRIPTOR);
1039be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root                    finishMediaUpdate();
1040be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root                    reply.writeNoException();
1041be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root                    return true;
1042be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root                }
1043be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root                case TRANSACTION_mountObb: {
1044be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root                    data.enforceInterface(DESCRIPTOR);
1045be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root                    String filename;
1046be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root                    filename = data.readString();
1047be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root                    String key;
1048be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root                    key = data.readString();
1049be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root                    IObbActionListener observer;
1050be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root                    observer = IObbActionListener.Stub.asInterface(data.readStrongBinder());
1051af9d667ccf3e24058214cf4cc0a8aa8bc5100e3cKenny Root                    int nonce;
1052af9d667ccf3e24058214cf4cc0a8aa8bc5100e3cKenny Root                    nonce = data.readInt();
1053af9d667ccf3e24058214cf4cc0a8aa8bc5100e3cKenny Root                    mountObb(filename, key, observer, nonce);
1054be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root                    reply.writeNoException();
1055be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root                    return true;
1056be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root                }
1057be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root                case TRANSACTION_unmountObb: {
1058be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root                    data.enforceInterface(DESCRIPTOR);
1059be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root                    String filename;
1060be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root                    filename = data.readString();
1061be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root                    boolean force;
1062be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root                    force = 0 != data.readInt();
1063be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root                    IObbActionListener observer;
1064be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root                    observer = IObbActionListener.Stub.asInterface(data.readStrongBinder());
1065af9d667ccf3e24058214cf4cc0a8aa8bc5100e3cKenny Root                    int nonce;
1066af9d667ccf3e24058214cf4cc0a8aa8bc5100e3cKenny Root                    nonce = data.readInt();
1067af9d667ccf3e24058214cf4cc0a8aa8bc5100e3cKenny Root                    unmountObb(filename, force, observer, nonce);
1068be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root                    reply.writeNoException();
1069be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root                    return true;
1070be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root                }
1071be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root                case TRANSACTION_isObbMounted: {
1072be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root                    data.enforceInterface(DESCRIPTOR);
1073be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root                    String filename;
1074be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root                    filename = data.readString();
1075be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root                    boolean status = isObbMounted(filename);
1076be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root                    reply.writeNoException();
1077be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root                    reply.writeInt((status ? 1 : 0));
1078be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root                    return true;
1079be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root                }
1080be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root                case TRANSACTION_getMountedObbPath: {
1081be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root                    data.enforceInterface(DESCRIPTOR);
1082be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root                    String filename;
1083be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root                    filename = data.readString();
1084be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root                    String mountedPath = getMountedObbPath(filename);
1085be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root                    reply.writeNoException();
1086be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root                    reply.writeString(mountedPath);
1087be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root                    return true;
1088be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root                }
1089e1ff214e32ed5c546a7603b07b054908c4d93312Kenny Root                case TRANSACTION_isExternalStorageEmulated: {
1090e1ff214e32ed5c546a7603b07b054908c4d93312Kenny Root                    data.enforceInterface(DESCRIPTOR);
1091e1ff214e32ed5c546a7603b07b054908c4d93312Kenny Root                    boolean emulated = isExternalStorageEmulated();
1092e1ff214e32ed5c546a7603b07b054908c4d93312Kenny Root                    reply.writeNoException();
1093e1ff214e32ed5c546a7603b07b054908c4d93312Kenny Root                    reply.writeInt(emulated ? 1 : 0);
1094e1ff214e32ed5c546a7603b07b054908c4d93312Kenny Root                    return true;
1095e1ff214e32ed5c546a7603b07b054908c4d93312Kenny Root                }
10965af0b916f850486cff4797355bf9e7dc3352fe00Jason parks                case TRANSACTION_decryptStorage: {
10975af0b916f850486cff4797355bf9e7dc3352fe00Jason parks                    data.enforceInterface(DESCRIPTOR);
10985af0b916f850486cff4797355bf9e7dc3352fe00Jason parks                    String password = data.readString();
10995af0b916f850486cff4797355bf9e7dc3352fe00Jason parks                    int result = decryptStorage(password);
11005af0b916f850486cff4797355bf9e7dc3352fe00Jason parks                    reply.writeNoException();
11015af0b916f850486cff4797355bf9e7dc3352fe00Jason parks                    reply.writeInt(result);
11025af0b916f850486cff4797355bf9e7dc3352fe00Jason parks                    return true;
11035af0b916f850486cff4797355bf9e7dc3352fe00Jason parks                }
110456aa5321fe6f00fa3662e6f46a4b2559aa34f63eJason parks                case TRANSACTION_encryptStorage: {
110556aa5321fe6f00fa3662e6f46a4b2559aa34f63eJason parks                    data.enforceInterface(DESCRIPTOR);
110656aa5321fe6f00fa3662e6f46a4b2559aa34f63eJason parks                    String password = data.readString();
110756aa5321fe6f00fa3662e6f46a4b2559aa34f63eJason parks                    int result = encryptStorage(password);
110856aa5321fe6f00fa3662e6f46a4b2559aa34f63eJason parks                    reply.writeNoException();
110956aa5321fe6f00fa3662e6f46a4b2559aa34f63eJason parks                    reply.writeInt(result);
111056aa5321fe6f00fa3662e6f46a4b2559aa34f63eJason parks                    return true;
111156aa5321fe6f00fa3662e6f46a4b2559aa34f63eJason parks                }
1112f7b3cd4efd40b7631f36ea014407a850f7dc637eJason parks                case TRANSACTION_changeEncryptionPassword: {
1113f7b3cd4efd40b7631f36ea014407a850f7dc637eJason parks                    data.enforceInterface(DESCRIPTOR);
1114f7b3cd4efd40b7631f36ea014407a850f7dc637eJason parks                    String password = data.readString();
1115f7b3cd4efd40b7631f36ea014407a850f7dc637eJason parks                    int result = changeEncryptionPassword(password);
1116f7b3cd4efd40b7631f36ea014407a850f7dc637eJason parks                    reply.writeNoException();
1117f7b3cd4efd40b7631f36ea014407a850f7dc637eJason parks                    reply.writeInt(result);
1118f7b3cd4efd40b7631f36ea014407a850f7dc637eJason parks                    return true;
1119f7b3cd4efd40b7631f36ea014407a850f7dc637eJason parks                }
1120d967f4664f40f9a4c5262a44b19df9bbdf457d8aMike Lockwood                case TRANSACTION_getVolumeList: {
1121d967f4664f40f9a4c5262a44b19df9bbdf457d8aMike Lockwood                    data.enforceInterface(DESCRIPTOR);
11222f6a3885533a52758c2cd4f81f6123a712be8ae6Mike Lockwood                    Parcelable[] result = getVolumeList();
1123d967f4664f40f9a4c5262a44b19df9bbdf457d8aMike Lockwood                    reply.writeNoException();
11242f6a3885533a52758c2cd4f81f6123a712be8ae6Mike Lockwood                    reply.writeParcelableArray(result, 0);
1125d967f4664f40f9a4c5262a44b19df9bbdf457d8aMike Lockwood                    return true;
1126d967f4664f40f9a4c5262a44b19df9bbdf457d8aMike Lockwood                }
1127292f8bc9d1b790ab975a87a842c7fabc908b97e0Dianne Hackborn                case TRANSACTION_getSecureContainerFilesystemPath: {
1128292f8bc9d1b790ab975a87a842c7fabc908b97e0Dianne Hackborn                    data.enforceInterface(DESCRIPTOR);
1129292f8bc9d1b790ab975a87a842c7fabc908b97e0Dianne Hackborn                    String id;
1130292f8bc9d1b790ab975a87a842c7fabc908b97e0Dianne Hackborn                    id = data.readString();
1131292f8bc9d1b790ab975a87a842c7fabc908b97e0Dianne Hackborn                    String path = getSecureContainerFilesystemPath(id);
1132292f8bc9d1b790ab975a87a842c7fabc908b97e0Dianne Hackborn                    reply.writeNoException();
1133292f8bc9d1b790ab975a87a842c7fabc908b97e0Dianne Hackborn                    reply.writeString(path);
1134292f8bc9d1b790ab975a87a842c7fabc908b97e0Dianne Hackborn                    return true;
1135292f8bc9d1b790ab975a87a842c7fabc908b97e0Dianne Hackborn                }
1136444eca232964dbf27d0c4d01447c1493f89186e0Ben Komalo                case TRANSACTION_getEncryptionState: {
1137444eca232964dbf27d0c4d01447c1493f89186e0Ben Komalo                    data.enforceInterface(DESCRIPTOR);
1138444eca232964dbf27d0c4d01447c1493f89186e0Ben Komalo                    int result = getEncryptionState();
1139444eca232964dbf27d0c4d01447c1493f89186e0Ben Komalo                    reply.writeNoException();
1140444eca232964dbf27d0c4d01447c1493f89186e0Ben Komalo                    reply.writeInt(result);
1141444eca232964dbf27d0c4d01447c1493f89186e0Ben Komalo                    return true;
1142444eca232964dbf27d0c4d01447c1493f89186e0Ben Komalo                }
11436dceb88f1c7c42c6ab43834af2c993d599895d82Kenny Root                case TRANSACTION_fixPermissionsSecureContainer: {
11446dceb88f1c7c42c6ab43834af2c993d599895d82Kenny Root                    data.enforceInterface(DESCRIPTOR);
11456dceb88f1c7c42c6ab43834af2c993d599895d82Kenny Root                    String id;
11466dceb88f1c7c42c6ab43834af2c993d599895d82Kenny Root                    id = data.readString();
11476dceb88f1c7c42c6ab43834af2c993d599895d82Kenny Root                    int gid;
11486dceb88f1c7c42c6ab43834af2c993d599895d82Kenny Root                    gid = data.readInt();
11496dceb88f1c7c42c6ab43834af2c993d599895d82Kenny Root                    String filename;
11506dceb88f1c7c42c6ab43834af2c993d599895d82Kenny Root                    filename = data.readString();
11516dceb88f1c7c42c6ab43834af2c993d599895d82Kenny Root                    int resultCode = fixPermissionsSecureContainer(id, gid, filename);
11526dceb88f1c7c42c6ab43834af2c993d599895d82Kenny Root                    reply.writeNoException();
11536dceb88f1c7c42c6ab43834af2c993d599895d82Kenny Root                    reply.writeInt(resultCode);
11546dceb88f1c7c42c6ab43834af2c993d599895d82Kenny Root                    return true;
11556dceb88f1c7c42c6ab43834af2c993d599895d82Kenny Root                }
1156be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root            }
1157be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root            return super.onTransact(code, data, reply, flags);
1158be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root        }
1159be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root    }
1160be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root
1161be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root    /*
1162be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root     * Creates a secure container with the specified parameters. Returns an int
1163be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root     * consistent with MountServiceResultCode
1164be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root     */
11656dceb88f1c7c42c6ab43834af2c993d599895d82Kenny Root    public int createSecureContainer(String id, int sizeMb, String fstype, String key,
11666dceb88f1c7c42c6ab43834af2c993d599895d82Kenny Root            int ownerUid, boolean external) throws RemoteException;
1167be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root
1168be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root    /*
1169be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root     * Destroy a secure container, and free up all resources associated with it.
1170be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root     * NOTE: Ensure all references are released prior to deleting. Returns an
1171be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root     * int consistent with MountServiceResultCode
1172be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root     */
1173be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root    public int destroySecureContainer(String id, boolean force) throws RemoteException;
1174be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root
1175be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root    /*
1176be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root     * Finalize a container which has just been created and populated. After
1177be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root     * finalization, the container is immutable. Returns an int consistent with
1178be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root     * MountServiceResultCode
1179be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root     */
1180be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root    public int finalizeSecureContainer(String id) throws RemoteException;
1181be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root
1182be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root    /**
1183be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root     * Call into MountService by PackageManager to notify that its done
1184be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root     * processing the media status update request.
1185be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root     */
1186be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root    public void finishMediaUpdate() throws RemoteException;
1187be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root
1188be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root    /**
1189be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root     * Format external storage given a mount point. Returns an int consistent
1190be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root     * with MountServiceResultCode
1191be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root     */
1192be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root    public int formatVolume(String mountPoint) throws RemoteException;
1193be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root
1194be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root    /**
1195be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root     * Gets the path to the mounted Opaque Binary Blob (OBB).
1196be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root     */
1197be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root    public String getMountedObbPath(String filename) throws RemoteException;
1198be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root
1199be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root    /**
1200be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root     * Gets an Array of currently known secure container IDs
1201be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root     */
1202be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root    public String[] getSecureContainerList() throws RemoteException;
1203be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root
1204be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root    /*
1205be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root     * Returns the filesystem path of a mounted secure container.
1206be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root     */
1207be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root    public String getSecureContainerPath(String id) throws RemoteException;
1208be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root
1209be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root    /**
1210be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root     * Returns an array of pids with open files on the specified path.
1211be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root     */
1212be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root    public int[] getStorageUsers(String path) throws RemoteException;
1213be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root
1214be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root    /**
1215be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root     * Gets the state of a volume via its mountpoint.
1216be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root     */
1217be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root    public String getVolumeState(String mountPoint) throws RemoteException;
1218be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root
1219be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root    /**
1220be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root     * Checks whether the specified Opaque Binary Blob (OBB) is mounted
1221be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root     * somewhere.
1222be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root     */
1223be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root    public boolean isObbMounted(String filename) throws RemoteException;
1224be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root
1225be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root    /*
1226be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root     * Returns true if the specified container is mounted
1227be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root     */
1228be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root    public boolean isSecureContainerMounted(String id) throws RemoteException;
1229be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root
1230be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root    /**
1231be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root     * Returns true if a USB mass storage host is connected
1232be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root     */
1233be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root    public boolean isUsbMassStorageConnected() throws RemoteException;
1234be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root
1235be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root    /**
1236be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root     * Returns true if a USB mass storage host is enabled (media is shared)
1237be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root     */
1238be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root    public boolean isUsbMassStorageEnabled() throws RemoteException;
1239be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root
1240be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root    /**
1241be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root     * Mounts an Opaque Binary Blob (OBB) with the specified decryption key and
1242be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root     * only allows the calling process's UID access to the contents.
1243be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root     * MountService will call back to the supplied IObbActionListener to inform
1244be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root     * it of the terminal state of the call.
1245be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root     */
1246af9d667ccf3e24058214cf4cc0a8aa8bc5100e3cKenny Root    public void mountObb(String filename, String key, IObbActionListener token, int nonce)
1247be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root            throws RemoteException;
1248be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root
1249be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root    /*
1250be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root     * Mount a secure container with the specified key and owner UID. Returns an
1251be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root     * int consistent with MountServiceResultCode
1252be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root     */
1253be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root    public int mountSecureContainer(String id, String key, int ownerUid) throws RemoteException;
1254be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root
1255be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root    /**
1256be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root     * Mount external storage at given mount point. Returns an int consistent
1257be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root     * with MountServiceResultCode
1258be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root     */
1259be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root    public int mountVolume(String mountPoint) throws RemoteException;
1260be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root
1261be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root    /**
1262be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root     * Registers an IMountServiceListener for receiving async notifications.
1263be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root     */
1264be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root    public void registerListener(IMountServiceListener listener) throws RemoteException;
1265be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root
1266be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root    /*
1267be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root     * Rename an unmounted secure container. Returns an int consistent with
1268be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root     * MountServiceResultCode
1269be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root     */
1270be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root    public int renameSecureContainer(String oldId, String newId) throws RemoteException;
1271be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root
1272be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root    /**
1273be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root     * Enables / disables USB mass storage. The caller should check actual
1274be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root     * status of enabling/disabling USB mass storage via StorageEventListener.
1275be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root     */
1276be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root    public void setUsbMassStorageEnabled(boolean enable) throws RemoteException;
1277be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root
1278be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root    /**
1279be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root     * Shuts down the MountService and gracefully unmounts all external media.
1280be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root     * Invokes call back once the shutdown is complete.
1281be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root     */
1282be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root    public void shutdown(IMountShutdownObserver observer) throws RemoteException;
1283be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root
1284be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root    /**
1285be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root     * Unmounts an Opaque Binary Blob (OBB). When the force flag is specified,
1286be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root     * any program using it will be forcibly killed to unmount the image.
1287be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root     * MountService will call back to the supplied IObbActionListener to inform
1288be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root     * it of the terminal state of the call.
1289be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root     */
1290af9d667ccf3e24058214cf4cc0a8aa8bc5100e3cKenny Root    public void unmountObb(String filename, boolean force, IObbActionListener token, int nonce)
1291be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root            throws RemoteException;
1292be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root
1293be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root    /*
1294be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root     * Unount a secure container. Returns an int consistent with
1295be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root     * MountServiceResultCode
1296be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root     */
1297be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root    public int unmountSecureContainer(String id, boolean force) throws RemoteException;
1298be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root
1299be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root    /**
1300be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root     * Safely unmount external storage at given mount point. The unmount is an
1301be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root     * asynchronous operation. Applications should register StorageEventListener
1302be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root     * for storage related status changes.
130313c7197da8a16f77f6398708a6314c80cb01e0d1Ben Komalo     * @param mountPoint the mount point
130413c7197da8a16f77f6398708a6314c80cb01e0d1Ben Komalo     * @param force whether or not to forcefully unmount it (e.g. even if programs are using this
130513c7197da8a16f77f6398708a6314c80cb01e0d1Ben Komalo     *     data currently)
130613c7197da8a16f77f6398708a6314c80cb01e0d1Ben Komalo     * @param removeEncryption whether or not encryption mapping should be removed from the volume.
130713c7197da8a16f77f6398708a6314c80cb01e0d1Ben Komalo     *     This value implies {@code force}.
1308be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root     */
130913c7197da8a16f77f6398708a6314c80cb01e0d1Ben Komalo    public void unmountVolume(String mountPoint, boolean force, boolean removeEncryption)
131013c7197da8a16f77f6398708a6314c80cb01e0d1Ben Komalo            throws RemoteException;
1311be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root
1312be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root    /**
1313be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root     * Unregisters an IMountServiceListener
1314be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root     */
1315be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root    public void unregisterListener(IMountServiceListener listener) throws RemoteException;
1316e1ff214e32ed5c546a7603b07b054908c4d93312Kenny Root
1317e1ff214e32ed5c546a7603b07b054908c4d93312Kenny Root    /**
1318e1ff214e32ed5c546a7603b07b054908c4d93312Kenny Root     * Returns whether or not the external storage is emulated.
1319e1ff214e32ed5c546a7603b07b054908c4d93312Kenny Root     */
1320e1ff214e32ed5c546a7603b07b054908c4d93312Kenny Root    public boolean isExternalStorageEmulated() throws RemoteException;
13215af0b916f850486cff4797355bf9e7dc3352fe00Jason parks
1322444eca232964dbf27d0c4d01447c1493f89186e0Ben Komalo    /** The volume is not encrypted. */
1323444eca232964dbf27d0c4d01447c1493f89186e0Ben Komalo    static final int ENCRYPTION_STATE_NONE = 1;
1324444eca232964dbf27d0c4d01447c1493f89186e0Ben Komalo    /** The volume has been encrypted succesfully. */
1325444eca232964dbf27d0c4d01447c1493f89186e0Ben Komalo    static final int ENCRYPTION_STATE_OK = 0;
1326444eca232964dbf27d0c4d01447c1493f89186e0Ben Komalo    /** The volume is in a bad state. */
1327444eca232964dbf27d0c4d01447c1493f89186e0Ben Komalo    static final int ENCRYPTION_STATE_ERROR_UNKNOWN = -1;
1328444eca232964dbf27d0c4d01447c1493f89186e0Ben Komalo    /** The volume is in a bad state - partially encrypted. Data is likely irrecoverable. */
1329444eca232964dbf27d0c4d01447c1493f89186e0Ben Komalo    static final int ENCRYPTION_STATE_ERROR_INCOMPLETE = -2;
1330444eca232964dbf27d0c4d01447c1493f89186e0Ben Komalo
1331444eca232964dbf27d0c4d01447c1493f89186e0Ben Komalo    /**
1332444eca232964dbf27d0c4d01447c1493f89186e0Ben Komalo     * Determines the encryption state of the volume.
1333444eca232964dbf27d0c4d01447c1493f89186e0Ben Komalo     * @return a numerical value. See {@code ENCRYPTION_STATE_*} for possible values.
1334444eca232964dbf27d0c4d01447c1493f89186e0Ben Komalo     */
1335444eca232964dbf27d0c4d01447c1493f89186e0Ben Komalo    public int getEncryptionState() throws RemoteException;
1336444eca232964dbf27d0c4d01447c1493f89186e0Ben Komalo
13375af0b916f850486cff4797355bf9e7dc3352fe00Jason parks    /**
13385af0b916f850486cff4797355bf9e7dc3352fe00Jason parks     * Decrypts any encrypted volumes.
13395af0b916f850486cff4797355bf9e7dc3352fe00Jason parks     */
13405af0b916f850486cff4797355bf9e7dc3352fe00Jason parks    public int decryptStorage(String password) throws RemoteException;
134156aa5321fe6f00fa3662e6f46a4b2559aa34f63eJason parks
134256aa5321fe6f00fa3662e6f46a4b2559aa34f63eJason parks    /**
134356aa5321fe6f00fa3662e6f46a4b2559aa34f63eJason parks     * Encrypts storage.
134456aa5321fe6f00fa3662e6f46a4b2559aa34f63eJason parks     */
134556aa5321fe6f00fa3662e6f46a4b2559aa34f63eJason parks    public int encryptStorage(String password) throws RemoteException;
1346f7b3cd4efd40b7631f36ea014407a850f7dc637eJason parks
1347f7b3cd4efd40b7631f36ea014407a850f7dc637eJason parks    /**
1348f7b3cd4efd40b7631f36ea014407a850f7dc637eJason parks     * Changes the encryption password.
1349f7b3cd4efd40b7631f36ea014407a850f7dc637eJason parks     */
1350f7b3cd4efd40b7631f36ea014407a850f7dc637eJason parks    public int changeEncryptionPassword(String password) throws RemoteException;
1351f7b3cd4efd40b7631f36ea014407a850f7dc637eJason parks
1352d967f4664f40f9a4c5262a44b19df9bbdf457d8aMike Lockwood    /**
135332418be49e5b61c2e9281528cb8fb67939e301e8Christopher Tate     * Verify the encryption password against the stored volume.  This method
135432418be49e5b61c2e9281528cb8fb67939e301e8Christopher Tate     * may only be called by the system process.
135532418be49e5b61c2e9281528cb8fb67939e301e8Christopher Tate     */
135632418be49e5b61c2e9281528cb8fb67939e301e8Christopher Tate    public int verifyEncryptionPassword(String password) throws RemoteException;
135732418be49e5b61c2e9281528cb8fb67939e301e8Christopher Tate
135832418be49e5b61c2e9281528cb8fb67939e301e8Christopher Tate    /**
1359d967f4664f40f9a4c5262a44b19df9bbdf457d8aMike Lockwood     * Returns list of all mountable volumes.
1360d967f4664f40f9a4c5262a44b19df9bbdf457d8aMike Lockwood     */
13612f6a3885533a52758c2cd4f81f6123a712be8ae6Mike Lockwood    public Parcelable[] getVolumeList() throws RemoteException;
1362292f8bc9d1b790ab975a87a842c7fabc908b97e0Dianne Hackborn
1363292f8bc9d1b790ab975a87a842c7fabc908b97e0Dianne Hackborn    public String getSecureContainerFilesystemPath(String id) throws RemoteException;
13646dceb88f1c7c42c6ab43834af2c993d599895d82Kenny Root
13656dceb88f1c7c42c6ab43834af2c993d599895d82Kenny Root    /*
13666dceb88f1c7c42c6ab43834af2c993d599895d82Kenny Root     * Fix permissions in a container which has just been created and populated.
13676dceb88f1c7c42c6ab43834af2c993d599895d82Kenny Root     * Returns an int consistent with MountServiceResultCode
13686dceb88f1c7c42c6ab43834af2c993d599895d82Kenny Root     */
13696dceb88f1c7c42c6ab43834af2c993d599895d82Kenny Root    public int fixPermissionsSecureContainer(String id, int gid, String filename)
13706dceb88f1c7c42c6ab43834af2c993d599895d82Kenny Root            throws RemoteException;
1371be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root}
1372