diff options
author | The Android Open Source Project <initial-contribution@android.com> | 2008-10-21 07:00:00 -0700 |
---|---|---|
committer | The Android Open Source Project <initial-contribution@android.com> | 2008-10-21 07:00:00 -0700 |
commit | 54b6cfa9a9e5b861a9930af873580d6dc20f773c (patch) | |
tree | 35051494d2af230dce54d6b31c6af8fc24091316 /services/java/com/android/server/AttributeCache.java | |
download | frameworks_base-54b6cfa9a9e5b861a9930af873580d6dc20f773c.zip frameworks_base-54b6cfa9a9e5b861a9930af873580d6dc20f773c.tar.gz frameworks_base-54b6cfa9a9e5b861a9930af873580d6dc20f773c.tar.bz2 |
Initial Contribution
Diffstat (limited to 'services/java/com/android/server/AttributeCache.java')
-rw-r--r-- | services/java/com/android/server/AttributeCache.java | 129 |
1 files changed, 129 insertions, 0 deletions
diff --git a/services/java/com/android/server/AttributeCache.java b/services/java/com/android/server/AttributeCache.java new file mode 100644 index 0000000..459ae52 --- /dev/null +++ b/services/java/com/android/server/AttributeCache.java @@ -0,0 +1,129 @@ +/* +** +** Copyright 2007, The Android Open Source Project +** +** Licensed under the Apache License, Version 2.0 (the "License"); +** you may not use this file except in compliance with the License. +** You may obtain a copy of the License at +** +** http://www.apache.org/licenses/LICENSE-2.0 +** +** Unless required by applicable law or agreed to in writing, software +** distributed under the License is distributed on an "AS IS" BASIS, +** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +** See the License for the specific language governing permissions and +** limitations under the License. +*/ + +package com.android.server; + +import android.content.ComponentName; +import android.content.ContentResolver; +import android.content.Context; +import android.content.SharedPreferences; +import android.content.Intent; +import android.content.BroadcastReceiver; +import android.content.pm.PackageManager; +import android.content.res.Resources; +import android.content.res.TypedArray; +import android.provider.Settings; +import android.util.Config; +import android.util.Log; + +import java.util.WeakHashMap; + +public final class AttributeCache extends BroadcastReceiver { + private static AttributeCache sInstance = null; + + private final Context mContext; + private final WeakHashMap<Key, Entry> mMap = + new WeakHashMap<Key, Entry>(); + private final WeakHashMap<String, Context> mContexts = + new WeakHashMap<String, Context>(); + + final static class Key { + public final String packageName; + public final int resId; + public final int[] styleable; + + public Key(String inPackageName, int inResId, int[] inStyleable) { + packageName = inPackageName; + resId = inResId; + styleable = inStyleable; + } + + @Override public boolean equals(Object obj) { + try { + if (obj != null) { + Key other = (Key)obj; + return packageName.equals(other.packageName) + && resId == other.resId + && styleable == other.styleable; + } + } catch (ClassCastException e) { + } + return false; + } + + @Override public int hashCode() { + return packageName.hashCode() + resId; + } + } + + public final static class Entry { + public final Context context; + public final TypedArray array; + + public Entry(Context c, TypedArray ta) { + context = c; + array = ta; + } + } + + public static void init(Context context) { + if (sInstance == null) { + sInstance = new AttributeCache(context); + } + } + + public static AttributeCache instance() { + return sInstance; + } + + public AttributeCache(Context context) { + mContext = context; + } + + public Entry get(String packageName, int resId, int[] styleable) { + synchronized (this) { + Key key = new Key(packageName, resId, styleable); + Entry ent = mMap.get(key); + if (ent != null) { + return ent; + } + Context context = mContexts.get(packageName); + if (context == null) { + try { + context = mContext.createPackageContext(packageName, 0); + if (context == null) { + return null; + } + mContexts.put(packageName, context); + } catch (PackageManager.NameNotFoundException e) { + return null; + } + } + try { + ent = new Entry(context, + context.obtainStyledAttributes(resId, styleable)); + mMap.put(key, ent); + } catch (Resources.NotFoundException e) { + return null; + } + return ent; + } + } + @Override public void onReceive(Context context, Intent intent) { + } +} + |