15b993ce7bc29e43a3215a50ce6ce5d6550d4e5e2Suchi Amalapurapu/*
25b993ce7bc29e43a3215a50ce6ce5d6550d4e5e2Suchi Amalapurapu * Copyright (C) 2009 The Android Open Source Project
35b993ce7bc29e43a3215a50ce6ce5d6550d4e5e2Suchi Amalapurapu *
45b993ce7bc29e43a3215a50ce6ce5d6550d4e5e2Suchi Amalapurapu * Licensed under the Apache License, Version 2.0 (the "License");
55b993ce7bc29e43a3215a50ce6ce5d6550d4e5e2Suchi Amalapurapu * you may not use this file except in compliance with the License.
65b993ce7bc29e43a3215a50ce6ce5d6550d4e5e2Suchi Amalapurapu * You may obtain a copy of the License at
75b993ce7bc29e43a3215a50ce6ce5d6550d4e5e2Suchi Amalapurapu *
85b993ce7bc29e43a3215a50ce6ce5d6550d4e5e2Suchi Amalapurapu *      http://www.apache.org/licenses/LICENSE-2.0
95b993ce7bc29e43a3215a50ce6ce5d6550d4e5e2Suchi Amalapurapu *
105b993ce7bc29e43a3215a50ce6ce5d6550d4e5e2Suchi Amalapurapu * Unless required by applicable law or agreed to in writing, software
115b993ce7bc29e43a3215a50ce6ce5d6550d4e5e2Suchi Amalapurapu * distributed under the License is distributed on an "AS IS" BASIS,
125b993ce7bc29e43a3215a50ce6ce5d6550d4e5e2Suchi Amalapurapu * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
135b993ce7bc29e43a3215a50ce6ce5d6550d4e5e2Suchi Amalapurapu * See the License for the specific language governing permissions and
145b993ce7bc29e43a3215a50ce6ce5d6550d4e5e2Suchi Amalapurapu * limitations under the License.
155b993ce7bc29e43a3215a50ce6ce5d6550d4e5e2Suchi Amalapurapu */
165b993ce7bc29e43a3215a50ce6ce5d6550d4e5e2Suchi Amalapurapu
175b993ce7bc29e43a3215a50ce6ce5d6550d4e5e2Suchi Amalapurapupackage com.android.internal.content;
185b993ce7bc29e43a3215a50ce6ce5d6550d4e5e2Suchi Amalapurapu
19679bba339ef6948091180c776d6a284cddd812f5Suchi Amalapurapuimport android.os.storage.IMountService;
20679bba339ef6948091180c776d6a284cddd812f5Suchi Amalapurapu
21679bba339ef6948091180c776d6a284cddd812f5Suchi Amalapurapuimport android.os.IBinder;
22679bba339ef6948091180c776d6a284cddd812f5Suchi Amalapurapuimport android.os.RemoteException;
23679bba339ef6948091180c776d6a284cddd812f5Suchi Amalapurapuimport android.os.ServiceManager;
24679bba339ef6948091180c776d6a284cddd812f5Suchi Amalapurapuimport android.os.storage.StorageResultCode;
25679bba339ef6948091180c776d6a284cddd812f5Suchi Amalapurapuimport android.util.Log;
26679bba339ef6948091180c776d6a284cddd812f5Suchi Amalapurapu
27679bba339ef6948091180c776d6a284cddd812f5Suchi Amalapurapuimport java.io.File;
28679bba339ef6948091180c776d6a284cddd812f5Suchi Amalapurapu
295b993ce7bc29e43a3215a50ce6ce5d6550d4e5e2Suchi Amalapurapu/**
305b993ce7bc29e43a3215a50ce6ce5d6550d4e5e2Suchi Amalapurapu * Constants used internally between the PackageManager
315b993ce7bc29e43a3215a50ce6ce5d6550d4e5e2Suchi Amalapurapu * and media container service transports.
32679bba339ef6948091180c776d6a284cddd812f5Suchi Amalapurapu * Some utility methods to invoke MountService api.
335b993ce7bc29e43a3215a50ce6ce5d6550d4e5e2Suchi Amalapurapu */
345b993ce7bc29e43a3215a50ce6ce5d6550d4e5e2Suchi Amalapurapupublic class PackageHelper {
355b993ce7bc29e43a3215a50ce6ce5d6550d4e5e2Suchi Amalapurapu    public static final int RECOMMEND_INSTALL_INTERNAL = 1;
365b993ce7bc29e43a3215a50ce6ce5d6550d4e5e2Suchi Amalapurapu    public static final int RECOMMEND_INSTALL_EXTERNAL = 2;
375b993ce7bc29e43a3215a50ce6ce5d6550d4e5e2Suchi Amalapurapu    public static final int RECOMMEND_FAILED_INSUFFICIENT_STORAGE = -1;
385b993ce7bc29e43a3215a50ce6ce5d6550d4e5e2Suchi Amalapurapu    public static final int RECOMMEND_FAILED_INVALID_APK = -2;
39a2b6c3775ed6b8924232d6a01bae4a19740a15f8Suchi Amalapurapu    public static final int RECOMMEND_FAILED_INVALID_LOCATION = -3;
40a2b6c3775ed6b8924232d6a01bae4a19740a15f8Suchi Amalapurapu    public static final int RECOMMEND_FAILED_ALREADY_EXISTS = -4;
418a9ab24a5c9b595ac0268fcade4b5bbfe7c45c2dSuchi Amalapurapu    public static final int RECOMMEND_MEDIA_UNAVAILABLE = -5;
42cf6eaeaae9e6745dd6e07540812c79821d7043c2Suchi Amalapurapu    private static final boolean localLOGV = true;
43679bba339ef6948091180c776d6a284cddd812f5Suchi Amalapurapu    private static final String TAG = "PackageHelper";
44089262dc022d87e31eefc536025be6c015c7ebdeSuchi Amalapurapu    // App installation location settings values
45089262dc022d87e31eefc536025be6c015c7ebdeSuchi Amalapurapu    public static final int APP_INSTALL_AUTO = 0;
46089262dc022d87e31eefc536025be6c015c7ebdeSuchi Amalapurapu    public static final int APP_INSTALL_INTERNAL = 1;
47089262dc022d87e31eefc536025be6c015c7ebdeSuchi Amalapurapu    public static final int APP_INSTALL_EXTERNAL = 2;
48679bba339ef6948091180c776d6a284cddd812f5Suchi Amalapurapu
49679bba339ef6948091180c776d6a284cddd812f5Suchi Amalapurapu    public static IMountService getMountService() {
50679bba339ef6948091180c776d6a284cddd812f5Suchi Amalapurapu        IBinder service = ServiceManager.getService("mount");
51679bba339ef6948091180c776d6a284cddd812f5Suchi Amalapurapu        if (service != null) {
52679bba339ef6948091180c776d6a284cddd812f5Suchi Amalapurapu            return IMountService.Stub.asInterface(service);
53679bba339ef6948091180c776d6a284cddd812f5Suchi Amalapurapu        } else {
54679bba339ef6948091180c776d6a284cddd812f5Suchi Amalapurapu            Log.e(TAG, "Can't get mount service");
55679bba339ef6948091180c776d6a284cddd812f5Suchi Amalapurapu        }
56679bba339ef6948091180c776d6a284cddd812f5Suchi Amalapurapu        return null;
57679bba339ef6948091180c776d6a284cddd812f5Suchi Amalapurapu    }
58679bba339ef6948091180c776d6a284cddd812f5Suchi Amalapurapu
5985387d7ba36e56b291cbde87acb5a5b2200fe01cKenny Root    public static String createSdDir(long sizeBytes, String cid,
60679bba339ef6948091180c776d6a284cddd812f5Suchi Amalapurapu            String sdEncKey, int uid) {
61679bba339ef6948091180c776d6a284cddd812f5Suchi Amalapurapu        // Create mount point via MountService
62679bba339ef6948091180c776d6a284cddd812f5Suchi Amalapurapu        IMountService mountService = getMountService();
6385387d7ba36e56b291cbde87acb5a5b2200fe01cKenny Root        int sizeMb = (int) (sizeBytes >> 20);
6485387d7ba36e56b291cbde87acb5a5b2200fe01cKenny Root        if ((sizeBytes - (sizeMb * 1024 * 1024)) > 0) {
6585387d7ba36e56b291cbde87acb5a5b2200fe01cKenny Root            sizeMb++;
66679bba339ef6948091180c776d6a284cddd812f5Suchi Amalapurapu        }
679b10ef5fe85e9d29721ff0cd15161f960d38a8dbSuchi Amalapurapu        // Add buffer size
6885387d7ba36e56b291cbde87acb5a5b2200fe01cKenny Root        sizeMb++;
6985387d7ba36e56b291cbde87acb5a5b2200fe01cKenny Root        if (localLOGV)
7085387d7ba36e56b291cbde87acb5a5b2200fe01cKenny Root            Log.i(TAG, "Size of container " + sizeMb + " MB " + sizeBytes + " bytes");
71679bba339ef6948091180c776d6a284cddd812f5Suchi Amalapurapu
72679bba339ef6948091180c776d6a284cddd812f5Suchi Amalapurapu        try {
73679bba339ef6948091180c776d6a284cddd812f5Suchi Amalapurapu            int rc = mountService.createSecureContainer(
7485387d7ba36e56b291cbde87acb5a5b2200fe01cKenny Root                    cid, sizeMb, "fat", sdEncKey, uid);
75679bba339ef6948091180c776d6a284cddd812f5Suchi Amalapurapu            if (rc != StorageResultCode.OperationSucceeded) {
76679bba339ef6948091180c776d6a284cddd812f5Suchi Amalapurapu                Log.e(TAG, "Failed to create secure container " + cid);
77679bba339ef6948091180c776d6a284cddd812f5Suchi Amalapurapu                return null;
78679bba339ef6948091180c776d6a284cddd812f5Suchi Amalapurapu            }
79679bba339ef6948091180c776d6a284cddd812f5Suchi Amalapurapu            String cachePath = mountService.getSecureContainerPath(cid);
80cf6eaeaae9e6745dd6e07540812c79821d7043c2Suchi Amalapurapu            if (localLOGV) Log.i(TAG, "Created secure container " + cid +
81679bba339ef6948091180c776d6a284cddd812f5Suchi Amalapurapu                    " at " + cachePath);
82679bba339ef6948091180c776d6a284cddd812f5Suchi Amalapurapu                return cachePath;
83679bba339ef6948091180c776d6a284cddd812f5Suchi Amalapurapu        } catch (RemoteException e) {
84679bba339ef6948091180c776d6a284cddd812f5Suchi Amalapurapu            Log.e(TAG, "MountService running?");
85679bba339ef6948091180c776d6a284cddd812f5Suchi Amalapurapu        }
86679bba339ef6948091180c776d6a284cddd812f5Suchi Amalapurapu        return null;
87679bba339ef6948091180c776d6a284cddd812f5Suchi Amalapurapu    }
88679bba339ef6948091180c776d6a284cddd812f5Suchi Amalapurapu
89679bba339ef6948091180c776d6a284cddd812f5Suchi Amalapurapu   public static String mountSdDir(String cid, String key, int ownerUid) {
90679bba339ef6948091180c776d6a284cddd812f5Suchi Amalapurapu    try {
91679bba339ef6948091180c776d6a284cddd812f5Suchi Amalapurapu        int rc = getMountService().mountSecureContainer(cid, key, ownerUid);
92679bba339ef6948091180c776d6a284cddd812f5Suchi Amalapurapu        if (rc != StorageResultCode.OperationSucceeded) {
93679bba339ef6948091180c776d6a284cddd812f5Suchi Amalapurapu            Log.i(TAG, "Failed to mount container " + cid + " rc : " + rc);
94679bba339ef6948091180c776d6a284cddd812f5Suchi Amalapurapu            return null;
95679bba339ef6948091180c776d6a284cddd812f5Suchi Amalapurapu        }
96679bba339ef6948091180c776d6a284cddd812f5Suchi Amalapurapu        return getMountService().getSecureContainerPath(cid);
97679bba339ef6948091180c776d6a284cddd812f5Suchi Amalapurapu    } catch (RemoteException e) {
98679bba339ef6948091180c776d6a284cddd812f5Suchi Amalapurapu        Log.e(TAG, "MountService running?");
99679bba339ef6948091180c776d6a284cddd812f5Suchi Amalapurapu    }
100679bba339ef6948091180c776d6a284cddd812f5Suchi Amalapurapu    return null;
101679bba339ef6948091180c776d6a284cddd812f5Suchi Amalapurapu   }
102679bba339ef6948091180c776d6a284cddd812f5Suchi Amalapurapu
103679bba339ef6948091180c776d6a284cddd812f5Suchi Amalapurapu   public static boolean unMountSdDir(String cid) {
104679bba339ef6948091180c776d6a284cddd812f5Suchi Amalapurapu    try {
105cf6eaeaae9e6745dd6e07540812c79821d7043c2Suchi Amalapurapu        int rc = getMountService().unmountSecureContainer(cid, true);
106679bba339ef6948091180c776d6a284cddd812f5Suchi Amalapurapu        if (rc != StorageResultCode.OperationSucceeded) {
107679bba339ef6948091180c776d6a284cddd812f5Suchi Amalapurapu            Log.e(TAG, "Failed to unmount " + cid + " with rc " + rc);
108679bba339ef6948091180c776d6a284cddd812f5Suchi Amalapurapu            return false;
109679bba339ef6948091180c776d6a284cddd812f5Suchi Amalapurapu        }
110679bba339ef6948091180c776d6a284cddd812f5Suchi Amalapurapu        return true;
111679bba339ef6948091180c776d6a284cddd812f5Suchi Amalapurapu    } catch (RemoteException e) {
112679bba339ef6948091180c776d6a284cddd812f5Suchi Amalapurapu        Log.e(TAG, "MountService running?");
113679bba339ef6948091180c776d6a284cddd812f5Suchi Amalapurapu    }
114679bba339ef6948091180c776d6a284cddd812f5Suchi Amalapurapu        return false;
115679bba339ef6948091180c776d6a284cddd812f5Suchi Amalapurapu   }
116679bba339ef6948091180c776d6a284cddd812f5Suchi Amalapurapu
117679bba339ef6948091180c776d6a284cddd812f5Suchi Amalapurapu   public static boolean renameSdDir(String oldId, String newId) {
118679bba339ef6948091180c776d6a284cddd812f5Suchi Amalapurapu       try {
119679bba339ef6948091180c776d6a284cddd812f5Suchi Amalapurapu           int rc = getMountService().renameSecureContainer(oldId, newId);
120679bba339ef6948091180c776d6a284cddd812f5Suchi Amalapurapu           if (rc != StorageResultCode.OperationSucceeded) {
121679bba339ef6948091180c776d6a284cddd812f5Suchi Amalapurapu               Log.e(TAG, "Failed to rename " + oldId + " to " +
122679bba339ef6948091180c776d6a284cddd812f5Suchi Amalapurapu                       newId + "with rc " + rc);
123679bba339ef6948091180c776d6a284cddd812f5Suchi Amalapurapu               return false;
124679bba339ef6948091180c776d6a284cddd812f5Suchi Amalapurapu           }
125679bba339ef6948091180c776d6a284cddd812f5Suchi Amalapurapu           return true;
126679bba339ef6948091180c776d6a284cddd812f5Suchi Amalapurapu       } catch (RemoteException e) {
127679bba339ef6948091180c776d6a284cddd812f5Suchi Amalapurapu           Log.i(TAG, "Failed ot rename  " + oldId + " to " + newId +
128679bba339ef6948091180c776d6a284cddd812f5Suchi Amalapurapu                   " with exception : " + e);
129679bba339ef6948091180c776d6a284cddd812f5Suchi Amalapurapu       }
130679bba339ef6948091180c776d6a284cddd812f5Suchi Amalapurapu       return false;
131679bba339ef6948091180c776d6a284cddd812f5Suchi Amalapurapu   }
132679bba339ef6948091180c776d6a284cddd812f5Suchi Amalapurapu
133679bba339ef6948091180c776d6a284cddd812f5Suchi Amalapurapu   public static String getSdDir(String cid) {
134679bba339ef6948091180c776d6a284cddd812f5Suchi Amalapurapu       try {
135679bba339ef6948091180c776d6a284cddd812f5Suchi Amalapurapu            return getMountService().getSecureContainerPath(cid);
136679bba339ef6948091180c776d6a284cddd812f5Suchi Amalapurapu        } catch (RemoteException e) {
137679bba339ef6948091180c776d6a284cddd812f5Suchi Amalapurapu            Log.e(TAG, "Failed to get container path for " + cid +
138679bba339ef6948091180c776d6a284cddd812f5Suchi Amalapurapu                " with exception " + e);
139679bba339ef6948091180c776d6a284cddd812f5Suchi Amalapurapu        }
140679bba339ef6948091180c776d6a284cddd812f5Suchi Amalapurapu        return null;
141679bba339ef6948091180c776d6a284cddd812f5Suchi Amalapurapu   }
142679bba339ef6948091180c776d6a284cddd812f5Suchi Amalapurapu
143679bba339ef6948091180c776d6a284cddd812f5Suchi Amalapurapu    public static boolean finalizeSdDir(String cid) {
144679bba339ef6948091180c776d6a284cddd812f5Suchi Amalapurapu        try {
145679bba339ef6948091180c776d6a284cddd812f5Suchi Amalapurapu            int rc = getMountService().finalizeSecureContainer(cid);
146679bba339ef6948091180c776d6a284cddd812f5Suchi Amalapurapu            if (rc != StorageResultCode.OperationSucceeded) {
147679bba339ef6948091180c776d6a284cddd812f5Suchi Amalapurapu                Log.i(TAG, "Failed to finalize container " + cid);
148679bba339ef6948091180c776d6a284cddd812f5Suchi Amalapurapu                return false;
149679bba339ef6948091180c776d6a284cddd812f5Suchi Amalapurapu            }
150679bba339ef6948091180c776d6a284cddd812f5Suchi Amalapurapu            return true;
151679bba339ef6948091180c776d6a284cddd812f5Suchi Amalapurapu        } catch (RemoteException e) {
152679bba339ef6948091180c776d6a284cddd812f5Suchi Amalapurapu            Log.e(TAG, "Failed to finalize container " + cid +
153679bba339ef6948091180c776d6a284cddd812f5Suchi Amalapurapu                    " with exception " + e);
154679bba339ef6948091180c776d6a284cddd812f5Suchi Amalapurapu        }
155679bba339ef6948091180c776d6a284cddd812f5Suchi Amalapurapu        return false;
156679bba339ef6948091180c776d6a284cddd812f5Suchi Amalapurapu    }
157679bba339ef6948091180c776d6a284cddd812f5Suchi Amalapurapu
158679bba339ef6948091180c776d6a284cddd812f5Suchi Amalapurapu    public static boolean destroySdDir(String cid) {
159679bba339ef6948091180c776d6a284cddd812f5Suchi Amalapurapu        try {
160cf6eaeaae9e6745dd6e07540812c79821d7043c2Suchi Amalapurapu            if (localLOGV) Log.i(TAG, "Forcibly destroying container " + cid);
161cf6eaeaae9e6745dd6e07540812c79821d7043c2Suchi Amalapurapu            int rc = getMountService().destroySecureContainer(cid, true);
162679bba339ef6948091180c776d6a284cddd812f5Suchi Amalapurapu            if (rc != StorageResultCode.OperationSucceeded) {
163679bba339ef6948091180c776d6a284cddd812f5Suchi Amalapurapu                Log.i(TAG, "Failed to destroy container " + cid);
164679bba339ef6948091180c776d6a284cddd812f5Suchi Amalapurapu                return false;
165679bba339ef6948091180c776d6a284cddd812f5Suchi Amalapurapu            }
166679bba339ef6948091180c776d6a284cddd812f5Suchi Amalapurapu            return true;
167679bba339ef6948091180c776d6a284cddd812f5Suchi Amalapurapu        } catch (RemoteException e) {
168679bba339ef6948091180c776d6a284cddd812f5Suchi Amalapurapu            Log.e(TAG, "Failed to destroy container " + cid +
169679bba339ef6948091180c776d6a284cddd812f5Suchi Amalapurapu                    " with exception " + e);
170679bba339ef6948091180c776d6a284cddd812f5Suchi Amalapurapu        }
171679bba339ef6948091180c776d6a284cddd812f5Suchi Amalapurapu        return false;
172679bba339ef6948091180c776d6a284cddd812f5Suchi Amalapurapu    }
173679bba339ef6948091180c776d6a284cddd812f5Suchi Amalapurapu
174679bba339ef6948091180c776d6a284cddd812f5Suchi Amalapurapu    public static String[] getSecureContainerList() {
175679bba339ef6948091180c776d6a284cddd812f5Suchi Amalapurapu        try {
176679bba339ef6948091180c776d6a284cddd812f5Suchi Amalapurapu            return getMountService().getSecureContainerList();
177679bba339ef6948091180c776d6a284cddd812f5Suchi Amalapurapu        } catch (RemoteException e) {
178679bba339ef6948091180c776d6a284cddd812f5Suchi Amalapurapu            Log.e(TAG, "Failed to get secure container list with exception" +
179679bba339ef6948091180c776d6a284cddd812f5Suchi Amalapurapu                    e);
180679bba339ef6948091180c776d6a284cddd812f5Suchi Amalapurapu        }
181679bba339ef6948091180c776d6a284cddd812f5Suchi Amalapurapu        return null;
182679bba339ef6948091180c776d6a284cddd812f5Suchi Amalapurapu    }
183679bba339ef6948091180c776d6a284cddd812f5Suchi Amalapurapu
184679bba339ef6948091180c776d6a284cddd812f5Suchi Amalapurapu   public static boolean isContainerMounted(String cid) {
185679bba339ef6948091180c776d6a284cddd812f5Suchi Amalapurapu       try {
186679bba339ef6948091180c776d6a284cddd812f5Suchi Amalapurapu           return getMountService().isSecureContainerMounted(cid);
187679bba339ef6948091180c776d6a284cddd812f5Suchi Amalapurapu       } catch (RemoteException e) {
188679bba339ef6948091180c776d6a284cddd812f5Suchi Amalapurapu           Log.e(TAG, "Failed to find out if container " + cid + " mounted");
189679bba339ef6948091180c776d6a284cddd812f5Suchi Amalapurapu       }
190679bba339ef6948091180c776d6a284cddd812f5Suchi Amalapurapu       return false;
191679bba339ef6948091180c776d6a284cddd812f5Suchi Amalapurapu   }
1925b993ce7bc29e43a3215a50ce6ce5d6550d4e5e2Suchi Amalapurapu}
193