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