DeepShortcutManager.java revision 7c74e4ae641e76f73d74348e293c244a157f6585
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) { 687b8f1eaba147ac42a347f3787d0e90b24be015dbTony Wickham return info.itemType == LauncherSettings.Favorites.ITEM_TYPE_APPLICATION; 691bce7fd342875be8f7c1f82c8cf21d0199c8d544Tony Wickham } 701bce7fd342875be8f7c1f82c8cf21d0199c8d544Tony Wickham 71d82a39da1c61b19d2749725f9c70c3baf2dab6bfTony Wickham public boolean wasLastCallSuccess() { 72d82a39da1c61b19d2749725f9c70c3baf2dab6bfTony Wickham return mWasLastCallSuccess; 73d82a39da1c61b19d2749725f9c70c3baf2dab6bfTony Wickham } 74d82a39da1c61b19d2749725f9c70c3baf2dab6bfTony Wickham 75bfbf7f9f4a0b300613f0ff27a4eb592d88c08325Tony Wickham public void onShortcutsChanged(List<ShortcutInfoCompat> shortcuts) { 76bfbf7f9f4a0b300613f0ff27a4eb592d88c08325Tony Wickham // mShortcutCache.removeShortcuts(shortcuts); 77bfbf7f9f4a0b300613f0ff27a4eb592d88c08325Tony Wickham } 78bfbf7f9f4a0b300613f0ff27a4eb592d88c08325Tony Wickham 79bfbf7f9f4a0b300613f0ff27a4eb592d88c08325Tony Wickham /** 80bfbf7f9f4a0b300613f0ff27a4eb592d88c08325Tony Wickham * Queries for the shortcuts with the package name and provided ids. 81bfbf7f9f4a0b300613f0ff27a4eb592d88c08325Tony Wickham * 82bfbf7f9f4a0b300613f0ff27a4eb592d88c08325Tony Wickham * This method is intended to get the full details for shortcuts when they are added or updated, 83bfbf7f9f4a0b300613f0ff27a4eb592d88c08325Tony Wickham * because we only get "key" fields in onShortcutsChanged(). 84bfbf7f9f4a0b300613f0ff27a4eb592d88c08325Tony Wickham */ 85bfbf7f9f4a0b300613f0ff27a4eb592d88c08325Tony Wickham public List<ShortcutInfoCompat> queryForFullDetails(String packageName, 867c74e4ae641e76f73d74348e293c244a157f6585Sunny Goyal List<String> shortcutIds, UserHandle user) { 87bfbf7f9f4a0b300613f0ff27a4eb592d88c08325Tony Wickham return query(FLAG_GET_ALL, packageName, null, shortcutIds, user); 88bfbf7f9f4a0b300613f0ff27a4eb592d88c08325Tony Wickham } 89bfbf7f9f4a0b300613f0ff27a4eb592d88c08325Tony Wickham 90bfbf7f9f4a0b300613f0ff27a4eb592d88c08325Tony Wickham /** 912c99d2ceebd1a6b6fed2b71105b8fdf88ef26a33Tony Wickham * Gets all the manifest and dynamic shortcuts associated with the given package and user, 922c99d2ceebd1a6b6fed2b71105b8fdf88ef26a33Tony Wickham * to be displayed in the shortcuts container on long press. 93bfbf7f9f4a0b300613f0ff27a4eb592d88c08325Tony Wickham */ 942c99d2ceebd1a6b6fed2b71105b8fdf88ef26a33Tony Wickham public List<ShortcutInfoCompat> queryForShortcutsContainer(ComponentName activity, 957c74e4ae641e76f73d74348e293c244a157f6585Sunny Goyal List<String> ids, UserHandle user) { 96b57c893db8c567ffeeb3c61f4fb3545c4a256441Sunny Goyal return query(ShortcutQuery.FLAG_MATCH_MANIFEST | ShortcutQuery.FLAG_MATCH_DYNAMIC, 972c99d2ceebd1a6b6fed2b71105b8fdf88ef26a33Tony Wickham activity.getPackageName(), activity, ids, user); 98bfbf7f9f4a0b300613f0ff27a4eb592d88c08325Tony Wickham } 99bfbf7f9f4a0b300613f0ff27a4eb592d88c08325Tony Wickham 100bfbf7f9f4a0b300613f0ff27a4eb592d88c08325Tony Wickham /** 101bfbf7f9f4a0b300613f0ff27a4eb592d88c08325Tony Wickham * Removes the given shortcut from the current list of pinned shortcuts. 102bfbf7f9f4a0b300613f0ff27a4eb592d88c08325Tony Wickham * (Runs on background thread) 103bfbf7f9f4a0b300613f0ff27a4eb592d88c08325Tony Wickham */ 1049994b2b171ab78d1d93e8a25086d6853f766e80fSunny Goyal @TargetApi(25) 105bfbf7f9f4a0b300613f0ff27a4eb592d88c08325Tony Wickham public void unpinShortcut(final ShortcutKey key) { 106f5e3744637db1598c389e62450627b2548f8f517Sunny Goyal if (Utilities.ATLEAST_NOUGAT_MR1) { 1079994b2b171ab78d1d93e8a25086d6853f766e80fSunny Goyal String packageName = key.componentName.getPackageName(); 108d3b87ef1963fb96177ca85bcd6a25879e27e419cSunny Goyal String id = key.getId(); 1097c74e4ae641e76f73d74348e293c244a157f6585Sunny Goyal UserHandle user = key.user; 1109994b2b171ab78d1d93e8a25086d6853f766e80fSunny Goyal List<String> pinnedIds = extractIds(queryForPinnedShortcuts(packageName, user)); 1119994b2b171ab78d1d93e8a25086d6853f766e80fSunny Goyal pinnedIds.remove(id); 112acd86ff4865323d3cf411b219b88ed084fb6fce3Tony try { 1137c74e4ae641e76f73d74348e293c244a157f6585Sunny Goyal mLauncherApps.pinShortcuts(packageName, pinnedIds, user); 114d82a39da1c61b19d2749725f9c70c3baf2dab6bfTony Wickham mWasLastCallSuccess = true; 11549f4f03dc8ed3925e80d379634e43eb24eea25b9Sunny Goyal } catch (SecurityException|IllegalStateException e) { 116d82a39da1c61b19d2749725f9c70c3baf2dab6bfTony Wickham Log.w(TAG, "Failed to unpin shortcut", e); 117d82a39da1c61b19d2749725f9c70c3baf2dab6bfTony Wickham mWasLastCallSuccess = false; 118acd86ff4865323d3cf411b219b88ed084fb6fce3Tony } 1199994b2b171ab78d1d93e8a25086d6853f766e80fSunny Goyal } 120bfbf7f9f4a0b300613f0ff27a4eb592d88c08325Tony Wickham } 121bfbf7f9f4a0b300613f0ff27a4eb592d88c08325Tony Wickham 122bfbf7f9f4a0b300613f0ff27a4eb592d88c08325Tony Wickham /** 123bfbf7f9f4a0b300613f0ff27a4eb592d88c08325Tony Wickham * Adds the given shortcut to the current list of pinned shortcuts. 124bfbf7f9f4a0b300613f0ff27a4eb592d88c08325Tony Wickham * (Runs on background thread) 125bfbf7f9f4a0b300613f0ff27a4eb592d88c08325Tony Wickham */ 1269994b2b171ab78d1d93e8a25086d6853f766e80fSunny Goyal @TargetApi(25) 127bfbf7f9f4a0b300613f0ff27a4eb592d88c08325Tony Wickham public void pinShortcut(final ShortcutKey key) { 128f5e3744637db1598c389e62450627b2548f8f517Sunny Goyal if (Utilities.ATLEAST_NOUGAT_MR1) { 1299994b2b171ab78d1d93e8a25086d6853f766e80fSunny Goyal String packageName = key.componentName.getPackageName(); 130d3b87ef1963fb96177ca85bcd6a25879e27e419cSunny Goyal String id = key.getId(); 1317c74e4ae641e76f73d74348e293c244a157f6585Sunny Goyal UserHandle user = key.user; 1329994b2b171ab78d1d93e8a25086d6853f766e80fSunny Goyal List<String> pinnedIds = extractIds(queryForPinnedShortcuts(packageName, user)); 1339994b2b171ab78d1d93e8a25086d6853f766e80fSunny Goyal pinnedIds.add(id); 134acd86ff4865323d3cf411b219b88ed084fb6fce3Tony try { 1357c74e4ae641e76f73d74348e293c244a157f6585Sunny Goyal mLauncherApps.pinShortcuts(packageName, pinnedIds, user); 136d82a39da1c61b19d2749725f9c70c3baf2dab6bfTony Wickham mWasLastCallSuccess = true; 13749f4f03dc8ed3925e80d379634e43eb24eea25b9Sunny Goyal } catch (SecurityException|IllegalStateException e) { 138d82a39da1c61b19d2749725f9c70c3baf2dab6bfTony Wickham Log.w(TAG, "Failed to pin shortcut", e); 139d82a39da1c61b19d2749725f9c70c3baf2dab6bfTony Wickham mWasLastCallSuccess = false; 140acd86ff4865323d3cf411b219b88ed084fb6fce3Tony } 1419994b2b171ab78d1d93e8a25086d6853f766e80fSunny Goyal } 1429994b2b171ab78d1d93e8a25086d6853f766e80fSunny Goyal } 1439994b2b171ab78d1d93e8a25086d6853f766e80fSunny Goyal 1449994b2b171ab78d1d93e8a25086d6853f766e80fSunny Goyal @TargetApi(25) 1459994b2b171ab78d1d93e8a25086d6853f766e80fSunny Goyal public void startShortcut(String packageName, String id, Rect sourceBounds, 1467c74e4ae641e76f73d74348e293c244a157f6585Sunny Goyal Bundle startActivityOptions, UserHandle user) { 147f5e3744637db1598c389e62450627b2548f8f517Sunny Goyal if (Utilities.ATLEAST_NOUGAT_MR1) { 148acd86ff4865323d3cf411b219b88ed084fb6fce3Tony try { 149d82a39da1c61b19d2749725f9c70c3baf2dab6bfTony Wickham mLauncherApps.startShortcut(packageName, id, sourceBounds, 1507c74e4ae641e76f73d74348e293c244a157f6585Sunny Goyal startActivityOptions, user); 151d82a39da1c61b19d2749725f9c70c3baf2dab6bfTony Wickham mWasLastCallSuccess = true; 15249f4f03dc8ed3925e80d379634e43eb24eea25b9Sunny Goyal } catch (SecurityException|IllegalStateException e) { 153d82a39da1c61b19d2749725f9c70c3baf2dab6bfTony Wickham Log.e(TAG, "Failed to start shortcut", e); 154d82a39da1c61b19d2749725f9c70c3baf2dab6bfTony Wickham mWasLastCallSuccess = false; 155acd86ff4865323d3cf411b219b88ed084fb6fce3Tony } 1569994b2b171ab78d1d93e8a25086d6853f766e80fSunny Goyal } 1579994b2b171ab78d1d93e8a25086d6853f766e80fSunny Goyal } 1589994b2b171ab78d1d93e8a25086d6853f766e80fSunny Goyal 1599994b2b171ab78d1d93e8a25086d6853f766e80fSunny Goyal @TargetApi(25) 1609994b2b171ab78d1d93e8a25086d6853f766e80fSunny Goyal public Drawable getShortcutIconDrawable(ShortcutInfoCompat shortcutInfo, int density) { 161f5e3744637db1598c389e62450627b2548f8f517Sunny Goyal if (Utilities.ATLEAST_NOUGAT_MR1) { 162acd86ff4865323d3cf411b219b88ed084fb6fce3Tony try { 163d82a39da1c61b19d2749725f9c70c3baf2dab6bfTony Wickham Drawable icon = mLauncherApps.getShortcutIconDrawable( 164d82a39da1c61b19d2749725f9c70c3baf2dab6bfTony Wickham shortcutInfo.getShortcutInfo(), density); 165d82a39da1c61b19d2749725f9c70c3baf2dab6bfTony Wickham mWasLastCallSuccess = true; 166d82a39da1c61b19d2749725f9c70c3baf2dab6bfTony Wickham return icon; 16749f4f03dc8ed3925e80d379634e43eb24eea25b9Sunny Goyal } catch (SecurityException|IllegalStateException e) { 168d82a39da1c61b19d2749725f9c70c3baf2dab6bfTony Wickham Log.e(TAG, "Failed to get shortcut icon", e); 169d82a39da1c61b19d2749725f9c70c3baf2dab6bfTony Wickham mWasLastCallSuccess = false; 170acd86ff4865323d3cf411b219b88ed084fb6fce3Tony } 171acd86ff4865323d3cf411b219b88ed084fb6fce3Tony } 172acd86ff4865323d3cf411b219b88ed084fb6fce3Tony return null; 173bfbf7f9f4a0b300613f0ff27a4eb592d88c08325Tony Wickham } 174bfbf7f9f4a0b300613f0ff27a4eb592d88c08325Tony Wickham 175bfbf7f9f4a0b300613f0ff27a4eb592d88c08325Tony Wickham /** 176bfbf7f9f4a0b300613f0ff27a4eb592d88c08325Tony Wickham * Returns the id's of pinned shortcuts associated with the given package and user. 177bfbf7f9f4a0b300613f0ff27a4eb592d88c08325Tony Wickham * 178bfbf7f9f4a0b300613f0ff27a4eb592d88c08325Tony Wickham * If packageName is null, returns all pinned shortcuts regardless of package. 179bfbf7f9f4a0b300613f0ff27a4eb592d88c08325Tony Wickham */ 1807c74e4ae641e76f73d74348e293c244a157f6585Sunny Goyal public List<ShortcutInfoCompat> queryForPinnedShortcuts(String packageName, UserHandle user) { 181b57c893db8c567ffeeb3c61f4fb3545c4a256441Sunny Goyal return query(ShortcutQuery.FLAG_MATCH_PINNED, packageName, null, null, user); 182bfbf7f9f4a0b300613f0ff27a4eb592d88c08325Tony Wickham } 183bfbf7f9f4a0b300613f0ff27a4eb592d88c08325Tony Wickham 1847c74e4ae641e76f73d74348e293c244a157f6585Sunny Goyal public List<ShortcutInfoCompat> queryForAllShortcuts(UserHandle user) { 185bfbf7f9f4a0b300613f0ff27a4eb592d88c08325Tony Wickham return query(FLAG_GET_ALL, null, null, null, user); 186bfbf7f9f4a0b300613f0ff27a4eb592d88c08325Tony Wickham } 187bfbf7f9f4a0b300613f0ff27a4eb592d88c08325Tony Wickham 188bfbf7f9f4a0b300613f0ff27a4eb592d88c08325Tony Wickham private List<String> extractIds(List<ShortcutInfoCompat> shortcuts) { 189bfbf7f9f4a0b300613f0ff27a4eb592d88c08325Tony Wickham List<String> shortcutIds = new ArrayList<>(shortcuts.size()); 190bfbf7f9f4a0b300613f0ff27a4eb592d88c08325Tony Wickham for (ShortcutInfoCompat shortcut : shortcuts) { 191bfbf7f9f4a0b300613f0ff27a4eb592d88c08325Tony Wickham shortcutIds.add(shortcut.getId()); 192bfbf7f9f4a0b300613f0ff27a4eb592d88c08325Tony Wickham } 193bfbf7f9f4a0b300613f0ff27a4eb592d88c08325Tony Wickham return shortcutIds; 194bfbf7f9f4a0b300613f0ff27a4eb592d88c08325Tony Wickham } 195bfbf7f9f4a0b300613f0ff27a4eb592d88c08325Tony Wickham 196bfbf7f9f4a0b300613f0ff27a4eb592d88c08325Tony Wickham /** 197bfbf7f9f4a0b300613f0ff27a4eb592d88c08325Tony Wickham * Query the system server for all the shortcuts matching the given parameters. 198bfbf7f9f4a0b300613f0ff27a4eb592d88c08325Tony Wickham * If packageName == null, we query for all shortcuts with the passed flags, regardless of app. 199bfbf7f9f4a0b300613f0ff27a4eb592d88c08325Tony Wickham * 200bfbf7f9f4a0b300613f0ff27a4eb592d88c08325Tony Wickham * TODO: Use the cache to optimize this so we don't make an RPC every time. 201bfbf7f9f4a0b300613f0ff27a4eb592d88c08325Tony Wickham */ 2029994b2b171ab78d1d93e8a25086d6853f766e80fSunny Goyal @TargetApi(25) 203bfbf7f9f4a0b300613f0ff27a4eb592d88c08325Tony Wickham private List<ShortcutInfoCompat> query(int flags, String packageName, 2047c74e4ae641e76f73d74348e293c244a157f6585Sunny Goyal ComponentName activity, List<String> shortcutIds, UserHandle user) { 205f5e3744637db1598c389e62450627b2548f8f517Sunny Goyal if (Utilities.ATLEAST_NOUGAT_MR1) { 2069994b2b171ab78d1d93e8a25086d6853f766e80fSunny Goyal ShortcutQuery q = new ShortcutQuery(); 2079994b2b171ab78d1d93e8a25086d6853f766e80fSunny Goyal q.setQueryFlags(flags); 2089994b2b171ab78d1d93e8a25086d6853f766e80fSunny Goyal if (packageName != null) { 2099994b2b171ab78d1d93e8a25086d6853f766e80fSunny Goyal q.setPackage(packageName); 2109994b2b171ab78d1d93e8a25086d6853f766e80fSunny Goyal q.setActivity(activity); 2119994b2b171ab78d1d93e8a25086d6853f766e80fSunny Goyal q.setShortcutIds(shortcutIds); 2129994b2b171ab78d1d93e8a25086d6853f766e80fSunny Goyal } 213acd86ff4865323d3cf411b219b88ed084fb6fce3Tony List<ShortcutInfo> shortcutInfos = null; 214acd86ff4865323d3cf411b219b88ed084fb6fce3Tony try { 2157c74e4ae641e76f73d74348e293c244a157f6585Sunny Goyal shortcutInfos = mLauncherApps.getShortcuts(q, user); 216d82a39da1c61b19d2749725f9c70c3baf2dab6bfTony Wickham mWasLastCallSuccess = true; 21749f4f03dc8ed3925e80d379634e43eb24eea25b9Sunny Goyal } catch (SecurityException|IllegalStateException e) { 218d82a39da1c61b19d2749725f9c70c3baf2dab6bfTony Wickham Log.e(TAG, "Failed to query for shortcuts", e); 219d82a39da1c61b19d2749725f9c70c3baf2dab6bfTony Wickham mWasLastCallSuccess = false; 220acd86ff4865323d3cf411b219b88ed084fb6fce3Tony } 2219994b2b171ab78d1d93e8a25086d6853f766e80fSunny Goyal if (shortcutInfos == null) { 2229994b2b171ab78d1d93e8a25086d6853f766e80fSunny Goyal return Collections.EMPTY_LIST; 2239994b2b171ab78d1d93e8a25086d6853f766e80fSunny Goyal } 2249994b2b171ab78d1d93e8a25086d6853f766e80fSunny Goyal List<ShortcutInfoCompat> shortcutInfoCompats = new ArrayList<>(shortcutInfos.size()); 2259994b2b171ab78d1d93e8a25086d6853f766e80fSunny Goyal for (ShortcutInfo shortcutInfo : shortcutInfos) { 2269994b2b171ab78d1d93e8a25086d6853f766e80fSunny Goyal shortcutInfoCompats.add(new ShortcutInfoCompat(shortcutInfo)); 2279994b2b171ab78d1d93e8a25086d6853f766e80fSunny Goyal } 2289994b2b171ab78d1d93e8a25086d6853f766e80fSunny Goyal return shortcutInfoCompats; 2299994b2b171ab78d1d93e8a25086d6853f766e80fSunny Goyal } else { 2309994b2b171ab78d1d93e8a25086d6853f766e80fSunny Goyal return Collections.EMPTY_LIST; 231bfbf7f9f4a0b300613f0ff27a4eb592d88c08325Tony Wickham } 232bfbf7f9f4a0b300613f0ff27a4eb592d88c08325Tony Wickham } 23395f3d6ba2ca02a9841487777cfff43fb9df65ec7Sunny Goyal 23495f3d6ba2ca02a9841487777cfff43fb9df65ec7Sunny Goyal @TargetApi(25) 23595f3d6ba2ca02a9841487777cfff43fb9df65ec7Sunny Goyal public boolean hasHostPermission() { 236f5e3744637db1598c389e62450627b2548f8f517Sunny Goyal if (Utilities.ATLEAST_NOUGAT_MR1) { 23795f3d6ba2ca02a9841487777cfff43fb9df65ec7Sunny Goyal try { 23895f3d6ba2ca02a9841487777cfff43fb9df65ec7Sunny Goyal return mLauncherApps.hasShortcutHostPermission(); 23995f3d6ba2ca02a9841487777cfff43fb9df65ec7Sunny Goyal } catch (SecurityException|IllegalStateException e) { 24095f3d6ba2ca02a9841487777cfff43fb9df65ec7Sunny Goyal Log.e(TAG, "Failed to make shortcut manager call", e); 24195f3d6ba2ca02a9841487777cfff43fb9df65ec7Sunny Goyal } 24295f3d6ba2ca02a9841487777cfff43fb9df65ec7Sunny Goyal } 24395f3d6ba2ca02a9841487777cfff43fb9df65ec7Sunny Goyal return false; 24495f3d6ba2ca02a9841487777cfff43fb9df65ec7Sunny Goyal } 245bfbf7f9f4a0b300613f0ff27a4eb592d88c08325Tony Wickham} 246