From d31f4925d100b54e21dd624760db238aac76a6ab Mon Sep 17 00:00:00 2001 From: Vasu Nori Date: Sun, 16 Jan 2011 14:01:40 -0800 Subject: bug:3343038 reset mAppsSize everytime ALL package sizes are computed Change-Id: I981d84a165777246dd9744b0f8f7bc6fc0cb3e33 --- .../settings/deviceinfo/MemoryMeasurement.java | 46 +++++++++++++--------- 1 file changed, 28 insertions(+), 18 deletions(-) (limited to 'src') diff --git a/src/com/android/settings/deviceinfo/MemoryMeasurement.java b/src/com/android/settings/deviceinfo/MemoryMeasurement.java index ead9dd6..19bd784 100644 --- a/src/com/android/settings/deviceinfo/MemoryMeasurement.java +++ b/src/com/android/settings/deviceinfo/MemoryMeasurement.java @@ -180,8 +180,6 @@ public class MemoryMeasurement { public static final int MSG_INVALIDATE = 6; - private List mPendingApps = new ArrayList(); - private Object mLock = new Object(); private IMediaContainerService mDefaultContainer; @@ -190,7 +188,7 @@ public class MemoryMeasurement { private volatile boolean mMeasured = false; - private long mAppsSize = 0; + private StatsObserver mStatsObserver; private final WeakReference mContext; @@ -287,39 +285,49 @@ public class MemoryMeasurement { sendEmptyMessage(MSG_DISCONNECT); } - public void queuePackageMeasurementLocked(String packageName) { - mPendingApps.add(packageName); - } - /** * Request measurement of each package. * * @param pm PackageManager instance to query */ public void requestQueuedMeasurementsLocked(PackageManager pm) { - final int N = mPendingApps.size(); + final List appsList = mStatsObserver.getAppsList(); + final int N = appsList.size(); for (int i = 0; i < N; i++) { - pm.getPackageSizeInfo(mPendingApps.get(i), mStatsObserver); + pm.getPackageSizeInfo(appsList.get(i), mStatsObserver); } } - final IPackageStatsObserver.Stub mStatsObserver = new IPackageStatsObserver.Stub() { + private class StatsObserver extends IPackageStatsObserver.Stub { + private long mAppsSizeForThisStatsObserver = 0; + private final List mAppsList = new ArrayList(); public void onGetStatsCompleted(PackageStats stats, boolean succeeded) { + if (!mStatsObserver.equals(this)) { + // this callback's class object is no longer in use. ignore this callback. + return; + } if (succeeded) { - mAppsSize += stats.codeSize + stats.dataSize; + mAppsSizeForThisStatsObserver += stats.codeSize + stats.dataSize; } - synchronized (mPendingApps) { - mPendingApps.remove(stats.packageName); + synchronized (mAppsList) { + mAppsList.remove(stats.packageName); - if (mPendingApps.size() == 0) { - mInternalAppsSize = mAppsSize; + if (mAppsList.size() == 0) { + mInternalAppsSize = mAppsSizeForThisStatsObserver; onInternalMeasurementComplete(); } } } - }; + + public void queuePackageMeasurementLocked(String packageName) { + mAppsList.add(packageName); + } + public List getAppsList() { + return mAppsList; + } + } private void onInternalMeasurementComplete() { sendEmptyMessage(MSG_COMPLETED); @@ -368,10 +376,12 @@ public class MemoryMeasurement { .getInstalledApplications(PackageManager.GET_UNINSTALLED_PACKAGES | PackageManager.GET_DISABLED_COMPONENTS); if (apps != null) { - synchronized (mPendingApps) { + // initiate measurement of all package sizes. need new StatsObserver object. + mStatsObserver = new StatsObserver(); + synchronized (mStatsObserver.mAppsList) { for (int i = 0; i < apps.size(); i++) { final ApplicationInfo info = apps.get(i); - queuePackageMeasurementLocked(info.packageName); + mStatsObserver.queuePackageMeasurementLocked(info.packageName); } requestQueuedMeasurementsLocked(pm); -- cgit v1.1