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