DeepShortcutManager.java revision 9994b2b171ab78d1d93e8a25086d6853f766e80f
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; 28bfbf7f9f4a0b300613f0ff27a4eb592d88c08325Tony Wickham 299994b2b171ab78d1d93e8a25086d6853f766e80fSunny Goyalimport com.android.launcher3.Utilities; 30bfbf7f9f4a0b300613f0ff27a4eb592d88c08325Tony Wickhamimport com.android.launcher3.compat.UserHandleCompat; 31bfbf7f9f4a0b300613f0ff27a4eb592d88c08325Tony Wickham 32bfbf7f9f4a0b300613f0ff27a4eb592d88c08325Tony Wickhamimport java.util.ArrayList; 339994b2b171ab78d1d93e8a25086d6853f766e80fSunny Goyalimport java.util.Collections; 34bfbf7f9f4a0b300613f0ff27a4eb592d88c08325Tony Wickhamimport java.util.List; 35bfbf7f9f4a0b300613f0ff27a4eb592d88c08325Tony Wickham 36bfbf7f9f4a0b300613f0ff27a4eb592d88c08325Tony Wickham/** 37bfbf7f9f4a0b300613f0ff27a4eb592d88c08325Tony Wickham * Performs operations related to deep shortcuts, such as querying for them, pinning them, etc. 38bfbf7f9f4a0b300613f0ff27a4eb592d88c08325Tony Wickham */ 39bfbf7f9f4a0b300613f0ff27a4eb592d88c08325Tony Wickhampublic class DeepShortcutManager { 40bfbf7f9f4a0b300613f0ff27a4eb592d88c08325Tony Wickham 419994b2b171ab78d1d93e8a25086d6853f766e80fSunny Goyal // TODO: Replace this with platform constants when the new sdk is available. 429994b2b171ab78d1d93e8a25086d6853f766e80fSunny Goyal public static final int FLAG_MATCH_DYNAMIC = 1 << 0; 439994b2b171ab78d1d93e8a25086d6853f766e80fSunny Goyal public static final int FLAG_MATCH_MANIFEST = 1 << 3; 449994b2b171ab78d1d93e8a25086d6853f766e80fSunny Goyal public static final int FLAG_MATCH_PINNED = 1 << 1; 459994b2b171ab78d1d93e8a25086d6853f766e80fSunny Goyal 469994b2b171ab78d1d93e8a25086d6853f766e80fSunny Goyal private static final int FLAG_GET_ALL = 479994b2b171ab78d1d93e8a25086d6853f766e80fSunny Goyal FLAG_MATCH_DYNAMIC | FLAG_MATCH_PINNED | FLAG_MATCH_MANIFEST; 489994b2b171ab78d1d93e8a25086d6853f766e80fSunny Goyal 499994b2b171ab78d1d93e8a25086d6853f766e80fSunny Goyal private final LauncherApps mLauncherApps; 50bfbf7f9f4a0b300613f0ff27a4eb592d88c08325Tony Wickham 51bfbf7f9f4a0b300613f0ff27a4eb592d88c08325Tony Wickham public DeepShortcutManager(Context context, ShortcutCache shortcutCache) { 529994b2b171ab78d1d93e8a25086d6853f766e80fSunny Goyal mLauncherApps = (LauncherApps) context.getSystemService(Context.LAUNCHER_APPS_SERVICE); 53bfbf7f9f4a0b300613f0ff27a4eb592d88c08325Tony Wickham } 54bfbf7f9f4a0b300613f0ff27a4eb592d88c08325Tony Wickham 55bfbf7f9f4a0b300613f0ff27a4eb592d88c08325Tony Wickham public void onShortcutsChanged(List<ShortcutInfoCompat> shortcuts) { 56bfbf7f9f4a0b300613f0ff27a4eb592d88c08325Tony Wickham // mShortcutCache.removeShortcuts(shortcuts); 57bfbf7f9f4a0b300613f0ff27a4eb592d88c08325Tony Wickham } 58bfbf7f9f4a0b300613f0ff27a4eb592d88c08325Tony Wickham 59bfbf7f9f4a0b300613f0ff27a4eb592d88c08325Tony Wickham /** 60bfbf7f9f4a0b300613f0ff27a4eb592d88c08325Tony Wickham * Queries for the shortcuts with the package name and provided ids. 61bfbf7f9f4a0b300613f0ff27a4eb592d88c08325Tony Wickham * 62bfbf7f9f4a0b300613f0ff27a4eb592d88c08325Tony Wickham * This method is intended to get the full details for shortcuts when they are added or updated, 63bfbf7f9f4a0b300613f0ff27a4eb592d88c08325Tony Wickham * because we only get "key" fields in onShortcutsChanged(). 64bfbf7f9f4a0b300613f0ff27a4eb592d88c08325Tony Wickham */ 65bfbf7f9f4a0b300613f0ff27a4eb592d88c08325Tony Wickham public List<ShortcutInfoCompat> queryForFullDetails(String packageName, 66bfbf7f9f4a0b300613f0ff27a4eb592d88c08325Tony Wickham List<String> shortcutIds, UserHandleCompat user) { 67bfbf7f9f4a0b300613f0ff27a4eb592d88c08325Tony Wickham return query(FLAG_GET_ALL, packageName, null, shortcutIds, user); 68bfbf7f9f4a0b300613f0ff27a4eb592d88c08325Tony Wickham } 69bfbf7f9f4a0b300613f0ff27a4eb592d88c08325Tony Wickham 70bfbf7f9f4a0b300613f0ff27a4eb592d88c08325Tony Wickham /** 71bfbf7f9f4a0b300613f0ff27a4eb592d88c08325Tony Wickham * Gets all the shortcuts associated with the given package and user. 72bfbf7f9f4a0b300613f0ff27a4eb592d88c08325Tony Wickham */ 73bfbf7f9f4a0b300613f0ff27a4eb592d88c08325Tony Wickham public List<ShortcutInfoCompat> queryForAllAppShortcuts(ComponentName activity, 74bfbf7f9f4a0b300613f0ff27a4eb592d88c08325Tony Wickham List<String> ids, UserHandleCompat user) { 75bfbf7f9f4a0b300613f0ff27a4eb592d88c08325Tony Wickham return query(FLAG_GET_ALL, activity.getPackageName(), activity, ids, user); 76bfbf7f9f4a0b300613f0ff27a4eb592d88c08325Tony Wickham } 77bfbf7f9f4a0b300613f0ff27a4eb592d88c08325Tony Wickham 78bfbf7f9f4a0b300613f0ff27a4eb592d88c08325Tony Wickham /** 79bfbf7f9f4a0b300613f0ff27a4eb592d88c08325Tony Wickham * Removes the given shortcut from the current list of pinned shortcuts. 80bfbf7f9f4a0b300613f0ff27a4eb592d88c08325Tony Wickham * (Runs on background thread) 81bfbf7f9f4a0b300613f0ff27a4eb592d88c08325Tony Wickham */ 829994b2b171ab78d1d93e8a25086d6853f766e80fSunny Goyal @TargetApi(25) 83bfbf7f9f4a0b300613f0ff27a4eb592d88c08325Tony Wickham public void unpinShortcut(final ShortcutKey key) { 849994b2b171ab78d1d93e8a25086d6853f766e80fSunny Goyal if (Utilities.isNycMR1OrAbove()) { 859994b2b171ab78d1d93e8a25086d6853f766e80fSunny Goyal String packageName = key.componentName.getPackageName(); 869994b2b171ab78d1d93e8a25086d6853f766e80fSunny Goyal String id = key.id; 879994b2b171ab78d1d93e8a25086d6853f766e80fSunny Goyal UserHandleCompat user = key.user; 889994b2b171ab78d1d93e8a25086d6853f766e80fSunny Goyal List<String> pinnedIds = extractIds(queryForPinnedShortcuts(packageName, user)); 899994b2b171ab78d1d93e8a25086d6853f766e80fSunny Goyal pinnedIds.remove(id); 909994b2b171ab78d1d93e8a25086d6853f766e80fSunny Goyal mLauncherApps.pinShortcuts(packageName, pinnedIds, user.getUser()); 919994b2b171ab78d1d93e8a25086d6853f766e80fSunny Goyal } 92bfbf7f9f4a0b300613f0ff27a4eb592d88c08325Tony Wickham } 93bfbf7f9f4a0b300613f0ff27a4eb592d88c08325Tony Wickham 94bfbf7f9f4a0b300613f0ff27a4eb592d88c08325Tony Wickham /** 95bfbf7f9f4a0b300613f0ff27a4eb592d88c08325Tony Wickham * Adds the given shortcut to the current list of pinned shortcuts. 96bfbf7f9f4a0b300613f0ff27a4eb592d88c08325Tony Wickham * (Runs on background thread) 97bfbf7f9f4a0b300613f0ff27a4eb592d88c08325Tony Wickham */ 989994b2b171ab78d1d93e8a25086d6853f766e80fSunny Goyal @TargetApi(25) 99bfbf7f9f4a0b300613f0ff27a4eb592d88c08325Tony Wickham public void pinShortcut(final ShortcutKey key) { 1009994b2b171ab78d1d93e8a25086d6853f766e80fSunny Goyal if (Utilities.isNycMR1OrAbove()) { 1019994b2b171ab78d1d93e8a25086d6853f766e80fSunny Goyal String packageName = key.componentName.getPackageName(); 1029994b2b171ab78d1d93e8a25086d6853f766e80fSunny Goyal String id = key.id; 1039994b2b171ab78d1d93e8a25086d6853f766e80fSunny Goyal UserHandleCompat user = key.user; 1049994b2b171ab78d1d93e8a25086d6853f766e80fSunny Goyal List<String> pinnedIds = extractIds(queryForPinnedShortcuts(packageName, user)); 1059994b2b171ab78d1d93e8a25086d6853f766e80fSunny Goyal pinnedIds.add(id); 1069994b2b171ab78d1d93e8a25086d6853f766e80fSunny Goyal mLauncherApps.pinShortcuts(packageName, pinnedIds, user.getUser()); 1079994b2b171ab78d1d93e8a25086d6853f766e80fSunny Goyal } 1089994b2b171ab78d1d93e8a25086d6853f766e80fSunny Goyal } 1099994b2b171ab78d1d93e8a25086d6853f766e80fSunny Goyal 1109994b2b171ab78d1d93e8a25086d6853f766e80fSunny Goyal @TargetApi(25) 1119994b2b171ab78d1d93e8a25086d6853f766e80fSunny Goyal public void startShortcut(String packageName, String id, Rect sourceBounds, 1129994b2b171ab78d1d93e8a25086d6853f766e80fSunny Goyal Bundle startActivityOptions, UserHandleCompat user) { 1139994b2b171ab78d1d93e8a25086d6853f766e80fSunny Goyal if (Utilities.isNycMR1OrAbove()) { 1149994b2b171ab78d1d93e8a25086d6853f766e80fSunny Goyal mLauncherApps.startShortcut(packageName, id, sourceBounds, 1159994b2b171ab78d1d93e8a25086d6853f766e80fSunny Goyal startActivityOptions, user.getUser()); 1169994b2b171ab78d1d93e8a25086d6853f766e80fSunny Goyal } 1179994b2b171ab78d1d93e8a25086d6853f766e80fSunny Goyal } 1189994b2b171ab78d1d93e8a25086d6853f766e80fSunny Goyal 1199994b2b171ab78d1d93e8a25086d6853f766e80fSunny Goyal @TargetApi(25) 1209994b2b171ab78d1d93e8a25086d6853f766e80fSunny Goyal public Drawable getShortcutIconDrawable(ShortcutInfoCompat shortcutInfo, int density) { 1219994b2b171ab78d1d93e8a25086d6853f766e80fSunny Goyal return Utilities.isNycMR1OrAbove() 1229994b2b171ab78d1d93e8a25086d6853f766e80fSunny Goyal ? mLauncherApps.getShortcutIconDrawable(shortcutInfo.getShortcutInfo(), density) 1239994b2b171ab78d1d93e8a25086d6853f766e80fSunny Goyal : null; 124bfbf7f9f4a0b300613f0ff27a4eb592d88c08325Tony Wickham } 125bfbf7f9f4a0b300613f0ff27a4eb592d88c08325Tony Wickham 126bfbf7f9f4a0b300613f0ff27a4eb592d88c08325Tony Wickham /** 127bfbf7f9f4a0b300613f0ff27a4eb592d88c08325Tony Wickham * Returns the id's of pinned shortcuts associated with the given package and user. 128bfbf7f9f4a0b300613f0ff27a4eb592d88c08325Tony Wickham * 129bfbf7f9f4a0b300613f0ff27a4eb592d88c08325Tony Wickham * If packageName is null, returns all pinned shortcuts regardless of package. 130bfbf7f9f4a0b300613f0ff27a4eb592d88c08325Tony Wickham */ 131bfbf7f9f4a0b300613f0ff27a4eb592d88c08325Tony Wickham public List<ShortcutInfoCompat> queryForPinnedShortcuts(String packageName, 132bfbf7f9f4a0b300613f0ff27a4eb592d88c08325Tony Wickham UserHandleCompat user) { 1339994b2b171ab78d1d93e8a25086d6853f766e80fSunny Goyal return query(FLAG_MATCH_PINNED, packageName, null, null, user); 134bfbf7f9f4a0b300613f0ff27a4eb592d88c08325Tony Wickham } 135bfbf7f9f4a0b300613f0ff27a4eb592d88c08325Tony Wickham 136bfbf7f9f4a0b300613f0ff27a4eb592d88c08325Tony Wickham public List<ShortcutInfoCompat> queryForAllShortcuts(UserHandleCompat user) { 137bfbf7f9f4a0b300613f0ff27a4eb592d88c08325Tony Wickham return query(FLAG_GET_ALL, null, null, null, user); 138bfbf7f9f4a0b300613f0ff27a4eb592d88c08325Tony Wickham } 139bfbf7f9f4a0b300613f0ff27a4eb592d88c08325Tony Wickham 140bfbf7f9f4a0b300613f0ff27a4eb592d88c08325Tony Wickham private List<String> extractIds(List<ShortcutInfoCompat> shortcuts) { 141bfbf7f9f4a0b300613f0ff27a4eb592d88c08325Tony Wickham List<String> shortcutIds = new ArrayList<>(shortcuts.size()); 142bfbf7f9f4a0b300613f0ff27a4eb592d88c08325Tony Wickham for (ShortcutInfoCompat shortcut : shortcuts) { 143bfbf7f9f4a0b300613f0ff27a4eb592d88c08325Tony Wickham shortcutIds.add(shortcut.getId()); 144bfbf7f9f4a0b300613f0ff27a4eb592d88c08325Tony Wickham } 145bfbf7f9f4a0b300613f0ff27a4eb592d88c08325Tony Wickham return shortcutIds; 146bfbf7f9f4a0b300613f0ff27a4eb592d88c08325Tony Wickham } 147bfbf7f9f4a0b300613f0ff27a4eb592d88c08325Tony Wickham 148bfbf7f9f4a0b300613f0ff27a4eb592d88c08325Tony Wickham /** 149bfbf7f9f4a0b300613f0ff27a4eb592d88c08325Tony Wickham * Query the system server for all the shortcuts matching the given parameters. 150bfbf7f9f4a0b300613f0ff27a4eb592d88c08325Tony Wickham * If packageName == null, we query for all shortcuts with the passed flags, regardless of app. 151bfbf7f9f4a0b300613f0ff27a4eb592d88c08325Tony Wickham * 152bfbf7f9f4a0b300613f0ff27a4eb592d88c08325Tony Wickham * TODO: Use the cache to optimize this so we don't make an RPC every time. 153bfbf7f9f4a0b300613f0ff27a4eb592d88c08325Tony Wickham */ 1549994b2b171ab78d1d93e8a25086d6853f766e80fSunny Goyal @TargetApi(25) 155bfbf7f9f4a0b300613f0ff27a4eb592d88c08325Tony Wickham private List<ShortcutInfoCompat> query(int flags, String packageName, 156bfbf7f9f4a0b300613f0ff27a4eb592d88c08325Tony Wickham ComponentName activity, List<String> shortcutIds, UserHandleCompat user) { 1579994b2b171ab78d1d93e8a25086d6853f766e80fSunny Goyal if (Utilities.isNycMR1OrAbove()) { 1589994b2b171ab78d1d93e8a25086d6853f766e80fSunny Goyal ShortcutQuery q = new ShortcutQuery(); 1599994b2b171ab78d1d93e8a25086d6853f766e80fSunny Goyal q.setQueryFlags(flags); 1609994b2b171ab78d1d93e8a25086d6853f766e80fSunny Goyal if (packageName != null) { 1619994b2b171ab78d1d93e8a25086d6853f766e80fSunny Goyal q.setPackage(packageName); 1629994b2b171ab78d1d93e8a25086d6853f766e80fSunny Goyal q.setActivity(activity); 1639994b2b171ab78d1d93e8a25086d6853f766e80fSunny Goyal q.setShortcutIds(shortcutIds); 1649994b2b171ab78d1d93e8a25086d6853f766e80fSunny Goyal } 1659994b2b171ab78d1d93e8a25086d6853f766e80fSunny Goyal List<ShortcutInfo> shortcutInfos = mLauncherApps.getShortcuts(q, user.getUser()); 1669994b2b171ab78d1d93e8a25086d6853f766e80fSunny Goyal if (shortcutInfos == null) { 1679994b2b171ab78d1d93e8a25086d6853f766e80fSunny Goyal return Collections.EMPTY_LIST; 1689994b2b171ab78d1d93e8a25086d6853f766e80fSunny Goyal } 1699994b2b171ab78d1d93e8a25086d6853f766e80fSunny Goyal List<ShortcutInfoCompat> shortcutInfoCompats = new ArrayList<>(shortcutInfos.size()); 1709994b2b171ab78d1d93e8a25086d6853f766e80fSunny Goyal for (ShortcutInfo shortcutInfo : shortcutInfos) { 1719994b2b171ab78d1d93e8a25086d6853f766e80fSunny Goyal shortcutInfoCompats.add(new ShortcutInfoCompat(shortcutInfo)); 1729994b2b171ab78d1d93e8a25086d6853f766e80fSunny Goyal } 1739994b2b171ab78d1d93e8a25086d6853f766e80fSunny Goyal return shortcutInfoCompats; 1749994b2b171ab78d1d93e8a25086d6853f766e80fSunny Goyal } else { 1759994b2b171ab78d1d93e8a25086d6853f766e80fSunny Goyal return Collections.EMPTY_LIST; 176bfbf7f9f4a0b300613f0ff27a4eb592d88c08325Tony Wickham } 177bfbf7f9f4a0b300613f0ff27a4eb592d88c08325Tony Wickham } 178bfbf7f9f4a0b300613f0ff27a4eb592d88c08325Tony Wickham} 179