diff --git a/core/java/com/android/internal/app/ShutdownThread.java b/core/java/com/android/internal/app/ShutdownThread.java index 83614a87ea2ce..a96253bb4bc4a 100644 --- a/core/java/com/android/internal/app/ShutdownThread.java +++ b/core/java/com/android/internal/app/ShutdownThread.java @@ -199,10 +199,10 @@ public final class ShutdownThread extends Thread { mContext.sendOrderedBroadcast(new Intent(Intent.ACTION_SHUTDOWN), null, br, mHandler, 0, null, null); - final long endTime = System.currentTimeMillis() + MAX_BROADCAST_TIME; + final long endTime = SystemClock.elapsedRealtime() + MAX_BROADCAST_TIME; synchronized (mActionDoneSync) { while (!mActionDone) { - long delay = endTime - System.currentTimeMillis(); + long delay = endTime - SystemClock.elapsedRealtime(); if (delay <= 0) { Log.w(TAG, "Shutdown broadcast timed out"); break; @@ -297,7 +297,7 @@ public final class ShutdownThread extends Thread { Log.i(TAG, "Shutting down MountService"); // Set initial variables and time out time. mActionDone = false; - final long endShutTime = System.currentTimeMillis() + MAX_SHUTDOWN_WAIT_TIME; + final long endShutTime = SystemClock.elapsedRealtime() + MAX_SHUTDOWN_WAIT_TIME; synchronized (mActionDoneSync) { try { if (mount != null) { @@ -309,7 +309,7 @@ public final class ShutdownThread extends Thread { Log.e(TAG, "Exception during MountService shutdown", e); } while (!mActionDone) { - long delay = endShutTime - System.currentTimeMillis(); + long delay = endShutTime - SystemClock.elapsedRealtime(); if (delay <= 0) { Log.w(TAG, "Shutdown wait timed out"); break; diff --git a/core/tests/coretests/src/android/content/pm/PackageManagerTests.java b/core/tests/coretests/src/android/content/pm/PackageManagerTests.java index 82834b610df69..5571341ed6c08 100755 --- a/core/tests/coretests/src/android/content/pm/PackageManagerTests.java +++ b/core/tests/coretests/src/android/content/pm/PackageManagerTests.java @@ -2346,6 +2346,49 @@ public class PackageManagerTests extends AndroidTestCase { } } + + /* This test installs an application on sdcard and unmounts media. + * The app is then re-installed on internal storage. The sdcard is mounted + * and verified that the re-installation on internal storage takes precedence. + */ + @MediumTest + public void testInstallSdcardStaleContainerReinstall() { + boolean origMediaState = getMediaState(); + try { + // Mount media first + mountMedia(); + String outFileName = "install.apk"; + int rawResId = R.raw.install; + PackageManager pm = mContext.getPackageManager(); + File filesDir = mContext.getFilesDir(); + File outFile = new File(filesDir, outFileName); + Uri packageURI = getInstallablePackage(rawResId, outFile); + PackageParser.Package pkg = parsePackage(packageURI); + assertNotNull(pkg); + // Install an app on sdcard. + installFromRawResource(outFileName, rawResId, + PackageManager.INSTALL_EXTERNAL, false, + false, -1, PackageInfo.INSTALL_LOCATION_UNSPECIFIED); + // Unmount sdcard + unmountMedia(); + // Reinstall the app and make sure it gets installed on internal storage. + installFromRawResource(outFileName, rawResId, + PackageManager.INSTALL_REPLACE_EXISTING, false, + false, -1, PackageInfo.INSTALL_LOCATION_UNSPECIFIED); + mountMedia(); + // Verify that the app installed is on internal storage. + assertInstall(pkg, 0, PackageInfo.INSTALL_LOCATION_INTERNAL_ONLY); + } catch (Exception e) { + failStr(e.getMessage()); + } finally { + if (origMediaState) { + mountMedia(); + } else { + unmountMedia(); + } + + } + } /* * The following series of tests are related to upgrading apps with * different certificates. diff --git a/docs/html/guide/appendix/market-filters.jd b/docs/html/guide/appendix/market-filters.jd index 201a14202ccc7..0797892ac5b68 100644 --- a/docs/html/guide/appendix/market-filters.jd +++ b/docs/html/guide/appendix/market-filters.jd @@ -4,25 +4,24 @@ page.title=Market Filters
-

Market Filters quickview

-