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} & {@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—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