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