Fix duplicate entries being added when application is in active use
diff --git a/src/com/android/settings/ManageApplications.java b/src/com/android/settings/ManageApplications.java
index 7da4eae..0d4895e 100644
--- a/src/com/android/settings/ManageApplications.java
+++ b/src/com/android/settings/ManageApplications.java
@@ -355,7 +355,7 @@
                     Log.w(TAG, "Couldnt find application info for:"+pkgName);
                     break;
                 }
-                mObserver.invokeGetSizeInfo(info);
+                mObserver.invokeGetSizeInfo(pkgName);
                 break;
             case ADD_PKG_DONE:
                 if(localLOGV) Log.i(TAG, "Message ADD_PKG_DONE");
@@ -367,7 +367,12 @@
                 if (status) {
                     size = data.getLong(ATTR_PKG_STATS);
                     formattedSize = data.getString(ATTR_PKG_SIZE_STR);
-                    mAppInfoAdapter.addToList(pkgName, size, formattedSize);
+                    int idx = mAppInfoAdapter.getIndex(pkgName);
+                    if (idx == -1) {
+                        mAppInfoAdapter.addToList(pkgName, size, formattedSize);
+                    } else {
+                        mAppInfoAdapter.updatePackage(pkgName, size, formattedSize);
+                    }
                 }
                 break;
             case REFRESH_LABELS:
@@ -1121,7 +1126,7 @@
             }
             return mSizeComparator;
         }
-        
+
         public void bulkUpdateIcons(Map<String, Drawable> icons) {
             if (icons == null) {
                 return;
@@ -1162,19 +1167,6 @@
             }
         }
 
-        public boolean updateAppLabel(String pkgName, CharSequence label) {
-            if ((pkgName == null) || (label == null)) {
-                return false;
-            }
-            AppInfo aInfo = mCache.getEntry(pkgName);
-            if (aInfo != null) {
-                aInfo.refreshLabel(label);
-                notifyDataSetChanged();
-                return true;
-            }
-            return false;
-        }
-
         private boolean shouldBeInList(int filterOption, ApplicationInfo info) {
             // Match filter here
             if (filterOption == FILTER_APPS_RUNNING) {
@@ -1246,6 +1238,24 @@
             }
         }
 
+        public void updatePackage(String pkgName,
+                long size, String formattedSize) {
+            ApplicationInfo info = null;
+            try {
+                info = mPm.getApplicationInfo(pkgName,
+                        PackageManager.GET_UNINSTALLED_PACKAGES);
+            } catch (NameNotFoundException e) {
+                return;
+            }
+            AppInfo aInfo = mCache.getEntry(pkgName);
+            if (aInfo != null) {
+                aInfo.refreshLabel(info.loadLabel(mPm));
+                aInfo.refreshIcon(info.loadIcon(mPm));
+                aInfo.setSize(size, formattedSize);
+                notifyDataSetChanged();
+            }
+        }
+
         private void removePkgBase(String pkgName) {
             int imax = mAppList.size();
             for (int i = 0; i < imax; i++) {
@@ -1311,21 +1321,6 @@
                 notifyDataSetChanged();
             }
         }
-        
-        public void updateAppSize(String pkgName, long size, String formattedSize) {
-            if(pkgName == null) {
-                return;
-            }
-            AppInfo entry = mCache.getEntry(pkgName);
-            if (entry == null) {
-                if (localLOGV) Log.w(TAG, "Entry for package:"+pkgName+"doesnt exist in map");
-                return;
-            }
-            // Copy the index into the newly updated entry
-            if (entry.setSize(size, formattedSize)) {
-                notifyDataSetChanged();
-            }
-        }
     }
     
     /*
@@ -1371,7 +1366,7 @@
      * and the AppInfo object corresponding to the package name are set on the message
      */
     class PkgSizeObserver extends IPackageStatsObserver.Stub {
-        private ApplicationInfo mAppInfo;
+        String pkgName;
         public void onGetStatsCompleted(PackageStats pStats, boolean pSucceeded) {
             if(DEBUG_PKG_DELAY) {
                 try {
@@ -1379,12 +1374,11 @@
                 } catch (InterruptedException e) {
                 }
             }
-            AppInfo appInfo = null;
             Bundle data = new Bundle();
-            data.putString(ATTR_PKG_NAME, mAppInfo.packageName);
+            data.putString(ATTR_PKG_NAME, pkgName);
             data.putBoolean(ATTR_GET_SIZE_STATUS, pSucceeded);
             if(pSucceeded && pStats != null) {
-                if (localLOGV) Log.i(TAG, "onGetStatsCompleted::"+pStats.packageName+", ("+
+                if (localLOGV) Log.i(TAG, "onGetStatsCompleted::"+pkgName+", ("+
                         pStats.cacheSize+","+
                         pStats.codeSize+", "+pStats.dataSize);
                 long total = getTotalSize(pStats);
@@ -1400,14 +1394,14 @@
             mHandler.sendMessage(msg);
         }
 
-        public void invokeGetSizeInfo(ApplicationInfo pAppInfo) {
-            if(pAppInfo == null || pAppInfo.packageName == null) {
+        public void invokeGetSizeInfo(String packageName) {
+            if (packageName == null) {
                 return;
             }
+            pkgName = packageName;
             if(localLOGV) Log.i(TAG, "Invoking getPackageSizeInfo for package:"+
-                    pAppInfo.packageName);
-            mAppInfo = pAppInfo;
-            mPm.getPackageSizeInfo(pAppInfo.packageName, this);
+                    packageName);
+            mPm.getPackageSizeInfo(packageName, this);
         }
     }