14f58263d02f296430a9653126d28501e95c7bb6cAmith Yamasani/*
24f58263d02f296430a9653126d28501e95c7bb6cAmith Yamasani * Copyright (C) 2014 The Android Open Source Project
34f58263d02f296430a9653126d28501e95c7bb6cAmith Yamasani *
44f58263d02f296430a9653126d28501e95c7bb6cAmith Yamasani * Licensed under the Apache License, Version 2.0 (the "License");
54f58263d02f296430a9653126d28501e95c7bb6cAmith Yamasani * you may not use this file except in compliance with the License.
64f58263d02f296430a9653126d28501e95c7bb6cAmith Yamasani * You may obtain a copy of the License at
74f58263d02f296430a9653126d28501e95c7bb6cAmith Yamasani *
84f58263d02f296430a9653126d28501e95c7bb6cAmith Yamasani *      http://www.apache.org/licenses/LICENSE-2.0
94f58263d02f296430a9653126d28501e95c7bb6cAmith Yamasani *
104f58263d02f296430a9653126d28501e95c7bb6cAmith Yamasani * Unless required by applicable law or agreed to in writing, software
114f58263d02f296430a9653126d28501e95c7bb6cAmith Yamasani * distributed under the License is distributed on an "AS IS" BASIS,
124f58263d02f296430a9653126d28501e95c7bb6cAmith Yamasani * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
134f58263d02f296430a9653126d28501e95c7bb6cAmith Yamasani * See the License for the specific language governing permissions and
144f58263d02f296430a9653126d28501e95c7bb6cAmith Yamasani * limitations under the License.
154f58263d02f296430a9653126d28501e95c7bb6cAmith Yamasani */
164f58263d02f296430a9653126d28501e95c7bb6cAmith Yamasani
174f58263d02f296430a9653126d28501e95c7bb6cAmith Yamasanipackage android.content.pm;
184f58263d02f296430a9653126d28501e95c7bb6cAmith Yamasani
196f7362d92573e4ae693bc513dca586d6a4eb087bMakoto Onukiimport android.annotation.IntDef;
206f7362d92573e4ae693bc513dca586d6a4eb087bMakoto Onukiimport android.annotation.NonNull;
216f7362d92573e4ae693bc513dca586d6a4eb087bMakoto Onukiimport android.annotation.Nullable;
222d895c3efd625e09e9f2cc4d0c7131b34f52f154Makoto Onukiimport android.annotation.SdkConstant;
232d895c3efd625e09e9f2cc4d0c7131b34f52f154Makoto Onukiimport android.annotation.SdkConstant.SdkConstantType;
24b1588c0d3955a8574c3ae588568b2c393c7b5665Makoto Onukiimport android.annotation.SystemService;
255ba0d3e3a3035b67d2ce3a59975145b1e0061ef4Makoto Onukiimport android.annotation.TestApi;
26a37ac3d6f1fdb51749df3375607ea133c9b3918bMakoto Onukiimport android.app.PendingIntent;
27a37ac3d6f1fdb51749df3375607ea133c9b3918bMakoto Onukiimport android.appwidget.AppWidgetManager;
2887a563e0707bb7e2be034c195e9827dfe3451cfdSunny Goyalimport android.appwidget.AppWidgetProviderInfo;
2983f6d2da372de339dc563d6a7786be3facc52e76Makoto Onukiimport android.content.ActivityNotFoundException;
304f58263d02f296430a9653126d28501e95c7bb6cAmith Yamasaniimport android.content.ComponentName;
314f58263d02f296430a9653126d28501e95c7bb6cAmith Yamasaniimport android.content.Context;
324f58263d02f296430a9653126d28501e95c7bb6cAmith Yamasaniimport android.content.Intent;
33a6be88a10d6f6391b09f626ead051d0c698fb2d1Sunny Goyalimport android.content.IntentSender;
34772427555f2624b38124ab8e586ac0ccc451eb53Kenny Guyimport android.content.pm.PackageManager.ApplicationInfoFlags;
3504b9aab94576411b9f59aa49d87080976ee6fa46Makoto Onukiimport android.content.pm.PackageManager.NameNotFoundException;
3604b9aab94576411b9f59aa49d87080976ee6fa46Makoto Onukiimport android.content.res.Resources;
3704b9aab94576411b9f59aa49d87080976ee6fa46Makoto Onukiimport android.graphics.Bitmap;
3804b9aab94576411b9f59aa49d87080976ee6fa46Makoto Onukiimport android.graphics.BitmapFactory;
394f58263d02f296430a9653126d28501e95c7bb6cAmith Yamasaniimport android.graphics.Rect;
40b1588c0d3955a8574c3ae588568b2c393c7b5665Makoto Onukiimport android.graphics.drawable.AdaptiveIconDrawable;
4104b9aab94576411b9f59aa49d87080976ee6fa46Makoto Onukiimport android.graphics.drawable.BitmapDrawable;
4220c95f854e54b71caa49f0efe07d47d1e6afd435Makoto Onukiimport android.graphics.drawable.Drawable;
432d895c3efd625e09e9f2cc4d0c7131b34f52f154Makoto Onukiimport android.graphics.drawable.Icon;
444f58263d02f296430a9653126d28501e95c7bb6cAmith Yamasaniimport android.os.Bundle;
45b42c89bfb0415d2a4b1d8b7247309f15fd348974Kenny Guyimport android.os.Handler;
46b42c89bfb0415d2a4b1d8b7247309f15fd348974Kenny Guyimport android.os.Looper;
47b42c89bfb0415d2a4b1d8b7247309f15fd348974Kenny Guyimport android.os.Message;
482d895c3efd625e09e9f2cc4d0c7131b34f52f154Makoto Onukiimport android.os.Parcel;
496f7362d92573e4ae693bc513dca586d6a4eb087bMakoto Onukiimport android.os.ParcelFileDescriptor;
502d895c3efd625e09e9f2cc4d0c7131b34f52f154Makoto Onukiimport android.os.Parcelable;
514f58263d02f296430a9653126d28501e95c7bb6cAmith Yamasaniimport android.os.RemoteException;
525ba0d3e3a3035b67d2ce3a59975145b1e0061ef4Makoto Onukiimport android.os.ServiceManager;
534f58263d02f296430a9653126d28501e95c7bb6cAmith Yamasaniimport android.os.UserHandle;
54e781c81d3394642583d555e7a5d6f6f8f63bc538Amith Yamasaniimport android.os.UserManager;
5504b9aab94576411b9f59aa49d87080976ee6fa46Makoto Onukiimport android.util.DisplayMetrics;
564f58263d02f296430a9653126d28501e95c7bb6cAmith Yamasaniimport android.util.Log;
574f58263d02f296430a9653126d28501e95c7bb6cAmith Yamasani
587c7fbf6f45925b93833ab9d946b6704da0caf1fcMakoto Onukiimport com.android.internal.util.Preconditions;
597c7fbf6f45925b93833ab9d946b6704da0caf1fcMakoto Onuki
6004b9aab94576411b9f59aa49d87080976ee6fa46Makoto Onukiimport java.io.IOException;
616f7362d92573e4ae693bc513dca586d6a4eb087bMakoto Onukiimport java.lang.annotation.Retention;
626f7362d92573e4ae693bc513dca586d6a4eb087bMakoto Onukiimport java.lang.annotation.RetentionPolicy;
634f58263d02f296430a9653126d28501e95c7bb6cAmith Yamasaniimport java.util.ArrayList;
64b6d3523dfb5d73ddda4b750a82c059cdc42acf8eMakoto Onukiimport java.util.Arrays;
654f58263d02f296430a9653126d28501e95c7bb6cAmith Yamasaniimport java.util.Collections;
664f58263d02f296430a9653126d28501e95c7bb6cAmith Yamasaniimport java.util.List;
674f58263d02f296430a9653126d28501e95c7bb6cAmith Yamasani
684f58263d02f296430a9653126d28501e95c7bb6cAmith Yamasani/**
694f58263d02f296430a9653126d28501e95c7bb6cAmith Yamasani * Class for retrieving a list of launchable activities for the current user and any associated
70aecbd037514af1bff0f5ca50932241776d6c5fc3Makoto Onuki * managed profiles that are visible to the current user, which can be retrieved with
71aecbd037514af1bff0f5ca50932241776d6c5fc3Makoto Onuki * {@link #getProfiles}. This is mainly for use by launchers.
72aecbd037514af1bff0f5ca50932241776d6c5fc3Makoto Onuki *
73aecbd037514af1bff0f5ca50932241776d6c5fc3Makoto Onuki * Apps can be queried for each user profile.
744f58263d02f296430a9653126d28501e95c7bb6cAmith Yamasani * Since the PackageManager will not deliver package broadcasts for other profiles, you can register
754f58263d02f296430a9653126d28501e95c7bb6cAmith Yamasani * for package changes here.
76e781c81d3394642583d555e7a5d6f6f8f63bc538Amith Yamasani * <p>
77e781c81d3394642583d555e7a5d6f6f8f63bc538Amith Yamasani * To watch for managed profiles being added or removed, register for the following broadcasts:
78e781c81d3394642583d555e7a5d6f6f8f63bc538Amith Yamasani * {@link Intent#ACTION_MANAGED_PROFILE_ADDED} and {@link Intent#ACTION_MANAGED_PROFILE_REMOVED}.
79e781c81d3394642583d555e7a5d6f6f8f63bc538Amith Yamasani * <p>
80aecbd037514af1bff0f5ca50932241776d6c5fc3Makoto Onuki * Note as of Android O, apps on a managed profile are no longer allowed to access apps on the
81aecbd037514af1bff0f5ca50932241776d6c5fc3Makoto Onuki * main profile.  Apps can only access profiles returned by {@link #getProfiles()}.
824f58263d02f296430a9653126d28501e95c7bb6cAmith Yamasani */
83d86b8fea43ebb6e5c31691b44d8ceb0d8d3c9072Jeff Sharkey@SystemService(Context.LAUNCHER_APPS_SERVICE)
844f58263d02f296430a9653126d28501e95c7bb6cAmith Yamasanipublic class LauncherApps {
854f58263d02f296430a9653126d28501e95c7bb6cAmith Yamasani
864f58263d02f296430a9653126d28501e95c7bb6cAmith Yamasani    static final String TAG = "LauncherApps";
874f58263d02f296430a9653126d28501e95c7bb6cAmith Yamasani    static final boolean DEBUG = false;
884f58263d02f296430a9653126d28501e95c7bb6cAmith Yamasani
892d895c3efd625e09e9f2cc4d0c7131b34f52f154Makoto Onuki    /**
902d895c3efd625e09e9f2cc4d0c7131b34f52f154Makoto Onuki     * Activity Action: For the default launcher to show the confirmation dialog to create
912d895c3efd625e09e9f2cc4d0c7131b34f52f154Makoto Onuki     * a pinned shortcut.
922d895c3efd625e09e9f2cc4d0c7131b34f52f154Makoto Onuki     *
932d895c3efd625e09e9f2cc4d0c7131b34f52f154Makoto Onuki     * <p>See the {@link ShortcutManager} javadoc for details.
942d895c3efd625e09e9f2cc4d0c7131b34f52f154Makoto Onuki     *
952d895c3efd625e09e9f2cc4d0c7131b34f52f154Makoto Onuki     * <p>
962d895c3efd625e09e9f2cc4d0c7131b34f52f154Makoto Onuki     * Use {@link #getPinItemRequest(Intent)} to get a {@link PinItemRequest} object,
972d895c3efd625e09e9f2cc4d0c7131b34f52f154Makoto Onuki     * and call {@link PinItemRequest#accept(Bundle)}
982d895c3efd625e09e9f2cc4d0c7131b34f52f154Makoto Onuki     * if the user accepts.  If the user doesn't accept, no further action is required.
992d895c3efd625e09e9f2cc4d0c7131b34f52f154Makoto Onuki     *
1002d895c3efd625e09e9f2cc4d0c7131b34f52f154Makoto Onuki     * @see #EXTRA_PIN_ITEM_REQUEST
1012d895c3efd625e09e9f2cc4d0c7131b34f52f154Makoto Onuki     */
1022d895c3efd625e09e9f2cc4d0c7131b34f52f154Makoto Onuki    @SdkConstant(SdkConstantType.ACTIVITY_INTENT_ACTION)
1037f7372ae2abeecb564d426ec3efbfa039c797885Sunny Goyal    public static final String ACTION_CONFIRM_PIN_SHORTCUT =
1047f7372ae2abeecb564d426ec3efbfa039c797885Sunny Goyal            "android.content.pm.action.CONFIRM_PIN_SHORTCUT";
1052d895c3efd625e09e9f2cc4d0c7131b34f52f154Makoto Onuki
1062d895c3efd625e09e9f2cc4d0c7131b34f52f154Makoto Onuki    /**
1077f7372ae2abeecb564d426ec3efbfa039c797885Sunny Goyal     * Activity Action: For the default launcher to show the confirmation dialog to create
1087f7372ae2abeecb564d426ec3efbfa039c797885Sunny Goyal     * a pinned app widget.
1097f7372ae2abeecb564d426ec3efbfa039c797885Sunny Goyal     *
1107f7372ae2abeecb564d426ec3efbfa039c797885Sunny Goyal     * <p>See the {@link android.appwidget.AppWidgetManager#requestPinAppWidget} javadoc for
1117f7372ae2abeecb564d426ec3efbfa039c797885Sunny Goyal     * details.
1127f7372ae2abeecb564d426ec3efbfa039c797885Sunny Goyal     *
1137f7372ae2abeecb564d426ec3efbfa039c797885Sunny Goyal     * <p>
1147f7372ae2abeecb564d426ec3efbfa039c797885Sunny Goyal     * Use {@link #getPinItemRequest(Intent)} to get a {@link PinItemRequest} object,
1157f7372ae2abeecb564d426ec3efbfa039c797885Sunny Goyal     * and call {@link PinItemRequest#accept(Bundle)}
1167f7372ae2abeecb564d426ec3efbfa039c797885Sunny Goyal     * if the user accepts.  If the user doesn't accept, no further action is required.
1177f7372ae2abeecb564d426ec3efbfa039c797885Sunny Goyal     *
1187f7372ae2abeecb564d426ec3efbfa039c797885Sunny Goyal     * @see #EXTRA_PIN_ITEM_REQUEST
1197f7372ae2abeecb564d426ec3efbfa039c797885Sunny Goyal     */
1207f7372ae2abeecb564d426ec3efbfa039c797885Sunny Goyal    @SdkConstant(SdkConstantType.ACTIVITY_INTENT_ACTION)
1217f7372ae2abeecb564d426ec3efbfa039c797885Sunny Goyal    public static final String ACTION_CONFIRM_PIN_APPWIDGET =
1227f7372ae2abeecb564d426ec3efbfa039c797885Sunny Goyal            "android.content.pm.action.CONFIRM_PIN_APPWIDGET";
1237f7372ae2abeecb564d426ec3efbfa039c797885Sunny Goyal
1247f7372ae2abeecb564d426ec3efbfa039c797885Sunny Goyal    /**
1257f7372ae2abeecb564d426ec3efbfa039c797885Sunny Goyal     * An extra for {@link #ACTION_CONFIRM_PIN_SHORTCUT} &amp; {@link #ACTION_CONFIRM_PIN_APPWIDGET}
1267f7372ae2abeecb564d426ec3efbfa039c797885Sunny Goyal     * containing a {@link PinItemRequest} of appropriate type asked to pin.
1272d895c3efd625e09e9f2cc4d0c7131b34f52f154Makoto Onuki     *
1282d895c3efd625e09e9f2cc4d0c7131b34f52f154Makoto Onuki     * <p>A helper function {@link #getPinItemRequest(Intent)} can be used
1292d895c3efd625e09e9f2cc4d0c7131b34f52f154Makoto Onuki     * instead of using this constant directly.
1302d895c3efd625e09e9f2cc4d0c7131b34f52f154Makoto Onuki     *
1317f7372ae2abeecb564d426ec3efbfa039c797885Sunny Goyal     * @see #ACTION_CONFIRM_PIN_SHORTCUT
1327f7372ae2abeecb564d426ec3efbfa039c797885Sunny Goyal     * @see #ACTION_CONFIRM_PIN_APPWIDGET
1332d895c3efd625e09e9f2cc4d0c7131b34f52f154Makoto Onuki     */
1342d895c3efd625e09e9f2cc4d0c7131b34f52f154Makoto Onuki    public static final String EXTRA_PIN_ITEM_REQUEST =
1352d895c3efd625e09e9f2cc4d0c7131b34f52f154Makoto Onuki            "android.content.pm.extra.PIN_ITEM_REQUEST";
1362d895c3efd625e09e9f2cc4d0c7131b34f52f154Makoto Onuki
137de3c16c8057b61bb3cc2e0c3d5603730f5841c51Makoto Onuki    private final Context mContext;
138de3c16c8057b61bb3cc2e0c3d5603730f5841c51Makoto Onuki    private final ILauncherApps mService;
139de3c16c8057b61bb3cc2e0c3d5603730f5841c51Makoto Onuki    private final PackageManager mPm;
140de3c16c8057b61bb3cc2e0c3d5603730f5841c51Makoto Onuki    private final UserManager mUserManager;
1414f58263d02f296430a9653126d28501e95c7bb6cAmith Yamasani
142b42c89bfb0415d2a4b1d8b7247309f15fd348974Kenny Guy    private List<CallbackMessageHandler> mCallbacks
143b42c89bfb0415d2a4b1d8b7247309f15fd348974Kenny Guy            = new ArrayList<CallbackMessageHandler>();
144c0154537b0b7926ce6a3c778597b3c2735ca5497Kenny Guy
145c0154537b0b7926ce6a3c778597b3c2735ca5497Kenny Guy    /**
146c0154537b0b7926ce6a3c778597b3c2735ca5497Kenny Guy     * Callbacks for package changes to this and related managed profiles.
147c0154537b0b7926ce6a3c778597b3c2735ca5497Kenny Guy     */
148f939dbaf766bd81b10bfc44fd493647180eabad8Kenny Guy    public static abstract class Callback {
149c0154537b0b7926ce6a3c778597b3c2735ca5497Kenny Guy        /**
150c0154537b0b7926ce6a3c778597b3c2735ca5497Kenny Guy         * Indicates that a package was removed from the specified profile.
151c0154537b0b7926ce6a3c778597b3c2735ca5497Kenny Guy         *
152b42c89bfb0415d2a4b1d8b7247309f15fd348974Kenny Guy         * If a package is removed while being updated onPackageChanged will be
153b42c89bfb0415d2a4b1d8b7247309f15fd348974Kenny Guy         * called instead.
154b42c89bfb0415d2a4b1d8b7247309f15fd348974Kenny Guy         *
155c0154537b0b7926ce6a3c778597b3c2735ca5497Kenny Guy         * @param packageName The name of the package that was removed.
156c0154537b0b7926ce6a3c778597b3c2735ca5497Kenny Guy         * @param user The UserHandle of the profile that generated the change.
157c0154537b0b7926ce6a3c778597b3c2735ca5497Kenny Guy         */
158c0154537b0b7926ce6a3c778597b3c2735ca5497Kenny Guy        abstract public void onPackageRemoved(String packageName, UserHandle user);
159c0154537b0b7926ce6a3c778597b3c2735ca5497Kenny Guy
160c0154537b0b7926ce6a3c778597b3c2735ca5497Kenny Guy        /**
161c0154537b0b7926ce6a3c778597b3c2735ca5497Kenny Guy         * Indicates that a package was added to the specified profile.
162c0154537b0b7926ce6a3c778597b3c2735ca5497Kenny Guy         *
163b42c89bfb0415d2a4b1d8b7247309f15fd348974Kenny Guy         * If a package is added while being updated then onPackageChanged will be
164b42c89bfb0415d2a4b1d8b7247309f15fd348974Kenny Guy         * called instead.
165b42c89bfb0415d2a4b1d8b7247309f15fd348974Kenny Guy         *
166c0154537b0b7926ce6a3c778597b3c2735ca5497Kenny Guy         * @param packageName The name of the package that was added.
167c0154537b0b7926ce6a3c778597b3c2735ca5497Kenny Guy         * @param user The UserHandle of the profile that generated the change.
168c0154537b0b7926ce6a3c778597b3c2735ca5497Kenny Guy         */
169c0154537b0b7926ce6a3c778597b3c2735ca5497Kenny Guy        abstract public void onPackageAdded(String packageName, UserHandle user);
170c0154537b0b7926ce6a3c778597b3c2735ca5497Kenny Guy
171c0154537b0b7926ce6a3c778597b3c2735ca5497Kenny Guy        /**
172c0154537b0b7926ce6a3c778597b3c2735ca5497Kenny Guy         * Indicates that a package was modified in the specified profile.
173b42c89bfb0415d2a4b1d8b7247309f15fd348974Kenny Guy         * This can happen, for example, when the package is updated or when
174b42c89bfb0415d2a4b1d8b7247309f15fd348974Kenny Guy         * one or more components are enabled or disabled.
175c0154537b0b7926ce6a3c778597b3c2735ca5497Kenny Guy         *
176c0154537b0b7926ce6a3c778597b3c2735ca5497Kenny Guy         * @param packageName The name of the package that has changed.
177c0154537b0b7926ce6a3c778597b3c2735ca5497Kenny Guy         * @param user The UserHandle of the profile that generated the change.
178c0154537b0b7926ce6a3c778597b3c2735ca5497Kenny Guy         */
179c0154537b0b7926ce6a3c778597b3c2735ca5497Kenny Guy        abstract public void onPackageChanged(String packageName, UserHandle user);
180c0154537b0b7926ce6a3c778597b3c2735ca5497Kenny Guy
181c0154537b0b7926ce6a3c778597b3c2735ca5497Kenny Guy        /**
182c0154537b0b7926ce6a3c778597b3c2735ca5497Kenny Guy         * Indicates that one or more packages have become available. For
183c0154537b0b7926ce6a3c778597b3c2735ca5497Kenny Guy         * example, this can happen when a removable storage card has
184c0154537b0b7926ce6a3c778597b3c2735ca5497Kenny Guy         * reappeared.
185c0154537b0b7926ce6a3c778597b3c2735ca5497Kenny Guy         *
186c0154537b0b7926ce6a3c778597b3c2735ca5497Kenny Guy         * @param packageNames The names of the packages that have become
187c0154537b0b7926ce6a3c778597b3c2735ca5497Kenny Guy         *            available.
188c0154537b0b7926ce6a3c778597b3c2735ca5497Kenny Guy         * @param user The UserHandle of the profile that generated the change.
189c0154537b0b7926ce6a3c778597b3c2735ca5497Kenny Guy         * @param replacing Indicates whether these packages are replacing
190c0154537b0b7926ce6a3c778597b3c2735ca5497Kenny Guy         *            existing ones.
191c0154537b0b7926ce6a3c778597b3c2735ca5497Kenny Guy         */
192c0154537b0b7926ce6a3c778597b3c2735ca5497Kenny Guy        abstract public void onPackagesAvailable(String[] packageNames, UserHandle user,
193c0154537b0b7926ce6a3c778597b3c2735ca5497Kenny Guy                boolean replacing);
194c0154537b0b7926ce6a3c778597b3c2735ca5497Kenny Guy
195c0154537b0b7926ce6a3c778597b3c2735ca5497Kenny Guy        /**
196c0154537b0b7926ce6a3c778597b3c2735ca5497Kenny Guy         * Indicates that one or more packages have become unavailable. For
197c0154537b0b7926ce6a3c778597b3c2735ca5497Kenny Guy         * example, this can happen when a removable storage card has been
198c0154537b0b7926ce6a3c778597b3c2735ca5497Kenny Guy         * removed.
199c0154537b0b7926ce6a3c778597b3c2735ca5497Kenny Guy         *
200c0154537b0b7926ce6a3c778597b3c2735ca5497Kenny Guy         * @param packageNames The names of the packages that have become
201c0154537b0b7926ce6a3c778597b3c2735ca5497Kenny Guy         *            unavailable.
202c0154537b0b7926ce6a3c778597b3c2735ca5497Kenny Guy         * @param user The UserHandle of the profile that generated the change.
203c0154537b0b7926ce6a3c778597b3c2735ca5497Kenny Guy         * @param replacing Indicates whether the packages are about to be
204c0154537b0b7926ce6a3c778597b3c2735ca5497Kenny Guy         *            replaced with new versions.
205c0154537b0b7926ce6a3c778597b3c2735ca5497Kenny Guy         */
206c0154537b0b7926ce6a3c778597b3c2735ca5497Kenny Guy        abstract public void onPackagesUnavailable(String[] packageNames, UserHandle user,
207c0154537b0b7926ce6a3c778597b3c2735ca5497Kenny Guy                boolean replacing);
208772427555f2624b38124ab8e586ac0ccc451eb53Kenny Guy
209772427555f2624b38124ab8e586ac0ccc451eb53Kenny Guy        /**
210772427555f2624b38124ab8e586ac0ccc451eb53Kenny Guy         * Indicates that one or more packages have been suspended. For
211772427555f2624b38124ab8e586ac0ccc451eb53Kenny Guy         * example, this can happen when a Device Administrator suspends
212772427555f2624b38124ab8e586ac0ccc451eb53Kenny Guy         * an applicaton.
213772427555f2624b38124ab8e586ac0ccc451eb53Kenny Guy         *
21419b41f34a5cb29c621848e352220017b46cf66f1Suprabh Shukla         * <p>Note: On devices running {@link android.os.Build.VERSION_CODES#P Android P} or higher,
21596212bca06842f223a0e9e377e2c00a2008c96a2Suprabh Shukla         * any apps that override {@link #onPackagesSuspended(String[], UserHandle, Bundle)} will
21619b41f34a5cb29c621848e352220017b46cf66f1Suprabh Shukla         * not receive this callback.
21719b41f34a5cb29c621848e352220017b46cf66f1Suprabh Shukla         *
218772427555f2624b38124ab8e586ac0ccc451eb53Kenny Guy         * @param packageNames The names of the packages that have just been
219772427555f2624b38124ab8e586ac0ccc451eb53Kenny Guy         *            suspended.
220772427555f2624b38124ab8e586ac0ccc451eb53Kenny Guy         * @param user The UserHandle of the profile that generated the change.
221772427555f2624b38124ab8e586ac0ccc451eb53Kenny Guy         */
222772427555f2624b38124ab8e586ac0ccc451eb53Kenny Guy        public void onPackagesSuspended(String[] packageNames, UserHandle user) {
223772427555f2624b38124ab8e586ac0ccc451eb53Kenny Guy        }
224772427555f2624b38124ab8e586ac0ccc451eb53Kenny Guy
225772427555f2624b38124ab8e586ac0ccc451eb53Kenny Guy        /**
22619b41f34a5cb29c621848e352220017b46cf66f1Suprabh Shukla         * Indicates that one or more packages have been suspended. A device administrator or an app
22719b41f34a5cb29c621848e352220017b46cf66f1Suprabh Shukla         * with {@code android.permission.SUSPEND_APPS} can do this.
22819b41f34a5cb29c621848e352220017b46cf66f1Suprabh Shukla         *
22996212bca06842f223a0e9e377e2c00a2008c96a2Suprabh Shukla         * <p>A suspending app with the permission {@code android.permission.SUSPEND_APPS} can
23096212bca06842f223a0e9e377e2c00a2008c96a2Suprabh Shukla         * optionally provide a {@link Bundle} of extra information that it deems helpful for the
23196212bca06842f223a0e9e377e2c00a2008c96a2Suprabh Shukla         * launcher to handle the suspended state of these packages. The contents of this
2323e03ab93121ec8c3e01474218a3dc8a7082153c4Suprabh Shukla         * {@link Bundle} are supposed to be a contract between the suspending app and the launcher.
23396212bca06842f223a0e9e377e2c00a2008c96a2Suprabh Shukla         *
23419b41f34a5cb29c621848e352220017b46cf66f1Suprabh Shukla         * @param packageNames The names of the packages that have just been suspended.
23519b41f34a5cb29c621848e352220017b46cf66f1Suprabh Shukla         * @param user the user for which the given packages were suspended.
23696212bca06842f223a0e9e377e2c00a2008c96a2Suprabh Shukla         * @param launcherExtras A {@link Bundle} of extras for the launcher, if provided to the
23796212bca06842f223a0e9e377e2c00a2008c96a2Suprabh Shukla         *                      system, {@code null} otherwise.
23819b41f34a5cb29c621848e352220017b46cf66f1Suprabh Shukla         * @see PackageManager#isPackageSuspended()
23919b41f34a5cb29c621848e352220017b46cf66f1Suprabh Shukla         * @see #getSuspendedPackageLauncherExtras(String, UserHandle)
24019b41f34a5cb29c621848e352220017b46cf66f1Suprabh Shukla         */
24196212bca06842f223a0e9e377e2c00a2008c96a2Suprabh Shukla        public void onPackagesSuspended(String[] packageNames, UserHandle user,
24296212bca06842f223a0e9e377e2c00a2008c96a2Suprabh Shukla                @Nullable Bundle launcherExtras) {
24319b41f34a5cb29c621848e352220017b46cf66f1Suprabh Shukla            onPackagesSuspended(packageNames, user);
24419b41f34a5cb29c621848e352220017b46cf66f1Suprabh Shukla        }
24519b41f34a5cb29c621848e352220017b46cf66f1Suprabh Shukla
24619b41f34a5cb29c621848e352220017b46cf66f1Suprabh Shukla        /**
247772427555f2624b38124ab8e586ac0ccc451eb53Kenny Guy         * Indicates that one or more packages have been unsuspended. For
248772427555f2624b38124ab8e586ac0ccc451eb53Kenny Guy         * example, this can happen when a Device Administrator unsuspends
249772427555f2624b38124ab8e586ac0ccc451eb53Kenny Guy         * an applicaton.
250772427555f2624b38124ab8e586ac0ccc451eb53Kenny Guy         *
251772427555f2624b38124ab8e586ac0ccc451eb53Kenny Guy         * @param packageNames The names of the packages that have just been
252772427555f2624b38124ab8e586ac0ccc451eb53Kenny Guy         *            unsuspended.
253772427555f2624b38124ab8e586ac0ccc451eb53Kenny Guy         * @param user The UserHandle of the profile that generated the change.
254772427555f2624b38124ab8e586ac0ccc451eb53Kenny Guy         */
255772427555f2624b38124ab8e586ac0ccc451eb53Kenny Guy        public void onPackagesUnsuspended(String[] packageNames, UserHandle user) {
256772427555f2624b38124ab8e586ac0ccc451eb53Kenny Guy        }
2576f7362d92573e4ae693bc513dca586d6a4eb087bMakoto Onuki
2586f7362d92573e4ae693bc513dca586d6a4eb087bMakoto Onuki        /**
259fe9c9669a4d727a99e78db73ce8708c7505a3b70Makoto Onuki         * Indicates that one or more shortcuts of any kind (dynamic, pinned, or manifest)
2606f7362d92573e4ae693bc513dca586d6a4eb087bMakoto Onuki         * have been added, updated or removed.
2616f7362d92573e4ae693bc513dca586d6a4eb087bMakoto Onuki         *
2622d5b465fa9235e66ec176f6d6ffaaa0c18143e41Makoto Onuki         * <p>Only the applications that are allowed to access the shortcut information,
2632d5b465fa9235e66ec176f6d6ffaaa0c18143e41Makoto Onuki         * as defined in {@link #hasShortcutHostPermission()}, will receive it.
2642d5b465fa9235e66ec176f6d6ffaaa0c18143e41Makoto Onuki         *
2656f7362d92573e4ae693bc513dca586d6a4eb087bMakoto Onuki         * @param packageName The name of the package that has the shortcuts.
266fe9c9669a4d727a99e78db73ce8708c7505a3b70Makoto Onuki         * @param shortcuts All shortcuts from the package (dynamic, manifest and/or pinned).
267fe9c9669a4d727a99e78db73ce8708c7505a3b70Makoto Onuki         *    Only "key" information will be provided, as defined in
2684d6b87ffdf06df3303239130ced685bc1a3fae50Makoto Onuki         *    {@link ShortcutInfo#hasKeyFieldsOnly()}.
2696f7362d92573e4ae693bc513dca586d6a4eb087bMakoto Onuki         * @param user The UserHandle of the profile that generated the change.
2704a91096a4ccdeeccfbd96da4bc88d874ec0bf451Makoto Onuki         *
2714a91096a4ccdeeccfbd96da4bc88d874ec0bf451Makoto Onuki         * @see ShortcutManager
2726f7362d92573e4ae693bc513dca586d6a4eb087bMakoto Onuki         */
2736f7362d92573e4ae693bc513dca586d6a4eb087bMakoto Onuki        public void onShortcutsChanged(@NonNull String packageName,
2746f7362d92573e4ae693bc513dca586d6a4eb087bMakoto Onuki                @NonNull List<ShortcutInfo> shortcuts, @NonNull UserHandle user) {
2756f7362d92573e4ae693bc513dca586d6a4eb087bMakoto Onuki        }
2766f7362d92573e4ae693bc513dca586d6a4eb087bMakoto Onuki    }
2776f7362d92573e4ae693bc513dca586d6a4eb087bMakoto Onuki
2786f7362d92573e4ae693bc513dca586d6a4eb087bMakoto Onuki    /**
2796f7362d92573e4ae693bc513dca586d6a4eb087bMakoto Onuki     * Represents a query passed to {@link #getShortcuts(ShortcutQuery, UserHandle)}.
2806f7362d92573e4ae693bc513dca586d6a4eb087bMakoto Onuki     */
2816f7362d92573e4ae693bc513dca586d6a4eb087bMakoto Onuki    public static class ShortcutQuery {
2826f7362d92573e4ae693bc513dca586d6a4eb087bMakoto Onuki        /**
2836f7362d92573e4ae693bc513dca586d6a4eb087bMakoto Onuki         * Include dynamic shortcuts in the result.
2846f7362d92573e4ae693bc513dca586d6a4eb087bMakoto Onuki         */
285b5a012fd6f088629746057a3902b5926f9fe8e08Makoto Onuki        public static final int FLAG_MATCH_DYNAMIC = 1 << 0;
286b5a012fd6f088629746057a3902b5926f9fe8e08Makoto Onuki
287b5a012fd6f088629746057a3902b5926f9fe8e08Makoto Onuki        /** @hide kept for unit tests */
288b5a012fd6f088629746057a3902b5926f9fe8e08Makoto Onuki        @Deprecated
289b5a012fd6f088629746057a3902b5926f9fe8e08Makoto Onuki        public static final int FLAG_GET_DYNAMIC = FLAG_MATCH_DYNAMIC;
2906f7362d92573e4ae693bc513dca586d6a4eb087bMakoto Onuki
2916f7362d92573e4ae693bc513dca586d6a4eb087bMakoto Onuki        /**
2926f7362d92573e4ae693bc513dca586d6a4eb087bMakoto Onuki         * Include pinned shortcuts in the result.
29388b4dcc363aa6906da2dd6213bf583d61ce74c7fMakoto Onuki         *
29488b4dcc363aa6906da2dd6213bf583d61ce74c7fMakoto Onuki         * <p>If you are the selected assistant app, and wishes to fetch all shortcuts that the
29588b4dcc363aa6906da2dd6213bf583d61ce74c7fMakoto Onuki         * user owns on the launcher (or by other launchers, in case the user has multiple), use
29688b4dcc363aa6906da2dd6213bf583d61ce74c7fMakoto Onuki         * {@link #FLAG_MATCH_PINNED_BY_ANY_LAUNCHER} instead.
29788b4dcc363aa6906da2dd6213bf583d61ce74c7fMakoto Onuki         *
29888b4dcc363aa6906da2dd6213bf583d61ce74c7fMakoto Onuki         * <p>If you're a regular launcher app, there's no way to get shortcuts pinned by other
29988b4dcc363aa6906da2dd6213bf583d61ce74c7fMakoto Onuki         * launchers, and {@link #FLAG_MATCH_PINNED_BY_ANY_LAUNCHER} will be ignored. So use this
30088b4dcc363aa6906da2dd6213bf583d61ce74c7fMakoto Onuki         * flag to get own pinned shortcuts.
3016f7362d92573e4ae693bc513dca586d6a4eb087bMakoto Onuki         */
302b5a012fd6f088629746057a3902b5926f9fe8e08Makoto Onuki        public static final int FLAG_MATCH_PINNED = 1 << 1;
303b5a012fd6f088629746057a3902b5926f9fe8e08Makoto Onuki
304b5a012fd6f088629746057a3902b5926f9fe8e08Makoto Onuki        /** @hide kept for unit tests */
305b5a012fd6f088629746057a3902b5926f9fe8e08Makoto Onuki        @Deprecated
306b5a012fd6f088629746057a3902b5926f9fe8e08Makoto Onuki        public static final int FLAG_GET_PINNED = FLAG_MATCH_PINNED;
3076f7362d92573e4ae693bc513dca586d6a4eb087bMakoto Onuki
3086f7362d92573e4ae693bc513dca586d6a4eb087bMakoto Onuki        /**
30922fcc68e6be0edaa98f3dacf79d580a5e5d50005Makoto Onuki         * Include manifest shortcuts in the result.
31022fcc68e6be0edaa98f3dacf79d580a5e5d50005Makoto Onuki         */
311b5a012fd6f088629746057a3902b5926f9fe8e08Makoto Onuki        public static final int FLAG_MATCH_MANIFEST = 1 << 3;
312b5a012fd6f088629746057a3902b5926f9fe8e08Makoto Onuki
313b5a012fd6f088629746057a3902b5926f9fe8e08Makoto Onuki        /** @hide kept for unit tests */
314b5a012fd6f088629746057a3902b5926f9fe8e08Makoto Onuki        @Deprecated
315b5a012fd6f088629746057a3902b5926f9fe8e08Makoto Onuki        public static final int FLAG_GET_MANIFEST = FLAG_MATCH_MANIFEST;
31622fcc68e6be0edaa98f3dacf79d580a5e5d50005Makoto Onuki
31758fc95dc578244b7beb687a48184045dcce788b8Hakan Seyalioglu        /**
31835559d6125045a38a01ba30a32f7ca36abfeebacMakoto Onuki         * Include all pinned shortcuts by any launchers, not just by the caller,
319634cecb899f4dabccf57411f48838d99650a9479Makoto Onuki         * in the result.
32035559d6125045a38a01ba30a32f7ca36abfeebacMakoto Onuki         *
32188b4dcc363aa6906da2dd6213bf583d61ce74c7fMakoto Onuki         * <p>The caller must be the selected assistant app to use this flag, or have the system
32235559d6125045a38a01ba30a32f7ca36abfeebacMakoto Onuki         * {@code ACCESS_SHORTCUTS} permission.
32388b4dcc363aa6906da2dd6213bf583d61ce74c7fMakoto Onuki         *
32488b4dcc363aa6906da2dd6213bf583d61ce74c7fMakoto Onuki         * <p>If you are the selected assistant app, and wishes to fetch all shortcuts that the
32588b4dcc363aa6906da2dd6213bf583d61ce74c7fMakoto Onuki         * user owns on the launcher (or by other launchers, in case the user has multiple), use
32688b4dcc363aa6906da2dd6213bf583d61ce74c7fMakoto Onuki         * {@link #FLAG_MATCH_PINNED_BY_ANY_LAUNCHER} instead.
32788b4dcc363aa6906da2dd6213bf583d61ce74c7fMakoto Onuki         *
32888b4dcc363aa6906da2dd6213bf583d61ce74c7fMakoto Onuki         * <p>If you're a regular launcher app (or any app that's not the selected assistant app)
32988b4dcc363aa6906da2dd6213bf583d61ce74c7fMakoto Onuki         * then this flag will be ignored.
330634cecb899f4dabccf57411f48838d99650a9479Makoto Onuki         */
33135559d6125045a38a01ba30a32f7ca36abfeebacMakoto Onuki        public static final int FLAG_MATCH_PINNED_BY_ANY_LAUNCHER = 1 << 10;
332634cecb899f4dabccf57411f48838d99650a9479Makoto Onuki
333634cecb899f4dabccf57411f48838d99650a9479Makoto Onuki        /**
334634cecb899f4dabccf57411f48838d99650a9479Makoto Onuki         * FLAG_MATCH_DYNAMIC | FLAG_MATCH_PINNED | FLAG_MATCH_MANIFEST
33558fc95dc578244b7beb687a48184045dcce788b8Hakan Seyalioglu         * @hide
33658fc95dc578244b7beb687a48184045dcce788b8Hakan Seyalioglu         */
337b5a012fd6f088629746057a3902b5926f9fe8e08Makoto Onuki        public static final int FLAG_MATCH_ALL_KINDS =
338634cecb899f4dabccf57411f48838d99650a9479Makoto Onuki                FLAG_MATCH_DYNAMIC | FLAG_MATCH_PINNED | FLAG_MATCH_MANIFEST;
339634cecb899f4dabccf57411f48838d99650a9479Makoto Onuki
340634cecb899f4dabccf57411f48838d99650a9479Makoto Onuki        /**
341634cecb899f4dabccf57411f48838d99650a9479Makoto Onuki         * FLAG_MATCH_DYNAMIC | FLAG_MATCH_PINNED | FLAG_MATCH_MANIFEST | FLAG_MATCH_ALL_PINNED
342634cecb899f4dabccf57411f48838d99650a9479Makoto Onuki         * @hide
343634cecb899f4dabccf57411f48838d99650a9479Makoto Onuki         */
344634cecb899f4dabccf57411f48838d99650a9479Makoto Onuki        public static final int FLAG_MATCH_ALL_KINDS_WITH_ALL_PINNED =
34535559d6125045a38a01ba30a32f7ca36abfeebacMakoto Onuki                FLAG_MATCH_ALL_KINDS | FLAG_MATCH_PINNED_BY_ANY_LAUNCHER;
3464d6b87ffdf06df3303239130ced685bc1a3fae50Makoto Onuki
347b5a012fd6f088629746057a3902b5926f9fe8e08Makoto Onuki        /** @hide kept for unit tests */
348b5a012fd6f088629746057a3902b5926f9fe8e08Makoto Onuki        @Deprecated
349b5a012fd6f088629746057a3902b5926f9fe8e08Makoto Onuki        public static final int FLAG_GET_ALL_KINDS = FLAG_MATCH_ALL_KINDS;
350b5a012fd6f088629746057a3902b5926f9fe8e08Makoto Onuki
35122fcc68e6be0edaa98f3dacf79d580a5e5d50005Makoto Onuki        /**
352fe9c9669a4d727a99e78db73ce8708c7505a3b70Makoto Onuki         * Requests "key" fields only.  See {@link ShortcutInfo#hasKeyFieldsOnly()}'s javadoc to
353fe9c9669a4d727a99e78db73ce8708c7505a3b70Makoto Onuki         * see which fields fields "key".
354fe9c9669a4d727a99e78db73ce8708c7505a3b70Makoto Onuki         * This allows quicker access to shortcut information in order to
355fe9c9669a4d727a99e78db73ce8708c7505a3b70Makoto Onuki         * determine whether the caller's in-memory cache needs to be updated.
3564a91096a4ccdeeccfbd96da4bc88d874ec0bf451Makoto Onuki         *
357fe9c9669a4d727a99e78db73ce8708c7505a3b70Makoto Onuki         * <p>Typically, launcher applications cache all or most shortcut information
358fe9c9669a4d727a99e78db73ce8708c7505a3b70Makoto Onuki         * in memory in order to show shortcuts without a delay.
359fe9c9669a4d727a99e78db73ce8708c7505a3b70Makoto Onuki         *
360fe9c9669a4d727a99e78db73ce8708c7505a3b70Makoto Onuki         * When a given launcher application wants to update its cache, such as when its process
361fe9c9669a4d727a99e78db73ce8708c7505a3b70Makoto Onuki         * restarts, it can fetch shortcut information with this flag.
362fe9c9669a4d727a99e78db73ce8708c7505a3b70Makoto Onuki         * The application can then check {@link ShortcutInfo#getLastChangedTimestamp()} for each
363fe9c9669a4d727a99e78db73ce8708c7505a3b70Makoto Onuki         * shortcut, fetching a shortcut's non-key information only if that shortcut has been
364fe9c9669a4d727a99e78db73ce8708c7505a3b70Makoto Onuki         * updated.
3654a91096a4ccdeeccfbd96da4bc88d874ec0bf451Makoto Onuki         *
3664a91096a4ccdeeccfbd96da4bc88d874ec0bf451Makoto Onuki         * @see ShortcutManager
3676f7362d92573e4ae693bc513dca586d6a4eb087bMakoto Onuki         */
3686f7362d92573e4ae693bc513dca586d6a4eb087bMakoto Onuki        public static final int FLAG_GET_KEY_FIELDS_ONLY = 1 << 2;
3696f7362d92573e4ae693bc513dca586d6a4eb087bMakoto Onuki
3706f7362d92573e4ae693bc513dca586d6a4eb087bMakoto Onuki        /** @hide */
371ce8db9911494225fcd99711d7df85a130de5a6ceJeff Sharkey        @IntDef(flag = true, prefix = { "FLAG_" }, value = {
372ce8db9911494225fcd99711d7df85a130de5a6ceJeff Sharkey                FLAG_MATCH_DYNAMIC,
373ce8db9911494225fcd99711d7df85a130de5a6ceJeff Sharkey                FLAG_MATCH_PINNED,
374ce8db9911494225fcd99711d7df85a130de5a6ceJeff Sharkey                FLAG_MATCH_MANIFEST,
375ce8db9911494225fcd99711d7df85a130de5a6ceJeff Sharkey                FLAG_GET_KEY_FIELDS_ONLY,
376ce8db9911494225fcd99711d7df85a130de5a6ceJeff Sharkey                FLAG_MATCH_MANIFEST,
377ce8db9911494225fcd99711d7df85a130de5a6ceJeff Sharkey        })
3786f7362d92573e4ae693bc513dca586d6a4eb087bMakoto Onuki        @Retention(RetentionPolicy.SOURCE)
3796f7362d92573e4ae693bc513dca586d6a4eb087bMakoto Onuki        public @interface QueryFlags {}
3806f7362d92573e4ae693bc513dca586d6a4eb087bMakoto Onuki
3816f7362d92573e4ae693bc513dca586d6a4eb087bMakoto Onuki        long mChangedSince;
3826f7362d92573e4ae693bc513dca586d6a4eb087bMakoto Onuki
3836f7362d92573e4ae693bc513dca586d6a4eb087bMakoto Onuki        @Nullable
3846f7362d92573e4ae693bc513dca586d6a4eb087bMakoto Onuki        String mPackage;
3856f7362d92573e4ae693bc513dca586d6a4eb087bMakoto Onuki
3866f7362d92573e4ae693bc513dca586d6a4eb087bMakoto Onuki        @Nullable
387abe8442951ff88aa01ed882adb54fb1b3472ca3eMakoto Onuki        List<String> mShortcutIds;
388abe8442951ff88aa01ed882adb54fb1b3472ca3eMakoto Onuki
389abe8442951ff88aa01ed882adb54fb1b3472ca3eMakoto Onuki        @Nullable
3906f7362d92573e4ae693bc513dca586d6a4eb087bMakoto Onuki        ComponentName mActivity;
3916f7362d92573e4ae693bc513dca586d6a4eb087bMakoto Onuki
3926f7362d92573e4ae693bc513dca586d6a4eb087bMakoto Onuki        @QueryFlags
3936f7362d92573e4ae693bc513dca586d6a4eb087bMakoto Onuki        int mQueryFlags;
3946f7362d92573e4ae693bc513dca586d6a4eb087bMakoto Onuki
3956f7362d92573e4ae693bc513dca586d6a4eb087bMakoto Onuki        public ShortcutQuery() {
3966f7362d92573e4ae693bc513dca586d6a4eb087bMakoto Onuki        }
3976f7362d92573e4ae693bc513dca586d6a4eb087bMakoto Onuki
3986f7362d92573e4ae693bc513dca586d6a4eb087bMakoto Onuki        /**
399fe9c9669a4d727a99e78db73ce8708c7505a3b70Makoto Onuki         * If non-zero, returns only shortcuts that have been added or updated
400fe9c9669a4d727a99e78db73ce8708c7505a3b70Makoto Onuki         * since the given timestamp, expressed in milliseconds since the Epoch&mdash;see
401fe9c9669a4d727a99e78db73ce8708c7505a3b70Makoto Onuki         * {@link System#currentTimeMillis()}.
4026f7362d92573e4ae693bc513dca586d6a4eb087bMakoto Onuki         */
40322fcc68e6be0edaa98f3dacf79d580a5e5d50005Makoto Onuki        public ShortcutQuery setChangedSince(long changedSince) {
4046f7362d92573e4ae693bc513dca586d6a4eb087bMakoto Onuki            mChangedSince = changedSince;
40522fcc68e6be0edaa98f3dacf79d580a5e5d50005Makoto Onuki            return this;
4066f7362d92573e4ae693bc513dca586d6a4eb087bMakoto Onuki        }
4076f7362d92573e4ae693bc513dca586d6a4eb087bMakoto Onuki
4086f7362d92573e4ae693bc513dca586d6a4eb087bMakoto Onuki        /**
4096f7362d92573e4ae693bc513dca586d6a4eb087bMakoto Onuki         * If non-null, returns only shortcuts from the package.
4106f7362d92573e4ae693bc513dca586d6a4eb087bMakoto Onuki         */
41122fcc68e6be0edaa98f3dacf79d580a5e5d50005Makoto Onuki        public ShortcutQuery setPackage(@Nullable String packageName) {
4126f7362d92573e4ae693bc513dca586d6a4eb087bMakoto Onuki            mPackage = packageName;
41322fcc68e6be0edaa98f3dacf79d580a5e5d50005Makoto Onuki            return this;
4146f7362d92573e4ae693bc513dca586d6a4eb087bMakoto Onuki        }
4156f7362d92573e4ae693bc513dca586d6a4eb087bMakoto Onuki
4166f7362d92573e4ae693bc513dca586d6a4eb087bMakoto Onuki        /**
417abe8442951ff88aa01ed882adb54fb1b3472ca3eMakoto Onuki         * If non-null, return only the specified shortcuts by ID.  When setting this field,
4184a91096a4ccdeeccfbd96da4bc88d874ec0bf451Makoto Onuki         * a package name must also be set with {@link #setPackage}.
419abe8442951ff88aa01ed882adb54fb1b3472ca3eMakoto Onuki         */
42022fcc68e6be0edaa98f3dacf79d580a5e5d50005Makoto Onuki        public ShortcutQuery setShortcutIds(@Nullable List<String> shortcutIds) {
421abe8442951ff88aa01ed882adb54fb1b3472ca3eMakoto Onuki            mShortcutIds = shortcutIds;
42222fcc68e6be0edaa98f3dacf79d580a5e5d50005Makoto Onuki            return this;
423abe8442951ff88aa01ed882adb54fb1b3472ca3eMakoto Onuki        }
424abe8442951ff88aa01ed882adb54fb1b3472ca3eMakoto Onuki
425abe8442951ff88aa01ed882adb54fb1b3472ca3eMakoto Onuki        /**
42622fcc68e6be0edaa98f3dacf79d580a5e5d50005Makoto Onuki         * If non-null, returns only shortcuts associated with the activity; i.e.
42722fcc68e6be0edaa98f3dacf79d580a5e5d50005Makoto Onuki         * {@link ShortcutInfo}s whose {@link ShortcutInfo#getActivity()} are equal
42822fcc68e6be0edaa98f3dacf79d580a5e5d50005Makoto Onuki         * to {@code activity}.
4296f7362d92573e4ae693bc513dca586d6a4eb087bMakoto Onuki         */
43022fcc68e6be0edaa98f3dacf79d580a5e5d50005Makoto Onuki        public ShortcutQuery setActivity(@Nullable ComponentName activity) {
4316f7362d92573e4ae693bc513dca586d6a4eb087bMakoto Onuki            mActivity = activity;
43222fcc68e6be0edaa98f3dacf79d580a5e5d50005Makoto Onuki            return this;
4336f7362d92573e4ae693bc513dca586d6a4eb087bMakoto Onuki        }
4346f7362d92573e4ae693bc513dca586d6a4eb087bMakoto Onuki
43558fc95dc578244b7beb687a48184045dcce788b8Hakan Seyalioglu        /**
436fe9c9669a4d727a99e78db73ce8708c7505a3b70Makoto Onuki         * Set query options.  At least one of the {@code MATCH} flags should be set.  Otherwise,
437fe9c9669a4d727a99e78db73ce8708c7505a3b70Makoto Onuki         * no shortcuts will be returned.
4384a91096a4ccdeeccfbd96da4bc88d874ec0bf451Makoto Onuki         *
439fe9c9669a4d727a99e78db73ce8708c7505a3b70Makoto Onuki         * <ul>
440fe9c9669a4d727a99e78db73ce8708c7505a3b70Makoto Onuki         *     <li>{@link #FLAG_MATCH_DYNAMIC}
441fe9c9669a4d727a99e78db73ce8708c7505a3b70Makoto Onuki         *     <li>{@link #FLAG_MATCH_PINNED}
442fe9c9669a4d727a99e78db73ce8708c7505a3b70Makoto Onuki         *     <li>{@link #FLAG_MATCH_MANIFEST}
443fe9c9669a4d727a99e78db73ce8708c7505a3b70Makoto Onuki         *     <li>{@link #FLAG_GET_KEY_FIELDS_ONLY}
444fe9c9669a4d727a99e78db73ce8708c7505a3b70Makoto Onuki         * </ul>
4456f7362d92573e4ae693bc513dca586d6a4eb087bMakoto Onuki         */
44622fcc68e6be0edaa98f3dacf79d580a5e5d50005Makoto Onuki        public ShortcutQuery setQueryFlags(@QueryFlags int queryFlags) {
4476f7362d92573e4ae693bc513dca586d6a4eb087bMakoto Onuki            mQueryFlags = queryFlags;
44822fcc68e6be0edaa98f3dacf79d580a5e5d50005Makoto Onuki            return this;
4496f7362d92573e4ae693bc513dca586d6a4eb087bMakoto Onuki        }
450c0154537b0b7926ce6a3c778597b3c2735ca5497Kenny Guy    }
4514f58263d02f296430a9653126d28501e95c7bb6cAmith Yamasani
4524f58263d02f296430a9653126d28501e95c7bb6cAmith Yamasani    /** @hide */
4534f58263d02f296430a9653126d28501e95c7bb6cAmith Yamasani    public LauncherApps(Context context, ILauncherApps service) {
4544f58263d02f296430a9653126d28501e95c7bb6cAmith Yamasani        mContext = context;
4554f58263d02f296430a9653126d28501e95c7bb6cAmith Yamasani        mService = service;
456e781c81d3394642583d555e7a5d6f6f8f63bc538Amith Yamasani        mPm = context.getPackageManager();
457de3c16c8057b61bb3cc2e0c3d5603730f5841c51Makoto Onuki        mUserManager = context.getSystemService(UserManager.class);
4584f58263d02f296430a9653126d28501e95c7bb6cAmith Yamasani    }
4594f58263d02f296430a9653126d28501e95c7bb6cAmith Yamasani
4605ba0d3e3a3035b67d2ce3a59975145b1e0061ef4Makoto Onuki    /** @hide */
4615ba0d3e3a3035b67d2ce3a59975145b1e0061ef4Makoto Onuki    @TestApi
4625ba0d3e3a3035b67d2ce3a59975145b1e0061ef4Makoto Onuki    public LauncherApps(Context context) {
4635ba0d3e3a3035b67d2ce3a59975145b1e0061ef4Makoto Onuki        this(context, ILauncherApps.Stub.asInterface(
4645ba0d3e3a3035b67d2ce3a59975145b1e0061ef4Makoto Onuki                ServiceManager.getService(Context.LAUNCHER_APPS_SERVICE)));
4655ba0d3e3a3035b67d2ce3a59975145b1e0061ef4Makoto Onuki    }
4665ba0d3e3a3035b67d2ce3a59975145b1e0061ef4Makoto Onuki
4674f58263d02f296430a9653126d28501e95c7bb6cAmith Yamasani    /**
468de3c16c8057b61bb3cc2e0c3d5603730f5841c51Makoto Onuki     * Show an error log on logcat, when the calling user is a managed profile, and the target
469de3c16c8057b61bb3cc2e0c3d5603730f5841c51Makoto Onuki     * user is different from the calling user, in order to help developers to detect it.
470de3c16c8057b61bb3cc2e0c3d5603730f5841c51Makoto Onuki     */
471de3c16c8057b61bb3cc2e0c3d5603730f5841c51Makoto Onuki    private void logErrorForInvalidProfileAccess(@NonNull UserHandle target) {
472de3c16c8057b61bb3cc2e0c3d5603730f5841c51Makoto Onuki        if (UserHandle.myUserId() != target.getIdentifier() && mUserManager.isManagedProfile()) {
4733cc7cd1c18f5d5b2df0f8aebb22fdb3feb23ecd0Makoto Onuki            Log.w(TAG, "Accessing other profiles/users from managed profile is no longer allowed.");
474de3c16c8057b61bb3cc2e0c3d5603730f5841c51Makoto Onuki        }
475de3c16c8057b61bb3cc2e0c3d5603730f5841c51Makoto Onuki    }
476de3c16c8057b61bb3cc2e0c3d5603730f5841c51Makoto Onuki
477de3c16c8057b61bb3cc2e0c3d5603730f5841c51Makoto Onuki    /**
478aecbd037514af1bff0f5ca50932241776d6c5fc3Makoto Onuki     * Return a list of profiles that the caller can access via the {@link LauncherApps} APIs.
479aecbd037514af1bff0f5ca50932241776d6c5fc3Makoto Onuki     *
480aecbd037514af1bff0f5ca50932241776d6c5fc3Makoto Onuki     * <p>If the caller is running on a managed profile, it'll return only the current profile.
481aecbd037514af1bff0f5ca50932241776d6c5fc3Makoto Onuki     * Otherwise it'll return the same list as {@link UserManager#getUserProfiles()} would.
482aecbd037514af1bff0f5ca50932241776d6c5fc3Makoto Onuki     */
483aecbd037514af1bff0f5ca50932241776d6c5fc3Makoto Onuki    public List<UserHandle> getProfiles() {
484de3c16c8057b61bb3cc2e0c3d5603730f5841c51Makoto Onuki        if (mUserManager.isManagedProfile()) {
485aecbd037514af1bff0f5ca50932241776d6c5fc3Makoto Onuki            // If it's a managed profile, only return the current profile.
486aecbd037514af1bff0f5ca50932241776d6c5fc3Makoto Onuki            final List result =  new ArrayList(1);
487aecbd037514af1bff0f5ca50932241776d6c5fc3Makoto Onuki            result.add(android.os.Process.myUserHandle());
488aecbd037514af1bff0f5ca50932241776d6c5fc3Makoto Onuki            return result;
489aecbd037514af1bff0f5ca50932241776d6c5fc3Makoto Onuki        } else {
490de3c16c8057b61bb3cc2e0c3d5603730f5841c51Makoto Onuki            return mUserManager.getUserProfiles();
491aecbd037514af1bff0f5ca50932241776d6c5fc3Makoto Onuki        }
492aecbd037514af1bff0f5ca50932241776d6c5fc3Makoto Onuki    }
493aecbd037514af1bff0f5ca50932241776d6c5fc3Makoto Onuki
494aecbd037514af1bff0f5ca50932241776d6c5fc3Makoto Onuki    /**
4954f58263d02f296430a9653126d28501e95c7bb6cAmith Yamasani     * Retrieves a list of launchable activities that match {@link Intent#ACTION_MAIN} and
4964f58263d02f296430a9653126d28501e95c7bb6cAmith Yamasani     * {@link Intent#CATEGORY_LAUNCHER}, for a specified user.
4974f58263d02f296430a9653126d28501e95c7bb6cAmith Yamasani     *
4984f58263d02f296430a9653126d28501e95c7bb6cAmith Yamasani     * @param packageName The specific package to query. If null, it checks all installed packages
4994f58263d02f296430a9653126d28501e95c7bb6cAmith Yamasani     *            in the profile.
5004f58263d02f296430a9653126d28501e95c7bb6cAmith Yamasani     * @param user The UserHandle of the profile.
5014f58263d02f296430a9653126d28501e95c7bb6cAmith Yamasani     * @return List of launchable activities. Can be an empty list but will not be null.
5024f58263d02f296430a9653126d28501e95c7bb6cAmith Yamasani     */
5034f58263d02f296430a9653126d28501e95c7bb6cAmith Yamasani    public List<LauncherActivityInfo> getActivityList(String packageName, UserHandle user) {
504de3c16c8057b61bb3cc2e0c3d5603730f5841c51Makoto Onuki        logErrorForInvalidProfileAccess(user);
5054f58263d02f296430a9653126d28501e95c7bb6cAmith Yamasani        try {
5063a2541e6daec72824f0f9f8c9cd81bacac263b5cMakoto Onuki            return convertToActivityList(mService.getLauncherActivities(mContext.getPackageName(),
5073a2541e6daec72824f0f9f8c9cd81bacac263b5cMakoto Onuki                    packageName, user), user);
5084f58263d02f296430a9653126d28501e95c7bb6cAmith Yamasani        } catch (RemoteException re) {
509f8880561e67e1da246970b49b14285efd4164ab1Jeff Sharkey            throw re.rethrowFromSystemServer();
5104f58263d02f296430a9653126d28501e95c7bb6cAmith Yamasani        }
5114f58263d02f296430a9653126d28501e95c7bb6cAmith Yamasani    }
5124f58263d02f296430a9653126d28501e95c7bb6cAmith Yamasani
5134f58263d02f296430a9653126d28501e95c7bb6cAmith Yamasani    /**
5144f58263d02f296430a9653126d28501e95c7bb6cAmith Yamasani     * Returns the activity info for a given intent and user handle, if it resolves. Otherwise it
5154f58263d02f296430a9653126d28501e95c7bb6cAmith Yamasani     * returns null.
5164f58263d02f296430a9653126d28501e95c7bb6cAmith Yamasani     *
5174f58263d02f296430a9653126d28501e95c7bb6cAmith Yamasani     * @param intent The intent to find a match for.
5184f58263d02f296430a9653126d28501e95c7bb6cAmith Yamasani     * @param user The profile to look in for a match.
5194f58263d02f296430a9653126d28501e95c7bb6cAmith Yamasani     * @return An activity info object if there is a match.
5204f58263d02f296430a9653126d28501e95c7bb6cAmith Yamasani     */
5214f58263d02f296430a9653126d28501e95c7bb6cAmith Yamasani    public LauncherActivityInfo resolveActivity(Intent intent, UserHandle user) {
522de3c16c8057b61bb3cc2e0c3d5603730f5841c51Makoto Onuki        logErrorForInvalidProfileAccess(user);
5234f58263d02f296430a9653126d28501e95c7bb6cAmith Yamasani        try {
5243a2541e6daec72824f0f9f8c9cd81bacac263b5cMakoto Onuki            ActivityInfo ai = mService.resolveActivity(mContext.getPackageName(),
5253a2541e6daec72824f0f9f8c9cd81bacac263b5cMakoto Onuki                    intent.getComponent(), user);
52645d3e977487da262a58bbfc5650c99a2d94aba9fSunny Goyal            if (ai != null) {
52745d3e977487da262a58bbfc5650c99a2d94aba9fSunny Goyal                LauncherActivityInfo info = new LauncherActivityInfo(mContext, ai, user);
5284f58263d02f296430a9653126d28501e95c7bb6cAmith Yamasani                return info;
5294f58263d02f296430a9653126d28501e95c7bb6cAmith Yamasani            }
5304f58263d02f296430a9653126d28501e95c7bb6cAmith Yamasani        } catch (RemoteException re) {
531f8880561e67e1da246970b49b14285efd4164ab1Jeff Sharkey            throw re.rethrowFromSystemServer();
5324f58263d02f296430a9653126d28501e95c7bb6cAmith Yamasani        }
5334f58263d02f296430a9653126d28501e95c7bb6cAmith Yamasani        return null;
5344f58263d02f296430a9653126d28501e95c7bb6cAmith Yamasani    }
5354f58263d02f296430a9653126d28501e95c7bb6cAmith Yamasani
5364f58263d02f296430a9653126d28501e95c7bb6cAmith Yamasani    /**
537f939dbaf766bd81b10bfc44fd493647180eabad8Kenny Guy     * Starts a Main activity in the specified profile.
5384f58263d02f296430a9653126d28501e95c7bb6cAmith Yamasani     *
5394f58263d02f296430a9653126d28501e95c7bb6cAmith Yamasani     * @param component The ComponentName of the activity to launch
540e781c81d3394642583d555e7a5d6f6f8f63bc538Amith Yamasani     * @param user The UserHandle of the profile
541e781c81d3394642583d555e7a5d6f6f8f63bc538Amith Yamasani     * @param sourceBounds The Rect containing the source bounds of the clicked icon
542e781c81d3394642583d555e7a5d6f6f8f63bc538Amith Yamasani     * @param opts Options to pass to startActivity
543e781c81d3394642583d555e7a5d6f6f8f63bc538Amith Yamasani     */
544f939dbaf766bd81b10bfc44fd493647180eabad8Kenny Guy    public void startMainActivity(ComponentName component, UserHandle user, Rect sourceBounds,
545e781c81d3394642583d555e7a5d6f6f8f63bc538Amith Yamasani            Bundle opts) {
546de3c16c8057b61bb3cc2e0c3d5603730f5841c51Makoto Onuki        logErrorForInvalidProfileAccess(user);
5475abdbb656063160ff8df2306bd01feba0714d4c1Amith Yamasani        if (DEBUG) {
548f939dbaf766bd81b10bfc44fd493647180eabad8Kenny Guy            Log.i(TAG, "StartMainActivity " + component + " " + user.getIdentifier());
5495abdbb656063160ff8df2306bd01feba0714d4c1Amith Yamasani        }
5504f58263d02f296430a9653126d28501e95c7bb6cAmith Yamasani        try {
5511a34274336c19b50173ea60071dfc6427d40dbf6Makoto Onuki            mService.startActivityAsUser(mContext.getIApplicationThread(),
5521a34274336c19b50173ea60071dfc6427d40dbf6Makoto Onuki                    mContext.getPackageName(),
5533a2541e6daec72824f0f9f8c9cd81bacac263b5cMakoto Onuki                    component, sourceBounds, opts, user);
5544f58263d02f296430a9653126d28501e95c7bb6cAmith Yamasani        } catch (RemoteException re) {
555f8880561e67e1da246970b49b14285efd4164ab1Jeff Sharkey            throw re.rethrowFromSystemServer();
5564f58263d02f296430a9653126d28501e95c7bb6cAmith Yamasani        }
5574f58263d02f296430a9653126d28501e95c7bb6cAmith Yamasani    }
5584f58263d02f296430a9653126d28501e95c7bb6cAmith Yamasani
5594f58263d02f296430a9653126d28501e95c7bb6cAmith Yamasani    /**
560466d203c4ff032477d9a6bdb077ce3cd9b4fe070Kenny Guy     * Starts the settings activity to show the application details for a
561466d203c4ff032477d9a6bdb077ce3cd9b4fe070Kenny Guy     * package in the specified profile.
562466d203c4ff032477d9a6bdb077ce3cd9b4fe070Kenny Guy     *
563466d203c4ff032477d9a6bdb077ce3cd9b4fe070Kenny Guy     * @param component The ComponentName of the package to launch settings for.
564466d203c4ff032477d9a6bdb077ce3cd9b4fe070Kenny Guy     * @param user The UserHandle of the profile
565466d203c4ff032477d9a6bdb077ce3cd9b4fe070Kenny Guy     * @param sourceBounds The Rect containing the source bounds of the clicked icon
566466d203c4ff032477d9a6bdb077ce3cd9b4fe070Kenny Guy     * @param opts Options to pass to startActivity
567466d203c4ff032477d9a6bdb077ce3cd9b4fe070Kenny Guy     */
568f939dbaf766bd81b10bfc44fd493647180eabad8Kenny Guy    public void startAppDetailsActivity(ComponentName component, UserHandle user,
569466d203c4ff032477d9a6bdb077ce3cd9b4fe070Kenny Guy            Rect sourceBounds, Bundle opts) {
570de3c16c8057b61bb3cc2e0c3d5603730f5841c51Makoto Onuki        logErrorForInvalidProfileAccess(user);
571466d203c4ff032477d9a6bdb077ce3cd9b4fe070Kenny Guy        try {
5721a34274336c19b50173ea60071dfc6427d40dbf6Makoto Onuki            mService.showAppDetailsAsUser(mContext.getIApplicationThread(),
5731a34274336c19b50173ea60071dfc6427d40dbf6Makoto Onuki                    mContext.getPackageName(),
5743a2541e6daec72824f0f9f8c9cd81bacac263b5cMakoto Onuki                    component, sourceBounds, opts, user);
575466d203c4ff032477d9a6bdb077ce3cd9b4fe070Kenny Guy        } catch (RemoteException re) {
576f8880561e67e1da246970b49b14285efd4164ab1Jeff Sharkey            throw re.rethrowFromSystemServer();
577466d203c4ff032477d9a6bdb077ce3cd9b4fe070Kenny Guy        }
578466d203c4ff032477d9a6bdb077ce3cd9b4fe070Kenny Guy    }
579466d203c4ff032477d9a6bdb077ce3cd9b4fe070Kenny Guy
580466d203c4ff032477d9a6bdb077ce3cd9b4fe070Kenny Guy    /**
581a6be88a10d6f6391b09f626ead051d0c698fb2d1Sunny Goyal     * Retrieves a list of config activities for creating {@link ShortcutInfo}.
582a6be88a10d6f6391b09f626ead051d0c698fb2d1Sunny Goyal     *
583a6be88a10d6f6391b09f626ead051d0c698fb2d1Sunny Goyal     * @param packageName The specific package to query. If null, it checks all installed packages
584a6be88a10d6f6391b09f626ead051d0c698fb2d1Sunny Goyal     *            in the profile.
585a6be88a10d6f6391b09f626ead051d0c698fb2d1Sunny Goyal     * @param user The UserHandle of the profile.
586a6be88a10d6f6391b09f626ead051d0c698fb2d1Sunny Goyal     * @return List of config activities. Can be an empty list but will not be null.
587a6be88a10d6f6391b09f626ead051d0c698fb2d1Sunny Goyal     *
588a6be88a10d6f6391b09f626ead051d0c698fb2d1Sunny Goyal     * @see Intent#ACTION_CREATE_SHORTCUT
589a6be88a10d6f6391b09f626ead051d0c698fb2d1Sunny Goyal     * @see #getShortcutConfigActivityIntent(LauncherActivityInfo)
590a6be88a10d6f6391b09f626ead051d0c698fb2d1Sunny Goyal     */
591a6be88a10d6f6391b09f626ead051d0c698fb2d1Sunny Goyal    public List<LauncherActivityInfo> getShortcutConfigActivityList(@Nullable String packageName,
592a6be88a10d6f6391b09f626ead051d0c698fb2d1Sunny Goyal            @NonNull UserHandle user) {
593de3c16c8057b61bb3cc2e0c3d5603730f5841c51Makoto Onuki        logErrorForInvalidProfileAccess(user);
594a6be88a10d6f6391b09f626ead051d0c698fb2d1Sunny Goyal        try {
5953a2541e6daec72824f0f9f8c9cd81bacac263b5cMakoto Onuki            return convertToActivityList(mService.getShortcutConfigActivities(
5963a2541e6daec72824f0f9f8c9cd81bacac263b5cMakoto Onuki                    mContext.getPackageName(), packageName, user),
597a6be88a10d6f6391b09f626ead051d0c698fb2d1Sunny Goyal                    user);
598a6be88a10d6f6391b09f626ead051d0c698fb2d1Sunny Goyal        } catch (RemoteException re) {
599a6be88a10d6f6391b09f626ead051d0c698fb2d1Sunny Goyal            throw re.rethrowFromSystemServer();
600a6be88a10d6f6391b09f626ead051d0c698fb2d1Sunny Goyal        }
601a6be88a10d6f6391b09f626ead051d0c698fb2d1Sunny Goyal    }
602a6be88a10d6f6391b09f626ead051d0c698fb2d1Sunny Goyal
603a6be88a10d6f6391b09f626ead051d0c698fb2d1Sunny Goyal    private List<LauncherActivityInfo> convertToActivityList(
604a6be88a10d6f6391b09f626ead051d0c698fb2d1Sunny Goyal            @Nullable ParceledListSlice<ResolveInfo> activities, UserHandle user) {
605a6be88a10d6f6391b09f626ead051d0c698fb2d1Sunny Goyal        if (activities == null) {
606a6be88a10d6f6391b09f626ead051d0c698fb2d1Sunny Goyal            return Collections.EMPTY_LIST;
607a6be88a10d6f6391b09f626ead051d0c698fb2d1Sunny Goyal        }
608a6be88a10d6f6391b09f626ead051d0c698fb2d1Sunny Goyal        ArrayList<LauncherActivityInfo> lais = new ArrayList<>();
609a6be88a10d6f6391b09f626ead051d0c698fb2d1Sunny Goyal        for (ResolveInfo ri : activities.getList()) {
610a6be88a10d6f6391b09f626ead051d0c698fb2d1Sunny Goyal            LauncherActivityInfo lai = new LauncherActivityInfo(mContext, ri.activityInfo, user);
611a6be88a10d6f6391b09f626ead051d0c698fb2d1Sunny Goyal            if (DEBUG) {
612a6be88a10d6f6391b09f626ead051d0c698fb2d1Sunny Goyal                Log.v(TAG, "Returning activity for profile " + user + " : "
613a6be88a10d6f6391b09f626ead051d0c698fb2d1Sunny Goyal                        + lai.getComponentName());
614a6be88a10d6f6391b09f626ead051d0c698fb2d1Sunny Goyal            }
615a6be88a10d6f6391b09f626ead051d0c698fb2d1Sunny Goyal            lais.add(lai);
616a6be88a10d6f6391b09f626ead051d0c698fb2d1Sunny Goyal        }
617a6be88a10d6f6391b09f626ead051d0c698fb2d1Sunny Goyal        return lais;
618a6be88a10d6f6391b09f626ead051d0c698fb2d1Sunny Goyal    }
619a6be88a10d6f6391b09f626ead051d0c698fb2d1Sunny Goyal
620a6be88a10d6f6391b09f626ead051d0c698fb2d1Sunny Goyal    /**
621a6be88a10d6f6391b09f626ead051d0c698fb2d1Sunny Goyal     * Returns an intent sender which can be used to start the configure activity for creating
622a6be88a10d6f6391b09f626ead051d0c698fb2d1Sunny Goyal     * custom shortcuts. Use this method if the provider is in another profile as you are not
623a6be88a10d6f6391b09f626ead051d0c698fb2d1Sunny Goyal     * allowed to start an activity in another profile.
624a6be88a10d6f6391b09f626ead051d0c698fb2d1Sunny Goyal     *
625a6be88a10d6f6391b09f626ead051d0c698fb2d1Sunny Goyal     * <p>The caller should receive {@link PinItemRequest} in onActivityResult on
626a6be88a10d6f6391b09f626ead051d0c698fb2d1Sunny Goyal     * {@link android.app.Activity#RESULT_OK}.
627a6be88a10d6f6391b09f626ead051d0c698fb2d1Sunny Goyal     *
628a6be88a10d6f6391b09f626ead051d0c698fb2d1Sunny Goyal     * <p>Callers must be allowed to access the shortcut information, as defined in {@link
629a6be88a10d6f6391b09f626ead051d0c698fb2d1Sunny Goyal     * #hasShortcutHostPermission()}.
630a6be88a10d6f6391b09f626ead051d0c698fb2d1Sunny Goyal     *
631a6be88a10d6f6391b09f626ead051d0c698fb2d1Sunny Goyal     * @param info a configuration activity returned by {@link #getShortcutConfigActivityList}
632a6be88a10d6f6391b09f626ead051d0c698fb2d1Sunny Goyal     *
633a6be88a10d6f6391b09f626ead051d0c698fb2d1Sunny Goyal     * @throws IllegalStateException when the user is locked or not running.
634a6be88a10d6f6391b09f626ead051d0c698fb2d1Sunny Goyal     * @throws SecurityException if {@link #hasShortcutHostPermission()} is false.
635a6be88a10d6f6391b09f626ead051d0c698fb2d1Sunny Goyal     *
636a6be88a10d6f6391b09f626ead051d0c698fb2d1Sunny Goyal     * @see #getPinItemRequest(Intent)
637a6be88a10d6f6391b09f626ead051d0c698fb2d1Sunny Goyal     * @see Intent#ACTION_CREATE_SHORTCUT
638a6be88a10d6f6391b09f626ead051d0c698fb2d1Sunny Goyal     * @see android.app.Activity#startIntentSenderForResult
639a6be88a10d6f6391b09f626ead051d0c698fb2d1Sunny Goyal     */
640de3c16c8057b61bb3cc2e0c3d5603730f5841c51Makoto Onuki    @Nullable
641a6be88a10d6f6391b09f626ead051d0c698fb2d1Sunny Goyal    public IntentSender getShortcutConfigActivityIntent(@NonNull LauncherActivityInfo info) {
642a6be88a10d6f6391b09f626ead051d0c698fb2d1Sunny Goyal        try {
643a6be88a10d6f6391b09f626ead051d0c698fb2d1Sunny Goyal            return mService.getShortcutConfigActivityIntent(
644a6be88a10d6f6391b09f626ead051d0c698fb2d1Sunny Goyal                    mContext.getPackageName(), info.getComponentName(), info.getUser());
645a6be88a10d6f6391b09f626ead051d0c698fb2d1Sunny Goyal        } catch (RemoteException re) {
646a6be88a10d6f6391b09f626ead051d0c698fb2d1Sunny Goyal            throw re.rethrowFromSystemServer();
647a6be88a10d6f6391b09f626ead051d0c698fb2d1Sunny Goyal        }
648a6be88a10d6f6391b09f626ead051d0c698fb2d1Sunny Goyal    }
649a6be88a10d6f6391b09f626ead051d0c698fb2d1Sunny Goyal
650a6be88a10d6f6391b09f626ead051d0c698fb2d1Sunny Goyal    /**
65153fa4ec7f466e70fe3e33d15c4abfc9bb557eb10Kenny Guy     * Checks if the package is installed and enabled for a profile.
65253fa4ec7f466e70fe3e33d15c4abfc9bb557eb10Kenny Guy     *
65353fa4ec7f466e70fe3e33d15c4abfc9bb557eb10Kenny Guy     * @param packageName The package to check.
65453fa4ec7f466e70fe3e33d15c4abfc9bb557eb10Kenny Guy     * @param user The UserHandle of the profile.
65553fa4ec7f466e70fe3e33d15c4abfc9bb557eb10Kenny Guy     *
65653fa4ec7f466e70fe3e33d15c4abfc9bb557eb10Kenny Guy     * @return true if the package exists and is enabled.
65753fa4ec7f466e70fe3e33d15c4abfc9bb557eb10Kenny Guy     */
658f939dbaf766bd81b10bfc44fd493647180eabad8Kenny Guy    public boolean isPackageEnabled(String packageName, UserHandle user) {
659de3c16c8057b61bb3cc2e0c3d5603730f5841c51Makoto Onuki        logErrorForInvalidProfileAccess(user);
66053fa4ec7f466e70fe3e33d15c4abfc9bb557eb10Kenny Guy        try {
6613a2541e6daec72824f0f9f8c9cd81bacac263b5cMakoto Onuki            return mService.isPackageEnabled(mContext.getPackageName(), packageName, user);
66253fa4ec7f466e70fe3e33d15c4abfc9bb557eb10Kenny Guy        } catch (RemoteException re) {
663f8880561e67e1da246970b49b14285efd4164ab1Jeff Sharkey            throw re.rethrowFromSystemServer();
66453fa4ec7f466e70fe3e33d15c4abfc9bb557eb10Kenny Guy        }
66553fa4ec7f466e70fe3e33d15c4abfc9bb557eb10Kenny Guy    }
66653fa4ec7f466e70fe3e33d15c4abfc9bb557eb10Kenny Guy
66753fa4ec7f466e70fe3e33d15c4abfc9bb557eb10Kenny Guy    /**
66819b41f34a5cb29c621848e352220017b46cf66f1Suprabh Shukla     * Gets the launcher extras supplied to the system when the given package was suspended via
66919b41f34a5cb29c621848e352220017b46cf66f1Suprabh Shukla     * {@code PackageManager#setPackagesSuspended(String[], boolean, PersistableBundle,
67019b41f34a5cb29c621848e352220017b46cf66f1Suprabh Shukla     * PersistableBundle, String)}.
67119b41f34a5cb29c621848e352220017b46cf66f1Suprabh Shukla     *
67296212bca06842f223a0e9e377e2c00a2008c96a2Suprabh Shukla     * <p>The contents of this {@link Bundle} are supposed to be a contract between the suspending
67396212bca06842f223a0e9e377e2c00a2008c96a2Suprabh Shukla     * app and the launcher.
67496212bca06842f223a0e9e377e2c00a2008c96a2Suprabh Shukla     *
67519b41f34a5cb29c621848e352220017b46cf66f1Suprabh Shukla     * <p>Note: This just returns whatever extras were provided to the system, <em>which might
67619b41f34a5cb29c621848e352220017b46cf66f1Suprabh Shukla     * even be {@code null}.</em>
67719b41f34a5cb29c621848e352220017b46cf66f1Suprabh Shukla     *
67819b41f34a5cb29c621848e352220017b46cf66f1Suprabh Shukla     * @param packageName The package for which to fetch the launcher extras.
67919b41f34a5cb29c621848e352220017b46cf66f1Suprabh Shukla     * @param user The {@link UserHandle} of the profile.
68019b41f34a5cb29c621848e352220017b46cf66f1Suprabh Shukla     * @return A {@link Bundle} of launcher extras. Or {@code null} if the package is not currently
68119b41f34a5cb29c621848e352220017b46cf66f1Suprabh Shukla     *         suspended.
68219b41f34a5cb29c621848e352220017b46cf66f1Suprabh Shukla     *
68396212bca06842f223a0e9e377e2c00a2008c96a2Suprabh Shukla     * @see Callback#onPackagesSuspended(String[], UserHandle, Bundle)
68419b41f34a5cb29c621848e352220017b46cf66f1Suprabh Shukla     * @see PackageManager#isPackageSuspended()
68519b41f34a5cb29c621848e352220017b46cf66f1Suprabh Shukla     */
68619b41f34a5cb29c621848e352220017b46cf66f1Suprabh Shukla    public @Nullable Bundle getSuspendedPackageLauncherExtras(String packageName, UserHandle user) {
68719b41f34a5cb29c621848e352220017b46cf66f1Suprabh Shukla        logErrorForInvalidProfileAccess(user);
68819b41f34a5cb29c621848e352220017b46cf66f1Suprabh Shukla        try {
68919b41f34a5cb29c621848e352220017b46cf66f1Suprabh Shukla            return mService.getSuspendedPackageLauncherExtras(packageName, user);
69019b41f34a5cb29c621848e352220017b46cf66f1Suprabh Shukla        } catch (RemoteException re) {
69119b41f34a5cb29c621848e352220017b46cf66f1Suprabh Shukla            throw re.rethrowFromSystemServer();
69219b41f34a5cb29c621848e352220017b46cf66f1Suprabh Shukla        }
69319b41f34a5cb29c621848e352220017b46cf66f1Suprabh Shukla    }
69419b41f34a5cb29c621848e352220017b46cf66f1Suprabh Shukla
69519b41f34a5cb29c621848e352220017b46cf66f1Suprabh Shukla    /**
6967afa84c37344f310a1c908f9ee29871e2cb40924Benjamin Miller     * Returns {@link ApplicationInfo} about an application installed for a specific user profile.
697772427555f2624b38124ab8e586ac0ccc451eb53Kenny Guy     *
6980d1fd8d09163566d2c7eb72037f63b6404ada642Amith Yamasani     * @param packageName The package name of the application
699772427555f2624b38124ab8e586ac0ccc451eb53Kenny Guy     * @param flags Additional option flags {@link PackageManager#getApplicationInfo}
700772427555f2624b38124ab8e586ac0ccc451eb53Kenny Guy     * @param user The UserHandle of the profile.
701772427555f2624b38124ab8e586ac0ccc451eb53Kenny Guy     *
7027afa84c37344f310a1c908f9ee29871e2cb40924Benjamin Miller     * @return {@link ApplicationInfo} containing information about the package. Returns
7037afa84c37344f310a1c908f9ee29871e2cb40924Benjamin Miller     *         {@code null} if the package isn't installed for the given profile, or the profile
7047afa84c37344f310a1c908f9ee29871e2cb40924Benjamin Miller     *         isn't enabled.
705772427555f2624b38124ab8e586ac0ccc451eb53Kenny Guy     */
7067c7fbf6f45925b93833ab9d946b6704da0caf1fcMakoto Onuki    public ApplicationInfo getApplicationInfo(@NonNull String packageName,
7077c7fbf6f45925b93833ab9d946b6704da0caf1fcMakoto Onuki            @ApplicationInfoFlags int flags, @NonNull UserHandle user)
7087c7fbf6f45925b93833ab9d946b6704da0caf1fcMakoto Onuki            throws PackageManager.NameNotFoundException {
7097c7fbf6f45925b93833ab9d946b6704da0caf1fcMakoto Onuki        Preconditions.checkNotNull(packageName, "packageName");
71019b41f34a5cb29c621848e352220017b46cf66f1Suprabh Shukla        Preconditions.checkNotNull(user, "user");
711de3c16c8057b61bb3cc2e0c3d5603730f5841c51Makoto Onuki        logErrorForInvalidProfileAccess(user);
712772427555f2624b38124ab8e586ac0ccc451eb53Kenny Guy        try {
7137c7fbf6f45925b93833ab9d946b6704da0caf1fcMakoto Onuki            final ApplicationInfo ai = mService
7147c7fbf6f45925b93833ab9d946b6704da0caf1fcMakoto Onuki                    .getApplicationInfo(mContext.getPackageName(), packageName, flags, user);
7157c7fbf6f45925b93833ab9d946b6704da0caf1fcMakoto Onuki            if (ai == null) {
7167c7fbf6f45925b93833ab9d946b6704da0caf1fcMakoto Onuki                throw new NameNotFoundException("Package " + packageName + " not found for user "
7177c7fbf6f45925b93833ab9d946b6704da0caf1fcMakoto Onuki                        + user.getIdentifier());
7187c7fbf6f45925b93833ab9d946b6704da0caf1fcMakoto Onuki            }
7197c7fbf6f45925b93833ab9d946b6704da0caf1fcMakoto Onuki            return ai;
720772427555f2624b38124ab8e586ac0ccc451eb53Kenny Guy        } catch (RemoteException re) {
721f8880561e67e1da246970b49b14285efd4164ab1Jeff Sharkey            throw re.rethrowFromSystemServer();
722772427555f2624b38124ab8e586ac0ccc451eb53Kenny Guy        }
723772427555f2624b38124ab8e586ac0ccc451eb53Kenny Guy    }
724772427555f2624b38124ab8e586ac0ccc451eb53Kenny Guy
725772427555f2624b38124ab8e586ac0ccc451eb53Kenny Guy    /**
72653fa4ec7f466e70fe3e33d15c4abfc9bb557eb10Kenny Guy     * Checks if the activity exists and it enabled for a profile.
72753fa4ec7f466e70fe3e33d15c4abfc9bb557eb10Kenny Guy     *
72853fa4ec7f466e70fe3e33d15c4abfc9bb557eb10Kenny Guy     * @param component The activity to check.
72953fa4ec7f466e70fe3e33d15c4abfc9bb557eb10Kenny Guy     * @param user The UserHandle of the profile.
73053fa4ec7f466e70fe3e33d15c4abfc9bb557eb10Kenny Guy     *
73153fa4ec7f466e70fe3e33d15c4abfc9bb557eb10Kenny Guy     * @return true if the activity exists and is enabled.
73253fa4ec7f466e70fe3e33d15c4abfc9bb557eb10Kenny Guy     */
733f939dbaf766bd81b10bfc44fd493647180eabad8Kenny Guy    public boolean isActivityEnabled(ComponentName component, UserHandle user) {
734de3c16c8057b61bb3cc2e0c3d5603730f5841c51Makoto Onuki        logErrorForInvalidProfileAccess(user);
73553fa4ec7f466e70fe3e33d15c4abfc9bb557eb10Kenny Guy        try {
7363a2541e6daec72824f0f9f8c9cd81bacac263b5cMakoto Onuki            return mService.isActivityEnabled(mContext.getPackageName(), component, user);
73753fa4ec7f466e70fe3e33d15c4abfc9bb557eb10Kenny Guy        } catch (RemoteException re) {
738f8880561e67e1da246970b49b14285efd4164ab1Jeff Sharkey            throw re.rethrowFromSystemServer();
73953fa4ec7f466e70fe3e33d15c4abfc9bb557eb10Kenny Guy        }
74053fa4ec7f466e70fe3e33d15c4abfc9bb557eb10Kenny Guy    }
74153fa4ec7f466e70fe3e33d15c4abfc9bb557eb10Kenny Guy
7426f7362d92573e4ae693bc513dca586d6a4eb087bMakoto Onuki    /**
743c160fa4cc4f0ae85b3dd4169a0cd1165c183b0cfDianne Hackborn     * Returns whether the caller can access the shortcut information.  Access is currently
744c160fa4cc4f0ae85b3dd4169a0cd1165c183b0cfDianne Hackborn     * available to:
7452d5b465fa9235e66ec176f6d6ffaaa0c18143e41Makoto Onuki     *
746c160fa4cc4f0ae85b3dd4169a0cd1165c183b0cfDianne Hackborn     * <ul>
747c160fa4cc4f0ae85b3dd4169a0cd1165c183b0cfDianne Hackborn     *     <li>The current launcher (or default launcher if there is no set current launcher).</li>
748c160fa4cc4f0ae85b3dd4169a0cd1165c183b0cfDianne Hackborn     *     <li>The currently active voice interaction service.</li>
749c160fa4cc4f0ae85b3dd4169a0cd1165c183b0cfDianne Hackborn     * </ul>
7502d5b465fa9235e66ec176f6d6ffaaa0c18143e41Makoto Onuki     *
7514a91096a4ccdeeccfbd96da4bc88d874ec0bf451Makoto Onuki     * <p>Note when this method returns {@code false}, it may be a temporary situation because
7522d5b465fa9235e66ec176f6d6ffaaa0c18143e41Makoto Onuki     * the user is trying a new launcher application.  The user may decide to change the default
7534a91096a4ccdeeccfbd96da4bc88d874ec0bf451Makoto Onuki     * launcher back to the calling application again, so even if a launcher application loses
7542d5b465fa9235e66ec176f6d6ffaaa0c18143e41Makoto Onuki     * this permission, it does <b>not</b> have to purge pinned shortcut information.
755fe9c9669a4d727a99e78db73ce8708c7505a3b70Makoto Onuki     * If the calling launcher application contains pinned shortcuts, they will still work,
756fe9c9669a4d727a99e78db73ce8708c7505a3b70Makoto Onuki     * even though the caller no longer has the shortcut host permission.
7574a91096a4ccdeeccfbd96da4bc88d874ec0bf451Makoto Onuki     *
75802f338e23d06499790c6948709afb1587416eb40Makoto Onuki     * @throws IllegalStateException when the user is locked.
7599c850012cacf0af4a392294566a8c7c897dc8771Makoto Onuki     *
7604a91096a4ccdeeccfbd96da4bc88d874ec0bf451Makoto Onuki     * @see ShortcutManager
7612d5b465fa9235e66ec176f6d6ffaaa0c18143e41Makoto Onuki     */
7622d5b465fa9235e66ec176f6d6ffaaa0c18143e41Makoto Onuki    public boolean hasShortcutHostPermission() {
7632d5b465fa9235e66ec176f6d6ffaaa0c18143e41Makoto Onuki        try {
7642d5b465fa9235e66ec176f6d6ffaaa0c18143e41Makoto Onuki            return mService.hasShortcutHostPermission(mContext.getPackageName());
7652d5b465fa9235e66ec176f6d6ffaaa0c18143e41Makoto Onuki        } catch (RemoteException re) {
7662d5b465fa9235e66ec176f6d6ffaaa0c18143e41Makoto Onuki            throw re.rethrowFromSystemServer();
7672d5b465fa9235e66ec176f6d6ffaaa0c18143e41Makoto Onuki        }
7682d5b465fa9235e66ec176f6d6ffaaa0c18143e41Makoto Onuki    }
7692d5b465fa9235e66ec176f6d6ffaaa0c18143e41Makoto Onuki
770b1588c0d3955a8574c3ae588568b2c393c7b5665Makoto Onuki    private List<ShortcutInfo> maybeUpdateDisabledMessage(List<ShortcutInfo> shortcuts) {
771b1588c0d3955a8574c3ae588568b2c393c7b5665Makoto Onuki        if (shortcuts == null) {
772b1588c0d3955a8574c3ae588568b2c393c7b5665Makoto Onuki            return null;
773b1588c0d3955a8574c3ae588568b2c393c7b5665Makoto Onuki        }
774b1588c0d3955a8574c3ae588568b2c393c7b5665Makoto Onuki        for (int i = shortcuts.size() - 1; i >= 0; i--) {
775b1588c0d3955a8574c3ae588568b2c393c7b5665Makoto Onuki            final ShortcutInfo si = shortcuts.get(i);
776b1588c0d3955a8574c3ae588568b2c393c7b5665Makoto Onuki            final String message = ShortcutInfo.getDisabledReasonForRestoreIssue(mContext,
777b1588c0d3955a8574c3ae588568b2c393c7b5665Makoto Onuki                    si.getDisabledReason());
778b1588c0d3955a8574c3ae588568b2c393c7b5665Makoto Onuki            if (message != null) {
779b1588c0d3955a8574c3ae588568b2c393c7b5665Makoto Onuki                si.setDisabledMessage(message);
780b1588c0d3955a8574c3ae588568b2c393c7b5665Makoto Onuki            }
781b1588c0d3955a8574c3ae588568b2c393c7b5665Makoto Onuki        }
782b1588c0d3955a8574c3ae588568b2c393c7b5665Makoto Onuki        return shortcuts;
783b1588c0d3955a8574c3ae588568b2c393c7b5665Makoto Onuki    }
784b1588c0d3955a8574c3ae588568b2c393c7b5665Makoto Onuki
7852d5b465fa9235e66ec176f6d6ffaaa0c18143e41Makoto Onuki    /**
7864a91096a4ccdeeccfbd96da4bc88d874ec0bf451Makoto Onuki     * Returns {@link ShortcutInfo}s that match {@code query}.
7876f7362d92573e4ae693bc513dca586d6a4eb087bMakoto Onuki     *
7882d5b465fa9235e66ec176f6d6ffaaa0c18143e41Makoto Onuki     * <p>Callers must be allowed to access the shortcut information, as defined in {@link
7892d5b465fa9235e66ec176f6d6ffaaa0c18143e41Makoto Onuki     * #hasShortcutHostPermission()}.
7906f7362d92573e4ae693bc513dca586d6a4eb087bMakoto Onuki     *
7916f7362d92573e4ae693bc513dca586d6a4eb087bMakoto Onuki     * @param query result includes shortcuts matching this query.
7926f7362d92573e4ae693bc513dca586d6a4eb087bMakoto Onuki     * @param user The UserHandle of the profile.
7936f7362d92573e4ae693bc513dca586d6a4eb087bMakoto Onuki     *
7946f7362d92573e4ae693bc513dca586d6a4eb087bMakoto Onuki     * @return the IDs of {@link ShortcutInfo}s that match the query.
79502f338e23d06499790c6948709afb1587416eb40Makoto Onuki     * @throws IllegalStateException when the user is locked, or when the {@code user} user
79602f338e23d06499790c6948709afb1587416eb40Makoto Onuki     * is locked or not running.
7974a91096a4ccdeeccfbd96da4bc88d874ec0bf451Makoto Onuki     *
7984a91096a4ccdeeccfbd96da4bc88d874ec0bf451Makoto Onuki     * @see ShortcutManager
7996f7362d92573e4ae693bc513dca586d6a4eb087bMakoto Onuki     */
8006f7362d92573e4ae693bc513dca586d6a4eb087bMakoto Onuki    @Nullable
8016f7362d92573e4ae693bc513dca586d6a4eb087bMakoto Onuki    public List<ShortcutInfo> getShortcuts(@NonNull ShortcutQuery query,
8026f7362d92573e4ae693bc513dca586d6a4eb087bMakoto Onuki            @NonNull UserHandle user) {
803de3c16c8057b61bb3cc2e0c3d5603730f5841c51Makoto Onuki        logErrorForInvalidProfileAccess(user);
8046f7362d92573e4ae693bc513dca586d6a4eb087bMakoto Onuki        try {
805b1588c0d3955a8574c3ae588568b2c393c7b5665Makoto Onuki            // Note this is the only case we need to update the disabled message for shortcuts
806b1588c0d3955a8574c3ae588568b2c393c7b5665Makoto Onuki            // that weren't restored.
807b1588c0d3955a8574c3ae588568b2c393c7b5665Makoto Onuki            // The restore problem messages are only shown by the user, and publishers will never
808b1588c0d3955a8574c3ae588568b2c393c7b5665Makoto Onuki            // see them. The only other API that the launcher gets shortcuts is the shortcut
809b1588c0d3955a8574c3ae588568b2c393c7b5665Makoto Onuki            // changed callback, but that only returns shortcuts with the "key" information, so
810b1588c0d3955a8574c3ae588568b2c393c7b5665Makoto Onuki            // that won't return disabled message.
811b1588c0d3955a8574c3ae588568b2c393c7b5665Makoto Onuki            return maybeUpdateDisabledMessage(mService.getShortcuts(mContext.getPackageName(),
812abe8442951ff88aa01ed882adb54fb1b3472ca3eMakoto Onuki                    query.mChangedSince, query.mPackage, query.mShortcutIds, query.mActivity,
81399302b55c6a960c9078ad2c84ae9be3296bd32f3Makoto Onuki                    query.mQueryFlags, user)
814b1588c0d3955a8574c3ae588568b2c393c7b5665Makoto Onuki                    .getList());
8156f7362d92573e4ae693bc513dca586d6a4eb087bMakoto Onuki        } catch (RemoteException e) {
8166f7362d92573e4ae693bc513dca586d6a4eb087bMakoto Onuki            throw e.rethrowFromSystemServer();
8176f7362d92573e4ae693bc513dca586d6a4eb087bMakoto Onuki        }
8186f7362d92573e4ae693bc513dca586d6a4eb087bMakoto Onuki    }
8196f7362d92573e4ae693bc513dca586d6a4eb087bMakoto Onuki
8206f7362d92573e4ae693bc513dca586d6a4eb087bMakoto Onuki    /**
821abe8442951ff88aa01ed882adb54fb1b3472ca3eMakoto Onuki     * @hide // No longer used.  Use getShortcuts() instead.  Kept for unit tests.
8226f7362d92573e4ae693bc513dca586d6a4eb087bMakoto Onuki     */
8236f7362d92573e4ae693bc513dca586d6a4eb087bMakoto Onuki    @Nullable
824b5a012fd6f088629746057a3902b5926f9fe8e08Makoto Onuki    @Deprecated
8256f7362d92573e4ae693bc513dca586d6a4eb087bMakoto Onuki    public List<ShortcutInfo> getShortcutInfo(@NonNull String packageName,
8266f7362d92573e4ae693bc513dca586d6a4eb087bMakoto Onuki            @NonNull List<String> ids, @NonNull UserHandle user) {
827abe8442951ff88aa01ed882adb54fb1b3472ca3eMakoto Onuki        final ShortcutQuery q = new ShortcutQuery();
828abe8442951ff88aa01ed882adb54fb1b3472ca3eMakoto Onuki        q.setPackage(packageName);
829abe8442951ff88aa01ed882adb54fb1b3472ca3eMakoto Onuki        q.setShortcutIds(ids);
8304d6b87ffdf06df3303239130ced685bc1a3fae50Makoto Onuki        q.setQueryFlags(ShortcutQuery.FLAG_GET_ALL_KINDS);
831abe8442951ff88aa01ed882adb54fb1b3472ca3eMakoto Onuki        return getShortcuts(q, user);
8326f7362d92573e4ae693bc513dca586d6a4eb087bMakoto Onuki    }
8336f7362d92573e4ae693bc513dca586d6a4eb087bMakoto Onuki
8346f7362d92573e4ae693bc513dca586d6a4eb087bMakoto Onuki    /**
8356f7362d92573e4ae693bc513dca586d6a4eb087bMakoto Onuki     * Pin shortcuts on a package.
8366f7362d92573e4ae693bc513dca586d6a4eb087bMakoto Onuki     *
8376f7362d92573e4ae693bc513dca586d6a4eb087bMakoto Onuki     * <p>This API is <b>NOT</b> cumulative; this will replace all pinned shortcuts for the package.
8386f7362d92573e4ae693bc513dca586d6a4eb087bMakoto Onuki     * However, different launchers may have different set of pinned shortcuts.
8396f7362d92573e4ae693bc513dca586d6a4eb087bMakoto Onuki     *
840fe9c9669a4d727a99e78db73ce8708c7505a3b70Makoto Onuki     * <p>The calling launcher application must be allowed to access the shortcut information,
841fe9c9669a4d727a99e78db73ce8708c7505a3b70Makoto Onuki     * as defined in {@link #hasShortcutHostPermission()}.
8426f7362d92573e4ae693bc513dca586d6a4eb087bMakoto Onuki     *
8436f7362d92573e4ae693bc513dca586d6a4eb087bMakoto Onuki     * @param packageName The target package name.
8446f7362d92573e4ae693bc513dca586d6a4eb087bMakoto Onuki     * @param shortcutIds The IDs of the shortcut to be pinned.
8456f7362d92573e4ae693bc513dca586d6a4eb087bMakoto Onuki     * @param user The UserHandle of the profile.
84602f338e23d06499790c6948709afb1587416eb40Makoto Onuki     * @throws IllegalStateException when the user is locked, or when the {@code user} user
84702f338e23d06499790c6948709afb1587416eb40Makoto Onuki     * is locked or not running.
8484a91096a4ccdeeccfbd96da4bc88d874ec0bf451Makoto Onuki     *
8494a91096a4ccdeeccfbd96da4bc88d874ec0bf451Makoto Onuki     * @see ShortcutManager
8506f7362d92573e4ae693bc513dca586d6a4eb087bMakoto Onuki     */
8516f7362d92573e4ae693bc513dca586d6a4eb087bMakoto Onuki    public void pinShortcuts(@NonNull String packageName, @NonNull List<String> shortcutIds,
8526f7362d92573e4ae693bc513dca586d6a4eb087bMakoto Onuki            @NonNull UserHandle user) {
853de3c16c8057b61bb3cc2e0c3d5603730f5841c51Makoto Onuki        logErrorForInvalidProfileAccess(user);
8546f7362d92573e4ae693bc513dca586d6a4eb087bMakoto Onuki        try {
8556f7362d92573e4ae693bc513dca586d6a4eb087bMakoto Onuki            mService.pinShortcuts(mContext.getPackageName(), packageName, shortcutIds, user);
8566f7362d92573e4ae693bc513dca586d6a4eb087bMakoto Onuki        } catch (RemoteException e) {
8576f7362d92573e4ae693bc513dca586d6a4eb087bMakoto Onuki            throw e.rethrowFromSystemServer();
8586f7362d92573e4ae693bc513dca586d6a4eb087bMakoto Onuki        }
8596f7362d92573e4ae693bc513dca586d6a4eb087bMakoto Onuki    }
8606f7362d92573e4ae693bc513dca586d6a4eb087bMakoto Onuki
8616f7362d92573e4ae693bc513dca586d6a4eb087bMakoto Onuki    /**
862b6d3523dfb5d73ddda4b750a82c059cdc42acf8eMakoto Onuki     * @hide kept for testing.
863abe8442951ff88aa01ed882adb54fb1b3472ca3eMakoto Onuki     */
864b5a012fd6f088629746057a3902b5926f9fe8e08Makoto Onuki    @Deprecated
865abe8442951ff88aa01ed882adb54fb1b3472ca3eMakoto Onuki    public int getShortcutIconResId(@NonNull ShortcutInfo shortcut) {
866b6d3523dfb5d73ddda4b750a82c059cdc42acf8eMakoto Onuki        return shortcut.getIconResourceId();
867abe8442951ff88aa01ed882adb54fb1b3472ca3eMakoto Onuki    }
868abe8442951ff88aa01ed882adb54fb1b3472ca3eMakoto Onuki
869abe8442951ff88aa01ed882adb54fb1b3472ca3eMakoto Onuki    /**
870b6d3523dfb5d73ddda4b750a82c059cdc42acf8eMakoto Onuki     * @hide kept for testing.
8716f7362d92573e4ae693bc513dca586d6a4eb087bMakoto Onuki     */
872b5a012fd6f088629746057a3902b5926f9fe8e08Makoto Onuki    @Deprecated
873abe8442951ff88aa01ed882adb54fb1b3472ca3eMakoto Onuki    public int getShortcutIconResId(@NonNull String packageName, @NonNull String shortcutId,
874abe8442951ff88aa01ed882adb54fb1b3472ca3eMakoto Onuki            @NonNull UserHandle user) {
875b6d3523dfb5d73ddda4b750a82c059cdc42acf8eMakoto Onuki        final ShortcutQuery q = new ShortcutQuery();
876b6d3523dfb5d73ddda4b750a82c059cdc42acf8eMakoto Onuki        q.setPackage(packageName);
877b6d3523dfb5d73ddda4b750a82c059cdc42acf8eMakoto Onuki        q.setShortcutIds(Arrays.asList(shortcutId));
8784d6b87ffdf06df3303239130ced685bc1a3fae50Makoto Onuki        q.setQueryFlags(ShortcutQuery.FLAG_GET_ALL_KINDS);
879b6d3523dfb5d73ddda4b750a82c059cdc42acf8eMakoto Onuki        final List<ShortcutInfo> shortcuts = getShortcuts(q, user);
880abe8442951ff88aa01ed882adb54fb1b3472ca3eMakoto Onuki
881b6d3523dfb5d73ddda4b750a82c059cdc42acf8eMakoto Onuki        return shortcuts.size() > 0 ? shortcuts.get(0).getIconResourceId() : 0;
8826f7362d92573e4ae693bc513dca586d6a4eb087bMakoto Onuki    }
8836f7362d92573e4ae693bc513dca586d6a4eb087bMakoto Onuki
8846f7362d92573e4ae693bc513dca586d6a4eb087bMakoto Onuki    /**
885b5a012fd6f088629746057a3902b5926f9fe8e08Makoto Onuki     * @hide internal/unit tests only
886abe8442951ff88aa01ed882adb54fb1b3472ca3eMakoto Onuki     */
887abe8442951ff88aa01ed882adb54fb1b3472ca3eMakoto Onuki    public ParcelFileDescriptor getShortcutIconFd(
888abe8442951ff88aa01ed882adb54fb1b3472ca3eMakoto Onuki            @NonNull ShortcutInfo shortcut) {
88922fcc68e6be0edaa98f3dacf79d580a5e5d50005Makoto Onuki        return getShortcutIconFd(shortcut.getPackage(), shortcut.getId(),
890abe8442951ff88aa01ed882adb54fb1b3472ca3eMakoto Onuki                shortcut.getUserId());
891abe8442951ff88aa01ed882adb54fb1b3472ca3eMakoto Onuki    }
892abe8442951ff88aa01ed882adb54fb1b3472ca3eMakoto Onuki
893abe8442951ff88aa01ed882adb54fb1b3472ca3eMakoto Onuki    /**
894b5a012fd6f088629746057a3902b5926f9fe8e08Makoto Onuki     * @hide internal/unit tests only
8956f7362d92573e4ae693bc513dca586d6a4eb087bMakoto Onuki     */
8966f7362d92573e4ae693bc513dca586d6a4eb087bMakoto Onuki    public ParcelFileDescriptor getShortcutIconFd(
897abe8442951ff88aa01ed882adb54fb1b3472ca3eMakoto Onuki            @NonNull String packageName, @NonNull String shortcutId, @NonNull UserHandle user) {
898abe8442951ff88aa01ed882adb54fb1b3472ca3eMakoto Onuki        return getShortcutIconFd(packageName, shortcutId, user.getIdentifier());
899abe8442951ff88aa01ed882adb54fb1b3472ca3eMakoto Onuki    }
900abe8442951ff88aa01ed882adb54fb1b3472ca3eMakoto Onuki
901abe8442951ff88aa01ed882adb54fb1b3472ca3eMakoto Onuki    private ParcelFileDescriptor getShortcutIconFd(
902abe8442951ff88aa01ed882adb54fb1b3472ca3eMakoto Onuki            @NonNull String packageName, @NonNull String shortcutId, int userId) {
9035504622fb01ab9774b5e73d05f86ee03a8b68ab7Makoto Onuki        try {
904abe8442951ff88aa01ed882adb54fb1b3472ca3eMakoto Onuki            return mService.getShortcutIconFd(mContext.getPackageName(),
905abe8442951ff88aa01ed882adb54fb1b3472ca3eMakoto Onuki                    packageName, shortcutId, userId);
9065504622fb01ab9774b5e73d05f86ee03a8b68ab7Makoto Onuki        } catch (RemoteException e) {
9075504622fb01ab9774b5e73d05f86ee03a8b68ab7Makoto Onuki            throw e.rethrowFromSystemServer();
9085504622fb01ab9774b5e73d05f86ee03a8b68ab7Makoto Onuki        }
9096f7362d92573e4ae693bc513dca586d6a4eb087bMakoto Onuki    }
91020c95f854e54b71caa49f0efe07d47d1e6afd435Makoto Onuki
91104b9aab94576411b9f59aa49d87080976ee6fa46Makoto Onuki    /**
91204b9aab94576411b9f59aa49d87080976ee6fa46Makoto Onuki     * Returns the icon for this shortcut, without any badging for the profile.
91304b9aab94576411b9f59aa49d87080976ee6fa46Makoto Onuki     *
914fe9c9669a4d727a99e78db73ce8708c7505a3b70Makoto Onuki     * <p>The calling launcher application must be allowed to access the shortcut information,
915fe9c9669a4d727a99e78db73ce8708c7505a3b70Makoto Onuki     * as defined in {@link #hasShortcutHostPermission()}.
9164a91096a4ccdeeccfbd96da4bc88d874ec0bf451Makoto Onuki     *
91704b9aab94576411b9f59aa49d87080976ee6fa46Makoto Onuki     * @param density The preferred density of the icon, zero for default density. Use
91804b9aab94576411b9f59aa49d87080976ee6fa46Makoto Onuki     * density DPI values from {@link DisplayMetrics}.
9194a91096a4ccdeeccfbd96da4bc88d874ec0bf451Makoto Onuki     *
9204a91096a4ccdeeccfbd96da4bc88d874ec0bf451Makoto Onuki     * @return The drawable associated with the shortcut.
92102f338e23d06499790c6948709afb1587416eb40Makoto Onuki     * @throws IllegalStateException when the user is locked, or when the {@code user} user
92202f338e23d06499790c6948709afb1587416eb40Makoto Onuki     * is locked or not running.
9234a91096a4ccdeeccfbd96da4bc88d874ec0bf451Makoto Onuki     *
9244a91096a4ccdeeccfbd96da4bc88d874ec0bf451Makoto Onuki     * @see ShortcutManager
92504b9aab94576411b9f59aa49d87080976ee6fa46Makoto Onuki     * @see #getShortcutBadgedIconDrawable(ShortcutInfo, int)
92604b9aab94576411b9f59aa49d87080976ee6fa46Makoto Onuki     * @see DisplayMetrics
92704b9aab94576411b9f59aa49d87080976ee6fa46Makoto Onuki     */
92804b9aab94576411b9f59aa49d87080976ee6fa46Makoto Onuki    public Drawable getShortcutIconDrawable(@NonNull ShortcutInfo shortcut, int density) {
92904b9aab94576411b9f59aa49d87080976ee6fa46Makoto Onuki        if (shortcut.hasIconFile()) {
93004b9aab94576411b9f59aa49d87080976ee6fa46Makoto Onuki            final ParcelFileDescriptor pfd = getShortcutIconFd(shortcut);
93104b9aab94576411b9f59aa49d87080976ee6fa46Makoto Onuki            if (pfd == null) {
93204b9aab94576411b9f59aa49d87080976ee6fa46Makoto Onuki                return null;
93304b9aab94576411b9f59aa49d87080976ee6fa46Makoto Onuki            }
93404b9aab94576411b9f59aa49d87080976ee6fa46Makoto Onuki            try {
93504b9aab94576411b9f59aa49d87080976ee6fa46Makoto Onuki                final Bitmap bmp = BitmapFactory.decodeFileDescriptor(pfd.getFileDescriptor());
936f281e7afae14f61e1d031f55cc80c59d0b39b528Hyunyoung Song                if (bmp != null) {
937f281e7afae14f61e1d031f55cc80c59d0b39b528Hyunyoung Song                    BitmapDrawable dr = new BitmapDrawable(mContext.getResources(), bmp);
938e4179e2c4e674b32390a9133bb9fbb3ef5df651bHyunyoung Song                    if (shortcut.hasAdaptiveBitmap()) {
939be8835e86bc39570994af32ead381875e3ee54d5Hyunyoung Song                        return new AdaptiveIconDrawable(null, dr);
940f281e7afae14f61e1d031f55cc80c59d0b39b528Hyunyoung Song                    } else {
941f281e7afae14f61e1d031f55cc80c59d0b39b528Hyunyoung Song                        return dr;
942f281e7afae14f61e1d031f55cc80c59d0b39b528Hyunyoung Song                    }
943f281e7afae14f61e1d031f55cc80c59d0b39b528Hyunyoung Song                }
944f281e7afae14f61e1d031f55cc80c59d0b39b528Hyunyoung Song                return null;
94504b9aab94576411b9f59aa49d87080976ee6fa46Makoto Onuki            } finally {
94604b9aab94576411b9f59aa49d87080976ee6fa46Makoto Onuki                try {
94704b9aab94576411b9f59aa49d87080976ee6fa46Makoto Onuki                    pfd.close();
94804b9aab94576411b9f59aa49d87080976ee6fa46Makoto Onuki                } catch (IOException ignore) {
94904b9aab94576411b9f59aa49d87080976ee6fa46Makoto Onuki                }
95004b9aab94576411b9f59aa49d87080976ee6fa46Makoto Onuki            }
95104b9aab94576411b9f59aa49d87080976ee6fa46Makoto Onuki        } else if (shortcut.hasIconResource()) {
9522d895c3efd625e09e9f2cc4d0c7131b34f52f154Makoto Onuki            return loadDrawableResourceFromPackage(shortcut.getPackage(),
9532d895c3efd625e09e9f2cc4d0c7131b34f52f154Makoto Onuki                    shortcut.getIconResourceId(), shortcut.getUserHandle(), density);
9542d895c3efd625e09e9f2cc4d0c7131b34f52f154Makoto Onuki        } else if (shortcut.getIcon() != null) {
9552d895c3efd625e09e9f2cc4d0c7131b34f52f154Makoto Onuki            // This happens if a shortcut is pending-approval.
9562d895c3efd625e09e9f2cc4d0c7131b34f52f154Makoto Onuki            final Icon icon = shortcut.getIcon();
9572d895c3efd625e09e9f2cc4d0c7131b34f52f154Makoto Onuki            switch (icon.getType()) {
9582d895c3efd625e09e9f2cc4d0c7131b34f52f154Makoto Onuki                case Icon.TYPE_RESOURCE: {
9592d895c3efd625e09e9f2cc4d0c7131b34f52f154Makoto Onuki                    return loadDrawableResourceFromPackage(shortcut.getPackage(),
9602d895c3efd625e09e9f2cc4d0c7131b34f52f154Makoto Onuki                            icon.getResId(), shortcut.getUserHandle(), density);
96104b9aab94576411b9f59aa49d87080976ee6fa46Makoto Onuki                }
962f281e7afae14f61e1d031f55cc80c59d0b39b528Hyunyoung Song                case Icon.TYPE_BITMAP:
963e4179e2c4e674b32390a9133bb9fbb3ef5df651bHyunyoung Song                case Icon.TYPE_ADAPTIVE_BITMAP: {
9642d895c3efd625e09e9f2cc4d0c7131b34f52f154Makoto Onuki                    return icon.loadDrawable(mContext);
9652d895c3efd625e09e9f2cc4d0c7131b34f52f154Makoto Onuki                }
9662d895c3efd625e09e9f2cc4d0c7131b34f52f154Makoto Onuki                default:
9672d895c3efd625e09e9f2cc4d0c7131b34f52f154Makoto Onuki                    return null; // Shouldn't happen though.
96804b9aab94576411b9f59aa49d87080976ee6fa46Makoto Onuki            }
96904b9aab94576411b9f59aa49d87080976ee6fa46Makoto Onuki        } else {
97004b9aab94576411b9f59aa49d87080976ee6fa46Makoto Onuki            return null; // Has no icon.
97104b9aab94576411b9f59aa49d87080976ee6fa46Makoto Onuki        }
97220c95f854e54b71caa49f0efe07d47d1e6afd435Makoto Onuki    }
97320c95f854e54b71caa49f0efe07d47d1e6afd435Makoto Onuki
9742d895c3efd625e09e9f2cc4d0c7131b34f52f154Makoto Onuki    private Drawable loadDrawableResourceFromPackage(String packageName, int resId,
9752d895c3efd625e09e9f2cc4d0c7131b34f52f154Makoto Onuki            UserHandle user, int density) {
9762d895c3efd625e09e9f2cc4d0c7131b34f52f154Makoto Onuki        try {
9772d895c3efd625e09e9f2cc4d0c7131b34f52f154Makoto Onuki            if (resId == 0) {
9782d895c3efd625e09e9f2cc4d0c7131b34f52f154Makoto Onuki                return null; // Shouldn't happen but just in case.
9792d895c3efd625e09e9f2cc4d0c7131b34f52f154Makoto Onuki            }
9802d895c3efd625e09e9f2cc4d0c7131b34f52f154Makoto Onuki            final ApplicationInfo ai = getApplicationInfo(packageName, /* flags =*/ 0, user);
9812d895c3efd625e09e9f2cc4d0c7131b34f52f154Makoto Onuki            final Resources res = mContext.getPackageManager().getResourcesForApplication(ai);
9822d895c3efd625e09e9f2cc4d0c7131b34f52f154Makoto Onuki            return res.getDrawableForDensity(resId, density);
9832d895c3efd625e09e9f2cc4d0c7131b34f52f154Makoto Onuki        } catch (NameNotFoundException | Resources.NotFoundException e) {
9842d895c3efd625e09e9f2cc4d0c7131b34f52f154Makoto Onuki            return null;
9852d895c3efd625e09e9f2cc4d0c7131b34f52f154Makoto Onuki        }
9862d895c3efd625e09e9f2cc4d0c7131b34f52f154Makoto Onuki    }
9872d895c3efd625e09e9f2cc4d0c7131b34f52f154Makoto Onuki
98804b9aab94576411b9f59aa49d87080976ee6fa46Makoto Onuki    /**
98904b9aab94576411b9f59aa49d87080976ee6fa46Makoto Onuki     * Returns the shortcut icon with badging appropriate for the profile.
99004b9aab94576411b9f59aa49d87080976ee6fa46Makoto Onuki     *
991fe9c9669a4d727a99e78db73ce8708c7505a3b70Makoto Onuki     * <p>The calling launcher application must be allowed to access the shortcut information,
992fe9c9669a4d727a99e78db73ce8708c7505a3b70Makoto Onuki     * as defined in {@link #hasShortcutHostPermission()}.
9934a91096a4ccdeeccfbd96da4bc88d874ec0bf451Makoto Onuki     *
99404b9aab94576411b9f59aa49d87080976ee6fa46Makoto Onuki     * @param density Optional density for the icon, or 0 to use the default density. Use
99504b9aab94576411b9f59aa49d87080976ee6fa46Makoto Onuki     * @return A badged icon for the shortcut.
99602f338e23d06499790c6948709afb1587416eb40Makoto Onuki     * @throws IllegalStateException when the user is locked, or when the {@code user} user
99702f338e23d06499790c6948709afb1587416eb40Makoto Onuki     * is locked or not running.
9984a91096a4ccdeeccfbd96da4bc88d874ec0bf451Makoto Onuki     *
9994a91096a4ccdeeccfbd96da4bc88d874ec0bf451Makoto Onuki     * @see ShortcutManager
1000fe9c9669a4d727a99e78db73ce8708c7505a3b70Makoto Onuki     * @see #getShortcutIconDrawable(ShortcutInfo, int)
10014a91096a4ccdeeccfbd96da4bc88d874ec0bf451Makoto Onuki     * @see DisplayMetrics
100204b9aab94576411b9f59aa49d87080976ee6fa46Makoto Onuki     */
100304b9aab94576411b9f59aa49d87080976ee6fa46Makoto Onuki    public Drawable getShortcutBadgedIconDrawable(ShortcutInfo shortcut, int density) {
100404b9aab94576411b9f59aa49d87080976ee6fa46Makoto Onuki        final Drawable originalIcon = getShortcutIconDrawable(shortcut, density);
100504b9aab94576411b9f59aa49d87080976ee6fa46Makoto Onuki
100604b9aab94576411b9f59aa49d87080976ee6fa46Makoto Onuki        return (originalIcon == null) ? null : mContext.getPackageManager().getUserBadgedIcon(
100704b9aab94576411b9f59aa49d87080976ee6fa46Makoto Onuki                originalIcon, shortcut.getUserHandle());
100820c95f854e54b71caa49f0efe07d47d1e6afd435Makoto Onuki    }
10096f7362d92573e4ae693bc513dca586d6a4eb087bMakoto Onuki
10106f7362d92573e4ae693bc513dca586d6a4eb087bMakoto Onuki    /**
10114a91096a4ccdeeccfbd96da4bc88d874ec0bf451Makoto Onuki     * Starts a shortcut.
10126f7362d92573e4ae693bc513dca586d6a4eb087bMakoto Onuki     *
1013fe9c9669a4d727a99e78db73ce8708c7505a3b70Makoto Onuki     * <p>The calling launcher application must be allowed to access the shortcut information,
1014fe9c9669a4d727a99e78db73ce8708c7505a3b70Makoto Onuki     * as defined in {@link #hasShortcutHostPermission()}.
10156f7362d92573e4ae693bc513dca586d6a4eb087bMakoto Onuki     *
101643204b8357d781f284037fb8b7b7050ed04a2103Makoto Onuki     * @param packageName The target shortcut package name.
101743204b8357d781f284037fb8b7b7050ed04a2103Makoto Onuki     * @param shortcutId The target shortcut ID.
10186f7362d92573e4ae693bc513dca586d6a4eb087bMakoto Onuki     * @param sourceBounds The Rect containing the source bounds of the clicked icon.
10196f7362d92573e4ae693bc513dca586d6a4eb087bMakoto Onuki     * @param startActivityOptions Options to pass to startActivity.
10206f7362d92573e4ae693bc513dca586d6a4eb087bMakoto Onuki     * @param user The UserHandle of the profile.
102102f338e23d06499790c6948709afb1587416eb40Makoto Onuki     * @throws IllegalStateException when the user is locked, or when the {@code user} user
102202f338e23d06499790c6948709afb1587416eb40Makoto Onuki     * is locked or not running.
102383f6d2da372de339dc563d6a7786be3facc52e76Makoto Onuki     *
102483f6d2da372de339dc563d6a7786be3facc52e76Makoto Onuki     * @throws android.content.ActivityNotFoundException failed to start shortcut. (e.g.
102583f6d2da372de339dc563d6a7786be3facc52e76Makoto Onuki     * the shortcut no longer exists, is disabled, the intent receiver activity doesn't exist, etc)
10266f7362d92573e4ae693bc513dca586d6a4eb087bMakoto Onuki     */
1027d6880797f72e1e397e18c6e709c0125f795c7d2eMakoto Onuki    public void startShortcut(@NonNull String packageName, @NonNull String shortcutId,
10286f7362d92573e4ae693bc513dca586d6a4eb087bMakoto Onuki            @Nullable Rect sourceBounds, @Nullable Bundle startActivityOptions,
10296f7362d92573e4ae693bc513dca586d6a4eb087bMakoto Onuki            @NonNull UserHandle user) {
1030de3c16c8057b61bb3cc2e0c3d5603730f5841c51Makoto Onuki        logErrorForInvalidProfileAccess(user);
1031de3c16c8057b61bb3cc2e0c3d5603730f5841c51Makoto Onuki
1032d6880797f72e1e397e18c6e709c0125f795c7d2eMakoto Onuki        startShortcut(packageName, shortcutId, sourceBounds, startActivityOptions,
1033abe8442951ff88aa01ed882adb54fb1b3472ca3eMakoto Onuki                user.getIdentifier());
1034abe8442951ff88aa01ed882adb54fb1b3472ca3eMakoto Onuki    }
1035abe8442951ff88aa01ed882adb54fb1b3472ca3eMakoto Onuki
1036abe8442951ff88aa01ed882adb54fb1b3472ca3eMakoto Onuki    /**
1037abe8442951ff88aa01ed882adb54fb1b3472ca3eMakoto Onuki     * Launches a shortcut.
1038abe8442951ff88aa01ed882adb54fb1b3472ca3eMakoto Onuki     *
1039fe9c9669a4d727a99e78db73ce8708c7505a3b70Makoto Onuki     * <p>The calling launcher application must be allowed to access the shortcut information,
1040fe9c9669a4d727a99e78db73ce8708c7505a3b70Makoto Onuki     * as defined in {@link #hasShortcutHostPermission()}.
1041abe8442951ff88aa01ed882adb54fb1b3472ca3eMakoto Onuki     *
1042abe8442951ff88aa01ed882adb54fb1b3472ca3eMakoto Onuki     * @param shortcut The target shortcut.
1043abe8442951ff88aa01ed882adb54fb1b3472ca3eMakoto Onuki     * @param sourceBounds The Rect containing the source bounds of the clicked icon.
1044abe8442951ff88aa01ed882adb54fb1b3472ca3eMakoto Onuki     * @param startActivityOptions Options to pass to startActivity.
104502f338e23d06499790c6948709afb1587416eb40Makoto Onuki     * @throws IllegalStateException when the user is locked, or when the {@code user} user
104602f338e23d06499790c6948709afb1587416eb40Makoto Onuki     * is locked or not running.
104783f6d2da372de339dc563d6a7786be3facc52e76Makoto Onuki     *
104883f6d2da372de339dc563d6a7786be3facc52e76Makoto Onuki     * @throws android.content.ActivityNotFoundException failed to start shortcut. (e.g.
104983f6d2da372de339dc563d6a7786be3facc52e76Makoto Onuki     * the shortcut no longer exists, is disabled, the intent receiver activity doesn't exist, etc)
1050abe8442951ff88aa01ed882adb54fb1b3472ca3eMakoto Onuki     */
1051d6880797f72e1e397e18c6e709c0125f795c7d2eMakoto Onuki    public void startShortcut(@NonNull ShortcutInfo shortcut,
1052abe8442951ff88aa01ed882adb54fb1b3472ca3eMakoto Onuki            @Nullable Rect sourceBounds, @Nullable Bundle startActivityOptions) {
1053d6880797f72e1e397e18c6e709c0125f795c7d2eMakoto Onuki        startShortcut(shortcut.getPackage(), shortcut.getId(),
1054abe8442951ff88aa01ed882adb54fb1b3472ca3eMakoto Onuki                sourceBounds, startActivityOptions,
1055abe8442951ff88aa01ed882adb54fb1b3472ca3eMakoto Onuki                shortcut.getUserId());
1056abe8442951ff88aa01ed882adb54fb1b3472ca3eMakoto Onuki    }
1057abe8442951ff88aa01ed882adb54fb1b3472ca3eMakoto Onuki
1058d6880797f72e1e397e18c6e709c0125f795c7d2eMakoto Onuki    private void startShortcut(@NonNull String packageName, @NonNull String shortcutId,
1059abe8442951ff88aa01ed882adb54fb1b3472ca3eMakoto Onuki            @Nullable Rect sourceBounds, @Nullable Bundle startActivityOptions,
1060abe8442951ff88aa01ed882adb54fb1b3472ca3eMakoto Onuki            int userId) {
10616f7362d92573e4ae693bc513dca586d6a4eb087bMakoto Onuki        try {
106283f6d2da372de339dc563d6a7786be3facc52e76Makoto Onuki            final boolean success =
106383f6d2da372de339dc563d6a7786be3facc52e76Makoto Onuki                    mService.startShortcut(mContext.getPackageName(), packageName, shortcutId,
1064abe8442951ff88aa01ed882adb54fb1b3472ca3eMakoto Onuki                    sourceBounds, startActivityOptions, userId);
106583f6d2da372de339dc563d6a7786be3facc52e76Makoto Onuki            if (!success) {
106683f6d2da372de339dc563d6a7786be3facc52e76Makoto Onuki                throw new ActivityNotFoundException("Shortcut could not be started");
106783f6d2da372de339dc563d6a7786be3facc52e76Makoto Onuki            }
10686f7362d92573e4ae693bc513dca586d6a4eb087bMakoto Onuki        } catch (RemoteException e) {
10696f7362d92573e4ae693bc513dca586d6a4eb087bMakoto Onuki            throw e.rethrowFromSystemServer();
10706f7362d92573e4ae693bc513dca586d6a4eb087bMakoto Onuki        }
10716f7362d92573e4ae693bc513dca586d6a4eb087bMakoto Onuki    }
107253fa4ec7f466e70fe3e33d15c4abfc9bb557eb10Kenny Guy
107353fa4ec7f466e70fe3e33d15c4abfc9bb557eb10Kenny Guy    /**
107410a574fbf3c786791b84078f41932f83ad3e34ffKenny Guy     * Registers a callback for changes to packages in current and managed profiles.
1075c0154537b0b7926ce6a3c778597b3c2735ca5497Kenny Guy     *
107610a574fbf3c786791b84078f41932f83ad3e34ffKenny Guy     * @param callback The callback to register.
1077c0154537b0b7926ce6a3c778597b3c2735ca5497Kenny Guy     */
107810a574fbf3c786791b84078f41932f83ad3e34ffKenny Guy    public void registerCallback(Callback callback) {
107910a574fbf3c786791b84078f41932f83ad3e34ffKenny Guy        registerCallback(callback, null);
1080b42c89bfb0415d2a4b1d8b7247309f15fd348974Kenny Guy    }
1081b42c89bfb0415d2a4b1d8b7247309f15fd348974Kenny Guy
1082b42c89bfb0415d2a4b1d8b7247309f15fd348974Kenny Guy    /**
108310a574fbf3c786791b84078f41932f83ad3e34ffKenny Guy     * Registers a callback for changes to packages in current and managed profiles.
1084b42c89bfb0415d2a4b1d8b7247309f15fd348974Kenny Guy     *
108510a574fbf3c786791b84078f41932f83ad3e34ffKenny Guy     * @param callback The callback to register.
1086b42c89bfb0415d2a4b1d8b7247309f15fd348974Kenny Guy     * @param handler that should be used to post callbacks on, may be null.
1087b42c89bfb0415d2a4b1d8b7247309f15fd348974Kenny Guy     */
108810a574fbf3c786791b84078f41932f83ad3e34ffKenny Guy    public void registerCallback(Callback callback, Handler handler) {
1089c0154537b0b7926ce6a3c778597b3c2735ca5497Kenny Guy        synchronized (this) {
1090172a21697dca96c7665f0c36e27a05f8ed00e81aKenny Guy            if (callback != null && findCallbackLocked(callback) < 0) {
1091b42c89bfb0415d2a4b1d8b7247309f15fd348974Kenny Guy                boolean addedFirstCallback = mCallbacks.size() == 0;
1092b42c89bfb0415d2a4b1d8b7247309f15fd348974Kenny Guy                addCallbackLocked(callback, handler);
1093b42c89bfb0415d2a4b1d8b7247309f15fd348974Kenny Guy                if (addedFirstCallback) {
1094c0154537b0b7926ce6a3c778597b3c2735ca5497Kenny Guy                    try {
10954dbe0ded4ae9faaef580be80184fca0749e27198Makoto Onuki                        mService.addOnAppsChangedListener(mContext.getPackageName(),
10964dbe0ded4ae9faaef580be80184fca0749e27198Makoto Onuki                                mAppsChangedListener);
1097c0154537b0b7926ce6a3c778597b3c2735ca5497Kenny Guy                    } catch (RemoteException re) {
1098f8880561e67e1da246970b49b14285efd4164ab1Jeff Sharkey                        throw re.rethrowFromSystemServer();
1099c0154537b0b7926ce6a3c778597b3c2735ca5497Kenny Guy                    }
1100c0154537b0b7926ce6a3c778597b3c2735ca5497Kenny Guy                }
1101c0154537b0b7926ce6a3c778597b3c2735ca5497Kenny Guy            }
1102c0154537b0b7926ce6a3c778597b3c2735ca5497Kenny Guy        }
1103c0154537b0b7926ce6a3c778597b3c2735ca5497Kenny Guy    }
1104c0154537b0b7926ce6a3c778597b3c2735ca5497Kenny Guy
1105c0154537b0b7926ce6a3c778597b3c2735ca5497Kenny Guy    /**
110610a574fbf3c786791b84078f41932f83ad3e34ffKenny Guy     * Unregisters a callback that was previously registered.
1107c0154537b0b7926ce6a3c778597b3c2735ca5497Kenny Guy     *
110810a574fbf3c786791b84078f41932f83ad3e34ffKenny Guy     * @param callback The callback to unregister.
110910a574fbf3c786791b84078f41932f83ad3e34ffKenny Guy     * @see #registerCallback(Callback)
1110c0154537b0b7926ce6a3c778597b3c2735ca5497Kenny Guy     */
111110a574fbf3c786791b84078f41932f83ad3e34ffKenny Guy    public void unregisterCallback(Callback callback) {
1112c0154537b0b7926ce6a3c778597b3c2735ca5497Kenny Guy        synchronized (this) {
1113b42c89bfb0415d2a4b1d8b7247309f15fd348974Kenny Guy            removeCallbackLocked(callback);
111444b6dee70eb2dfb7e26aeec9b2640d64e4f7d199Kenny Guy            if (mCallbacks.size() == 0) {
1115e781c81d3394642583d555e7a5d6f6f8f63bc538Amith Yamasani                try {
1116e781c81d3394642583d555e7a5d6f6f8f63bc538Amith Yamasani                    mService.removeOnAppsChangedListener(mAppsChangedListener);
1117e781c81d3394642583d555e7a5d6f6f8f63bc538Amith Yamasani                } catch (RemoteException re) {
1118f8880561e67e1da246970b49b14285efd4164ab1Jeff Sharkey                    throw re.rethrowFromSystemServer();
1119e781c81d3394642583d555e7a5d6f6f8f63bc538Amith Yamasani                }
11204f58263d02f296430a9653126d28501e95c7bb6cAmith Yamasani            }
11214f58263d02f296430a9653126d28501e95c7bb6cAmith Yamasani        }
11224f58263d02f296430a9653126d28501e95c7bb6cAmith Yamasani    }
11234f58263d02f296430a9653126d28501e95c7bb6cAmith Yamasani
1124172a21697dca96c7665f0c36e27a05f8ed00e81aKenny Guy    /** @return position in mCallbacks for callback or -1 if not present. */
1125172a21697dca96c7665f0c36e27a05f8ed00e81aKenny Guy    private int findCallbackLocked(Callback callback) {
1126b42c89bfb0415d2a4b1d8b7247309f15fd348974Kenny Guy        if (callback == null) {
1127b42c89bfb0415d2a4b1d8b7247309f15fd348974Kenny Guy            throw new IllegalArgumentException("Callback cannot be null");
1128b42c89bfb0415d2a4b1d8b7247309f15fd348974Kenny Guy        }
1129b42c89bfb0415d2a4b1d8b7247309f15fd348974Kenny Guy        final int size = mCallbacks.size();
1130b42c89bfb0415d2a4b1d8b7247309f15fd348974Kenny Guy        for (int i = 0; i < size; ++i) {
1131b42c89bfb0415d2a4b1d8b7247309f15fd348974Kenny Guy            if (mCallbacks.get(i).mCallback == callback) {
1132172a21697dca96c7665f0c36e27a05f8ed00e81aKenny Guy                return i;
1133b42c89bfb0415d2a4b1d8b7247309f15fd348974Kenny Guy            }
1134b42c89bfb0415d2a4b1d8b7247309f15fd348974Kenny Guy        }
1135172a21697dca96c7665f0c36e27a05f8ed00e81aKenny Guy        return -1;
1136172a21697dca96c7665f0c36e27a05f8ed00e81aKenny Guy    }
1137172a21697dca96c7665f0c36e27a05f8ed00e81aKenny Guy
1138172a21697dca96c7665f0c36e27a05f8ed00e81aKenny Guy    private void removeCallbackLocked(Callback callback) {
1139172a21697dca96c7665f0c36e27a05f8ed00e81aKenny Guy        int pos = findCallbackLocked(callback);
1140172a21697dca96c7665f0c36e27a05f8ed00e81aKenny Guy        if (pos >= 0) {
1141172a21697dca96c7665f0c36e27a05f8ed00e81aKenny Guy            mCallbacks.remove(pos);
1142172a21697dca96c7665f0c36e27a05f8ed00e81aKenny Guy        }
1143b42c89bfb0415d2a4b1d8b7247309f15fd348974Kenny Guy    }
1144b42c89bfb0415d2a4b1d8b7247309f15fd348974Kenny Guy
1145f939dbaf766bd81b10bfc44fd493647180eabad8Kenny Guy    private void addCallbackLocked(Callback callback, Handler handler) {
1146b42c89bfb0415d2a4b1d8b7247309f15fd348974Kenny Guy        // Remove if already present.
1147b42c89bfb0415d2a4b1d8b7247309f15fd348974Kenny Guy        removeCallbackLocked(callback);
1148b42c89bfb0415d2a4b1d8b7247309f15fd348974Kenny Guy        if (handler == null) {
1149b42c89bfb0415d2a4b1d8b7247309f15fd348974Kenny Guy            handler = new Handler();
1150b42c89bfb0415d2a4b1d8b7247309f15fd348974Kenny Guy        }
1151b42c89bfb0415d2a4b1d8b7247309f15fd348974Kenny Guy        CallbackMessageHandler toAdd = new CallbackMessageHandler(handler.getLooper(), callback);
1152b42c89bfb0415d2a4b1d8b7247309f15fd348974Kenny Guy        mCallbacks.add(toAdd);
1153b42c89bfb0415d2a4b1d8b7247309f15fd348974Kenny Guy    }
1154b42c89bfb0415d2a4b1d8b7247309f15fd348974Kenny Guy
11554f58263d02f296430a9653126d28501e95c7bb6cAmith Yamasani    private IOnAppsChangedListener.Stub mAppsChangedListener = new IOnAppsChangedListener.Stub() {
11564f58263d02f296430a9653126d28501e95c7bb6cAmith Yamasani
11574f58263d02f296430a9653126d28501e95c7bb6cAmith Yamasani        @Override
1158b42c89bfb0415d2a4b1d8b7247309f15fd348974Kenny Guy        public void onPackageRemoved(UserHandle user, String packageName)
1159b42c89bfb0415d2a4b1d8b7247309f15fd348974Kenny Guy                throws RemoteException {
11604f58263d02f296430a9653126d28501e95c7bb6cAmith Yamasani            if (DEBUG) {
11614f58263d02f296430a9653126d28501e95c7bb6cAmith Yamasani                Log.d(TAG, "onPackageRemoved " + user.getIdentifier() + "," + packageName);
11624f58263d02f296430a9653126d28501e95c7bb6cAmith Yamasani            }
11634f58263d02f296430a9653126d28501e95c7bb6cAmith Yamasani            synchronized (LauncherApps.this) {
1164b42c89bfb0415d2a4b1d8b7247309f15fd348974Kenny Guy                for (CallbackMessageHandler callback : mCallbacks) {
1165b42c89bfb0415d2a4b1d8b7247309f15fd348974Kenny Guy                    callback.postOnPackageRemoved(packageName, user);
1166c0154537b0b7926ce6a3c778597b3c2735ca5497Kenny Guy                }
11674f58263d02f296430a9653126d28501e95c7bb6cAmith Yamasani            }
11684f58263d02f296430a9653126d28501e95c7bb6cAmith Yamasani        }
11694f58263d02f296430a9653126d28501e95c7bb6cAmith Yamasani
11704f58263d02f296430a9653126d28501e95c7bb6cAmith Yamasani        @Override
11714f58263d02f296430a9653126d28501e95c7bb6cAmith Yamasani        public void onPackageChanged(UserHandle user, String packageName) throws RemoteException {
11724f58263d02f296430a9653126d28501e95c7bb6cAmith Yamasani            if (DEBUG) {
11734f58263d02f296430a9653126d28501e95c7bb6cAmith Yamasani                Log.d(TAG, "onPackageChanged " + user.getIdentifier() + "," + packageName);
11744f58263d02f296430a9653126d28501e95c7bb6cAmith Yamasani            }
11754f58263d02f296430a9653126d28501e95c7bb6cAmith Yamasani            synchronized (LauncherApps.this) {
1176b42c89bfb0415d2a4b1d8b7247309f15fd348974Kenny Guy                for (CallbackMessageHandler callback : mCallbacks) {
1177b42c89bfb0415d2a4b1d8b7247309f15fd348974Kenny Guy                    callback.postOnPackageChanged(packageName, user);
1178c0154537b0b7926ce6a3c778597b3c2735ca5497Kenny Guy                }
11794f58263d02f296430a9653126d28501e95c7bb6cAmith Yamasani            }
11804f58263d02f296430a9653126d28501e95c7bb6cAmith Yamasani        }
11814f58263d02f296430a9653126d28501e95c7bb6cAmith Yamasani
11824f58263d02f296430a9653126d28501e95c7bb6cAmith Yamasani        @Override
11834f58263d02f296430a9653126d28501e95c7bb6cAmith Yamasani        public void onPackageAdded(UserHandle user, String packageName) throws RemoteException {
11844f58263d02f296430a9653126d28501e95c7bb6cAmith Yamasani            if (DEBUG) {
11854f58263d02f296430a9653126d28501e95c7bb6cAmith Yamasani                Log.d(TAG, "onPackageAdded " + user.getIdentifier() + "," + packageName);
11864f58263d02f296430a9653126d28501e95c7bb6cAmith Yamasani            }
11874f58263d02f296430a9653126d28501e95c7bb6cAmith Yamasani            synchronized (LauncherApps.this) {
1188b42c89bfb0415d2a4b1d8b7247309f15fd348974Kenny Guy                for (CallbackMessageHandler callback : mCallbacks) {
1189b42c89bfb0415d2a4b1d8b7247309f15fd348974Kenny Guy                    callback.postOnPackageAdded(packageName, user);
1190c0154537b0b7926ce6a3c778597b3c2735ca5497Kenny Guy                }
11914f58263d02f296430a9653126d28501e95c7bb6cAmith Yamasani            }
11924f58263d02f296430a9653126d28501e95c7bb6cAmith Yamasani        }
11934f58263d02f296430a9653126d28501e95c7bb6cAmith Yamasani
11944f58263d02f296430a9653126d28501e95c7bb6cAmith Yamasani        @Override
11954f58263d02f296430a9653126d28501e95c7bb6cAmith Yamasani        public void onPackagesAvailable(UserHandle user, String[] packageNames, boolean replacing)
11964f58263d02f296430a9653126d28501e95c7bb6cAmith Yamasani                throws RemoteException {
11974f58263d02f296430a9653126d28501e95c7bb6cAmith Yamasani            if (DEBUG) {
11984f58263d02f296430a9653126d28501e95c7bb6cAmith Yamasani                Log.d(TAG, "onPackagesAvailable " + user.getIdentifier() + "," + packageNames);
11994f58263d02f296430a9653126d28501e95c7bb6cAmith Yamasani            }
12004f58263d02f296430a9653126d28501e95c7bb6cAmith Yamasani            synchronized (LauncherApps.this) {
1201b42c89bfb0415d2a4b1d8b7247309f15fd348974Kenny Guy                for (CallbackMessageHandler callback : mCallbacks) {
1202b42c89bfb0415d2a4b1d8b7247309f15fd348974Kenny Guy                    callback.postOnPackagesAvailable(packageNames, user, replacing);
1203c0154537b0b7926ce6a3c778597b3c2735ca5497Kenny Guy                }
12044f58263d02f296430a9653126d28501e95c7bb6cAmith Yamasani            }
12054f58263d02f296430a9653126d28501e95c7bb6cAmith Yamasani        }
12064f58263d02f296430a9653126d28501e95c7bb6cAmith Yamasani
12074f58263d02f296430a9653126d28501e95c7bb6cAmith Yamasani        @Override
12084f58263d02f296430a9653126d28501e95c7bb6cAmith Yamasani        public void onPackagesUnavailable(UserHandle user, String[] packageNames, boolean replacing)
12094f58263d02f296430a9653126d28501e95c7bb6cAmith Yamasani                throws RemoteException {
12104f58263d02f296430a9653126d28501e95c7bb6cAmith Yamasani            if (DEBUG) {
12114f58263d02f296430a9653126d28501e95c7bb6cAmith Yamasani                Log.d(TAG, "onPackagesUnavailable " + user.getIdentifier() + "," + packageNames);
12124f58263d02f296430a9653126d28501e95c7bb6cAmith Yamasani            }
12134f58263d02f296430a9653126d28501e95c7bb6cAmith Yamasani            synchronized (LauncherApps.this) {
1214b42c89bfb0415d2a4b1d8b7247309f15fd348974Kenny Guy                for (CallbackMessageHandler callback : mCallbacks) {
1215b42c89bfb0415d2a4b1d8b7247309f15fd348974Kenny Guy                    callback.postOnPackagesUnavailable(packageNames, user, replacing);
1216c0154537b0b7926ce6a3c778597b3c2735ca5497Kenny Guy                }
1217772427555f2624b38124ab8e586ac0ccc451eb53Kenny Guy            }
1218772427555f2624b38124ab8e586ac0ccc451eb53Kenny Guy        }
1219772427555f2624b38124ab8e586ac0ccc451eb53Kenny Guy
1220772427555f2624b38124ab8e586ac0ccc451eb53Kenny Guy        @Override
122119b41f34a5cb29c621848e352220017b46cf66f1Suprabh Shukla        public void onPackagesSuspended(UserHandle user, String[] packageNames,
122219b41f34a5cb29c621848e352220017b46cf66f1Suprabh Shukla                Bundle launcherExtras)
1223772427555f2624b38124ab8e586ac0ccc451eb53Kenny Guy                throws RemoteException {
1224772427555f2624b38124ab8e586ac0ccc451eb53Kenny Guy            if (DEBUG) {
1225772427555f2624b38124ab8e586ac0ccc451eb53Kenny Guy                Log.d(TAG, "onPackagesSuspended " + user.getIdentifier() + "," + packageNames);
1226772427555f2624b38124ab8e586ac0ccc451eb53Kenny Guy            }
1227772427555f2624b38124ab8e586ac0ccc451eb53Kenny Guy            synchronized (LauncherApps.this) {
1228772427555f2624b38124ab8e586ac0ccc451eb53Kenny Guy                for (CallbackMessageHandler callback : mCallbacks) {
122919b41f34a5cb29c621848e352220017b46cf66f1Suprabh Shukla                    callback.postOnPackagesSuspended(packageNames, launcherExtras, user);
1230772427555f2624b38124ab8e586ac0ccc451eb53Kenny Guy                }
1231772427555f2624b38124ab8e586ac0ccc451eb53Kenny Guy            }
1232772427555f2624b38124ab8e586ac0ccc451eb53Kenny Guy        }
1233772427555f2624b38124ab8e586ac0ccc451eb53Kenny Guy
1234772427555f2624b38124ab8e586ac0ccc451eb53Kenny Guy        @Override
1235772427555f2624b38124ab8e586ac0ccc451eb53Kenny Guy        public void onPackagesUnsuspended(UserHandle user, String[] packageNames)
1236772427555f2624b38124ab8e586ac0ccc451eb53Kenny Guy                throws RemoteException {
1237772427555f2624b38124ab8e586ac0ccc451eb53Kenny Guy            if (DEBUG) {
1238772427555f2624b38124ab8e586ac0ccc451eb53Kenny Guy                Log.d(TAG, "onPackagesUnsuspended " + user.getIdentifier() + "," + packageNames);
1239772427555f2624b38124ab8e586ac0ccc451eb53Kenny Guy            }
1240772427555f2624b38124ab8e586ac0ccc451eb53Kenny Guy            synchronized (LauncherApps.this) {
1241772427555f2624b38124ab8e586ac0ccc451eb53Kenny Guy                for (CallbackMessageHandler callback : mCallbacks) {
1242772427555f2624b38124ab8e586ac0ccc451eb53Kenny Guy                    callback.postOnPackagesUnsuspended(packageNames, user);
1243772427555f2624b38124ab8e586ac0ccc451eb53Kenny Guy                }
1244772427555f2624b38124ab8e586ac0ccc451eb53Kenny Guy            }
12454f58263d02f296430a9653126d28501e95c7bb6cAmith Yamasani        }
12466f7362d92573e4ae693bc513dca586d6a4eb087bMakoto Onuki
12476f7362d92573e4ae693bc513dca586d6a4eb087bMakoto Onuki        @Override
12486f7362d92573e4ae693bc513dca586d6a4eb087bMakoto Onuki        public void onShortcutChanged(UserHandle user, String packageName,
12496f7362d92573e4ae693bc513dca586d6a4eb087bMakoto Onuki                ParceledListSlice shortcuts) {
12506f7362d92573e4ae693bc513dca586d6a4eb087bMakoto Onuki            if (DEBUG) {
12516f7362d92573e4ae693bc513dca586d6a4eb087bMakoto Onuki                Log.d(TAG, "onShortcutChanged " + user.getIdentifier() + "," + packageName);
12526f7362d92573e4ae693bc513dca586d6a4eb087bMakoto Onuki            }
12536f7362d92573e4ae693bc513dca586d6a4eb087bMakoto Onuki            final List<ShortcutInfo> list = shortcuts.getList();
12546f7362d92573e4ae693bc513dca586d6a4eb087bMakoto Onuki            synchronized (LauncherApps.this) {
12556f7362d92573e4ae693bc513dca586d6a4eb087bMakoto Onuki                for (CallbackMessageHandler callback : mCallbacks) {
12566f7362d92573e4ae693bc513dca586d6a4eb087bMakoto Onuki                    callback.postOnShortcutChanged(packageName, user, list);
12576f7362d92573e4ae693bc513dca586d6a4eb087bMakoto Onuki                }
12586f7362d92573e4ae693bc513dca586d6a4eb087bMakoto Onuki            }
12596f7362d92573e4ae693bc513dca586d6a4eb087bMakoto Onuki        }
12604f58263d02f296430a9653126d28501e95c7bb6cAmith Yamasani    };
1261b42c89bfb0415d2a4b1d8b7247309f15fd348974Kenny Guy
1262b42c89bfb0415d2a4b1d8b7247309f15fd348974Kenny Guy    private static class CallbackMessageHandler extends Handler {
1263b42c89bfb0415d2a4b1d8b7247309f15fd348974Kenny Guy        private static final int MSG_ADDED = 1;
1264b42c89bfb0415d2a4b1d8b7247309f15fd348974Kenny Guy        private static final int MSG_REMOVED = 2;
1265b42c89bfb0415d2a4b1d8b7247309f15fd348974Kenny Guy        private static final int MSG_CHANGED = 3;
1266b42c89bfb0415d2a4b1d8b7247309f15fd348974Kenny Guy        private static final int MSG_AVAILABLE = 4;
1267b42c89bfb0415d2a4b1d8b7247309f15fd348974Kenny Guy        private static final int MSG_UNAVAILABLE = 5;
1268772427555f2624b38124ab8e586ac0ccc451eb53Kenny Guy        private static final int MSG_SUSPENDED = 6;
1269772427555f2624b38124ab8e586ac0ccc451eb53Kenny Guy        private static final int MSG_UNSUSPENDED = 7;
12706f7362d92573e4ae693bc513dca586d6a4eb087bMakoto Onuki        private static final int MSG_SHORTCUT_CHANGED = 8;
1271b42c89bfb0415d2a4b1d8b7247309f15fd348974Kenny Guy
1272f939dbaf766bd81b10bfc44fd493647180eabad8Kenny Guy        private LauncherApps.Callback mCallback;
1273b42c89bfb0415d2a4b1d8b7247309f15fd348974Kenny Guy
1274b42c89bfb0415d2a4b1d8b7247309f15fd348974Kenny Guy        private static class CallbackInfo {
1275b42c89bfb0415d2a4b1d8b7247309f15fd348974Kenny Guy            String[] packageNames;
1276b42c89bfb0415d2a4b1d8b7247309f15fd348974Kenny Guy            String packageName;
127719b41f34a5cb29c621848e352220017b46cf66f1Suprabh Shukla            Bundle launcherExtras;
1278b42c89bfb0415d2a4b1d8b7247309f15fd348974Kenny Guy            boolean replacing;
1279b42c89bfb0415d2a4b1d8b7247309f15fd348974Kenny Guy            UserHandle user;
12806f7362d92573e4ae693bc513dca586d6a4eb087bMakoto Onuki            List<ShortcutInfo> shortcuts;
1281b42c89bfb0415d2a4b1d8b7247309f15fd348974Kenny Guy        }
1282b42c89bfb0415d2a4b1d8b7247309f15fd348974Kenny Guy
1283f939dbaf766bd81b10bfc44fd493647180eabad8Kenny Guy        public CallbackMessageHandler(Looper looper, LauncherApps.Callback callback) {
1284b42c89bfb0415d2a4b1d8b7247309f15fd348974Kenny Guy            super(looper, null, true);
1285b42c89bfb0415d2a4b1d8b7247309f15fd348974Kenny Guy            mCallback = callback;
1286b42c89bfb0415d2a4b1d8b7247309f15fd348974Kenny Guy        }
1287b42c89bfb0415d2a4b1d8b7247309f15fd348974Kenny Guy
1288b42c89bfb0415d2a4b1d8b7247309f15fd348974Kenny Guy        @Override
1289b42c89bfb0415d2a4b1d8b7247309f15fd348974Kenny Guy        public void handleMessage(Message msg) {
1290b42c89bfb0415d2a4b1d8b7247309f15fd348974Kenny Guy            if (mCallback == null || !(msg.obj instanceof CallbackInfo)) {
1291b42c89bfb0415d2a4b1d8b7247309f15fd348974Kenny Guy                return;
1292b42c89bfb0415d2a4b1d8b7247309f15fd348974Kenny Guy            }
1293b42c89bfb0415d2a4b1d8b7247309f15fd348974Kenny Guy            CallbackInfo info = (CallbackInfo) msg.obj;
1294b42c89bfb0415d2a4b1d8b7247309f15fd348974Kenny Guy            switch (msg.what) {
1295b42c89bfb0415d2a4b1d8b7247309f15fd348974Kenny Guy                case MSG_ADDED:
1296b42c89bfb0415d2a4b1d8b7247309f15fd348974Kenny Guy                    mCallback.onPackageAdded(info.packageName, info.user);
1297b42c89bfb0415d2a4b1d8b7247309f15fd348974Kenny Guy                    break;
1298b42c89bfb0415d2a4b1d8b7247309f15fd348974Kenny Guy                case MSG_REMOVED:
1299b42c89bfb0415d2a4b1d8b7247309f15fd348974Kenny Guy                    mCallback.onPackageRemoved(info.packageName, info.user);
1300b42c89bfb0415d2a4b1d8b7247309f15fd348974Kenny Guy                    break;
1301b42c89bfb0415d2a4b1d8b7247309f15fd348974Kenny Guy                case MSG_CHANGED:
1302b42c89bfb0415d2a4b1d8b7247309f15fd348974Kenny Guy                    mCallback.onPackageChanged(info.packageName, info.user);
1303b42c89bfb0415d2a4b1d8b7247309f15fd348974Kenny Guy                    break;
1304b42c89bfb0415d2a4b1d8b7247309f15fd348974Kenny Guy                case MSG_AVAILABLE:
1305b42c89bfb0415d2a4b1d8b7247309f15fd348974Kenny Guy                    mCallback.onPackagesAvailable(info.packageNames, info.user, info.replacing);
1306b42c89bfb0415d2a4b1d8b7247309f15fd348974Kenny Guy                    break;
1307b42c89bfb0415d2a4b1d8b7247309f15fd348974Kenny Guy                case MSG_UNAVAILABLE:
1308b42c89bfb0415d2a4b1d8b7247309f15fd348974Kenny Guy                    mCallback.onPackagesUnavailable(info.packageNames, info.user, info.replacing);
1309b42c89bfb0415d2a4b1d8b7247309f15fd348974Kenny Guy                    break;
1310772427555f2624b38124ab8e586ac0ccc451eb53Kenny Guy                case MSG_SUSPENDED:
131196212bca06842f223a0e9e377e2c00a2008c96a2Suprabh Shukla                    mCallback.onPackagesSuspended(info.packageNames, info.user, info.launcherExtras
131296212bca06842f223a0e9e377e2c00a2008c96a2Suprabh Shukla                    );
1313772427555f2624b38124ab8e586ac0ccc451eb53Kenny Guy                    break;
1314772427555f2624b38124ab8e586ac0ccc451eb53Kenny Guy                case MSG_UNSUSPENDED:
1315772427555f2624b38124ab8e586ac0ccc451eb53Kenny Guy                    mCallback.onPackagesUnsuspended(info.packageNames, info.user);
1316772427555f2624b38124ab8e586ac0ccc451eb53Kenny Guy                    break;
13176f7362d92573e4ae693bc513dca586d6a4eb087bMakoto Onuki                case MSG_SHORTCUT_CHANGED:
13186f7362d92573e4ae693bc513dca586d6a4eb087bMakoto Onuki                    mCallback.onShortcutsChanged(info.packageName, info.shortcuts, info.user);
13196f7362d92573e4ae693bc513dca586d6a4eb087bMakoto Onuki                    break;
1320b42c89bfb0415d2a4b1d8b7247309f15fd348974Kenny Guy            }
1321b42c89bfb0415d2a4b1d8b7247309f15fd348974Kenny Guy        }
1322b42c89bfb0415d2a4b1d8b7247309f15fd348974Kenny Guy
1323b42c89bfb0415d2a4b1d8b7247309f15fd348974Kenny Guy        public void postOnPackageAdded(String packageName, UserHandle user) {
1324b42c89bfb0415d2a4b1d8b7247309f15fd348974Kenny Guy            CallbackInfo info = new CallbackInfo();
1325b42c89bfb0415d2a4b1d8b7247309f15fd348974Kenny Guy            info.packageName = packageName;
1326b42c89bfb0415d2a4b1d8b7247309f15fd348974Kenny Guy            info.user = user;
1327b42c89bfb0415d2a4b1d8b7247309f15fd348974Kenny Guy            obtainMessage(MSG_ADDED, info).sendToTarget();
1328b42c89bfb0415d2a4b1d8b7247309f15fd348974Kenny Guy        }
1329b42c89bfb0415d2a4b1d8b7247309f15fd348974Kenny Guy
1330b42c89bfb0415d2a4b1d8b7247309f15fd348974Kenny Guy        public void postOnPackageRemoved(String packageName, UserHandle user) {
1331b42c89bfb0415d2a4b1d8b7247309f15fd348974Kenny Guy            CallbackInfo info = new CallbackInfo();
1332b42c89bfb0415d2a4b1d8b7247309f15fd348974Kenny Guy            info.packageName = packageName;
1333b42c89bfb0415d2a4b1d8b7247309f15fd348974Kenny Guy            info.user = user;
1334b42c89bfb0415d2a4b1d8b7247309f15fd348974Kenny Guy            obtainMessage(MSG_REMOVED, info).sendToTarget();
1335b42c89bfb0415d2a4b1d8b7247309f15fd348974Kenny Guy        }
1336b42c89bfb0415d2a4b1d8b7247309f15fd348974Kenny Guy
1337b42c89bfb0415d2a4b1d8b7247309f15fd348974Kenny Guy        public void postOnPackageChanged(String packageName, UserHandle user) {
1338b42c89bfb0415d2a4b1d8b7247309f15fd348974Kenny Guy            CallbackInfo info = new CallbackInfo();
1339b42c89bfb0415d2a4b1d8b7247309f15fd348974Kenny Guy            info.packageName = packageName;
1340b42c89bfb0415d2a4b1d8b7247309f15fd348974Kenny Guy            info.user = user;
1341b42c89bfb0415d2a4b1d8b7247309f15fd348974Kenny Guy            obtainMessage(MSG_CHANGED, info).sendToTarget();
1342b42c89bfb0415d2a4b1d8b7247309f15fd348974Kenny Guy        }
1343b42c89bfb0415d2a4b1d8b7247309f15fd348974Kenny Guy
1344b42c89bfb0415d2a4b1d8b7247309f15fd348974Kenny Guy        public void postOnPackagesAvailable(String[] packageNames, UserHandle user,
1345b42c89bfb0415d2a4b1d8b7247309f15fd348974Kenny Guy                boolean replacing) {
1346b42c89bfb0415d2a4b1d8b7247309f15fd348974Kenny Guy            CallbackInfo info = new CallbackInfo();
1347b42c89bfb0415d2a4b1d8b7247309f15fd348974Kenny Guy            info.packageNames = packageNames;
1348b42c89bfb0415d2a4b1d8b7247309f15fd348974Kenny Guy            info.replacing = replacing;
1349b42c89bfb0415d2a4b1d8b7247309f15fd348974Kenny Guy            info.user = user;
1350b42c89bfb0415d2a4b1d8b7247309f15fd348974Kenny Guy            obtainMessage(MSG_AVAILABLE, info).sendToTarget();
1351b42c89bfb0415d2a4b1d8b7247309f15fd348974Kenny Guy        }
1352b42c89bfb0415d2a4b1d8b7247309f15fd348974Kenny Guy
1353b42c89bfb0415d2a4b1d8b7247309f15fd348974Kenny Guy        public void postOnPackagesUnavailable(String[] packageNames, UserHandle user,
1354b42c89bfb0415d2a4b1d8b7247309f15fd348974Kenny Guy                boolean replacing) {
1355b42c89bfb0415d2a4b1d8b7247309f15fd348974Kenny Guy            CallbackInfo info = new CallbackInfo();
1356b42c89bfb0415d2a4b1d8b7247309f15fd348974Kenny Guy            info.packageNames = packageNames;
1357b42c89bfb0415d2a4b1d8b7247309f15fd348974Kenny Guy            info.replacing = replacing;
1358b42c89bfb0415d2a4b1d8b7247309f15fd348974Kenny Guy            info.user = user;
1359b42c89bfb0415d2a4b1d8b7247309f15fd348974Kenny Guy            obtainMessage(MSG_UNAVAILABLE, info).sendToTarget();
1360b42c89bfb0415d2a4b1d8b7247309f15fd348974Kenny Guy        }
1361772427555f2624b38124ab8e586ac0ccc451eb53Kenny Guy
136219b41f34a5cb29c621848e352220017b46cf66f1Suprabh Shukla        public void postOnPackagesSuspended(String[] packageNames, Bundle launcherExtras,
136319b41f34a5cb29c621848e352220017b46cf66f1Suprabh Shukla                UserHandle user) {
1364772427555f2624b38124ab8e586ac0ccc451eb53Kenny Guy            CallbackInfo info = new CallbackInfo();
1365772427555f2624b38124ab8e586ac0ccc451eb53Kenny Guy            info.packageNames = packageNames;
1366772427555f2624b38124ab8e586ac0ccc451eb53Kenny Guy            info.user = user;
136719b41f34a5cb29c621848e352220017b46cf66f1Suprabh Shukla            info.launcherExtras = launcherExtras;
1368772427555f2624b38124ab8e586ac0ccc451eb53Kenny Guy            obtainMessage(MSG_SUSPENDED, info).sendToTarget();
1369772427555f2624b38124ab8e586ac0ccc451eb53Kenny Guy        }
1370772427555f2624b38124ab8e586ac0ccc451eb53Kenny Guy
1371772427555f2624b38124ab8e586ac0ccc451eb53Kenny Guy        public void postOnPackagesUnsuspended(String[] packageNames, UserHandle user) {
1372772427555f2624b38124ab8e586ac0ccc451eb53Kenny Guy            CallbackInfo info = new CallbackInfo();
1373772427555f2624b38124ab8e586ac0ccc451eb53Kenny Guy            info.packageNames = packageNames;
1374772427555f2624b38124ab8e586ac0ccc451eb53Kenny Guy            info.user = user;
1375772427555f2624b38124ab8e586ac0ccc451eb53Kenny Guy            obtainMessage(MSG_UNSUSPENDED, info).sendToTarget();
1376772427555f2624b38124ab8e586ac0ccc451eb53Kenny Guy        }
13776f7362d92573e4ae693bc513dca586d6a4eb087bMakoto Onuki
13786f7362d92573e4ae693bc513dca586d6a4eb087bMakoto Onuki        public void postOnShortcutChanged(String packageName, UserHandle user,
13796f7362d92573e4ae693bc513dca586d6a4eb087bMakoto Onuki                List<ShortcutInfo> shortcuts) {
13806f7362d92573e4ae693bc513dca586d6a4eb087bMakoto Onuki            CallbackInfo info = new CallbackInfo();
13816f7362d92573e4ae693bc513dca586d6a4eb087bMakoto Onuki            info.packageName = packageName;
13826f7362d92573e4ae693bc513dca586d6a4eb087bMakoto Onuki            info.user = user;
13836f7362d92573e4ae693bc513dca586d6a4eb087bMakoto Onuki            info.shortcuts = shortcuts;
13846f7362d92573e4ae693bc513dca586d6a4eb087bMakoto Onuki            obtainMessage(MSG_SHORTCUT_CHANGED, info).sendToTarget();
13856f7362d92573e4ae693bc513dca586d6a4eb087bMakoto Onuki        }
1386b42c89bfb0415d2a4b1d8b7247309f15fd348974Kenny Guy    }
13872d895c3efd625e09e9f2cc4d0c7131b34f52f154Makoto Onuki
13882d895c3efd625e09e9f2cc4d0c7131b34f52f154Makoto Onuki    /**
13892d895c3efd625e09e9f2cc4d0c7131b34f52f154Makoto Onuki     * A helper method to extract a {@link PinItemRequest} set to
13902d895c3efd625e09e9f2cc4d0c7131b34f52f154Makoto Onuki     * the {@link #EXTRA_PIN_ITEM_REQUEST} extra.
13912d895c3efd625e09e9f2cc4d0c7131b34f52f154Makoto Onuki     */
13922d895c3efd625e09e9f2cc4d0c7131b34f52f154Makoto Onuki    public PinItemRequest getPinItemRequest(Intent intent) {
13932d895c3efd625e09e9f2cc4d0c7131b34f52f154Makoto Onuki        return intent.getParcelableExtra(EXTRA_PIN_ITEM_REQUEST);
13942d895c3efd625e09e9f2cc4d0c7131b34f52f154Makoto Onuki    }
13952d895c3efd625e09e9f2cc4d0c7131b34f52f154Makoto Onuki
13962d895c3efd625e09e9f2cc4d0c7131b34f52f154Makoto Onuki    /**
13977f7372ae2abeecb564d426ec3efbfa039c797885Sunny Goyal     * Represents a "pin shortcut" or a "pin appwidget" request made by an app, which is sent with
13987f7372ae2abeecb564d426ec3efbfa039c797885Sunny Goyal     * an {@link #ACTION_CONFIRM_PIN_SHORTCUT} or {@link #ACTION_CONFIRM_PIN_APPWIDGET} intent
13997f7372ae2abeecb564d426ec3efbfa039c797885Sunny Goyal     * respectively to the default launcher app.
14002d895c3efd625e09e9f2cc4d0c7131b34f52f154Makoto Onuki     *
1401a37ac3d6f1fdb51749df3375607ea133c9b3918bMakoto Onuki     * <h3>Request of the {@link #REQUEST_TYPE_SHORTCUT} type.
14020c280710320368e82c52c9b135e2ab3015d0c924Makoto Onuki     *
1403a37ac3d6f1fdb51749df3375607ea133c9b3918bMakoto Onuki     * <p>A {@link #REQUEST_TYPE_SHORTCUT} request represents a request to pin a
1404a37ac3d6f1fdb51749df3375607ea133c9b3918bMakoto Onuki     * {@link ShortcutInfo}.  If the launcher accepts a request, call {@link #accept()},
1405a37ac3d6f1fdb51749df3375607ea133c9b3918bMakoto Onuki     * or {@link #accept(Bundle)} with a null or empty Bundle.  No options are defined for
1406a37ac3d6f1fdb51749df3375607ea133c9b3918bMakoto Onuki     * pin-shortcuts requests.
1407a37ac3d6f1fdb51749df3375607ea133c9b3918bMakoto Onuki     *
1408a37ac3d6f1fdb51749df3375607ea133c9b3918bMakoto Onuki     * <p>{@link #getShortcutInfo()} always returns a non-null {@link ShortcutInfo} for this type.
1409a37ac3d6f1fdb51749df3375607ea133c9b3918bMakoto Onuki     *
1410a37ac3d6f1fdb51749df3375607ea133c9b3918bMakoto Onuki     * <p>The launcher may receive a request with a {@link ShortcutInfo} that is already pinned, in
1411a37ac3d6f1fdb51749df3375607ea133c9b3918bMakoto Onuki     * which case {@link ShortcutInfo#isPinned()} returns true.  This means the user wants to create
1412a37ac3d6f1fdb51749df3375607ea133c9b3918bMakoto Onuki     * another pinned shortcut for a shortcut that's already pinned.  If the launcher accepts it,
1413a37ac3d6f1fdb51749df3375607ea133c9b3918bMakoto Onuki     * {@link #accept()} must still be called even though the shortcut is already pinned, and
1414a37ac3d6f1fdb51749df3375607ea133c9b3918bMakoto Onuki     * create a new pinned shortcut icon for it.
1415a37ac3d6f1fdb51749df3375607ea133c9b3918bMakoto Onuki     *
1416a37ac3d6f1fdb51749df3375607ea133c9b3918bMakoto Onuki     * <p>See also {@link ShortcutManager} for more details.
1417a37ac3d6f1fdb51749df3375607ea133c9b3918bMakoto Onuki     *
1418a37ac3d6f1fdb51749df3375607ea133c9b3918bMakoto Onuki     * <h3>Request of the {@link #REQUEST_TYPE_APPWIDGET} type.
1419a37ac3d6f1fdb51749df3375607ea133c9b3918bMakoto Onuki     *
1420a37ac3d6f1fdb51749df3375607ea133c9b3918bMakoto Onuki     * <p>A {@link #REQUEST_TYPE_SHORTCUT} request represents a request to pin a
1421a37ac3d6f1fdb51749df3375607ea133c9b3918bMakoto Onuki     * an AppWidget.  If the launcher accepts a request, call {@link #accept(Bundle)} with
1422a37ac3d6f1fdb51749df3375607ea133c9b3918bMakoto Onuki     * the appwidget integer ID set to the
1423a37ac3d6f1fdb51749df3375607ea133c9b3918bMakoto Onuki     * {@link android.appwidget.AppWidgetManager#EXTRA_APPWIDGET_ID} extra.
1424a37ac3d6f1fdb51749df3375607ea133c9b3918bMakoto Onuki     *
1425a37ac3d6f1fdb51749df3375607ea133c9b3918bMakoto Onuki     * <p>{@link #getAppWidgetProviderInfo(Context)} always returns a non-null
1426a37ac3d6f1fdb51749df3375607ea133c9b3918bMakoto Onuki     * {@link AppWidgetProviderInfo} for this type.
1427a37ac3d6f1fdb51749df3375607ea133c9b3918bMakoto Onuki     *
1428a37ac3d6f1fdb51749df3375607ea133c9b3918bMakoto Onuki     * <p>See also {@link AppWidgetManager} for more details.
14297f7372ae2abeecb564d426ec3efbfa039c797885Sunny Goyal     *
14302d895c3efd625e09e9f2cc4d0c7131b34f52f154Makoto Onuki     * @see #EXTRA_PIN_ITEM_REQUEST
14312d895c3efd625e09e9f2cc4d0c7131b34f52f154Makoto Onuki     * @see #getPinItemRequest(Intent)
14322d895c3efd625e09e9f2cc4d0c7131b34f52f154Makoto Onuki     */
14332d895c3efd625e09e9f2cc4d0c7131b34f52f154Makoto Onuki    public static final class PinItemRequest implements Parcelable {
14342d895c3efd625e09e9f2cc4d0c7131b34f52f154Makoto Onuki
14352d895c3efd625e09e9f2cc4d0c7131b34f52f154Makoto Onuki        /** This is a request to pin shortcut. */
14362d895c3efd625e09e9f2cc4d0c7131b34f52f154Makoto Onuki        public static final int REQUEST_TYPE_SHORTCUT = 1;
14372d895c3efd625e09e9f2cc4d0c7131b34f52f154Makoto Onuki
143887a563e0707bb7e2be034c195e9827dfe3451cfdSunny Goyal        /** This is a request to pin app widget. */
143987a563e0707bb7e2be034c195e9827dfe3451cfdSunny Goyal        public static final int REQUEST_TYPE_APPWIDGET = 2;
144087a563e0707bb7e2be034c195e9827dfe3451cfdSunny Goyal
1441f5663b13c54dad0c808057be1ad07a5681514e27Makoto Onuki        /** @hide */
1442ce8db9911494225fcd99711d7df85a130de5a6ceJeff Sharkey        @IntDef(prefix = { "REQUEST_TYPE_" }, value = {
1443ce8db9911494225fcd99711d7df85a130de5a6ceJeff Sharkey                REQUEST_TYPE_SHORTCUT,
1444ce8db9911494225fcd99711d7df85a130de5a6ceJeff Sharkey                REQUEST_TYPE_APPWIDGET
1445ce8db9911494225fcd99711d7df85a130de5a6ceJeff Sharkey        })
14462d895c3efd625e09e9f2cc4d0c7131b34f52f154Makoto Onuki        @Retention(RetentionPolicy.SOURCE)
14472d895c3efd625e09e9f2cc4d0c7131b34f52f154Makoto Onuki        public @interface RequestType {}
14482d895c3efd625e09e9f2cc4d0c7131b34f52f154Makoto Onuki
14492d895c3efd625e09e9f2cc4d0c7131b34f52f154Makoto Onuki        private final int mRequestType;
14502d895c3efd625e09e9f2cc4d0c7131b34f52f154Makoto Onuki        private final IPinItemRequest mInner;
14512d895c3efd625e09e9f2cc4d0c7131b34f52f154Makoto Onuki
14522d895c3efd625e09e9f2cc4d0c7131b34f52f154Makoto Onuki        /**
14532d895c3efd625e09e9f2cc4d0c7131b34f52f154Makoto Onuki         * @hide
14542d895c3efd625e09e9f2cc4d0c7131b34f52f154Makoto Onuki         */
14558abba3a641086cbc66c7ed037a8f6f8a9f600802Makoto Onuki        public PinItemRequest(IPinItemRequest inner, int type) {
14562d895c3efd625e09e9f2cc4d0c7131b34f52f154Makoto Onuki            mInner = inner;
14578abba3a641086cbc66c7ed037a8f6f8a9f600802Makoto Onuki            mRequestType = type;
14582d895c3efd625e09e9f2cc4d0c7131b34f52f154Makoto Onuki        }
14592d895c3efd625e09e9f2cc4d0c7131b34f52f154Makoto Onuki
14602d895c3efd625e09e9f2cc4d0c7131b34f52f154Makoto Onuki        /**
1461a37ac3d6f1fdb51749df3375607ea133c9b3918bMakoto Onuki         * Represents the type of a request, which is one of the {@code REQUEST_TYPE_} constants.
1462a37ac3d6f1fdb51749df3375607ea133c9b3918bMakoto Onuki         *
1463a37ac3d6f1fdb51749df3375607ea133c9b3918bMakoto Onuki         * @return one of the {@code REQUEST_TYPE_} constants.
14642d895c3efd625e09e9f2cc4d0c7131b34f52f154Makoto Onuki         */
14652d895c3efd625e09e9f2cc4d0c7131b34f52f154Makoto Onuki        @RequestType
14662d895c3efd625e09e9f2cc4d0c7131b34f52f154Makoto Onuki        public int getRequestType() {
14672d895c3efd625e09e9f2cc4d0c7131b34f52f154Makoto Onuki            return mRequestType;
14682d895c3efd625e09e9f2cc4d0c7131b34f52f154Makoto Onuki        }
14692d895c3efd625e09e9f2cc4d0c7131b34f52f154Makoto Onuki
14702d895c3efd625e09e9f2cc4d0c7131b34f52f154Makoto Onuki        /**
1471a37ac3d6f1fdb51749df3375607ea133c9b3918bMakoto Onuki         * {@link ShortcutInfo} sent by the requesting app.
1472a37ac3d6f1fdb51749df3375607ea133c9b3918bMakoto Onuki         * Always non-null for a {@link #REQUEST_TYPE_SHORTCUT} request, and always null for a
1473a37ac3d6f1fdb51749df3375607ea133c9b3918bMakoto Onuki         * different request type.
1474a37ac3d6f1fdb51749df3375607ea133c9b3918bMakoto Onuki         *
1475a37ac3d6f1fdb51749df3375607ea133c9b3918bMakoto Onuki         * @return requested {@link ShortcutInfo} when a request is of the
1476a37ac3d6f1fdb51749df3375607ea133c9b3918bMakoto Onuki         * {@link #REQUEST_TYPE_SHORTCUT} type.  Null otherwise.
14772d895c3efd625e09e9f2cc4d0c7131b34f52f154Makoto Onuki         */
14782d895c3efd625e09e9f2cc4d0c7131b34f52f154Makoto Onuki        @Nullable
14792d895c3efd625e09e9f2cc4d0c7131b34f52f154Makoto Onuki        public ShortcutInfo getShortcutInfo() {
14808abba3a641086cbc66c7ed037a8f6f8a9f600802Makoto Onuki            try {
14818abba3a641086cbc66c7ed037a8f6f8a9f600802Makoto Onuki                return mInner.getShortcutInfo();
14828abba3a641086cbc66c7ed037a8f6f8a9f600802Makoto Onuki            } catch (RemoteException e) {
14838abba3a641086cbc66c7ed037a8f6f8a9f600802Makoto Onuki                throw e.rethrowAsRuntimeException();
14848abba3a641086cbc66c7ed037a8f6f8a9f600802Makoto Onuki            }
14852d895c3efd625e09e9f2cc4d0c7131b34f52f154Makoto Onuki        }
14862d895c3efd625e09e9f2cc4d0c7131b34f52f154Makoto Onuki
14872d895c3efd625e09e9f2cc4d0c7131b34f52f154Makoto Onuki        /**
1488a37ac3d6f1fdb51749df3375607ea133c9b3918bMakoto Onuki         * {@link AppWidgetProviderInfo} sent by the requesting app.
1489a37ac3d6f1fdb51749df3375607ea133c9b3918bMakoto Onuki         * Always non-null for a {@link #REQUEST_TYPE_APPWIDGET} request, and always null for a
1490a37ac3d6f1fdb51749df3375607ea133c9b3918bMakoto Onuki         * different request type.
1491a37ac3d6f1fdb51749df3375607ea133c9b3918bMakoto Onuki         *
1492e7712ad4dd941c0dee0fcb46caa4a617bae10115Sunny Goyal         * <p>Launcher should not show any configuration activity associated with the provider, and
1493e7712ad4dd941c0dee0fcb46caa4a617bae10115Sunny Goyal         * assume that the widget is already fully configured. Upon accepting the widget, it should
1494e7712ad4dd941c0dee0fcb46caa4a617bae10115Sunny Goyal         * pass the widgetId in {@link #accept(Bundle)}.
1495e7712ad4dd941c0dee0fcb46caa4a617bae10115Sunny Goyal         *
1496a37ac3d6f1fdb51749df3375607ea133c9b3918bMakoto Onuki         * @return requested {@link AppWidgetProviderInfo} when a request is of the
1497a37ac3d6f1fdb51749df3375607ea133c9b3918bMakoto Onuki         * {@link #REQUEST_TYPE_APPWIDGET} type.  Null otherwise.
149887a563e0707bb7e2be034c195e9827dfe3451cfdSunny Goyal         */
149987a563e0707bb7e2be034c195e9827dfe3451cfdSunny Goyal        @Nullable
1500970d4b462652cab66ce34da551d089f385bf39d8Sunny Goyal        public AppWidgetProviderInfo getAppWidgetProviderInfo(Context context) {
15018abba3a641086cbc66c7ed037a8f6f8a9f600802Makoto Onuki            try {
15028abba3a641086cbc66c7ed037a8f6f8a9f600802Makoto Onuki                final AppWidgetProviderInfo info = mInner.getAppWidgetProviderInfo();
15038abba3a641086cbc66c7ed037a8f6f8a9f600802Makoto Onuki                if (info == null) {
15048abba3a641086cbc66c7ed037a8f6f8a9f600802Makoto Onuki                    return null;
15058abba3a641086cbc66c7ed037a8f6f8a9f600802Makoto Onuki                }
1506970d4b462652cab66ce34da551d089f385bf39d8Sunny Goyal                info.updateDimensions(context.getResources().getDisplayMetrics());
1507970d4b462652cab66ce34da551d089f385bf39d8Sunny Goyal                return info;
15088abba3a641086cbc66c7ed037a8f6f8a9f600802Makoto Onuki            } catch (RemoteException e) {
15098abba3a641086cbc66c7ed037a8f6f8a9f600802Makoto Onuki                throw e.rethrowAsRuntimeException();
1510970d4b462652cab66ce34da551d089f385bf39d8Sunny Goyal            }
151187a563e0707bb7e2be034c195e9827dfe3451cfdSunny Goyal        }
151287a563e0707bb7e2be034c195e9827dfe3451cfdSunny Goyal
151387a563e0707bb7e2be034c195e9827dfe3451cfdSunny Goyal        /**
15144ad6b57700bef4c484021f49e018117046562e6bSunny Goyal         * Any extras sent by the requesting app.
1515a37ac3d6f1fdb51749df3375607ea133c9b3918bMakoto Onuki         *
1516a37ac3d6f1fdb51749df3375607ea133c9b3918bMakoto Onuki         * @return For a shortcut request, this method always return null.  For an AppWidget
1517a37ac3d6f1fdb51749df3375607ea133c9b3918bMakoto Onuki         * request, this method returns the extras passed to the
1518a37ac3d6f1fdb51749df3375607ea133c9b3918bMakoto Onuki         * {@link android.appwidget.AppWidgetManager#requestPinAppWidget(
1519a37ac3d6f1fdb51749df3375607ea133c9b3918bMakoto Onuki         * ComponentName, Bundle, PendingIntent)} API.  See {@link AppWidgetManager} for details.
15204ad6b57700bef4c484021f49e018117046562e6bSunny Goyal         */
15214ad6b57700bef4c484021f49e018117046562e6bSunny Goyal        @Nullable
15224ad6b57700bef4c484021f49e018117046562e6bSunny Goyal        public Bundle getExtras() {
15234ad6b57700bef4c484021f49e018117046562e6bSunny Goyal            try {
15244ad6b57700bef4c484021f49e018117046562e6bSunny Goyal                return mInner.getExtras();
15254ad6b57700bef4c484021f49e018117046562e6bSunny Goyal            } catch (RemoteException e) {
15264ad6b57700bef4c484021f49e018117046562e6bSunny Goyal                throw e.rethrowAsRuntimeException();
15274ad6b57700bef4c484021f49e018117046562e6bSunny Goyal            }
15284ad6b57700bef4c484021f49e018117046562e6bSunny Goyal        }
15294ad6b57700bef4c484021f49e018117046562e6bSunny Goyal
15304ad6b57700bef4c484021f49e018117046562e6bSunny Goyal        /**
1531a37ac3d6f1fdb51749df3375607ea133c9b3918bMakoto Onuki         * Return whether a request is still valid.
1532a37ac3d6f1fdb51749df3375607ea133c9b3918bMakoto Onuki         *
1533a37ac3d6f1fdb51749df3375607ea133c9b3918bMakoto Onuki         * @return {@code TRUE} if a request is valid and {@link #accept(Bundle)} may be called.
15342d895c3efd625e09e9f2cc4d0c7131b34f52f154Makoto Onuki         */
15352d895c3efd625e09e9f2cc4d0c7131b34f52f154Makoto Onuki        public boolean isValid() {
15362d895c3efd625e09e9f2cc4d0c7131b34f52f154Makoto Onuki            try {
15372d895c3efd625e09e9f2cc4d0c7131b34f52f154Makoto Onuki                return mInner.isValid();
15382d895c3efd625e09e9f2cc4d0c7131b34f52f154Makoto Onuki            } catch (RemoteException e) {
15392d895c3efd625e09e9f2cc4d0c7131b34f52f154Makoto Onuki                return false;
15402d895c3efd625e09e9f2cc4d0c7131b34f52f154Makoto Onuki            }
15412d895c3efd625e09e9f2cc4d0c7131b34f52f154Makoto Onuki        }
15422d895c3efd625e09e9f2cc4d0c7131b34f52f154Makoto Onuki
15432d895c3efd625e09e9f2cc4d0c7131b34f52f154Makoto Onuki        /**
15442d895c3efd625e09e9f2cc4d0c7131b34f52f154Makoto Onuki         * Called by the receiving launcher app when the user accepts the request.
1545a37ac3d6f1fdb51749df3375607ea133c9b3918bMakoto Onuki         *
1546a37ac3d6f1fdb51749df3375607ea133c9b3918bMakoto Onuki         * @param options must be set for a {@link #REQUEST_TYPE_APPWIDGET} request.
1547a37ac3d6f1fdb51749df3375607ea133c9b3918bMakoto Onuki         *
1548a37ac3d6f1fdb51749df3375607ea133c9b3918bMakoto Onuki         * @return {@code TRUE} if the shortcut or the AppWidget has actually been pinned.
1549a37ac3d6f1fdb51749df3375607ea133c9b3918bMakoto Onuki         * {@code FALSE} if the item hasn't been pinned, for example, because the request had
1550a37ac3d6f1fdb51749df3375607ea133c9b3918bMakoto Onuki         * already been canceled, in which case the launcher must not pin the requested item.
15512d895c3efd625e09e9f2cc4d0c7131b34f52f154Makoto Onuki         */
15522d895c3efd625e09e9f2cc4d0c7131b34f52f154Makoto Onuki        public boolean accept(@Nullable Bundle options) {
15532d895c3efd625e09e9f2cc4d0c7131b34f52f154Makoto Onuki            try {
15542d895c3efd625e09e9f2cc4d0c7131b34f52f154Makoto Onuki                return mInner.accept(options);
15552d895c3efd625e09e9f2cc4d0c7131b34f52f154Makoto Onuki            } catch (RemoteException e) {
15562d895c3efd625e09e9f2cc4d0c7131b34f52f154Makoto Onuki                throw e.rethrowFromSystemServer();
15572d895c3efd625e09e9f2cc4d0c7131b34f52f154Makoto Onuki            }
15582d895c3efd625e09e9f2cc4d0c7131b34f52f154Makoto Onuki        }
15592d895c3efd625e09e9f2cc4d0c7131b34f52f154Makoto Onuki
15602d895c3efd625e09e9f2cc4d0c7131b34f52f154Makoto Onuki        /**
1561a37ac3d6f1fdb51749df3375607ea133c9b3918bMakoto Onuki         * Called by the receiving launcher app when the user accepts the request, with no options.
1562a37ac3d6f1fdb51749df3375607ea133c9b3918bMakoto Onuki         *
1563a37ac3d6f1fdb51749df3375607ea133c9b3918bMakoto Onuki         * @return {@code TRUE} if the shortcut or the AppWidget has actually been pinned.
1564a37ac3d6f1fdb51749df3375607ea133c9b3918bMakoto Onuki         * {@code FALSE} if the item hasn't been pinned, for example, because the request had
1565a37ac3d6f1fdb51749df3375607ea133c9b3918bMakoto Onuki         * already been canceled, in which case the launcher must not pin the requested item.
15662d895c3efd625e09e9f2cc4d0c7131b34f52f154Makoto Onuki         */
15672d895c3efd625e09e9f2cc4d0c7131b34f52f154Makoto Onuki        public boolean accept() {
15682d895c3efd625e09e9f2cc4d0c7131b34f52f154Makoto Onuki            return accept(/* options= */ null);
15692d895c3efd625e09e9f2cc4d0c7131b34f52f154Makoto Onuki        }
15702d895c3efd625e09e9f2cc4d0c7131b34f52f154Makoto Onuki
15712d895c3efd625e09e9f2cc4d0c7131b34f52f154Makoto Onuki        private PinItemRequest(Parcel source) {
15722d895c3efd625e09e9f2cc4d0c7131b34f52f154Makoto Onuki            final ClassLoader cl = getClass().getClassLoader();
15732d895c3efd625e09e9f2cc4d0c7131b34f52f154Makoto Onuki
15742d895c3efd625e09e9f2cc4d0c7131b34f52f154Makoto Onuki            mRequestType = source.readInt();
15752d895c3efd625e09e9f2cc4d0c7131b34f52f154Makoto Onuki            mInner = IPinItemRequest.Stub.asInterface(source.readStrongBinder());
15762d895c3efd625e09e9f2cc4d0c7131b34f52f154Makoto Onuki        }
15772d895c3efd625e09e9f2cc4d0c7131b34f52f154Makoto Onuki
15782d895c3efd625e09e9f2cc4d0c7131b34f52f154Makoto Onuki        @Override
15792d895c3efd625e09e9f2cc4d0c7131b34f52f154Makoto Onuki        public void writeToParcel(Parcel dest, int flags) {
15802d895c3efd625e09e9f2cc4d0c7131b34f52f154Makoto Onuki            dest.writeInt(mRequestType);
15812d895c3efd625e09e9f2cc4d0c7131b34f52f154Makoto Onuki            dest.writeStrongBinder(mInner.asBinder());
15822d895c3efd625e09e9f2cc4d0c7131b34f52f154Makoto Onuki        }
15832d895c3efd625e09e9f2cc4d0c7131b34f52f154Makoto Onuki
15842d895c3efd625e09e9f2cc4d0c7131b34f52f154Makoto Onuki        public static final Creator<PinItemRequest> CREATOR =
15852d895c3efd625e09e9f2cc4d0c7131b34f52f154Makoto Onuki                new Creator<PinItemRequest>() {
15862d895c3efd625e09e9f2cc4d0c7131b34f52f154Makoto Onuki                    public PinItemRequest createFromParcel(Parcel source) {
15872d895c3efd625e09e9f2cc4d0c7131b34f52f154Makoto Onuki                        return new PinItemRequest(source);
15882d895c3efd625e09e9f2cc4d0c7131b34f52f154Makoto Onuki                    }
15892d895c3efd625e09e9f2cc4d0c7131b34f52f154Makoto Onuki                    public PinItemRequest[] newArray(int size) {
15902d895c3efd625e09e9f2cc4d0c7131b34f52f154Makoto Onuki                        return new PinItemRequest[size];
15912d895c3efd625e09e9f2cc4d0c7131b34f52f154Makoto Onuki                    }
15922d895c3efd625e09e9f2cc4d0c7131b34f52f154Makoto Onuki                };
15932d895c3efd625e09e9f2cc4d0c7131b34f52f154Makoto Onuki
15942d895c3efd625e09e9f2cc4d0c7131b34f52f154Makoto Onuki        @Override
15952d895c3efd625e09e9f2cc4d0c7131b34f52f154Makoto Onuki        public int describeContents() {
15962d895c3efd625e09e9f2cc4d0c7131b34f52f154Makoto Onuki            return 0;
15972d895c3efd625e09e9f2cc4d0c7131b34f52f154Makoto Onuki        }
15982d895c3efd625e09e9f2cc4d0c7131b34f52f154Makoto Onuki    }
15994f58263d02f296430a9653126d28501e95c7bb6cAmith Yamasani}
1600