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