1bfbf7f9f4a0b300613f0ff27a4eb592d88c08325Tony Wickham/* 2bfbf7f9f4a0b300613f0ff27a4eb592d88c08325Tony Wickham * Copyright (C) 2016 The Android Open Source Project 3bfbf7f9f4a0b300613f0ff27a4eb592d88c08325Tony Wickham * 4bfbf7f9f4a0b300613f0ff27a4eb592d88c08325Tony Wickham * Licensed under the Apache License, Version 2.0 (the "License"); 5bfbf7f9f4a0b300613f0ff27a4eb592d88c08325Tony Wickham * you may not use this file except in compliance with the License. 6bfbf7f9f4a0b300613f0ff27a4eb592d88c08325Tony Wickham * You may obtain a copy of the License at 7bfbf7f9f4a0b300613f0ff27a4eb592d88c08325Tony Wickham * 8bfbf7f9f4a0b300613f0ff27a4eb592d88c08325Tony Wickham * http://www.apache.org/licenses/LICENSE-2.0 9bfbf7f9f4a0b300613f0ff27a4eb592d88c08325Tony Wickham * 10bfbf7f9f4a0b300613f0ff27a4eb592d88c08325Tony Wickham * Unless required by applicable law or agreed to in writing, software 11bfbf7f9f4a0b300613f0ff27a4eb592d88c08325Tony Wickham * distributed under the License is distributed on an "AS IS" BASIS, 12bfbf7f9f4a0b300613f0ff27a4eb592d88c08325Tony Wickham * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13bfbf7f9f4a0b300613f0ff27a4eb592d88c08325Tony Wickham * See the License for the specific language governing permissions and 14bfbf7f9f4a0b300613f0ff27a4eb592d88c08325Tony Wickham * limitations under the License. 15bfbf7f9f4a0b300613f0ff27a4eb592d88c08325Tony Wickham */ 16bfbf7f9f4a0b300613f0ff27a4eb592d88c08325Tony Wickham 17bfbf7f9f4a0b300613f0ff27a4eb592d88c08325Tony Wickhampackage com.android.launcher3.shortcuts; 18bfbf7f9f4a0b300613f0ff27a4eb592d88c08325Tony Wickham 19bfbf7f9f4a0b300613f0ff27a4eb592d88c08325Tony Wickhamimport android.annotation.TargetApi; 20bfbf7f9f4a0b300613f0ff27a4eb592d88c08325Tony Wickhamimport android.os.Build; 21bfbf7f9f4a0b300613f0ff27a4eb592d88c08325Tony Wickhamimport android.os.UserHandle; 22bfbf7f9f4a0b300613f0ff27a4eb592d88c08325Tony Wickhamimport android.util.LruCache; 23bfbf7f9f4a0b300613f0ff27a4eb592d88c08325Tony Wickham 24bfbf7f9f4a0b300613f0ff27a4eb592d88c08325Tony Wickhamimport java.util.HashMap; 25bfbf7f9f4a0b300613f0ff27a4eb592d88c08325Tony Wickhamimport java.util.List; 26bfbf7f9f4a0b300613f0ff27a4eb592d88c08325Tony Wickham 27bfbf7f9f4a0b300613f0ff27a4eb592d88c08325Tony Wickham/** 28bfbf7f9f4a0b300613f0ff27a4eb592d88c08325Tony Wickham * Loads {@link ShortcutInfoCompat}s on demand (e.g. when launcher 29bfbf7f9f4a0b300613f0ff27a4eb592d88c08325Tony Wickham * loads for pinned shortcuts and on long-press for dynamic shortcuts), and caches them 30bfbf7f9f4a0b300613f0ff27a4eb592d88c08325Tony Wickham * for handful of apps in an LruCache while launcher lives. 31bfbf7f9f4a0b300613f0ff27a4eb592d88c08325Tony Wickham */ 32bfbf7f9f4a0b300613f0ff27a4eb592d88c08325Tony Wickham@TargetApi(Build.VERSION_CODES.N) 33bfbf7f9f4a0b300613f0ff27a4eb592d88c08325Tony Wickhampublic class ShortcutCache { 34bfbf7f9f4a0b300613f0ff27a4eb592d88c08325Tony Wickham private static final String TAG = "ShortcutCache"; 35bfbf7f9f4a0b300613f0ff27a4eb592d88c08325Tony Wickham private static final boolean LOGD = false; 36bfbf7f9f4a0b300613f0ff27a4eb592d88c08325Tony Wickham 37bfbf7f9f4a0b300613f0ff27a4eb592d88c08325Tony Wickham private static final int CACHE_SIZE = 30; // Max number shortcuts we cache. 38bfbf7f9f4a0b300613f0ff27a4eb592d88c08325Tony Wickham 39bfbf7f9f4a0b300613f0ff27a4eb592d88c08325Tony Wickham private LruCache<ShortcutKey, ShortcutInfoCompat> mCachedShortcuts; 40bfbf7f9f4a0b300613f0ff27a4eb592d88c08325Tony Wickham // We always keep pinned shortcuts in the cache. 41bfbf7f9f4a0b300613f0ff27a4eb592d88c08325Tony Wickham private HashMap<ShortcutKey, ShortcutInfoCompat> mPinnedShortcuts; 42bfbf7f9f4a0b300613f0ff27a4eb592d88c08325Tony Wickham 43bfbf7f9f4a0b300613f0ff27a4eb592d88c08325Tony Wickham public ShortcutCache() { 44bfbf7f9f4a0b300613f0ff27a4eb592d88c08325Tony Wickham mCachedShortcuts = new LruCache<>(CACHE_SIZE); 45bfbf7f9f4a0b300613f0ff27a4eb592d88c08325Tony Wickham mPinnedShortcuts = new HashMap<>(); 46bfbf7f9f4a0b300613f0ff27a4eb592d88c08325Tony Wickham } 47bfbf7f9f4a0b300613f0ff27a4eb592d88c08325Tony Wickham 48bfbf7f9f4a0b300613f0ff27a4eb592d88c08325Tony Wickham /** 49bfbf7f9f4a0b300613f0ff27a4eb592d88c08325Tony Wickham * Removes shortcuts from the cache when shortcuts change for a given package. 50bfbf7f9f4a0b300613f0ff27a4eb592d88c08325Tony Wickham * 51bfbf7f9f4a0b300613f0ff27a4eb592d88c08325Tony Wickham * Returns a map of ids to their evicted shortcuts. 52bfbf7f9f4a0b300613f0ff27a4eb592d88c08325Tony Wickham * 53bfbf7f9f4a0b300613f0ff27a4eb592d88c08325Tony Wickham * @see android.content.pm.LauncherApps.Callback#onShortcutsChanged(String, List, UserHandle). 54bfbf7f9f4a0b300613f0ff27a4eb592d88c08325Tony Wickham */ 55bfbf7f9f4a0b300613f0ff27a4eb592d88c08325Tony Wickham public void removeShortcuts(List<ShortcutInfoCompat> shortcuts) { 56bfbf7f9f4a0b300613f0ff27a4eb592d88c08325Tony Wickham for (ShortcutInfoCompat shortcut : shortcuts) { 57bfbf7f9f4a0b300613f0ff27a4eb592d88c08325Tony Wickham ShortcutKey key = ShortcutKey.fromInfo(shortcut); 58bfbf7f9f4a0b300613f0ff27a4eb592d88c08325Tony Wickham mCachedShortcuts.remove(key); 591bce7fd342875be8f7c1f82c8cf21d0199c8d544Tony Wickham mPinnedShortcuts.remove(key); 60bfbf7f9f4a0b300613f0ff27a4eb592d88c08325Tony Wickham } 61bfbf7f9f4a0b300613f0ff27a4eb592d88c08325Tony Wickham } 62bfbf7f9f4a0b300613f0ff27a4eb592d88c08325Tony Wickham 63bfbf7f9f4a0b300613f0ff27a4eb592d88c08325Tony Wickham public ShortcutInfoCompat get(ShortcutKey key) { 64bfbf7f9f4a0b300613f0ff27a4eb592d88c08325Tony Wickham if (mPinnedShortcuts.containsKey(key)) { 65bfbf7f9f4a0b300613f0ff27a4eb592d88c08325Tony Wickham return mPinnedShortcuts.get(key); 66bfbf7f9f4a0b300613f0ff27a4eb592d88c08325Tony Wickham } 67bfbf7f9f4a0b300613f0ff27a4eb592d88c08325Tony Wickham return mCachedShortcuts.get(key); 68bfbf7f9f4a0b300613f0ff27a4eb592d88c08325Tony Wickham } 69bfbf7f9f4a0b300613f0ff27a4eb592d88c08325Tony Wickham 70bfbf7f9f4a0b300613f0ff27a4eb592d88c08325Tony Wickham public void put(ShortcutKey key, ShortcutInfoCompat shortcut) { 71bfbf7f9f4a0b300613f0ff27a4eb592d88c08325Tony Wickham if (shortcut.isPinned()) { 72bfbf7f9f4a0b300613f0ff27a4eb592d88c08325Tony Wickham mPinnedShortcuts.put(key, shortcut); 73bfbf7f9f4a0b300613f0ff27a4eb592d88c08325Tony Wickham } else { 74bfbf7f9f4a0b300613f0ff27a4eb592d88c08325Tony Wickham mCachedShortcuts.put(key, shortcut); 75bfbf7f9f4a0b300613f0ff27a4eb592d88c08325Tony Wickham } 76bfbf7f9f4a0b300613f0ff27a4eb592d88c08325Tony Wickham } 77bfbf7f9f4a0b300613f0ff27a4eb592d88c08325Tony Wickham} 78