Tighten locking around data usage UID resolution.

Bug: 5965853
Change-Id: I92231ca938ddf320377c437c7379a03319c88aca
This commit is contained in:
Jeff Sharkey
2012-02-03 15:47:39 -08:00
parent 77dae91726
commit ae30d12a5f

View File

@@ -22,6 +22,7 @@ import android.content.pm.PackageInfo;
import android.content.pm.PackageManager; import android.content.pm.PackageManager;
import android.content.pm.PackageManager.NameNotFoundException; import android.content.pm.PackageManager.NameNotFoundException;
import android.content.res.Resources; import android.content.res.Resources;
import android.graphics.drawable.Drawable;
import android.net.ConnectivityManager; import android.net.ConnectivityManager;
import android.net.TrafficStats; import android.net.TrafficStats;
import android.text.TextUtils; import android.text.TextUtils;
@@ -39,21 +40,42 @@ public class UidDetailProvider {
mUidDetailCache = new SparseArray<UidDetail>(); mUidDetailCache = new SparseArray<UidDetail>();
} }
public synchronized void clearCache() { public void clearCache() {
synchronized (mUidDetailCache) {
mUidDetailCache.clear(); mUidDetailCache.clear();
} }
}
/** /**
* Resolve best descriptive label for the given UID. * Resolve best descriptive label for the given UID.
*/ */
public synchronized UidDetail getUidDetail(int uid, boolean blocking) { public UidDetail getUidDetail(int uid, boolean blocking) {
final UidDetail cached = mUidDetailCache.get(uid); UidDetail detail;
if (cached != null) {
return cached; synchronized (mUidDetailCache) {
detail = mUidDetailCache.get(uid);
}
if (detail != null) {
return detail;
} else if (!blocking) { } else if (!blocking) {
return null; return null;
} }
detail = buildUidDetail(uid);
synchronized (mUidDetailCache) {
mUidDetailCache.put(uid, detail);
}
return detail;
}
/**
* Build {@link UidDetail} object, blocking until all {@link Drawable}
* lookup is finished.
*/
private UidDetail buildUidDetail(int uid) {
final Resources res = mContext.getResources(); final Resources res = mContext.getResources();
final PackageManager pm = mContext.getPackageManager(); final PackageManager pm = mContext.getPackageManager();
@@ -66,19 +88,16 @@ public class UidDetailProvider {
case android.os.Process.SYSTEM_UID: case android.os.Process.SYSTEM_UID:
detail.label = res.getString(R.string.process_kernel_label); detail.label = res.getString(R.string.process_kernel_label);
detail.icon = pm.getDefaultActivityIcon(); detail.icon = pm.getDefaultActivityIcon();
mUidDetailCache.put(uid, detail);
return detail; return detail;
case TrafficStats.UID_REMOVED: case TrafficStats.UID_REMOVED:
detail.label = res.getString(R.string.data_usage_uninstalled_apps); detail.label = res.getString(R.string.data_usage_uninstalled_apps);
detail.icon = pm.getDefaultActivityIcon(); detail.icon = pm.getDefaultActivityIcon();
mUidDetailCache.put(uid, detail);
return detail; return detail;
case TrafficStats.UID_TETHERING: case TrafficStats.UID_TETHERING:
final ConnectivityManager cm = (ConnectivityManager) mContext.getSystemService( final ConnectivityManager cm = (ConnectivityManager) mContext.getSystemService(
Context.CONNECTIVITY_SERVICE); Context.CONNECTIVITY_SERVICE);
detail.label = res.getString(Utils.getTetheringLabel(cm)); detail.label = res.getString(Utils.getTetheringLabel(cm));
detail.icon = pm.getDefaultActivityIcon(); detail.icon = pm.getDefaultActivityIcon();
mUidDetailCache.put(uid, detail);
return detail; return detail;
} }
@@ -113,7 +132,6 @@ public class UidDetailProvider {
detail.label = Integer.toString(uid); detail.label = Integer.toString(uid);
} }
mUidDetailCache.put(uid, detail);
return detail; return detail;
} }
} }