DeepShortcutManager.java revision f5e3744637db1598c389e62450627b2548f8f517
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; 28acd86ff4865323d3cf411b219b88ed084fb6fce3Tonyimport android.util.Log; 29bfbf7f9f4a0b300613f0ff27a4eb592d88c08325Tony Wickham 301bce7fd342875be8f7c1f82c8cf21d0199c8d544Tony Wickhamimport com.android.launcher3.ItemInfo; 311bce7fd342875be8f7c1f82c8cf21d0199c8d544Tony Wickhamimport com.android.launcher3.LauncherSettings; 329994b2b171ab78d1d93e8a25086d6853f766e80fSunny Goyalimport com.android.launcher3.Utilities; 33bfbf7f9f4a0b300613f0ff27a4eb592d88c08325Tony Wickhamimport com.android.launcher3.compat.UserHandleCompat; 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 489994b2b171ab78d1d93e8a25086d6853f766e80fSunny Goyal private final LauncherApps mLauncherApps; 49d82a39da1c61b19d2749725f9c70c3baf2dab6bfTony Wickham private boolean mWasLastCallSuccess; 50bfbf7f9f4a0b300613f0ff27a4eb592d88c08325Tony Wickham 51bfbf7f9f4a0b300613f0ff27a4eb592d88c08325Tony Wickham public DeepShortcutManager(Context context, ShortcutCache shortcutCache) { 529994b2b171ab78d1d93e8a25086d6853f766e80fSunny Goyal mLauncherApps = (LauncherApps) context.getSystemService(Context.LAUNCHER_APPS_SERVICE); 53bfbf7f9f4a0b300613f0ff27a4eb592d88c08325Tony Wickham } 54bfbf7f9f4a0b300613f0ff27a4eb592d88c08325Tony Wickham 551bce7fd342875be8f7c1f82c8cf21d0199c8d544Tony Wickham public static boolean supportsShortcuts(ItemInfo info) { 567b8f1eaba147ac42a347f3787d0e90b24be015dbTony Wickham return info.itemType == LauncherSettings.Favorites.ITEM_TYPE_APPLICATION; 571bce7fd342875be8f7c1f82c8cf21d0199c8d544Tony Wickham } 581bce7fd342875be8f7c1f82c8cf21d0199c8d544Tony Wickham 59d82a39da1c61b19d2749725f9c70c3baf2dab6bfTony Wickham public boolean wasLastCallSuccess() { 60d82a39da1c61b19d2749725f9c70c3baf2dab6bfTony Wickham return mWasLastCallSuccess; 61d82a39da1c61b19d2749725f9c70c3baf2dab6bfTony Wickham } 62d82a39da1c61b19d2749725f9c70c3baf2dab6bfTony Wickham 63bfbf7f9f4a0b300613f0ff27a4eb592d88c08325Tony Wickham public void onShortcutsChanged(List<ShortcutInfoCompat> shortcuts) { 64bfbf7f9f4a0b300613f0ff27a4eb592d88c08325Tony Wickham // mShortcutCache.removeShortcuts(shortcuts); 65bfbf7f9f4a0b300613f0ff27a4eb592d88c08325Tony Wickham } 66bfbf7f9f4a0b300613f0ff27a4eb592d88c08325Tony Wickham 67bfbf7f9f4a0b300613f0ff27a4eb592d88c08325Tony Wickham /** 68bfbf7f9f4a0b300613f0ff27a4eb592d88c08325Tony Wickham * Queries for the shortcuts with the package name and provided ids. 69bfbf7f9f4a0b300613f0ff27a4eb592d88c08325Tony Wickham * 70bfbf7f9f4a0b300613f0ff27a4eb592d88c08325Tony Wickham * This method is intended to get the full details for shortcuts when they are added or updated, 71bfbf7f9f4a0b300613f0ff27a4eb592d88c08325Tony Wickham * because we only get "key" fields in onShortcutsChanged(). 72bfbf7f9f4a0b300613f0ff27a4eb592d88c08325Tony Wickham */ 73bfbf7f9f4a0b300613f0ff27a4eb592d88c08325Tony Wickham public List<ShortcutInfoCompat> queryForFullDetails(String packageName, 74bfbf7f9f4a0b300613f0ff27a4eb592d88c08325Tony Wickham List<String> shortcutIds, UserHandleCompat user) { 75bfbf7f9f4a0b300613f0ff27a4eb592d88c08325Tony Wickham return query(FLAG_GET_ALL, packageName, null, shortcutIds, user); 76bfbf7f9f4a0b300613f0ff27a4eb592d88c08325Tony Wickham } 77bfbf7f9f4a0b300613f0ff27a4eb592d88c08325Tony Wickham 78bfbf7f9f4a0b300613f0ff27a4eb592d88c08325Tony Wickham /** 792c99d2ceebd1a6b6fed2b71105b8fdf88ef26a33Tony Wickham * Gets all the manifest and dynamic shortcuts associated with the given package and user, 802c99d2ceebd1a6b6fed2b71105b8fdf88ef26a33Tony Wickham * to be displayed in the shortcuts container on long press. 81bfbf7f9f4a0b300613f0ff27a4eb592d88c08325Tony Wickham */ 822c99d2ceebd1a6b6fed2b71105b8fdf88ef26a33Tony Wickham public List<ShortcutInfoCompat> queryForShortcutsContainer(ComponentName activity, 83bfbf7f9f4a0b300613f0ff27a4eb592d88c08325Tony Wickham List<String> ids, UserHandleCompat user) { 84b57c893db8c567ffeeb3c61f4fb3545c4a256441Sunny Goyal return query(ShortcutQuery.FLAG_MATCH_MANIFEST | ShortcutQuery.FLAG_MATCH_DYNAMIC, 852c99d2ceebd1a6b6fed2b71105b8fdf88ef26a33Tony Wickham activity.getPackageName(), activity, ids, user); 86bfbf7f9f4a0b300613f0ff27a4eb592d88c08325Tony Wickham } 87bfbf7f9f4a0b300613f0ff27a4eb592d88c08325Tony Wickham 88bfbf7f9f4a0b300613f0ff27a4eb592d88c08325Tony Wickham /** 89bfbf7f9f4a0b300613f0ff27a4eb592d88c08325Tony Wickham * Removes the given shortcut from the current list of pinned shortcuts. 90bfbf7f9f4a0b300613f0ff27a4eb592d88c08325Tony Wickham * (Runs on background thread) 91bfbf7f9f4a0b300613f0ff27a4eb592d88c08325Tony Wickham */ 929994b2b171ab78d1d93e8a25086d6853f766e80fSunny Goyal @TargetApi(25) 93bfbf7f9f4a0b300613f0ff27a4eb592d88c08325Tony Wickham public void unpinShortcut(final ShortcutKey key) { 94f5e3744637db1598c389e62450627b2548f8f517Sunny Goyal if (Utilities.ATLEAST_NOUGAT_MR1) { 959994b2b171ab78d1d93e8a25086d6853f766e80fSunny Goyal String packageName = key.componentName.getPackageName(); 96d3b87ef1963fb96177ca85bcd6a25879e27e419cSunny Goyal String id = key.getId(); 979994b2b171ab78d1d93e8a25086d6853f766e80fSunny Goyal UserHandleCompat user = key.user; 989994b2b171ab78d1d93e8a25086d6853f766e80fSunny Goyal List<String> pinnedIds = extractIds(queryForPinnedShortcuts(packageName, user)); 999994b2b171ab78d1d93e8a25086d6853f766e80fSunny Goyal pinnedIds.remove(id); 100acd86ff4865323d3cf411b219b88ed084fb6fce3Tony try { 101acd86ff4865323d3cf411b219b88ed084fb6fce3Tony mLauncherApps.pinShortcuts(packageName, pinnedIds, user.getUser()); 102d82a39da1c61b19d2749725f9c70c3baf2dab6bfTony Wickham mWasLastCallSuccess = true; 10349f4f03dc8ed3925e80d379634e43eb24eea25b9Sunny Goyal } catch (SecurityException|IllegalStateException e) { 104d82a39da1c61b19d2749725f9c70c3baf2dab6bfTony Wickham Log.w(TAG, "Failed to unpin shortcut", e); 105d82a39da1c61b19d2749725f9c70c3baf2dab6bfTony Wickham mWasLastCallSuccess = false; 106acd86ff4865323d3cf411b219b88ed084fb6fce3Tony } 1079994b2b171ab78d1d93e8a25086d6853f766e80fSunny Goyal } 108bfbf7f9f4a0b300613f0ff27a4eb592d88c08325Tony Wickham } 109bfbf7f9f4a0b300613f0ff27a4eb592d88c08325Tony Wickham 110bfbf7f9f4a0b300613f0ff27a4eb592d88c08325Tony Wickham /** 111bfbf7f9f4a0b300613f0ff27a4eb592d88c08325Tony Wickham * Adds the given shortcut to the current list of pinned shortcuts. 112bfbf7f9f4a0b300613f0ff27a4eb592d88c08325Tony Wickham * (Runs on background thread) 113bfbf7f9f4a0b300613f0ff27a4eb592d88c08325Tony Wickham */ 1149994b2b171ab78d1d93e8a25086d6853f766e80fSunny Goyal @TargetApi(25) 115bfbf7f9f4a0b300613f0ff27a4eb592d88c08325Tony Wickham public void pinShortcut(final ShortcutKey key) { 116f5e3744637db1598c389e62450627b2548f8f517Sunny Goyal if (Utilities.ATLEAST_NOUGAT_MR1) { 1179994b2b171ab78d1d93e8a25086d6853f766e80fSunny Goyal String packageName = key.componentName.getPackageName(); 118d3b87ef1963fb96177ca85bcd6a25879e27e419cSunny Goyal String id = key.getId(); 1199994b2b171ab78d1d93e8a25086d6853f766e80fSunny Goyal UserHandleCompat user = key.user; 1209994b2b171ab78d1d93e8a25086d6853f766e80fSunny Goyal List<String> pinnedIds = extractIds(queryForPinnedShortcuts(packageName, user)); 1219994b2b171ab78d1d93e8a25086d6853f766e80fSunny Goyal pinnedIds.add(id); 122acd86ff4865323d3cf411b219b88ed084fb6fce3Tony try { 123acd86ff4865323d3cf411b219b88ed084fb6fce3Tony mLauncherApps.pinShortcuts(packageName, pinnedIds, user.getUser()); 124d82a39da1c61b19d2749725f9c70c3baf2dab6bfTony Wickham mWasLastCallSuccess = true; 12549f4f03dc8ed3925e80d379634e43eb24eea25b9Sunny Goyal } catch (SecurityException|IllegalStateException e) { 126d82a39da1c61b19d2749725f9c70c3baf2dab6bfTony Wickham Log.w(TAG, "Failed to pin shortcut", e); 127d82a39da1c61b19d2749725f9c70c3baf2dab6bfTony Wickham mWasLastCallSuccess = false; 128acd86ff4865323d3cf411b219b88ed084fb6fce3Tony } 1299994b2b171ab78d1d93e8a25086d6853f766e80fSunny Goyal } 1309994b2b171ab78d1d93e8a25086d6853f766e80fSunny Goyal } 1319994b2b171ab78d1d93e8a25086d6853f766e80fSunny Goyal 1329994b2b171ab78d1d93e8a25086d6853f766e80fSunny Goyal @TargetApi(25) 1339994b2b171ab78d1d93e8a25086d6853f766e80fSunny Goyal public void startShortcut(String packageName, String id, Rect sourceBounds, 1349994b2b171ab78d1d93e8a25086d6853f766e80fSunny Goyal Bundle startActivityOptions, UserHandleCompat user) { 135f5e3744637db1598c389e62450627b2548f8f517Sunny Goyal if (Utilities.ATLEAST_NOUGAT_MR1) { 136acd86ff4865323d3cf411b219b88ed084fb6fce3Tony try { 137d82a39da1c61b19d2749725f9c70c3baf2dab6bfTony Wickham mLauncherApps.startShortcut(packageName, id, sourceBounds, 138d82a39da1c61b19d2749725f9c70c3baf2dab6bfTony Wickham startActivityOptions, user.getUser()); 139d82a39da1c61b19d2749725f9c70c3baf2dab6bfTony Wickham mWasLastCallSuccess = true; 14049f4f03dc8ed3925e80d379634e43eb24eea25b9Sunny Goyal } catch (SecurityException|IllegalStateException e) { 141d82a39da1c61b19d2749725f9c70c3baf2dab6bfTony Wickham Log.e(TAG, "Failed to start shortcut", e); 142d82a39da1c61b19d2749725f9c70c3baf2dab6bfTony Wickham mWasLastCallSuccess = false; 143acd86ff4865323d3cf411b219b88ed084fb6fce3Tony } 1449994b2b171ab78d1d93e8a25086d6853f766e80fSunny Goyal } 1459994b2b171ab78d1d93e8a25086d6853f766e80fSunny Goyal } 1469994b2b171ab78d1d93e8a25086d6853f766e80fSunny Goyal 1479994b2b171ab78d1d93e8a25086d6853f766e80fSunny Goyal @TargetApi(25) 1489994b2b171ab78d1d93e8a25086d6853f766e80fSunny Goyal public Drawable getShortcutIconDrawable(ShortcutInfoCompat shortcutInfo, int density) { 149f5e3744637db1598c389e62450627b2548f8f517Sunny Goyal if (Utilities.ATLEAST_NOUGAT_MR1) { 150acd86ff4865323d3cf411b219b88ed084fb6fce3Tony try { 151d82a39da1c61b19d2749725f9c70c3baf2dab6bfTony Wickham Drawable icon = mLauncherApps.getShortcutIconDrawable( 152d82a39da1c61b19d2749725f9c70c3baf2dab6bfTony Wickham shortcutInfo.getShortcutInfo(), density); 153d82a39da1c61b19d2749725f9c70c3baf2dab6bfTony Wickham mWasLastCallSuccess = true; 154d82a39da1c61b19d2749725f9c70c3baf2dab6bfTony Wickham return icon; 15549f4f03dc8ed3925e80d379634e43eb24eea25b9Sunny Goyal } catch (SecurityException|IllegalStateException e) { 156d82a39da1c61b19d2749725f9c70c3baf2dab6bfTony Wickham Log.e(TAG, "Failed to get shortcut icon", e); 157d82a39da1c61b19d2749725f9c70c3baf2dab6bfTony Wickham mWasLastCallSuccess = false; 158acd86ff4865323d3cf411b219b88ed084fb6fce3Tony } 159acd86ff4865323d3cf411b219b88ed084fb6fce3Tony } 160acd86ff4865323d3cf411b219b88ed084fb6fce3Tony return null; 161bfbf7f9f4a0b300613f0ff27a4eb592d88c08325Tony Wickham } 162bfbf7f9f4a0b300613f0ff27a4eb592d88c08325Tony Wickham 163bfbf7f9f4a0b300613f0ff27a4eb592d88c08325Tony Wickham /** 164bfbf7f9f4a0b300613f0ff27a4eb592d88c08325Tony Wickham * Returns the id's of pinned shortcuts associated with the given package and user. 165bfbf7f9f4a0b300613f0ff27a4eb592d88c08325Tony Wickham * 166bfbf7f9f4a0b300613f0ff27a4eb592d88c08325Tony Wickham * If packageName is null, returns all pinned shortcuts regardless of package. 167bfbf7f9f4a0b300613f0ff27a4eb592d88c08325Tony Wickham */ 168bfbf7f9f4a0b300613f0ff27a4eb592d88c08325Tony Wickham public List<ShortcutInfoCompat> queryForPinnedShortcuts(String packageName, 169bfbf7f9f4a0b300613f0ff27a4eb592d88c08325Tony Wickham UserHandleCompat user) { 170b57c893db8c567ffeeb3c61f4fb3545c4a256441Sunny Goyal return query(ShortcutQuery.FLAG_MATCH_PINNED, packageName, null, null, user); 171bfbf7f9f4a0b300613f0ff27a4eb592d88c08325Tony Wickham } 172bfbf7f9f4a0b300613f0ff27a4eb592d88c08325Tony Wickham 173bfbf7f9f4a0b300613f0ff27a4eb592d88c08325Tony Wickham public List<ShortcutInfoCompat> queryForAllShortcuts(UserHandleCompat user) { 174bfbf7f9f4a0b300613f0ff27a4eb592d88c08325Tony Wickham return query(FLAG_GET_ALL, null, null, null, user); 175bfbf7f9f4a0b300613f0ff27a4eb592d88c08325Tony Wickham } 176bfbf7f9f4a0b300613f0ff27a4eb592d88c08325Tony Wickham 177bfbf7f9f4a0b300613f0ff27a4eb592d88c08325Tony Wickham private List<String> extractIds(List<ShortcutInfoCompat> shortcuts) { 178bfbf7f9f4a0b300613f0ff27a4eb592d88c08325Tony Wickham List<String> shortcutIds = new ArrayList<>(shortcuts.size()); 179bfbf7f9f4a0b300613f0ff27a4eb592d88c08325Tony Wickham for (ShortcutInfoCompat shortcut : shortcuts) { 180bfbf7f9f4a0b300613f0ff27a4eb592d88c08325Tony Wickham shortcutIds.add(shortcut.getId()); 181bfbf7f9f4a0b300613f0ff27a4eb592d88c08325Tony Wickham } 182bfbf7f9f4a0b300613f0ff27a4eb592d88c08325Tony Wickham return shortcutIds; 183bfbf7f9f4a0b300613f0ff27a4eb592d88c08325Tony Wickham } 184bfbf7f9f4a0b300613f0ff27a4eb592d88c08325Tony Wickham 185bfbf7f9f4a0b300613f0ff27a4eb592d88c08325Tony Wickham /** 186bfbf7f9f4a0b300613f0ff27a4eb592d88c08325Tony Wickham * Query the system server for all the shortcuts matching the given parameters. 187bfbf7f9f4a0b300613f0ff27a4eb592d88c08325Tony Wickham * If packageName == null, we query for all shortcuts with the passed flags, regardless of app. 188bfbf7f9f4a0b300613f0ff27a4eb592d88c08325Tony Wickham * 189bfbf7f9f4a0b300613f0ff27a4eb592d88c08325Tony Wickham * TODO: Use the cache to optimize this so we don't make an RPC every time. 190bfbf7f9f4a0b300613f0ff27a4eb592d88c08325Tony Wickham */ 1919994b2b171ab78d1d93e8a25086d6853f766e80fSunny Goyal @TargetApi(25) 192bfbf7f9f4a0b300613f0ff27a4eb592d88c08325Tony Wickham private List<ShortcutInfoCompat> query(int flags, String packageName, 193bfbf7f9f4a0b300613f0ff27a4eb592d88c08325Tony Wickham ComponentName activity, List<String> shortcutIds, UserHandleCompat user) { 194f5e3744637db1598c389e62450627b2548f8f517Sunny Goyal if (Utilities.ATLEAST_NOUGAT_MR1) { 1959994b2b171ab78d1d93e8a25086d6853f766e80fSunny Goyal ShortcutQuery q = new ShortcutQuery(); 1969994b2b171ab78d1d93e8a25086d6853f766e80fSunny Goyal q.setQueryFlags(flags); 1979994b2b171ab78d1d93e8a25086d6853f766e80fSunny Goyal if (packageName != null) { 1989994b2b171ab78d1d93e8a25086d6853f766e80fSunny Goyal q.setPackage(packageName); 1999994b2b171ab78d1d93e8a25086d6853f766e80fSunny Goyal q.setActivity(activity); 2009994b2b171ab78d1d93e8a25086d6853f766e80fSunny Goyal q.setShortcutIds(shortcutIds); 2019994b2b171ab78d1d93e8a25086d6853f766e80fSunny Goyal } 202acd86ff4865323d3cf411b219b88ed084fb6fce3Tony List<ShortcutInfo> shortcutInfos = null; 203acd86ff4865323d3cf411b219b88ed084fb6fce3Tony try { 204acd86ff4865323d3cf411b219b88ed084fb6fce3Tony shortcutInfos = mLauncherApps.getShortcuts(q, user.getUser()); 205d82a39da1c61b19d2749725f9c70c3baf2dab6bfTony Wickham mWasLastCallSuccess = true; 20649f4f03dc8ed3925e80d379634e43eb24eea25b9Sunny Goyal } catch (SecurityException|IllegalStateException e) { 207d82a39da1c61b19d2749725f9c70c3baf2dab6bfTony Wickham Log.e(TAG, "Failed to query for shortcuts", e); 208d82a39da1c61b19d2749725f9c70c3baf2dab6bfTony Wickham mWasLastCallSuccess = false; 209acd86ff4865323d3cf411b219b88ed084fb6fce3Tony } 2109994b2b171ab78d1d93e8a25086d6853f766e80fSunny Goyal if (shortcutInfos == null) { 2119994b2b171ab78d1d93e8a25086d6853f766e80fSunny Goyal return Collections.EMPTY_LIST; 2129994b2b171ab78d1d93e8a25086d6853f766e80fSunny Goyal } 2139994b2b171ab78d1d93e8a25086d6853f766e80fSunny Goyal List<ShortcutInfoCompat> shortcutInfoCompats = new ArrayList<>(shortcutInfos.size()); 2149994b2b171ab78d1d93e8a25086d6853f766e80fSunny Goyal for (ShortcutInfo shortcutInfo : shortcutInfos) { 2159994b2b171ab78d1d93e8a25086d6853f766e80fSunny Goyal shortcutInfoCompats.add(new ShortcutInfoCompat(shortcutInfo)); 2169994b2b171ab78d1d93e8a25086d6853f766e80fSunny Goyal } 2179994b2b171ab78d1d93e8a25086d6853f766e80fSunny Goyal return shortcutInfoCompats; 2189994b2b171ab78d1d93e8a25086d6853f766e80fSunny Goyal } else { 2199994b2b171ab78d1d93e8a25086d6853f766e80fSunny Goyal return Collections.EMPTY_LIST; 220bfbf7f9f4a0b300613f0ff27a4eb592d88c08325Tony Wickham } 221bfbf7f9f4a0b300613f0ff27a4eb592d88c08325Tony Wickham } 22295f3d6ba2ca02a9841487777cfff43fb9df65ec7Sunny Goyal 22395f3d6ba2ca02a9841487777cfff43fb9df65ec7Sunny Goyal @TargetApi(25) 22495f3d6ba2ca02a9841487777cfff43fb9df65ec7Sunny Goyal public boolean hasHostPermission() { 225f5e3744637db1598c389e62450627b2548f8f517Sunny Goyal if (Utilities.ATLEAST_NOUGAT_MR1) { 22695f3d6ba2ca02a9841487777cfff43fb9df65ec7Sunny Goyal try { 22795f3d6ba2ca02a9841487777cfff43fb9df65ec7Sunny Goyal return mLauncherApps.hasShortcutHostPermission(); 22895f3d6ba2ca02a9841487777cfff43fb9df65ec7Sunny Goyal } catch (SecurityException|IllegalStateException e) { 22995f3d6ba2ca02a9841487777cfff43fb9df65ec7Sunny Goyal Log.e(TAG, "Failed to make shortcut manager call", e); 23095f3d6ba2ca02a9841487777cfff43fb9df65ec7Sunny Goyal } 23195f3d6ba2ca02a9841487777cfff43fb9df65ec7Sunny Goyal } 23295f3d6ba2ca02a9841487777cfff43fb9df65ec7Sunny Goyal return false; 23395f3d6ba2ca02a9841487777cfff43fb9df65ec7Sunny Goyal } 234bfbf7f9f4a0b300613f0ff27a4eb592d88c08325Tony Wickham} 235