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