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