10499834db3f9dc6fb0f5f57b5876b8503bce5189Winson Chung/*
20499834db3f9dc6fb0f5f57b5876b8503bce5189Winson Chung * Copyright (C) 2011 The Android Open Source Project
30499834db3f9dc6fb0f5f57b5876b8503bce5189Winson Chung *
40499834db3f9dc6fb0f5f57b5876b8503bce5189Winson Chung * Licensed under the Apache License, Version 2.0 (the "License");
50499834db3f9dc6fb0f5f57b5876b8503bce5189Winson Chung * you may not use this file except in compliance with the License.
60499834db3f9dc6fb0f5f57b5876b8503bce5189Winson Chung * You may obtain a copy of the License at
70499834db3f9dc6fb0f5f57b5876b8503bce5189Winson Chung *
80499834db3f9dc6fb0f5f57b5876b8503bce5189Winson Chung *      http://www.apache.org/licenses/LICENSE-2.0
90499834db3f9dc6fb0f5f57b5876b8503bce5189Winson Chung *
100499834db3f9dc6fb0f5f57b5876b8503bce5189Winson Chung * Unless required by applicable law or agreed to in writing, software
110499834db3f9dc6fb0f5f57b5876b8503bce5189Winson Chung * distributed under the License is distributed on an "AS IS" BASIS,
120499834db3f9dc6fb0f5f57b5876b8503bce5189Winson Chung * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
130499834db3f9dc6fb0f5f57b5876b8503bce5189Winson Chung * See the License for the specific language governing permissions and
140499834db3f9dc6fb0f5f57b5876b8503bce5189Winson Chung * limitations under the License.
150499834db3f9dc6fb0f5f57b5876b8503bce5189Winson Chung */
160499834db3f9dc6fb0f5f57b5876b8503bce5189Winson Chung
170499834db3f9dc6fb0f5f57b5876b8503bce5189Winson Chungpackage com.android.launcher2;
180499834db3f9dc6fb0f5f57b5876b8503bce5189Winson Chung
190499834db3f9dc6fb0f5f57b5876b8503bce5189Winson Chungimport java.util.ArrayList;
200499834db3f9dc6fb0f5f57b5876b8503bce5189Winson Chungimport java.util.HashMap;
210499834db3f9dc6fb0f5f57b5876b8503bce5189Winson Chungimport java.util.HashSet;
220499834db3f9dc6fb0f5f57b5876b8503bce5189Winson Chungimport java.util.List;
230499834db3f9dc6fb0f5f57b5876b8503bce5189Winson Chung
240499834db3f9dc6fb0f5f57b5876b8503bce5189Winson Chungimport android.appwidget.AppWidgetProviderInfo;
250499834db3f9dc6fb0f5f57b5876b8503bce5189Winson Chungimport android.content.ComponentName;
260499834db3f9dc6fb0f5f57b5876b8503bce5189Winson Chungimport android.content.pm.ComponentInfo;
270499834db3f9dc6fb0f5f57b5876b8503bce5189Winson Chungimport android.content.pm.ResolveInfo;
280499834db3f9dc6fb0f5f57b5876b8503bce5189Winson Chungimport android.graphics.Bitmap;
290499834db3f9dc6fb0f5f57b5876b8503bce5189Winson Chung
300499834db3f9dc6fb0f5f57b5876b8503bce5189Winson Chung/**
310499834db3f9dc6fb0f5f57b5876b8503bce5189Winson Chung * Simple cache mechanism for PagedView outlines.
320499834db3f9dc6fb0f5f57b5876b8503bce5189Winson Chung */
330499834db3f9dc6fb0f5f57b5876b8503bce5189Winson Chungpublic class PagedViewIconCache {
340499834db3f9dc6fb0f5f57b5876b8503bce5189Winson Chung    public static class Key {
350499834db3f9dc6fb0f5f57b5876b8503bce5189Winson Chung        public enum Type {
360499834db3f9dc6fb0f5f57b5876b8503bce5189Winson Chung            ApplicationInfoKey,
370499834db3f9dc6fb0f5f57b5876b8503bce5189Winson Chung            AppWidgetProviderInfoKey,
380499834db3f9dc6fb0f5f57b5876b8503bce5189Winson Chung            ResolveInfoKey
390499834db3f9dc6fb0f5f57b5876b8503bce5189Winson Chung        }
400499834db3f9dc6fb0f5f57b5876b8503bce5189Winson Chung        private final ComponentName mComponentName;
410499834db3f9dc6fb0f5f57b5876b8503bce5189Winson Chung        private final Type mType;
420499834db3f9dc6fb0f5f57b5876b8503bce5189Winson Chung
430499834db3f9dc6fb0f5f57b5876b8503bce5189Winson Chung        public Key(ApplicationInfo info) {
440499834db3f9dc6fb0f5f57b5876b8503bce5189Winson Chung            mComponentName = info.componentName;
450499834db3f9dc6fb0f5f57b5876b8503bce5189Winson Chung            mType = Type.ApplicationInfoKey;
460499834db3f9dc6fb0f5f57b5876b8503bce5189Winson Chung        }
470499834db3f9dc6fb0f5f57b5876b8503bce5189Winson Chung        public Key(ResolveInfo info) {
480499834db3f9dc6fb0f5f57b5876b8503bce5189Winson Chung            final ComponentInfo ci = info.activityInfo != null ? info.activityInfo :
490499834db3f9dc6fb0f5f57b5876b8503bce5189Winson Chung                info.serviceInfo;
500499834db3f9dc6fb0f5f57b5876b8503bce5189Winson Chung            mComponentName = new ComponentName(ci.packageName, ci.name);
5161fa4197c4316bb0f9b05fcefb676f86197a2273Winson Chung            mType = Type.ResolveInfoKey;
520499834db3f9dc6fb0f5f57b5876b8503bce5189Winson Chung        }
530499834db3f9dc6fb0f5f57b5876b8503bce5189Winson Chung        public Key(AppWidgetProviderInfo info) {
540499834db3f9dc6fb0f5f57b5876b8503bce5189Winson Chung            mComponentName = info.provider;
5561fa4197c4316bb0f9b05fcefb676f86197a2273Winson Chung            mType = Type.AppWidgetProviderInfoKey;
560499834db3f9dc6fb0f5f57b5876b8503bce5189Winson Chung        }
570499834db3f9dc6fb0f5f57b5876b8503bce5189Winson Chung
580499834db3f9dc6fb0f5f57b5876b8503bce5189Winson Chung        private ComponentName getComponentName() {
590499834db3f9dc6fb0f5f57b5876b8503bce5189Winson Chung            return mComponentName;
600499834db3f9dc6fb0f5f57b5876b8503bce5189Winson Chung        }
610499834db3f9dc6fb0f5f57b5876b8503bce5189Winson Chung        public boolean isKeyType(Type t) {
620499834db3f9dc6fb0f5f57b5876b8503bce5189Winson Chung            return (mType == t);
630499834db3f9dc6fb0f5f57b5876b8503bce5189Winson Chung        }
640499834db3f9dc6fb0f5f57b5876b8503bce5189Winson Chung
650499834db3f9dc6fb0f5f57b5876b8503bce5189Winson Chung        @Override
660499834db3f9dc6fb0f5f57b5876b8503bce5189Winson Chung        public boolean equals(Object o) {
670499834db3f9dc6fb0f5f57b5876b8503bce5189Winson Chung            if (o instanceof Key) {
680499834db3f9dc6fb0f5f57b5876b8503bce5189Winson Chung                Key k = (Key) o;
690499834db3f9dc6fb0f5f57b5876b8503bce5189Winson Chung                return mComponentName.equals(k.mComponentName);
700499834db3f9dc6fb0f5f57b5876b8503bce5189Winson Chung            }
710499834db3f9dc6fb0f5f57b5876b8503bce5189Winson Chung            return super.equals(o);
720499834db3f9dc6fb0f5f57b5876b8503bce5189Winson Chung        }
730499834db3f9dc6fb0f5f57b5876b8503bce5189Winson Chung        @Override
740499834db3f9dc6fb0f5f57b5876b8503bce5189Winson Chung        public int hashCode() {
750499834db3f9dc6fb0f5f57b5876b8503bce5189Winson Chung            return getComponentName().hashCode();
760499834db3f9dc6fb0f5f57b5876b8503bce5189Winson Chung        }
770499834db3f9dc6fb0f5f57b5876b8503bce5189Winson Chung    }
780499834db3f9dc6fb0f5f57b5876b8503bce5189Winson Chung
790499834db3f9dc6fb0f5f57b5876b8503bce5189Winson Chung    private final HashMap<Key, Bitmap> mIconOutlineCache = new HashMap<Key, Bitmap>();
800499834db3f9dc6fb0f5f57b5876b8503bce5189Winson Chung
810499834db3f9dc6fb0f5f57b5876b8503bce5189Winson Chung    public void clear() {
820499834db3f9dc6fb0f5f57b5876b8503bce5189Winson Chung        for (Key key : mIconOutlineCache.keySet()) {
830499834db3f9dc6fb0f5f57b5876b8503bce5189Winson Chung            mIconOutlineCache.get(key).recycle();
840499834db3f9dc6fb0f5f57b5876b8503bce5189Winson Chung        }
850499834db3f9dc6fb0f5f57b5876b8503bce5189Winson Chung        mIconOutlineCache.clear();
860499834db3f9dc6fb0f5f57b5876b8503bce5189Winson Chung    }
870499834db3f9dc6fb0f5f57b5876b8503bce5189Winson Chung    private void retainAll(HashSet<Key> keysToKeep, Key.Type t) {
880499834db3f9dc6fb0f5f57b5876b8503bce5189Winson Chung        HashSet<Key> keysToRemove = new HashSet<Key>(mIconOutlineCache.keySet());
890499834db3f9dc6fb0f5f57b5876b8503bce5189Winson Chung        keysToRemove.removeAll(keysToKeep);
900499834db3f9dc6fb0f5f57b5876b8503bce5189Winson Chung        for (Key key : keysToRemove) {
910499834db3f9dc6fb0f5f57b5876b8503bce5189Winson Chung            if (key.isKeyType(t)) {
920499834db3f9dc6fb0f5f57b5876b8503bce5189Winson Chung                mIconOutlineCache.get(key).recycle();
930499834db3f9dc6fb0f5f57b5876b8503bce5189Winson Chung                mIconOutlineCache.remove(key);
940499834db3f9dc6fb0f5f57b5876b8503bce5189Winson Chung            }
950499834db3f9dc6fb0f5f57b5876b8503bce5189Winson Chung        }
960499834db3f9dc6fb0f5f57b5876b8503bce5189Winson Chung    }
970499834db3f9dc6fb0f5f57b5876b8503bce5189Winson Chung    /** Removes all the keys to applications that aren't in the passed in collection */
980499834db3f9dc6fb0f5f57b5876b8503bce5189Winson Chung    public void retainAllApps(ArrayList<ApplicationInfo> keys) {
990499834db3f9dc6fb0f5f57b5876b8503bce5189Winson Chung        HashSet<Key> keysSet = new HashSet<Key>();
1000499834db3f9dc6fb0f5f57b5876b8503bce5189Winson Chung        for (ApplicationInfo info : keys) {
1010499834db3f9dc6fb0f5f57b5876b8503bce5189Winson Chung            keysSet.add(new Key(info));
1020499834db3f9dc6fb0f5f57b5876b8503bce5189Winson Chung        }
1030499834db3f9dc6fb0f5f57b5876b8503bce5189Winson Chung        retainAll(keysSet, Key.Type.ApplicationInfoKey);
1040499834db3f9dc6fb0f5f57b5876b8503bce5189Winson Chung    }
1050499834db3f9dc6fb0f5f57b5876b8503bce5189Winson Chung    /** Removes all the keys to shortcuts that aren't in the passed in collection */
1060499834db3f9dc6fb0f5f57b5876b8503bce5189Winson Chung    public void retainAllShortcuts(List<ResolveInfo> keys) {
1070499834db3f9dc6fb0f5f57b5876b8503bce5189Winson Chung        HashSet<Key> keysSet = new HashSet<Key>();
1080499834db3f9dc6fb0f5f57b5876b8503bce5189Winson Chung        for (ResolveInfo info : keys) {
1090499834db3f9dc6fb0f5f57b5876b8503bce5189Winson Chung            keysSet.add(new Key(info));
1100499834db3f9dc6fb0f5f57b5876b8503bce5189Winson Chung        }
1110499834db3f9dc6fb0f5f57b5876b8503bce5189Winson Chung        retainAll(keysSet, Key.Type.ResolveInfoKey);
1120499834db3f9dc6fb0f5f57b5876b8503bce5189Winson Chung    }
1130499834db3f9dc6fb0f5f57b5876b8503bce5189Winson Chung    /** Removes all the keys to widgets that aren't in the passed in collection */
1140499834db3f9dc6fb0f5f57b5876b8503bce5189Winson Chung    public void retainAllAppWidgets(List<AppWidgetProviderInfo> keys) {
1150499834db3f9dc6fb0f5f57b5876b8503bce5189Winson Chung        HashSet<Key> keysSet = new HashSet<Key>();
1160499834db3f9dc6fb0f5f57b5876b8503bce5189Winson Chung        for (AppWidgetProviderInfo info : keys) {
1170499834db3f9dc6fb0f5f57b5876b8503bce5189Winson Chung            keysSet.add(new Key(info));
1180499834db3f9dc6fb0f5f57b5876b8503bce5189Winson Chung        }
1190499834db3f9dc6fb0f5f57b5876b8503bce5189Winson Chung        retainAll(keysSet, Key.Type.AppWidgetProviderInfoKey);
1200499834db3f9dc6fb0f5f57b5876b8503bce5189Winson Chung    }
1210499834db3f9dc6fb0f5f57b5876b8503bce5189Winson Chung    public void addOutline(Key key, Bitmap b) {
1220499834db3f9dc6fb0f5f57b5876b8503bce5189Winson Chung        mIconOutlineCache.put(key, b);
1230499834db3f9dc6fb0f5f57b5876b8503bce5189Winson Chung    }
1240499834db3f9dc6fb0f5f57b5876b8503bce5189Winson Chung    public void removeOutline(Key key) {
1250499834db3f9dc6fb0f5f57b5876b8503bce5189Winson Chung        if (mIconOutlineCache.containsKey(key)) {
1260499834db3f9dc6fb0f5f57b5876b8503bce5189Winson Chung            mIconOutlineCache.get(key).recycle();
1270499834db3f9dc6fb0f5f57b5876b8503bce5189Winson Chung            mIconOutlineCache.remove(key);
1280499834db3f9dc6fb0f5f57b5876b8503bce5189Winson Chung        }
1290499834db3f9dc6fb0f5f57b5876b8503bce5189Winson Chung    }
1300499834db3f9dc6fb0f5f57b5876b8503bce5189Winson Chung    public Bitmap getOutline(Key key) {
1310499834db3f9dc6fb0f5f57b5876b8503bce5189Winson Chung        return mIconOutlineCache.get(key);
1320499834db3f9dc6fb0f5f57b5876b8503bce5189Winson Chung    }
1330499834db3f9dc6fb0f5f57b5876b8503bce5189Winson Chung}
134