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.content.ComponentName;
21bfbf7f9f4a0b300613f0ff27a4eb592d88c08325Tony Wickhamimport android.content.Context;
229994b2b171ab78d1d93e8a25086d6853f766e80fSunny Goyalimport android.content.pm.LauncherApps;
23bfbf7f9f4a0b300613f0ff27a4eb592d88c08325Tony Wickhamimport android.content.pm.LauncherApps.ShortcutQuery;
249994b2b171ab78d1d93e8a25086d6853f766e80fSunny Goyalimport android.content.pm.ShortcutInfo;
259994b2b171ab78d1d93e8a25086d6853f766e80fSunny Goyalimport android.graphics.Rect;
269994b2b171ab78d1d93e8a25086d6853f766e80fSunny Goyalimport android.graphics.drawable.Drawable;
279994b2b171ab78d1d93e8a25086d6853f766e80fSunny Goyalimport android.os.Bundle;
287c74e4ae641e76f73d74348e293c244a157f6585Sunny Goyalimport android.os.UserHandle;
29acd86ff4865323d3cf411b219b88ed084fb6fce3Tonyimport android.util.Log;
30bfbf7f9f4a0b300613f0ff27a4eb592d88c08325Tony Wickham
311bce7fd342875be8f7c1f82c8cf21d0199c8d544Tony Wickhamimport com.android.launcher3.ItemInfo;
321bce7fd342875be8f7c1f82c8cf21d0199c8d544Tony Wickhamimport com.android.launcher3.LauncherSettings;
339994b2b171ab78d1d93e8a25086d6853f766e80fSunny Goyalimport com.android.launcher3.Utilities;
34bfbf7f9f4a0b300613f0ff27a4eb592d88c08325Tony Wickham
35bfbf7f9f4a0b300613f0ff27a4eb592d88c08325Tony Wickhamimport java.util.ArrayList;
369994b2b171ab78d1d93e8a25086d6853f766e80fSunny Goyalimport java.util.Collections;
37bfbf7f9f4a0b300613f0ff27a4eb592d88c08325Tony Wickhamimport java.util.List;
38bfbf7f9f4a0b300613f0ff27a4eb592d88c08325Tony Wickham
39bfbf7f9f4a0b300613f0ff27a4eb592d88c08325Tony Wickham/**
40bfbf7f9f4a0b300613f0ff27a4eb592d88c08325Tony Wickham * Performs operations related to deep shortcuts, such as querying for them, pinning them, etc.
41bfbf7f9f4a0b300613f0ff27a4eb592d88c08325Tony Wickham */
42bfbf7f9f4a0b300613f0ff27a4eb592d88c08325Tony Wickhampublic class DeepShortcutManager {
43acd86ff4865323d3cf411b219b88ed084fb6fce3Tony    private static final String TAG = "DeepShortcutManager";
44bfbf7f9f4a0b300613f0ff27a4eb592d88c08325Tony Wickham
45b57c893db8c567ffeeb3c61f4fb3545c4a256441Sunny Goyal    private static final int FLAG_GET_ALL = ShortcutQuery.FLAG_MATCH_DYNAMIC
46b57c893db8c567ffeeb3c61f4fb3545c4a256441Sunny Goyal            | ShortcutQuery.FLAG_MATCH_MANIFEST | ShortcutQuery.FLAG_MATCH_PINNED;
479994b2b171ab78d1d93e8a25086d6853f766e80fSunny Goyal
48dde4fd971e825749686e7aa77379c65e410eea54Sunny Goyal    private static DeepShortcutManager sInstance;
49dde4fd971e825749686e7aa77379c65e410eea54Sunny Goyal    private static final Object sInstanceLock = new Object();
50dde4fd971e825749686e7aa77379c65e410eea54Sunny Goyal
51dde4fd971e825749686e7aa77379c65e410eea54Sunny Goyal    public static DeepShortcutManager getInstance(Context context) {
52dde4fd971e825749686e7aa77379c65e410eea54Sunny Goyal        synchronized (sInstanceLock) {
53dde4fd971e825749686e7aa77379c65e410eea54Sunny Goyal            if (sInstance == null) {
54dde4fd971e825749686e7aa77379c65e410eea54Sunny Goyal                sInstance = new DeepShortcutManager(context.getApplicationContext());
55dde4fd971e825749686e7aa77379c65e410eea54Sunny Goyal            }
56dde4fd971e825749686e7aa77379c65e410eea54Sunny Goyal            return sInstance;
57dde4fd971e825749686e7aa77379c65e410eea54Sunny Goyal        }
58dde4fd971e825749686e7aa77379c65e410eea54Sunny Goyal    }
59dde4fd971e825749686e7aa77379c65e410eea54Sunny Goyal
609994b2b171ab78d1d93e8a25086d6853f766e80fSunny Goyal    private final LauncherApps mLauncherApps;
61d82a39da1c61b19d2749725f9c70c3baf2dab6bfTony Wickham    private boolean mWasLastCallSuccess;
62bfbf7f9f4a0b300613f0ff27a4eb592d88c08325Tony Wickham
63dde4fd971e825749686e7aa77379c65e410eea54Sunny Goyal    private DeepShortcutManager(Context context) {
649994b2b171ab78d1d93e8a25086d6853f766e80fSunny Goyal        mLauncherApps = (LauncherApps) context.getSystemService(Context.LAUNCHER_APPS_SERVICE);
65bfbf7f9f4a0b300613f0ff27a4eb592d88c08325Tony Wickham    }
66bfbf7f9f4a0b300613f0ff27a4eb592d88c08325Tony Wickham
671bce7fd342875be8f7c1f82c8cf21d0199c8d544Tony Wickham    public static boolean supportsShortcuts(ItemInfo info) {
68869a97da73504a01a51771a7ef96a9380fcd2d12Tony        boolean isItemPromise = info instanceof com.android.launcher3.ShortcutInfo
698ff9e1d6790d64eb5f8ad9e9721e607978b50583Mario Bertschler                && ((com.android.launcher3.ShortcutInfo) info).hasPromiseIconUi();
703ff9047221820a01c6510503466f8c78b43fdc6dCharles He        return info.itemType == LauncherSettings.Favorites.ITEM_TYPE_APPLICATION
71869a97da73504a01a51771a7ef96a9380fcd2d12Tony                && !info.isDisabled() && !isItemPromise;
721bce7fd342875be8f7c1f82c8cf21d0199c8d544Tony Wickham    }
731bce7fd342875be8f7c1f82c8cf21d0199c8d544Tony Wickham
74d82a39da1c61b19d2749725f9c70c3baf2dab6bfTony Wickham    public boolean wasLastCallSuccess() {
75d82a39da1c61b19d2749725f9c70c3baf2dab6bfTony Wickham        return mWasLastCallSuccess;
76d82a39da1c61b19d2749725f9c70c3baf2dab6bfTony Wickham    }
77d82a39da1c61b19d2749725f9c70c3baf2dab6bfTony Wickham
78bfbf7f9f4a0b300613f0ff27a4eb592d88c08325Tony Wickham    public void onShortcutsChanged(List<ShortcutInfoCompat> shortcuts) {
79bfbf7f9f4a0b300613f0ff27a4eb592d88c08325Tony Wickham        // mShortcutCache.removeShortcuts(shortcuts);
80bfbf7f9f4a0b300613f0ff27a4eb592d88c08325Tony Wickham    }
81bfbf7f9f4a0b300613f0ff27a4eb592d88c08325Tony Wickham
82bfbf7f9f4a0b300613f0ff27a4eb592d88c08325Tony Wickham    /**
83bfbf7f9f4a0b300613f0ff27a4eb592d88c08325Tony Wickham     * Queries for the shortcuts with the package name and provided ids.
84bfbf7f9f4a0b300613f0ff27a4eb592d88c08325Tony Wickham     *
85bfbf7f9f4a0b300613f0ff27a4eb592d88c08325Tony Wickham     * This method is intended to get the full details for shortcuts when they are added or updated,
86bfbf7f9f4a0b300613f0ff27a4eb592d88c08325Tony Wickham     * because we only get "key" fields in onShortcutsChanged().
87bfbf7f9f4a0b300613f0ff27a4eb592d88c08325Tony Wickham     */
88bfbf7f9f4a0b300613f0ff27a4eb592d88c08325Tony Wickham    public List<ShortcutInfoCompat> queryForFullDetails(String packageName,
897c74e4ae641e76f73d74348e293c244a157f6585Sunny Goyal            List<String> shortcutIds, UserHandle user) {
90bfbf7f9f4a0b300613f0ff27a4eb592d88c08325Tony Wickham        return query(FLAG_GET_ALL, packageName, null, shortcutIds, user);
91bfbf7f9f4a0b300613f0ff27a4eb592d88c08325Tony Wickham    }
92bfbf7f9f4a0b300613f0ff27a4eb592d88c08325Tony Wickham
93bfbf7f9f4a0b300613f0ff27a4eb592d88c08325Tony Wickham    /**
942c99d2ceebd1a6b6fed2b71105b8fdf88ef26a33Tony Wickham     * Gets all the manifest and dynamic shortcuts associated with the given package and user,
952c99d2ceebd1a6b6fed2b71105b8fdf88ef26a33Tony Wickham     * to be displayed in the shortcuts container on long press.
96bfbf7f9f4a0b300613f0ff27a4eb592d88c08325Tony Wickham     */
972c99d2ceebd1a6b6fed2b71105b8fdf88ef26a33Tony Wickham    public List<ShortcutInfoCompat> queryForShortcutsContainer(ComponentName activity,
987c74e4ae641e76f73d74348e293c244a157f6585Sunny Goyal            List<String> ids, UserHandle user) {
99b57c893db8c567ffeeb3c61f4fb3545c4a256441Sunny Goyal        return query(ShortcutQuery.FLAG_MATCH_MANIFEST | ShortcutQuery.FLAG_MATCH_DYNAMIC,
1002c99d2ceebd1a6b6fed2b71105b8fdf88ef26a33Tony Wickham                activity.getPackageName(), activity, ids, user);
101bfbf7f9f4a0b300613f0ff27a4eb592d88c08325Tony Wickham    }
102bfbf7f9f4a0b300613f0ff27a4eb592d88c08325Tony Wickham
103bfbf7f9f4a0b300613f0ff27a4eb592d88c08325Tony Wickham    /**
104bfbf7f9f4a0b300613f0ff27a4eb592d88c08325Tony Wickham     * Removes the given shortcut from the current list of pinned shortcuts.
105bfbf7f9f4a0b300613f0ff27a4eb592d88c08325Tony Wickham     * (Runs on background thread)
106bfbf7f9f4a0b300613f0ff27a4eb592d88c08325Tony Wickham     */
1079994b2b171ab78d1d93e8a25086d6853f766e80fSunny Goyal    @TargetApi(25)
108bfbf7f9f4a0b300613f0ff27a4eb592d88c08325Tony Wickham    public void unpinShortcut(final ShortcutKey key) {
109f5e3744637db1598c389e62450627b2548f8f517Sunny Goyal        if (Utilities.ATLEAST_NOUGAT_MR1) {
1109994b2b171ab78d1d93e8a25086d6853f766e80fSunny Goyal            String packageName = key.componentName.getPackageName();
111d3b87ef1963fb96177ca85bcd6a25879e27e419cSunny Goyal            String id = key.getId();
1127c74e4ae641e76f73d74348e293c244a157f6585Sunny Goyal            UserHandle user = key.user;
1139994b2b171ab78d1d93e8a25086d6853f766e80fSunny Goyal            List<String> pinnedIds = extractIds(queryForPinnedShortcuts(packageName, user));
1149994b2b171ab78d1d93e8a25086d6853f766e80fSunny Goyal            pinnedIds.remove(id);
115acd86ff4865323d3cf411b219b88ed084fb6fce3Tony            try {
1167c74e4ae641e76f73d74348e293c244a157f6585Sunny Goyal                mLauncherApps.pinShortcuts(packageName, pinnedIds, user);
117d82a39da1c61b19d2749725f9c70c3baf2dab6bfTony Wickham                mWasLastCallSuccess = true;
11849f4f03dc8ed3925e80d379634e43eb24eea25b9Sunny Goyal            } catch (SecurityException|IllegalStateException e) {
119d82a39da1c61b19d2749725f9c70c3baf2dab6bfTony Wickham                Log.w(TAG, "Failed to unpin shortcut", e);
120d82a39da1c61b19d2749725f9c70c3baf2dab6bfTony Wickham                mWasLastCallSuccess = false;
121acd86ff4865323d3cf411b219b88ed084fb6fce3Tony            }
1229994b2b171ab78d1d93e8a25086d6853f766e80fSunny Goyal        }
123bfbf7f9f4a0b300613f0ff27a4eb592d88c08325Tony Wickham    }
124bfbf7f9f4a0b300613f0ff27a4eb592d88c08325Tony Wickham
125bfbf7f9f4a0b300613f0ff27a4eb592d88c08325Tony Wickham    /**
126bfbf7f9f4a0b300613f0ff27a4eb592d88c08325Tony Wickham     * Adds the given shortcut to the current list of pinned shortcuts.
127bfbf7f9f4a0b300613f0ff27a4eb592d88c08325Tony Wickham     * (Runs on background thread)
128bfbf7f9f4a0b300613f0ff27a4eb592d88c08325Tony Wickham     */
1299994b2b171ab78d1d93e8a25086d6853f766e80fSunny Goyal    @TargetApi(25)
130bfbf7f9f4a0b300613f0ff27a4eb592d88c08325Tony Wickham    public void pinShortcut(final ShortcutKey key) {
131f5e3744637db1598c389e62450627b2548f8f517Sunny Goyal        if (Utilities.ATLEAST_NOUGAT_MR1) {
1329994b2b171ab78d1d93e8a25086d6853f766e80fSunny Goyal            String packageName = key.componentName.getPackageName();
133d3b87ef1963fb96177ca85bcd6a25879e27e419cSunny Goyal            String id = key.getId();
1347c74e4ae641e76f73d74348e293c244a157f6585Sunny Goyal            UserHandle user = key.user;
1359994b2b171ab78d1d93e8a25086d6853f766e80fSunny Goyal            List<String> pinnedIds = extractIds(queryForPinnedShortcuts(packageName, user));
1369994b2b171ab78d1d93e8a25086d6853f766e80fSunny Goyal            pinnedIds.add(id);
137acd86ff4865323d3cf411b219b88ed084fb6fce3Tony            try {
1387c74e4ae641e76f73d74348e293c244a157f6585Sunny Goyal                mLauncherApps.pinShortcuts(packageName, pinnedIds, user);
139d82a39da1c61b19d2749725f9c70c3baf2dab6bfTony Wickham                mWasLastCallSuccess = true;
14049f4f03dc8ed3925e80d379634e43eb24eea25b9Sunny Goyal            } catch (SecurityException|IllegalStateException e) {
141d82a39da1c61b19d2749725f9c70c3baf2dab6bfTony Wickham                Log.w(TAG, "Failed to pin shortcut", e);
142d82a39da1c61b19d2749725f9c70c3baf2dab6bfTony Wickham                mWasLastCallSuccess = false;
143acd86ff4865323d3cf411b219b88ed084fb6fce3Tony            }
1449994b2b171ab78d1d93e8a25086d6853f766e80fSunny Goyal        }
1459994b2b171ab78d1d93e8a25086d6853f766e80fSunny Goyal    }
1469994b2b171ab78d1d93e8a25086d6853f766e80fSunny Goyal
1479994b2b171ab78d1d93e8a25086d6853f766e80fSunny Goyal    @TargetApi(25)
1489994b2b171ab78d1d93e8a25086d6853f766e80fSunny Goyal    public void startShortcut(String packageName, String id, Rect sourceBounds,
1497c74e4ae641e76f73d74348e293c244a157f6585Sunny Goyal          Bundle startActivityOptions, UserHandle user) {
150f5e3744637db1598c389e62450627b2548f8f517Sunny Goyal        if (Utilities.ATLEAST_NOUGAT_MR1) {
151acd86ff4865323d3cf411b219b88ed084fb6fce3Tony            try {
152d82a39da1c61b19d2749725f9c70c3baf2dab6bfTony Wickham                mLauncherApps.startShortcut(packageName, id, sourceBounds,
1537c74e4ae641e76f73d74348e293c244a157f6585Sunny Goyal                        startActivityOptions, user);
154d82a39da1c61b19d2749725f9c70c3baf2dab6bfTony Wickham                mWasLastCallSuccess = true;
15549f4f03dc8ed3925e80d379634e43eb24eea25b9Sunny Goyal            } catch (SecurityException|IllegalStateException e) {
156d82a39da1c61b19d2749725f9c70c3baf2dab6bfTony Wickham                Log.e(TAG, "Failed to start shortcut", e);
157d82a39da1c61b19d2749725f9c70c3baf2dab6bfTony Wickham                mWasLastCallSuccess = false;
158acd86ff4865323d3cf411b219b88ed084fb6fce3Tony            }
1599994b2b171ab78d1d93e8a25086d6853f766e80fSunny Goyal        }
1609994b2b171ab78d1d93e8a25086d6853f766e80fSunny Goyal    }
1619994b2b171ab78d1d93e8a25086d6853f766e80fSunny Goyal
1629994b2b171ab78d1d93e8a25086d6853f766e80fSunny Goyal    @TargetApi(25)
1639994b2b171ab78d1d93e8a25086d6853f766e80fSunny Goyal    public Drawable getShortcutIconDrawable(ShortcutInfoCompat shortcutInfo, int density) {
164f5e3744637db1598c389e62450627b2548f8f517Sunny Goyal        if (Utilities.ATLEAST_NOUGAT_MR1) {
165acd86ff4865323d3cf411b219b88ed084fb6fce3Tony            try {
166d82a39da1c61b19d2749725f9c70c3baf2dab6bfTony Wickham                Drawable icon = mLauncherApps.getShortcutIconDrawable(
167d82a39da1c61b19d2749725f9c70c3baf2dab6bfTony Wickham                        shortcutInfo.getShortcutInfo(), density);
168d82a39da1c61b19d2749725f9c70c3baf2dab6bfTony Wickham                mWasLastCallSuccess = true;
169d82a39da1c61b19d2749725f9c70c3baf2dab6bfTony Wickham                return icon;
17049f4f03dc8ed3925e80d379634e43eb24eea25b9Sunny Goyal            } catch (SecurityException|IllegalStateException e) {
171d82a39da1c61b19d2749725f9c70c3baf2dab6bfTony Wickham                Log.e(TAG, "Failed to get shortcut icon", e);
172d82a39da1c61b19d2749725f9c70c3baf2dab6bfTony Wickham                mWasLastCallSuccess = false;
173acd86ff4865323d3cf411b219b88ed084fb6fce3Tony            }
174acd86ff4865323d3cf411b219b88ed084fb6fce3Tony        }
175acd86ff4865323d3cf411b219b88ed084fb6fce3Tony        return null;
176bfbf7f9f4a0b300613f0ff27a4eb592d88c08325Tony Wickham    }
177bfbf7f9f4a0b300613f0ff27a4eb592d88c08325Tony Wickham
178bfbf7f9f4a0b300613f0ff27a4eb592d88c08325Tony Wickham    /**
179bfbf7f9f4a0b300613f0ff27a4eb592d88c08325Tony Wickham     * Returns the id's of pinned shortcuts associated with the given package and user.
180bfbf7f9f4a0b300613f0ff27a4eb592d88c08325Tony Wickham     *
181bfbf7f9f4a0b300613f0ff27a4eb592d88c08325Tony Wickham     * If packageName is null, returns all pinned shortcuts regardless of package.
182bfbf7f9f4a0b300613f0ff27a4eb592d88c08325Tony Wickham     */
1837c74e4ae641e76f73d74348e293c244a157f6585Sunny Goyal    public List<ShortcutInfoCompat> queryForPinnedShortcuts(String packageName, UserHandle user) {
184b57c893db8c567ffeeb3c61f4fb3545c4a256441Sunny Goyal        return query(ShortcutQuery.FLAG_MATCH_PINNED, packageName, null, null, user);
185bfbf7f9f4a0b300613f0ff27a4eb592d88c08325Tony Wickham    }
186bfbf7f9f4a0b300613f0ff27a4eb592d88c08325Tony Wickham
1877c74e4ae641e76f73d74348e293c244a157f6585Sunny Goyal    public List<ShortcutInfoCompat> queryForAllShortcuts(UserHandle user) {
188bfbf7f9f4a0b300613f0ff27a4eb592d88c08325Tony Wickham        return query(FLAG_GET_ALL, null, null, null, user);
189bfbf7f9f4a0b300613f0ff27a4eb592d88c08325Tony Wickham    }
190bfbf7f9f4a0b300613f0ff27a4eb592d88c08325Tony Wickham
191bfbf7f9f4a0b300613f0ff27a4eb592d88c08325Tony Wickham    private List<String> extractIds(List<ShortcutInfoCompat> shortcuts) {
192bfbf7f9f4a0b300613f0ff27a4eb592d88c08325Tony Wickham        List<String> shortcutIds = new ArrayList<>(shortcuts.size());
193bfbf7f9f4a0b300613f0ff27a4eb592d88c08325Tony Wickham        for (ShortcutInfoCompat shortcut : shortcuts) {
194bfbf7f9f4a0b300613f0ff27a4eb592d88c08325Tony Wickham            shortcutIds.add(shortcut.getId());
195bfbf7f9f4a0b300613f0ff27a4eb592d88c08325Tony Wickham        }
196bfbf7f9f4a0b300613f0ff27a4eb592d88c08325Tony Wickham        return shortcutIds;
197bfbf7f9f4a0b300613f0ff27a4eb592d88c08325Tony Wickham    }
198bfbf7f9f4a0b300613f0ff27a4eb592d88c08325Tony Wickham
199bfbf7f9f4a0b300613f0ff27a4eb592d88c08325Tony Wickham    /**
200bfbf7f9f4a0b300613f0ff27a4eb592d88c08325Tony Wickham     * Query the system server for all the shortcuts matching the given parameters.
201bfbf7f9f4a0b300613f0ff27a4eb592d88c08325Tony Wickham     * If packageName == null, we query for all shortcuts with the passed flags, regardless of app.
202bfbf7f9f4a0b300613f0ff27a4eb592d88c08325Tony Wickham     *
203bfbf7f9f4a0b300613f0ff27a4eb592d88c08325Tony Wickham     * TODO: Use the cache to optimize this so we don't make an RPC every time.
204bfbf7f9f4a0b300613f0ff27a4eb592d88c08325Tony Wickham     */
2059994b2b171ab78d1d93e8a25086d6853f766e80fSunny Goyal    @TargetApi(25)
206bfbf7f9f4a0b300613f0ff27a4eb592d88c08325Tony Wickham    private List<ShortcutInfoCompat> query(int flags, String packageName,
2077c74e4ae641e76f73d74348e293c244a157f6585Sunny Goyal            ComponentName activity, List<String> shortcutIds, UserHandle user) {
208f5e3744637db1598c389e62450627b2548f8f517Sunny Goyal        if (Utilities.ATLEAST_NOUGAT_MR1) {
2099994b2b171ab78d1d93e8a25086d6853f766e80fSunny Goyal            ShortcutQuery q = new ShortcutQuery();
2109994b2b171ab78d1d93e8a25086d6853f766e80fSunny Goyal            q.setQueryFlags(flags);
2119994b2b171ab78d1d93e8a25086d6853f766e80fSunny Goyal            if (packageName != null) {
2129994b2b171ab78d1d93e8a25086d6853f766e80fSunny Goyal                q.setPackage(packageName);
2139994b2b171ab78d1d93e8a25086d6853f766e80fSunny Goyal                q.setActivity(activity);
2149994b2b171ab78d1d93e8a25086d6853f766e80fSunny Goyal                q.setShortcutIds(shortcutIds);
2159994b2b171ab78d1d93e8a25086d6853f766e80fSunny Goyal            }
216acd86ff4865323d3cf411b219b88ed084fb6fce3Tony            List<ShortcutInfo> shortcutInfos = null;
217acd86ff4865323d3cf411b219b88ed084fb6fce3Tony            try {
2187c74e4ae641e76f73d74348e293c244a157f6585Sunny Goyal                shortcutInfos = mLauncherApps.getShortcuts(q, user);
219d82a39da1c61b19d2749725f9c70c3baf2dab6bfTony Wickham                mWasLastCallSuccess = true;
22049f4f03dc8ed3925e80d379634e43eb24eea25b9Sunny Goyal            } catch (SecurityException|IllegalStateException e) {
221d82a39da1c61b19d2749725f9c70c3baf2dab6bfTony Wickham                Log.e(TAG, "Failed to query for shortcuts", e);
222d82a39da1c61b19d2749725f9c70c3baf2dab6bfTony Wickham                mWasLastCallSuccess = false;
223acd86ff4865323d3cf411b219b88ed084fb6fce3Tony            }
2249994b2b171ab78d1d93e8a25086d6853f766e80fSunny Goyal            if (shortcutInfos == null) {
2259994b2b171ab78d1d93e8a25086d6853f766e80fSunny Goyal                return Collections.EMPTY_LIST;
2269994b2b171ab78d1d93e8a25086d6853f766e80fSunny Goyal            }
2279994b2b171ab78d1d93e8a25086d6853f766e80fSunny Goyal            List<ShortcutInfoCompat> shortcutInfoCompats = new ArrayList<>(shortcutInfos.size());
2289994b2b171ab78d1d93e8a25086d6853f766e80fSunny Goyal            for (ShortcutInfo shortcutInfo : shortcutInfos) {
2299994b2b171ab78d1d93e8a25086d6853f766e80fSunny Goyal                shortcutInfoCompats.add(new ShortcutInfoCompat(shortcutInfo));
2309994b2b171ab78d1d93e8a25086d6853f766e80fSunny Goyal            }
2319994b2b171ab78d1d93e8a25086d6853f766e80fSunny Goyal            return shortcutInfoCompats;
2329994b2b171ab78d1d93e8a25086d6853f766e80fSunny Goyal        } else {
2339994b2b171ab78d1d93e8a25086d6853f766e80fSunny Goyal            return Collections.EMPTY_LIST;
234bfbf7f9f4a0b300613f0ff27a4eb592d88c08325Tony Wickham        }
235bfbf7f9f4a0b300613f0ff27a4eb592d88c08325Tony Wickham    }
23695f3d6ba2ca02a9841487777cfff43fb9df65ec7Sunny Goyal
23795f3d6ba2ca02a9841487777cfff43fb9df65ec7Sunny Goyal    @TargetApi(25)
23895f3d6ba2ca02a9841487777cfff43fb9df65ec7Sunny Goyal    public boolean hasHostPermission() {
239f5e3744637db1598c389e62450627b2548f8f517Sunny Goyal        if (Utilities.ATLEAST_NOUGAT_MR1) {
24095f3d6ba2ca02a9841487777cfff43fb9df65ec7Sunny Goyal            try {
24195f3d6ba2ca02a9841487777cfff43fb9df65ec7Sunny Goyal                return mLauncherApps.hasShortcutHostPermission();
24295f3d6ba2ca02a9841487777cfff43fb9df65ec7Sunny Goyal            } catch (SecurityException|IllegalStateException e) {
24395f3d6ba2ca02a9841487777cfff43fb9df65ec7Sunny Goyal                Log.e(TAG, "Failed to make shortcut manager call", e);
24495f3d6ba2ca02a9841487777cfff43fb9df65ec7Sunny Goyal            }
24595f3d6ba2ca02a9841487777cfff43fb9df65ec7Sunny Goyal        }
24695f3d6ba2ca02a9841487777cfff43fb9df65ec7Sunny Goyal        return false;
24795f3d6ba2ca02a9841487777cfff43fb9df65ec7Sunny Goyal    }
248bfbf7f9f4a0b300613f0ff27a4eb592d88c08325Tony Wickham}
249