summaryrefslogtreecommitdiffstats
path: root/src/com/android/settings/net
diff options
context:
space:
mode:
authorJeff Sharkey <jsharkey@android.com>2012-02-03 15:47:39 -0800
committerJeff Sharkey <jsharkey@android.com>2012-02-03 15:48:28 -0800
commitae30d12a5f650ec6f2ba0604c908a0f5361334f3 (patch)
treef530ca8c37b4a5d1ba010a61189323f12984fbc0 /src/com/android/settings/net
parent77dae91726864c2c88ac317aff6bd086ca468e54 (diff)
downloadpackages_apps_Settings-ae30d12a5f650ec6f2ba0604c908a0f5361334f3.zip
packages_apps_Settings-ae30d12a5f650ec6f2ba0604c908a0f5361334f3.tar.gz
packages_apps_Settings-ae30d12a5f650ec6f2ba0604c908a0f5361334f3.tar.bz2
Tighten locking around data usage UID resolution.
Bug: 5965853 Change-Id: I92231ca938ddf320377c437c7379a03319c88aca
Diffstat (limited to 'src/com/android/settings/net')
-rw-r--r--src/com/android/settings/net/UidDetailProvider.java38
1 files changed, 28 insertions, 10 deletions
diff --git a/src/com/android/settings/net/UidDetailProvider.java b/src/com/android/settings/net/UidDetailProvider.java
index 57d585b..dd2b8c0 100644
--- a/src/com/android/settings/net/UidDetailProvider.java
+++ b/src/com/android/settings/net/UidDetailProvider.java
@@ -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() {
- mUidDetailCache.clear();
+ 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;
}
}