PackageManagerTests.java revision 5b993ce7bc29e43a3215a50ce6ce5d6550d4e5e2
1afbaaa189fbc18b3acbb06e03233cf3442f2b1c4Suchi Amalapurapu/* 2afbaaa189fbc18b3acbb06e03233cf3442f2b1c4Suchi Amalapurapu * Copyright (C) 2006 The Android Open Source Project 3afbaaa189fbc18b3acbb06e03233cf3442f2b1c4Suchi Amalapurapu * 4afbaaa189fbc18b3acbb06e03233cf3442f2b1c4Suchi Amalapurapu * Licensed under the Apache License, Version 2.0 (the "License"); 5afbaaa189fbc18b3acbb06e03233cf3442f2b1c4Suchi Amalapurapu * you may not use this file except in compliance with the License. 6afbaaa189fbc18b3acbb06e03233cf3442f2b1c4Suchi Amalapurapu * You may obtain a copy of the License at 7afbaaa189fbc18b3acbb06e03233cf3442f2b1c4Suchi Amalapurapu * 8afbaaa189fbc18b3acbb06e03233cf3442f2b1c4Suchi Amalapurapu * http://www.apache.org/licenses/LICENSE-2.0 9afbaaa189fbc18b3acbb06e03233cf3442f2b1c4Suchi Amalapurapu * 10afbaaa189fbc18b3acbb06e03233cf3442f2b1c4Suchi Amalapurapu * Unless required by applicable law or agreed to in writing, software 11afbaaa189fbc18b3acbb06e03233cf3442f2b1c4Suchi Amalapurapu * distributed under the License is distributed on an "AS IS" BASIS, 12afbaaa189fbc18b3acbb06e03233cf3442f2b1c4Suchi Amalapurapu * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13afbaaa189fbc18b3acbb06e03233cf3442f2b1c4Suchi Amalapurapu * See the License for the specific language governing permissions and 14afbaaa189fbc18b3acbb06e03233cf3442f2b1c4Suchi Amalapurapu * limitations under the License. 15afbaaa189fbc18b3acbb06e03233cf3442f2b1c4Suchi Amalapurapu */ 16afbaaa189fbc18b3acbb06e03233cf3442f2b1c4Suchi Amalapurapu 17afbaaa189fbc18b3acbb06e03233cf3442f2b1c4Suchi Amalapurapupackage com.android.unit_tests; 18afbaaa189fbc18b3acbb06e03233cf3442f2b1c4Suchi Amalapurapu 19b104340496e3a531e26c8f428c808eca0e039f50San Mehatimport android.os.storage.IMountService.Stub; 20b56ae20b22fd7283df32072a431ab6d4965f3c1bSuchi Amalapurapu 21afbaaa189fbc18b3acbb06e03233cf3442f2b1c4Suchi Amalapurapuimport android.net.Uri; 22afbaaa189fbc18b3acbb06e03233cf3442f2b1c4Suchi Amalapurapuimport android.os.FileUtils; 23afbaaa189fbc18b3acbb06e03233cf3442f2b1c4Suchi Amalapurapu 24afbaaa189fbc18b3acbb06e03233cf3442f2b1c4Suchi Amalapurapuimport java.io.File; 25afbaaa189fbc18b3acbb06e03233cf3442f2b1c4Suchi Amalapurapuimport java.io.FileInputStream; 26afbaaa189fbc18b3acbb06e03233cf3442f2b1c4Suchi Amalapurapuimport java.io.FileNotFoundException; 27afbaaa189fbc18b3acbb06e03233cf3442f2b1c4Suchi Amalapurapuimport java.io.FileOutputStream; 28afbaaa189fbc18b3acbb06e03233cf3442f2b1c4Suchi Amalapurapuimport java.io.IOException; 29afbaaa189fbc18b3acbb06e03233cf3442f2b1c4Suchi Amalapurapuimport java.io.InputStream; 30afbaaa189fbc18b3acbb06e03233cf3442f2b1c4Suchi Amalapurapu 31afbaaa189fbc18b3acbb06e03233cf3442f2b1c4Suchi Amalapurapuimport android.app.PendingIntent; 32afbaaa189fbc18b3acbb06e03233cf3442f2b1c4Suchi Amalapurapuimport android.content.BroadcastReceiver; 33afbaaa189fbc18b3acbb06e03233cf3442f2b1c4Suchi Amalapurapuimport android.content.Context; 34afbaaa189fbc18b3acbb06e03233cf3442f2b1c4Suchi Amalapurapuimport android.content.Intent; 35afbaaa189fbc18b3acbb06e03233cf3442f2b1c4Suchi Amalapurapuimport android.content.IntentFilter; 36afbaaa189fbc18b3acbb06e03233cf3442f2b1c4Suchi Amalapurapuimport android.content.pm.ApplicationInfo; 37afbaaa189fbc18b3acbb06e03233cf3442f2b1c4Suchi Amalapurapuimport android.content.pm.IPackageDataObserver; 38afbaaa189fbc18b3acbb06e03233cf3442f2b1c4Suchi Amalapurapuimport android.content.pm.IPackageInstallObserver; 39b56ae20b22fd7283df32072a431ab6d4965f3c1bSuchi Amalapurapuimport android.content.pm.IPackageDeleteObserver; 40117818e4f171b1fd9daa05349c48f61388f04567Suchi Amalapurapuimport android.content.pm.PackageInfo; 41afbaaa189fbc18b3acbb06e03233cf3442f2b1c4Suchi Amalapurapuimport android.content.pm.PackageManager; 42afbaaa189fbc18b3acbb06e03233cf3442f2b1c4Suchi Amalapurapuimport android.content.pm.PackageParser; 43afbaaa189fbc18b3acbb06e03233cf3442f2b1c4Suchi Amalapurapuimport android.content.pm.PackageStats; 44afbaaa189fbc18b3acbb06e03233cf3442f2b1c4Suchi Amalapurapuimport android.content.pm.IPackageManager; 45afbaaa189fbc18b3acbb06e03233cf3442f2b1c4Suchi Amalapurapuimport android.content.pm.PackageManager.NameNotFoundException; 46afbaaa189fbc18b3acbb06e03233cf3442f2b1c4Suchi Amalapurapuimport android.content.res.Resources; 47afbaaa189fbc18b3acbb06e03233cf3442f2b1c4Suchi Amalapurapuimport android.content.res.Resources.NotFoundException; 48afbaaa189fbc18b3acbb06e03233cf3442f2b1c4Suchi Amalapurapuimport android.test.AndroidTestCase; 49afbaaa189fbc18b3acbb06e03233cf3442f2b1c4Suchi Amalapurapuimport android.test.suitebuilder.annotation.LargeTest; 50afbaaa189fbc18b3acbb06e03233cf3442f2b1c4Suchi Amalapurapuimport android.test.suitebuilder.annotation.MediumTest; 51afbaaa189fbc18b3acbb06e03233cf3442f2b1c4Suchi Amalapurapuimport android.test.suitebuilder.annotation.SmallTest; 52afbaaa189fbc18b3acbb06e03233cf3442f2b1c4Suchi Amalapurapuimport android.test.suitebuilder.annotation.Suppress; 53afbaaa189fbc18b3acbb06e03233cf3442f2b1c4Suchi Amalapurapuimport android.util.DisplayMetrics; 54afbaaa189fbc18b3acbb06e03233cf3442f2b1c4Suchi Amalapurapuimport android.util.Log; 55afbaaa189fbc18b3acbb06e03233cf3442f2b1c4Suchi Amalapurapuimport android.os.Environment; 56afbaaa189fbc18b3acbb06e03233cf3442f2b1c4Suchi Amalapurapuimport android.os.Handler; 57b56ae20b22fd7283df32072a431ab6d4965f3c1bSuchi Amalapurapuimport android.os.IBinder; 58b104340496e3a531e26c8f428c808eca0e039f50San Mehatimport android.os.storage.IMountService; 59b104340496e3a531e26c8f428c808eca0e039f50San Mehatimport android.os.storage.StorageResultCode; 60afbaaa189fbc18b3acbb06e03233cf3442f2b1c4Suchi Amalapurapuimport android.os.RemoteException; 61afbaaa189fbc18b3acbb06e03233cf3442f2b1c4Suchi Amalapurapuimport android.os.ServiceManager; 62afbaaa189fbc18b3acbb06e03233cf3442f2b1c4Suchi Amalapurapuimport android.os.StatFs; 63117818e4f171b1fd9daa05349c48f61388f04567Suchi Amalapurapuimport android.provider.Settings; 64afbaaa189fbc18b3acbb06e03233cf3442f2b1c4Suchi Amalapurapu 65afbaaa189fbc18b3acbb06e03233cf3442f2b1c4Suchi Amalapurapupublic class PackageManagerTests extends AndroidTestCase { 66b56ae20b22fd7283df32072a431ab6d4965f3c1bSuchi Amalapurapu private static final boolean localLOGV = true; 67afbaaa189fbc18b3acbb06e03233cf3442f2b1c4Suchi Amalapurapu public static final String TAG="PackageManagerTests"; 68b56ae20b22fd7283df32072a431ab6d4965f3c1bSuchi Amalapurapu public final long MAX_WAIT_TIME=120*1000; 69b56ae20b22fd7283df32072a431ab6d4965f3c1bSuchi Amalapurapu public final long WAIT_TIME_INCR=20*1000; 70b56ae20b22fd7283df32072a431ab6d4965f3c1bSuchi Amalapurapu 71b56ae20b22fd7283df32072a431ab6d4965f3c1bSuchi Amalapurapu void failStr(String errMsg) { 72b56ae20b22fd7283df32072a431ab6d4965f3c1bSuchi Amalapurapu Log.w(TAG, "errMsg="+errMsg); 73b56ae20b22fd7283df32072a431ab6d4965f3c1bSuchi Amalapurapu fail(errMsg); 74b56ae20b22fd7283df32072a431ab6d4965f3c1bSuchi Amalapurapu } 75b56ae20b22fd7283df32072a431ab6d4965f3c1bSuchi Amalapurapu void failStr(Exception e) { 76b56ae20b22fd7283df32072a431ab6d4965f3c1bSuchi Amalapurapu Log.w(TAG, "e.getMessage="+e.getMessage()); 77b56ae20b22fd7283df32072a431ab6d4965f3c1bSuchi Amalapurapu Log.w(TAG, "e="+e); 78b56ae20b22fd7283df32072a431ab6d4965f3c1bSuchi Amalapurapu } 79afbaaa189fbc18b3acbb06e03233cf3442f2b1c4Suchi Amalapurapu 80afbaaa189fbc18b3acbb06e03233cf3442f2b1c4Suchi Amalapurapu @Override 81afbaaa189fbc18b3acbb06e03233cf3442f2b1c4Suchi Amalapurapu protected void setUp() throws Exception { 82afbaaa189fbc18b3acbb06e03233cf3442f2b1c4Suchi Amalapurapu super.setUp(); 83afbaaa189fbc18b3acbb06e03233cf3442f2b1c4Suchi Amalapurapu } 84afbaaa189fbc18b3acbb06e03233cf3442f2b1c4Suchi Amalapurapu 85afbaaa189fbc18b3acbb06e03233cf3442f2b1c4Suchi Amalapurapu private class PackageInstallObserver extends IPackageInstallObserver.Stub { 86afbaaa189fbc18b3acbb06e03233cf3442f2b1c4Suchi Amalapurapu public int returnCode; 87afbaaa189fbc18b3acbb06e03233cf3442f2b1c4Suchi Amalapurapu private boolean doneFlag = false; 88afbaaa189fbc18b3acbb06e03233cf3442f2b1c4Suchi Amalapurapu 89afbaaa189fbc18b3acbb06e03233cf3442f2b1c4Suchi Amalapurapu public void packageInstalled(String packageName, int returnCode) { 90afbaaa189fbc18b3acbb06e03233cf3442f2b1c4Suchi Amalapurapu synchronized(this) { 91afbaaa189fbc18b3acbb06e03233cf3442f2b1c4Suchi Amalapurapu this.returnCode = returnCode; 92afbaaa189fbc18b3acbb06e03233cf3442f2b1c4Suchi Amalapurapu doneFlag = true; 93afbaaa189fbc18b3acbb06e03233cf3442f2b1c4Suchi Amalapurapu notifyAll(); 94afbaaa189fbc18b3acbb06e03233cf3442f2b1c4Suchi Amalapurapu } 95afbaaa189fbc18b3acbb06e03233cf3442f2b1c4Suchi Amalapurapu } 96afbaaa189fbc18b3acbb06e03233cf3442f2b1c4Suchi Amalapurapu 97afbaaa189fbc18b3acbb06e03233cf3442f2b1c4Suchi Amalapurapu public boolean isDone() { 98afbaaa189fbc18b3acbb06e03233cf3442f2b1c4Suchi Amalapurapu return doneFlag; 99afbaaa189fbc18b3acbb06e03233cf3442f2b1c4Suchi Amalapurapu } 100afbaaa189fbc18b3acbb06e03233cf3442f2b1c4Suchi Amalapurapu } 101afbaaa189fbc18b3acbb06e03233cf3442f2b1c4Suchi Amalapurapu 102afbaaa189fbc18b3acbb06e03233cf3442f2b1c4Suchi Amalapurapu abstract class GenericReceiver extends BroadcastReceiver { 103afbaaa189fbc18b3acbb06e03233cf3442f2b1c4Suchi Amalapurapu private boolean doneFlag = false; 104afbaaa189fbc18b3acbb06e03233cf3442f2b1c4Suchi Amalapurapu boolean received = false; 105afbaaa189fbc18b3acbb06e03233cf3442f2b1c4Suchi Amalapurapu Intent intent; 106afbaaa189fbc18b3acbb06e03233cf3442f2b1c4Suchi Amalapurapu IntentFilter filter; 107afbaaa189fbc18b3acbb06e03233cf3442f2b1c4Suchi Amalapurapu abstract boolean notifyNow(Intent intent); 108afbaaa189fbc18b3acbb06e03233cf3442f2b1c4Suchi Amalapurapu @Override 109afbaaa189fbc18b3acbb06e03233cf3442f2b1c4Suchi Amalapurapu public void onReceive(Context context, Intent intent) { 110afbaaa189fbc18b3acbb06e03233cf3442f2b1c4Suchi Amalapurapu if (notifyNow(intent)) { 111afbaaa189fbc18b3acbb06e03233cf3442f2b1c4Suchi Amalapurapu synchronized (this) { 112afbaaa189fbc18b3acbb06e03233cf3442f2b1c4Suchi Amalapurapu received = true; 113afbaaa189fbc18b3acbb06e03233cf3442f2b1c4Suchi Amalapurapu doneFlag = true; 114afbaaa189fbc18b3acbb06e03233cf3442f2b1c4Suchi Amalapurapu this.intent = intent; 115afbaaa189fbc18b3acbb06e03233cf3442f2b1c4Suchi Amalapurapu notifyAll(); 116afbaaa189fbc18b3acbb06e03233cf3442f2b1c4Suchi Amalapurapu } 117afbaaa189fbc18b3acbb06e03233cf3442f2b1c4Suchi Amalapurapu } 118afbaaa189fbc18b3acbb06e03233cf3442f2b1c4Suchi Amalapurapu } 119afbaaa189fbc18b3acbb06e03233cf3442f2b1c4Suchi Amalapurapu 120afbaaa189fbc18b3acbb06e03233cf3442f2b1c4Suchi Amalapurapu public boolean isDone() { 121afbaaa189fbc18b3acbb06e03233cf3442f2b1c4Suchi Amalapurapu return doneFlag; 122afbaaa189fbc18b3acbb06e03233cf3442f2b1c4Suchi Amalapurapu } 123afbaaa189fbc18b3acbb06e03233cf3442f2b1c4Suchi Amalapurapu 124afbaaa189fbc18b3acbb06e03233cf3442f2b1c4Suchi Amalapurapu public void setFilter(IntentFilter filter) { 125afbaaa189fbc18b3acbb06e03233cf3442f2b1c4Suchi Amalapurapu this.filter = filter; 126afbaaa189fbc18b3acbb06e03233cf3442f2b1c4Suchi Amalapurapu } 127afbaaa189fbc18b3acbb06e03233cf3442f2b1c4Suchi Amalapurapu } 128afbaaa189fbc18b3acbb06e03233cf3442f2b1c4Suchi Amalapurapu 129afbaaa189fbc18b3acbb06e03233cf3442f2b1c4Suchi Amalapurapu class InstallReceiver extends GenericReceiver { 130afbaaa189fbc18b3acbb06e03233cf3442f2b1c4Suchi Amalapurapu String pkgName; 131afbaaa189fbc18b3acbb06e03233cf3442f2b1c4Suchi Amalapurapu 132afbaaa189fbc18b3acbb06e03233cf3442f2b1c4Suchi Amalapurapu InstallReceiver(String pkgName) { 133afbaaa189fbc18b3acbb06e03233cf3442f2b1c4Suchi Amalapurapu this.pkgName = pkgName; 134afbaaa189fbc18b3acbb06e03233cf3442f2b1c4Suchi Amalapurapu IntentFilter filter = new IntentFilter(Intent.ACTION_PACKAGE_ADDED); 135afbaaa189fbc18b3acbb06e03233cf3442f2b1c4Suchi Amalapurapu filter.addDataScheme("package"); 136afbaaa189fbc18b3acbb06e03233cf3442f2b1c4Suchi Amalapurapu super.setFilter(filter); 137afbaaa189fbc18b3acbb06e03233cf3442f2b1c4Suchi Amalapurapu } 138afbaaa189fbc18b3acbb06e03233cf3442f2b1c4Suchi Amalapurapu 139afbaaa189fbc18b3acbb06e03233cf3442f2b1c4Suchi Amalapurapu public boolean notifyNow(Intent intent) { 140afbaaa189fbc18b3acbb06e03233cf3442f2b1c4Suchi Amalapurapu String action = intent.getAction(); 141afbaaa189fbc18b3acbb06e03233cf3442f2b1c4Suchi Amalapurapu if (!Intent.ACTION_PACKAGE_ADDED.equals(action)) { 142afbaaa189fbc18b3acbb06e03233cf3442f2b1c4Suchi Amalapurapu return false; 143afbaaa189fbc18b3acbb06e03233cf3442f2b1c4Suchi Amalapurapu } 144afbaaa189fbc18b3acbb06e03233cf3442f2b1c4Suchi Amalapurapu Uri data = intent.getData(); 145afbaaa189fbc18b3acbb06e03233cf3442f2b1c4Suchi Amalapurapu String installedPkg = data.getEncodedSchemeSpecificPart(); 146afbaaa189fbc18b3acbb06e03233cf3442f2b1c4Suchi Amalapurapu if (pkgName.equals(installedPkg)) { 147afbaaa189fbc18b3acbb06e03233cf3442f2b1c4Suchi Amalapurapu return true; 148afbaaa189fbc18b3acbb06e03233cf3442f2b1c4Suchi Amalapurapu } 149afbaaa189fbc18b3acbb06e03233cf3442f2b1c4Suchi Amalapurapu return false; 150afbaaa189fbc18b3acbb06e03233cf3442f2b1c4Suchi Amalapurapu } 151afbaaa189fbc18b3acbb06e03233cf3442f2b1c4Suchi Amalapurapu } 152afbaaa189fbc18b3acbb06e03233cf3442f2b1c4Suchi Amalapurapu 153afbaaa189fbc18b3acbb06e03233cf3442f2b1c4Suchi Amalapurapu PackageManager getPm() { 154afbaaa189fbc18b3acbb06e03233cf3442f2b1c4Suchi Amalapurapu return mContext.getPackageManager(); 155afbaaa189fbc18b3acbb06e03233cf3442f2b1c4Suchi Amalapurapu } 156afbaaa189fbc18b3acbb06e03233cf3442f2b1c4Suchi Amalapurapu 157afbaaa189fbc18b3acbb06e03233cf3442f2b1c4Suchi Amalapurapu public boolean invokeInstallPackage(Uri packageURI, int flags, 158afbaaa189fbc18b3acbb06e03233cf3442f2b1c4Suchi Amalapurapu final String pkgName, GenericReceiver receiver) throws Exception { 159afbaaa189fbc18b3acbb06e03233cf3442f2b1c4Suchi Amalapurapu PackageInstallObserver observer = new PackageInstallObserver(); 160afbaaa189fbc18b3acbb06e03233cf3442f2b1c4Suchi Amalapurapu final boolean received = false; 161afbaaa189fbc18b3acbb06e03233cf3442f2b1c4Suchi Amalapurapu mContext.registerReceiver(receiver, receiver.filter); 162afbaaa189fbc18b3acbb06e03233cf3442f2b1c4Suchi Amalapurapu try { 163afbaaa189fbc18b3acbb06e03233cf3442f2b1c4Suchi Amalapurapu // Wait on observer 164afbaaa189fbc18b3acbb06e03233cf3442f2b1c4Suchi Amalapurapu synchronized(observer) { 165b56ae20b22fd7283df32072a431ab6d4965f3c1bSuchi Amalapurapu synchronized (receiver) { 166afbaaa189fbc18b3acbb06e03233cf3442f2b1c4Suchi Amalapurapu getPm().installPackage(packageURI, observer, flags, null); 167afbaaa189fbc18b3acbb06e03233cf3442f2b1c4Suchi Amalapurapu long waitTime = 0; 168afbaaa189fbc18b3acbb06e03233cf3442f2b1c4Suchi Amalapurapu while((!observer.isDone()) && (waitTime < MAX_WAIT_TIME) ) { 169afbaaa189fbc18b3acbb06e03233cf3442f2b1c4Suchi Amalapurapu observer.wait(WAIT_TIME_INCR); 170afbaaa189fbc18b3acbb06e03233cf3442f2b1c4Suchi Amalapurapu waitTime += WAIT_TIME_INCR; 171afbaaa189fbc18b3acbb06e03233cf3442f2b1c4Suchi Amalapurapu } 172afbaaa189fbc18b3acbb06e03233cf3442f2b1c4Suchi Amalapurapu if(!observer.isDone()) { 173afbaaa189fbc18b3acbb06e03233cf3442f2b1c4Suchi Amalapurapu throw new Exception("Timed out waiting for packageInstalled callback"); 174afbaaa189fbc18b3acbb06e03233cf3442f2b1c4Suchi Amalapurapu } 175afbaaa189fbc18b3acbb06e03233cf3442f2b1c4Suchi Amalapurapu if (observer.returnCode != PackageManager.INSTALL_SUCCEEDED) { 176afbaaa189fbc18b3acbb06e03233cf3442f2b1c4Suchi Amalapurapu return false; 177afbaaa189fbc18b3acbb06e03233cf3442f2b1c4Suchi Amalapurapu } 178afbaaa189fbc18b3acbb06e03233cf3442f2b1c4Suchi Amalapurapu // Verify we received the broadcast 179afbaaa189fbc18b3acbb06e03233cf3442f2b1c4Suchi Amalapurapu waitTime = 0; 180afbaaa189fbc18b3acbb06e03233cf3442f2b1c4Suchi Amalapurapu while((!receiver.isDone()) && (waitTime < MAX_WAIT_TIME) ) { 181afbaaa189fbc18b3acbb06e03233cf3442f2b1c4Suchi Amalapurapu receiver.wait(WAIT_TIME_INCR); 182afbaaa189fbc18b3acbb06e03233cf3442f2b1c4Suchi Amalapurapu waitTime += WAIT_TIME_INCR; 183afbaaa189fbc18b3acbb06e03233cf3442f2b1c4Suchi Amalapurapu } 184afbaaa189fbc18b3acbb06e03233cf3442f2b1c4Suchi Amalapurapu if(!receiver.isDone()) { 185afbaaa189fbc18b3acbb06e03233cf3442f2b1c4Suchi Amalapurapu throw new Exception("Timed out waiting for PACKAGE_ADDED notification"); 186afbaaa189fbc18b3acbb06e03233cf3442f2b1c4Suchi Amalapurapu } 187afbaaa189fbc18b3acbb06e03233cf3442f2b1c4Suchi Amalapurapu return receiver.received; 188afbaaa189fbc18b3acbb06e03233cf3442f2b1c4Suchi Amalapurapu } 189afbaaa189fbc18b3acbb06e03233cf3442f2b1c4Suchi Amalapurapu } 190afbaaa189fbc18b3acbb06e03233cf3442f2b1c4Suchi Amalapurapu } finally { 191afbaaa189fbc18b3acbb06e03233cf3442f2b1c4Suchi Amalapurapu mContext.unregisterReceiver(receiver); 192afbaaa189fbc18b3acbb06e03233cf3442f2b1c4Suchi Amalapurapu } 193afbaaa189fbc18b3acbb06e03233cf3442f2b1c4Suchi Amalapurapu } 194afbaaa189fbc18b3acbb06e03233cf3442f2b1c4Suchi Amalapurapu 1955b993ce7bc29e43a3215a50ce6ce5d6550d4e5e2Suchi Amalapurapu public boolean invokeInstallPackageFail(Uri packageURI, int flags, 1965b993ce7bc29e43a3215a50ce6ce5d6550d4e5e2Suchi Amalapurapu final String pkgName, int result) throws Exception { 1975b993ce7bc29e43a3215a50ce6ce5d6550d4e5e2Suchi Amalapurapu PackageInstallObserver observer = new PackageInstallObserver(); 1985b993ce7bc29e43a3215a50ce6ce5d6550d4e5e2Suchi Amalapurapu try { 1995b993ce7bc29e43a3215a50ce6ce5d6550d4e5e2Suchi Amalapurapu // Wait on observer 2005b993ce7bc29e43a3215a50ce6ce5d6550d4e5e2Suchi Amalapurapu synchronized(observer) { 2015b993ce7bc29e43a3215a50ce6ce5d6550d4e5e2Suchi Amalapurapu getPm().installPackage(packageURI, observer, flags, null); 2025b993ce7bc29e43a3215a50ce6ce5d6550d4e5e2Suchi Amalapurapu long waitTime = 0; 2035b993ce7bc29e43a3215a50ce6ce5d6550d4e5e2Suchi Amalapurapu while((!observer.isDone()) && (waitTime < MAX_WAIT_TIME) ) { 2045b993ce7bc29e43a3215a50ce6ce5d6550d4e5e2Suchi Amalapurapu observer.wait(WAIT_TIME_INCR); 2055b993ce7bc29e43a3215a50ce6ce5d6550d4e5e2Suchi Amalapurapu waitTime += WAIT_TIME_INCR; 2065b993ce7bc29e43a3215a50ce6ce5d6550d4e5e2Suchi Amalapurapu } 2075b993ce7bc29e43a3215a50ce6ce5d6550d4e5e2Suchi Amalapurapu if(!observer.isDone()) { 2085b993ce7bc29e43a3215a50ce6ce5d6550d4e5e2Suchi Amalapurapu throw new Exception("Timed out waiting for packageInstalled callback"); 2095b993ce7bc29e43a3215a50ce6ce5d6550d4e5e2Suchi Amalapurapu } 2105b993ce7bc29e43a3215a50ce6ce5d6550d4e5e2Suchi Amalapurapu return (observer.returnCode == result); 2115b993ce7bc29e43a3215a50ce6ce5d6550d4e5e2Suchi Amalapurapu } 2125b993ce7bc29e43a3215a50ce6ce5d6550d4e5e2Suchi Amalapurapu } finally { 2135b993ce7bc29e43a3215a50ce6ce5d6550d4e5e2Suchi Amalapurapu } 2145b993ce7bc29e43a3215a50ce6ce5d6550d4e5e2Suchi Amalapurapu } 2155b993ce7bc29e43a3215a50ce6ce5d6550d4e5e2Suchi Amalapurapu 216afbaaa189fbc18b3acbb06e03233cf3442f2b1c4Suchi Amalapurapu Uri getInstallablePackage(int fileResId, File outFile) { 217afbaaa189fbc18b3acbb06e03233cf3442f2b1c4Suchi Amalapurapu Resources res = mContext.getResources(); 218afbaaa189fbc18b3acbb06e03233cf3442f2b1c4Suchi Amalapurapu InputStream is = null; 219afbaaa189fbc18b3acbb06e03233cf3442f2b1c4Suchi Amalapurapu try { 220afbaaa189fbc18b3acbb06e03233cf3442f2b1c4Suchi Amalapurapu is = res.openRawResource(fileResId); 221afbaaa189fbc18b3acbb06e03233cf3442f2b1c4Suchi Amalapurapu } catch (NotFoundException e) { 222afbaaa189fbc18b3acbb06e03233cf3442f2b1c4Suchi Amalapurapu failStr("Failed to load resource with id: " + fileResId); 223afbaaa189fbc18b3acbb06e03233cf3442f2b1c4Suchi Amalapurapu } 224afbaaa189fbc18b3acbb06e03233cf3442f2b1c4Suchi Amalapurapu FileUtils.setPermissions(outFile.getPath(), 225afbaaa189fbc18b3acbb06e03233cf3442f2b1c4Suchi Amalapurapu FileUtils.S_IRWXU | FileUtils.S_IRWXG | FileUtils.S_IRWXO, 226afbaaa189fbc18b3acbb06e03233cf3442f2b1c4Suchi Amalapurapu -1, -1); 227afbaaa189fbc18b3acbb06e03233cf3442f2b1c4Suchi Amalapurapu assertTrue(FileUtils.copyToFile(is, outFile)); 228afbaaa189fbc18b3acbb06e03233cf3442f2b1c4Suchi Amalapurapu FileUtils.setPermissions(outFile.getPath(), 229afbaaa189fbc18b3acbb06e03233cf3442f2b1c4Suchi Amalapurapu FileUtils.S_IRWXU | FileUtils.S_IRWXG | FileUtils.S_IRWXO, 230afbaaa189fbc18b3acbb06e03233cf3442f2b1c4Suchi Amalapurapu -1, -1); 231afbaaa189fbc18b3acbb06e03233cf3442f2b1c4Suchi Amalapurapu return Uri.fromFile(outFile); 232afbaaa189fbc18b3acbb06e03233cf3442f2b1c4Suchi Amalapurapu } 233afbaaa189fbc18b3acbb06e03233cf3442f2b1c4Suchi Amalapurapu 234afbaaa189fbc18b3acbb06e03233cf3442f2b1c4Suchi Amalapurapu private PackageParser.Package parsePackage(Uri packageURI) { 235afbaaa189fbc18b3acbb06e03233cf3442f2b1c4Suchi Amalapurapu final String archiveFilePath = packageURI.getPath(); 236afbaaa189fbc18b3acbb06e03233cf3442f2b1c4Suchi Amalapurapu PackageParser packageParser = new PackageParser(archiveFilePath); 237afbaaa189fbc18b3acbb06e03233cf3442f2b1c4Suchi Amalapurapu File sourceFile = new File(archiveFilePath); 238afbaaa189fbc18b3acbb06e03233cf3442f2b1c4Suchi Amalapurapu DisplayMetrics metrics = new DisplayMetrics(); 239afbaaa189fbc18b3acbb06e03233cf3442f2b1c4Suchi Amalapurapu metrics.setToDefaults(); 240afbaaa189fbc18b3acbb06e03233cf3442f2b1c4Suchi Amalapurapu return packageParser.parsePackage(sourceFile, archiveFilePath, metrics, 0); 241afbaaa189fbc18b3acbb06e03233cf3442f2b1c4Suchi Amalapurapu } 242afbaaa189fbc18b3acbb06e03233cf3442f2b1c4Suchi Amalapurapu 243afbaaa189fbc18b3acbb06e03233cf3442f2b1c4Suchi Amalapurapu private void assertInstall(String pkgName, int flags) { 244afbaaa189fbc18b3acbb06e03233cf3442f2b1c4Suchi Amalapurapu try { 245afbaaa189fbc18b3acbb06e03233cf3442f2b1c4Suchi Amalapurapu ApplicationInfo info = getPm().getApplicationInfo(pkgName, 0); 246afbaaa189fbc18b3acbb06e03233cf3442f2b1c4Suchi Amalapurapu assertNotNull(info); 247afbaaa189fbc18b3acbb06e03233cf3442f2b1c4Suchi Amalapurapu assertEquals(pkgName, info.packageName); 248afbaaa189fbc18b3acbb06e03233cf3442f2b1c4Suchi Amalapurapu File dataDir = Environment.getDataDirectory(); 249afbaaa189fbc18b3acbb06e03233cf3442f2b1c4Suchi Amalapurapu String appInstallPath = new File(dataDir, "app").getPath(); 250afbaaa189fbc18b3acbb06e03233cf3442f2b1c4Suchi Amalapurapu String drmInstallPath = new File(dataDir, "app-private").getPath(); 251afbaaa189fbc18b3acbb06e03233cf3442f2b1c4Suchi Amalapurapu File srcDir = new File(info.sourceDir); 252afbaaa189fbc18b3acbb06e03233cf3442f2b1c4Suchi Amalapurapu String srcPath = srcDir.getParent(); 253afbaaa189fbc18b3acbb06e03233cf3442f2b1c4Suchi Amalapurapu File publicSrcDir = new File(info.publicSourceDir); 254afbaaa189fbc18b3acbb06e03233cf3442f2b1c4Suchi Amalapurapu String publicSrcPath = publicSrcDir.getParent(); 255afbaaa189fbc18b3acbb06e03233cf3442f2b1c4Suchi Amalapurapu 256afbaaa189fbc18b3acbb06e03233cf3442f2b1c4Suchi Amalapurapu if ((flags & PackageManager.INSTALL_FORWARD_LOCK) != 0) { 257afbaaa189fbc18b3acbb06e03233cf3442f2b1c4Suchi Amalapurapu assertTrue((info.flags & ApplicationInfo.FLAG_FORWARD_LOCK) != 0); 258afbaaa189fbc18b3acbb06e03233cf3442f2b1c4Suchi Amalapurapu assertEquals(srcPath, drmInstallPath); 259afbaaa189fbc18b3acbb06e03233cf3442f2b1c4Suchi Amalapurapu assertEquals(publicSrcPath, appInstallPath); 260afbaaa189fbc18b3acbb06e03233cf3442f2b1c4Suchi Amalapurapu } else { 261afbaaa189fbc18b3acbb06e03233cf3442f2b1c4Suchi Amalapurapu assertFalse((info.flags & ApplicationInfo.FLAG_FORWARD_LOCK) != 0); 2625b993ce7bc29e43a3215a50ce6ce5d6550d4e5e2Suchi Amalapurapu if ((flags & PackageManager.INSTALL_EXTERNAL) != 0) { 263afbaaa189fbc18b3acbb06e03233cf3442f2b1c4Suchi Amalapurapu assertTrue((info.flags & ApplicationInfo.FLAG_ON_SDCARD) != 0); 264afbaaa189fbc18b3acbb06e03233cf3442f2b1c4Suchi Amalapurapu // Hardcoded for now 265afbaaa189fbc18b3acbb06e03233cf3442f2b1c4Suchi Amalapurapu assertTrue(srcPath.startsWith("/asec")); 266afbaaa189fbc18b3acbb06e03233cf3442f2b1c4Suchi Amalapurapu assertTrue(publicSrcPath.startsWith("/asec")); 267afbaaa189fbc18b3acbb06e03233cf3442f2b1c4Suchi Amalapurapu } else { 268afbaaa189fbc18b3acbb06e03233cf3442f2b1c4Suchi Amalapurapu assertEquals(srcPath, appInstallPath); 269afbaaa189fbc18b3acbb06e03233cf3442f2b1c4Suchi Amalapurapu assertEquals(publicSrcPath, appInstallPath); 270afbaaa189fbc18b3acbb06e03233cf3442f2b1c4Suchi Amalapurapu assertFalse((info.flags & ApplicationInfo.FLAG_ON_SDCARD) != 0); 271afbaaa189fbc18b3acbb06e03233cf3442f2b1c4Suchi Amalapurapu } 272afbaaa189fbc18b3acbb06e03233cf3442f2b1c4Suchi Amalapurapu } 273afbaaa189fbc18b3acbb06e03233cf3442f2b1c4Suchi Amalapurapu } catch (NameNotFoundException e) { 274afbaaa189fbc18b3acbb06e03233cf3442f2b1c4Suchi Amalapurapu failStr("failed with exception : " + e); 275afbaaa189fbc18b3acbb06e03233cf3442f2b1c4Suchi Amalapurapu } 276afbaaa189fbc18b3acbb06e03233cf3442f2b1c4Suchi Amalapurapu } 2775b993ce7bc29e43a3215a50ce6ce5d6550d4e5e2Suchi Amalapurapu private void assertNotInstalled(String pkgName) { 2785b993ce7bc29e43a3215a50ce6ce5d6550d4e5e2Suchi Amalapurapu try { 2795b993ce7bc29e43a3215a50ce6ce5d6550d4e5e2Suchi Amalapurapu ApplicationInfo info = getPm().getApplicationInfo(pkgName, 0); 2805b993ce7bc29e43a3215a50ce6ce5d6550d4e5e2Suchi Amalapurapu fail(pkgName + " shouldnt be installed"); 2815b993ce7bc29e43a3215a50ce6ce5d6550d4e5e2Suchi Amalapurapu } catch (NameNotFoundException e) { 2825b993ce7bc29e43a3215a50ce6ce5d6550d4e5e2Suchi Amalapurapu } 2835b993ce7bc29e43a3215a50ce6ce5d6550d4e5e2Suchi Amalapurapu } 284afbaaa189fbc18b3acbb06e03233cf3442f2b1c4Suchi Amalapurapu 285afbaaa189fbc18b3acbb06e03233cf3442f2b1c4Suchi Amalapurapu class InstallParams { 286afbaaa189fbc18b3acbb06e03233cf3442f2b1c4Suchi Amalapurapu String outFileName; 287afbaaa189fbc18b3acbb06e03233cf3442f2b1c4Suchi Amalapurapu Uri packageURI; 288afbaaa189fbc18b3acbb06e03233cf3442f2b1c4Suchi Amalapurapu PackageParser.Package pkg; 289afbaaa189fbc18b3acbb06e03233cf3442f2b1c4Suchi Amalapurapu InstallParams(PackageParser.Package pkg, String outFileName, Uri packageURI) { 290afbaaa189fbc18b3acbb06e03233cf3442f2b1c4Suchi Amalapurapu this.outFileName = outFileName; 291afbaaa189fbc18b3acbb06e03233cf3442f2b1c4Suchi Amalapurapu this.packageURI = packageURI; 292afbaaa189fbc18b3acbb06e03233cf3442f2b1c4Suchi Amalapurapu this.pkg = pkg; 293afbaaa189fbc18b3acbb06e03233cf3442f2b1c4Suchi Amalapurapu } 294afbaaa189fbc18b3acbb06e03233cf3442f2b1c4Suchi Amalapurapu } 295afbaaa189fbc18b3acbb06e03233cf3442f2b1c4Suchi Amalapurapu 2965b993ce7bc29e43a3215a50ce6ce5d6550d4e5e2Suchi Amalapurapu private InstallParams sampleInstallFromRawResource(int flags, boolean cleanUp) { 2975b993ce7bc29e43a3215a50ce6ce5d6550d4e5e2Suchi Amalapurapu return installFromRawResource("install.apk", R.raw.install, flags, cleanUp, 2985b993ce7bc29e43a3215a50ce6ce5d6550d4e5e2Suchi Amalapurapu false, -1); 2995b993ce7bc29e43a3215a50ce6ce5d6550d4e5e2Suchi Amalapurapu } 300afbaaa189fbc18b3acbb06e03233cf3442f2b1c4Suchi Amalapurapu /* 301afbaaa189fbc18b3acbb06e03233cf3442f2b1c4Suchi Amalapurapu * Utility function that reads a apk bundled as a raw resource 302afbaaa189fbc18b3acbb06e03233cf3442f2b1c4Suchi Amalapurapu * copies it into own data directory and invokes 303afbaaa189fbc18b3acbb06e03233cf3442f2b1c4Suchi Amalapurapu * PackageManager api to install it. 304afbaaa189fbc18b3acbb06e03233cf3442f2b1c4Suchi Amalapurapu */ 3055b993ce7bc29e43a3215a50ce6ce5d6550d4e5e2Suchi Amalapurapu private InstallParams installFromRawResource(String outFileName, 3065b993ce7bc29e43a3215a50ce6ce5d6550d4e5e2Suchi Amalapurapu int rawResId, int flags, boolean cleanUp, boolean fail, int result) { 307afbaaa189fbc18b3acbb06e03233cf3442f2b1c4Suchi Amalapurapu File filesDir = mContext.getFilesDir(); 308afbaaa189fbc18b3acbb06e03233cf3442f2b1c4Suchi Amalapurapu File outFile = new File(filesDir, outFileName); 3095b993ce7bc29e43a3215a50ce6ce5d6550d4e5e2Suchi Amalapurapu Uri packageURI = getInstallablePackage(rawResId, outFile); 310afbaaa189fbc18b3acbb06e03233cf3442f2b1c4Suchi Amalapurapu PackageParser.Package pkg = parsePackage(packageURI); 311afbaaa189fbc18b3acbb06e03233cf3442f2b1c4Suchi Amalapurapu assertNotNull(pkg); 312b56ae20b22fd7283df32072a431ab6d4965f3c1bSuchi Amalapurapu InstallParams ip = null; 313afbaaa189fbc18b3acbb06e03233cf3442f2b1c4Suchi Amalapurapu try { 314afbaaa189fbc18b3acbb06e03233cf3442f2b1c4Suchi Amalapurapu try { 3155b993ce7bc29e43a3215a50ce6ce5d6550d4e5e2Suchi Amalapurapu if (fail) { 3165b993ce7bc29e43a3215a50ce6ce5d6550d4e5e2Suchi Amalapurapu // Make sure it doesn't exist 3175b993ce7bc29e43a3215a50ce6ce5d6550d4e5e2Suchi Amalapurapu getPm().deletePackage(pkg.packageName, null, 0); 3185b993ce7bc29e43a3215a50ce6ce5d6550d4e5e2Suchi Amalapurapu assertTrue(invokeInstallPackageFail(packageURI, flags, 3195b993ce7bc29e43a3215a50ce6ce5d6550d4e5e2Suchi Amalapurapu pkg.packageName, result)); 3205b993ce7bc29e43a3215a50ce6ce5d6550d4e5e2Suchi Amalapurapu assertNotInstalled(pkg.packageName); 3215b993ce7bc29e43a3215a50ce6ce5d6550d4e5e2Suchi Amalapurapu } else { 3225b993ce7bc29e43a3215a50ce6ce5d6550d4e5e2Suchi Amalapurapu InstallReceiver receiver = new InstallReceiver(pkg.packageName); 3235b993ce7bc29e43a3215a50ce6ce5d6550d4e5e2Suchi Amalapurapu assertTrue(invokeInstallPackage(packageURI, flags, 3245b993ce7bc29e43a3215a50ce6ce5d6550d4e5e2Suchi Amalapurapu pkg.packageName, receiver)); 3255b993ce7bc29e43a3215a50ce6ce5d6550d4e5e2Suchi Amalapurapu // Verify installed information 3265b993ce7bc29e43a3215a50ce6ce5d6550d4e5e2Suchi Amalapurapu assertInstall(pkg.packageName, flags); 3275b993ce7bc29e43a3215a50ce6ce5d6550d4e5e2Suchi Amalapurapu ip = new InstallParams(pkg, outFileName, packageURI); 3285b993ce7bc29e43a3215a50ce6ce5d6550d4e5e2Suchi Amalapurapu } 329afbaaa189fbc18b3acbb06e03233cf3442f2b1c4Suchi Amalapurapu } catch (Exception e) { 330afbaaa189fbc18b3acbb06e03233cf3442f2b1c4Suchi Amalapurapu failStr("Failed with exception : " + e); 331afbaaa189fbc18b3acbb06e03233cf3442f2b1c4Suchi Amalapurapu } 332b56ae20b22fd7283df32072a431ab6d4965f3c1bSuchi Amalapurapu return ip; 333afbaaa189fbc18b3acbb06e03233cf3442f2b1c4Suchi Amalapurapu } finally { 334afbaaa189fbc18b3acbb06e03233cf3442f2b1c4Suchi Amalapurapu if (cleanUp) { 335b56ae20b22fd7283df32072a431ab6d4965f3c1bSuchi Amalapurapu cleanUpInstall(ip); 336afbaaa189fbc18b3acbb06e03233cf3442f2b1c4Suchi Amalapurapu } 337afbaaa189fbc18b3acbb06e03233cf3442f2b1c4Suchi Amalapurapu } 338afbaaa189fbc18b3acbb06e03233cf3442f2b1c4Suchi Amalapurapu } 339afbaaa189fbc18b3acbb06e03233cf3442f2b1c4Suchi Amalapurapu 340afbaaa189fbc18b3acbb06e03233cf3442f2b1c4Suchi Amalapurapu @MediumTest 341afbaaa189fbc18b3acbb06e03233cf3442f2b1c4Suchi Amalapurapu public void testInstallNormalInternal() { 3425b993ce7bc29e43a3215a50ce6ce5d6550d4e5e2Suchi Amalapurapu sampleInstallFromRawResource(0, true); 343afbaaa189fbc18b3acbb06e03233cf3442f2b1c4Suchi Amalapurapu } 344afbaaa189fbc18b3acbb06e03233cf3442f2b1c4Suchi Amalapurapu 345afbaaa189fbc18b3acbb06e03233cf3442f2b1c4Suchi Amalapurapu @MediumTest 346afbaaa189fbc18b3acbb06e03233cf3442f2b1c4Suchi Amalapurapu public void testInstallFwdLockedInternal() { 3475b993ce7bc29e43a3215a50ce6ce5d6550d4e5e2Suchi Amalapurapu sampleInstallFromRawResource(PackageManager.INSTALL_FORWARD_LOCK, true); 348afbaaa189fbc18b3acbb06e03233cf3442f2b1c4Suchi Amalapurapu } 349afbaaa189fbc18b3acbb06e03233cf3442f2b1c4Suchi Amalapurapu 350afbaaa189fbc18b3acbb06e03233cf3442f2b1c4Suchi Amalapurapu @MediumTest 351afbaaa189fbc18b3acbb06e03233cf3442f2b1c4Suchi Amalapurapu public void testInstallSdcard() { 3525b993ce7bc29e43a3215a50ce6ce5d6550d4e5e2Suchi Amalapurapu sampleInstallFromRawResource(PackageManager.INSTALL_EXTERNAL, true); 353afbaaa189fbc18b3acbb06e03233cf3442f2b1c4Suchi Amalapurapu } 354afbaaa189fbc18b3acbb06e03233cf3442f2b1c4Suchi Amalapurapu 355afbaaa189fbc18b3acbb06e03233cf3442f2b1c4Suchi Amalapurapu /* ------------------------- Test replacing packages --------------*/ 356afbaaa189fbc18b3acbb06e03233cf3442f2b1c4Suchi Amalapurapu class ReplaceReceiver extends GenericReceiver { 357afbaaa189fbc18b3acbb06e03233cf3442f2b1c4Suchi Amalapurapu String pkgName; 358b56ae20b22fd7283df32072a431ab6d4965f3c1bSuchi Amalapurapu final static int INVALID = -1; 359b56ae20b22fd7283df32072a431ab6d4965f3c1bSuchi Amalapurapu final static int REMOVED = 1; 360b56ae20b22fd7283df32072a431ab6d4965f3c1bSuchi Amalapurapu final static int ADDED = 2; 361b56ae20b22fd7283df32072a431ab6d4965f3c1bSuchi Amalapurapu final static int REPLACED = 3; 362b56ae20b22fd7283df32072a431ab6d4965f3c1bSuchi Amalapurapu int removed = INVALID; 363b56ae20b22fd7283df32072a431ab6d4965f3c1bSuchi Amalapurapu // for updated system apps only 364b56ae20b22fd7283df32072a431ab6d4965f3c1bSuchi Amalapurapu boolean update = false; 365afbaaa189fbc18b3acbb06e03233cf3442f2b1c4Suchi Amalapurapu 366afbaaa189fbc18b3acbb06e03233cf3442f2b1c4Suchi Amalapurapu ReplaceReceiver(String pkgName) { 367afbaaa189fbc18b3acbb06e03233cf3442f2b1c4Suchi Amalapurapu this.pkgName = pkgName; 368afbaaa189fbc18b3acbb06e03233cf3442f2b1c4Suchi Amalapurapu filter = new IntentFilter(Intent.ACTION_PACKAGE_REMOVED); 369b56ae20b22fd7283df32072a431ab6d4965f3c1bSuchi Amalapurapu filter.addAction(Intent.ACTION_PACKAGE_ADDED); 370b56ae20b22fd7283df32072a431ab6d4965f3c1bSuchi Amalapurapu if (update) { 371b56ae20b22fd7283df32072a431ab6d4965f3c1bSuchi Amalapurapu filter.addAction(Intent.ACTION_PACKAGE_REPLACED); 372b56ae20b22fd7283df32072a431ab6d4965f3c1bSuchi Amalapurapu } 373b56ae20b22fd7283df32072a431ab6d4965f3c1bSuchi Amalapurapu filter.addDataScheme("package"); 374afbaaa189fbc18b3acbb06e03233cf3442f2b1c4Suchi Amalapurapu super.setFilter(filter); 375afbaaa189fbc18b3acbb06e03233cf3442f2b1c4Suchi Amalapurapu } 376afbaaa189fbc18b3acbb06e03233cf3442f2b1c4Suchi Amalapurapu 377afbaaa189fbc18b3acbb06e03233cf3442f2b1c4Suchi Amalapurapu public boolean notifyNow(Intent intent) { 378afbaaa189fbc18b3acbb06e03233cf3442f2b1c4Suchi Amalapurapu String action = intent.getAction(); 379b56ae20b22fd7283df32072a431ab6d4965f3c1bSuchi Amalapurapu Uri data = intent.getData(); 380b56ae20b22fd7283df32072a431ab6d4965f3c1bSuchi Amalapurapu String installedPkg = data.getEncodedSchemeSpecificPart(); 381b56ae20b22fd7283df32072a431ab6d4965f3c1bSuchi Amalapurapu if (pkgName == null || !pkgName.equals(installedPkg)) { 382b56ae20b22fd7283df32072a431ab6d4965f3c1bSuchi Amalapurapu return false; 383b56ae20b22fd7283df32072a431ab6d4965f3c1bSuchi Amalapurapu } 384b56ae20b22fd7283df32072a431ab6d4965f3c1bSuchi Amalapurapu if (Intent.ACTION_PACKAGE_REMOVED.equals(action)) { 385b56ae20b22fd7283df32072a431ab6d4965f3c1bSuchi Amalapurapu removed = REMOVED; 386b56ae20b22fd7283df32072a431ab6d4965f3c1bSuchi Amalapurapu } else if (Intent.ACTION_PACKAGE_ADDED.equals(action)) { 387b56ae20b22fd7283df32072a431ab6d4965f3c1bSuchi Amalapurapu if (removed != REMOVED) { 388b56ae20b22fd7283df32072a431ab6d4965f3c1bSuchi Amalapurapu return false; 389b56ae20b22fd7283df32072a431ab6d4965f3c1bSuchi Amalapurapu } 390b56ae20b22fd7283df32072a431ab6d4965f3c1bSuchi Amalapurapu boolean replacing = intent.getBooleanExtra(Intent.EXTRA_REPLACING, false); 391b56ae20b22fd7283df32072a431ab6d4965f3c1bSuchi Amalapurapu if (!replacing) { 392b56ae20b22fd7283df32072a431ab6d4965f3c1bSuchi Amalapurapu return false; 393b56ae20b22fd7283df32072a431ab6d4965f3c1bSuchi Amalapurapu } 394b56ae20b22fd7283df32072a431ab6d4965f3c1bSuchi Amalapurapu removed = ADDED; 395b56ae20b22fd7283df32072a431ab6d4965f3c1bSuchi Amalapurapu if (!update) { 396b56ae20b22fd7283df32072a431ab6d4965f3c1bSuchi Amalapurapu return true; 397afbaaa189fbc18b3acbb06e03233cf3442f2b1c4Suchi Amalapurapu } 398b56ae20b22fd7283df32072a431ab6d4965f3c1bSuchi Amalapurapu } else if (Intent.ACTION_PACKAGE_REPLACED.equals(action)) { 399b56ae20b22fd7283df32072a431ab6d4965f3c1bSuchi Amalapurapu if (removed != ADDED) { 400b56ae20b22fd7283df32072a431ab6d4965f3c1bSuchi Amalapurapu return false; 401b56ae20b22fd7283df32072a431ab6d4965f3c1bSuchi Amalapurapu } 402b56ae20b22fd7283df32072a431ab6d4965f3c1bSuchi Amalapurapu removed = REPLACED; 403b56ae20b22fd7283df32072a431ab6d4965f3c1bSuchi Amalapurapu return true; 404afbaaa189fbc18b3acbb06e03233cf3442f2b1c4Suchi Amalapurapu } 405afbaaa189fbc18b3acbb06e03233cf3442f2b1c4Suchi Amalapurapu return false; 406afbaaa189fbc18b3acbb06e03233cf3442f2b1c4Suchi Amalapurapu } 407afbaaa189fbc18b3acbb06e03233cf3442f2b1c4Suchi Amalapurapu } 408afbaaa189fbc18b3acbb06e03233cf3442f2b1c4Suchi Amalapurapu 409afbaaa189fbc18b3acbb06e03233cf3442f2b1c4Suchi Amalapurapu /* 410afbaaa189fbc18b3acbb06e03233cf3442f2b1c4Suchi Amalapurapu * Utility function that reads a apk bundled as a raw resource 411afbaaa189fbc18b3acbb06e03233cf3442f2b1c4Suchi Amalapurapu * copies it into own data directory and invokes 412afbaaa189fbc18b3acbb06e03233cf3442f2b1c4Suchi Amalapurapu * PackageManager api to install first and then replace it 413afbaaa189fbc18b3acbb06e03233cf3442f2b1c4Suchi Amalapurapu * again. 414afbaaa189fbc18b3acbb06e03233cf3442f2b1c4Suchi Amalapurapu */ 415afbaaa189fbc18b3acbb06e03233cf3442f2b1c4Suchi Amalapurapu public void replaceFromRawResource(int flags) { 4165b993ce7bc29e43a3215a50ce6ce5d6550d4e5e2Suchi Amalapurapu InstallParams ip = sampleInstallFromRawResource(flags, false); 417b56ae20b22fd7283df32072a431ab6d4965f3c1bSuchi Amalapurapu boolean replace = ((flags & PackageManager.INSTALL_REPLACE_EXISTING) != 0); 418afbaaa189fbc18b3acbb06e03233cf3442f2b1c4Suchi Amalapurapu GenericReceiver receiver; 419b56ae20b22fd7283df32072a431ab6d4965f3c1bSuchi Amalapurapu if (replace) { 420afbaaa189fbc18b3acbb06e03233cf3442f2b1c4Suchi Amalapurapu receiver = new ReplaceReceiver(ip.pkg.packageName); 421b56ae20b22fd7283df32072a431ab6d4965f3c1bSuchi Amalapurapu Log.i(TAG, "Creating replaceReceiver"); 422afbaaa189fbc18b3acbb06e03233cf3442f2b1c4Suchi Amalapurapu } else { 423afbaaa189fbc18b3acbb06e03233cf3442f2b1c4Suchi Amalapurapu receiver = new InstallReceiver(ip.pkg.packageName); 424afbaaa189fbc18b3acbb06e03233cf3442f2b1c4Suchi Amalapurapu } 425afbaaa189fbc18b3acbb06e03233cf3442f2b1c4Suchi Amalapurapu try { 426afbaaa189fbc18b3acbb06e03233cf3442f2b1c4Suchi Amalapurapu try { 427afbaaa189fbc18b3acbb06e03233cf3442f2b1c4Suchi Amalapurapu assertEquals(invokeInstallPackage(ip.packageURI, flags, 428b56ae20b22fd7283df32072a431ab6d4965f3c1bSuchi Amalapurapu ip.pkg.packageName, receiver), replace); 429b56ae20b22fd7283df32072a431ab6d4965f3c1bSuchi Amalapurapu if (replace) { 430afbaaa189fbc18b3acbb06e03233cf3442f2b1c4Suchi Amalapurapu assertInstall(ip.pkg.packageName, flags); 431afbaaa189fbc18b3acbb06e03233cf3442f2b1c4Suchi Amalapurapu } 432afbaaa189fbc18b3acbb06e03233cf3442f2b1c4Suchi Amalapurapu } catch (Exception e) { 433afbaaa189fbc18b3acbb06e03233cf3442f2b1c4Suchi Amalapurapu failStr("Failed with exception : " + e); 434afbaaa189fbc18b3acbb06e03233cf3442f2b1c4Suchi Amalapurapu } 435afbaaa189fbc18b3acbb06e03233cf3442f2b1c4Suchi Amalapurapu } finally { 436b56ae20b22fd7283df32072a431ab6d4965f3c1bSuchi Amalapurapu cleanUpInstall(ip); 437afbaaa189fbc18b3acbb06e03233cf3442f2b1c4Suchi Amalapurapu } 438afbaaa189fbc18b3acbb06e03233cf3442f2b1c4Suchi Amalapurapu } 439afbaaa189fbc18b3acbb06e03233cf3442f2b1c4Suchi Amalapurapu 440afbaaa189fbc18b3acbb06e03233cf3442f2b1c4Suchi Amalapurapu @MediumTest 441afbaaa189fbc18b3acbb06e03233cf3442f2b1c4Suchi Amalapurapu public void testReplaceFailNormalInternal() { 442afbaaa189fbc18b3acbb06e03233cf3442f2b1c4Suchi Amalapurapu replaceFromRawResource(0); 443afbaaa189fbc18b3acbb06e03233cf3442f2b1c4Suchi Amalapurapu } 444afbaaa189fbc18b3acbb06e03233cf3442f2b1c4Suchi Amalapurapu 445afbaaa189fbc18b3acbb06e03233cf3442f2b1c4Suchi Amalapurapu @MediumTest 446afbaaa189fbc18b3acbb06e03233cf3442f2b1c4Suchi Amalapurapu public void testReplaceFailFwdLockedInternal() { 447afbaaa189fbc18b3acbb06e03233cf3442f2b1c4Suchi Amalapurapu replaceFromRawResource(PackageManager.INSTALL_FORWARD_LOCK); 448afbaaa189fbc18b3acbb06e03233cf3442f2b1c4Suchi Amalapurapu } 449afbaaa189fbc18b3acbb06e03233cf3442f2b1c4Suchi Amalapurapu 450afbaaa189fbc18b3acbb06e03233cf3442f2b1c4Suchi Amalapurapu @MediumTest 451afbaaa189fbc18b3acbb06e03233cf3442f2b1c4Suchi Amalapurapu public void testReplaceFailSdcard() { 4525b993ce7bc29e43a3215a50ce6ce5d6550d4e5e2Suchi Amalapurapu replaceFromRawResource(PackageManager.INSTALL_EXTERNAL); 453afbaaa189fbc18b3acbb06e03233cf3442f2b1c4Suchi Amalapurapu } 454afbaaa189fbc18b3acbb06e03233cf3442f2b1c4Suchi Amalapurapu 455b56ae20b22fd7283df32072a431ab6d4965f3c1bSuchi Amalapurapu @MediumTest 456b56ae20b22fd7283df32072a431ab6d4965f3c1bSuchi Amalapurapu public void testReplaceNormalInternal() { 457b56ae20b22fd7283df32072a431ab6d4965f3c1bSuchi Amalapurapu replaceFromRawResource(PackageManager.INSTALL_REPLACE_EXISTING); 458afbaaa189fbc18b3acbb06e03233cf3442f2b1c4Suchi Amalapurapu } 459b56ae20b22fd7283df32072a431ab6d4965f3c1bSuchi Amalapurapu 460b56ae20b22fd7283df32072a431ab6d4965f3c1bSuchi Amalapurapu @MediumTest 461b56ae20b22fd7283df32072a431ab6d4965f3c1bSuchi Amalapurapu public void testReplaceFwdLockedInternal() { 462b56ae20b22fd7283df32072a431ab6d4965f3c1bSuchi Amalapurapu replaceFromRawResource(PackageManager.INSTALL_REPLACE_EXISTING | 463b56ae20b22fd7283df32072a431ab6d4965f3c1bSuchi Amalapurapu PackageManager.INSTALL_FORWARD_LOCK); 464b56ae20b22fd7283df32072a431ab6d4965f3c1bSuchi Amalapurapu } 465b56ae20b22fd7283df32072a431ab6d4965f3c1bSuchi Amalapurapu 466b56ae20b22fd7283df32072a431ab6d4965f3c1bSuchi Amalapurapu @MediumTest 467b56ae20b22fd7283df32072a431ab6d4965f3c1bSuchi Amalapurapu public void testReplaceSdcard() { 468b56ae20b22fd7283df32072a431ab6d4965f3c1bSuchi Amalapurapu replaceFromRawResource(PackageManager.INSTALL_REPLACE_EXISTING | 4695b993ce7bc29e43a3215a50ce6ce5d6550d4e5e2Suchi Amalapurapu PackageManager.INSTALL_EXTERNAL); 470b56ae20b22fd7283df32072a431ab6d4965f3c1bSuchi Amalapurapu } 471b56ae20b22fd7283df32072a431ab6d4965f3c1bSuchi Amalapurapu 472b56ae20b22fd7283df32072a431ab6d4965f3c1bSuchi Amalapurapu /* -------------- Delete tests ---*/ 473b56ae20b22fd7283df32072a431ab6d4965f3c1bSuchi Amalapurapu class DeleteObserver extends IPackageDeleteObserver.Stub { 474b56ae20b22fd7283df32072a431ab6d4965f3c1bSuchi Amalapurapu 475b56ae20b22fd7283df32072a431ab6d4965f3c1bSuchi Amalapurapu public boolean succeeded; 476b56ae20b22fd7283df32072a431ab6d4965f3c1bSuchi Amalapurapu private boolean doneFlag = false; 477b56ae20b22fd7283df32072a431ab6d4965f3c1bSuchi Amalapurapu 478b56ae20b22fd7283df32072a431ab6d4965f3c1bSuchi Amalapurapu public boolean isDone() { 479b56ae20b22fd7283df32072a431ab6d4965f3c1bSuchi Amalapurapu return doneFlag; 480b56ae20b22fd7283df32072a431ab6d4965f3c1bSuchi Amalapurapu } 481b56ae20b22fd7283df32072a431ab6d4965f3c1bSuchi Amalapurapu 482b56ae20b22fd7283df32072a431ab6d4965f3c1bSuchi Amalapurapu public void packageDeleted(boolean succeeded) throws RemoteException { 483b56ae20b22fd7283df32072a431ab6d4965f3c1bSuchi Amalapurapu synchronized(this) { 484b56ae20b22fd7283df32072a431ab6d4965f3c1bSuchi Amalapurapu this.succeeded = succeeded; 485b56ae20b22fd7283df32072a431ab6d4965f3c1bSuchi Amalapurapu doneFlag = true; 486b56ae20b22fd7283df32072a431ab6d4965f3c1bSuchi Amalapurapu notifyAll(); 487b56ae20b22fd7283df32072a431ab6d4965f3c1bSuchi Amalapurapu } 488b56ae20b22fd7283df32072a431ab6d4965f3c1bSuchi Amalapurapu } 489b56ae20b22fd7283df32072a431ab6d4965f3c1bSuchi Amalapurapu } 490b56ae20b22fd7283df32072a431ab6d4965f3c1bSuchi Amalapurapu 491b56ae20b22fd7283df32072a431ab6d4965f3c1bSuchi Amalapurapu class DeleteReceiver extends GenericReceiver { 492b56ae20b22fd7283df32072a431ab6d4965f3c1bSuchi Amalapurapu String pkgName; 493b56ae20b22fd7283df32072a431ab6d4965f3c1bSuchi Amalapurapu 494b56ae20b22fd7283df32072a431ab6d4965f3c1bSuchi Amalapurapu DeleteReceiver(String pkgName) { 495b56ae20b22fd7283df32072a431ab6d4965f3c1bSuchi Amalapurapu this.pkgName = pkgName; 496b56ae20b22fd7283df32072a431ab6d4965f3c1bSuchi Amalapurapu IntentFilter filter = new IntentFilter(Intent.ACTION_PACKAGE_REMOVED); 497b56ae20b22fd7283df32072a431ab6d4965f3c1bSuchi Amalapurapu filter.addDataScheme("package"); 498b56ae20b22fd7283df32072a431ab6d4965f3c1bSuchi Amalapurapu super.setFilter(filter); 499b56ae20b22fd7283df32072a431ab6d4965f3c1bSuchi Amalapurapu } 500b56ae20b22fd7283df32072a431ab6d4965f3c1bSuchi Amalapurapu 501b56ae20b22fd7283df32072a431ab6d4965f3c1bSuchi Amalapurapu public boolean notifyNow(Intent intent) { 502b56ae20b22fd7283df32072a431ab6d4965f3c1bSuchi Amalapurapu String action = intent.getAction(); 503b56ae20b22fd7283df32072a431ab6d4965f3c1bSuchi Amalapurapu if (!Intent.ACTION_PACKAGE_REMOVED.equals(action)) { 504b56ae20b22fd7283df32072a431ab6d4965f3c1bSuchi Amalapurapu return false; 505b56ae20b22fd7283df32072a431ab6d4965f3c1bSuchi Amalapurapu } 506b56ae20b22fd7283df32072a431ab6d4965f3c1bSuchi Amalapurapu Uri data = intent.getData(); 507b56ae20b22fd7283df32072a431ab6d4965f3c1bSuchi Amalapurapu String installedPkg = data.getEncodedSchemeSpecificPart(); 508b56ae20b22fd7283df32072a431ab6d4965f3c1bSuchi Amalapurapu if (pkgName.equals(installedPkg)) { 509b56ae20b22fd7283df32072a431ab6d4965f3c1bSuchi Amalapurapu return true; 510b56ae20b22fd7283df32072a431ab6d4965f3c1bSuchi Amalapurapu } 511b56ae20b22fd7283df32072a431ab6d4965f3c1bSuchi Amalapurapu return false; 512b56ae20b22fd7283df32072a431ab6d4965f3c1bSuchi Amalapurapu } 513b56ae20b22fd7283df32072a431ab6d4965f3c1bSuchi Amalapurapu } 514b56ae20b22fd7283df32072a431ab6d4965f3c1bSuchi Amalapurapu 515b56ae20b22fd7283df32072a431ab6d4965f3c1bSuchi Amalapurapu public boolean invokeDeletePackage(Uri packageURI, int flags, 516b56ae20b22fd7283df32072a431ab6d4965f3c1bSuchi Amalapurapu final String pkgName, GenericReceiver receiver) throws Exception { 517b56ae20b22fd7283df32072a431ab6d4965f3c1bSuchi Amalapurapu DeleteObserver observer = new DeleteObserver(); 518b56ae20b22fd7283df32072a431ab6d4965f3c1bSuchi Amalapurapu final boolean received = false; 519b56ae20b22fd7283df32072a431ab6d4965f3c1bSuchi Amalapurapu mContext.registerReceiver(receiver, receiver.filter); 520b56ae20b22fd7283df32072a431ab6d4965f3c1bSuchi Amalapurapu try { 521b56ae20b22fd7283df32072a431ab6d4965f3c1bSuchi Amalapurapu // Wait on observer 522b56ae20b22fd7283df32072a431ab6d4965f3c1bSuchi Amalapurapu synchronized(observer) { 523b56ae20b22fd7283df32072a431ab6d4965f3c1bSuchi Amalapurapu synchronized (receiver) { 524b56ae20b22fd7283df32072a431ab6d4965f3c1bSuchi Amalapurapu getPm().deletePackage(pkgName, observer, flags); 525b56ae20b22fd7283df32072a431ab6d4965f3c1bSuchi Amalapurapu long waitTime = 0; 526b56ae20b22fd7283df32072a431ab6d4965f3c1bSuchi Amalapurapu while((!observer.isDone()) && (waitTime < MAX_WAIT_TIME) ) { 527b56ae20b22fd7283df32072a431ab6d4965f3c1bSuchi Amalapurapu observer.wait(WAIT_TIME_INCR); 528b56ae20b22fd7283df32072a431ab6d4965f3c1bSuchi Amalapurapu waitTime += WAIT_TIME_INCR; 529b56ae20b22fd7283df32072a431ab6d4965f3c1bSuchi Amalapurapu } 530b56ae20b22fd7283df32072a431ab6d4965f3c1bSuchi Amalapurapu if(!observer.isDone()) { 531b56ae20b22fd7283df32072a431ab6d4965f3c1bSuchi Amalapurapu throw new Exception("Timed out waiting for packageInstalled callback"); 532b56ae20b22fd7283df32072a431ab6d4965f3c1bSuchi Amalapurapu } 533b56ae20b22fd7283df32072a431ab6d4965f3c1bSuchi Amalapurapu // Verify we received the broadcast 534b56ae20b22fd7283df32072a431ab6d4965f3c1bSuchi Amalapurapu waitTime = 0; 535b56ae20b22fd7283df32072a431ab6d4965f3c1bSuchi Amalapurapu while((!receiver.isDone()) && (waitTime < MAX_WAIT_TIME) ) { 536b56ae20b22fd7283df32072a431ab6d4965f3c1bSuchi Amalapurapu receiver.wait(WAIT_TIME_INCR); 537b56ae20b22fd7283df32072a431ab6d4965f3c1bSuchi Amalapurapu waitTime += WAIT_TIME_INCR; 538b56ae20b22fd7283df32072a431ab6d4965f3c1bSuchi Amalapurapu } 539b56ae20b22fd7283df32072a431ab6d4965f3c1bSuchi Amalapurapu if(!receiver.isDone()) { 540b56ae20b22fd7283df32072a431ab6d4965f3c1bSuchi Amalapurapu throw new Exception("Timed out waiting for PACKAGE_ADDED notification"); 541b56ae20b22fd7283df32072a431ab6d4965f3c1bSuchi Amalapurapu } 542b56ae20b22fd7283df32072a431ab6d4965f3c1bSuchi Amalapurapu return receiver.received; 543b56ae20b22fd7283df32072a431ab6d4965f3c1bSuchi Amalapurapu } 544b56ae20b22fd7283df32072a431ab6d4965f3c1bSuchi Amalapurapu } 545b56ae20b22fd7283df32072a431ab6d4965f3c1bSuchi Amalapurapu } finally { 546b56ae20b22fd7283df32072a431ab6d4965f3c1bSuchi Amalapurapu mContext.unregisterReceiver(receiver); 547b56ae20b22fd7283df32072a431ab6d4965f3c1bSuchi Amalapurapu } 548b56ae20b22fd7283df32072a431ab6d4965f3c1bSuchi Amalapurapu } 549b56ae20b22fd7283df32072a431ab6d4965f3c1bSuchi Amalapurapu 550b56ae20b22fd7283df32072a431ab6d4965f3c1bSuchi Amalapurapu public void deleteFromRawResource(int iFlags, int dFlags) { 5515b993ce7bc29e43a3215a50ce6ce5d6550d4e5e2Suchi Amalapurapu InstallParams ip = sampleInstallFromRawResource(iFlags, false); 552b56ae20b22fd7283df32072a431ab6d4965f3c1bSuchi Amalapurapu boolean retainData = ((dFlags & PackageManager.DONT_DELETE_DATA) != 0); 553b56ae20b22fd7283df32072a431ab6d4965f3c1bSuchi Amalapurapu GenericReceiver receiver = new DeleteReceiver(ip.pkg.packageName); 554b56ae20b22fd7283df32072a431ab6d4965f3c1bSuchi Amalapurapu DeleteObserver observer = new DeleteObserver(); 555b56ae20b22fd7283df32072a431ab6d4965f3c1bSuchi Amalapurapu try { 556b56ae20b22fd7283df32072a431ab6d4965f3c1bSuchi Amalapurapu assertTrue(invokeDeletePackage(ip.packageURI, dFlags, 557b56ae20b22fd7283df32072a431ab6d4965f3c1bSuchi Amalapurapu ip.pkg.packageName, receiver)); 558b56ae20b22fd7283df32072a431ab6d4965f3c1bSuchi Amalapurapu ApplicationInfo info = null; 559b56ae20b22fd7283df32072a431ab6d4965f3c1bSuchi Amalapurapu Log.i(TAG, "okay4"); 560b56ae20b22fd7283df32072a431ab6d4965f3c1bSuchi Amalapurapu try { 561b56ae20b22fd7283df32072a431ab6d4965f3c1bSuchi Amalapurapu info = getPm().getApplicationInfo(ip.pkg.packageName, 562b56ae20b22fd7283df32072a431ab6d4965f3c1bSuchi Amalapurapu PackageManager.GET_UNINSTALLED_PACKAGES); 563b56ae20b22fd7283df32072a431ab6d4965f3c1bSuchi Amalapurapu } catch (NameNotFoundException e) { 564b56ae20b22fd7283df32072a431ab6d4965f3c1bSuchi Amalapurapu info = null; 565b56ae20b22fd7283df32072a431ab6d4965f3c1bSuchi Amalapurapu } 566b56ae20b22fd7283df32072a431ab6d4965f3c1bSuchi Amalapurapu if (retainData) { 567b56ae20b22fd7283df32072a431ab6d4965f3c1bSuchi Amalapurapu assertNotNull(info); 568b56ae20b22fd7283df32072a431ab6d4965f3c1bSuchi Amalapurapu assertEquals(info.packageName, ip.pkg.packageName); 569b56ae20b22fd7283df32072a431ab6d4965f3c1bSuchi Amalapurapu File file = new File(info.dataDir); 570b56ae20b22fd7283df32072a431ab6d4965f3c1bSuchi Amalapurapu assertTrue(file.exists()); 571b56ae20b22fd7283df32072a431ab6d4965f3c1bSuchi Amalapurapu } else { 572b56ae20b22fd7283df32072a431ab6d4965f3c1bSuchi Amalapurapu assertNull(info); 573b56ae20b22fd7283df32072a431ab6d4965f3c1bSuchi Amalapurapu } 574b56ae20b22fd7283df32072a431ab6d4965f3c1bSuchi Amalapurapu } catch (Exception e) { 575b56ae20b22fd7283df32072a431ab6d4965f3c1bSuchi Amalapurapu failStr(e); 576b56ae20b22fd7283df32072a431ab6d4965f3c1bSuchi Amalapurapu } finally { 577b56ae20b22fd7283df32072a431ab6d4965f3c1bSuchi Amalapurapu cleanUpInstall(ip); 578b56ae20b22fd7283df32072a431ab6d4965f3c1bSuchi Amalapurapu } 579b56ae20b22fd7283df32072a431ab6d4965f3c1bSuchi Amalapurapu } 580b56ae20b22fd7283df32072a431ab6d4965f3c1bSuchi Amalapurapu 581b56ae20b22fd7283df32072a431ab6d4965f3c1bSuchi Amalapurapu @MediumTest 582b56ae20b22fd7283df32072a431ab6d4965f3c1bSuchi Amalapurapu public void testDeleteNormalInternal() { 583b56ae20b22fd7283df32072a431ab6d4965f3c1bSuchi Amalapurapu deleteFromRawResource(0, 0); 584b56ae20b22fd7283df32072a431ab6d4965f3c1bSuchi Amalapurapu } 585b56ae20b22fd7283df32072a431ab6d4965f3c1bSuchi Amalapurapu 586b56ae20b22fd7283df32072a431ab6d4965f3c1bSuchi Amalapurapu @MediumTest 587b56ae20b22fd7283df32072a431ab6d4965f3c1bSuchi Amalapurapu public void testDeleteFwdLockedInternal() { 588b56ae20b22fd7283df32072a431ab6d4965f3c1bSuchi Amalapurapu deleteFromRawResource(PackageManager.INSTALL_FORWARD_LOCK, 0); 589b56ae20b22fd7283df32072a431ab6d4965f3c1bSuchi Amalapurapu } 590b56ae20b22fd7283df32072a431ab6d4965f3c1bSuchi Amalapurapu 591b56ae20b22fd7283df32072a431ab6d4965f3c1bSuchi Amalapurapu @MediumTest 592b56ae20b22fd7283df32072a431ab6d4965f3c1bSuchi Amalapurapu public void testDeleteSdcard() { 5935b993ce7bc29e43a3215a50ce6ce5d6550d4e5e2Suchi Amalapurapu deleteFromRawResource(PackageManager.INSTALL_EXTERNAL, 0); 594b56ae20b22fd7283df32072a431ab6d4965f3c1bSuchi Amalapurapu } 595b56ae20b22fd7283df32072a431ab6d4965f3c1bSuchi Amalapurapu 596b56ae20b22fd7283df32072a431ab6d4965f3c1bSuchi Amalapurapu @MediumTest 597b56ae20b22fd7283df32072a431ab6d4965f3c1bSuchi Amalapurapu public void testDeleteNormalInternalRetainData() { 598b56ae20b22fd7283df32072a431ab6d4965f3c1bSuchi Amalapurapu deleteFromRawResource(0, PackageManager.DONT_DELETE_DATA); 599b56ae20b22fd7283df32072a431ab6d4965f3c1bSuchi Amalapurapu } 600b56ae20b22fd7283df32072a431ab6d4965f3c1bSuchi Amalapurapu 601b56ae20b22fd7283df32072a431ab6d4965f3c1bSuchi Amalapurapu @MediumTest 602b56ae20b22fd7283df32072a431ab6d4965f3c1bSuchi Amalapurapu public void testDeleteFwdLockedInternalRetainData() { 603b56ae20b22fd7283df32072a431ab6d4965f3c1bSuchi Amalapurapu deleteFromRawResource(PackageManager.INSTALL_FORWARD_LOCK, PackageManager.DONT_DELETE_DATA); 604b56ae20b22fd7283df32072a431ab6d4965f3c1bSuchi Amalapurapu } 605b56ae20b22fd7283df32072a431ab6d4965f3c1bSuchi Amalapurapu 606b56ae20b22fd7283df32072a431ab6d4965f3c1bSuchi Amalapurapu @MediumTest 607b56ae20b22fd7283df32072a431ab6d4965f3c1bSuchi Amalapurapu public void testDeleteSdcardRetainData() { 6085b993ce7bc29e43a3215a50ce6ce5d6550d4e5e2Suchi Amalapurapu deleteFromRawResource(PackageManager.INSTALL_EXTERNAL, PackageManager.DONT_DELETE_DATA); 609afbaaa189fbc18b3acbb06e03233cf3442f2b1c4Suchi Amalapurapu } 610b56ae20b22fd7283df32072a431ab6d4965f3c1bSuchi Amalapurapu 611b56ae20b22fd7283df32072a431ab6d4965f3c1bSuchi Amalapurapu /* sdcard mount/unmount tests ******/ 612b56ae20b22fd7283df32072a431ab6d4965f3c1bSuchi Amalapurapu 613b56ae20b22fd7283df32072a431ab6d4965f3c1bSuchi Amalapurapu class SdMountReceiver extends GenericReceiver { 614b56ae20b22fd7283df32072a431ab6d4965f3c1bSuchi Amalapurapu String pkgNames[]; 615b56ae20b22fd7283df32072a431ab6d4965f3c1bSuchi Amalapurapu boolean status = true; 616b56ae20b22fd7283df32072a431ab6d4965f3c1bSuchi Amalapurapu 617b56ae20b22fd7283df32072a431ab6d4965f3c1bSuchi Amalapurapu SdMountReceiver(String[] pkgNames) { 618b56ae20b22fd7283df32072a431ab6d4965f3c1bSuchi Amalapurapu this.pkgNames = pkgNames; 619b56ae20b22fd7283df32072a431ab6d4965f3c1bSuchi Amalapurapu IntentFilter filter = new IntentFilter(Intent.ACTION_EXTERNAL_APPLICATIONS_AVAILABLE); 620b56ae20b22fd7283df32072a431ab6d4965f3c1bSuchi Amalapurapu super.setFilter(filter); 621b56ae20b22fd7283df32072a431ab6d4965f3c1bSuchi Amalapurapu } 622b56ae20b22fd7283df32072a431ab6d4965f3c1bSuchi Amalapurapu 623b56ae20b22fd7283df32072a431ab6d4965f3c1bSuchi Amalapurapu public boolean notifyNow(Intent intent) { 624b56ae20b22fd7283df32072a431ab6d4965f3c1bSuchi Amalapurapu Log.i(TAG, "okay 1"); 625b56ae20b22fd7283df32072a431ab6d4965f3c1bSuchi Amalapurapu String action = intent.getAction(); 626b56ae20b22fd7283df32072a431ab6d4965f3c1bSuchi Amalapurapu if (!Intent.ACTION_EXTERNAL_APPLICATIONS_AVAILABLE.equals(action)) { 627b56ae20b22fd7283df32072a431ab6d4965f3c1bSuchi Amalapurapu return false; 628b56ae20b22fd7283df32072a431ab6d4965f3c1bSuchi Amalapurapu } 629b56ae20b22fd7283df32072a431ab6d4965f3c1bSuchi Amalapurapu String rpkgList[] = intent.getStringArrayExtra(Intent.EXTRA_CHANGED_PACKAGE_LIST); 630b56ae20b22fd7283df32072a431ab6d4965f3c1bSuchi Amalapurapu for (String pkg : pkgNames) { 631b56ae20b22fd7283df32072a431ab6d4965f3c1bSuchi Amalapurapu boolean found = false; 632b56ae20b22fd7283df32072a431ab6d4965f3c1bSuchi Amalapurapu for (String rpkg : rpkgList) { 633b56ae20b22fd7283df32072a431ab6d4965f3c1bSuchi Amalapurapu if (rpkg.equals(pkg)) { 634b56ae20b22fd7283df32072a431ab6d4965f3c1bSuchi Amalapurapu found = true; 635b56ae20b22fd7283df32072a431ab6d4965f3c1bSuchi Amalapurapu break; 636b56ae20b22fd7283df32072a431ab6d4965f3c1bSuchi Amalapurapu } 637b56ae20b22fd7283df32072a431ab6d4965f3c1bSuchi Amalapurapu } 638b56ae20b22fd7283df32072a431ab6d4965f3c1bSuchi Amalapurapu if (!found) { 639b56ae20b22fd7283df32072a431ab6d4965f3c1bSuchi Amalapurapu status = false; 640b56ae20b22fd7283df32072a431ab6d4965f3c1bSuchi Amalapurapu return true; 641b56ae20b22fd7283df32072a431ab6d4965f3c1bSuchi Amalapurapu } 642b56ae20b22fd7283df32072a431ab6d4965f3c1bSuchi Amalapurapu } 643b56ae20b22fd7283df32072a431ab6d4965f3c1bSuchi Amalapurapu return true; 644b56ae20b22fd7283df32072a431ab6d4965f3c1bSuchi Amalapurapu } 645b56ae20b22fd7283df32072a431ab6d4965f3c1bSuchi Amalapurapu } 646b56ae20b22fd7283df32072a431ab6d4965f3c1bSuchi Amalapurapu 647b56ae20b22fd7283df32072a431ab6d4965f3c1bSuchi Amalapurapu class SdUnMountReceiver extends GenericReceiver { 648b56ae20b22fd7283df32072a431ab6d4965f3c1bSuchi Amalapurapu String pkgNames[]; 649b56ae20b22fd7283df32072a431ab6d4965f3c1bSuchi Amalapurapu boolean status = true; 650b56ae20b22fd7283df32072a431ab6d4965f3c1bSuchi Amalapurapu 651b56ae20b22fd7283df32072a431ab6d4965f3c1bSuchi Amalapurapu SdUnMountReceiver(String[] pkgNames) { 652b56ae20b22fd7283df32072a431ab6d4965f3c1bSuchi Amalapurapu this.pkgNames = pkgNames; 653b56ae20b22fd7283df32072a431ab6d4965f3c1bSuchi Amalapurapu IntentFilter filter = new IntentFilter(Intent.ACTION_EXTERNAL_APPLICATIONS_UNAVAILABLE); 654b56ae20b22fd7283df32072a431ab6d4965f3c1bSuchi Amalapurapu super.setFilter(filter); 655b56ae20b22fd7283df32072a431ab6d4965f3c1bSuchi Amalapurapu } 656b56ae20b22fd7283df32072a431ab6d4965f3c1bSuchi Amalapurapu 657b56ae20b22fd7283df32072a431ab6d4965f3c1bSuchi Amalapurapu public boolean notifyNow(Intent intent) { 658b56ae20b22fd7283df32072a431ab6d4965f3c1bSuchi Amalapurapu String action = intent.getAction(); 659b56ae20b22fd7283df32072a431ab6d4965f3c1bSuchi Amalapurapu if (!Intent.ACTION_EXTERNAL_APPLICATIONS_UNAVAILABLE.equals(action)) { 660b56ae20b22fd7283df32072a431ab6d4965f3c1bSuchi Amalapurapu return false; 661b56ae20b22fd7283df32072a431ab6d4965f3c1bSuchi Amalapurapu } 662b56ae20b22fd7283df32072a431ab6d4965f3c1bSuchi Amalapurapu String rpkgList[] = intent.getStringArrayExtra(Intent.EXTRA_CHANGED_PACKAGE_LIST); 663b56ae20b22fd7283df32072a431ab6d4965f3c1bSuchi Amalapurapu for (String pkg : pkgNames) { 664b56ae20b22fd7283df32072a431ab6d4965f3c1bSuchi Amalapurapu boolean found = false; 665b56ae20b22fd7283df32072a431ab6d4965f3c1bSuchi Amalapurapu for (String rpkg : rpkgList) { 666b56ae20b22fd7283df32072a431ab6d4965f3c1bSuchi Amalapurapu if (rpkg.equals(pkg)) { 667b56ae20b22fd7283df32072a431ab6d4965f3c1bSuchi Amalapurapu found = true; 668b56ae20b22fd7283df32072a431ab6d4965f3c1bSuchi Amalapurapu break; 669b56ae20b22fd7283df32072a431ab6d4965f3c1bSuchi Amalapurapu } 670b56ae20b22fd7283df32072a431ab6d4965f3c1bSuchi Amalapurapu } 671b56ae20b22fd7283df32072a431ab6d4965f3c1bSuchi Amalapurapu if (!found) { 672b56ae20b22fd7283df32072a431ab6d4965f3c1bSuchi Amalapurapu status = false; 673b56ae20b22fd7283df32072a431ab6d4965f3c1bSuchi Amalapurapu return true; 674b56ae20b22fd7283df32072a431ab6d4965f3c1bSuchi Amalapurapu } 675b56ae20b22fd7283df32072a431ab6d4965f3c1bSuchi Amalapurapu } 676b56ae20b22fd7283df32072a431ab6d4965f3c1bSuchi Amalapurapu return true; 677b56ae20b22fd7283df32072a431ab6d4965f3c1bSuchi Amalapurapu } 678b56ae20b22fd7283df32072a431ab6d4965f3c1bSuchi Amalapurapu } 679b56ae20b22fd7283df32072a431ab6d4965f3c1bSuchi Amalapurapu 680b56ae20b22fd7283df32072a431ab6d4965f3c1bSuchi Amalapurapu IMountService getMs() { 681b56ae20b22fd7283df32072a431ab6d4965f3c1bSuchi Amalapurapu IBinder service = ServiceManager.getService("mount"); 682b56ae20b22fd7283df32072a431ab6d4965f3c1bSuchi Amalapurapu if (service != null) { 683b56ae20b22fd7283df32072a431ab6d4965f3c1bSuchi Amalapurapu return IMountService.Stub.asInterface(service); 684b56ae20b22fd7283df32072a431ab6d4965f3c1bSuchi Amalapurapu } else { 685b56ae20b22fd7283df32072a431ab6d4965f3c1bSuchi Amalapurapu Log.e(TAG, "Can't get mount service"); 686b56ae20b22fd7283df32072a431ab6d4965f3c1bSuchi Amalapurapu } 687b56ae20b22fd7283df32072a431ab6d4965f3c1bSuchi Amalapurapu return null; 688b56ae20b22fd7283df32072a431ab6d4965f3c1bSuchi Amalapurapu } 689b56ae20b22fd7283df32072a431ab6d4965f3c1bSuchi Amalapurapu 690b56ae20b22fd7283df32072a431ab6d4965f3c1bSuchi Amalapurapu boolean getMediaState() { 691b56ae20b22fd7283df32072a431ab6d4965f3c1bSuchi Amalapurapu try { 692b56ae20b22fd7283df32072a431ab6d4965f3c1bSuchi Amalapurapu String mPath = Environment.getExternalStorageDirectory().toString(); 693b56ae20b22fd7283df32072a431ab6d4965f3c1bSuchi Amalapurapu String state = getMs().getVolumeState(mPath); 694b56ae20b22fd7283df32072a431ab6d4965f3c1bSuchi Amalapurapu return Environment.MEDIA_MOUNTED.equals(state); 695b56ae20b22fd7283df32072a431ab6d4965f3c1bSuchi Amalapurapu } catch (RemoteException e) { 696b56ae20b22fd7283df32072a431ab6d4965f3c1bSuchi Amalapurapu return false; 697b56ae20b22fd7283df32072a431ab6d4965f3c1bSuchi Amalapurapu } 698b56ae20b22fd7283df32072a431ab6d4965f3c1bSuchi Amalapurapu } 699b56ae20b22fd7283df32072a431ab6d4965f3c1bSuchi Amalapurapu 700b56ae20b22fd7283df32072a431ab6d4965f3c1bSuchi Amalapurapu boolean mountMedia() { 701b56ae20b22fd7283df32072a431ab6d4965f3c1bSuchi Amalapurapu if (getMediaState()) { 702b56ae20b22fd7283df32072a431ab6d4965f3c1bSuchi Amalapurapu return true; 703b56ae20b22fd7283df32072a431ab6d4965f3c1bSuchi Amalapurapu } 704b56ae20b22fd7283df32072a431ab6d4965f3c1bSuchi Amalapurapu try { 705b56ae20b22fd7283df32072a431ab6d4965f3c1bSuchi Amalapurapu String mPath = Environment.getExternalStorageDirectory().toString(); 706b56ae20b22fd7283df32072a431ab6d4965f3c1bSuchi Amalapurapu int ret = getMs().mountVolume(mPath); 707b104340496e3a531e26c8f428c808eca0e039f50San Mehat return ret == StorageResultCode.OperationSucceeded; 708b56ae20b22fd7283df32072a431ab6d4965f3c1bSuchi Amalapurapu } catch (RemoteException e) { 709b56ae20b22fd7283df32072a431ab6d4965f3c1bSuchi Amalapurapu return false; 710b56ae20b22fd7283df32072a431ab6d4965f3c1bSuchi Amalapurapu } 711b56ae20b22fd7283df32072a431ab6d4965f3c1bSuchi Amalapurapu } 712b56ae20b22fd7283df32072a431ab6d4965f3c1bSuchi Amalapurapu 713b56ae20b22fd7283df32072a431ab6d4965f3c1bSuchi Amalapurapu private boolean unmountMedia() { 714b56ae20b22fd7283df32072a431ab6d4965f3c1bSuchi Amalapurapu if (!getMediaState()) { 715b56ae20b22fd7283df32072a431ab6d4965f3c1bSuchi Amalapurapu return true; 716b56ae20b22fd7283df32072a431ab6d4965f3c1bSuchi Amalapurapu } 717b56ae20b22fd7283df32072a431ab6d4965f3c1bSuchi Amalapurapu try { 718b56ae20b22fd7283df32072a431ab6d4965f3c1bSuchi Amalapurapu String mPath = Environment.getExternalStorageDirectory().toString(); 719b56ae20b22fd7283df32072a431ab6d4965f3c1bSuchi Amalapurapu int ret = getMs().unmountVolume(mPath); 720b104340496e3a531e26c8f428c808eca0e039f50San Mehat return ret == StorageResultCode.OperationSucceeded; 721b56ae20b22fd7283df32072a431ab6d4965f3c1bSuchi Amalapurapu } catch (RemoteException e) { 722b56ae20b22fd7283df32072a431ab6d4965f3c1bSuchi Amalapurapu return true; 723b56ae20b22fd7283df32072a431ab6d4965f3c1bSuchi Amalapurapu } 724b56ae20b22fd7283df32072a431ab6d4965f3c1bSuchi Amalapurapu } 725b56ae20b22fd7283df32072a431ab6d4965f3c1bSuchi Amalapurapu 726b56ae20b22fd7283df32072a431ab6d4965f3c1bSuchi Amalapurapu /* 727b56ae20b22fd7283df32072a431ab6d4965f3c1bSuchi Amalapurapu * Install package on sdcard. Unmount and then mount the media. 728b56ae20b22fd7283df32072a431ab6d4965f3c1bSuchi Amalapurapu * (Use PackageManagerService private api for now) 729b56ae20b22fd7283df32072a431ab6d4965f3c1bSuchi Amalapurapu * Make sure the installed package is available. 730b56ae20b22fd7283df32072a431ab6d4965f3c1bSuchi Amalapurapu * STOPSHIP will uncomment when MountService api's to mount/unmount 731b56ae20b22fd7283df32072a431ab6d4965f3c1bSuchi Amalapurapu * are made asynchronous. 732b56ae20b22fd7283df32072a431ab6d4965f3c1bSuchi Amalapurapu */ 733b56ae20b22fd7283df32072a431ab6d4965f3c1bSuchi Amalapurapu public void xxxtestMountSdNormalInternal() { 734b56ae20b22fd7283df32072a431ab6d4965f3c1bSuchi Amalapurapu assertTrue(mountFromRawResource()); 735b56ae20b22fd7283df32072a431ab6d4965f3c1bSuchi Amalapurapu } 736b56ae20b22fd7283df32072a431ab6d4965f3c1bSuchi Amalapurapu 737b56ae20b22fd7283df32072a431ab6d4965f3c1bSuchi Amalapurapu private boolean mountFromRawResource() { 738b56ae20b22fd7283df32072a431ab6d4965f3c1bSuchi Amalapurapu // Install pkg on sdcard 7395b993ce7bc29e43a3215a50ce6ce5d6550d4e5e2Suchi Amalapurapu InstallParams ip = sampleInstallFromRawResource(PackageManager.INSTALL_EXTERNAL | 740b56ae20b22fd7283df32072a431ab6d4965f3c1bSuchi Amalapurapu PackageManager.INSTALL_REPLACE_EXISTING, false); 741b56ae20b22fd7283df32072a431ab6d4965f3c1bSuchi Amalapurapu if (localLOGV) Log.i(TAG, "Installed pkg on sdcard"); 742b56ae20b22fd7283df32072a431ab6d4965f3c1bSuchi Amalapurapu boolean origState = getMediaState(); 743b56ae20b22fd7283df32072a431ab6d4965f3c1bSuchi Amalapurapu SdMountReceiver receiver = new SdMountReceiver(new String[]{ip.pkg.packageName}); 744b56ae20b22fd7283df32072a431ab6d4965f3c1bSuchi Amalapurapu try { 745b56ae20b22fd7283df32072a431ab6d4965f3c1bSuchi Amalapurapu if (localLOGV) Log.i(TAG, "Unmounting media"); 746b56ae20b22fd7283df32072a431ab6d4965f3c1bSuchi Amalapurapu // Unmount media 747b56ae20b22fd7283df32072a431ab6d4965f3c1bSuchi Amalapurapu assertTrue(unmountMedia()); 748b56ae20b22fd7283df32072a431ab6d4965f3c1bSuchi Amalapurapu if (localLOGV) Log.i(TAG, "Unmounted media"); 749b56ae20b22fd7283df32072a431ab6d4965f3c1bSuchi Amalapurapu try { 750b56ae20b22fd7283df32072a431ab6d4965f3c1bSuchi Amalapurapu if (localLOGV) Log.i(TAG, "Sleeping for 10 second"); 751b56ae20b22fd7283df32072a431ab6d4965f3c1bSuchi Amalapurapu Thread.sleep(10*1000); 752b56ae20b22fd7283df32072a431ab6d4965f3c1bSuchi Amalapurapu } catch (InterruptedException e) { 753b56ae20b22fd7283df32072a431ab6d4965f3c1bSuchi Amalapurapu failStr(e); 754b56ae20b22fd7283df32072a431ab6d4965f3c1bSuchi Amalapurapu } 755b56ae20b22fd7283df32072a431ab6d4965f3c1bSuchi Amalapurapu // Register receiver here 756b56ae20b22fd7283df32072a431ab6d4965f3c1bSuchi Amalapurapu PackageManager pm = getPm(); 757b56ae20b22fd7283df32072a431ab6d4965f3c1bSuchi Amalapurapu mContext.registerReceiver(receiver, receiver.filter); 758b56ae20b22fd7283df32072a431ab6d4965f3c1bSuchi Amalapurapu 759b56ae20b22fd7283df32072a431ab6d4965f3c1bSuchi Amalapurapu // Wait on receiver 760b56ae20b22fd7283df32072a431ab6d4965f3c1bSuchi Amalapurapu synchronized (receiver) { 761b56ae20b22fd7283df32072a431ab6d4965f3c1bSuchi Amalapurapu if (localLOGV) Log.i(TAG, "Mounting media"); 762b56ae20b22fd7283df32072a431ab6d4965f3c1bSuchi Amalapurapu // Mount media again 763b56ae20b22fd7283df32072a431ab6d4965f3c1bSuchi Amalapurapu assertTrue(mountMedia()); 764b56ae20b22fd7283df32072a431ab6d4965f3c1bSuchi Amalapurapu if (localLOGV) Log.i(TAG, "Mounted media"); 765b56ae20b22fd7283df32072a431ab6d4965f3c1bSuchi Amalapurapu if (localLOGV) Log.i(TAG, "Waiting for notification"); 766b56ae20b22fd7283df32072a431ab6d4965f3c1bSuchi Amalapurapu long waitTime = 0; 767b56ae20b22fd7283df32072a431ab6d4965f3c1bSuchi Amalapurapu // Verify we received the broadcast 768b56ae20b22fd7283df32072a431ab6d4965f3c1bSuchi Amalapurapu waitTime = 0; 769b56ae20b22fd7283df32072a431ab6d4965f3c1bSuchi Amalapurapu while((!receiver.isDone()) && (waitTime < MAX_WAIT_TIME) ) { 770b56ae20b22fd7283df32072a431ab6d4965f3c1bSuchi Amalapurapu receiver.wait(WAIT_TIME_INCR); 771b56ae20b22fd7283df32072a431ab6d4965f3c1bSuchi Amalapurapu waitTime += WAIT_TIME_INCR; 772b56ae20b22fd7283df32072a431ab6d4965f3c1bSuchi Amalapurapu } 773b56ae20b22fd7283df32072a431ab6d4965f3c1bSuchi Amalapurapu if(!receiver.isDone()) { 774b56ae20b22fd7283df32072a431ab6d4965f3c1bSuchi Amalapurapu failStr("Timed out waiting for EXTERNAL_APPLICATIONS notification"); 775b56ae20b22fd7283df32072a431ab6d4965f3c1bSuchi Amalapurapu } 776b56ae20b22fd7283df32072a431ab6d4965f3c1bSuchi Amalapurapu return receiver.received; 777b56ae20b22fd7283df32072a431ab6d4965f3c1bSuchi Amalapurapu } 778b56ae20b22fd7283df32072a431ab6d4965f3c1bSuchi Amalapurapu } catch (InterruptedException e) { 779b56ae20b22fd7283df32072a431ab6d4965f3c1bSuchi Amalapurapu failStr(e); 780b56ae20b22fd7283df32072a431ab6d4965f3c1bSuchi Amalapurapu return false; 781b56ae20b22fd7283df32072a431ab6d4965f3c1bSuchi Amalapurapu } finally { 782b56ae20b22fd7283df32072a431ab6d4965f3c1bSuchi Amalapurapu mContext.unregisterReceiver(receiver); 783b56ae20b22fd7283df32072a431ab6d4965f3c1bSuchi Amalapurapu // Restore original media state 784b56ae20b22fd7283df32072a431ab6d4965f3c1bSuchi Amalapurapu if (origState) { 785b56ae20b22fd7283df32072a431ab6d4965f3c1bSuchi Amalapurapu mountMedia(); 786b56ae20b22fd7283df32072a431ab6d4965f3c1bSuchi Amalapurapu } else { 787b56ae20b22fd7283df32072a431ab6d4965f3c1bSuchi Amalapurapu unmountMedia(); 788b56ae20b22fd7283df32072a431ab6d4965f3c1bSuchi Amalapurapu } 789b56ae20b22fd7283df32072a431ab6d4965f3c1bSuchi Amalapurapu if (localLOGV) Log.i(TAG, "Cleaning up install"); 790b56ae20b22fd7283df32072a431ab6d4965f3c1bSuchi Amalapurapu cleanUpInstall(ip); 791b56ae20b22fd7283df32072a431ab6d4965f3c1bSuchi Amalapurapu } 792b56ae20b22fd7283df32072a431ab6d4965f3c1bSuchi Amalapurapu } 793b56ae20b22fd7283df32072a431ab6d4965f3c1bSuchi Amalapurapu 794b56ae20b22fd7283df32072a431ab6d4965f3c1bSuchi Amalapurapu void cleanUpInstall(InstallParams ip) { 795b56ae20b22fd7283df32072a431ab6d4965f3c1bSuchi Amalapurapu if (ip == null) { 796b56ae20b22fd7283df32072a431ab6d4965f3c1bSuchi Amalapurapu return; 797b56ae20b22fd7283df32072a431ab6d4965f3c1bSuchi Amalapurapu } 798b56ae20b22fd7283df32072a431ab6d4965f3c1bSuchi Amalapurapu Runtime.getRuntime().gc(); 799b56ae20b22fd7283df32072a431ab6d4965f3c1bSuchi Amalapurapu Log.i(TAG, "Deleting package : " + ip.pkg.packageName); 800b56ae20b22fd7283df32072a431ab6d4965f3c1bSuchi Amalapurapu getPm().deletePackage(ip.pkg.packageName, null, 0); 801b56ae20b22fd7283df32072a431ab6d4965f3c1bSuchi Amalapurapu File outFile = new File(ip.outFileName); 802b56ae20b22fd7283df32072a431ab6d4965f3c1bSuchi Amalapurapu if (outFile != null && outFile.exists()) { 803b56ae20b22fd7283df32072a431ab6d4965f3c1bSuchi Amalapurapu outFile.delete(); 804b56ae20b22fd7283df32072a431ab6d4965f3c1bSuchi Amalapurapu } 805b56ae20b22fd7283df32072a431ab6d4965f3c1bSuchi Amalapurapu } 806117818e4f171b1fd9daa05349c48f61388f04567Suchi Amalapurapu 8075b993ce7bc29e43a3215a50ce6ce5d6550d4e5e2Suchi Amalapurapu public void testManifestInstallLocationInternal() { 8085b993ce7bc29e43a3215a50ce6ce5d6550d4e5e2Suchi Amalapurapu installFromRawResource("install.apk", R.raw.install_loc_internal, 8095b993ce7bc29e43a3215a50ce6ce5d6550d4e5e2Suchi Amalapurapu 0, true, false, -1); 810117818e4f171b1fd9daa05349c48f61388f04567Suchi Amalapurapu } 811117818e4f171b1fd9daa05349c48f61388f04567Suchi Amalapurapu 8125b993ce7bc29e43a3215a50ce6ce5d6550d4e5e2Suchi Amalapurapu public void testManifestInstallLocationSdcard() { 8135b993ce7bc29e43a3215a50ce6ce5d6550d4e5e2Suchi Amalapurapu installFromRawResource("install.apk", R.raw.install_loc_sdcard, 8145b993ce7bc29e43a3215a50ce6ce5d6550d4e5e2Suchi Amalapurapu PackageManager.INSTALL_EXTERNAL, true, false, -1); 815117818e4f171b1fd9daa05349c48f61388f04567Suchi Amalapurapu } 816117818e4f171b1fd9daa05349c48f61388f04567Suchi Amalapurapu 8175b993ce7bc29e43a3215a50ce6ce5d6550d4e5e2Suchi Amalapurapu public void testManifestInstallLocationAuto() { 8185b993ce7bc29e43a3215a50ce6ce5d6550d4e5e2Suchi Amalapurapu installFromRawResource("install.apk", R.raw.install_loc_auto, 8195b993ce7bc29e43a3215a50ce6ce5d6550d4e5e2Suchi Amalapurapu 0, true, false, -1); 820117818e4f171b1fd9daa05349c48f61388f04567Suchi Amalapurapu } 821117818e4f171b1fd9daa05349c48f61388f04567Suchi Amalapurapu 8225b993ce7bc29e43a3215a50ce6ce5d6550d4e5e2Suchi Amalapurapu public void testManifestInstallLocationUnspecified() { 8235b993ce7bc29e43a3215a50ce6ce5d6550d4e5e2Suchi Amalapurapu installFromRawResource("install.apk", R.raw.install_loc_unspecified, 8245b993ce7bc29e43a3215a50ce6ce5d6550d4e5e2Suchi Amalapurapu 0, true, false, -1); 825117818e4f171b1fd9daa05349c48f61388f04567Suchi Amalapurapu } 826117818e4f171b1fd9daa05349c48f61388f04567Suchi Amalapurapu 8275b993ce7bc29e43a3215a50ce6ce5d6550d4e5e2Suchi Amalapurapu public void testManifestInstallLocationFwdLockedSdcard() { 8285b993ce7bc29e43a3215a50ce6ce5d6550d4e5e2Suchi Amalapurapu installFromRawResource("install.apk", R.raw.install_loc_sdcard, 8295b993ce7bc29e43a3215a50ce6ce5d6550d4e5e2Suchi Amalapurapu PackageManager.INSTALL_FORWARD_LOCK | 8305b993ce7bc29e43a3215a50ce6ce5d6550d4e5e2Suchi Amalapurapu PackageManager.INSTALL_EXTERNAL, true, true, 8315b993ce7bc29e43a3215a50ce6ce5d6550d4e5e2Suchi Amalapurapu PackageManager.INSTALL_FAILED_INVALID_INSTALL_LOCATION); 832117818e4f171b1fd9daa05349c48f61388f04567Suchi Amalapurapu } 833b56ae20b22fd7283df32072a431ab6d4965f3c1bSuchi Amalapurapu /* 834b56ae20b22fd7283df32072a431ab6d4965f3c1bSuchi Amalapurapu * TODO's 835b56ae20b22fd7283df32072a431ab6d4965f3c1bSuchi Amalapurapu * check version numbers for upgrades 836b56ae20b22fd7283df32072a431ab6d4965f3c1bSuchi Amalapurapu * check permissions of installed packages 837b56ae20b22fd7283df32072a431ab6d4965f3c1bSuchi Amalapurapu * how to do tests on updated system apps? 838b56ae20b22fd7283df32072a431ab6d4965f3c1bSuchi Amalapurapu * verify updates to system apps cannot be installed on the sdcard. 839b56ae20b22fd7283df32072a431ab6d4965f3c1bSuchi Amalapurapu */ 840afbaaa189fbc18b3acbb06e03233cf3442f2b1c4Suchi Amalapurapu} 841